From: Mathieu Desnoyers Date: Tue, 29 Sep 2009 20:37:07 +0000 (-0400) Subject: userspace-rcu formal model removal X-Git-Tag: v0.1 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=5e32821aa6d74b755730c19a8aa66404d2c367c9;p=userspace-rcu.git userspace-rcu formal model removal For packaging. Moved to formal-model branch. Signed-off-by: Mathieu Desnoyers --- diff --git a/formal-model/.gitignore b/formal-model/.gitignore deleted file mode 100644 index 49fdd8a..0000000 --- a/formal-model/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -pan -pan.* -urcu.spin.trail diff --git a/formal-model/futex-wakeup/DEFINES b/formal-model/futex-wakeup/DEFINES deleted file mode 100644 index e328b55..0000000 --- a/formal-model/futex-wakeup/DEFINES +++ /dev/null @@ -1 +0,0 @@ -#define queue_has_entry (queue[0] == 1 || queue[1] == 1) diff --git a/formal-model/futex-wakeup/Makefile b/formal-model/futex-wakeup/Makefile deleted file mode 100644 index 11d98e8..0000000 --- a/formal-model/futex-wakeup/Makefile +++ /dev/null @@ -1,108 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#CFLAGS=-DHASH64 -DREACH -CFLAGS=-DHASH64 - -#try pan -i to get the smallest trace. - -SPINFILE=futex.spin -SPINFILE_FAIR=futex.spin - -default: - make futex_progress | tee futex_progress.log - make futex_progress_no_wake | tee futex_progress_no_wake.log - make futex_progress_late_dec | tee futex_progress_late_dec.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep error *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w19 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -futex_progress: clean futex_ltl run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -futex_progress_no_wake: clean futex_ltl futex_progress_no_wake_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -futex_progress_no_wake_define: - cp futex_progress_no_wake.define .input.define - -futex_progress_late_dec: clean futex_ltl futex_progress_late_dec_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -futex_progress_late_dec_define: - cp futex_progress_late_dec.define .input.define - -futex_ltl: - touch .input.define - cat DEFINES > pan.ltl - cat .input.define >> pan.ltl - spin -f "!(`cat futex.ltl | grep -v ^//`)" >> pan.ltl - -run: pan - ./pan -a -v -c1 -X -m10000000 -w19 - -pan: pan.c - gcc -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat DEFINES > .input.spin - cat .input.define >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -run_weak_fair: pan_fair - ./pan_fair -a -f -v -c1 -X -m10000000 -w20 - -pan_fair: pan_fair.c - gcc -w ${CFLAGS} -o pan_fair pan_fair.c - -pan_fair.c: pan.ltl ${SPINFILE_FAIR} - cat DEFINES > .input.spin - cat .input.define >> .input.spin - cat ${SPINFILE_FAIR} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - mv pan.c pan_fair.c - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/futex-wakeup/futex.ltl b/formal-model/futex-wakeup/futex.ltl deleted file mode 100644 index 3d6842e..0000000 --- a/formal-model/futex-wakeup/futex.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> ((!np_) || (!queue_has_entry))) diff --git a/formal-model/futex-wakeup/futex.spin b/formal-model/futex-wakeup/futex.spin deleted file mode 100644 index 5459a53..0000000 --- a/formal-model/futex-wakeup/futex.spin +++ /dev/null @@ -1,124 +0,0 @@ -/* - * futex.spin: Promela code to validate futex wakeup algorithm. - * - * Algorithm verified : - * - * queue = 0; - * fut = 0; - * runvar = 0; - * - * Waker - * queue = 1; - * if (fut == -1) { - * fut = 0; - * } - * - * Waiter - * while (1) { - * progress: - * fut = fut - 1; - * if (queue == 1) { - * fut = 0; - * } else { - * if (fut == -1) { - * while (fut == -1) { } - * } - * } - * queue = 0; - * } - * - * if queue = 1, then !_np - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -#define get_pid() (_pid) - -int queue[2] = 0; -int fut = 0; - -active [2] proctype waker() -{ - assert(get_pid() < 2); - - queue[get_pid()] = 1; - - if - :: (fut == -1) -> - fut = 0; - :: else -> - skip; - fi; - - queue[get_pid()] = 1; - - if - :: (fut == -1) -> - fut = 0; - :: else -> - skip; - fi; - -#ifdef INJ_QUEUE_NO_WAKE - queue[get_pid()] = 1; -#endif -} - - -active proctype waiter() -{ - do - :: 1 -> -#ifndef INJ_LATE_DEC - fut = fut - 1; -#endif - if - :: (queue[0] == 1 || queue[1] == 1) -> -#ifndef INJ_LATE_DEC - fut = 0; -#endif - skip; - :: else -> -#ifdef INJ_LATE_DEC - fut = fut - 1; -#endif - if - :: (fut == -1) -> - do - :: 1 -> - if - :: (fut == -1) -> - skip; - :: else -> - break; - fi; - od; - :: else -> - skip; - fi; - fi; -progress: - if - :: queue[0] == 1 -> - queue[0] = 0; - fi; - if - :: queue[1] == 1 -> - queue[1] = 0; - fi; - od; -} diff --git a/formal-model/futex-wakeup/futex_progress_late_dec.define b/formal-model/futex-wakeup/futex_progress_late_dec.define deleted file mode 100644 index 01361fb..0000000 --- a/formal-model/futex-wakeup/futex_progress_late_dec.define +++ /dev/null @@ -1 +0,0 @@ -#define INJ_LATE_DEC diff --git a/formal-model/futex-wakeup/futex_progress_no_wake.define b/formal-model/futex-wakeup/futex_progress_no_wake.define deleted file mode 100644 index 527bb77..0000000 --- a/formal-model/futex-wakeup/futex_progress_no_wake.define +++ /dev/null @@ -1 +0,0 @@ -#define INJ_QUEUE_NO_WAKE diff --git a/formal-model/ooomem-double-update/DEFINES b/formal-model/ooomem-double-update/DEFINES deleted file mode 100644 index 7cf7b24..0000000 --- a/formal-model/ooomem-double-update/DEFINES +++ /dev/null @@ -1,3 +0,0 @@ -#define read_one_is_one (read_one == 1) -#define read_two_is_one (read_two == 1) -#define read_two_done (read_two != 2) diff --git a/formal-model/ooomem-double-update/Makefile b/formal-model/ooomem-double-update/Makefile deleted file mode 100644 index 37422b5..0000000 --- a/formal-model/ooomem-double-update/Makefile +++ /dev/null @@ -1,93 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#CFLAGS=-DHASH64 -DREACH -CFLAGS=-DHASH64 - -#try pan -i to get the smallest trace. - -SPINFILE=mem.spin - -default: - make read_order | tee read_order.log - make read_order_no_wmb | tee read_order_no_wmb.log - make read_order_no_rmb | tee read_order_no_rmb.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep error *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000 -w19 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -read_order: clean read_order_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -read_order_no_rmb: clean read_order_ltl read_order_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -read_order_no_rmb_define: - cp read_order_no_rmb.define .input.define - -read_order_no_wmb: clean read_order_ltl read_order_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -read_order_no_wmb_define: - cp read_order_no_wmb.define .input.define - -read_order_ltl: - touch .input.define - cat DEFINES > pan.ltl - cat .input.define >> pan.ltl - spin -f "!(`cat read_order.ltl | grep -v ^//`)" >> pan.ltl - -run: pan - ./pan -a -v -c1 -X -m10000 -w19 - -pan: pan.c - gcc -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat DEFINES > .input.spin - cat .input.define >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/ooomem-double-update/mem.sh b/formal-model/ooomem-double-update/mem.sh deleted file mode 100644 index 56e8123..0000000 --- a/formal-model/ooomem-double-update/mem.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a mem.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/ooomem-double-update/mem.spin b/formal-model/ooomem-double-update/mem.spin deleted file mode 100644 index e033f67..0000000 --- a/formal-model/ooomem-double-update/mem.spin +++ /dev/null @@ -1,262 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with out-of-order memory - * and out-of-order instruction scheduling. - * - * Algorithm verified : - * - * alpha = 0; - * beta = 0; - * - * Process A Process B - * alpha = 1; x = beta; - * wmb(); rmb(); - * beta = 1; y = alpha; - * - * if x = 1, then y will = 1 when it is read. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces - * both. - */ - -#define DECLARE_CACHED_VAR(type, x, v) \ - type mem_##x = v; \ - type cached_##x[NR_PROCS] = v; \ - bit cache_dirty_##x[NR_PROCS] = 0; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) - -#define READ_CACHED_VAR(x) \ - (cached_##x[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x[get_pid()] = v; \ - cache_dirty_##x[get_pid()] = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x[id]; \ - cache_dirty_##x[id] = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x[id] = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -inline ooo_mem() -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(alpha, get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(beta, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(alpha, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(beta, get_pid()); - } -} - -/* must consume all prior read tokens */ -inline smp_rmb() -{ - atomic { - /* todo : consume all read tokens .. ? */ - CACHE_READ_FROM_MEM(alpha, get_pid()); - CACHE_READ_FROM_MEM(beta, get_pid()); - } -} - -/* must consume all prior write tokens */ -inline smp_wmb() -{ - atomic { - CACHE_WRITE_TO_MEM(alpha, get_pid()); - CACHE_WRITE_TO_MEM(beta, get_pid()); - } -} - -/* sync_core() must consume all prior read and write tokens, including rmb/wmb - * tokens */ - -/* must consume all prior read and write tokens */ -inline smp_mb() -{ - atomic { - smp_wmb(); - /* sync_core() */ - smp_rmb(); - } -} - -/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ -DECLARE_CACHED_VAR(byte, alpha, 0); -DECLARE_CACHED_VAR(byte, beta, 0); - -/* value 2 is uninitialized */ -byte read_one = 2; -byte read_two = 2; - -/* - * Bit encoding, proc_one_produced : - */ - -#define P1_PROD_NONE (1 << 0) - -#define P1_READ_ONE (1 << 1) -#define P1_RMB (1 << 2) -#define P1_READ_TWO (1 << 3) - -/* Only need a single color. */ -byte proc_one_produced; - -active proctype test_proc_one() -{ - assert(get_pid() < NR_PROCS); - - PRODUCE_TOKENS(proc_one_produced, P1_PROD_NONE); -#ifdef NO_RMB - PRODUCE_TOKENS(proc_one_produced, P1_RMB); -#endif - - do - :: CONSUME_TOKENS(proc_one_produced, - P1_PROD_NONE, P1_READ_ONE) -> - ooo_mem(); - read_one = READ_CACHED_VAR(beta); - ooo_mem(); - PRODUCE_TOKENS(proc_one_produced, P1_READ_ONE); - :: CONSUME_TOKENS(proc_one_produced, - P1_READ_ONE, P1_RMB) -> - smp_rmb(); - PRODUCE_TOKENS(proc_one_produced, P1_RMB); - :: CONSUME_TOKENS(proc_one_produced, - P1_RMB, P1_READ_TWO) -> - ooo_mem(); - read_two = READ_CACHED_VAR(alpha); - ooo_mem(); - PRODUCE_TOKENS(proc_one_produced, P1_READ_TWO); - :: CONSUME_TOKENS(proc_one_produced, - P1_PROD_NONE | P1_READ_ONE | P1_RMB - | P1_READ_TWO, 0) -> - break; - od; - - //CLEAR_TOKENS(proc_one_produced, - // P1_PROD_NONE | P1_READ_ONE | P1_RMB | P1_READ_TWO); - - // test : [] (read_one == 1 -> read_two == 1) - assert(read_one != 1 || read_two == 1); -} - - -/* - * Bit encoding, proc_two_produced : - */ - -#define P2_PROD_NONE (1 << 0) - -#define P2_WRITE_ONE (1 << 1) -#define P2_WMB (1 << 2) -#define P2_WRITE_TWO (1 << 3) - -/* Only need a single color. */ -byte proc_two_produced; - -active proctype test_proc_two() -{ - assert(get_pid() < NR_PROCS); - - PRODUCE_TOKENS(proc_two_produced, P2_PROD_NONE); -#ifdef NO_WMB - PRODUCE_TOKENS(proc_two_produced, P2_WMB); -#endif - - do - :: CONSUME_TOKENS(proc_two_produced, - P2_PROD_NONE, P2_WRITE_ONE) -> - ooo_mem(); - WRITE_CACHED_VAR(alpha, 1); - ooo_mem(); - PRODUCE_TOKENS(proc_two_produced, P2_WRITE_ONE); - :: CONSUME_TOKENS(proc_two_produced, - P2_WRITE_ONE, P2_WMB) -> - smp_wmb(); - PRODUCE_TOKENS(proc_two_produced, P2_WMB); - :: CONSUME_TOKENS(proc_two_produced, - P2_WMB, P2_WRITE_TWO) -> - ooo_mem(); - WRITE_CACHED_VAR(beta, 1); - ooo_mem(); - PRODUCE_TOKENS(proc_two_produced, P2_WRITE_TWO); - :: CONSUME_TOKENS(proc_two_produced, - P2_PROD_NONE | P2_WRITE_ONE - | P2_WMB | P2_WRITE_TWO, 0) -> - break; - od; - - //CLEAR_TOKENS(proc_two_produced, - // P2_PROD_NONE | P2_WRITE_ONE | P2_WMB | P2_WRITE_TWO); -} diff --git a/formal-model/ooomem-double-update/read_order.ltl b/formal-model/ooomem-double-update/read_order.ltl deleted file mode 100644 index b201ec4..0000000 --- a/formal-model/ooomem-double-update/read_order.ltl +++ /dev/null @@ -1 +0,0 @@ -[] (read_one_is_one -> (<> read_two_is_one)) diff --git a/formal-model/ooomem-double-update/read_order_no_rmb.define b/formal-model/ooomem-double-update/read_order_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/ooomem-double-update/read_order_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/ooomem-double-update/read_order_no_wmb.define b/formal-model/ooomem-double-update/read_order_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/ooomem-double-update/read_order_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/ooomem-double-update/references.txt b/formal-model/ooomem-double-update/references.txt deleted file mode 100644 index ca6798f..0000000 --- a/formal-model/ooomem-double-update/references.txt +++ /dev/null @@ -1,7 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html diff --git a/formal-model/ooomem-no-sched/DEFINES b/formal-model/ooomem-no-sched/DEFINES deleted file mode 100644 index 04aa898..0000000 --- a/formal-model/ooomem-no-sched/DEFINES +++ /dev/null @@ -1,2 +0,0 @@ -#define first_read_updated (first_read[0] == 6) -#define second_read_updated (second_read[0] == 4) diff --git a/formal-model/ooomem-no-sched/Makefile b/formal-model/ooomem-no-sched/Makefile deleted file mode 100644 index e0aed43..0000000 --- a/formal-model/ooomem-no-sched/Makefile +++ /dev/null @@ -1,90 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -CFLAGS=-DHASH64 - -SPINFILE=mem.spin - -default: - make read_order | tee read_order.log - make read_order_no_wmb | tee read_order_no_wmb.log - make read_order_no_rmb | tee read_order_no_rmb.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep error *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000 -w19 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -read_order: clean read_order_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -read_order_no_rmb: clean read_order_ltl read_order_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -read_order_no_rmb_define: - cp read_order_no_rmb.define .input.define - -read_order_no_wmb: clean read_order_ltl read_order_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -read_order_no_wmb_define: - cp read_order_no_wmb.define .input.define - -read_order_ltl: - touch .input.define - cat DEFINES > pan.ltl - cat .input.define >> pan.ltl - spin -f "!(`cat read_order.ltl | grep -v ^//`)" >> pan.ltl - -run: pan - ./pan -a -v -c1 -X -m10000 -w19 - -pan: pan.c - gcc -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat DEFINES > .input.spin - cat .input.define >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/ooomem-no-sched/mem.sh b/formal-model/ooomem-no-sched/mem.sh deleted file mode 100644 index 56e8123..0000000 --- a/formal-model/ooomem-no-sched/mem.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a mem.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/ooomem-no-sched/mem.spin b/formal-model/ooomem-no-sched/mem.spin deleted file mode 100644 index 9359a5a..0000000 --- a/formal-model/ooomem-no-sched/mem.spin +++ /dev/null @@ -1,165 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* - * Out-of-order memory model _without_ out-of-order instruction scheduling. - */ - -/* Promela validation variables. */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces - * both. - */ - -#define DECLARE_CACHED_VAR(type, x, v) \ - type mem_##x = v; \ - type cached_##x[NR_PROCS] = v; \ - bit cache_dirty_##x[NR_PROCS] = 0 - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) - -#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x[get_pid()] = v; \ - cache_dirty_##x[get_pid()] = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x[id]; \ - cache_dirty_##x[id] = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -inline smp_rmb() -{ - atomic { - CACHE_READ_FROM_MEM(alpha, get_pid()); - CACHE_READ_FROM_MEM(beta, get_pid()); - } -} - -inline smp_wmb() -{ - atomic { - CACHE_WRITE_TO_MEM(alpha, get_pid()); - CACHE_WRITE_TO_MEM(beta, get_pid()); - } -} - -inline smp_mb() -{ - atomic { - smp_wmb(); - smp_rmb(); - } -} - -/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ -DECLARE_CACHED_VAR(byte, alpha, 0); -DECLARE_CACHED_VAR(byte, beta, 0); - -inline ooo_mem() -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(alpha, get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(beta, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(alpha, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(beta, get_pid()); - } -} - -#define get_readerid() (get_pid()) - -byte first_read[NR_READERS]; -byte second_read[NR_READERS]; - -active [NR_READERS] proctype test_reader() -{ - assert(get_pid() < NR_PROCS); - - ooo_mem(); - first_read[get_readerid()] = READ_CACHED_VAR(beta); - ooo_mem(); -#ifndef NO_RMB - smp_rmb(); - ooo_mem(); -#endif - second_read[get_readerid()] = READ_CACHED_VAR(alpha); - ooo_mem(); - // test : [] (first_read == 6 -> <> second_read == 4) - assert(first_read[get_readerid()] != 6 - || second_read[get_readerid()] == 4); -} - -#define get_writerid() (get_readerid() + NR_READERS) - -active [NR_WRITERS] proctype test_writer() -{ - byte i; - - assert(get_pid() < NR_PROCS); - - ooo_mem(); - WRITE_CACHED_VAR(alpha, 4); - ooo_mem(); -#ifndef NO_WMB - smp_wmb(); - ooo_mem(); -#endif - WRITE_CACHED_VAR(beta, 6); - ooo_mem(); -} diff --git a/formal-model/ooomem-no-sched/read_order.ltl b/formal-model/ooomem-no-sched/read_order.ltl deleted file mode 100644 index b1cdfb7..0000000 --- a/formal-model/ooomem-no-sched/read_order.ltl +++ /dev/null @@ -1 +0,0 @@ -[] (first_read_updated -> <> second_read_updated) diff --git a/formal-model/ooomem-no-sched/read_order_no_rmb.define b/formal-model/ooomem-no-sched/read_order_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/ooomem-no-sched/read_order_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/ooomem-no-sched/read_order_no_wmb.define b/formal-model/ooomem-no-sched/read_order_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/ooomem-no-sched/read_order_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/ooomem-no-sched/references.txt b/formal-model/ooomem-no-sched/references.txt deleted file mode 100644 index ca6798f..0000000 --- a/formal-model/ooomem-no-sched/references.txt +++ /dev/null @@ -1,7 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html diff --git a/formal-model/ooomem-two-writes/DEFINES b/formal-model/ooomem-two-writes/DEFINES deleted file mode 100644 index e7b6f10..0000000 --- a/formal-model/ooomem-two-writes/DEFINES +++ /dev/null @@ -1,4 +0,0 @@ -#define read_one_is_zero (read_one == 0) -#define read_two_is_zero (read_two == 0) -#define read_one_is_one (read_one == 1) -#define read_two_is_one (read_two == 1) diff --git a/formal-model/ooomem-two-writes/Makefile b/formal-model/ooomem-two-writes/Makefile deleted file mode 100644 index 6e91788..0000000 --- a/formal-model/ooomem-two-writes/Makefile +++ /dev/null @@ -1,101 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#CFLAGS=-DHASH64 -DREACH -CFLAGS=-DHASH64 - -#try pan -i to get the smallest trace. - -SPINFILE=mem.spin - -default: - make read_order | tee read_order.log - make read_order_no_wmb | tee read_order_no_wmb.log - make read_order_no_rmb | tee read_order_no_rmb.log - make read_order_no_sync | tee read_order_no_sync.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep error *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000 -w19 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -read_order: clean read_order_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -read_order_no_sync: clean read_order_ltl read_order_no_sync_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -read_order_no_sync_define: - cp read_order_no_sync.define .input.define - -read_order_no_rmb: clean read_order_ltl read_order_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -read_order_no_rmb_define: - cp read_order_no_rmb.define .input.define - -read_order_no_wmb: clean read_order_ltl read_order_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -read_order_no_wmb_define: - cp read_order_no_wmb.define .input.define - -read_order_ltl: - touch .input.define - cat DEFINES > pan.ltl - cat .input.define >> pan.ltl - spin -f "!(`cat read_order.ltl | grep -v ^//`)" >> pan.ltl - -run: pan - ./pan -a -v -c1 -X -m10000 -w19 - -pan: pan.c - gcc -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat DEFINES > .input.spin - cat .input.define >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/ooomem-two-writes/mem.sh b/formal-model/ooomem-two-writes/mem.sh deleted file mode 100644 index 56e8123..0000000 --- a/formal-model/ooomem-two-writes/mem.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a mem.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/ooomem-two-writes/mem.spin b/formal-model/ooomem-two-writes/mem.spin deleted file mode 100644 index 304c3f8..0000000 --- a/formal-model/ooomem-two-writes/mem.spin +++ /dev/null @@ -1,291 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with out-of-order memory - * and out-of-order instruction scheduling. - * - * Algorithm verified : - * - * alpha = 0; - * beta = 0; - * x = 1; - * y = 1; - * - * Process A Process B - * alpha = 1; beta = 1; - * mb(); mb(); - * x = beta; y = alpha; - * - * if x = 0, then y != 0 - * if y = 0, then x != 0 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces - * both. - */ - -#define DECLARE_CACHED_VAR(type, x, v) \ - type mem_##x = v; \ - type cached_##x[NR_PROCS] = v; \ - bit cache_dirty_##x[NR_PROCS] = 0; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) - -#define READ_CACHED_VAR(x) \ - (cached_##x[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x[get_pid()] = v; \ - cache_dirty_##x[get_pid()] = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x[id]; \ - cache_dirty_##x[id] = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x[id] = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -inline ooo_mem() -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(alpha, get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(beta, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(alpha, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(beta, get_pid()); - } -} - -/* must consume all prior read tokens */ -inline smp_rmb() -{ - atomic { - /* todo : consume all read tokens .. ? */ - CACHE_READ_FROM_MEM(alpha, get_pid()); - CACHE_READ_FROM_MEM(beta, get_pid()); - } -} - -/* must consume all prior write tokens */ -inline smp_wmb() -{ - atomic { - CACHE_WRITE_TO_MEM(alpha, get_pid()); - CACHE_WRITE_TO_MEM(beta, get_pid()); - } -} - -/* sync_core() must consume all prior read and write tokens, including rmb/wmb - * tokens */ - -/* must consume all prior read and write tokens */ -inline smp_mb() -{ - atomic { - smp_wmb(); - /* sync_core() */ - smp_rmb(); - } -} - -/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ -DECLARE_CACHED_VAR(byte, alpha, 0); -DECLARE_CACHED_VAR(byte, beta, 0); - -byte read_one = 1; -byte read_two = 1; - -/* - * Bit encoding, proc_one_produced : - */ - -#define P1_PROD_NONE (1 << 0) - -#define P1_WRITE (1 << 1) -#define P1_WMB (1 << 2) -#define P1_SYNC_CORE (1 << 3) -#define P1_RMB (1 << 4) -#define P1_READ (1 << 5) - -int proc_one_produced; - -active proctype test_proc_one() -{ - assert(get_pid() < NR_PROCS); - - PRODUCE_TOKENS(proc_one_produced, P1_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_one_produced, P1_WMB); -#endif -#ifdef NO_RMB - PRODUCE_TOKENS(proc_one_produced, P1_RMB); -#endif -#ifdef NO_SYNC - PRODUCE_TOKENS(proc_one_produced, P1_SYNC_CORE); -#endif - - do - :: CONSUME_TOKENS(proc_one_produced, P1_PROD_NONE, P1_WRITE) -> - ooo_mem(); - WRITE_CACHED_VAR(alpha, 1); - ooo_mem(); - PRODUCE_TOKENS(proc_one_produced, P1_WRITE); - :: CONSUME_TOKENS(proc_one_produced, P1_WRITE, P1_WMB) -> - smp_wmb(); - PRODUCE_TOKENS(proc_one_produced, P1_WMB); - :: CONSUME_TOKENS(proc_one_produced, P1_WRITE | P1_WMB, P1_SYNC_CORE) -> - /* sync_core(); */ - PRODUCE_TOKENS(proc_one_produced, P1_SYNC_CORE); - :: CONSUME_TOKENS(proc_one_produced, P1_SYNC_CORE, P1_RMB) -> - smp_rmb(); - PRODUCE_TOKENS(proc_one_produced, P1_RMB); - :: CONSUME_TOKENS(proc_one_produced, P1_RMB | P1_SYNC_CORE, P1_READ) -> - ooo_mem(); - read_one = READ_CACHED_VAR(beta); - ooo_mem(); - PRODUCE_TOKENS(proc_one_produced, P1_READ); - :: CONSUME_TOKENS(proc_one_produced, P1_PROD_NONE | P1_WRITE - | P1_WMB | P1_SYNC_CORE | P1_RMB | P1_READ, 0) -> - break; - od; - - //CLEAR_TOKENS(proc_one_produced, - // P1_PROD_NONE | P1_WRITE | P1_WMB | P1_SYNC_CORE | P1_RMB | - // P2_READ); - - // test : [] (read_one == 0 -> read_two != 0) - // test : [] (read_two == 0 -> read_one != 0) - assert(!(read_one == 0 && read_two == 0)); -} - - -/* - * Bit encoding, proc_two_produced : - */ - -#define P2_PROD_NONE (1 << 0) - -#define P2_WRITE (1 << 1) -#define P2_WMB (1 << 2) -#define P2_SYNC_CORE (1 << 3) -#define P2_RMB (1 << 4) -#define P2_READ (1 << 5) - -int proc_two_produced; - -active proctype test_proc_two() -{ - assert(get_pid() < NR_PROCS); - - PRODUCE_TOKENS(proc_two_produced, P2_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_two_produced, P2_WMB); -#endif -#ifdef NO_RMB - PRODUCE_TOKENS(proc_two_produced, P2_RMB); -#endif -#ifdef NO_SYNC - PRODUCE_TOKENS(proc_two_produced, P2_SYNC_CORE); -#endif - - do - :: CONSUME_TOKENS(proc_two_produced, P2_PROD_NONE, P2_WRITE) -> - ooo_mem(); - WRITE_CACHED_VAR(beta, 1); - ooo_mem(); - PRODUCE_TOKENS(proc_two_produced, P2_WRITE); - :: CONSUME_TOKENS(proc_two_produced, P2_WRITE, P2_WMB) -> - smp_wmb(); - PRODUCE_TOKENS(proc_two_produced, P2_WMB); - :: CONSUME_TOKENS(proc_two_produced, P2_WRITE | P2_WMB, P2_SYNC_CORE) -> - /* sync_core(); */ - PRODUCE_TOKENS(proc_two_produced, P2_SYNC_CORE); - :: CONSUME_TOKENS(proc_two_produced, P2_SYNC_CORE, P2_RMB) -> - smp_rmb(); - PRODUCE_TOKENS(proc_two_produced, P2_RMB); - :: CONSUME_TOKENS(proc_two_produced, P2_SYNC_CORE | P2_RMB, P2_READ) -> - ooo_mem(); - read_two = READ_CACHED_VAR(alpha); - ooo_mem(); - PRODUCE_TOKENS(proc_two_produced, P2_READ); - :: CONSUME_TOKENS(proc_two_produced, P2_PROD_NONE | P2_WRITE - | P2_WMB | P2_SYNC_CORE | P2_RMB | P2_READ, 0) -> - break; - od; - - //CLEAR_TOKENS(proc_two_produced, - // P2_PROD_NONE | P2_WRITE | P2_WMB | P2_SYNC_CORE | P2_RMB | - // P2_READ); - - // test : [] (read_one == 0 -> read_two != 0) - // test : [] (read_two == 0 -> read_one != 0) - assert(!(read_one == 0 && read_two == 0)); -} diff --git a/formal-model/ooomem-two-writes/read_order.ltl b/formal-model/ooomem-two-writes/read_order.ltl deleted file mode 100644 index 6ba2459..0000000 --- a/formal-model/ooomem-two-writes/read_order.ltl +++ /dev/null @@ -1 +0,0 @@ -[] (read_one_is_one || read_two_is_one) diff --git a/formal-model/ooomem-two-writes/read_order_no_rmb.define b/formal-model/ooomem-two-writes/read_order_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/ooomem-two-writes/read_order_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/ooomem-two-writes/read_order_no_sync.define b/formal-model/ooomem-two-writes/read_order_no_sync.define deleted file mode 100644 index 0d2f8cf..0000000 --- a/formal-model/ooomem-two-writes/read_order_no_sync.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_SYNC diff --git a/formal-model/ooomem-two-writes/read_order_no_wmb.define b/formal-model/ooomem-two-writes/read_order_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/ooomem-two-writes/read_order_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/ooomem-two-writes/references.txt b/formal-model/ooomem-two-writes/references.txt deleted file mode 100644 index ca6798f..0000000 --- a/formal-model/ooomem-two-writes/references.txt +++ /dev/null @@ -1,7 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html diff --git a/formal-model/spinlock/DEFINES b/formal-model/spinlock/DEFINES deleted file mode 100644 index 4eb5315..0000000 --- a/formal-model/spinlock/DEFINES +++ /dev/null @@ -1 +0,0 @@ -#define refcount_gt_one (refcount > 1) diff --git a/formal-model/spinlock/Makefile b/formal-model/spinlock/Makefile deleted file mode 100644 index a153e7a..0000000 --- a/formal-model/spinlock/Makefile +++ /dev/null @@ -1,103 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#CFLAGS=-DHASH64 -DREACH -CFLAGS=-DHASH64 - -#try pan -i to get the smallest trace. - -SPINFILE=mem.spin -SPINFILE_FAIR=mem-progress.spin - -default: - make refcount | tee refcount.log - make lock_progress | tee lock_progress.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep error *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000 -w19 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -refcount: clean refcount_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -refcount_ltl: - touch .input.define - cat DEFINES > pan.ltl - cat .input.define >> pan.ltl - spin -f "!(`cat refcount.ltl | grep -v ^//`)" >> pan.ltl - -lock_progress: clean lock_progress_ltl run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -lock_progress_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat lock_progress.ltl | grep -v ^//`)" >> pan.ltl - -run: pan - ./pan -a -v -c1 -X -m10000 -w19 - -run_weak_fair: pan_fair - ./pan_fair -a -f -v -c1 -X -m10000000 -w20 - -pan_fair: pan_fair.c - gcc -w ${CFLAGS} -o pan_fair pan_fair.c - -pan: pan.c - gcc -w ${CFLAGS} -o pan pan.c - -pan_fair.c: pan.ltl ${SPINFILE_FAIR} - cat DEFINES > .input.spin - cat .input.define >> .input.spin - cat ${SPINFILE_FAIR} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - mv pan.c pan_fair.c - -pan.c: pan.ltl ${SPINFILE} - cat DEFINES > .input.spin - cat .input.define >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/spinlock/lock_progress.ltl b/formal-model/spinlock/lock_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/spinlock/lock_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/spinlock/mem-progress.spin b/formal-model/spinlock/mem-progress.spin deleted file mode 100644 index 7930d04..0000000 --- a/formal-model/spinlock/mem-progress.spin +++ /dev/null @@ -1,69 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -byte lock = 0; -byte refcount = 0; - -inline spin_lock(lock) -{ - do - :: 1 -> atomic { - if - :: (lock) -> - skip; - :: else -> - lock = 1; - break; - fi; - } - od; -} - -inline spin_unlock(lock) -{ - lock = 0; -} - -proctype proc_A() -{ - do - :: 1-> -progress_A: - spin_lock(lock); - refcount = refcount + 1; - refcount = refcount - 1; - spin_unlock(lock); - od; -} - -proctype proc_B() -{ - do - :: 1-> - spin_lock(lock); - refcount = refcount + 1; - refcount = refcount - 1; - spin_unlock(lock); - od; -} - -init -{ - run proc_A(); - run proc_B(); -} diff --git a/formal-model/spinlock/mem.sh b/formal-model/spinlock/mem.sh deleted file mode 100644 index 56e8123..0000000 --- a/formal-model/spinlock/mem.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a mem.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/spinlock/mem.spin b/formal-model/spinlock/mem.spin deleted file mode 100644 index 9e87809..0000000 --- a/formal-model/spinlock/mem.spin +++ /dev/null @@ -1,57 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -byte lock = 0; -byte refcount = 0; - -inline spin_lock(lock) -{ - do - :: 1 -> atomic { - if - :: (lock) -> - skip; - :: else -> - lock = 1; - break; - fi; - } - od; -} - -inline spin_unlock(lock) -{ - lock = 0; -} - -proctype proc_X() -{ - do - :: 1 -> - spin_lock(lock); - refcount = refcount + 1; - refcount = refcount - 1; - spin_unlock(lock); - od; -} - -init -{ - run proc_X(); - run proc_X(); -} diff --git a/formal-model/spinlock/refcount.ltl b/formal-model/spinlock/refcount.ltl deleted file mode 100644 index 48f971f..0000000 --- a/formal-model/spinlock/refcount.ltl +++ /dev/null @@ -1 +0,0 @@ -[] (!(refcount_gt_one)) diff --git a/formal-model/spinlock/references.txt b/formal-model/spinlock/references.txt deleted file mode 100644 index ca6798f..0000000 --- a/formal-model/spinlock/references.txt +++ /dev/null @@ -1,7 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html diff --git a/formal-model/ticketlock/DEFINES b/formal-model/ticketlock/DEFINES deleted file mode 100644 index 4eb5315..0000000 --- a/formal-model/ticketlock/DEFINES +++ /dev/null @@ -1 +0,0 @@ -#define refcount_gt_one (refcount > 1) diff --git a/formal-model/ticketlock/Makefile b/formal-model/ticketlock/Makefile deleted file mode 100644 index c41afd3..0000000 --- a/formal-model/ticketlock/Makefile +++ /dev/null @@ -1,112 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#CFLAGS=-DHASH64 -DREACH -CFLAGS=-DHASH64 - -#try pan -i to get the smallest trace. - -SPINFILE=mem.spin -SPINFILE_FAIR=mem-progress.spin - -default: - make refcount | tee refcount.log - make refcount_4_bits_per_byte | tee refcount_4_bits_per_byte.log - make lock_progress | tee lock_progress.log - make lock_progress_4_bits_per_byte | tee lock_progress_4_bits_per_byte.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep error *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w19 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -refcount: clean refcount_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -refcount_ltl: - touch .input.define - cat DEFINES > pan.ltl - cat .input.define >> pan.ltl - spin -f "!(`cat refcount.ltl | grep -v ^//`)" >> pan.ltl - -refcount_4_bits_per_byte: clean refcount_ltl config_4_bits_per_byte_define run - -lock_progress: clean lock_progress_ltl run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -lock_progress_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat lock_progress.ltl | grep -v ^//`)" >> pan.ltl - -lock_progress_4_bits_per_byte: clean lock_progress_ltl config_4_bits_per_byte_define run - -config_4_bits_per_byte_define: - cp config_4_bits_per_byte.define .input.define - -run: pan - ./pan -a -v -c1 -X -m1000000 -w19 - -run_weak_fair: pan_fair - ./pan_fair -a -f -v -c1 -X -m1000000 -w20 - -pan_fair: pan_fair.c - gcc -w ${CFLAGS} -DNFAIR=4 -o pan_fair pan_fair.c - -pan: pan.c - gcc -w ${CFLAGS} -o pan pan.c - -pan_fair.c: pan.ltl ${SPINFILE_FAIR} - cat DEFINES > .input.spin - cat .input.define >> .input.spin - cat ${SPINFILE_FAIR} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - mv pan.c pan_fair.c - -pan.c: pan.ltl ${SPINFILE} - cat DEFINES > .input.spin - cat .input.define >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/ticketlock/config_4_bits_per_byte.define b/formal-model/ticketlock/config_4_bits_per_byte.define deleted file mode 100644 index e1d13ca..0000000 --- a/formal-model/ticketlock/config_4_bits_per_byte.define +++ /dev/null @@ -1 +0,0 @@ -#define CONFIG_BITS_PER_BYTE 4 diff --git a/formal-model/ticketlock/lock_progress.ltl b/formal-model/ticketlock/lock_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/ticketlock/lock_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/ticketlock/mem-progress.spin b/formal-model/ticketlock/mem-progress.spin deleted file mode 100644 index dad43a4..0000000 --- a/formal-model/ticketlock/mem-progress.spin +++ /dev/null @@ -1,98 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* 16 CPUs max (byte has 8 bits, divided in two) */ - -#ifndef CONFIG_BITS_PER_BYTE -#define BITS_PER_BYTE 8 -#else -// test progress failure with shorter byte size. Will fail with 5 proc. -#define BITS_PER_BYTE CONFIG_BITS_PER_BYTE -#endif - -#define HBPB (BITS_PER_BYTE / 2) /* 4 */ -#define HMASK ((1 << HBPB) - 1) /* 0x0F */ - -/* for byte type */ -#define LOW_HALF(val) ((val) & HMASK) -#define LOW_HALF_INC 1 - -#define HIGH_HALF(val) ((val) & (HMASK << HBPB)) -#define HIGH_HALF_INC (1 << HBPB) - -byte lock = 0; -byte refcount = 0; - -inline spin_lock(lock, ticket) -{ - atomic { - ticket = HIGH_HALF(lock) >> HBPB; - lock = lock + HIGH_HALF_INC; /* overflow expected */ - } - - do - :: 1 -> - if - :: (LOW_HALF(lock) == ticket) -> - break; - :: else -> - skip; - fi; - od; -} - -inline spin_unlock(lock) -{ - lock = HIGH_HALF(lock) | LOW_HALF(lock + LOW_HALF_INC); -} - -proctype proc_A() -{ - byte ticket; - - do - :: 1 -> -progress_A: - spin_lock(lock, ticket); - refcount = refcount + 1; - refcount = refcount - 1; - spin_unlock(lock); - od; -} - -proctype proc_B() -{ - byte ticket; - - do - :: 1 -> - spin_lock(lock, ticket); - refcount = refcount + 1; - refcount = refcount - 1; - spin_unlock(lock); - od; -} - -init -{ - run proc_A(); - run proc_B(); - run proc_B(); - run proc_B(); - run proc_B(); -} diff --git a/formal-model/ticketlock/mem.sh b/formal-model/ticketlock/mem.sh deleted file mode 100644 index 56e8123..0000000 --- a/formal-model/ticketlock/mem.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a mem.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/ticketlock/mem.spin b/formal-model/ticketlock/mem.spin deleted file mode 100644 index 445ee9a..0000000 --- a/formal-model/ticketlock/mem.spin +++ /dev/null @@ -1,83 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* 16 CPUs max (byte has 8 bits, divided in two) */ - -#ifndef CONFIG_BITS_PER_BYTE -#define BITS_PER_BYTE 8 -#else -#define BITS_PER_BYTE CONFIG_BITS_PER_BYTE -#endif - -#define HBPB (BITS_PER_BYTE / 2) /* 4 */ -#define HMASK ((1 << HBPB) - 1) /* 0x0F */ - -/* for byte type */ -#define LOW_HALF(val) ((val) & HMASK) -#define LOW_HALF_INC 1 - -#define HIGH_HALF(val) ((val) & (HMASK << HBPB)) -#define HIGH_HALF_INC (1 << HBPB) - -byte lock = 0; -byte refcount = 0; - -inline spin_lock(lock, ticket) -{ - atomic { - ticket = HIGH_HALF(lock) >> HBPB; - lock = lock + HIGH_HALF_INC; /* overflow expected */ - } - - do - :: 1 -> - if - :: (LOW_HALF(lock) == ticket) -> - break; - :: else -> - skip; - fi; - od; -} - -inline spin_unlock(lock) -{ - lock = HIGH_HALF(lock) | LOW_HALF(lock + LOW_HALF_INC); -} - -proctype proc_X() -{ - byte ticket; - - do - :: 1-> - spin_lock(lock, ticket); - refcount = refcount + 1; - refcount = refcount - 1; - spin_unlock(lock); - od; -} - -init -{ - run proc_X(); - run proc_X(); - run proc_X(); - run proc_X(); - run proc_X(); -} diff --git a/formal-model/ticketlock/refcount.ltl b/formal-model/ticketlock/refcount.ltl deleted file mode 100644 index 48f971f..0000000 --- a/formal-model/ticketlock/refcount.ltl +++ /dev/null @@ -1 +0,0 @@ -[] (!(refcount_gt_one)) diff --git a/formal-model/ticketlock/references.txt b/formal-model/ticketlock/references.txt deleted file mode 100644 index ca6798f..0000000 --- a/formal-model/ticketlock/references.txt +++ /dev/null @@ -1,7 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/.input.define b/formal-model/urcu-controldataflow-alpha-ipi-compress/.input.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/.input.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/.input.spin b/formal-model/urcu-controldataflow-alpha-ipi-compress/.input.spin deleted file mode 100644 index 887b1ad..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/.input.spin +++ /dev/null @@ -1,1340 +0,0 @@ -#define READER_PROGRESS - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/DEFINES b/formal-model/urcu-controldataflow-alpha-ipi-compress/DEFINES deleted file mode 100644 index 2681f69..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/DEFINES +++ /dev/null @@ -1,18 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/Makefile b/formal-model/urcu-controldataflow-alpha-ipi-compress/Makefile deleted file mode 100644 index f8bfd31..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/Makefile +++ /dev/null @@ -1,171 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 -DCOLLAPSE -#CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - #make urcu_free | tee urcu_free.log - #make urcu_free_no_mb | tee urcu_free_no_mb.log - #make urcu_free_no_rmb | tee urcu_free_no_rmb.log - #make urcu_free_no_wmb | tee urcu_free_no_wmb.log - #make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - #make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/references.txt b/formal-model/urcu-controldataflow-alpha-ipi-compress/references.txt deleted file mode 100644 index 72c67a2..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/references.txt +++ /dev/null @@ -1,13 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html - -LTL vs CTL : - -http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 -http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf - (downloaded) diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu.sh b/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu.spin b/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu.spin deleted file mode 100644 index 8075506..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu.spin +++ /dev/null @@ -1,1321 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free.ltl b/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free.ltl deleted file mode 100644 index 6be1be9..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free.ltl +++ /dev/null @@ -1 +0,0 @@ -[] (!read_poison) diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free_nested.define b/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free_nested.define deleted file mode 100644 index 0fb59bd..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free_nested.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_NEST_LEVEL 2 diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free_no_mb.define b/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free_no_mb.define deleted file mode 100644 index d99d793..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free_no_mb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_MB diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free_no_rmb.define b/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free_no_wmb.define b/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free_single_flip.define b/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress.ltl b/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_reader.define b/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_reader.log b/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_reader.log deleted file mode 100644 index f11dc83..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_reader.log +++ /dev/null @@ -1,303 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-ipi-compress' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_reader.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1362) -depth 7: Claim reached state 9 (line 1367) -depth 136: Claim reached state 9 (line 1366) -Depth= 115766 States= 1e+06 Transitions= 2.97e+08 Memory= 495.647 t= 461 R= 2e+03 -Depth= 115766 States= 2e+06 Transitions= 5.97e+08 Memory= 525.529 t= 939 R= 2e+03 -Depth= 115766 States= 3e+06 Transitions= 8.86e+08 Memory= 553.264 t= 1.41e+03 R= 2e+03 -pan: resizing hashtable to -w22.. done -Depth= 115766 States= 4e+06 Transitions= 1.18e+09 Memory= 614.463 t= 1.87e+03 R= 2e+03 -Depth= 115766 States= 5e+06 Transitions= 1.48e+09 Memory= 644.541 t= 2.34e+03 R= 2e+03 -Depth= 115766 States= 6e+06 Transitions= 1.77e+09 Memory= 674.424 t= 2.8e+03 R= 2e+03 -Depth= 115766 States= 7e+06 Transitions= 2.07e+09 Memory= 701.865 t= 3.27e+03 R= 2e+03 -Depth= 115766 States= 8e+06 Transitions= 2.36e+09 Memory= 729.404 t= 3.75e+03 R= 2e+03 -Depth= 115766 States= 9e+06 Transitions= 2.66e+09 Memory= 757.920 t= 4.23e+03 R= 2e+03 -pan: resizing hashtable to -w24.. done -Depth= 117893 States= 1e+07 Transitions= 2.95e+09 Memory= 909.846 t= 4.69e+03 R= 2e+03 -Depth= 117893 States= 1.1e+07 Transitions= 3.35e+09 Memory= 937.190 t= 5.31e+03 R= 2e+03 -Depth= 117893 States= 1.2e+07 Transitions= 3.69e+09 Memory= 964.826 t= 5.85e+03 R= 2e+03 -Depth= 117893 States= 1.3e+07 Transitions= 4.02e+09 Memory= 994.026 t= 6.37e+03 R= 2e+03 -Depth= 117893 States= 1.4e+07 Transitions= 4.32e+09 Memory= 1021.858 t= 6.84e+03 R= 2e+03 -Depth= 117893 States= 1.5e+07 Transitions= 4.63e+09 Memory= 1050.080 t= 7.33e+03 R= 2e+03 -Depth= 117893 States= 1.6e+07 Transitions= 4.95e+09 Memory= 1078.693 t= 7.83e+03 R= 2e+03 -Depth= 117893 States= 1.7e+07 Transitions= 5.24e+09 Memory= 1106.135 t= 8.28e+03 R= 2e+03 -Depth= 117893 States= 1.8e+07 Transitions= 5.54e+09 Memory= 1135.920 t= 8.74e+03 R= 2e+03 -Depth= 117893 States= 1.9e+07 Transitions= 5.82e+09 Memory= 1164.338 t= 9.19e+03 R= 2e+03 -Depth= 117893 States= 2e+07 Transitions= 6.12e+09 Memory= 1194.514 t= 9.66e+03 R= 2e+03 -Depth= 117893 States= 2.1e+07 Transitions= 6.42e+09 Memory= 1223.713 t= 1.01e+04 R= 2e+03 -Depth= 117893 States= 2.2e+07 Transitions= 6.72e+09 Memory= 1252.912 t= 1.06e+04 R= 2e+03 -Depth= 117893 States= 2.3e+07 Transitions= 7.01e+09 Memory= 1280.744 t= 1.11e+04 R= 2e+03 -Depth= 117893 States= 2.4e+07 Transitions= 7.3e+09 Memory= 1311.408 t= 1.15e+04 R= 2e+03 -Depth= 117893 States= 2.5e+07 Transitions= 7.61e+09 Memory= 1336.994 t= 1.2e+04 R= 2e+03 -Depth= 117893 States= 2.6e+07 Transitions= 7.89e+09 Memory= 1365.315 t= 1.24e+04 R= 2e+03 -Depth= 117893 States= 2.7e+07 Transitions= 8.35e+09 Memory= 1390.315 t= 1.32e+04 R= 2e+03 -Depth= 117893 States= 2.8e+07 Transitions= 8.84e+09 Memory= 1414.143 t= 1.4e+04 R= 2e+03 -Depth= 117893 States= 2.9e+07 Transitions= 9.64e+09 Memory= 1438.166 t= 1.53e+04 R= 2e+03 -Depth= 117893 States= 3e+07 Transitions= 1.02e+10 Memory= 1462.971 t= 1.62e+04 R= 2e+03 -Depth= 117893 States= 3.1e+07 Transitions= 1.06e+10 Memory= 1488.068 t= 1.69e+04 R= 2e+03 -Depth= 117893 States= 3.2e+07 Transitions= 1.14e+10 Memory= 1512.287 t= 1.82e+04 R= 2e+03 -Depth= 117893 States= 3.3e+07 Transitions= 1.24e+10 Memory= 1536.799 t= 1.99e+04 R= 2e+03 -Depth= 117893 States= 3.4e+07 Transitions= 1.27e+10 Memory= 1567.658 t= 2.04e+04 R= 2e+03 -pan: resizing hashtable to -w26.. done -Depth= 117893 States= 3.5e+07 Transitions= 1.32e+10 Memory= 2089.424 t= 2.13e+04 R= 2e+03 -Depth= 117893 States= 3.6e+07 Transitions= 1.38e+10 Memory= 2116.768 t= 2.22e+04 R= 2e+03 -Depth= 117893 States= 3.7e+07 Transitions= 1.45e+10 Memory= 2142.158 t= 2.33e+04 R= 2e+03 -Depth= 117893 States= 3.8e+07 Transitions= 1.49e+10 Memory= 2170.674 t= 2.41e+04 R= 2e+03 -Depth= 117893 States= 3.9e+07 Transitions= 1.55e+10 Memory= 2197.725 t= 2.49e+04 R= 2e+03 -Depth= 117893 States= 4e+07 Transitions= 1.63e+10 Memory= 2219.014 t= 2.63e+04 R= 2e+03 -Depth= 117893 States= 4.1e+07 Transitions= 1.69e+10 Memory= 2242.061 t= 2.75e+04 R= 1e+03 -Depth= 117893 States= 4.2e+07 Transitions= 1.73e+10 Memory= 2269.600 t= 2.81e+04 R= 1e+03 -Depth= 117893 States= 4.3e+07 Transitions= 1.8e+10 Memory= 2295.967 t= 2.92e+04 R= 1e+03 -Depth= 117893 States= 4.4e+07 Transitions= 1.85e+10 Memory= 2323.213 t= 3e+04 R= 1e+03 -Depth= 117893 States= 4.5e+07 Transitions= 1.91e+10 Memory= 2348.994 t= 3.09e+04 R= 1e+03 -Depth= 117893 States= 4.6e+07 Transitions= 1.97e+10 Memory= 2374.190 t= 3.2e+04 R= 1e+03 -Depth= 117893 States= 4.7e+07 Transitions= 2.03e+10 Memory= 2399.483 t= 3.3e+04 R= 1e+03 -Depth= 117893 States= 4.8e+07 Transitions= 2.07e+10 Memory= 2428.486 t= 3.36e+04 R= 1e+03 -Depth= 117893 States= 4.9e+07 Transitions= 2.13e+10 Memory= 2454.951 t= 3.45e+04 R= 1e+03 -Depth= 117893 States= 5e+07 Transitions= 2.18e+10 Memory= 2482.686 t= 3.54e+04 R= 1e+03 -Depth= 117893 States= 5.1e+07 Transitions= 2.24e+10 Memory= 2509.151 t= 3.62e+04 R= 1e+03 -Depth= 117893 States= 5.2e+07 Transitions= 2.3e+10 Memory= 2535.420 t= 3.72e+04 R= 1e+03 -Depth= 117893 States= 5.3e+07 Transitions= 2.38e+10 Memory= 2560.518 t= 3.86e+04 R= 1e+03 -Depth= 117893 States= 5.4e+07 Transitions= 2.42e+10 Memory= 2586.592 t= 3.94e+04 R= 1e+03 -Depth= 117893 States= 5.5e+07 Transitions= 2.46e+10 Memory= 2610.713 t= 4e+04 R= 1e+03 -Depth= 117893 States= 5.6e+07 Transitions= 2.49e+10 Memory= 2638.545 t= 4.06e+04 R= 1e+03 -Depth= 117893 States= 5.7e+07 Transitions= 2.53e+10 Memory= 2668.135 t= 4.11e+04 R= 1e+03 -Depth= 117893 States= 5.8e+07 Transitions= 2.56e+10 Memory= 2698.213 t= 4.16e+04 R= 1e+03 -Depth= 117893 States= 5.9e+07 Transitions= 2.59e+10 Memory= 2723.897 t= 4.22e+04 R= 1e+03 -Depth= 117893 States= 6e+07 Transitions= 2.66e+10 Memory= 2747.627 t= 4.33e+04 R= 1e+03 -Depth= 117893 States= 6.1e+07 Transitions= 2.7e+10 Memory= 2774.678 t= 4.39e+04 R= 1e+03 -Depth= 117893 States= 6.2e+07 Transitions= 2.73e+10 Memory= 2803.584 t= 4.45e+04 R= 1e+03 -Depth= 117893 States= 6.3e+07 Transitions= 2.77e+10 Memory= 2831.221 t= 4.51e+04 R= 1e+03 -Depth= 117893 States= 6.4e+07 Transitions= 2.8e+10 Memory= 2860.225 t= 4.56e+04 R= 1e+03 -Depth= 117893 States= 6.5e+07 Transitions= 2.84e+10 Memory= 2885.225 t= 4.62e+04 R= 1e+03 -Depth= 117893 States= 6.6e+07 Transitions= 2.89e+10 Memory= 2908.760 t= 4.71e+04 R= 1e+03 -Depth= 117893 States= 6.7e+07 Transitions= 2.96e+10 Memory= 2932.686 t= 4.82e+04 R= 1e+03 -Depth= 117893 States= 6.8e+07 Transitions= 3.03e+10 Memory= 2956.123 t= 4.96e+04 R= 1e+03 -Depth= 117893 States= 6.9e+07 Transitions= 3.14e+10 Memory= 2985.908 t= 5.13e+04 R= 1e+03 -Depth= 117893 States= 7e+07 Transitions= 3.24e+10 Memory= 3015.303 t= 5.31e+04 R= 1e+03 -Depth= 117893 States= 7.1e+07 Transitions= 3.36e+10 Memory= 3039.912 t= 5.5e+04 R= 1e+03 -Depth= 117893 States= 7.2e+07 Transitions= 3.47e+10 Memory= 3065.401 t= 5.69e+04 R= 1e+03 -Depth= 117893 States= 7.3e+07 Transitions= 3.58e+10 Memory= 3086.690 t= 5.87e+04 R= 1e+03 -Depth= 117893 States= 7.4e+07 Transitions= 3.67e+10 Memory= 3108.272 t= 6.02e+04 R= 1e+03 -Depth= 117893 States= 7.5e+07 Transitions= 3.78e+10 Memory= 3127.608 t= 6.21e+04 R= 1e+03 -Depth= 117893 States= 7.6e+07 Transitions= 3.89e+10 Memory= 3147.627 t= 6.39e+04 R= 1e+03 -Depth= 117893 States= 7.7e+07 Transitions= 3.97e+10 Memory= 3167.647 t= 6.53e+04 R= 1e+03 -Depth= 117893 States= 7.8e+07 Transitions= 4.01e+10 Memory= 3195.772 t= 6.6e+04 R= 1e+03 -Depth= 117893 States= 7.9e+07 Transitions= 4.07e+10 Memory= 3221.065 t= 6.69e+04 R= 1e+03 -Depth= 117893 States= 8e+07 Transitions= 4.14e+10 Memory= 3245.869 t= 6.8e+04 R= 1e+03 -Depth= 117893 States= 8.1e+07 Transitions= 4.26e+10 Memory= 3270.186 t= 7e+04 R= 1e+03 -Depth= 117893 States= 8.2e+07 Transitions= 4.33e+10 Memory= 3293.135 t= 7.12e+04 R= 1e+03 -Depth= 117893 States= 8.3e+07 Transitions= 4.38e+10 Memory= 3323.701 t= 7.21e+04 R= 1e+03 -Depth= 117893 States= 8.4e+07 Transitions= 4.41e+10 Memory= 3350.752 t= 7.26e+04 R= 1e+03 -Depth= 117893 States= 8.5e+07 Transitions= 4.45e+10 Memory= 3375.166 t= 7.31e+04 R= 1e+03 -Depth= 117893 States= 8.6e+07 Transitions= 4.49e+10 Memory= 3397.432 t= 7.37e+04 R= 1e+03 -Depth= 117893 States= 8.7e+07 Transitions= 4.53e+10 Memory= 3424.287 t= 7.44e+04 R= 1e+03 -Depth= 117893 States= 8.8e+07 Transitions= 4.61e+10 Memory= 3449.385 t= 7.58e+04 R= 1e+03 -Depth= 117893 States= 8.9e+07 Transitions= 4.71e+10 Memory= 3469.795 t= 7.74e+04 R= 1e+03 -Depth= 117893 States= 9e+07 Transitions= 4.75e+10 Memory= 3498.018 t= 7.81e+04 R= 1e+03 -Depth= 117893 States= 9.1e+07 Transitions= 4.8e+10 Memory= 3524.678 t= 7.88e+04 R= 1e+03 -Depth= 117893 States= 9.2e+07 Transitions= 4.88e+10 Memory= 3549.776 t= 8.02e+04 R= 1e+03 -Depth= 117893 States= 9.3e+07 Transitions= 4.97e+10 Memory= 3573.897 t= 8.16e+04 R= 1e+03 -Depth= 117893 States= 9.4e+07 Transitions= 5.03e+10 Memory= 3598.311 t= 8.26e+04 R= 1e+03 -Depth= 117893 States= 9.5e+07 Transitions= 5.12e+10 Memory= 3621.358 t= 8.41e+04 R= 1e+03 -Depth= 117893 States= 9.6e+07 Transitions= 5.19e+10 Memory= 3645.381 t= 8.52e+04 R= 1e+03 -Depth= 117893 States= 9.7e+07 Transitions= 5.26e+10 Memory= 3669.502 t= 8.64e+04 R= 1e+03 -Depth= 117893 States= 9.8e+07 Transitions= 5.32e+10 Memory= 3693.233 t= 8.75e+04 R= 1e+03 -Depth= 117893 States= 9.9e+07 Transitions= 5.36e+10 Memory= 3723.115 t= 8.8e+04 R= 1e+03 -Depth= 117893 States= 1e+08 Transitions= 5.41e+10 Memory= 3748.799 t= 8.89e+04 R= 1e+03 -Depth= 117893 States= 1.01e+08 Transitions= 5.51e+10 Memory= 3771.943 t= 9.05e+04 R= 1e+03 -Depth= 117893 States= 1.02e+08 Transitions= 5.59e+10 Memory= 3796.651 t= 9.18e+04 R= 1e+03 -Depth= 117893 States= 1.03e+08 Transitions= 5.64e+10 Memory= 3820.967 t= 9.28e+04 R= 1e+03 -Depth= 117893 States= 1.04e+08 Transitions= 5.71e+10 Memory= 3845.283 t= 9.39e+04 R= 1e+03 -Depth= 117893 States= 1.05e+08 Transitions= 5.76e+10 Memory= 3872.041 t= 9.46e+04 R= 1e+03 -Depth= 117893 States= 1.06e+08 Transitions= 5.8e+10 Memory= 3901.436 t= 9.54e+04 R= 1e+03 -Depth= 117893 States= 1.07e+08 Transitions= 5.85e+10 Memory= 3931.026 t= 9.61e+04 R= 1e+03 -Depth= 117893 States= 1.08e+08 Transitions= 5.89e+10 Memory= 3956.318 t= 9.68e+04 R= 1e+03 -Depth= 117893 States= 1.09e+08 Transitions= 5.96e+10 Memory= 3978.486 t= 9.79e+04 R= 1e+03 -Depth= 117893 States= 1.1e+08 Transitions= 6.02e+10 Memory= 4002.901 t= 9.89e+04 R= 1e+03 -Depth= 117893 States= 1.11e+08 Transitions= 6.06e+10 Memory= 4027.803 t= 9.96e+04 R= 1e+03 -Depth= 117893 States= 1.12e+08 Transitions= 6.12e+10 Memory= 4051.924 t= 1.01e+05 R= 1e+03 -Depth= 117893 States= 1.13e+08 Transitions= 6.16e+10 Memory= 4079.365 t= 1.01e+05 R= 1e+03 -Depth= 117893 States= 1.14e+08 Transitions= 6.22e+10 Memory= 4104.756 t= 1.02e+05 R= 1e+03 -Depth= 117893 States= 1.15e+08 Transitions= 6.28e+10 Memory= 4129.268 t= 1.03e+05 R= 1e+03 -Depth= 117893 States= 1.16e+08 Transitions= 6.38e+10 Memory= 4155.537 t= 1.05e+05 R= 1e+03 -Depth= 117893 States= 1.17e+08 Transitions= 6.44e+10 Memory= 4184.443 t= 1.06e+05 R= 1e+03 -Depth= 117893 States= 1.18e+08 Transitions= 6.48e+10 Memory= 4211.397 t= 1.07e+05 R= 1e+03 -Depth= 117893 States= 1.19e+08 Transitions= 6.51e+10 Memory= 4234.248 t= 1.07e+05 R= 1e+03 -Depth= 117893 States= 1.2e+08 Transitions= 6.58e+10 Memory= 4262.471 t= 1.08e+05 R= 1e+03 -Depth= 117893 States= 1.21e+08 Transitions= 6.65e+10 Memory= 4289.912 t= 1.17e+05 R= 1e+03 -Depth= 117893 States= 1.22e+08 Transitions= 6.69e+10 Memory= 4315.791 t= 1.17e+05 R= 1e+03 -Depth= 117893 States= 1.23e+08 Transitions= 6.74e+10 Memory= 4343.330 t= 1.18e+05 R= 1e+03 -Depth= 117893 States= 1.24e+08 Transitions= 6.83e+10 Memory= 4368.623 t= 1.19e+05 R= 1e+03 -Depth= 117893 States= 1.25e+08 Transitions= 6.86e+10 Memory= 4395.674 t= 1.2e+05 R= 1e+03 -Depth= 117893 States= 1.26e+08 Transitions= 6.9e+10 Memory= 4419.990 t= 1.21e+05 R= 1e+03 -Depth= 117893 States= 1.27e+08 Transitions= 6.94e+10 Memory= 4448.115 t= 1.21e+05 R= 1e+03 -Depth= 117893 States= 1.28e+08 Transitions= 7.02e+10 Memory= 4473.994 t= 1.23e+05 R= 1e+03 -Depth= 117893 States= 1.29e+08 Transitions= 7.05e+10 Memory= 4500.947 t= 1.23e+05 R= 1e+03 -Depth= 117893 States= 1.3e+08 Transitions= 7.09e+10 Memory= 4526.826 t= 1.24e+05 R= 1e+03 -Depth= 117893 States= 1.31e+08 Transitions= 7.18e+10 Memory= 4553.291 t= 1.25e+05 R= 1e+03 -Depth= 117893 States= 1.32e+08 Transitions= 7.21e+10 Memory= 4581.221 t= 1.26e+05 R= 1e+03 -Depth= 117893 States= 1.33e+08 Transitions= 7.25e+10 Memory= 4605.830 t= 1.26e+05 R= 1e+03 -Depth= 117893 States= 1.34e+08 Transitions= 7.3e+10 Memory= 4632.197 t= 1.27e+05 R= 1e+03 -Depth= 117893 States= 1.35e+08 Transitions= 7.35e+10 Memory= 4657.588 t= 1.33e+05 R= 1e+03 -pan: resizing hashtable to -w28.. done -Depth= 117893 States= 1.36e+08 Transitions= 7.38e+10 Memory= 6705.588 t= 1.33e+05 R= 1e+03 -Depth= 117893 States= 1.37e+08 Transitions= 7.46e+10 Memory= 6705.588 t= 1.35e+05 R= 1e+03 -Depth= 117893 States= 1.38e+08 Transitions= 7.54e+10 Memory= 6720.627 t= 1.36e+05 R= 1e+03 -Depth= 117893 States= 1.39e+08 Transitions= 7.57e+10 Memory= 6750.217 t= 1.37e+05 R= 1e+03 -Depth= 117893 States= 1.4e+08 Transitions= 7.61e+10 Memory= 6775.803 t= 1.37e+05 R= 1e+03 -Depth= 117893 States= 1.41e+08 Transitions= 7.65e+10 Memory= 6797.190 t= 1.38e+05 R= 1e+03 -Depth= 117893 States= 1.42e+08 Transitions= 7.71e+10 Memory= 6823.068 t= 1.39e+05 R= 1e+03 -Depth= 117893 States= 1.43e+08 Transitions= 7.76e+10 Memory= 6851.682 t= 1.4e+05 R= 1e+03 -Depth= 117893 States= 1.44e+08 Transitions= 7.83e+10 Memory= 6879.611 t= 1.41e+05 R= 1e+03 -Depth= 117893 States= 1.45e+08 Transitions= 7.87e+10 Memory= 6905.100 t= 1.41e+05 R= 1e+03 -Depth= 117893 States= 1.46e+08 Transitions= 7.91e+10 Memory= 6929.318 t= 1.42e+05 R= 1e+03 -Depth= 117893 States= 1.47e+08 Transitions= 7.96e+10 Memory= 6954.709 t= 1.43e+05 R= 1e+03 -Depth= 117893 States= 1.48e+08 Transitions= 8e+10 Memory= 6983.225 t= 1.44e+05 R= 1e+03 -Depth= 117893 States= 1.49e+08 Transitions= 8.05e+10 Memory= 7013.791 t= 1.44e+05 R= 1e+03 -Depth= 117893 States= 1.5e+08 Transitions= 8.15e+10 Memory= 7037.033 t= 1.46e+05 R= 1e+03 -Depth= 117893 States= 1.51e+08 Transitions= 8.19e+10 Memory= 7068.381 t= 1.47e+05 R= 1e+03 -Depth= 117893 States= 1.52e+08 Transitions= 8.22e+10 Memory= 7093.576 t= 1.47e+05 R= 1e+03 -Depth= 117893 States= 1.53e+08 Transitions= 8.26e+10 Memory= 7115.842 t= 1.48e+05 R= 1e+03 -Depth= 117893 States= 1.54e+08 Transitions= 8.3e+10 Memory= 7144.358 t= 1.48e+05 R= 1e+03 -Depth= 117893 States= 1.55e+08 Transitions= 8.39e+10 Memory= 7170.432 t= 1.5e+05 R= 1e+03 -Depth= 117893 States= 1.56e+08 Transitions= 8.42e+10 Memory= 7197.483 t= 1.5e+05 R= 1e+03 -Depth= 117893 States= 1.57e+08 Transitions= 8.46e+10 Memory= 7220.725 t= 1.51e+05 R= 1e+03 -Depth= 117893 States= 1.58e+08 Transitions= 8.51e+10 Memory= 7246.701 t= 1.52e+05 R= 1e+03 -Depth= 117893 States= 1.59e+08 Transitions= 8.55e+10 Memory= 7273.752 t= 1.52e+05 R= 1e+03 -Depth= 117893 States= 1.6e+08 Transitions= 8.58e+10 Memory= 7302.951 t= 1.53e+05 R= 1e+03 -Depth= 117893 States= 1.61e+08 Transitions= 8.64e+10 Memory= 7327.365 t= 1.54e+05 R= 1e+03 -Depth= 117893 States= 1.62e+08 Transitions= 8.69e+10 Memory= 7353.049 t= 1.55e+05 R= 1e+03 -Depth= 117893 States= 1.63e+08 Transitions= 8.73e+10 Memory= 7379.318 t= 1.55e+05 R= 1e+03 -Depth= 117893 States= 1.64e+08 Transitions= 8.77e+10 Memory= 7404.904 t= 1.56e+05 R= 1e+03 -Depth= 117893 States= 1.65e+08 Transitions= 8.82e+10 Memory= 7429.514 t= 1.57e+05 R= 1e+03 -Depth= 117893 States= 1.66e+08 Transitions= 8.87e+10 Memory= 7453.733 t= 1.58e+05 R= 1e+03 -Depth= 117893 States= 1.67e+08 Transitions= 8.95e+10 Memory= 7477.561 t= 1.59e+05 R= 1e+03 -Depth= 117893 States= 1.68e+08 Transitions= 9.02e+10 Memory= 7501.096 t= 1.6e+05 R= 1e+03 -Depth= 117893 States= 1.69e+08 Transitions= 9.07e+10 Memory= 7527.365 t= 1.61e+05 R= 1e+03 -Depth= 117893 States= 1.7e+08 Transitions= 9.11e+10 Memory= 7553.830 t= 1.61e+05 R= 1e+03 -Depth= 117893 States= 1.71e+08 Transitions= 9.16e+10 Memory= 7577.951 t= 1.62e+05 R= 1e+03 -Depth= 117893 States= 1.72e+08 Transitions= 9.24e+10 Memory= 7602.658 t= 1.63e+05 R= 1e+03 -Depth= 117893 States= 1.73e+08 Transitions= 9.35e+10 Memory= 7626.096 t= 1.65e+05 R= 1e+03 -Depth= 117893 States= 1.74e+08 Transitions= 9.39e+10 Memory= 7656.369 t= 1.66e+05 R= 1e+03 -Depth= 117893 States= 1.75e+08 Transitions= 9.43e+10 Memory= 7682.834 t= 1.67e+05 R= 1e+03 -Depth= 117893 States= 1.76e+08 Transitions= 9.49e+10 Memory= 7709.201 t= 1.67e+05 R= 1e+03 -Depth= 117893 States= 1.77e+08 Transitions= 9.55e+10 Memory= 7736.447 t= 1.68e+05 R= 1e+03 -Depth= 117893 States= 1.78e+08 Transitions= 9.61e+10 Memory= 7763.791 t= 1.69e+05 R= 1e+03 -Depth= 117893 States= 1.79e+08 Transitions= 9.66e+10 Memory= 7790.061 t= 1.7e+05 R= 1e+03 -Depth= 117893 States= 1.8e+08 Transitions= 9.72e+10 Memory= 7817.600 t= 1.71e+05 R= 1e+03 -Depth= 117893 States= 1.81e+08 Transitions= 9.8e+10 Memory= 7837.912 t= 1.73e+05 R= 1e+03 -Depth= 117893 States= 1.82e+08 Transitions= 9.88e+10 Memory= 7858.127 t= 1.74e+05 R= 1e+03 -Depth= 117893 States= 1.83e+08 Transitions= 9.95e+10 Memory= 7886.154 t= 1.75e+05 R= 1e+03 -Depth= 117893 States= 1.84e+08 Transitions= 1e+11 Memory= 7912.522 t= 1.76e+05 R= 1e+03 -Depth= 117893 States= 1.85e+08 Transitions= 1.01e+11 Memory= 7937.717 t= 1.77e+05 R= 1e+03 -Depth= 117893 States= 1.86e+08 Transitions= 1.02e+11 Memory= 7962.815 t= 1.78e+05 R= 1e+03 -Depth= 117893 States= 1.87e+08 Transitions= 1.02e+11 Memory= 7988.010 t= 1.79e+05 R= 1e+03 -Depth= 117893 States= 1.88e+08 Transitions= 1.03e+11 Memory= 8014.768 t= 1.8e+05 R= 1e+03 -Depth= 117893 States= 1.89e+08 Transitions= 1.03e+11 Memory= 8040.061 t= 1.81e+05 R= 1e+03 -Depth= 117893 States= 1.9e+08 Transitions= 1.04e+11 Memory= 8066.818 t= 1.82e+05 R= 1e+03 -Depth= 117893 States= 1.91e+08 Transitions= 1.05e+11 Memory= 8090.451 t= 1.83e+05 R= 1e+03 -Depth= 117893 States= 1.92e+08 Transitions= 1.05e+11 Memory= 8116.330 t= 1.84e+05 R= 1e+03 -Depth= 117893 States= 1.93e+08 Transitions= 1.06e+11 Memory= 8144.748 t= 1.85e+05 R= 1e+03 -Depth= 117893 States= 1.94e+08 Transitions= 1.07e+11 Memory= 8170.822 t= 1.86e+05 R= 1e+03 -Depth= 117893 States= 1.95e+08 Transitions= 1.07e+11 Memory= 8196.604 t= 1.87e+05 R= 1e+03 -Depth= 117893 States= 1.96e+08 Transitions= 1.07e+11 Memory= 8222.873 t= 1.87e+05 R= 1e+03 -Depth= 117893 States= 1.97e+08 Transitions= 1.08e+11 Memory= 8252.658 t= 1.88e+05 R= 1e+03 -Depth= 117893 States= 1.98e+08 Transitions= 1.08e+11 Memory= 8278.147 t= 1.89e+05 R= 1e+03 -Depth= 117893 States= 1.99e+08 Transitions= 1.08e+11 Memory= 8305.490 t= 1.89e+05 R= 1e+03 -Depth= 117893 States= 2e+08 Transitions= 1.09e+11 Memory= 8332.151 t= 1.9e+05 R= 1e+03 -Depth= 117893 States= 2.01e+08 Transitions= 1.09e+11 Memory= 8355.979 t= 1.91e+05 R= 1e+03 -Depth= 117893 States= 2.02e+08 Transitions= 1.1e+11 Memory= 8383.225 t= 1.91e+05 R= 1e+03 -Depth= 117893 States= 2.03e+08 Transitions= 1.1e+11 Memory= 8410.959 t= 1.92e+05 R= 1e+03 -Depth= 117893 States= 2.04e+08 Transitions= 1.11e+11 Memory= 8437.912 t= 1.93e+05 R= 1e+03 -Depth= 117893 States= 2.05e+08 Transitions= 1.11e+11 Memory= 8465.256 t= 1.94e+05 R= 1e+03 -Depth= 117893 States= 2.06e+08 Transitions= 1.12e+11 Memory= 8489.670 t= 1.94e+05 R= 1e+03 -Depth= 117893 States= 2.07e+08 Transitions= 1.12e+11 Memory= 8517.600 t= 1.95e+05 R= 1e+03 -Depth= 117893 States= 2.08e+08 Transitions= 1.12e+11 Memory= 8543.088 t= 1.96e+05 R= 1e+03 -Depth= 117893 States= 2.09e+08 Transitions= 1.13e+11 Memory= 8566.233 t= 1.97e+05 R= 1e+03 -Depth= 117893 States= 2.1e+08 Transitions= 1.14e+11 Memory= 8590.744 t= 1.98e+05 R= 1e+03 -Depth= 117893 States= 2.11e+08 Transitions= 1.14e+11 Memory= 8613.693 t= 1.99e+05 R= 1e+03 -Depth= 117893 States= 2.12e+08 Transitions= 1.15e+11 Memory= 8642.502 t= 2.01e+05 R= 1e+03 -Depth= 117893 States= 2.13e+08 Transitions= 1.16e+11 Memory= 8672.873 t= 2.02e+05 R= 1e+03 -Depth= 117893 States= 2.14e+08 Transitions= 1.18e+11 Memory= 8697.483 t= 2.04e+05 R= 1e+03 -Depth= 117893 States= 2.15e+08 Transitions= 1.19e+11 Memory= 8722.190 t= 2.06e+05 R= 1e+03 -Depth= 117893 States= 2.16e+08 Transitions= 1.2e+11 Memory= 8744.455 t= 2.08e+05 R= 1e+03 -Depth= 117893 States= 2.17e+08 Transitions= 1.21e+11 Memory= 8765.842 t= 2.09e+05 R= 1e+03 -Depth= 117893 States= 2.18e+08 Transitions= 1.22e+11 Memory= 8785.861 t= 2.11e+05 R= 1e+03 -Depth= 117893 States= 2.19e+08 Transitions= 1.23e+11 Memory= 8804.904 t= 2.13e+05 R= 1e+03 -Depth= 117893 States= 2.2e+08 Transitions= 1.24e+11 Memory= 8823.850 t= 2.15e+05 R= 1e+03 -Depth= 117893 States= 2.21e+08 Transitions= 1.24e+11 Memory= 8850.705 t= 2.15e+05 R= 1e+03 -Depth= 117893 States= 2.22e+08 Transitions= 1.25e+11 Memory= 8877.365 t= 2.16e+05 R= 1e+03 -Depth= 117893 States= 2.23e+08 Transitions= 1.25e+11 Memory= 8902.268 t= 2.17e+05 R= 1e+03 -Depth= 117893 States= 2.24e+08 Transitions= 1.26e+11 Memory= 8927.268 t= 2.19e+05 R= 1e+03 -Depth= 117893 States= 2.25e+08 Transitions= 1.27e+11 Memory= 8949.143 t= 2.2e+05 R= 1e+03 -Depth= 117893 States= 2.26e+08 Transitions= 1.28e+11 Memory= 8973.459 t= 2.22e+05 R= 1e+03 -Depth= 117893 States= 2.27e+08 Transitions= 1.29e+11 Memory= 9004.807 t= 2.22e+05 R= 1e+03 -Depth= 117893 States= 2.28e+08 Transitions= 1.29e+11 Memory= 9031.174 t= 2.23e+05 R= 1e+03 -Depth= 117893 States= 2.29e+08 Transitions= 1.29e+11 Memory= 9054.709 t= 2.23e+05 R= 1e+03 -Depth= 117893 States= 2.3e+08 Transitions= 1.3e+11 Memory= 9077.756 t= 2.24e+05 R= 1e+03 -Depth= 117893 States= 2.31e+08 Transitions= 1.3e+11 Memory= 9103.830 t= 2.25e+05 R= 1e+03 -Depth= 117893 States= 2.32e+08 Transitions= 1.31e+11 Memory= 9128.830 t= 2.26e+05 R= 1e+03 -Depth= 117893 States= 2.33e+08 Transitions= 1.32e+11 Memory= 9150.315 t= 2.28e+05 R= 1e+03 -Depth= 117893 States= 2.34e+08 Transitions= 1.32e+11 Memory= 9175.705 t= 2.29e+05 R= 1e+03 -Depth= 117893 States= 2.35e+08 Transitions= 1.33e+11 Memory= 9201.096 t= 2.3e+05 R= 1e+03 -Depth= 117893 States= 2.36e+08 Transitions= 1.34e+11 Memory= 9226.682 t= 2.31e+05 R= 1e+03 -Depth= 117893 States= 2.37e+08 Transitions= 1.34e+11 Memory= 9253.049 t= 2.31e+05 R= 1e+03 -Depth= 117893 States= 2.38e+08 Transitions= 1.35e+11 Memory= 9276.291 t= 2.33e+05 R= 1e+03 -Depth= 117893 States= 2.39e+08 Transitions= 1.36e+11 Memory= 9300.608 t= 2.34e+05 R= 1e+03 -Depth= 117893 States= 2.4e+08 Transitions= 1.37e+11 Memory= 9324.240 t= 2.35e+05 R= 1e+03 -Depth= 117893 States= 2.41e+08 Transitions= 1.37e+11 Memory= 9348.361 t= 2.37e+05 R= 1e+03 -Depth= 117893 States= 2.42e+08 Transitions= 1.38e+11 Memory= 9372.873 t= 2.38e+05 R= 1e+03 -Depth= 117893 States= 2.43e+08 Transitions= 1.39e+11 Memory= 9396.604 t= 2.39e+05 R= 1e+03 -Depth= 117893 States= 2.44e+08 Transitions= 1.39e+11 Memory= 9421.994 t= 2.4e+05 R= 1e+03 -Depth= 117893 States= 2.45e+08 Transitions= 1.4e+11 Memory= 9450.998 t= 2.41e+05 R= 1e+03 -Depth= 117893 States= 2.46e+08 Transitions= 1.41e+11 Memory= 9475.217 t= 2.42e+05 R= 1e+03 -Depth= 117893 States= 2.47e+08 Transitions= 1.41e+11 Memory= 9498.264 t= 2.43e+05 R= 1e+03 -Depth= 117893 States= 2.48e+08 Transitions= 1.42e+11 Memory= 9522.580 t= 2.44e+05 R= 1e+03 -Depth= 117893 States= 2.49e+08 Transitions= 1.42e+11 Memory= 9549.924 t= 2.45e+05 R= 1e+03 -Depth= 117893 States= 2.5e+08 Transitions= 1.43e+11 Memory= 9579.807 t= 2.45e+05 R= 1e+03 -Depth= 117893 States= 2.51e+08 Transitions= 1.43e+11 Memory= 9609.104 t= 2.46e+05 R= 1e+03 -Depth= 117893 States= 2.52e+08 Transitions= 1.44e+11 Memory= 9631.858 t= 2.47e+05 R= 1e+03 -Depth= 117893 States= 2.53e+08 Transitions= 1.45e+11 Memory= 9652.756 t= 2.48e+05 R= 1e+03 -Depth= 117893 States= 2.54e+08 Transitions= 1.45e+11 Memory= 9678.733 t= 2.49e+05 R= 1e+03 -Depth= 117893 States= 2.55e+08 Transitions= 1.45e+11 Memory= 9703.733 t= 2.5e+05 R= 1e+03 -Depth= 117893 States= 2.56e+08 Transitions= 1.46e+11 Memory= 9728.440 t= 2.5e+05 R= 1e+03 -Depth= 117893 States= 2.57e+08 Transitions= 1.46e+11 Memory= 9757.834 t= 2.51e+05 R= 1e+03 -Depth= 117893 States= 2.58e+08 Transitions= 1.47e+11 Memory= 9784.006 t= 2.52e+05 R= 1e+03 -Depth= 117893 States= 2.59e+08 Transitions= 1.48e+11 Memory= 9810.959 t= 2.54e+05 R= 1e+03 -Depth= 117893 States= 2.6e+08 Transitions= 1.48e+11 Memory= 9839.475 t= 2.54e+05 R= 1e+03 -Depth= 117893 States= 2.61e+08 Transitions= 1.49e+11 Memory= 9862.717 t= 2.55e+05 R= 1e+03 -Depth= 117893 States= 2.62e+08 Transitions= 1.49e+11 Memory= 9891.428 t= 2.56e+05 R= 1e+03 -Depth= 117893 States= 2.63e+08 Transitions= 1.5e+11 Memory= 9916.623 t= 2.57e+05 R= 1e+03 -Depth= 117893 States= 2.64e+08 Transitions= 1.5e+11 Memory= 9944.162 t= 2.58e+05 R= 1e+03 -Depth= 117893 States= 2.65e+08 Transitions= 1.51e+11 Memory= 9969.358 t= 2.58e+05 R= 1e+03 -Depth= 117893 States= 2.66e+08 Transitions= 1.52e+11 Memory= 9995.432 t= 2.6e+05 R= 1e+03 -Depth= 117893 States= 2.67e+08 Transitions= 1.52e+11 Memory= 10023.654 t= 2.6e+05 R= 1e+03 -Depth= 117893 States= 2.68e+08 Transitions= 1.52e+11 Memory= 10047.580 t= 2.61e+05 R= 1e+03 -Depth= 117893 States= 2.69e+08 Transitions= 1.53e+11 Memory= 10075.022 t= 2.62e+05 R= 1e+03 -Depth= 117893 States= 2.7e+08 Transitions= 1.54e+11 Memory= 10101.779 t= 2.63e+05 R= 1e+03 -Depth= 117893 States= 2.71e+08 Transitions= 1.54e+11 Memory= 10129.221 t= 2.64e+05 R= 1e+03 -Depth= 117893 States= 2.72e+08 Transitions= 1.54e+11 Memory= 10154.416 t= 2.64e+05 R= 1e+03 -Depth= 117893 States= 2.73e+08 Transitions= 1.55e+11 Memory= 10180.393 t= 2.66e+05 R= 1e+03 -Depth= 117893 States= 2.74e+08 Transitions= 1.56e+11 Memory= 10209.104 t= 2.66e+05 R= 1e+03 -Depth= 117893 States= 2.75e+08 Transitions= 1.56e+11 Memory= 10232.541 t= 2.67e+05 R= 1e+03 -Depth= 117893 States= 2.76e+08 Transitions= 1.57e+11 Memory= 10259.690 t= 2.68e+05 R= 1e+03 -Depth= 117893 States= 2.77e+08 Transitions= 1.57e+11 Memory= 10285.080 t= 2.68e+05 R= 1e+03 -Depth= 117893 States= 2.78e+08 Transitions= 1.57e+11 Memory= 10311.154 t= 2.69e+05 R= 1e+03 -Depth= 117893 States= 2.79e+08 Transitions= 1.58e+11 Memory= 10337.033 t= 2.71e+05 R= 1e+03 diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_writer.define b/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_writer.log b/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_writer.log deleted file mode 100644 index f9e72c0..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_writer.log +++ /dev/null @@ -1,810 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-ipi-compress' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1362) -depth 7: Claim reached state 9 (line 1367) -depth 50: Claim reached state 9 (line 1366) -Depth= 7605 States= 1e+06 Transitions= 3.21e+08 Memory= 493.010 t= 500 R= 2e+03 -Depth= 7605 States= 2e+06 Transitions= 6.35e+08 Memory= 518.401 t= 996 R= 2e+03 -Depth= 7605 States= 3e+06 Transitions= 9.46e+08 Memory= 549.455 t= 1.5e+03 R= 2e+03 -pan: resizing hashtable to -w22.. done -Depth= 7605 States= 4e+06 Transitions= 1.25e+09 Memory= 609.776 t= 1.97e+03 R= 2e+03 -Depth= 9389 States= 5e+06 Transitions= 1.56e+09 Memory= 634.873 t= 2.46e+03 R= 2e+03 -Depth= 9389 States= 6e+06 Transitions= 1.88e+09 Memory= 662.315 t= 2.97e+03 R= 2e+03 -Depth= 9389 States= 7e+06 Transitions= 2.25e+09 Memory= 688.193 t= 3.58e+03 R= 2e+03 -Depth= 9389 States= 8e+06 Transitions= 2.61e+09 Memory= 716.611 t= 4.18e+03 R= 2e+03 -Depth= 9389 States= 9e+06 Transitions= 2.96e+09 Memory= 743.662 t= 4.75e+03 R= 2e+03 -pan: resizing hashtable to -w24.. done -Depth= 9389 States= 1e+07 Transitions= 3.29e+09 Memory= 894.611 t= 5.26e+03 R= 2e+03 -Depth= 9389 States= 1.1e+07 Transitions= 3.62e+09 Memory= 921.076 t= 5.77e+03 R= 2e+03 -Depth= 9389 States= 1.2e+07 Transitions= 3.93e+09 Memory= 947.053 t= 6.27e+03 R= 2e+03 -Depth= 9389 States= 1.3e+07 Transitions= 4.25e+09 Memory= 974.299 t= 6.76e+03 R= 2e+03 -Depth= 9389 States= 1.4e+07 Transitions= 4.55e+09 Memory= 1004.963 t= 7.23e+03 R= 2e+03 -Depth= 9389 States= 1.5e+07 Transitions= 4.87e+09 Memory= 1029.963 t= 7.73e+03 R= 2e+03 -Depth= 9389 States= 1.6e+07 Transitions= 5.18e+09 Memory= 1058.088 t= 8.23e+03 R= 2e+03 -Depth= 9389 States= 1.7e+07 Transitions= 5.48e+09 Memory= 1087.580 t= 8.71e+03 R= 2e+03 -Depth= 9389 States= 1.8e+07 Transitions= 5.79e+09 Memory= 1113.166 t= 9.19e+03 R= 2e+03 -Depth= 9389 States= 1.9e+07 Transitions= 6.1e+09 Memory= 1139.143 t= 9.68e+03 R= 2e+03 -Depth= 9389 States= 2e+07 Transitions= 6.59e+09 Memory= 1164.436 t= 1.05e+04 R= 2e+03 -Depth= 9389 States= 2.1e+07 Transitions= 7.19e+09 Memory= 1188.557 t= 1.15e+04 R= 2e+03 -Depth= 9389 States= 2.2e+07 Transitions= 8.02e+09 Memory= 1210.236 t= 1.28e+04 R= 2e+03 -Depth= 9389 States= 2.3e+07 Transitions= 8.41e+09 Memory= 1237.385 t= 1.35e+04 R= 2e+03 -Depth= 9389 States= 2.4e+07 Transitions= 8.96e+09 Memory= 1261.604 t= 1.44e+04 R= 2e+03 -Depth= 9389 States= 2.5e+07 Transitions= 9.91e+09 Memory= 1287.287 t= 1.6e+04 R= 2e+03 -Depth= 9389 States= 2.6e+07 Transitions= 1.06e+10 Memory= 1312.971 t= 1.71e+04 R= 2e+03 -Depth= 9600 States= 2.7e+07 Transitions= 1.1e+10 Memory= 1340.510 t= 1.78e+04 R= 2e+03 -Depth= 9600 States= 2.8e+07 Transitions= 1.15e+10 Memory= 1367.756 t= 1.86e+04 R= 2e+03 -Depth= 9600 States= 2.9e+07 Transitions= 1.21e+10 Memory= 1395.100 t= 1.96e+04 R= 1e+03 -Depth= 9600 States= 3e+07 Transitions= 1.27e+10 Memory= 1422.639 t= 2.05e+04 R= 1e+03 -Depth= 9600 States= 3.1e+07 Transitions= 1.32e+10 Memory= 1448.908 t= 2.15e+04 R= 1e+03 -Depth= 9600 States= 3.2e+07 Transitions= 1.39e+10 Memory= 1474.494 t= 2.25e+04 R= 1e+03 -Depth= 9600 States= 3.3e+07 Transitions= 1.46e+10 Memory= 1494.807 t= 2.38e+04 R= 1e+03 -Depth= 9600 States= 3.4e+07 Transitions= 1.52e+10 Memory= 1519.709 t= 2.47e+04 R= 1e+03 -pan: resizing hashtable to -w26.. done -Depth= 9600 States= 3.5e+07 Transitions= 1.58e+10 Memory= 2042.061 t= 2.57e+04 R= 1e+03 -Depth= 9600 States= 3.6e+07 Transitions= 1.63e+10 Memory= 2068.916 t= 2.66e+04 R= 1e+03 -Depth= 9600 States= 3.7e+07 Transitions= 1.7e+10 Memory= 2094.404 t= 2.75e+04 R= 1e+03 -Depth= 9600 States= 3.8e+07 Transitions= 1.76e+10 Memory= 2119.893 t= 2.86e+04 R= 1e+03 -Depth= 9600 States= 3.9e+07 Transitions= 1.82e+10 Memory= 2144.697 t= 2.96e+04 R= 1e+03 -Depth= 9600 States= 4e+07 Transitions= 1.87e+10 Memory= 2173.018 t= 3.03e+04 R= 1e+03 -Depth= 9600 States= 4.1e+07 Transitions= 1.93e+10 Memory= 2200.068 t= 3.13e+04 R= 1e+03 -Depth= 9600 States= 4.2e+07 Transitions= 1.98e+10 Memory= 2225.459 t= 3.22e+04 R= 1e+03 -Depth= 9600 States= 4.3e+07 Transitions= 2.05e+10 Memory= 2252.217 t= 3.32e+04 R= 1e+03 -Depth= 9600 States= 4.4e+07 Transitions= 2.13e+10 Memory= 2275.557 t= 3.45e+04 R= 1e+03 -Depth= 9600 States= 4.5e+07 Transitions= 2.18e+10 Memory= 2303.096 t= 3.53e+04 R= 1e+03 -Depth= 9600 States= 4.6e+07 Transitions= 2.22e+10 Memory= 2327.608 t= 3.59e+04 R= 1e+03 -Depth= 9600 States= 4.7e+07 Transitions= 2.25e+10 Memory= 2355.342 t= 3.65e+04 R= 1e+03 -Depth= 9600 States= 4.8e+07 Transitions= 2.28e+10 Memory= 2385.029 t= 3.7e+04 R= 1e+03 -Depth= 9600 States= 4.9e+07 Transitions= 2.32e+10 Memory= 2413.643 t= 3.75e+04 R= 1e+03 -Depth= 9600 States= 5e+07 Transitions= 2.35e+10 Memory= 2439.522 t= 3.81e+04 R= 1e+03 -Depth= 9600 States= 5.1e+07 Transitions= 2.42e+10 Memory= 2462.959 t= 3.91e+04 R= 1e+03 -Depth= 9600 States= 5.2e+07 Transitions= 2.46e+10 Memory= 2490.498 t= 3.97e+04 R= 1e+03 -Depth= 9600 States= 5.3e+07 Transitions= 2.49e+10 Memory= 2519.600 t= 4.03e+04 R= 1e+03 -Depth= 9600 States= 5.4e+07 Transitions= 2.53e+10 Memory= 2545.674 t= 4.09e+04 R= 1e+03 -Depth= 9600 States= 5.5e+07 Transitions= 2.56e+10 Memory= 2574.190 t= 4.13e+04 R= 1e+03 -Depth= 9600 States= 5.6e+07 Transitions= 2.6e+10 Memory= 2598.604 t= 4.2e+04 R= 1e+03 -Depth= 9600 States= 5.7e+07 Transitions= 2.66e+10 Memory= 2622.334 t= 4.3e+04 R= 1e+03 -Depth= 9600 States= 5.8e+07 Transitions= 2.73e+10 Memory= 2645.869 t= 4.41e+04 R= 1e+03 -Depth= 9600 States= 5.9e+07 Transitions= 2.81e+10 Memory= 2668.623 t= 4.54e+04 R= 1e+03 -Depth= 9600 States= 6e+07 Transitions= 2.91e+10 Memory= 2701.631 t= 4.72e+04 R= 1e+03 -Depth= 9600 States= 6.1e+07 Transitions= 3.02e+10 Memory= 2729.170 t= 4.9e+04 R= 1e+03 -Depth= 9600 States= 6.2e+07 Transitions= 3.14e+10 Memory= 2754.072 t= 5.09e+04 R= 1e+03 -Depth= 9600 States= 6.3e+07 Transitions= 3.25e+10 Memory= 2778.682 t= 5.29e+04 R= 1e+03 -Depth= 9600 States= 6.4e+07 Transitions= 3.35e+10 Memory= 2799.190 t= 5.46e+04 R= 1e+03 -Depth= 9600 States= 6.5e+07 Transitions= 3.45e+10 Memory= 2820.869 t= 5.61e+04 R= 1e+03 -Depth= 9600 States= 6.6e+07 Transitions= 3.56e+10 Memory= 2840.401 t= 5.81e+04 R= 1e+03 -Depth= 9600 States= 6.7e+07 Transitions= 3.66e+10 Memory= 2859.443 t= 5.98e+04 R= 1e+03 -Depth= 9600 States= 6.8e+07 Transitions= 3.74e+10 Memory= 2881.807 t= 6.1e+04 R= 1e+03 -Depth= 9600 States= 6.9e+07 Transitions= 3.78e+10 Memory= 2909.053 t= 6.17e+04 R= 1e+03 -Depth= 9600 States= 7e+07 Transitions= 3.84e+10 Memory= 2934.151 t= 6.27e+04 R= 1e+03 -Depth= 9600 States= 7.1e+07 Transitions= 3.94e+10 Memory= 2959.053 t= 6.43e+04 R= 1e+03 -Depth= 9600 States= 7.2e+07 Transitions= 4.05e+10 Memory= 2980.049 t= 6.62e+04 R= 1e+03 -Depth= 9600 States= 7.3e+07 Transitions= 4.11e+10 Memory= 3007.197 t= 6.72e+04 R= 1e+03 -Depth= 9600 States= 7.4e+07 Transitions= 4.14e+10 Memory= 3037.276 t= 6.78e+04 R= 1e+03 -Depth= 9600 States= 7.5e+07 Transitions= 4.18e+10 Memory= 3063.252 t= 6.83e+04 R= 1e+03 -Depth= 9600 States= 7.6e+07 Transitions= 4.21e+10 Memory= 3087.276 t= 6.89e+04 R= 1e+03 -Depth= 9600 States= 7.7e+07 Transitions= 4.26e+10 Memory= 3112.178 t= 6.95e+04 R= 1e+03 -Depth= 9600 States= 7.8e+07 Transitions= 4.3e+10 Memory= 3137.764 t= 7.03e+04 R= 1e+03 -Depth= 9600 States= 7.9e+07 Transitions= 4.4e+10 Memory= 3162.178 t= 7.2e+04 R= 1e+03 -Depth= 9600 States= 8e+07 Transitions= 4.48e+10 Memory= 3185.420 t= 7.32e+04 R= 1e+03 -Depth= 9600 States= 8.1e+07 Transitions= 4.53e+10 Memory= 3212.276 t= 7.4e+04 R= 1e+03 -Depth= 9600 States= 8.2e+07 Transitions= 4.6e+10 Memory= 3237.178 t= 7.52e+04 R= 1e+03 -Depth= 9600 States= 8.3e+07 Transitions= 4.7e+10 Memory= 3261.299 t= 7.69e+04 R= 1e+03 -Depth= 9600 States= 8.4e+07 Transitions= 4.75e+10 Memory= 3286.104 t= 7.76e+04 R= 1e+03 -Depth= 9600 States= 8.5e+07 Transitions= 4.84e+10 Memory= 3309.639 t= 7.91e+04 R= 1e+03 -Depth= 9600 States= 8.6e+07 Transitions= 4.91e+10 Memory= 3333.272 t= 8.04e+04 R= 1e+03 -Depth= 9600 States= 8.7e+07 Transitions= 4.98e+10 Memory= 3358.272 t= 8.15e+04 R= 1e+03 -Depth= 9600 States= 8.8e+07 Transitions= 5.04e+10 Memory= 3382.490 t= 8.25e+04 R= 1e+03 -Depth= 9600 States= 8.9e+07 Transitions= 5.09e+10 Memory= 3410.908 t= 8.32e+04 R= 1e+03 -Depth= 9600 States= 9e+07 Transitions= 5.14e+10 Memory= 3437.959 t= 8.41e+04 R= 1e+03 -Depth= 9600 States= 9.1e+07 Transitions= 5.23e+10 Memory= 3460.908 t= 8.56e+04 R= 1e+03 -Depth= 9600 States= 9.2e+07 Transitions= 5.32e+10 Memory= 3484.639 t= 8.71e+04 R= 1e+03 -Depth= 9600 States= 9.3e+07 Transitions= 5.37e+10 Memory= 3509.932 t= 8.79e+04 R= 1e+03 -Depth= 9600 States= 9.4e+07 Transitions= 5.44e+10 Memory= 3534.346 t= 8.91e+04 R= 1e+03 -Depth= 9600 States= 9.5e+07 Transitions= 5.49e+10 Memory= 3561.299 t= 8.98e+04 R= 1e+03 -Depth= 9600 States= 9.6e+07 Transitions= 5.53e+10 Memory= 3589.522 t= 9.06e+04 R= 1e+03 -Depth= 9600 States= 9.7e+07 Transitions= 5.58e+10 Memory= 3619.209 t= 9.14e+04 R= 1e+03 -Depth= 9600 States= 9.8e+07 Transitions= 5.62e+10 Memory= 3645.576 t= 9.2e+04 R= 1e+03 -Depth= 9600 States= 9.9e+07 Transitions= 5.68e+10 Memory= 3668.623 t= 9.31e+04 R= 1e+03 -Depth= 9600 States= 1e+08 Transitions= 5.75e+10 Memory= 3692.061 t= 9.41e+04 R= 1e+03 -Depth= 9600 States= 1.01e+08 Transitions= 5.79e+10 Memory= 3717.940 t= 9.48e+04 R= 1e+03 -Depth= 9600 States= 1.02e+08 Transitions= 5.85e+10 Memory= 3741.963 t= 9.57e+04 R= 1e+03 -Depth= 9600 States= 1.03e+08 Transitions= 5.89e+10 Memory= 3768.428 t= 9.64e+04 R= 1e+03 -Depth= 9600 States= 1.04e+08 Transitions= 5.95e+10 Memory= 3795.186 t= 9.75e+04 R= 1e+03 -Depth= 9600 States= 1.05e+08 Transitions= 6.01e+10 Memory= 3820.283 t= 9.84e+04 R= 1e+03 -Depth= 9600 States= 1.06e+08 Transitions= 6.09e+10 Memory= 3846.358 t= 9.98e+04 R= 1e+03 -Depth= 10157 States= 1.07e+08 Transitions= 6.17e+10 Memory= 3873.408 t= 1.01e+05 R= 1e+03 -Depth= 10157 States= 1.08e+08 Transitions= 6.21e+10 Memory= 3901.924 t= 1.02e+05 R= 1e+03 -Depth= 10157 States= 1.09e+08 Transitions= 6.24e+10 Memory= 3925.850 t= 1.02e+05 R= 1e+03 -Depth= 10157 States= 1.1e+08 Transitions= 6.29e+10 Memory= 3955.244 t= 1.03e+05 R= 1e+03 -Depth= 10193 States= 1.11e+08 Transitions= 6.38e+10 Memory= 3979.854 t= 1.05e+05 R= 1e+03 -Depth= 10193 States= 1.12e+08 Transitions= 6.42e+10 Memory= 4007.686 t= 1.05e+05 R= 1e+03 -Depth= 10193 States= 1.13e+08 Transitions= 6.45e+10 Memory= 4033.076 t= 1.06e+05 R= 1e+03 -Depth= 10193 States= 1.14e+08 Transitions= 6.55e+10 Memory= 4060.127 t= 1.07e+05 R= 1e+03 -Depth= 10193 States= 1.15e+08 Transitions= 6.59e+10 Memory= 4088.057 t= 1.08e+05 R= 1e+03 -Depth= 10193 States= 1.16e+08 Transitions= 6.63e+10 Memory= 4112.276 t= 1.09e+05 R= 1e+03 -Depth= 10193 States= 1.17e+08 Transitions= 6.66e+10 Memory= 4140.986 t= 1.09e+05 R= 1e+03 -Depth= 10193 States= 1.18e+08 Transitions= 6.73e+10 Memory= 4167.158 t= 1.1e+05 R= 1e+03 -Depth= 10193 States= 1.19e+08 Transitions= 6.78e+10 Memory= 4195.088 t= 1.11e+05 R= 1e+03 -Depth= 10193 States= 1.2e+08 Transitions= 6.82e+10 Memory= 4220.674 t= 1.12e+05 R= 1e+03 -Depth= 10193 States= 1.21e+08 Transitions= 6.9e+10 Memory= 4247.041 t= 1.13e+05 R= 1e+03 -Depth= 10193 States= 1.22e+08 Transitions= 6.94e+10 Memory= 4275.166 t= 1.14e+05 R= 1e+03 -Depth= 10193 States= 1.23e+08 Transitions= 6.98e+10 Memory= 4299.287 t= 1.14e+05 R= 1e+03 -Depth= 10193 States= 1.24e+08 Transitions= 7.03e+10 Memory= 4326.143 t= 1.15e+05 R= 1e+03 -Depth= 10193 States= 1.25e+08 Transitions= 7.08e+10 Memory= 4352.901 t= 1.16e+05 R= 1e+03 -Depth= 10193 States= 1.26e+08 Transitions= 7.11e+10 Memory= 4380.440 t= 1.17e+05 R= 1e+03 -Depth= 10193 States= 1.27e+08 Transitions= 7.17e+10 Memory= 4407.490 t= 1.18e+05 R= 1e+03 -Depth= 10193 States= 1.28e+08 Transitions= 7.26e+10 Memory= 4431.026 t= 1.19e+05 R= 1e+03 -Depth= 10193 States= 1.29e+08 Transitions= 7.3e+10 Memory= 4461.787 t= 1.2e+05 R= 1e+03 -Depth= 10193 States= 1.3e+08 Transitions= 7.34e+10 Memory= 4487.373 t= 1.2e+05 R= 1e+03 -Depth= 10193 States= 1.31e+08 Transitions= 7.37e+10 Memory= 4511.006 t= 1.21e+05 R= 1e+03 -Depth= 10193 States= 1.32e+08 Transitions= 7.43e+10 Memory= 4536.494 t= 1.22e+05 R= 1e+03 -Depth= 10193 States= 1.33e+08 Transitions= 7.47e+10 Memory= 4564.815 t= 1.23e+05 R= 1e+03 -Depth= 10193 States= 1.34e+08 Transitions= 7.56e+10 Memory= 4590.498 t= 1.24e+05 R= 1e+03 -Depth= 10193 States= 1.35e+08 Transitions= 7.6e+10 Memory= 4619.209 t= 1.25e+05 R= 1e+03 -pan: resizing hashtable to -w28.. done -Depth= 10193 States= 1.36e+08 Transitions= 7.63e+10 Memory= 6667.209 t= 1.25e+05 R= 1e+03 -Depth= 10193 States= 1.37e+08 Transitions= 7.68e+10 Memory= 6667.209 t= 1.26e+05 R= 1e+03 -Depth= 10193 States= 1.38e+08 Transitions= 7.73e+10 Memory= 6680.490 t= 1.27e+05 R= 1e+03 -Depth= 10193 States= 1.39e+08 Transitions= 7.76e+10 Memory= 6710.178 t= 1.27e+05 R= 1e+03 -Depth= 10193 States= 1.4e+08 Transitions= 7.86e+10 Memory= 6736.252 t= 1.29e+05 R= 1e+03 -Depth= 10193 States= 1.41e+08 Transitions= 7.91e+10 Memory= 6765.647 t= 1.3e+05 R= 1e+03 -Depth= 10193 States= 1.42e+08 Transitions= 7.95e+10 Memory= 6792.697 t= 1.3e+05 R= 1e+03 -Depth= 10193 States= 1.43e+08 Transitions= 7.98e+10 Memory= 6816.818 t= 1.31e+05 R= 1e+03 -Depth= 10193 States= 1.44e+08 Transitions= 8.02e+10 Memory= 6842.893 t= 1.32e+05 R= 1e+03 -Depth= 10193 States= 1.45e+08 Transitions= 8.1e+10 Memory= 6870.236 t= 1.33e+05 R= 1e+03 -Depth= 10193 States= 1.46e+08 Transitions= 8.15e+10 Memory= 6898.361 t= 1.34e+05 R= 1e+03 -Depth= 10193 States= 1.47e+08 Transitions= 8.18e+10 Memory= 6922.092 t= 1.34e+05 R= 1e+03 -Depth= 10193 States= 1.48e+08 Transitions= 8.23e+10 Memory= 6948.557 t= 1.35e+05 R= 1e+03 -Depth= 10193 States= 1.49e+08 Transitions= 8.28e+10 Memory= 6974.533 t= 1.36e+05 R= 1e+03 -Depth= 10193 States= 1.5e+08 Transitions= 8.31e+10 Memory= 7004.221 t= 1.36e+05 R= 1e+03 -Depth= 10193 States= 1.51e+08 Transitions= 8.36e+10 Memory= 7029.416 t= 1.37e+05 R= 1e+03 -Depth= 10193 States= 1.52e+08 Transitions= 8.41e+10 Memory= 7055.588 t= 1.38e+05 R= 1e+03 -Depth= 10193 States= 1.53e+08 Transitions= 8.45e+10 Memory= 7081.760 t= 1.39e+05 R= 1e+03 -Depth= 10193 States= 1.54e+08 Transitions= 8.5e+10 Memory= 7107.834 t= 1.39e+05 R= 1e+03 -Depth= 10193 States= 1.55e+08 Transitions= 8.54e+10 Memory= 7134.201 t= 1.4e+05 R= 1e+03 -Depth= 10193 States= 1.56e+08 Transitions= 8.59e+10 Memory= 7158.713 t= 1.41e+05 R= 1e+03 -Depth= 10193 States= 1.57e+08 Transitions= 8.66e+10 Memory= 7181.662 t= 1.42e+05 R= 1e+03 -Depth= 10193 States= 1.58e+08 Transitions= 8.74e+10 Memory= 7204.221 t= 1.43e+05 R= 1e+03 -Depth= 10193 States= 1.59e+08 Transitions= 8.78e+10 Memory= 7230.295 t= 1.44e+05 R= 1e+03 -Depth= 10193 States= 1.6e+08 Transitions= 8.83e+10 Memory= 7256.662 t= 1.45e+05 R= 1e+03 -Depth= 10193 States= 1.61e+08 Transitions= 8.87e+10 Memory= 7283.127 t= 1.45e+05 R= 1e+03 -Depth= 10193 States= 1.62e+08 Transitions= 8.94e+10 Memory= 7306.760 t= 1.47e+05 R= 1e+03 -Depth= 10193 States= 1.63e+08 Transitions= 9.03e+10 Memory= 7331.565 t= 1.48e+05 R= 1e+03 -Depth= 10193 States= 1.64e+08 Transitions= 9.12e+10 Memory= 7356.955 t= 1.49e+05 R= 1e+03 -Depth= 10193 States= 1.65e+08 Transitions= 9.15e+10 Memory= 7384.983 t= 1.5e+05 R= 1e+03 -Depth= 10193 States= 1.66e+08 Transitions= 9.2e+10 Memory= 7412.033 t= 1.51e+05 R= 1e+03 -Depth= 10193 States= 1.67e+08 Transitions= 9.26e+10 Memory= 7439.377 t= 1.52e+05 R= 1e+03 -Depth= 10193 States= 1.68e+08 Transitions= 9.32e+10 Memory= 7465.256 t= 1.53e+05 R= 1e+03 -Depth= 10193 States= 1.69e+08 Transitions= 9.37e+10 Memory= 7493.479 t= 1.54e+05 R= 1e+03 -Depth= 10193 States= 1.7e+08 Transitions= 9.44e+10 Memory= 7520.041 t= 1.55e+05 R= 1e+03 -Depth= 10193 States= 1.71e+08 Transitions= 9.5e+10 Memory= 7544.065 t= 1.56e+05 R= 1e+03 -Depth= 10193 States= 1.72e+08 Transitions= 9.59e+10 Memory= 7564.377 t= 1.57e+05 R= 1e+03 -Depth= 10193 States= 1.73e+08 Transitions= 9.66e+10 Memory= 7588.693 t= 1.58e+05 R= 1e+03 -Depth= 10193 States= 1.74e+08 Transitions= 9.73e+10 Memory= 7614.865 t= 1.59e+05 R= 1e+03 -Depth= 10193 States= 1.75e+08 Transitions= 9.81e+10 Memory= 7640.354 t= 1.61e+05 R= 1e+03 -Depth= 10193 States= 1.76e+08 Transitions= 9.87e+10 Memory= 7665.744 t= 1.62e+05 R= 1e+03 -Depth= 10193 States= 1.77e+08 Transitions= 9.93e+10 Memory= 7691.135 t= 1.63e+05 R= 1e+03 -Depth= 10193 States= 1.78e+08 Transitions= 9.99e+10 Memory= 7718.479 t= 1.64e+05 R= 1e+03 -Depth= 10193 States= 1.79e+08 Transitions= 1.01e+11 Memory= 7743.772 t= 1.65e+05 R= 1e+03 -Depth= 10193 States= 1.8e+08 Transitions= 1.01e+11 Memory= 7769.651 t= 1.66e+05 R= 1e+03 -Depth= 10193 States= 1.81e+08 Transitions= 1.02e+11 Memory= 7795.920 t= 1.67e+05 R= 1e+03 -Depth= 10193 States= 1.82e+08 Transitions= 1.03e+11 Memory= 7819.651 t= 1.68e+05 R= 1e+03 -Depth= 10193 States= 1.83e+08 Transitions= 1.03e+11 Memory= 7846.897 t= 1.69e+05 R= 1e+03 -Depth= 10193 States= 1.84e+08 Transitions= 1.04e+11 Memory= 7874.631 t= 1.7e+05 R= 1e+03 -Depth= 10193 States= 1.85e+08 Transitions= 1.04e+11 Memory= 7900.510 t= 1.7e+05 R= 1e+03 -Depth= 10193 States= 1.86e+08 Transitions= 1.05e+11 Memory= 7925.803 t= 1.71e+05 R= 1e+03 -Depth= 10193 States= 1.87e+08 Transitions= 1.05e+11 Memory= 7955.295 t= 1.72e+05 R= 1e+03 -Depth= 10193 States= 1.88e+08 Transitions= 1.05e+11 Memory= 7983.420 t= 1.72e+05 R= 1e+03 -Depth= 10193 States= 1.89e+08 Transitions= 1.06e+11 Memory= 8010.373 t= 1.73e+05 R= 1e+03 -Depth= 10193 States= 1.9e+08 Transitions= 1.06e+11 Memory= 8037.424 t= 1.73e+05 R= 1e+03 -Depth= 10193 States= 1.91e+08 Transitions= 1.07e+11 Memory= 8061.838 t= 1.74e+05 R= 1e+03 -Depth= 10193 States= 1.92e+08 Transitions= 1.07e+11 Memory= 8087.326 t= 1.75e+05 R= 1e+03 -Depth= 10193 States= 1.93e+08 Transitions= 1.08e+11 Memory= 8115.256 t= 1.76e+05 R= 1e+03 -Depth= 10193 States= 1.94e+08 Transitions= 1.08e+11 Memory= 8142.307 t= 1.76e+05 R= 1e+03 -Depth= 10193 States= 1.95e+08 Transitions= 1.08e+11 Memory= 8168.479 t= 1.77e+05 R= 1e+03 -Depth= 10193 States= 1.96e+08 Transitions= 1.09e+11 Memory= 8194.846 t= 1.78e+05 R= 1e+03 -Depth= 10193 States= 1.97e+08 Transitions= 1.09e+11 Memory= 8221.311 t= 1.79e+05 R= 1e+03 -Depth= 10193 States= 1.98e+08 Transitions= 1.1e+11 Memory= 8249.240 t= 1.79e+05 R= 1e+03 -Depth= 10193 States= 1.99e+08 Transitions= 1.1e+11 Memory= 8273.264 t= 1.8e+05 R= 1e+03 -Depth= 10193 States= 2e+08 Transitions= 1.11e+11 Memory= 8295.920 t= 1.81e+05 R= 1e+03 -Depth= 10193 States= 2.01e+08 Transitions= 1.11e+11 Memory= 8320.529 t= 1.82e+05 R= 1e+03 -Depth= 10193 States= 2.02e+08 Transitions= 1.12e+11 Memory= 8345.236 t= 1.84e+05 R= 1e+03 -Depth= 10193 States= 2.03e+08 Transitions= 1.13e+11 Memory= 8379.026 t= 1.86e+05 R= 1e+03 -Depth= 10193 States= 2.04e+08 Transitions= 1.15e+11 Memory= 8403.635 t= 1.87e+05 R= 1e+03 -Depth= 10193 States= 2.05e+08 Transitions= 1.16e+11 Memory= 8427.951 t= 1.89e+05 R= 1e+03 -Depth= 10193 States= 2.06e+08 Transitions= 1.17e+11 Memory= 8452.463 t= 1.91e+05 R= 1e+03 -Depth= 10193 States= 2.07e+08 Transitions= 1.18e+11 Memory= 8472.483 t= 1.93e+05 R= 1e+03 -Depth= 10193 States= 2.08e+08 Transitions= 1.19e+11 Memory= 8493.283 t= 1.94e+05 R= 1e+03 -Depth= 10193 States= 2.09e+08 Transitions= 1.2e+11 Memory= 8513.205 t= 1.96e+05 R= 1e+03 -Depth= 10193 States= 2.1e+08 Transitions= 1.21e+11 Memory= 8532.053 t= 1.98e+05 R= 1e+03 -Depth= 10193 States= 2.11e+08 Transitions= 1.22e+11 Memory= 8555.588 t= 1.99e+05 R= 1e+03 -Depth= 10193 States= 2.12e+08 Transitions= 1.22e+11 Memory= 8582.932 t= 2e+05 R= 1e+03 -Depth= 10193 States= 2.13e+08 Transitions= 1.23e+11 Memory= 8607.834 t= 2.01e+05 R= 1e+03 -Depth= 10193 States= 2.14e+08 Transitions= 1.23e+11 Memory= 8633.029 t= 2.02e+05 R= 1e+03 -Depth= 10193 States= 2.15e+08 Transitions= 1.24e+11 Memory= 8656.858 t= 2.04e+05 R= 1e+03 -Depth= 10193 States= 2.16e+08 Transitions= 1.25e+11 Memory= 8679.904 t= 2.05e+05 R= 1e+03 -Depth= 10193 States= 2.17e+08 Transitions= 1.26e+11 Memory= 8707.932 t= 2.06e+05 R= 1e+03 -Depth= 10193 States= 2.18e+08 Transitions= 1.26e+11 Memory= 8736.740 t= 2.07e+05 R= 1e+03 -Depth= 10193 States= 2.19e+08 Transitions= 1.26e+11 Memory= 8762.229 t= 2.07e+05 R= 1e+03 -Depth= 10193 States= 2.2e+08 Transitions= 1.27e+11 Memory= 8785.764 t= 2.08e+05 R= 1e+03 -Depth= 10193 States= 2.21e+08 Transitions= 1.27e+11 Memory= 8812.619 t= 2.08e+05 R= 1e+03 -Depth= 10193 States= 2.22e+08 Transitions= 1.28e+11 Memory= 8837.326 t= 2.09e+05 R= 1e+03 -Depth= 10193 States= 2.23e+08 Transitions= 1.29e+11 Memory= 8859.006 t= 2.11e+05 R= 1e+03 -Depth= 10193 States= 2.24e+08 Transitions= 1.3e+11 Memory= 8884.104 t= 2.12e+05 R= 1e+03 -Depth= 10193 States= 2.25e+08 Transitions= 1.3e+11 Memory= 8909.006 t= 2.13e+05 R= 1e+03 -Depth= 10193 States= 2.26e+08 Transitions= 1.31e+11 Memory= 8934.787 t= 2.14e+05 R= 1e+03 -Depth= 10193 States= 2.27e+08 Transitions= 1.31e+11 Memory= 8961.057 t= 2.15e+05 R= 1e+03 -Depth= 10193 States= 2.28e+08 Transitions= 1.32e+11 Memory= 8985.666 t= 2.16e+05 R= 1e+03 -Depth= 10193 States= 2.29e+08 Transitions= 1.33e+11 Memory= 9010.080 t= 2.18e+05 R= 1e+03 -Depth= 10193 States= 2.3e+08 Transitions= 1.34e+11 Memory= 9034.885 t= 2.19e+05 R= 1e+03 -Depth= 10193 States= 2.31e+08 Transitions= 1.35e+11 Memory= 9058.127 t= 2.2e+05 R= 1e+03 -Depth= 10193 States= 2.32e+08 Transitions= 1.35e+11 Memory= 9081.760 t= 2.22e+05 R= 1e+03 -Depth= 10193 States= 2.33e+08 Transitions= 1.36e+11 Memory= 9106.467 t= 2.23e+05 R= 1e+03 -Depth= 10193 States= 2.34e+08 Transitions= 1.37e+11 Memory= 9130.295 t= 2.24e+05 R= 1e+03 -Depth= 10193 States= 2.35e+08 Transitions= 1.37e+11 Memory= 9159.690 t= 2.24e+05 R= 1e+03 -Depth= 10193 States= 2.36e+08 Transitions= 1.38e+11 Memory= 9185.471 t= 2.25e+05 R= 1e+03 -Depth= 10193 States= 2.37e+08 Transitions= 1.38e+11 Memory= 9207.639 t= 2.27e+05 R= 1e+03 -Depth= 10193 States= 2.38e+08 Transitions= 1.39e+11 Memory= 9232.443 t= 2.28e+05 R= 1e+03 -Depth= 10193 States= 2.39e+08 Transitions= 1.4e+11 Memory= 9258.811 t= 2.29e+05 R= 1e+03 -Depth= 10193 States= 2.4e+08 Transitions= 1.4e+11 Memory= 9287.619 t= 2.29e+05 R= 1e+03 -Depth= 10193 States= 2.41e+08 Transitions= 1.4e+11 Memory= 9317.209 t= 2.3e+05 R= 1e+03 -Depth= 10193 States= 2.42e+08 Transitions= 1.41e+11 Memory= 9343.088 t= 2.31e+05 R= 1e+03 -Depth= 10193 States= 2.43e+08 Transitions= 1.42e+11 Memory= 9365.354 t= 2.32e+05 R= 1e+03 -Depth= 10193 States= 2.44e+08 Transitions= 1.42e+11 Memory= 9389.182 t= 2.33e+05 R= 1e+03 -Depth= 10193 States= 2.45e+08 Transitions= 1.43e+11 Memory= 9415.256 t= 2.33e+05 R= 1e+03 -Depth= 10193 States= 2.46e+08 Transitions= 1.43e+11 Memory= 9438.596 t= 2.34e+05 R= 1e+03 -Depth= 10193 States= 2.47e+08 Transitions= 1.44e+11 Memory= 9466.623 t= 2.35e+05 R= 1e+03 -Depth= 10193 States= 2.48e+08 Transitions= 1.44e+11 Memory= 9495.041 t= 2.36e+05 R= 1e+03 -Depth= 10193 States= 2.49e+08 Transitions= 1.45e+11 Memory= 9519.651 t= 2.37e+05 R= 1e+03 -Depth= 10193 States= 2.5e+08 Transitions= 1.46e+11 Memory= 9549.436 t= 2.38e+05 R= 1e+03 -Depth= 10193 States= 2.51e+08 Transitions= 1.46e+11 Memory= 9575.022 t= 2.39e+05 R= 1e+03 -Depth= 10193 States= 2.52e+08 Transitions= 1.46e+11 Memory= 9598.752 t= 2.39e+05 R= 1e+03 -Depth= 10193 States= 2.53e+08 Transitions= 1.47e+11 Memory= 9626.584 t= 2.41e+05 R= 1e+03 -Depth= 10193 States= 2.54e+08 Transitions= 1.48e+11 Memory= 9655.588 t= 2.42e+05 R= 1e+03 -Depth= 10193 States= 2.55e+08 Transitions= 1.48e+11 Memory= 9679.904 t= 2.42e+05 R= 1e+03 -Depth= 10193 States= 2.56e+08 Transitions= 1.49e+11 Memory= 9707.834 t= 2.43e+05 R= 1e+03 -Depth= 10193 States= 2.57e+08 Transitions= 1.49e+11 Memory= 9735.568 t= 2.45e+05 R= 1e+03 -Depth= 10193 States= 2.58e+08 Transitions= 1.5e+11 Memory= 9760.861 t= 2.45e+05 R= 1e+03 -Depth= 10193 States= 2.59e+08 Transitions= 1.5e+11 Memory= 9785.959 t= 2.46e+05 R= 1e+03 -Depth= 10193 States= 2.6e+08 Transitions= 1.5e+11 Memory= 9814.182 t= 2.46e+05 R= 1e+03 -Depth= 10193 States= 2.61e+08 Transitions= 1.51e+11 Memory= 9841.428 t= 2.48e+05 R= 1e+03 -Depth= 10193 States= 2.62e+08 Transitions= 1.52e+11 Memory= 9867.014 t= 2.48e+05 R= 1e+03 -Depth= 10193 States= 2.63e+08 Transitions= 1.52e+11 Memory= 9894.846 t= 2.49e+05 R= 1e+03 -Depth= 10193 States= 2.64e+08 Transitions= 1.53e+11 Memory= 9921.604 t= 2.5e+05 R= 1e+03 -Depth= 10193 States= 2.65e+08 Transitions= 1.53e+11 Memory= 9947.287 t= 2.51e+05 R= 1e+03 -Depth= 10193 States= 2.66e+08 Transitions= 1.54e+11 Memory= 9973.361 t= 2.51e+05 R= 1e+03 -Depth= 10193 States= 2.67e+08 Transitions= 1.54e+11 Memory= 9999.240 t= 2.52e+05 R= 1e+03 -Depth= 10193 States= 2.68e+08 Transitions= 1.55e+11 Memory= 10026.584 t= 2.53e+05 R= 1e+03 -Depth= 10193 States= 2.69e+08 Transitions= 1.55e+11 Memory= 10054.416 t= 2.54e+05 R= 1e+03 -Depth= 10193 States= 2.7e+08 Transitions= 1.56e+11 Memory= 10077.658 t= 2.56e+05 R= 1e+03 -Depth= 10193 States= 2.71e+08 Transitions= 1.56e+11 Memory= 10108.615 t= 2.56e+05 R= 1e+03 -Depth= 10193 States= 2.72e+08 Transitions= 1.57e+11 Memory= 10134.494 t= 2.57e+05 R= 1e+03 -Depth= 10193 States= 2.73e+08 Transitions= 1.57e+11 Memory= 10157.639 t= 2.57e+05 R= 1e+03 -Depth= 10193 States= 2.74e+08 Transitions= 1.58e+11 Memory= 10183.127 t= 2.58e+05 R= 1e+03 -Depth= 10193 States= 2.75e+08 Transitions= 1.58e+11 Memory= 10212.522 t= 2.59e+05 R= 1e+03 -Depth= 10193 States= 2.76e+08 Transitions= 1.59e+11 Memory= 10238.596 t= 2.6e+05 R= 1e+03 -Depth= 10193 States= 2.77e+08 Transitions= 1.59e+11 Memory= 10265.647 t= 2.61e+05 R= 1e+03 -Depth= 10193 States= 2.78e+08 Transitions= 1.6e+11 Memory= 10289.963 t= 2.62e+05 R= 1e+03 -Depth= 10193 States= 2.79e+08 Transitions= 1.6e+11 Memory= 10316.233 t= 2.62e+05 R= 1e+03 -Depth= 10193 States= 2.8e+08 Transitions= 1.61e+11 Memory= 10344.651 t= 2.63e+05 R= 1e+03 -Depth= 10193 States= 2.81e+08 Transitions= 1.61e+11 Memory= 10375.315 t= 2.64e+05 R= 1e+03 -Depth= 10193 States= 2.82e+08 Transitions= 1.62e+11 Memory= 10398.654 t= 2.65e+05 R= 1e+03 -Depth= 10193 States= 2.83e+08 Transitions= 1.62e+11 Memory= 10429.611 t= 2.66e+05 R= 1e+03 -Depth= 10193 States= 2.84e+08 Transitions= 1.63e+11 Memory= 10455.588 t= 2.67e+05 R= 1e+03 -Depth= 10193 States= 2.85e+08 Transitions= 1.63e+11 Memory= 10478.830 t= 2.67e+05 R= 1e+03 -Depth= 10193 States= 2.86e+08 Transitions= 1.64e+11 Memory= 10506.760 t= 2.68e+05 R= 1e+03 -Depth= 10193 States= 2.87e+08 Transitions= 1.64e+11 Memory= 10532.443 t= 2.69e+05 R= 1e+03 -Depth= 10193 States= 2.88e+08 Transitions= 1.65e+11 Memory= 10561.252 t= 2.7e+05 R= 1e+03 -Depth= 10193 States= 2.89e+08 Transitions= 1.65e+11 Memory= 10584.983 t= 2.71e+05 R= 1e+03 -Depth= 10193 States= 2.9e+08 Transitions= 1.66e+11 Memory= 10611.252 t= 2.71e+05 R= 1e+03 -Depth= 10193 States= 2.91e+08 Transitions= 1.66e+11 Memory= 10637.033 t= 2.72e+05 R= 1e+03 -Depth= 10193 States= 2.92e+08 Transitions= 1.66e+11 Memory= 10668.674 t= 2.73e+05 R= 1e+03 -Depth= 10193 States= 2.93e+08 Transitions= 1.67e+11 Memory= 10692.111 t= 2.73e+05 R= 1e+03 -Depth= 10193 States= 2.94e+08 Transitions= 1.67e+11 Memory= 10718.283 t= 2.74e+05 R= 1e+03 -Depth= 10193 States= 2.95e+08 Transitions= 1.68e+11 Memory= 10744.748 t= 2.75e+05 R= 1e+03 -Depth= 10193 States= 2.96e+08 Transitions= 1.68e+11 Memory= 10770.920 t= 2.76e+05 R= 1e+03 -Depth= 10193 States= 2.97e+08 Transitions= 1.69e+11 Memory= 10795.139 t= 2.76e+05 R= 1e+03 -Depth= 10193 States= 2.98e+08 Transitions= 1.69e+11 Memory= 10819.358 t= 2.77e+05 R= 1e+03 -Depth= 10193 States= 2.99e+08 Transitions= 1.7e+11 Memory= 10841.721 t= 2.79e+05 R= 1e+03 -Depth= 10193 States= 3e+08 Transitions= 1.71e+11 Memory= 10867.209 t= 2.79e+05 R= 1e+03 -Depth= 10193 States= 3.01e+08 Transitions= 1.71e+11 Memory= 10893.283 t= 2.8e+05 R= 1e+03 -Depth= 10193 States= 3.02e+08 Transitions= 1.72e+11 Memory= 10916.233 t= 2.81e+05 R= 1e+03 -Depth= 10193 States= 3.03e+08 Transitions= 1.73e+11 Memory= 10940.549 t= 2.83e+05 R= 1e+03 -Depth= 10193 States= 3.04e+08 Transitions= 1.73e+11 Memory= 10971.408 t= 2.84e+05 R= 1e+03 -Depth= 10193 States= 3.05e+08 Transitions= 1.74e+11 Memory= 10996.897 t= 2.84e+05 R= 1e+03 -Depth= 10193 States= 3.06e+08 Transitions= 1.74e+11 Memory= 11023.850 t= 2.85e+05 R= 1e+03 -Depth= 10193 States= 3.07e+08 Transitions= 1.75e+11 Memory= 11049.436 t= 2.86e+05 R= 1e+03 -Depth= 10193 States= 3.08e+08 Transitions= 1.75e+11 Memory= 11077.854 t= 2.87e+05 R= 1e+03 -Depth= 10193 States= 3.09e+08 Transitions= 1.76e+11 Memory= 11104.514 t= 2.88e+05 R= 1e+03 -Depth= 10193 States= 3.1e+08 Transitions= 1.77e+11 Memory= 11125.119 t= 2.89e+05 R= 1e+03 -Depth= 10193 States= 3.11e+08 Transitions= 1.77e+11 Memory= 11146.897 t= 2.91e+05 R= 1e+03 -Depth= 10193 States= 3.12e+08 Transitions= 1.78e+11 Memory= 11173.264 t= 2.92e+05 R= 1e+03 -Depth= 10193 States= 3.13e+08 Transitions= 1.79e+11 Memory= 11198.654 t= 2.93e+05 R= 1e+03 -Depth= 10193 States= 3.14e+08 Transitions= 1.8e+11 Memory= 11224.045 t= 2.94e+05 R= 1e+03 -Depth= 10193 States= 3.15e+08 Transitions= 1.8e+11 Memory= 11248.850 t= 2.95e+05 R= 1e+03 -Depth= 10193 States= 3.16e+08 Transitions= 1.81e+11 Memory= 11274.729 t= 2.96e+05 R= 1e+03 -Depth= 10193 States= 3.17e+08 Transitions= 1.82e+11 Memory= 11300.315 t= 2.97e+05 R= 1e+03 -Depth= 10193 States= 3.18e+08 Transitions= 1.82e+11 Memory= 11326.193 t= 2.98e+05 R= 1e+03 -Depth= 10193 States= 3.19e+08 Transitions= 1.83e+11 Memory= 11351.584 t= 2.99e+05 R= 1e+03 -Depth= 10193 States= 3.2e+08 Transitions= 1.83e+11 Memory= 11377.561 t= 3e+05 R= 1e+03 -Depth= 10193 States= 3.21e+08 Transitions= 1.84e+11 Memory= 11400.510 t= 3.01e+05 R= 1e+03 -Depth= 10193 States= 3.22e+08 Transitions= 1.85e+11 Memory= 11425.803 t= 3.02e+05 R= 1e+03 -Depth= 10193 States= 3.23e+08 Transitions= 1.85e+11 Memory= 11453.928 t= 3.03e+05 R= 1e+03 -Depth= 10193 States= 3.24e+08 Transitions= 1.86e+11 Memory= 11478.635 t= 3.04e+05 R= 1e+03 -Depth= 10193 States= 3.25e+08 Transitions= 1.87e+11 Memory= 11503.830 t= 3.05e+05 R= 1e+03 -Depth= 10193 States= 3.26e+08 Transitions= 1.87e+11 Memory= 11528.830 t= 3.06e+05 R= 1e+03 -Depth= 10193 States= 3.27e+08 Transitions= 1.88e+11 Memory= 11554.416 t= 3.07e+05 R= 1e+03 -Depth= 10193 States= 3.28e+08 Transitions= 1.89e+11 Memory= 11580.686 t= 3.08e+05 R= 1e+03 -Depth= 10193 States= 3.29e+08 Transitions= 1.89e+11 Memory= 11606.467 t= 3.09e+05 R= 1e+03 -Depth= 10193 States= 3.3e+08 Transitions= 1.9e+11 Memory= 11632.346 t= 3.1e+05 R= 1e+03 -Depth= 10193 States= 3.31e+08 Transitions= 1.9e+11 Memory= 11658.420 t= 3.11e+05 R= 1e+03 -Depth= 10193 States= 3.32e+08 Transitions= 1.91e+11 Memory= 11681.662 t= 3.13e+05 R= 1e+03 -Depth= 10193 States= 3.33e+08 Transitions= 1.92e+11 Memory= 11708.713 t= 3.13e+05 R= 1e+03 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 80 byte, depth reached 10193, errors: 0 -1.8778602e+08 states, stored (3.33973e+08 visited) -1.9159243e+11 states, matched -1.919264e+11 transitions (= visited+matched) -1.0808296e+12 atomic steps -hash conflicts: 3.7119584e+10 (resolved) - -Stats on memory usage (in Megabytes): -20774.057 equivalent memory usage for states (stored*(State-vector + overhead)) - 9228.353 actual memory usage for states (compression: 44.42%) - state-vector as stored = 16 byte + 36 byte overhead - 2048.000 memory used for hash table (-w28) - 457.764 memory used for DFS stack (-m10000000) - 1.576 memory lost to fragmentation -11732.541 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 618104 5194 3828 2 2 ] -unreached in proctype urcu_reader - line 268, "pan.___", state 57, "cache_dirty_urcu_gp_ctr = 0" - line 276, "pan.___", state 79, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 88, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 104, "(1)" - line 249, "pan.___", state 112, "(1)" - line 253, "pan.___", state 124, "(1)" - line 257, "pan.___", state 132, "(1)" - line 407, "pan.___", state 158, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 190, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 204, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 223, "(1)" - line 434, "pan.___", state 253, "(1)" - line 438, "pan.___", state 266, "(1)" - line 687, "pan.___", state 287, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 407, "pan.___", state 294, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 326, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 340, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 359, "(1)" - line 434, "pan.___", state 389, "(1)" - line 438, "pan.___", state 402, "(1)" - line 407, "pan.___", state 423, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 455, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 469, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 488, "(1)" - line 434, "pan.___", state 518, "(1)" - line 438, "pan.___", state 531, "(1)" - line 407, "pan.___", state 554, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 556, "(1)" - line 407, "pan.___", state 557, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 557, "else" - line 407, "pan.___", state 560, "(1)" - line 411, "pan.___", state 568, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 570, "(1)" - line 411, "pan.___", state 571, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 571, "else" - line 411, "pan.___", state 574, "(1)" - line 411, "pan.___", state 575, "(1)" - line 411, "pan.___", state 575, "(1)" - line 409, "pan.___", state 580, "((i<1))" - line 409, "pan.___", state 580, "((i>=1))" - line 416, "pan.___", state 586, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 588, "(1)" - line 416, "pan.___", state 589, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 589, "else" - line 416, "pan.___", state 592, "(1)" - line 416, "pan.___", state 593, "(1)" - line 416, "pan.___", state 593, "(1)" - line 420, "pan.___", state 600, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 602, "(1)" - line 420, "pan.___", state 603, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 603, "else" - line 420, "pan.___", state 606, "(1)" - line 420, "pan.___", state 607, "(1)" - line 420, "pan.___", state 607, "(1)" - line 418, "pan.___", state 612, "((i<2))" - line 418, "pan.___", state 612, "((i>=2))" - line 425, "pan.___", state 619, "(1)" - line 425, "pan.___", state 620, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 620, "else" - line 425, "pan.___", state 623, "(1)" - line 425, "pan.___", state 624, "(1)" - line 425, "pan.___", state 624, "(1)" - line 429, "pan.___", state 632, "(1)" - line 429, "pan.___", state 633, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 633, "else" - line 429, "pan.___", state 636, "(1)" - line 429, "pan.___", state 637, "(1)" - line 429, "pan.___", state 637, "(1)" - line 427, "pan.___", state 642, "((i<1))" - line 427, "pan.___", state 642, "((i>=1))" - line 434, "pan.___", state 649, "(1)" - line 434, "pan.___", state 650, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 650, "else" - line 434, "pan.___", state 653, "(1)" - line 434, "pan.___", state 654, "(1)" - line 434, "pan.___", state 654, "(1)" - line 438, "pan.___", state 662, "(1)" - line 438, "pan.___", state 663, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 663, "else" - line 438, "pan.___", state 666, "(1)" - line 438, "pan.___", state 667, "(1)" - line 438, "pan.___", state 667, "(1)" - line 436, "pan.___", state 672, "((i<2))" - line 436, "pan.___", state 672, "((i>=2))" - line 446, "pan.___", state 676, "(1)" - line 446, "pan.___", state 676, "(1)" - line 687, "pan.___", state 679, "cached_urcu_active_readers = (tmp+1)" - line 687, "pan.___", state 680, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 687, "pan.___", state 681, "(1)" - line 407, "pan.___", state 688, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 720, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 734, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 753, "(1)" - line 434, "pan.___", state 783, "(1)" - line 438, "pan.___", state 796, "(1)" - line 407, "pan.___", state 824, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 856, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 870, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 889, "(1)" - line 434, "pan.___", state 919, "(1)" - line 438, "pan.___", state 932, "(1)" - line 407, "pan.___", state 953, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 955, "(1)" - line 407, "pan.___", state 956, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 956, "else" - line 407, "pan.___", state 959, "(1)" - line 411, "pan.___", state 967, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 969, "(1)" - line 411, "pan.___", state 970, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 970, "else" - line 411, "pan.___", state 973, "(1)" - line 411, "pan.___", state 974, "(1)" - line 411, "pan.___", state 974, "(1)" - line 409, "pan.___", state 979, "((i<1))" - line 409, "pan.___", state 979, "((i>=1))" - line 416, "pan.___", state 985, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 987, "(1)" - line 416, "pan.___", state 988, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 988, "else" - line 416, "pan.___", state 991, "(1)" - line 416, "pan.___", state 992, "(1)" - line 416, "pan.___", state 992, "(1)" - line 420, "pan.___", state 999, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 1001, "(1)" - line 420, "pan.___", state 1002, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 1002, "else" - line 420, "pan.___", state 1005, "(1)" - line 420, "pan.___", state 1006, "(1)" - line 420, "pan.___", state 1006, "(1)" - line 418, "pan.___", state 1011, "((i<2))" - line 418, "pan.___", state 1011, "((i>=2))" - line 425, "pan.___", state 1018, "(1)" - line 425, "pan.___", state 1019, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 1019, "else" - line 425, "pan.___", state 1022, "(1)" - line 425, "pan.___", state 1023, "(1)" - line 425, "pan.___", state 1023, "(1)" - line 429, "pan.___", state 1031, "(1)" - line 429, "pan.___", state 1032, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 1032, "else" - line 429, "pan.___", state 1035, "(1)" - line 429, "pan.___", state 1036, "(1)" - line 429, "pan.___", state 1036, "(1)" - line 427, "pan.___", state 1041, "((i<1))" - line 427, "pan.___", state 1041, "((i>=1))" - line 434, "pan.___", state 1048, "(1)" - line 434, "pan.___", state 1049, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 1049, "else" - line 434, "pan.___", state 1052, "(1)" - line 434, "pan.___", state 1053, "(1)" - line 434, "pan.___", state 1053, "(1)" - line 438, "pan.___", state 1061, "(1)" - line 438, "pan.___", state 1062, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 1062, "else" - line 438, "pan.___", state 1065, "(1)" - line 438, "pan.___", state 1066, "(1)" - line 438, "pan.___", state 1066, "(1)" - line 436, "pan.___", state 1071, "((i<2))" - line 436, "pan.___", state 1071, "((i>=2))" - line 446, "pan.___", state 1075, "(1)" - line 446, "pan.___", state 1075, "(1)" - line 695, "pan.___", state 1079, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 407, "pan.___", state 1084, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1116, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1130, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1149, "(1)" - line 434, "pan.___", state 1179, "(1)" - line 438, "pan.___", state 1192, "(1)" - line 407, "pan.___", state 1216, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1248, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1262, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1281, "(1)" - line 434, "pan.___", state 1311, "(1)" - line 438, "pan.___", state 1324, "(1)" - line 407, "pan.___", state 1349, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1381, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1395, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1414, "(1)" - line 434, "pan.___", state 1444, "(1)" - line 438, "pan.___", state 1457, "(1)" - line 407, "pan.___", state 1478, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1510, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1524, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1543, "(1)" - line 434, "pan.___", state 1573, "(1)" - line 438, "pan.___", state 1586, "(1)" - line 407, "pan.___", state 1612, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1644, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1658, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1677, "(1)" - line 434, "pan.___", state 1707, "(1)" - line 438, "pan.___", state 1720, "(1)" - line 407, "pan.___", state 1741, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1773, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1787, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1806, "(1)" - line 434, "pan.___", state 1836, "(1)" - line 438, "pan.___", state 1849, "(1)" - line 407, "pan.___", state 1873, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1905, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1919, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1938, "(1)" - line 434, "pan.___", state 1968, "(1)" - line 438, "pan.___", state 1981, "(1)" - line 734, "pan.___", state 2002, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 407, "pan.___", state 2009, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2041, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2055, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2074, "(1)" - line 434, "pan.___", state 2104, "(1)" - line 438, "pan.___", state 2117, "(1)" - line 407, "pan.___", state 2138, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2170, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2184, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2203, "(1)" - line 434, "pan.___", state 2233, "(1)" - line 438, "pan.___", state 2246, "(1)" - line 407, "pan.___", state 2269, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 2271, "(1)" - line 407, "pan.___", state 2272, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 2272, "else" - line 407, "pan.___", state 2275, "(1)" - line 411, "pan.___", state 2283, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 2285, "(1)" - line 411, "pan.___", state 2286, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 2286, "else" - line 411, "pan.___", state 2289, "(1)" - line 411, "pan.___", state 2290, "(1)" - line 411, "pan.___", state 2290, "(1)" - line 409, "pan.___", state 2295, "((i<1))" - line 409, "pan.___", state 2295, "((i>=1))" - line 416, "pan.___", state 2301, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 2303, "(1)" - line 416, "pan.___", state 2304, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 2304, "else" - line 416, "pan.___", state 2307, "(1)" - line 416, "pan.___", state 2308, "(1)" - line 416, "pan.___", state 2308, "(1)" - line 420, "pan.___", state 2315, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 2317, "(1)" - line 420, "pan.___", state 2318, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 2318, "else" - line 420, "pan.___", state 2321, "(1)" - line 420, "pan.___", state 2322, "(1)" - line 420, "pan.___", state 2322, "(1)" - line 418, "pan.___", state 2327, "((i<2))" - line 418, "pan.___", state 2327, "((i>=2))" - line 425, "pan.___", state 2334, "(1)" - line 425, "pan.___", state 2335, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 2335, "else" - line 425, "pan.___", state 2338, "(1)" - line 425, "pan.___", state 2339, "(1)" - line 425, "pan.___", state 2339, "(1)" - line 429, "pan.___", state 2347, "(1)" - line 429, "pan.___", state 2348, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 2348, "else" - line 429, "pan.___", state 2351, "(1)" - line 429, "pan.___", state 2352, "(1)" - line 429, "pan.___", state 2352, "(1)" - line 427, "pan.___", state 2357, "((i<1))" - line 427, "pan.___", state 2357, "((i>=1))" - line 434, "pan.___", state 2364, "(1)" - line 434, "pan.___", state 2365, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 2365, "else" - line 434, "pan.___", state 2368, "(1)" - line 434, "pan.___", state 2369, "(1)" - line 434, "pan.___", state 2369, "(1)" - line 438, "pan.___", state 2377, "(1)" - line 438, "pan.___", state 2378, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 2378, "else" - line 438, "pan.___", state 2381, "(1)" - line 438, "pan.___", state 2382, "(1)" - line 438, "pan.___", state 2382, "(1)" - line 436, "pan.___", state 2387, "((i<2))" - line 436, "pan.___", state 2387, "((i>=2))" - line 446, "pan.___", state 2391, "(1)" - line 446, "pan.___", state 2391, "(1)" - line 734, "pan.___", state 2394, "cached_urcu_active_readers = (tmp+1)" - line 734, "pan.___", state 2395, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 734, "pan.___", state 2396, "(1)" - line 407, "pan.___", state 2403, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2435, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2449, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2468, "(1)" - line 434, "pan.___", state 2498, "(1)" - line 438, "pan.___", state 2511, "(1)" - line 407, "pan.___", state 2538, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2570, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2584, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2603, "(1)" - line 434, "pan.___", state 2633, "(1)" - line 438, "pan.___", state 2646, "(1)" - line 407, "pan.___", state 2667, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2699, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2713, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2732, "(1)" - line 434, "pan.___", state 2762, "(1)" - line 438, "pan.___", state 2775, "(1)" - line 245, "pan.___", state 2808, "(1)" - line 253, "pan.___", state 2828, "(1)" - line 257, "pan.___", state 2836, "(1)" - line 245, "pan.___", state 2851, "(1)" - line 253, "pan.___", state 2871, "(1)" - line 257, "pan.___", state 2879, "(1)" - line 929, "pan.___", state 2896, "-end-" - (245 of 2896 states) -unreached in proctype urcu_writer - line 407, "pan.___", state 45, "cache_dirty_urcu_gp_ctr = 0" - line 411, "pan.___", state 59, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 425, "pan.___", state 110, "(1)" - line 429, "pan.___", state 123, "(1)" - line 434, "pan.___", state 140, "(1)" - line 268, "pan.___", state 176, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 185, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 198, "cache_dirty_rcu_ptr = 0" - line 407, "pan.___", state 238, "cache_dirty_urcu_gp_ctr = 0" - line 411, "pan.___", state 252, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 270, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 284, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 303, "(1)" - line 429, "pan.___", state 316, "(1)" - line 434, "pan.___", state 333, "(1)" - line 438, "pan.___", state 346, "(1)" - line 411, "pan.___", state 383, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 401, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 415, "cache_dirty_rcu_data[i] = 0" - line 429, "pan.___", state 447, "(1)" - line 434, "pan.___", state 464, "(1)" - line 438, "pan.___", state 477, "(1)" - line 411, "pan.___", state 522, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 540, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 554, "cache_dirty_rcu_data[i] = 0" - line 429, "pan.___", state 586, "(1)" - line 434, "pan.___", state 603, "(1)" - line 438, "pan.___", state 616, "(1)" - line 411, "pan.___", state 651, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 669, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 683, "cache_dirty_rcu_data[i] = 0" - line 429, "pan.___", state 715, "(1)" - line 434, "pan.___", state 732, "(1)" - line 438, "pan.___", state 745, "(1)" - line 411, "pan.___", state 782, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 800, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 814, "cache_dirty_rcu_data[i] = 0" - line 429, "pan.___", state 846, "(1)" - line 434, "pan.___", state 863, "(1)" - line 438, "pan.___", state 876, "(1)" - line 268, "pan.___", state 931, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 940, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 955, "(1)" - line 280, "pan.___", state 962, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 978, "(1)" - line 249, "pan.___", state 986, "(1)" - line 253, "pan.___", state 998, "(1)" - line 257, "pan.___", state 1006, "(1)" - line 268, "pan.___", state 1037, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1046, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1059, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1068, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1084, "(1)" - line 249, "pan.___", state 1092, "(1)" - line 253, "pan.___", state 1104, "(1)" - line 257, "pan.___", state 1112, "(1)" - line 272, "pan.___", state 1138, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1151, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1160, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1176, "(1)" - line 249, "pan.___", state 1184, "(1)" - line 253, "pan.___", state 1196, "(1)" - line 257, "pan.___", state 1204, "(1)" - line 268, "pan.___", state 1235, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1244, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1257, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1266, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1282, "(1)" - line 249, "pan.___", state 1290, "(1)" - line 253, "pan.___", state 1302, "(1)" - line 257, "pan.___", state 1310, "(1)" - line 272, "pan.___", state 1336, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1349, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1358, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1374, "(1)" - line 249, "pan.___", state 1382, "(1)" - line 253, "pan.___", state 1394, "(1)" - line 257, "pan.___", state 1402, "(1)" - line 268, "pan.___", state 1433, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1442, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1455, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1464, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1480, "(1)" - line 249, "pan.___", state 1488, "(1)" - line 253, "pan.___", state 1500, "(1)" - line 257, "pan.___", state 1508, "(1)" - line 272, "pan.___", state 1534, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1547, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1556, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1572, "(1)" - line 249, "pan.___", state 1580, "(1)" - line 253, "pan.___", state 1592, "(1)" - line 257, "pan.___", state 1600, "(1)" - line 268, "pan.___", state 1631, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1640, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1653, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1662, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1678, "(1)" - line 249, "pan.___", state 1686, "(1)" - line 253, "pan.___", state 1698, "(1)" - line 257, "pan.___", state 1706, "(1)" - line 1304, "pan.___", state 1722, "-end-" - (103 of 1722 states) -unreached in proctype :init: - (0 of 28 states) -unreached in proctype :never: - line 1369, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 3.14e+05 seconds -pan: rate 1063.7031 states/second -pan: avg transition delay 1.6359e-06 usec -cp .input.spin urcu_progress_writer.spin.input -cp .input.spin.trail urcu_progress_writer.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-ipi-compress' diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_writer.spin.input b/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_writer.spin.input deleted file mode 100644 index e7f1d2d..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_writer.spin.input +++ /dev/null @@ -1,1340 +0,0 @@ -#define WRITER_PROGRESS - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_writer_error.define b/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-compress/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/.input.spin b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/.input.spin deleted file mode 100644 index 21196d4..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/.input.spin +++ /dev/null @@ -1,1156 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN, READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT, 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT, /* post-dominant */ - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_OUT, /* RAW */ - READ_UNLOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - data_read_first[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/DEFINES b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/DEFINES deleted file mode 100644 index 32299c1..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/DEFINES +++ /dev/null @@ -1,18 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/Makefile b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/Makefile deleted file mode 100644 index abf201c..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/Makefile +++ /dev/null @@ -1,171 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 -DCOLLAPSE -#CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/asserts.log b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/asserts.log deleted file mode 100644 index f1445e4..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/asserts.log +++ /dev/null @@ -1,266 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -cat DEFINES > .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w20 -Depth= 3250 States= 1e+06 Transitions= 2.74e+08 Memory= 500.529 t= 357 R= 3e+03 -Depth= 3250 States= 2e+06 Transitions= 5.69e+08 Memory= 537.248 t= 774 R= 3e+03 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim - (none specified) - assertion violations + - cycle checks - (disabled by -DSAFETY) - invalid end states + - -State-vector 72 byte, depth reached 3250, errors: 0 - 2668047 states, stored -7.3166567e+08 states, matched -7.3433372e+08 transitions (= stored+matched) -4.2954757e+09 atomic steps -hash conflicts: 4.8630608e+08 (resolved) - -Stats on memory usage (in Megabytes): - 254.445 equivalent memory usage for states (stored*(State-vector + overhead)) - 94.790 actual memory usage for states (compression: 37.25%) - state-vector as stored = 9 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 560.490 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 25912 2128 1970 2 ] -unreached in proctype urcu_reader - line 267, ".input.spin", state 55, "cache_dirty_urcu_gp_ctr = 0" - line 275, ".input.spin", state 77, "cache_dirty_rcu_ptr = 0" - line 279, ".input.spin", state 86, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 102, "(1)" - line 248, ".input.spin", state 110, "(1)" - line 252, ".input.spin", state 122, "(1)" - line 256, ".input.spin", state 130, "(1)" - line 403, ".input.spin", state 156, "cache_dirty_urcu_gp_ctr = 0" - line 412, ".input.spin", state 188, "cache_dirty_rcu_ptr = 0" - line 416, ".input.spin", state 202, "cache_dirty_rcu_data[i] = 0" - line 421, ".input.spin", state 221, "(1)" - line 430, ".input.spin", state 251, "(1)" - line 434, ".input.spin", state 264, "(1)" - line 613, ".input.spin", state 285, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 403, ".input.spin", state 292, "cache_dirty_urcu_gp_ctr = 0" - line 412, ".input.spin", state 324, "cache_dirty_rcu_ptr = 0" - line 416, ".input.spin", state 338, "cache_dirty_rcu_data[i] = 0" - line 421, ".input.spin", state 357, "(1)" - line 430, ".input.spin", state 387, "(1)" - line 434, ".input.spin", state 400, "(1)" - line 403, ".input.spin", state 421, "cache_dirty_urcu_gp_ctr = 0" - line 412, ".input.spin", state 453, "cache_dirty_rcu_ptr = 0" - line 416, ".input.spin", state 467, "cache_dirty_rcu_data[i] = 0" - line 421, ".input.spin", state 486, "(1)" - line 430, ".input.spin", state 516, "(1)" - line 434, ".input.spin", state 529, "(1)" - line 403, ".input.spin", state 552, "cache_dirty_urcu_gp_ctr = 0" - line 403, ".input.spin", state 554, "(1)" - line 403, ".input.spin", state 555, "(cache_dirty_urcu_gp_ctr)" - line 403, ".input.spin", state 555, "else" - line 403, ".input.spin", state 558, "(1)" - line 407, ".input.spin", state 566, "cache_dirty_urcu_active_readers = 0" - line 407, ".input.spin", state 568, "(1)" - line 407, ".input.spin", state 569, "(cache_dirty_urcu_active_readers)" - line 407, ".input.spin", state 569, "else" - line 407, ".input.spin", state 572, "(1)" - line 407, ".input.spin", state 573, "(1)" - line 407, ".input.spin", state 573, "(1)" - line 405, ".input.spin", state 578, "((i<1))" - line 405, ".input.spin", state 578, "((i>=1))" - line 412, ".input.spin", state 584, "cache_dirty_rcu_ptr = 0" - line 412, ".input.spin", state 586, "(1)" - line 412, ".input.spin", state 587, "(cache_dirty_rcu_ptr)" - line 412, ".input.spin", state 587, "else" - line 412, ".input.spin", state 590, "(1)" - line 412, ".input.spin", state 591, "(1)" - line 412, ".input.spin", state 591, "(1)" - line 416, ".input.spin", state 598, "cache_dirty_rcu_data[i] = 0" - line 416, ".input.spin", state 600, "(1)" - line 416, ".input.spin", state 601, "(cache_dirty_rcu_data[i])" - line 416, ".input.spin", state 601, "else" - line 416, ".input.spin", state 604, "(1)" - line 416, ".input.spin", state 605, "(1)" - line 416, ".input.spin", state 605, "(1)" - line 414, ".input.spin", state 610, "((i<2))" - line 414, ".input.spin", state 610, "((i>=2))" - line 421, ".input.spin", state 617, "(1)" - line 421, ".input.spin", state 618, "(!(cache_dirty_urcu_gp_ctr))" - line 421, ".input.spin", state 618, "else" - line 421, ".input.spin", state 621, "(1)" - line 421, ".input.spin", state 622, "(1)" - line 421, ".input.spin", state 622, "(1)" - line 425, ".input.spin", state 630, "(1)" - line 425, ".input.spin", state 631, "(!(cache_dirty_urcu_active_readers))" - line 425, ".input.spin", state 631, "else" - line 425, ".input.spin", state 634, "(1)" - line 425, ".input.spin", state 635, "(1)" - line 425, ".input.spin", state 635, "(1)" - line 423, ".input.spin", state 640, "((i<1))" - line 423, ".input.spin", state 640, "((i>=1))" - line 430, ".input.spin", state 647, "(1)" - line 430, ".input.spin", state 648, "(!(cache_dirty_rcu_ptr))" - line 430, ".input.spin", state 648, "else" - line 430, ".input.spin", state 651, "(1)" - line 430, ".input.spin", state 652, "(1)" - line 430, ".input.spin", state 652, "(1)" - line 434, ".input.spin", state 660, "(1)" - line 434, ".input.spin", state 661, "(!(cache_dirty_rcu_data[i]))" - line 434, ".input.spin", state 661, "else" - line 434, ".input.spin", state 664, "(1)" - line 434, ".input.spin", state 665, "(1)" - line 434, ".input.spin", state 665, "(1)" - line 432, ".input.spin", state 670, "((i<2))" - line 432, ".input.spin", state 670, "((i>=2))" - line 442, ".input.spin", state 674, "(1)" - line 442, ".input.spin", state 674, "(1)" - line 613, ".input.spin", state 677, "cached_urcu_active_readers = (tmp+1)" - line 613, ".input.spin", state 678, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 613, ".input.spin", state 679, "(1)" - line 403, ".input.spin", state 686, "cache_dirty_urcu_gp_ctr = 0" - line 412, ".input.spin", state 718, "cache_dirty_rcu_ptr = 0" - line 416, ".input.spin", state 732, "cache_dirty_rcu_data[i] = 0" - line 421, ".input.spin", state 751, "(1)" - line 430, ".input.spin", state 781, "(1)" - line 434, ".input.spin", state 794, "(1)" - line 403, ".input.spin", state 821, "cache_dirty_urcu_gp_ctr = 0" - line 412, ".input.spin", state 853, "cache_dirty_rcu_ptr = 0" - line 416, ".input.spin", state 867, "cache_dirty_rcu_data[i] = 0" - line 421, ".input.spin", state 886, "(1)" - line 430, ".input.spin", state 916, "(1)" - line 434, ".input.spin", state 929, "(1)" - line 403, ".input.spin", state 950, "cache_dirty_urcu_gp_ctr = 0" - line 412, ".input.spin", state 982, "cache_dirty_rcu_ptr = 0" - line 416, ".input.spin", state 996, "cache_dirty_rcu_data[i] = 0" - line 421, ".input.spin", state 1015, "(1)" - line 430, ".input.spin", state 1045, "(1)" - line 434, ".input.spin", state 1058, "(1)" - line 244, ".input.spin", state 1091, "(1)" - line 252, ".input.spin", state 1111, "(1)" - line 256, ".input.spin", state 1119, "(1)" - line 747, ".input.spin", state 1136, "-end-" - (91 of 1136 states) -unreached in proctype urcu_writer - line 403, ".input.spin", state 45, "cache_dirty_urcu_gp_ctr = 0" - line 407, ".input.spin", state 59, "cache_dirty_urcu_active_readers = 0" - line 412, ".input.spin", state 77, "cache_dirty_rcu_ptr = 0" - line 421, ".input.spin", state 110, "(1)" - line 425, ".input.spin", state 123, "(1)" - line 430, ".input.spin", state 140, "(1)" - line 267, ".input.spin", state 176, "cache_dirty_urcu_gp_ctr = 0" - line 271, ".input.spin", state 185, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 198, "cache_dirty_rcu_ptr = 0" - line 403, ".input.spin", state 238, "cache_dirty_urcu_gp_ctr = 0" - line 407, ".input.spin", state 252, "cache_dirty_urcu_active_readers = 0" - line 412, ".input.spin", state 270, "cache_dirty_rcu_ptr = 0" - line 416, ".input.spin", state 284, "cache_dirty_rcu_data[i] = 0" - line 421, ".input.spin", state 303, "(1)" - line 425, ".input.spin", state 316, "(1)" - line 430, ".input.spin", state 333, "(1)" - line 434, ".input.spin", state 346, "(1)" - line 407, ".input.spin", state 383, "cache_dirty_urcu_active_readers = 0" - line 412, ".input.spin", state 401, "cache_dirty_rcu_ptr = 0" - line 416, ".input.spin", state 415, "cache_dirty_rcu_data[i] = 0" - line 425, ".input.spin", state 447, "(1)" - line 430, ".input.spin", state 464, "(1)" - line 434, ".input.spin", state 477, "(1)" - line 407, ".input.spin", state 522, "cache_dirty_urcu_active_readers = 0" - line 412, ".input.spin", state 540, "cache_dirty_rcu_ptr = 0" - line 416, ".input.spin", state 554, "cache_dirty_rcu_data[i] = 0" - line 425, ".input.spin", state 586, "(1)" - line 430, ".input.spin", state 603, "(1)" - line 434, ".input.spin", state 616, "(1)" - line 407, ".input.spin", state 651, "cache_dirty_urcu_active_readers = 0" - line 412, ".input.spin", state 669, "cache_dirty_rcu_ptr = 0" - line 416, ".input.spin", state 683, "cache_dirty_rcu_data[i] = 0" - line 425, ".input.spin", state 715, "(1)" - line 430, ".input.spin", state 732, "(1)" - line 434, ".input.spin", state 745, "(1)" - line 407, ".input.spin", state 782, "cache_dirty_urcu_active_readers = 0" - line 412, ".input.spin", state 800, "cache_dirty_rcu_ptr = 0" - line 416, ".input.spin", state 814, "cache_dirty_rcu_data[i] = 0" - line 425, ".input.spin", state 846, "(1)" - line 430, ".input.spin", state 863, "(1)" - line 434, ".input.spin", state 876, "(1)" - line 267, ".input.spin", state 931, "cache_dirty_urcu_gp_ctr = 0" - line 271, ".input.spin", state 940, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 955, "(1)" - line 279, ".input.spin", state 962, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 978, "(1)" - line 248, ".input.spin", state 986, "(1)" - line 252, ".input.spin", state 998, "(1)" - line 256, ".input.spin", state 1006, "(1)" - line 267, ".input.spin", state 1037, "cache_dirty_urcu_gp_ctr = 0" - line 271, ".input.spin", state 1046, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 1059, "cache_dirty_rcu_ptr = 0" - line 279, ".input.spin", state 1068, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 1084, "(1)" - line 248, ".input.spin", state 1092, "(1)" - line 252, ".input.spin", state 1104, "(1)" - line 256, ".input.spin", state 1112, "(1)" - line 271, ".input.spin", state 1138, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 1151, "cache_dirty_rcu_ptr = 0" - line 279, ".input.spin", state 1160, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 1176, "(1)" - line 248, ".input.spin", state 1184, "(1)" - line 252, ".input.spin", state 1196, "(1)" - line 256, ".input.spin", state 1204, "(1)" - line 267, ".input.spin", state 1235, "cache_dirty_urcu_gp_ctr = 0" - line 271, ".input.spin", state 1244, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 1257, "cache_dirty_rcu_ptr = 0" - line 279, ".input.spin", state 1266, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 1282, "(1)" - line 248, ".input.spin", state 1290, "(1)" - line 252, ".input.spin", state 1302, "(1)" - line 256, ".input.spin", state 1310, "(1)" - line 271, ".input.spin", state 1336, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 1349, "cache_dirty_rcu_ptr = 0" - line 279, ".input.spin", state 1358, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 1374, "(1)" - line 248, ".input.spin", state 1382, "(1)" - line 252, ".input.spin", state 1394, "(1)" - line 256, ".input.spin", state 1402, "(1)" - line 267, ".input.spin", state 1433, "cache_dirty_urcu_gp_ctr = 0" - line 271, ".input.spin", state 1442, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 1455, "cache_dirty_rcu_ptr = 0" - line 279, ".input.spin", state 1464, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 1480, "(1)" - line 248, ".input.spin", state 1488, "(1)" - line 252, ".input.spin", state 1500, "(1)" - line 256, ".input.spin", state 1508, "(1)" - line 271, ".input.spin", state 1534, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 1547, "cache_dirty_rcu_ptr = 0" - line 279, ".input.spin", state 1556, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 1572, "(1)" - line 248, ".input.spin", state 1580, "(1)" - line 252, ".input.spin", state 1592, "(1)" - line 256, ".input.spin", state 1600, "(1)" - line 267, ".input.spin", state 1631, "cache_dirty_urcu_gp_ctr = 0" - line 271, ".input.spin", state 1640, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 1653, "cache_dirty_rcu_ptr = 0" - line 279, ".input.spin", state 1662, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 1678, "(1)" - line 248, ".input.spin", state 1686, "(1)" - line 252, ".input.spin", state 1698, "(1)" - line 256, ".input.spin", state 1706, "(1)" - line 1122, ".input.spin", state 1722, "-end-" - (103 of 1722 states) -unreached in proctype :init: - (0 of 26 states) - -pan: elapsed time 1.01e+03 seconds -pan: rate 2639.775 states/second -pan: avg transition delay 1.3764e-06 usec -cp .input.spin asserts.spin.input -cp .input.spin.trail asserts.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/asserts.spin.input b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/asserts.spin.input deleted file mode 100644 index 21196d4..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/asserts.spin.input +++ /dev/null @@ -1,1156 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN, READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT, 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT, /* post-dominant */ - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_OUT, /* RAW */ - READ_UNLOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - data_read_first[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/references.txt b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/references.txt deleted file mode 100644 index 72c67a2..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/references.txt +++ /dev/null @@ -1,13 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html - -LTL vs CTL : - -http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 -http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf - (downloaded) diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu.sh b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu.spin b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu.spin deleted file mode 100644 index db5ab0e..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu.spin +++ /dev/null @@ -1,1138 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN, READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT, 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT, /* post-dominant */ - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_OUT, /* RAW */ - READ_UNLOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - data_read_first[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free.log b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free.log deleted file mode 100644 index dd99ae5..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free.log +++ /dev/null @@ -1,277 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1178) -Depth= 3880 States= 1e+06 Transitions= 2.74e+08 Memory= 512.932 t= 435 R= 2e+03 -Depth= 3880 States= 2e+06 Transitions= 5.69e+08 Memory= 559.318 t= 929 R= 2e+03 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 80 byte, depth reached 3880, errors: 0 - 2668047 states, stored -7.3167024e+08 states, matched -7.3433829e+08 transitions (= stored+matched) -4.2954757e+09 atomic steps -hash conflicts: 4.8818996e+08 (resolved) - -Stats on memory usage (in Megabytes): - 295.156 equivalent memory usage for states (stored*(State-vector + overhead)) - 124.292 actual memory usage for states (compression: 42.11%) - state-vector as stored = 13 byte + 36 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 589.983 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 25912 2128 1970 2 1 ] -unreached in proctype urcu_reader - line 267, "pan.___", state 55, "cache_dirty_urcu_gp_ctr = 0" - line 275, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 279, "pan.___", state 86, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 102, "(1)" - line 248, "pan.___", state 110, "(1)" - line 252, "pan.___", state 122, "(1)" - line 256, "pan.___", state 130, "(1)" - line 403, "pan.___", state 156, "cache_dirty_urcu_gp_ctr = 0" - line 412, "pan.___", state 188, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 202, "cache_dirty_rcu_data[i] = 0" - line 421, "pan.___", state 221, "(1)" - line 430, "pan.___", state 251, "(1)" - line 434, "pan.___", state 264, "(1)" - line 613, "pan.___", state 285, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 403, "pan.___", state 292, "cache_dirty_urcu_gp_ctr = 0" - line 412, "pan.___", state 324, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 338, "cache_dirty_rcu_data[i] = 0" - line 421, "pan.___", state 357, "(1)" - line 430, "pan.___", state 387, "(1)" - line 434, "pan.___", state 400, "(1)" - line 403, "pan.___", state 421, "cache_dirty_urcu_gp_ctr = 0" - line 412, "pan.___", state 453, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 467, "cache_dirty_rcu_data[i] = 0" - line 421, "pan.___", state 486, "(1)" - line 430, "pan.___", state 516, "(1)" - line 434, "pan.___", state 529, "(1)" - line 403, "pan.___", state 552, "cache_dirty_urcu_gp_ctr = 0" - line 403, "pan.___", state 554, "(1)" - line 403, "pan.___", state 555, "(cache_dirty_urcu_gp_ctr)" - line 403, "pan.___", state 555, "else" - line 403, "pan.___", state 558, "(1)" - line 407, "pan.___", state 566, "cache_dirty_urcu_active_readers = 0" - line 407, "pan.___", state 568, "(1)" - line 407, "pan.___", state 569, "(cache_dirty_urcu_active_readers)" - line 407, "pan.___", state 569, "else" - line 407, "pan.___", state 572, "(1)" - line 407, "pan.___", state 573, "(1)" - line 407, "pan.___", state 573, "(1)" - line 405, "pan.___", state 578, "((i<1))" - line 405, "pan.___", state 578, "((i>=1))" - line 412, "pan.___", state 584, "cache_dirty_rcu_ptr = 0" - line 412, "pan.___", state 586, "(1)" - line 412, "pan.___", state 587, "(cache_dirty_rcu_ptr)" - line 412, "pan.___", state 587, "else" - line 412, "pan.___", state 590, "(1)" - line 412, "pan.___", state 591, "(1)" - line 412, "pan.___", state 591, "(1)" - line 416, "pan.___", state 598, "cache_dirty_rcu_data[i] = 0" - line 416, "pan.___", state 600, "(1)" - line 416, "pan.___", state 601, "(cache_dirty_rcu_data[i])" - line 416, "pan.___", state 601, "else" - line 416, "pan.___", state 604, "(1)" - line 416, "pan.___", state 605, "(1)" - line 416, "pan.___", state 605, "(1)" - line 414, "pan.___", state 610, "((i<2))" - line 414, "pan.___", state 610, "((i>=2))" - line 421, "pan.___", state 617, "(1)" - line 421, "pan.___", state 618, "(!(cache_dirty_urcu_gp_ctr))" - line 421, "pan.___", state 618, "else" - line 421, "pan.___", state 621, "(1)" - line 421, "pan.___", state 622, "(1)" - line 421, "pan.___", state 622, "(1)" - line 425, "pan.___", state 630, "(1)" - line 425, "pan.___", state 631, "(!(cache_dirty_urcu_active_readers))" - line 425, "pan.___", state 631, "else" - line 425, "pan.___", state 634, "(1)" - line 425, "pan.___", state 635, "(1)" - line 425, "pan.___", state 635, "(1)" - line 423, "pan.___", state 640, "((i<1))" - line 423, "pan.___", state 640, "((i>=1))" - line 430, "pan.___", state 647, "(1)" - line 430, "pan.___", state 648, "(!(cache_dirty_rcu_ptr))" - line 430, "pan.___", state 648, "else" - line 430, "pan.___", state 651, "(1)" - line 430, "pan.___", state 652, "(1)" - line 430, "pan.___", state 652, "(1)" - line 434, "pan.___", state 660, "(1)" - line 434, "pan.___", state 661, "(!(cache_dirty_rcu_data[i]))" - line 434, "pan.___", state 661, "else" - line 434, "pan.___", state 664, "(1)" - line 434, "pan.___", state 665, "(1)" - line 434, "pan.___", state 665, "(1)" - line 432, "pan.___", state 670, "((i<2))" - line 432, "pan.___", state 670, "((i>=2))" - line 442, "pan.___", state 674, "(1)" - line 442, "pan.___", state 674, "(1)" - line 613, "pan.___", state 677, "cached_urcu_active_readers = (tmp+1)" - line 613, "pan.___", state 678, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 613, "pan.___", state 679, "(1)" - line 403, "pan.___", state 686, "cache_dirty_urcu_gp_ctr = 0" - line 412, "pan.___", state 718, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 732, "cache_dirty_rcu_data[i] = 0" - line 421, "pan.___", state 751, "(1)" - line 430, "pan.___", state 781, "(1)" - line 434, "pan.___", state 794, "(1)" - line 403, "pan.___", state 821, "cache_dirty_urcu_gp_ctr = 0" - line 412, "pan.___", state 853, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 867, "cache_dirty_rcu_data[i] = 0" - line 421, "pan.___", state 886, "(1)" - line 430, "pan.___", state 916, "(1)" - line 434, "pan.___", state 929, "(1)" - line 403, "pan.___", state 950, "cache_dirty_urcu_gp_ctr = 0" - line 412, "pan.___", state 982, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 996, "cache_dirty_rcu_data[i] = 0" - line 421, "pan.___", state 1015, "(1)" - line 430, "pan.___", state 1045, "(1)" - line 434, "pan.___", state 1058, "(1)" - line 244, "pan.___", state 1091, "(1)" - line 252, "pan.___", state 1111, "(1)" - line 256, "pan.___", state 1119, "(1)" - line 747, "pan.___", state 1136, "-end-" - (91 of 1136 states) -unreached in proctype urcu_writer - line 403, "pan.___", state 45, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 59, "cache_dirty_urcu_active_readers = 0" - line 412, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 110, "(1)" - line 425, "pan.___", state 123, "(1)" - line 430, "pan.___", state 140, "(1)" - line 267, "pan.___", state 176, "cache_dirty_urcu_gp_ctr = 0" - line 271, "pan.___", state 185, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 198, "cache_dirty_rcu_ptr = 0" - line 403, "pan.___", state 238, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 252, "cache_dirty_urcu_active_readers = 0" - line 412, "pan.___", state 270, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 284, "cache_dirty_rcu_data[i] = 0" - line 421, "pan.___", state 303, "(1)" - line 425, "pan.___", state 316, "(1)" - line 430, "pan.___", state 333, "(1)" - line 434, "pan.___", state 346, "(1)" - line 407, "pan.___", state 383, "cache_dirty_urcu_active_readers = 0" - line 412, "pan.___", state 401, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 415, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 447, "(1)" - line 430, "pan.___", state 464, "(1)" - line 434, "pan.___", state 477, "(1)" - line 407, "pan.___", state 522, "cache_dirty_urcu_active_readers = 0" - line 412, "pan.___", state 540, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 554, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 586, "(1)" - line 430, "pan.___", state 603, "(1)" - line 434, "pan.___", state 616, "(1)" - line 407, "pan.___", state 651, "cache_dirty_urcu_active_readers = 0" - line 412, "pan.___", state 669, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 683, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 715, "(1)" - line 430, "pan.___", state 732, "(1)" - line 434, "pan.___", state 745, "(1)" - line 407, "pan.___", state 782, "cache_dirty_urcu_active_readers = 0" - line 412, "pan.___", state 800, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 814, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 846, "(1)" - line 430, "pan.___", state 863, "(1)" - line 434, "pan.___", state 876, "(1)" - line 267, "pan.___", state 931, "cache_dirty_urcu_gp_ctr = 0" - line 271, "pan.___", state 940, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 955, "(1)" - line 279, "pan.___", state 962, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 978, "(1)" - line 248, "pan.___", state 986, "(1)" - line 252, "pan.___", state 998, "(1)" - line 256, "pan.___", state 1006, "(1)" - line 267, "pan.___", state 1037, "cache_dirty_urcu_gp_ctr = 0" - line 271, "pan.___", state 1046, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 1059, "cache_dirty_rcu_ptr = 0" - line 279, "pan.___", state 1068, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 1084, "(1)" - line 248, "pan.___", state 1092, "(1)" - line 252, "pan.___", state 1104, "(1)" - line 256, "pan.___", state 1112, "(1)" - line 271, "pan.___", state 1138, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 1151, "cache_dirty_rcu_ptr = 0" - line 279, "pan.___", state 1160, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 1176, "(1)" - line 248, "pan.___", state 1184, "(1)" - line 252, "pan.___", state 1196, "(1)" - line 256, "pan.___", state 1204, "(1)" - line 267, "pan.___", state 1235, "cache_dirty_urcu_gp_ctr = 0" - line 271, "pan.___", state 1244, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 1257, "cache_dirty_rcu_ptr = 0" - line 279, "pan.___", state 1266, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 1282, "(1)" - line 248, "pan.___", state 1290, "(1)" - line 252, "pan.___", state 1302, "(1)" - line 256, "pan.___", state 1310, "(1)" - line 271, "pan.___", state 1336, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 1349, "cache_dirty_rcu_ptr = 0" - line 279, "pan.___", state 1358, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 1374, "(1)" - line 248, "pan.___", state 1382, "(1)" - line 252, "pan.___", state 1394, "(1)" - line 256, "pan.___", state 1402, "(1)" - line 267, "pan.___", state 1433, "cache_dirty_urcu_gp_ctr = 0" - line 271, "pan.___", state 1442, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 1455, "cache_dirty_rcu_ptr = 0" - line 279, "pan.___", state 1464, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 1480, "(1)" - line 248, "pan.___", state 1488, "(1)" - line 252, "pan.___", state 1500, "(1)" - line 256, "pan.___", state 1508, "(1)" - line 271, "pan.___", state 1534, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 1547, "cache_dirty_rcu_ptr = 0" - line 279, "pan.___", state 1556, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 1572, "(1)" - line 248, "pan.___", state 1580, "(1)" - line 252, "pan.___", state 1592, "(1)" - line 256, "pan.___", state 1600, "(1)" - line 267, "pan.___", state 1631, "cache_dirty_urcu_gp_ctr = 0" - line 271, "pan.___", state 1640, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 1653, "cache_dirty_rcu_ptr = 0" - line 279, "pan.___", state 1662, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 1678, "(1)" - line 248, "pan.___", state 1686, "(1)" - line 252, "pan.___", state 1698, "(1)" - line 256, "pan.___", state 1706, "(1)" - line 1122, "pan.___", state 1722, "-end-" - (103 of 1722 states) -unreached in proctype :init: - (0 of 26 states) -unreached in proctype :never: - line 1183, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 1.21e+03 seconds -pan: rate 2200.5963 states/second -pan: avg transition delay 1.651e-06 usec -cp .input.spin urcu_free.spin.input -cp .input.spin.trail urcu_free.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free.ltl b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free.ltl deleted file mode 100644 index 6be1be9..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free.ltl +++ /dev/null @@ -1 +0,0 @@ -[] (!read_poison) diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free.spin.input b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free.spin.input deleted file mode 100644 index 21196d4..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free.spin.input +++ /dev/null @@ -1,1156 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN, READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT, 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT, /* post-dominant */ - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_OUT, /* RAW */ - READ_UNLOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - data_read_first[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_nested.define b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_nested.define deleted file mode 100644 index 0fb59bd..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_nested.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_NEST_LEVEL 2 diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_mb.define b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_mb.define deleted file mode 100644 index d99d793..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_mb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_MB diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_mb.log b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_mb.log deleted file mode 100644 index 7fe9c9a..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_mb.log +++ /dev/null @@ -1,628 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_mb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1179) -pan: claim violated! (at depth 1246) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 80 byte, depth reached 3190, errors: 1 - 124498 states, stored - 15198533 states, matched - 15323031 transitions (= stored+matched) - 86866126 atomic steps -hash conflicts: 473423 (resolved) - -Stats on memory usage (in Megabytes): - 13.773 equivalent memory usage for states (stored*(State-vector + overhead)) - 6.400 actual memory usage for states (compression: 46.47%) - state-vector as stored = 18 byte + 36 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 472.111 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 2572 1245 179 2 2 ] -unreached in proctype urcu_reader - line 713, "pan.___", state 12, "((i<1))" - line 713, "pan.___", state 12, "((i>=1))" - line 268, "pan.___", state 57, "cache_dirty_urcu_gp_ctr = 0" - line 276, "pan.___", state 79, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 88, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 104, "(1)" - line 249, "pan.___", state 112, "(1)" - line 253, "pan.___", state 124, "(1)" - line 257, "pan.___", state 132, "(1)" - line 404, "pan.___", state 158, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 190, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 204, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 223, "(1)" - line 431, "pan.___", state 253, "(1)" - line 435, "pan.___", state 266, "(1)" - line 614, "pan.___", state 287, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 404, "pan.___", state 294, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 326, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 340, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 359, "(1)" - line 431, "pan.___", state 389, "(1)" - line 435, "pan.___", state 402, "(1)" - line 404, "pan.___", state 423, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 455, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 469, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 488, "(1)" - line 431, "pan.___", state 518, "(1)" - line 435, "pan.___", state 531, "(1)" - line 404, "pan.___", state 554, "cache_dirty_urcu_gp_ctr = 0" - line 404, "pan.___", state 556, "(1)" - line 404, "pan.___", state 557, "(cache_dirty_urcu_gp_ctr)" - line 404, "pan.___", state 557, "else" - line 404, "pan.___", state 560, "(1)" - line 408, "pan.___", state 568, "cache_dirty_urcu_active_readers = 0" - line 408, "pan.___", state 570, "(1)" - line 408, "pan.___", state 571, "(cache_dirty_urcu_active_readers)" - line 408, "pan.___", state 571, "else" - line 408, "pan.___", state 574, "(1)" - line 408, "pan.___", state 575, "(1)" - line 408, "pan.___", state 575, "(1)" - line 406, "pan.___", state 580, "((i<1))" - line 406, "pan.___", state 580, "((i>=1))" - line 413, "pan.___", state 586, "cache_dirty_rcu_ptr = 0" - line 413, "pan.___", state 588, "(1)" - line 413, "pan.___", state 589, "(cache_dirty_rcu_ptr)" - line 413, "pan.___", state 589, "else" - line 413, "pan.___", state 592, "(1)" - line 413, "pan.___", state 593, "(1)" - line 413, "pan.___", state 593, "(1)" - line 417, "pan.___", state 600, "cache_dirty_rcu_data[i] = 0" - line 417, "pan.___", state 602, "(1)" - line 417, "pan.___", state 603, "(cache_dirty_rcu_data[i])" - line 417, "pan.___", state 603, "else" - line 417, "pan.___", state 606, "(1)" - line 417, "pan.___", state 607, "(1)" - line 417, "pan.___", state 607, "(1)" - line 415, "pan.___", state 612, "((i<2))" - line 415, "pan.___", state 612, "((i>=2))" - line 422, "pan.___", state 619, "(1)" - line 422, "pan.___", state 620, "(!(cache_dirty_urcu_gp_ctr))" - line 422, "pan.___", state 620, "else" - line 422, "pan.___", state 623, "(1)" - line 422, "pan.___", state 624, "(1)" - line 422, "pan.___", state 624, "(1)" - line 426, "pan.___", state 632, "(1)" - line 426, "pan.___", state 633, "(!(cache_dirty_urcu_active_readers))" - line 426, "pan.___", state 633, "else" - line 426, "pan.___", state 636, "(1)" - line 426, "pan.___", state 637, "(1)" - line 426, "pan.___", state 637, "(1)" - line 424, "pan.___", state 642, "((i<1))" - line 424, "pan.___", state 642, "((i>=1))" - line 431, "pan.___", state 649, "(1)" - line 431, "pan.___", state 650, "(!(cache_dirty_rcu_ptr))" - line 431, "pan.___", state 650, "else" - line 431, "pan.___", state 653, "(1)" - line 431, "pan.___", state 654, "(1)" - line 431, "pan.___", state 654, "(1)" - line 435, "pan.___", state 662, "(1)" - line 435, "pan.___", state 663, "(!(cache_dirty_rcu_data[i]))" - line 435, "pan.___", state 663, "else" - line 435, "pan.___", state 666, "(1)" - line 435, "pan.___", state 667, "(1)" - line 435, "pan.___", state 667, "(1)" - line 433, "pan.___", state 672, "((i<2))" - line 433, "pan.___", state 672, "((i>=2))" - line 443, "pan.___", state 676, "(1)" - line 443, "pan.___", state 676, "(1)" - line 614, "pan.___", state 679, "cached_urcu_active_readers = (tmp+1)" - line 614, "pan.___", state 680, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 614, "pan.___", state 681, "(1)" - line 404, "pan.___", state 688, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 720, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 734, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 753, "(1)" - line 431, "pan.___", state 783, "(1)" - line 435, "pan.___", state 796, "(1)" - line 404, "pan.___", state 823, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 855, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 869, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 888, "(1)" - line 431, "pan.___", state 918, "(1)" - line 435, "pan.___", state 931, "(1)" - line 404, "pan.___", state 952, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 984, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 998, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 1017, "(1)" - line 431, "pan.___", state 1047, "(1)" - line 435, "pan.___", state 1060, "(1)" - line 245, "pan.___", state 1093, "(1)" - line 253, "pan.___", state 1113, "(1)" - line 257, "pan.___", state 1121, "(1)" - line 748, "pan.___", state 1138, "-end-" - (92 of 1138 states) -unreached in proctype urcu_writer - line 837, "pan.___", state 12, "((i<1))" - line 837, "pan.___", state 12, "((i>=1))" - line 404, "pan.___", state 47, "cache_dirty_urcu_gp_ctr = 0" - line 404, "pan.___", state 53, "(1)" - line 408, "pan.___", state 61, "cache_dirty_urcu_active_readers = 0" - line 408, "pan.___", state 67, "(1)" - line 408, "pan.___", state 68, "(1)" - line 408, "pan.___", state 68, "(1)" - line 406, "pan.___", state 73, "((i<1))" - line 406, "pan.___", state 73, "((i>=1))" - line 413, "pan.___", state 79, "cache_dirty_rcu_ptr = 0" - line 413, "pan.___", state 85, "(1)" - line 413, "pan.___", state 86, "(1)" - line 413, "pan.___", state 86, "(1)" - line 417, "pan.___", state 99, "(1)" - line 417, "pan.___", state 100, "(1)" - line 417, "pan.___", state 100, "(1)" - line 415, "pan.___", state 105, "((i<2))" - line 415, "pan.___", state 105, "((i>=2))" - line 422, "pan.___", state 112, "(1)" - line 422, "pan.___", state 113, "(!(cache_dirty_urcu_gp_ctr))" - line 422, "pan.___", state 113, "else" - line 422, "pan.___", state 116, "(1)" - line 422, "pan.___", state 117, "(1)" - line 422, "pan.___", state 117, "(1)" - line 426, "pan.___", state 125, "(1)" - line 426, "pan.___", state 126, "(!(cache_dirty_urcu_active_readers))" - line 426, "pan.___", state 126, "else" - line 426, "pan.___", state 129, "(1)" - line 426, "pan.___", state 130, "(1)" - line 426, "pan.___", state 130, "(1)" - line 424, "pan.___", state 135, "((i<1))" - line 424, "pan.___", state 135, "((i>=1))" - line 431, "pan.___", state 142, "(1)" - line 431, "pan.___", state 143, "(!(cache_dirty_rcu_ptr))" - line 431, "pan.___", state 143, "else" - line 431, "pan.___", state 146, "(1)" - line 431, "pan.___", state 147, "(1)" - line 431, "pan.___", state 147, "(1)" - line 435, "pan.___", state 155, "(1)" - line 435, "pan.___", state 156, "(!(cache_dirty_rcu_data[i]))" - line 435, "pan.___", state 156, "else" - line 435, "pan.___", state 159, "(1)" - line 435, "pan.___", state 160, "(1)" - line 435, "pan.___", state 160, "(1)" - line 433, "pan.___", state 165, "((i<2))" - line 433, "pan.___", state 165, "((i>=2))" - line 443, "pan.___", state 169, "(1)" - line 443, "pan.___", state 169, "(1)" - line 268, "pan.___", state 178, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 187, "cache_dirty_urcu_active_readers = 0" - line 270, "pan.___", state 195, "((i<1))" - line 270, "pan.___", state 195, "((i>=1))" - line 276, "pan.___", state 200, "cache_dirty_rcu_ptr = 0" - line 907, "pan.___", state 228, "old_data = cached_rcu_ptr" - line 918, "pan.___", state 232, "_proc_urcu_writer = (_proc_urcu_writer|(1<<4))" - line 404, "pan.___", state 240, "cache_dirty_urcu_gp_ctr = 0" - line 404, "pan.___", state 246, "(1)" - line 408, "pan.___", state 254, "cache_dirty_urcu_active_readers = 0" - line 408, "pan.___", state 260, "(1)" - line 408, "pan.___", state 261, "(1)" - line 408, "pan.___", state 261, "(1)" - line 406, "pan.___", state 266, "((i<1))" - line 406, "pan.___", state 266, "((i>=1))" - line 413, "pan.___", state 274, "(1)" - line 413, "pan.___", state 275, "(cache_dirty_rcu_ptr)" - line 413, "pan.___", state 275, "else" - line 413, "pan.___", state 278, "(1)" - line 413, "pan.___", state 279, "(1)" - line 413, "pan.___", state 279, "(1)" - line 417, "pan.___", state 286, "cache_dirty_rcu_data[i] = 0" - line 417, "pan.___", state 292, "(1)" - line 417, "pan.___", state 293, "(1)" - line 417, "pan.___", state 293, "(1)" - line 415, "pan.___", state 298, "((i<2))" - line 415, "pan.___", state 298, "((i>=2))" - line 422, "pan.___", state 305, "(1)" - line 422, "pan.___", state 306, "(!(cache_dirty_urcu_gp_ctr))" - line 422, "pan.___", state 306, "else" - line 422, "pan.___", state 309, "(1)" - line 422, "pan.___", state 310, "(1)" - line 422, "pan.___", state 310, "(1)" - line 426, "pan.___", state 318, "(1)" - line 426, "pan.___", state 319, "(!(cache_dirty_urcu_active_readers))" - line 426, "pan.___", state 319, "else" - line 426, "pan.___", state 322, "(1)" - line 426, "pan.___", state 323, "(1)" - line 426, "pan.___", state 323, "(1)" - line 424, "pan.___", state 328, "((i<1))" - line 424, "pan.___", state 328, "((i>=1))" - line 431, "pan.___", state 335, "(1)" - line 431, "pan.___", state 336, "(!(cache_dirty_rcu_ptr))" - line 431, "pan.___", state 336, "else" - line 431, "pan.___", state 339, "(1)" - line 431, "pan.___", state 340, "(1)" - line 431, "pan.___", state 340, "(1)" - line 435, "pan.___", state 348, "(1)" - line 435, "pan.___", state 349, "(!(cache_dirty_rcu_data[i]))" - line 435, "pan.___", state 349, "else" - line 435, "pan.___", state 352, "(1)" - line 435, "pan.___", state 353, "(1)" - line 435, "pan.___", state 353, "(1)" - line 433, "pan.___", state 358, "((i<2))" - line 433, "pan.___", state 358, "((i>=2))" - line 443, "pan.___", state 362, "(1)" - line 443, "pan.___", state 362, "(1)" - line 404, "pan.___", state 373, "(1)" - line 404, "pan.___", state 374, "(cache_dirty_urcu_gp_ctr)" - line 404, "pan.___", state 374, "else" - line 404, "pan.___", state 377, "(1)" - line 408, "pan.___", state 385, "cache_dirty_urcu_active_readers = 0" - line 408, "pan.___", state 391, "(1)" - line 408, "pan.___", state 392, "(1)" - line 408, "pan.___", state 392, "(1)" - line 406, "pan.___", state 397, "((i<1))" - line 406, "pan.___", state 397, "((i>=1))" - line 413, "pan.___", state 403, "cache_dirty_rcu_ptr = 0" - line 413, "pan.___", state 409, "(1)" - line 413, "pan.___", state 410, "(1)" - line 413, "pan.___", state 410, "(1)" - line 417, "pan.___", state 417, "cache_dirty_rcu_data[i] = 0" - line 417, "pan.___", state 423, "(1)" - line 417, "pan.___", state 424, "(1)" - line 417, "pan.___", state 424, "(1)" - line 415, "pan.___", state 429, "((i<2))" - line 415, "pan.___", state 429, "((i>=2))" - line 422, "pan.___", state 436, "(1)" - line 422, "pan.___", state 437, "(!(cache_dirty_urcu_gp_ctr))" - line 422, "pan.___", state 437, "else" - line 422, "pan.___", state 440, "(1)" - line 422, "pan.___", state 441, "(1)" - line 422, "pan.___", state 441, "(1)" - line 426, "pan.___", state 449, "(1)" - line 426, "pan.___", state 450, "(!(cache_dirty_urcu_active_readers))" - line 426, "pan.___", state 450, "else" - line 426, "pan.___", state 453, "(1)" - line 426, "pan.___", state 454, "(1)" - line 426, "pan.___", state 454, "(1)" - line 424, "pan.___", state 459, "((i<1))" - line 424, "pan.___", state 459, "((i>=1))" - line 431, "pan.___", state 466, "(1)" - line 431, "pan.___", state 467, "(!(cache_dirty_rcu_ptr))" - line 431, "pan.___", state 467, "else" - line 431, "pan.___", state 470, "(1)" - line 431, "pan.___", state 471, "(1)" - line 431, "pan.___", state 471, "(1)" - line 435, "pan.___", state 479, "(1)" - line 435, "pan.___", state 480, "(!(cache_dirty_rcu_data[i]))" - line 435, "pan.___", state 480, "else" - line 435, "pan.___", state 483, "(1)" - line 435, "pan.___", state 484, "(1)" - line 435, "pan.___", state 484, "(1)" - line 433, "pan.___", state 489, "((i<2))" - line 433, "pan.___", state 489, "((i>=2))" - line 443, "pan.___", state 493, "(1)" - line 443, "pan.___", state 493, "(1)" - line 972, "pan.___", state 504, "_proc_urcu_writer = (_proc_urcu_writer&~((1<<9)))" - line 977, "pan.___", state 505, "_proc_urcu_writer = (_proc_urcu_writer&~(((1<<8)|(1<<7))))" - line 404, "pan.___", state 510, "cache_dirty_urcu_gp_ctr = 0" - line 404, "pan.___", state 516, "(1)" - line 408, "pan.___", state 524, "cache_dirty_urcu_active_readers = 0" - line 408, "pan.___", state 530, "(1)" - line 408, "pan.___", state 531, "(1)" - line 408, "pan.___", state 531, "(1)" - line 406, "pan.___", state 536, "((i<1))" - line 406, "pan.___", state 536, "((i>=1))" - line 413, "pan.___", state 542, "cache_dirty_rcu_ptr = 0" - line 413, "pan.___", state 548, "(1)" - line 413, "pan.___", state 549, "(1)" - line 413, "pan.___", state 549, "(1)" - line 417, "pan.___", state 556, "cache_dirty_rcu_data[i] = 0" - line 417, "pan.___", state 562, "(1)" - line 417, "pan.___", state 563, "(1)" - line 417, "pan.___", state 563, "(1)" - line 415, "pan.___", state 568, "((i<2))" - line 415, "pan.___", state 568, "((i>=2))" - line 422, "pan.___", state 575, "(1)" - line 422, "pan.___", state 576, "(!(cache_dirty_urcu_gp_ctr))" - line 422, "pan.___", state 576, "else" - line 422, "pan.___", state 579, "(1)" - line 422, "pan.___", state 580, "(1)" - line 422, "pan.___", state 580, "(1)" - line 426, "pan.___", state 588, "(1)" - line 426, "pan.___", state 589, "(!(cache_dirty_urcu_active_readers))" - line 426, "pan.___", state 589, "else" - line 426, "pan.___", state 592, "(1)" - line 426, "pan.___", state 593, "(1)" - line 426, "pan.___", state 593, "(1)" - line 424, "pan.___", state 598, "((i<1))" - line 424, "pan.___", state 598, "((i>=1))" - line 431, "pan.___", state 605, "(1)" - line 431, "pan.___", state 606, "(!(cache_dirty_rcu_ptr))" - line 431, "pan.___", state 606, "else" - line 431, "pan.___", state 609, "(1)" - line 431, "pan.___", state 610, "(1)" - line 431, "pan.___", state 610, "(1)" - line 435, "pan.___", state 618, "(1)" - line 435, "pan.___", state 619, "(!(cache_dirty_rcu_data[i]))" - line 435, "pan.___", state 619, "else" - line 435, "pan.___", state 622, "(1)" - line 435, "pan.___", state 623, "(1)" - line 435, "pan.___", state 623, "(1)" - line 443, "pan.___", state 632, "(1)" - line 443, "pan.___", state 632, "(1)" - line 404, "pan.___", state 639, "cache_dirty_urcu_gp_ctr = 0" - line 408, "pan.___", state 653, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 671, "cache_dirty_rcu_ptr = 0" - line 422, "pan.___", state 704, "(1)" - line 426, "pan.___", state 717, "(1)" - line 431, "pan.___", state 734, "(1)" - line 435, "pan.___", state 747, "(1)" - line 408, "pan.___", state 784, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 802, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 816, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 848, "(1)" - line 431, "pan.___", state 865, "(1)" - line 435, "pan.___", state 878, "(1)" - line 1054, "pan.___", state 905, "_proc_urcu_writer = (_proc_urcu_writer|(1<<13))" - line 268, "pan.___", state 933, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 935, "(1)" - line 272, "pan.___", state 942, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 944, "(1)" - line 272, "pan.___", state 945, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 945, "else" - line 270, "pan.___", state 950, "((i<1))" - line 270, "pan.___", state 950, "((i>=1))" - line 276, "pan.___", state 955, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 957, "(1)" - line 276, "pan.___", state 958, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 958, "else" - line 280, "pan.___", state 964, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 966, "(1)" - line 280, "pan.___", state 967, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 967, "else" - line 278, "pan.___", state 972, "((i<2))" - line 278, "pan.___", state 972, "((i>=2))" - line 245, "pan.___", state 980, "(1)" - line 249, "pan.___", state 988, "(1)" - line 249, "pan.___", state 989, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 989, "else" - line 247, "pan.___", state 994, "((i<1))" - line 247, "pan.___", state 994, "((i>=1))" - line 253, "pan.___", state 1000, "(1)" - line 253, "pan.___", state 1001, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 1001, "else" - line 257, "pan.___", state 1008, "(1)" - line 257, "pan.___", state 1009, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 1009, "else" - line 262, "pan.___", state 1018, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 1018, "else" - line 1108, "pan.___", state 1034, "((i<1))" - line 1108, "pan.___", state 1034, "((i>=1))" - line 268, "pan.___", state 1039, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 1041, "(1)" - line 272, "pan.___", state 1048, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 1050, "(1)" - line 272, "pan.___", state 1051, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 1051, "else" - line 270, "pan.___", state 1056, "((i<1))" - line 270, "pan.___", state 1056, "((i>=1))" - line 276, "pan.___", state 1061, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 1063, "(1)" - line 276, "pan.___", state 1064, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 1064, "else" - line 280, "pan.___", state 1070, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 1072, "(1)" - line 280, "pan.___", state 1073, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 1073, "else" - line 278, "pan.___", state 1078, "((i<2))" - line 278, "pan.___", state 1078, "((i>=2))" - line 245, "pan.___", state 1086, "(1)" - line 249, "pan.___", state 1094, "(1)" - line 249, "pan.___", state 1095, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 1095, "else" - line 247, "pan.___", state 1100, "((i<1))" - line 247, "pan.___", state 1100, "((i>=1))" - line 253, "pan.___", state 1106, "(1)" - line 253, "pan.___", state 1107, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 1107, "else" - line 257, "pan.___", state 1114, "(1)" - line 257, "pan.___", state 1115, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 1115, "else" - line 262, "pan.___", state 1124, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 1124, "else" - line 295, "pan.___", state 1126, "(cache_dirty_urcu_gp_ctr)" - line 295, "pan.___", state 1126, "else" - line 1108, "pan.___", state 1127, "(cache_dirty_urcu_gp_ctr)" - line 1108, "pan.___", state 1127, "else" - line 268, "pan.___", state 1131, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 1133, "(1)" - line 272, "pan.___", state 1140, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 1142, "(1)" - line 272, "pan.___", state 1143, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 1143, "else" - line 270, "pan.___", state 1148, "((i<1))" - line 270, "pan.___", state 1148, "((i>=1))" - line 276, "pan.___", state 1153, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 1155, "(1)" - line 276, "pan.___", state 1156, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 1156, "else" - line 280, "pan.___", state 1162, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 1164, "(1)" - line 280, "pan.___", state 1165, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 1165, "else" - line 278, "pan.___", state 1170, "((i<2))" - line 278, "pan.___", state 1170, "((i>=2))" - line 245, "pan.___", state 1178, "(1)" - line 249, "pan.___", state 1186, "(1)" - line 249, "pan.___", state 1187, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 1187, "else" - line 247, "pan.___", state 1192, "((i<1))" - line 247, "pan.___", state 1192, "((i>=1))" - line 253, "pan.___", state 1198, "(1)" - line 253, "pan.___", state 1199, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 1199, "else" - line 257, "pan.___", state 1206, "(1)" - line 257, "pan.___", state 1207, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 1207, "else" - line 262, "pan.___", state 1216, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 1216, "else" - line 1112, "pan.___", state 1219, "i = 0" - line 1112, "pan.___", state 1221, "reader_barrier = 1" - line 1112, "pan.___", state 1232, "((i<1))" - line 1112, "pan.___", state 1232, "((i>=1))" - line 268, "pan.___", state 1237, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 1239, "(1)" - line 272, "pan.___", state 1246, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 1248, "(1)" - line 272, "pan.___", state 1249, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 1249, "else" - line 270, "pan.___", state 1254, "((i<1))" - line 270, "pan.___", state 1254, "((i>=1))" - line 276, "pan.___", state 1259, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 1261, "(1)" - line 276, "pan.___", state 1262, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 1262, "else" - line 280, "pan.___", state 1268, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 1270, "(1)" - line 280, "pan.___", state 1271, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 1271, "else" - line 278, "pan.___", state 1276, "((i<2))" - line 278, "pan.___", state 1276, "((i>=2))" - line 245, "pan.___", state 1284, "(1)" - line 249, "pan.___", state 1292, "(1)" - line 249, "pan.___", state 1293, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 1293, "else" - line 247, "pan.___", state 1298, "((i<1))" - line 247, "pan.___", state 1298, "((i>=1))" - line 253, "pan.___", state 1304, "(1)" - line 253, "pan.___", state 1305, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 1305, "else" - line 257, "pan.___", state 1312, "(1)" - line 257, "pan.___", state 1313, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 1313, "else" - line 262, "pan.___", state 1322, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 1322, "else" - line 295, "pan.___", state 1324, "(cache_dirty_urcu_gp_ctr)" - line 295, "pan.___", state 1324, "else" - line 1112, "pan.___", state 1325, "(cache_dirty_urcu_gp_ctr)" - line 1112, "pan.___", state 1325, "else" - line 272, "pan.___", state 1338, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1351, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1360, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1376, "(1)" - line 249, "pan.___", state 1384, "(1)" - line 253, "pan.___", state 1396, "(1)" - line 257, "pan.___", state 1404, "(1)" - line 268, "pan.___", state 1435, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1444, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1457, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1466, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1482, "(1)" - line 249, "pan.___", state 1490, "(1)" - line 253, "pan.___", state 1502, "(1)" - line 257, "pan.___", state 1510, "(1)" - line 268, "pan.___", state 1527, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 1529, "(1)" - line 272, "pan.___", state 1536, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 1538, "(1)" - line 272, "pan.___", state 1539, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 1539, "else" - line 270, "pan.___", state 1544, "((i<1))" - line 270, "pan.___", state 1544, "((i>=1))" - line 276, "pan.___", state 1549, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 1551, "(1)" - line 276, "pan.___", state 1552, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 1552, "else" - line 280, "pan.___", state 1558, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 1560, "(1)" - line 280, "pan.___", state 1561, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 1561, "else" - line 278, "pan.___", state 1566, "((i<2))" - line 278, "pan.___", state 1566, "((i>=2))" - line 245, "pan.___", state 1574, "(1)" - line 249, "pan.___", state 1582, "(1)" - line 249, "pan.___", state 1583, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 1583, "else" - line 247, "pan.___", state 1588, "((i<1))" - line 247, "pan.___", state 1588, "((i>=1))" - line 253, "pan.___", state 1594, "(1)" - line 253, "pan.___", state 1595, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 1595, "else" - line 257, "pan.___", state 1602, "(1)" - line 257, "pan.___", state 1603, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 1603, "else" - line 262, "pan.___", state 1612, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 1612, "else" - line 1119, "pan.___", state 1615, "i = 0" - line 1119, "pan.___", state 1617, "reader_barrier = 1" - line 1119, "pan.___", state 1628, "((i<1))" - line 1119, "pan.___", state 1628, "((i>=1))" - line 268, "pan.___", state 1633, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 1635, "(1)" - line 272, "pan.___", state 1642, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 1644, "(1)" - line 272, "pan.___", state 1645, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 1645, "else" - line 270, "pan.___", state 1650, "((i<1))" - line 270, "pan.___", state 1650, "((i>=1))" - line 276, "pan.___", state 1655, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 1657, "(1)" - line 276, "pan.___", state 1658, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 1658, "else" - line 280, "pan.___", state 1664, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 1666, "(1)" - line 280, "pan.___", state 1667, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 1667, "else" - line 278, "pan.___", state 1672, "((i<2))" - line 278, "pan.___", state 1672, "((i>=2))" - line 245, "pan.___", state 1680, "(1)" - line 249, "pan.___", state 1688, "(1)" - line 249, "pan.___", state 1689, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 1689, "else" - line 247, "pan.___", state 1694, "((i<1))" - line 247, "pan.___", state 1694, "((i>=1))" - line 253, "pan.___", state 1700, "(1)" - line 253, "pan.___", state 1701, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 1701, "else" - line 257, "pan.___", state 1708, "(1)" - line 257, "pan.___", state 1709, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 1709, "else" - line 262, "pan.___", state 1718, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 1718, "else" - line 295, "pan.___", state 1720, "(cache_dirty_urcu_gp_ctr)" - line 295, "pan.___", state 1720, "else" - line 1119, "pan.___", state 1721, "(cache_dirty_urcu_gp_ctr)" - line 1119, "pan.___", state 1721, "else" - line 1123, "pan.___", state 1724, "-end-" - (312 of 1724 states) -unreached in proctype :init: - line 1138, "pan.___", state 11, "((i<1))" - line 1138, "pan.___", state 11, "((i>=1))" - (1 of 26 states) -unreached in proctype :never: - line 1184, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 23.7 seconds -pan: rate 5259.7381 states/second -pan: avg transition delay 1.5447e-06 usec -cp .input.spin urcu_free_no_mb.spin.input -cp .input.spin.trail urcu_free_no_mb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_mb.spin.input b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_mb.spin.input deleted file mode 100644 index af4dcf5..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_mb.spin.input +++ /dev/null @@ -1,1157 +0,0 @@ -#define NO_MB - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN, READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT, 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT, /* post-dominant */ - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_OUT, /* RAW */ - READ_UNLOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - data_read_first[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_mb.spin.input.trail b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_mb.spin.input.trail deleted file mode 100644 index 37c6ecd..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_mb.spin.input.trail +++ /dev/null @@ -1,1249 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2890 -2:2:1138 -3:2:1143 -4:2:1147 -5:2:1155 -6:2:1159 -7:2:1163 -8:0:2890 -9:1:0 -10:1:5 -11:1:9 -12:1:17 -13:1:21 -14:1:25 -15:0:2890 -16:3:2862 -17:3:2865 -18:3:2870 -19:3:2877 -20:3:2880 -21:3:2884 -22:3:2885 -23:0:2890 -24:3:2887 -25:0:2890 -26:2:1167 -27:0:2890 -28:2:1173 -29:0:2890 -30:2:1174 -31:0:2890 -32:2:1176 -33:0:2890 -34:2:1177 -35:0:2890 -36:2:1178 -37:0:2890 -38:2:1179 -39:0:2890 -40:2:1180 -41:2:1181 -42:2:1185 -43:2:1186 -44:2:1194 -45:2:1195 -46:2:1199 -47:2:1200 -48:2:1208 -49:2:1213 -50:2:1217 -51:2:1218 -52:2:1226 -53:2:1227 -54:2:1231 -55:2:1232 -56:2:1226 -57:2:1227 -58:2:1231 -59:2:1232 -60:2:1240 -61:2:1245 -62:2:1246 -63:2:1257 -64:2:1258 -65:2:1259 -66:2:1270 -67:2:1275 -68:2:1276 -69:2:1287 -70:2:1288 -71:2:1289 -72:2:1287 -73:2:1288 -74:2:1289 -75:2:1300 -76:2:1308 -77:0:2890 -78:2:1179 -79:0:2890 -80:2:1312 -81:2:1316 -82:2:1317 -83:2:1321 -84:2:1325 -85:2:1326 -86:2:1330 -87:2:1338 -88:2:1339 -89:2:1343 -90:2:1347 -91:2:1348 -92:2:1343 -93:2:1344 -94:2:1352 -95:0:2890 -96:2:1179 -97:0:2890 -98:2:1360 -99:2:1361 -100:2:1362 -101:0:2890 -102:2:1179 -103:0:2890 -104:2:1370 -105:0:2890 -106:2:1179 -107:0:2890 -108:2:1373 -109:2:1374 -110:2:1378 -111:2:1379 -112:2:1387 -113:2:1388 -114:2:1392 -115:2:1393 -116:2:1401 -117:2:1406 -118:2:1407 -119:2:1419 -120:2:1420 -121:2:1424 -122:2:1425 -123:2:1419 -124:2:1420 -125:2:1424 -126:2:1425 -127:2:1433 -128:2:1438 -129:2:1439 -130:2:1450 -131:2:1451 -132:2:1452 -133:2:1463 -134:2:1468 -135:2:1469 -136:2:1480 -137:2:1481 -138:2:1482 -139:2:1480 -140:2:1481 -141:2:1482 -142:2:1493 -143:2:1500 -144:0:2890 -145:2:1179 -146:0:2890 -147:2:1504 -148:2:1505 -149:2:1506 -150:2:1518 -151:2:1519 -152:2:1523 -153:2:1524 -154:2:1532 -155:2:1537 -156:2:1541 -157:2:1542 -158:2:1550 -159:2:1551 -160:2:1555 -161:2:1556 -162:2:1550 -163:2:1551 -164:2:1555 -165:2:1556 -166:2:1564 -167:2:1569 -168:2:1570 -169:2:1581 -170:2:1582 -171:2:1583 -172:2:1594 -173:2:1599 -174:2:1600 -175:2:1611 -176:2:1612 -177:2:1613 -178:2:1611 -179:2:1612 -180:2:1613 -181:2:1624 -182:2:1635 -183:2:1636 -184:0:2890 -185:2:1179 -186:0:2890 -187:2:1643 -188:2:1644 -189:2:1648 -190:2:1649 -191:2:1657 -192:2:1658 -193:2:1662 -194:2:1663 -195:2:1671 -196:2:1676 -197:2:1680 -198:2:1681 -199:2:1689 -200:2:1690 -201:2:1694 -202:2:1695 -203:2:1689 -204:2:1690 -205:2:1694 -206:2:1695 -207:2:1703 -208:2:1708 -209:2:1709 -210:2:1720 -211:2:1721 -212:2:1722 -213:2:1733 -214:2:1738 -215:2:1739 -216:2:1750 -217:2:1751 -218:2:1752 -219:2:1750 -220:2:1751 -221:2:1752 -222:2:1763 -223:0:2890 -224:2:1179 -225:0:2890 -226:2:1772 -227:2:1773 -228:2:1777 -229:2:1778 -230:2:1786 -231:2:1787 -232:2:1791 -233:2:1792 -234:2:1800 -235:2:1805 -236:2:1809 -237:2:1810 -238:2:1818 -239:2:1819 -240:2:1823 -241:2:1824 -242:2:1818 -243:2:1819 -244:2:1823 -245:2:1824 -246:2:1832 -247:2:1837 -248:2:1838 -249:2:1849 -250:2:1850 -251:2:1851 -252:2:1862 -253:2:1867 -254:2:1868 -255:2:1879 -256:2:1880 -257:2:1881 -258:2:1879 -259:2:1880 -260:2:1881 -261:2:1892 -262:2:1899 -263:0:2890 -264:2:1179 -265:0:2890 -266:2:1903 -267:2:1904 -268:2:1905 -269:2:1917 -270:2:1918 -271:2:1922 -272:2:1923 -273:2:1931 -274:2:1936 -275:2:1940 -276:2:1941 -277:2:1949 -278:2:1950 -279:2:1954 -280:2:1955 -281:2:1949 -282:2:1950 -283:2:1954 -284:2:1955 -285:2:1963 -286:2:1968 -287:2:1969 -288:2:1980 -289:2:1981 -290:2:1982 -291:2:1993 -292:2:1998 -293:2:1999 -294:2:2010 -295:2:2011 -296:2:2012 -297:2:2010 -298:2:2011 -299:2:2012 -300:2:2023 -301:2:2033 -302:2:2034 -303:0:2890 -304:2:1179 -305:0:2890 -306:2:2043 -307:2:2044 -308:0:2890 -309:2:1179 -310:0:2890 -311:2:2048 -312:0:2890 -313:2:2056 -314:0:2890 -315:2:1174 -316:0:2890 -317:2:1176 -318:0:2890 -319:2:1177 -320:0:2890 -321:2:1178 -322:0:2890 -323:2:1179 -324:0:2890 -325:2:1180 -326:2:1181 -327:2:1185 -328:2:1186 -329:2:1194 -330:2:1195 -331:2:1199 -332:2:1200 -333:2:1208 -334:2:1213 -335:2:1217 -336:2:1218 -337:2:1226 -338:2:1227 -339:2:1228 -340:2:1226 -341:2:1227 -342:2:1231 -343:2:1232 -344:2:1240 -345:2:1245 -346:2:1246 -347:2:1257 -348:2:1258 -349:2:1259 -350:2:1270 -351:2:1275 -352:2:1276 -353:2:1287 -354:2:1288 -355:2:1289 -356:2:1287 -357:2:1288 -358:2:1289 -359:2:1300 -360:2:1308 -361:0:2890 -362:2:1179 -363:0:2890 -364:2:1312 -365:2:1316 -366:2:1317 -367:2:1321 -368:2:1325 -369:2:1326 -370:2:1330 -371:2:1338 -372:2:1339 -373:2:1343 -374:2:1344 -375:2:1343 -376:2:1347 -377:2:1348 -378:2:1352 -379:0:2890 -380:2:1179 -381:0:2890 -382:2:1360 -383:2:1361 -384:2:1362 -385:0:2890 -386:2:1179 -387:0:2890 -388:2:1370 -389:0:2890 -390:2:1179 -391:0:2890 -392:2:1373 -393:2:1374 -394:2:1378 -395:2:1379 -396:2:1387 -397:2:1388 -398:2:1392 -399:2:1393 -400:2:1401 -401:2:1406 -402:2:1407 -403:2:1419 -404:2:1420 -405:2:1424 -406:2:1425 -407:2:1419 -408:2:1420 -409:2:1424 -410:2:1425 -411:2:1433 -412:2:1438 -413:2:1439 -414:2:1450 -415:2:1451 -416:2:1452 -417:2:1463 -418:2:1468 -419:2:1469 -420:2:1480 -421:2:1481 -422:2:1482 -423:2:1480 -424:2:1481 -425:2:1482 -426:2:1493 -427:2:1500 -428:0:2890 -429:2:1179 -430:0:2890 -431:2:1504 -432:2:1505 -433:2:1506 -434:2:1518 -435:2:1519 -436:2:1523 -437:2:1524 -438:2:1532 -439:2:1537 -440:2:1541 -441:2:1542 -442:2:1550 -443:2:1551 -444:2:1555 -445:2:1556 -446:2:1550 -447:2:1551 -448:2:1555 -449:2:1556 -450:2:1564 -451:2:1569 -452:2:1570 -453:2:1581 -454:2:1582 -455:2:1583 -456:2:1594 -457:2:1599 -458:2:1600 -459:2:1611 -460:2:1612 -461:2:1613 -462:2:1611 -463:2:1612 -464:2:1613 -465:2:1624 -466:2:1635 -467:2:1636 -468:0:2890 -469:2:1179 -470:0:2890 -471:2:1643 -472:2:1644 -473:2:1648 -474:2:1649 -475:2:1657 -476:2:1658 -477:2:1662 -478:2:1663 -479:2:1671 -480:2:1676 -481:2:1680 -482:2:1681 -483:2:1689 -484:2:1690 -485:2:1694 -486:2:1695 -487:2:1689 -488:2:1690 -489:2:1694 -490:2:1695 -491:2:1703 -492:2:1708 -493:2:1709 -494:2:1720 -495:2:1721 -496:2:1722 -497:2:1733 -498:2:1738 -499:2:1739 -500:2:1750 -501:2:1751 -502:2:1752 -503:2:1750 -504:2:1751 -505:2:1752 -506:2:1763 -507:0:2890 -508:2:1179 -509:0:2890 -510:2:1772 -511:2:1773 -512:2:1777 -513:2:1778 -514:2:1786 -515:2:1787 -516:2:1791 -517:2:1792 -518:2:1800 -519:2:1805 -520:2:1809 -521:2:1810 -522:2:1818 -523:2:1819 -524:2:1823 -525:2:1824 -526:2:1818 -527:2:1819 -528:2:1823 -529:2:1824 -530:2:1832 -531:2:1837 -532:2:1838 -533:2:1849 -534:2:1850 -535:2:1851 -536:2:1862 -537:2:1867 -538:2:1868 -539:2:1879 -540:2:1880 -541:2:1881 -542:2:1879 -543:2:1880 -544:2:1881 -545:2:1892 -546:2:1899 -547:0:2890 -548:2:1179 -549:0:2890 -550:2:1903 -551:2:1904 -552:2:1905 -553:2:1917 -554:2:1918 -555:2:1922 -556:2:1923 -557:2:1931 -558:2:1936 -559:2:1940 -560:2:1941 -561:2:1949 -562:2:1950 -563:2:1954 -564:2:1955 -565:2:1949 -566:2:1950 -567:2:1954 -568:2:1955 -569:2:1963 -570:2:1968 -571:2:1969 -572:2:1980 -573:2:1981 -574:2:1982 -575:2:1993 -576:2:1998 -577:2:1999 -578:2:2010 -579:2:2011 -580:2:2012 -581:2:2010 -582:2:2011 -583:2:2012 -584:2:2023 -585:2:2033 -586:2:2034 -587:0:2890 -588:2:1179 -589:0:2890 -590:2:2043 -591:2:2044 -592:0:2890 -593:2:1179 -594:0:2890 -595:2:2048 -596:0:2890 -597:2:2056 -598:0:2890 -599:2:1174 -600:0:2890 -601:2:1176 -602:0:2890 -603:2:1177 -604:0:2890 -605:2:1178 -606:0:2890 -607:2:1179 -608:0:2890 -609:2:1180 -610:2:1181 -611:2:1185 -612:2:1186 -613:2:1194 -614:2:1195 -615:2:1199 -616:2:1200 -617:2:1208 -618:2:1213 -619:2:1217 -620:2:1218 -621:2:1226 -622:2:1227 -623:2:1231 -624:2:1232 -625:2:1226 -626:2:1227 -627:2:1228 -628:2:1240 -629:2:1245 -630:2:1246 -631:2:1257 -632:2:1258 -633:2:1259 -634:2:1270 -635:2:1275 -636:2:1276 -637:2:1287 -638:2:1288 -639:2:1289 -640:2:1287 -641:2:1288 -642:2:1289 -643:2:1300 -644:2:1308 -645:0:2890 -646:2:1179 -647:0:2890 -648:2:1312 -649:2:1316 -650:2:1317 -651:2:1321 -652:2:1325 -653:2:1326 -654:2:1330 -655:2:1338 -656:2:1339 -657:2:1343 -658:2:1347 -659:2:1348 -660:2:1343 -661:2:1344 -662:2:1352 -663:0:2890 -664:2:1179 -665:0:2890 -666:2:1360 -667:2:1361 -668:2:1362 -669:0:2890 -670:2:1179 -671:0:2890 -672:2:1370 -673:0:2890 -674:2:1179 -675:0:2890 -676:2:1373 -677:2:1374 -678:2:1378 -679:2:1379 -680:2:1387 -681:2:1388 -682:2:1392 -683:2:1393 -684:2:1401 -685:2:1406 -686:2:1407 -687:2:1419 -688:2:1420 -689:2:1424 -690:2:1425 -691:2:1419 -692:2:1420 -693:2:1424 -694:2:1425 -695:2:1433 -696:2:1438 -697:2:1439 -698:2:1450 -699:2:1451 -700:2:1452 -701:2:1463 -702:2:1468 -703:2:1469 -704:2:1480 -705:2:1481 -706:2:1482 -707:2:1480 -708:2:1481 -709:2:1482 -710:2:1493 -711:2:1500 -712:0:2890 -713:2:1179 -714:0:2890 -715:2:1504 -716:2:1505 -717:2:1506 -718:2:1518 -719:2:1519 -720:2:1523 -721:2:1524 -722:2:1532 -723:2:1537 -724:2:1541 -725:2:1542 -726:2:1550 -727:2:1551 -728:2:1555 -729:2:1556 -730:2:1550 -731:2:1551 -732:2:1555 -733:2:1556 -734:2:1564 -735:2:1569 -736:2:1570 -737:2:1581 -738:2:1582 -739:2:1583 -740:2:1594 -741:2:1599 -742:2:1600 -743:2:1611 -744:2:1612 -745:2:1613 -746:2:1611 -747:2:1612 -748:2:1613 -749:2:1624 -750:2:1635 -751:2:1636 -752:0:2890 -753:2:1179 -754:0:2890 -755:2:1643 -756:2:1644 -757:2:1648 -758:2:1649 -759:2:1657 -760:2:1658 -761:2:1662 -762:2:1663 -763:2:1671 -764:2:1676 -765:2:1680 -766:2:1681 -767:2:1689 -768:2:1690 -769:2:1694 -770:2:1695 -771:2:1689 -772:2:1690 -773:2:1694 -774:2:1695 -775:2:1703 -776:2:1708 -777:2:1709 -778:2:1720 -779:2:1721 -780:2:1722 -781:2:1733 -782:2:1738 -783:2:1739 -784:2:1750 -785:2:1751 -786:2:1752 -787:2:1750 -788:2:1751 -789:2:1752 -790:2:1763 -791:0:2890 -792:2:1179 -793:0:2890 -794:2:1903 -795:2:1904 -796:2:1908 -797:2:1909 -798:2:1917 -799:2:1918 -800:2:1922 -801:2:1923 -802:2:1931 -803:2:1936 -804:2:1940 -805:2:1941 -806:2:1949 -807:2:1950 -808:2:1954 -809:2:1955 -810:2:1949 -811:2:1950 -812:2:1954 -813:2:1955 -814:2:1963 -815:2:1968 -816:2:1969 -817:2:1980 -818:2:1981 -819:2:1982 -820:2:1993 -821:2:1998 -822:2:1999 -823:2:2010 -824:2:2011 -825:2:2012 -826:2:2010 -827:2:2011 -828:2:2012 -829:2:2023 -830:2:2033 -831:2:2034 -832:0:2890 -833:2:1179 -834:0:2890 -835:2:2043 -836:2:2044 -837:0:2890 -838:2:1179 -839:0:2890 -840:2:1772 -841:2:1773 -842:2:1777 -843:2:1778 -844:2:1786 -845:2:1787 -846:2:1791 -847:2:1792 -848:2:1800 -849:2:1805 -850:2:1809 -851:2:1810 -852:2:1818 -853:2:1819 -854:2:1820 -855:2:1818 -856:2:1819 -857:2:1823 -858:2:1824 -859:2:1832 -860:2:1837 -861:2:1838 -862:2:1849 -863:2:1850 -864:2:1851 -865:2:1862 -866:2:1867 -867:2:1868 -868:2:1879 -869:2:1880 -870:2:1881 -871:2:1879 -872:2:1880 -873:2:1881 -874:2:1892 -875:2:1899 -876:0:2890 -877:2:1179 -878:0:2890 -879:2:2048 -880:0:2890 -881:2:2056 -882:0:2890 -883:2:2057 -884:0:2890 -885:2:2062 -886:0:2890 -887:1:29 -888:0:2890 -889:2:2063 -890:0:2890 -891:1:35 -892:0:2890 -893:2:2062 -894:0:2890 -895:1:36 -896:0:2890 -897:2:2063 -898:0:2890 -899:1:37 -900:0:2890 -901:2:2062 -902:0:2890 -903:1:38 -904:0:2890 -905:2:2063 -906:0:2890 -907:1:39 -908:0:2890 -909:2:2062 -910:0:2890 -911:1:40 -912:0:2890 -913:2:2063 -914:0:2890 -915:1:41 -916:0:2890 -917:2:2062 -918:0:2890 -919:1:42 -920:0:2890 -921:2:2063 -922:0:2890 -923:1:43 -924:0:2890 -925:2:2062 -926:0:2890 -927:1:44 -928:0:2890 -929:2:2063 -930:0:2890 -931:1:145 -932:0:2890 -933:2:2062 -934:0:2890 -935:1:147 -936:0:2890 -937:2:2063 -938:0:2890 -939:1:46 -940:0:2890 -941:2:2062 -942:0:2890 -943:1:153 -944:1:154 -945:1:158 -946:1:159 -947:1:167 -948:1:168 -949:1:172 -950:1:173 -951:1:181 -952:1:186 -953:1:190 -954:1:191 -955:1:199 -956:1:200 -957:1:204 -958:1:205 -959:1:199 -960:1:200 -961:1:204 -962:1:205 -963:1:213 -964:1:218 -965:1:219 -966:1:230 -967:1:231 -968:1:232 -969:1:243 -970:1:255 -971:1:256 -972:1:260 -973:1:261 -974:1:262 -975:1:260 -976:1:261 -977:1:262 -978:1:273 -979:0:2890 -980:2:2063 -981:0:2890 -982:1:42 -983:0:2890 -984:2:2062 -985:0:2890 -986:1:43 -987:0:2890 -988:2:2063 -989:0:2890 -990:1:44 -991:0:2890 -992:2:2062 -993:0:2890 -994:1:145 -995:0:2890 -996:2:2063 -997:0:2890 -998:1:147 -999:0:2890 -1000:2:2062 -1001:0:2890 -1002:1:46 -1003:0:2890 -1004:2:2063 -1005:0:2890 -1006:1:282 -1007:1:283 -1008:0:2890 -1009:2:2062 -1010:0:2890 -1011:1:42 -1012:0:2890 -1013:2:2063 -1014:0:2890 -1015:1:43 -1016:0:2890 -1017:2:2062 -1018:0:2890 -1019:1:44 -1020:0:2890 -1021:2:2063 -1022:0:2890 -1023:1:145 -1024:0:2890 -1025:2:2062 -1026:0:2890 -1027:1:147 -1028:0:2890 -1029:2:2063 -1030:0:2890 -1031:1:46 -1032:0:2890 -1033:2:2062 -1034:0:2890 -1035:1:289 -1036:1:290 -1037:1:294 -1038:1:295 -1039:1:303 -1040:1:304 -1041:1:308 -1042:1:309 -1043:1:317 -1044:1:322 -1045:1:326 -1046:1:327 -1047:1:335 -1048:1:336 -1049:1:340 -1050:1:341 -1051:1:335 -1052:1:336 -1053:1:340 -1054:1:341 -1055:1:349 -1056:1:354 -1057:1:355 -1058:1:366 -1059:1:367 -1060:1:368 -1061:1:379 -1062:1:391 -1063:1:392 -1064:1:396 -1065:1:397 -1066:1:398 -1067:1:396 -1068:1:397 -1069:1:398 -1070:1:409 -1071:0:2890 -1072:2:2063 -1073:0:2890 -1074:1:42 -1075:0:2890 -1076:2:2062 -1077:0:2890 -1078:1:43 -1079:0:2890 -1080:2:2063 -1081:0:2890 -1082:1:44 -1083:0:2890 -1084:2:2062 -1085:0:2890 -1086:1:145 -1087:0:2890 -1088:2:2063 -1089:0:2890 -1090:1:147 -1091:0:2890 -1092:2:2062 -1093:0:2890 -1094:1:46 -1095:0:2890 -1096:2:2063 -1097:0:2890 -1098:1:418 -1099:1:419 -1100:1:423 -1101:1:424 -1102:1:432 -1103:1:433 -1104:1:437 -1105:1:438 -1106:1:446 -1107:1:451 -1108:1:455 -1109:1:456 -1110:1:464 -1111:1:465 -1112:1:469 -1113:1:470 -1114:1:464 -1115:1:465 -1116:1:469 -1117:1:470 -1118:1:478 -1119:1:483 -1120:1:484 -1121:1:495 -1122:1:496 -1123:1:497 -1124:1:508 -1125:1:520 -1126:1:521 -1127:1:525 -1128:1:526 -1129:1:527 -1130:1:525 -1131:1:526 -1132:1:527 -1133:1:538 -1134:1:545 -1135:0:2890 -1136:2:2062 -1137:0:2890 -1138:1:42 -1139:0:2890 -1140:2:2063 -1141:0:2890 -1142:1:43 -1143:0:2890 -1144:2:2062 -1145:0:2890 -1146:1:44 -1147:0:2890 -1148:2:2063 -1149:0:2890 -1150:1:145 -1151:0:2890 -1152:2:2062 -1153:0:2890 -1154:1:147 -1155:0:2890 -1156:2:2063 -1157:0:2890 -1158:1:46 -1159:0:2890 -1160:2:2062 -1161:0:2890 -1162:1:683 -1163:1:684 -1164:1:688 -1165:1:689 -1166:1:697 -1167:1:698 -1168:1:699 -1169:1:711 -1170:1:716 -1171:1:720 -1172:1:721 -1173:1:729 -1174:1:730 -1175:1:734 -1176:1:735 -1177:1:729 -1178:1:730 -1179:1:734 -1180:1:735 -1181:1:743 -1182:1:748 -1183:1:749 -1184:1:760 -1185:1:761 -1186:1:762 -1187:1:773 -1188:1:785 -1189:1:786 -1190:1:790 -1191:1:791 -1192:1:792 -1193:1:790 -1194:1:791 -1195:1:792 -1196:1:803 -1197:0:2890 -1198:2:2063 -1199:0:2890 -1200:1:42 -1201:0:2890 -1202:2:2062 -1203:0:2890 -1204:1:43 -1205:0:2890 -1206:2:2063 -1207:0:2890 -1208:1:44 -1209:0:2890 -1210:2:2062 -1211:0:2890 -1212:1:145 -1213:0:2890 -1214:2:2063 -1215:0:2890 -1216:1:147 -1217:0:2890 -1218:2:2062 -1219:0:2890 -1220:1:46 -1221:0:2890 -1222:2:2063 -1223:0:2890 -1224:1:812 -1225:0:2890 -1226:2:2062 -1227:0:2890 -1228:1:1089 -1229:1:1096 -1230:1:1097 -1231:1:1104 -1232:1:1109 -1233:1:1116 -1234:1:1117 -1235:1:1116 -1236:1:1117 -1237:1:1124 -1238:1:1128 -1239:0:2890 -1240:2:2063 -1241:0:2890 -1242:1:814 -1243:1:815 -1244:0:2888 -1245:2:2062 -1246:0:2894 -1247:1:1049 diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_rmb.define b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_rmb.log b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_rmb.log deleted file mode 100644 index 93939dd..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_rmb.log +++ /dev/null @@ -1,329 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_rmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1179) -pan: claim violated! (at depth 1476) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 80 byte, depth reached 3979, errors: 1 - 430584 states, stored - 99483765 states, matched - 99914349 transitions (= stored+matched) -5.7035561e+08 atomic steps -hash conflicts: 13587432 (resolved) - -Stats on memory usage (in Megabytes): - 47.634 equivalent memory usage for states (stored*(State-vector + overhead)) - 20.652 actual memory usage for states (compression: 43.36%) - state-vector as stored = 14 byte + 36 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 486.369 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 7914 682 569 2 2 ] -unreached in proctype urcu_reader - line 713, "pan.___", state 12, "((i<1))" - line 713, "pan.___", state 12, "((i>=1))" - line 268, "pan.___", state 55, "cache_dirty_urcu_gp_ctr = 0" - line 276, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 86, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 102, "(1)" - line 249, "pan.___", state 110, "(1)" - line 253, "pan.___", state 122, "(1)" - line 257, "pan.___", state 130, "(1)" - line 404, "pan.___", state 156, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 188, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 202, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 221, "(1)" - line 431, "pan.___", state 251, "(1)" - line 435, "pan.___", state 264, "(1)" - line 614, "pan.___", state 285, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 404, "pan.___", state 292, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 324, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 338, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 357, "(1)" - line 431, "pan.___", state 387, "(1)" - line 435, "pan.___", state 400, "(1)" - line 404, "pan.___", state 421, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 453, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 467, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 486, "(1)" - line 431, "pan.___", state 516, "(1)" - line 435, "pan.___", state 529, "(1)" - line 404, "pan.___", state 552, "cache_dirty_urcu_gp_ctr = 0" - line 404, "pan.___", state 554, "(1)" - line 404, "pan.___", state 555, "(cache_dirty_urcu_gp_ctr)" - line 404, "pan.___", state 555, "else" - line 404, "pan.___", state 558, "(1)" - line 408, "pan.___", state 566, "cache_dirty_urcu_active_readers = 0" - line 408, "pan.___", state 568, "(1)" - line 408, "pan.___", state 569, "(cache_dirty_urcu_active_readers)" - line 408, "pan.___", state 569, "else" - line 408, "pan.___", state 572, "(1)" - line 408, "pan.___", state 573, "(1)" - line 408, "pan.___", state 573, "(1)" - line 406, "pan.___", state 578, "((i<1))" - line 406, "pan.___", state 578, "((i>=1))" - line 413, "pan.___", state 584, "cache_dirty_rcu_ptr = 0" - line 413, "pan.___", state 586, "(1)" - line 413, "pan.___", state 587, "(cache_dirty_rcu_ptr)" - line 413, "pan.___", state 587, "else" - line 413, "pan.___", state 590, "(1)" - line 413, "pan.___", state 591, "(1)" - line 413, "pan.___", state 591, "(1)" - line 417, "pan.___", state 598, "cache_dirty_rcu_data[i] = 0" - line 417, "pan.___", state 600, "(1)" - line 417, "pan.___", state 601, "(cache_dirty_rcu_data[i])" - line 417, "pan.___", state 601, "else" - line 417, "pan.___", state 604, "(1)" - line 417, "pan.___", state 605, "(1)" - line 417, "pan.___", state 605, "(1)" - line 415, "pan.___", state 610, "((i<2))" - line 415, "pan.___", state 610, "((i>=2))" - line 422, "pan.___", state 617, "(1)" - line 422, "pan.___", state 618, "(!(cache_dirty_urcu_gp_ctr))" - line 422, "pan.___", state 618, "else" - line 422, "pan.___", state 621, "(1)" - line 422, "pan.___", state 622, "(1)" - line 422, "pan.___", state 622, "(1)" - line 426, "pan.___", state 630, "(1)" - line 426, "pan.___", state 631, "(!(cache_dirty_urcu_active_readers))" - line 426, "pan.___", state 631, "else" - line 426, "pan.___", state 634, "(1)" - line 426, "pan.___", state 635, "(1)" - line 426, "pan.___", state 635, "(1)" - line 424, "pan.___", state 640, "((i<1))" - line 424, "pan.___", state 640, "((i>=1))" - line 431, "pan.___", state 647, "(1)" - line 431, "pan.___", state 648, "(!(cache_dirty_rcu_ptr))" - line 431, "pan.___", state 648, "else" - line 431, "pan.___", state 651, "(1)" - line 431, "pan.___", state 652, "(1)" - line 431, "pan.___", state 652, "(1)" - line 435, "pan.___", state 660, "(1)" - line 435, "pan.___", state 661, "(!(cache_dirty_rcu_data[i]))" - line 435, "pan.___", state 661, "else" - line 435, "pan.___", state 664, "(1)" - line 435, "pan.___", state 665, "(1)" - line 435, "pan.___", state 665, "(1)" - line 433, "pan.___", state 670, "((i<2))" - line 433, "pan.___", state 670, "((i>=2))" - line 443, "pan.___", state 674, "(1)" - line 443, "pan.___", state 674, "(1)" - line 614, "pan.___", state 677, "cached_urcu_active_readers = (tmp+1)" - line 614, "pan.___", state 678, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 614, "pan.___", state 679, "(1)" - line 404, "pan.___", state 686, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 718, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 732, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 751, "(1)" - line 431, "pan.___", state 781, "(1)" - line 435, "pan.___", state 794, "(1)" - line 404, "pan.___", state 821, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 853, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 867, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 886, "(1)" - line 431, "pan.___", state 916, "(1)" - line 435, "pan.___", state 929, "(1)" - line 404, "pan.___", state 950, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 982, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 996, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 1015, "(1)" - line 431, "pan.___", state 1045, "(1)" - line 435, "pan.___", state 1058, "(1)" - line 404, "pan.___", state 1091, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 1123, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 1137, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 1156, "(1)" - line 431, "pan.___", state 1186, "(1)" - line 435, "pan.___", state 1199, "(1)" - line 748, "pan.___", state 1220, "-end-" - (95 of 1220 states) -unreached in proctype urcu_writer - line 837, "pan.___", state 12, "((i<1))" - line 837, "pan.___", state 12, "((i>=1))" - line 404, "pan.___", state 45, "cache_dirty_urcu_gp_ctr = 0" - line 404, "pan.___", state 51, "(1)" - line 408, "pan.___", state 59, "cache_dirty_urcu_active_readers = 0" - line 408, "pan.___", state 65, "(1)" - line 408, "pan.___", state 66, "(1)" - line 408, "pan.___", state 66, "(1)" - line 406, "pan.___", state 71, "((i<1))" - line 406, "pan.___", state 71, "((i>=1))" - line 413, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 413, "pan.___", state 83, "(1)" - line 413, "pan.___", state 84, "(1)" - line 413, "pan.___", state 84, "(1)" - line 417, "pan.___", state 97, "(1)" - line 417, "pan.___", state 98, "(1)" - line 417, "pan.___", state 98, "(1)" - line 415, "pan.___", state 103, "((i<2))" - line 415, "pan.___", state 103, "((i>=2))" - line 422, "pan.___", state 110, "(1)" - line 422, "pan.___", state 111, "(!(cache_dirty_urcu_gp_ctr))" - line 422, "pan.___", state 111, "else" - line 422, "pan.___", state 114, "(1)" - line 422, "pan.___", state 115, "(1)" - line 422, "pan.___", state 115, "(1)" - line 426, "pan.___", state 123, "(1)" - line 426, "pan.___", state 124, "(!(cache_dirty_urcu_active_readers))" - line 426, "pan.___", state 124, "else" - line 426, "pan.___", state 127, "(1)" - line 426, "pan.___", state 128, "(1)" - line 426, "pan.___", state 128, "(1)" - line 424, "pan.___", state 133, "((i<1))" - line 424, "pan.___", state 133, "((i>=1))" - line 431, "pan.___", state 140, "(1)" - line 431, "pan.___", state 141, "(!(cache_dirty_rcu_ptr))" - line 431, "pan.___", state 141, "else" - line 431, "pan.___", state 144, "(1)" - line 431, "pan.___", state 145, "(1)" - line 431, "pan.___", state 145, "(1)" - line 435, "pan.___", state 153, "(1)" - line 435, "pan.___", state 154, "(!(cache_dirty_rcu_data[i]))" - line 435, "pan.___", state 154, "else" - line 435, "pan.___", state 157, "(1)" - line 435, "pan.___", state 158, "(1)" - line 435, "pan.___", state 158, "(1)" - line 433, "pan.___", state 163, "((i<2))" - line 433, "pan.___", state 163, "((i>=2))" - line 443, "pan.___", state 167, "(1)" - line 443, "pan.___", state 167, "(1)" - line 268, "pan.___", state 176, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 185, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 198, "cache_dirty_rcu_ptr = 0" - line 404, "pan.___", state 238, "cache_dirty_urcu_gp_ctr = 0" - line 408, "pan.___", state 252, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 270, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 284, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 303, "(1)" - line 426, "pan.___", state 316, "(1)" - line 431, "pan.___", state 333, "(1)" - line 435, "pan.___", state 346, "(1)" - line 408, "pan.___", state 383, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 401, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 415, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 447, "(1)" - line 431, "pan.___", state 464, "(1)" - line 435, "pan.___", state 477, "(1)" - line 408, "pan.___", state 522, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 540, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 554, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 586, "(1)" - line 431, "pan.___", state 603, "(1)" - line 435, "pan.___", state 616, "(1)" - line 408, "pan.___", state 651, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 669, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 683, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 715, "(1)" - line 431, "pan.___", state 732, "(1)" - line 435, "pan.___", state 745, "(1)" - line 408, "pan.___", state 782, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 800, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 814, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 846, "(1)" - line 431, "pan.___", state 863, "(1)" - line 435, "pan.___", state 876, "(1)" - line 268, "pan.___", state 931, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 940, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 955, "(1)" - line 280, "pan.___", state 962, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 978, "(1)" - line 249, "pan.___", state 986, "(1)" - line 253, "pan.___", state 998, "(1)" - line 257, "pan.___", state 1006, "(1)" - line 268, "pan.___", state 1037, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1046, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1059, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1068, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1084, "(1)" - line 249, "pan.___", state 1092, "(1)" - line 253, "pan.___", state 1104, "(1)" - line 257, "pan.___", state 1112, "(1)" - line 272, "pan.___", state 1138, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1151, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1160, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1176, "(1)" - line 249, "pan.___", state 1184, "(1)" - line 253, "pan.___", state 1196, "(1)" - line 257, "pan.___", state 1204, "(1)" - line 268, "pan.___", state 1235, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1244, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1257, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1266, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1282, "(1)" - line 249, "pan.___", state 1290, "(1)" - line 253, "pan.___", state 1302, "(1)" - line 257, "pan.___", state 1310, "(1)" - line 272, "pan.___", state 1336, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1349, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1358, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1374, "(1)" - line 249, "pan.___", state 1382, "(1)" - line 253, "pan.___", state 1394, "(1)" - line 257, "pan.___", state 1402, "(1)" - line 268, "pan.___", state 1433, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1442, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1455, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1464, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1480, "(1)" - line 249, "pan.___", state 1488, "(1)" - line 253, "pan.___", state 1500, "(1)" - line 257, "pan.___", state 1508, "(1)" - line 272, "pan.___", state 1534, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1547, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1556, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1572, "(1)" - line 249, "pan.___", state 1580, "(1)" - line 253, "pan.___", state 1592, "(1)" - line 257, "pan.___", state 1600, "(1)" - line 268, "pan.___", state 1631, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1640, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1653, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1662, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1678, "(1)" - line 249, "pan.___", state 1686, "(1)" - line 253, "pan.___", state 1698, "(1)" - line 257, "pan.___", state 1706, "(1)" - line 1123, "pan.___", state 1722, "-end-" - (129 of 1722 states) -unreached in proctype :init: - line 1138, "pan.___", state 11, "((i<1))" - line 1138, "pan.___", state 11, "((i>=1))" - (1 of 26 states) -unreached in proctype :never: - line 1184, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 155 seconds -pan: rate 2784.0683 states/second -pan: avg transition delay 1.5479e-06 usec -cp .input.spin urcu_free_no_rmb.spin.input -cp .input.spin.trail urcu_free_no_rmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_rmb.spin.input b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_rmb.spin.input deleted file mode 100644 index 44977a8..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_rmb.spin.input +++ /dev/null @@ -1,1157 +0,0 @@ -#define NO_RMB - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN, READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT, 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT, /* post-dominant */ - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_OUT, /* RAW */ - READ_UNLOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - data_read_first[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_rmb.spin.input.trail b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_rmb.spin.input.trail deleted file mode 100644 index 931028a..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_rmb.spin.input.trail +++ /dev/null @@ -1,1479 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2970 -2:2:1220 -3:2:1225 -4:2:1229 -5:2:1237 -6:2:1241 -7:2:1245 -8:0:2970 -9:1:0 -10:1:5 -11:1:9 -12:1:17 -13:1:21 -14:1:25 -15:0:2970 -16:3:2942 -17:3:2945 -18:3:2950 -19:3:2957 -20:3:2960 -21:3:2964 -22:3:2965 -23:0:2970 -24:3:2967 -25:0:2970 -26:2:1249 -27:0:2970 -28:2:1255 -29:0:2970 -30:2:1256 -31:0:2970 -32:2:1258 -33:0:2970 -34:2:1259 -35:0:2970 -36:2:1260 -37:2:1261 -38:2:1265 -39:2:1266 -40:2:1274 -41:2:1275 -42:2:1279 -43:2:1280 -44:2:1288 -45:2:1293 -46:2:1297 -47:2:1298 -48:2:1306 -49:2:1307 -50:2:1311 -51:2:1312 -52:2:1306 -53:2:1307 -54:2:1311 -55:2:1312 -56:2:1320 -57:2:1325 -58:2:1326 -59:2:1337 -60:2:1338 -61:2:1339 -62:2:1350 -63:2:1355 -64:2:1356 -65:2:1367 -66:2:1368 -67:2:1369 -68:2:1367 -69:2:1368 -70:2:1369 -71:2:1380 -72:2:1388 -73:0:2970 -74:2:1259 -75:0:2970 -76:2:1392 -77:2:1396 -78:2:1397 -79:2:1401 -80:2:1405 -81:2:1406 -82:2:1410 -83:2:1418 -84:2:1419 -85:2:1423 -86:2:1427 -87:2:1428 -88:2:1423 -89:2:1424 -90:2:1432 -91:0:2970 -92:2:1259 -93:0:2970 -94:2:1440 -95:2:1441 -96:2:1442 -97:0:2970 -98:2:1259 -99:0:2970 -100:2:1447 -101:0:2970 -102:2:2151 -103:2:2152 -104:2:2156 -105:2:2160 -106:2:2161 -107:2:2165 -108:2:2170 -109:2:2178 -110:2:2182 -111:2:2183 -112:2:2178 -113:2:2182 -114:2:2183 -115:2:2187 -116:2:2194 -117:2:2201 -118:2:2202 -119:2:2209 -120:2:2214 -121:2:2221 -122:2:2222 -123:2:2221 -124:2:2222 -125:2:2229 -126:2:2233 -127:0:2970 -128:2:2238 -129:0:2970 -130:2:2239 -131:0:2970 -132:2:2240 -133:0:2970 -134:2:2241 -135:0:2970 -136:1:29 -137:0:2970 -138:2:2242 -139:0:2970 -140:1:35 -141:0:2970 -142:1:36 -143:0:2970 -144:2:2241 -145:0:2970 -146:1:37 -147:0:2970 -148:2:2242 -149:0:2970 -150:1:38 -151:0:2970 -152:2:2241 -153:0:2970 -154:1:39 -155:0:2970 -156:2:2242 -157:0:2970 -158:1:40 -159:0:2970 -160:1:41 -161:0:2970 -162:2:2241 -163:0:2970 -164:1:42 -165:0:2970 -166:2:2242 -167:0:2970 -168:1:51 -169:0:2970 -170:2:2241 -171:0:2970 -172:1:55 -173:1:56 -174:1:60 -175:1:64 -176:1:65 -177:1:69 -178:1:77 -179:1:78 -180:1:82 -181:1:86 -182:1:87 -183:1:82 -184:1:86 -185:1:87 -186:1:91 -187:1:98 -188:1:105 -189:1:106 -190:1:113 -191:1:118 -192:1:125 -193:1:126 -194:1:125 -195:1:126 -196:1:133 -197:1:137 -198:0:2970 -199:2:2242 -200:0:2970 -201:1:142 -202:0:2970 -203:2:2243 -204:0:2970 -205:2:2248 -206:0:2970 -207:2:2249 -208:0:2970 -209:2:2257 -210:2:2258 -211:2:2262 -212:2:2266 -213:2:2267 -214:2:2271 -215:2:2279 -216:2:2280 -217:2:2284 -218:2:2288 -219:2:2289 -220:2:2284 -221:2:2288 -222:2:2289 -223:2:2293 -224:2:2300 -225:2:2307 -226:2:2308 -227:2:2315 -228:2:2320 -229:2:2327 -230:2:2328 -231:2:2327 -232:2:2328 -233:2:2335 -234:2:2339 -235:0:2970 -236:2:1449 -237:2:2132 -238:0:2970 -239:2:1259 -240:0:2970 -241:2:1450 -242:0:2970 -243:2:1259 -244:0:2970 -245:2:1453 -246:2:1454 -247:2:1458 -248:2:1459 -249:2:1467 -250:2:1468 -251:2:1472 -252:2:1473 -253:2:1481 -254:2:1486 -255:2:1490 -256:2:1491 -257:2:1499 -258:2:1500 -259:2:1504 -260:2:1505 -261:2:1499 -262:2:1500 -263:2:1504 -264:2:1505 -265:2:1513 -266:2:1518 -267:2:1519 -268:2:1530 -269:2:1531 -270:2:1532 -271:2:1543 -272:2:1548 -273:2:1549 -274:2:1560 -275:2:1561 -276:2:1562 -277:2:1560 -278:2:1561 -279:2:1562 -280:2:1573 -281:2:1580 -282:0:2970 -283:2:1259 -284:0:2970 -285:2:1584 -286:2:1585 -287:2:1586 -288:2:1598 -289:2:1599 -290:2:1603 -291:2:1604 -292:2:1612 -293:2:1617 -294:2:1621 -295:2:1622 -296:2:1630 -297:2:1631 -298:2:1635 -299:2:1636 -300:2:1630 -301:2:1631 -302:2:1635 -303:2:1636 -304:2:1644 -305:2:1649 -306:2:1650 -307:2:1661 -308:2:1662 -309:2:1663 -310:2:1674 -311:2:1679 -312:2:1680 -313:2:1691 -314:2:1692 -315:2:1693 -316:2:1691 -317:2:1692 -318:2:1693 -319:2:1704 -320:2:1715 -321:2:1716 -322:0:2970 -323:2:1259 -324:0:2970 -325:2:1723 -326:2:1724 -327:2:1728 -328:2:1729 -329:2:1737 -330:2:1738 -331:2:1742 -332:2:1743 -333:2:1751 -334:2:1756 -335:2:1760 -336:2:1761 -337:2:1769 -338:2:1770 -339:2:1774 -340:2:1775 -341:2:1769 -342:2:1770 -343:2:1774 -344:2:1775 -345:2:1783 -346:2:1788 -347:2:1789 -348:2:1800 -349:2:1801 -350:2:1802 -351:2:1813 -352:2:1818 -353:2:1819 -354:2:1830 -355:2:1831 -356:2:1832 -357:2:1830 -358:2:1831 -359:2:1832 -360:2:1843 -361:0:2970 -362:2:1259 -363:0:2970 -364:2:1852 -365:2:1853 -366:2:1857 -367:2:1858 -368:2:1866 -369:2:1867 -370:2:1871 -371:2:1872 -372:2:1880 -373:2:1885 -374:2:1889 -375:2:1890 -376:2:1898 -377:2:1899 -378:2:1903 -379:2:1904 -380:2:1898 -381:2:1899 -382:2:1903 -383:2:1904 -384:2:1912 -385:2:1917 -386:2:1918 -387:2:1929 -388:2:1930 -389:2:1931 -390:2:1942 -391:2:1947 -392:2:1948 -393:2:1959 -394:2:1960 -395:2:1961 -396:2:1959 -397:2:1960 -398:2:1961 -399:2:1972 -400:2:1979 -401:0:2970 -402:2:1259 -403:0:2970 -404:2:1983 -405:2:1984 -406:2:1985 -407:2:1997 -408:2:1998 -409:2:2002 -410:2:2003 -411:2:2011 -412:2:2016 -413:2:2020 -414:2:2021 -415:2:2029 -416:2:2030 -417:2:2034 -418:2:2035 -419:2:2029 -420:2:2030 -421:2:2034 -422:2:2035 -423:2:2043 -424:2:2048 -425:2:2049 -426:2:2060 -427:2:2061 -428:2:2062 -429:2:2073 -430:2:2078 -431:2:2079 -432:2:2090 -433:2:2091 -434:2:2092 -435:2:2090 -436:2:2091 -437:2:2092 -438:2:2103 -439:2:2113 -440:2:2114 -441:0:2970 -442:2:1259 -443:0:2970 -444:2:2120 -445:0:2970 -446:2:2745 -447:2:2746 -448:2:2750 -449:2:2754 -450:2:2755 -451:2:2759 -452:2:2767 -453:2:2768 -454:2:2772 -455:2:2776 -456:2:2777 -457:2:2772 -458:2:2776 -459:2:2777 -460:2:2781 -461:2:2788 -462:2:2795 -463:2:2796 -464:2:2803 -465:2:2808 -466:2:2815 -467:2:2816 -468:2:2815 -469:2:2816 -470:2:2823 -471:2:2827 -472:0:2970 -473:2:2832 -474:0:2970 -475:2:2833 -476:0:2970 -477:2:2834 -478:0:2970 -479:2:2835 -480:0:2970 -481:1:51 -482:0:2970 -483:2:2836 -484:0:2970 -485:1:55 -486:1:56 -487:1:60 -488:1:64 -489:1:65 -490:1:69 -491:1:77 -492:1:78 -493:1:82 -494:1:86 -495:1:87 -496:1:82 -497:1:86 -498:1:87 -499:1:91 -500:1:98 -501:1:105 -502:1:106 -503:1:113 -504:1:118 -505:1:125 -506:1:126 -507:1:125 -508:1:126 -509:1:133 -510:1:137 -511:0:2970 -512:2:2835 -513:0:2970 -514:1:142 -515:0:2970 -516:2:2836 -517:0:2970 -518:2:2837 -519:0:2970 -520:2:2842 -521:0:2970 -522:2:2843 -523:0:2970 -524:2:2851 -525:2:2852 -526:2:2856 -527:2:2860 -528:2:2861 -529:2:2865 -530:2:2873 -531:2:2874 -532:2:2878 -533:2:2882 -534:2:2883 -535:2:2878 -536:2:2882 -537:2:2883 -538:2:2887 -539:2:2894 -540:2:2901 -541:2:2902 -542:2:2909 -543:2:2914 -544:2:2921 -545:2:2922 -546:2:2921 -547:2:2922 -548:2:2929 -549:2:2933 -550:0:2970 -551:2:2122 -552:2:2132 -553:0:2970 -554:2:1259 -555:0:2970 -556:2:2123 -557:2:2124 -558:0:2970 -559:2:1259 -560:0:2970 -561:2:2128 -562:0:2970 -563:2:2136 -564:0:2970 -565:2:1256 -566:0:2970 -567:2:1258 -568:0:2970 -569:2:1259 -570:0:2970 -571:2:1260 -572:2:1261 -573:2:1265 -574:2:1266 -575:2:1274 -576:2:1275 -577:2:1279 -578:2:1280 -579:2:1288 -580:2:1293 -581:2:1297 -582:2:1298 -583:2:1306 -584:2:1307 -585:2:1308 -586:2:1306 -587:2:1307 -588:2:1311 -589:2:1312 -590:2:1320 -591:2:1325 -592:2:1326 -593:2:1337 -594:2:1338 -595:2:1339 -596:2:1350 -597:2:1355 -598:2:1356 -599:2:1367 -600:2:1368 -601:2:1369 -602:2:1367 -603:2:1368 -604:2:1369 -605:2:1380 -606:2:1388 -607:0:2970 -608:2:1259 -609:0:2970 -610:2:1392 -611:2:1396 -612:2:1397 -613:2:1401 -614:2:1405 -615:2:1406 -616:2:1410 -617:2:1418 -618:2:1419 -619:2:1423 -620:2:1424 -621:2:1423 -622:2:1427 -623:2:1428 -624:2:1432 -625:0:2970 -626:2:1259 -627:0:2970 -628:2:1440 -629:2:1441 -630:2:1442 -631:0:2970 -632:2:1259 -633:0:2970 -634:2:1447 -635:0:2970 -636:2:2151 -637:2:2152 -638:2:2156 -639:2:2160 -640:2:2161 -641:2:2165 -642:2:2170 -643:2:2178 -644:2:2182 -645:2:2183 -646:2:2178 -647:2:2182 -648:2:2183 -649:2:2187 -650:2:2194 -651:2:2201 -652:2:2202 -653:2:2209 -654:2:2214 -655:2:2221 -656:2:2222 -657:2:2221 -658:2:2222 -659:2:2229 -660:2:2233 -661:0:2970 -662:2:2238 -663:0:2970 -664:2:2239 -665:0:2970 -666:2:2240 -667:0:2970 -668:2:2241 -669:0:2970 -670:1:51 -671:0:2970 -672:2:2242 -673:0:2970 -674:1:55 -675:1:56 -676:1:60 -677:1:64 -678:1:65 -679:1:69 -680:1:77 -681:1:78 -682:1:82 -683:1:86 -684:1:87 -685:1:82 -686:1:86 -687:1:87 -688:1:91 -689:1:98 -690:1:105 -691:1:106 -692:1:113 -693:1:118 -694:1:125 -695:1:126 -696:1:125 -697:1:126 -698:1:133 -699:1:137 -700:0:2970 -701:2:2241 -702:0:2970 -703:1:142 -704:0:2970 -705:2:2242 -706:0:2970 -707:2:2243 -708:0:2970 -709:2:2248 -710:0:2970 -711:2:2249 -712:0:2970 -713:2:2257 -714:2:2258 -715:2:2262 -716:2:2266 -717:2:2267 -718:2:2271 -719:2:2279 -720:2:2280 -721:2:2284 -722:2:2288 -723:2:2289 -724:2:2284 -725:2:2288 -726:2:2289 -727:2:2293 -728:2:2300 -729:2:2307 -730:2:2308 -731:2:2315 -732:2:2320 -733:2:2327 -734:2:2328 -735:2:2327 -736:2:2328 -737:2:2335 -738:2:2339 -739:0:2970 -740:2:1449 -741:2:2132 -742:0:2970 -743:2:1259 -744:0:2970 -745:2:1450 -746:0:2970 -747:2:1259 -748:0:2970 -749:2:1453 -750:2:1454 -751:2:1458 -752:2:1459 -753:2:1467 -754:2:1468 -755:2:1472 -756:2:1473 -757:2:1481 -758:2:1486 -759:2:1490 -760:2:1491 -761:2:1499 -762:2:1500 -763:2:1504 -764:2:1505 -765:2:1499 -766:2:1500 -767:2:1504 -768:2:1505 -769:2:1513 -770:2:1518 -771:2:1519 -772:2:1530 -773:2:1531 -774:2:1532 -775:2:1543 -776:2:1548 -777:2:1549 -778:2:1560 -779:2:1561 -780:2:1562 -781:2:1560 -782:2:1561 -783:2:1562 -784:2:1573 -785:2:1580 -786:0:2970 -787:2:1259 -788:0:2970 -789:2:1584 -790:2:1585 -791:2:1586 -792:2:1598 -793:2:1599 -794:2:1603 -795:2:1604 -796:2:1612 -797:2:1617 -798:2:1621 -799:2:1622 -800:2:1630 -801:2:1631 -802:2:1635 -803:2:1636 -804:2:1630 -805:2:1631 -806:2:1635 -807:2:1636 -808:2:1644 -809:2:1649 -810:2:1650 -811:2:1661 -812:2:1662 -813:2:1663 -814:2:1674 -815:2:1679 -816:2:1680 -817:2:1691 -818:2:1692 -819:2:1693 -820:2:1691 -821:2:1692 -822:2:1693 -823:2:1704 -824:2:1715 -825:2:1716 -826:0:2970 -827:2:1259 -828:0:2970 -829:2:1723 -830:2:1724 -831:2:1728 -832:2:1729 -833:2:1737 -834:2:1738 -835:2:1742 -836:2:1743 -837:2:1751 -838:2:1756 -839:2:1760 -840:2:1761 -841:2:1769 -842:2:1770 -843:2:1774 -844:2:1775 -845:2:1769 -846:2:1770 -847:2:1774 -848:2:1775 -849:2:1783 -850:2:1788 -851:2:1789 -852:2:1800 -853:2:1801 -854:2:1802 -855:2:1813 -856:2:1818 -857:2:1819 -858:2:1830 -859:2:1831 -860:2:1832 -861:2:1830 -862:2:1831 -863:2:1832 -864:2:1843 -865:0:2970 -866:2:1259 -867:0:2970 -868:2:1852 -869:2:1853 -870:2:1857 -871:2:1858 -872:2:1866 -873:2:1867 -874:2:1871 -875:2:1872 -876:2:1880 -877:2:1885 -878:2:1889 -879:2:1890 -880:2:1898 -881:2:1899 -882:2:1903 -883:2:1904 -884:2:1898 -885:2:1899 -886:2:1903 -887:2:1904 -888:2:1912 -889:2:1917 -890:2:1918 -891:2:1929 -892:2:1930 -893:2:1931 -894:2:1942 -895:2:1947 -896:2:1948 -897:2:1959 -898:2:1960 -899:2:1961 -900:2:1959 -901:2:1960 -902:2:1961 -903:2:1972 -904:2:1979 -905:0:2970 -906:2:1259 -907:0:2970 -908:2:1983 -909:2:1984 -910:2:1985 -911:2:1997 -912:2:1998 -913:2:2002 -914:2:2003 -915:2:2011 -916:2:2016 -917:2:2020 -918:2:2021 -919:2:2029 -920:2:2030 -921:2:2034 -922:2:2035 -923:2:2029 -924:2:2030 -925:2:2034 -926:2:2035 -927:2:2043 -928:2:2048 -929:2:2049 -930:2:2060 -931:2:2061 -932:2:2062 -933:2:2073 -934:2:2078 -935:2:2079 -936:2:2090 -937:2:2091 -938:2:2092 -939:2:2090 -940:2:2091 -941:2:2092 -942:2:2103 -943:2:2113 -944:2:2114 -945:0:2970 -946:2:1259 -947:0:2970 -948:2:2120 -949:0:2970 -950:2:2745 -951:2:2746 -952:2:2750 -953:2:2754 -954:2:2755 -955:2:2759 -956:2:2767 -957:2:2768 -958:2:2772 -959:2:2776 -960:2:2777 -961:2:2772 -962:2:2776 -963:2:2777 -964:2:2781 -965:2:2788 -966:2:2795 -967:2:2796 -968:2:2803 -969:2:2808 -970:2:2815 -971:2:2816 -972:2:2815 -973:2:2816 -974:2:2823 -975:2:2827 -976:0:2970 -977:2:2832 -978:0:2970 -979:2:2833 -980:0:2970 -981:2:2834 -982:0:2970 -983:2:2835 -984:0:2970 -985:1:51 -986:0:2970 -987:2:2836 -988:0:2970 -989:1:55 -990:1:56 -991:1:60 -992:1:64 -993:1:65 -994:1:69 -995:1:77 -996:1:78 -997:1:82 -998:1:86 -999:1:87 -1000:1:82 -1001:1:86 -1002:1:87 -1003:1:91 -1004:1:98 -1005:1:105 -1006:1:106 -1007:1:113 -1008:1:118 -1009:1:125 -1010:1:126 -1011:1:125 -1012:1:126 -1013:1:133 -1014:1:137 -1015:0:2970 -1016:2:2835 -1017:0:2970 -1018:1:142 -1019:0:2970 -1020:2:2836 -1021:0:2970 -1022:2:2837 -1023:0:2970 -1024:2:2842 -1025:0:2970 -1026:2:2843 -1027:0:2970 -1028:2:2851 -1029:2:2852 -1030:2:2856 -1031:2:2860 -1032:2:2861 -1033:2:2865 -1034:2:2873 -1035:2:2874 -1036:2:2878 -1037:2:2882 -1038:2:2883 -1039:2:2878 -1040:2:2882 -1041:2:2883 -1042:2:2887 -1043:2:2894 -1044:2:2901 -1045:2:2902 -1046:2:2909 -1047:2:2914 -1048:2:2921 -1049:2:2922 -1050:2:2921 -1051:2:2922 -1052:2:2929 -1053:2:2933 -1054:0:2970 -1055:2:2122 -1056:2:2132 -1057:0:2970 -1058:2:1259 -1059:0:2970 -1060:2:2123 -1061:2:2124 -1062:0:2970 -1063:2:1259 -1064:0:2970 -1065:2:2128 -1066:0:2970 -1067:2:2136 -1068:0:2970 -1069:2:1256 -1070:0:2970 -1071:2:1258 -1072:0:2970 -1073:2:1259 -1074:0:2970 -1075:2:1260 -1076:2:1261 -1077:2:1265 -1078:2:1266 -1079:2:1274 -1080:2:1275 -1081:2:1279 -1082:2:1280 -1083:2:1288 -1084:2:1293 -1085:2:1297 -1086:2:1298 -1087:2:1306 -1088:2:1307 -1089:2:1311 -1090:2:1312 -1091:2:1306 -1092:2:1307 -1093:2:1308 -1094:2:1320 -1095:2:1325 -1096:2:1326 -1097:2:1337 -1098:2:1338 -1099:2:1339 -1100:2:1350 -1101:2:1355 -1102:2:1356 -1103:2:1367 -1104:2:1368 -1105:2:1369 -1106:2:1367 -1107:2:1368 -1108:2:1369 -1109:2:1380 -1110:2:1388 -1111:0:2970 -1112:2:1259 -1113:0:2970 -1114:1:143 -1115:0:2970 -1116:1:145 -1117:0:2970 -1118:1:44 -1119:0:2970 -1120:1:151 -1121:1:152 -1122:1:156 -1123:1:157 -1124:1:165 -1125:1:166 -1126:1:170 -1127:1:171 -1128:1:179 -1129:1:184 -1130:1:188 -1131:1:189 -1132:1:197 -1133:1:198 -1134:1:202 -1135:1:203 -1136:1:197 -1137:1:198 -1138:1:202 -1139:1:203 -1140:1:211 -1141:1:216 -1142:1:217 -1143:1:228 -1144:1:229 -1145:1:230 -1146:1:241 -1147:1:246 -1148:1:247 -1149:1:258 -1150:1:259 -1151:1:260 -1152:1:258 -1153:1:259 -1154:1:260 -1155:1:271 -1156:0:2970 -1157:1:40 -1158:0:2970 -1159:1:41 -1160:0:2970 -1161:2:1392 -1162:2:1396 -1163:2:1397 -1164:2:1401 -1165:2:1405 -1166:2:1406 -1167:2:1410 -1168:2:1418 -1169:2:1419 -1170:2:1423 -1171:2:1427 -1172:2:1428 -1173:2:1423 -1174:2:1424 -1175:2:1432 -1176:0:2970 -1177:2:1259 -1178:0:2970 -1179:2:1440 -1180:2:1441 -1181:2:1442 -1182:0:2970 -1183:2:1259 -1184:0:2970 -1185:2:1447 -1186:0:2970 -1187:2:2151 -1188:2:2152 -1189:2:2156 -1190:2:2160 -1191:2:2161 -1192:2:2165 -1193:2:2170 -1194:2:2178 -1195:2:2182 -1196:2:2183 -1197:2:2178 -1198:2:2182 -1199:2:2183 -1200:2:2187 -1201:2:2194 -1202:2:2201 -1203:2:2202 -1204:2:2209 -1205:2:2214 -1206:2:2221 -1207:2:2222 -1208:2:2221 -1209:2:2222 -1210:2:2229 -1211:2:2233 -1212:0:2970 -1213:2:2238 -1214:0:2970 -1215:2:2239 -1216:0:2970 -1217:2:2240 -1218:0:2970 -1219:2:2241 -1220:0:2970 -1221:1:42 -1222:0:2970 -1223:2:2242 -1224:0:2970 -1225:1:143 -1226:0:2970 -1227:1:145 -1228:0:2970 -1229:2:2241 -1230:0:2970 -1231:1:44 -1232:0:2970 -1233:2:2242 -1234:0:2970 -1235:1:280 -1236:1:281 -1237:0:2970 -1238:1:40 -1239:0:2970 -1240:1:41 -1241:0:2970 -1242:2:2241 -1243:0:2970 -1244:1:42 -1245:0:2970 -1246:2:2242 -1247:0:2970 -1248:1:143 -1249:0:2970 -1250:1:145 -1251:0:2970 -1252:2:2241 -1253:0:2970 -1254:1:44 -1255:0:2970 -1256:2:2242 -1257:0:2970 -1258:1:287 -1259:1:288 -1260:1:292 -1261:1:293 -1262:1:301 -1263:1:302 -1264:1:306 -1265:1:307 -1266:1:315 -1267:1:320 -1268:1:324 -1269:1:325 -1270:1:333 -1271:1:334 -1272:1:338 -1273:1:339 -1274:1:333 -1275:1:334 -1276:1:338 -1277:1:339 -1278:1:347 -1279:1:352 -1280:1:353 -1281:1:364 -1282:1:365 -1283:1:366 -1284:1:377 -1285:1:382 -1286:1:383 -1287:1:394 -1288:1:395 -1289:1:396 -1290:1:394 -1291:1:402 -1292:1:403 -1293:1:407 -1294:0:2970 -1295:1:40 -1296:0:2970 -1297:1:41 -1298:0:2970 -1299:2:2241 -1300:0:2970 -1301:1:42 -1302:0:2970 -1303:2:2242 -1304:0:2970 -1305:1:143 -1306:0:2970 -1307:1:145 -1308:0:2970 -1309:2:2241 -1310:0:2970 -1311:1:44 -1312:0:2970 -1313:2:2242 -1314:0:2970 -1315:1:416 -1316:1:417 -1317:1:421 -1318:1:422 -1319:1:430 -1320:1:431 -1321:1:435 -1322:1:436 -1323:1:444 -1324:1:449 -1325:1:453 -1326:1:454 -1327:1:462 -1328:1:463 -1329:1:467 -1330:1:468 -1331:1:462 -1332:1:463 -1333:1:467 -1334:1:468 -1335:1:476 -1336:1:481 -1337:1:482 -1338:1:493 -1339:1:494 -1340:1:495 -1341:1:506 -1342:1:511 -1343:1:512 -1344:1:523 -1345:1:524 -1346:1:525 -1347:1:523 -1348:1:531 -1349:1:532 -1350:1:536 -1351:1:543 -1352:0:2970 -1353:1:40 -1354:0:2970 -1355:1:41 -1356:0:2970 -1357:2:2241 -1358:0:2970 -1359:1:42 -1360:0:2970 -1361:2:2242 -1362:0:2970 -1363:1:143 -1364:0:2970 -1365:1:145 -1366:0:2970 -1367:2:2241 -1368:0:2970 -1369:1:44 -1370:0:2970 -1371:2:2242 -1372:0:2970 -1373:1:681 -1374:1:682 -1375:1:686 -1376:1:687 -1377:1:695 -1378:1:696 -1379:1:697 -1380:1:709 -1381:1:714 -1382:1:718 -1383:1:719 -1384:1:727 -1385:1:728 -1386:1:732 -1387:1:733 -1388:1:727 -1389:1:728 -1390:1:732 -1391:1:733 -1392:1:741 -1393:1:746 -1394:1:747 -1395:1:758 -1396:1:759 -1397:1:760 -1398:1:771 -1399:1:776 -1400:1:777 -1401:1:788 -1402:1:789 -1403:1:790 -1404:1:788 -1405:1:796 -1406:1:797 -1407:1:801 -1408:0:2970 -1409:1:40 -1410:0:2970 -1411:1:41 -1412:0:2970 -1413:2:2241 -1414:0:2970 -1415:1:42 -1416:0:2970 -1417:2:2242 -1418:0:2970 -1419:1:143 -1420:0:2970 -1421:1:145 -1422:0:2970 -1423:2:2241 -1424:0:2970 -1425:1:44 -1426:0:2970 -1427:2:2242 -1428:0:2970 -1429:1:810 -1430:0:2970 -1431:2:2241 -1432:0:2970 -1433:1:1087 -1434:1:1091 -1435:1:1092 -1436:1:1100 -1437:1:1101 -1438:1:1105 -1439:1:1106 -1440:1:1114 -1441:1:1119 -1442:1:1123 -1443:1:1124 -1444:1:1132 -1445:1:1133 -1446:1:1137 -1447:1:1138 -1448:1:1132 -1449:1:1133 -1450:1:1137 -1451:1:1138 -1452:1:1146 -1453:1:1151 -1454:1:1152 -1455:1:1163 -1456:1:1164 -1457:1:1165 -1458:1:1176 -1459:1:1181 -1460:1:1182 -1461:1:1193 -1462:1:1194 -1463:1:1195 -1464:1:1193 -1465:1:1201 -1466:1:1202 -1467:1:1206 -1468:1:1210 -1469:0:2970 -1470:2:2242 -1471:0:2970 -1472:1:812 -1473:1:813 -1474:0:2968 -1475:1:40 -1476:0:2974 -1477:1:1060 diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_wmb.define b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_wmb.log b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_wmb.log deleted file mode 100644 index deef6fa..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_wmb.log +++ /dev/null @@ -1,298 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_wmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1179) -Depth= 3829 States= 1e+06 Transitions= 2.15e+08 Memory= 512.834 t= 341 R= 3e+03 -Depth= 3829 States= 2e+06 Transitions= 5.61e+08 Memory= 559.026 t= 920 R= 2e+03 -pan: claim violated! (at depth 1358) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 80 byte, depth reached 3829, errors: 1 - 2932262 states, stored -7.8211443e+08 states, matched -7.850467e+08 transitions (= stored+matched) -4.5802467e+09 atomic steps -hash conflicts: 5.9075827e+08 (resolved) - -Stats on memory usage (in Megabytes): - 324.385 equivalent memory usage for states (stored*(State-vector + overhead)) - 136.208 actual memory usage for states (compression: 41.99%) - state-vector as stored = 13 byte + 36 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 601.897 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 22861 1831 2500 2 2 ] -unreached in proctype urcu_reader - line 713, "pan.___", state 12, "((i<1))" - line 713, "pan.___", state 12, "((i>=1))" - line 268, "pan.___", state 55, "cache_dirty_urcu_gp_ctr = 0" - line 276, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 86, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 102, "(1)" - line 249, "pan.___", state 110, "(1)" - line 253, "pan.___", state 122, "(1)" - line 257, "pan.___", state 130, "(1)" - line 404, "pan.___", state 156, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 188, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 202, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 221, "(1)" - line 431, "pan.___", state 251, "(1)" - line 435, "pan.___", state 264, "(1)" - line 614, "pan.___", state 285, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 404, "pan.___", state 292, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 324, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 338, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 357, "(1)" - line 431, "pan.___", state 387, "(1)" - line 435, "pan.___", state 400, "(1)" - line 404, "pan.___", state 421, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 453, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 467, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 486, "(1)" - line 431, "pan.___", state 516, "(1)" - line 435, "pan.___", state 529, "(1)" - line 404, "pan.___", state 552, "cache_dirty_urcu_gp_ctr = 0" - line 404, "pan.___", state 554, "(1)" - line 404, "pan.___", state 555, "(cache_dirty_urcu_gp_ctr)" - line 404, "pan.___", state 555, "else" - line 404, "pan.___", state 558, "(1)" - line 408, "pan.___", state 566, "cache_dirty_urcu_active_readers = 0" - line 408, "pan.___", state 568, "(1)" - line 408, "pan.___", state 569, "(cache_dirty_urcu_active_readers)" - line 408, "pan.___", state 569, "else" - line 408, "pan.___", state 572, "(1)" - line 408, "pan.___", state 573, "(1)" - line 408, "pan.___", state 573, "(1)" - line 406, "pan.___", state 578, "((i<1))" - line 406, "pan.___", state 578, "((i>=1))" - line 413, "pan.___", state 584, "cache_dirty_rcu_ptr = 0" - line 413, "pan.___", state 586, "(1)" - line 413, "pan.___", state 587, "(cache_dirty_rcu_ptr)" - line 413, "pan.___", state 587, "else" - line 413, "pan.___", state 590, "(1)" - line 413, "pan.___", state 591, "(1)" - line 413, "pan.___", state 591, "(1)" - line 417, "pan.___", state 598, "cache_dirty_rcu_data[i] = 0" - line 417, "pan.___", state 600, "(1)" - line 417, "pan.___", state 601, "(cache_dirty_rcu_data[i])" - line 417, "pan.___", state 601, "else" - line 417, "pan.___", state 604, "(1)" - line 417, "pan.___", state 605, "(1)" - line 417, "pan.___", state 605, "(1)" - line 415, "pan.___", state 610, "((i<2))" - line 415, "pan.___", state 610, "((i>=2))" - line 422, "pan.___", state 617, "(1)" - line 422, "pan.___", state 618, "(!(cache_dirty_urcu_gp_ctr))" - line 422, "pan.___", state 618, "else" - line 422, "pan.___", state 621, "(1)" - line 422, "pan.___", state 622, "(1)" - line 422, "pan.___", state 622, "(1)" - line 426, "pan.___", state 630, "(1)" - line 426, "pan.___", state 631, "(!(cache_dirty_urcu_active_readers))" - line 426, "pan.___", state 631, "else" - line 426, "pan.___", state 634, "(1)" - line 426, "pan.___", state 635, "(1)" - line 426, "pan.___", state 635, "(1)" - line 424, "pan.___", state 640, "((i<1))" - line 424, "pan.___", state 640, "((i>=1))" - line 431, "pan.___", state 647, "(1)" - line 431, "pan.___", state 648, "(!(cache_dirty_rcu_ptr))" - line 431, "pan.___", state 648, "else" - line 431, "pan.___", state 651, "(1)" - line 431, "pan.___", state 652, "(1)" - line 431, "pan.___", state 652, "(1)" - line 435, "pan.___", state 660, "(1)" - line 435, "pan.___", state 661, "(!(cache_dirty_rcu_data[i]))" - line 435, "pan.___", state 661, "else" - line 435, "pan.___", state 664, "(1)" - line 435, "pan.___", state 665, "(1)" - line 435, "pan.___", state 665, "(1)" - line 433, "pan.___", state 670, "((i<2))" - line 433, "pan.___", state 670, "((i>=2))" - line 443, "pan.___", state 674, "(1)" - line 443, "pan.___", state 674, "(1)" - line 614, "pan.___", state 677, "cached_urcu_active_readers = (tmp+1)" - line 614, "pan.___", state 678, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 614, "pan.___", state 679, "(1)" - line 404, "pan.___", state 686, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 718, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 732, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 751, "(1)" - line 431, "pan.___", state 781, "(1)" - line 435, "pan.___", state 794, "(1)" - line 404, "pan.___", state 821, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 853, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 867, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 886, "(1)" - line 431, "pan.___", state 916, "(1)" - line 435, "pan.___", state 929, "(1)" - line 404, "pan.___", state 950, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 982, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 996, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 1015, "(1)" - line 431, "pan.___", state 1045, "(1)" - line 435, "pan.___", state 1058, "(1)" - line 245, "pan.___", state 1091, "(1)" - line 253, "pan.___", state 1111, "(1)" - line 257, "pan.___", state 1119, "(1)" - line 748, "pan.___", state 1136, "-end-" - (92 of 1136 states) -unreached in proctype urcu_writer - line 837, "pan.___", state 12, "((i<1))" - line 837, "pan.___", state 12, "((i>=1))" - line 404, "pan.___", state 46, "cache_dirty_urcu_gp_ctr = 0" - line 408, "pan.___", state 60, "cache_dirty_urcu_active_readers = 0" - line 422, "pan.___", state 111, "(1)" - line 426, "pan.___", state 124, "(1)" - line 268, "pan.___", state 177, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 179, "(1)" - line 272, "pan.___", state 186, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 188, "(1)" - line 272, "pan.___", state 189, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 189, "else" - line 270, "pan.___", state 194, "((i<1))" - line 270, "pan.___", state 194, "((i>=1))" - line 276, "pan.___", state 199, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 201, "(1)" - line 276, "pan.___", state 202, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 202, "else" - line 280, "pan.___", state 208, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 210, "(1)" - line 280, "pan.___", state 211, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 211, "else" - line 285, "pan.___", state 220, "(cache_dirty_urcu_gp_ctr)" - line 285, "pan.___", state 220, "else" - line 404, "pan.___", state 239, "cache_dirty_urcu_gp_ctr = 0" - line 408, "pan.___", state 253, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 271, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 285, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 304, "(1)" - line 426, "pan.___", state 317, "(1)" - line 431, "pan.___", state 334, "(1)" - line 435, "pan.___", state 347, "(1)" - line 408, "pan.___", state 384, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 402, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 416, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 448, "(1)" - line 431, "pan.___", state 465, "(1)" - line 435, "pan.___", state 478, "(1)" - line 408, "pan.___", state 523, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 541, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 555, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 587, "(1)" - line 431, "pan.___", state 604, "(1)" - line 435, "pan.___", state 617, "(1)" - line 408, "pan.___", state 652, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 670, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 684, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 716, "(1)" - line 431, "pan.___", state 733, "(1)" - line 435, "pan.___", state 746, "(1)" - line 408, "pan.___", state 783, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 801, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 815, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 847, "(1)" - line 431, "pan.___", state 864, "(1)" - line 435, "pan.___", state 877, "(1)" - line 268, "pan.___", state 932, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 941, "cache_dirty_urcu_active_readers = 0" - line 245, "pan.___", state 979, "(1)" - line 249, "pan.___", state 987, "(1)" - line 253, "pan.___", state 999, "(1)" - line 257, "pan.___", state 1007, "(1)" - line 268, "pan.___", state 1038, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1047, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1060, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1069, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1085, "(1)" - line 249, "pan.___", state 1093, "(1)" - line 253, "pan.___", state 1105, "(1)" - line 257, "pan.___", state 1113, "(1)" - line 272, "pan.___", state 1139, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1152, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1161, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1177, "(1)" - line 249, "pan.___", state 1185, "(1)" - line 253, "pan.___", state 1197, "(1)" - line 257, "pan.___", state 1205, "(1)" - line 268, "pan.___", state 1236, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1245, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1258, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1267, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1283, "(1)" - line 249, "pan.___", state 1291, "(1)" - line 253, "pan.___", state 1303, "(1)" - line 257, "pan.___", state 1311, "(1)" - line 272, "pan.___", state 1337, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1350, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1359, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1375, "(1)" - line 249, "pan.___", state 1383, "(1)" - line 253, "pan.___", state 1395, "(1)" - line 257, "pan.___", state 1403, "(1)" - line 268, "pan.___", state 1434, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1443, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1456, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1465, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1481, "(1)" - line 249, "pan.___", state 1489, "(1)" - line 253, "pan.___", state 1501, "(1)" - line 257, "pan.___", state 1509, "(1)" - line 272, "pan.___", state 1535, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1548, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1557, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1573, "(1)" - line 249, "pan.___", state 1581, "(1)" - line 253, "pan.___", state 1593, "(1)" - line 257, "pan.___", state 1601, "(1)" - line 268, "pan.___", state 1632, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1641, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1654, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1663, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1679, "(1)" - line 249, "pan.___", state 1687, "(1)" - line 253, "pan.___", state 1699, "(1)" - line 257, "pan.___", state 1707, "(1)" - line 1123, "pan.___", state 1723, "-end-" - (110 of 1723 states) -unreached in proctype :init: - line 1138, "pan.___", state 11, "((i<1))" - line 1138, "pan.___", state 11, "((i>=1))" - (1 of 26 states) -unreached in proctype :never: - line 1184, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 1.31e+03 seconds -pan: rate 2245.8255 states/second -pan: avg transition delay 1.6631e-06 usec -cp .input.spin urcu_free_no_wmb.spin.input -cp .input.spin.trail urcu_free_no_wmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_wmb.spin.input b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_wmb.spin.input deleted file mode 100644 index b79ec79..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_wmb.spin.input +++ /dev/null @@ -1,1157 +0,0 @@ -#define NO_WMB - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN, READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT, 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT, /* post-dominant */ - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_OUT, /* RAW */ - READ_UNLOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - data_read_first[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_wmb.spin.input.trail deleted file mode 100644 index 4b13aef..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_no_wmb.spin.input.trail +++ /dev/null @@ -1,1361 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2887 -2:2:1136 -3:2:1141 -4:2:1145 -5:2:1153 -6:2:1157 -7:2:1161 -8:0:2887 -9:1:0 -10:1:5 -11:1:9 -12:1:17 -13:1:21 -14:1:25 -15:0:2887 -16:3:2859 -17:3:2862 -18:3:2867 -19:3:2874 -20:3:2877 -21:3:2881 -22:3:2882 -23:0:2887 -24:3:2884 -25:0:2887 -26:2:1165 -27:0:2887 -28:2:1171 -29:0:2887 -30:2:1172 -31:0:2887 -32:2:1174 -33:0:2887 -34:2:1175 -35:0:2887 -36:2:1176 -37:0:2887 -38:2:1177 -39:2:1178 -40:2:1182 -41:2:1183 -42:2:1191 -43:2:1192 -44:2:1196 -45:2:1197 -46:2:1205 -47:2:1210 -48:2:1214 -49:2:1215 -50:2:1223 -51:2:1224 -52:2:1228 -53:2:1229 -54:2:1223 -55:2:1224 -56:2:1228 -57:2:1229 -58:2:1237 -59:2:1242 -60:2:1243 -61:2:1254 -62:2:1255 -63:2:1256 -64:2:1267 -65:2:1272 -66:2:1273 -67:2:1284 -68:2:1285 -69:2:1286 -70:2:1284 -71:2:1285 -72:2:1286 -73:2:1297 -74:2:1305 -75:0:2887 -76:2:1176 -77:0:2887 -78:2:1357 -79:2:1358 -80:2:1359 -81:0:2887 -82:2:1176 -83:0:2887 -84:2:1364 -85:0:2887 -86:2:2068 -87:2:2069 -88:2:2073 -89:2:2077 -90:2:2078 -91:2:2082 -92:2:2087 -93:2:2095 -94:2:2099 -95:2:2100 -96:2:2095 -97:2:2096 -98:2:2104 -99:2:2111 -100:2:2118 -101:2:2119 -102:2:2126 -103:2:2131 -104:2:2138 -105:2:2139 -106:2:2138 -107:2:2139 -108:2:2146 -109:2:2150 -110:0:2887 -111:2:2155 -112:0:2887 -113:2:2156 -114:0:2887 -115:2:2157 -116:0:2887 -117:2:2158 -118:0:2887 -119:1:29 -120:0:2887 -121:2:2159 -122:0:2887 -123:1:35 -124:0:2887 -125:1:36 -126:0:2887 -127:2:2158 -128:0:2887 -129:1:37 -130:0:2887 -131:2:2159 -132:0:2887 -133:1:38 -134:0:2887 -135:2:2158 -136:0:2887 -137:1:39 -138:0:2887 -139:2:2159 -140:0:2887 -141:1:40 -142:0:2887 -143:1:41 -144:0:2887 -145:2:2158 -146:0:2887 -147:1:42 -148:0:2887 -149:2:2159 -150:0:2887 -151:1:51 -152:0:2887 -153:2:2158 -154:0:2887 -155:1:55 -156:1:56 -157:1:60 -158:1:64 -159:1:65 -160:1:69 -161:1:77 -162:1:78 -163:1:82 -164:1:86 -165:1:87 -166:1:82 -167:1:86 -168:1:87 -169:1:91 -170:1:98 -171:1:105 -172:1:106 -173:1:113 -174:1:118 -175:1:125 -176:1:126 -177:1:125 -178:1:126 -179:1:133 -180:1:137 -181:0:2887 -182:2:2159 -183:0:2887 -184:1:142 -185:0:2887 -186:2:2160 -187:0:2887 -188:2:2165 -189:0:2887 -190:2:2166 -191:0:2887 -192:2:2174 -193:2:2175 -194:2:2179 -195:2:2183 -196:2:2184 -197:2:2188 -198:2:2196 -199:2:2197 -200:2:2201 -201:2:2205 -202:2:2206 -203:2:2201 -204:2:2205 -205:2:2206 -206:2:2210 -207:2:2217 -208:2:2224 -209:2:2225 -210:2:2232 -211:2:2237 -212:2:2244 -213:2:2245 -214:2:2244 -215:2:2245 -216:2:2252 -217:2:2256 -218:0:2887 -219:2:1366 -220:2:2049 -221:0:2887 -222:2:1176 -223:0:2887 -224:2:1367 -225:0:2887 -226:2:1176 -227:0:2887 -228:2:1370 -229:2:1371 -230:2:1375 -231:2:1376 -232:2:1384 -233:2:1385 -234:2:1389 -235:2:1390 -236:2:1398 -237:2:1403 -238:2:1407 -239:2:1408 -240:2:1416 -241:2:1417 -242:2:1421 -243:2:1422 -244:2:1416 -245:2:1417 -246:2:1421 -247:2:1422 -248:2:1430 -249:2:1435 -250:2:1436 -251:2:1447 -252:2:1448 -253:2:1449 -254:2:1460 -255:2:1465 -256:2:1466 -257:2:1477 -258:2:1478 -259:2:1479 -260:2:1477 -261:2:1478 -262:2:1479 -263:2:1490 -264:2:1497 -265:0:2887 -266:2:1176 -267:0:2887 -268:2:1501 -269:2:1502 -270:2:1503 -271:2:1515 -272:2:1516 -273:2:1520 -274:2:1521 -275:2:1529 -276:2:1534 -277:2:1538 -278:2:1539 -279:2:1547 -280:2:1548 -281:2:1552 -282:2:1553 -283:2:1547 -284:2:1548 -285:2:1552 -286:2:1553 -287:2:1561 -288:2:1566 -289:2:1567 -290:2:1578 -291:2:1579 -292:2:1580 -293:2:1591 -294:2:1596 -295:2:1597 -296:2:1608 -297:2:1609 -298:2:1610 -299:2:1608 -300:2:1609 -301:2:1610 -302:2:1621 -303:2:1632 -304:2:1633 -305:0:2887 -306:2:1176 -307:0:2887 -308:2:1640 -309:2:1641 -310:2:1645 -311:2:1646 -312:2:1654 -313:2:1655 -314:2:1659 -315:2:1660 -316:2:1668 -317:2:1673 -318:2:1677 -319:2:1678 -320:2:1686 -321:2:1687 -322:2:1691 -323:2:1692 -324:2:1686 -325:2:1687 -326:2:1691 -327:2:1692 -328:2:1700 -329:2:1705 -330:2:1706 -331:2:1717 -332:2:1718 -333:2:1719 -334:2:1730 -335:2:1735 -336:2:1736 -337:2:1747 -338:2:1748 -339:2:1749 -340:2:1747 -341:2:1748 -342:2:1749 -343:2:1760 -344:0:2887 -345:2:1176 -346:0:2887 -347:2:1769 -348:2:1770 -349:2:1774 -350:2:1775 -351:2:1783 -352:2:1784 -353:2:1788 -354:2:1789 -355:2:1797 -356:2:1802 -357:2:1806 -358:2:1807 -359:2:1815 -360:2:1816 -361:2:1820 -362:2:1821 -363:2:1815 -364:2:1816 -365:2:1820 -366:2:1821 -367:2:1829 -368:2:1834 -369:2:1835 -370:2:1846 -371:2:1847 -372:2:1848 -373:2:1859 -374:2:1864 -375:2:1865 -376:2:1876 -377:2:1877 -378:2:1878 -379:2:1876 -380:2:1877 -381:2:1878 -382:2:1889 -383:2:1896 -384:0:2887 -385:2:1176 -386:0:2887 -387:2:1900 -388:2:1901 -389:2:1902 -390:2:1914 -391:2:1915 -392:2:1919 -393:2:1920 -394:2:1928 -395:2:1933 -396:2:1937 -397:2:1938 -398:2:1946 -399:2:1947 -400:2:1951 -401:2:1952 -402:2:1946 -403:2:1947 -404:2:1951 -405:2:1952 -406:2:1960 -407:2:1965 -408:2:1966 -409:2:1977 -410:2:1978 -411:2:1979 -412:2:1990 -413:2:1995 -414:2:1996 -415:2:2007 -416:2:2008 -417:2:2009 -418:2:2007 -419:2:2008 -420:2:2009 -421:2:2020 -422:2:2030 -423:2:2031 -424:0:2887 -425:2:1176 -426:0:2887 -427:2:2037 -428:0:2887 -429:2:2662 -430:2:2663 -431:2:2667 -432:2:2671 -433:2:2672 -434:2:2676 -435:2:2684 -436:2:2685 -437:2:2689 -438:2:2693 -439:2:2694 -440:2:2689 -441:2:2693 -442:2:2694 -443:2:2698 -444:2:2705 -445:2:2712 -446:2:2713 -447:2:2720 -448:2:2725 -449:2:2732 -450:2:2733 -451:2:2732 -452:2:2733 -453:2:2740 -454:2:2744 -455:0:2887 -456:2:2749 -457:0:2887 -458:2:2750 -459:0:2887 -460:2:2751 -461:0:2887 -462:2:2752 -463:0:2887 -464:1:51 -465:0:2887 -466:2:2753 -467:0:2887 -468:1:55 -469:1:56 -470:1:60 -471:1:64 -472:1:65 -473:1:69 -474:1:77 -475:1:78 -476:1:82 -477:1:86 -478:1:87 -479:1:82 -480:1:86 -481:1:87 -482:1:91 -483:1:98 -484:1:105 -485:1:106 -486:1:113 -487:1:118 -488:1:125 -489:1:126 -490:1:125 -491:1:126 -492:1:133 -493:1:137 -494:0:2887 -495:2:2752 -496:0:2887 -497:1:142 -498:0:2887 -499:2:2753 -500:0:2887 -501:2:2754 -502:0:2887 -503:2:2759 -504:0:2887 -505:2:2760 -506:0:2887 -507:2:2768 -508:2:2769 -509:2:2773 -510:2:2777 -511:2:2778 -512:2:2782 -513:2:2790 -514:2:2791 -515:2:2795 -516:2:2799 -517:2:2800 -518:2:2795 -519:2:2799 -520:2:2800 -521:2:2804 -522:2:2811 -523:2:2818 -524:2:2819 -525:2:2826 -526:2:2831 -527:2:2838 -528:2:2839 -529:2:2838 -530:2:2839 -531:2:2846 -532:2:2850 -533:0:2887 -534:2:2039 -535:2:2049 -536:0:2887 -537:2:1176 -538:0:2887 -539:2:2040 -540:2:2041 -541:0:2887 -542:2:1176 -543:0:2887 -544:2:2045 -545:0:2887 -546:2:2053 -547:0:2887 -548:2:1172 -549:0:2887 -550:2:1174 -551:0:2887 -552:2:1175 -553:0:2887 -554:2:1176 -555:0:2887 -556:2:1357 -557:2:1358 -558:2:1359 -559:0:2887 -560:2:1176 -561:0:2887 -562:2:1177 -563:2:1178 -564:2:1182 -565:2:1183 -566:2:1191 -567:2:1192 -568:2:1196 -569:2:1197 -570:2:1205 -571:2:1210 -572:2:1211 -573:2:1223 -574:2:1224 -575:2:1225 -576:2:1223 -577:2:1224 -578:2:1228 -579:2:1229 -580:2:1237 -581:2:1242 -582:2:1243 -583:2:1254 -584:2:1255 -585:2:1256 -586:2:1267 -587:2:1272 -588:2:1273 -589:2:1284 -590:2:1285 -591:2:1286 -592:2:1284 -593:2:1285 -594:2:1286 -595:2:1297 -596:2:1305 -597:0:2887 -598:2:1176 -599:0:2887 -600:2:1364 -601:0:2887 -602:2:2068 -603:2:2069 -604:2:2073 -605:2:2077 -606:2:2078 -607:2:2082 -608:2:2090 -609:2:2091 -610:2:2095 -611:2:2096 -612:2:2095 -613:2:2099 -614:2:2100 -615:2:2104 -616:2:2111 -617:2:2118 -618:2:2119 -619:2:2126 -620:2:2131 -621:2:2138 -622:2:2139 -623:2:2138 -624:2:2139 -625:2:2146 -626:2:2150 -627:0:2887 -628:2:2155 -629:0:2887 -630:2:2156 -631:0:2887 -632:2:2157 -633:0:2887 -634:2:2158 -635:0:2887 -636:1:51 -637:0:2887 -638:2:2159 -639:0:2887 -640:1:55 -641:1:56 -642:1:60 -643:1:64 -644:1:65 -645:1:69 -646:1:77 -647:1:78 -648:1:82 -649:1:86 -650:1:87 -651:1:82 -652:1:86 -653:1:87 -654:1:91 -655:1:98 -656:1:105 -657:1:106 -658:1:113 -659:1:118 -660:1:125 -661:1:126 -662:1:125 -663:1:126 -664:1:133 -665:1:137 -666:0:2887 -667:2:2158 -668:0:2887 -669:1:142 -670:0:2887 -671:2:2159 -672:0:2887 -673:2:2160 -674:0:2887 -675:2:2165 -676:0:2887 -677:2:2166 -678:0:2887 -679:2:2174 -680:2:2175 -681:2:2179 -682:2:2183 -683:2:2184 -684:2:2188 -685:2:2196 -686:2:2197 -687:2:2201 -688:2:2205 -689:2:2206 -690:2:2201 -691:2:2205 -692:2:2206 -693:2:2210 -694:2:2217 -695:2:2224 -696:2:2225 -697:2:2232 -698:2:2237 -699:2:2244 -700:2:2245 -701:2:2244 -702:2:2245 -703:2:2252 -704:2:2256 -705:0:2887 -706:2:1366 -707:2:2049 -708:0:2887 -709:2:1176 -710:0:2887 -711:2:1367 -712:0:2887 -713:2:1176 -714:0:2887 -715:2:1370 -716:2:1371 -717:2:1375 -718:2:1376 -719:2:1384 -720:2:1385 -721:2:1389 -722:2:1390 -723:2:1398 -724:2:1403 -725:2:1407 -726:2:1408 -727:2:1416 -728:2:1417 -729:2:1421 -730:2:1422 -731:2:1416 -732:2:1417 -733:2:1421 -734:2:1422 -735:2:1430 -736:2:1435 -737:2:1436 -738:2:1447 -739:2:1448 -740:2:1449 -741:2:1460 -742:2:1465 -743:2:1466 -744:2:1477 -745:2:1478 -746:2:1479 -747:2:1477 -748:2:1478 -749:2:1479 -750:2:1490 -751:2:1497 -752:0:2887 -753:2:1176 -754:0:2887 -755:2:1501 -756:2:1502 -757:2:1503 -758:2:1515 -759:2:1516 -760:2:1520 -761:2:1521 -762:2:1529 -763:2:1534 -764:2:1538 -765:2:1539 -766:2:1547 -767:2:1548 -768:2:1552 -769:2:1553 -770:2:1547 -771:2:1548 -772:2:1552 -773:2:1553 -774:2:1561 -775:2:1566 -776:2:1567 -777:2:1578 -778:2:1579 -779:2:1580 -780:2:1591 -781:2:1596 -782:2:1597 -783:2:1608 -784:2:1609 -785:2:1610 -786:2:1608 -787:2:1609 -788:2:1610 -789:2:1621 -790:2:1632 -791:2:1633 -792:0:2887 -793:2:1176 -794:0:2887 -795:2:1640 -796:2:1641 -797:2:1645 -798:2:1646 -799:2:1654 -800:2:1655 -801:2:1659 -802:2:1660 -803:2:1668 -804:2:1673 -805:2:1677 -806:2:1678 -807:2:1686 -808:2:1687 -809:2:1691 -810:2:1692 -811:2:1686 -812:2:1687 -813:2:1691 -814:2:1692 -815:2:1700 -816:2:1705 -817:2:1706 -818:2:1717 -819:2:1718 -820:2:1719 -821:2:1730 -822:2:1735 -823:2:1736 -824:2:1747 -825:2:1748 -826:2:1749 -827:2:1747 -828:2:1748 -829:2:1749 -830:2:1760 -831:0:2887 -832:2:1176 -833:0:2887 -834:2:1769 -835:2:1770 -836:2:1774 -837:2:1775 -838:2:1783 -839:2:1784 -840:2:1788 -841:2:1789 -842:2:1797 -843:2:1802 -844:2:1806 -845:2:1807 -846:2:1815 -847:2:1816 -848:2:1820 -849:2:1821 -850:2:1815 -851:2:1816 -852:2:1820 -853:2:1821 -854:2:1829 -855:2:1834 -856:2:1835 -857:2:1846 -858:2:1847 -859:2:1848 -860:2:1859 -861:2:1864 -862:2:1865 -863:2:1876 -864:2:1877 -865:2:1878 -866:2:1876 -867:2:1877 -868:2:1878 -869:2:1889 -870:2:1896 -871:0:2887 -872:2:1176 -873:0:2887 -874:2:1900 -875:2:1901 -876:2:1902 -877:2:1914 -878:2:1915 -879:2:1919 -880:2:1920 -881:2:1928 -882:2:1933 -883:2:1937 -884:2:1938 -885:2:1946 -886:2:1947 -887:2:1951 -888:2:1952 -889:2:1946 -890:2:1947 -891:2:1951 -892:2:1952 -893:2:1960 -894:2:1965 -895:2:1966 -896:2:1977 -897:2:1978 -898:2:1979 -899:2:1990 -900:2:1995 -901:2:1996 -902:2:2007 -903:2:2008 -904:2:2009 -905:2:2007 -906:2:2008 -907:2:2009 -908:2:2020 -909:2:2030 -910:2:2031 -911:0:2887 -912:2:1176 -913:0:2887 -914:2:2037 -915:0:2887 -916:2:2662 -917:2:2663 -918:2:2667 -919:2:2671 -920:2:2672 -921:2:2676 -922:2:2684 -923:2:2685 -924:2:2689 -925:2:2693 -926:2:2694 -927:2:2689 -928:2:2693 -929:2:2694 -930:2:2698 -931:2:2705 -932:2:2712 -933:2:2713 -934:2:2720 -935:2:2725 -936:2:2732 -937:2:2733 -938:2:2732 -939:2:2733 -940:2:2740 -941:2:2744 -942:0:2887 -943:2:2749 -944:0:2887 -945:2:2750 -946:0:2887 -947:2:2751 -948:0:2887 -949:2:2752 -950:0:2887 -951:1:51 -952:0:2887 -953:2:2753 -954:0:2887 -955:1:55 -956:1:56 -957:1:60 -958:1:64 -959:1:65 -960:1:69 -961:1:77 -962:1:78 -963:1:82 -964:1:86 -965:1:87 -966:1:82 -967:1:86 -968:1:87 -969:1:91 -970:1:98 -971:1:105 -972:1:106 -973:1:113 -974:1:118 -975:1:125 -976:1:126 -977:1:125 -978:1:126 -979:1:133 -980:1:137 -981:0:2887 -982:2:2752 -983:0:2887 -984:1:142 -985:0:2887 -986:2:2753 -987:0:2887 -988:2:2754 -989:0:2887 -990:2:2759 -991:0:2887 -992:2:2760 -993:0:2887 -994:2:2768 -995:2:2769 -996:2:2773 -997:2:2777 -998:2:2778 -999:2:2782 -1000:2:2790 -1001:2:2791 -1002:2:2795 -1003:2:2799 -1004:2:2800 -1005:2:2795 -1006:2:2799 -1007:2:2800 -1008:2:2804 -1009:2:2811 -1010:2:2818 -1011:2:2819 -1012:2:2826 -1013:2:2831 -1014:2:2838 -1015:2:2839 -1016:2:2838 -1017:2:2839 -1018:2:2846 -1019:2:2850 -1020:0:2887 -1021:2:2039 -1022:2:2049 -1023:0:2887 -1024:2:1176 -1025:0:2887 -1026:2:2040 -1027:2:2041 -1028:0:2887 -1029:2:1176 -1030:0:2887 -1031:2:2045 -1032:0:2887 -1033:2:2053 -1034:0:2887 -1035:2:1172 -1036:0:2887 -1037:2:1174 -1038:0:2887 -1039:2:1175 -1040:0:2887 -1041:2:1176 -1042:0:2887 -1043:2:1177 -1044:2:1178 -1045:2:1182 -1046:2:1183 -1047:2:1191 -1048:2:1192 -1049:2:1196 -1050:2:1197 -1051:2:1205 -1052:2:1210 -1053:2:1214 -1054:2:1215 -1055:2:1223 -1056:2:1224 -1057:2:1228 -1058:2:1229 -1059:2:1223 -1060:2:1224 -1061:2:1225 -1062:2:1237 -1063:2:1242 -1064:2:1243 -1065:2:1254 -1066:2:1255 -1067:2:1256 -1068:2:1267 -1069:2:1272 -1070:2:1273 -1071:2:1284 -1072:2:1285 -1073:2:1286 -1074:2:1284 -1075:2:1285 -1076:2:1286 -1077:2:1297 -1078:2:1305 -1079:0:2887 -1080:2:1176 -1081:0:2887 -1082:2:1357 -1083:2:1358 -1084:2:1359 -1085:0:2887 -1086:2:1176 -1087:0:2887 -1088:2:1364 -1089:0:2887 -1090:1:143 -1091:0:2887 -1092:1:145 -1093:0:2887 -1094:1:44 -1095:0:2887 -1096:1:151 -1097:1:152 -1098:1:156 -1099:1:157 -1100:1:165 -1101:1:166 -1102:1:170 -1103:1:171 -1104:1:179 -1105:1:184 -1106:1:188 -1107:1:189 -1108:1:197 -1109:1:198 -1110:1:202 -1111:1:203 -1112:1:197 -1113:1:198 -1114:1:202 -1115:1:203 -1116:1:211 -1117:1:216 -1118:1:217 -1119:1:228 -1120:1:229 -1121:1:230 -1122:1:241 -1123:1:246 -1124:1:247 -1125:1:258 -1126:1:259 -1127:1:260 -1128:1:258 -1129:1:259 -1130:1:260 -1131:1:271 -1132:0:2887 -1133:1:40 -1134:0:2887 -1135:1:41 -1136:0:2887 -1137:1:42 -1138:0:2887 -1139:1:143 -1140:0:2887 -1141:1:145 -1142:0:2887 -1143:1:44 -1144:0:2887 -1145:1:280 -1146:1:281 -1147:0:2887 -1148:1:40 -1149:0:2887 -1150:1:41 -1151:0:2887 -1152:1:42 -1153:0:2887 -1154:1:143 -1155:0:2887 -1156:1:145 -1157:0:2887 -1158:1:44 -1159:0:2887 -1160:1:287 -1161:1:288 -1162:1:292 -1163:1:293 -1164:1:301 -1165:1:302 -1166:1:306 -1167:1:307 -1168:1:315 -1169:1:320 -1170:1:324 -1171:1:325 -1172:1:333 -1173:1:334 -1174:1:338 -1175:1:339 -1176:1:333 -1177:1:334 -1178:1:338 -1179:1:339 -1180:1:347 -1181:1:352 -1182:1:353 -1183:1:364 -1184:1:365 -1185:1:366 -1186:1:377 -1187:1:382 -1188:1:383 -1189:1:394 -1190:1:395 -1191:1:396 -1192:1:394 -1193:1:395 -1194:1:396 -1195:1:407 -1196:0:2887 -1197:1:40 -1198:0:2887 -1199:1:41 -1200:0:2887 -1201:1:42 -1202:0:2887 -1203:1:143 -1204:0:2887 -1205:1:145 -1206:0:2887 -1207:1:44 -1208:0:2887 -1209:1:416 -1210:1:417 -1211:1:421 -1212:1:422 -1213:1:430 -1214:1:431 -1215:1:435 -1216:1:436 -1217:1:444 -1218:1:449 -1219:1:453 -1220:1:454 -1221:1:462 -1222:1:463 -1223:1:467 -1224:1:468 -1225:1:462 -1226:1:463 -1227:1:467 -1228:1:468 -1229:1:476 -1230:1:481 -1231:1:482 -1232:1:493 -1233:1:494 -1234:1:495 -1235:1:506 -1236:1:511 -1237:1:512 -1238:1:523 -1239:1:524 -1240:1:525 -1241:1:523 -1242:1:524 -1243:1:525 -1244:1:536 -1245:1:543 -1246:0:2887 -1247:1:40 -1248:0:2887 -1249:1:41 -1250:0:2887 -1251:1:42 -1252:0:2887 -1253:1:143 -1254:0:2887 -1255:1:145 -1256:0:2887 -1257:1:44 -1258:0:2887 -1259:1:681 -1260:1:682 -1261:1:686 -1262:1:687 -1263:1:695 -1264:1:696 -1265:1:697 -1266:1:709 -1267:1:714 -1268:1:718 -1269:1:719 -1270:1:727 -1271:1:728 -1272:1:732 -1273:1:733 -1274:1:727 -1275:1:728 -1276:1:732 -1277:1:733 -1278:1:741 -1279:1:746 -1280:1:747 -1281:1:758 -1282:1:759 -1283:1:760 -1284:1:771 -1285:1:776 -1286:1:777 -1287:1:788 -1288:1:789 -1289:1:790 -1290:1:788 -1291:1:789 -1292:1:790 -1293:1:801 -1294:0:2887 -1295:1:40 -1296:0:2887 -1297:1:41 -1298:0:2887 -1299:1:42 -1300:0:2887 -1301:1:143 -1302:0:2887 -1303:1:145 -1304:0:2887 -1305:1:44 -1306:0:2887 -1307:1:810 -1308:0:2887 -1309:1:1087 -1310:1:1094 -1311:1:1095 -1312:1:1102 -1313:1:1107 -1314:1:1114 -1315:1:1115 -1316:1:1114 -1317:1:1115 -1318:1:1122 -1319:1:1126 -1320:0:2887 -1321:2:2068 -1322:2:2069 -1323:2:2073 -1324:2:2077 -1325:2:2078 -1326:2:2082 -1327:2:2087 -1328:2:2095 -1329:2:2099 -1330:2:2100 -1331:2:2095 -1332:2:2096 -1333:2:2104 -1334:2:2111 -1335:2:2118 -1336:2:2119 -1337:2:2126 -1338:2:2131 -1339:2:2138 -1340:2:2139 -1341:2:2138 -1342:2:2139 -1343:2:2146 -1344:2:2150 -1345:0:2887 -1346:2:2155 -1347:0:2887 -1348:2:2156 -1349:0:2887 -1350:2:2157 -1351:0:2887 -1352:2:2158 -1353:0:2887 -1354:1:812 -1355:1:813 -1356:0:2885 -1357:2:2159 -1358:0:2891 -1359:1:919 diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_single_flip.define b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_single_flip.log b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_single_flip.log deleted file mode 100644 index b0c3662..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_single_flip.log +++ /dev/null @@ -1,458 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_single_flip.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1179) -Depth= 4014 States= 1e+06 Transitions= 1.62e+08 Memory= 512.736 t= 256 R= 4e+03 -pan: claim violated! (at depth 1235) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 80 byte, depth reached 4014, errors: 1 - 1411681 states, stored -2.3165948e+08 states, matched -2.3307116e+08 transitions (= stored+matched) -1.3076596e+09 atomic steps -hash conflicts: 78416855 (resolved) - -Stats on memory usage (in Megabytes): - 156.169 equivalent memory usage for states (stored*(State-vector + overhead)) - 66.078 actual memory usage for states (compression: 42.31%) - state-vector as stored = 13 byte + 36 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 531.779 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 14645 1835 1567 2 2 ] -unreached in proctype urcu_reader - line 713, "pan.___", state 12, "((i<1))" - line 713, "pan.___", state 12, "((i>=1))" - line 268, "pan.___", state 55, "cache_dirty_urcu_gp_ctr = 0" - line 276, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 86, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 102, "(1)" - line 249, "pan.___", state 110, "(1)" - line 253, "pan.___", state 122, "(1)" - line 257, "pan.___", state 130, "(1)" - line 404, "pan.___", state 156, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 188, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 202, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 221, "(1)" - line 431, "pan.___", state 251, "(1)" - line 435, "pan.___", state 264, "(1)" - line 614, "pan.___", state 285, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 404, "pan.___", state 292, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 324, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 338, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 357, "(1)" - line 431, "pan.___", state 387, "(1)" - line 435, "pan.___", state 400, "(1)" - line 404, "pan.___", state 421, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 453, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 467, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 486, "(1)" - line 431, "pan.___", state 516, "(1)" - line 435, "pan.___", state 529, "(1)" - line 404, "pan.___", state 552, "cache_dirty_urcu_gp_ctr = 0" - line 404, "pan.___", state 554, "(1)" - line 404, "pan.___", state 555, "(cache_dirty_urcu_gp_ctr)" - line 404, "pan.___", state 555, "else" - line 404, "pan.___", state 558, "(1)" - line 408, "pan.___", state 566, "cache_dirty_urcu_active_readers = 0" - line 408, "pan.___", state 568, "(1)" - line 408, "pan.___", state 569, "(cache_dirty_urcu_active_readers)" - line 408, "pan.___", state 569, "else" - line 408, "pan.___", state 572, "(1)" - line 408, "pan.___", state 573, "(1)" - line 408, "pan.___", state 573, "(1)" - line 406, "pan.___", state 578, "((i<1))" - line 406, "pan.___", state 578, "((i>=1))" - line 413, "pan.___", state 584, "cache_dirty_rcu_ptr = 0" - line 413, "pan.___", state 586, "(1)" - line 413, "pan.___", state 587, "(cache_dirty_rcu_ptr)" - line 413, "pan.___", state 587, "else" - line 413, "pan.___", state 590, "(1)" - line 413, "pan.___", state 591, "(1)" - line 413, "pan.___", state 591, "(1)" - line 417, "pan.___", state 598, "cache_dirty_rcu_data[i] = 0" - line 417, "pan.___", state 600, "(1)" - line 417, "pan.___", state 601, "(cache_dirty_rcu_data[i])" - line 417, "pan.___", state 601, "else" - line 417, "pan.___", state 604, "(1)" - line 417, "pan.___", state 605, "(1)" - line 417, "pan.___", state 605, "(1)" - line 415, "pan.___", state 610, "((i<2))" - line 415, "pan.___", state 610, "((i>=2))" - line 422, "pan.___", state 617, "(1)" - line 422, "pan.___", state 618, "(!(cache_dirty_urcu_gp_ctr))" - line 422, "pan.___", state 618, "else" - line 422, "pan.___", state 621, "(1)" - line 422, "pan.___", state 622, "(1)" - line 422, "pan.___", state 622, "(1)" - line 426, "pan.___", state 630, "(1)" - line 426, "pan.___", state 631, "(!(cache_dirty_urcu_active_readers))" - line 426, "pan.___", state 631, "else" - line 426, "pan.___", state 634, "(1)" - line 426, "pan.___", state 635, "(1)" - line 426, "pan.___", state 635, "(1)" - line 424, "pan.___", state 640, "((i<1))" - line 424, "pan.___", state 640, "((i>=1))" - line 431, "pan.___", state 647, "(1)" - line 431, "pan.___", state 648, "(!(cache_dirty_rcu_ptr))" - line 431, "pan.___", state 648, "else" - line 431, "pan.___", state 651, "(1)" - line 431, "pan.___", state 652, "(1)" - line 431, "pan.___", state 652, "(1)" - line 435, "pan.___", state 660, "(1)" - line 435, "pan.___", state 661, "(!(cache_dirty_rcu_data[i]))" - line 435, "pan.___", state 661, "else" - line 435, "pan.___", state 664, "(1)" - line 435, "pan.___", state 665, "(1)" - line 435, "pan.___", state 665, "(1)" - line 433, "pan.___", state 670, "((i<2))" - line 433, "pan.___", state 670, "((i>=2))" - line 443, "pan.___", state 674, "(1)" - line 443, "pan.___", state 674, "(1)" - line 614, "pan.___", state 677, "cached_urcu_active_readers = (tmp+1)" - line 614, "pan.___", state 678, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 614, "pan.___", state 679, "(1)" - line 404, "pan.___", state 686, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 718, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 732, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 751, "(1)" - line 431, "pan.___", state 781, "(1)" - line 435, "pan.___", state 794, "(1)" - line 404, "pan.___", state 821, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 853, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 867, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 886, "(1)" - line 431, "pan.___", state 916, "(1)" - line 435, "pan.___", state 929, "(1)" - line 404, "pan.___", state 950, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 982, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 996, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 1015, "(1)" - line 431, "pan.___", state 1045, "(1)" - line 435, "pan.___", state 1058, "(1)" - line 245, "pan.___", state 1091, "(1)" - line 253, "pan.___", state 1111, "(1)" - line 257, "pan.___", state 1119, "(1)" - line 748, "pan.___", state 1136, "-end-" - (92 of 1136 states) -unreached in proctype urcu_writer - line 837, "pan.___", state 12, "((i<1))" - line 837, "pan.___", state 12, "((i>=1))" - line 404, "pan.___", state 49, "cache_dirty_urcu_gp_ctr = 0" - line 408, "pan.___", state 63, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 81, "cache_dirty_rcu_ptr = 0" - line 422, "pan.___", state 114, "(1)" - line 426, "pan.___", state 127, "(1)" - line 431, "pan.___", state 144, "(1)" - line 268, "pan.___", state 180, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 189, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 202, "cache_dirty_rcu_ptr = 0" - line 404, "pan.___", state 242, "cache_dirty_urcu_gp_ctr = 0" - line 408, "pan.___", state 256, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 274, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 288, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 307, "(1)" - line 426, "pan.___", state 320, "(1)" - line 431, "pan.___", state 337, "(1)" - line 435, "pan.___", state 350, "(1)" - line 408, "pan.___", state 387, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 405, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 419, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 451, "(1)" - line 431, "pan.___", state 468, "(1)" - line 435, "pan.___", state 481, "(1)" - line 404, "pan.___", state 511, "cache_dirty_urcu_gp_ctr = 0" - line 408, "pan.___", state 525, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 543, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 557, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 576, "(1)" - line 426, "pan.___", state 589, "(1)" - line 431, "pan.___", state 606, "(1)" - line 435, "pan.___", state 619, "(1)" - line 404, "pan.___", state 640, "cache_dirty_urcu_gp_ctr = 0" - line 404, "pan.___", state 642, "(1)" - line 404, "pan.___", state 643, "(cache_dirty_urcu_gp_ctr)" - line 404, "pan.___", state 643, "else" - line 404, "pan.___", state 646, "(1)" - line 408, "pan.___", state 654, "cache_dirty_urcu_active_readers = 0" - line 408, "pan.___", state 656, "(1)" - line 408, "pan.___", state 657, "(cache_dirty_urcu_active_readers)" - line 408, "pan.___", state 657, "else" - line 408, "pan.___", state 660, "(1)" - line 408, "pan.___", state 661, "(1)" - line 408, "pan.___", state 661, "(1)" - line 406, "pan.___", state 666, "((i<1))" - line 406, "pan.___", state 666, "((i>=1))" - line 413, "pan.___", state 672, "cache_dirty_rcu_ptr = 0" - line 413, "pan.___", state 674, "(1)" - line 413, "pan.___", state 675, "(cache_dirty_rcu_ptr)" - line 413, "pan.___", state 675, "else" - line 413, "pan.___", state 678, "(1)" - line 413, "pan.___", state 679, "(1)" - line 413, "pan.___", state 679, "(1)" - line 417, "pan.___", state 686, "cache_dirty_rcu_data[i] = 0" - line 417, "pan.___", state 688, "(1)" - line 417, "pan.___", state 689, "(cache_dirty_rcu_data[i])" - line 417, "pan.___", state 689, "else" - line 417, "pan.___", state 692, "(1)" - line 417, "pan.___", state 693, "(1)" - line 417, "pan.___", state 693, "(1)" - line 415, "pan.___", state 698, "((i<2))" - line 415, "pan.___", state 698, "((i>=2))" - line 422, "pan.___", state 705, "(1)" - line 422, "pan.___", state 706, "(!(cache_dirty_urcu_gp_ctr))" - line 422, "pan.___", state 706, "else" - line 422, "pan.___", state 709, "(1)" - line 422, "pan.___", state 710, "(1)" - line 422, "pan.___", state 710, "(1)" - line 426, "pan.___", state 718, "(1)" - line 426, "pan.___", state 719, "(!(cache_dirty_urcu_active_readers))" - line 426, "pan.___", state 719, "else" - line 426, "pan.___", state 722, "(1)" - line 426, "pan.___", state 723, "(1)" - line 426, "pan.___", state 723, "(1)" - line 424, "pan.___", state 728, "((i<1))" - line 424, "pan.___", state 728, "((i>=1))" - line 431, "pan.___", state 735, "(1)" - line 431, "pan.___", state 736, "(!(cache_dirty_rcu_ptr))" - line 431, "pan.___", state 736, "else" - line 431, "pan.___", state 739, "(1)" - line 431, "pan.___", state 740, "(1)" - line 431, "pan.___", state 740, "(1)" - line 435, "pan.___", state 748, "(1)" - line 435, "pan.___", state 749, "(!(cache_dirty_rcu_data[i]))" - line 435, "pan.___", state 749, "else" - line 435, "pan.___", state 752, "(1)" - line 435, "pan.___", state 753, "(1)" - line 435, "pan.___", state 753, "(1)" - line 433, "pan.___", state 758, "((i<2))" - line 433, "pan.___", state 758, "((i>=2))" - line 443, "pan.___", state 762, "(1)" - line 443, "pan.___", state 762, "(1)" - line 1003, "pan.___", state 766, "_proc_urcu_writer = (_proc_urcu_writer|(1<<10))" - line 404, "pan.___", state 771, "cache_dirty_urcu_gp_ctr = 0" - line 404, "pan.___", state 773, "(1)" - line 404, "pan.___", state 774, "(cache_dirty_urcu_gp_ctr)" - line 404, "pan.___", state 774, "else" - line 404, "pan.___", state 777, "(1)" - line 408, "pan.___", state 785, "cache_dirty_urcu_active_readers = 0" - line 408, "pan.___", state 787, "(1)" - line 408, "pan.___", state 788, "(cache_dirty_urcu_active_readers)" - line 408, "pan.___", state 788, "else" - line 408, "pan.___", state 791, "(1)" - line 408, "pan.___", state 792, "(1)" - line 408, "pan.___", state 792, "(1)" - line 406, "pan.___", state 797, "((i<1))" - line 406, "pan.___", state 797, "((i>=1))" - line 413, "pan.___", state 803, "cache_dirty_rcu_ptr = 0" - line 413, "pan.___", state 805, "(1)" - line 413, "pan.___", state 806, "(cache_dirty_rcu_ptr)" - line 413, "pan.___", state 806, "else" - line 413, "pan.___", state 809, "(1)" - line 413, "pan.___", state 810, "(1)" - line 413, "pan.___", state 810, "(1)" - line 417, "pan.___", state 817, "cache_dirty_rcu_data[i] = 0" - line 417, "pan.___", state 819, "(1)" - line 417, "pan.___", state 820, "(cache_dirty_rcu_data[i])" - line 417, "pan.___", state 820, "else" - line 417, "pan.___", state 823, "(1)" - line 417, "pan.___", state 824, "(1)" - line 417, "pan.___", state 824, "(1)" - line 415, "pan.___", state 829, "((i<2))" - line 415, "pan.___", state 829, "((i>=2))" - line 422, "pan.___", state 836, "(1)" - line 422, "pan.___", state 837, "(!(cache_dirty_urcu_gp_ctr))" - line 422, "pan.___", state 837, "else" - line 422, "pan.___", state 840, "(1)" - line 422, "pan.___", state 841, "(1)" - line 422, "pan.___", state 841, "(1)" - line 426, "pan.___", state 849, "(1)" - line 426, "pan.___", state 850, "(!(cache_dirty_urcu_active_readers))" - line 426, "pan.___", state 850, "else" - line 426, "pan.___", state 853, "(1)" - line 426, "pan.___", state 854, "(1)" - line 426, "pan.___", state 854, "(1)" - line 424, "pan.___", state 859, "((i<1))" - line 424, "pan.___", state 859, "((i>=1))" - line 431, "pan.___", state 866, "(1)" - line 431, "pan.___", state 867, "(!(cache_dirty_rcu_ptr))" - line 431, "pan.___", state 867, "else" - line 431, "pan.___", state 870, "(1)" - line 431, "pan.___", state 871, "(1)" - line 431, "pan.___", state 871, "(1)" - line 435, "pan.___", state 879, "(1)" - line 435, "pan.___", state 880, "(!(cache_dirty_rcu_data[i]))" - line 435, "pan.___", state 880, "else" - line 435, "pan.___", state 883, "(1)" - line 435, "pan.___", state 884, "(1)" - line 435, "pan.___", state 884, "(1)" - line 433, "pan.___", state 889, "((i<2))" - line 433, "pan.___", state 889, "((i>=2))" - line 443, "pan.___", state 893, "(1)" - line 443, "pan.___", state 893, "(1)" - line 1019, "pan.___", state 898, "_proc_urcu_writer = (_proc_urcu_writer|(1<<11))" - line 1014, "pan.___", state 899, "(((tmp2&((1<<7)-1))&&((tmp2^0)&(1<<7))))" - line 1014, "pan.___", state 899, "else" - line 1039, "pan.___", state 903, "_proc_urcu_writer = (_proc_urcu_writer&~(((1<<12)|(1<<11))))" - line 268, "pan.___", state 934, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 943, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 958, "(1)" - line 280, "pan.___", state 965, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 981, "(1)" - line 249, "pan.___", state 989, "(1)" - line 253, "pan.___", state 1001, "(1)" - line 257, "pan.___", state 1009, "(1)" - line 268, "pan.___", state 1040, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1049, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1062, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1071, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1087, "(1)" - line 249, "pan.___", state 1095, "(1)" - line 253, "pan.___", state 1107, "(1)" - line 257, "pan.___", state 1115, "(1)" - line 272, "pan.___", state 1141, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1154, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1163, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1179, "(1)" - line 249, "pan.___", state 1187, "(1)" - line 253, "pan.___", state 1199, "(1)" - line 257, "pan.___", state 1207, "(1)" - line 268, "pan.___", state 1238, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1247, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1260, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1269, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1285, "(1)" - line 249, "pan.___", state 1293, "(1)" - line 253, "pan.___", state 1305, "(1)" - line 257, "pan.___", state 1313, "(1)" - line 268, "pan.___", state 1330, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 1332, "(1)" - line 272, "pan.___", state 1339, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 1341, "(1)" - line 272, "pan.___", state 1342, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 1342, "else" - line 270, "pan.___", state 1347, "((i<1))" - line 270, "pan.___", state 1347, "((i>=1))" - line 276, "pan.___", state 1352, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 1354, "(1)" - line 276, "pan.___", state 1355, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 1355, "else" - line 280, "pan.___", state 1361, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 1363, "(1)" - line 280, "pan.___", state 1364, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 1364, "else" - line 278, "pan.___", state 1369, "((i<2))" - line 278, "pan.___", state 1369, "((i>=2))" - line 245, "pan.___", state 1377, "(1)" - line 249, "pan.___", state 1385, "(1)" - line 249, "pan.___", state 1386, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 1386, "else" - line 247, "pan.___", state 1391, "((i<1))" - line 247, "pan.___", state 1391, "((i>=1))" - line 253, "pan.___", state 1397, "(1)" - line 253, "pan.___", state 1398, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 1398, "else" - line 257, "pan.___", state 1405, "(1)" - line 257, "pan.___", state 1406, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 1406, "else" - line 262, "pan.___", state 1415, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 1415, "else" - line 1115, "pan.___", state 1418, "i = 0" - line 1115, "pan.___", state 1420, "reader_barrier = 1" - line 1115, "pan.___", state 1431, "((i<1))" - line 1115, "pan.___", state 1431, "((i>=1))" - line 268, "pan.___", state 1436, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 1438, "(1)" - line 272, "pan.___", state 1445, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 1447, "(1)" - line 272, "pan.___", state 1448, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 1448, "else" - line 270, "pan.___", state 1453, "((i<1))" - line 270, "pan.___", state 1453, "((i>=1))" - line 276, "pan.___", state 1458, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 1460, "(1)" - line 276, "pan.___", state 1461, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 1461, "else" - line 280, "pan.___", state 1467, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 1469, "(1)" - line 280, "pan.___", state 1470, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 1470, "else" - line 278, "pan.___", state 1475, "((i<2))" - line 278, "pan.___", state 1475, "((i>=2))" - line 245, "pan.___", state 1483, "(1)" - line 249, "pan.___", state 1491, "(1)" - line 249, "pan.___", state 1492, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 1492, "else" - line 247, "pan.___", state 1497, "((i<1))" - line 247, "pan.___", state 1497, "((i>=1))" - line 253, "pan.___", state 1503, "(1)" - line 253, "pan.___", state 1504, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 1504, "else" - line 257, "pan.___", state 1511, "(1)" - line 257, "pan.___", state 1512, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 1512, "else" - line 262, "pan.___", state 1521, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 1521, "else" - line 295, "pan.___", state 1523, "(cache_dirty_urcu_gp_ctr)" - line 295, "pan.___", state 1523, "else" - line 1115, "pan.___", state 1524, "(cache_dirty_urcu_gp_ctr)" - line 1115, "pan.___", state 1524, "else" - line 272, "pan.___", state 1537, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1550, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1559, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1575, "(1)" - line 249, "pan.___", state 1583, "(1)" - line 253, "pan.___", state 1595, "(1)" - line 257, "pan.___", state 1603, "(1)" - line 268, "pan.___", state 1634, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1643, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1656, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1665, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1681, "(1)" - line 249, "pan.___", state 1689, "(1)" - line 253, "pan.___", state 1701, "(1)" - line 257, "pan.___", state 1709, "(1)" - line 1123, "pan.___", state 1725, "-end-" - (212 of 1725 states) -unreached in proctype :init: - line 1138, "pan.___", state 11, "((i<1))" - line 1138, "pan.___", state 11, "((i>=1))" - (1 of 26 states) -unreached in proctype :never: - line 1184, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 372 seconds -pan: rate 3796.6785 states/second -pan: avg transition delay 1.5953e-06 usec -cp .input.spin urcu_free_single_flip.spin.input -cp .input.spin.trail urcu_free_single_flip.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_single_flip.spin.input b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_single_flip.spin.input deleted file mode 100644 index 3af0fbc..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_single_flip.spin.input +++ /dev/null @@ -1,1157 +0,0 @@ -#define SINGLE_FLIP - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN, READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT, 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT, /* post-dominant */ - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_OUT, /* RAW */ - READ_UNLOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - data_read_first[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_single_flip.spin.input.trail b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_single_flip.spin.input.trail deleted file mode 100644 index 53de47d..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_free_single_flip.spin.input.trail +++ /dev/null @@ -1,1238 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2889 -2:2:1136 -3:2:1141 -4:2:1145 -5:2:1153 -6:2:1157 -7:2:1161 -8:0:2889 -9:1:0 -10:1:5 -11:1:9 -12:1:17 -13:1:21 -14:1:25 -15:0:2889 -16:3:2861 -17:3:2864 -18:3:2869 -19:3:2876 -20:3:2879 -21:3:2883 -22:3:2884 -23:0:2889 -24:3:2886 -25:0:2889 -26:2:1165 -27:0:2889 -28:2:1171 -29:0:2889 -30:2:1172 -31:0:2889 -32:2:1174 -33:0:2889 -34:2:1175 -35:0:2889 -36:2:1176 -37:0:2889 -38:2:1177 -39:0:2889 -40:2:1178 -41:0:2889 -42:2:1179 -43:0:2889 -44:2:1180 -45:2:1181 -46:2:1185 -47:2:1186 -48:2:1194 -49:2:1195 -50:2:1199 -51:2:1200 -52:2:1208 -53:2:1213 -54:2:1217 -55:2:1218 -56:2:1226 -57:2:1227 -58:2:1231 -59:2:1232 -60:2:1226 -61:2:1227 -62:2:1231 -63:2:1232 -64:2:1240 -65:2:1245 -66:2:1246 -67:2:1257 -68:2:1258 -69:2:1259 -70:2:1270 -71:2:1275 -72:2:1276 -73:2:1287 -74:2:1288 -75:2:1289 -76:2:1287 -77:2:1288 -78:2:1289 -79:2:1300 -80:2:1308 -81:0:2889 -82:2:1179 -83:0:2889 -84:2:1312 -85:2:1316 -86:2:1317 -87:2:1321 -88:2:1325 -89:2:1326 -90:2:1330 -91:2:1338 -92:2:1339 -93:2:1343 -94:2:1347 -95:2:1348 -96:2:1343 -97:2:1344 -98:2:1352 -99:0:2889 -100:2:1179 -101:0:2889 -102:2:1360 -103:2:1361 -104:2:1362 -105:0:2889 -106:2:1179 -107:0:2889 -108:2:1367 -109:0:2889 -110:2:2070 -111:2:2071 -112:2:2075 -113:2:2079 -114:2:2080 -115:2:2084 -116:2:2089 -117:2:2097 -118:2:2101 -119:2:2102 -120:2:2097 -121:2:2101 -122:2:2102 -123:2:2106 -124:2:2113 -125:2:2120 -126:2:2121 -127:2:2128 -128:2:2133 -129:2:2140 -130:2:2141 -131:2:2140 -132:2:2141 -133:2:2148 -134:2:2152 -135:0:2889 -136:2:2157 -137:0:2889 -138:2:2158 -139:0:2889 -140:2:2159 -141:0:2889 -142:2:2160 -143:0:2889 -144:1:29 -145:0:2889 -146:2:2161 -147:0:2889 -148:1:35 -149:0:2889 -150:1:36 -151:0:2889 -152:2:2160 -153:0:2889 -154:1:37 -155:0:2889 -156:2:2161 -157:0:2889 -158:1:38 -159:0:2889 -160:2:2160 -161:0:2889 -162:1:39 -163:0:2889 -164:2:2161 -165:0:2889 -166:1:40 -167:0:2889 -168:1:41 -169:0:2889 -170:2:2160 -171:0:2889 -172:1:42 -173:0:2889 -174:2:2161 -175:0:2889 -176:1:51 -177:0:2889 -178:2:2160 -179:0:2889 -180:1:55 -181:1:56 -182:1:60 -183:1:64 -184:1:65 -185:1:69 -186:1:77 -187:1:78 -188:1:82 -189:1:86 -190:1:87 -191:1:82 -192:1:86 -193:1:87 -194:1:91 -195:1:98 -196:1:105 -197:1:106 -198:1:113 -199:1:118 -200:1:125 -201:1:126 -202:1:125 -203:1:126 -204:1:133 -205:1:137 -206:0:2889 -207:2:2161 -208:0:2889 -209:1:142 -210:0:2889 -211:2:2162 -212:0:2889 -213:2:2167 -214:0:2889 -215:2:2168 -216:0:2889 -217:2:2176 -218:2:2177 -219:2:2181 -220:2:2185 -221:2:2186 -222:2:2190 -223:2:2198 -224:2:2199 -225:2:2203 -226:2:2207 -227:2:2208 -228:2:2203 -229:2:2207 -230:2:2208 -231:2:2212 -232:2:2219 -233:2:2226 -234:2:2227 -235:2:2234 -236:2:2239 -237:2:2246 -238:2:2247 -239:2:2246 -240:2:2247 -241:2:2254 -242:2:2258 -243:0:2889 -244:2:1369 -245:2:2051 -246:0:2889 -247:2:1179 -248:0:2889 -249:2:1370 -250:0:2889 -251:2:1179 -252:0:2889 -253:2:1373 -254:2:1374 -255:2:1378 -256:2:1379 -257:2:1387 -258:2:1388 -259:2:1392 -260:2:1393 -261:2:1401 -262:2:1406 -263:2:1410 -264:2:1411 -265:2:1419 -266:2:1420 -267:2:1424 -268:2:1425 -269:2:1419 -270:2:1420 -271:2:1424 -272:2:1425 -273:2:1433 -274:2:1438 -275:2:1439 -276:2:1450 -277:2:1451 -278:2:1452 -279:2:1463 -280:2:1468 -281:2:1469 -282:2:1480 -283:2:1481 -284:2:1482 -285:2:1480 -286:2:1481 -287:2:1482 -288:2:1493 -289:2:1500 -290:0:2889 -291:2:1179 -292:0:2889 -293:2:1504 -294:2:1505 -295:2:1506 -296:2:1518 -297:2:1519 -298:2:1523 -299:2:1524 -300:2:1532 -301:2:1537 -302:2:1541 -303:2:1542 -304:2:1550 -305:2:1551 -306:2:1555 -307:2:1556 -308:2:1550 -309:2:1551 -310:2:1555 -311:2:1556 -312:2:1564 -313:2:1569 -314:2:1570 -315:2:1581 -316:2:1582 -317:2:1583 -318:2:1594 -319:2:1599 -320:2:1600 -321:2:1611 -322:2:1612 -323:2:1613 -324:2:1611 -325:2:1612 -326:2:1613 -327:2:1624 -328:2:1634 -329:2:1635 -330:0:2889 -331:2:1179 -332:0:2889 -333:2:2039 -334:0:2889 -335:2:2664 -336:2:2665 -337:2:2669 -338:2:2673 -339:2:2674 -340:2:2678 -341:2:2686 -342:2:2687 -343:2:2691 -344:2:2695 -345:2:2696 -346:2:2691 -347:2:2695 -348:2:2696 -349:2:2700 -350:2:2707 -351:2:2714 -352:2:2715 -353:2:2722 -354:2:2727 -355:2:2734 -356:2:2735 -357:2:2734 -358:2:2735 -359:2:2742 -360:2:2746 -361:0:2889 -362:2:2751 -363:0:2889 -364:2:2752 -365:0:2889 -366:2:2753 -367:0:2889 -368:2:2754 -369:0:2889 -370:1:143 -371:0:2889 -372:2:2755 -373:0:2889 -374:1:145 -375:0:2889 -376:2:2754 -377:0:2889 -378:1:44 -379:0:2889 -380:2:2755 -381:0:2889 -382:1:151 -383:1:152 -384:1:156 -385:1:157 -386:1:165 -387:1:166 -388:1:170 -389:1:171 -390:1:179 -391:1:184 -392:1:188 -393:1:189 -394:1:197 -395:1:198 -396:1:202 -397:1:203 -398:1:197 -399:1:198 -400:1:202 -401:1:203 -402:1:211 -403:1:223 -404:1:224 -405:1:228 -406:1:229 -407:1:230 -408:1:241 -409:1:246 -410:1:247 -411:1:258 -412:1:259 -413:1:260 -414:1:258 -415:1:259 -416:1:260 -417:1:271 -418:0:2889 -419:1:40 -420:0:2889 -421:1:41 -422:0:2889 -423:2:2754 -424:0:2889 -425:1:42 -426:0:2889 -427:2:2755 -428:0:2889 -429:1:143 -430:0:2889 -431:1:145 -432:0:2889 -433:2:2754 -434:0:2889 -435:1:44 -436:0:2889 -437:2:2755 -438:0:2889 -439:1:280 -440:1:281 -441:0:2889 -442:1:40 -443:0:2889 -444:1:41 -445:0:2889 -446:2:2754 -447:0:2889 -448:1:42 -449:0:2889 -450:2:2755 -451:0:2889 -452:1:143 -453:0:2889 -454:1:145 -455:0:2889 -456:2:2754 -457:0:2889 -458:1:44 -459:0:2889 -460:2:2755 -461:0:2889 -462:1:287 -463:1:288 -464:1:292 -465:1:293 -466:1:301 -467:1:302 -468:1:306 -469:1:307 -470:1:315 -471:1:320 -472:1:324 -473:1:325 -474:1:333 -475:1:334 -476:1:338 -477:1:339 -478:1:333 -479:1:334 -480:1:338 -481:1:339 -482:1:347 -483:1:359 -484:1:360 -485:1:364 -486:1:365 -487:1:366 -488:1:377 -489:1:382 -490:1:383 -491:1:394 -492:1:395 -493:1:396 -494:1:394 -495:1:395 -496:1:396 -497:1:407 -498:0:2889 -499:1:40 -500:0:2889 -501:1:41 -502:0:2889 -503:2:2754 -504:0:2889 -505:1:42 -506:0:2889 -507:2:2755 -508:0:2889 -509:1:51 -510:0:2889 -511:2:2754 -512:0:2889 -513:1:55 -514:1:56 -515:1:60 -516:1:64 -517:1:65 -518:1:69 -519:1:77 -520:1:78 -521:1:82 -522:1:86 -523:1:87 -524:1:82 -525:1:86 -526:1:87 -527:1:91 -528:1:98 -529:1:105 -530:1:106 -531:1:113 -532:1:118 -533:1:125 -534:1:126 -535:1:125 -536:1:126 -537:1:133 -538:1:137 -539:0:2889 -540:2:2755 -541:0:2889 -542:1:142 -543:0:2889 -544:2:2756 -545:0:2889 -546:2:2761 -547:0:2889 -548:2:2762 -549:0:2889 -550:2:2770 -551:2:2771 -552:2:2775 -553:2:2779 -554:2:2780 -555:2:2784 -556:2:2792 -557:2:2793 -558:2:2797 -559:2:2801 -560:2:2802 -561:2:2797 -562:2:2801 -563:2:2802 -564:2:2806 -565:2:2813 -566:2:2820 -567:2:2821 -568:2:2828 -569:2:2833 -570:2:2840 -571:2:2841 -572:2:2840 -573:2:2841 -574:2:2848 -575:2:2852 -576:0:2889 -577:2:2041 -578:2:2051 -579:0:2889 -580:2:1179 -581:0:2889 -582:2:2042 -583:2:2043 -584:0:2889 -585:2:1179 -586:0:2889 -587:2:2047 -588:0:2889 -589:2:2055 -590:0:2889 -591:2:1172 -592:0:2889 -593:2:1174 -594:0:2889 -595:2:1175 -596:0:2889 -597:2:1176 -598:0:2889 -599:2:1177 -600:0:2889 -601:2:1178 -602:0:2889 -603:2:1179 -604:0:2889 -605:2:1180 -606:2:1181 -607:2:1185 -608:2:1186 -609:2:1194 -610:2:1195 -611:2:1199 -612:2:1200 -613:2:1208 -614:2:1213 -615:2:1217 -616:2:1218 -617:2:1226 -618:2:1227 -619:2:1228 -620:2:1226 -621:2:1227 -622:2:1231 -623:2:1232 -624:2:1240 -625:2:1245 -626:2:1246 -627:2:1257 -628:2:1258 -629:2:1259 -630:2:1270 -631:2:1275 -632:2:1276 -633:2:1287 -634:2:1288 -635:2:1289 -636:2:1287 -637:2:1288 -638:2:1289 -639:2:1300 -640:2:1308 -641:0:2889 -642:2:1179 -643:0:2889 -644:2:1312 -645:2:1316 -646:2:1317 -647:2:1321 -648:2:1325 -649:2:1326 -650:2:1330 -651:2:1338 -652:2:1339 -653:2:1343 -654:2:1344 -655:2:1343 -656:2:1347 -657:2:1348 -658:2:1352 -659:0:2889 -660:2:1179 -661:0:2889 -662:2:1360 -663:2:1361 -664:2:1362 -665:0:2889 -666:2:1179 -667:0:2889 -668:2:1367 -669:0:2889 -670:2:2070 -671:2:2071 -672:2:2075 -673:2:2079 -674:2:2080 -675:2:2084 -676:2:2089 -677:2:2097 -678:2:2101 -679:2:2102 -680:2:2097 -681:2:2101 -682:2:2102 -683:2:2106 -684:2:2113 -685:2:2120 -686:2:2121 -687:2:2128 -688:2:2133 -689:2:2140 -690:2:2141 -691:2:2140 -692:2:2141 -693:2:2148 -694:2:2152 -695:0:2889 -696:2:2157 -697:0:2889 -698:2:2158 -699:0:2889 -700:2:2159 -701:0:2889 -702:2:2160 -703:0:2889 -704:1:143 -705:0:2889 -706:2:2161 -707:0:2889 -708:1:145 -709:0:2889 -710:2:2160 -711:0:2889 -712:1:44 -713:0:2889 -714:2:2161 -715:0:2889 -716:1:416 -717:1:417 -718:1:421 -719:1:422 -720:1:430 -721:1:431 -722:1:435 -723:1:436 -724:1:444 -725:1:449 -726:1:453 -727:1:454 -728:1:462 -729:1:463 -730:1:467 -731:1:468 -732:1:462 -733:1:463 -734:1:467 -735:1:468 -736:1:476 -737:1:481 -738:1:482 -739:1:493 -740:1:494 -741:1:495 -742:1:506 -743:1:518 -744:1:519 -745:1:523 -746:1:524 -747:1:525 -748:1:523 -749:1:524 -750:1:525 -751:1:536 -752:1:543 -753:0:2889 -754:1:40 -755:0:2889 -756:1:41 -757:0:2889 -758:2:2160 -759:0:2889 -760:1:42 -761:0:2889 -762:2:2161 -763:0:2889 -764:1:143 -765:0:2889 -766:1:145 -767:0:2889 -768:2:2160 -769:0:2889 -770:1:44 -771:0:2889 -772:2:2161 -773:0:2889 -774:1:681 -775:1:682 -776:1:686 -777:1:687 -778:1:695 -779:1:696 -780:1:697 -781:1:709 -782:1:714 -783:1:718 -784:1:719 -785:1:727 -786:1:728 -787:1:732 -788:1:733 -789:1:727 -790:1:728 -791:1:732 -792:1:733 -793:1:741 -794:1:746 -795:1:747 -796:1:758 -797:1:759 -798:1:760 -799:1:771 -800:1:783 -801:1:784 -802:1:788 -803:1:789 -804:1:790 -805:1:788 -806:1:789 -807:1:790 -808:1:801 -809:0:2889 -810:1:40 -811:0:2889 -812:1:41 -813:0:2889 -814:2:2160 -815:0:2889 -816:1:42 -817:0:2889 -818:2:2161 -819:0:2889 -820:1:51 -821:0:2889 -822:2:2160 -823:0:2889 -824:1:55 -825:1:56 -826:1:60 -827:1:64 -828:1:65 -829:1:69 -830:1:77 -831:1:78 -832:1:82 -833:1:86 -834:1:87 -835:1:82 -836:1:86 -837:1:87 -838:1:91 -839:1:98 -840:1:105 -841:1:106 -842:1:113 -843:1:118 -844:1:125 -845:1:126 -846:1:125 -847:1:126 -848:1:133 -849:1:137 -850:0:2889 -851:2:2161 -852:0:2889 -853:1:142 -854:0:2889 -855:2:2162 -856:0:2889 -857:2:2167 -858:0:2889 -859:2:2168 -860:0:2889 -861:2:2176 -862:2:2177 -863:2:2181 -864:2:2185 -865:2:2186 -866:2:2190 -867:2:2198 -868:2:2199 -869:2:2203 -870:2:2207 -871:2:2208 -872:2:2203 -873:2:2207 -874:2:2208 -875:2:2212 -876:2:2219 -877:2:2226 -878:2:2227 -879:2:2234 -880:2:2239 -881:2:2246 -882:2:2247 -883:2:2246 -884:2:2247 -885:2:2254 -886:2:2258 -887:0:2889 -888:2:1369 -889:2:2051 -890:0:2889 -891:2:1179 -892:0:2889 -893:2:1370 -894:0:2889 -895:2:1179 -896:0:2889 -897:2:1373 -898:2:1374 -899:2:1378 -900:2:1379 -901:2:1387 -902:2:1388 -903:2:1392 -904:2:1393 -905:2:1401 -906:2:1406 -907:2:1410 -908:2:1411 -909:2:1419 -910:2:1420 -911:2:1424 -912:2:1425 -913:2:1419 -914:2:1420 -915:2:1424 -916:2:1425 -917:2:1433 -918:2:1438 -919:2:1439 -920:2:1450 -921:2:1451 -922:2:1452 -923:2:1463 -924:2:1468 -925:2:1469 -926:2:1480 -927:2:1481 -928:2:1482 -929:2:1480 -930:2:1481 -931:2:1482 -932:2:1493 -933:2:1500 -934:0:2889 -935:2:1179 -936:0:2889 -937:2:1504 -938:2:1505 -939:2:1506 -940:2:1518 -941:2:1519 -942:2:1523 -943:2:1524 -944:2:1532 -945:2:1537 -946:2:1541 -947:2:1542 -948:2:1550 -949:2:1551 -950:2:1555 -951:2:1556 -952:2:1550 -953:2:1551 -954:2:1555 -955:2:1556 -956:2:1564 -957:2:1569 -958:2:1570 -959:2:1581 -960:2:1582 -961:2:1583 -962:2:1594 -963:2:1599 -964:2:1600 -965:2:1611 -966:2:1612 -967:2:1613 -968:2:1611 -969:2:1612 -970:2:1613 -971:2:1624 -972:2:1634 -973:2:1635 -974:0:2889 -975:2:1179 -976:0:2889 -977:2:2039 -978:0:2889 -979:2:2664 -980:2:2665 -981:2:2669 -982:2:2673 -983:2:2674 -984:2:2678 -985:2:2686 -986:2:2687 -987:2:2691 -988:2:2695 -989:2:2696 -990:2:2691 -991:2:2695 -992:2:2696 -993:2:2700 -994:2:2707 -995:2:2714 -996:2:2715 -997:2:2722 -998:2:2727 -999:2:2734 -1000:2:2735 -1001:2:2734 -1002:2:2735 -1003:2:2742 -1004:2:2746 -1005:0:2889 -1006:2:2751 -1007:0:2889 -1008:2:2752 -1009:0:2889 -1010:2:2753 -1011:0:2889 -1012:2:2754 -1013:0:2889 -1014:1:51 -1015:0:2889 -1016:2:2755 -1017:0:2889 -1018:1:55 -1019:1:56 -1020:1:60 -1021:1:64 -1022:1:65 -1023:1:69 -1024:1:77 -1025:1:78 -1026:1:82 -1027:1:86 -1028:1:87 -1029:1:82 -1030:1:86 -1031:1:87 -1032:1:91 -1033:1:98 -1034:1:105 -1035:1:106 -1036:1:113 -1037:1:118 -1038:1:125 -1039:1:126 -1040:1:125 -1041:1:126 -1042:1:133 -1043:1:137 -1044:0:2889 -1045:2:2754 -1046:0:2889 -1047:1:142 -1048:0:2889 -1049:2:2755 -1050:0:2889 -1051:2:2756 -1052:0:2889 -1053:2:2761 -1054:0:2889 -1055:2:2762 -1056:0:2889 -1057:2:2770 -1058:2:2771 -1059:2:2775 -1060:2:2779 -1061:2:2780 -1062:2:2784 -1063:2:2792 -1064:2:2793 -1065:2:2797 -1066:2:2801 -1067:2:2802 -1068:2:2797 -1069:2:2801 -1070:2:2802 -1071:2:2806 -1072:2:2813 -1073:2:2820 -1074:2:2821 -1075:2:2828 -1076:2:2833 -1077:2:2840 -1078:2:2841 -1079:2:2840 -1080:2:2841 -1081:2:2848 -1082:2:2852 -1083:0:2889 -1084:2:2041 -1085:2:2051 -1086:0:2889 -1087:2:1179 -1088:0:2889 -1089:2:2042 -1090:2:2043 -1091:0:2889 -1092:2:1179 -1093:0:2889 -1094:2:2047 -1095:0:2889 -1096:2:2055 -1097:0:2889 -1098:2:1172 -1099:0:2889 -1100:2:1174 -1101:0:2889 -1102:2:1175 -1103:0:2889 -1104:2:1176 -1105:0:2889 -1106:2:1177 -1107:0:2889 -1108:2:1178 -1109:0:2889 -1110:2:1179 -1111:0:2889 -1112:2:1180 -1113:2:1181 -1114:2:1185 -1115:2:1186 -1116:2:1194 -1117:2:1195 -1118:2:1199 -1119:2:1200 -1120:2:1208 -1121:2:1213 -1122:2:1217 -1123:2:1218 -1124:2:1226 -1125:2:1227 -1126:2:1231 -1127:2:1232 -1128:2:1226 -1129:2:1227 -1130:2:1228 -1131:2:1240 -1132:2:1245 -1133:2:1246 -1134:2:1257 -1135:2:1258 -1136:2:1259 -1137:2:1270 -1138:2:1275 -1139:2:1276 -1140:2:1287 -1141:2:1288 -1142:2:1289 -1143:2:1287 -1144:2:1288 -1145:2:1289 -1146:2:1300 -1147:2:1308 -1148:0:2889 -1149:2:1179 -1150:0:2889 -1151:1:143 -1152:0:2889 -1153:1:145 -1154:0:2889 -1155:1:44 -1156:0:2889 -1157:1:810 -1158:0:2889 -1159:1:1087 -1160:1:1094 -1161:1:1095 -1162:1:1102 -1163:1:1107 -1164:1:1114 -1165:1:1115 -1166:1:1114 -1167:1:1115 -1168:1:1122 -1169:1:1126 -1170:0:2889 -1171:2:1312 -1172:2:1316 -1173:2:1317 -1174:2:1321 -1175:2:1325 -1176:2:1326 -1177:2:1330 -1178:2:1338 -1179:2:1339 -1180:2:1343 -1181:2:1347 -1182:2:1348 -1183:2:1343 -1184:2:1344 -1185:2:1352 -1186:0:2889 -1187:2:1179 -1188:0:2889 -1189:2:1360 -1190:2:1361 -1191:2:1362 -1192:0:2889 -1193:2:1179 -1194:0:2889 -1195:2:1367 -1196:0:2889 -1197:2:2070 -1198:2:2071 -1199:2:2075 -1200:2:2079 -1201:2:2080 -1202:2:2084 -1203:2:2089 -1204:2:2097 -1205:2:2101 -1206:2:2102 -1207:2:2097 -1208:2:2101 -1209:2:2102 -1210:2:2106 -1211:2:2113 -1212:2:2120 -1213:2:2121 -1214:2:2128 -1215:2:2133 -1216:2:2140 -1217:2:2141 -1218:2:2140 -1219:2:2141 -1220:2:2148 -1221:2:2152 -1222:0:2889 -1223:2:2157 -1224:0:2889 -1225:2:2158 -1226:0:2889 -1227:2:2159 -1228:0:2889 -1229:2:2160 -1230:0:2889 -1231:1:812 -1232:1:813 -1233:0:2887 -1234:2:2161 -1235:0:2893 -1236:1:1005 diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress.ltl b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_reader.define b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_reader.log b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_reader.log deleted file mode 100644 index 0fc4f7a..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_reader.log +++ /dev/null @@ -1,305 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_reader.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1179) -depth 7: Claim reached state 9 (line 1184) -depth 136: Claim reached state 9 (line 1183) -Depth= 12986 States= 1e+06 Transitions= 1.85e+08 Memory= 494.963 t= 294 R= 3e+03 -Depth= 12986 States= 2e+06 Transitions= 6.44e+08 Memory= 520.744 t= 1.06e+03 R= 2e+03 -Depth= 12986 States= 3e+06 Transitions= 1.24e+09 Memory= 545.842 t= 2.08e+03 R= 1e+03 -pan: resizing hashtable to -w22.. done -Depth= 12986 States= 4e+06 Transitions= 1.65e+09 Memory= 602.940 t= 2.76e+03 R= 1e+03 -Depth= 12986 States= 5e+06 Transitions= 2e+09 Memory= 629.111 t= 3.34e+03 R= 1e+03 -Depth= 12986 States= 6e+06 Transitions= 2.47e+09 Memory= 655.283 t= 4.12e+03 R= 1e+03 -Depth= 12986 States= 7e+06 Transitions= 2.94e+09 Memory= 681.260 t= 4.93e+03 R= 1e+03 -Depth= 12986 States= 8e+06 Transitions= 3.45e+09 Memory= 705.967 t= 5.79e+03 R= 1e+03 -Depth= 12986 States= 9e+06 Transitions= 3.84e+09 Memory= 732.529 t= 6.46e+03 R= 1e+03 -pan: resizing hashtable to -w24.. done -Depth= 12986 States= 1e+07 Transitions= 4.23e+09 Memory= 882.404 t= 7.1e+03 R= 1e+03 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 80 byte, depth reached 12986, errors: 0 - 5822478 states, stored (1.02932e+07 visited) -4.3658924e+09 states, matched -4.3761856e+09 transitions (= visited+matched) -2.5547511e+10 atomic steps -hash conflicts: 1.1937107e+09 (resolved) - -Stats on memory usage (in Megabytes): - 644.119 equivalent memory usage for states (stored*(State-vector + overhead)) - 303.976 actual memory usage for states (compression: 47.19%) - state-vector as stored = 19 byte + 36 byte overhead - 128.000 memory used for hash table (-w24) - 457.764 memory used for DFS stack (-m10000000) - 889.631 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 28603 2179 2102 2 2 ] -unreached in proctype urcu_reader - line 268, "pan.___", state 55, "cache_dirty_urcu_gp_ctr = 0" - line 276, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 86, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 102, "(1)" - line 249, "pan.___", state 110, "(1)" - line 253, "pan.___", state 122, "(1)" - line 257, "pan.___", state 130, "(1)" - line 404, "pan.___", state 156, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 188, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 202, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 221, "(1)" - line 431, "pan.___", state 251, "(1)" - line 435, "pan.___", state 264, "(1)" - line 614, "pan.___", state 285, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 404, "pan.___", state 292, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 324, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 338, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 357, "(1)" - line 431, "pan.___", state 387, "(1)" - line 435, "pan.___", state 400, "(1)" - line 404, "pan.___", state 421, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 453, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 467, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 486, "(1)" - line 431, "pan.___", state 516, "(1)" - line 435, "pan.___", state 529, "(1)" - line 404, "pan.___", state 552, "cache_dirty_urcu_gp_ctr = 0" - line 404, "pan.___", state 554, "(1)" - line 404, "pan.___", state 555, "(cache_dirty_urcu_gp_ctr)" - line 404, "pan.___", state 555, "else" - line 404, "pan.___", state 558, "(1)" - line 408, "pan.___", state 566, "cache_dirty_urcu_active_readers = 0" - line 408, "pan.___", state 568, "(1)" - line 408, "pan.___", state 569, "(cache_dirty_urcu_active_readers)" - line 408, "pan.___", state 569, "else" - line 408, "pan.___", state 572, "(1)" - line 408, "pan.___", state 573, "(1)" - line 408, "pan.___", state 573, "(1)" - line 406, "pan.___", state 578, "((i<1))" - line 406, "pan.___", state 578, "((i>=1))" - line 413, "pan.___", state 584, "cache_dirty_rcu_ptr = 0" - line 413, "pan.___", state 586, "(1)" - line 413, "pan.___", state 587, "(cache_dirty_rcu_ptr)" - line 413, "pan.___", state 587, "else" - line 413, "pan.___", state 590, "(1)" - line 413, "pan.___", state 591, "(1)" - line 413, "pan.___", state 591, "(1)" - line 417, "pan.___", state 598, "cache_dirty_rcu_data[i] = 0" - line 417, "pan.___", state 600, "(1)" - line 417, "pan.___", state 601, "(cache_dirty_rcu_data[i])" - line 417, "pan.___", state 601, "else" - line 417, "pan.___", state 604, "(1)" - line 417, "pan.___", state 605, "(1)" - line 417, "pan.___", state 605, "(1)" - line 415, "pan.___", state 610, "((i<2))" - line 415, "pan.___", state 610, "((i>=2))" - line 422, "pan.___", state 617, "(1)" - line 422, "pan.___", state 618, "(!(cache_dirty_urcu_gp_ctr))" - line 422, "pan.___", state 618, "else" - line 422, "pan.___", state 621, "(1)" - line 422, "pan.___", state 622, "(1)" - line 422, "pan.___", state 622, "(1)" - line 426, "pan.___", state 630, "(1)" - line 426, "pan.___", state 631, "(!(cache_dirty_urcu_active_readers))" - line 426, "pan.___", state 631, "else" - line 426, "pan.___", state 634, "(1)" - line 426, "pan.___", state 635, "(1)" - line 426, "pan.___", state 635, "(1)" - line 424, "pan.___", state 640, "((i<1))" - line 424, "pan.___", state 640, "((i>=1))" - line 431, "pan.___", state 647, "(1)" - line 431, "pan.___", state 648, "(!(cache_dirty_rcu_ptr))" - line 431, "pan.___", state 648, "else" - line 431, "pan.___", state 651, "(1)" - line 431, "pan.___", state 652, "(1)" - line 431, "pan.___", state 652, "(1)" - line 435, "pan.___", state 660, "(1)" - line 435, "pan.___", state 661, "(!(cache_dirty_rcu_data[i]))" - line 435, "pan.___", state 661, "else" - line 435, "pan.___", state 664, "(1)" - line 435, "pan.___", state 665, "(1)" - line 435, "pan.___", state 665, "(1)" - line 433, "pan.___", state 670, "((i<2))" - line 433, "pan.___", state 670, "((i>=2))" - line 443, "pan.___", state 674, "(1)" - line 443, "pan.___", state 674, "(1)" - line 614, "pan.___", state 677, "cached_urcu_active_readers = (tmp+1)" - line 614, "pan.___", state 678, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 614, "pan.___", state 679, "(1)" - line 404, "pan.___", state 686, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 718, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 732, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 751, "(1)" - line 431, "pan.___", state 781, "(1)" - line 435, "pan.___", state 794, "(1)" - line 404, "pan.___", state 821, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 853, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 867, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 886, "(1)" - line 431, "pan.___", state 916, "(1)" - line 435, "pan.___", state 929, "(1)" - line 404, "pan.___", state 950, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 982, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 996, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 1015, "(1)" - line 431, "pan.___", state 1045, "(1)" - line 435, "pan.___", state 1058, "(1)" - line 245, "pan.___", state 1091, "(1)" - line 253, "pan.___", state 1111, "(1)" - line 257, "pan.___", state 1119, "(1)" - line 748, "pan.___", state 1136, "-end-" - (91 of 1136 states) -unreached in proctype urcu_writer - line 404, "pan.___", state 45, "cache_dirty_urcu_gp_ctr = 0" - line 408, "pan.___", state 59, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 422, "pan.___", state 110, "(1)" - line 426, "pan.___", state 123, "(1)" - line 431, "pan.___", state 140, "(1)" - line 268, "pan.___", state 176, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 185, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 198, "cache_dirty_rcu_ptr = 0" - line 404, "pan.___", state 238, "cache_dirty_urcu_gp_ctr = 0" - line 408, "pan.___", state 252, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 270, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 284, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 303, "(1)" - line 426, "pan.___", state 316, "(1)" - line 431, "pan.___", state 333, "(1)" - line 435, "pan.___", state 346, "(1)" - line 408, "pan.___", state 383, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 401, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 415, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 447, "(1)" - line 431, "pan.___", state 464, "(1)" - line 435, "pan.___", state 477, "(1)" - line 408, "pan.___", state 522, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 540, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 554, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 586, "(1)" - line 431, "pan.___", state 603, "(1)" - line 435, "pan.___", state 616, "(1)" - line 408, "pan.___", state 651, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 669, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 683, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 715, "(1)" - line 431, "pan.___", state 732, "(1)" - line 435, "pan.___", state 745, "(1)" - line 408, "pan.___", state 782, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 800, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 814, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 846, "(1)" - line 431, "pan.___", state 863, "(1)" - line 435, "pan.___", state 876, "(1)" - line 268, "pan.___", state 926, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 935, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 948, "cache_dirty_rcu_ptr = 0" - line 245, "pan.___", state 973, "(1)" - line 249, "pan.___", state 981, "(1)" - line 253, "pan.___", state 993, "(1)" - line 257, "pan.___", state 1001, "(1)" - line 268, "pan.___", state 1032, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1041, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1054, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1063, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1079, "(1)" - line 249, "pan.___", state 1087, "(1)" - line 253, "pan.___", state 1099, "(1)" - line 257, "pan.___", state 1107, "(1)" - line 268, "pan.___", state 1128, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1137, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1152, "(1)" - line 280, "pan.___", state 1159, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1175, "(1)" - line 249, "pan.___", state 1183, "(1)" - line 253, "pan.___", state 1195, "(1)" - line 257, "pan.___", state 1203, "(1)" - line 268, "pan.___", state 1234, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1243, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1256, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1265, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1281, "(1)" - line 249, "pan.___", state 1289, "(1)" - line 253, "pan.___", state 1301, "(1)" - line 257, "pan.___", state 1309, "(1)" - line 272, "pan.___", state 1335, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1348, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1357, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1373, "(1)" - line 249, "pan.___", state 1381, "(1)" - line 253, "pan.___", state 1393, "(1)" - line 257, "pan.___", state 1401, "(1)" - line 268, "pan.___", state 1432, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1441, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1454, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1463, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1479, "(1)" - line 249, "pan.___", state 1487, "(1)" - line 253, "pan.___", state 1499, "(1)" - line 257, "pan.___", state 1507, "(1)" - line 272, "pan.___", state 1533, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1546, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1555, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1571, "(1)" - line 249, "pan.___", state 1579, "(1)" - line 253, "pan.___", state 1591, "(1)" - line 257, "pan.___", state 1599, "(1)" - line 268, "pan.___", state 1630, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1639, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1652, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1661, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1677, "(1)" - line 249, "pan.___", state 1685, "(1)" - line 253, "pan.___", state 1697, "(1)" - line 257, "pan.___", state 1705, "(1)" - line 272, "pan.___", state 1731, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1744, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1753, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1769, "(1)" - line 249, "pan.___", state 1777, "(1)" - line 253, "pan.___", state 1789, "(1)" - line 257, "pan.___", state 1797, "(1)" - line 268, "pan.___", state 1828, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1837, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1850, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1859, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1875, "(1)" - line 249, "pan.___", state 1883, "(1)" - line 253, "pan.___", state 1895, "(1)" - line 257, "pan.___", state 1903, "(1)" - line 1123, "pan.___", state 1919, "-end-" - (118 of 1919 states) -unreached in proctype :init: - (0 of 26 states) -unreached in proctype :never: - line 1186, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 7.33e+03 seconds -pan: rate 1403.7352 states/second -pan: avg transition delay 1.6756e-06 usec -cp .input.spin urcu_progress_reader.spin.input -cp .input.spin.trail urcu_progress_reader.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_reader.spin.input b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_reader.spin.input deleted file mode 100644 index 1e7da85..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_reader.spin.input +++ /dev/null @@ -1,1157 +0,0 @@ -#define READER_PROGRESS - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN, READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT, 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT, /* post-dominant */ - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_OUT, /* RAW */ - READ_UNLOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - data_read_first[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer.define b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer.log b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer.log deleted file mode 100644 index ed8fbc3..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer.log +++ /dev/null @@ -1,290 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1179) -depth 7: Claim reached state 9 (line 1184) -depth 46: Claim reached state 9 (line 1183) -Depth= 3817 States= 1e+06 Transitions= 2.94e+08 Memory= 492.912 t= 480 R= 2e+03 -Depth= 3900 States= 2e+06 Transitions= 6.63e+08 Memory= 519.572 t= 1.09e+03 R= 2e+03 -Depth= 3900 States= 3e+06 Transitions= 1.33e+09 Memory= 543.986 t= 2.23e+03 R= 1e+03 -pan: resizing hashtable to -w22.. done -Depth= 3900 States= 4e+06 Transitions= 1.71e+09 Memory= 601.279 t= 2.86e+03 R= 1e+03 -Depth= 3900 States= 5e+06 Transitions= 2.06e+09 Memory= 627.647 t= 3.45e+03 R= 1e+03 -Depth= 3900 States= 6e+06 Transitions= 2.49e+09 Memory= 653.818 t= 4.18e+03 R= 1e+03 -Depth= 3900 States= 7e+06 Transitions= 3.14e+09 Memory= 678.135 t= 5.28e+03 R= 1e+03 -Depth= 3900 States= 8e+06 Transitions= 3.52e+09 Memory= 704.404 t= 5.93e+03 R= 1e+03 -Depth= 3900 States= 9e+06 Transitions= 3.88e+09 Memory= 730.869 t= 6.53e+03 R= 1e+03 -pan: resizing hashtable to -w24.. done -Depth= 3900 States= 1e+07 Transitions= 4.34e+09 Memory= 880.451 t= 7.29e+03 R= 1e+03 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 80 byte, depth reached 3900, errors: 0 - 5638524 states, stored (1.00251e+07 visited) -4.3347674e+09 states, matched -4.3447924e+09 transitions (= visited+matched) -2.5387604e+10 atomic steps -hash conflicts: 1.1627355e+09 (resolved) - -Stats on memory usage (in Megabytes): - 623.769 equivalent memory usage for states (stored*(State-vector + overhead)) - 295.411 actual memory usage for states (compression: 47.36%) - state-vector as stored = 19 byte + 36 byte overhead - 128.000 memory used for hash table (-w24) - 457.764 memory used for DFS stack (-m10000000) - 881.037 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 26786 2128 1995 2 2 ] -unreached in proctype urcu_reader - line 268, "pan.___", state 55, "cache_dirty_urcu_gp_ctr = 0" - line 276, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 86, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 102, "(1)" - line 249, "pan.___", state 110, "(1)" - line 253, "pan.___", state 122, "(1)" - line 257, "pan.___", state 130, "(1)" - line 404, "pan.___", state 156, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 188, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 202, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 221, "(1)" - line 431, "pan.___", state 251, "(1)" - line 435, "pan.___", state 264, "(1)" - line 614, "pan.___", state 285, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 404, "pan.___", state 292, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 324, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 338, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 357, "(1)" - line 431, "pan.___", state 387, "(1)" - line 435, "pan.___", state 400, "(1)" - line 404, "pan.___", state 421, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 453, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 467, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 486, "(1)" - line 431, "pan.___", state 516, "(1)" - line 435, "pan.___", state 529, "(1)" - line 404, "pan.___", state 552, "cache_dirty_urcu_gp_ctr = 0" - line 404, "pan.___", state 554, "(1)" - line 404, "pan.___", state 555, "(cache_dirty_urcu_gp_ctr)" - line 404, "pan.___", state 555, "else" - line 404, "pan.___", state 558, "(1)" - line 408, "pan.___", state 566, "cache_dirty_urcu_active_readers = 0" - line 408, "pan.___", state 568, "(1)" - line 408, "pan.___", state 569, "(cache_dirty_urcu_active_readers)" - line 408, "pan.___", state 569, "else" - line 408, "pan.___", state 572, "(1)" - line 408, "pan.___", state 573, "(1)" - line 408, "pan.___", state 573, "(1)" - line 406, "pan.___", state 578, "((i<1))" - line 406, "pan.___", state 578, "((i>=1))" - line 413, "pan.___", state 584, "cache_dirty_rcu_ptr = 0" - line 413, "pan.___", state 586, "(1)" - line 413, "pan.___", state 587, "(cache_dirty_rcu_ptr)" - line 413, "pan.___", state 587, "else" - line 413, "pan.___", state 590, "(1)" - line 413, "pan.___", state 591, "(1)" - line 413, "pan.___", state 591, "(1)" - line 417, "pan.___", state 598, "cache_dirty_rcu_data[i] = 0" - line 417, "pan.___", state 600, "(1)" - line 417, "pan.___", state 601, "(cache_dirty_rcu_data[i])" - line 417, "pan.___", state 601, "else" - line 417, "pan.___", state 604, "(1)" - line 417, "pan.___", state 605, "(1)" - line 417, "pan.___", state 605, "(1)" - line 415, "pan.___", state 610, "((i<2))" - line 415, "pan.___", state 610, "((i>=2))" - line 422, "pan.___", state 617, "(1)" - line 422, "pan.___", state 618, "(!(cache_dirty_urcu_gp_ctr))" - line 422, "pan.___", state 618, "else" - line 422, "pan.___", state 621, "(1)" - line 422, "pan.___", state 622, "(1)" - line 422, "pan.___", state 622, "(1)" - line 426, "pan.___", state 630, "(1)" - line 426, "pan.___", state 631, "(!(cache_dirty_urcu_active_readers))" - line 426, "pan.___", state 631, "else" - line 426, "pan.___", state 634, "(1)" - line 426, "pan.___", state 635, "(1)" - line 426, "pan.___", state 635, "(1)" - line 424, "pan.___", state 640, "((i<1))" - line 424, "pan.___", state 640, "((i>=1))" - line 431, "pan.___", state 647, "(1)" - line 431, "pan.___", state 648, "(!(cache_dirty_rcu_ptr))" - line 431, "pan.___", state 648, "else" - line 431, "pan.___", state 651, "(1)" - line 431, "pan.___", state 652, "(1)" - line 431, "pan.___", state 652, "(1)" - line 435, "pan.___", state 660, "(1)" - line 435, "pan.___", state 661, "(!(cache_dirty_rcu_data[i]))" - line 435, "pan.___", state 661, "else" - line 435, "pan.___", state 664, "(1)" - line 435, "pan.___", state 665, "(1)" - line 435, "pan.___", state 665, "(1)" - line 433, "pan.___", state 670, "((i<2))" - line 433, "pan.___", state 670, "((i>=2))" - line 443, "pan.___", state 674, "(1)" - line 443, "pan.___", state 674, "(1)" - line 614, "pan.___", state 677, "cached_urcu_active_readers = (tmp+1)" - line 614, "pan.___", state 678, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 614, "pan.___", state 679, "(1)" - line 404, "pan.___", state 686, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 718, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 732, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 751, "(1)" - line 431, "pan.___", state 781, "(1)" - line 435, "pan.___", state 794, "(1)" - line 404, "pan.___", state 821, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 853, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 867, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 886, "(1)" - line 431, "pan.___", state 916, "(1)" - line 435, "pan.___", state 929, "(1)" - line 404, "pan.___", state 950, "cache_dirty_urcu_gp_ctr = 0" - line 413, "pan.___", state 982, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 996, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 1015, "(1)" - line 431, "pan.___", state 1045, "(1)" - line 435, "pan.___", state 1058, "(1)" - line 245, "pan.___", state 1091, "(1)" - line 253, "pan.___", state 1111, "(1)" - line 257, "pan.___", state 1119, "(1)" - line 748, "pan.___", state 1136, "-end-" - (91 of 1136 states) -unreached in proctype urcu_writer - line 404, "pan.___", state 45, "cache_dirty_urcu_gp_ctr = 0" - line 408, "pan.___", state 59, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 422, "pan.___", state 110, "(1)" - line 426, "pan.___", state 123, "(1)" - line 431, "pan.___", state 140, "(1)" - line 268, "pan.___", state 176, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 185, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 198, "cache_dirty_rcu_ptr = 0" - line 404, "pan.___", state 238, "cache_dirty_urcu_gp_ctr = 0" - line 408, "pan.___", state 252, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 270, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 284, "cache_dirty_rcu_data[i] = 0" - line 422, "pan.___", state 303, "(1)" - line 426, "pan.___", state 316, "(1)" - line 431, "pan.___", state 333, "(1)" - line 435, "pan.___", state 346, "(1)" - line 408, "pan.___", state 383, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 401, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 415, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 447, "(1)" - line 431, "pan.___", state 464, "(1)" - line 435, "pan.___", state 477, "(1)" - line 408, "pan.___", state 522, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 540, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 554, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 586, "(1)" - line 431, "pan.___", state 603, "(1)" - line 435, "pan.___", state 616, "(1)" - line 408, "pan.___", state 651, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 669, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 683, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 715, "(1)" - line 431, "pan.___", state 732, "(1)" - line 435, "pan.___", state 745, "(1)" - line 408, "pan.___", state 782, "cache_dirty_urcu_active_readers = 0" - line 413, "pan.___", state 800, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 814, "cache_dirty_rcu_data[i] = 0" - line 426, "pan.___", state 846, "(1)" - line 431, "pan.___", state 863, "(1)" - line 435, "pan.___", state 876, "(1)" - line 268, "pan.___", state 931, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 940, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 955, "(1)" - line 280, "pan.___", state 962, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 978, "(1)" - line 249, "pan.___", state 986, "(1)" - line 253, "pan.___", state 998, "(1)" - line 257, "pan.___", state 1006, "(1)" - line 268, "pan.___", state 1037, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1046, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1059, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1068, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1084, "(1)" - line 249, "pan.___", state 1092, "(1)" - line 253, "pan.___", state 1104, "(1)" - line 257, "pan.___", state 1112, "(1)" - line 272, "pan.___", state 1138, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1151, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1160, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1176, "(1)" - line 249, "pan.___", state 1184, "(1)" - line 253, "pan.___", state 1196, "(1)" - line 257, "pan.___", state 1204, "(1)" - line 268, "pan.___", state 1235, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1244, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1257, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1266, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1282, "(1)" - line 249, "pan.___", state 1290, "(1)" - line 253, "pan.___", state 1302, "(1)" - line 257, "pan.___", state 1310, "(1)" - line 272, "pan.___", state 1336, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1349, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1358, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1374, "(1)" - line 249, "pan.___", state 1382, "(1)" - line 253, "pan.___", state 1394, "(1)" - line 257, "pan.___", state 1402, "(1)" - line 268, "pan.___", state 1433, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1442, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1455, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1464, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1480, "(1)" - line 249, "pan.___", state 1488, "(1)" - line 253, "pan.___", state 1500, "(1)" - line 257, "pan.___", state 1508, "(1)" - line 272, "pan.___", state 1534, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1547, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1556, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1572, "(1)" - line 249, "pan.___", state 1580, "(1)" - line 253, "pan.___", state 1592, "(1)" - line 257, "pan.___", state 1600, "(1)" - line 268, "pan.___", state 1631, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1640, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1653, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1662, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1678, "(1)" - line 249, "pan.___", state 1686, "(1)" - line 253, "pan.___", state 1698, "(1)" - line 257, "pan.___", state 1706, "(1)" - line 1123, "pan.___", state 1722, "-end-" - (103 of 1722 states) -unreached in proctype :init: - (0 of 26 states) -unreached in proctype :never: - line 1186, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 7.3e+03 seconds -pan: rate 1373.8126 states/second -pan: avg transition delay 1.6795e-06 usec -cp .input.spin urcu_progress_writer.spin.input -cp .input.spin.trail urcu_progress_writer.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer.spin.input b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer.spin.input deleted file mode 100644 index 4f98f45..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer.spin.input +++ /dev/null @@ -1,1157 +0,0 @@ -#define WRITER_PROGRESS - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN, READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT, 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT, /* post-dominant */ - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_OUT, /* RAW */ - READ_UNLOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - data_read_first[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer_error.define b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer_error.log b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer_error.log deleted file mode 100644 index b95b25e..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer_error.log +++ /dev/null @@ -1,315 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer_error.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1180) -depth 7: Claim reached state 9 (line 1185) -depth 46: Claim reached state 9 (line 1184) -pan: acceptance cycle (at depth 3798) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 80 byte, depth reached 3956, errors: 1 - 139740 states, stored (233412 visited) - 43234612 states, matched - 43468024 transitions (= visited+matched) -2.3201732e+08 atomic steps -hash conflicts: 937081 (resolved) - -Stats on memory usage (in Megabytes): - 15.459 equivalent memory usage for states (stored*(State-vector + overhead)) - 7.007 actual memory usage for states (compression: 45.33%) - state-vector as stored = 17 byte + 36 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 472.697 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 1001 532 228 2 2 ] -unreached in proctype urcu_reader - line 269, "pan.___", state 55, "cache_dirty_urcu_gp_ctr = 0" - line 277, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 281, "pan.___", state 86, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 102, "(1)" - line 250, "pan.___", state 110, "(1)" - line 254, "pan.___", state 122, "(1)" - line 258, "pan.___", state 130, "(1)" - line 405, "pan.___", state 156, "cache_dirty_urcu_gp_ctr = 0" - line 414, "pan.___", state 188, "cache_dirty_rcu_ptr = 0" - line 418, "pan.___", state 202, "cache_dirty_rcu_data[i] = 0" - line 423, "pan.___", state 221, "(1)" - line 432, "pan.___", state 251, "(1)" - line 436, "pan.___", state 264, "(1)" - line 615, "pan.___", state 285, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 405, "pan.___", state 292, "cache_dirty_urcu_gp_ctr = 0" - line 414, "pan.___", state 324, "cache_dirty_rcu_ptr = 0" - line 418, "pan.___", state 338, "cache_dirty_rcu_data[i] = 0" - line 423, "pan.___", state 357, "(1)" - line 432, "pan.___", state 387, "(1)" - line 436, "pan.___", state 400, "(1)" - line 405, "pan.___", state 421, "cache_dirty_urcu_gp_ctr = 0" - line 414, "pan.___", state 453, "cache_dirty_rcu_ptr = 0" - line 418, "pan.___", state 467, "cache_dirty_rcu_data[i] = 0" - line 423, "pan.___", state 486, "(1)" - line 432, "pan.___", state 516, "(1)" - line 436, "pan.___", state 529, "(1)" - line 405, "pan.___", state 552, "cache_dirty_urcu_gp_ctr = 0" - line 405, "pan.___", state 554, "(1)" - line 405, "pan.___", state 555, "(cache_dirty_urcu_gp_ctr)" - line 405, "pan.___", state 555, "else" - line 405, "pan.___", state 558, "(1)" - line 409, "pan.___", state 566, "cache_dirty_urcu_active_readers = 0" - line 409, "pan.___", state 568, "(1)" - line 409, "pan.___", state 569, "(cache_dirty_urcu_active_readers)" - line 409, "pan.___", state 569, "else" - line 409, "pan.___", state 572, "(1)" - line 409, "pan.___", state 573, "(1)" - line 409, "pan.___", state 573, "(1)" - line 407, "pan.___", state 578, "((i<1))" - line 407, "pan.___", state 578, "((i>=1))" - line 414, "pan.___", state 584, "cache_dirty_rcu_ptr = 0" - line 414, "pan.___", state 586, "(1)" - line 414, "pan.___", state 587, "(cache_dirty_rcu_ptr)" - line 414, "pan.___", state 587, "else" - line 414, "pan.___", state 590, "(1)" - line 414, "pan.___", state 591, "(1)" - line 414, "pan.___", state 591, "(1)" - line 418, "pan.___", state 598, "cache_dirty_rcu_data[i] = 0" - line 418, "pan.___", state 600, "(1)" - line 418, "pan.___", state 601, "(cache_dirty_rcu_data[i])" - line 418, "pan.___", state 601, "else" - line 418, "pan.___", state 604, "(1)" - line 418, "pan.___", state 605, "(1)" - line 418, "pan.___", state 605, "(1)" - line 416, "pan.___", state 610, "((i<2))" - line 416, "pan.___", state 610, "((i>=2))" - line 423, "pan.___", state 617, "(1)" - line 423, "pan.___", state 618, "(!(cache_dirty_urcu_gp_ctr))" - line 423, "pan.___", state 618, "else" - line 423, "pan.___", state 621, "(1)" - line 423, "pan.___", state 622, "(1)" - line 423, "pan.___", state 622, "(1)" - line 427, "pan.___", state 630, "(1)" - line 427, "pan.___", state 631, "(!(cache_dirty_urcu_active_readers))" - line 427, "pan.___", state 631, "else" - line 427, "pan.___", state 634, "(1)" - line 427, "pan.___", state 635, "(1)" - line 427, "pan.___", state 635, "(1)" - line 425, "pan.___", state 640, "((i<1))" - line 425, "pan.___", state 640, "((i>=1))" - line 432, "pan.___", state 647, "(1)" - line 432, "pan.___", state 648, "(!(cache_dirty_rcu_ptr))" - line 432, "pan.___", state 648, "else" - line 432, "pan.___", state 651, "(1)" - line 432, "pan.___", state 652, "(1)" - line 432, "pan.___", state 652, "(1)" - line 436, "pan.___", state 660, "(1)" - line 436, "pan.___", state 661, "(!(cache_dirty_rcu_data[i]))" - line 436, "pan.___", state 661, "else" - line 436, "pan.___", state 664, "(1)" - line 436, "pan.___", state 665, "(1)" - line 436, "pan.___", state 665, "(1)" - line 434, "pan.___", state 670, "((i<2))" - line 434, "pan.___", state 670, "((i>=2))" - line 444, "pan.___", state 674, "(1)" - line 444, "pan.___", state 674, "(1)" - line 615, "pan.___", state 677, "cached_urcu_active_readers = (tmp+1)" - line 615, "pan.___", state 678, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 615, "pan.___", state 679, "(1)" - line 405, "pan.___", state 686, "cache_dirty_urcu_gp_ctr = 0" - line 414, "pan.___", state 718, "cache_dirty_rcu_ptr = 0" - line 418, "pan.___", state 732, "cache_dirty_rcu_data[i] = 0" - line 423, "pan.___", state 751, "(1)" - line 432, "pan.___", state 781, "(1)" - line 436, "pan.___", state 794, "(1)" - line 405, "pan.___", state 821, "cache_dirty_urcu_gp_ctr = 0" - line 414, "pan.___", state 853, "cache_dirty_rcu_ptr = 0" - line 418, "pan.___", state 867, "cache_dirty_rcu_data[i] = 0" - line 423, "pan.___", state 886, "(1)" - line 432, "pan.___", state 916, "(1)" - line 436, "pan.___", state 929, "(1)" - line 405, "pan.___", state 950, "cache_dirty_urcu_gp_ctr = 0" - line 414, "pan.___", state 982, "cache_dirty_rcu_ptr = 0" - line 418, "pan.___", state 996, "cache_dirty_rcu_data[i] = 0" - line 423, "pan.___", state 1015, "(1)" - line 432, "pan.___", state 1045, "(1)" - line 436, "pan.___", state 1058, "(1)" - line 246, "pan.___", state 1091, "(1)" - line 254, "pan.___", state 1111, "(1)" - line 258, "pan.___", state 1119, "(1)" - line 749, "pan.___", state 1136, "-end-" - (91 of 1136 states) -unreached in proctype urcu_writer - line 405, "pan.___", state 45, "cache_dirty_urcu_gp_ctr = 0" - line 409, "pan.___", state 59, "cache_dirty_urcu_active_readers = 0" - line 414, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 423, "pan.___", state 110, "(1)" - line 427, "pan.___", state 123, "(1)" - line 432, "pan.___", state 140, "(1)" - line 269, "pan.___", state 176, "cache_dirty_urcu_gp_ctr = 0" - line 273, "pan.___", state 185, "cache_dirty_urcu_active_readers = 0" - line 277, "pan.___", state 198, "cache_dirty_rcu_ptr = 0" - line 405, "pan.___", state 238, "cache_dirty_urcu_gp_ctr = 0" - line 409, "pan.___", state 252, "cache_dirty_urcu_active_readers = 0" - line 414, "pan.___", state 270, "cache_dirty_rcu_ptr = 0" - line 418, "pan.___", state 284, "cache_dirty_rcu_data[i] = 0" - line 423, "pan.___", state 303, "(1)" - line 427, "pan.___", state 316, "(1)" - line 432, "pan.___", state 333, "(1)" - line 436, "pan.___", state 346, "(1)" - line 409, "pan.___", state 383, "cache_dirty_urcu_active_readers = 0" - line 414, "pan.___", state 401, "cache_dirty_rcu_ptr = 0" - line 418, "pan.___", state 415, "cache_dirty_rcu_data[i] = 0" - line 427, "pan.___", state 447, "(1)" - line 432, "pan.___", state 464, "(1)" - line 436, "pan.___", state 477, "(1)" - line 405, "pan.___", state 504, "cache_dirty_urcu_gp_ctr = 0" - line 405, "pan.___", state 506, "(1)" - line 405, "pan.___", state 507, "(cache_dirty_urcu_gp_ctr)" - line 405, "pan.___", state 507, "else" - line 405, "pan.___", state 510, "(1)" - line 409, "pan.___", state 518, "cache_dirty_urcu_active_readers = 0" - line 409, "pan.___", state 520, "(1)" - line 409, "pan.___", state 521, "(cache_dirty_urcu_active_readers)" - line 409, "pan.___", state 521, "else" - line 409, "pan.___", state 524, "(1)" - line 409, "pan.___", state 525, "(1)" - line 409, "pan.___", state 525, "(1)" - line 407, "pan.___", state 530, "((i<1))" - line 407, "pan.___", state 530, "((i>=1))" - line 414, "pan.___", state 536, "cache_dirty_rcu_ptr = 0" - line 414, "pan.___", state 538, "(1)" - line 414, "pan.___", state 539, "(cache_dirty_rcu_ptr)" - line 414, "pan.___", state 539, "else" - line 414, "pan.___", state 542, "(1)" - line 414, "pan.___", state 543, "(1)" - line 414, "pan.___", state 543, "(1)" - line 418, "pan.___", state 550, "cache_dirty_rcu_data[i] = 0" - line 418, "pan.___", state 552, "(1)" - line 418, "pan.___", state 553, "(cache_dirty_rcu_data[i])" - line 418, "pan.___", state 553, "else" - line 418, "pan.___", state 556, "(1)" - line 418, "pan.___", state 557, "(1)" - line 418, "pan.___", state 557, "(1)" - line 416, "pan.___", state 562, "((i<2))" - line 416, "pan.___", state 562, "((i>=2))" - line 423, "pan.___", state 569, "(1)" - line 423, "pan.___", state 570, "(!(cache_dirty_urcu_gp_ctr))" - line 423, "pan.___", state 570, "else" - line 423, "pan.___", state 573, "(1)" - line 423, "pan.___", state 574, "(1)" - line 423, "pan.___", state 574, "(1)" - line 427, "pan.___", state 582, "(1)" - line 427, "pan.___", state 583, "(!(cache_dirty_urcu_active_readers))" - line 427, "pan.___", state 583, "else" - line 427, "pan.___", state 586, "(1)" - line 427, "pan.___", state 587, "(1)" - line 427, "pan.___", state 587, "(1)" - line 425, "pan.___", state 592, "((i<1))" - line 425, "pan.___", state 592, "((i>=1))" - line 432, "pan.___", state 599, "(1)" - line 432, "pan.___", state 600, "(!(cache_dirty_rcu_ptr))" - line 432, "pan.___", state 600, "else" - line 432, "pan.___", state 603, "(1)" - line 432, "pan.___", state 604, "(1)" - line 432, "pan.___", state 604, "(1)" - line 436, "pan.___", state 612, "(1)" - line 436, "pan.___", state 613, "(!(cache_dirty_rcu_data[i]))" - line 436, "pan.___", state 613, "else" - line 436, "pan.___", state 616, "(1)" - line 436, "pan.___", state 617, "(1)" - line 436, "pan.___", state 617, "(1)" - line 444, "pan.___", state 626, "(1)" - line 444, "pan.___", state 626, "(1)" - line 409, "pan.___", state 646, "cache_dirty_urcu_active_readers = 0" - line 414, "pan.___", state 664, "cache_dirty_rcu_ptr = 0" - line 418, "pan.___", state 678, "cache_dirty_rcu_data[i] = 0" - line 427, "pan.___", state 710, "(1)" - line 432, "pan.___", state 727, "(1)" - line 436, "pan.___", state 740, "(1)" - line 409, "pan.___", state 775, "cache_dirty_urcu_active_readers = 0" - line 414, "pan.___", state 793, "cache_dirty_rcu_ptr = 0" - line 418, "pan.___", state 807, "cache_dirty_rcu_data[i] = 0" - line 427, "pan.___", state 839, "(1)" - line 432, "pan.___", state 856, "(1)" - line 436, "pan.___", state 869, "(1)" - line 409, "pan.___", state 906, "cache_dirty_urcu_active_readers = 0" - line 414, "pan.___", state 924, "cache_dirty_rcu_ptr = 0" - line 418, "pan.___", state 938, "cache_dirty_rcu_data[i] = 0" - line 427, "pan.___", state 970, "(1)" - line 432, "pan.___", state 987, "(1)" - line 436, "pan.___", state 1000, "(1)" - line 409, "pan.___", state 1040, "cache_dirty_urcu_active_readers = 0" - line 414, "pan.___", state 1058, "cache_dirty_rcu_ptr = 0" - line 418, "pan.___", state 1072, "cache_dirty_rcu_data[i] = 0" - line 427, "pan.___", state 1104, "(1)" - line 432, "pan.___", state 1121, "(1)" - line 436, "pan.___", state 1134, "(1)" - line 269, "pan.___", state 1180, "cache_dirty_urcu_gp_ctr = 0" - line 273, "pan.___", state 1189, "cache_dirty_urcu_active_readers = 0" - line 277, "pan.___", state 1204, "(1)" - line 281, "pan.___", state 1211, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 1227, "(1)" - line 250, "pan.___", state 1235, "(1)" - line 254, "pan.___", state 1247, "(1)" - line 258, "pan.___", state 1255, "(1)" - line 269, "pan.___", state 1286, "cache_dirty_urcu_gp_ctr = 0" - line 273, "pan.___", state 1295, "cache_dirty_urcu_active_readers = 0" - line 277, "pan.___", state 1308, "cache_dirty_rcu_ptr = 0" - line 281, "pan.___", state 1317, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 1333, "(1)" - line 250, "pan.___", state 1341, "(1)" - line 254, "pan.___", state 1353, "(1)" - line 258, "pan.___", state 1361, "(1)" - line 273, "pan.___", state 1387, "cache_dirty_urcu_active_readers = 0" - line 277, "pan.___", state 1400, "cache_dirty_rcu_ptr = 0" - line 281, "pan.___", state 1409, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 1425, "(1)" - line 250, "pan.___", state 1433, "(1)" - line 254, "pan.___", state 1445, "(1)" - line 258, "pan.___", state 1453, "(1)" - line 269, "pan.___", state 1484, "cache_dirty_urcu_gp_ctr = 0" - line 273, "pan.___", state 1493, "cache_dirty_urcu_active_readers = 0" - line 277, "pan.___", state 1506, "cache_dirty_rcu_ptr = 0" - line 281, "pan.___", state 1515, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 1531, "(1)" - line 250, "pan.___", state 1539, "(1)" - line 254, "pan.___", state 1551, "(1)" - line 258, "pan.___", state 1559, "(1)" - line 1124, "pan.___", state 1575, "-end-" - (118 of 1575 states) -unreached in proctype :init: - (0 of 26 states) -unreached in proctype :never: - line 1187, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 67.7 seconds -pan: rate 3447.2308 states/second -pan: avg transition delay 1.5577e-06 usec -cp .input.spin urcu_progress_writer_error.spin.input -cp .input.spin.trail urcu_progress_writer_error.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-min-progress' diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer_error.spin.input b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer_error.spin.input deleted file mode 100644 index 035bdf7..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer_error.spin.input +++ /dev/null @@ -1,1158 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN, READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_OUT) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE - | READ_LOCK_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN - | READ_UNLOCK_OUT, 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT, /* post-dominant */ - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_OUT, /* RAW */ - READ_UNLOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - data_read_first[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer_error.spin.input.trail deleted file mode 100644 index a8b0188..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi-progress-minimal/urcu_progress_writer_error.spin.input.trail +++ /dev/null @@ -1,3959 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2739 -2:2:1136 -3:2:1141 -4:2:1145 -5:2:1153 -6:2:1157 -7:2:1161 -8:0:2739 -9:1:0 -10:1:5 -11:1:9 -12:1:17 -13:1:21 -14:1:25 -15:0:2739 -16:3:2711 -17:3:2714 -18:3:2719 -19:3:2726 -20:3:2729 -21:3:2733 -22:3:2734 -23:0:2739 -24:3:2736 -25:0:2739 -26:2:1165 -27:0:2739 -28:2:1171 -29:0:2739 -30:2:1172 -31:0:2739 -32:2:1173 -33:0:2739 -34:2:1174 -35:0:2739 -36:2:1175 -37:0:2739 -38:2:1176 -39:2:1177 -40:2:1181 -41:2:1182 -42:2:1190 -43:2:1191 -44:2:1195 -45:2:1196 -46:2:1204 -47:2:1209 -48:2:1213 -49:2:1214 -50:2:1222 -51:2:1223 -52:2:1227 -53:2:1228 -54:2:1222 -55:2:1223 -56:2:1227 -57:2:1228 -58:2:1236 -59:2:1241 -60:2:1242 -61:2:1253 -62:2:1254 -63:2:1255 -64:2:1266 -65:2:1271 -66:2:1272 -67:2:1283 -68:2:1284 -69:2:1285 -70:2:1283 -71:2:1284 -72:2:1285 -73:2:1296 -74:2:1304 -75:0:2739 -76:2:1175 -77:0:2739 -78:2:1308 -79:2:1312 -80:2:1313 -81:2:1317 -82:2:1321 -83:2:1322 -84:2:1326 -85:2:1334 -86:2:1335 -87:2:1339 -88:2:1343 -89:2:1344 -90:2:1339 -91:2:1340 -92:2:1348 -93:0:2739 -94:2:1175 -95:0:2739 -96:2:1356 -97:2:1357 -98:2:1358 -99:0:2739 -100:2:1175 -101:0:2739 -102:2:1363 -103:0:2739 -104:2:2316 -105:2:2317 -106:2:2321 -107:2:2325 -108:2:2326 -109:2:2330 -110:2:2335 -111:2:2343 -112:2:2347 -113:2:2348 -114:2:2343 -115:2:2347 -116:2:2348 -117:2:2352 -118:2:2359 -119:2:2366 -120:2:2367 -121:2:2374 -122:2:2379 -123:2:2386 -124:2:2387 -125:2:2386 -126:2:2387 -127:2:2394 -128:2:2398 -129:0:2739 -130:2:2403 -131:0:2739 -132:2:2404 -133:0:2739 -134:2:2405 -135:0:2739 -136:2:2406 -137:0:2739 -138:1:29 -139:0:2739 -140:1:35 -141:0:2739 -142:1:36 -143:0:2739 -144:2:2407 -145:0:2739 -146:1:37 -147:0:2739 -148:2:2406 -149:0:2739 -150:1:38 -151:0:2739 -152:2:2407 -153:0:2739 -154:1:39 -155:0:2739 -156:1:40 -157:0:2739 -158:1:41 -159:0:2739 -160:2:2406 -161:0:2739 -162:1:42 -163:0:2739 -164:2:2407 -165:0:2739 -166:1:51 -167:0:2739 -168:2:2406 -169:0:2739 -170:1:55 -171:1:56 -172:1:60 -173:1:64 -174:1:65 -175:1:69 -176:1:77 -177:1:78 -178:1:82 -179:1:86 -180:1:87 -181:1:82 -182:1:86 -183:1:87 -184:1:91 -185:1:98 -186:1:105 -187:1:106 -188:1:113 -189:1:118 -190:1:125 -191:1:126 -192:1:125 -193:1:126 -194:1:133 -195:1:137 -196:0:2739 -197:2:2407 -198:0:2739 -199:1:142 -200:0:2739 -201:2:2408 -202:0:2739 -203:2:2413 -204:0:2739 -205:2:2414 -206:0:2739 -207:2:2422 -208:2:2423 -209:2:2427 -210:2:2431 -211:2:2432 -212:2:2436 -213:2:2444 -214:2:2445 -215:2:2449 -216:2:2453 -217:2:2454 -218:2:2449 -219:2:2453 -220:2:2454 -221:2:2458 -222:2:2465 -223:2:2472 -224:2:2473 -225:2:2480 -226:2:2485 -227:2:2492 -228:2:2493 -229:2:2492 -230:2:2493 -231:2:2500 -232:2:2504 -233:0:2739 -234:2:1365 -235:2:2297 -236:0:2739 -237:2:1175 -238:0:2739 -239:2:1366 -240:0:2739 -241:2:1175 -242:0:2739 -243:2:1369 -244:2:1370 -245:2:1374 -246:2:1375 -247:2:1383 -248:2:1384 -249:2:1388 -250:2:1389 -251:2:1397 -252:2:1402 -253:2:1406 -254:2:1407 -255:2:1415 -256:2:1416 -257:2:1420 -258:2:1421 -259:2:1415 -260:2:1416 -261:2:1420 -262:2:1421 -263:2:1429 -264:2:1434 -265:2:1435 -266:2:1446 -267:2:1447 -268:2:1448 -269:2:1459 -270:2:1464 -271:2:1465 -272:2:1476 -273:2:1477 -274:2:1478 -275:2:1476 -276:2:1477 -277:2:1478 -278:2:1489 -279:2:1496 -280:0:2739 -281:2:1175 -282:0:2739 -283:2:1500 -284:2:1501 -285:2:1502 -286:2:1514 -287:2:1515 -288:2:1519 -289:2:1520 -290:2:1528 -291:2:1533 -292:2:1537 -293:2:1538 -294:2:1546 -295:2:1547 -296:2:1551 -297:2:1552 -298:2:1546 -299:2:1547 -300:2:1551 -301:2:1552 -302:2:1560 -303:2:1565 -304:2:1566 -305:2:1577 -306:2:1578 -307:2:1579 -308:2:1590 -309:2:1595 -310:2:1596 -311:2:1607 -312:2:1608 -313:2:1609 -314:2:1607 -315:2:1608 -316:2:1609 -317:2:1620 -318:2:1631 -319:2:1632 -320:0:2739 -321:2:1175 -322:0:2739 -323:2:1763 -324:2:1764 -325:2:1768 -326:2:1769 -327:2:1777 -328:2:1778 -329:2:1782 -330:2:1783 -331:2:1791 -332:2:1796 -333:2:1800 -334:2:1801 -335:2:1809 -336:2:1810 -337:2:1814 -338:2:1815 -339:2:1809 -340:2:1810 -341:2:1814 -342:2:1815 -343:2:1823 -344:2:1828 -345:2:1829 -346:2:1840 -347:2:1841 -348:2:1842 -349:2:1853 -350:2:1858 -351:2:1859 -352:2:1870 -353:2:1871 -354:2:1872 -355:2:1870 -356:2:1871 -357:2:1872 -358:2:1883 -359:0:2739 -360:2:1175 -361:0:2739 -362:2:1892 -363:2:1893 -364:2:1897 -365:2:1898 -366:2:1906 -367:2:1907 -368:2:1911 -369:2:1912 -370:2:1920 -371:2:1925 -372:2:1929 -373:2:1930 -374:2:1938 -375:2:1939 -376:2:1943 -377:2:1944 -378:2:1938 -379:2:1939 -380:2:1943 -381:2:1944 -382:2:1952 -383:2:1957 -384:2:1958 -385:2:1969 -386:2:1970 -387:2:1971 -388:2:1982 -389:2:1987 -390:2:1988 -391:2:1999 -392:2:2000 -393:2:2001 -394:2:1999 -395:2:2000 -396:2:2001 -397:2:2012 -398:2:2019 -399:0:2739 -400:2:1175 -401:0:2739 -402:2:2023 -403:2:2024 -404:2:2025 -405:2:2037 -406:2:2038 -407:2:2042 -408:2:2043 -409:2:2051 -410:2:2056 -411:2:2060 -412:2:2061 -413:2:2069 -414:2:2070 -415:2:2074 -416:2:2075 -417:2:2069 -418:2:2070 -419:2:2074 -420:2:2075 -421:2:2083 -422:2:2088 -423:2:2089 -424:2:2100 -425:2:2101 -426:2:2102 -427:2:2113 -428:2:2118 -429:2:2119 -430:2:2130 -431:2:2131 -432:2:2132 -433:2:2130 -434:2:2131 -435:2:2132 -436:2:2143 -437:2:2153 -438:2:2154 -439:0:2739 -440:2:1175 -441:0:2739 -442:2:2285 -443:0:2739 -444:2:2514 -445:2:2515 -446:2:2519 -447:2:2523 -448:2:2524 -449:2:2528 -450:2:2536 -451:2:2537 -452:2:2541 -453:2:2545 -454:2:2546 -455:2:2541 -456:2:2545 -457:2:2546 -458:2:2550 -459:2:2557 -460:2:2564 -461:2:2565 -462:2:2572 -463:2:2577 -464:2:2584 -465:2:2585 -466:2:2584 -467:2:2585 -468:2:2592 -469:2:2596 -470:0:2739 -471:2:2601 -472:0:2739 -473:2:2602 -474:0:2739 -475:2:2603 -476:0:2739 -477:2:2604 -478:0:2739 -479:1:51 -480:0:2739 -481:2:2605 -482:0:2739 -483:1:55 -484:1:56 -485:1:60 -486:1:64 -487:1:65 -488:1:69 -489:1:77 -490:1:78 -491:1:82 -492:1:86 -493:1:87 -494:1:82 -495:1:86 -496:1:87 -497:1:91 -498:1:98 -499:1:105 -500:1:106 -501:1:113 -502:1:118 -503:1:125 -504:1:126 -505:1:125 -506:1:126 -507:1:133 -508:1:137 -509:0:2739 -510:2:2604 -511:0:2739 -512:1:142 -513:0:2739 -514:2:2605 -515:0:2739 -516:2:2606 -517:0:2739 -518:2:2611 -519:0:2739 -520:2:2612 -521:0:2739 -522:2:2620 -523:2:2621 -524:2:2625 -525:2:2629 -526:2:2630 -527:2:2634 -528:2:2642 -529:2:2643 -530:2:2647 -531:2:2651 -532:2:2652 -533:2:2647 -534:2:2651 -535:2:2652 -536:2:2656 -537:2:2663 -538:2:2670 -539:2:2671 -540:2:2678 -541:2:2683 -542:2:2690 -543:2:2691 -544:2:2690 -545:2:2691 -546:2:2698 -547:2:2702 -548:0:2739 -549:2:2287 -550:2:2297 -551:0:2739 -552:2:1175 -553:0:2739 -554:2:2288 -555:2:2289 -556:0:2739 -557:2:1175 -558:0:2739 -559:2:2293 -560:0:2739 -561:2:2301 -562:0:2739 -563:2:1172 -564:0:2739 -565:2:1173 -566:0:2739 -567:2:1174 -568:0:2739 -569:2:1175 -570:0:2739 -571:2:1176 -572:2:1177 -573:2:1181 -574:2:1182 -575:2:1190 -576:2:1191 -577:2:1195 -578:2:1196 -579:2:1204 -580:2:1209 -581:2:1213 -582:2:1214 -583:2:1222 -584:2:1223 -585:2:1224 -586:2:1222 -587:2:1223 -588:2:1227 -589:2:1228 -590:2:1236 -591:2:1241 -592:2:1242 -593:2:1253 -594:2:1254 -595:2:1255 -596:2:1266 -597:2:1271 -598:2:1272 -599:2:1283 -600:2:1284 -601:2:1285 -602:2:1283 -603:2:1284 -604:2:1285 -605:2:1296 -606:2:1304 -607:0:2739 -608:2:1175 -609:0:2739 -610:2:1308 -611:2:1312 -612:2:1313 -613:2:1317 -614:2:1321 -615:2:1322 -616:2:1326 -617:2:1334 -618:2:1335 -619:2:1339 -620:2:1340 -621:2:1339 -622:2:1343 -623:2:1344 -624:2:1348 -625:0:2739 -626:2:1175 -627:0:2739 -628:2:1356 -629:2:1357 -630:2:1358 -631:0:2739 -632:2:1175 -633:0:2739 -634:2:1363 -635:0:2739 -636:2:2316 -637:2:2317 -638:2:2321 -639:2:2325 -640:2:2326 -641:2:2330 -642:2:2335 -643:2:2343 -644:2:2347 -645:2:2348 -646:2:2343 -647:2:2347 -648:2:2348 -649:2:2352 -650:2:2359 -651:2:2366 -652:2:2367 -653:2:2374 -654:2:2379 -655:2:2386 -656:2:2387 -657:2:2386 -658:2:2387 -659:2:2394 -660:2:2398 -661:0:2739 -662:2:2403 -663:0:2739 -664:2:2404 -665:0:2739 -666:2:2405 -667:0:2739 -668:2:2406 -669:0:2739 -670:1:51 -671:0:2739 -672:2:2407 -673:0:2739 -674:1:55 -675:1:56 -676:1:60 -677:1:64 -678:1:65 -679:1:69 -680:1:77 -681:1:78 -682:1:82 -683:1:86 -684:1:87 -685:1:82 -686:1:86 -687:1:87 -688:1:91 -689:1:98 -690:1:105 -691:1:106 -692:1:113 -693:1:118 -694:1:125 -695:1:126 -696:1:125 -697:1:126 -698:1:133 -699:1:137 -700:0:2739 -701:2:2406 -702:0:2739 -703:1:142 -704:0:2739 -705:2:2407 -706:0:2739 -707:2:2408 -708:0:2739 -709:2:2413 -710:0:2739 -711:2:2414 -712:0:2739 -713:2:2422 -714:2:2423 -715:2:2427 -716:2:2431 -717:2:2432 -718:2:2436 -719:2:2444 -720:2:2445 -721:2:2449 -722:2:2453 -723:2:2454 -724:2:2449 -725:2:2453 -726:2:2454 -727:2:2458 -728:2:2465 -729:2:2472 -730:2:2473 -731:2:2480 -732:2:2485 -733:2:2492 -734:2:2493 -735:2:2492 -736:2:2493 -737:2:2500 -738:2:2504 -739:0:2739 -740:2:1365 -741:2:2297 -742:0:2739 -743:2:1175 -744:0:2739 -745:2:1366 -746:0:2739 -747:2:1175 -748:0:2739 -749:2:1369 -750:2:1370 -751:2:1374 -752:2:1375 -753:2:1383 -754:2:1384 -755:2:1388 -756:2:1389 -757:2:1397 -758:2:1402 -759:2:1406 -760:2:1407 -761:2:1415 -762:2:1416 -763:2:1420 -764:2:1421 -765:2:1415 -766:2:1416 -767:2:1420 -768:2:1421 -769:2:1429 -770:2:1434 -771:2:1435 -772:2:1446 -773:2:1447 -774:2:1448 -775:2:1459 -776:2:1464 -777:2:1465 -778:2:1476 -779:2:1477 -780:2:1478 -781:2:1476 -782:2:1477 -783:2:1478 -784:2:1489 -785:2:1496 -786:0:2739 -787:2:1175 -788:0:2739 -789:2:1500 -790:2:1501 -791:2:1502 -792:2:1514 -793:2:1515 -794:2:1519 -795:2:1520 -796:2:1528 -797:2:1533 -798:2:1537 -799:2:1538 -800:2:1546 -801:2:1547 -802:2:1551 -803:2:1552 -804:2:1546 -805:2:1547 -806:2:1551 -807:2:1552 -808:2:1560 -809:2:1565 -810:2:1566 -811:2:1577 -812:2:1578 -813:2:1579 -814:2:1590 -815:2:1595 -816:2:1596 -817:2:1607 -818:2:1608 -819:2:1609 -820:2:1607 -821:2:1608 -822:2:1609 -823:2:1620 -824:2:1631 -825:2:1632 -826:0:2739 -827:2:1175 -828:0:2739 -829:2:1763 -830:2:1764 -831:2:1768 -832:2:1769 -833:2:1777 -834:2:1778 -835:2:1782 -836:2:1783 -837:2:1791 -838:2:1796 -839:2:1800 -840:2:1801 -841:2:1809 -842:2:1810 -843:2:1814 -844:2:1815 -845:2:1809 -846:2:1810 -847:2:1814 -848:2:1815 -849:2:1823 -850:2:1828 -851:2:1829 -852:2:1840 -853:2:1841 -854:2:1842 -855:2:1853 -856:2:1858 -857:2:1859 -858:2:1870 -859:2:1871 -860:2:1872 -861:2:1870 -862:2:1871 -863:2:1872 -864:2:1883 -865:0:2739 -866:2:1175 -867:0:2739 -868:2:1892 -869:2:1893 -870:2:1897 -871:2:1898 -872:2:1906 -873:2:1907 -874:2:1911 -875:2:1912 -876:2:1920 -877:2:1925 -878:2:1929 -879:2:1930 -880:2:1938 -881:2:1939 -882:2:1943 -883:2:1944 -884:2:1938 -885:2:1939 -886:2:1943 -887:2:1944 -888:2:1952 -889:2:1957 -890:2:1958 -891:2:1969 -892:2:1970 -893:2:1971 -894:2:1982 -895:2:1987 -896:2:1988 -897:2:1999 -898:2:2000 -899:2:2001 -900:2:1999 -901:2:2000 -902:2:2001 -903:2:2012 -904:2:2019 -905:0:2739 -906:2:1175 -907:0:2739 -908:2:2023 -909:2:2024 -910:2:2025 -911:2:2037 -912:2:2038 -913:2:2042 -914:2:2043 -915:2:2051 -916:2:2056 -917:2:2060 -918:2:2061 -919:2:2069 -920:2:2070 -921:2:2074 -922:2:2075 -923:2:2069 -924:2:2070 -925:2:2074 -926:2:2075 -927:2:2083 -928:2:2088 -929:2:2089 -930:2:2100 -931:2:2101 -932:2:2102 -933:2:2113 -934:2:2118 -935:2:2119 -936:2:2130 -937:2:2131 -938:2:2132 -939:2:2130 -940:2:2131 -941:2:2132 -942:2:2143 -943:2:2153 -944:2:2154 -945:0:2739 -946:2:1175 -947:0:2739 -948:2:2285 -949:0:2739 -950:2:2514 -951:2:2515 -952:2:2519 -953:2:2523 -954:2:2524 -955:2:2528 -956:2:2536 -957:2:2537 -958:2:2541 -959:2:2545 -960:2:2546 -961:2:2541 -962:2:2545 -963:2:2546 -964:2:2550 -965:2:2557 -966:2:2564 -967:2:2565 -968:2:2572 -969:2:2577 -970:2:2584 -971:2:2585 -972:2:2584 -973:2:2585 -974:2:2592 -975:2:2596 -976:0:2739 -977:2:2601 -978:0:2739 -979:2:2602 -980:0:2739 -981:2:2603 -982:0:2739 -983:2:2604 -984:0:2739 -985:1:51 -986:0:2739 -987:2:2605 -988:0:2739 -989:1:55 -990:1:56 -991:1:60 -992:1:64 -993:1:65 -994:1:69 -995:1:77 -996:1:78 -997:1:82 -998:1:86 -999:1:87 -1000:1:82 -1001:1:86 -1002:1:87 -1003:1:91 -1004:1:98 -1005:1:105 -1006:1:106 -1007:1:113 -1008:1:118 -1009:1:125 -1010:1:126 -1011:1:125 -1012:1:126 -1013:1:133 -1014:1:137 -1015:0:2739 -1016:2:2604 -1017:0:2739 -1018:1:142 -1019:0:2739 -1020:2:2605 -1021:0:2739 -1022:2:2606 -1023:0:2739 -1024:2:2611 -1025:0:2739 -1026:2:2612 -1027:0:2739 -1028:2:2620 -1029:2:2621 -1030:2:2625 -1031:2:2629 -1032:2:2630 -1033:2:2634 -1034:2:2642 -1035:2:2643 -1036:2:2647 -1037:2:2651 -1038:2:2652 -1039:2:2647 -1040:2:2651 -1041:2:2652 -1042:2:2656 -1043:2:2663 -1044:2:2670 -1045:2:2671 -1046:2:2678 -1047:2:2683 -1048:2:2690 -1049:2:2691 -1050:2:2690 -1051:2:2691 -1052:2:2698 -1053:2:2702 -1054:0:2739 -1055:2:2287 -1056:2:2297 -1057:0:2739 -1058:2:1175 -1059:0:2739 -1060:2:2288 -1061:2:2289 -1062:0:2739 -1063:2:1175 -1064:0:2739 -1065:2:2293 -1066:0:2739 -1067:2:2301 -1068:0:2739 -1069:2:1172 -1070:0:2739 -1071:2:1173 -1072:0:2739 -1073:2:1174 -1074:0:2739 -1075:2:1175 -1076:0:2739 -1077:2:1176 -1078:2:1177 -1079:2:1181 -1080:2:1182 -1081:2:1190 -1082:2:1191 -1083:2:1195 -1084:2:1196 -1085:2:1204 -1086:2:1209 -1087:2:1213 -1088:2:1214 -1089:2:1222 -1090:2:1223 -1091:2:1227 -1092:2:1228 -1093:2:1222 -1094:2:1223 -1095:2:1224 -1096:2:1236 -1097:2:1241 -1098:2:1242 -1099:2:1253 -1100:2:1254 -1101:2:1255 -1102:2:1266 -1103:2:1271 -1104:2:1272 -1105:2:1283 -1106:2:1284 -1107:2:1285 -1108:2:1283 -1109:2:1284 -1110:2:1285 -1111:2:1296 -1112:2:1304 -1113:0:2739 -1114:2:1175 -1115:0:2739 -1116:2:1308 -1117:2:1312 -1118:2:1313 -1119:2:1317 -1120:2:1321 -1121:2:1322 -1122:2:1326 -1123:2:1334 -1124:2:1335 -1125:2:1339 -1126:2:1343 -1127:2:1344 -1128:2:1339 -1129:2:1340 -1130:2:1348 -1131:0:2739 -1132:2:1175 -1133:0:2739 -1134:2:1356 -1135:2:1357 -1136:2:1358 -1137:0:2739 -1138:2:1175 -1139:0:2739 -1140:2:1363 -1141:0:2739 -1142:2:2316 -1143:2:2317 -1144:2:2321 -1145:2:2325 -1146:2:2326 -1147:2:2330 -1148:2:2335 -1149:2:2343 -1150:2:2347 -1151:2:2348 -1152:2:2343 -1153:2:2347 -1154:2:2348 -1155:2:2352 -1156:2:2359 -1157:2:2366 -1158:2:2367 -1159:2:2374 -1160:2:2379 -1161:2:2386 -1162:2:2387 -1163:2:2386 -1164:2:2387 -1165:2:2394 -1166:2:2398 -1167:0:2739 -1168:2:2403 -1169:0:2739 -1170:2:2404 -1171:0:2739 -1172:2:2405 -1173:0:2739 -1174:2:2406 -1175:0:2739 -1176:1:51 -1177:0:2739 -1178:2:2407 -1179:0:2739 -1180:1:55 -1181:1:56 -1182:1:60 -1183:1:64 -1184:1:65 -1185:1:69 -1186:1:77 -1187:1:78 -1188:1:82 -1189:1:86 -1190:1:87 -1191:1:82 -1192:1:86 -1193:1:87 -1194:1:91 -1195:1:98 -1196:1:105 -1197:1:106 -1198:1:113 -1199:1:118 -1200:1:125 -1201:1:126 -1202:1:125 -1203:1:126 -1204:1:133 -1205:1:137 -1206:0:2739 -1207:2:2406 -1208:0:2739 -1209:1:142 -1210:0:2739 -1211:2:2407 -1212:0:2739 -1213:2:2408 -1214:0:2739 -1215:2:2413 -1216:0:2739 -1217:2:2414 -1218:0:2739 -1219:2:2422 -1220:2:2423 -1221:2:2427 -1222:2:2431 -1223:2:2432 -1224:2:2436 -1225:2:2444 -1226:2:2445 -1227:2:2449 -1228:2:2453 -1229:2:2454 -1230:2:2449 -1231:2:2453 -1232:2:2454 -1233:2:2458 -1234:2:2465 -1235:2:2472 -1236:2:2473 -1237:2:2480 -1238:2:2485 -1239:2:2492 -1240:2:2493 -1241:2:2492 -1242:2:2493 -1243:2:2500 -1244:2:2504 -1245:0:2739 -1246:2:1365 -1247:2:2297 -1248:0:2739 -1249:2:1175 -1250:0:2739 -1251:2:1366 -1252:0:2739 -1253:2:1175 -1254:0:2739 -1255:2:1369 -1256:2:1370 -1257:2:1374 -1258:2:1375 -1259:2:1383 -1260:2:1384 -1261:2:1388 -1262:2:1389 -1263:2:1397 -1264:2:1402 -1265:2:1406 -1266:2:1407 -1267:2:1415 -1268:2:1416 -1269:2:1420 -1270:2:1421 -1271:2:1415 -1272:2:1416 -1273:2:1420 -1274:2:1421 -1275:2:1429 -1276:2:1434 -1277:2:1435 -1278:2:1446 -1279:2:1447 -1280:2:1448 -1281:2:1459 -1282:2:1464 -1283:2:1465 -1284:2:1476 -1285:2:1477 -1286:2:1478 -1287:2:1476 -1288:2:1477 -1289:2:1478 -1290:2:1489 -1291:2:1496 -1292:0:2739 -1293:2:1175 -1294:0:2739 -1295:2:1500 -1296:2:1501 -1297:2:1502 -1298:2:1514 -1299:2:1515 -1300:2:1519 -1301:2:1520 -1302:2:1528 -1303:2:1533 -1304:2:1537 -1305:2:1538 -1306:2:1546 -1307:2:1547 -1308:2:1551 -1309:2:1552 -1310:2:1546 -1311:2:1547 -1312:2:1551 -1313:2:1552 -1314:2:1560 -1315:2:1565 -1316:2:1566 -1317:2:1577 -1318:2:1578 -1319:2:1579 -1320:2:1590 -1321:2:1595 -1322:2:1596 -1323:2:1607 -1324:2:1608 -1325:2:1609 -1326:2:1607 -1327:2:1608 -1328:2:1609 -1329:2:1620 -1330:2:1631 -1331:2:1632 -1332:0:2739 -1333:2:1175 -1334:0:2739 -1335:2:1763 -1336:2:1764 -1337:2:1768 -1338:2:1769 -1339:2:1777 -1340:2:1778 -1341:2:1782 -1342:2:1783 -1343:2:1791 -1344:2:1796 -1345:2:1800 -1346:2:1801 -1347:2:1809 -1348:2:1810 -1349:2:1814 -1350:2:1815 -1351:2:1809 -1352:2:1810 -1353:2:1814 -1354:2:1815 -1355:2:1823 -1356:2:1828 -1357:2:1829 -1358:2:1840 -1359:2:1841 -1360:2:1842 -1361:2:1853 -1362:2:1858 -1363:2:1859 -1364:2:1870 -1365:2:1871 -1366:2:1872 -1367:2:1870 -1368:2:1871 -1369:2:1872 -1370:2:1883 -1371:0:2739 -1372:2:1175 -1373:0:2739 -1374:2:1892 -1375:2:1893 -1376:2:1897 -1377:2:1898 -1378:2:1906 -1379:2:1907 -1380:2:1911 -1381:2:1912 -1382:2:1920 -1383:2:1925 -1384:2:1929 -1385:2:1930 -1386:2:1938 -1387:2:1939 -1388:2:1943 -1389:2:1944 -1390:2:1938 -1391:2:1939 -1392:2:1943 -1393:2:1944 -1394:2:1952 -1395:2:1957 -1396:2:1958 -1397:2:1969 -1398:2:1970 -1399:2:1971 -1400:2:1982 -1401:2:1987 -1402:2:1988 -1403:2:1999 -1404:2:2000 -1405:2:2001 -1406:2:1999 -1407:2:2000 -1408:2:2001 -1409:2:2012 -1410:2:2019 -1411:0:2739 -1412:2:1175 -1413:0:2739 -1414:1:143 -1415:0:2739 -1416:1:145 -1417:0:2739 -1418:1:44 -1419:0:2739 -1420:1:151 -1421:1:152 -1422:1:156 -1423:1:157 -1424:1:165 -1425:1:166 -1426:1:170 -1427:1:171 -1428:1:179 -1429:1:184 -1430:1:188 -1431:1:189 -1432:1:197 -1433:1:198 -1434:1:202 -1435:1:203 -1436:1:197 -1437:1:198 -1438:1:202 -1439:1:203 -1440:1:211 -1441:1:216 -1442:1:217 -1443:1:228 -1444:1:229 -1445:1:230 -1446:1:241 -1447:1:246 -1448:1:247 -1449:1:258 -1450:1:259 -1451:1:260 -1452:1:258 -1453:1:259 -1454:1:260 -1455:1:271 -1456:0:2739 -1457:1:40 -1458:0:2739 -1459:1:41 -1460:0:2739 -1461:1:42 -1462:0:2739 -1463:1:143 -1464:0:2739 -1465:1:145 -1466:0:2739 -1467:1:44 -1468:0:2739 -1469:1:280 -1470:1:281 -1471:0:2739 -1472:1:40 -1473:0:2739 -1474:1:41 -1475:0:2739 -1476:1:42 -1477:0:2739 -1478:1:143 -1479:0:2739 -1480:1:145 -1481:0:2739 -1482:1:44 -1483:0:2739 -1484:1:287 -1485:1:288 -1486:1:292 -1487:1:293 -1488:1:301 -1489:1:302 -1490:1:306 -1491:1:307 -1492:1:315 -1493:1:320 -1494:1:324 -1495:1:325 -1496:1:333 -1497:1:334 -1498:1:338 -1499:1:339 -1500:1:333 -1501:1:334 -1502:1:338 -1503:1:339 -1504:1:347 -1505:1:352 -1506:1:353 -1507:1:364 -1508:1:365 -1509:1:366 -1510:1:377 -1511:1:382 -1512:1:383 -1513:1:394 -1514:1:395 -1515:1:396 -1516:1:394 -1517:1:395 -1518:1:396 -1519:1:407 -1520:0:2739 -1521:1:40 -1522:0:2739 -1523:1:41 -1524:0:2739 -1525:1:42 -1526:0:2739 -1527:1:143 -1528:0:2739 -1529:1:145 -1530:0:2739 -1531:1:44 -1532:0:2739 -1533:1:416 -1534:1:417 -1535:1:421 -1536:1:422 -1537:1:430 -1538:1:431 -1539:1:435 -1540:1:436 -1541:1:444 -1542:1:449 -1543:1:453 -1544:1:454 -1545:1:462 -1546:1:463 -1547:1:467 -1548:1:468 -1549:1:462 -1550:1:463 -1551:1:467 -1552:1:468 -1553:1:476 -1554:1:481 -1555:1:482 -1556:1:493 -1557:1:494 -1558:1:495 -1559:1:506 -1560:1:511 -1561:1:512 -1562:1:523 -1563:1:524 -1564:1:525 -1565:1:523 -1566:1:524 -1567:1:525 -1568:1:536 -1569:1:543 -1570:0:2739 -1571:1:40 -1572:0:2739 -1573:1:41 -1574:0:2739 -1575:1:42 -1576:0:2739 -1577:1:143 -1578:0:2739 -1579:1:145 -1580:0:2739 -1581:1:44 -1582:0:2739 -1583:1:681 -1584:1:682 -1585:1:686 -1586:1:687 -1587:1:695 -1588:1:696 -1589:1:697 -1590:1:709 -1591:1:714 -1592:1:718 -1593:1:719 -1594:1:727 -1595:1:728 -1596:1:732 -1597:1:733 -1598:1:727 -1599:1:728 -1600:1:732 -1601:1:733 -1602:1:741 -1603:1:746 -1604:1:747 -1605:1:758 -1606:1:759 -1607:1:760 -1608:1:771 -1609:1:776 -1610:1:777 -1611:1:788 -1612:1:789 -1613:1:790 -1614:1:788 -1615:1:789 -1616:1:790 -1617:1:801 -1618:0:2739 -1619:1:40 -1620:0:2739 -1621:1:41 -1622:0:2739 -1623:2:2023 -1624:2:2024 -1625:2:2025 -1626:2:2037 -1627:2:2038 -1628:2:2042 -1629:2:2043 -1630:2:2051 -1631:2:2056 -1632:2:2060 -1633:2:2061 -1634:2:2069 -1635:2:2070 -1636:2:2074 -1637:2:2075 -1638:2:2069 -1639:2:2070 -1640:2:2074 -1641:2:2075 -1642:2:2083 -1643:2:2088 -1644:2:2089 -1645:2:2100 -1646:2:2101 -1647:2:2102 -1648:2:2113 -1649:2:2118 -1650:2:2119 -1651:2:2130 -1652:2:2131 -1653:2:2132 -1654:2:2130 -1655:2:2131 -1656:2:2132 -1657:2:2143 -1658:2:2151 -1659:0:2739 -1660:2:1175 -1661:0:2739 -1662:2:2157 -1663:2:2158 -1664:2:2162 -1665:2:2163 -1666:2:2171 -1667:2:2172 -1668:2:2176 -1669:2:2177 -1670:2:2185 -1671:2:2190 -1672:2:2194 -1673:2:2195 -1674:2:2203 -1675:2:2204 -1676:2:2208 -1677:2:2209 -1678:2:2203 -1679:2:2204 -1680:2:2208 -1681:2:2209 -1682:2:2217 -1683:2:2222 -1684:2:2223 -1685:2:2234 -1686:2:2235 -1687:2:2236 -1688:2:2247 -1689:2:2252 -1690:2:2253 -1691:2:2264 -1692:2:2265 -1693:2:2266 -1694:2:2264 -1695:2:2265 -1696:2:2266 -1697:2:2277 -1698:0:2739 -1699:2:1175 -1700:0:2739 -1701:1:42 -1702:0:2739 -1703:2:2023 -1704:2:2024 -1705:2:2028 -1706:2:2029 -1707:2:2037 -1708:2:2038 -1709:2:2042 -1710:2:2043 -1711:2:2051 -1712:2:2056 -1713:2:2060 -1714:2:2061 -1715:2:2069 -1716:2:2070 -1717:2:2074 -1718:2:2075 -1719:2:2069 -1720:2:2070 -1721:2:2074 -1722:2:2075 -1723:2:2083 -1724:2:2088 -1725:2:2089 -1726:2:2100 -1727:2:2101 -1728:2:2102 -1729:2:2113 -1730:2:2118 -1731:2:2119 -1732:2:2130 -1733:2:2131 -1734:2:2132 -1735:2:2130 -1736:2:2131 -1737:2:2132 -1738:2:2143 -1739:2:2151 -1740:0:2739 -1741:2:1175 -1742:0:2739 -1743:2:2157 -1744:2:2158 -1745:2:2162 -1746:2:2163 -1747:2:2171 -1748:2:2172 -1749:2:2176 -1750:2:2177 -1751:2:2185 -1752:2:2190 -1753:2:2194 -1754:2:2195 -1755:2:2203 -1756:2:2204 -1757:2:2208 -1758:2:2209 -1759:2:2203 -1760:2:2204 -1761:2:2208 -1762:2:2209 -1763:2:2217 -1764:2:2222 -1765:2:2223 -1766:2:2234 -1767:2:2235 -1768:2:2236 -1769:2:2247 -1770:2:2252 -1771:2:2253 -1772:2:2264 -1773:2:2265 -1774:2:2266 -1775:2:2264 -1776:2:2265 -1777:2:2266 -1778:2:2277 -1779:0:2739 -1780:1:143 -1781:0:2739 -1782:2:1175 -1783:0:2739 -1784:2:2023 -1785:2:2024 -1786:2:2028 -1787:2:2029 -1788:2:2037 -1789:2:2038 -1790:2:2042 -1791:2:2043 -1792:2:2051 -1793:2:2056 -1794:2:2060 -1795:2:2061 -1796:2:2069 -1797:2:2070 -1798:2:2074 -1799:2:2075 -1800:2:2069 -1801:2:2070 -1802:2:2074 -1803:2:2075 -1804:2:2083 -1805:2:2088 -1806:2:2089 -1807:2:2100 -1808:2:2101 -1809:2:2102 -1810:2:2113 -1811:2:2118 -1812:2:2119 -1813:2:2130 -1814:2:2131 -1815:2:2132 -1816:2:2130 -1817:2:2131 -1818:2:2132 -1819:2:2143 -1820:2:2151 -1821:0:2739 -1822:2:1175 -1823:0:2739 -1824:1:145 -1825:0:2739 -1826:2:2157 -1827:2:2158 -1828:2:2162 -1829:2:2163 -1830:2:2171 -1831:2:2172 -1832:2:2176 -1833:2:2177 -1834:2:2185 -1835:2:2190 -1836:2:2194 -1837:2:2195 -1838:2:2203 -1839:2:2204 -1840:2:2208 -1841:2:2209 -1842:2:2203 -1843:2:2204 -1844:2:2208 -1845:2:2209 -1846:2:2217 -1847:2:2222 -1848:2:2223 -1849:2:2234 -1850:2:2235 -1851:2:2236 -1852:2:2247 -1853:2:2252 -1854:2:2253 -1855:2:2264 -1856:2:2265 -1857:2:2266 -1858:2:2264 -1859:2:2265 -1860:2:2266 -1861:2:2277 -1862:0:2739 -1863:2:1175 -1864:0:2739 -1865:2:2023 -1866:2:2024 -1867:2:2028 -1868:2:2029 -1869:2:2037 -1870:2:2038 -1871:2:2042 -1872:2:2043 -1873:2:2051 -1874:2:2056 -1875:2:2060 -1876:2:2061 -1877:2:2069 -1878:2:2070 -1879:2:2074 -1880:2:2075 -1881:2:2069 -1882:2:2070 -1883:2:2074 -1884:2:2075 -1885:2:2083 -1886:2:2088 -1887:2:2089 -1888:2:2100 -1889:2:2101 -1890:2:2102 -1891:2:2113 -1892:2:2118 -1893:2:2119 -1894:2:2130 -1895:2:2131 -1896:2:2132 -1897:2:2130 -1898:2:2131 -1899:2:2132 -1900:2:2143 -1901:2:2151 -1902:0:2739 -1903:1:44 -1904:0:2739 -1905:2:1175 -1906:0:2739 -1907:2:2157 -1908:2:2158 -1909:2:2162 -1910:2:2163 -1911:2:2171 -1912:2:2172 -1913:2:2176 -1914:2:2177 -1915:2:2185 -1916:2:2190 -1917:2:2194 -1918:2:2195 -1919:2:2203 -1920:2:2204 -1921:2:2208 -1922:2:2209 -1923:2:2203 -1924:2:2204 -1925:2:2208 -1926:2:2209 -1927:2:2217 -1928:2:2222 -1929:2:2223 -1930:2:2234 -1931:2:2235 -1932:2:2236 -1933:2:2247 -1934:2:2252 -1935:2:2253 -1936:2:2264 -1937:2:2265 -1938:2:2266 -1939:2:2264 -1940:2:2265 -1941:2:2266 -1942:2:2277 -1943:0:2739 -1944:2:1175 -1945:0:2739 -1946:1:810 -1947:0:2739 -1948:2:2023 -1949:2:2024 -1950:2:2028 -1951:2:2029 -1952:2:2037 -1953:2:2038 -1954:2:2042 -1955:2:2043 -1956:2:2051 -1957:2:2056 -1958:2:2060 -1959:2:2061 -1960:2:2069 -1961:2:2070 -1962:2:2074 -1963:2:2075 -1964:2:2069 -1965:2:2070 -1966:2:2074 -1967:2:2075 -1968:2:2083 -1969:2:2088 -1970:2:2089 -1971:2:2100 -1972:2:2101 -1973:2:2102 -1974:2:2113 -1975:2:2118 -1976:2:2119 -1977:2:2130 -1978:2:2131 -1979:2:2132 -1980:2:2130 -1981:2:2131 -1982:2:2132 -1983:2:2143 -1984:2:2151 -1985:0:2739 -1986:2:1175 -1987:0:2739 -1988:2:2157 -1989:2:2158 -1990:2:2162 -1991:2:2163 -1992:2:2171 -1993:2:2172 -1994:2:2176 -1995:2:2177 -1996:2:2185 -1997:2:2190 -1998:2:2194 -1999:2:2195 -2000:2:2203 -2001:2:2204 -2002:2:2208 -2003:2:2209 -2004:2:2203 -2005:2:2204 -2006:2:2208 -2007:2:2209 -2008:2:2217 -2009:2:2222 -2010:2:2223 -2011:2:2234 -2012:2:2235 -2013:2:2236 -2014:2:2247 -2015:2:2252 -2016:2:2253 -2017:2:2264 -2018:2:2265 -2019:2:2266 -2020:2:2264 -2021:2:2265 -2022:2:2266 -2023:2:2277 -2024:0:2739 -2025:1:1087 -2026:1:1094 -2027:1:1095 -2028:1:1102 -2029:1:1107 -2030:1:1114 -2031:1:1115 -2032:1:1114 -2033:1:1115 -2034:1:1122 -2035:1:1126 -2036:0:2739 -2037:2:1175 -2038:0:2739 -2039:2:2023 -2040:2:2024 -2041:2:2028 -2042:2:2029 -2043:2:2037 -2044:2:2038 -2045:2:2042 -2046:2:2043 -2047:2:2051 -2048:2:2056 -2049:2:2060 -2050:2:2061 -2051:2:2069 -2052:2:2070 -2053:2:2074 -2054:2:2075 -2055:2:2069 -2056:2:2070 -2057:2:2074 -2058:2:2075 -2059:2:2083 -2060:2:2088 -2061:2:2089 -2062:2:2100 -2063:2:2101 -2064:2:2102 -2065:2:2113 -2066:2:2118 -2067:2:2119 -2068:2:2130 -2069:2:2131 -2070:2:2132 -2071:2:2130 -2072:2:2131 -2073:2:2132 -2074:2:2143 -2075:2:2151 -2076:0:2739 -2077:2:1175 -2078:0:2739 -2079:1:812 -2080:1:813 -2081:0:2739 -2082:1:40 -2083:0:2739 -2084:1:41 -2085:0:2739 -2086:2:2157 -2087:2:2158 -2088:2:2162 -2089:2:2163 -2090:2:2171 -2091:2:2172 -2092:2:2176 -2093:2:2177 -2094:2:2185 -2095:2:2190 -2096:2:2194 -2097:2:2195 -2098:2:2203 -2099:2:2204 -2100:2:2208 -2101:2:2209 -2102:2:2203 -2103:2:2204 -2104:2:2208 -2105:2:2209 -2106:2:2217 -2107:2:2222 -2108:2:2223 -2109:2:2234 -2110:2:2235 -2111:2:2236 -2112:2:2247 -2113:2:2252 -2114:2:2253 -2115:2:2264 -2116:2:2265 -2117:2:2266 -2118:2:2264 -2119:2:2265 -2120:2:2266 -2121:2:2277 -2122:0:2739 -2123:2:1175 -2124:0:2739 -2125:2:2023 -2126:2:2024 -2127:2:2028 -2128:2:2029 -2129:2:2037 -2130:2:2038 -2131:2:2042 -2132:2:2043 -2133:2:2051 -2134:2:2056 -2135:2:2060 -2136:2:2061 -2137:2:2069 -2138:2:2070 -2139:2:2074 -2140:2:2075 -2141:2:2069 -2142:2:2070 -2143:2:2074 -2144:2:2075 -2145:2:2083 -2146:2:2088 -2147:2:2089 -2148:2:2100 -2149:2:2101 -2150:2:2102 -2151:2:2113 -2152:2:2118 -2153:2:2119 -2154:2:2130 -2155:2:2131 -2156:2:2132 -2157:2:2130 -2158:2:2131 -2159:2:2132 -2160:2:2143 -2161:2:2151 -2162:0:2739 -2163:1:42 -2164:0:2739 -2165:2:1175 -2166:0:2739 -2167:2:2157 -2168:2:2158 -2169:2:2162 -2170:2:2163 -2171:2:2171 -2172:2:2172 -2173:2:2176 -2174:2:2177 -2175:2:2185 -2176:2:2190 -2177:2:2194 -2178:2:2195 -2179:2:2203 -2180:2:2204 -2181:2:2208 -2182:2:2209 -2183:2:2203 -2184:2:2204 -2185:2:2208 -2186:2:2209 -2187:2:2217 -2188:2:2222 -2189:2:2223 -2190:2:2234 -2191:2:2235 -2192:2:2236 -2193:2:2247 -2194:2:2252 -2195:2:2253 -2196:2:2264 -2197:2:2265 -2198:2:2266 -2199:2:2264 -2200:2:2265 -2201:2:2266 -2202:2:2277 -2203:0:2739 -2204:2:1175 -2205:0:2739 -2206:1:143 -2207:0:2739 -2208:2:2023 -2209:2:2024 -2210:2:2028 -2211:2:2029 -2212:2:2037 -2213:2:2038 -2214:2:2042 -2215:2:2043 -2216:2:2051 -2217:2:2056 -2218:2:2060 -2219:2:2061 -2220:2:2069 -2221:2:2070 -2222:2:2074 -2223:2:2075 -2224:2:2069 -2225:2:2070 -2226:2:2074 -2227:2:2075 -2228:2:2083 -2229:2:2088 -2230:2:2089 -2231:2:2100 -2232:2:2101 -2233:2:2102 -2234:2:2113 -2235:2:2118 -2236:2:2119 -2237:2:2130 -2238:2:2131 -2239:2:2132 -2240:2:2130 -2241:2:2131 -2242:2:2132 -2243:2:2143 -2244:2:2151 -2245:0:2739 -2246:2:1175 -2247:0:2739 -2248:2:2157 -2249:2:2158 -2250:2:2162 -2251:2:2163 -2252:2:2171 -2253:2:2172 -2254:2:2176 -2255:2:2177 -2256:2:2185 -2257:2:2190 -2258:2:2194 -2259:2:2195 -2260:2:2203 -2261:2:2204 -2262:2:2208 -2263:2:2209 -2264:2:2203 -2265:2:2204 -2266:2:2208 -2267:2:2209 -2268:2:2217 -2269:2:2222 -2270:2:2223 -2271:2:2234 -2272:2:2235 -2273:2:2236 -2274:2:2247 -2275:2:2252 -2276:2:2253 -2277:2:2264 -2278:2:2265 -2279:2:2266 -2280:2:2264 -2281:2:2265 -2282:2:2266 -2283:2:2277 -2284:0:2739 -2285:1:145 -2286:0:2739 -2287:2:1175 -2288:0:2739 -2289:2:2023 -2290:2:2024 -2291:2:2028 -2292:2:2029 -2293:2:2037 -2294:2:2038 -2295:2:2042 -2296:2:2043 -2297:2:2051 -2298:2:2056 -2299:2:2060 -2300:2:2061 -2301:2:2069 -2302:2:2070 -2303:2:2074 -2304:2:2075 -2305:2:2069 -2306:2:2070 -2307:2:2074 -2308:2:2075 -2309:2:2083 -2310:2:2088 -2311:2:2089 -2312:2:2100 -2313:2:2101 -2314:2:2102 -2315:2:2113 -2316:2:2118 -2317:2:2119 -2318:2:2130 -2319:2:2131 -2320:2:2132 -2321:2:2130 -2322:2:2131 -2323:2:2132 -2324:2:2143 -2325:2:2151 -2326:0:2739 -2327:2:1175 -2328:0:2739 -2329:1:44 -2330:0:2739 -2331:2:2157 -2332:2:2158 -2333:2:2162 -2334:2:2163 -2335:2:2171 -2336:2:2172 -2337:2:2176 -2338:2:2177 -2339:2:2185 -2340:2:2190 -2341:2:2194 -2342:2:2195 -2343:2:2203 -2344:2:2204 -2345:2:2208 -2346:2:2209 -2347:2:2203 -2348:2:2204 -2349:2:2208 -2350:2:2209 -2351:2:2217 -2352:2:2222 -2353:2:2223 -2354:2:2234 -2355:2:2235 -2356:2:2236 -2357:2:2247 -2358:2:2252 -2359:2:2253 -2360:2:2264 -2361:2:2265 -2362:2:2266 -2363:2:2264 -2364:2:2265 -2365:2:2266 -2366:2:2277 -2367:0:2739 -2368:2:1175 -2369:0:2739 -2370:2:2023 -2371:2:2024 -2372:2:2028 -2373:2:2029 -2374:2:2037 -2375:2:2038 -2376:2:2042 -2377:2:2043 -2378:2:2051 -2379:2:2056 -2380:2:2060 -2381:2:2061 -2382:2:2069 -2383:2:2070 -2384:2:2074 -2385:2:2075 -2386:2:2069 -2387:2:2070 -2388:2:2074 -2389:2:2075 -2390:2:2083 -2391:2:2088 -2392:2:2089 -2393:2:2100 -2394:2:2101 -2395:2:2102 -2396:2:2113 -2397:2:2118 -2398:2:2119 -2399:2:2130 -2400:2:2131 -2401:2:2132 -2402:2:2130 -2403:2:2131 -2404:2:2132 -2405:2:2143 -2406:2:2151 -2407:0:2739 -2408:1:816 -2409:1:817 -2410:1:821 -2411:1:822 -2412:1:830 -2413:1:831 -2414:1:835 -2415:1:836 -2416:1:844 -2417:1:849 -2418:1:853 -2419:1:854 -2420:1:862 -2421:1:863 -2422:1:867 -2423:1:868 -2424:1:862 -2425:1:863 -2426:1:867 -2427:1:868 -2428:1:876 -2429:1:881 -2430:1:882 -2431:1:893 -2432:1:894 -2433:1:895 -2434:1:906 -2435:1:911 -2436:1:912 -2437:1:923 -2438:1:924 -2439:1:925 -2440:1:923 -2441:1:924 -2442:1:925 -2443:1:936 -2444:0:2739 -2445:2:1175 -2446:0:2739 -2447:1:40 -2448:0:2739 -2449:1:41 -2450:0:2739 -2451:2:2157 -2452:2:2158 -2453:2:2162 -2454:2:2163 -2455:2:2171 -2456:2:2172 -2457:2:2176 -2458:2:2177 -2459:2:2185 -2460:2:2190 -2461:2:2194 -2462:2:2195 -2463:2:2203 -2464:2:2204 -2465:2:2208 -2466:2:2209 -2467:2:2203 -2468:2:2204 -2469:2:2208 -2470:2:2209 -2471:2:2217 -2472:2:2222 -2473:2:2223 -2474:2:2234 -2475:2:2235 -2476:2:2236 -2477:2:2247 -2478:2:2252 -2479:2:2253 -2480:2:2264 -2481:2:2265 -2482:2:2266 -2483:2:2264 -2484:2:2265 -2485:2:2266 -2486:2:2277 -2487:0:2739 -2488:2:1175 -2489:0:2739 -2490:2:2023 -2491:2:2024 -2492:2:2028 -2493:2:2029 -2494:2:2037 -2495:2:2038 -2496:2:2042 -2497:2:2043 -2498:2:2051 -2499:2:2056 -2500:2:2060 -2501:2:2061 -2502:2:2069 -2503:2:2070 -2504:2:2074 -2505:2:2075 -2506:2:2069 -2507:2:2070 -2508:2:2074 -2509:2:2075 -2510:2:2083 -2511:2:2088 -2512:2:2089 -2513:2:2100 -2514:2:2101 -2515:2:2102 -2516:2:2113 -2517:2:2118 -2518:2:2119 -2519:2:2130 -2520:2:2131 -2521:2:2132 -2522:2:2130 -2523:2:2131 -2524:2:2132 -2525:2:2143 -2526:2:2151 -2527:0:2739 -2528:1:42 -2529:0:2739 -2530:2:1175 -2531:0:2739 -2532:2:2157 -2533:2:2158 -2534:2:2162 -2535:2:2163 -2536:2:2171 -2537:2:2172 -2538:2:2176 -2539:2:2177 -2540:2:2185 -2541:2:2190 -2542:2:2194 -2543:2:2195 -2544:2:2203 -2545:2:2204 -2546:2:2208 -2547:2:2209 -2548:2:2203 -2549:2:2204 -2550:2:2208 -2551:2:2209 -2552:2:2217 -2553:2:2222 -2554:2:2223 -2555:2:2234 -2556:2:2235 -2557:2:2236 -2558:2:2247 -2559:2:2252 -2560:2:2253 -2561:2:2264 -2562:2:2265 -2563:2:2266 -2564:2:2264 -2565:2:2265 -2566:2:2266 -2567:2:2277 -2568:0:2739 -2569:2:1175 -2570:0:2739 -2571:1:143 -2572:0:2739 -2573:2:2023 -2574:2:2024 -2575:2:2028 -2576:2:2029 -2577:2:2037 -2578:2:2038 -2579:2:2042 -2580:2:2043 -2581:2:2051 -2582:2:2056 -2583:2:2060 -2584:2:2061 -2585:2:2069 -2586:2:2070 -2587:2:2074 -2588:2:2075 -2589:2:2069 -2590:2:2070 -2591:2:2074 -2592:2:2075 -2593:2:2083 -2594:2:2088 -2595:2:2089 -2596:2:2100 -2597:2:2101 -2598:2:2102 -2599:2:2113 -2600:2:2118 -2601:2:2119 -2602:2:2130 -2603:2:2131 -2604:2:2132 -2605:2:2130 -2606:2:2131 -2607:2:2132 -2608:2:2143 -2609:2:2151 -2610:0:2739 -2611:2:1175 -2612:0:2739 -2613:2:2157 -2614:2:2158 -2615:2:2162 -2616:2:2163 -2617:2:2171 -2618:2:2172 -2619:2:2176 -2620:2:2177 -2621:2:2185 -2622:2:2190 -2623:2:2194 -2624:2:2195 -2625:2:2203 -2626:2:2204 -2627:2:2208 -2628:2:2209 -2629:2:2203 -2630:2:2204 -2631:2:2208 -2632:2:2209 -2633:2:2217 -2634:2:2222 -2635:2:2223 -2636:2:2234 -2637:2:2235 -2638:2:2236 -2639:2:2247 -2640:2:2252 -2641:2:2253 -2642:2:2264 -2643:2:2265 -2644:2:2266 -2645:2:2264 -2646:2:2265 -2647:2:2266 -2648:2:2277 -2649:0:2739 -2650:1:145 -2651:0:2739 -2652:2:1175 -2653:0:2739 -2654:2:2023 -2655:2:2024 -2656:2:2028 -2657:2:2029 -2658:2:2037 -2659:2:2038 -2660:2:2042 -2661:2:2043 -2662:2:2051 -2663:2:2056 -2664:2:2060 -2665:2:2061 -2666:2:2069 -2667:2:2070 -2668:2:2074 -2669:2:2075 -2670:2:2069 -2671:2:2070 -2672:2:2074 -2673:2:2075 -2674:2:2083 -2675:2:2088 -2676:2:2089 -2677:2:2100 -2678:2:2101 -2679:2:2102 -2680:2:2113 -2681:2:2118 -2682:2:2119 -2683:2:2130 -2684:2:2131 -2685:2:2132 -2686:2:2130 -2687:2:2131 -2688:2:2132 -2689:2:2143 -2690:2:2151 -2691:0:2739 -2692:2:1175 -2693:0:2739 -2694:1:44 -2695:0:2739 -2696:2:2157 -2697:2:2158 -2698:2:2162 -2699:2:2163 -2700:2:2171 -2701:2:2172 -2702:2:2176 -2703:2:2177 -2704:2:2185 -2705:2:2190 -2706:2:2194 -2707:2:2195 -2708:2:2203 -2709:2:2204 -2710:2:2208 -2711:2:2209 -2712:2:2203 -2713:2:2204 -2714:2:2208 -2715:2:2209 -2716:2:2217 -2717:2:2222 -2718:2:2223 -2719:2:2234 -2720:2:2235 -2721:2:2236 -2722:2:2247 -2723:2:2252 -2724:2:2253 -2725:2:2264 -2726:2:2265 -2727:2:2266 -2728:2:2264 -2729:2:2265 -2730:2:2266 -2731:2:2277 -2732:0:2739 -2733:2:1175 -2734:0:2739 -2735:2:2023 -2736:2:2024 -2737:2:2028 -2738:2:2029 -2739:2:2037 -2740:2:2038 -2741:2:2042 -2742:2:2043 -2743:2:2051 -2744:2:2056 -2745:2:2060 -2746:2:2061 -2747:2:2069 -2748:2:2070 -2749:2:2074 -2750:2:2075 -2751:2:2069 -2752:2:2070 -2753:2:2074 -2754:2:2075 -2755:2:2083 -2756:2:2088 -2757:2:2089 -2758:2:2100 -2759:2:2101 -2760:2:2102 -2761:2:2113 -2762:2:2118 -2763:2:2119 -2764:2:2130 -2765:2:2131 -2766:2:2132 -2767:2:2130 -2768:2:2131 -2769:2:2132 -2770:2:2143 -2771:2:2151 -2772:0:2739 -2773:1:945 -2774:1:946 -2775:1:950 -2776:1:951 -2777:1:959 -2778:1:960 -2779:1:964 -2780:1:965 -2781:1:973 -2782:1:978 -2783:1:982 -2784:1:983 -2785:1:991 -2786:1:992 -2787:1:996 -2788:1:997 -2789:1:991 -2790:1:992 -2791:1:996 -2792:1:997 -2793:1:1005 -2794:1:1010 -2795:1:1011 -2796:1:1022 -2797:1:1023 -2798:1:1024 -2799:1:1035 -2800:1:1040 -2801:1:1041 -2802:1:1052 -2803:1:1053 -2804:1:1054 -2805:1:1052 -2806:1:1053 -2807:1:1054 -2808:1:1065 -2809:1:1072 -2810:1:1076 -2811:0:2739 -2812:2:1175 -2813:0:2739 -2814:1:40 -2815:0:2739 -2816:1:41 -2817:0:2739 -2818:2:2157 -2819:2:2158 -2820:2:2162 -2821:2:2163 -2822:2:2171 -2823:2:2172 -2824:2:2176 -2825:2:2177 -2826:2:2185 -2827:2:2190 -2828:2:2194 -2829:2:2195 -2830:2:2203 -2831:2:2204 -2832:2:2208 -2833:2:2209 -2834:2:2203 -2835:2:2204 -2836:2:2208 -2837:2:2209 -2838:2:2217 -2839:2:2222 -2840:2:2223 -2841:2:2234 -2842:2:2235 -2843:2:2236 -2844:2:2247 -2845:2:2252 -2846:2:2253 -2847:2:2264 -2848:2:2265 -2849:2:2266 -2850:2:2264 -2851:2:2265 -2852:2:2266 -2853:2:2277 -2854:0:2739 -2855:2:1175 -2856:0:2739 -2857:2:2023 -2858:2:2024 -2859:2:2028 -2860:2:2029 -2861:2:2037 -2862:2:2038 -2863:2:2042 -2864:2:2043 -2865:2:2051 -2866:2:2056 -2867:2:2060 -2868:2:2061 -2869:2:2069 -2870:2:2070 -2871:2:2074 -2872:2:2075 -2873:2:2069 -2874:2:2070 -2875:2:2074 -2876:2:2075 -2877:2:2083 -2878:2:2088 -2879:2:2089 -2880:2:2100 -2881:2:2101 -2882:2:2102 -2883:2:2113 -2884:2:2118 -2885:2:2119 -2886:2:2130 -2887:2:2131 -2888:2:2132 -2889:2:2130 -2890:2:2131 -2891:2:2132 -2892:2:2143 -2893:2:2151 -2894:0:2739 -2895:1:42 -2896:0:2739 -2897:2:1175 -2898:0:2739 -2899:2:2157 -2900:2:2158 -2901:2:2162 -2902:2:2163 -2903:2:2171 -2904:2:2172 -2905:2:2176 -2906:2:2177 -2907:2:2185 -2908:2:2190 -2909:2:2194 -2910:2:2195 -2911:2:2203 -2912:2:2204 -2913:2:2208 -2914:2:2209 -2915:2:2203 -2916:2:2204 -2917:2:2208 -2918:2:2209 -2919:2:2217 -2920:2:2222 -2921:2:2223 -2922:2:2234 -2923:2:2235 -2924:2:2236 -2925:2:2247 -2926:2:2252 -2927:2:2253 -2928:2:2264 -2929:2:2265 -2930:2:2266 -2931:2:2264 -2932:2:2265 -2933:2:2266 -2934:2:2277 -2935:0:2739 -2936:2:1175 -2937:0:2739 -2938:1:143 -2939:0:2739 -2940:2:2023 -2941:2:2024 -2942:2:2028 -2943:2:2029 -2944:2:2037 -2945:2:2038 -2946:2:2042 -2947:2:2043 -2948:2:2051 -2949:2:2056 -2950:2:2060 -2951:2:2061 -2952:2:2069 -2953:2:2070 -2954:2:2074 -2955:2:2075 -2956:2:2069 -2957:2:2070 -2958:2:2074 -2959:2:2075 -2960:2:2083 -2961:2:2088 -2962:2:2089 -2963:2:2100 -2964:2:2101 -2965:2:2102 -2966:2:2113 -2967:2:2118 -2968:2:2119 -2969:2:2130 -2970:2:2131 -2971:2:2132 -2972:2:2130 -2973:2:2131 -2974:2:2132 -2975:2:2143 -2976:2:2151 -2977:0:2739 -2978:2:1175 -2979:0:2739 -2980:2:2157 -2981:2:2158 -2982:2:2162 -2983:2:2163 -2984:2:2171 -2985:2:2172 -2986:2:2176 -2987:2:2177 -2988:2:2185 -2989:2:2190 -2990:2:2194 -2991:2:2195 -2992:2:2203 -2993:2:2204 -2994:2:2208 -2995:2:2209 -2996:2:2203 -2997:2:2204 -2998:2:2208 -2999:2:2209 -3000:2:2217 -3001:2:2222 -3002:2:2223 -3003:2:2234 -3004:2:2235 -3005:2:2236 -3006:2:2247 -3007:2:2252 -3008:2:2253 -3009:2:2264 -3010:2:2265 -3011:2:2266 -3012:2:2264 -3013:2:2265 -3014:2:2266 -3015:2:2277 -3016:0:2739 -3017:1:145 -3018:0:2739 -3019:2:1175 -3020:0:2739 -3021:2:2023 -3022:2:2024 -3023:2:2028 -3024:2:2029 -3025:2:2037 -3026:2:2038 -3027:2:2042 -3028:2:2043 -3029:2:2051 -3030:2:2056 -3031:2:2060 -3032:2:2061 -3033:2:2069 -3034:2:2070 -3035:2:2074 -3036:2:2075 -3037:2:2069 -3038:2:2070 -3039:2:2074 -3040:2:2075 -3041:2:2083 -3042:2:2088 -3043:2:2089 -3044:2:2100 -3045:2:2101 -3046:2:2102 -3047:2:2113 -3048:2:2118 -3049:2:2119 -3050:2:2130 -3051:2:2131 -3052:2:2132 -3053:2:2130 -3054:2:2131 -3055:2:2132 -3056:2:2143 -3057:2:2151 -3058:0:2739 -3059:2:1175 -3060:0:2739 -3061:1:44 -3062:0:2739 -3063:2:2157 -3064:2:2158 -3065:2:2162 -3066:2:2163 -3067:2:2171 -3068:2:2172 -3069:2:2176 -3070:2:2177 -3071:2:2185 -3072:2:2190 -3073:2:2194 -3074:2:2195 -3075:2:2203 -3076:2:2204 -3077:2:2208 -3078:2:2209 -3079:2:2203 -3080:2:2204 -3081:2:2208 -3082:2:2209 -3083:2:2217 -3084:2:2222 -3085:2:2223 -3086:2:2234 -3087:2:2235 -3088:2:2236 -3089:2:2247 -3090:2:2252 -3091:2:2253 -3092:2:2264 -3093:2:2265 -3094:2:2266 -3095:2:2264 -3096:2:2265 -3097:2:2266 -3098:2:2277 -3099:0:2739 -3100:2:1175 -3101:0:2739 -3102:2:2023 -3103:2:2024 -3104:2:2028 -3105:2:2029 -3106:2:2037 -3107:2:2038 -3108:2:2042 -3109:2:2043 -3110:2:2051 -3111:2:2056 -3112:2:2060 -3113:2:2061 -3114:2:2069 -3115:2:2070 -3116:2:2074 -3117:2:2075 -3118:2:2069 -3119:2:2070 -3120:2:2074 -3121:2:2075 -3122:2:2083 -3123:2:2088 -3124:2:2089 -3125:2:2100 -3126:2:2101 -3127:2:2102 -3128:2:2113 -3129:2:2118 -3130:2:2119 -3131:2:2130 -3132:2:2131 -3133:2:2132 -3134:2:2130 -3135:2:2131 -3136:2:2132 -3137:2:2143 -3138:2:2151 -3139:0:2739 -3140:1:1077 -3141:0:2739 -3142:2:1175 -3143:0:2739 -3144:1:1085 -3145:0:2739 -3146:1:1130 -3147:0:2739 -3148:1:36 -3149:0:2739 -3150:2:2157 -3151:2:2158 -3152:2:2162 -3153:2:2163 -3154:2:2171 -3155:2:2172 -3156:2:2176 -3157:2:2177 -3158:2:2185 -3159:2:2190 -3160:2:2194 -3161:2:2195 -3162:2:2203 -3163:2:2204 -3164:2:2208 -3165:2:2209 -3166:2:2203 -3167:2:2204 -3168:2:2208 -3169:2:2209 -3170:2:2217 -3171:2:2222 -3172:2:2223 -3173:2:2234 -3174:2:2235 -3175:2:2236 -3176:2:2247 -3177:2:2252 -3178:2:2253 -3179:2:2264 -3180:2:2265 -3181:2:2266 -3182:2:2264 -3183:2:2265 -3184:2:2266 -3185:2:2277 -3186:0:2739 -3187:2:1175 -3188:0:2739 -3189:2:2023 -3190:2:2024 -3191:2:2028 -3192:2:2029 -3193:2:2037 -3194:2:2038 -3195:2:2042 -3196:2:2043 -3197:2:2051 -3198:2:2056 -3199:2:2060 -3200:2:2061 -3201:2:2069 -3202:2:2070 -3203:2:2074 -3204:2:2075 -3205:2:2069 -3206:2:2070 -3207:2:2074 -3208:2:2075 -3209:2:2083 -3210:2:2088 -3211:2:2089 -3212:2:2100 -3213:2:2101 -3214:2:2102 -3215:2:2113 -3216:2:2118 -3217:2:2119 -3218:2:2130 -3219:2:2131 -3220:2:2132 -3221:2:2130 -3222:2:2131 -3223:2:2132 -3224:2:2143 -3225:2:2151 -3226:0:2739 -3227:1:37 -3228:0:2739 -3229:2:1175 -3230:0:2739 -3231:2:2157 -3232:2:2158 -3233:2:2162 -3234:2:2163 -3235:2:2171 -3236:2:2172 -3237:2:2176 -3238:2:2177 -3239:2:2185 -3240:2:2190 -3241:2:2194 -3242:2:2195 -3243:2:2203 -3244:2:2204 -3245:2:2208 -3246:2:2209 -3247:2:2203 -3248:2:2204 -3249:2:2208 -3250:2:2209 -3251:2:2217 -3252:2:2222 -3253:2:2223 -3254:2:2234 -3255:2:2235 -3256:2:2236 -3257:2:2247 -3258:2:2252 -3259:2:2253 -3260:2:2264 -3261:2:2265 -3262:2:2266 -3263:2:2264 -3264:2:2265 -3265:2:2266 -3266:2:2277 -3267:0:2739 -3268:2:1175 -3269:0:2739 -3270:1:38 -3271:0:2739 -3272:2:2023 -3273:2:2024 -3274:2:2028 -3275:2:2029 -3276:2:2037 -3277:2:2038 -3278:2:2042 -3279:2:2043 -3280:2:2051 -3281:2:2056 -3282:2:2060 -3283:2:2061 -3284:2:2069 -3285:2:2070 -3286:2:2074 -3287:2:2075 -3288:2:2069 -3289:2:2070 -3290:2:2074 -3291:2:2075 -3292:2:2083 -3293:2:2088 -3294:2:2089 -3295:2:2100 -3296:2:2101 -3297:2:2102 -3298:2:2113 -3299:2:2118 -3300:2:2119 -3301:2:2130 -3302:2:2131 -3303:2:2132 -3304:2:2130 -3305:2:2131 -3306:2:2132 -3307:2:2143 -3308:2:2151 -3309:0:2739 -3310:2:1175 -3311:0:2739 -3312:2:2157 -3313:2:2158 -3314:2:2162 -3315:2:2163 -3316:2:2171 -3317:2:2172 -3318:2:2176 -3319:2:2177 -3320:2:2185 -3321:2:2190 -3322:2:2194 -3323:2:2195 -3324:2:2203 -3325:2:2204 -3326:2:2208 -3327:2:2209 -3328:2:2203 -3329:2:2204 -3330:2:2208 -3331:2:2209 -3332:2:2217 -3333:2:2222 -3334:2:2223 -3335:2:2234 -3336:2:2235 -3337:2:2236 -3338:2:2247 -3339:2:2252 -3340:2:2253 -3341:2:2264 -3342:2:2265 -3343:2:2266 -3344:2:2264 -3345:2:2265 -3346:2:2266 -3347:2:2277 -3348:0:2739 -3349:1:39 -3350:0:2739 -3351:2:1175 -3352:0:2739 -3353:1:40 -3354:0:2739 -3355:1:41 -3356:0:2739 -3357:2:2023 -3358:2:2024 -3359:2:2028 -3360:2:2029 -3361:2:2037 -3362:2:2038 -3363:2:2042 -3364:2:2043 -3365:2:2051 -3366:2:2056 -3367:2:2060 -3368:2:2061 -3369:2:2069 -3370:2:2070 -3371:2:2074 -3372:2:2075 -3373:2:2069 -3374:2:2070 -3375:2:2074 -3376:2:2075 -3377:2:2083 -3378:2:2088 -3379:2:2089 -3380:2:2100 -3381:2:2101 -3382:2:2102 -3383:2:2113 -3384:2:2118 -3385:2:2119 -3386:2:2130 -3387:2:2131 -3388:2:2132 -3389:2:2130 -3390:2:2131 -3391:2:2132 -3392:2:2143 -3393:2:2151 -3394:0:2739 -3395:2:1175 -3396:0:2739 -3397:2:2157 -3398:2:2158 -3399:2:2162 -3400:2:2163 -3401:2:2171 -3402:2:2172 -3403:2:2176 -3404:2:2177 -3405:2:2185 -3406:2:2190 -3407:2:2194 -3408:2:2195 -3409:2:2203 -3410:2:2204 -3411:2:2208 -3412:2:2209 -3413:2:2203 -3414:2:2204 -3415:2:2208 -3416:2:2209 -3417:2:2217 -3418:2:2222 -3419:2:2223 -3420:2:2234 -3421:2:2235 -3422:2:2236 -3423:2:2247 -3424:2:2252 -3425:2:2253 -3426:2:2264 -3427:2:2265 -3428:2:2266 -3429:2:2264 -3430:2:2265 -3431:2:2266 -3432:2:2277 -3433:0:2739 -3434:1:42 -3435:0:2739 -3436:2:1175 -3437:0:2739 -3438:2:2023 -3439:2:2024 -3440:2:2028 -3441:2:2029 -3442:2:2037 -3443:2:2038 -3444:2:2042 -3445:2:2043 -3446:2:2051 -3447:2:2056 -3448:2:2060 -3449:2:2061 -3450:2:2069 -3451:2:2070 -3452:2:2074 -3453:2:2075 -3454:2:2069 -3455:2:2070 -3456:2:2074 -3457:2:2075 -3458:2:2083 -3459:2:2088 -3460:2:2089 -3461:2:2100 -3462:2:2101 -3463:2:2102 -3464:2:2113 -3465:2:2118 -3466:2:2119 -3467:2:2130 -3468:2:2131 -3469:2:2132 -3470:2:2130 -3471:2:2131 -3472:2:2132 -3473:2:2143 -3474:2:2151 -3475:0:2739 -3476:2:1175 -3477:0:2739 -3478:1:143 -3479:0:2739 -3480:2:2157 -3481:2:2158 -3482:2:2162 -3483:2:2163 -3484:2:2171 -3485:2:2172 -3486:2:2176 -3487:2:2177 -3488:2:2185 -3489:2:2190 -3490:2:2194 -3491:2:2195 -3492:2:2203 -3493:2:2204 -3494:2:2208 -3495:2:2209 -3496:2:2203 -3497:2:2204 -3498:2:2208 -3499:2:2209 -3500:2:2217 -3501:2:2222 -3502:2:2223 -3503:2:2234 -3504:2:2235 -3505:2:2236 -3506:2:2247 -3507:2:2252 -3508:2:2253 -3509:2:2264 -3510:2:2265 -3511:2:2266 -3512:2:2264 -3513:2:2265 -3514:2:2266 -3515:2:2277 -3516:0:2739 -3517:2:1175 -3518:0:2739 -3519:2:2023 -3520:2:2024 -3521:2:2028 -3522:2:2029 -3523:2:2037 -3524:2:2038 -3525:2:2042 -3526:2:2043 -3527:2:2051 -3528:2:2056 -3529:2:2060 -3530:2:2061 -3531:2:2069 -3532:2:2070 -3533:2:2074 -3534:2:2075 -3535:2:2069 -3536:2:2070 -3537:2:2074 -3538:2:2075 -3539:2:2083 -3540:2:2088 -3541:2:2089 -3542:2:2100 -3543:2:2101 -3544:2:2102 -3545:2:2113 -3546:2:2118 -3547:2:2119 -3548:2:2130 -3549:2:2131 -3550:2:2132 -3551:2:2130 -3552:2:2131 -3553:2:2132 -3554:2:2143 -3555:2:2151 -3556:0:2739 -3557:1:145 -3558:0:2737 -3559:2:1175 -3560:0:2743 -3561:2:2157 -3562:2:2158 -3563:2:2162 -3564:2:2163 -3565:2:2171 -3566:2:2172 -3567:2:2176 -3568:2:2177 -3569:2:2185 -3570:2:2190 -3571:2:2194 -3572:2:2195 -3573:2:2203 -3574:2:2204 -3575:2:2208 -3576:2:2209 -3577:2:2203 -3578:2:2204 -3579:2:2208 -3580:2:2209 -3581:2:2217 -3582:2:2222 -3583:2:2223 -3584:2:2234 -3585:2:2235 -3586:2:2236 -3587:2:2247 -3588:2:2252 -3589:2:2253 -3590:2:2264 -3591:2:2265 -3592:2:2266 -3593:2:2264 -3594:2:2265 -3595:2:2266 -3596:2:2277 -3597:0:2743 -3598:2:1175 -3599:0:2743 -3600:2:2023 -3601:2:2024 -3602:2:2028 -3603:2:2029 -3604:2:2037 -3605:2:2038 -3606:2:2042 -3607:2:2043 -3608:2:2051 -3609:2:2056 -3610:2:2060 -3611:2:2061 -3612:2:2069 -3613:2:2070 -3614:2:2074 -3615:2:2075 -3616:2:2069 -3617:2:2070 -3618:2:2074 -3619:2:2075 -3620:2:2083 -3621:2:2088 -3622:2:2089 -3623:2:2100 -3624:2:2101 -3625:2:2102 -3626:2:2113 -3627:2:2118 -3628:2:2119 -3629:2:2130 -3630:2:2131 -3631:2:2132 -3632:2:2130 -3633:2:2131 -3634:2:2132 -3635:2:2143 -3636:2:2151 -3637:0:2743 -3638:1:44 -3639:0:2743 -3640:2:1175 -3641:0:2743 -3642:2:2157 -3643:2:2158 -3644:2:2162 -3645:2:2163 -3646:2:2171 -3647:2:2172 -3648:2:2176 -3649:2:2177 -3650:2:2185 -3651:2:2190 -3652:2:2194 -3653:2:2195 -3654:2:2203 -3655:2:2204 -3656:2:2208 -3657:2:2209 -3658:2:2203 -3659:2:2204 -3660:2:2208 -3661:2:2209 -3662:2:2217 -3663:2:2222 -3664:2:2223 -3665:2:2234 -3666:2:2235 -3667:2:2236 -3668:2:2247 -3669:2:2252 -3670:2:2253 -3671:2:2264 -3672:2:2265 -3673:2:2266 -3674:2:2264 -3675:2:2265 -3676:2:2266 -3677:2:2277 -3678:0:2743 -3679:2:1175 -3680:0:2743 -3681:2:2023 -3682:2:2024 -3683:2:2028 -3684:2:2029 -3685:2:2037 -3686:2:2038 -3687:2:2042 -3688:2:2043 -3689:2:2051 -3690:2:2056 -3691:2:2060 -3692:2:2061 -3693:2:2069 -3694:2:2070 -3695:2:2074 -3696:2:2075 -3697:2:2069 -3698:2:2070 -3699:2:2074 -3700:2:2075 -3701:2:2083 -3702:2:2088 -3703:2:2089 -3704:2:2100 -3705:2:2101 -3706:2:2102 -3707:2:2113 -3708:2:2118 -3709:2:2119 -3710:2:2130 -3711:2:2131 -3712:2:2132 -3713:2:2130 -3714:2:2131 -3715:2:2132 -3716:2:2143 -3717:2:2151 -3718:0:2743 -3719:1:681 -3720:1:682 -3721:1:686 -3722:1:687 -3723:1:695 -3724:1:696 -3725:1:697 -3726:1:709 -3727:1:714 -3728:1:718 -3729:1:719 -3730:1:727 -3731:1:728 -3732:1:732 -3733:1:733 -3734:1:727 -3735:1:728 -3736:1:732 -3737:1:733 -3738:1:741 -3739:1:746 -3740:1:747 -3741:1:758 -3742:1:759 -3743:1:760 -3744:1:771 -3745:1:776 -3746:1:777 -3747:1:788 -3748:1:789 -3749:1:790 -3750:1:788 -3751:1:789 -3752:1:790 -3753:1:801 -3754:0:2743 -3755:2:1175 -3756:0:2743 -3757:1:40 -3758:0:2743 -3759:1:41 -3760:0:2743 -3761:2:2157 -3762:2:2158 -3763:2:2162 -3764:2:2163 -3765:2:2171 -3766:2:2172 -3767:2:2176 -3768:2:2177 -3769:2:2185 -3770:2:2190 -3771:2:2194 -3772:2:2195 -3773:2:2203 -3774:2:2204 -3775:2:2208 -3776:2:2209 -3777:2:2203 -3778:2:2204 -3779:2:2208 -3780:2:2209 -3781:2:2217 -3782:2:2222 -3783:2:2223 -3784:2:2234 -3785:2:2242 -3786:2:2243 -3787:2:2247 -3788:2:2252 -3789:2:2253 -3790:2:2264 -3791:2:2265 -3792:2:2266 -3793:2:2264 -3794:2:2265 -3795:2:2266 -3796:2:2277 -3797:0:2743 -3798:2:1175 --1:-1:-1 -3799:0:2743 -3800:2:2023 -3801:2:2024 -3802:2:2028 -3803:2:2029 -3804:2:2037 -3805:2:2038 -3806:2:2042 -3807:2:2043 -3808:2:2051 -3809:2:2056 -3810:2:2060 -3811:2:2061 -3812:2:2069 -3813:2:2070 -3814:2:2074 -3815:2:2075 -3816:2:2069 -3817:2:2070 -3818:2:2074 -3819:2:2075 -3820:2:2083 -3821:2:2088 -3822:2:2089 -3823:2:2100 -3824:2:2108 -3825:2:2109 -3826:2:2113 -3827:2:2118 -3828:2:2119 -3829:2:2130 -3830:2:2131 -3831:2:2132 -3832:2:2130 -3833:2:2131 -3834:2:2132 -3835:2:2143 -3836:2:2151 -3837:0:2743 -3838:2:1175 -3839:0:2743 -3840:2:2157 -3841:2:2158 -3842:2:2162 -3843:2:2163 -3844:2:2171 -3845:2:2172 -3846:2:2176 -3847:2:2177 -3848:2:2185 -3849:2:2190 -3850:2:2194 -3851:2:2195 -3852:2:2203 -3853:2:2204 -3854:2:2208 -3855:2:2209 -3856:2:2203 -3857:2:2204 -3858:2:2208 -3859:2:2209 -3860:2:2217 -3861:2:2222 -3862:2:2223 -3863:2:2234 -3864:2:2242 -3865:2:2243 -3866:2:2247 -3867:2:2252 -3868:2:2253 -3869:2:2264 -3870:2:2265 -3871:2:2266 -3872:2:2264 -3873:2:2265 -3874:2:2266 -3875:2:2277 -3876:0:2743 -3877:2:1175 -3878:0:2743 -3879:2:2023 -3880:2:2024 -3881:2:2028 -3882:2:2029 -3883:2:2037 -3884:2:2038 -3885:2:2042 -3886:2:2043 -3887:2:2051 -3888:2:2056 -3889:2:2060 -3890:2:2061 -3891:2:2069 -3892:2:2070 -3893:2:2074 -3894:2:2075 -3895:2:2069 -3896:2:2070 -3897:2:2074 -3898:2:2075 -3899:2:2083 -3900:2:2088 -3901:2:2089 -3902:2:2100 -3903:2:2108 -3904:2:2109 -3905:2:2113 -3906:2:2118 -3907:2:2119 -3908:2:2130 -3909:2:2131 -3910:2:2132 -3911:2:2130 -3912:2:2131 -3913:2:2132 -3914:2:2143 -3915:2:2151 -3916:0:2743 -3917:2:1175 -3918:0:2743 -3919:2:2157 -3920:2:2158 -3921:2:2162 -3922:2:2163 -3923:2:2171 -3924:2:2172 -3925:2:2176 -3926:2:2177 -3927:2:2185 -3928:2:2190 -3929:2:2194 -3930:2:2195 -3931:2:2203 -3932:2:2204 -3933:2:2208 -3934:2:2209 -3935:2:2203 -3936:2:2204 -3937:2:2208 -3938:2:2209 -3939:2:2217 -3940:2:2222 -3941:2:2223 -3942:2:2234 -3943:2:2242 -3944:2:2243 -3945:2:2247 -3946:2:2252 -3947:2:2253 -3948:2:2264 -3949:2:2265 -3950:2:2266 -3951:2:2264 -3952:2:2265 -3953:2:2266 -3954:2:2277 -3955:0:2743 -3956:2:1175 diff --git a/formal-model/urcu-controldataflow-alpha-ipi/.input.spin b/formal-model/urcu-controldataflow-alpha-ipi/.input.spin deleted file mode 100644 index ca70e6c..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/.input.spin +++ /dev/null @@ -1,1339 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi/DEFINES b/formal-model/urcu-controldataflow-alpha-ipi/DEFINES deleted file mode 100644 index 2681f69..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/DEFINES +++ /dev/null @@ -1,18 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC diff --git a/formal-model/urcu-controldataflow-alpha-ipi/Makefile b/formal-model/urcu-controldataflow-alpha-ipi/Makefile deleted file mode 100644 index cadd0aa..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/Makefile +++ /dev/null @@ -1,172 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 -DCOLLAPSE -#CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - #state-space over 14gb.. - #make urcu_progress_writer | tee urcu_progress_writer.log - #make urcu_progress_reader | tee urcu_progress_reader.log - #make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu-controldataflow-alpha-ipi/asserts.log b/formal-model/urcu-controldataflow-alpha-ipi/asserts.log deleted file mode 100644 index 6efa47c..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/asserts.log +++ /dev/null @@ -1,549 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -cat DEFINES > .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w20 -Depth= 6176 States= 1e+06 Transitions= 1.77e+08 Memory= 497.600 t= 218 R= 5e+03 -Depth= 7720 States= 2e+06 Transitions= 3.71e+08 Memory= 528.654 t= 474 R= 4e+03 -Depth= 7720 States= 3e+06 Transitions= 5.8e+08 Memory= 561.955 t= 768 R= 4e+03 -pan: resizing hashtable to -w22.. done -Depth= 7720 States= 4e+06 Transitions= 7.6e+08 Memory= 627.549 t= 999 R= 4e+03 -Depth= 7720 States= 5e+06 Transitions= 9.44e+08 Memory= 662.217 t= 1.24e+03 R= 4e+03 -Depth= 7720 States= 6e+06 Transitions= 1.35e+09 Memory= 699.619 t= 1.79e+03 R= 3e+03 -Depth= 7720 States= 7e+06 Transitions= 1.79e+09 Memory= 735.361 t= 2.39e+03 R= 3e+03 -Depth= 7720 States= 8e+06 Transitions= 2.11e+09 Memory= 773.545 t= 2.83e+03 R= 3e+03 -Depth= 7720 States= 9e+06 Transitions= 2.49e+09 Memory= 811.143 t= 3.37e+03 R= 3e+03 -pan: resizing hashtable to -w24.. done -Depth= 7720 States= 1e+07 Transitions= 2.83e+09 Memory= 973.518 t= 3.8e+03 R= 3e+03 -Depth= 7720 States= 1.1e+07 Transitions= 3.2e+09 Memory= 1011.506 t= 4.27e+03 R= 3e+03 -Depth= 7720 States= 1.2e+07 Transitions= 3.59e+09 Memory= 1049.885 t= 4.78e+03 R= 3e+03 -Depth= 7720 States= 1.3e+07 Transitions= 3.81e+09 Memory= 1087.678 t= 5.06e+03 R= 3e+03 -Depth= 7720 States= 1.4e+07 Transitions= 4.12e+09 Memory= 1122.834 t= 5.46e+03 R= 3e+03 -Depth= 7720 States= 1.5e+07 Transitions= 4.35e+09 Memory= 1159.358 t= 5.75e+03 R= 3e+03 -Depth= 7720 States= 1.6e+07 Transitions= 4.88e+09 Memory= 1195.783 t= 6.46e+03 R= 2e+03 -Depth= 7720 States= 1.7e+07 Transitions= 5.67e+09 Memory= 1231.721 t= 7.51e+03 R= 2e+03 -Depth= 7720 States= 1.8e+07 Transitions= 6.31e+09 Memory= 1268.537 t= 8.37e+03 R= 2e+03 -Depth= 7720 States= 1.9e+07 Transitions= 6.77e+09 Memory= 1306.526 t= 8.98e+03 R= 2e+03 -Depth= 7720 States= 2e+07 Transitions= 7.09e+09 Memory= 1345.393 t= 9.41e+03 R= 2e+03 -Depth= 7720 States= 2.1e+07 Transitions= 7.48e+09 Memory= 1383.576 t= 9.93e+03 R= 2e+03 -Depth= 7720 States= 2.2e+07 Transitions= 7.94e+09 Memory= 1421.955 t= 1.06e+04 R= 2e+03 -Depth= 7720 States= 2.3e+07 Transitions= 8.37e+09 Memory= 1459.846 t= 1.11e+04 R= 2e+03 -Depth= 7720 States= 2.4e+07 Transitions= 8.77e+09 Memory= 1497.346 t= 1.17e+04 R= 2e+03 -Depth= 7720 States= 2.5e+07 Transitions= 9.22e+09 Memory= 1535.529 t= 1.23e+04 R= 2e+03 -Depth= 7720 States= 2.6e+07 Transitions= 9.48e+09 Memory= 1574.006 t= 1.26e+04 R= 2e+03 -Depth= 7720 States= 2.7e+07 Transitions= 9.85e+09 Memory= 1612.385 t= 1.31e+04 R= 2e+03 -Depth= 7720 States= 2.8e+07 Transitions= 1.02e+10 Memory= 1650.666 t= 1.37e+04 R= 2e+03 -Depth= 7940 States= 2.9e+07 Transitions= 1.06e+10 Memory= 1688.752 t= 1.41e+04 R= 2e+03 -Depth= 7998 States= 3e+07 Transitions= 1.09e+10 Memory= 1726.936 t= 1.46e+04 R= 2e+03 -Depth= 7998 States= 3.1e+07 Transitions= 1.13e+10 Memory= 1765.315 t= 1.51e+04 R= 2e+03 -Depth= 7998 States= 3.2e+07 Transitions= 1.16e+10 Memory= 1803.498 t= 1.55e+04 R= 2e+03 -Depth= 7998 States= 3.3e+07 Transitions= 1.19e+10 Memory= 1841.682 t= 1.6e+04 R= 2e+03 -Depth= 7998 States= 3.4e+07 Transitions= 1.23e+10 Memory= 1879.963 t= 1.65e+04 R= 2e+03 -pan: resizing hashtable to -w26.. done -Depth= 7998 States= 3.5e+07 Transitions= 1.26e+10 Memory= 2414.131 t= 1.69e+04 R= 2e+03 -Depth= 7998 States= 3.6e+07 Transitions= 1.29e+10 Memory= 2452.315 t= 1.73e+04 R= 2e+03 -Depth= 7998 States= 3.7e+07 Transitions= 1.32e+10 Memory= 2490.498 t= 1.77e+04 R= 2e+03 -Depth= 7998 States= 3.8e+07 Transitions= 1.35e+10 Memory= 2528.584 t= 1.82e+04 R= 2e+03 -Depth= 7998 States= 3.9e+07 Transitions= 1.39e+10 Memory= 2566.768 t= 1.86e+04 R= 2e+03 -Depth= 7998 States= 4e+07 Transitions= 1.41e+10 Memory= 2604.951 t= 1.89e+04 R= 2e+03 -Depth= 7998 States= 4.1e+07 Transitions= 1.44e+10 Memory= 2643.135 t= 1.93e+04 R= 2e+03 -Depth= 7998 States= 4.2e+07 Transitions= 1.48e+10 Memory= 2682.002 t= 1.98e+04 R= 2e+03 -Depth= 7998 States= 4.3e+07 Transitions= 1.51e+10 Memory= 2720.283 t= 2.03e+04 R= 2e+03 -Depth= 7998 States= 4.4e+07 Transitions= 1.56e+10 Memory= 2759.053 t= 2.09e+04 R= 2e+03 -Depth= 7998 States= 4.5e+07 Transitions= 1.59e+10 Memory= 2797.432 t= 2.13e+04 R= 2e+03 -Depth= 7998 States= 4.6e+07 Transitions= 1.64e+10 Memory= 2836.201 t= 2.19e+04 R= 2e+03 -Depth= 7998 States= 4.7e+07 Transitions= 1.68e+10 Memory= 2875.068 t= 2.24e+04 R= 2e+03 -Depth= 7998 States= 4.8e+07 Transitions= 1.72e+10 Memory= 2913.643 t= 2.29e+04 R= 2e+03 -Depth= 7998 States= 4.9e+07 Transitions= 1.76e+10 Memory= 2952.412 t= 2.34e+04 R= 2e+03 -Depth= 7998 States= 5e+07 Transitions= 1.78e+10 Memory= 2989.619 t= 2.38e+04 R= 2e+03 -Depth= 7998 States= 5.1e+07 Transitions= 1.81e+10 Memory= 3027.901 t= 2.42e+04 R= 2e+03 -Depth= 7998 States= 5.2e+07 Transitions= 1.84e+10 Memory= 3066.279 t= 2.46e+04 R= 2e+03 -Depth= 7998 States= 5.3e+07 Transitions= 1.87e+10 Memory= 3104.463 t= 2.49e+04 R= 2e+03 -Depth= 7998 States= 5.4e+07 Transitions= 1.93e+10 Memory= 3142.842 t= 2.57e+04 R= 2e+03 -Depth= 7998 States= 5.5e+07 Transitions= 2.01e+10 Memory= 3181.026 t= 2.68e+04 R= 2e+03 -Depth= 7998 States= 5.6e+07 Transitions= 2.07e+10 Memory= 3219.990 t= 2.76e+04 R= 2e+03 -Depth= 7998 States= 5.7e+07 Transitions= 2.11e+10 Memory= 3258.467 t= 2.82e+04 R= 2e+03 -Depth= 7998 States= 5.8e+07 Transitions= 2.15e+10 Memory= 3297.236 t= 2.87e+04 R= 2e+03 -Depth= 7998 States= 5.9e+07 Transitions= 2.18e+10 Memory= 3334.151 t= 2.91e+04 R= 2e+03 -Depth= 7998 States= 6e+07 Transitions= 2.22e+10 Memory= 3372.432 t= 2.97e+04 R= 2e+03 -Depth= 7998 States= 6.1e+07 Transitions= 2.27e+10 Memory= 3410.713 t= 3.03e+04 R= 2e+03 -Depth= 7998 States= 6.2e+07 Transitions= 2.32e+10 Memory= 3448.701 t= 3.09e+04 R= 2e+03 -Depth= 7998 States= 6.3e+07 Transitions= 2.35e+10 Memory= 3485.615 t= 3.15e+04 R= 2e+03 -Depth= 7998 States= 6.4e+07 Transitions= 2.38e+10 Memory= 3523.604 t= 3.19e+04 R= 2e+03 -Depth= 7998 States= 6.5e+07 Transitions= 2.42e+10 Memory= 3561.690 t= 3.23e+04 R= 2e+03 -Depth= 7998 States= 6.6e+07 Transitions= 2.46e+10 Memory= 3598.799 t= 3.28e+04 R= 2e+03 -Depth= 7998 States= 6.7e+07 Transitions= 2.49e+10 Memory= 3635.225 t= 3.33e+04 R= 2e+03 -Depth= 7998 States= 6.8e+07 Transitions= 2.53e+10 Memory= 3672.139 t= 3.38e+04 R= 2e+03 -Depth= 7998 States= 6.9e+07 Transitions= 2.56e+10 Memory= 3706.807 t= 3.42e+04 R= 2e+03 -Depth= 7998 States= 7e+07 Transitions= 2.59e+10 Memory= 3743.916 t= 3.47e+04 R= 2e+03 -Depth= 7998 States= 7.1e+07 Transitions= 2.62e+10 Memory= 3781.026 t= 3.51e+04 R= 2e+03 -Depth= 7998 States= 7.2e+07 Transitions= 2.66e+10 Memory= 3818.721 t= 3.56e+04 R= 2e+03 -Depth= 7998 States= 7.3e+07 Transitions= 2.68e+10 Memory= 3855.244 t= 3.59e+04 R= 2e+03 -Depth= 7998 States= 7.4e+07 Transitions= 2.72e+10 Memory= 3892.647 t= 3.64e+04 R= 2e+03 -Depth= 7998 States= 7.5e+07 Transitions= 2.76e+10 Memory= 3930.049 t= 3.69e+04 R= 2e+03 -Depth= 7998 States= 7.6e+07 Transitions= 2.78e+10 Memory= 3966.963 t= 3.72e+04 R= 2e+03 -Depth= 7998 States= 7.7e+07 Transitions= 2.81e+10 Memory= 4003.975 t= 3.77e+04 R= 2e+03 -Depth= 7998 States= 7.8e+07 Transitions= 2.84e+10 Memory= 4041.084 t= 3.8e+04 R= 2e+03 -Depth= 7998 States= 7.9e+07 Transitions= 2.87e+10 Memory= 4078.584 t= 3.84e+04 R= 2e+03 -Depth= 7998 States= 8e+07 Transitions= 2.91e+10 Memory= 4114.815 t= 3.9e+04 R= 2e+03 -Depth= 7998 States= 8.1e+07 Transitions= 2.95e+10 Memory= 4151.240 t= 3.95e+04 R= 2e+03 -Depth= 7998 States= 8.2e+07 Transitions= 2.99e+10 Memory= 4189.131 t= 4e+04 R= 2e+03 -Depth= 7998 States= 8.3e+07 Transitions= 3.03e+10 Memory= 4226.533 t= 4.06e+04 R= 2e+03 -Depth= 7998 States= 8.4e+07 Transitions= 3.07e+10 Memory= 4264.912 t= 4.11e+04 R= 2e+03 -Depth= 7998 States= 8.5e+07 Transitions= 3.11e+10 Memory= 4302.998 t= 4.16e+04 R= 2e+03 -Depth= 7998 States= 8.6e+07 Transitions= 3.15e+10 Memory= 4340.693 t= 4.21e+04 R= 2e+03 -Depth= 7998 States= 8.7e+07 Transitions= 3.19e+10 Memory= 4378.877 t= 4.27e+04 R= 2e+03 -Depth= 7998 States= 8.8e+07 Transitions= 3.23e+10 Memory= 4417.061 t= 4.32e+04 R= 2e+03 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim - (none specified) - assertion violations + - cycle checks - (disabled by -DSAFETY) - invalid end states + - -State-vector 72 byte, depth reached 7998, errors: 0 - 88716525 states, stored -3.2432758e+10 states, matched -3.2521475e+10 transitions (= stored+matched) -1.8325967e+11 atomic steps -hash conflicts: 1.7127982e+10 (resolved) - -Stats on memory usage (in Megabytes): - 8460.667 equivalent memory usage for states (stored*(State-vector + overhead)) - 3474.757 actual memory usage for states (compression: 41.07%) - state-vector as stored = 13 byte + 28 byte overhead - 512.000 memory used for hash table (-w26) - 457.764 memory used for DFS stack (-m10000000) - 4444.111 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 606546 5194 3779 2 ] -unreached in proctype urcu_reader - line 267, ".input.spin", state 57, "cache_dirty_urcu_gp_ctr = 0" - line 275, ".input.spin", state 79, "cache_dirty_rcu_ptr = 0" - line 279, ".input.spin", state 88, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 104, "(1)" - line 248, ".input.spin", state 112, "(1)" - line 252, ".input.spin", state 124, "(1)" - line 256, ".input.spin", state 132, "(1)" - line 406, ".input.spin", state 158, "cache_dirty_urcu_gp_ctr = 0" - line 415, ".input.spin", state 190, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 204, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 223, "(1)" - line 433, ".input.spin", state 253, "(1)" - line 437, ".input.spin", state 266, "(1)" - line 686, ".input.spin", state 287, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 406, ".input.spin", state 294, "cache_dirty_urcu_gp_ctr = 0" - line 415, ".input.spin", state 326, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 340, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 359, "(1)" - line 433, ".input.spin", state 389, "(1)" - line 437, ".input.spin", state 402, "(1)" - line 406, ".input.spin", state 423, "cache_dirty_urcu_gp_ctr = 0" - line 415, ".input.spin", state 455, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 469, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 488, "(1)" - line 433, ".input.spin", state 518, "(1)" - line 437, ".input.spin", state 531, "(1)" - line 406, ".input.spin", state 554, "cache_dirty_urcu_gp_ctr = 0" - line 406, ".input.spin", state 556, "(1)" - line 406, ".input.spin", state 557, "(cache_dirty_urcu_gp_ctr)" - line 406, ".input.spin", state 557, "else" - line 406, ".input.spin", state 560, "(1)" - line 410, ".input.spin", state 568, "cache_dirty_urcu_active_readers = 0" - line 410, ".input.spin", state 570, "(1)" - line 410, ".input.spin", state 571, "(cache_dirty_urcu_active_readers)" - line 410, ".input.spin", state 571, "else" - line 410, ".input.spin", state 574, "(1)" - line 410, ".input.spin", state 575, "(1)" - line 410, ".input.spin", state 575, "(1)" - line 408, ".input.spin", state 580, "((i<1))" - line 408, ".input.spin", state 580, "((i>=1))" - line 415, ".input.spin", state 586, "cache_dirty_rcu_ptr = 0" - line 415, ".input.spin", state 588, "(1)" - line 415, ".input.spin", state 589, "(cache_dirty_rcu_ptr)" - line 415, ".input.spin", state 589, "else" - line 415, ".input.spin", state 592, "(1)" - line 415, ".input.spin", state 593, "(1)" - line 415, ".input.spin", state 593, "(1)" - line 419, ".input.spin", state 600, "cache_dirty_rcu_data[i] = 0" - line 419, ".input.spin", state 602, "(1)" - line 419, ".input.spin", state 603, "(cache_dirty_rcu_data[i])" - line 419, ".input.spin", state 603, "else" - line 419, ".input.spin", state 606, "(1)" - line 419, ".input.spin", state 607, "(1)" - line 419, ".input.spin", state 607, "(1)" - line 417, ".input.spin", state 612, "((i<2))" - line 417, ".input.spin", state 612, "((i>=2))" - line 424, ".input.spin", state 619, "(1)" - line 424, ".input.spin", state 620, "(!(cache_dirty_urcu_gp_ctr))" - line 424, ".input.spin", state 620, "else" - line 424, ".input.spin", state 623, "(1)" - line 424, ".input.spin", state 624, "(1)" - line 424, ".input.spin", state 624, "(1)" - line 428, ".input.spin", state 632, "(1)" - line 428, ".input.spin", state 633, "(!(cache_dirty_urcu_active_readers))" - line 428, ".input.spin", state 633, "else" - line 428, ".input.spin", state 636, "(1)" - line 428, ".input.spin", state 637, "(1)" - line 428, ".input.spin", state 637, "(1)" - line 426, ".input.spin", state 642, "((i<1))" - line 426, ".input.spin", state 642, "((i>=1))" - line 433, ".input.spin", state 649, "(1)" - line 433, ".input.spin", state 650, "(!(cache_dirty_rcu_ptr))" - line 433, ".input.spin", state 650, "else" - line 433, ".input.spin", state 653, "(1)" - line 433, ".input.spin", state 654, "(1)" - line 433, ".input.spin", state 654, "(1)" - line 437, ".input.spin", state 662, "(1)" - line 437, ".input.spin", state 663, "(!(cache_dirty_rcu_data[i]))" - line 437, ".input.spin", state 663, "else" - line 437, ".input.spin", state 666, "(1)" - line 437, ".input.spin", state 667, "(1)" - line 437, ".input.spin", state 667, "(1)" - line 435, ".input.spin", state 672, "((i<2))" - line 435, ".input.spin", state 672, "((i>=2))" - line 445, ".input.spin", state 676, "(1)" - line 445, ".input.spin", state 676, "(1)" - line 686, ".input.spin", state 679, "cached_urcu_active_readers = (tmp+1)" - line 686, ".input.spin", state 680, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 686, ".input.spin", state 681, "(1)" - line 406, ".input.spin", state 688, "cache_dirty_urcu_gp_ctr = 0" - line 415, ".input.spin", state 720, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 734, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 753, "(1)" - line 433, ".input.spin", state 783, "(1)" - line 437, ".input.spin", state 796, "(1)" - line 406, ".input.spin", state 824, "cache_dirty_urcu_gp_ctr = 0" - line 415, ".input.spin", state 856, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 870, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 889, "(1)" - line 433, ".input.spin", state 919, "(1)" - line 437, ".input.spin", state 932, "(1)" - line 406, ".input.spin", state 953, "cache_dirty_urcu_gp_ctr = 0" - line 406, ".input.spin", state 955, "(1)" - line 406, ".input.spin", state 956, "(cache_dirty_urcu_gp_ctr)" - line 406, ".input.spin", state 956, "else" - line 406, ".input.spin", state 959, "(1)" - line 410, ".input.spin", state 967, "cache_dirty_urcu_active_readers = 0" - line 410, ".input.spin", state 969, "(1)" - line 410, ".input.spin", state 970, "(cache_dirty_urcu_active_readers)" - line 410, ".input.spin", state 970, "else" - line 410, ".input.spin", state 973, "(1)" - line 410, ".input.spin", state 974, "(1)" - line 410, ".input.spin", state 974, "(1)" - line 408, ".input.spin", state 979, "((i<1))" - line 408, ".input.spin", state 979, "((i>=1))" - line 415, ".input.spin", state 985, "cache_dirty_rcu_ptr = 0" - line 415, ".input.spin", state 987, "(1)" - line 415, ".input.spin", state 988, "(cache_dirty_rcu_ptr)" - line 415, ".input.spin", state 988, "else" - line 415, ".input.spin", state 991, "(1)" - line 415, ".input.spin", state 992, "(1)" - line 415, ".input.spin", state 992, "(1)" - line 419, ".input.spin", state 999, "cache_dirty_rcu_data[i] = 0" - line 419, ".input.spin", state 1001, "(1)" - line 419, ".input.spin", state 1002, "(cache_dirty_rcu_data[i])" - line 419, ".input.spin", state 1002, "else" - line 419, ".input.spin", state 1005, "(1)" - line 419, ".input.spin", state 1006, "(1)" - line 419, ".input.spin", state 1006, "(1)" - line 417, ".input.spin", state 1011, "((i<2))" - line 417, ".input.spin", state 1011, "((i>=2))" - line 424, ".input.spin", state 1018, "(1)" - line 424, ".input.spin", state 1019, "(!(cache_dirty_urcu_gp_ctr))" - line 424, ".input.spin", state 1019, "else" - line 424, ".input.spin", state 1022, "(1)" - line 424, ".input.spin", state 1023, "(1)" - line 424, ".input.spin", state 1023, "(1)" - line 428, ".input.spin", state 1031, "(1)" - line 428, ".input.spin", state 1032, "(!(cache_dirty_urcu_active_readers))" - line 428, ".input.spin", state 1032, "else" - line 428, ".input.spin", state 1035, "(1)" - line 428, ".input.spin", state 1036, "(1)" - line 428, ".input.spin", state 1036, "(1)" - line 426, ".input.spin", state 1041, "((i<1))" - line 426, ".input.spin", state 1041, "((i>=1))" - line 433, ".input.spin", state 1048, "(1)" - line 433, ".input.spin", state 1049, "(!(cache_dirty_rcu_ptr))" - line 433, ".input.spin", state 1049, "else" - line 433, ".input.spin", state 1052, "(1)" - line 433, ".input.spin", state 1053, "(1)" - line 433, ".input.spin", state 1053, "(1)" - line 437, ".input.spin", state 1061, "(1)" - line 437, ".input.spin", state 1062, "(!(cache_dirty_rcu_data[i]))" - line 437, ".input.spin", state 1062, "else" - line 437, ".input.spin", state 1065, "(1)" - line 437, ".input.spin", state 1066, "(1)" - line 437, ".input.spin", state 1066, "(1)" - line 435, ".input.spin", state 1071, "((i<2))" - line 435, ".input.spin", state 1071, "((i>=2))" - line 445, ".input.spin", state 1075, "(1)" - line 445, ".input.spin", state 1075, "(1)" - line 694, ".input.spin", state 1079, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 406, ".input.spin", state 1084, "cache_dirty_urcu_gp_ctr = 0" - line 415, ".input.spin", state 1116, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 1130, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 1149, "(1)" - line 433, ".input.spin", state 1179, "(1)" - line 437, ".input.spin", state 1192, "(1)" - line 406, ".input.spin", state 1216, "cache_dirty_urcu_gp_ctr = 0" - line 415, ".input.spin", state 1248, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 1262, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 1281, "(1)" - line 433, ".input.spin", state 1311, "(1)" - line 437, ".input.spin", state 1324, "(1)" - line 406, ".input.spin", state 1349, "cache_dirty_urcu_gp_ctr = 0" - line 415, ".input.spin", state 1381, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 1395, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 1414, "(1)" - line 433, ".input.spin", state 1444, "(1)" - line 437, ".input.spin", state 1457, "(1)" - line 406, ".input.spin", state 1478, "cache_dirty_urcu_gp_ctr = 0" - line 415, ".input.spin", state 1510, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 1524, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 1543, "(1)" - line 433, ".input.spin", state 1573, "(1)" - line 437, ".input.spin", state 1586, "(1)" - line 406, ".input.spin", state 1612, "cache_dirty_urcu_gp_ctr = 0" - line 415, ".input.spin", state 1644, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 1658, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 1677, "(1)" - line 433, ".input.spin", state 1707, "(1)" - line 437, ".input.spin", state 1720, "(1)" - line 406, ".input.spin", state 1741, "cache_dirty_urcu_gp_ctr = 0" - line 415, ".input.spin", state 1773, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 1787, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 1806, "(1)" - line 433, ".input.spin", state 1836, "(1)" - line 437, ".input.spin", state 1849, "(1)" - line 406, ".input.spin", state 1873, "cache_dirty_urcu_gp_ctr = 0" - line 415, ".input.spin", state 1905, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 1919, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 1938, "(1)" - line 433, ".input.spin", state 1968, "(1)" - line 437, ".input.spin", state 1981, "(1)" - line 733, ".input.spin", state 2002, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 406, ".input.spin", state 2009, "cache_dirty_urcu_gp_ctr = 0" - line 415, ".input.spin", state 2041, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 2055, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 2074, "(1)" - line 433, ".input.spin", state 2104, "(1)" - line 437, ".input.spin", state 2117, "(1)" - line 406, ".input.spin", state 2138, "cache_dirty_urcu_gp_ctr = 0" - line 415, ".input.spin", state 2170, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 2184, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 2203, "(1)" - line 433, ".input.spin", state 2233, "(1)" - line 437, ".input.spin", state 2246, "(1)" - line 406, ".input.spin", state 2269, "cache_dirty_urcu_gp_ctr = 0" - line 406, ".input.spin", state 2271, "(1)" - line 406, ".input.spin", state 2272, "(cache_dirty_urcu_gp_ctr)" - line 406, ".input.spin", state 2272, "else" - line 406, ".input.spin", state 2275, "(1)" - line 410, ".input.spin", state 2283, "cache_dirty_urcu_active_readers = 0" - line 410, ".input.spin", state 2285, "(1)" - line 410, ".input.spin", state 2286, "(cache_dirty_urcu_active_readers)" - line 410, ".input.spin", state 2286, "else" - line 410, ".input.spin", state 2289, "(1)" - line 410, ".input.spin", state 2290, "(1)" - line 410, ".input.spin", state 2290, "(1)" - line 408, ".input.spin", state 2295, "((i<1))" - line 408, ".input.spin", state 2295, "((i>=1))" - line 415, ".input.spin", state 2301, "cache_dirty_rcu_ptr = 0" - line 415, ".input.spin", state 2303, "(1)" - line 415, ".input.spin", state 2304, "(cache_dirty_rcu_ptr)" - line 415, ".input.spin", state 2304, "else" - line 415, ".input.spin", state 2307, "(1)" - line 415, ".input.spin", state 2308, "(1)" - line 415, ".input.spin", state 2308, "(1)" - line 419, ".input.spin", state 2315, "cache_dirty_rcu_data[i] = 0" - line 419, ".input.spin", state 2317, "(1)" - line 419, ".input.spin", state 2318, "(cache_dirty_rcu_data[i])" - line 419, ".input.spin", state 2318, "else" - line 419, ".input.spin", state 2321, "(1)" - line 419, ".input.spin", state 2322, "(1)" - line 419, ".input.spin", state 2322, "(1)" - line 417, ".input.spin", state 2327, "((i<2))" - line 417, ".input.spin", state 2327, "((i>=2))" - line 424, ".input.spin", state 2334, "(1)" - line 424, ".input.spin", state 2335, "(!(cache_dirty_urcu_gp_ctr))" - line 424, ".input.spin", state 2335, "else" - line 424, ".input.spin", state 2338, "(1)" - line 424, ".input.spin", state 2339, "(1)" - line 424, ".input.spin", state 2339, "(1)" - line 428, ".input.spin", state 2347, "(1)" - line 428, ".input.spin", state 2348, "(!(cache_dirty_urcu_active_readers))" - line 428, ".input.spin", state 2348, "else" - line 428, ".input.spin", state 2351, "(1)" - line 428, ".input.spin", state 2352, "(1)" - line 428, ".input.spin", state 2352, "(1)" - line 426, ".input.spin", state 2357, "((i<1))" - line 426, ".input.spin", state 2357, "((i>=1))" - line 433, ".input.spin", state 2364, "(1)" - line 433, ".input.spin", state 2365, "(!(cache_dirty_rcu_ptr))" - line 433, ".input.spin", state 2365, "else" - line 433, ".input.spin", state 2368, "(1)" - line 433, ".input.spin", state 2369, "(1)" - line 433, ".input.spin", state 2369, "(1)" - line 437, ".input.spin", state 2377, "(1)" - line 437, ".input.spin", state 2378, "(!(cache_dirty_rcu_data[i]))" - line 437, ".input.spin", state 2378, "else" - line 437, ".input.spin", state 2381, "(1)" - line 437, ".input.spin", state 2382, "(1)" - line 437, ".input.spin", state 2382, "(1)" - line 435, ".input.spin", state 2387, "((i<2))" - line 435, ".input.spin", state 2387, "((i>=2))" - line 445, ".input.spin", state 2391, "(1)" - line 445, ".input.spin", state 2391, "(1)" - line 733, ".input.spin", state 2394, "cached_urcu_active_readers = (tmp+1)" - line 733, ".input.spin", state 2395, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 733, ".input.spin", state 2396, "(1)" - line 406, ".input.spin", state 2403, "cache_dirty_urcu_gp_ctr = 0" - line 415, ".input.spin", state 2435, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 2449, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 2468, "(1)" - line 433, ".input.spin", state 2498, "(1)" - line 437, ".input.spin", state 2511, "(1)" - line 406, ".input.spin", state 2538, "cache_dirty_urcu_gp_ctr = 0" - line 415, ".input.spin", state 2570, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 2584, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 2603, "(1)" - line 433, ".input.spin", state 2633, "(1)" - line 437, ".input.spin", state 2646, "(1)" - line 406, ".input.spin", state 2667, "cache_dirty_urcu_gp_ctr = 0" - line 415, ".input.spin", state 2699, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 2713, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 2732, "(1)" - line 433, ".input.spin", state 2762, "(1)" - line 437, ".input.spin", state 2775, "(1)" - line 244, ".input.spin", state 2808, "(1)" - line 252, ".input.spin", state 2828, "(1)" - line 256, ".input.spin", state 2836, "(1)" - line 244, ".input.spin", state 2851, "(1)" - line 252, ".input.spin", state 2871, "(1)" - line 256, ".input.spin", state 2879, "(1)" - line 928, ".input.spin", state 2896, "-end-" - (245 of 2896 states) -unreached in proctype urcu_writer - line 406, ".input.spin", state 45, "cache_dirty_urcu_gp_ctr = 0" - line 410, ".input.spin", state 59, "cache_dirty_urcu_active_readers = 0" - line 415, ".input.spin", state 77, "cache_dirty_rcu_ptr = 0" - line 424, ".input.spin", state 110, "(1)" - line 428, ".input.spin", state 123, "(1)" - line 433, ".input.spin", state 140, "(1)" - line 267, ".input.spin", state 176, "cache_dirty_urcu_gp_ctr = 0" - line 271, ".input.spin", state 185, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 198, "cache_dirty_rcu_ptr = 0" - line 406, ".input.spin", state 238, "cache_dirty_urcu_gp_ctr = 0" - line 410, ".input.spin", state 252, "cache_dirty_urcu_active_readers = 0" - line 415, ".input.spin", state 270, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 284, "cache_dirty_rcu_data[i] = 0" - line 424, ".input.spin", state 303, "(1)" - line 428, ".input.spin", state 316, "(1)" - line 433, ".input.spin", state 333, "(1)" - line 437, ".input.spin", state 346, "(1)" - line 410, ".input.spin", state 383, "cache_dirty_urcu_active_readers = 0" - line 415, ".input.spin", state 401, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 415, "cache_dirty_rcu_data[i] = 0" - line 428, ".input.spin", state 447, "(1)" - line 433, ".input.spin", state 464, "(1)" - line 437, ".input.spin", state 477, "(1)" - line 410, ".input.spin", state 522, "cache_dirty_urcu_active_readers = 0" - line 415, ".input.spin", state 540, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 554, "cache_dirty_rcu_data[i] = 0" - line 428, ".input.spin", state 586, "(1)" - line 433, ".input.spin", state 603, "(1)" - line 437, ".input.spin", state 616, "(1)" - line 410, ".input.spin", state 651, "cache_dirty_urcu_active_readers = 0" - line 415, ".input.spin", state 669, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 683, "cache_dirty_rcu_data[i] = 0" - line 428, ".input.spin", state 715, "(1)" - line 433, ".input.spin", state 732, "(1)" - line 437, ".input.spin", state 745, "(1)" - line 410, ".input.spin", state 782, "cache_dirty_urcu_active_readers = 0" - line 415, ".input.spin", state 800, "cache_dirty_rcu_ptr = 0" - line 419, ".input.spin", state 814, "cache_dirty_rcu_data[i] = 0" - line 428, ".input.spin", state 846, "(1)" - line 433, ".input.spin", state 863, "(1)" - line 437, ".input.spin", state 876, "(1)" - line 267, ".input.spin", state 931, "cache_dirty_urcu_gp_ctr = 0" - line 271, ".input.spin", state 940, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 955, "(1)" - line 279, ".input.spin", state 962, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 978, "(1)" - line 248, ".input.spin", state 986, "(1)" - line 252, ".input.spin", state 998, "(1)" - line 256, ".input.spin", state 1006, "(1)" - line 267, ".input.spin", state 1037, "cache_dirty_urcu_gp_ctr = 0" - line 271, ".input.spin", state 1046, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 1059, "cache_dirty_rcu_ptr = 0" - line 279, ".input.spin", state 1068, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 1084, "(1)" - line 248, ".input.spin", state 1092, "(1)" - line 252, ".input.spin", state 1104, "(1)" - line 256, ".input.spin", state 1112, "(1)" - line 271, ".input.spin", state 1138, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 1151, "cache_dirty_rcu_ptr = 0" - line 279, ".input.spin", state 1160, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 1176, "(1)" - line 248, ".input.spin", state 1184, "(1)" - line 252, ".input.spin", state 1196, "(1)" - line 256, ".input.spin", state 1204, "(1)" - line 267, ".input.spin", state 1235, "cache_dirty_urcu_gp_ctr = 0" - line 271, ".input.spin", state 1244, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 1257, "cache_dirty_rcu_ptr = 0" - line 279, ".input.spin", state 1266, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 1282, "(1)" - line 248, ".input.spin", state 1290, "(1)" - line 252, ".input.spin", state 1302, "(1)" - line 256, ".input.spin", state 1310, "(1)" - line 271, ".input.spin", state 1336, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 1349, "cache_dirty_rcu_ptr = 0" - line 279, ".input.spin", state 1358, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 1374, "(1)" - line 248, ".input.spin", state 1382, "(1)" - line 252, ".input.spin", state 1394, "(1)" - line 256, ".input.spin", state 1402, "(1)" - line 267, ".input.spin", state 1433, "cache_dirty_urcu_gp_ctr = 0" - line 271, ".input.spin", state 1442, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 1455, "cache_dirty_rcu_ptr = 0" - line 279, ".input.spin", state 1464, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 1480, "(1)" - line 248, ".input.spin", state 1488, "(1)" - line 252, ".input.spin", state 1500, "(1)" - line 256, ".input.spin", state 1508, "(1)" - line 271, ".input.spin", state 1534, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 1547, "cache_dirty_rcu_ptr = 0" - line 279, ".input.spin", state 1556, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 1572, "(1)" - line 248, ".input.spin", state 1580, "(1)" - line 252, ".input.spin", state 1592, "(1)" - line 256, ".input.spin", state 1600, "(1)" - line 267, ".input.spin", state 1631, "cache_dirty_urcu_gp_ctr = 0" - line 271, ".input.spin", state 1640, "cache_dirty_urcu_active_readers = 0" - line 275, ".input.spin", state 1653, "cache_dirty_rcu_ptr = 0" - line 279, ".input.spin", state 1662, "cache_dirty_rcu_data[i] = 0" - line 244, ".input.spin", state 1678, "(1)" - line 248, ".input.spin", state 1686, "(1)" - line 252, ".input.spin", state 1698, "(1)" - line 256, ".input.spin", state 1706, "(1)" - line 1303, ".input.spin", state 1722, "-end-" - (103 of 1722 states) -unreached in proctype :init: - (0 of 28 states) - -pan: elapsed time 4.35e+04 seconds -pan: rate 2039.1355 states/second -pan: avg transition delay 1.3378e-06 usec -cp .input.spin asserts.spin.input -cp .input.spin.trail asserts.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-ipi' diff --git a/formal-model/urcu-controldataflow-alpha-ipi/asserts.spin.input b/formal-model/urcu-controldataflow-alpha-ipi/asserts.spin.input deleted file mode 100644 index ca70e6c..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/asserts.spin.input +++ /dev/null @@ -1,1339 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi/references.txt b/formal-model/urcu-controldataflow-alpha-ipi/references.txt deleted file mode 100644 index 72c67a2..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/references.txt +++ /dev/null @@ -1,13 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html - -LTL vs CTL : - -http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 -http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf - (downloaded) diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu.sh b/formal-model/urcu-controldataflow-alpha-ipi/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu.spin b/formal-model/urcu-controldataflow-alpha-ipi/urcu.spin deleted file mode 100644 index 8075506..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu.spin +++ /dev/null @@ -1,1321 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free.log b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free.log deleted file mode 100644 index 6b6e98b..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free.log +++ /dev/null @@ -1,560 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1361) -Depth= 8053 States= 1e+06 Transitions= 1.77e+08 Memory= 513.029 t= 265 R= 4e+03 -Depth= 9797 States= 2e+06 Transitions= 3.71e+08 Memory= 559.416 t= 575 R= 3e+03 -Depth= 9797 States= 3e+06 Transitions= 5.8e+08 Memory= 605.901 t= 922 R= 3e+03 -pan: resizing hashtable to -w22.. done -Depth= 9797 States= 4e+06 Transitions= 7.6e+08 Memory= 682.920 t= 1.2e+03 R= 3e+03 -Depth= 9797 States= 5e+06 Transitions= 9.44e+08 Memory= 728.721 t= 1.48e+03 R= 3e+03 -Depth= 9797 States= 6e+06 Transitions= 1.35e+09 Memory= 775.303 t= 2.13e+03 R= 3e+03 -Depth= 9797 States= 7e+06 Transitions= 1.79e+09 Memory= 821.885 t= 2.85e+03 R= 2e+03 -Depth= 9797 States= 8e+06 Transitions= 2.11e+09 Memory= 868.076 t= 3.36e+03 R= 2e+03 -Depth= 9797 States= 9e+06 Transitions= 2.49e+09 Memory= 914.658 t= 4.01e+03 R= 2e+03 -pan: resizing hashtable to -w24.. done -Depth= 9797 States= 1e+07 Transitions= 2.83e+09 Memory= 1085.529 t= 4.52e+03 R= 2e+03 -Depth= 9797 States= 1.1e+07 Transitions= 3.2e+09 Memory= 1132.697 t= 5.08e+03 R= 2e+03 -Depth= 9797 States= 1.2e+07 Transitions= 3.59e+09 Memory= 1179.670 t= 5.69e+03 R= 2e+03 -Depth= 9797 States= 1.3e+07 Transitions= 3.81e+09 Memory= 1226.838 t= 6.03e+03 R= 2e+03 -Depth= 9797 States= 1.4e+07 Transitions= 4.12e+09 Memory= 1273.029 t= 6.5e+03 R= 2e+03 -Depth= 9797 States= 1.5e+07 Transitions= 4.35e+09 Memory= 1319.123 t= 6.85e+03 R= 2e+03 -Depth= 9797 States= 1.6e+07 Transitions= 4.88e+09 Memory= 1365.608 t= 7.7e+03 R= 2e+03 -Depth= 9797 States= 1.7e+07 Transitions= 5.67e+09 Memory= 1411.506 t= 8.95e+03 R= 2e+03 -Depth= 9797 States= 1.8e+07 Transitions= 6.31e+09 Memory= 1458.479 t= 9.98e+03 R= 2e+03 -Depth= 9797 States= 1.9e+07 Transitions= 6.77e+09 Memory= 1504.963 t= 1.07e+04 R= 2e+03 -Depth= 9797 States= 2e+07 Transitions= 7.09e+09 Memory= 1552.131 t= 1.12e+04 R= 2e+03 -Depth= 9797 States= 2.1e+07 Transitions= 7.48e+09 Memory= 1598.615 t= 1.18e+04 R= 2e+03 -Depth= 9797 States= 2.2e+07 Transitions= 7.94e+09 Memory= 1645.295 t= 1.26e+04 R= 2e+03 -Depth= 9797 States= 2.3e+07 Transitions= 8.37e+09 Memory= 1691.486 t= 1.33e+04 R= 2e+03 -Depth= 9797 States= 2.4e+07 Transitions= 8.77e+09 Memory= 1737.678 t= 1.39e+04 R= 2e+03 -Depth= 9797 States= 2.5e+07 Transitions= 9.22e+09 Memory= 1783.967 t= 1.46e+04 R= 2e+03 -Depth= 9797 States= 2.6e+07 Transitions= 9.48e+09 Memory= 1830.061 t= 1.5e+04 R= 2e+03 -Depth= 9797 States= 2.7e+07 Transitions= 9.85e+09 Memory= 1876.350 t= 1.56e+04 R= 2e+03 -Depth= 9797 States= 2.8e+07 Transitions= 1.02e+10 Memory= 1922.639 t= 1.62e+04 R= 2e+03 -Depth= 9919 States= 2.9e+07 Transitions= 1.06e+10 Memory= 1968.537 t= 1.68e+04 R= 2e+03 -Depth= 9963 States= 3e+07 Transitions= 1.09e+10 Memory= 2014.338 t= 1.74e+04 R= 2e+03 -Depth= 9963 States= 3.1e+07 Transitions= 1.13e+10 Memory= 2060.334 t= 1.79e+04 R= 2e+03 -Depth= 9963 States= 3.2e+07 Transitions= 1.16e+10 Memory= 2106.233 t= 1.85e+04 R= 2e+03 -Depth= 9963 States= 3.3e+07 Transitions= 1.19e+10 Memory= 2152.033 t= 1.9e+04 R= 2e+03 -Depth= 9963 States= 3.4e+07 Transitions= 1.23e+10 Memory= 2198.029 t= 1.96e+04 R= 2e+03 -pan: resizing hashtable to -w26.. done -Depth= 9963 States= 3.5e+07 Transitions= 1.26e+10 Memory= 2739.912 t= 2e+04 R= 2e+03 -Depth= 9963 States= 3.6e+07 Transitions= 1.29e+10 Memory= 2785.713 t= 2.06e+04 R= 2e+03 -Depth= 9963 States= 3.7e+07 Transitions= 1.32e+10 Memory= 2831.416 t= 2.1e+04 R= 2e+03 -Depth= 9963 States= 3.8e+07 Transitions= 1.35e+10 Memory= 2877.217 t= 2.15e+04 R= 2e+03 -Depth= 9963 States= 3.9e+07 Transitions= 1.39e+10 Memory= 2923.018 t= 2.2e+04 R= 2e+03 -Depth= 9963 States= 4e+07 Transitions= 1.41e+10 Memory= 2968.818 t= 2.24e+04 R= 2e+03 -Depth= 9963 States= 4.1e+07 Transitions= 1.44e+10 Memory= 3014.717 t= 2.29e+04 R= 2e+03 -Depth= 9963 States= 4.2e+07 Transitions= 1.48e+10 Memory= 3061.299 t= 2.35e+04 R= 2e+03 -Depth= 9963 States= 4.3e+07 Transitions= 1.51e+10 Memory= 3107.295 t= 2.4e+04 R= 2e+03 -Depth= 9963 States= 4.4e+07 Transitions= 1.56e+10 Memory= 3153.779 t= 2.48e+04 R= 2e+03 -Depth= 9963 States= 4.5e+07 Transitions= 1.59e+10 Memory= 3199.873 t= 2.53e+04 R= 2e+03 -Depth= 9963 States= 4.6e+07 Transitions= 1.64e+10 Memory= 3246.553 t= 2.59e+04 R= 2e+03 -Depth= 9963 States= 4.7e+07 Transitions= 1.68e+10 Memory= 3293.623 t= 2.66e+04 R= 2e+03 -Depth= 9963 States= 4.8e+07 Transitions= 1.72e+10 Memory= 3339.912 t= 2.72e+04 R= 2e+03 -Depth= 9963 States= 4.9e+07 Transitions= 1.76e+10 Memory= 3386.494 t= 2.78e+04 R= 2e+03 -Depth= 9963 States= 5e+07 Transitions= 1.78e+10 Memory= 3433.076 t= 2.82e+04 R= 2e+03 -Depth= 9963 States= 5.1e+07 Transitions= 1.81e+10 Memory= 3479.072 t= 2.87e+04 R= 2e+03 -Depth= 9963 States= 5.2e+07 Transitions= 1.84e+10 Memory= 3525.068 t= 2.91e+04 R= 2e+03 -Depth= 9963 States= 5.3e+07 Transitions= 1.87e+10 Memory= 3570.869 t= 2.95e+04 R= 2e+03 -Depth= 9963 States= 5.4e+07 Transitions= 1.93e+10 Memory= 3616.865 t= 3.05e+04 R= 2e+03 -Depth= 9963 States= 5.5e+07 Transitions= 2.01e+10 Memory= 3662.764 t= 3.17e+04 R= 2e+03 -Depth= 9963 States= 5.6e+07 Transitions= 2.07e+10 Memory= 3709.541 t= 3.27e+04 R= 2e+03 -Depth= 9963 States= 5.7e+07 Transitions= 2.11e+10 Memory= 3755.635 t= 3.34e+04 R= 2e+03 -Depth= 9963 States= 5.8e+07 Transitions= 2.15e+10 Memory= 3802.315 t= 3.4e+04 R= 2e+03 -Depth= 9963 States= 5.9e+07 Transitions= 2.18e+10 Memory= 3848.408 t= 3.45e+04 R= 2e+03 -Depth= 9963 States= 6e+07 Transitions= 2.22e+10 Memory= 3894.404 t= 3.52e+04 R= 2e+03 -Depth= 9963 States= 6.1e+07 Transitions= 2.27e+10 Memory= 3940.596 t= 3.59e+04 R= 2e+03 -Depth= 9963 States= 6.2e+07 Transitions= 2.32e+10 Memory= 3986.494 t= 3.66e+04 R= 2e+03 -Depth= 9963 States= 6.3e+07 Transitions= 2.35e+10 Memory= 4032.295 t= 3.73e+04 R= 2e+03 -Depth= 9963 States= 6.4e+07 Transitions= 2.38e+10 Memory= 4078.193 t= 3.77e+04 R= 2e+03 -Depth= 9963 States= 6.5e+07 Transitions= 2.42e+10 Memory= 4124.092 t= 3.83e+04 R= 2e+03 -Depth= 9963 States= 6.6e+07 Transitions= 2.46e+10 Memory= 4169.990 t= 3.89e+04 R= 2e+03 -Depth= 9963 States= 6.7e+07 Transitions= 2.49e+10 Memory= 4215.791 t= 3.94e+04 R= 2e+03 -Depth= 9963 States= 6.8e+07 Transitions= 2.53e+10 Memory= 4261.494 t= 4e+04 R= 2e+03 -Depth= 9963 States= 6.9e+07 Transitions= 2.56e+10 Memory= 4307.295 t= 4.04e+04 R= 2e+03 -Depth= 9963 States= 7e+07 Transitions= 2.59e+10 Memory= 4353.096 t= 4.11e+04 R= 2e+03 -Depth= 9963 States= 7.1e+07 Transitions= 2.62e+10 Memory= 4398.897 t= 4.15e+04 R= 2e+03 -Depth= 9963 States= 7.2e+07 Transitions= 2.66e+10 Memory= 4444.697 t= 4.21e+04 R= 2e+03 -Depth= 9963 States= 7.3e+07 Transitions= 2.68e+10 Memory= 4490.498 t= 4.25e+04 R= 2e+03 -Depth= 9963 States= 7.4e+07 Transitions= 2.72e+10 Memory= 4536.299 t= 4.31e+04 R= 2e+03 -Depth= 9963 States= 7.5e+07 Transitions= 2.76e+10 Memory= 4582.002 t= 4.37e+04 R= 2e+03 -Depth= 9963 States= 7.6e+07 Transitions= 2.78e+10 Memory= 4627.803 t= 4.41e+04 R= 2e+03 -Depth= 9963 States= 7.7e+07 Transitions= 2.81e+10 Memory= 4673.604 t= 4.46e+04 R= 2e+03 -Depth= 9963 States= 7.8e+07 Transitions= 2.84e+10 Memory= 4719.404 t= 4.5e+04 R= 2e+03 -Depth= 9963 States= 7.9e+07 Transitions= 2.87e+10 Memory= 4765.205 t= 4.55e+04 R= 2e+03 -Depth= 9963 States= 8e+07 Transitions= 2.91e+10 Memory= 4811.006 t= 4.61e+04 R= 2e+03 -Depth= 9963 States= 8.1e+07 Transitions= 2.95e+10 Memory= 4856.807 t= 4.68e+04 R= 2e+03 -Depth= 9963 States= 8.2e+07 Transitions= 2.99e+10 Memory= 4902.608 t= 4.74e+04 R= 2e+03 -Depth= 9963 States= 8.3e+07 Transitions= 3.03e+10 Memory= 4948.701 t= 4.8e+04 R= 2e+03 -Depth= 9963 States= 8.4e+07 Transitions= 3.07e+10 Memory= 4995.283 t= 4.87e+04 R= 2e+03 -Depth= 9963 States= 8.5e+07 Transitions= 3.11e+10 Memory= 5041.084 t= 4.93e+04 R= 2e+03 -Depth= 9963 States= 8.6e+07 Transitions= 3.15e+10 Memory= 5087.276 t= 4.98e+04 R= 2e+03 -Depth= 9963 States= 8.7e+07 Transitions= 3.19e+10 Memory= 5133.369 t= 5.06e+04 R= 2e+03 -Depth= 9963 States= 8.8e+07 Transitions= 3.23e+10 Memory= 5179.170 t= 5.11e+04 R= 2e+03 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 80 byte, depth reached 9963, errors: 0 - 88716525 states, stored -3.243293e+10 states, matched -3.2521646e+10 transitions (= stored+matched) -1.8325967e+11 atomic steps -hash conflicts: 1.7134961e+10 (resolved) - -Stats on memory usage (in Megabytes): - 9814.374 equivalent memory usage for states (stored*(State-vector + overhead)) - 4243.430 actual memory usage for states (compression: 43.24%) - state-vector as stored = 14 byte + 36 byte overhead - 512.000 memory used for hash table (-w26) - 457.764 memory used for DFS stack (-m10000000) - 5212.276 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 606546 5194 3779 2 1 ] -unreached in proctype urcu_reader - line 267, "pan.___", state 57, "cache_dirty_urcu_gp_ctr = 0" - line 275, "pan.___", state 79, "cache_dirty_rcu_ptr = 0" - line 279, "pan.___", state 88, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 104, "(1)" - line 248, "pan.___", state 112, "(1)" - line 252, "pan.___", state 124, "(1)" - line 256, "pan.___", state 132, "(1)" - line 406, "pan.___", state 158, "cache_dirty_urcu_gp_ctr = 0" - line 415, "pan.___", state 190, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 204, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 223, "(1)" - line 433, "pan.___", state 253, "(1)" - line 437, "pan.___", state 266, "(1)" - line 686, "pan.___", state 287, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 406, "pan.___", state 294, "cache_dirty_urcu_gp_ctr = 0" - line 415, "pan.___", state 326, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 340, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 359, "(1)" - line 433, "pan.___", state 389, "(1)" - line 437, "pan.___", state 402, "(1)" - line 406, "pan.___", state 423, "cache_dirty_urcu_gp_ctr = 0" - line 415, "pan.___", state 455, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 469, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 488, "(1)" - line 433, "pan.___", state 518, "(1)" - line 437, "pan.___", state 531, "(1)" - line 406, "pan.___", state 554, "cache_dirty_urcu_gp_ctr = 0" - line 406, "pan.___", state 556, "(1)" - line 406, "pan.___", state 557, "(cache_dirty_urcu_gp_ctr)" - line 406, "pan.___", state 557, "else" - line 406, "pan.___", state 560, "(1)" - line 410, "pan.___", state 568, "cache_dirty_urcu_active_readers = 0" - line 410, "pan.___", state 570, "(1)" - line 410, "pan.___", state 571, "(cache_dirty_urcu_active_readers)" - line 410, "pan.___", state 571, "else" - line 410, "pan.___", state 574, "(1)" - line 410, "pan.___", state 575, "(1)" - line 410, "pan.___", state 575, "(1)" - line 408, "pan.___", state 580, "((i<1))" - line 408, "pan.___", state 580, "((i>=1))" - line 415, "pan.___", state 586, "cache_dirty_rcu_ptr = 0" - line 415, "pan.___", state 588, "(1)" - line 415, "pan.___", state 589, "(cache_dirty_rcu_ptr)" - line 415, "pan.___", state 589, "else" - line 415, "pan.___", state 592, "(1)" - line 415, "pan.___", state 593, "(1)" - line 415, "pan.___", state 593, "(1)" - line 419, "pan.___", state 600, "cache_dirty_rcu_data[i] = 0" - line 419, "pan.___", state 602, "(1)" - line 419, "pan.___", state 603, "(cache_dirty_rcu_data[i])" - line 419, "pan.___", state 603, "else" - line 419, "pan.___", state 606, "(1)" - line 419, "pan.___", state 607, "(1)" - line 419, "pan.___", state 607, "(1)" - line 417, "pan.___", state 612, "((i<2))" - line 417, "pan.___", state 612, "((i>=2))" - line 424, "pan.___", state 619, "(1)" - line 424, "pan.___", state 620, "(!(cache_dirty_urcu_gp_ctr))" - line 424, "pan.___", state 620, "else" - line 424, "pan.___", state 623, "(1)" - line 424, "pan.___", state 624, "(1)" - line 424, "pan.___", state 624, "(1)" - line 428, "pan.___", state 632, "(1)" - line 428, "pan.___", state 633, "(!(cache_dirty_urcu_active_readers))" - line 428, "pan.___", state 633, "else" - line 428, "pan.___", state 636, "(1)" - line 428, "pan.___", state 637, "(1)" - line 428, "pan.___", state 637, "(1)" - line 426, "pan.___", state 642, "((i<1))" - line 426, "pan.___", state 642, "((i>=1))" - line 433, "pan.___", state 649, "(1)" - line 433, "pan.___", state 650, "(!(cache_dirty_rcu_ptr))" - line 433, "pan.___", state 650, "else" - line 433, "pan.___", state 653, "(1)" - line 433, "pan.___", state 654, "(1)" - line 433, "pan.___", state 654, "(1)" - line 437, "pan.___", state 662, "(1)" - line 437, "pan.___", state 663, "(!(cache_dirty_rcu_data[i]))" - line 437, "pan.___", state 663, "else" - line 437, "pan.___", state 666, "(1)" - line 437, "pan.___", state 667, "(1)" - line 437, "pan.___", state 667, "(1)" - line 435, "pan.___", state 672, "((i<2))" - line 435, "pan.___", state 672, "((i>=2))" - line 445, "pan.___", state 676, "(1)" - line 445, "pan.___", state 676, "(1)" - line 686, "pan.___", state 679, "cached_urcu_active_readers = (tmp+1)" - line 686, "pan.___", state 680, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 686, "pan.___", state 681, "(1)" - line 406, "pan.___", state 688, "cache_dirty_urcu_gp_ctr = 0" - line 415, "pan.___", state 720, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 734, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 753, "(1)" - line 433, "pan.___", state 783, "(1)" - line 437, "pan.___", state 796, "(1)" - line 406, "pan.___", state 824, "cache_dirty_urcu_gp_ctr = 0" - line 415, "pan.___", state 856, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 870, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 889, "(1)" - line 433, "pan.___", state 919, "(1)" - line 437, "pan.___", state 932, "(1)" - line 406, "pan.___", state 953, "cache_dirty_urcu_gp_ctr = 0" - line 406, "pan.___", state 955, "(1)" - line 406, "pan.___", state 956, "(cache_dirty_urcu_gp_ctr)" - line 406, "pan.___", state 956, "else" - line 406, "pan.___", state 959, "(1)" - line 410, "pan.___", state 967, "cache_dirty_urcu_active_readers = 0" - line 410, "pan.___", state 969, "(1)" - line 410, "pan.___", state 970, "(cache_dirty_urcu_active_readers)" - line 410, "pan.___", state 970, "else" - line 410, "pan.___", state 973, "(1)" - line 410, "pan.___", state 974, "(1)" - line 410, "pan.___", state 974, "(1)" - line 408, "pan.___", state 979, "((i<1))" - line 408, "pan.___", state 979, "((i>=1))" - line 415, "pan.___", state 985, "cache_dirty_rcu_ptr = 0" - line 415, "pan.___", state 987, "(1)" - line 415, "pan.___", state 988, "(cache_dirty_rcu_ptr)" - line 415, "pan.___", state 988, "else" - line 415, "pan.___", state 991, "(1)" - line 415, "pan.___", state 992, "(1)" - line 415, "pan.___", state 992, "(1)" - line 419, "pan.___", state 999, "cache_dirty_rcu_data[i] = 0" - line 419, "pan.___", state 1001, "(1)" - line 419, "pan.___", state 1002, "(cache_dirty_rcu_data[i])" - line 419, "pan.___", state 1002, "else" - line 419, "pan.___", state 1005, "(1)" - line 419, "pan.___", state 1006, "(1)" - line 419, "pan.___", state 1006, "(1)" - line 417, "pan.___", state 1011, "((i<2))" - line 417, "pan.___", state 1011, "((i>=2))" - line 424, "pan.___", state 1018, "(1)" - line 424, "pan.___", state 1019, "(!(cache_dirty_urcu_gp_ctr))" - line 424, "pan.___", state 1019, "else" - line 424, "pan.___", state 1022, "(1)" - line 424, "pan.___", state 1023, "(1)" - line 424, "pan.___", state 1023, "(1)" - line 428, "pan.___", state 1031, "(1)" - line 428, "pan.___", state 1032, "(!(cache_dirty_urcu_active_readers))" - line 428, "pan.___", state 1032, "else" - line 428, "pan.___", state 1035, "(1)" - line 428, "pan.___", state 1036, "(1)" - line 428, "pan.___", state 1036, "(1)" - line 426, "pan.___", state 1041, "((i<1))" - line 426, "pan.___", state 1041, "((i>=1))" - line 433, "pan.___", state 1048, "(1)" - line 433, "pan.___", state 1049, "(!(cache_dirty_rcu_ptr))" - line 433, "pan.___", state 1049, "else" - line 433, "pan.___", state 1052, "(1)" - line 433, "pan.___", state 1053, "(1)" - line 433, "pan.___", state 1053, "(1)" - line 437, "pan.___", state 1061, "(1)" - line 437, "pan.___", state 1062, "(!(cache_dirty_rcu_data[i]))" - line 437, "pan.___", state 1062, "else" - line 437, "pan.___", state 1065, "(1)" - line 437, "pan.___", state 1066, "(1)" - line 437, "pan.___", state 1066, "(1)" - line 435, "pan.___", state 1071, "((i<2))" - line 435, "pan.___", state 1071, "((i>=2))" - line 445, "pan.___", state 1075, "(1)" - line 445, "pan.___", state 1075, "(1)" - line 694, "pan.___", state 1079, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 406, "pan.___", state 1084, "cache_dirty_urcu_gp_ctr = 0" - line 415, "pan.___", state 1116, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 1130, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 1149, "(1)" - line 433, "pan.___", state 1179, "(1)" - line 437, "pan.___", state 1192, "(1)" - line 406, "pan.___", state 1216, "cache_dirty_urcu_gp_ctr = 0" - line 415, "pan.___", state 1248, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 1262, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 1281, "(1)" - line 433, "pan.___", state 1311, "(1)" - line 437, "pan.___", state 1324, "(1)" - line 406, "pan.___", state 1349, "cache_dirty_urcu_gp_ctr = 0" - line 415, "pan.___", state 1381, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 1395, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 1414, "(1)" - line 433, "pan.___", state 1444, "(1)" - line 437, "pan.___", state 1457, "(1)" - line 406, "pan.___", state 1478, "cache_dirty_urcu_gp_ctr = 0" - line 415, "pan.___", state 1510, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 1524, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 1543, "(1)" - line 433, "pan.___", state 1573, "(1)" - line 437, "pan.___", state 1586, "(1)" - line 406, "pan.___", state 1612, "cache_dirty_urcu_gp_ctr = 0" - line 415, "pan.___", state 1644, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 1658, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 1677, "(1)" - line 433, "pan.___", state 1707, "(1)" - line 437, "pan.___", state 1720, "(1)" - line 406, "pan.___", state 1741, "cache_dirty_urcu_gp_ctr = 0" - line 415, "pan.___", state 1773, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 1787, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 1806, "(1)" - line 433, "pan.___", state 1836, "(1)" - line 437, "pan.___", state 1849, "(1)" - line 406, "pan.___", state 1873, "cache_dirty_urcu_gp_ctr = 0" - line 415, "pan.___", state 1905, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 1919, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 1938, "(1)" - line 433, "pan.___", state 1968, "(1)" - line 437, "pan.___", state 1981, "(1)" - line 733, "pan.___", state 2002, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 406, "pan.___", state 2009, "cache_dirty_urcu_gp_ctr = 0" - line 415, "pan.___", state 2041, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 2055, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 2074, "(1)" - line 433, "pan.___", state 2104, "(1)" - line 437, "pan.___", state 2117, "(1)" - line 406, "pan.___", state 2138, "cache_dirty_urcu_gp_ctr = 0" - line 415, "pan.___", state 2170, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 2184, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 2203, "(1)" - line 433, "pan.___", state 2233, "(1)" - line 437, "pan.___", state 2246, "(1)" - line 406, "pan.___", state 2269, "cache_dirty_urcu_gp_ctr = 0" - line 406, "pan.___", state 2271, "(1)" - line 406, "pan.___", state 2272, "(cache_dirty_urcu_gp_ctr)" - line 406, "pan.___", state 2272, "else" - line 406, "pan.___", state 2275, "(1)" - line 410, "pan.___", state 2283, "cache_dirty_urcu_active_readers = 0" - line 410, "pan.___", state 2285, "(1)" - line 410, "pan.___", state 2286, "(cache_dirty_urcu_active_readers)" - line 410, "pan.___", state 2286, "else" - line 410, "pan.___", state 2289, "(1)" - line 410, "pan.___", state 2290, "(1)" - line 410, "pan.___", state 2290, "(1)" - line 408, "pan.___", state 2295, "((i<1))" - line 408, "pan.___", state 2295, "((i>=1))" - line 415, "pan.___", state 2301, "cache_dirty_rcu_ptr = 0" - line 415, "pan.___", state 2303, "(1)" - line 415, "pan.___", state 2304, "(cache_dirty_rcu_ptr)" - line 415, "pan.___", state 2304, "else" - line 415, "pan.___", state 2307, "(1)" - line 415, "pan.___", state 2308, "(1)" - line 415, "pan.___", state 2308, "(1)" - line 419, "pan.___", state 2315, "cache_dirty_rcu_data[i] = 0" - line 419, "pan.___", state 2317, "(1)" - line 419, "pan.___", state 2318, "(cache_dirty_rcu_data[i])" - line 419, "pan.___", state 2318, "else" - line 419, "pan.___", state 2321, "(1)" - line 419, "pan.___", state 2322, "(1)" - line 419, "pan.___", state 2322, "(1)" - line 417, "pan.___", state 2327, "((i<2))" - line 417, "pan.___", state 2327, "((i>=2))" - line 424, "pan.___", state 2334, "(1)" - line 424, "pan.___", state 2335, "(!(cache_dirty_urcu_gp_ctr))" - line 424, "pan.___", state 2335, "else" - line 424, "pan.___", state 2338, "(1)" - line 424, "pan.___", state 2339, "(1)" - line 424, "pan.___", state 2339, "(1)" - line 428, "pan.___", state 2347, "(1)" - line 428, "pan.___", state 2348, "(!(cache_dirty_urcu_active_readers))" - line 428, "pan.___", state 2348, "else" - line 428, "pan.___", state 2351, "(1)" - line 428, "pan.___", state 2352, "(1)" - line 428, "pan.___", state 2352, "(1)" - line 426, "pan.___", state 2357, "((i<1))" - line 426, "pan.___", state 2357, "((i>=1))" - line 433, "pan.___", state 2364, "(1)" - line 433, "pan.___", state 2365, "(!(cache_dirty_rcu_ptr))" - line 433, "pan.___", state 2365, "else" - line 433, "pan.___", state 2368, "(1)" - line 433, "pan.___", state 2369, "(1)" - line 433, "pan.___", state 2369, "(1)" - line 437, "pan.___", state 2377, "(1)" - line 437, "pan.___", state 2378, "(!(cache_dirty_rcu_data[i]))" - line 437, "pan.___", state 2378, "else" - line 437, "pan.___", state 2381, "(1)" - line 437, "pan.___", state 2382, "(1)" - line 437, "pan.___", state 2382, "(1)" - line 435, "pan.___", state 2387, "((i<2))" - line 435, "pan.___", state 2387, "((i>=2))" - line 445, "pan.___", state 2391, "(1)" - line 445, "pan.___", state 2391, "(1)" - line 733, "pan.___", state 2394, "cached_urcu_active_readers = (tmp+1)" - line 733, "pan.___", state 2395, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 733, "pan.___", state 2396, "(1)" - line 406, "pan.___", state 2403, "cache_dirty_urcu_gp_ctr = 0" - line 415, "pan.___", state 2435, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 2449, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 2468, "(1)" - line 433, "pan.___", state 2498, "(1)" - line 437, "pan.___", state 2511, "(1)" - line 406, "pan.___", state 2538, "cache_dirty_urcu_gp_ctr = 0" - line 415, "pan.___", state 2570, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 2584, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 2603, "(1)" - line 433, "pan.___", state 2633, "(1)" - line 437, "pan.___", state 2646, "(1)" - line 406, "pan.___", state 2667, "cache_dirty_urcu_gp_ctr = 0" - line 415, "pan.___", state 2699, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 2713, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 2732, "(1)" - line 433, "pan.___", state 2762, "(1)" - line 437, "pan.___", state 2775, "(1)" - line 244, "pan.___", state 2808, "(1)" - line 252, "pan.___", state 2828, "(1)" - line 256, "pan.___", state 2836, "(1)" - line 244, "pan.___", state 2851, "(1)" - line 252, "pan.___", state 2871, "(1)" - line 256, "pan.___", state 2879, "(1)" - line 928, "pan.___", state 2896, "-end-" - (245 of 2896 states) -unreached in proctype urcu_writer - line 406, "pan.___", state 45, "cache_dirty_urcu_gp_ctr = 0" - line 410, "pan.___", state 59, "cache_dirty_urcu_active_readers = 0" - line 415, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 424, "pan.___", state 110, "(1)" - line 428, "pan.___", state 123, "(1)" - line 433, "pan.___", state 140, "(1)" - line 267, "pan.___", state 176, "cache_dirty_urcu_gp_ctr = 0" - line 271, "pan.___", state 185, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 198, "cache_dirty_rcu_ptr = 0" - line 406, "pan.___", state 238, "cache_dirty_urcu_gp_ctr = 0" - line 410, "pan.___", state 252, "cache_dirty_urcu_active_readers = 0" - line 415, "pan.___", state 270, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 284, "cache_dirty_rcu_data[i] = 0" - line 424, "pan.___", state 303, "(1)" - line 428, "pan.___", state 316, "(1)" - line 433, "pan.___", state 333, "(1)" - line 437, "pan.___", state 346, "(1)" - line 410, "pan.___", state 383, "cache_dirty_urcu_active_readers = 0" - line 415, "pan.___", state 401, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 415, "cache_dirty_rcu_data[i] = 0" - line 428, "pan.___", state 447, "(1)" - line 433, "pan.___", state 464, "(1)" - line 437, "pan.___", state 477, "(1)" - line 410, "pan.___", state 522, "cache_dirty_urcu_active_readers = 0" - line 415, "pan.___", state 540, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 554, "cache_dirty_rcu_data[i] = 0" - line 428, "pan.___", state 586, "(1)" - line 433, "pan.___", state 603, "(1)" - line 437, "pan.___", state 616, "(1)" - line 410, "pan.___", state 651, "cache_dirty_urcu_active_readers = 0" - line 415, "pan.___", state 669, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 683, "cache_dirty_rcu_data[i] = 0" - line 428, "pan.___", state 715, "(1)" - line 433, "pan.___", state 732, "(1)" - line 437, "pan.___", state 745, "(1)" - line 410, "pan.___", state 782, "cache_dirty_urcu_active_readers = 0" - line 415, "pan.___", state 800, "cache_dirty_rcu_ptr = 0" - line 419, "pan.___", state 814, "cache_dirty_rcu_data[i] = 0" - line 428, "pan.___", state 846, "(1)" - line 433, "pan.___", state 863, "(1)" - line 437, "pan.___", state 876, "(1)" - line 267, "pan.___", state 931, "cache_dirty_urcu_gp_ctr = 0" - line 271, "pan.___", state 940, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 955, "(1)" - line 279, "pan.___", state 962, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 978, "(1)" - line 248, "pan.___", state 986, "(1)" - line 252, "pan.___", state 998, "(1)" - line 256, "pan.___", state 1006, "(1)" - line 267, "pan.___", state 1037, "cache_dirty_urcu_gp_ctr = 0" - line 271, "pan.___", state 1046, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 1059, "cache_dirty_rcu_ptr = 0" - line 279, "pan.___", state 1068, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 1084, "(1)" - line 248, "pan.___", state 1092, "(1)" - line 252, "pan.___", state 1104, "(1)" - line 256, "pan.___", state 1112, "(1)" - line 271, "pan.___", state 1138, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 1151, "cache_dirty_rcu_ptr = 0" - line 279, "pan.___", state 1160, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 1176, "(1)" - line 248, "pan.___", state 1184, "(1)" - line 252, "pan.___", state 1196, "(1)" - line 256, "pan.___", state 1204, "(1)" - line 267, "pan.___", state 1235, "cache_dirty_urcu_gp_ctr = 0" - line 271, "pan.___", state 1244, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 1257, "cache_dirty_rcu_ptr = 0" - line 279, "pan.___", state 1266, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 1282, "(1)" - line 248, "pan.___", state 1290, "(1)" - line 252, "pan.___", state 1302, "(1)" - line 256, "pan.___", state 1310, "(1)" - line 271, "pan.___", state 1336, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 1349, "cache_dirty_rcu_ptr = 0" - line 279, "pan.___", state 1358, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 1374, "(1)" - line 248, "pan.___", state 1382, "(1)" - line 252, "pan.___", state 1394, "(1)" - line 256, "pan.___", state 1402, "(1)" - line 267, "pan.___", state 1433, "cache_dirty_urcu_gp_ctr = 0" - line 271, "pan.___", state 1442, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 1455, "cache_dirty_rcu_ptr = 0" - line 279, "pan.___", state 1464, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 1480, "(1)" - line 248, "pan.___", state 1488, "(1)" - line 252, "pan.___", state 1500, "(1)" - line 256, "pan.___", state 1508, "(1)" - line 271, "pan.___", state 1534, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 1547, "cache_dirty_rcu_ptr = 0" - line 279, "pan.___", state 1556, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 1572, "(1)" - line 248, "pan.___", state 1580, "(1)" - line 252, "pan.___", state 1592, "(1)" - line 256, "pan.___", state 1600, "(1)" - line 267, "pan.___", state 1631, "cache_dirty_urcu_gp_ctr = 0" - line 271, "pan.___", state 1640, "cache_dirty_urcu_active_readers = 0" - line 275, "pan.___", state 1653, "cache_dirty_rcu_ptr = 0" - line 279, "pan.___", state 1662, "cache_dirty_rcu_data[i] = 0" - line 244, "pan.___", state 1678, "(1)" - line 248, "pan.___", state 1686, "(1)" - line 252, "pan.___", state 1698, "(1)" - line 256, "pan.___", state 1706, "(1)" - line 1303, "pan.___", state 1722, "-end-" - (103 of 1722 states) -unreached in proctype :init: - (0 of 28 states) -unreached in proctype :never: - line 1366, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 5.15e+04 seconds -pan: rate 1721.7944 states/second -pan: avg transition delay 1.5843e-06 usec -cp .input.spin urcu_free.spin.input -cp .input.spin.trail urcu_free.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-ipi' diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free.ltl b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free.ltl deleted file mode 100644 index 6be1be9..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free.ltl +++ /dev/null @@ -1 +0,0 @@ -[] (!read_poison) diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free.spin.input b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free.spin.input deleted file mode 100644 index ca70e6c..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free.spin.input +++ /dev/null @@ -1,1339 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_nested.define b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_nested.define deleted file mode 100644 index 0fb59bd..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_nested.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_NEST_LEVEL 2 diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_mb.define b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_mb.define deleted file mode 100644 index d99d793..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_mb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_MB diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_mb.log b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_mb.log deleted file mode 100644 index fbb91fe..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_mb.log +++ /dev/null @@ -1,824 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_mb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1362) -Depth= 9193 States= 1e+06 Transitions= 2.02e+08 Memory= 513.615 t= 308 R= 3e+03 -Depth= 9193 States= 2e+06 Transitions= 4.02e+08 Memory= 560.100 t= 617 R= 3e+03 -pan: claim violated! (at depth 1482) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 80 byte, depth reached 9193, errors: 1 - 2638623 states, stored -5.0906949e+08 states, matched -5.1170812e+08 transitions (= stored+matched) -2.7495835e+09 atomic steps -hash conflicts: 3.3187407e+08 (resolved) - -Stats on memory usage (in Megabytes): - 291.901 equivalent memory usage for states (stored*(State-vector + overhead)) - 123.793 actual memory usage for states (compression: 42.41%) - state-vector as stored = 13 byte + 36 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 589.494 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 39337 2870 221 2 2 ] -unreached in proctype urcu_reader - line 894, "pan.___", state 12, "((i<1))" - line 894, "pan.___", state 12, "((i>=1))" - line 268, "pan.___", state 61, "cache_dirty_urcu_gp_ctr = 0" - line 276, "pan.___", state 83, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 92, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 108, "(1)" - line 249, "pan.___", state 116, "(1)" - line 253, "pan.___", state 128, "(1)" - line 257, "pan.___", state 136, "(1)" - line 407, "pan.___", state 162, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 194, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 208, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 227, "(1)" - line 434, "pan.___", state 257, "(1)" - line 438, "pan.___", state 270, "(1)" - line 696, "pan.___", state 291, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 407, "pan.___", state 298, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 330, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 344, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 363, "(1)" - line 434, "pan.___", state 393, "(1)" - line 438, "pan.___", state 406, "(1)" - line 407, "pan.___", state 427, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 459, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 473, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 492, "(1)" - line 434, "pan.___", state 522, "(1)" - line 438, "pan.___", state 535, "(1)" - line 407, "pan.___", state 558, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 560, "(1)" - line 407, "pan.___", state 561, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 561, "else" - line 407, "pan.___", state 564, "(1)" - line 411, "pan.___", state 572, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 574, "(1)" - line 411, "pan.___", state 575, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 575, "else" - line 411, "pan.___", state 578, "(1)" - line 411, "pan.___", state 579, "(1)" - line 411, "pan.___", state 579, "(1)" - line 409, "pan.___", state 584, "((i<1))" - line 409, "pan.___", state 584, "((i>=1))" - line 416, "pan.___", state 590, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 592, "(1)" - line 416, "pan.___", state 593, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 593, "else" - line 416, "pan.___", state 596, "(1)" - line 416, "pan.___", state 597, "(1)" - line 416, "pan.___", state 597, "(1)" - line 420, "pan.___", state 604, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 606, "(1)" - line 420, "pan.___", state 607, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 607, "else" - line 420, "pan.___", state 610, "(1)" - line 420, "pan.___", state 611, "(1)" - line 420, "pan.___", state 611, "(1)" - line 418, "pan.___", state 616, "((i<2))" - line 418, "pan.___", state 616, "((i>=2))" - line 425, "pan.___", state 623, "(1)" - line 425, "pan.___", state 624, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 624, "else" - line 425, "pan.___", state 627, "(1)" - line 425, "pan.___", state 628, "(1)" - line 425, "pan.___", state 628, "(1)" - line 429, "pan.___", state 636, "(1)" - line 429, "pan.___", state 637, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 637, "else" - line 429, "pan.___", state 640, "(1)" - line 429, "pan.___", state 641, "(1)" - line 429, "pan.___", state 641, "(1)" - line 427, "pan.___", state 646, "((i<1))" - line 427, "pan.___", state 646, "((i>=1))" - line 434, "pan.___", state 653, "(1)" - line 434, "pan.___", state 654, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 654, "else" - line 434, "pan.___", state 657, "(1)" - line 434, "pan.___", state 658, "(1)" - line 434, "pan.___", state 658, "(1)" - line 438, "pan.___", state 666, "(1)" - line 438, "pan.___", state 667, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 667, "else" - line 438, "pan.___", state 670, "(1)" - line 438, "pan.___", state 671, "(1)" - line 438, "pan.___", state 671, "(1)" - line 436, "pan.___", state 676, "((i<2))" - line 436, "pan.___", state 676, "((i>=2))" - line 446, "pan.___", state 680, "(1)" - line 446, "pan.___", state 680, "(1)" - line 696, "pan.___", state 683, "cached_urcu_active_readers = (tmp+1)" - line 696, "pan.___", state 684, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 696, "pan.___", state 685, "(1)" - line 407, "pan.___", state 692, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 724, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 738, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 757, "(1)" - line 434, "pan.___", state 787, "(1)" - line 438, "pan.___", state 800, "(1)" - line 407, "pan.___", state 828, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 860, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 874, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 893, "(1)" - line 434, "pan.___", state 923, "(1)" - line 438, "pan.___", state 936, "(1)" - line 407, "pan.___", state 957, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 959, "(1)" - line 407, "pan.___", state 960, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 960, "else" - line 407, "pan.___", state 963, "(1)" - line 411, "pan.___", state 971, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 973, "(1)" - line 411, "pan.___", state 974, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 974, "else" - line 411, "pan.___", state 977, "(1)" - line 411, "pan.___", state 978, "(1)" - line 411, "pan.___", state 978, "(1)" - line 409, "pan.___", state 983, "((i<1))" - line 409, "pan.___", state 983, "((i>=1))" - line 416, "pan.___", state 989, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 991, "(1)" - line 416, "pan.___", state 992, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 992, "else" - line 416, "pan.___", state 995, "(1)" - line 416, "pan.___", state 996, "(1)" - line 416, "pan.___", state 996, "(1)" - line 420, "pan.___", state 1003, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 1005, "(1)" - line 420, "pan.___", state 1006, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 1006, "else" - line 420, "pan.___", state 1009, "(1)" - line 420, "pan.___", state 1010, "(1)" - line 420, "pan.___", state 1010, "(1)" - line 418, "pan.___", state 1015, "((i<2))" - line 418, "pan.___", state 1015, "((i>=2))" - line 425, "pan.___", state 1022, "(1)" - line 425, "pan.___", state 1023, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 1023, "else" - line 425, "pan.___", state 1026, "(1)" - line 425, "pan.___", state 1027, "(1)" - line 425, "pan.___", state 1027, "(1)" - line 429, "pan.___", state 1035, "(1)" - line 429, "pan.___", state 1036, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 1036, "else" - line 429, "pan.___", state 1039, "(1)" - line 429, "pan.___", state 1040, "(1)" - line 429, "pan.___", state 1040, "(1)" - line 427, "pan.___", state 1045, "((i<1))" - line 427, "pan.___", state 1045, "((i>=1))" - line 434, "pan.___", state 1052, "(1)" - line 434, "pan.___", state 1053, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 1053, "else" - line 434, "pan.___", state 1056, "(1)" - line 434, "pan.___", state 1057, "(1)" - line 434, "pan.___", state 1057, "(1)" - line 438, "pan.___", state 1065, "(1)" - line 438, "pan.___", state 1066, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 1066, "else" - line 438, "pan.___", state 1069, "(1)" - line 438, "pan.___", state 1070, "(1)" - line 438, "pan.___", state 1070, "(1)" - line 436, "pan.___", state 1075, "((i<2))" - line 436, "pan.___", state 1075, "((i>=2))" - line 446, "pan.___", state 1079, "(1)" - line 446, "pan.___", state 1079, "(1)" - line 704, "pan.___", state 1083, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 407, "pan.___", state 1088, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1120, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1134, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1153, "(1)" - line 434, "pan.___", state 1183, "(1)" - line 438, "pan.___", state 1196, "(1)" - line 407, "pan.___", state 1220, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1252, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1266, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1285, "(1)" - line 434, "pan.___", state 1315, "(1)" - line 438, "pan.___", state 1328, "(1)" - line 407, "pan.___", state 1353, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1385, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1399, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1418, "(1)" - line 434, "pan.___", state 1448, "(1)" - line 438, "pan.___", state 1461, "(1)" - line 407, "pan.___", state 1482, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1514, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1528, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1547, "(1)" - line 434, "pan.___", state 1577, "(1)" - line 438, "pan.___", state 1590, "(1)" - line 407, "pan.___", state 1616, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1648, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1662, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1681, "(1)" - line 434, "pan.___", state 1711, "(1)" - line 438, "pan.___", state 1724, "(1)" - line 407, "pan.___", state 1745, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1777, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1791, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1810, "(1)" - line 434, "pan.___", state 1840, "(1)" - line 438, "pan.___", state 1853, "(1)" - line 407, "pan.___", state 1877, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1909, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1923, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1942, "(1)" - line 434, "pan.___", state 1972, "(1)" - line 438, "pan.___", state 1985, "(1)" - line 743, "pan.___", state 2006, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 407, "pan.___", state 2013, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2045, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2059, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2078, "(1)" - line 434, "pan.___", state 2108, "(1)" - line 438, "pan.___", state 2121, "(1)" - line 407, "pan.___", state 2142, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2174, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2188, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2207, "(1)" - line 434, "pan.___", state 2237, "(1)" - line 438, "pan.___", state 2250, "(1)" - line 407, "pan.___", state 2273, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 2275, "(1)" - line 407, "pan.___", state 2276, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 2276, "else" - line 407, "pan.___", state 2279, "(1)" - line 411, "pan.___", state 2287, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 2289, "(1)" - line 411, "pan.___", state 2290, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 2290, "else" - line 411, "pan.___", state 2293, "(1)" - line 411, "pan.___", state 2294, "(1)" - line 411, "pan.___", state 2294, "(1)" - line 409, "pan.___", state 2299, "((i<1))" - line 409, "pan.___", state 2299, "((i>=1))" - line 416, "pan.___", state 2305, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 2307, "(1)" - line 416, "pan.___", state 2308, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 2308, "else" - line 416, "pan.___", state 2311, "(1)" - line 416, "pan.___", state 2312, "(1)" - line 416, "pan.___", state 2312, "(1)" - line 420, "pan.___", state 2319, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 2321, "(1)" - line 420, "pan.___", state 2322, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 2322, "else" - line 420, "pan.___", state 2325, "(1)" - line 420, "pan.___", state 2326, "(1)" - line 420, "pan.___", state 2326, "(1)" - line 418, "pan.___", state 2331, "((i<2))" - line 418, "pan.___", state 2331, "((i>=2))" - line 425, "pan.___", state 2338, "(1)" - line 425, "pan.___", state 2339, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 2339, "else" - line 425, "pan.___", state 2342, "(1)" - line 425, "pan.___", state 2343, "(1)" - line 425, "pan.___", state 2343, "(1)" - line 429, "pan.___", state 2351, "(1)" - line 429, "pan.___", state 2352, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 2352, "else" - line 429, "pan.___", state 2355, "(1)" - line 429, "pan.___", state 2356, "(1)" - line 429, "pan.___", state 2356, "(1)" - line 427, "pan.___", state 2361, "((i<1))" - line 427, "pan.___", state 2361, "((i>=1))" - line 434, "pan.___", state 2368, "(1)" - line 434, "pan.___", state 2369, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 2369, "else" - line 434, "pan.___", state 2372, "(1)" - line 434, "pan.___", state 2373, "(1)" - line 434, "pan.___", state 2373, "(1)" - line 438, "pan.___", state 2381, "(1)" - line 438, "pan.___", state 2382, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 2382, "else" - line 438, "pan.___", state 2385, "(1)" - line 438, "pan.___", state 2386, "(1)" - line 438, "pan.___", state 2386, "(1)" - line 436, "pan.___", state 2391, "((i<2))" - line 436, "pan.___", state 2391, "((i>=2))" - line 446, "pan.___", state 2395, "(1)" - line 446, "pan.___", state 2395, "(1)" - line 743, "pan.___", state 2398, "cached_urcu_active_readers = (tmp+1)" - line 743, "pan.___", state 2399, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 743, "pan.___", state 2400, "(1)" - line 407, "pan.___", state 2407, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2439, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2453, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2472, "(1)" - line 434, "pan.___", state 2502, "(1)" - line 438, "pan.___", state 2515, "(1)" - line 407, "pan.___", state 2542, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2574, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2588, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2607, "(1)" - line 434, "pan.___", state 2637, "(1)" - line 438, "pan.___", state 2650, "(1)" - line 407, "pan.___", state 2671, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2703, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2717, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2736, "(1)" - line 434, "pan.___", state 2766, "(1)" - line 438, "pan.___", state 2779, "(1)" - line 245, "pan.___", state 2812, "(1)" - line 253, "pan.___", state 2832, "(1)" - line 257, "pan.___", state 2840, "(1)" - line 245, "pan.___", state 2855, "(1)" - line 253, "pan.___", state 2875, "(1)" - line 257, "pan.___", state 2883, "(1)" - line 929, "pan.___", state 2900, "-end-" - (246 of 2900 states) -unreached in proctype urcu_writer - line 1018, "pan.___", state 12, "((i<1))" - line 1018, "pan.___", state 12, "((i>=1))" - line 407, "pan.___", state 47, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 53, "(1)" - line 411, "pan.___", state 61, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 67, "(1)" - line 411, "pan.___", state 68, "(1)" - line 411, "pan.___", state 68, "(1)" - line 409, "pan.___", state 73, "((i<1))" - line 409, "pan.___", state 73, "((i>=1))" - line 416, "pan.___", state 79, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 85, "(1)" - line 416, "pan.___", state 86, "(1)" - line 416, "pan.___", state 86, "(1)" - line 420, "pan.___", state 99, "(1)" - line 420, "pan.___", state 100, "(1)" - line 420, "pan.___", state 100, "(1)" - line 418, "pan.___", state 105, "((i<2))" - line 418, "pan.___", state 105, "((i>=2))" - line 425, "pan.___", state 112, "(1)" - line 425, "pan.___", state 113, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 113, "else" - line 425, "pan.___", state 116, "(1)" - line 425, "pan.___", state 117, "(1)" - line 425, "pan.___", state 117, "(1)" - line 429, "pan.___", state 125, "(1)" - line 429, "pan.___", state 126, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 126, "else" - line 429, "pan.___", state 129, "(1)" - line 429, "pan.___", state 130, "(1)" - line 429, "pan.___", state 130, "(1)" - line 427, "pan.___", state 135, "((i<1))" - line 427, "pan.___", state 135, "((i>=1))" - line 434, "pan.___", state 142, "(1)" - line 434, "pan.___", state 143, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 143, "else" - line 434, "pan.___", state 146, "(1)" - line 434, "pan.___", state 147, "(1)" - line 434, "pan.___", state 147, "(1)" - line 438, "pan.___", state 155, "(1)" - line 438, "pan.___", state 156, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 156, "else" - line 438, "pan.___", state 159, "(1)" - line 438, "pan.___", state 160, "(1)" - line 438, "pan.___", state 160, "(1)" - line 436, "pan.___", state 165, "((i<2))" - line 436, "pan.___", state 165, "((i>=2))" - line 446, "pan.___", state 169, "(1)" - line 446, "pan.___", state 169, "(1)" - line 268, "pan.___", state 178, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 187, "cache_dirty_urcu_active_readers = 0" - line 270, "pan.___", state 195, "((i<1))" - line 270, "pan.___", state 195, "((i>=1))" - line 276, "pan.___", state 200, "cache_dirty_rcu_ptr = 0" - line 1088, "pan.___", state 228, "old_data = cached_rcu_ptr" - line 1099, "pan.___", state 232, "_proc_urcu_writer = (_proc_urcu_writer|(1<<4))" - line 407, "pan.___", state 240, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 246, "(1)" - line 411, "pan.___", state 254, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 260, "(1)" - line 411, "pan.___", state 261, "(1)" - line 411, "pan.___", state 261, "(1)" - line 409, "pan.___", state 266, "((i<1))" - line 409, "pan.___", state 266, "((i>=1))" - line 416, "pan.___", state 274, "(1)" - line 416, "pan.___", state 275, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 275, "else" - line 416, "pan.___", state 278, "(1)" - line 416, "pan.___", state 279, "(1)" - line 416, "pan.___", state 279, "(1)" - line 420, "pan.___", state 286, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 292, "(1)" - line 420, "pan.___", state 293, "(1)" - line 420, "pan.___", state 293, "(1)" - line 418, "pan.___", state 298, "((i<2))" - line 418, "pan.___", state 298, "((i>=2))" - line 425, "pan.___", state 305, "(1)" - line 425, "pan.___", state 306, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 306, "else" - line 425, "pan.___", state 309, "(1)" - line 425, "pan.___", state 310, "(1)" - line 425, "pan.___", state 310, "(1)" - line 429, "pan.___", state 318, "(1)" - line 429, "pan.___", state 319, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 319, "else" - line 429, "pan.___", state 322, "(1)" - line 429, "pan.___", state 323, "(1)" - line 429, "pan.___", state 323, "(1)" - line 427, "pan.___", state 328, "((i<1))" - line 427, "pan.___", state 328, "((i>=1))" - line 434, "pan.___", state 335, "(1)" - line 434, "pan.___", state 336, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 336, "else" - line 434, "pan.___", state 339, "(1)" - line 434, "pan.___", state 340, "(1)" - line 434, "pan.___", state 340, "(1)" - line 438, "pan.___", state 348, "(1)" - line 438, "pan.___", state 349, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 349, "else" - line 438, "pan.___", state 352, "(1)" - line 438, "pan.___", state 353, "(1)" - line 438, "pan.___", state 353, "(1)" - line 436, "pan.___", state 358, "((i<2))" - line 436, "pan.___", state 358, "((i>=2))" - line 446, "pan.___", state 362, "(1)" - line 446, "pan.___", state 362, "(1)" - line 407, "pan.___", state 373, "(1)" - line 407, "pan.___", state 374, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 374, "else" - line 407, "pan.___", state 377, "(1)" - line 411, "pan.___", state 385, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 391, "(1)" - line 411, "pan.___", state 392, "(1)" - line 411, "pan.___", state 392, "(1)" - line 409, "pan.___", state 397, "((i<1))" - line 409, "pan.___", state 397, "((i>=1))" - line 416, "pan.___", state 403, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 409, "(1)" - line 416, "pan.___", state 410, "(1)" - line 416, "pan.___", state 410, "(1)" - line 420, "pan.___", state 417, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 423, "(1)" - line 420, "pan.___", state 424, "(1)" - line 420, "pan.___", state 424, "(1)" - line 418, "pan.___", state 429, "((i<2))" - line 418, "pan.___", state 429, "((i>=2))" - line 425, "pan.___", state 436, "(1)" - line 425, "pan.___", state 437, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 437, "else" - line 425, "pan.___", state 440, "(1)" - line 425, "pan.___", state 441, "(1)" - line 425, "pan.___", state 441, "(1)" - line 429, "pan.___", state 449, "(1)" - line 429, "pan.___", state 450, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 450, "else" - line 429, "pan.___", state 453, "(1)" - line 429, "pan.___", state 454, "(1)" - line 429, "pan.___", state 454, "(1)" - line 427, "pan.___", state 459, "((i<1))" - line 427, "pan.___", state 459, "((i>=1))" - line 434, "pan.___", state 466, "(1)" - line 434, "pan.___", state 467, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 467, "else" - line 434, "pan.___", state 470, "(1)" - line 434, "pan.___", state 471, "(1)" - line 434, "pan.___", state 471, "(1)" - line 438, "pan.___", state 479, "(1)" - line 438, "pan.___", state 480, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 480, "else" - line 438, "pan.___", state 483, "(1)" - line 438, "pan.___", state 484, "(1)" - line 438, "pan.___", state 484, "(1)" - line 436, "pan.___", state 489, "((i<2))" - line 436, "pan.___", state 489, "((i>=2))" - line 446, "pan.___", state 493, "(1)" - line 446, "pan.___", state 493, "(1)" - line 1153, "pan.___", state 504, "_proc_urcu_writer = (_proc_urcu_writer&~((1<<9)))" - line 1158, "pan.___", state 505, "_proc_urcu_writer = (_proc_urcu_writer&~(((1<<8)|(1<<7))))" - line 407, "pan.___", state 510, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 516, "(1)" - line 411, "pan.___", state 524, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 530, "(1)" - line 411, "pan.___", state 531, "(1)" - line 411, "pan.___", state 531, "(1)" - line 409, "pan.___", state 536, "((i<1))" - line 409, "pan.___", state 536, "((i>=1))" - line 416, "pan.___", state 542, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 548, "(1)" - line 416, "pan.___", state 549, "(1)" - line 416, "pan.___", state 549, "(1)" - line 420, "pan.___", state 556, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 562, "(1)" - line 420, "pan.___", state 563, "(1)" - line 420, "pan.___", state 563, "(1)" - line 418, "pan.___", state 568, "((i<2))" - line 418, "pan.___", state 568, "((i>=2))" - line 425, "pan.___", state 575, "(1)" - line 425, "pan.___", state 576, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 576, "else" - line 425, "pan.___", state 579, "(1)" - line 425, "pan.___", state 580, "(1)" - line 425, "pan.___", state 580, "(1)" - line 429, "pan.___", state 588, "(1)" - line 429, "pan.___", state 589, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 589, "else" - line 429, "pan.___", state 592, "(1)" - line 429, "pan.___", state 593, "(1)" - line 429, "pan.___", state 593, "(1)" - line 427, "pan.___", state 598, "((i<1))" - line 427, "pan.___", state 598, "((i>=1))" - line 434, "pan.___", state 605, "(1)" - line 434, "pan.___", state 606, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 606, "else" - line 434, "pan.___", state 609, "(1)" - line 434, "pan.___", state 610, "(1)" - line 434, "pan.___", state 610, "(1)" - line 438, "pan.___", state 618, "(1)" - line 438, "pan.___", state 619, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 619, "else" - line 438, "pan.___", state 622, "(1)" - line 438, "pan.___", state 623, "(1)" - line 438, "pan.___", state 623, "(1)" - line 446, "pan.___", state 632, "(1)" - line 446, "pan.___", state 632, "(1)" - line 407, "pan.___", state 639, "cache_dirty_urcu_gp_ctr = 0" - line 411, "pan.___", state 653, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 671, "cache_dirty_rcu_ptr = 0" - line 425, "pan.___", state 704, "(1)" - line 429, "pan.___", state 717, "(1)" - line 434, "pan.___", state 734, "(1)" - line 438, "pan.___", state 747, "(1)" - line 411, "pan.___", state 784, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 802, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 816, "cache_dirty_rcu_data[i] = 0" - line 429, "pan.___", state 848, "(1)" - line 434, "pan.___", state 865, "(1)" - line 438, "pan.___", state 878, "(1)" - line 1235, "pan.___", state 905, "_proc_urcu_writer = (_proc_urcu_writer|(1<<13))" - line 268, "pan.___", state 933, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 935, "(1)" - line 272, "pan.___", state 942, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 944, "(1)" - line 272, "pan.___", state 945, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 945, "else" - line 270, "pan.___", state 950, "((i<1))" - line 270, "pan.___", state 950, "((i>=1))" - line 276, "pan.___", state 955, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 957, "(1)" - line 276, "pan.___", state 958, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 958, "else" - line 280, "pan.___", state 964, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 966, "(1)" - line 280, "pan.___", state 967, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 967, "else" - line 278, "pan.___", state 972, "((i<2))" - line 278, "pan.___", state 972, "((i>=2))" - line 245, "pan.___", state 980, "(1)" - line 249, "pan.___", state 988, "(1)" - line 249, "pan.___", state 989, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 989, "else" - line 247, "pan.___", state 994, "((i<1))" - line 247, "pan.___", state 994, "((i>=1))" - line 253, "pan.___", state 1000, "(1)" - line 253, "pan.___", state 1001, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 1001, "else" - line 257, "pan.___", state 1008, "(1)" - line 257, "pan.___", state 1009, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 1009, "else" - line 262, "pan.___", state 1018, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 1018, "else" - line 1289, "pan.___", state 1034, "((i<1))" - line 1289, "pan.___", state 1034, "((i>=1))" - line 268, "pan.___", state 1039, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 1041, "(1)" - line 272, "pan.___", state 1048, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 1050, "(1)" - line 272, "pan.___", state 1051, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 1051, "else" - line 270, "pan.___", state 1056, "((i<1))" - line 270, "pan.___", state 1056, "((i>=1))" - line 276, "pan.___", state 1061, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 1063, "(1)" - line 276, "pan.___", state 1064, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 1064, "else" - line 280, "pan.___", state 1070, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 1072, "(1)" - line 280, "pan.___", state 1073, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 1073, "else" - line 278, "pan.___", state 1078, "((i<2))" - line 278, "pan.___", state 1078, "((i>=2))" - line 245, "pan.___", state 1086, "(1)" - line 249, "pan.___", state 1094, "(1)" - line 249, "pan.___", state 1095, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 1095, "else" - line 247, "pan.___", state 1100, "((i<1))" - line 247, "pan.___", state 1100, "((i>=1))" - line 253, "pan.___", state 1106, "(1)" - line 253, "pan.___", state 1107, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 1107, "else" - line 257, "pan.___", state 1114, "(1)" - line 257, "pan.___", state 1115, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 1115, "else" - line 262, "pan.___", state 1124, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 1124, "else" - line 295, "pan.___", state 1126, "(cache_dirty_urcu_gp_ctr)" - line 295, "pan.___", state 1126, "else" - line 1289, "pan.___", state 1127, "(cache_dirty_urcu_gp_ctr)" - line 1289, "pan.___", state 1127, "else" - line 268, "pan.___", state 1131, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 1133, "(1)" - line 272, "pan.___", state 1140, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 1142, "(1)" - line 272, "pan.___", state 1143, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 1143, "else" - line 270, "pan.___", state 1148, "((i<1))" - line 270, "pan.___", state 1148, "((i>=1))" - line 276, "pan.___", state 1153, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 1155, "(1)" - line 276, "pan.___", state 1156, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 1156, "else" - line 280, "pan.___", state 1162, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 1164, "(1)" - line 280, "pan.___", state 1165, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 1165, "else" - line 278, "pan.___", state 1170, "((i<2))" - line 278, "pan.___", state 1170, "((i>=2))" - line 245, "pan.___", state 1178, "(1)" - line 249, "pan.___", state 1186, "(1)" - line 249, "pan.___", state 1187, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 1187, "else" - line 247, "pan.___", state 1192, "((i<1))" - line 247, "pan.___", state 1192, "((i>=1))" - line 253, "pan.___", state 1198, "(1)" - line 253, "pan.___", state 1199, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 1199, "else" - line 257, "pan.___", state 1206, "(1)" - line 257, "pan.___", state 1207, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 1207, "else" - line 262, "pan.___", state 1216, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 1216, "else" - line 1293, "pan.___", state 1219, "i = 0" - line 1293, "pan.___", state 1221, "reader_barrier = 1" - line 1293, "pan.___", state 1232, "((i<1))" - line 1293, "pan.___", state 1232, "((i>=1))" - line 268, "pan.___", state 1237, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 1239, "(1)" - line 272, "pan.___", state 1246, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 1248, "(1)" - line 272, "pan.___", state 1249, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 1249, "else" - line 270, "pan.___", state 1254, "((i<1))" - line 270, "pan.___", state 1254, "((i>=1))" - line 276, "pan.___", state 1259, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 1261, "(1)" - line 276, "pan.___", state 1262, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 1262, "else" - line 280, "pan.___", state 1268, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 1270, "(1)" - line 280, "pan.___", state 1271, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 1271, "else" - line 278, "pan.___", state 1276, "((i<2))" - line 278, "pan.___", state 1276, "((i>=2))" - line 245, "pan.___", state 1284, "(1)" - line 249, "pan.___", state 1292, "(1)" - line 249, "pan.___", state 1293, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 1293, "else" - line 247, "pan.___", state 1298, "((i<1))" - line 247, "pan.___", state 1298, "((i>=1))" - line 253, "pan.___", state 1304, "(1)" - line 253, "pan.___", state 1305, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 1305, "else" - line 257, "pan.___", state 1312, "(1)" - line 257, "pan.___", state 1313, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 1313, "else" - line 262, "pan.___", state 1322, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 1322, "else" - line 295, "pan.___", state 1324, "(cache_dirty_urcu_gp_ctr)" - line 295, "pan.___", state 1324, "else" - line 1293, "pan.___", state 1325, "(cache_dirty_urcu_gp_ctr)" - line 1293, "pan.___", state 1325, "else" - line 272, "pan.___", state 1338, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1351, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1360, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1376, "(1)" - line 249, "pan.___", state 1384, "(1)" - line 253, "pan.___", state 1396, "(1)" - line 257, "pan.___", state 1404, "(1)" - line 268, "pan.___", state 1435, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1444, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1457, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1466, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1482, "(1)" - line 249, "pan.___", state 1490, "(1)" - line 253, "pan.___", state 1502, "(1)" - line 257, "pan.___", state 1510, "(1)" - line 268, "pan.___", state 1527, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 1529, "(1)" - line 272, "pan.___", state 1536, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 1538, "(1)" - line 272, "pan.___", state 1539, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 1539, "else" - line 270, "pan.___", state 1544, "((i<1))" - line 270, "pan.___", state 1544, "((i>=1))" - line 276, "pan.___", state 1549, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 1551, "(1)" - line 276, "pan.___", state 1552, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 1552, "else" - line 280, "pan.___", state 1558, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 1560, "(1)" - line 280, "pan.___", state 1561, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 1561, "else" - line 278, "pan.___", state 1566, "((i<2))" - line 278, "pan.___", state 1566, "((i>=2))" - line 245, "pan.___", state 1574, "(1)" - line 249, "pan.___", state 1582, "(1)" - line 249, "pan.___", state 1583, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 1583, "else" - line 247, "pan.___", state 1588, "((i<1))" - line 247, "pan.___", state 1588, "((i>=1))" - line 253, "pan.___", state 1594, "(1)" - line 253, "pan.___", state 1595, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 1595, "else" - line 257, "pan.___", state 1602, "(1)" - line 257, "pan.___", state 1603, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 1603, "else" - line 262, "pan.___", state 1612, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 1612, "else" - line 1300, "pan.___", state 1615, "i = 0" - line 1300, "pan.___", state 1617, "reader_barrier = 1" - line 1300, "pan.___", state 1628, "((i<1))" - line 1300, "pan.___", state 1628, "((i>=1))" - line 268, "pan.___", state 1633, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 1635, "(1)" - line 272, "pan.___", state 1642, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 1644, "(1)" - line 272, "pan.___", state 1645, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 1645, "else" - line 270, "pan.___", state 1650, "((i<1))" - line 270, "pan.___", state 1650, "((i>=1))" - line 276, "pan.___", state 1655, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 1657, "(1)" - line 276, "pan.___", state 1658, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 1658, "else" - line 280, "pan.___", state 1664, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 1666, "(1)" - line 280, "pan.___", state 1667, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 1667, "else" - line 278, "pan.___", state 1672, "((i<2))" - line 278, "pan.___", state 1672, "((i>=2))" - line 245, "pan.___", state 1680, "(1)" - line 249, "pan.___", state 1688, "(1)" - line 249, "pan.___", state 1689, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 1689, "else" - line 247, "pan.___", state 1694, "((i<1))" - line 247, "pan.___", state 1694, "((i>=1))" - line 253, "pan.___", state 1700, "(1)" - line 253, "pan.___", state 1701, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 1701, "else" - line 257, "pan.___", state 1708, "(1)" - line 257, "pan.___", state 1709, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 1709, "else" - line 262, "pan.___", state 1718, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 1718, "else" - line 295, "pan.___", state 1720, "(cache_dirty_urcu_gp_ctr)" - line 295, "pan.___", state 1720, "else" - line 1300, "pan.___", state 1721, "(cache_dirty_urcu_gp_ctr)" - line 1300, "pan.___", state 1721, "else" - line 1304, "pan.___", state 1724, "-end-" - (312 of 1724 states) -unreached in proctype :init: - line 1319, "pan.___", state 13, "((i<1))" - line 1319, "pan.___", state 13, "((i>=1))" - (1 of 28 states) -unreached in proctype :never: - line 1367, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 792 seconds -pan: rate 3330.8797 states/second -pan: avg transition delay 1.5481e-06 usec -cp .input.spin urcu_free_no_mb.spin.input -cp .input.spin.trail urcu_free_no_mb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-ipi' diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_mb.spin.input b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_mb.spin.input deleted file mode 100644 index b35bf7b..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_mb.spin.input +++ /dev/null @@ -1,1340 +0,0 @@ -#define NO_MB - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_mb.spin.input.trail b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_mb.spin.input.trail deleted file mode 100644 index 915575e..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_mb.spin.input.trail +++ /dev/null @@ -1,1485 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:4654 -2:2:2900 -3:2:2905 -4:2:2909 -5:2:2917 -6:2:2921 -7:2:2925 -8:0:4654 -9:1:0 -10:1:5 -11:1:9 -12:1:17 -13:1:21 -14:1:25 -15:0:4654 -16:3:4624 -17:3:4627 -18:3:4634 -19:3:4641 -20:3:4644 -21:3:4648 -22:3:4649 -23:0:4654 -24:3:4651 -25:0:4654 -26:2:2929 -27:0:4654 -28:2:2935 -29:0:4654 -30:2:2936 -31:0:4654 -32:2:2938 -33:0:4654 -34:2:2939 -35:0:4654 -36:2:2940 -37:0:4654 -38:2:2941 -39:0:4654 -40:2:2942 -41:2:2943 -42:2:2947 -43:2:2948 -44:2:2956 -45:2:2957 -46:2:2961 -47:2:2962 -48:2:2970 -49:2:2975 -50:2:2979 -51:2:2980 -52:2:2988 -53:2:2989 -54:2:2993 -55:2:2994 -56:2:2988 -57:2:2989 -58:2:2993 -59:2:2994 -60:2:3002 -61:2:3007 -62:2:3008 -63:2:3019 -64:2:3020 -65:2:3021 -66:2:3032 -67:2:3037 -68:2:3038 -69:2:3049 -70:2:3050 -71:2:3051 -72:2:3049 -73:2:3050 -74:2:3051 -75:2:3062 -76:2:3070 -77:0:4654 -78:2:2941 -79:0:4654 -80:2:3074 -81:2:3078 -82:2:3079 -83:2:3083 -84:2:3087 -85:2:3088 -86:2:3092 -87:2:3100 -88:2:3101 -89:2:3105 -90:2:3109 -91:2:3110 -92:2:3105 -93:2:3106 -94:2:3114 -95:0:4654 -96:2:2941 -97:0:4654 -98:2:3122 -99:2:3123 -100:2:3124 -101:0:4654 -102:2:2941 -103:0:4654 -104:2:3132 -105:0:4654 -106:2:2941 -107:0:4654 -108:2:3135 -109:2:3136 -110:2:3140 -111:2:3141 -112:2:3149 -113:2:3150 -114:2:3154 -115:2:3155 -116:2:3163 -117:2:3168 -118:2:3169 -119:2:3181 -120:2:3182 -121:2:3186 -122:2:3187 -123:2:3181 -124:2:3182 -125:2:3186 -126:2:3187 -127:2:3195 -128:2:3200 -129:2:3201 -130:2:3212 -131:2:3213 -132:2:3214 -133:2:3225 -134:2:3230 -135:2:3231 -136:2:3242 -137:2:3243 -138:2:3244 -139:2:3242 -140:2:3243 -141:2:3244 -142:2:3255 -143:2:3262 -144:0:4654 -145:2:2941 -146:0:4654 -147:2:3266 -148:2:3267 -149:2:3268 -150:2:3280 -151:2:3281 -152:2:3285 -153:2:3286 -154:2:3294 -155:2:3299 -156:2:3303 -157:2:3304 -158:2:3312 -159:2:3313 -160:2:3317 -161:2:3318 -162:2:3312 -163:2:3313 -164:2:3317 -165:2:3318 -166:2:3326 -167:2:3331 -168:2:3332 -169:2:3343 -170:2:3344 -171:2:3345 -172:2:3356 -173:2:3361 -174:2:3362 -175:2:3373 -176:2:3374 -177:2:3375 -178:2:3373 -179:2:3374 -180:2:3375 -181:2:3386 -182:2:3397 -183:2:3398 -184:0:4654 -185:2:2941 -186:0:4654 -187:2:3405 -188:2:3406 -189:2:3410 -190:2:3411 -191:2:3419 -192:2:3420 -193:2:3424 -194:2:3425 -195:2:3433 -196:2:3438 -197:2:3442 -198:2:3443 -199:2:3451 -200:2:3452 -201:2:3456 -202:2:3457 -203:2:3451 -204:2:3452 -205:2:3456 -206:2:3457 -207:2:3465 -208:2:3470 -209:2:3471 -210:2:3482 -211:2:3483 -212:2:3484 -213:2:3495 -214:2:3500 -215:2:3501 -216:2:3512 -217:2:3513 -218:2:3514 -219:2:3512 -220:2:3513 -221:2:3514 -222:2:3525 -223:0:4654 -224:2:2941 -225:0:4654 -226:2:3534 -227:2:3535 -228:2:3539 -229:2:3540 -230:2:3548 -231:2:3549 -232:2:3553 -233:2:3554 -234:2:3562 -235:2:3567 -236:2:3571 -237:2:3572 -238:2:3580 -239:2:3581 -240:2:3585 -241:2:3586 -242:2:3580 -243:2:3581 -244:2:3585 -245:2:3586 -246:2:3594 -247:2:3599 -248:2:3600 -249:2:3611 -250:2:3612 -251:2:3613 -252:2:3624 -253:2:3629 -254:2:3630 -255:2:3641 -256:2:3642 -257:2:3643 -258:2:3641 -259:2:3642 -260:2:3643 -261:2:3654 -262:2:3661 -263:0:4654 -264:2:2941 -265:0:4654 -266:2:3665 -267:2:3666 -268:2:3667 -269:2:3679 -270:2:3680 -271:2:3684 -272:2:3685 -273:2:3693 -274:2:3698 -275:2:3702 -276:2:3703 -277:2:3711 -278:2:3712 -279:2:3716 -280:2:3717 -281:2:3711 -282:2:3712 -283:2:3716 -284:2:3717 -285:2:3725 -286:2:3730 -287:2:3731 -288:2:3742 -289:2:3743 -290:2:3744 -291:2:3755 -292:2:3760 -293:2:3761 -294:2:3772 -295:2:3773 -296:2:3774 -297:2:3772 -298:2:3773 -299:2:3774 -300:2:3785 -301:2:3795 -302:2:3796 -303:0:4654 -304:2:2941 -305:0:4654 -306:2:3805 -307:2:3806 -308:0:4654 -309:2:2941 -310:0:4654 -311:2:3810 -312:0:4654 -313:2:3818 -314:0:4654 -315:2:2936 -316:0:4654 -317:2:2938 -318:0:4654 -319:2:2939 -320:0:4654 -321:2:2940 -322:0:4654 -323:2:2941 -324:0:4654 -325:2:2942 -326:2:2943 -327:2:2947 -328:2:2948 -329:2:2956 -330:2:2957 -331:2:2961 -332:2:2962 -333:2:2970 -334:2:2975 -335:2:2979 -336:2:2980 -337:2:2988 -338:2:2989 -339:2:2990 -340:2:2988 -341:2:2989 -342:2:2993 -343:2:2994 -344:2:3002 -345:2:3007 -346:2:3008 -347:2:3019 -348:2:3020 -349:2:3021 -350:2:3032 -351:2:3037 -352:2:3038 -353:2:3049 -354:2:3050 -355:2:3051 -356:2:3049 -357:2:3050 -358:2:3051 -359:2:3062 -360:2:3070 -361:0:4654 -362:2:2941 -363:0:4654 -364:2:3074 -365:2:3078 -366:2:3079 -367:2:3083 -368:2:3087 -369:2:3088 -370:2:3092 -371:2:3100 -372:2:3101 -373:2:3105 -374:2:3106 -375:2:3105 -376:2:3109 -377:2:3110 -378:2:3114 -379:0:4654 -380:2:2941 -381:0:4654 -382:2:3122 -383:2:3123 -384:2:3124 -385:0:4654 -386:2:2941 -387:0:4654 -388:2:3132 -389:0:4654 -390:2:2941 -391:0:4654 -392:2:3135 -393:2:3136 -394:2:3140 -395:2:3141 -396:2:3149 -397:2:3150 -398:2:3154 -399:2:3155 -400:2:3163 -401:2:3168 -402:2:3169 -403:2:3181 -404:2:3182 -405:2:3186 -406:2:3187 -407:2:3181 -408:2:3182 -409:2:3186 -410:2:3187 -411:2:3195 -412:2:3200 -413:2:3201 -414:2:3212 -415:2:3213 -416:2:3214 -417:2:3225 -418:2:3230 -419:2:3231 -420:2:3242 -421:2:3243 -422:2:3244 -423:2:3242 -424:2:3243 -425:2:3244 -426:2:3255 -427:2:3262 -428:0:4654 -429:2:2941 -430:0:4654 -431:2:3266 -432:2:3267 -433:2:3268 -434:2:3280 -435:2:3281 -436:2:3285 -437:2:3286 -438:2:3294 -439:2:3299 -440:2:3303 -441:2:3304 -442:2:3312 -443:2:3313 -444:2:3317 -445:2:3318 -446:2:3312 -447:2:3313 -448:2:3317 -449:2:3318 -450:2:3326 -451:2:3331 -452:2:3332 -453:2:3343 -454:2:3344 -455:2:3345 -456:2:3356 -457:2:3361 -458:2:3362 -459:2:3373 -460:2:3374 -461:2:3375 -462:2:3373 -463:2:3374 -464:2:3375 -465:2:3386 -466:2:3397 -467:2:3398 -468:0:4654 -469:2:2941 -470:0:4654 -471:2:3405 -472:2:3406 -473:2:3410 -474:2:3411 -475:2:3419 -476:2:3420 -477:2:3424 -478:2:3425 -479:2:3433 -480:2:3438 -481:2:3442 -482:2:3443 -483:2:3451 -484:2:3452 -485:2:3456 -486:2:3457 -487:2:3451 -488:2:3452 -489:2:3456 -490:2:3457 -491:2:3465 -492:2:3470 -493:2:3471 -494:2:3482 -495:2:3483 -496:2:3484 -497:2:3495 -498:2:3500 -499:2:3501 -500:2:3512 -501:2:3513 -502:2:3514 -503:2:3512 -504:2:3513 -505:2:3514 -506:2:3525 -507:0:4654 -508:2:2941 -509:0:4654 -510:2:3534 -511:2:3535 -512:2:3539 -513:2:3540 -514:2:3548 -515:2:3549 -516:2:3553 -517:2:3554 -518:2:3562 -519:2:3567 -520:2:3571 -521:2:3572 -522:2:3580 -523:2:3581 -524:2:3585 -525:2:3586 -526:2:3580 -527:2:3581 -528:2:3585 -529:2:3586 -530:2:3594 -531:2:3599 -532:2:3600 -533:2:3611 -534:2:3612 -535:2:3613 -536:2:3624 -537:2:3629 -538:2:3630 -539:2:3641 -540:2:3642 -541:2:3643 -542:2:3641 -543:2:3642 -544:2:3643 -545:2:3654 -546:2:3661 -547:0:4654 -548:2:2941 -549:0:4654 -550:2:3665 -551:2:3666 -552:2:3667 -553:2:3679 -554:2:3680 -555:2:3684 -556:2:3685 -557:2:3693 -558:2:3698 -559:2:3702 -560:2:3703 -561:2:3711 -562:2:3712 -563:2:3716 -564:2:3717 -565:2:3711 -566:2:3712 -567:2:3716 -568:2:3717 -569:2:3725 -570:2:3730 -571:2:3731 -572:2:3742 -573:2:3743 -574:2:3744 -575:2:3755 -576:2:3760 -577:2:3761 -578:2:3772 -579:2:3773 -580:2:3774 -581:2:3772 -582:2:3773 -583:2:3774 -584:2:3785 -585:2:3795 -586:2:3796 -587:0:4654 -588:2:2941 -589:0:4654 -590:2:3805 -591:2:3806 -592:0:4654 -593:2:2941 -594:0:4654 -595:2:3810 -596:0:4654 -597:2:3818 -598:0:4654 -599:2:2936 -600:0:4654 -601:2:2938 -602:0:4654 -603:2:2939 -604:0:4654 -605:2:2940 -606:0:4654 -607:2:2941 -608:0:4654 -609:2:2942 -610:2:2943 -611:2:2947 -612:2:2948 -613:2:2956 -614:2:2957 -615:2:2961 -616:2:2962 -617:2:2970 -618:2:2975 -619:2:2979 -620:2:2980 -621:2:2988 -622:2:2989 -623:2:2993 -624:2:2994 -625:2:2988 -626:2:2989 -627:2:2990 -628:2:3002 -629:2:3007 -630:2:3008 -631:2:3019 -632:2:3020 -633:2:3021 -634:2:3032 -635:2:3037 -636:2:3038 -637:2:3049 -638:2:3050 -639:2:3051 -640:2:3049 -641:2:3050 -642:2:3051 -643:2:3062 -644:2:3070 -645:0:4654 -646:2:2941 -647:0:4654 -648:2:3074 -649:2:3078 -650:2:3079 -651:2:3083 -652:2:3087 -653:2:3088 -654:2:3092 -655:2:3100 -656:2:3101 -657:2:3105 -658:2:3109 -659:2:3110 -660:2:3105 -661:2:3106 -662:2:3114 -663:0:4654 -664:2:2941 -665:0:4654 -666:2:3122 -667:2:3123 -668:2:3124 -669:0:4654 -670:2:2941 -671:0:4654 -672:2:3132 -673:0:4654 -674:2:2941 -675:0:4654 -676:2:3135 -677:2:3136 -678:2:3140 -679:2:3141 -680:2:3149 -681:2:3150 -682:2:3154 -683:2:3155 -684:2:3163 -685:2:3168 -686:2:3169 -687:2:3181 -688:2:3182 -689:2:3186 -690:2:3187 -691:2:3181 -692:2:3182 -693:2:3186 -694:2:3187 -695:2:3195 -696:2:3200 -697:2:3201 -698:2:3212 -699:2:3213 -700:2:3214 -701:2:3225 -702:2:3230 -703:2:3231 -704:2:3242 -705:2:3243 -706:2:3244 -707:2:3242 -708:2:3243 -709:2:3244 -710:2:3255 -711:2:3262 -712:0:4654 -713:2:2941 -714:0:4654 -715:2:3266 -716:2:3267 -717:2:3268 -718:2:3280 -719:2:3281 -720:2:3285 -721:2:3286 -722:2:3294 -723:2:3299 -724:2:3303 -725:2:3304 -726:2:3312 -727:2:3313 -728:2:3317 -729:2:3318 -730:2:3312 -731:2:3313 -732:2:3317 -733:2:3318 -734:2:3326 -735:2:3331 -736:2:3332 -737:2:3343 -738:2:3344 -739:2:3345 -740:2:3356 -741:2:3361 -742:2:3362 -743:2:3373 -744:2:3374 -745:2:3375 -746:2:3373 -747:2:3374 -748:2:3375 -749:2:3386 -750:2:3397 -751:2:3398 -752:0:4654 -753:2:2941 -754:0:4654 -755:2:3405 -756:2:3406 -757:2:3410 -758:2:3411 -759:2:3419 -760:2:3420 -761:2:3424 -762:2:3425 -763:2:3433 -764:2:3438 -765:2:3442 -766:2:3443 -767:2:3451 -768:2:3452 -769:2:3456 -770:2:3457 -771:2:3451 -772:2:3452 -773:2:3456 -774:2:3457 -775:2:3465 -776:2:3470 -777:2:3471 -778:2:3482 -779:2:3483 -780:2:3484 -781:2:3495 -782:2:3500 -783:2:3501 -784:2:3512 -785:2:3513 -786:2:3514 -787:2:3512 -788:2:3513 -789:2:3514 -790:2:3525 -791:0:4654 -792:2:2941 -793:0:4654 -794:2:3665 -795:2:3666 -796:2:3670 -797:2:3671 -798:2:3679 -799:2:3680 -800:2:3684 -801:2:3685 -802:2:3693 -803:2:3698 -804:2:3702 -805:2:3703 -806:2:3711 -807:2:3712 -808:2:3716 -809:2:3717 -810:2:3711 -811:2:3712 -812:2:3716 -813:2:3717 -814:2:3725 -815:2:3730 -816:2:3731 -817:2:3742 -818:2:3743 -819:2:3744 -820:2:3755 -821:2:3760 -822:2:3761 -823:2:3772 -824:2:3773 -825:2:3774 -826:2:3772 -827:2:3773 -828:2:3774 -829:2:3785 -830:2:3795 -831:2:3796 -832:0:4654 -833:2:2941 -834:0:4654 -835:2:3805 -836:2:3806 -837:0:4654 -838:2:2941 -839:0:4654 -840:2:3534 -841:2:3535 -842:2:3539 -843:2:3540 -844:2:3548 -845:2:3549 -846:2:3553 -847:2:3554 -848:2:3562 -849:2:3567 -850:2:3571 -851:2:3572 -852:2:3580 -853:2:3581 -854:2:3582 -855:2:3580 -856:2:3581 -857:2:3585 -858:2:3586 -859:2:3594 -860:2:3599 -861:2:3600 -862:2:3611 -863:2:3612 -864:2:3613 -865:2:3624 -866:2:3629 -867:2:3630 -868:2:3641 -869:2:3642 -870:2:3643 -871:2:3641 -872:2:3642 -873:2:3643 -874:2:3654 -875:2:3661 -876:0:4654 -877:2:2941 -878:0:4654 -879:2:3810 -880:0:4654 -881:2:3818 -882:0:4654 -883:2:3819 -884:0:4654 -885:2:3824 -886:0:4654 -887:1:29 -888:0:4654 -889:2:3825 -890:0:4654 -891:1:35 -892:0:4654 -893:2:3824 -894:0:4654 -895:1:36 -896:0:4654 -897:2:3825 -898:0:4654 -899:1:37 -900:0:4654 -901:2:3824 -902:0:4654 -903:1:38 -904:0:4654 -905:2:3825 -906:0:4654 -907:1:39 -908:0:4654 -909:2:3824 -910:0:4654 -911:1:40 -912:0:4654 -913:2:3825 -914:0:4654 -915:1:41 -916:0:4654 -917:2:3824 -918:0:4654 -919:1:42 -920:0:4654 -921:2:3825 -922:0:4654 -923:1:43 -924:0:4654 -925:2:3824 -926:0:4654 -927:1:44 -928:0:4654 -929:2:3825 -930:0:4654 -931:1:45 -932:0:4654 -933:2:3824 -934:0:4654 -935:1:46 -936:0:4654 -937:2:3825 -938:0:4654 -939:1:47 -940:0:4654 -941:2:3824 -942:0:4654 -943:1:48 -944:0:4654 -945:2:3825 -946:0:4654 -947:1:149 -948:0:4654 -949:2:3824 -950:0:4654 -951:1:151 -952:0:4654 -953:2:3825 -954:0:4654 -955:1:50 -956:0:4654 -957:2:3824 -958:0:4654 -959:1:157 -960:1:158 -961:1:162 -962:1:163 -963:1:171 -964:1:172 -965:1:176 -966:1:177 -967:1:185 -968:1:190 -969:1:194 -970:1:195 -971:1:203 -972:1:204 -973:1:208 -974:1:209 -975:1:203 -976:1:204 -977:1:208 -978:1:209 -979:1:217 -980:1:222 -981:1:223 -982:1:234 -983:1:235 -984:1:236 -985:1:247 -986:1:259 -987:1:260 -988:1:264 -989:1:265 -990:1:266 -991:1:264 -992:1:265 -993:1:266 -994:1:277 -995:0:4654 -996:2:3825 -997:0:4654 -998:1:46 -999:0:4654 -1000:2:3824 -1001:0:4654 -1002:1:47 -1003:0:4654 -1004:2:3825 -1005:0:4654 -1006:1:48 -1007:0:4654 -1008:2:3824 -1009:0:4654 -1010:1:149 -1011:0:4654 -1012:2:3825 -1013:0:4654 -1014:1:151 -1015:0:4654 -1016:2:3824 -1017:0:4654 -1018:1:50 -1019:0:4654 -1020:2:3825 -1021:0:4654 -1022:1:286 -1023:1:287 -1024:0:4654 -1025:2:3824 -1026:0:4654 -1027:1:46 -1028:0:4654 -1029:2:3825 -1030:0:4654 -1031:1:47 -1032:0:4654 -1033:2:3824 -1034:0:4654 -1035:1:48 -1036:0:4654 -1037:2:3825 -1038:0:4654 -1039:1:149 -1040:0:4654 -1041:2:3824 -1042:0:4654 -1043:1:151 -1044:0:4654 -1045:2:3825 -1046:0:4654 -1047:1:50 -1048:0:4654 -1049:2:3824 -1050:0:4654 -1051:1:293 -1052:1:294 -1053:1:298 -1054:1:299 -1055:1:307 -1056:1:308 -1057:1:312 -1058:1:313 -1059:1:321 -1060:1:326 -1061:1:330 -1062:1:331 -1063:1:339 -1064:1:340 -1065:1:344 -1066:1:345 -1067:1:339 -1068:1:340 -1069:1:344 -1070:1:345 -1071:1:353 -1072:1:358 -1073:1:359 -1074:1:370 -1075:1:371 -1076:1:372 -1077:1:383 -1078:1:395 -1079:1:396 -1080:1:400 -1081:1:401 -1082:1:402 -1083:1:400 -1084:1:401 -1085:1:402 -1086:1:413 -1087:0:4654 -1088:2:3825 -1089:0:4654 -1090:1:46 -1091:0:4654 -1092:2:3824 -1093:0:4654 -1094:1:47 -1095:0:4654 -1096:2:3825 -1097:0:4654 -1098:1:48 -1099:0:4654 -1100:2:3824 -1101:0:4654 -1102:1:149 -1103:0:4654 -1104:2:3825 -1105:0:4654 -1106:1:151 -1107:0:4654 -1108:2:3824 -1109:0:4654 -1110:1:50 -1111:0:4654 -1112:2:3825 -1113:0:4654 -1114:1:422 -1115:1:423 -1116:1:427 -1117:1:428 -1118:1:436 -1119:1:437 -1120:1:441 -1121:1:442 -1122:1:450 -1123:1:455 -1124:1:459 -1125:1:460 -1126:1:468 -1127:1:469 -1128:1:473 -1129:1:474 -1130:1:468 -1131:1:469 -1132:1:473 -1133:1:474 -1134:1:482 -1135:1:487 -1136:1:488 -1137:1:499 -1138:1:500 -1139:1:501 -1140:1:512 -1141:1:524 -1142:1:525 -1143:1:529 -1144:1:530 -1145:1:531 -1146:1:529 -1147:1:530 -1148:1:531 -1149:1:542 -1150:1:549 -1151:0:4654 -1152:2:3824 -1153:0:4654 -1154:1:46 -1155:0:4654 -1156:2:3825 -1157:0:4654 -1158:1:47 -1159:0:4654 -1160:2:3824 -1161:0:4654 -1162:1:48 -1163:0:4654 -1164:2:3825 -1165:0:4654 -1166:1:149 -1167:0:4654 -1168:2:3824 -1169:0:4654 -1170:1:151 -1171:0:4654 -1172:2:3825 -1173:0:4654 -1174:1:50 -1175:0:4654 -1176:2:3824 -1177:0:4654 -1178:1:687 -1179:1:688 -1180:1:692 -1181:1:693 -1182:1:701 -1183:1:702 -1184:1:703 -1185:1:715 -1186:1:720 -1187:1:724 -1188:1:725 -1189:1:733 -1190:1:734 -1191:1:738 -1192:1:739 -1193:1:733 -1194:1:734 -1195:1:738 -1196:1:739 -1197:1:747 -1198:1:752 -1199:1:753 -1200:1:764 -1201:1:765 -1202:1:766 -1203:1:777 -1204:1:789 -1205:1:790 -1206:1:794 -1207:1:795 -1208:1:796 -1209:1:794 -1210:1:795 -1211:1:796 -1212:1:807 -1213:0:4654 -1214:2:3825 -1215:0:4654 -1216:1:46 -1217:0:4654 -1218:2:3824 -1219:0:4654 -1220:1:47 -1221:0:4654 -1222:2:3825 -1223:0:4654 -1224:1:48 -1225:0:4654 -1226:2:3824 -1227:0:4654 -1228:1:149 -1229:0:4654 -1230:2:3825 -1231:0:4654 -1232:1:151 -1233:0:4654 -1234:2:3824 -1235:0:4654 -1236:1:50 -1237:0:4654 -1238:2:3825 -1239:0:4654 -1240:1:816 -1241:1:819 -1242:1:820 -1243:0:4654 -1244:2:3824 -1245:0:4654 -1246:1:46 -1247:0:4654 -1248:2:3825 -1249:0:4654 -1250:1:47 -1251:0:4654 -1252:2:3824 -1253:0:4654 -1254:1:48 -1255:0:4654 -1256:2:3825 -1257:0:4654 -1258:1:149 -1259:0:4654 -1260:2:3824 -1261:0:4654 -1262:1:151 -1263:0:4654 -1264:2:3825 -1265:0:4654 -1266:1:50 -1267:0:4654 -1268:2:3824 -1269:0:4654 -1270:1:823 -1271:1:824 -1272:1:828 -1273:1:829 -1274:1:837 -1275:1:838 -1276:1:842 -1277:1:843 -1278:1:851 -1279:1:856 -1280:1:860 -1281:1:861 -1282:1:869 -1283:1:870 -1284:1:874 -1285:1:875 -1286:1:869 -1287:1:870 -1288:1:874 -1289:1:875 -1290:1:883 -1291:1:888 -1292:1:889 -1293:1:900 -1294:1:901 -1295:1:902 -1296:1:913 -1297:1:925 -1298:1:926 -1299:1:930 -1300:1:931 -1301:1:932 -1302:1:930 -1303:1:931 -1304:1:932 -1305:1:943 -1306:0:4654 -1307:2:3825 -1308:0:4654 -1309:1:46 -1310:0:4654 -1311:2:3824 -1312:0:4654 -1313:1:47 -1314:0:4654 -1315:2:3825 -1316:0:4654 -1317:1:48 -1318:0:4654 -1319:2:3824 -1320:0:4654 -1321:1:149 -1322:0:4654 -1323:2:3825 -1324:0:4654 -1325:1:151 -1326:0:4654 -1327:2:3824 -1328:0:4654 -1329:1:50 -1330:0:4654 -1331:2:3825 -1332:0:4654 -1333:1:1083 -1334:1:1084 -1335:1:1088 -1336:1:1089 -1337:1:1097 -1338:1:1098 -1339:1:1102 -1340:1:1103 -1341:1:1111 -1342:1:1116 -1343:1:1120 -1344:1:1121 -1345:1:1129 -1346:1:1130 -1347:1:1134 -1348:1:1135 -1349:1:1129 -1350:1:1130 -1351:1:1134 -1352:1:1135 -1353:1:1143 -1354:1:1148 -1355:1:1149 -1356:1:1160 -1357:1:1161 -1358:1:1162 -1359:1:1173 -1360:1:1185 -1361:1:1186 -1362:1:1190 -1363:1:1191 -1364:1:1192 -1365:1:1190 -1366:1:1191 -1367:1:1192 -1368:1:1203 -1369:1:1210 -1370:1:1214 -1371:0:4654 -1372:2:3824 -1373:0:4654 -1374:1:46 -1375:0:4654 -1376:2:3825 -1377:0:4654 -1378:1:47 -1379:0:4654 -1380:2:3824 -1381:0:4654 -1382:1:48 -1383:0:4654 -1384:2:3825 -1385:0:4654 -1386:1:149 -1387:0:4654 -1388:2:3824 -1389:0:4654 -1390:1:151 -1391:0:4654 -1392:2:3825 -1393:0:4654 -1394:1:50 -1395:0:4654 -1396:2:3824 -1397:0:4654 -1398:1:1215 -1399:1:1216 -1400:1:1220 -1401:1:1221 -1402:1:1229 -1403:1:1230 -1404:1:1231 -1405:1:1243 -1406:1:1248 -1407:1:1252 -1408:1:1253 -1409:1:1261 -1410:1:1262 -1411:1:1266 -1412:1:1267 -1413:1:1261 -1414:1:1262 -1415:1:1266 -1416:1:1267 -1417:1:1275 -1418:1:1280 -1419:1:1281 -1420:1:1292 -1421:1:1293 -1422:1:1294 -1423:1:1305 -1424:1:1317 -1425:1:1318 -1426:1:1322 -1427:1:1323 -1428:1:1324 -1429:1:1322 -1430:1:1323 -1431:1:1324 -1432:1:1335 -1433:0:4654 -1434:2:3825 -1435:0:4654 -1436:1:46 -1437:0:4654 -1438:2:3824 -1439:0:4654 -1440:1:47 -1441:0:4654 -1442:2:3825 -1443:0:4654 -1444:1:48 -1445:0:4654 -1446:2:3824 -1447:0:4654 -1448:1:149 -1449:0:4654 -1450:2:3825 -1451:0:4654 -1452:1:151 -1453:0:4654 -1454:2:3824 -1455:0:4654 -1456:1:50 -1457:0:4654 -1458:2:3825 -1459:0:4654 -1460:1:1344 -1461:0:4654 -1462:2:3824 -1463:0:4654 -1464:1:2808 -1465:1:2815 -1466:1:2816 -1467:1:2823 -1468:1:2828 -1469:1:2835 -1470:1:2836 -1471:1:2835 -1472:1:2836 -1473:1:2843 -1474:1:2847 -1475:0:4654 -1476:2:3825 -1477:0:4654 -1478:1:1346 -1479:1:1347 -1480:0:4652 -1481:2:3824 -1482:0:4658 -1483:1:2492 diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_rmb.define b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_rmb.log b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_rmb.log deleted file mode 100644 index 91e8666..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_rmb.log +++ /dev/null @@ -1,540 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_rmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1362) -Depth= 8300 States= 1e+06 Transitions= 1.86e+08 Memory= 513.029 t= 280 R= 4e+03 -Depth= 10044 States= 2e+06 Transitions= 3.84e+08 Memory= 559.221 t= 594 R= 3e+03 -Depth= 10044 States= 3e+06 Transitions= 6.04e+08 Memory= 605.803 t= 964 R= 3e+03 -pan: resizing hashtable to -w22.. done -Depth= 10044 States= 4e+06 Transitions= 8.01e+08 Memory= 682.920 t= 1.27e+03 R= 3e+03 -Depth= 10044 States= 5e+06 Transitions= 9.95e+08 Memory= 728.721 t= 1.57e+03 R= 3e+03 -Depth= 10044 States= 6e+06 Transitions= 1.26e+09 Memory= 775.010 t= 1.99e+03 R= 3e+03 -Depth= 10044 States= 7e+06 Transitions= 1.79e+09 Memory= 821.592 t= 2.89e+03 R= 2e+03 -Depth= 10044 States= 8e+06 Transitions= 2.16e+09 Memory= 867.979 t= 3.5e+03 R= 2e+03 -Depth= 10044 States= 9e+06 Transitions= 2.51e+09 Memory= 914.072 t= 4.1e+03 R= 2e+03 -pan: resizing hashtable to -w24.. done -Depth= 10044 States= 1e+07 Transitions= 2.87e+09 Memory= 1085.334 t= 4.67e+03 R= 2e+03 -Depth= 10044 States= 1.1e+07 Transitions= 3.27e+09 Memory= 1132.404 t= 5.29e+03 R= 2e+03 -Depth= 10044 States= 1.2e+07 Transitions= 3.66e+09 Memory= 1179.377 t= 5.91e+03 R= 2e+03 -pan: claim violated! (at depth 1680) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 80 byte, depth reached 10044, errors: 1 - 12387044 states, stored -3.7683983e+09 states, matched -3.7807853e+09 transitions (= stored+matched) -2.0718621e+10 atomic steps -hash conflicts: 2.2091218e+09 (resolved) - -Stats on memory usage (in Megabytes): - 1370.332 equivalent memory usage for states (stored*(State-vector + overhead)) - 612.258 actual memory usage for states (compression: 44.68%) - state-vector as stored = 16 byte + 36 byte overhead - 128.000 memory used for hash table (-w24) - 457.764 memory used for DFS stack (-m10000000) - 1197.736 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 166228 1420 961 2 2 ] -unreached in proctype urcu_reader - line 894, "pan.___", state 12, "((i<1))" - line 894, "pan.___", state 12, "((i>=1))" - line 268, "pan.___", state 57, "cache_dirty_urcu_gp_ctr = 0" - line 276, "pan.___", state 79, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 88, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 104, "(1)" - line 249, "pan.___", state 112, "(1)" - line 253, "pan.___", state 124, "(1)" - line 257, "pan.___", state 132, "(1)" - line 407, "pan.___", state 158, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 190, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 204, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 223, "(1)" - line 434, "pan.___", state 253, "(1)" - line 438, "pan.___", state 266, "(1)" - line 687, "pan.___", state 287, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 407, "pan.___", state 294, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 326, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 340, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 359, "(1)" - line 434, "pan.___", state 389, "(1)" - line 438, "pan.___", state 402, "(1)" - line 407, "pan.___", state 423, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 455, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 469, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 488, "(1)" - line 434, "pan.___", state 518, "(1)" - line 438, "pan.___", state 531, "(1)" - line 407, "pan.___", state 554, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 556, "(1)" - line 407, "pan.___", state 557, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 557, "else" - line 407, "pan.___", state 560, "(1)" - line 411, "pan.___", state 568, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 570, "(1)" - line 411, "pan.___", state 571, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 571, "else" - line 411, "pan.___", state 574, "(1)" - line 411, "pan.___", state 575, "(1)" - line 411, "pan.___", state 575, "(1)" - line 409, "pan.___", state 580, "((i<1))" - line 409, "pan.___", state 580, "((i>=1))" - line 416, "pan.___", state 586, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 588, "(1)" - line 416, "pan.___", state 589, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 589, "else" - line 416, "pan.___", state 592, "(1)" - line 416, "pan.___", state 593, "(1)" - line 416, "pan.___", state 593, "(1)" - line 420, "pan.___", state 600, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 602, "(1)" - line 420, "pan.___", state 603, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 603, "else" - line 420, "pan.___", state 606, "(1)" - line 420, "pan.___", state 607, "(1)" - line 420, "pan.___", state 607, "(1)" - line 418, "pan.___", state 612, "((i<2))" - line 418, "pan.___", state 612, "((i>=2))" - line 425, "pan.___", state 619, "(1)" - line 425, "pan.___", state 620, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 620, "else" - line 425, "pan.___", state 623, "(1)" - line 425, "pan.___", state 624, "(1)" - line 425, "pan.___", state 624, "(1)" - line 429, "pan.___", state 632, "(1)" - line 429, "pan.___", state 633, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 633, "else" - line 429, "pan.___", state 636, "(1)" - line 429, "pan.___", state 637, "(1)" - line 429, "pan.___", state 637, "(1)" - line 427, "pan.___", state 642, "((i<1))" - line 427, "pan.___", state 642, "((i>=1))" - line 434, "pan.___", state 649, "(1)" - line 434, "pan.___", state 650, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 650, "else" - line 434, "pan.___", state 653, "(1)" - line 434, "pan.___", state 654, "(1)" - line 434, "pan.___", state 654, "(1)" - line 438, "pan.___", state 662, "(1)" - line 438, "pan.___", state 663, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 663, "else" - line 438, "pan.___", state 666, "(1)" - line 438, "pan.___", state 667, "(1)" - line 438, "pan.___", state 667, "(1)" - line 436, "pan.___", state 672, "((i<2))" - line 436, "pan.___", state 672, "((i>=2))" - line 446, "pan.___", state 676, "(1)" - line 446, "pan.___", state 676, "(1)" - line 687, "pan.___", state 679, "cached_urcu_active_readers = (tmp+1)" - line 687, "pan.___", state 680, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 687, "pan.___", state 681, "(1)" - line 407, "pan.___", state 688, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 720, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 734, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 753, "(1)" - line 434, "pan.___", state 783, "(1)" - line 438, "pan.___", state 796, "(1)" - line 407, "pan.___", state 824, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 856, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 870, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 889, "(1)" - line 434, "pan.___", state 919, "(1)" - line 438, "pan.___", state 932, "(1)" - line 407, "pan.___", state 953, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 955, "(1)" - line 407, "pan.___", state 956, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 956, "else" - line 407, "pan.___", state 959, "(1)" - line 411, "pan.___", state 967, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 969, "(1)" - line 411, "pan.___", state 970, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 970, "else" - line 411, "pan.___", state 973, "(1)" - line 411, "pan.___", state 974, "(1)" - line 411, "pan.___", state 974, "(1)" - line 409, "pan.___", state 979, "((i<1))" - line 409, "pan.___", state 979, "((i>=1))" - line 416, "pan.___", state 985, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 987, "(1)" - line 416, "pan.___", state 988, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 988, "else" - line 416, "pan.___", state 991, "(1)" - line 416, "pan.___", state 992, "(1)" - line 416, "pan.___", state 992, "(1)" - line 420, "pan.___", state 999, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 1001, "(1)" - line 420, "pan.___", state 1002, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 1002, "else" - line 420, "pan.___", state 1005, "(1)" - line 420, "pan.___", state 1006, "(1)" - line 420, "pan.___", state 1006, "(1)" - line 418, "pan.___", state 1011, "((i<2))" - line 418, "pan.___", state 1011, "((i>=2))" - line 425, "pan.___", state 1018, "(1)" - line 425, "pan.___", state 1019, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 1019, "else" - line 425, "pan.___", state 1022, "(1)" - line 425, "pan.___", state 1023, "(1)" - line 425, "pan.___", state 1023, "(1)" - line 429, "pan.___", state 1031, "(1)" - line 429, "pan.___", state 1032, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 1032, "else" - line 429, "pan.___", state 1035, "(1)" - line 429, "pan.___", state 1036, "(1)" - line 429, "pan.___", state 1036, "(1)" - line 427, "pan.___", state 1041, "((i<1))" - line 427, "pan.___", state 1041, "((i>=1))" - line 434, "pan.___", state 1048, "(1)" - line 434, "pan.___", state 1049, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 1049, "else" - line 434, "pan.___", state 1052, "(1)" - line 434, "pan.___", state 1053, "(1)" - line 434, "pan.___", state 1053, "(1)" - line 438, "pan.___", state 1061, "(1)" - line 438, "pan.___", state 1062, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 1062, "else" - line 438, "pan.___", state 1065, "(1)" - line 438, "pan.___", state 1066, "(1)" - line 438, "pan.___", state 1066, "(1)" - line 436, "pan.___", state 1071, "((i<2))" - line 436, "pan.___", state 1071, "((i>=2))" - line 446, "pan.___", state 1075, "(1)" - line 446, "pan.___", state 1075, "(1)" - line 695, "pan.___", state 1079, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 407, "pan.___", state 1084, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1116, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1130, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1149, "(1)" - line 434, "pan.___", state 1179, "(1)" - line 438, "pan.___", state 1192, "(1)" - line 407, "pan.___", state 1216, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1248, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1262, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1281, "(1)" - line 434, "pan.___", state 1311, "(1)" - line 438, "pan.___", state 1324, "(1)" - line 407, "pan.___", state 1349, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1381, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1395, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1414, "(1)" - line 434, "pan.___", state 1444, "(1)" - line 438, "pan.___", state 1457, "(1)" - line 407, "pan.___", state 1478, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1510, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1524, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1543, "(1)" - line 434, "pan.___", state 1573, "(1)" - line 438, "pan.___", state 1586, "(1)" - line 407, "pan.___", state 1612, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1644, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1658, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1677, "(1)" - line 434, "pan.___", state 1707, "(1)" - line 438, "pan.___", state 1720, "(1)" - line 407, "pan.___", state 1741, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1773, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1787, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1806, "(1)" - line 434, "pan.___", state 1836, "(1)" - line 438, "pan.___", state 1849, "(1)" - line 407, "pan.___", state 1873, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1905, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1919, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1938, "(1)" - line 434, "pan.___", state 1968, "(1)" - line 438, "pan.___", state 1981, "(1)" - line 734, "pan.___", state 2002, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 407, "pan.___", state 2009, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2041, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2055, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2074, "(1)" - line 434, "pan.___", state 2104, "(1)" - line 438, "pan.___", state 2117, "(1)" - line 407, "pan.___", state 2138, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2170, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2184, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2203, "(1)" - line 434, "pan.___", state 2233, "(1)" - line 438, "pan.___", state 2246, "(1)" - line 407, "pan.___", state 2269, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 2271, "(1)" - line 407, "pan.___", state 2272, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 2272, "else" - line 407, "pan.___", state 2275, "(1)" - line 411, "pan.___", state 2283, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 2285, "(1)" - line 411, "pan.___", state 2286, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 2286, "else" - line 411, "pan.___", state 2289, "(1)" - line 411, "pan.___", state 2290, "(1)" - line 411, "pan.___", state 2290, "(1)" - line 409, "pan.___", state 2295, "((i<1))" - line 409, "pan.___", state 2295, "((i>=1))" - line 416, "pan.___", state 2301, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 2303, "(1)" - line 416, "pan.___", state 2304, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 2304, "else" - line 416, "pan.___", state 2307, "(1)" - line 416, "pan.___", state 2308, "(1)" - line 416, "pan.___", state 2308, "(1)" - line 420, "pan.___", state 2315, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 2317, "(1)" - line 420, "pan.___", state 2318, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 2318, "else" - line 420, "pan.___", state 2321, "(1)" - line 420, "pan.___", state 2322, "(1)" - line 420, "pan.___", state 2322, "(1)" - line 418, "pan.___", state 2327, "((i<2))" - line 418, "pan.___", state 2327, "((i>=2))" - line 425, "pan.___", state 2334, "(1)" - line 425, "pan.___", state 2335, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 2335, "else" - line 425, "pan.___", state 2338, "(1)" - line 425, "pan.___", state 2339, "(1)" - line 425, "pan.___", state 2339, "(1)" - line 429, "pan.___", state 2347, "(1)" - line 429, "pan.___", state 2348, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 2348, "else" - line 429, "pan.___", state 2351, "(1)" - line 429, "pan.___", state 2352, "(1)" - line 429, "pan.___", state 2352, "(1)" - line 427, "pan.___", state 2357, "((i<1))" - line 427, "pan.___", state 2357, "((i>=1))" - line 434, "pan.___", state 2364, "(1)" - line 434, "pan.___", state 2365, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 2365, "else" - line 434, "pan.___", state 2368, "(1)" - line 434, "pan.___", state 2369, "(1)" - line 434, "pan.___", state 2369, "(1)" - line 438, "pan.___", state 2377, "(1)" - line 438, "pan.___", state 2378, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 2378, "else" - line 438, "pan.___", state 2381, "(1)" - line 438, "pan.___", state 2382, "(1)" - line 438, "pan.___", state 2382, "(1)" - line 436, "pan.___", state 2387, "((i<2))" - line 436, "pan.___", state 2387, "((i>=2))" - line 446, "pan.___", state 2391, "(1)" - line 446, "pan.___", state 2391, "(1)" - line 734, "pan.___", state 2394, "cached_urcu_active_readers = (tmp+1)" - line 734, "pan.___", state 2395, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 734, "pan.___", state 2396, "(1)" - line 407, "pan.___", state 2403, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2435, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2449, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2468, "(1)" - line 434, "pan.___", state 2498, "(1)" - line 438, "pan.___", state 2511, "(1)" - line 407, "pan.___", state 2538, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2570, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2584, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2603, "(1)" - line 434, "pan.___", state 2633, "(1)" - line 438, "pan.___", state 2646, "(1)" - line 407, "pan.___", state 2667, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2699, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2713, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2732, "(1)" - line 434, "pan.___", state 2762, "(1)" - line 438, "pan.___", state 2775, "(1)" - line 407, "pan.___", state 2808, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2840, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2854, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2873, "(1)" - line 434, "pan.___", state 2903, "(1)" - line 438, "pan.___", state 2916, "(1)" - line 407, "pan.___", state 2935, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2967, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2981, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 3000, "(1)" - line 434, "pan.___", state 3030, "(1)" - line 438, "pan.___", state 3043, "(1)" - line 929, "pan.___", state 3064, "-end-" - (252 of 3064 states) -unreached in proctype urcu_writer - line 1018, "pan.___", state 12, "((i<1))" - line 1018, "pan.___", state 12, "((i>=1))" - line 407, "pan.___", state 45, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 51, "(1)" - line 411, "pan.___", state 59, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 65, "(1)" - line 411, "pan.___", state 66, "(1)" - line 411, "pan.___", state 66, "(1)" - line 409, "pan.___", state 71, "((i<1))" - line 409, "pan.___", state 71, "((i>=1))" - line 416, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 83, "(1)" - line 416, "pan.___", state 84, "(1)" - line 416, "pan.___", state 84, "(1)" - line 420, "pan.___", state 97, "(1)" - line 420, "pan.___", state 98, "(1)" - line 420, "pan.___", state 98, "(1)" - line 418, "pan.___", state 103, "((i<2))" - line 418, "pan.___", state 103, "((i>=2))" - line 425, "pan.___", state 110, "(1)" - line 425, "pan.___", state 111, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 111, "else" - line 425, "pan.___", state 114, "(1)" - line 425, "pan.___", state 115, "(1)" - line 425, "pan.___", state 115, "(1)" - line 429, "pan.___", state 123, "(1)" - line 429, "pan.___", state 124, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 124, "else" - line 429, "pan.___", state 127, "(1)" - line 429, "pan.___", state 128, "(1)" - line 429, "pan.___", state 128, "(1)" - line 427, "pan.___", state 133, "((i<1))" - line 427, "pan.___", state 133, "((i>=1))" - line 434, "pan.___", state 140, "(1)" - line 434, "pan.___", state 141, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 141, "else" - line 434, "pan.___", state 144, "(1)" - line 434, "pan.___", state 145, "(1)" - line 434, "pan.___", state 145, "(1)" - line 438, "pan.___", state 153, "(1)" - line 438, "pan.___", state 154, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 154, "else" - line 438, "pan.___", state 157, "(1)" - line 438, "pan.___", state 158, "(1)" - line 438, "pan.___", state 158, "(1)" - line 436, "pan.___", state 163, "((i<2))" - line 436, "pan.___", state 163, "((i>=2))" - line 446, "pan.___", state 167, "(1)" - line 446, "pan.___", state 167, "(1)" - line 268, "pan.___", state 176, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 185, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 198, "cache_dirty_rcu_ptr = 0" - line 407, "pan.___", state 238, "cache_dirty_urcu_gp_ctr = 0" - line 411, "pan.___", state 252, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 270, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 284, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 303, "(1)" - line 429, "pan.___", state 316, "(1)" - line 434, "pan.___", state 333, "(1)" - line 438, "pan.___", state 346, "(1)" - line 411, "pan.___", state 383, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 401, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 415, "cache_dirty_rcu_data[i] = 0" - line 429, "pan.___", state 447, "(1)" - line 434, "pan.___", state 464, "(1)" - line 438, "pan.___", state 477, "(1)" - line 411, "pan.___", state 522, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 540, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 554, "cache_dirty_rcu_data[i] = 0" - line 429, "pan.___", state 586, "(1)" - line 434, "pan.___", state 603, "(1)" - line 438, "pan.___", state 616, "(1)" - line 411, "pan.___", state 651, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 669, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 683, "cache_dirty_rcu_data[i] = 0" - line 429, "pan.___", state 715, "(1)" - line 434, "pan.___", state 732, "(1)" - line 438, "pan.___", state 745, "(1)" - line 411, "pan.___", state 782, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 800, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 814, "cache_dirty_rcu_data[i] = 0" - line 429, "pan.___", state 846, "(1)" - line 434, "pan.___", state 863, "(1)" - line 438, "pan.___", state 876, "(1)" - line 268, "pan.___", state 931, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 940, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 955, "(1)" - line 280, "pan.___", state 962, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 978, "(1)" - line 249, "pan.___", state 986, "(1)" - line 253, "pan.___", state 998, "(1)" - line 257, "pan.___", state 1006, "(1)" - line 268, "pan.___", state 1037, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1046, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1059, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1068, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1084, "(1)" - line 249, "pan.___", state 1092, "(1)" - line 253, "pan.___", state 1104, "(1)" - line 257, "pan.___", state 1112, "(1)" - line 272, "pan.___", state 1138, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1151, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1160, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1176, "(1)" - line 249, "pan.___", state 1184, "(1)" - line 253, "pan.___", state 1196, "(1)" - line 257, "pan.___", state 1204, "(1)" - line 268, "pan.___", state 1235, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1244, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1257, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1266, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1282, "(1)" - line 249, "pan.___", state 1290, "(1)" - line 253, "pan.___", state 1302, "(1)" - line 257, "pan.___", state 1310, "(1)" - line 272, "pan.___", state 1336, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1349, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1358, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1374, "(1)" - line 249, "pan.___", state 1382, "(1)" - line 253, "pan.___", state 1394, "(1)" - line 257, "pan.___", state 1402, "(1)" - line 268, "pan.___", state 1433, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1442, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1455, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1464, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1480, "(1)" - line 249, "pan.___", state 1488, "(1)" - line 253, "pan.___", state 1500, "(1)" - line 257, "pan.___", state 1508, "(1)" - line 272, "pan.___", state 1534, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1547, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1556, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1572, "(1)" - line 249, "pan.___", state 1580, "(1)" - line 253, "pan.___", state 1592, "(1)" - line 257, "pan.___", state 1600, "(1)" - line 268, "pan.___", state 1631, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1640, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1653, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1662, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1678, "(1)" - line 249, "pan.___", state 1686, "(1)" - line 253, "pan.___", state 1698, "(1)" - line 257, "pan.___", state 1706, "(1)" - line 1304, "pan.___", state 1722, "-end-" - (129 of 1722 states) -unreached in proctype :init: - line 1319, "pan.___", state 13, "((i<1))" - line 1319, "pan.___", state 13, "((i>=1))" - (1 of 28 states) -unreached in proctype :never: - line 1367, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 6.09e+03 seconds -pan: rate 2033.9606 states/second -pan: avg transition delay 1.6108e-06 usec -cp .input.spin urcu_free_no_rmb.spin.input -cp .input.spin.trail urcu_free_no_rmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-ipi' diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_rmb.spin.input b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_rmb.spin.input deleted file mode 100644 index cf50dff..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_rmb.spin.input +++ /dev/null @@ -1,1340 +0,0 @@ -#define NO_RMB - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_rmb.spin.input.trail b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_rmb.spin.input.trail deleted file mode 100644 index d5ed67a..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_rmb.spin.input.trail +++ /dev/null @@ -1,1683 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:4816 -2:2:3064 -3:2:3069 -4:2:3073 -5:2:3081 -6:2:3085 -7:2:3089 -8:0:4816 -9:1:0 -10:1:5 -11:1:9 -12:1:17 -13:1:21 -14:1:25 -15:0:4816 -16:3:4786 -17:3:4789 -18:3:4796 -19:3:4803 -20:3:4806 -21:3:4810 -22:3:4811 -23:0:4816 -24:3:4813 -25:0:4816 -26:2:3093 -27:0:4816 -28:2:3099 -29:0:4816 -30:2:3100 -31:0:4816 -32:2:3102 -33:0:4816 -34:2:3103 -35:0:4816 -36:2:3104 -37:2:3105 -38:2:3109 -39:2:3110 -40:2:3118 -41:2:3119 -42:2:3123 -43:2:3124 -44:2:3132 -45:2:3137 -46:2:3141 -47:2:3142 -48:2:3150 -49:2:3151 -50:2:3155 -51:2:3156 -52:2:3150 -53:2:3151 -54:2:3155 -55:2:3156 -56:2:3164 -57:2:3169 -58:2:3170 -59:2:3181 -60:2:3182 -61:2:3183 -62:2:3194 -63:2:3199 -64:2:3200 -65:2:3211 -66:2:3212 -67:2:3213 -68:2:3211 -69:2:3212 -70:2:3213 -71:2:3224 -72:2:3232 -73:0:4816 -74:2:3103 -75:0:4816 -76:2:3236 -77:2:3240 -78:2:3241 -79:2:3245 -80:2:3249 -81:2:3250 -82:2:3254 -83:2:3262 -84:2:3263 -85:2:3267 -86:2:3271 -87:2:3272 -88:2:3267 -89:2:3268 -90:2:3276 -91:0:4816 -92:2:3103 -93:0:4816 -94:2:3284 -95:2:3285 -96:2:3286 -97:0:4816 -98:2:3103 -99:0:4816 -100:2:3291 -101:0:4816 -102:2:3995 -103:2:3996 -104:2:4000 -105:2:4004 -106:2:4005 -107:2:4009 -108:2:4014 -109:2:4022 -110:2:4026 -111:2:4027 -112:2:4022 -113:2:4026 -114:2:4027 -115:2:4031 -116:2:4038 -117:2:4045 -118:2:4046 -119:2:4053 -120:2:4058 -121:2:4065 -122:2:4066 -123:2:4065 -124:2:4066 -125:2:4073 -126:2:4077 -127:0:4816 -128:2:4082 -129:0:4816 -130:2:4083 -131:0:4816 -132:2:4084 -133:0:4816 -134:2:4085 -135:0:4816 -136:1:29 -137:0:4816 -138:2:4086 -139:0:4816 -140:1:35 -141:0:4816 -142:1:36 -143:0:4816 -144:2:4085 -145:0:4816 -146:1:37 -147:0:4816 -148:2:4086 -149:0:4816 -150:1:38 -151:0:4816 -152:2:4085 -153:0:4816 -154:1:39 -155:0:4816 -156:2:4086 -157:0:4816 -158:1:40 -159:0:4816 -160:2:4085 -161:0:4816 -162:1:41 -163:0:4816 -164:2:4086 -165:0:4816 -166:1:42 -167:0:4816 -168:1:43 -169:0:4816 -170:2:4085 -171:0:4816 -172:1:44 -173:0:4816 -174:2:4086 -175:0:4816 -176:1:53 -177:0:4816 -178:2:4085 -179:0:4816 -180:1:57 -181:1:58 -182:1:62 -183:1:66 -184:1:67 -185:1:71 -186:1:79 -187:1:80 -188:1:84 -189:1:88 -190:1:89 -191:1:84 -192:1:88 -193:1:89 -194:1:93 -195:1:100 -196:1:107 -197:1:108 -198:1:115 -199:1:120 -200:1:127 -201:1:128 -202:1:127 -203:1:128 -204:1:135 -205:1:139 -206:0:4816 -207:2:4086 -208:0:4816 -209:1:144 -210:0:4816 -211:2:4087 -212:0:4816 -213:2:4092 -214:0:4816 -215:2:4093 -216:0:4816 -217:2:4101 -218:2:4102 -219:2:4106 -220:2:4110 -221:2:4111 -222:2:4115 -223:2:4123 -224:2:4124 -225:2:4128 -226:2:4132 -227:2:4133 -228:2:4128 -229:2:4132 -230:2:4133 -231:2:4137 -232:2:4144 -233:2:4151 -234:2:4152 -235:2:4159 -236:2:4164 -237:2:4171 -238:2:4172 -239:2:4171 -240:2:4172 -241:2:4179 -242:2:4183 -243:0:4816 -244:2:3293 -245:2:3976 -246:0:4816 -247:2:3103 -248:0:4816 -249:2:3294 -250:0:4816 -251:2:3103 -252:0:4816 -253:2:3297 -254:2:3298 -255:2:3302 -256:2:3303 -257:2:3311 -258:2:3312 -259:2:3316 -260:2:3317 -261:2:3325 -262:2:3330 -263:2:3334 -264:2:3335 -265:2:3343 -266:2:3344 -267:2:3348 -268:2:3349 -269:2:3343 -270:2:3344 -271:2:3348 -272:2:3349 -273:2:3357 -274:2:3362 -275:2:3363 -276:2:3374 -277:2:3375 -278:2:3376 -279:2:3387 -280:2:3392 -281:2:3393 -282:2:3404 -283:2:3405 -284:2:3406 -285:2:3404 -286:2:3405 -287:2:3406 -288:2:3417 -289:2:3424 -290:0:4816 -291:2:3103 -292:0:4816 -293:2:3428 -294:2:3429 -295:2:3430 -296:2:3442 -297:2:3443 -298:2:3447 -299:2:3448 -300:2:3456 -301:2:3461 -302:2:3465 -303:2:3466 -304:2:3474 -305:2:3475 -306:2:3479 -307:2:3480 -308:2:3474 -309:2:3475 -310:2:3479 -311:2:3480 -312:2:3488 -313:2:3493 -314:2:3494 -315:2:3505 -316:2:3506 -317:2:3507 -318:2:3518 -319:2:3523 -320:2:3524 -321:2:3535 -322:2:3536 -323:2:3537 -324:2:3535 -325:2:3536 -326:2:3537 -327:2:3548 -328:2:3559 -329:2:3560 -330:0:4816 -331:2:3103 -332:0:4816 -333:2:3567 -334:2:3568 -335:2:3572 -336:2:3573 -337:2:3581 -338:2:3582 -339:2:3586 -340:2:3587 -341:2:3595 -342:2:3600 -343:2:3604 -344:2:3605 -345:2:3613 -346:2:3614 -347:2:3618 -348:2:3619 -349:2:3613 -350:2:3614 -351:2:3618 -352:2:3619 -353:2:3627 -354:2:3632 -355:2:3633 -356:2:3644 -357:2:3645 -358:2:3646 -359:2:3657 -360:2:3662 -361:2:3663 -362:2:3674 -363:2:3675 -364:2:3676 -365:2:3674 -366:2:3675 -367:2:3676 -368:2:3687 -369:0:4816 -370:2:3103 -371:0:4816 -372:2:3696 -373:2:3697 -374:2:3701 -375:2:3702 -376:2:3710 -377:2:3711 -378:2:3715 -379:2:3716 -380:2:3724 -381:2:3729 -382:2:3733 -383:2:3734 -384:2:3742 -385:2:3743 -386:2:3747 -387:2:3748 -388:2:3742 -389:2:3743 -390:2:3747 -391:2:3748 -392:2:3756 -393:2:3761 -394:2:3762 -395:2:3773 -396:2:3774 -397:2:3775 -398:2:3786 -399:2:3791 -400:2:3792 -401:2:3803 -402:2:3804 -403:2:3805 -404:2:3803 -405:2:3804 -406:2:3805 -407:2:3816 -408:2:3823 -409:0:4816 -410:2:3103 -411:0:4816 -412:2:3827 -413:2:3828 -414:2:3829 -415:2:3841 -416:2:3842 -417:2:3846 -418:2:3847 -419:2:3855 -420:2:3860 -421:2:3864 -422:2:3865 -423:2:3873 -424:2:3874 -425:2:3878 -426:2:3879 -427:2:3873 -428:2:3874 -429:2:3878 -430:2:3879 -431:2:3887 -432:2:3892 -433:2:3893 -434:2:3904 -435:2:3905 -436:2:3906 -437:2:3917 -438:2:3922 -439:2:3923 -440:2:3934 -441:2:3935 -442:2:3936 -443:2:3934 -444:2:3935 -445:2:3936 -446:2:3947 -447:2:3957 -448:2:3958 -449:0:4816 -450:2:3103 -451:0:4816 -452:2:3964 -453:0:4816 -454:2:4589 -455:2:4590 -456:2:4594 -457:2:4598 -458:2:4599 -459:2:4603 -460:2:4611 -461:2:4612 -462:2:4616 -463:2:4620 -464:2:4621 -465:2:4616 -466:2:4620 -467:2:4621 -468:2:4625 -469:2:4632 -470:2:4639 -471:2:4640 -472:2:4647 -473:2:4652 -474:2:4659 -475:2:4660 -476:2:4659 -477:2:4660 -478:2:4667 -479:2:4671 -480:0:4816 -481:2:4676 -482:0:4816 -483:2:4677 -484:0:4816 -485:2:4678 -486:0:4816 -487:2:4679 -488:0:4816 -489:1:53 -490:0:4816 -491:2:4680 -492:0:4816 -493:1:57 -494:1:58 -495:1:62 -496:1:66 -497:1:67 -498:1:71 -499:1:79 -500:1:80 -501:1:84 -502:1:88 -503:1:89 -504:1:84 -505:1:88 -506:1:89 -507:1:93 -508:1:100 -509:1:107 -510:1:108 -511:1:115 -512:1:120 -513:1:127 -514:1:128 -515:1:127 -516:1:128 -517:1:135 -518:1:139 -519:0:4816 -520:2:4679 -521:0:4816 -522:1:144 -523:0:4816 -524:2:4680 -525:0:4816 -526:2:4681 -527:0:4816 -528:2:4686 -529:0:4816 -530:2:4687 -531:0:4816 -532:2:4695 -533:2:4696 -534:2:4700 -535:2:4704 -536:2:4705 -537:2:4709 -538:2:4717 -539:2:4718 -540:2:4722 -541:2:4726 -542:2:4727 -543:2:4722 -544:2:4726 -545:2:4727 -546:2:4731 -547:2:4738 -548:2:4745 -549:2:4746 -550:2:4753 -551:2:4758 -552:2:4765 -553:2:4766 -554:2:4765 -555:2:4766 -556:2:4773 -557:2:4777 -558:0:4816 -559:2:3966 -560:2:3976 -561:0:4816 -562:2:3103 -563:0:4816 -564:2:3967 -565:2:3968 -566:0:4816 -567:2:3103 -568:0:4816 -569:2:3972 -570:0:4816 -571:2:3980 -572:0:4816 -573:2:3100 -574:0:4816 -575:2:3102 -576:0:4816 -577:2:3103 -578:0:4816 -579:2:3104 -580:2:3105 -581:2:3109 -582:2:3110 -583:2:3118 -584:2:3119 -585:2:3123 -586:2:3124 -587:2:3132 -588:2:3137 -589:2:3141 -590:2:3142 -591:2:3150 -592:2:3151 -593:2:3152 -594:2:3150 -595:2:3151 -596:2:3155 -597:2:3156 -598:2:3164 -599:2:3169 -600:2:3170 -601:2:3181 -602:2:3182 -603:2:3183 -604:2:3194 -605:2:3199 -606:2:3200 -607:2:3211 -608:2:3212 -609:2:3213 -610:2:3211 -611:2:3212 -612:2:3213 -613:2:3224 -614:2:3232 -615:0:4816 -616:2:3103 -617:0:4816 -618:2:3236 -619:2:3240 -620:2:3241 -621:2:3245 -622:2:3249 -623:2:3250 -624:2:3254 -625:2:3262 -626:2:3263 -627:2:3267 -628:2:3268 -629:2:3267 -630:2:3271 -631:2:3272 -632:2:3276 -633:0:4816 -634:2:3103 -635:0:4816 -636:2:3284 -637:2:3285 -638:2:3286 -639:0:4816 -640:2:3103 -641:0:4816 -642:2:3291 -643:0:4816 -644:2:3995 -645:2:3996 -646:2:4000 -647:2:4004 -648:2:4005 -649:2:4009 -650:2:4014 -651:2:4022 -652:2:4026 -653:2:4027 -654:2:4022 -655:2:4026 -656:2:4027 -657:2:4031 -658:2:4038 -659:2:4045 -660:2:4046 -661:2:4053 -662:2:4058 -663:2:4065 -664:2:4066 -665:2:4065 -666:2:4066 -667:2:4073 -668:2:4077 -669:0:4816 -670:2:4082 -671:0:4816 -672:2:4083 -673:0:4816 -674:2:4084 -675:0:4816 -676:2:4085 -677:0:4816 -678:1:53 -679:0:4816 -680:2:4086 -681:0:4816 -682:1:57 -683:1:58 -684:1:62 -685:1:66 -686:1:67 -687:1:71 -688:1:79 -689:1:80 -690:1:84 -691:1:88 -692:1:89 -693:1:84 -694:1:88 -695:1:89 -696:1:93 -697:1:100 -698:1:107 -699:1:108 -700:1:115 -701:1:120 -702:1:127 -703:1:128 -704:1:127 -705:1:128 -706:1:135 -707:1:139 -708:0:4816 -709:2:4085 -710:0:4816 -711:1:144 -712:0:4816 -713:2:4086 -714:0:4816 -715:2:4087 -716:0:4816 -717:2:4092 -718:0:4816 -719:2:4093 -720:0:4816 -721:2:4101 -722:2:4102 -723:2:4106 -724:2:4110 -725:2:4111 -726:2:4115 -727:2:4123 -728:2:4124 -729:2:4128 -730:2:4132 -731:2:4133 -732:2:4128 -733:2:4132 -734:2:4133 -735:2:4137 -736:2:4144 -737:2:4151 -738:2:4152 -739:2:4159 -740:2:4164 -741:2:4171 -742:2:4172 -743:2:4171 -744:2:4172 -745:2:4179 -746:2:4183 -747:0:4816 -748:2:3293 -749:2:3976 -750:0:4816 -751:2:3103 -752:0:4816 -753:2:3294 -754:0:4816 -755:2:3103 -756:0:4816 -757:2:3297 -758:2:3298 -759:2:3302 -760:2:3303 -761:2:3311 -762:2:3312 -763:2:3316 -764:2:3317 -765:2:3325 -766:2:3330 -767:2:3334 -768:2:3335 -769:2:3343 -770:2:3344 -771:2:3348 -772:2:3349 -773:2:3343 -774:2:3344 -775:2:3348 -776:2:3349 -777:2:3357 -778:2:3362 -779:2:3363 -780:2:3374 -781:2:3375 -782:2:3376 -783:2:3387 -784:2:3392 -785:2:3393 -786:2:3404 -787:2:3405 -788:2:3406 -789:2:3404 -790:2:3405 -791:2:3406 -792:2:3417 -793:2:3424 -794:0:4816 -795:2:3103 -796:0:4816 -797:2:3428 -798:2:3429 -799:2:3430 -800:2:3442 -801:2:3443 -802:2:3447 -803:2:3448 -804:2:3456 -805:2:3461 -806:2:3465 -807:2:3466 -808:2:3474 -809:2:3475 -810:2:3479 -811:2:3480 -812:2:3474 -813:2:3475 -814:2:3479 -815:2:3480 -816:2:3488 -817:2:3493 -818:2:3494 -819:2:3505 -820:2:3506 -821:2:3507 -822:2:3518 -823:2:3523 -824:2:3524 -825:2:3535 -826:2:3536 -827:2:3537 -828:2:3535 -829:2:3536 -830:2:3537 -831:2:3548 -832:2:3559 -833:2:3560 -834:0:4816 -835:2:3103 -836:0:4816 -837:2:3567 -838:2:3568 -839:2:3572 -840:2:3573 -841:2:3581 -842:2:3582 -843:2:3586 -844:2:3587 -845:2:3595 -846:2:3600 -847:2:3604 -848:2:3605 -849:2:3613 -850:2:3614 -851:2:3618 -852:2:3619 -853:2:3613 -854:2:3614 -855:2:3618 -856:2:3619 -857:2:3627 -858:2:3632 -859:2:3633 -860:2:3644 -861:2:3645 -862:2:3646 -863:2:3657 -864:2:3662 -865:2:3663 -866:2:3674 -867:2:3675 -868:2:3676 -869:2:3674 -870:2:3675 -871:2:3676 -872:2:3687 -873:0:4816 -874:2:3103 -875:0:4816 -876:2:3696 -877:2:3697 -878:2:3701 -879:2:3702 -880:2:3710 -881:2:3711 -882:2:3715 -883:2:3716 -884:2:3724 -885:2:3729 -886:2:3733 -887:2:3734 -888:2:3742 -889:2:3743 -890:2:3747 -891:2:3748 -892:2:3742 -893:2:3743 -894:2:3747 -895:2:3748 -896:2:3756 -897:2:3761 -898:2:3762 -899:2:3773 -900:2:3774 -901:2:3775 -902:2:3786 -903:2:3791 -904:2:3792 -905:2:3803 -906:2:3804 -907:2:3805 -908:2:3803 -909:2:3804 -910:2:3805 -911:2:3816 -912:2:3823 -913:0:4816 -914:2:3103 -915:0:4816 -916:2:3827 -917:2:3828 -918:2:3829 -919:2:3841 -920:2:3842 -921:2:3846 -922:2:3847 -923:2:3855 -924:2:3860 -925:2:3864 -926:2:3865 -927:2:3873 -928:2:3874 -929:2:3878 -930:2:3879 -931:2:3873 -932:2:3874 -933:2:3878 -934:2:3879 -935:2:3887 -936:2:3892 -937:2:3893 -938:2:3904 -939:2:3905 -940:2:3906 -941:2:3917 -942:2:3922 -943:2:3923 -944:2:3934 -945:2:3935 -946:2:3936 -947:2:3934 -948:2:3935 -949:2:3936 -950:2:3947 -951:2:3957 -952:2:3958 -953:0:4816 -954:2:3103 -955:0:4816 -956:2:3964 -957:0:4816 -958:2:4589 -959:2:4590 -960:2:4594 -961:2:4598 -962:2:4599 -963:2:4603 -964:2:4611 -965:2:4612 -966:2:4616 -967:2:4620 -968:2:4621 -969:2:4616 -970:2:4620 -971:2:4621 -972:2:4625 -973:2:4632 -974:2:4639 -975:2:4640 -976:2:4647 -977:2:4652 -978:2:4659 -979:2:4660 -980:2:4659 -981:2:4660 -982:2:4667 -983:2:4671 -984:0:4816 -985:2:4676 -986:0:4816 -987:2:4677 -988:0:4816 -989:2:4678 -990:0:4816 -991:2:4679 -992:0:4816 -993:1:53 -994:0:4816 -995:2:4680 -996:0:4816 -997:1:57 -998:1:58 -999:1:62 -1000:1:66 -1001:1:67 -1002:1:71 -1003:1:79 -1004:1:80 -1005:1:84 -1006:1:88 -1007:1:89 -1008:1:84 -1009:1:88 -1010:1:89 -1011:1:93 -1012:1:100 -1013:1:107 -1014:1:108 -1015:1:115 -1016:1:120 -1017:1:127 -1018:1:128 -1019:1:127 -1020:1:128 -1021:1:135 -1022:1:139 -1023:0:4816 -1024:2:4679 -1025:0:4816 -1026:1:144 -1027:0:4816 -1028:2:4680 -1029:0:4816 -1030:2:4681 -1031:0:4816 -1032:2:4686 -1033:0:4816 -1034:2:4687 -1035:0:4816 -1036:2:4695 -1037:2:4696 -1038:2:4700 -1039:2:4704 -1040:2:4705 -1041:2:4709 -1042:2:4717 -1043:2:4718 -1044:2:4722 -1045:2:4726 -1046:2:4727 -1047:2:4722 -1048:2:4726 -1049:2:4727 -1050:2:4731 -1051:2:4738 -1052:2:4745 -1053:2:4746 -1054:2:4753 -1055:2:4758 -1056:2:4765 -1057:2:4766 -1058:2:4765 -1059:2:4766 -1060:2:4773 -1061:2:4777 -1062:0:4816 -1063:2:3966 -1064:2:3976 -1065:0:4816 -1066:2:3103 -1067:0:4816 -1068:2:3967 -1069:2:3968 -1070:0:4816 -1071:2:3103 -1072:0:4816 -1073:2:3972 -1074:0:4816 -1075:2:3980 -1076:0:4816 -1077:2:3100 -1078:0:4816 -1079:2:3102 -1080:0:4816 -1081:2:3103 -1082:0:4816 -1083:2:3104 -1084:2:3105 -1085:2:3109 -1086:2:3110 -1087:2:3118 -1088:2:3119 -1089:2:3123 -1090:2:3124 -1091:2:3132 -1092:2:3137 -1093:2:3141 -1094:2:3142 -1095:2:3150 -1096:2:3151 -1097:2:3155 -1098:2:3156 -1099:2:3150 -1100:2:3151 -1101:2:3152 -1102:2:3164 -1103:2:3169 -1104:2:3170 -1105:2:3181 -1106:2:3182 -1107:2:3183 -1108:2:3194 -1109:2:3199 -1110:2:3200 -1111:2:3211 -1112:2:3212 -1113:2:3213 -1114:2:3211 -1115:2:3212 -1116:2:3213 -1117:2:3224 -1118:2:3232 -1119:0:4816 -1120:2:3103 -1121:0:4816 -1122:1:145 -1123:0:4816 -1124:1:147 -1125:0:4816 -1126:1:46 -1127:0:4816 -1128:1:153 -1129:1:154 -1130:1:158 -1131:1:159 -1132:1:167 -1133:1:168 -1134:1:172 -1135:1:173 -1136:1:181 -1137:1:186 -1138:1:190 -1139:1:191 -1140:1:199 -1141:1:200 -1142:1:204 -1143:1:205 -1144:1:199 -1145:1:200 -1146:1:204 -1147:1:205 -1148:1:213 -1149:1:218 -1150:1:219 -1151:1:230 -1152:1:231 -1153:1:232 -1154:1:243 -1155:1:248 -1156:1:249 -1157:1:260 -1158:1:261 -1159:1:262 -1160:1:260 -1161:1:261 -1162:1:262 -1163:1:273 -1164:0:4816 -1165:1:42 -1166:0:4816 -1167:1:43 -1168:0:4816 -1169:2:3236 -1170:2:3240 -1171:2:3241 -1172:2:3245 -1173:2:3249 -1174:2:3250 -1175:2:3254 -1176:2:3262 -1177:2:3263 -1178:2:3267 -1179:2:3271 -1180:2:3272 -1181:2:3267 -1182:2:3268 -1183:2:3276 -1184:0:4816 -1185:2:3103 -1186:0:4816 -1187:2:3284 -1188:2:3285 -1189:2:3286 -1190:0:4816 -1191:2:3103 -1192:0:4816 -1193:2:3291 -1194:0:4816 -1195:2:3995 -1196:2:3996 -1197:2:4000 -1198:2:4004 -1199:2:4005 -1200:2:4009 -1201:2:4014 -1202:2:4022 -1203:2:4026 -1204:2:4027 -1205:2:4022 -1206:2:4026 -1207:2:4027 -1208:2:4031 -1209:2:4038 -1210:2:4045 -1211:2:4046 -1212:2:4053 -1213:2:4058 -1214:2:4065 -1215:2:4066 -1216:2:4065 -1217:2:4066 -1218:2:4073 -1219:2:4077 -1220:0:4816 -1221:2:4082 -1222:0:4816 -1223:2:4083 -1224:0:4816 -1225:2:4084 -1226:0:4816 -1227:2:4085 -1228:0:4816 -1229:1:44 -1230:0:4816 -1231:2:4086 -1232:0:4816 -1233:1:145 -1234:0:4816 -1235:1:147 -1236:0:4816 -1237:2:4085 -1238:0:4816 -1239:1:46 -1240:0:4816 -1241:2:4086 -1242:0:4816 -1243:1:282 -1244:1:283 -1245:0:4816 -1246:1:42 -1247:0:4816 -1248:1:43 -1249:0:4816 -1250:2:4085 -1251:0:4816 -1252:1:44 -1253:0:4816 -1254:2:4086 -1255:0:4816 -1256:1:145 -1257:0:4816 -1258:1:147 -1259:0:4816 -1260:2:4085 -1261:0:4816 -1262:1:46 -1263:0:4816 -1264:2:4086 -1265:0:4816 -1266:1:289 -1267:1:290 -1268:1:294 -1269:1:295 -1270:1:303 -1271:1:304 -1272:1:308 -1273:1:309 -1274:1:317 -1275:1:322 -1276:1:326 -1277:1:327 -1278:1:335 -1279:1:336 -1280:1:340 -1281:1:341 -1282:1:335 -1283:1:336 -1284:1:340 -1285:1:341 -1286:1:349 -1287:1:354 -1288:1:355 -1289:1:366 -1290:1:367 -1291:1:368 -1292:1:379 -1293:1:384 -1294:1:385 -1295:1:396 -1296:1:397 -1297:1:398 -1298:1:396 -1299:1:404 -1300:1:405 -1301:1:409 -1302:0:4816 -1303:1:42 -1304:0:4816 -1305:1:43 -1306:0:4816 -1307:2:4085 -1308:0:4816 -1309:1:44 -1310:0:4816 -1311:2:4086 -1312:0:4816 -1313:1:145 -1314:0:4816 -1315:1:147 -1316:0:4816 -1317:2:4085 -1318:0:4816 -1319:1:46 -1320:0:4816 -1321:2:4086 -1322:0:4816 -1323:1:418 -1324:1:419 -1325:1:423 -1326:1:424 -1327:1:432 -1328:1:433 -1329:1:437 -1330:1:438 -1331:1:446 -1332:1:451 -1333:1:455 -1334:1:456 -1335:1:464 -1336:1:465 -1337:1:469 -1338:1:470 -1339:1:464 -1340:1:465 -1341:1:469 -1342:1:470 -1343:1:478 -1344:1:483 -1345:1:484 -1346:1:495 -1347:1:496 -1348:1:497 -1349:1:508 -1350:1:513 -1351:1:514 -1352:1:525 -1353:1:526 -1354:1:527 -1355:1:525 -1356:1:533 -1357:1:534 -1358:1:538 -1359:1:545 -1360:0:4816 -1361:1:42 -1362:0:4816 -1363:1:43 -1364:0:4816 -1365:2:4085 -1366:0:4816 -1367:1:44 -1368:0:4816 -1369:2:4086 -1370:0:4816 -1371:1:145 -1372:0:4816 -1373:1:147 -1374:0:4816 -1375:2:4085 -1376:0:4816 -1377:1:46 -1378:0:4816 -1379:2:4086 -1380:0:4816 -1381:1:683 -1382:1:684 -1383:1:688 -1384:1:689 -1385:1:697 -1386:1:698 -1387:1:699 -1388:1:711 -1389:1:716 -1390:1:720 -1391:1:721 -1392:1:729 -1393:1:730 -1394:1:734 -1395:1:735 -1396:1:729 -1397:1:730 -1398:1:734 -1399:1:735 -1400:1:743 -1401:1:748 -1402:1:749 -1403:1:760 -1404:1:761 -1405:1:762 -1406:1:773 -1407:1:778 -1408:1:779 -1409:1:790 -1410:1:791 -1411:1:792 -1412:1:790 -1413:1:798 -1414:1:799 -1415:1:803 -1416:0:4816 -1417:1:42 -1418:0:4816 -1419:1:43 -1420:0:4816 -1421:2:4085 -1422:0:4816 -1423:1:44 -1424:0:4816 -1425:2:4086 -1426:0:4816 -1427:1:145 -1428:0:4816 -1429:1:147 -1430:0:4816 -1431:2:4085 -1432:0:4816 -1433:1:46 -1434:0:4816 -1435:2:4086 -1436:0:4816 -1437:1:812 -1438:1:815 -1439:1:816 -1440:0:4816 -1441:1:42 -1442:0:4816 -1443:1:43 -1444:0:4816 -1445:2:4085 -1446:0:4816 -1447:1:44 -1448:0:4816 -1449:2:4086 -1450:0:4816 -1451:1:145 -1452:0:4816 -1453:1:147 -1454:0:4816 -1455:2:4085 -1456:0:4816 -1457:1:46 -1458:0:4816 -1459:2:4086 -1460:0:4816 -1461:1:819 -1462:1:820 -1463:1:824 -1464:1:825 -1465:1:833 -1466:1:834 -1467:1:838 -1468:1:839 -1469:1:847 -1470:1:852 -1471:1:856 -1472:1:857 -1473:1:865 -1474:1:866 -1475:1:870 -1476:1:871 -1477:1:865 -1478:1:866 -1479:1:870 -1480:1:871 -1481:1:879 -1482:1:884 -1483:1:885 -1484:1:896 -1485:1:897 -1486:1:898 -1487:1:909 -1488:1:914 -1489:1:915 -1490:1:926 -1491:1:927 -1492:1:928 -1493:1:926 -1494:1:934 -1495:1:935 -1496:1:939 -1497:0:4816 -1498:1:42 -1499:0:4816 -1500:1:43 -1501:0:4816 -1502:2:4085 -1503:0:4816 -1504:1:44 -1505:0:4816 -1506:2:4086 -1507:0:4816 -1508:1:145 -1509:0:4816 -1510:1:147 -1511:0:4816 -1512:2:4085 -1513:0:4816 -1514:1:46 -1515:0:4816 -1516:2:4086 -1517:0:4816 -1518:1:1079 -1519:1:1080 -1520:1:1084 -1521:1:1085 -1522:1:1093 -1523:1:1094 -1524:1:1098 -1525:1:1099 -1526:1:1107 -1527:1:1112 -1528:1:1116 -1529:1:1117 -1530:1:1125 -1531:1:1126 -1532:1:1130 -1533:1:1131 -1534:1:1125 -1535:1:1126 -1536:1:1130 -1537:1:1131 -1538:1:1139 -1539:1:1144 -1540:1:1145 -1541:1:1156 -1542:1:1157 -1543:1:1158 -1544:1:1169 -1545:1:1174 -1546:1:1175 -1547:1:1186 -1548:1:1187 -1549:1:1188 -1550:1:1186 -1551:1:1194 -1552:1:1195 -1553:1:1199 -1554:1:1206 -1555:1:1210 -1556:0:4816 -1557:1:42 -1558:0:4816 -1559:1:43 -1560:0:4816 -1561:2:4085 -1562:0:4816 -1563:1:44 -1564:0:4816 -1565:2:4086 -1566:0:4816 -1567:1:145 -1568:0:4816 -1569:1:147 -1570:0:4816 -1571:2:4085 -1572:0:4816 -1573:1:46 -1574:0:4816 -1575:2:4086 -1576:0:4816 -1577:1:1211 -1578:1:1212 -1579:1:1216 -1580:1:1217 -1581:1:1225 -1582:1:1226 -1583:1:1227 -1584:1:1239 -1585:1:1244 -1586:1:1248 -1587:1:1249 -1588:1:1257 -1589:1:1258 -1590:1:1262 -1591:1:1263 -1592:1:1257 -1593:1:1258 -1594:1:1262 -1595:1:1263 -1596:1:1271 -1597:1:1276 -1598:1:1277 -1599:1:1288 -1600:1:1289 -1601:1:1290 -1602:1:1301 -1603:1:1306 -1604:1:1307 -1605:1:1318 -1606:1:1319 -1607:1:1320 -1608:1:1318 -1609:1:1326 -1610:1:1327 -1611:1:1331 -1612:0:4816 -1613:1:42 -1614:0:4816 -1615:1:43 -1616:0:4816 -1617:2:4085 -1618:0:4816 -1619:1:44 -1620:0:4816 -1621:2:4086 -1622:0:4816 -1623:1:145 -1624:0:4816 -1625:1:147 -1626:0:4816 -1627:2:4085 -1628:0:4816 -1629:1:46 -1630:0:4816 -1631:2:4086 -1632:0:4816 -1633:1:1340 -1634:0:4816 -1635:2:4085 -1636:0:4816 -1637:1:2804 -1638:1:2808 -1639:1:2809 -1640:1:2817 -1641:1:2818 -1642:1:2822 -1643:1:2823 -1644:1:2831 -1645:1:2836 -1646:1:2840 -1647:1:2841 -1648:1:2849 -1649:1:2850 -1650:1:2854 -1651:1:2855 -1652:1:2849 -1653:1:2850 -1654:1:2854 -1655:1:2855 -1656:1:2863 -1657:1:2868 -1658:1:2869 -1659:1:2880 -1660:1:2881 -1661:1:2882 -1662:1:2893 -1663:1:2898 -1664:1:2899 -1665:1:2910 -1666:1:2911 -1667:1:2912 -1668:1:2910 -1669:1:2918 -1670:1:2919 -1671:1:2923 -1672:1:2927 -1673:0:4816 -1674:2:4086 -1675:0:4816 -1676:1:1342 -1677:1:1343 -1678:0:4814 -1679:1:42 -1680:0:4820 -1681:1:2421 diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_wmb.define b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_wmb.log b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_wmb.log deleted file mode 100644 index 7da250d..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_wmb.log +++ /dev/null @@ -1,580 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_wmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1362) -Depth= 8002 States= 1e+06 Transitions= 1.77e+08 Memory= 513.029 t= 264 R= 4e+03 -Depth= 9746 States= 2e+06 Transitions= 3.71e+08 Memory= 559.318 t= 570 R= 4e+03 -Depth= 9746 States= 3e+06 Transitions= 5.8e+08 Memory= 605.901 t= 916 R= 3e+03 -pan: resizing hashtable to -w22.. done -Depth= 9746 States= 4e+06 Transitions= 7.6e+08 Memory= 682.920 t= 1.19e+03 R= 3e+03 -Depth= 9746 States= 5e+06 Transitions= 9.44e+08 Memory= 728.721 t= 1.47e+03 R= 3e+03 -Depth= 9746 States= 6e+06 Transitions= 1.35e+09 Memory= 775.303 t= 2.12e+03 R= 3e+03 -Depth= 9746 States= 7e+06 Transitions= 1.79e+09 Memory= 821.885 t= 2.84e+03 R= 2e+03 -Depth= 9746 States= 8e+06 Transitions= 2.11e+09 Memory= 868.076 t= 3.35e+03 R= 2e+03 -Depth= 9746 States= 9e+06 Transitions= 2.49e+09 Memory= 914.658 t= 3.99e+03 R= 2e+03 -pan: resizing hashtable to -w24.. done -Depth= 9746 States= 1e+07 Transitions= 2.83e+09 Memory= 1085.529 t= 4.5e+03 R= 2e+03 -Depth= 9746 States= 1.1e+07 Transitions= 3.2e+09 Memory= 1132.795 t= 5.06e+03 R= 2e+03 -Depth= 9746 States= 1.2e+07 Transitions= 3.59e+09 Memory= 1179.670 t= 5.66e+03 R= 2e+03 -Depth= 9746 States= 1.3e+07 Transitions= 3.78e+09 Memory= 1226.447 t= 5.95e+03 R= 2e+03 -Depth= 9746 States= 1.4e+07 Transitions= 3.96e+09 Memory= 1272.346 t= 6.23e+03 R= 2e+03 -Depth= 9746 States= 1.5e+07 Transitions= 4.17e+09 Memory= 1318.440 t= 6.56e+03 R= 2e+03 -Depth= 9746 States= 1.6e+07 Transitions= 4.37e+09 Memory= 1364.338 t= 6.86e+03 R= 2e+03 -Depth= 9746 States= 1.7e+07 Transitions= 4.55e+09 Memory= 1410.139 t= 7.14e+03 R= 2e+03 -Depth= 9746 States= 1.8e+07 Transitions= 4.8e+09 Memory= 1456.135 t= 7.53e+03 R= 2e+03 -Depth= 9746 States= 1.9e+07 Transitions= 5.2e+09 Memory= 1502.326 t= 8.17e+03 R= 2e+03 -Depth= 9746 States= 2e+07 Transitions= 5.67e+09 Memory= 1548.615 t= 8.94e+03 R= 2e+03 -Depth= 9746 States= 2.1e+07 Transitions= 6.01e+09 Memory= 1594.611 t= 9.49e+03 R= 2e+03 -Depth= 9746 States= 2.2e+07 Transitions= 6.42e+09 Memory= 1640.998 t= 1.01e+04 R= 2e+03 -Depth= 9746 States= 2.3e+07 Transitions= 6.67e+09 Memory= 1687.580 t= 1.05e+04 R= 2e+03 -Depth= 9746 States= 2.4e+07 Transitions= 6.96e+09 Memory= 1733.674 t= 1.1e+04 R= 2e+03 -Depth= 9746 States= 2.5e+07 Transitions= 7.2e+09 Memory= 1779.865 t= 1.14e+04 R= 2e+03 -Depth= 9746 States= 2.6e+07 Transitions= 7.61e+09 Memory= 1826.154 t= 1.2e+04 R= 2e+03 -Depth= 9746 States= 2.7e+07 Transitions= 8.36e+09 Memory= 1872.248 t= 1.32e+04 R= 2e+03 -Depth= 9746 States= 2.8e+07 Transitions= 9.08e+09 Memory= 1918.733 t= 1.44e+04 R= 2e+03 -Depth= 9746 States= 2.9e+07 Transitions= 9.48e+09 Memory= 1965.608 t= 1.51e+04 R= 2e+03 -Depth= 9746 States= 3e+07 Transitions= 9.94e+09 Memory= 2012.483 t= 1.58e+04 R= 2e+03 -Depth= 9746 States= 3.1e+07 Transitions= 1.02e+10 Memory= 2058.576 t= 1.62e+04 R= 2e+03 -Depth= 9746 States= 3.2e+07 Transitions= 1.05e+10 Memory= 2104.475 t= 1.67e+04 R= 2e+03 -Depth= 9746 States= 3.3e+07 Transitions= 1.08e+10 Memory= 2150.373 t= 1.72e+04 R= 2e+03 -Depth= 9746 States= 3.4e+07 Transitions= 1.15e+10 Memory= 2196.369 t= 1.84e+04 R= 2e+03 -pan: resizing hashtable to -w26.. done -Depth= 9746 States= 3.5e+07 Transitions= 1.22e+10 Memory= 2738.350 t= 1.96e+04 R= 2e+03 -Depth= 9746 States= 3.6e+07 Transitions= 1.27e+10 Memory= 2784.639 t= 2.03e+04 R= 2e+03 -Depth= 9746 States= 3.7e+07 Transitions= 1.29e+10 Memory= 2831.026 t= 2.07e+04 R= 2e+03 -Depth= 9746 States= 3.8e+07 Transitions= 1.34e+10 Memory= 2877.510 t= 2.14e+04 R= 2e+03 -Depth= 9746 States= 3.9e+07 Transitions= 1.39e+10 Memory= 2923.701 t= 2.21e+04 R= 2e+03 -Depth= 9746 States= 4e+07 Transitions= 1.44e+10 Memory= 2969.697 t= 2.29e+04 R= 2e+03 -Depth= 9746 States= 4.1e+07 Transitions= 1.48e+10 Memory= 3015.889 t= 2.36e+04 R= 2e+03 -Depth= 9746 States= 4.2e+07 Transitions= 1.52e+10 Memory= 3061.787 t= 2.42e+04 R= 2e+03 -Depth= 9746 States= 4.3e+07 Transitions= 1.57e+10 Memory= 3107.979 t= 2.5e+04 R= 2e+03 -Depth= 9746 States= 4.4e+07 Transitions= 1.61e+10 Memory= 3153.779 t= 2.56e+04 R= 2e+03 -Depth= 9746 States= 4.5e+07 Transitions= 1.64e+10 Memory= 3199.873 t= 2.6e+04 R= 2e+03 -Depth= 9746 States= 4.6e+07 Transitions= 1.68e+10 Memory= 3245.967 t= 2.66e+04 R= 2e+03 -Depth= 9746 States= 4.7e+07 Transitions= 1.7e+10 Memory= 3291.865 t= 2.7e+04 R= 2e+03 -Depth= 9746 States= 4.8e+07 Transitions= 1.74e+10 Memory= 3338.057 t= 2.75e+04 R= 2e+03 -Depth= 9746 States= 4.9e+07 Transitions= 1.79e+10 Memory= 3384.151 t= 2.83e+04 R= 2e+03 -Depth= 9868 States= 5e+07 Transitions= 1.82e+10 Memory= 3429.951 t= 2.88e+04 R= 2e+03 -Depth= 9912 States= 5.1e+07 Transitions= 1.86e+10 Memory= 3475.752 t= 2.94e+04 R= 2e+03 -Depth= 9912 States= 5.2e+07 Transitions= 1.89e+10 Memory= 3521.553 t= 2.99e+04 R= 2e+03 -Depth= 9912 States= 5.3e+07 Transitions= 1.93e+10 Memory= 3567.256 t= 3.05e+04 R= 2e+03 -Depth= 9912 States= 5.4e+07 Transitions= 1.96e+10 Memory= 3613.154 t= 3.1e+04 R= 2e+03 -Depth= 9912 States= 5.5e+07 Transitions= 2e+10 Memory= 3659.053 t= 3.16e+04 R= 2e+03 -Depth= 9912 States= 5.6e+07 Transitions= 2.03e+10 Memory= 3704.756 t= 3.2e+04 R= 2e+03 -Depth= 9912 States= 5.7e+07 Transitions= 2.06e+10 Memory= 3750.557 t= 3.25e+04 R= 2e+03 -Depth= 9912 States= 5.8e+07 Transitions= 2.1e+10 Memory= 3796.455 t= 3.31e+04 R= 2e+03 -Depth= 9912 States= 5.9e+07 Transitions= 2.13e+10 Memory= 3842.256 t= 3.37e+04 R= 2e+03 -Depth= 9912 States= 6e+07 Transitions= 2.16e+10 Memory= 3888.057 t= 3.42e+04 R= 2e+03 -Depth= 9912 States= 6.1e+07 Transitions= 2.2e+10 Memory= 3933.858 t= 3.47e+04 R= 2e+03 -Depth= 9912 States= 6.2e+07 Transitions= 2.23e+10 Memory= 3979.658 t= 3.52e+04 R= 2e+03 -Depth= 9912 States= 6.3e+07 Transitions= 2.27e+10 Memory= 4025.459 t= 3.58e+04 R= 2e+03 -Depth= 9912 States= 6.4e+07 Transitions= 2.3e+10 Memory= 4071.260 t= 3.63e+04 R= 2e+03 -Depth= 9912 States= 6.5e+07 Transitions= 2.33e+10 Memory= 4116.963 t= 3.69e+04 R= 2e+03 -Depth= 9912 States= 6.6e+07 Transitions= 2.36e+10 Memory= 4162.764 t= 3.73e+04 R= 2e+03 -Depth= 9912 States= 6.7e+07 Transitions= 2.39e+10 Memory= 4208.565 t= 3.78e+04 R= 2e+03 -Depth= 9912 States= 6.8e+07 Transitions= 2.42e+10 Memory= 4254.463 t= 3.83e+04 R= 2e+03 -Depth= 9912 States= 6.9e+07 Transitions= 2.46e+10 Memory= 4300.361 t= 3.88e+04 R= 2e+03 -Depth= 9912 States= 7e+07 Transitions= 2.5e+10 Memory= 4346.553 t= 3.94e+04 R= 2e+03 -Depth= 9912 States= 7.1e+07 Transitions= 2.53e+10 Memory= 4392.354 t= 4e+04 R= 2e+03 -Depth= 9912 States= 7.2e+07 Transitions= 2.58e+10 Memory= 4438.252 t= 4.07e+04 R= 2e+03 -Depth= 9912 States= 7.3e+07 Transitions= 2.61e+10 Memory= 4484.151 t= 4.12e+04 R= 2e+03 -Depth= 9912 States= 7.4e+07 Transitions= 2.66e+10 Memory= 4530.635 t= 4.19e+04 R= 2e+03 -Depth= 9912 States= 7.5e+07 Transitions= 2.69e+10 Memory= 4577.315 t= 4.25e+04 R= 2e+03 -Depth= 9912 States= 7.6e+07 Transitions= 2.74e+10 Memory= 4623.897 t= 4.32e+04 R= 2e+03 -Depth= 9912 States= 7.7e+07 Transitions= 2.78e+10 Memory= 4669.893 t= 4.39e+04 R= 2e+03 -Depth= 9912 States= 7.8e+07 Transitions= 2.82e+10 Memory= 4716.084 t= 4.45e+04 R= 2e+03 -Depth= 9912 States= 7.9e+07 Transitions= 2.85e+10 Memory= 4762.568 t= 4.5e+04 R= 2e+03 -Depth= 9912 States= 8e+07 Transitions= 2.87e+10 Memory= 4808.369 t= 4.52e+04 R= 2e+03 -Depth= 9912 States= 8.1e+07 Transitions= 2.89e+10 Memory= 4854.170 t= 4.56e+04 R= 2e+03 -Depth= 9912 States= 8.2e+07 Transitions= 2.91e+10 Memory= 4899.971 t= 4.59e+04 R= 2e+03 -Depth= 9912 States= 8.3e+07 Transitions= 2.93e+10 Memory= 4945.772 t= 4.61e+04 R= 2e+03 -Depth= 9912 States= 8.4e+07 Transitions= 2.95e+10 Memory= 4991.475 t= 4.64e+04 R= 2e+03 -Depth= 9912 States= 8.5e+07 Transitions= 2.99e+10 Memory= 5037.276 t= 4.71e+04 R= 2e+03 -Depth= 9912 States= 8.6e+07 Transitions= 3.03e+10 Memory= 5083.076 t= 4.78e+04 R= 2e+03 -Depth= 9912 States= 8.7e+07 Transitions= 3.07e+10 Memory= 5128.877 t= 4.83e+04 R= 2e+03 -pan: claim violated! (at depth 1530) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 80 byte, depth reached 9912, errors: 1 - 87915830 states, stored -3.0918075e+10 states, matched -3.100599e+10 transitions (= stored+matched) -1.742054e+11 atomic steps -hash conflicts: 1.5948958e+10 (resolved) - -Stats on memory usage (in Megabytes): - 9725.796 equivalent memory usage for states (stored*(State-vector + overhead)) - 4202.002 actual memory usage for states (compression: 43.20%) - state-vector as stored = 14 byte + 36 byte overhead - 512.000 memory used for hash table (-w26) - 457.764 memory used for DFS stack (-m10000000) - 5170.869 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 517357 4332 4682 2 2 ] -unreached in proctype urcu_reader - line 894, "pan.___", state 12, "((i<1))" - line 894, "pan.___", state 12, "((i>=1))" - line 268, "pan.___", state 57, "cache_dirty_urcu_gp_ctr = 0" - line 276, "pan.___", state 79, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 88, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 104, "(1)" - line 249, "pan.___", state 112, "(1)" - line 253, "pan.___", state 124, "(1)" - line 257, "pan.___", state 132, "(1)" - line 407, "pan.___", state 158, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 190, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 204, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 223, "(1)" - line 434, "pan.___", state 253, "(1)" - line 438, "pan.___", state 266, "(1)" - line 687, "pan.___", state 287, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 407, "pan.___", state 294, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 326, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 340, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 359, "(1)" - line 434, "pan.___", state 389, "(1)" - line 438, "pan.___", state 402, "(1)" - line 407, "pan.___", state 423, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 455, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 469, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 488, "(1)" - line 434, "pan.___", state 518, "(1)" - line 438, "pan.___", state 531, "(1)" - line 407, "pan.___", state 554, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 556, "(1)" - line 407, "pan.___", state 557, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 557, "else" - line 407, "pan.___", state 560, "(1)" - line 411, "pan.___", state 568, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 570, "(1)" - line 411, "pan.___", state 571, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 571, "else" - line 411, "pan.___", state 574, "(1)" - line 411, "pan.___", state 575, "(1)" - line 411, "pan.___", state 575, "(1)" - line 409, "pan.___", state 580, "((i<1))" - line 409, "pan.___", state 580, "((i>=1))" - line 416, "pan.___", state 586, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 588, "(1)" - line 416, "pan.___", state 589, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 589, "else" - line 416, "pan.___", state 592, "(1)" - line 416, "pan.___", state 593, "(1)" - line 416, "pan.___", state 593, "(1)" - line 420, "pan.___", state 600, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 602, "(1)" - line 420, "pan.___", state 603, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 603, "else" - line 420, "pan.___", state 606, "(1)" - line 420, "pan.___", state 607, "(1)" - line 420, "pan.___", state 607, "(1)" - line 418, "pan.___", state 612, "((i<2))" - line 418, "pan.___", state 612, "((i>=2))" - line 425, "pan.___", state 619, "(1)" - line 425, "pan.___", state 620, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 620, "else" - line 425, "pan.___", state 623, "(1)" - line 425, "pan.___", state 624, "(1)" - line 425, "pan.___", state 624, "(1)" - line 429, "pan.___", state 632, "(1)" - line 429, "pan.___", state 633, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 633, "else" - line 429, "pan.___", state 636, "(1)" - line 429, "pan.___", state 637, "(1)" - line 429, "pan.___", state 637, "(1)" - line 427, "pan.___", state 642, "((i<1))" - line 427, "pan.___", state 642, "((i>=1))" - line 434, "pan.___", state 649, "(1)" - line 434, "pan.___", state 650, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 650, "else" - line 434, "pan.___", state 653, "(1)" - line 434, "pan.___", state 654, "(1)" - line 434, "pan.___", state 654, "(1)" - line 438, "pan.___", state 662, "(1)" - line 438, "pan.___", state 663, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 663, "else" - line 438, "pan.___", state 666, "(1)" - line 438, "pan.___", state 667, "(1)" - line 438, "pan.___", state 667, "(1)" - line 436, "pan.___", state 672, "((i<2))" - line 436, "pan.___", state 672, "((i>=2))" - line 446, "pan.___", state 676, "(1)" - line 446, "pan.___", state 676, "(1)" - line 687, "pan.___", state 679, "cached_urcu_active_readers = (tmp+1)" - line 687, "pan.___", state 680, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 687, "pan.___", state 681, "(1)" - line 407, "pan.___", state 688, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 720, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 734, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 753, "(1)" - line 434, "pan.___", state 783, "(1)" - line 438, "pan.___", state 796, "(1)" - line 407, "pan.___", state 824, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 856, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 870, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 889, "(1)" - line 434, "pan.___", state 919, "(1)" - line 438, "pan.___", state 932, "(1)" - line 407, "pan.___", state 953, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 955, "(1)" - line 407, "pan.___", state 956, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 956, "else" - line 407, "pan.___", state 959, "(1)" - line 411, "pan.___", state 967, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 969, "(1)" - line 411, "pan.___", state 970, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 970, "else" - line 411, "pan.___", state 973, "(1)" - line 411, "pan.___", state 974, "(1)" - line 411, "pan.___", state 974, "(1)" - line 409, "pan.___", state 979, "((i<1))" - line 409, "pan.___", state 979, "((i>=1))" - line 416, "pan.___", state 985, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 987, "(1)" - line 416, "pan.___", state 988, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 988, "else" - line 416, "pan.___", state 991, "(1)" - line 416, "pan.___", state 992, "(1)" - line 416, "pan.___", state 992, "(1)" - line 420, "pan.___", state 999, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 1001, "(1)" - line 420, "pan.___", state 1002, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 1002, "else" - line 420, "pan.___", state 1005, "(1)" - line 420, "pan.___", state 1006, "(1)" - line 420, "pan.___", state 1006, "(1)" - line 418, "pan.___", state 1011, "((i<2))" - line 418, "pan.___", state 1011, "((i>=2))" - line 425, "pan.___", state 1018, "(1)" - line 425, "pan.___", state 1019, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 1019, "else" - line 425, "pan.___", state 1022, "(1)" - line 425, "pan.___", state 1023, "(1)" - line 425, "pan.___", state 1023, "(1)" - line 429, "pan.___", state 1031, "(1)" - line 429, "pan.___", state 1032, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 1032, "else" - line 429, "pan.___", state 1035, "(1)" - line 429, "pan.___", state 1036, "(1)" - line 429, "pan.___", state 1036, "(1)" - line 427, "pan.___", state 1041, "((i<1))" - line 427, "pan.___", state 1041, "((i>=1))" - line 434, "pan.___", state 1048, "(1)" - line 434, "pan.___", state 1049, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 1049, "else" - line 434, "pan.___", state 1052, "(1)" - line 434, "pan.___", state 1053, "(1)" - line 434, "pan.___", state 1053, "(1)" - line 438, "pan.___", state 1061, "(1)" - line 438, "pan.___", state 1062, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 1062, "else" - line 438, "pan.___", state 1065, "(1)" - line 438, "pan.___", state 1066, "(1)" - line 438, "pan.___", state 1066, "(1)" - line 436, "pan.___", state 1071, "((i<2))" - line 436, "pan.___", state 1071, "((i>=2))" - line 446, "pan.___", state 1075, "(1)" - line 446, "pan.___", state 1075, "(1)" - line 695, "pan.___", state 1079, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 407, "pan.___", state 1084, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1116, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1130, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1149, "(1)" - line 434, "pan.___", state 1179, "(1)" - line 438, "pan.___", state 1192, "(1)" - line 407, "pan.___", state 1216, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1248, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1262, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1281, "(1)" - line 434, "pan.___", state 1311, "(1)" - line 438, "pan.___", state 1324, "(1)" - line 407, "pan.___", state 1349, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1381, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1395, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1414, "(1)" - line 434, "pan.___", state 1444, "(1)" - line 438, "pan.___", state 1457, "(1)" - line 407, "pan.___", state 1478, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1510, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1524, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1543, "(1)" - line 434, "pan.___", state 1573, "(1)" - line 438, "pan.___", state 1586, "(1)" - line 407, "pan.___", state 1612, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1644, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1658, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1677, "(1)" - line 434, "pan.___", state 1707, "(1)" - line 438, "pan.___", state 1720, "(1)" - line 407, "pan.___", state 1741, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1773, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1787, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1806, "(1)" - line 434, "pan.___", state 1836, "(1)" - line 438, "pan.___", state 1849, "(1)" - line 407, "pan.___", state 1873, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1905, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1919, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1938, "(1)" - line 434, "pan.___", state 1968, "(1)" - line 438, "pan.___", state 1981, "(1)" - line 734, "pan.___", state 2002, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 407, "pan.___", state 2009, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2041, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2055, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2074, "(1)" - line 434, "pan.___", state 2104, "(1)" - line 438, "pan.___", state 2117, "(1)" - line 407, "pan.___", state 2138, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2170, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2184, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2203, "(1)" - line 434, "pan.___", state 2233, "(1)" - line 438, "pan.___", state 2246, "(1)" - line 407, "pan.___", state 2269, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 2271, "(1)" - line 407, "pan.___", state 2272, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 2272, "else" - line 407, "pan.___", state 2275, "(1)" - line 411, "pan.___", state 2283, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 2285, "(1)" - line 411, "pan.___", state 2286, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 2286, "else" - line 411, "pan.___", state 2289, "(1)" - line 411, "pan.___", state 2290, "(1)" - line 411, "pan.___", state 2290, "(1)" - line 409, "pan.___", state 2295, "((i<1))" - line 409, "pan.___", state 2295, "((i>=1))" - line 416, "pan.___", state 2301, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 2303, "(1)" - line 416, "pan.___", state 2304, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 2304, "else" - line 416, "pan.___", state 2307, "(1)" - line 416, "pan.___", state 2308, "(1)" - line 416, "pan.___", state 2308, "(1)" - line 420, "pan.___", state 2315, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 2317, "(1)" - line 420, "pan.___", state 2318, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 2318, "else" - line 420, "pan.___", state 2321, "(1)" - line 420, "pan.___", state 2322, "(1)" - line 420, "pan.___", state 2322, "(1)" - line 418, "pan.___", state 2327, "((i<2))" - line 418, "pan.___", state 2327, "((i>=2))" - line 425, "pan.___", state 2334, "(1)" - line 425, "pan.___", state 2335, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 2335, "else" - line 425, "pan.___", state 2338, "(1)" - line 425, "pan.___", state 2339, "(1)" - line 425, "pan.___", state 2339, "(1)" - line 429, "pan.___", state 2347, "(1)" - line 429, "pan.___", state 2348, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 2348, "else" - line 429, "pan.___", state 2351, "(1)" - line 429, "pan.___", state 2352, "(1)" - line 429, "pan.___", state 2352, "(1)" - line 427, "pan.___", state 2357, "((i<1))" - line 427, "pan.___", state 2357, "((i>=1))" - line 434, "pan.___", state 2364, "(1)" - line 434, "pan.___", state 2365, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 2365, "else" - line 434, "pan.___", state 2368, "(1)" - line 434, "pan.___", state 2369, "(1)" - line 434, "pan.___", state 2369, "(1)" - line 438, "pan.___", state 2377, "(1)" - line 438, "pan.___", state 2378, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 2378, "else" - line 438, "pan.___", state 2381, "(1)" - line 438, "pan.___", state 2382, "(1)" - line 438, "pan.___", state 2382, "(1)" - line 436, "pan.___", state 2387, "((i<2))" - line 436, "pan.___", state 2387, "((i>=2))" - line 446, "pan.___", state 2391, "(1)" - line 446, "pan.___", state 2391, "(1)" - line 734, "pan.___", state 2394, "cached_urcu_active_readers = (tmp+1)" - line 734, "pan.___", state 2395, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 734, "pan.___", state 2396, "(1)" - line 407, "pan.___", state 2403, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2435, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2449, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2468, "(1)" - line 434, "pan.___", state 2498, "(1)" - line 438, "pan.___", state 2511, "(1)" - line 407, "pan.___", state 2538, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2570, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2584, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2603, "(1)" - line 434, "pan.___", state 2633, "(1)" - line 438, "pan.___", state 2646, "(1)" - line 407, "pan.___", state 2667, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2699, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2713, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2732, "(1)" - line 434, "pan.___", state 2762, "(1)" - line 438, "pan.___", state 2775, "(1)" - line 245, "pan.___", state 2808, "(1)" - line 253, "pan.___", state 2828, "(1)" - line 257, "pan.___", state 2836, "(1)" - line 245, "pan.___", state 2851, "(1)" - line 253, "pan.___", state 2871, "(1)" - line 257, "pan.___", state 2879, "(1)" - line 929, "pan.___", state 2896, "-end-" - (246 of 2896 states) -unreached in proctype urcu_writer - line 1018, "pan.___", state 12, "((i<1))" - line 1018, "pan.___", state 12, "((i>=1))" - line 407, "pan.___", state 46, "cache_dirty_urcu_gp_ctr = 0" - line 411, "pan.___", state 60, "cache_dirty_urcu_active_readers = 0" - line 425, "pan.___", state 111, "(1)" - line 429, "pan.___", state 124, "(1)" - line 268, "pan.___", state 177, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 179, "(1)" - line 272, "pan.___", state 186, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 188, "(1)" - line 272, "pan.___", state 189, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 189, "else" - line 270, "pan.___", state 194, "((i<1))" - line 270, "pan.___", state 194, "((i>=1))" - line 276, "pan.___", state 199, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 201, "(1)" - line 276, "pan.___", state 202, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 202, "else" - line 280, "pan.___", state 208, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 210, "(1)" - line 280, "pan.___", state 211, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 211, "else" - line 285, "pan.___", state 220, "(cache_dirty_urcu_gp_ctr)" - line 285, "pan.___", state 220, "else" - line 407, "pan.___", state 239, "cache_dirty_urcu_gp_ctr = 0" - line 411, "pan.___", state 253, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 271, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 285, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 304, "(1)" - line 429, "pan.___", state 317, "(1)" - line 434, "pan.___", state 334, "(1)" - line 438, "pan.___", state 347, "(1)" - line 411, "pan.___", state 384, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 402, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 416, "cache_dirty_rcu_data[i] = 0" - line 429, "pan.___", state 448, "(1)" - line 434, "pan.___", state 465, "(1)" - line 438, "pan.___", state 478, "(1)" - line 411, "pan.___", state 523, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 541, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 555, "cache_dirty_rcu_data[i] = 0" - line 429, "pan.___", state 587, "(1)" - line 434, "pan.___", state 604, "(1)" - line 438, "pan.___", state 617, "(1)" - line 411, "pan.___", state 652, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 670, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 684, "cache_dirty_rcu_data[i] = 0" - line 429, "pan.___", state 716, "(1)" - line 434, "pan.___", state 733, "(1)" - line 438, "pan.___", state 746, "(1)" - line 411, "pan.___", state 783, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 801, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 815, "cache_dirty_rcu_data[i] = 0" - line 429, "pan.___", state 847, "(1)" - line 434, "pan.___", state 864, "(1)" - line 438, "pan.___", state 877, "(1)" - line 268, "pan.___", state 932, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 941, "cache_dirty_urcu_active_readers = 0" - line 245, "pan.___", state 979, "(1)" - line 249, "pan.___", state 987, "(1)" - line 253, "pan.___", state 999, "(1)" - line 257, "pan.___", state 1007, "(1)" - line 268, "pan.___", state 1038, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1047, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1060, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1069, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1085, "(1)" - line 249, "pan.___", state 1093, "(1)" - line 253, "pan.___", state 1105, "(1)" - line 257, "pan.___", state 1113, "(1)" - line 272, "pan.___", state 1139, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1152, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1161, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1177, "(1)" - line 249, "pan.___", state 1185, "(1)" - line 253, "pan.___", state 1197, "(1)" - line 257, "pan.___", state 1205, "(1)" - line 268, "pan.___", state 1236, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1245, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1258, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1267, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1283, "(1)" - line 249, "pan.___", state 1291, "(1)" - line 253, "pan.___", state 1303, "(1)" - line 257, "pan.___", state 1311, "(1)" - line 272, "pan.___", state 1337, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1350, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1359, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1375, "(1)" - line 249, "pan.___", state 1383, "(1)" - line 253, "pan.___", state 1395, "(1)" - line 257, "pan.___", state 1403, "(1)" - line 268, "pan.___", state 1434, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1443, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1456, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1465, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1481, "(1)" - line 249, "pan.___", state 1489, "(1)" - line 253, "pan.___", state 1501, "(1)" - line 257, "pan.___", state 1509, "(1)" - line 272, "pan.___", state 1535, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1548, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1557, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1573, "(1)" - line 249, "pan.___", state 1581, "(1)" - line 253, "pan.___", state 1593, "(1)" - line 257, "pan.___", state 1601, "(1)" - line 268, "pan.___", state 1632, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1641, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1654, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1663, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1679, "(1)" - line 249, "pan.___", state 1687, "(1)" - line 253, "pan.___", state 1699, "(1)" - line 257, "pan.___", state 1707, "(1)" - line 1304, "pan.___", state 1723, "-end-" - (110 of 1723 states) -unreached in proctype :init: - line 1319, "pan.___", state 13, "((i<1))" - line 1319, "pan.___", state 13, "((i>=1))" - (1 of 28 states) -unreached in proctype :never: - line 1367, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 4.88e+04 seconds -pan: rate 1799.8673 states/second -pan: avg transition delay 1.5754e-06 usec -cp .input.spin urcu_free_no_wmb.spin.input -cp .input.spin.trail urcu_free_no_wmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-ipi' diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_wmb.spin.input b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_wmb.spin.input deleted file mode 100644 index 4159c77..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_wmb.spin.input +++ /dev/null @@ -1,1340 +0,0 @@ -#define NO_WMB - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_wmb.spin.input.trail deleted file mode 100644 index f280086..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_no_wmb.spin.input.trail +++ /dev/null @@ -1,1533 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:4649 -2:2:2896 -3:2:2901 -4:2:2905 -5:2:2913 -6:2:2917 -7:2:2921 -8:0:4649 -9:1:0 -10:1:5 -11:1:9 -12:1:17 -13:1:21 -14:1:25 -15:0:4649 -16:3:4619 -17:3:4622 -18:3:4629 -19:3:4636 -20:3:4639 -21:3:4643 -22:3:4644 -23:0:4649 -24:3:4646 -25:0:4649 -26:2:2925 -27:0:4649 -28:2:2931 -29:0:4649 -30:2:2932 -31:0:4649 -32:2:2934 -33:0:4649 -34:2:2935 -35:0:4649 -36:2:2936 -37:0:4649 -38:2:2937 -39:2:2938 -40:2:2942 -41:2:2943 -42:2:2951 -43:2:2952 -44:2:2956 -45:2:2957 -46:2:2965 -47:2:2970 -48:2:2974 -49:2:2975 -50:2:2983 -51:2:2984 -52:2:2988 -53:2:2989 -54:2:2983 -55:2:2984 -56:2:2988 -57:2:2989 -58:2:2997 -59:2:3002 -60:2:3003 -61:2:3014 -62:2:3015 -63:2:3016 -64:2:3027 -65:2:3032 -66:2:3033 -67:2:3044 -68:2:3045 -69:2:3046 -70:2:3044 -71:2:3045 -72:2:3046 -73:2:3057 -74:2:3065 -75:0:4649 -76:2:2936 -77:0:4649 -78:2:3117 -79:2:3118 -80:2:3119 -81:0:4649 -82:2:2936 -83:0:4649 -84:2:3124 -85:0:4649 -86:2:3828 -87:2:3829 -88:2:3833 -89:2:3837 -90:2:3838 -91:2:3842 -92:2:3847 -93:2:3855 -94:2:3859 -95:2:3860 -96:2:3855 -97:2:3856 -98:2:3864 -99:2:3871 -100:2:3878 -101:2:3879 -102:2:3886 -103:2:3891 -104:2:3898 -105:2:3899 -106:2:3898 -107:2:3899 -108:2:3906 -109:2:3910 -110:0:4649 -111:2:3915 -112:0:4649 -113:2:3916 -114:0:4649 -115:2:3917 -116:0:4649 -117:2:3918 -118:0:4649 -119:1:29 -120:0:4649 -121:2:3919 -122:0:4649 -123:1:35 -124:0:4649 -125:1:36 -126:0:4649 -127:2:3918 -128:0:4649 -129:1:37 -130:0:4649 -131:2:3919 -132:0:4649 -133:1:38 -134:0:4649 -135:2:3918 -136:0:4649 -137:1:39 -138:0:4649 -139:2:3919 -140:0:4649 -141:1:40 -142:0:4649 -143:2:3918 -144:0:4649 -145:1:41 -146:0:4649 -147:2:3919 -148:0:4649 -149:1:42 -150:0:4649 -151:1:43 -152:0:4649 -153:2:3918 -154:0:4649 -155:1:44 -156:0:4649 -157:2:3919 -158:0:4649 -159:1:53 -160:0:4649 -161:2:3918 -162:0:4649 -163:1:57 -164:1:58 -165:1:62 -166:1:66 -167:1:67 -168:1:71 -169:1:79 -170:1:80 -171:1:84 -172:1:88 -173:1:89 -174:1:84 -175:1:88 -176:1:89 -177:1:93 -178:1:100 -179:1:107 -180:1:108 -181:1:115 -182:1:120 -183:1:127 -184:1:128 -185:1:127 -186:1:128 -187:1:135 -188:1:139 -189:0:4649 -190:2:3919 -191:0:4649 -192:1:144 -193:0:4649 -194:2:3920 -195:0:4649 -196:2:3925 -197:0:4649 -198:2:3926 -199:0:4649 -200:2:3934 -201:2:3935 -202:2:3939 -203:2:3943 -204:2:3944 -205:2:3948 -206:2:3956 -207:2:3957 -208:2:3961 -209:2:3965 -210:2:3966 -211:2:3961 -212:2:3965 -213:2:3966 -214:2:3970 -215:2:3977 -216:2:3984 -217:2:3985 -218:2:3992 -219:2:3997 -220:2:4004 -221:2:4005 -222:2:4004 -223:2:4005 -224:2:4012 -225:2:4016 -226:0:4649 -227:2:3126 -228:2:3809 -229:0:4649 -230:2:2936 -231:0:4649 -232:2:3127 -233:0:4649 -234:2:2936 -235:0:4649 -236:2:3130 -237:2:3131 -238:2:3135 -239:2:3136 -240:2:3144 -241:2:3145 -242:2:3149 -243:2:3150 -244:2:3158 -245:2:3163 -246:2:3167 -247:2:3168 -248:2:3176 -249:2:3177 -250:2:3181 -251:2:3182 -252:2:3176 -253:2:3177 -254:2:3181 -255:2:3182 -256:2:3190 -257:2:3195 -258:2:3196 -259:2:3207 -260:2:3208 -261:2:3209 -262:2:3220 -263:2:3225 -264:2:3226 -265:2:3237 -266:2:3238 -267:2:3239 -268:2:3237 -269:2:3238 -270:2:3239 -271:2:3250 -272:2:3257 -273:0:4649 -274:2:2936 -275:0:4649 -276:2:3261 -277:2:3262 -278:2:3263 -279:2:3275 -280:2:3276 -281:2:3280 -282:2:3281 -283:2:3289 -284:2:3294 -285:2:3298 -286:2:3299 -287:2:3307 -288:2:3308 -289:2:3312 -290:2:3313 -291:2:3307 -292:2:3308 -293:2:3312 -294:2:3313 -295:2:3321 -296:2:3326 -297:2:3327 -298:2:3338 -299:2:3339 -300:2:3340 -301:2:3351 -302:2:3356 -303:2:3357 -304:2:3368 -305:2:3369 -306:2:3370 -307:2:3368 -308:2:3369 -309:2:3370 -310:2:3381 -311:2:3392 -312:2:3393 -313:0:4649 -314:2:2936 -315:0:4649 -316:2:3400 -317:2:3401 -318:2:3405 -319:2:3406 -320:2:3414 -321:2:3415 -322:2:3419 -323:2:3420 -324:2:3428 -325:2:3433 -326:2:3437 -327:2:3438 -328:2:3446 -329:2:3447 -330:2:3451 -331:2:3452 -332:2:3446 -333:2:3447 -334:2:3451 -335:2:3452 -336:2:3460 -337:2:3465 -338:2:3466 -339:2:3477 -340:2:3478 -341:2:3479 -342:2:3490 -343:2:3495 -344:2:3496 -345:2:3507 -346:2:3508 -347:2:3509 -348:2:3507 -349:2:3508 -350:2:3509 -351:2:3520 -352:0:4649 -353:2:2936 -354:0:4649 -355:2:3529 -356:2:3530 -357:2:3534 -358:2:3535 -359:2:3543 -360:2:3544 -361:2:3548 -362:2:3549 -363:2:3557 -364:2:3562 -365:2:3566 -366:2:3567 -367:2:3575 -368:2:3576 -369:2:3580 -370:2:3581 -371:2:3575 -372:2:3576 -373:2:3580 -374:2:3581 -375:2:3589 -376:2:3594 -377:2:3595 -378:2:3606 -379:2:3607 -380:2:3608 -381:2:3619 -382:2:3624 -383:2:3625 -384:2:3636 -385:2:3637 -386:2:3638 -387:2:3636 -388:2:3637 -389:2:3638 -390:2:3649 -391:2:3656 -392:0:4649 -393:2:2936 -394:0:4649 -395:2:3660 -396:2:3661 -397:2:3662 -398:2:3674 -399:2:3675 -400:2:3679 -401:2:3680 -402:2:3688 -403:2:3693 -404:2:3697 -405:2:3698 -406:2:3706 -407:2:3707 -408:2:3711 -409:2:3712 -410:2:3706 -411:2:3707 -412:2:3711 -413:2:3712 -414:2:3720 -415:2:3725 -416:2:3726 -417:2:3737 -418:2:3738 -419:2:3739 -420:2:3750 -421:2:3755 -422:2:3756 -423:2:3767 -424:2:3768 -425:2:3769 -426:2:3767 -427:2:3768 -428:2:3769 -429:2:3780 -430:2:3790 -431:2:3791 -432:0:4649 -433:2:2936 -434:0:4649 -435:2:3797 -436:0:4649 -437:2:4422 -438:2:4423 -439:2:4427 -440:2:4431 -441:2:4432 -442:2:4436 -443:2:4444 -444:2:4445 -445:2:4449 -446:2:4453 -447:2:4454 -448:2:4449 -449:2:4453 -450:2:4454 -451:2:4458 -452:2:4465 -453:2:4472 -454:2:4473 -455:2:4480 -456:2:4485 -457:2:4492 -458:2:4493 -459:2:4492 -460:2:4493 -461:2:4500 -462:2:4504 -463:0:4649 -464:2:4509 -465:0:4649 -466:2:4510 -467:0:4649 -468:2:4511 -469:0:4649 -470:2:4512 -471:0:4649 -472:1:53 -473:0:4649 -474:2:4513 -475:0:4649 -476:1:57 -477:1:58 -478:1:62 -479:1:66 -480:1:67 -481:1:71 -482:1:79 -483:1:80 -484:1:84 -485:1:88 -486:1:89 -487:1:84 -488:1:88 -489:1:89 -490:1:93 -491:1:100 -492:1:107 -493:1:108 -494:1:115 -495:1:120 -496:1:127 -497:1:128 -498:1:127 -499:1:128 -500:1:135 -501:1:139 -502:0:4649 -503:2:4512 -504:0:4649 -505:1:144 -506:0:4649 -507:2:4513 -508:0:4649 -509:2:4514 -510:0:4649 -511:2:4519 -512:0:4649 -513:2:4520 -514:0:4649 -515:2:4528 -516:2:4529 -517:2:4533 -518:2:4537 -519:2:4538 -520:2:4542 -521:2:4550 -522:2:4551 -523:2:4555 -524:2:4559 -525:2:4560 -526:2:4555 -527:2:4559 -528:2:4560 -529:2:4564 -530:2:4571 -531:2:4578 -532:2:4579 -533:2:4586 -534:2:4591 -535:2:4598 -536:2:4599 -537:2:4598 -538:2:4599 -539:2:4606 -540:2:4610 -541:0:4649 -542:2:3799 -543:2:3809 -544:0:4649 -545:2:2936 -546:0:4649 -547:2:3800 -548:2:3801 -549:0:4649 -550:2:2936 -551:0:4649 -552:2:3805 -553:0:4649 -554:2:3813 -555:0:4649 -556:2:2932 -557:0:4649 -558:2:2934 -559:0:4649 -560:2:2935 -561:0:4649 -562:2:2936 -563:0:4649 -564:2:3117 -565:2:3118 -566:2:3119 -567:0:4649 -568:2:2936 -569:0:4649 -570:2:2937 -571:2:2938 -572:2:2942 -573:2:2943 -574:2:2951 -575:2:2952 -576:2:2956 -577:2:2957 -578:2:2965 -579:2:2970 -580:2:2971 -581:2:2983 -582:2:2984 -583:2:2985 -584:2:2983 -585:2:2984 -586:2:2988 -587:2:2989 -588:2:2997 -589:2:3002 -590:2:3003 -591:2:3014 -592:2:3015 -593:2:3016 -594:2:3027 -595:2:3032 -596:2:3033 -597:2:3044 -598:2:3045 -599:2:3046 -600:2:3044 -601:2:3045 -602:2:3046 -603:2:3057 -604:2:3065 -605:0:4649 -606:2:2936 -607:0:4649 -608:2:3124 -609:0:4649 -610:2:3828 -611:2:3829 -612:2:3833 -613:2:3837 -614:2:3838 -615:2:3842 -616:2:3850 -617:2:3851 -618:2:3855 -619:2:3856 -620:2:3855 -621:2:3859 -622:2:3860 -623:2:3864 -624:2:3871 -625:2:3878 -626:2:3879 -627:2:3886 -628:2:3891 -629:2:3898 -630:2:3899 -631:2:3898 -632:2:3899 -633:2:3906 -634:2:3910 -635:0:4649 -636:2:3915 -637:0:4649 -638:2:3916 -639:0:4649 -640:2:3917 -641:0:4649 -642:2:3918 -643:0:4649 -644:1:53 -645:0:4649 -646:2:3919 -647:0:4649 -648:1:57 -649:1:58 -650:1:62 -651:1:66 -652:1:67 -653:1:71 -654:1:79 -655:1:80 -656:1:84 -657:1:88 -658:1:89 -659:1:84 -660:1:88 -661:1:89 -662:1:93 -663:1:100 -664:1:107 -665:1:108 -666:1:115 -667:1:120 -668:1:127 -669:1:128 -670:1:127 -671:1:128 -672:1:135 -673:1:139 -674:0:4649 -675:2:3918 -676:0:4649 -677:1:144 -678:0:4649 -679:2:3919 -680:0:4649 -681:2:3920 -682:0:4649 -683:2:3925 -684:0:4649 -685:2:3926 -686:0:4649 -687:2:3934 -688:2:3935 -689:2:3939 -690:2:3943 -691:2:3944 -692:2:3948 -693:2:3956 -694:2:3957 -695:2:3961 -696:2:3965 -697:2:3966 -698:2:3961 -699:2:3965 -700:2:3966 -701:2:3970 -702:2:3977 -703:2:3984 -704:2:3985 -705:2:3992 -706:2:3997 -707:2:4004 -708:2:4005 -709:2:4004 -710:2:4005 -711:2:4012 -712:2:4016 -713:0:4649 -714:2:3126 -715:2:3809 -716:0:4649 -717:2:2936 -718:0:4649 -719:2:3127 -720:0:4649 -721:2:2936 -722:0:4649 -723:2:3130 -724:2:3131 -725:2:3135 -726:2:3136 -727:2:3144 -728:2:3145 -729:2:3149 -730:2:3150 -731:2:3158 -732:2:3163 -733:2:3167 -734:2:3168 -735:2:3176 -736:2:3177 -737:2:3181 -738:2:3182 -739:2:3176 -740:2:3177 -741:2:3181 -742:2:3182 -743:2:3190 -744:2:3195 -745:2:3196 -746:2:3207 -747:2:3208 -748:2:3209 -749:2:3220 -750:2:3225 -751:2:3226 -752:2:3237 -753:2:3238 -754:2:3239 -755:2:3237 -756:2:3238 -757:2:3239 -758:2:3250 -759:2:3257 -760:0:4649 -761:2:2936 -762:0:4649 -763:2:3261 -764:2:3262 -765:2:3263 -766:2:3275 -767:2:3276 -768:2:3280 -769:2:3281 -770:2:3289 -771:2:3294 -772:2:3298 -773:2:3299 -774:2:3307 -775:2:3308 -776:2:3312 -777:2:3313 -778:2:3307 -779:2:3308 -780:2:3312 -781:2:3313 -782:2:3321 -783:2:3326 -784:2:3327 -785:2:3338 -786:2:3339 -787:2:3340 -788:2:3351 -789:2:3356 -790:2:3357 -791:2:3368 -792:2:3369 -793:2:3370 -794:2:3368 -795:2:3369 -796:2:3370 -797:2:3381 -798:2:3392 -799:2:3393 -800:0:4649 -801:2:2936 -802:0:4649 -803:2:3400 -804:2:3401 -805:2:3405 -806:2:3406 -807:2:3414 -808:2:3415 -809:2:3419 -810:2:3420 -811:2:3428 -812:2:3433 -813:2:3437 -814:2:3438 -815:2:3446 -816:2:3447 -817:2:3451 -818:2:3452 -819:2:3446 -820:2:3447 -821:2:3451 -822:2:3452 -823:2:3460 -824:2:3465 -825:2:3466 -826:2:3477 -827:2:3478 -828:2:3479 -829:2:3490 -830:2:3495 -831:2:3496 -832:2:3507 -833:2:3508 -834:2:3509 -835:2:3507 -836:2:3508 -837:2:3509 -838:2:3520 -839:0:4649 -840:2:2936 -841:0:4649 -842:2:3529 -843:2:3530 -844:2:3534 -845:2:3535 -846:2:3543 -847:2:3544 -848:2:3548 -849:2:3549 -850:2:3557 -851:2:3562 -852:2:3566 -853:2:3567 -854:2:3575 -855:2:3576 -856:2:3580 -857:2:3581 -858:2:3575 -859:2:3576 -860:2:3580 -861:2:3581 -862:2:3589 -863:2:3594 -864:2:3595 -865:2:3606 -866:2:3607 -867:2:3608 -868:2:3619 -869:2:3624 -870:2:3625 -871:2:3636 -872:2:3637 -873:2:3638 -874:2:3636 -875:2:3637 -876:2:3638 -877:2:3649 -878:2:3656 -879:0:4649 -880:2:2936 -881:0:4649 -882:2:3660 -883:2:3661 -884:2:3662 -885:2:3674 -886:2:3675 -887:2:3679 -888:2:3680 -889:2:3688 -890:2:3693 -891:2:3697 -892:2:3698 -893:2:3706 -894:2:3707 -895:2:3711 -896:2:3712 -897:2:3706 -898:2:3707 -899:2:3711 -900:2:3712 -901:2:3720 -902:2:3725 -903:2:3726 -904:2:3737 -905:2:3738 -906:2:3739 -907:2:3750 -908:2:3755 -909:2:3756 -910:2:3767 -911:2:3768 -912:2:3769 -913:2:3767 -914:2:3768 -915:2:3769 -916:2:3780 -917:2:3790 -918:2:3791 -919:0:4649 -920:2:2936 -921:0:4649 -922:2:3797 -923:0:4649 -924:2:4422 -925:2:4423 -926:2:4427 -927:2:4431 -928:2:4432 -929:2:4436 -930:2:4444 -931:2:4445 -932:2:4449 -933:2:4453 -934:2:4454 -935:2:4449 -936:2:4453 -937:2:4454 -938:2:4458 -939:2:4465 -940:2:4472 -941:2:4473 -942:2:4480 -943:2:4485 -944:2:4492 -945:2:4493 -946:2:4492 -947:2:4493 -948:2:4500 -949:2:4504 -950:0:4649 -951:2:4509 -952:0:4649 -953:2:4510 -954:0:4649 -955:2:4511 -956:0:4649 -957:2:4512 -958:0:4649 -959:1:53 -960:0:4649 -961:2:4513 -962:0:4649 -963:1:57 -964:1:58 -965:1:62 -966:1:66 -967:1:67 -968:1:71 -969:1:79 -970:1:80 -971:1:84 -972:1:88 -973:1:89 -974:1:84 -975:1:88 -976:1:89 -977:1:93 -978:1:100 -979:1:107 -980:1:108 -981:1:115 -982:1:120 -983:1:127 -984:1:128 -985:1:127 -986:1:128 -987:1:135 -988:1:139 -989:0:4649 -990:2:4512 -991:0:4649 -992:1:144 -993:0:4649 -994:2:4513 -995:0:4649 -996:2:4514 -997:0:4649 -998:2:4519 -999:0:4649 -1000:2:4520 -1001:0:4649 -1002:2:4528 -1003:2:4529 -1004:2:4533 -1005:2:4537 -1006:2:4538 -1007:2:4542 -1008:2:4550 -1009:2:4551 -1010:2:4555 -1011:2:4559 -1012:2:4560 -1013:2:4555 -1014:2:4559 -1015:2:4560 -1016:2:4564 -1017:2:4571 -1018:2:4578 -1019:2:4579 -1020:2:4586 -1021:2:4591 -1022:2:4598 -1023:2:4599 -1024:2:4598 -1025:2:4599 -1026:2:4606 -1027:2:4610 -1028:0:4649 -1029:2:3799 -1030:2:3809 -1031:0:4649 -1032:2:2936 -1033:0:4649 -1034:2:3800 -1035:2:3801 -1036:0:4649 -1037:2:2936 -1038:0:4649 -1039:2:3805 -1040:0:4649 -1041:2:3813 -1042:0:4649 -1043:2:2932 -1044:0:4649 -1045:2:2934 -1046:0:4649 -1047:2:2935 -1048:0:4649 -1049:2:2936 -1050:0:4649 -1051:2:2937 -1052:2:2938 -1053:2:2942 -1054:2:2943 -1055:2:2951 -1056:2:2952 -1057:2:2956 -1058:2:2957 -1059:2:2965 -1060:2:2970 -1061:2:2974 -1062:2:2975 -1063:2:2983 -1064:2:2984 -1065:2:2988 -1066:2:2989 -1067:2:2983 -1068:2:2984 -1069:2:2985 -1070:2:2997 -1071:2:3002 -1072:2:3003 -1073:2:3014 -1074:2:3015 -1075:2:3016 -1076:2:3027 -1077:2:3032 -1078:2:3033 -1079:2:3044 -1080:2:3045 -1081:2:3046 -1082:2:3044 -1083:2:3045 -1084:2:3046 -1085:2:3057 -1086:2:3065 -1087:0:4649 -1088:2:2936 -1089:0:4649 -1090:2:3117 -1091:2:3118 -1092:2:3119 -1093:0:4649 -1094:2:2936 -1095:0:4649 -1096:2:3124 -1097:0:4649 -1098:1:145 -1099:0:4649 -1100:1:147 -1101:0:4649 -1102:1:46 -1103:0:4649 -1104:1:153 -1105:1:154 -1106:1:158 -1107:1:159 -1108:1:167 -1109:1:168 -1110:1:172 -1111:1:173 -1112:1:181 -1113:1:186 -1114:1:190 -1115:1:191 -1116:1:199 -1117:1:200 -1118:1:204 -1119:1:205 -1120:1:199 -1121:1:200 -1122:1:204 -1123:1:205 -1124:1:213 -1125:1:218 -1126:1:219 -1127:1:230 -1128:1:231 -1129:1:232 -1130:1:243 -1131:1:248 -1132:1:249 -1133:1:260 -1134:1:261 -1135:1:262 -1136:1:260 -1137:1:261 -1138:1:262 -1139:1:273 -1140:0:4649 -1141:1:42 -1142:0:4649 -1143:1:43 -1144:0:4649 -1145:1:44 -1146:0:4649 -1147:1:145 -1148:0:4649 -1149:1:147 -1150:0:4649 -1151:1:46 -1152:0:4649 -1153:1:282 -1154:1:283 -1155:0:4649 -1156:1:42 -1157:0:4649 -1158:1:43 -1159:0:4649 -1160:1:44 -1161:0:4649 -1162:1:145 -1163:0:4649 -1164:1:147 -1165:0:4649 -1166:1:46 -1167:0:4649 -1168:1:289 -1169:1:290 -1170:1:294 -1171:1:295 -1172:1:303 -1173:1:304 -1174:1:308 -1175:1:309 -1176:1:317 -1177:1:322 -1178:1:326 -1179:1:327 -1180:1:335 -1181:1:336 -1182:1:340 -1183:1:341 -1184:1:335 -1185:1:336 -1186:1:340 -1187:1:341 -1188:1:349 -1189:1:354 -1190:1:355 -1191:1:366 -1192:1:367 -1193:1:368 -1194:1:379 -1195:1:384 -1196:1:385 -1197:1:396 -1198:1:397 -1199:1:398 -1200:1:396 -1201:1:397 -1202:1:398 -1203:1:409 -1204:0:4649 -1205:1:42 -1206:0:4649 -1207:1:43 -1208:0:4649 -1209:1:44 -1210:0:4649 -1211:1:145 -1212:0:4649 -1213:1:147 -1214:0:4649 -1215:1:46 -1216:0:4649 -1217:1:418 -1218:1:419 -1219:1:423 -1220:1:424 -1221:1:432 -1222:1:433 -1223:1:437 -1224:1:438 -1225:1:446 -1226:1:451 -1227:1:455 -1228:1:456 -1229:1:464 -1230:1:465 -1231:1:469 -1232:1:470 -1233:1:464 -1234:1:465 -1235:1:469 -1236:1:470 -1237:1:478 -1238:1:483 -1239:1:484 -1240:1:495 -1241:1:496 -1242:1:497 -1243:1:508 -1244:1:513 -1245:1:514 -1246:1:525 -1247:1:526 -1248:1:527 -1249:1:525 -1250:1:526 -1251:1:527 -1252:1:538 -1253:1:545 -1254:0:4649 -1255:1:42 -1256:0:4649 -1257:1:43 -1258:0:4649 -1259:1:44 -1260:0:4649 -1261:1:145 -1262:0:4649 -1263:1:147 -1264:0:4649 -1265:1:46 -1266:0:4649 -1267:1:683 -1268:1:684 -1269:1:688 -1270:1:689 -1271:1:697 -1272:1:698 -1273:1:699 -1274:1:711 -1275:1:716 -1276:1:720 -1277:1:721 -1278:1:729 -1279:1:730 -1280:1:734 -1281:1:735 -1282:1:729 -1283:1:730 -1284:1:734 -1285:1:735 -1286:1:743 -1287:1:748 -1288:1:749 -1289:1:760 -1290:1:761 -1291:1:762 -1292:1:773 -1293:1:778 -1294:1:779 -1295:1:790 -1296:1:791 -1297:1:792 -1298:1:790 -1299:1:791 -1300:1:792 -1301:1:803 -1302:0:4649 -1303:1:42 -1304:0:4649 -1305:1:43 -1306:0:4649 -1307:1:44 -1308:0:4649 -1309:1:145 -1310:0:4649 -1311:1:147 -1312:0:4649 -1313:1:46 -1314:0:4649 -1315:1:812 -1316:1:815 -1317:1:816 -1318:0:4649 -1319:1:42 -1320:0:4649 -1321:1:43 -1322:0:4649 -1323:1:44 -1324:0:4649 -1325:1:145 -1326:0:4649 -1327:1:147 -1328:0:4649 -1329:1:46 -1330:0:4649 -1331:1:819 -1332:1:820 -1333:1:824 -1334:1:825 -1335:1:833 -1336:1:834 -1337:1:838 -1338:1:839 -1339:1:847 -1340:1:852 -1341:1:856 -1342:1:857 -1343:1:865 -1344:1:866 -1345:1:870 -1346:1:871 -1347:1:865 -1348:1:866 -1349:1:870 -1350:1:871 -1351:1:879 -1352:1:884 -1353:1:885 -1354:1:896 -1355:1:897 -1356:1:898 -1357:1:909 -1358:1:914 -1359:1:915 -1360:1:926 -1361:1:927 -1362:1:928 -1363:1:926 -1364:1:927 -1365:1:928 -1366:1:939 -1367:0:4649 -1368:1:42 -1369:0:4649 -1370:1:43 -1371:0:4649 -1372:1:44 -1373:0:4649 -1374:1:145 -1375:0:4649 -1376:1:147 -1377:0:4649 -1378:1:46 -1379:0:4649 -1380:1:1079 -1381:1:1080 -1382:1:1084 -1383:1:1085 -1384:1:1093 -1385:1:1094 -1386:1:1098 -1387:1:1099 -1388:1:1107 -1389:1:1112 -1390:1:1116 -1391:1:1117 -1392:1:1125 -1393:1:1126 -1394:1:1130 -1395:1:1131 -1396:1:1125 -1397:1:1126 -1398:1:1130 -1399:1:1131 -1400:1:1139 -1401:1:1144 -1402:1:1145 -1403:1:1156 -1404:1:1157 -1405:1:1158 -1406:1:1169 -1407:1:1174 -1408:1:1175 -1409:1:1186 -1410:1:1187 -1411:1:1188 -1412:1:1186 -1413:1:1187 -1414:1:1188 -1415:1:1199 -1416:1:1206 -1417:1:1210 -1418:0:4649 -1419:1:42 -1420:0:4649 -1421:1:43 -1422:0:4649 -1423:1:44 -1424:0:4649 -1425:1:145 -1426:0:4649 -1427:1:147 -1428:0:4649 -1429:1:46 -1430:0:4649 -1431:1:1211 -1432:1:1212 -1433:1:1216 -1434:1:1217 -1435:1:1225 -1436:1:1226 -1437:1:1227 -1438:1:1239 -1439:1:1244 -1440:1:1248 -1441:1:1249 -1442:1:1257 -1443:1:1258 -1444:1:1262 -1445:1:1263 -1446:1:1257 -1447:1:1258 -1448:1:1262 -1449:1:1263 -1450:1:1271 -1451:1:1276 -1452:1:1277 -1453:1:1288 -1454:1:1289 -1455:1:1290 -1456:1:1301 -1457:1:1306 -1458:1:1307 -1459:1:1318 -1460:1:1319 -1461:1:1320 -1462:1:1318 -1463:1:1319 -1464:1:1320 -1465:1:1331 -1466:0:4649 -1467:1:42 -1468:0:4649 -1469:1:43 -1470:0:4649 -1471:1:44 -1472:0:4649 -1473:1:145 -1474:0:4649 -1475:1:147 -1476:0:4649 -1477:1:46 -1478:0:4649 -1479:1:1340 -1480:0:4649 -1481:1:2804 -1482:1:2811 -1483:1:2812 -1484:1:2819 -1485:1:2824 -1486:1:2831 -1487:1:2832 -1488:1:2831 -1489:1:2832 -1490:1:2839 -1491:1:2843 -1492:0:4649 -1493:2:3828 -1494:2:3829 -1495:2:3833 -1496:2:3837 -1497:2:3838 -1498:2:3842 -1499:2:3847 -1500:2:3855 -1501:2:3859 -1502:2:3860 -1503:2:3855 -1504:2:3856 -1505:2:3864 -1506:2:3871 -1507:2:3878 -1508:2:3879 -1509:2:3886 -1510:2:3891 -1511:2:3898 -1512:2:3899 -1513:2:3898 -1514:2:3899 -1515:2:3906 -1516:2:3910 -1517:0:4649 -1518:2:3915 -1519:0:4649 -1520:2:3916 -1521:0:4649 -1522:2:3917 -1523:0:4649 -1524:2:3918 -1525:0:4649 -1526:1:1342 -1527:1:1343 -1528:0:4647 -1529:2:3919 -1530:0:4653 -1531:1:2501 diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_single_flip.define b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_single_flip.log b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_single_flip.log deleted file mode 100644 index 1d98e20..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_single_flip.log +++ /dev/null @@ -1,696 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_single_flip.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1362) -Depth= 9651 States= 1e+06 Transitions= 1.79e+08 Memory= 513.029 t= 267 R= 4e+03 -Depth= 9651 States= 2e+06 Transitions= 4.37e+08 Memory= 559.416 t= 679 R= 3e+03 -Depth= 9651 States= 3e+06 Transitions= 7.08e+08 Memory= 605.901 t= 1.13e+03 R= 3e+03 -pan: resizing hashtable to -w22.. done -Depth= 9651 States= 4e+06 Transitions= 9.4e+08 Memory= 683.213 t= 1.48e+03 R= 3e+03 -Depth= 9651 States= 5e+06 Transitions= 1.26e+09 Memory= 730.479 t= 1.98e+03 R= 3e+03 -Depth= 9651 States= 6e+06 Transitions= 1.55e+09 Memory= 777.451 t= 2.43e+03 R= 2e+03 -Depth= 9651 States= 7e+06 Transitions= 1.82e+09 Memory= 824.522 t= 2.87e+03 R= 2e+03 -Depth= 9651 States= 8e+06 Transitions= 2.01e+09 Memory= 871.494 t= 3.16e+03 R= 3e+03 -Depth= 9651 States= 9e+06 Transitions= 2.19e+09 Memory= 917.295 t= 3.45e+03 R= 3e+03 -pan: resizing hashtable to -w24.. done -Depth= 9651 States= 1e+07 Transitions= 2.37e+09 Memory= 1087.092 t= 3.73e+03 R= 3e+03 -Depth= 9651 States= 1.1e+07 Transitions= 2.59e+09 Memory= 1133.088 t= 4.06e+03 R= 3e+03 -Depth= 9651 States= 1.2e+07 Transitions= 2.88e+09 Memory= 1179.572 t= 4.5e+03 R= 3e+03 -Depth= 9651 States= 1.3e+07 Transitions= 3.1e+09 Memory= 1226.545 t= 4.84e+03 R= 3e+03 -Depth= 9651 States= 1.4e+07 Transitions= 3.33e+09 Memory= 1272.834 t= 5.18e+03 R= 3e+03 -Depth= 9651 States= 1.5e+07 Transitions= 3.58e+09 Memory= 1318.733 t= 5.57e+03 R= 3e+03 -Depth= 9651 States= 1.6e+07 Transitions= 3.79e+09 Memory= 1364.729 t= 5.9e+03 R= 3e+03 -Depth= 9651 States= 1.7e+07 Transitions= 4.09e+09 Memory= 1410.725 t= 6.36e+03 R= 3e+03 -Depth= 9892 States= 1.8e+07 Transitions= 4.34e+09 Memory= 1456.526 t= 6.76e+03 R= 3e+03 -Depth= 9897 States= 1.9e+07 Transitions= 4.61e+09 Memory= 1502.326 t= 7.17e+03 R= 3e+03 -Depth= 9897 States= 2e+07 Transitions= 4.88e+09 Memory= 1548.127 t= 7.6e+03 R= 3e+03 -Depth= 9897 States= 2.1e+07 Transitions= 5.16e+09 Memory= 1594.318 t= 8.03e+03 R= 3e+03 -Depth= 9897 States= 2.2e+07 Transitions= 5.46e+09 Memory= 1640.315 t= 8.52e+03 R= 3e+03 -Depth= 9897 States= 2.3e+07 Transitions= 5.74e+09 Memory= 1686.115 t= 8.95e+03 R= 3e+03 -Depth= 9897 States= 2.4e+07 Transitions= 6e+09 Memory= 1731.916 t= 9.36e+03 R= 3e+03 -Depth= 9897 States= 2.5e+07 Transitions= 6.24e+09 Memory= 1777.717 t= 9.75e+03 R= 3e+03 -Depth= 9897 States= 2.6e+07 Transitions= 6.48e+09 Memory= 1823.518 t= 1.01e+04 R= 3e+03 -Depth= 9897 States= 2.7e+07 Transitions= 6.7e+09 Memory= 1869.318 t= 1.05e+04 R= 3e+03 -Depth= 9897 States= 2.8e+07 Transitions= 7.03e+09 Memory= 1916.486 t= 1.1e+04 R= 3e+03 -Depth= 9897 States= 2.9e+07 Transitions= 7.36e+09 Memory= 1962.678 t= 1.15e+04 R= 3e+03 -Depth= 9897 States= 3e+07 Transitions= 7.63e+09 Memory= 2008.967 t= 1.2e+04 R= 3e+03 -Depth= 9897 States= 3.1e+07 Transitions= 7.94e+09 Memory= 2054.963 t= 1.25e+04 R= 2e+03 -Depth= 9897 States= 3.2e+07 Transitions= 8.2e+09 Memory= 2102.033 t= 1.29e+04 R= 2e+03 -Depth= 9897 States= 3.3e+07 Transitions= 8.41e+09 Memory= 2148.029 t= 1.32e+04 R= 2e+03 -Depth= 9897 States= 3.4e+07 Transitions= 8.68e+09 Memory= 2194.123 t= 1.36e+04 R= 2e+03 -pan: resizing hashtable to -w26.. done -Depth= 9897 States= 3.5e+07 Transitions= 8.91e+09 Memory= 2736.006 t= 1.4e+04 R= 2e+03 -Depth= 9897 States= 3.6e+07 Transitions= 9.2e+09 Memory= 2781.807 t= 1.44e+04 R= 2e+03 -Depth= 9897 States= 3.7e+07 Transitions= 9.48e+09 Memory= 2827.608 t= 1.49e+04 R= 2e+03 -Depth= 9897 States= 3.8e+07 Transitions= 9.72e+09 Memory= 2873.408 t= 1.52e+04 R= 2e+03 -Depth= 9897 States= 3.9e+07 Transitions= 9.98e+09 Memory= 2919.209 t= 1.56e+04 R= 2e+03 -Depth= 9897 States= 4e+07 Transitions= 1.02e+10 Memory= 2965.010 t= 1.6e+04 R= 2e+03 -Depth= 9897 States= 4.1e+07 Transitions= 1.05e+10 Memory= 3010.713 t= 1.64e+04 R= 2e+03 -Depth= 9897 States= 4.2e+07 Transitions= 1.07e+10 Memory= 3056.611 t= 1.68e+04 R= 3e+03 -pan: claim violated! (at depth 1439) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 80 byte, depth reached 9897, errors: 1 - 42642410 states, stored -1.0909582e+10 states, matched -1.0952224e+10 transitions (= stored+matched) -5.922913e+10 atomic steps -hash conflicts: 6.3170511e+09 (resolved) - -Stats on memory usage (in Megabytes): - 4717.369 equivalent memory usage for states (stored*(State-vector + overhead)) - 2117.231 actual memory usage for states (compression: 44.88%) - state-vector as stored = 16 byte + 36 byte overhead - 512.000 memory used for hash table (-w26) - 457.764 memory used for DFS stack (-m10000000) - 3086.494 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 304368 3993 2946 2 2 ] -unreached in proctype urcu_reader - line 894, "pan.___", state 12, "((i<1))" - line 894, "pan.___", state 12, "((i>=1))" - line 268, "pan.___", state 57, "cache_dirty_urcu_gp_ctr = 0" - line 276, "pan.___", state 79, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 88, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 104, "(1)" - line 249, "pan.___", state 112, "(1)" - line 253, "pan.___", state 124, "(1)" - line 257, "pan.___", state 132, "(1)" - line 407, "pan.___", state 158, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 190, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 204, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 223, "(1)" - line 434, "pan.___", state 253, "(1)" - line 438, "pan.___", state 266, "(1)" - line 687, "pan.___", state 287, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 407, "pan.___", state 294, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 326, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 340, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 359, "(1)" - line 434, "pan.___", state 389, "(1)" - line 438, "pan.___", state 402, "(1)" - line 407, "pan.___", state 423, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 455, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 469, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 488, "(1)" - line 434, "pan.___", state 518, "(1)" - line 438, "pan.___", state 531, "(1)" - line 407, "pan.___", state 554, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 556, "(1)" - line 407, "pan.___", state 557, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 557, "else" - line 407, "pan.___", state 560, "(1)" - line 411, "pan.___", state 568, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 570, "(1)" - line 411, "pan.___", state 571, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 571, "else" - line 411, "pan.___", state 574, "(1)" - line 411, "pan.___", state 575, "(1)" - line 411, "pan.___", state 575, "(1)" - line 409, "pan.___", state 580, "((i<1))" - line 409, "pan.___", state 580, "((i>=1))" - line 416, "pan.___", state 586, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 588, "(1)" - line 416, "pan.___", state 589, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 589, "else" - line 416, "pan.___", state 592, "(1)" - line 416, "pan.___", state 593, "(1)" - line 416, "pan.___", state 593, "(1)" - line 420, "pan.___", state 600, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 602, "(1)" - line 420, "pan.___", state 603, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 603, "else" - line 420, "pan.___", state 606, "(1)" - line 420, "pan.___", state 607, "(1)" - line 420, "pan.___", state 607, "(1)" - line 418, "pan.___", state 612, "((i<2))" - line 418, "pan.___", state 612, "((i>=2))" - line 425, "pan.___", state 619, "(1)" - line 425, "pan.___", state 620, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 620, "else" - line 425, "pan.___", state 623, "(1)" - line 425, "pan.___", state 624, "(1)" - line 425, "pan.___", state 624, "(1)" - line 429, "pan.___", state 632, "(1)" - line 429, "pan.___", state 633, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 633, "else" - line 429, "pan.___", state 636, "(1)" - line 429, "pan.___", state 637, "(1)" - line 429, "pan.___", state 637, "(1)" - line 427, "pan.___", state 642, "((i<1))" - line 427, "pan.___", state 642, "((i>=1))" - line 434, "pan.___", state 649, "(1)" - line 434, "pan.___", state 650, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 650, "else" - line 434, "pan.___", state 653, "(1)" - line 434, "pan.___", state 654, "(1)" - line 434, "pan.___", state 654, "(1)" - line 438, "pan.___", state 662, "(1)" - line 438, "pan.___", state 663, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 663, "else" - line 438, "pan.___", state 666, "(1)" - line 438, "pan.___", state 667, "(1)" - line 438, "pan.___", state 667, "(1)" - line 436, "pan.___", state 672, "((i<2))" - line 436, "pan.___", state 672, "((i>=2))" - line 446, "pan.___", state 676, "(1)" - line 446, "pan.___", state 676, "(1)" - line 687, "pan.___", state 679, "cached_urcu_active_readers = (tmp+1)" - line 687, "pan.___", state 680, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 687, "pan.___", state 681, "(1)" - line 407, "pan.___", state 688, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 720, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 734, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 753, "(1)" - line 434, "pan.___", state 783, "(1)" - line 438, "pan.___", state 796, "(1)" - line 407, "pan.___", state 824, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 856, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 870, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 889, "(1)" - line 434, "pan.___", state 919, "(1)" - line 438, "pan.___", state 932, "(1)" - line 407, "pan.___", state 953, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 955, "(1)" - line 407, "pan.___", state 956, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 956, "else" - line 407, "pan.___", state 959, "(1)" - line 411, "pan.___", state 967, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 969, "(1)" - line 411, "pan.___", state 970, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 970, "else" - line 411, "pan.___", state 973, "(1)" - line 411, "pan.___", state 974, "(1)" - line 411, "pan.___", state 974, "(1)" - line 409, "pan.___", state 979, "((i<1))" - line 409, "pan.___", state 979, "((i>=1))" - line 416, "pan.___", state 985, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 987, "(1)" - line 416, "pan.___", state 988, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 988, "else" - line 416, "pan.___", state 991, "(1)" - line 416, "pan.___", state 992, "(1)" - line 416, "pan.___", state 992, "(1)" - line 420, "pan.___", state 999, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 1001, "(1)" - line 420, "pan.___", state 1002, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 1002, "else" - line 420, "pan.___", state 1005, "(1)" - line 420, "pan.___", state 1006, "(1)" - line 420, "pan.___", state 1006, "(1)" - line 418, "pan.___", state 1011, "((i<2))" - line 418, "pan.___", state 1011, "((i>=2))" - line 425, "pan.___", state 1018, "(1)" - line 425, "pan.___", state 1019, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 1019, "else" - line 425, "pan.___", state 1022, "(1)" - line 425, "pan.___", state 1023, "(1)" - line 425, "pan.___", state 1023, "(1)" - line 429, "pan.___", state 1031, "(1)" - line 429, "pan.___", state 1032, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 1032, "else" - line 429, "pan.___", state 1035, "(1)" - line 429, "pan.___", state 1036, "(1)" - line 429, "pan.___", state 1036, "(1)" - line 427, "pan.___", state 1041, "((i<1))" - line 427, "pan.___", state 1041, "((i>=1))" - line 434, "pan.___", state 1048, "(1)" - line 434, "pan.___", state 1049, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 1049, "else" - line 434, "pan.___", state 1052, "(1)" - line 434, "pan.___", state 1053, "(1)" - line 434, "pan.___", state 1053, "(1)" - line 438, "pan.___", state 1061, "(1)" - line 438, "pan.___", state 1062, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 1062, "else" - line 438, "pan.___", state 1065, "(1)" - line 438, "pan.___", state 1066, "(1)" - line 438, "pan.___", state 1066, "(1)" - line 436, "pan.___", state 1071, "((i<2))" - line 436, "pan.___", state 1071, "((i>=2))" - line 446, "pan.___", state 1075, "(1)" - line 446, "pan.___", state 1075, "(1)" - line 695, "pan.___", state 1079, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 407, "pan.___", state 1084, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1116, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1130, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1149, "(1)" - line 434, "pan.___", state 1179, "(1)" - line 438, "pan.___", state 1192, "(1)" - line 407, "pan.___", state 1216, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1248, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1262, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1281, "(1)" - line 434, "pan.___", state 1311, "(1)" - line 438, "pan.___", state 1324, "(1)" - line 407, "pan.___", state 1349, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1381, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1395, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1414, "(1)" - line 434, "pan.___", state 1444, "(1)" - line 438, "pan.___", state 1457, "(1)" - line 407, "pan.___", state 1478, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1510, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1524, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1543, "(1)" - line 434, "pan.___", state 1573, "(1)" - line 438, "pan.___", state 1586, "(1)" - line 407, "pan.___", state 1612, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1644, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1658, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1677, "(1)" - line 434, "pan.___", state 1707, "(1)" - line 438, "pan.___", state 1720, "(1)" - line 407, "pan.___", state 1741, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1773, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1787, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1806, "(1)" - line 434, "pan.___", state 1836, "(1)" - line 438, "pan.___", state 1849, "(1)" - line 407, "pan.___", state 1873, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1905, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1919, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 1938, "(1)" - line 434, "pan.___", state 1968, "(1)" - line 438, "pan.___", state 1981, "(1)" - line 734, "pan.___", state 2002, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 407, "pan.___", state 2009, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2041, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2055, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2074, "(1)" - line 434, "pan.___", state 2104, "(1)" - line 438, "pan.___", state 2117, "(1)" - line 407, "pan.___", state 2138, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2170, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2184, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2203, "(1)" - line 434, "pan.___", state 2233, "(1)" - line 438, "pan.___", state 2246, "(1)" - line 407, "pan.___", state 2269, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 2271, "(1)" - line 407, "pan.___", state 2272, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 2272, "else" - line 407, "pan.___", state 2275, "(1)" - line 411, "pan.___", state 2283, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 2285, "(1)" - line 411, "pan.___", state 2286, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 2286, "else" - line 411, "pan.___", state 2289, "(1)" - line 411, "pan.___", state 2290, "(1)" - line 411, "pan.___", state 2290, "(1)" - line 409, "pan.___", state 2295, "((i<1))" - line 409, "pan.___", state 2295, "((i>=1))" - line 416, "pan.___", state 2301, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 2303, "(1)" - line 416, "pan.___", state 2304, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 2304, "else" - line 416, "pan.___", state 2307, "(1)" - line 416, "pan.___", state 2308, "(1)" - line 416, "pan.___", state 2308, "(1)" - line 420, "pan.___", state 2315, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 2317, "(1)" - line 420, "pan.___", state 2318, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 2318, "else" - line 420, "pan.___", state 2321, "(1)" - line 420, "pan.___", state 2322, "(1)" - line 420, "pan.___", state 2322, "(1)" - line 418, "pan.___", state 2327, "((i<2))" - line 418, "pan.___", state 2327, "((i>=2))" - line 425, "pan.___", state 2334, "(1)" - line 425, "pan.___", state 2335, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 2335, "else" - line 425, "pan.___", state 2338, "(1)" - line 425, "pan.___", state 2339, "(1)" - line 425, "pan.___", state 2339, "(1)" - line 429, "pan.___", state 2347, "(1)" - line 429, "pan.___", state 2348, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 2348, "else" - line 429, "pan.___", state 2351, "(1)" - line 429, "pan.___", state 2352, "(1)" - line 429, "pan.___", state 2352, "(1)" - line 427, "pan.___", state 2357, "((i<1))" - line 427, "pan.___", state 2357, "((i>=1))" - line 434, "pan.___", state 2364, "(1)" - line 434, "pan.___", state 2365, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 2365, "else" - line 434, "pan.___", state 2368, "(1)" - line 434, "pan.___", state 2369, "(1)" - line 434, "pan.___", state 2369, "(1)" - line 438, "pan.___", state 2377, "(1)" - line 438, "pan.___", state 2378, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 2378, "else" - line 438, "pan.___", state 2381, "(1)" - line 438, "pan.___", state 2382, "(1)" - line 438, "pan.___", state 2382, "(1)" - line 436, "pan.___", state 2387, "((i<2))" - line 436, "pan.___", state 2387, "((i>=2))" - line 446, "pan.___", state 2391, "(1)" - line 446, "pan.___", state 2391, "(1)" - line 734, "pan.___", state 2394, "cached_urcu_active_readers = (tmp+1)" - line 734, "pan.___", state 2395, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 734, "pan.___", state 2396, "(1)" - line 407, "pan.___", state 2403, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2435, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2449, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2468, "(1)" - line 434, "pan.___", state 2498, "(1)" - line 438, "pan.___", state 2511, "(1)" - line 407, "pan.___", state 2538, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2570, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2584, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2603, "(1)" - line 434, "pan.___", state 2633, "(1)" - line 438, "pan.___", state 2646, "(1)" - line 407, "pan.___", state 2667, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2699, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2713, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 2732, "(1)" - line 434, "pan.___", state 2762, "(1)" - line 438, "pan.___", state 2775, "(1)" - line 245, "pan.___", state 2808, "(1)" - line 253, "pan.___", state 2828, "(1)" - line 257, "pan.___", state 2836, "(1)" - line 245, "pan.___", state 2851, "(1)" - line 253, "pan.___", state 2871, "(1)" - line 257, "pan.___", state 2879, "(1)" - line 929, "pan.___", state 2896, "-end-" - (246 of 2896 states) -unreached in proctype urcu_writer - line 1018, "pan.___", state 12, "((i<1))" - line 1018, "pan.___", state 12, "((i>=1))" - line 407, "pan.___", state 49, "cache_dirty_urcu_gp_ctr = 0" - line 411, "pan.___", state 63, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 81, "cache_dirty_rcu_ptr = 0" - line 425, "pan.___", state 114, "(1)" - line 429, "pan.___", state 127, "(1)" - line 434, "pan.___", state 144, "(1)" - line 268, "pan.___", state 180, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 189, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 202, "cache_dirty_rcu_ptr = 0" - line 407, "pan.___", state 242, "cache_dirty_urcu_gp_ctr = 0" - line 411, "pan.___", state 256, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 274, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 288, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 307, "(1)" - line 429, "pan.___", state 320, "(1)" - line 434, "pan.___", state 337, "(1)" - line 438, "pan.___", state 350, "(1)" - line 411, "pan.___", state 387, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 405, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 419, "cache_dirty_rcu_data[i] = 0" - line 429, "pan.___", state 451, "(1)" - line 434, "pan.___", state 468, "(1)" - line 438, "pan.___", state 481, "(1)" - line 407, "pan.___", state 511, "cache_dirty_urcu_gp_ctr = 0" - line 411, "pan.___", state 525, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 543, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 557, "cache_dirty_rcu_data[i] = 0" - line 425, "pan.___", state 576, "(1)" - line 429, "pan.___", state 589, "(1)" - line 434, "pan.___", state 606, "(1)" - line 438, "pan.___", state 619, "(1)" - line 407, "pan.___", state 640, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 642, "(1)" - line 407, "pan.___", state 643, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 643, "else" - line 407, "pan.___", state 646, "(1)" - line 411, "pan.___", state 654, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 656, "(1)" - line 411, "pan.___", state 657, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 657, "else" - line 411, "pan.___", state 660, "(1)" - line 411, "pan.___", state 661, "(1)" - line 411, "pan.___", state 661, "(1)" - line 409, "pan.___", state 666, "((i<1))" - line 409, "pan.___", state 666, "((i>=1))" - line 416, "pan.___", state 672, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 674, "(1)" - line 416, "pan.___", state 675, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 675, "else" - line 416, "pan.___", state 678, "(1)" - line 416, "pan.___", state 679, "(1)" - line 416, "pan.___", state 679, "(1)" - line 420, "pan.___", state 686, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 688, "(1)" - line 420, "pan.___", state 689, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 689, "else" - line 420, "pan.___", state 692, "(1)" - line 420, "pan.___", state 693, "(1)" - line 420, "pan.___", state 693, "(1)" - line 418, "pan.___", state 698, "((i<2))" - line 418, "pan.___", state 698, "((i>=2))" - line 425, "pan.___", state 705, "(1)" - line 425, "pan.___", state 706, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 706, "else" - line 425, "pan.___", state 709, "(1)" - line 425, "pan.___", state 710, "(1)" - line 425, "pan.___", state 710, "(1)" - line 429, "pan.___", state 718, "(1)" - line 429, "pan.___", state 719, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 719, "else" - line 429, "pan.___", state 722, "(1)" - line 429, "pan.___", state 723, "(1)" - line 429, "pan.___", state 723, "(1)" - line 427, "pan.___", state 728, "((i<1))" - line 427, "pan.___", state 728, "((i>=1))" - line 434, "pan.___", state 735, "(1)" - line 434, "pan.___", state 736, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 736, "else" - line 434, "pan.___", state 739, "(1)" - line 434, "pan.___", state 740, "(1)" - line 434, "pan.___", state 740, "(1)" - line 438, "pan.___", state 748, "(1)" - line 438, "pan.___", state 749, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 749, "else" - line 438, "pan.___", state 752, "(1)" - line 438, "pan.___", state 753, "(1)" - line 438, "pan.___", state 753, "(1)" - line 436, "pan.___", state 758, "((i<2))" - line 436, "pan.___", state 758, "((i>=2))" - line 446, "pan.___", state 762, "(1)" - line 446, "pan.___", state 762, "(1)" - line 1184, "pan.___", state 766, "_proc_urcu_writer = (_proc_urcu_writer|(1<<10))" - line 407, "pan.___", state 771, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 773, "(1)" - line 407, "pan.___", state 774, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 774, "else" - line 407, "pan.___", state 777, "(1)" - line 411, "pan.___", state 785, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 787, "(1)" - line 411, "pan.___", state 788, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 788, "else" - line 411, "pan.___", state 791, "(1)" - line 411, "pan.___", state 792, "(1)" - line 411, "pan.___", state 792, "(1)" - line 409, "pan.___", state 797, "((i<1))" - line 409, "pan.___", state 797, "((i>=1))" - line 416, "pan.___", state 803, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 805, "(1)" - line 416, "pan.___", state 806, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 806, "else" - line 416, "pan.___", state 809, "(1)" - line 416, "pan.___", state 810, "(1)" - line 416, "pan.___", state 810, "(1)" - line 420, "pan.___", state 817, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 819, "(1)" - line 420, "pan.___", state 820, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 820, "else" - line 420, "pan.___", state 823, "(1)" - line 420, "pan.___", state 824, "(1)" - line 420, "pan.___", state 824, "(1)" - line 418, "pan.___", state 829, "((i<2))" - line 418, "pan.___", state 829, "((i>=2))" - line 425, "pan.___", state 836, "(1)" - line 425, "pan.___", state 837, "(!(cache_dirty_urcu_gp_ctr))" - line 425, "pan.___", state 837, "else" - line 425, "pan.___", state 840, "(1)" - line 425, "pan.___", state 841, "(1)" - line 425, "pan.___", state 841, "(1)" - line 429, "pan.___", state 849, "(1)" - line 429, "pan.___", state 850, "(!(cache_dirty_urcu_active_readers))" - line 429, "pan.___", state 850, "else" - line 429, "pan.___", state 853, "(1)" - line 429, "pan.___", state 854, "(1)" - line 429, "pan.___", state 854, "(1)" - line 427, "pan.___", state 859, "((i<1))" - line 427, "pan.___", state 859, "((i>=1))" - line 434, "pan.___", state 866, "(1)" - line 434, "pan.___", state 867, "(!(cache_dirty_rcu_ptr))" - line 434, "pan.___", state 867, "else" - line 434, "pan.___", state 870, "(1)" - line 434, "pan.___", state 871, "(1)" - line 434, "pan.___", state 871, "(1)" - line 438, "pan.___", state 879, "(1)" - line 438, "pan.___", state 880, "(!(cache_dirty_rcu_data[i]))" - line 438, "pan.___", state 880, "else" - line 438, "pan.___", state 883, "(1)" - line 438, "pan.___", state 884, "(1)" - line 438, "pan.___", state 884, "(1)" - line 436, "pan.___", state 889, "((i<2))" - line 436, "pan.___", state 889, "((i>=2))" - line 446, "pan.___", state 893, "(1)" - line 446, "pan.___", state 893, "(1)" - line 1200, "pan.___", state 898, "_proc_urcu_writer = (_proc_urcu_writer|(1<<11))" - line 1195, "pan.___", state 899, "(((tmp2&((1<<7)-1))&&((tmp2^0)&(1<<7))))" - line 1195, "pan.___", state 899, "else" - line 1220, "pan.___", state 903, "_proc_urcu_writer = (_proc_urcu_writer&~(((1<<12)|(1<<11))))" - line 268, "pan.___", state 934, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 943, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 958, "(1)" - line 280, "pan.___", state 965, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 981, "(1)" - line 249, "pan.___", state 989, "(1)" - line 253, "pan.___", state 1001, "(1)" - line 257, "pan.___", state 1009, "(1)" - line 268, "pan.___", state 1040, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1049, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1062, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1071, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1087, "(1)" - line 249, "pan.___", state 1095, "(1)" - line 253, "pan.___", state 1107, "(1)" - line 257, "pan.___", state 1115, "(1)" - line 272, "pan.___", state 1141, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1154, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1163, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1179, "(1)" - line 249, "pan.___", state 1187, "(1)" - line 253, "pan.___", state 1199, "(1)" - line 257, "pan.___", state 1207, "(1)" - line 268, "pan.___", state 1238, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1247, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1260, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1269, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1285, "(1)" - line 249, "pan.___", state 1293, "(1)" - line 253, "pan.___", state 1305, "(1)" - line 257, "pan.___", state 1313, "(1)" - line 268, "pan.___", state 1330, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 1332, "(1)" - line 272, "pan.___", state 1339, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 1341, "(1)" - line 272, "pan.___", state 1342, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 1342, "else" - line 270, "pan.___", state 1347, "((i<1))" - line 270, "pan.___", state 1347, "((i>=1))" - line 276, "pan.___", state 1352, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 1354, "(1)" - line 276, "pan.___", state 1355, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 1355, "else" - line 280, "pan.___", state 1361, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 1363, "(1)" - line 280, "pan.___", state 1364, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 1364, "else" - line 278, "pan.___", state 1369, "((i<2))" - line 278, "pan.___", state 1369, "((i>=2))" - line 245, "pan.___", state 1377, "(1)" - line 249, "pan.___", state 1385, "(1)" - line 249, "pan.___", state 1386, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 1386, "else" - line 247, "pan.___", state 1391, "((i<1))" - line 247, "pan.___", state 1391, "((i>=1))" - line 253, "pan.___", state 1397, "(1)" - line 253, "pan.___", state 1398, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 1398, "else" - line 257, "pan.___", state 1405, "(1)" - line 257, "pan.___", state 1406, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 1406, "else" - line 262, "pan.___", state 1415, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 1415, "else" - line 1296, "pan.___", state 1418, "i = 0" - line 1296, "pan.___", state 1420, "reader_barrier = 1" - line 1296, "pan.___", state 1431, "((i<1))" - line 1296, "pan.___", state 1431, "((i>=1))" - line 268, "pan.___", state 1436, "cache_dirty_urcu_gp_ctr = 0" - line 268, "pan.___", state 1438, "(1)" - line 272, "pan.___", state 1445, "cache_dirty_urcu_active_readers = 0" - line 272, "pan.___", state 1447, "(1)" - line 272, "pan.___", state 1448, "(cache_dirty_urcu_active_readers)" - line 272, "pan.___", state 1448, "else" - line 270, "pan.___", state 1453, "((i<1))" - line 270, "pan.___", state 1453, "((i>=1))" - line 276, "pan.___", state 1458, "cache_dirty_rcu_ptr = 0" - line 276, "pan.___", state 1460, "(1)" - line 276, "pan.___", state 1461, "(cache_dirty_rcu_ptr)" - line 276, "pan.___", state 1461, "else" - line 280, "pan.___", state 1467, "cache_dirty_rcu_data[i] = 0" - line 280, "pan.___", state 1469, "(1)" - line 280, "pan.___", state 1470, "(cache_dirty_rcu_data[i])" - line 280, "pan.___", state 1470, "else" - line 278, "pan.___", state 1475, "((i<2))" - line 278, "pan.___", state 1475, "((i>=2))" - line 245, "pan.___", state 1483, "(1)" - line 249, "pan.___", state 1491, "(1)" - line 249, "pan.___", state 1492, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 1492, "else" - line 247, "pan.___", state 1497, "((i<1))" - line 247, "pan.___", state 1497, "((i>=1))" - line 253, "pan.___", state 1503, "(1)" - line 253, "pan.___", state 1504, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 1504, "else" - line 257, "pan.___", state 1511, "(1)" - line 257, "pan.___", state 1512, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 1512, "else" - line 262, "pan.___", state 1521, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 1521, "else" - line 295, "pan.___", state 1523, "(cache_dirty_urcu_gp_ctr)" - line 295, "pan.___", state 1523, "else" - line 1296, "pan.___", state 1524, "(cache_dirty_urcu_gp_ctr)" - line 1296, "pan.___", state 1524, "else" - line 272, "pan.___", state 1537, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1550, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1559, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1575, "(1)" - line 249, "pan.___", state 1583, "(1)" - line 253, "pan.___", state 1595, "(1)" - line 257, "pan.___", state 1603, "(1)" - line 268, "pan.___", state 1634, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1643, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1656, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1665, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1681, "(1)" - line 249, "pan.___", state 1689, "(1)" - line 253, "pan.___", state 1701, "(1)" - line 257, "pan.___", state 1709, "(1)" - line 1304, "pan.___", state 1725, "-end-" - (212 of 1725 states) -unreached in proctype :init: - line 1319, "pan.___", state 13, "((i<1))" - line 1319, "pan.___", state 13, "((i>=1))" - (1 of 28 states) -unreached in proctype :never: - line 1367, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 1.71e+04 seconds -pan: rate 2490.8226 states/second -pan: avg transition delay 1.5631e-06 usec -cp .input.spin urcu_free_single_flip.spin.input -cp .input.spin.trail urcu_free_single_flip.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-ipi' diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_single_flip.spin.input b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_single_flip.spin.input deleted file mode 100644 index 602bb6c..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_single_flip.spin.input +++ /dev/null @@ -1,1340 +0,0 @@ -#define SINGLE_FLIP - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_single_flip.spin.input.trail b/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_single_flip.spin.input.trail deleted file mode 100644 index 6a83ce1..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_free_single_flip.spin.input.trail +++ /dev/null @@ -1,1442 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:4651 -2:2:2896 -3:2:2901 -4:2:2905 -5:2:2913 -6:2:2917 -7:2:2921 -8:0:4651 -9:1:0 -10:1:5 -11:1:9 -12:1:17 -13:1:21 -14:1:25 -15:0:4651 -16:3:4621 -17:3:4624 -18:3:4631 -19:3:4638 -20:3:4641 -21:3:4645 -22:3:4646 -23:0:4651 -24:3:4648 -25:0:4651 -26:2:2925 -27:0:4651 -28:2:2931 -29:0:4651 -30:2:2932 -31:0:4651 -32:2:2934 -33:0:4651 -34:2:2935 -35:0:4651 -36:2:2936 -37:0:4651 -38:2:2937 -39:0:4651 -40:2:2938 -41:0:4651 -42:2:2939 -43:0:4651 -44:2:2940 -45:2:2941 -46:2:2945 -47:2:2946 -48:2:2954 -49:2:2955 -50:2:2959 -51:2:2960 -52:2:2968 -53:2:2973 -54:2:2977 -55:2:2978 -56:2:2986 -57:2:2987 -58:2:2991 -59:2:2992 -60:2:2986 -61:2:2987 -62:2:2991 -63:2:2992 -64:2:3000 -65:2:3005 -66:2:3006 -67:2:3017 -68:2:3018 -69:2:3019 -70:2:3030 -71:2:3035 -72:2:3036 -73:2:3047 -74:2:3048 -75:2:3049 -76:2:3047 -77:2:3048 -78:2:3049 -79:2:3060 -80:2:3068 -81:0:4651 -82:2:2939 -83:0:4651 -84:2:3072 -85:2:3076 -86:2:3077 -87:2:3081 -88:2:3085 -89:2:3086 -90:2:3090 -91:2:3098 -92:2:3099 -93:2:3103 -94:2:3107 -95:2:3108 -96:2:3103 -97:2:3104 -98:2:3112 -99:0:4651 -100:2:2939 -101:0:4651 -102:2:3120 -103:2:3121 -104:2:3122 -105:0:4651 -106:2:2939 -107:0:4651 -108:2:3127 -109:0:4651 -110:2:3830 -111:2:3831 -112:2:3835 -113:2:3839 -114:2:3840 -115:2:3844 -116:2:3849 -117:2:3857 -118:2:3861 -119:2:3862 -120:2:3857 -121:2:3861 -122:2:3862 -123:2:3866 -124:2:3873 -125:2:3880 -126:2:3881 -127:2:3888 -128:2:3893 -129:2:3900 -130:2:3901 -131:2:3900 -132:2:3901 -133:2:3908 -134:2:3912 -135:0:4651 -136:2:3917 -137:0:4651 -138:2:3918 -139:0:4651 -140:2:3919 -141:0:4651 -142:2:3920 -143:0:4651 -144:1:29 -145:0:4651 -146:2:3921 -147:0:4651 -148:1:35 -149:0:4651 -150:1:36 -151:0:4651 -152:2:3920 -153:0:4651 -154:1:37 -155:0:4651 -156:2:3921 -157:0:4651 -158:1:38 -159:0:4651 -160:2:3920 -161:0:4651 -162:1:39 -163:0:4651 -164:2:3921 -165:0:4651 -166:1:40 -167:0:4651 -168:2:3920 -169:0:4651 -170:1:41 -171:0:4651 -172:2:3921 -173:0:4651 -174:1:42 -175:0:4651 -176:1:43 -177:0:4651 -178:2:3920 -179:0:4651 -180:1:44 -181:0:4651 -182:2:3921 -183:0:4651 -184:1:53 -185:0:4651 -186:2:3920 -187:0:4651 -188:1:57 -189:1:58 -190:1:62 -191:1:66 -192:1:67 -193:1:71 -194:1:79 -195:1:80 -196:1:84 -197:1:88 -198:1:89 -199:1:84 -200:1:88 -201:1:89 -202:1:93 -203:1:100 -204:1:107 -205:1:108 -206:1:115 -207:1:120 -208:1:127 -209:1:128 -210:1:127 -211:1:128 -212:1:135 -213:1:139 -214:0:4651 -215:2:3921 -216:0:4651 -217:1:144 -218:0:4651 -219:2:3922 -220:0:4651 -221:2:3927 -222:0:4651 -223:2:3928 -224:0:4651 -225:2:3936 -226:2:3937 -227:2:3941 -228:2:3945 -229:2:3946 -230:2:3950 -231:2:3958 -232:2:3959 -233:2:3963 -234:2:3967 -235:2:3968 -236:2:3963 -237:2:3967 -238:2:3968 -239:2:3972 -240:2:3979 -241:2:3986 -242:2:3987 -243:2:3994 -244:2:3999 -245:2:4006 -246:2:4007 -247:2:4006 -248:2:4007 -249:2:4014 -250:2:4018 -251:0:4651 -252:2:3129 -253:2:3811 -254:0:4651 -255:2:2939 -256:0:4651 -257:2:3130 -258:0:4651 -259:2:2939 -260:0:4651 -261:2:3133 -262:2:3134 -263:2:3138 -264:2:3139 -265:2:3147 -266:2:3148 -267:2:3152 -268:2:3153 -269:2:3161 -270:2:3166 -271:2:3170 -272:2:3171 -273:2:3179 -274:2:3180 -275:2:3184 -276:2:3185 -277:2:3179 -278:2:3180 -279:2:3184 -280:2:3185 -281:2:3193 -282:2:3198 -283:2:3199 -284:2:3210 -285:2:3211 -286:2:3212 -287:2:3223 -288:2:3228 -289:2:3229 -290:2:3240 -291:2:3241 -292:2:3242 -293:2:3240 -294:2:3241 -295:2:3242 -296:2:3253 -297:2:3260 -298:0:4651 -299:2:2939 -300:0:4651 -301:2:3264 -302:2:3265 -303:2:3266 -304:2:3278 -305:2:3279 -306:2:3283 -307:2:3284 -308:2:3292 -309:2:3297 -310:2:3301 -311:2:3302 -312:2:3310 -313:2:3311 -314:2:3315 -315:2:3316 -316:2:3310 -317:2:3311 -318:2:3315 -319:2:3316 -320:2:3324 -321:2:3329 -322:2:3330 -323:2:3341 -324:2:3342 -325:2:3343 -326:2:3354 -327:2:3359 -328:2:3360 -329:2:3371 -330:2:3372 -331:2:3373 -332:2:3371 -333:2:3372 -334:2:3373 -335:2:3384 -336:2:3394 -337:2:3395 -338:0:4651 -339:2:2939 -340:0:4651 -341:2:3799 -342:0:4651 -343:2:4424 -344:2:4425 -345:2:4429 -346:2:4433 -347:2:4434 -348:2:4438 -349:2:4446 -350:2:4447 -351:2:4451 -352:2:4455 -353:2:4456 -354:2:4451 -355:2:4455 -356:2:4456 -357:2:4460 -358:2:4467 -359:2:4474 -360:2:4475 -361:2:4482 -362:2:4487 -363:2:4494 -364:2:4495 -365:2:4494 -366:2:4495 -367:2:4502 -368:2:4506 -369:0:4651 -370:2:4511 -371:0:4651 -372:2:4512 -373:0:4651 -374:2:4513 -375:0:4651 -376:2:4514 -377:0:4651 -378:1:145 -379:0:4651 -380:2:4515 -381:0:4651 -382:1:147 -383:0:4651 -384:2:4514 -385:0:4651 -386:1:46 -387:0:4651 -388:2:4515 -389:0:4651 -390:1:153 -391:1:154 -392:1:158 -393:1:159 -394:1:167 -395:1:168 -396:1:172 -397:1:173 -398:1:181 -399:1:186 -400:1:190 -401:1:191 -402:1:199 -403:1:200 -404:1:204 -405:1:205 -406:1:199 -407:1:200 -408:1:204 -409:1:205 -410:1:213 -411:1:225 -412:1:226 -413:1:230 -414:1:231 -415:1:232 -416:1:243 -417:1:248 -418:1:249 -419:1:260 -420:1:261 -421:1:262 -422:1:260 -423:1:261 -424:1:262 -425:1:273 -426:0:4651 -427:1:42 -428:0:4651 -429:1:43 -430:0:4651 -431:2:4514 -432:0:4651 -433:1:44 -434:0:4651 -435:2:4515 -436:0:4651 -437:1:145 -438:0:4651 -439:1:147 -440:0:4651 -441:2:4514 -442:0:4651 -443:1:46 -444:0:4651 -445:2:4515 -446:0:4651 -447:1:282 -448:1:283 -449:0:4651 -450:1:42 -451:0:4651 -452:1:43 -453:0:4651 -454:2:4514 -455:0:4651 -456:1:44 -457:0:4651 -458:2:4515 -459:0:4651 -460:1:145 -461:0:4651 -462:1:147 -463:0:4651 -464:2:4514 -465:0:4651 -466:1:46 -467:0:4651 -468:2:4515 -469:0:4651 -470:1:289 -471:1:290 -472:1:294 -473:1:295 -474:1:303 -475:1:304 -476:1:308 -477:1:309 -478:1:317 -479:1:322 -480:1:326 -481:1:327 -482:1:335 -483:1:336 -484:1:340 -485:1:341 -486:1:335 -487:1:336 -488:1:340 -489:1:341 -490:1:349 -491:1:361 -492:1:362 -493:1:366 -494:1:367 -495:1:368 -496:1:379 -497:1:384 -498:1:385 -499:1:396 -500:1:397 -501:1:398 -502:1:396 -503:1:397 -504:1:398 -505:1:409 -506:0:4651 -507:1:42 -508:0:4651 -509:1:43 -510:0:4651 -511:2:4514 -512:0:4651 -513:1:44 -514:0:4651 -515:2:4515 -516:0:4651 -517:1:53 -518:0:4651 -519:2:4514 -520:0:4651 -521:1:57 -522:1:58 -523:1:62 -524:1:66 -525:1:67 -526:1:71 -527:1:79 -528:1:80 -529:1:84 -530:1:88 -531:1:89 -532:1:84 -533:1:88 -534:1:89 -535:1:93 -536:1:100 -537:1:107 -538:1:108 -539:1:115 -540:1:120 -541:1:127 -542:1:128 -543:1:127 -544:1:128 -545:1:135 -546:1:139 -547:0:4651 -548:2:4515 -549:0:4651 -550:1:144 -551:0:4651 -552:2:4516 -553:0:4651 -554:2:4521 -555:0:4651 -556:2:4522 -557:0:4651 -558:2:4530 -559:2:4531 -560:2:4535 -561:2:4539 -562:2:4540 -563:2:4544 -564:2:4552 -565:2:4553 -566:2:4557 -567:2:4561 -568:2:4562 -569:2:4557 -570:2:4561 -571:2:4562 -572:2:4566 -573:2:4573 -574:2:4580 -575:2:4581 -576:2:4588 -577:2:4593 -578:2:4600 -579:2:4601 -580:2:4600 -581:2:4601 -582:2:4608 -583:2:4612 -584:0:4651 -585:2:3801 -586:2:3811 -587:0:4651 -588:2:2939 -589:0:4651 -590:2:3802 -591:2:3803 -592:0:4651 -593:2:2939 -594:0:4651 -595:2:3807 -596:0:4651 -597:2:3815 -598:0:4651 -599:2:2932 -600:0:4651 -601:2:2934 -602:0:4651 -603:2:2935 -604:0:4651 -605:2:2936 -606:0:4651 -607:2:2937 -608:0:4651 -609:2:2938 -610:0:4651 -611:2:2939 -612:0:4651 -613:2:2940 -614:2:2941 -615:2:2945 -616:2:2946 -617:2:2954 -618:2:2955 -619:2:2959 -620:2:2960 -621:2:2968 -622:2:2973 -623:2:2977 -624:2:2978 -625:2:2986 -626:2:2987 -627:2:2988 -628:2:2986 -629:2:2987 -630:2:2991 -631:2:2992 -632:2:3000 -633:2:3005 -634:2:3006 -635:2:3017 -636:2:3018 -637:2:3019 -638:2:3030 -639:2:3035 -640:2:3036 -641:2:3047 -642:2:3048 -643:2:3049 -644:2:3047 -645:2:3048 -646:2:3049 -647:2:3060 -648:2:3068 -649:0:4651 -650:2:2939 -651:0:4651 -652:2:3072 -653:2:3076 -654:2:3077 -655:2:3081 -656:2:3085 -657:2:3086 -658:2:3090 -659:2:3098 -660:2:3099 -661:2:3103 -662:2:3104 -663:2:3103 -664:2:3107 -665:2:3108 -666:2:3112 -667:0:4651 -668:2:2939 -669:0:4651 -670:2:3120 -671:2:3121 -672:2:3122 -673:0:4651 -674:2:2939 -675:0:4651 -676:2:3127 -677:0:4651 -678:2:3830 -679:2:3831 -680:2:3835 -681:2:3839 -682:2:3840 -683:2:3844 -684:2:3849 -685:2:3857 -686:2:3861 -687:2:3862 -688:2:3857 -689:2:3861 -690:2:3862 -691:2:3866 -692:2:3873 -693:2:3880 -694:2:3881 -695:2:3888 -696:2:3893 -697:2:3900 -698:2:3901 -699:2:3900 -700:2:3901 -701:2:3908 -702:2:3912 -703:0:4651 -704:2:3917 -705:0:4651 -706:2:3918 -707:0:4651 -708:2:3919 -709:0:4651 -710:2:3920 -711:0:4651 -712:1:145 -713:0:4651 -714:2:3921 -715:0:4651 -716:1:147 -717:0:4651 -718:2:3920 -719:0:4651 -720:1:46 -721:0:4651 -722:2:3921 -723:0:4651 -724:1:418 -725:1:419 -726:1:423 -727:1:424 -728:1:432 -729:1:433 -730:1:437 -731:1:438 -732:1:446 -733:1:451 -734:1:455 -735:1:456 -736:1:464 -737:1:465 -738:1:469 -739:1:470 -740:1:464 -741:1:465 -742:1:469 -743:1:470 -744:1:478 -745:1:483 -746:1:484 -747:1:495 -748:1:496 -749:1:497 -750:1:508 -751:1:520 -752:1:521 -753:1:525 -754:1:526 -755:1:527 -756:1:525 -757:1:526 -758:1:527 -759:1:538 -760:1:545 -761:0:4651 -762:1:42 -763:0:4651 -764:1:43 -765:0:4651 -766:2:3920 -767:0:4651 -768:1:44 -769:0:4651 -770:2:3921 -771:0:4651 -772:1:145 -773:0:4651 -774:1:147 -775:0:4651 -776:2:3920 -777:0:4651 -778:1:46 -779:0:4651 -780:2:3921 -781:0:4651 -782:1:683 -783:1:684 -784:1:688 -785:1:689 -786:1:697 -787:1:698 -788:1:699 -789:1:711 -790:1:716 -791:1:720 -792:1:721 -793:1:729 -794:1:730 -795:1:734 -796:1:735 -797:1:729 -798:1:730 -799:1:734 -800:1:735 -801:1:743 -802:1:748 -803:1:749 -804:1:760 -805:1:761 -806:1:762 -807:1:773 -808:1:785 -809:1:786 -810:1:790 -811:1:791 -812:1:792 -813:1:790 -814:1:791 -815:1:792 -816:1:803 -817:0:4651 -818:1:42 -819:0:4651 -820:1:43 -821:0:4651 -822:2:3920 -823:0:4651 -824:1:44 -825:0:4651 -826:2:3921 -827:0:4651 -828:1:145 -829:0:4651 -830:1:147 -831:0:4651 -832:2:3920 -833:0:4651 -834:1:46 -835:0:4651 -836:2:3921 -837:0:4651 -838:1:812 -839:1:815 -840:1:816 -841:0:4651 -842:1:42 -843:0:4651 -844:1:43 -845:0:4651 -846:2:3920 -847:0:4651 -848:1:44 -849:0:4651 -850:2:3921 -851:0:4651 -852:1:145 -853:0:4651 -854:1:147 -855:0:4651 -856:2:3920 -857:0:4651 -858:1:46 -859:0:4651 -860:2:3921 -861:0:4651 -862:1:819 -863:1:820 -864:1:824 -865:1:825 -866:1:833 -867:1:834 -868:1:838 -869:1:839 -870:1:847 -871:1:852 -872:1:856 -873:1:857 -874:1:865 -875:1:866 -876:1:870 -877:1:871 -878:1:865 -879:1:866 -880:1:870 -881:1:871 -882:1:879 -883:1:884 -884:1:885 -885:1:896 -886:1:897 -887:1:898 -888:1:909 -889:1:921 -890:1:922 -891:1:926 -892:1:927 -893:1:928 -894:1:926 -895:1:927 -896:1:928 -897:1:939 -898:0:4651 -899:1:42 -900:0:4651 -901:1:43 -902:0:4651 -903:2:3920 -904:0:4651 -905:1:44 -906:0:4651 -907:2:3921 -908:0:4651 -909:1:145 -910:0:4651 -911:1:147 -912:0:4651 -913:2:3920 -914:0:4651 -915:1:46 -916:0:4651 -917:2:3921 -918:0:4651 -919:1:1079 -920:1:1080 -921:1:1084 -922:1:1085 -923:1:1093 -924:1:1094 -925:1:1098 -926:1:1099 -927:1:1107 -928:1:1112 -929:1:1116 -930:1:1117 -931:1:1125 -932:1:1126 -933:1:1130 -934:1:1131 -935:1:1125 -936:1:1126 -937:1:1130 -938:1:1131 -939:1:1139 -940:1:1144 -941:1:1145 -942:1:1156 -943:1:1157 -944:1:1158 -945:1:1169 -946:1:1181 -947:1:1182 -948:1:1186 -949:1:1187 -950:1:1188 -951:1:1186 -952:1:1187 -953:1:1188 -954:1:1199 -955:1:1206 -956:1:1210 -957:0:4651 -958:1:42 -959:0:4651 -960:1:43 -961:0:4651 -962:2:3920 -963:0:4651 -964:1:44 -965:0:4651 -966:2:3921 -967:0:4651 -968:1:145 -969:0:4651 -970:1:147 -971:0:4651 -972:2:3920 -973:0:4651 -974:1:46 -975:0:4651 -976:2:3921 -977:0:4651 -978:1:1211 -979:1:1212 -980:1:1216 -981:1:1217 -982:1:1225 -983:1:1226 -984:1:1227 -985:1:1239 -986:1:1244 -987:1:1248 -988:1:1249 -989:1:1257 -990:1:1258 -991:1:1262 -992:1:1263 -993:1:1257 -994:1:1258 -995:1:1262 -996:1:1263 -997:1:1271 -998:1:1276 -999:1:1277 -1000:1:1288 -1001:1:1289 -1002:1:1290 -1003:1:1301 -1004:1:1313 -1005:1:1314 -1006:1:1318 -1007:1:1319 -1008:1:1320 -1009:1:1318 -1010:1:1319 -1011:1:1320 -1012:1:1331 -1013:0:4651 -1014:1:42 -1015:0:4651 -1016:1:43 -1017:0:4651 -1018:2:3920 -1019:0:4651 -1020:1:44 -1021:0:4651 -1022:2:3921 -1023:0:4651 -1024:1:53 -1025:0:4651 -1026:2:3920 -1027:0:4651 -1028:1:57 -1029:1:58 -1030:1:62 -1031:1:66 -1032:1:67 -1033:1:71 -1034:1:79 -1035:1:80 -1036:1:84 -1037:1:88 -1038:1:89 -1039:1:84 -1040:1:88 -1041:1:89 -1042:1:93 -1043:1:100 -1044:1:107 -1045:1:108 -1046:1:115 -1047:1:120 -1048:1:127 -1049:1:128 -1050:1:127 -1051:1:128 -1052:1:135 -1053:1:139 -1054:0:4651 -1055:2:3921 -1056:0:4651 -1057:1:144 -1058:0:4651 -1059:2:3922 -1060:0:4651 -1061:2:3927 -1062:0:4651 -1063:2:3928 -1064:0:4651 -1065:2:3936 -1066:2:3937 -1067:2:3941 -1068:2:3945 -1069:2:3946 -1070:2:3950 -1071:2:3958 -1072:2:3959 -1073:2:3963 -1074:2:3967 -1075:2:3968 -1076:2:3963 -1077:2:3967 -1078:2:3968 -1079:2:3972 -1080:2:3979 -1081:2:3986 -1082:2:3987 -1083:2:3994 -1084:2:3999 -1085:2:4006 -1086:2:4007 -1087:2:4006 -1088:2:4007 -1089:2:4014 -1090:2:4018 -1091:0:4651 -1092:2:3129 -1093:2:3811 -1094:0:4651 -1095:2:2939 -1096:0:4651 -1097:2:3130 -1098:0:4651 -1099:2:2939 -1100:0:4651 -1101:2:3133 -1102:2:3134 -1103:2:3138 -1104:2:3139 -1105:2:3147 -1106:2:3148 -1107:2:3152 -1108:2:3153 -1109:2:3161 -1110:2:3166 -1111:2:3170 -1112:2:3171 -1113:2:3179 -1114:2:3180 -1115:2:3184 -1116:2:3185 -1117:2:3179 -1118:2:3180 -1119:2:3184 -1120:2:3185 -1121:2:3193 -1122:2:3198 -1123:2:3199 -1124:2:3210 -1125:2:3211 -1126:2:3212 -1127:2:3223 -1128:2:3228 -1129:2:3229 -1130:2:3240 -1131:2:3241 -1132:2:3242 -1133:2:3240 -1134:2:3241 -1135:2:3242 -1136:2:3253 -1137:2:3260 -1138:0:4651 -1139:2:2939 -1140:0:4651 -1141:2:3264 -1142:2:3265 -1143:2:3266 -1144:2:3278 -1145:2:3279 -1146:2:3283 -1147:2:3284 -1148:2:3292 -1149:2:3297 -1150:2:3301 -1151:2:3302 -1152:2:3310 -1153:2:3311 -1154:2:3315 -1155:2:3316 -1156:2:3310 -1157:2:3311 -1158:2:3315 -1159:2:3316 -1160:2:3324 -1161:2:3329 -1162:2:3330 -1163:2:3341 -1164:2:3342 -1165:2:3343 -1166:2:3354 -1167:2:3359 -1168:2:3360 -1169:2:3371 -1170:2:3372 -1171:2:3373 -1172:2:3371 -1173:2:3372 -1174:2:3373 -1175:2:3384 -1176:2:3394 -1177:2:3395 -1178:0:4651 -1179:2:2939 -1180:0:4651 -1181:2:3799 -1182:0:4651 -1183:2:4424 -1184:2:4425 -1185:2:4429 -1186:2:4433 -1187:2:4434 -1188:2:4438 -1189:2:4446 -1190:2:4447 -1191:2:4451 -1192:2:4455 -1193:2:4456 -1194:2:4451 -1195:2:4455 -1196:2:4456 -1197:2:4460 -1198:2:4467 -1199:2:4474 -1200:2:4475 -1201:2:4482 -1202:2:4487 -1203:2:4494 -1204:2:4495 -1205:2:4494 -1206:2:4495 -1207:2:4502 -1208:2:4506 -1209:0:4651 -1210:2:4511 -1211:0:4651 -1212:2:4512 -1213:0:4651 -1214:2:4513 -1215:0:4651 -1216:2:4514 -1217:0:4651 -1218:1:53 -1219:0:4651 -1220:2:4515 -1221:0:4651 -1222:1:57 -1223:1:58 -1224:1:62 -1225:1:66 -1226:1:67 -1227:1:71 -1228:1:79 -1229:1:80 -1230:1:84 -1231:1:88 -1232:1:89 -1233:1:84 -1234:1:88 -1235:1:89 -1236:1:93 -1237:1:100 -1238:1:107 -1239:1:108 -1240:1:115 -1241:1:120 -1242:1:127 -1243:1:128 -1244:1:127 -1245:1:128 -1246:1:135 -1247:1:139 -1248:0:4651 -1249:2:4514 -1250:0:4651 -1251:1:144 -1252:0:4651 -1253:2:4515 -1254:0:4651 -1255:2:4516 -1256:0:4651 -1257:2:4521 -1258:0:4651 -1259:2:4522 -1260:0:4651 -1261:2:4530 -1262:2:4531 -1263:2:4535 -1264:2:4539 -1265:2:4540 -1266:2:4544 -1267:2:4552 -1268:2:4553 -1269:2:4557 -1270:2:4561 -1271:2:4562 -1272:2:4557 -1273:2:4561 -1274:2:4562 -1275:2:4566 -1276:2:4573 -1277:2:4580 -1278:2:4581 -1279:2:4588 -1280:2:4593 -1281:2:4600 -1282:2:4601 -1283:2:4600 -1284:2:4601 -1285:2:4608 -1286:2:4612 -1287:0:4651 -1288:2:3801 -1289:2:3811 -1290:0:4651 -1291:2:2939 -1292:0:4651 -1293:2:3802 -1294:2:3803 -1295:0:4651 -1296:2:2939 -1297:0:4651 -1298:2:3807 -1299:0:4651 -1300:2:3815 -1301:0:4651 -1302:2:2932 -1303:0:4651 -1304:2:2934 -1305:0:4651 -1306:2:2935 -1307:0:4651 -1308:2:2936 -1309:0:4651 -1310:2:2937 -1311:0:4651 -1312:2:2938 -1313:0:4651 -1314:2:2939 -1315:0:4651 -1316:2:2940 -1317:2:2941 -1318:2:2945 -1319:2:2946 -1320:2:2954 -1321:2:2955 -1322:2:2959 -1323:2:2960 -1324:2:2968 -1325:2:2973 -1326:2:2977 -1327:2:2978 -1328:2:2986 -1329:2:2987 -1330:2:2991 -1331:2:2992 -1332:2:2986 -1333:2:2987 -1334:2:2988 -1335:2:3000 -1336:2:3005 -1337:2:3006 -1338:2:3017 -1339:2:3018 -1340:2:3019 -1341:2:3030 -1342:2:3035 -1343:2:3036 -1344:2:3047 -1345:2:3048 -1346:2:3049 -1347:2:3047 -1348:2:3048 -1349:2:3049 -1350:2:3060 -1351:2:3068 -1352:0:4651 -1353:2:2939 -1354:0:4651 -1355:1:145 -1356:0:4651 -1357:1:147 -1358:0:4651 -1359:1:46 -1360:0:4651 -1361:1:1340 -1362:0:4651 -1363:1:2804 -1364:1:2811 -1365:1:2812 -1366:1:2819 -1367:1:2824 -1368:1:2831 -1369:1:2832 -1370:1:2831 -1371:1:2832 -1372:1:2839 -1373:1:2843 -1374:0:4651 -1375:2:3072 -1376:2:3076 -1377:2:3077 -1378:2:3081 -1379:2:3085 -1380:2:3086 -1381:2:3090 -1382:2:3098 -1383:2:3099 -1384:2:3103 -1385:2:3107 -1386:2:3108 -1387:2:3103 -1388:2:3104 -1389:2:3112 -1390:0:4651 -1391:2:2939 -1392:0:4651 -1393:2:3120 -1394:2:3121 -1395:2:3122 -1396:0:4651 -1397:2:2939 -1398:0:4651 -1399:2:3127 -1400:0:4651 -1401:2:3830 -1402:2:3831 -1403:2:3835 -1404:2:3839 -1405:2:3840 -1406:2:3844 -1407:2:3849 -1408:2:3857 -1409:2:3861 -1410:2:3862 -1411:2:3857 -1412:2:3861 -1413:2:3862 -1414:2:3866 -1415:2:3873 -1416:2:3880 -1417:2:3881 -1418:2:3888 -1419:2:3893 -1420:2:3900 -1421:2:3901 -1422:2:3900 -1423:2:3901 -1424:2:3908 -1425:2:3912 -1426:0:4651 -1427:2:3917 -1428:0:4651 -1429:2:3918 -1430:0:4651 -1431:2:3919 -1432:0:4651 -1433:2:3920 -1434:0:4651 -1435:1:1342 -1436:1:1343 -1437:0:4649 -1438:2:3921 -1439:0:4655 -1440:1:2458 diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_progress.ltl b/formal-model/urcu-controldataflow-alpha-ipi/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_progress_reader.define b/formal-model/urcu-controldataflow-alpha-ipi/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_progress_writer.define b/formal-model/urcu-controldataflow-alpha-ipi/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu-controldataflow-alpha-ipi/urcu_progress_writer_error.define b/formal-model/urcu-controldataflow-alpha-ipi/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu-controldataflow-alpha-ipi/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/.input.spin b/formal-model/urcu-controldataflow-alpha-no-ipi/.input.spin deleted file mode 100644 index b59aa77..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/.input.spin +++ /dev/null @@ -1,1272 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/DEFINES b/formal-model/urcu-controldataflow-alpha-no-ipi/DEFINES deleted file mode 100644 index a1008a6..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/DEFINES +++ /dev/null @@ -1,18 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/Makefile b/formal-model/urcu-controldataflow-alpha-no-ipi/Makefile deleted file mode 100644 index de47dff..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/Makefile +++ /dev/null @@ -1,170 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/asserts.log b/formal-model/urcu-controldataflow-alpha-no-ipi/asserts.log deleted file mode 100644 index 9a18131..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/asserts.log +++ /dev/null @@ -1,468 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -cat DEFINES > .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w20 -Depth= 4773 States= 1e+06 Transitions= 6.22e+08 Memory= 542.717 t= 624 R= 2e+03 -Depth= 5040 States= 2e+06 Transitions= 1.3e+09 Memory= 618.986 t= 1.33e+03 R= 1e+03 -Depth= 5040 States= 3e+06 Transitions= 1.95e+09 Memory= 695.256 t= 2.03e+03 R= 1e+03 -pan: resizing hashtable to -w22.. done -Depth= 5040 States= 4e+06 Transitions= 2.64e+09 Memory= 802.647 t= 2.73e+03 R= 1e+03 -Depth= 5040 States= 5e+06 Transitions= 3.3e+09 Memory= 878.916 t= 3.41e+03 R= 1e+03 -Depth= 5141 States= 6e+06 Transitions= 3.99e+09 Memory= 955.186 t= 4.12e+03 R= 1e+03 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim - (none specified) - assertion violations + - cycle checks - (disabled by -DSAFETY) - invalid end states + - -State-vector 72 byte, depth reached 5141, errors: 0 - 6711104 states, stored -4.4393201e+09 states, matched -4.4460312e+09 transitions (= stored+matched) -2.5322962e+10 atomic steps -hash conflicts: 3.3332015e+09 (resolved) - -Stats on memory usage (in Megabytes): - 640.021 equivalent memory usage for states (stored*(State-vector + overhead)) - 519.783 actual memory usage for states (compression: 81.21%) - state-vector as stored = 53 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 1009.483 total actual memory usage - -unreached in proctype urcu_reader - line 410, ".input.spin", state 17, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 49, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 63, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 82, "(1)" - line 437, ".input.spin", state 112, "(1)" - line 441, ".input.spin", state 125, "(1)" - line 596, ".input.spin", state 146, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 410, ".input.spin", state 153, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 185, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 199, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 218, "(1)" - line 437, ".input.spin", state 248, "(1)" - line 441, ".input.spin", state 261, "(1)" - line 410, ".input.spin", state 282, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 314, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 328, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 347, "(1)" - line 437, ".input.spin", state 377, "(1)" - line 441, ".input.spin", state 390, "(1)" - line 410, ".input.spin", state 413, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 410, ".input.spin", state 415, "(1)" - line 410, ".input.spin", state 416, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 410, ".input.spin", state 416, "else" - line 410, ".input.spin", state 419, "(1)" - line 414, ".input.spin", state 427, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 429, "(1)" - line 414, ".input.spin", state 430, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 414, ".input.spin", state 430, "else" - line 414, ".input.spin", state 433, "(1)" - line 414, ".input.spin", state 434, "(1)" - line 414, ".input.spin", state 434, "(1)" - line 412, ".input.spin", state 439, "((i<1))" - line 412, ".input.spin", state 439, "((i>=1))" - line 419, ".input.spin", state 445, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 447, "(1)" - line 419, ".input.spin", state 448, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 419, ".input.spin", state 448, "else" - line 419, ".input.spin", state 451, "(1)" - line 419, ".input.spin", state 452, "(1)" - line 419, ".input.spin", state 452, "(1)" - line 423, ".input.spin", state 459, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 461, "(1)" - line 423, ".input.spin", state 462, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 423, ".input.spin", state 462, "else" - line 423, ".input.spin", state 465, "(1)" - line 423, ".input.spin", state 466, "(1)" - line 423, ".input.spin", state 466, "(1)" - line 421, ".input.spin", state 471, "((i<2))" - line 421, ".input.spin", state 471, "((i>=2))" - line 428, ".input.spin", state 478, "(1)" - line 428, ".input.spin", state 479, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 428, ".input.spin", state 479, "else" - line 428, ".input.spin", state 482, "(1)" - line 428, ".input.spin", state 483, "(1)" - line 428, ".input.spin", state 483, "(1)" - line 432, ".input.spin", state 491, "(1)" - line 432, ".input.spin", state 492, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 432, ".input.spin", state 492, "else" - line 432, ".input.spin", state 495, "(1)" - line 432, ".input.spin", state 496, "(1)" - line 432, ".input.spin", state 496, "(1)" - line 430, ".input.spin", state 501, "((i<1))" - line 430, ".input.spin", state 501, "((i>=1))" - line 437, ".input.spin", state 508, "(1)" - line 437, ".input.spin", state 509, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 437, ".input.spin", state 509, "else" - line 437, ".input.spin", state 512, "(1)" - line 437, ".input.spin", state 513, "(1)" - line 437, ".input.spin", state 513, "(1)" - line 441, ".input.spin", state 521, "(1)" - line 441, ".input.spin", state 522, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 441, ".input.spin", state 522, "else" - line 441, ".input.spin", state 525, "(1)" - line 441, ".input.spin", state 526, "(1)" - line 441, ".input.spin", state 526, "(1)" - line 439, ".input.spin", state 531, "((i<2))" - line 439, ".input.spin", state 531, "((i>=2))" - line 449, ".input.spin", state 535, "(1)" - line 449, ".input.spin", state 535, "(1)" - line 596, ".input.spin", state 538, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 596, ".input.spin", state 539, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 596, ".input.spin", state 540, "(1)" - line 271, ".input.spin", state 544, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, ".input.spin", state 555, "(1)" - line 279, ".input.spin", state 566, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, ".input.spin", state 575, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 591, "(1)" - line 252, ".input.spin", state 599, "(1)" - line 256, ".input.spin", state 611, "(1)" - line 260, ".input.spin", state 619, "(1)" - line 410, ".input.spin", state 637, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 651, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 669, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 683, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 702, "(1)" - line 432, ".input.spin", state 715, "(1)" - line 437, ".input.spin", state 732, "(1)" - line 441, ".input.spin", state 745, "(1)" - line 410, ".input.spin", state 773, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 805, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 819, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 838, "(1)" - line 437, ".input.spin", state 868, "(1)" - line 441, ".input.spin", state 881, "(1)" - line 410, ".input.spin", state 902, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 410, ".input.spin", state 904, "(1)" - line 410, ".input.spin", state 905, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 410, ".input.spin", state 905, "else" - line 410, ".input.spin", state 908, "(1)" - line 414, ".input.spin", state 916, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 918, "(1)" - line 414, ".input.spin", state 919, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 414, ".input.spin", state 919, "else" - line 414, ".input.spin", state 922, "(1)" - line 414, ".input.spin", state 923, "(1)" - line 414, ".input.spin", state 923, "(1)" - line 412, ".input.spin", state 928, "((i<1))" - line 412, ".input.spin", state 928, "((i>=1))" - line 419, ".input.spin", state 934, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 936, "(1)" - line 419, ".input.spin", state 937, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 419, ".input.spin", state 937, "else" - line 419, ".input.spin", state 940, "(1)" - line 419, ".input.spin", state 941, "(1)" - line 419, ".input.spin", state 941, "(1)" - line 423, ".input.spin", state 948, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 950, "(1)" - line 423, ".input.spin", state 951, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 423, ".input.spin", state 951, "else" - line 423, ".input.spin", state 954, "(1)" - line 423, ".input.spin", state 955, "(1)" - line 423, ".input.spin", state 955, "(1)" - line 421, ".input.spin", state 960, "((i<2))" - line 421, ".input.spin", state 960, "((i>=2))" - line 428, ".input.spin", state 967, "(1)" - line 428, ".input.spin", state 968, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 428, ".input.spin", state 968, "else" - line 428, ".input.spin", state 971, "(1)" - line 428, ".input.spin", state 972, "(1)" - line 428, ".input.spin", state 972, "(1)" - line 432, ".input.spin", state 980, "(1)" - line 432, ".input.spin", state 981, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 432, ".input.spin", state 981, "else" - line 432, ".input.spin", state 984, "(1)" - line 432, ".input.spin", state 985, "(1)" - line 432, ".input.spin", state 985, "(1)" - line 430, ".input.spin", state 990, "((i<1))" - line 430, ".input.spin", state 990, "((i>=1))" - line 437, ".input.spin", state 997, "(1)" - line 437, ".input.spin", state 998, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 437, ".input.spin", state 998, "else" - line 437, ".input.spin", state 1001, "(1)" - line 437, ".input.spin", state 1002, "(1)" - line 437, ".input.spin", state 1002, "(1)" - line 441, ".input.spin", state 1010, "(1)" - line 441, ".input.spin", state 1011, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 441, ".input.spin", state 1011, "else" - line 441, ".input.spin", state 1014, "(1)" - line 441, ".input.spin", state 1015, "(1)" - line 441, ".input.spin", state 1015, "(1)" - line 439, ".input.spin", state 1020, "((i<2))" - line 439, ".input.spin", state 1020, "((i>=2))" - line 449, ".input.spin", state 1024, "(1)" - line 449, ".input.spin", state 1024, "(1)" - line 604, ".input.spin", state 1028, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 410, ".input.spin", state 1033, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 1047, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 1065, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 1079, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 1098, "(1)" - line 432, ".input.spin", state 1111, "(1)" - line 437, ".input.spin", state 1128, "(1)" - line 441, ".input.spin", state 1141, "(1)" - line 410, ".input.spin", state 1165, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 1197, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 1211, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 1230, "(1)" - line 437, ".input.spin", state 1260, "(1)" - line 441, ".input.spin", state 1273, "(1)" - line 410, ".input.spin", state 1298, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 1330, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 1344, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 1363, "(1)" - line 437, ".input.spin", state 1393, "(1)" - line 441, ".input.spin", state 1406, "(1)" - line 410, ".input.spin", state 1427, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 1459, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 1473, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 1492, "(1)" - line 437, ".input.spin", state 1522, "(1)" - line 441, ".input.spin", state 1535, "(1)" - line 271, ".input.spin", state 1558, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 279, ".input.spin", state 1580, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, ".input.spin", state 1589, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 1605, "(1)" - line 252, ".input.spin", state 1613, "(1)" - line 256, ".input.spin", state 1625, "(1)" - line 260, ".input.spin", state 1633, "(1)" - line 410, ".input.spin", state 1651, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 1665, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 1683, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 1697, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 1716, "(1)" - line 432, ".input.spin", state 1729, "(1)" - line 437, ".input.spin", state 1746, "(1)" - line 441, ".input.spin", state 1759, "(1)" - line 410, ".input.spin", state 1780, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 1794, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 1812, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 1826, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 1845, "(1)" - line 432, ".input.spin", state 1858, "(1)" - line 437, ".input.spin", state 1875, "(1)" - line 441, ".input.spin", state 1888, "(1)" - line 410, ".input.spin", state 1912, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 1944, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 1958, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 1977, "(1)" - line 437, ".input.spin", state 2007, "(1)" - line 441, ".input.spin", state 2020, "(1)" - line 643, ".input.spin", state 2041, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 410, ".input.spin", state 2048, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 2080, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 2094, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 2113, "(1)" - line 437, ".input.spin", state 2143, "(1)" - line 441, ".input.spin", state 2156, "(1)" - line 410, ".input.spin", state 2177, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 2209, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 2223, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 2242, "(1)" - line 437, ".input.spin", state 2272, "(1)" - line 441, ".input.spin", state 2285, "(1)" - line 410, ".input.spin", state 2308, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 410, ".input.spin", state 2310, "(1)" - line 410, ".input.spin", state 2311, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 410, ".input.spin", state 2311, "else" - line 410, ".input.spin", state 2314, "(1)" - line 414, ".input.spin", state 2322, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 2324, "(1)" - line 414, ".input.spin", state 2325, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 414, ".input.spin", state 2325, "else" - line 414, ".input.spin", state 2328, "(1)" - line 414, ".input.spin", state 2329, "(1)" - line 414, ".input.spin", state 2329, "(1)" - line 412, ".input.spin", state 2334, "((i<1))" - line 412, ".input.spin", state 2334, "((i>=1))" - line 419, ".input.spin", state 2340, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 2342, "(1)" - line 419, ".input.spin", state 2343, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 419, ".input.spin", state 2343, "else" - line 419, ".input.spin", state 2346, "(1)" - line 419, ".input.spin", state 2347, "(1)" - line 419, ".input.spin", state 2347, "(1)" - line 423, ".input.spin", state 2354, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 2356, "(1)" - line 423, ".input.spin", state 2357, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 423, ".input.spin", state 2357, "else" - line 423, ".input.spin", state 2360, "(1)" - line 423, ".input.spin", state 2361, "(1)" - line 423, ".input.spin", state 2361, "(1)" - line 421, ".input.spin", state 2366, "((i<2))" - line 421, ".input.spin", state 2366, "((i>=2))" - line 428, ".input.spin", state 2373, "(1)" - line 428, ".input.spin", state 2374, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 428, ".input.spin", state 2374, "else" - line 428, ".input.spin", state 2377, "(1)" - line 428, ".input.spin", state 2378, "(1)" - line 428, ".input.spin", state 2378, "(1)" - line 432, ".input.spin", state 2386, "(1)" - line 432, ".input.spin", state 2387, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 432, ".input.spin", state 2387, "else" - line 432, ".input.spin", state 2390, "(1)" - line 432, ".input.spin", state 2391, "(1)" - line 432, ".input.spin", state 2391, "(1)" - line 430, ".input.spin", state 2396, "((i<1))" - line 430, ".input.spin", state 2396, "((i>=1))" - line 437, ".input.spin", state 2403, "(1)" - line 437, ".input.spin", state 2404, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 437, ".input.spin", state 2404, "else" - line 437, ".input.spin", state 2407, "(1)" - line 437, ".input.spin", state 2408, "(1)" - line 437, ".input.spin", state 2408, "(1)" - line 441, ".input.spin", state 2416, "(1)" - line 441, ".input.spin", state 2417, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 441, ".input.spin", state 2417, "else" - line 441, ".input.spin", state 2420, "(1)" - line 441, ".input.spin", state 2421, "(1)" - line 441, ".input.spin", state 2421, "(1)" - line 439, ".input.spin", state 2426, "((i<2))" - line 439, ".input.spin", state 2426, "((i>=2))" - line 449, ".input.spin", state 2430, "(1)" - line 449, ".input.spin", state 2430, "(1)" - line 643, ".input.spin", state 2433, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 643, ".input.spin", state 2434, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 643, ".input.spin", state 2435, "(1)" - line 271, ".input.spin", state 2439, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 279, ".input.spin", state 2461, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, ".input.spin", state 2470, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 2486, "(1)" - line 252, ".input.spin", state 2494, "(1)" - line 256, ".input.spin", state 2506, "(1)" - line 260, ".input.spin", state 2514, "(1)" - line 410, ".input.spin", state 2532, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 2546, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 2564, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 2578, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 2597, "(1)" - line 432, ".input.spin", state 2610, "(1)" - line 437, ".input.spin", state 2627, "(1)" - line 441, ".input.spin", state 2640, "(1)" - line 271, ".input.spin", state 2664, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, ".input.spin", state 2673, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, ".input.spin", state 2686, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, ".input.spin", state 2695, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 2711, "(1)" - line 252, ".input.spin", state 2719, "(1)" - line 256, ".input.spin", state 2731, "(1)" - line 260, ".input.spin", state 2739, "(1)" - line 410, ".input.spin", state 2757, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 2771, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 2789, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 2803, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 2822, "(1)" - line 432, ".input.spin", state 2835, "(1)" - line 437, ".input.spin", state 2852, "(1)" - line 441, ".input.spin", state 2865, "(1)" - line 410, ".input.spin", state 2886, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 2900, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 2918, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 2932, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 2951, "(1)" - line 432, ".input.spin", state 2964, "(1)" - line 437, ".input.spin", state 2981, "(1)" - line 441, ".input.spin", state 2994, "(1)" - line 248, ".input.spin", state 3027, "(1)" - line 256, ".input.spin", state 3047, "(1)" - line 260, ".input.spin", state 3055, "(1)" - line 248, ".input.spin", state 3070, "(1)" - line 252, ".input.spin", state 3078, "(1)" - line 256, ".input.spin", state 3090, "(1)" - line 260, ".input.spin", state 3098, "(1)" - line 897, ".input.spin", state 3115, "-end-" - (283 of 3115 states) -unreached in proctype urcu_writer - line 410, ".input.spin", state 18, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 32, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 50, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 83, "(1)" - line 432, ".input.spin", state 96, "(1)" - line 437, ".input.spin", state 113, "(1)" - line 271, ".input.spin", state 149, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, ".input.spin", state 158, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, ".input.spin", state 171, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 410, ".input.spin", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 225, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 243, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 257, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, ".input.spin", state 276, "(1)" - line 432, ".input.spin", state 289, "(1)" - line 437, ".input.spin", state 306, "(1)" - line 441, ".input.spin", state 319, "(1)" - line 414, ".input.spin", state 356, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 374, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 388, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 432, ".input.spin", state 420, "(1)" - line 437, ".input.spin", state 437, "(1)" - line 441, ".input.spin", state 450, "(1)" - line 414, ".input.spin", state 495, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 513, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 527, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 432, ".input.spin", state 559, "(1)" - line 437, ".input.spin", state 576, "(1)" - line 441, ".input.spin", state 589, "(1)" - line 414, ".input.spin", state 624, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 642, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 656, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 432, ".input.spin", state 688, "(1)" - line 437, ".input.spin", state 705, "(1)" - line 441, ".input.spin", state 718, "(1)" - line 414, ".input.spin", state 755, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 773, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 787, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 432, ".input.spin", state 819, "(1)" - line 437, ".input.spin", state 836, "(1)" - line 441, ".input.spin", state 849, "(1)" - line 271, ".input.spin", state 904, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, ".input.spin", state 913, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, ".input.spin", state 928, "(1)" - line 283, ".input.spin", state 935, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 951, "(1)" - line 252, ".input.spin", state 959, "(1)" - line 256, ".input.spin", state 971, "(1)" - line 260, ".input.spin", state 979, "(1)" - line 275, ".input.spin", state 1004, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, ".input.spin", state 1017, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, ".input.spin", state 1026, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 1042, "(1)" - line 252, ".input.spin", state 1050, "(1)" - line 256, ".input.spin", state 1062, "(1)" - line 260, ".input.spin", state 1070, "(1)" - line 275, ".input.spin", state 1095, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, ".input.spin", state 1108, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, ".input.spin", state 1117, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 1133, "(1)" - line 252, ".input.spin", state 1141, "(1)" - line 256, ".input.spin", state 1153, "(1)" - line 260, ".input.spin", state 1161, "(1)" - line 275, ".input.spin", state 1186, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, ".input.spin", state 1199, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, ".input.spin", state 1208, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 1224, "(1)" - line 252, ".input.spin", state 1232, "(1)" - line 256, ".input.spin", state 1244, "(1)" - line 260, ".input.spin", state 1252, "(1)" - line 1236, ".input.spin", state 1267, "-end-" - (71 of 1267 states) -unreached in proctype :init: - (0 of 78 states) - -pan: elapsed time 4.59e+03 seconds -pan: rate 1460.6376 states/second -pan: avg transition delay 1.0334e-06 usec -cp .input.spin asserts.spin.input -cp .input.spin.trail asserts.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/asserts.spin.input b/formal-model/urcu-controldataflow-alpha-no-ipi/asserts.spin.input deleted file mode 100644 index b59aa77..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/asserts.spin.input +++ /dev/null @@ -1,1272 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/references.txt b/formal-model/urcu-controldataflow-alpha-no-ipi/references.txt deleted file mode 100644 index 72c67a2..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/references.txt +++ /dev/null @@ -1,13 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html - -LTL vs CTL : - -http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 -http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf - (downloaded) diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu.sh b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu.spin b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu.spin deleted file mode 100644 index 54752a1..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu.spin +++ /dev/null @@ -1,1254 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free.log b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free.log deleted file mode 100644 index 0802f77..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free.log +++ /dev/null @@ -1,479 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1294) -Depth= 5182 States= 1e+06 Transitions= 6.22e+08 Memory= 550.432 t= 762 R= 1e+03 -Depth= 5473 States= 2e+06 Transitions= 1.3e+09 Memory= 634.318 t= 1.62e+03 R= 1e+03 -Depth= 5473 States= 3e+06 Transitions= 1.95e+09 Memory= 718.303 t= 2.47e+03 R= 1e+03 -pan: resizing hashtable to -w22.. done -Depth= 5473 States= 4e+06 Transitions= 2.64e+09 Memory= 833.311 t= 3.32e+03 R= 1e+03 -Depth= 5473 States= 5e+06 Transitions= 3.3e+09 Memory= 917.295 t= 4.14e+03 R= 1e+03 -Depth= 5582 States= 6e+06 Transitions= 3.99e+09 Memory= 1001.279 t= 5e+03 R= 1e+03 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 5582, errors: 0 - 6711104 states, stored -4.4393362e+09 states, matched -4.4460473e+09 transitions (= stored+matched) -2.5322962e+10 atomic steps -hash conflicts: 3.3328749e+09 (resolved) - -Stats on memory usage (in Megabytes): - 742.424 equivalent memory usage for states (stored*(State-vector + overhead)) - 571.575 actual memory usage for states (compression: 76.99%) - state-vector as stored = 61 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 1060.947 total actual memory usage - -unreached in proctype urcu_reader - line 410, "pan.___", state 17, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 49, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 63, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 82, "(1)" - line 437, "pan.___", state 112, "(1)" - line 441, "pan.___", state 125, "(1)" - line 596, "pan.___", state 146, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 410, "pan.___", state 153, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 185, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 199, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 218, "(1)" - line 437, "pan.___", state 248, "(1)" - line 441, "pan.___", state 261, "(1)" - line 410, "pan.___", state 282, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 314, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 328, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 347, "(1)" - line 437, "pan.___", state 377, "(1)" - line 441, "pan.___", state 390, "(1)" - line 410, "pan.___", state 413, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 415, "(1)" - line 410, "pan.___", state 416, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 410, "pan.___", state 416, "else" - line 410, "pan.___", state 419, "(1)" - line 414, "pan.___", state 427, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 429, "(1)" - line 414, "pan.___", state 430, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 414, "pan.___", state 430, "else" - line 414, "pan.___", state 433, "(1)" - line 414, "pan.___", state 434, "(1)" - line 414, "pan.___", state 434, "(1)" - line 412, "pan.___", state 439, "((i<1))" - line 412, "pan.___", state 439, "((i>=1))" - line 419, "pan.___", state 445, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 447, "(1)" - line 419, "pan.___", state 448, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 419, "pan.___", state 448, "else" - line 419, "pan.___", state 451, "(1)" - line 419, "pan.___", state 452, "(1)" - line 419, "pan.___", state 452, "(1)" - line 423, "pan.___", state 459, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 423, "pan.___", state 461, "(1)" - line 423, "pan.___", state 462, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 423, "pan.___", state 462, "else" - line 423, "pan.___", state 465, "(1)" - line 423, "pan.___", state 466, "(1)" - line 423, "pan.___", state 466, "(1)" - line 421, "pan.___", state 471, "((i<2))" - line 421, "pan.___", state 471, "((i>=2))" - line 428, "pan.___", state 478, "(1)" - line 428, "pan.___", state 479, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 428, "pan.___", state 479, "else" - line 428, "pan.___", state 482, "(1)" - line 428, "pan.___", state 483, "(1)" - line 428, "pan.___", state 483, "(1)" - line 432, "pan.___", state 491, "(1)" - line 432, "pan.___", state 492, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 432, "pan.___", state 492, "else" - line 432, "pan.___", state 495, "(1)" - line 432, "pan.___", state 496, "(1)" - line 432, "pan.___", state 496, "(1)" - line 430, "pan.___", state 501, "((i<1))" - line 430, "pan.___", state 501, "((i>=1))" - line 437, "pan.___", state 508, "(1)" - line 437, "pan.___", state 509, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 437, "pan.___", state 509, "else" - line 437, "pan.___", state 512, "(1)" - line 437, "pan.___", state 513, "(1)" - line 437, "pan.___", state 513, "(1)" - line 441, "pan.___", state 521, "(1)" - line 441, "pan.___", state 522, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 441, "pan.___", state 522, "else" - line 441, "pan.___", state 525, "(1)" - line 441, "pan.___", state 526, "(1)" - line 441, "pan.___", state 526, "(1)" - line 439, "pan.___", state 531, "((i<2))" - line 439, "pan.___", state 531, "((i>=2))" - line 449, "pan.___", state 535, "(1)" - line 449, "pan.___", state 535, "(1)" - line 596, "pan.___", state 538, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 596, "pan.___", state 539, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 596, "pan.___", state 540, "(1)" - line 271, "pan.___", state 544, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 555, "(1)" - line 279, "pan.___", state 566, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 575, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 591, "(1)" - line 252, "pan.___", state 599, "(1)" - line 256, "pan.___", state 611, "(1)" - line 260, "pan.___", state 619, "(1)" - line 410, "pan.___", state 637, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 651, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 669, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 683, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 702, "(1)" - line 432, "pan.___", state 715, "(1)" - line 437, "pan.___", state 732, "(1)" - line 441, "pan.___", state 745, "(1)" - line 410, "pan.___", state 773, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 805, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 819, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 838, "(1)" - line 437, "pan.___", state 868, "(1)" - line 441, "pan.___", state 881, "(1)" - line 410, "pan.___", state 902, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 904, "(1)" - line 410, "pan.___", state 905, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 410, "pan.___", state 905, "else" - line 410, "pan.___", state 908, "(1)" - line 414, "pan.___", state 916, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 918, "(1)" - line 414, "pan.___", state 919, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 414, "pan.___", state 919, "else" - line 414, "pan.___", state 922, "(1)" - line 414, "pan.___", state 923, "(1)" - line 414, "pan.___", state 923, "(1)" - line 412, "pan.___", state 928, "((i<1))" - line 412, "pan.___", state 928, "((i>=1))" - line 419, "pan.___", state 934, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 936, "(1)" - line 419, "pan.___", state 937, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 419, "pan.___", state 937, "else" - line 419, "pan.___", state 940, "(1)" - line 419, "pan.___", state 941, "(1)" - line 419, "pan.___", state 941, "(1)" - line 423, "pan.___", state 948, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 423, "pan.___", state 950, "(1)" - line 423, "pan.___", state 951, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 423, "pan.___", state 951, "else" - line 423, "pan.___", state 954, "(1)" - line 423, "pan.___", state 955, "(1)" - line 423, "pan.___", state 955, "(1)" - line 421, "pan.___", state 960, "((i<2))" - line 421, "pan.___", state 960, "((i>=2))" - line 428, "pan.___", state 967, "(1)" - line 428, "pan.___", state 968, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 428, "pan.___", state 968, "else" - line 428, "pan.___", state 971, "(1)" - line 428, "pan.___", state 972, "(1)" - line 428, "pan.___", state 972, "(1)" - line 432, "pan.___", state 980, "(1)" - line 432, "pan.___", state 981, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 432, "pan.___", state 981, "else" - line 432, "pan.___", state 984, "(1)" - line 432, "pan.___", state 985, "(1)" - line 432, "pan.___", state 985, "(1)" - line 430, "pan.___", state 990, "((i<1))" - line 430, "pan.___", state 990, "((i>=1))" - line 437, "pan.___", state 997, "(1)" - line 437, "pan.___", state 998, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 437, "pan.___", state 998, "else" - line 437, "pan.___", state 1001, "(1)" - line 437, "pan.___", state 1002, "(1)" - line 437, "pan.___", state 1002, "(1)" - line 441, "pan.___", state 1010, "(1)" - line 441, "pan.___", state 1011, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 441, "pan.___", state 1011, "else" - line 441, "pan.___", state 1014, "(1)" - line 441, "pan.___", state 1015, "(1)" - line 441, "pan.___", state 1015, "(1)" - line 439, "pan.___", state 1020, "((i<2))" - line 439, "pan.___", state 1020, "((i>=2))" - line 449, "pan.___", state 1024, "(1)" - line 449, "pan.___", state 1024, "(1)" - line 604, "pan.___", state 1028, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 410, "pan.___", state 1033, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1047, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1065, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1079, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 1098, "(1)" - line 432, "pan.___", state 1111, "(1)" - line 437, "pan.___", state 1128, "(1)" - line 441, "pan.___", state 1141, "(1)" - line 410, "pan.___", state 1165, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1197, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1211, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 1230, "(1)" - line 437, "pan.___", state 1260, "(1)" - line 441, "pan.___", state 1273, "(1)" - line 410, "pan.___", state 1298, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1330, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1344, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 1363, "(1)" - line 437, "pan.___", state 1393, "(1)" - line 441, "pan.___", state 1406, "(1)" - line 410, "pan.___", state 1427, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1459, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1473, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 1492, "(1)" - line 437, "pan.___", state 1522, "(1)" - line 441, "pan.___", state 1535, "(1)" - line 271, "pan.___", state 1558, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 1580, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 1589, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1605, "(1)" - line 252, "pan.___", state 1613, "(1)" - line 256, "pan.___", state 1625, "(1)" - line 260, "pan.___", state 1633, "(1)" - line 410, "pan.___", state 1651, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1665, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1683, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1697, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 1716, "(1)" - line 432, "pan.___", state 1729, "(1)" - line 437, "pan.___", state 1746, "(1)" - line 441, "pan.___", state 1759, "(1)" - line 410, "pan.___", state 1780, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1794, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1812, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1826, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 1845, "(1)" - line 432, "pan.___", state 1858, "(1)" - line 437, "pan.___", state 1875, "(1)" - line 441, "pan.___", state 1888, "(1)" - line 410, "pan.___", state 1912, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1944, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1958, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 1977, "(1)" - line 437, "pan.___", state 2007, "(1)" - line 441, "pan.___", state 2020, "(1)" - line 643, "pan.___", state 2041, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 410, "pan.___", state 2048, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 2080, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 2094, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 2113, "(1)" - line 437, "pan.___", state 2143, "(1)" - line 441, "pan.___", state 2156, "(1)" - line 410, "pan.___", state 2177, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 2209, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 2223, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 2242, "(1)" - line 437, "pan.___", state 2272, "(1)" - line 441, "pan.___", state 2285, "(1)" - line 410, "pan.___", state 2308, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 2310, "(1)" - line 410, "pan.___", state 2311, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 410, "pan.___", state 2311, "else" - line 410, "pan.___", state 2314, "(1)" - line 414, "pan.___", state 2322, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 2324, "(1)" - line 414, "pan.___", state 2325, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 414, "pan.___", state 2325, "else" - line 414, "pan.___", state 2328, "(1)" - line 414, "pan.___", state 2329, "(1)" - line 414, "pan.___", state 2329, "(1)" - line 412, "pan.___", state 2334, "((i<1))" - line 412, "pan.___", state 2334, "((i>=1))" - line 419, "pan.___", state 2340, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 2342, "(1)" - line 419, "pan.___", state 2343, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 419, "pan.___", state 2343, "else" - line 419, "pan.___", state 2346, "(1)" - line 419, "pan.___", state 2347, "(1)" - line 419, "pan.___", state 2347, "(1)" - line 423, "pan.___", state 2354, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 423, "pan.___", state 2356, "(1)" - line 423, "pan.___", state 2357, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 423, "pan.___", state 2357, "else" - line 423, "pan.___", state 2360, "(1)" - line 423, "pan.___", state 2361, "(1)" - line 423, "pan.___", state 2361, "(1)" - line 421, "pan.___", state 2366, "((i<2))" - line 421, "pan.___", state 2366, "((i>=2))" - line 428, "pan.___", state 2373, "(1)" - line 428, "pan.___", state 2374, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 428, "pan.___", state 2374, "else" - line 428, "pan.___", state 2377, "(1)" - line 428, "pan.___", state 2378, "(1)" - line 428, "pan.___", state 2378, "(1)" - line 432, "pan.___", state 2386, "(1)" - line 432, "pan.___", state 2387, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 432, "pan.___", state 2387, "else" - line 432, "pan.___", state 2390, "(1)" - line 432, "pan.___", state 2391, "(1)" - line 432, "pan.___", state 2391, "(1)" - line 430, "pan.___", state 2396, "((i<1))" - line 430, "pan.___", state 2396, "((i>=1))" - line 437, "pan.___", state 2403, "(1)" - line 437, "pan.___", state 2404, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 437, "pan.___", state 2404, "else" - line 437, "pan.___", state 2407, "(1)" - line 437, "pan.___", state 2408, "(1)" - line 437, "pan.___", state 2408, "(1)" - line 441, "pan.___", state 2416, "(1)" - line 441, "pan.___", state 2417, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 441, "pan.___", state 2417, "else" - line 441, "pan.___", state 2420, "(1)" - line 441, "pan.___", state 2421, "(1)" - line 441, "pan.___", state 2421, "(1)" - line 439, "pan.___", state 2426, "((i<2))" - line 439, "pan.___", state 2426, "((i>=2))" - line 449, "pan.___", state 2430, "(1)" - line 449, "pan.___", state 2430, "(1)" - line 643, "pan.___", state 2433, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 643, "pan.___", state 2434, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 643, "pan.___", state 2435, "(1)" - line 271, "pan.___", state 2439, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 2461, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 2470, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 2486, "(1)" - line 252, "pan.___", state 2494, "(1)" - line 256, "pan.___", state 2506, "(1)" - line 260, "pan.___", state 2514, "(1)" - line 410, "pan.___", state 2532, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 2546, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 2564, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 2578, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 2597, "(1)" - line 432, "pan.___", state 2610, "(1)" - line 437, "pan.___", state 2627, "(1)" - line 441, "pan.___", state 2640, "(1)" - line 271, "pan.___", state 2664, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 2673, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 2686, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 2695, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 2711, "(1)" - line 252, "pan.___", state 2719, "(1)" - line 256, "pan.___", state 2731, "(1)" - line 260, "pan.___", state 2739, "(1)" - line 410, "pan.___", state 2757, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 2771, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 2789, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 2803, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 2822, "(1)" - line 432, "pan.___", state 2835, "(1)" - line 437, "pan.___", state 2852, "(1)" - line 441, "pan.___", state 2865, "(1)" - line 410, "pan.___", state 2886, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 2900, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 2918, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 2932, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 2951, "(1)" - line 432, "pan.___", state 2964, "(1)" - line 437, "pan.___", state 2981, "(1)" - line 441, "pan.___", state 2994, "(1)" - line 248, "pan.___", state 3027, "(1)" - line 256, "pan.___", state 3047, "(1)" - line 260, "pan.___", state 3055, "(1)" - line 248, "pan.___", state 3070, "(1)" - line 252, "pan.___", state 3078, "(1)" - line 256, "pan.___", state 3090, "(1)" - line 260, "pan.___", state 3098, "(1)" - line 897, "pan.___", state 3115, "-end-" - (283 of 3115 states) -unreached in proctype urcu_writer - line 410, "pan.___", state 18, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 32, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 50, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 428, "pan.___", state 83, "(1)" - line 432, "pan.___", state 96, "(1)" - line 437, "pan.___", state 113, "(1)" - line 271, "pan.___", state 149, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 158, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 171, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 225, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 243, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 257, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 428, "pan.___", state 276, "(1)" - line 432, "pan.___", state 289, "(1)" - line 437, "pan.___", state 306, "(1)" - line 441, "pan.___", state 319, "(1)" - line 414, "pan.___", state 356, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 374, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 388, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 432, "pan.___", state 420, "(1)" - line 437, "pan.___", state 437, "(1)" - line 441, "pan.___", state 450, "(1)" - line 414, "pan.___", state 495, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 513, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 527, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 432, "pan.___", state 559, "(1)" - line 437, "pan.___", state 576, "(1)" - line 441, "pan.___", state 589, "(1)" - line 414, "pan.___", state 624, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 642, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 656, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 432, "pan.___", state 688, "(1)" - line 437, "pan.___", state 705, "(1)" - line 441, "pan.___", state 718, "(1)" - line 414, "pan.___", state 755, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 773, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 787, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 432, "pan.___", state 819, "(1)" - line 437, "pan.___", state 836, "(1)" - line 441, "pan.___", state 849, "(1)" - line 271, "pan.___", state 904, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 913, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 928, "(1)" - line 283, "pan.___", state 935, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 951, "(1)" - line 252, "pan.___", state 959, "(1)" - line 256, "pan.___", state 971, "(1)" - line 260, "pan.___", state 979, "(1)" - line 275, "pan.___", state 1004, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 1017, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 1026, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1042, "(1)" - line 252, "pan.___", state 1050, "(1)" - line 256, "pan.___", state 1062, "(1)" - line 260, "pan.___", state 1070, "(1)" - line 275, "pan.___", state 1095, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 1108, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 1117, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1133, "(1)" - line 252, "pan.___", state 1141, "(1)" - line 256, "pan.___", state 1153, "(1)" - line 260, "pan.___", state 1161, "(1)" - line 275, "pan.___", state 1186, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 1199, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 1208, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1224, "(1)" - line 252, "pan.___", state 1232, "(1)" - line 256, "pan.___", state 1244, "(1)" - line 260, "pan.___", state 1252, "(1)" - line 1236, "pan.___", state 1267, "-end-" - (71 of 1267 states) -unreached in proctype :init: - (0 of 78 states) -unreached in proctype :never: - line 1299, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 5.57e+03 seconds -pan: rate 1203.9777 states/second -pan: avg transition delay 1.2537e-06 usec -cp .input.spin urcu_free.spin.input -cp .input.spin.trail urcu_free.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free.ltl b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free.ltl deleted file mode 100644 index 6be1be9..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free.ltl +++ /dev/null @@ -1 +0,0 @@ -[] (!read_poison) diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free.spin.input b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free.spin.input deleted file mode 100644 index b59aa77..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free.spin.input +++ /dev/null @@ -1,1272 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_nested.define b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_nested.define deleted file mode 100644 index 0fb59bd..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_nested.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_NEST_LEVEL 2 diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_mb.define b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_mb.define deleted file mode 100644 index d99d793..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_mb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_MB diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_mb.log b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_mb.log deleted file mode 100644 index 5ccd769..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_mb.log +++ /dev/null @@ -1,841 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_mb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1295) -Depth= 5985 States= 1e+06 Transitions= 3.71e+08 Memory= 550.432 t= 439 R= 2e+03 -Depth= 8926 States= 2e+06 Transitions= 9.51e+08 Memory= 634.416 t= 1.15e+03 R= 2e+03 -Depth= 8926 States= 3e+06 Transitions= 1.54e+09 Memory= 718.303 t= 1.89e+03 R= 2e+03 -pan: resizing hashtable to -w22.. done -Depth= 8926 States= 4e+06 Transitions= 2.08e+09 Memory= 833.311 t= 2.56e+03 R= 2e+03 -Depth= 8926 States= 5e+06 Transitions= 2.46e+09 Memory= 917.295 t= 3.01e+03 R= 2e+03 -Depth= 8926 States= 6e+06 Transitions= 2.91e+09 Memory= 1001.279 t= 3.56e+03 R= 2e+03 -pan: claim violated! (at depth 1267) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 8926, errors: 1 - 6822337 states, stored -3.2012922e+09 states, matched -3.2081145e+09 transitions (= stored+matched) -1.7190132e+10 atomic steps -hash conflicts: 2.341747e+09 (resolved) - -Stats on memory usage (in Megabytes): - 754.729 equivalent memory usage for states (stored*(State-vector + overhead)) - 580.944 actual memory usage for states (compression: 76.97%) - state-vector as stored = 61 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 1070.322 total actual memory usage - -unreached in proctype urcu_reader - line 411, "pan.___", state 21, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 53, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 67, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 86, "(1)" - line 438, "pan.___", state 116, "(1)" - line 442, "pan.___", state 129, "(1)" - line 603, "pan.___", state 150, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 411, "pan.___", state 157, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 189, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 203, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 222, "(1)" - line 438, "pan.___", state 252, "(1)" - line 442, "pan.___", state 265, "(1)" - line 411, "pan.___", state 286, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 318, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 332, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 351, "(1)" - line 438, "pan.___", state 381, "(1)" - line 442, "pan.___", state 394, "(1)" - line 411, "pan.___", state 417, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 419, "(1)" - line 411, "pan.___", state 420, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 420, "else" - line 411, "pan.___", state 423, "(1)" - line 415, "pan.___", state 431, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 433, "(1)" - line 415, "pan.___", state 434, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 434, "else" - line 415, "pan.___", state 437, "(1)" - line 415, "pan.___", state 438, "(1)" - line 415, "pan.___", state 438, "(1)" - line 413, "pan.___", state 443, "((i<1))" - line 413, "pan.___", state 443, "((i>=1))" - line 420, "pan.___", state 449, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 451, "(1)" - line 420, "pan.___", state 452, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 452, "else" - line 420, "pan.___", state 455, "(1)" - line 420, "pan.___", state 456, "(1)" - line 420, "pan.___", state 456, "(1)" - line 424, "pan.___", state 463, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 465, "(1)" - line 424, "pan.___", state 466, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 466, "else" - line 424, "pan.___", state 469, "(1)" - line 424, "pan.___", state 470, "(1)" - line 424, "pan.___", state 470, "(1)" - line 422, "pan.___", state 475, "((i<2))" - line 422, "pan.___", state 475, "((i>=2))" - line 429, "pan.___", state 482, "(1)" - line 429, "pan.___", state 483, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 483, "else" - line 429, "pan.___", state 486, "(1)" - line 429, "pan.___", state 487, "(1)" - line 429, "pan.___", state 487, "(1)" - line 433, "pan.___", state 495, "(1)" - line 433, "pan.___", state 496, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 496, "else" - line 433, "pan.___", state 499, "(1)" - line 433, "pan.___", state 500, "(1)" - line 433, "pan.___", state 500, "(1)" - line 431, "pan.___", state 505, "((i<1))" - line 431, "pan.___", state 505, "((i>=1))" - line 438, "pan.___", state 512, "(1)" - line 438, "pan.___", state 513, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 513, "else" - line 438, "pan.___", state 516, "(1)" - line 438, "pan.___", state 517, "(1)" - line 438, "pan.___", state 517, "(1)" - line 442, "pan.___", state 525, "(1)" - line 442, "pan.___", state 526, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 526, "else" - line 442, "pan.___", state 529, "(1)" - line 442, "pan.___", state 530, "(1)" - line 442, "pan.___", state 530, "(1)" - line 440, "pan.___", state 535, "((i<2))" - line 440, "pan.___", state 535, "((i>=2))" - line 450, "pan.___", state 539, "(1)" - line 450, "pan.___", state 539, "(1)" - line 603, "pan.___", state 542, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 603, "pan.___", state 543, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 603, "pan.___", state 544, "(1)" - line 272, "pan.___", state 548, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 550, "(1)" - line 276, "pan.___", state 557, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 559, "(1)" - line 276, "pan.___", state 560, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 560, "else" - line 274, "pan.___", state 565, "((i<1))" - line 274, "pan.___", state 565, "((i>=1))" - line 280, "pan.___", state 570, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 572, "(1)" - line 280, "pan.___", state 573, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 573, "else" - line 284, "pan.___", state 579, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 581, "(1)" - line 284, "pan.___", state 582, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 582, "else" - line 282, "pan.___", state 587, "((i<2))" - line 282, "pan.___", state 587, "((i>=2))" - line 249, "pan.___", state 595, "(1)" - line 253, "pan.___", state 603, "(1)" - line 253, "pan.___", state 604, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 604, "else" - line 251, "pan.___", state 609, "((i<1))" - line 251, "pan.___", state 609, "((i>=1))" - line 257, "pan.___", state 615, "(1)" - line 257, "pan.___", state 616, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 616, "else" - line 261, "pan.___", state 623, "(1)" - line 261, "pan.___", state 624, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 624, "else" - line 266, "pan.___", state 633, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 633, "else" - line 299, "pan.___", state 635, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 635, "else" - line 411, "pan.___", state 641, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 673, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 687, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 706, "(1)" - line 438, "pan.___", state 736, "(1)" - line 442, "pan.___", state 749, "(1)" - line 411, "pan.___", state 777, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 809, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 823, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 842, "(1)" - line 438, "pan.___", state 872, "(1)" - line 442, "pan.___", state 885, "(1)" - line 411, "pan.___", state 906, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 908, "(1)" - line 411, "pan.___", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 909, "else" - line 411, "pan.___", state 912, "(1)" - line 415, "pan.___", state 920, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 922, "(1)" - line 415, "pan.___", state 923, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 923, "else" - line 415, "pan.___", state 926, "(1)" - line 415, "pan.___", state 927, "(1)" - line 415, "pan.___", state 927, "(1)" - line 413, "pan.___", state 932, "((i<1))" - line 413, "pan.___", state 932, "((i>=1))" - line 420, "pan.___", state 938, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 940, "(1)" - line 420, "pan.___", state 941, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 941, "else" - line 420, "pan.___", state 944, "(1)" - line 420, "pan.___", state 945, "(1)" - line 420, "pan.___", state 945, "(1)" - line 424, "pan.___", state 952, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 954, "(1)" - line 424, "pan.___", state 955, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 955, "else" - line 424, "pan.___", state 958, "(1)" - line 424, "pan.___", state 959, "(1)" - line 424, "pan.___", state 959, "(1)" - line 422, "pan.___", state 964, "((i<2))" - line 422, "pan.___", state 964, "((i>=2))" - line 429, "pan.___", state 971, "(1)" - line 429, "pan.___", state 972, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 972, "else" - line 429, "pan.___", state 975, "(1)" - line 429, "pan.___", state 976, "(1)" - line 429, "pan.___", state 976, "(1)" - line 433, "pan.___", state 984, "(1)" - line 433, "pan.___", state 985, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 985, "else" - line 433, "pan.___", state 988, "(1)" - line 433, "pan.___", state 989, "(1)" - line 433, "pan.___", state 989, "(1)" - line 431, "pan.___", state 994, "((i<1))" - line 431, "pan.___", state 994, "((i>=1))" - line 438, "pan.___", state 1001, "(1)" - line 438, "pan.___", state 1002, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 1002, "else" - line 438, "pan.___", state 1005, "(1)" - line 438, "pan.___", state 1006, "(1)" - line 438, "pan.___", state 1006, "(1)" - line 442, "pan.___", state 1014, "(1)" - line 442, "pan.___", state 1015, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 1015, "else" - line 442, "pan.___", state 1018, "(1)" - line 442, "pan.___", state 1019, "(1)" - line 442, "pan.___", state 1019, "(1)" - line 440, "pan.___", state 1024, "((i<2))" - line 440, "pan.___", state 1024, "((i>=2))" - line 450, "pan.___", state 1028, "(1)" - line 450, "pan.___", state 1028, "(1)" - line 611, "pan.___", state 1032, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 411, "pan.___", state 1037, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1069, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1083, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1102, "(1)" - line 438, "pan.___", state 1132, "(1)" - line 442, "pan.___", state 1145, "(1)" - line 411, "pan.___", state 1169, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1201, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1215, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1234, "(1)" - line 438, "pan.___", state 1264, "(1)" - line 442, "pan.___", state 1277, "(1)" - line 411, "pan.___", state 1302, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1334, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1348, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1367, "(1)" - line 438, "pan.___", state 1397, "(1)" - line 442, "pan.___", state 1410, "(1)" - line 411, "pan.___", state 1431, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1463, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1477, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1496, "(1)" - line 438, "pan.___", state 1526, "(1)" - line 442, "pan.___", state 1539, "(1)" - line 272, "pan.___", state 1562, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 1564, "(1)" - line 276, "pan.___", state 1571, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1573, "(1)" - line 276, "pan.___", state 1574, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 1574, "else" - line 274, "pan.___", state 1579, "((i<1))" - line 274, "pan.___", state 1579, "((i>=1))" - line 280, "pan.___", state 1584, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1586, "(1)" - line 280, "pan.___", state 1587, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 1587, "else" - line 284, "pan.___", state 1593, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1595, "(1)" - line 284, "pan.___", state 1596, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 1596, "else" - line 282, "pan.___", state 1601, "((i<2))" - line 282, "pan.___", state 1601, "((i>=2))" - line 249, "pan.___", state 1609, "(1)" - line 253, "pan.___", state 1617, "(1)" - line 253, "pan.___", state 1618, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 1618, "else" - line 251, "pan.___", state 1623, "((i<1))" - line 251, "pan.___", state 1623, "((i>=1))" - line 257, "pan.___", state 1629, "(1)" - line 257, "pan.___", state 1630, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 1630, "else" - line 261, "pan.___", state 1637, "(1)" - line 261, "pan.___", state 1638, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 1638, "else" - line 266, "pan.___", state 1647, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 1647, "else" - line 299, "pan.___", state 1649, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 1649, "else" - line 411, "pan.___", state 1655, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1687, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1701, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1720, "(1)" - line 438, "pan.___", state 1750, "(1)" - line 442, "pan.___", state 1763, "(1)" - line 411, "pan.___", state 1784, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1816, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1830, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1849, "(1)" - line 438, "pan.___", state 1879, "(1)" - line 442, "pan.___", state 1892, "(1)" - line 411, "pan.___", state 1916, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1948, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1962, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1981, "(1)" - line 438, "pan.___", state 2011, "(1)" - line 442, "pan.___", state 2024, "(1)" - line 650, "pan.___", state 2045, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 411, "pan.___", state 2052, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2084, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2098, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2117, "(1)" - line 438, "pan.___", state 2147, "(1)" - line 442, "pan.___", state 2160, "(1)" - line 411, "pan.___", state 2181, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2213, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2227, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2246, "(1)" - line 438, "pan.___", state 2276, "(1)" - line 442, "pan.___", state 2289, "(1)" - line 411, "pan.___", state 2312, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 2314, "(1)" - line 411, "pan.___", state 2315, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 2315, "else" - line 411, "pan.___", state 2318, "(1)" - line 415, "pan.___", state 2326, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2328, "(1)" - line 415, "pan.___", state 2329, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 2329, "else" - line 415, "pan.___", state 2332, "(1)" - line 415, "pan.___", state 2333, "(1)" - line 415, "pan.___", state 2333, "(1)" - line 413, "pan.___", state 2338, "((i<1))" - line 413, "pan.___", state 2338, "((i>=1))" - line 420, "pan.___", state 2344, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2346, "(1)" - line 420, "pan.___", state 2347, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 2347, "else" - line 420, "pan.___", state 2350, "(1)" - line 420, "pan.___", state 2351, "(1)" - line 420, "pan.___", state 2351, "(1)" - line 424, "pan.___", state 2358, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2360, "(1)" - line 424, "pan.___", state 2361, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 2361, "else" - line 424, "pan.___", state 2364, "(1)" - line 424, "pan.___", state 2365, "(1)" - line 424, "pan.___", state 2365, "(1)" - line 422, "pan.___", state 2370, "((i<2))" - line 422, "pan.___", state 2370, "((i>=2))" - line 429, "pan.___", state 2377, "(1)" - line 429, "pan.___", state 2378, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 2378, "else" - line 429, "pan.___", state 2381, "(1)" - line 429, "pan.___", state 2382, "(1)" - line 429, "pan.___", state 2382, "(1)" - line 433, "pan.___", state 2390, "(1)" - line 433, "pan.___", state 2391, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 2391, "else" - line 433, "pan.___", state 2394, "(1)" - line 433, "pan.___", state 2395, "(1)" - line 433, "pan.___", state 2395, "(1)" - line 431, "pan.___", state 2400, "((i<1))" - line 431, "pan.___", state 2400, "((i>=1))" - line 438, "pan.___", state 2407, "(1)" - line 438, "pan.___", state 2408, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 2408, "else" - line 438, "pan.___", state 2411, "(1)" - line 438, "pan.___", state 2412, "(1)" - line 438, "pan.___", state 2412, "(1)" - line 442, "pan.___", state 2420, "(1)" - line 442, "pan.___", state 2421, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 2421, "else" - line 442, "pan.___", state 2424, "(1)" - line 442, "pan.___", state 2425, "(1)" - line 442, "pan.___", state 2425, "(1)" - line 440, "pan.___", state 2430, "((i<2))" - line 440, "pan.___", state 2430, "((i>=2))" - line 450, "pan.___", state 2434, "(1)" - line 450, "pan.___", state 2434, "(1)" - line 650, "pan.___", state 2437, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 650, "pan.___", state 2438, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 650, "pan.___", state 2439, "(1)" - line 272, "pan.___", state 2443, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 2445, "(1)" - line 276, "pan.___", state 2452, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 2454, "(1)" - line 276, "pan.___", state 2455, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 2455, "else" - line 274, "pan.___", state 2460, "((i<1))" - line 274, "pan.___", state 2460, "((i>=1))" - line 280, "pan.___", state 2465, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2467, "(1)" - line 280, "pan.___", state 2468, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 2468, "else" - line 284, "pan.___", state 2474, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2476, "(1)" - line 284, "pan.___", state 2477, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 2477, "else" - line 282, "pan.___", state 2482, "((i<2))" - line 282, "pan.___", state 2482, "((i>=2))" - line 249, "pan.___", state 2490, "(1)" - line 253, "pan.___", state 2498, "(1)" - line 253, "pan.___", state 2499, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 2499, "else" - line 251, "pan.___", state 2504, "((i<1))" - line 251, "pan.___", state 2504, "((i>=1))" - line 257, "pan.___", state 2510, "(1)" - line 257, "pan.___", state 2511, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 2511, "else" - line 261, "pan.___", state 2518, "(1)" - line 261, "pan.___", state 2519, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 2519, "else" - line 266, "pan.___", state 2528, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 2528, "else" - line 299, "pan.___", state 2530, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 2530, "else" - line 411, "pan.___", state 2536, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2568, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2582, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2601, "(1)" - line 438, "pan.___", state 2631, "(1)" - line 442, "pan.___", state 2644, "(1)" - line 272, "pan.___", state 2668, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 2670, "(1)" - line 276, "pan.___", state 2677, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 2679, "(1)" - line 276, "pan.___", state 2680, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 2680, "else" - line 274, "pan.___", state 2685, "((i<1))" - line 274, "pan.___", state 2685, "((i>=1))" - line 280, "pan.___", state 2690, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2692, "(1)" - line 280, "pan.___", state 2693, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 2693, "else" - line 284, "pan.___", state 2699, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2701, "(1)" - line 284, "pan.___", state 2702, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 2702, "else" - line 282, "pan.___", state 2707, "((i<2))" - line 282, "pan.___", state 2707, "((i>=2))" - line 249, "pan.___", state 2715, "(1)" - line 253, "pan.___", state 2723, "(1)" - line 253, "pan.___", state 2724, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 2724, "else" - line 251, "pan.___", state 2729, "((i<1))" - line 251, "pan.___", state 2729, "((i>=1))" - line 257, "pan.___", state 2735, "(1)" - line 257, "pan.___", state 2736, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 2736, "else" - line 261, "pan.___", state 2743, "(1)" - line 261, "pan.___", state 2744, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 2744, "else" - line 266, "pan.___", state 2753, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 2753, "else" - line 299, "pan.___", state 2755, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 2755, "else" - line 411, "pan.___", state 2761, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2793, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2807, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2826, "(1)" - line 438, "pan.___", state 2856, "(1)" - line 442, "pan.___", state 2869, "(1)" - line 411, "pan.___", state 2890, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2922, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2936, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2955, "(1)" - line 438, "pan.___", state 2985, "(1)" - line 442, "pan.___", state 2998, "(1)" - line 249, "pan.___", state 3031, "(1)" - line 257, "pan.___", state 3051, "(1)" - line 261, "pan.___", state 3059, "(1)" - line 249, "pan.___", state 3074, "(1)" - line 257, "pan.___", state 3094, "(1)" - line 261, "pan.___", state 3102, "(1)" - line 898, "pan.___", state 3119, "-end-" - (330 of 3119 states) -unreached in proctype urcu_writer - line 411, "pan.___", state 20, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 26, "(1)" - line 415, "pan.___", state 34, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 40, "(1)" - line 415, "pan.___", state 41, "(1)" - line 415, "pan.___", state 41, "(1)" - line 413, "pan.___", state 46, "((i<1))" - line 413, "pan.___", state 46, "((i>=1))" - line 420, "pan.___", state 52, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 58, "(1)" - line 420, "pan.___", state 59, "(1)" - line 420, "pan.___", state 59, "(1)" - line 424, "pan.___", state 72, "(1)" - line 424, "pan.___", state 73, "(1)" - line 424, "pan.___", state 73, "(1)" - line 422, "pan.___", state 78, "((i<2))" - line 422, "pan.___", state 78, "((i>=2))" - line 429, "pan.___", state 85, "(1)" - line 429, "pan.___", state 86, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 86, "else" - line 429, "pan.___", state 89, "(1)" - line 429, "pan.___", state 90, "(1)" - line 429, "pan.___", state 90, "(1)" - line 433, "pan.___", state 98, "(1)" - line 433, "pan.___", state 99, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 99, "else" - line 433, "pan.___", state 102, "(1)" - line 433, "pan.___", state 103, "(1)" - line 433, "pan.___", state 103, "(1)" - line 431, "pan.___", state 108, "((i<1))" - line 431, "pan.___", state 108, "((i>=1))" - line 438, "pan.___", state 115, "(1)" - line 438, "pan.___", state 116, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 116, "else" - line 438, "pan.___", state 119, "(1)" - line 438, "pan.___", state 120, "(1)" - line 438, "pan.___", state 120, "(1)" - line 442, "pan.___", state 128, "(1)" - line 442, "pan.___", state 129, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 129, "else" - line 442, "pan.___", state 132, "(1)" - line 442, "pan.___", state 133, "(1)" - line 442, "pan.___", state 133, "(1)" - line 440, "pan.___", state 138, "((i<2))" - line 440, "pan.___", state 138, "((i>=2))" - line 450, "pan.___", state 142, "(1)" - line 450, "pan.___", state 142, "(1)" - line 272, "pan.___", state 151, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 160, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 274, "pan.___", state 168, "((i<1))" - line 274, "pan.___", state 168, "((i>=1))" - line 280, "pan.___", state 173, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 1021, "pan.___", state 201, "old_data = cached_rcu_ptr.val[_pid]" - line 1032, "pan.___", state 205, "_proc_urcu_writer = (_proc_urcu_writer|(1<<4))" - line 411, "pan.___", state 213, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 219, "(1)" - line 415, "pan.___", state 227, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 233, "(1)" - line 415, "pan.___", state 234, "(1)" - line 415, "pan.___", state 234, "(1)" - line 413, "pan.___", state 239, "((i<1))" - line 413, "pan.___", state 239, "((i>=1))" - line 420, "pan.___", state 247, "(1)" - line 420, "pan.___", state 248, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 248, "else" - line 420, "pan.___", state 251, "(1)" - line 420, "pan.___", state 252, "(1)" - line 420, "pan.___", state 252, "(1)" - line 424, "pan.___", state 259, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 265, "(1)" - line 424, "pan.___", state 266, "(1)" - line 424, "pan.___", state 266, "(1)" - line 422, "pan.___", state 271, "((i<2))" - line 422, "pan.___", state 271, "((i>=2))" - line 429, "pan.___", state 278, "(1)" - line 429, "pan.___", state 279, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 279, "else" - line 429, "pan.___", state 282, "(1)" - line 429, "pan.___", state 283, "(1)" - line 429, "pan.___", state 283, "(1)" - line 433, "pan.___", state 291, "(1)" - line 433, "pan.___", state 292, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 292, "else" - line 433, "pan.___", state 295, "(1)" - line 433, "pan.___", state 296, "(1)" - line 433, "pan.___", state 296, "(1)" - line 431, "pan.___", state 301, "((i<1))" - line 431, "pan.___", state 301, "((i>=1))" - line 438, "pan.___", state 308, "(1)" - line 438, "pan.___", state 309, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 309, "else" - line 438, "pan.___", state 312, "(1)" - line 438, "pan.___", state 313, "(1)" - line 438, "pan.___", state 313, "(1)" - line 442, "pan.___", state 321, "(1)" - line 442, "pan.___", state 322, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 322, "else" - line 442, "pan.___", state 325, "(1)" - line 442, "pan.___", state 326, "(1)" - line 442, "pan.___", state 326, "(1)" - line 440, "pan.___", state 331, "((i<2))" - line 440, "pan.___", state 331, "((i>=2))" - line 450, "pan.___", state 335, "(1)" - line 450, "pan.___", state 335, "(1)" - line 411, "pan.___", state 346, "(1)" - line 411, "pan.___", state 347, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 347, "else" - line 411, "pan.___", state 350, "(1)" - line 415, "pan.___", state 358, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 364, "(1)" - line 415, "pan.___", state 365, "(1)" - line 415, "pan.___", state 365, "(1)" - line 413, "pan.___", state 370, "((i<1))" - line 413, "pan.___", state 370, "((i>=1))" - line 420, "pan.___", state 376, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 382, "(1)" - line 420, "pan.___", state 383, "(1)" - line 420, "pan.___", state 383, "(1)" - line 424, "pan.___", state 390, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 396, "(1)" - line 424, "pan.___", state 397, "(1)" - line 424, "pan.___", state 397, "(1)" - line 422, "pan.___", state 402, "((i<2))" - line 422, "pan.___", state 402, "((i>=2))" - line 429, "pan.___", state 409, "(1)" - line 429, "pan.___", state 410, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 410, "else" - line 429, "pan.___", state 413, "(1)" - line 429, "pan.___", state 414, "(1)" - line 429, "pan.___", state 414, "(1)" - line 433, "pan.___", state 422, "(1)" - line 433, "pan.___", state 423, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 423, "else" - line 433, "pan.___", state 426, "(1)" - line 433, "pan.___", state 427, "(1)" - line 433, "pan.___", state 427, "(1)" - line 431, "pan.___", state 432, "((i<1))" - line 431, "pan.___", state 432, "((i>=1))" - line 438, "pan.___", state 439, "(1)" - line 438, "pan.___", state 440, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 440, "else" - line 438, "pan.___", state 443, "(1)" - line 438, "pan.___", state 444, "(1)" - line 438, "pan.___", state 444, "(1)" - line 442, "pan.___", state 452, "(1)" - line 442, "pan.___", state 453, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 453, "else" - line 442, "pan.___", state 456, "(1)" - line 442, "pan.___", state 457, "(1)" - line 442, "pan.___", state 457, "(1)" - line 440, "pan.___", state 462, "((i<2))" - line 440, "pan.___", state 462, "((i>=2))" - line 450, "pan.___", state 466, "(1)" - line 450, "pan.___", state 466, "(1)" - line 1086, "pan.___", state 477, "_proc_urcu_writer = (_proc_urcu_writer&~((1<<9)))" - line 1091, "pan.___", state 478, "_proc_urcu_writer = (_proc_urcu_writer&~(((1<<8)|(1<<7))))" - line 411, "pan.___", state 483, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 489, "(1)" - line 415, "pan.___", state 497, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 503, "(1)" - line 415, "pan.___", state 504, "(1)" - line 415, "pan.___", state 504, "(1)" - line 413, "pan.___", state 509, "((i<1))" - line 413, "pan.___", state 509, "((i>=1))" - line 420, "pan.___", state 515, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 521, "(1)" - line 420, "pan.___", state 522, "(1)" - line 420, "pan.___", state 522, "(1)" - line 424, "pan.___", state 529, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 535, "(1)" - line 424, "pan.___", state 536, "(1)" - line 424, "pan.___", state 536, "(1)" - line 422, "pan.___", state 541, "((i<2))" - line 422, "pan.___", state 541, "((i>=2))" - line 429, "pan.___", state 548, "(1)" - line 429, "pan.___", state 549, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 549, "else" - line 429, "pan.___", state 552, "(1)" - line 429, "pan.___", state 553, "(1)" - line 429, "pan.___", state 553, "(1)" - line 433, "pan.___", state 561, "(1)" - line 433, "pan.___", state 562, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 562, "else" - line 433, "pan.___", state 565, "(1)" - line 433, "pan.___", state 566, "(1)" - line 433, "pan.___", state 566, "(1)" - line 431, "pan.___", state 571, "((i<1))" - line 431, "pan.___", state 571, "((i>=1))" - line 438, "pan.___", state 578, "(1)" - line 438, "pan.___", state 579, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 579, "else" - line 438, "pan.___", state 582, "(1)" - line 438, "pan.___", state 583, "(1)" - line 438, "pan.___", state 583, "(1)" - line 442, "pan.___", state 591, "(1)" - line 442, "pan.___", state 592, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 592, "else" - line 442, "pan.___", state 595, "(1)" - line 442, "pan.___", state 596, "(1)" - line 442, "pan.___", state 596, "(1)" - line 450, "pan.___", state 605, "(1)" - line 450, "pan.___", state 605, "(1)" - line 411, "pan.___", state 612, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 626, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 644, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 429, "pan.___", state 677, "(1)" - line 433, "pan.___", state 690, "(1)" - line 438, "pan.___", state 707, "(1)" - line 442, "pan.___", state 720, "(1)" - line 415, "pan.___", state 757, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 775, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 789, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 821, "(1)" - line 438, "pan.___", state 838, "(1)" - line 442, "pan.___", state 851, "(1)" - line 1168, "pan.___", state 878, "_proc_urcu_writer = (_proc_urcu_writer|(1<<13))" - line 272, "pan.___", state 906, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 908, "(1)" - line 276, "pan.___", state 915, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 917, "(1)" - line 276, "pan.___", state 918, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 918, "else" - line 274, "pan.___", state 923, "((i<1))" - line 274, "pan.___", state 923, "((i>=1))" - line 280, "pan.___", state 928, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 930, "(1)" - line 280, "pan.___", state 931, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 931, "else" - line 284, "pan.___", state 937, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 939, "(1)" - line 284, "pan.___", state 940, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 940, "else" - line 282, "pan.___", state 945, "((i<2))" - line 282, "pan.___", state 945, "((i>=2))" - line 249, "pan.___", state 953, "(1)" - line 253, "pan.___", state 961, "(1)" - line 253, "pan.___", state 962, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 962, "else" - line 251, "pan.___", state 967, "((i<1))" - line 251, "pan.___", state 967, "((i>=1))" - line 257, "pan.___", state 973, "(1)" - line 257, "pan.___", state 974, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 974, "else" - line 261, "pan.___", state 981, "(1)" - line 261, "pan.___", state 982, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 982, "else" - line 266, "pan.___", state 991, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 991, "else" - line 299, "pan.___", state 993, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 993, "else" - line 272, "pan.___", state 997, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 999, "(1)" - line 276, "pan.___", state 1006, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1008, "(1)" - line 276, "pan.___", state 1009, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 1009, "else" - line 274, "pan.___", state 1014, "((i<1))" - line 274, "pan.___", state 1014, "((i>=1))" - line 280, "pan.___", state 1019, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1021, "(1)" - line 280, "pan.___", state 1022, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 1022, "else" - line 284, "pan.___", state 1028, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1030, "(1)" - line 284, "pan.___", state 1031, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 1031, "else" - line 282, "pan.___", state 1036, "((i<2))" - line 282, "pan.___", state 1036, "((i>=2))" - line 249, "pan.___", state 1044, "(1)" - line 253, "pan.___", state 1052, "(1)" - line 253, "pan.___", state 1053, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 1053, "else" - line 251, "pan.___", state 1058, "((i<1))" - line 251, "pan.___", state 1058, "((i>=1))" - line 257, "pan.___", state 1064, "(1)" - line 257, "pan.___", state 1065, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 1065, "else" - line 261, "pan.___", state 1072, "(1)" - line 261, "pan.___", state 1073, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 1073, "else" - line 266, "pan.___", state 1082, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 1082, "else" - line 299, "pan.___", state 1084, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 1084, "else" - line 276, "pan.___", state 1097, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1110, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1119, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1135, "(1)" - line 253, "pan.___", state 1143, "(1)" - line 257, "pan.___", state 1155, "(1)" - line 261, "pan.___", state 1163, "(1)" - line 272, "pan.___", state 1179, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 1181, "(1)" - line 276, "pan.___", state 1188, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1190, "(1)" - line 276, "pan.___", state 1191, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 1191, "else" - line 274, "pan.___", state 1196, "((i<1))" - line 274, "pan.___", state 1196, "((i>=1))" - line 280, "pan.___", state 1201, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1203, "(1)" - line 280, "pan.___", state 1204, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 1204, "else" - line 284, "pan.___", state 1210, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1212, "(1)" - line 284, "pan.___", state 1213, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 1213, "else" - line 282, "pan.___", state 1218, "((i<2))" - line 282, "pan.___", state 1218, "((i>=2))" - line 249, "pan.___", state 1226, "(1)" - line 253, "pan.___", state 1234, "(1)" - line 253, "pan.___", state 1235, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 1235, "else" - line 251, "pan.___", state 1240, "((i<1))" - line 251, "pan.___", state 1240, "((i>=1))" - line 257, "pan.___", state 1246, "(1)" - line 257, "pan.___", state 1247, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 1247, "else" - line 261, "pan.___", state 1254, "(1)" - line 261, "pan.___", state 1255, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 1255, "else" - line 266, "pan.___", state 1264, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 1264, "else" - line 299, "pan.___", state 1266, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 1266, "else" - line 1237, "pan.___", state 1269, "-end-" - (227 of 1269 states) -unreached in proctype :init: - line 1248, "pan.___", state 9, "((j<2))" - line 1248, "pan.___", state 9, "((j>=2))" - line 1249, "pan.___", state 20, "((j<2))" - line 1249, "pan.___", state 20, "((j>=2))" - line 1254, "pan.___", state 33, "((j<2))" - line 1254, "pan.___", state 33, "((j>=2))" - line 1252, "pan.___", state 43, "((i<1))" - line 1252, "pan.___", state 43, "((i>=1))" - line 1262, "pan.___", state 54, "((j<2))" - line 1262, "pan.___", state 54, "((j>=2))" - line 1266, "pan.___", state 67, "((j<2))" - line 1266, "pan.___", state 67, "((j>=2))" - (6 of 78 states) -unreached in proctype :never: - line 1300, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 3.93e+03 seconds -pan: rate 1735.2351 states/second -pan: avg transition delay 1.2255e-06 usec -cp .input.spin urcu_free_no_mb.spin.input -cp .input.spin.trail urcu_free_no_mb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_mb.spin.input b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_mb.spin.input deleted file mode 100644 index ba5712c..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_mb.spin.input +++ /dev/null @@ -1,1273 +0,0 @@ -#define NO_MB - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_mb.spin.input.trail b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_mb.spin.input.trail deleted file mode 100644 index fbd72f1..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_mb.spin.input.trail +++ /dev/null @@ -1,1270 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:4468 -2:3:4388 -3:3:4391 -4:3:4391 -5:3:4394 -6:3:4402 -7:3:4402 -8:3:4405 -9:3:4411 -10:3:4415 -11:3:4415 -12:3:4418 -13:3:4428 -14:3:4436 -15:3:4436 -16:3:4439 -17:3:4445 -18:3:4449 -19:3:4449 -20:3:4452 -21:3:4458 -22:3:4462 -23:3:4463 -24:0:4468 -25:3:4465 -26:0:4468 -27:2:3121 -28:0:4468 -29:2:3127 -30:0:4468 -31:2:3128 -32:0:4468 -33:2:3130 -34:0:4468 -35:2:3131 -36:0:4468 -37:2:3132 -38:0:4468 -39:2:3133 -40:0:4468 -41:2:3134 -42:2:3135 -43:2:3139 -44:2:3140 -45:2:3148 -46:2:3149 -47:2:3153 -48:2:3154 -49:2:3162 -50:2:3167 -51:2:3171 -52:2:3172 -53:2:3180 -54:2:3181 -55:2:3185 -56:2:3186 -57:2:3180 -58:2:3181 -59:2:3185 -60:2:3186 -61:2:3194 -62:2:3199 -63:2:3200 -64:2:3211 -65:2:3212 -66:2:3213 -67:2:3224 -68:2:3229 -69:2:3230 -70:2:3241 -71:2:3242 -72:2:3243 -73:2:3241 -74:2:3242 -75:2:3243 -76:2:3254 -77:2:3262 -78:0:4468 -79:2:3133 -80:0:4468 -81:2:3266 -82:2:3270 -83:2:3271 -84:2:3275 -85:2:3279 -86:2:3280 -87:2:3284 -88:2:3292 -89:2:3293 -90:2:3297 -91:2:3301 -92:2:3302 -93:2:3297 -94:2:3298 -95:2:3306 -96:0:4468 -97:2:3133 -98:0:4468 -99:2:3314 -100:2:3315 -101:2:3316 -102:0:4468 -103:2:3133 -104:0:4468 -105:2:3324 -106:0:4468 -107:2:3133 -108:0:4468 -109:2:3327 -110:2:3328 -111:2:3332 -112:2:3333 -113:2:3341 -114:2:3342 -115:2:3346 -116:2:3347 -117:2:3355 -118:2:3360 -119:2:3361 -120:2:3373 -121:2:3374 -122:2:3378 -123:2:3379 -124:2:3373 -125:2:3374 -126:2:3378 -127:2:3379 -128:2:3387 -129:2:3392 -130:2:3393 -131:2:3404 -132:2:3405 -133:2:3406 -134:2:3417 -135:2:3422 -136:2:3423 -137:2:3434 -138:2:3435 -139:2:3436 -140:2:3434 -141:2:3435 -142:2:3436 -143:2:3447 -144:2:3454 -145:0:4468 -146:2:3133 -147:0:4468 -148:2:3458 -149:2:3459 -150:2:3460 -151:2:3472 -152:2:3473 -153:2:3477 -154:2:3478 -155:2:3486 -156:2:3491 -157:2:3495 -158:2:3496 -159:2:3504 -160:2:3505 -161:2:3509 -162:2:3510 -163:2:3504 -164:2:3505 -165:2:3509 -166:2:3510 -167:2:3518 -168:2:3523 -169:2:3524 -170:2:3535 -171:2:3536 -172:2:3537 -173:2:3548 -174:2:3553 -175:2:3554 -176:2:3565 -177:2:3566 -178:2:3567 -179:2:3565 -180:2:3566 -181:2:3567 -182:2:3578 -183:2:3589 -184:2:3590 -185:0:4468 -186:2:3133 -187:0:4468 -188:2:3597 -189:2:3598 -190:2:3602 -191:2:3603 -192:2:3611 -193:2:3612 -194:2:3616 -195:2:3617 -196:2:3625 -197:2:3630 -198:2:3634 -199:2:3635 -200:2:3643 -201:2:3644 -202:2:3648 -203:2:3649 -204:2:3643 -205:2:3644 -206:2:3648 -207:2:3649 -208:2:3657 -209:2:3662 -210:2:3663 -211:2:3674 -212:2:3675 -213:2:3676 -214:2:3687 -215:2:3692 -216:2:3693 -217:2:3704 -218:2:3705 -219:2:3706 -220:2:3704 -221:2:3705 -222:2:3706 -223:2:3717 -224:0:4468 -225:2:3133 -226:0:4468 -227:2:3726 -228:2:3727 -229:2:3731 -230:2:3732 -231:2:3740 -232:2:3741 -233:2:3745 -234:2:3746 -235:2:3754 -236:2:3759 -237:2:3763 -238:2:3764 -239:2:3772 -240:2:3773 -241:2:3777 -242:2:3778 -243:2:3772 -244:2:3773 -245:2:3777 -246:2:3778 -247:2:3786 -248:2:3791 -249:2:3792 -250:2:3803 -251:2:3804 -252:2:3805 -253:2:3816 -254:2:3821 -255:2:3822 -256:2:3833 -257:2:3834 -258:2:3835 -259:2:3833 -260:2:3834 -261:2:3835 -262:2:3846 -263:2:3853 -264:0:4468 -265:2:3133 -266:0:4468 -267:2:3857 -268:2:3858 -269:2:3859 -270:2:3871 -271:2:3872 -272:2:3876 -273:2:3877 -274:2:3885 -275:2:3890 -276:2:3894 -277:2:3895 -278:2:3903 -279:2:3904 -280:2:3908 -281:2:3909 -282:2:3903 -283:2:3904 -284:2:3908 -285:2:3909 -286:2:3917 -287:2:3922 -288:2:3923 -289:2:3934 -290:2:3935 -291:2:3936 -292:2:3947 -293:2:3952 -294:2:3953 -295:2:3964 -296:2:3965 -297:2:3966 -298:2:3964 -299:2:3965 -300:2:3966 -301:2:3977 -302:2:3987 -303:2:3988 -304:0:4468 -305:2:3133 -306:0:4468 -307:2:3997 -308:2:3998 -309:0:4468 -310:2:3133 -311:0:4468 -312:2:4002 -313:0:4468 -314:2:4010 -315:0:4468 -316:2:3128 -317:0:4468 -318:2:3130 -319:0:4468 -320:2:3131 -321:0:4468 -322:2:3132 -323:0:4468 -324:2:3133 -325:0:4468 -326:2:3134 -327:2:3135 -328:2:3139 -329:2:3140 -330:2:3148 -331:2:3149 -332:2:3153 -333:2:3154 -334:2:3162 -335:2:3167 -336:2:3171 -337:2:3172 -338:2:3180 -339:2:3181 -340:2:3182 -341:2:3180 -342:2:3181 -343:2:3185 -344:2:3186 -345:2:3194 -346:2:3199 -347:2:3200 -348:2:3211 -349:2:3212 -350:2:3213 -351:2:3224 -352:2:3229 -353:2:3230 -354:2:3241 -355:2:3242 -356:2:3243 -357:2:3241 -358:2:3242 -359:2:3243 -360:2:3254 -361:2:3262 -362:0:4468 -363:2:3133 -364:0:4468 -365:2:3266 -366:2:3270 -367:2:3271 -368:2:3275 -369:2:3279 -370:2:3280 -371:2:3284 -372:2:3292 -373:2:3293 -374:2:3297 -375:2:3298 -376:2:3297 -377:2:3301 -378:2:3302 -379:2:3306 -380:0:4468 -381:2:3133 -382:0:4468 -383:2:3314 -384:2:3315 -385:2:3316 -386:0:4468 -387:2:3133 -388:0:4468 -389:2:3324 -390:0:4468 -391:2:3133 -392:0:4468 -393:2:3327 -394:2:3328 -395:2:3332 -396:2:3333 -397:2:3341 -398:2:3342 -399:2:3346 -400:2:3347 -401:2:3355 -402:2:3360 -403:2:3361 -404:2:3373 -405:2:3374 -406:2:3378 -407:2:3379 -408:2:3373 -409:2:3374 -410:2:3378 -411:2:3379 -412:2:3387 -413:2:3392 -414:2:3393 -415:2:3404 -416:2:3405 -417:2:3406 -418:2:3417 -419:2:3422 -420:2:3423 -421:2:3434 -422:2:3435 -423:2:3436 -424:2:3434 -425:2:3435 -426:2:3436 -427:2:3447 -428:2:3454 -429:0:4468 -430:2:3133 -431:0:4468 -432:2:3458 -433:2:3459 -434:2:3460 -435:2:3472 -436:2:3473 -437:2:3477 -438:2:3478 -439:2:3486 -440:2:3491 -441:2:3495 -442:2:3496 -443:2:3504 -444:2:3505 -445:2:3509 -446:2:3510 -447:2:3504 -448:2:3505 -449:2:3509 -450:2:3510 -451:2:3518 -452:2:3523 -453:2:3524 -454:2:3535 -455:2:3536 -456:2:3537 -457:2:3548 -458:2:3553 -459:2:3554 -460:2:3565 -461:2:3566 -462:2:3567 -463:2:3565 -464:2:3566 -465:2:3567 -466:2:3578 -467:2:3589 -468:2:3590 -469:0:4468 -470:2:3133 -471:0:4468 -472:2:3597 -473:2:3598 -474:2:3602 -475:2:3603 -476:2:3611 -477:2:3612 -478:2:3616 -479:2:3617 -480:2:3625 -481:2:3630 -482:2:3634 -483:2:3635 -484:2:3643 -485:2:3644 -486:2:3648 -487:2:3649 -488:2:3643 -489:2:3644 -490:2:3648 -491:2:3649 -492:2:3657 -493:2:3662 -494:2:3663 -495:2:3674 -496:2:3675 -497:2:3676 -498:2:3687 -499:2:3692 -500:2:3693 -501:2:3704 -502:2:3705 -503:2:3706 -504:2:3704 -505:2:3705 -506:2:3706 -507:2:3717 -508:0:4468 -509:2:3133 -510:0:4468 -511:2:3726 -512:2:3727 -513:2:3731 -514:2:3732 -515:2:3740 -516:2:3741 -517:2:3745 -518:2:3746 -519:2:3754 -520:2:3759 -521:2:3763 -522:2:3764 -523:2:3772 -524:2:3773 -525:2:3777 -526:2:3778 -527:2:3772 -528:2:3773 -529:2:3777 -530:2:3778 -531:2:3786 -532:2:3791 -533:2:3792 -534:2:3803 -535:2:3804 -536:2:3805 -537:2:3816 -538:2:3821 -539:2:3822 -540:2:3833 -541:2:3834 -542:2:3835 -543:2:3833 -544:2:3834 -545:2:3835 -546:2:3846 -547:2:3853 -548:0:4468 -549:2:3133 -550:0:4468 -551:2:3857 -552:2:3858 -553:2:3859 -554:2:3871 -555:2:3872 -556:2:3876 -557:2:3877 -558:2:3885 -559:2:3890 -560:2:3894 -561:2:3895 -562:2:3903 -563:2:3904 -564:2:3908 -565:2:3909 -566:2:3903 -567:2:3904 -568:2:3908 -569:2:3909 -570:2:3917 -571:2:3922 -572:2:3923 -573:2:3934 -574:2:3935 -575:2:3936 -576:2:3947 -577:2:3952 -578:2:3953 -579:2:3964 -580:2:3965 -581:2:3966 -582:2:3964 -583:2:3965 -584:2:3966 -585:2:3977 -586:2:3987 -587:2:3988 -588:0:4468 -589:2:3133 -590:0:4468 -591:2:3997 -592:2:3998 -593:0:4468 -594:2:3133 -595:0:4468 -596:2:4002 -597:0:4468 -598:2:4010 -599:0:4468 -600:2:3128 -601:0:4468 -602:2:3130 -603:0:4468 -604:2:3131 -605:0:4468 -606:2:3132 -607:0:4468 -608:2:3133 -609:0:4468 -610:2:3134 -611:2:3135 -612:2:3139 -613:2:3140 -614:2:3148 -615:2:3149 -616:2:3153 -617:2:3154 -618:2:3162 -619:2:3167 -620:2:3171 -621:2:3172 -622:2:3180 -623:2:3181 -624:2:3185 -625:2:3186 -626:2:3180 -627:2:3181 -628:2:3182 -629:2:3194 -630:2:3199 -631:2:3200 -632:2:3211 -633:2:3212 -634:2:3213 -635:2:3224 -636:2:3229 -637:2:3230 -638:2:3241 -639:2:3242 -640:2:3243 -641:2:3241 -642:2:3242 -643:2:3243 -644:2:3254 -645:2:3262 -646:0:4468 -647:2:3133 -648:0:4468 -649:2:3266 -650:2:3270 -651:2:3271 -652:2:3275 -653:2:3279 -654:2:3280 -655:2:3284 -656:2:3292 -657:2:3293 -658:2:3297 -659:2:3301 -660:2:3302 -661:2:3297 -662:2:3298 -663:2:3306 -664:0:4468 -665:2:3133 -666:0:4468 -667:2:3314 -668:2:3315 -669:2:3316 -670:0:4468 -671:2:3133 -672:0:4468 -673:2:3324 -674:0:4468 -675:2:3133 -676:0:4468 -677:2:3327 -678:2:3328 -679:2:3332 -680:2:3333 -681:2:3341 -682:2:3342 -683:2:3346 -684:2:3347 -685:2:3355 -686:2:3360 -687:2:3361 -688:2:3373 -689:2:3374 -690:2:3378 -691:2:3379 -692:2:3373 -693:2:3374 -694:2:3378 -695:2:3379 -696:2:3387 -697:2:3392 -698:2:3393 -699:2:3404 -700:2:3405 -701:2:3406 -702:2:3417 -703:2:3422 -704:2:3423 -705:2:3434 -706:2:3435 -707:2:3436 -708:2:3434 -709:2:3435 -710:2:3436 -711:2:3447 -712:2:3454 -713:0:4468 -714:2:3133 -715:0:4468 -716:2:3458 -717:2:3459 -718:2:3460 -719:2:3472 -720:2:3473 -721:2:3477 -722:2:3478 -723:2:3486 -724:2:3491 -725:2:3495 -726:2:3496 -727:2:3504 -728:2:3505 -729:2:3509 -730:2:3510 -731:2:3504 -732:2:3505 -733:2:3509 -734:2:3510 -735:2:3518 -736:2:3523 -737:2:3524 -738:2:3535 -739:2:3536 -740:2:3537 -741:2:3548 -742:2:3553 -743:2:3554 -744:2:3565 -745:2:3566 -746:2:3567 -747:2:3565 -748:2:3566 -749:2:3567 -750:2:3578 -751:2:3589 -752:2:3590 -753:0:4468 -754:2:3133 -755:0:4468 -756:2:3597 -757:2:3598 -758:2:3602 -759:2:3603 -760:2:3611 -761:2:3612 -762:2:3616 -763:2:3617 -764:2:3625 -765:2:3630 -766:2:3634 -767:2:3635 -768:2:3643 -769:2:3644 -770:2:3648 -771:2:3649 -772:2:3643 -773:2:3644 -774:2:3648 -775:2:3649 -776:2:3657 -777:2:3662 -778:2:3663 -779:2:3674 -780:2:3675 -781:2:3676 -782:2:3687 -783:2:3692 -784:2:3693 -785:2:3704 -786:2:3705 -787:2:3706 -788:2:3704 -789:2:3705 -790:2:3706 -791:2:3717 -792:0:4468 -793:2:3133 -794:0:4468 -795:2:3857 -796:2:3858 -797:2:3862 -798:2:3863 -799:2:3871 -800:2:3872 -801:2:3876 -802:2:3877 -803:2:3885 -804:2:3890 -805:2:3894 -806:2:3895 -807:2:3903 -808:2:3904 -809:2:3908 -810:2:3909 -811:2:3903 -812:2:3904 -813:2:3908 -814:2:3909 -815:2:3917 -816:2:3922 -817:2:3923 -818:2:3934 -819:2:3935 -820:2:3936 -821:2:3947 -822:2:3952 -823:2:3953 -824:2:3964 -825:2:3965 -826:2:3966 -827:2:3964 -828:2:3965 -829:2:3966 -830:2:3977 -831:2:3987 -832:2:3988 -833:0:4468 -834:2:3133 -835:0:4468 -836:2:3997 -837:2:3998 -838:0:4468 -839:2:3133 -840:0:4468 -841:2:3726 -842:2:3727 -843:2:3731 -844:2:3732 -845:2:3740 -846:2:3741 -847:2:3745 -848:2:3746 -849:2:3754 -850:2:3759 -851:2:3763 -852:2:3764 -853:2:3772 -854:2:3773 -855:2:3774 -856:2:3772 -857:2:3773 -858:2:3777 -859:2:3778 -860:2:3786 -861:2:3791 -862:2:3792 -863:2:3803 -864:2:3804 -865:2:3805 -866:2:3816 -867:2:3821 -868:2:3822 -869:2:3833 -870:2:3834 -871:2:3835 -872:2:3833 -873:2:3834 -874:2:3835 -875:2:3846 -876:2:3853 -877:0:4468 -878:2:3133 -879:0:4468 -880:2:4002 -881:0:4468 -882:2:4010 -883:0:4468 -884:2:4011 -885:0:4468 -886:2:4016 -887:0:4468 -888:1:2 -889:0:4468 -890:2:4017 -891:0:4468 -892:1:8 -893:0:4468 -894:2:4016 -895:0:4468 -896:1:9 -897:0:4468 -898:2:4017 -899:0:4468 -900:1:10 -901:0:4468 -902:2:4016 -903:0:4468 -904:1:11 -905:0:4468 -906:2:4017 -907:0:4468 -908:1:12 -909:0:4468 -910:2:4016 -911:0:4468 -912:1:13 -913:0:4468 -914:2:4017 -915:0:4468 -916:1:14 -917:0:4468 -918:2:4016 -919:0:4468 -920:1:15 -921:0:4468 -922:2:4017 -923:0:4468 -924:1:16 -925:1:17 -926:1:21 -927:1:22 -928:1:30 -929:1:31 -930:1:35 -931:1:36 -932:1:44 -933:1:49 -934:1:53 -935:1:54 -936:1:62 -937:1:63 -938:1:67 -939:1:68 -940:1:62 -941:1:63 -942:1:67 -943:1:68 -944:1:76 -945:1:81 -946:1:82 -947:1:93 -948:1:94 -949:1:95 -950:1:106 -951:1:118 -952:1:119 -953:1:123 -954:1:124 -955:1:125 -956:1:123 -957:1:124 -958:1:125 -959:1:136 -960:0:4468 -961:2:4016 -962:0:4468 -963:1:15 -964:0:4468 -965:2:4017 -966:0:4468 -967:1:145 -968:1:146 -969:0:4468 -970:2:4016 -971:0:4468 -972:1:15 -973:0:4468 -974:2:4017 -975:0:4468 -976:1:152 -977:1:153 -978:1:157 -979:1:158 -980:1:166 -981:1:167 -982:1:171 -983:1:172 -984:1:180 -985:1:185 -986:1:189 -987:1:190 -988:1:198 -989:1:199 -990:1:203 -991:1:204 -992:1:198 -993:1:199 -994:1:203 -995:1:204 -996:1:212 -997:1:217 -998:1:218 -999:1:229 -1000:1:230 -1001:1:231 -1002:1:242 -1003:1:254 -1004:1:255 -1005:1:259 -1006:1:260 -1007:1:261 -1008:1:259 -1009:1:260 -1010:1:261 -1011:1:272 -1012:0:4468 -1013:2:4016 -1014:0:4468 -1015:1:15 -1016:0:4468 -1017:2:4017 -1018:0:4468 -1019:1:281 -1020:1:282 -1021:1:286 -1022:1:287 -1023:1:295 -1024:1:296 -1025:1:300 -1026:1:301 -1027:1:309 -1028:1:314 -1029:1:318 -1030:1:319 -1031:1:327 -1032:1:328 -1033:1:332 -1034:1:333 -1035:1:327 -1036:1:328 -1037:1:332 -1038:1:333 -1039:1:341 -1040:1:346 -1041:1:347 -1042:1:358 -1043:1:359 -1044:1:360 -1045:1:371 -1046:1:383 -1047:1:384 -1048:1:388 -1049:1:389 -1050:1:390 -1051:1:388 -1052:1:389 -1053:1:390 -1054:1:401 -1055:1:408 -1056:0:4468 -1057:2:4016 -1058:0:4468 -1059:1:15 -1060:0:4468 -1061:2:4017 -1062:0:4468 -1063:1:636 -1064:1:637 -1065:1:641 -1066:1:642 -1067:1:650 -1068:1:651 -1069:1:652 -1070:1:664 -1071:1:669 -1072:1:673 -1073:1:674 -1074:1:682 -1075:1:683 -1076:1:687 -1077:1:688 -1078:1:682 -1079:1:683 -1080:1:687 -1081:1:688 -1082:1:696 -1083:1:701 -1084:1:702 -1085:1:713 -1086:1:714 -1087:1:715 -1088:1:726 -1089:1:738 -1090:1:739 -1091:1:743 -1092:1:744 -1093:1:745 -1094:1:743 -1095:1:744 -1096:1:745 -1097:1:756 -1098:0:4468 -1099:2:4016 -1100:0:4468 -1101:1:15 -1102:0:4468 -1103:2:4017 -1104:0:4468 -1105:1:765 -1106:1:768 -1107:1:769 -1108:0:4468 -1109:2:4016 -1110:0:4468 -1111:1:15 -1112:0:4468 -1113:2:4017 -1114:0:4468 -1115:1:772 -1116:1:773 -1117:1:777 -1118:1:778 -1119:1:786 -1120:1:787 -1121:1:791 -1122:1:792 -1123:1:800 -1124:1:805 -1125:1:809 -1126:1:810 -1127:1:818 -1128:1:819 -1129:1:823 -1130:1:824 -1131:1:818 -1132:1:819 -1133:1:823 -1134:1:824 -1135:1:832 -1136:1:837 -1137:1:838 -1138:1:849 -1139:1:850 -1140:1:851 -1141:1:862 -1142:1:874 -1143:1:875 -1144:1:879 -1145:1:880 -1146:1:881 -1147:1:879 -1148:1:880 -1149:1:881 -1150:1:892 -1151:0:4468 -1152:2:4016 -1153:0:4468 -1154:1:15 -1155:0:4468 -1156:2:4017 -1157:0:4468 -1158:1:1032 -1159:1:1033 -1160:1:1037 -1161:1:1038 -1162:1:1046 -1163:1:1047 -1164:1:1051 -1165:1:1052 -1166:1:1060 -1167:1:1065 -1168:1:1069 -1169:1:1070 -1170:1:1078 -1171:1:1079 -1172:1:1083 -1173:1:1084 -1174:1:1078 -1175:1:1079 -1176:1:1083 -1177:1:1084 -1178:1:1092 -1179:1:1097 -1180:1:1098 -1181:1:1109 -1182:1:1110 -1183:1:1111 -1184:1:1122 -1185:1:1134 -1186:1:1135 -1187:1:1139 -1188:1:1140 -1189:1:1141 -1190:1:1139 -1191:1:1140 -1192:1:1141 -1193:1:1152 -1194:1:1159 -1195:1:1163 -1196:0:4468 -1197:2:4016 -1198:0:4468 -1199:1:15 -1200:0:4468 -1201:2:4017 -1202:0:4468 -1203:1:1164 -1204:1:1165 -1205:1:1169 -1206:1:1170 -1207:1:1178 -1208:1:1179 -1209:1:1180 -1210:1:1192 -1211:1:1197 -1212:1:1201 -1213:1:1202 -1214:1:1210 -1215:1:1211 -1216:1:1215 -1217:1:1216 -1218:1:1210 -1219:1:1211 -1220:1:1215 -1221:1:1216 -1222:1:1224 -1223:1:1229 -1224:1:1230 -1225:1:1241 -1226:1:1242 -1227:1:1243 -1228:1:1254 -1229:1:1266 -1230:1:1267 -1231:1:1271 -1232:1:1272 -1233:1:1273 -1234:1:1271 -1235:1:1272 -1236:1:1273 -1237:1:1284 -1238:0:4468 -1239:2:4016 -1240:0:4468 -1241:1:15 -1242:0:4468 -1243:2:4017 -1244:0:4468 -1245:1:1293 -1246:0:4468 -1247:2:4016 -1248:0:4468 -1249:1:3027 -1250:1:3034 -1251:1:3035 -1252:1:3042 -1253:1:3047 -1254:1:3054 -1255:1:3055 -1256:1:3054 -1257:1:3055 -1258:1:3062 -1259:1:3066 -1260:0:4468 -1261:2:4017 -1262:0:4468 -1263:1:1295 -1264:1:1296 -1265:0:4466 -1266:2:4016 -1267:0:4472 -1268:1:756 diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_rmb.define b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_rmb.log b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_rmb.log deleted file mode 100644 index 3da0a27..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_rmb.log +++ /dev/null @@ -1,536 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_rmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1295) -pan: claim violated! (at depth 2092) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 5332, errors: 1 - 615700 states, stored -3.8337558e+08 states, matched -3.8399128e+08 transitions (= stored+matched) -2.147943e+09 atomic steps -hash conflicts: 90741041 (resolved) - -Stats on memory usage (in Megabytes): - 68.113 equivalent memory usage for states (stored*(State-vector + overhead)) - 52.415 actual memory usage for states (compression: 76.95%) - state-vector as stored = 61 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 518.108 total actual memory usage - -unreached in proctype urcu_reader - line 411, "pan.___", state 17, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 49, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 63, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 82, "(1)" - line 438, "pan.___", state 112, "(1)" - line 442, "pan.___", state 125, "(1)" - line 597, "pan.___", state 146, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 411, "pan.___", state 153, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 185, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 199, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 218, "(1)" - line 438, "pan.___", state 248, "(1)" - line 442, "pan.___", state 261, "(1)" - line 411, "pan.___", state 282, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 314, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 328, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 347, "(1)" - line 438, "pan.___", state 377, "(1)" - line 442, "pan.___", state 390, "(1)" - line 411, "pan.___", state 413, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 415, "(1)" - line 411, "pan.___", state 416, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 416, "else" - line 411, "pan.___", state 419, "(1)" - line 415, "pan.___", state 427, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 429, "(1)" - line 415, "pan.___", state 430, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 430, "else" - line 415, "pan.___", state 433, "(1)" - line 415, "pan.___", state 434, "(1)" - line 415, "pan.___", state 434, "(1)" - line 413, "pan.___", state 439, "((i<1))" - line 413, "pan.___", state 439, "((i>=1))" - line 420, "pan.___", state 445, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 447, "(1)" - line 420, "pan.___", state 448, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 448, "else" - line 420, "pan.___", state 451, "(1)" - line 420, "pan.___", state 452, "(1)" - line 420, "pan.___", state 452, "(1)" - line 424, "pan.___", state 459, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 461, "(1)" - line 424, "pan.___", state 462, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 462, "else" - line 424, "pan.___", state 465, "(1)" - line 424, "pan.___", state 466, "(1)" - line 424, "pan.___", state 466, "(1)" - line 422, "pan.___", state 471, "((i<2))" - line 422, "pan.___", state 471, "((i>=2))" - line 429, "pan.___", state 478, "(1)" - line 429, "pan.___", state 479, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 479, "else" - line 429, "pan.___", state 482, "(1)" - line 429, "pan.___", state 483, "(1)" - line 429, "pan.___", state 483, "(1)" - line 433, "pan.___", state 491, "(1)" - line 433, "pan.___", state 492, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 492, "else" - line 433, "pan.___", state 495, "(1)" - line 433, "pan.___", state 496, "(1)" - line 433, "pan.___", state 496, "(1)" - line 431, "pan.___", state 501, "((i<1))" - line 431, "pan.___", state 501, "((i>=1))" - line 438, "pan.___", state 508, "(1)" - line 438, "pan.___", state 509, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 509, "else" - line 438, "pan.___", state 512, "(1)" - line 438, "pan.___", state 513, "(1)" - line 438, "pan.___", state 513, "(1)" - line 442, "pan.___", state 521, "(1)" - line 442, "pan.___", state 522, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 522, "else" - line 442, "pan.___", state 525, "(1)" - line 442, "pan.___", state 526, "(1)" - line 442, "pan.___", state 526, "(1)" - line 440, "pan.___", state 531, "((i<2))" - line 440, "pan.___", state 531, "((i>=2))" - line 450, "pan.___", state 535, "(1)" - line 450, "pan.___", state 535, "(1)" - line 597, "pan.___", state 538, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 597, "pan.___", state 539, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 597, "pan.___", state 540, "(1)" - line 272, "pan.___", state 544, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 555, "(1)" - line 280, "pan.___", state 566, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 575, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 591, "(1)" - line 253, "pan.___", state 599, "(1)" - line 257, "pan.___", state 611, "(1)" - line 261, "pan.___", state 619, "(1)" - line 411, "pan.___", state 637, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 651, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 669, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 683, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 702, "(1)" - line 433, "pan.___", state 715, "(1)" - line 438, "pan.___", state 732, "(1)" - line 442, "pan.___", state 745, "(1)" - line 411, "pan.___", state 773, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 805, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 819, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 838, "(1)" - line 438, "pan.___", state 868, "(1)" - line 442, "pan.___", state 881, "(1)" - line 411, "pan.___", state 902, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 904, "(1)" - line 411, "pan.___", state 905, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 905, "else" - line 411, "pan.___", state 908, "(1)" - line 415, "pan.___", state 916, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 918, "(1)" - line 415, "pan.___", state 919, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 919, "else" - line 415, "pan.___", state 922, "(1)" - line 415, "pan.___", state 923, "(1)" - line 415, "pan.___", state 923, "(1)" - line 413, "pan.___", state 928, "((i<1))" - line 413, "pan.___", state 928, "((i>=1))" - line 420, "pan.___", state 934, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 936, "(1)" - line 420, "pan.___", state 937, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 937, "else" - line 420, "pan.___", state 940, "(1)" - line 420, "pan.___", state 941, "(1)" - line 420, "pan.___", state 941, "(1)" - line 424, "pan.___", state 948, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 950, "(1)" - line 424, "pan.___", state 951, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 951, "else" - line 424, "pan.___", state 954, "(1)" - line 424, "pan.___", state 955, "(1)" - line 424, "pan.___", state 955, "(1)" - line 422, "pan.___", state 960, "((i<2))" - line 422, "pan.___", state 960, "((i>=2))" - line 429, "pan.___", state 967, "(1)" - line 429, "pan.___", state 968, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 968, "else" - line 429, "pan.___", state 971, "(1)" - line 429, "pan.___", state 972, "(1)" - line 429, "pan.___", state 972, "(1)" - line 433, "pan.___", state 980, "(1)" - line 433, "pan.___", state 981, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 981, "else" - line 433, "pan.___", state 984, "(1)" - line 433, "pan.___", state 985, "(1)" - line 433, "pan.___", state 985, "(1)" - line 431, "pan.___", state 990, "((i<1))" - line 431, "pan.___", state 990, "((i>=1))" - line 438, "pan.___", state 997, "(1)" - line 438, "pan.___", state 998, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 998, "else" - line 438, "pan.___", state 1001, "(1)" - line 438, "pan.___", state 1002, "(1)" - line 438, "pan.___", state 1002, "(1)" - line 442, "pan.___", state 1010, "(1)" - line 442, "pan.___", state 1011, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 1011, "else" - line 442, "pan.___", state 1014, "(1)" - line 442, "pan.___", state 1015, "(1)" - line 442, "pan.___", state 1015, "(1)" - line 440, "pan.___", state 1020, "((i<2))" - line 440, "pan.___", state 1020, "((i>=2))" - line 450, "pan.___", state 1024, "(1)" - line 450, "pan.___", state 1024, "(1)" - line 605, "pan.___", state 1028, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 411, "pan.___", state 1033, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1047, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1065, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1079, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1098, "(1)" - line 433, "pan.___", state 1111, "(1)" - line 438, "pan.___", state 1128, "(1)" - line 442, "pan.___", state 1141, "(1)" - line 411, "pan.___", state 1165, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1197, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1211, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1230, "(1)" - line 438, "pan.___", state 1260, "(1)" - line 442, "pan.___", state 1273, "(1)" - line 411, "pan.___", state 1298, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1330, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1344, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1363, "(1)" - line 438, "pan.___", state 1393, "(1)" - line 442, "pan.___", state 1406, "(1)" - line 411, "pan.___", state 1427, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1459, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1473, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1492, "(1)" - line 438, "pan.___", state 1522, "(1)" - line 442, "pan.___", state 1535, "(1)" - line 272, "pan.___", state 1558, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1580, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1589, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1605, "(1)" - line 253, "pan.___", state 1613, "(1)" - line 257, "pan.___", state 1625, "(1)" - line 261, "pan.___", state 1633, "(1)" - line 411, "pan.___", state 1651, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1665, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1683, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1697, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1716, "(1)" - line 433, "pan.___", state 1729, "(1)" - line 438, "pan.___", state 1746, "(1)" - line 442, "pan.___", state 1759, "(1)" - line 411, "pan.___", state 1780, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1794, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1812, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1826, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1845, "(1)" - line 433, "pan.___", state 1858, "(1)" - line 438, "pan.___", state 1875, "(1)" - line 442, "pan.___", state 1888, "(1)" - line 411, "pan.___", state 1912, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1944, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1958, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1977, "(1)" - line 438, "pan.___", state 2007, "(1)" - line 442, "pan.___", state 2020, "(1)" - line 644, "pan.___", state 2041, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 411, "pan.___", state 2048, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2080, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2094, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2113, "(1)" - line 438, "pan.___", state 2143, "(1)" - line 442, "pan.___", state 2156, "(1)" - line 411, "pan.___", state 2177, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2209, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2223, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2242, "(1)" - line 438, "pan.___", state 2272, "(1)" - line 442, "pan.___", state 2285, "(1)" - line 411, "pan.___", state 2308, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 2310, "(1)" - line 411, "pan.___", state 2311, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 2311, "else" - line 411, "pan.___", state 2314, "(1)" - line 415, "pan.___", state 2322, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2324, "(1)" - line 415, "pan.___", state 2325, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 2325, "else" - line 415, "pan.___", state 2328, "(1)" - line 415, "pan.___", state 2329, "(1)" - line 415, "pan.___", state 2329, "(1)" - line 413, "pan.___", state 2334, "((i<1))" - line 413, "pan.___", state 2334, "((i>=1))" - line 420, "pan.___", state 2340, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2342, "(1)" - line 420, "pan.___", state 2343, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 2343, "else" - line 420, "pan.___", state 2346, "(1)" - line 420, "pan.___", state 2347, "(1)" - line 420, "pan.___", state 2347, "(1)" - line 424, "pan.___", state 2354, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2356, "(1)" - line 424, "pan.___", state 2357, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 2357, "else" - line 424, "pan.___", state 2360, "(1)" - line 424, "pan.___", state 2361, "(1)" - line 424, "pan.___", state 2361, "(1)" - line 422, "pan.___", state 2366, "((i<2))" - line 422, "pan.___", state 2366, "((i>=2))" - line 429, "pan.___", state 2373, "(1)" - line 429, "pan.___", state 2374, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 2374, "else" - line 429, "pan.___", state 2377, "(1)" - line 429, "pan.___", state 2378, "(1)" - line 429, "pan.___", state 2378, "(1)" - line 433, "pan.___", state 2386, "(1)" - line 433, "pan.___", state 2387, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 2387, "else" - line 433, "pan.___", state 2390, "(1)" - line 433, "pan.___", state 2391, "(1)" - line 433, "pan.___", state 2391, "(1)" - line 431, "pan.___", state 2396, "((i<1))" - line 431, "pan.___", state 2396, "((i>=1))" - line 438, "pan.___", state 2403, "(1)" - line 438, "pan.___", state 2404, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 2404, "else" - line 438, "pan.___", state 2407, "(1)" - line 438, "pan.___", state 2408, "(1)" - line 438, "pan.___", state 2408, "(1)" - line 442, "pan.___", state 2416, "(1)" - line 442, "pan.___", state 2417, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 2417, "else" - line 442, "pan.___", state 2420, "(1)" - line 442, "pan.___", state 2421, "(1)" - line 442, "pan.___", state 2421, "(1)" - line 440, "pan.___", state 2426, "((i<2))" - line 440, "pan.___", state 2426, "((i>=2))" - line 450, "pan.___", state 2430, "(1)" - line 450, "pan.___", state 2430, "(1)" - line 644, "pan.___", state 2433, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 644, "pan.___", state 2434, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 644, "pan.___", state 2435, "(1)" - line 272, "pan.___", state 2439, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2461, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2470, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2486, "(1)" - line 253, "pan.___", state 2494, "(1)" - line 257, "pan.___", state 2506, "(1)" - line 261, "pan.___", state 2514, "(1)" - line 411, "pan.___", state 2532, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2546, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2564, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2578, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2597, "(1)" - line 433, "pan.___", state 2610, "(1)" - line 438, "pan.___", state 2627, "(1)" - line 442, "pan.___", state 2640, "(1)" - line 272, "pan.___", state 2664, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 2673, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2686, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2695, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2711, "(1)" - line 253, "pan.___", state 2719, "(1)" - line 257, "pan.___", state 2731, "(1)" - line 261, "pan.___", state 2739, "(1)" - line 411, "pan.___", state 2757, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2771, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2789, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2803, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2822, "(1)" - line 433, "pan.___", state 2835, "(1)" - line 438, "pan.___", state 2852, "(1)" - line 442, "pan.___", state 2865, "(1)" - line 411, "pan.___", state 2886, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2900, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2918, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2932, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2951, "(1)" - line 433, "pan.___", state 2964, "(1)" - line 438, "pan.___", state 2981, "(1)" - line 442, "pan.___", state 2994, "(1)" - line 411, "pan.___", state 3027, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 3059, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 3073, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 3092, "(1)" - line 438, "pan.___", state 3122, "(1)" - line 442, "pan.___", state 3135, "(1)" - line 411, "pan.___", state 3154, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 3168, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 3186, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 3200, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 3219, "(1)" - line 433, "pan.___", state 3232, "(1)" - line 438, "pan.___", state 3249, "(1)" - line 442, "pan.___", state 3262, "(1)" - line 898, "pan.___", state 3283, "-end-" - (290 of 3283 states) -unreached in proctype urcu_writer - line 411, "pan.___", state 18, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 24, "(1)" - line 415, "pan.___", state 32, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 38, "(1)" - line 415, "pan.___", state 39, "(1)" - line 415, "pan.___", state 39, "(1)" - line 413, "pan.___", state 44, "((i<1))" - line 413, "pan.___", state 44, "((i>=1))" - line 420, "pan.___", state 50, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 56, "(1)" - line 420, "pan.___", state 57, "(1)" - line 420, "pan.___", state 57, "(1)" - line 424, "pan.___", state 70, "(1)" - line 424, "pan.___", state 71, "(1)" - line 424, "pan.___", state 71, "(1)" - line 422, "pan.___", state 76, "((i<2))" - line 422, "pan.___", state 76, "((i>=2))" - line 429, "pan.___", state 83, "(1)" - line 429, "pan.___", state 84, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 84, "else" - line 429, "pan.___", state 87, "(1)" - line 429, "pan.___", state 88, "(1)" - line 429, "pan.___", state 88, "(1)" - line 433, "pan.___", state 96, "(1)" - line 433, "pan.___", state 97, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 97, "else" - line 433, "pan.___", state 100, "(1)" - line 433, "pan.___", state 101, "(1)" - line 433, "pan.___", state 101, "(1)" - line 431, "pan.___", state 106, "((i<1))" - line 431, "pan.___", state 106, "((i>=1))" - line 438, "pan.___", state 113, "(1)" - line 438, "pan.___", state 114, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 114, "else" - line 438, "pan.___", state 117, "(1)" - line 438, "pan.___", state 118, "(1)" - line 438, "pan.___", state 118, "(1)" - line 442, "pan.___", state 126, "(1)" - line 442, "pan.___", state 127, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 127, "else" - line 442, "pan.___", state 130, "(1)" - line 442, "pan.___", state 131, "(1)" - line 442, "pan.___", state 131, "(1)" - line 440, "pan.___", state 136, "((i<2))" - line 440, "pan.___", state 136, "((i>=2))" - line 450, "pan.___", state 140, "(1)" - line 450, "pan.___", state 140, "(1)" - line 272, "pan.___", state 149, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 158, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 171, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 225, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 243, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 257, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 276, "(1)" - line 433, "pan.___", state 289, "(1)" - line 438, "pan.___", state 306, "(1)" - line 442, "pan.___", state 319, "(1)" - line 415, "pan.___", state 356, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 374, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 388, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 420, "(1)" - line 438, "pan.___", state 437, "(1)" - line 442, "pan.___", state 450, "(1)" - line 415, "pan.___", state 495, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 513, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 527, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 559, "(1)" - line 438, "pan.___", state 576, "(1)" - line 442, "pan.___", state 589, "(1)" - line 415, "pan.___", state 624, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 642, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 656, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 688, "(1)" - line 438, "pan.___", state 705, "(1)" - line 442, "pan.___", state 718, "(1)" - line 415, "pan.___", state 755, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 773, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 787, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 819, "(1)" - line 438, "pan.___", state 836, "(1)" - line 442, "pan.___", state 849, "(1)" - line 272, "pan.___", state 904, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 913, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 928, "(1)" - line 284, "pan.___", state 935, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 951, "(1)" - line 253, "pan.___", state 959, "(1)" - line 257, "pan.___", state 971, "(1)" - line 261, "pan.___", state 979, "(1)" - line 276, "pan.___", state 1004, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1017, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1026, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1042, "(1)" - line 253, "pan.___", state 1050, "(1)" - line 257, "pan.___", state 1062, "(1)" - line 261, "pan.___", state 1070, "(1)" - line 276, "pan.___", state 1095, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1108, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1117, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1133, "(1)" - line 253, "pan.___", state 1141, "(1)" - line 257, "pan.___", state 1153, "(1)" - line 261, "pan.___", state 1161, "(1)" - line 276, "pan.___", state 1186, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1199, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1208, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1224, "(1)" - line 253, "pan.___", state 1232, "(1)" - line 257, "pan.___", state 1244, "(1)" - line 261, "pan.___", state 1252, "(1)" - line 1237, "pan.___", state 1267, "-end-" - (96 of 1267 states) -unreached in proctype :init: - line 1248, "pan.___", state 9, "((j<2))" - line 1248, "pan.___", state 9, "((j>=2))" - line 1249, "pan.___", state 20, "((j<2))" - line 1249, "pan.___", state 20, "((j>=2))" - line 1254, "pan.___", state 33, "((j<2))" - line 1254, "pan.___", state 33, "((j>=2))" - line 1252, "pan.___", state 43, "((i<1))" - line 1252, "pan.___", state 43, "((i>=1))" - line 1262, "pan.___", state 54, "((j<2))" - line 1262, "pan.___", state 54, "((j>=2))" - line 1266, "pan.___", state 67, "((j<2))" - line 1266, "pan.___", state 67, "((j>=2))" - (6 of 78 states) -unreached in proctype :never: - line 1300, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 474 seconds -pan: rate 1298.3425 states/second -pan: avg transition delay 1.235e-06 usec -cp .input.spin urcu_free_no_rmb.spin.input -cp .input.spin.trail urcu_free_no_rmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_rmb.spin.input b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_rmb.spin.input deleted file mode 100644 index 8cb5f81..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_rmb.spin.input +++ /dev/null @@ -1,1273 +0,0 @@ -#define NO_RMB - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_rmb.spin.input.trail b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_rmb.spin.input.trail deleted file mode 100644 index de03f6a..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_rmb.spin.input.trail +++ /dev/null @@ -1,2095 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:4630 -2:3:4550 -3:3:4553 -4:3:4553 -5:3:4556 -6:3:4564 -7:3:4564 -8:3:4567 -9:3:4573 -10:3:4577 -11:3:4577 -12:3:4580 -13:3:4590 -14:3:4598 -15:3:4598 -16:3:4601 -17:3:4607 -18:3:4611 -19:3:4611 -20:3:4614 -21:3:4620 -22:3:4624 -23:3:4625 -24:0:4630 -25:3:4627 -26:0:4630 -27:2:3285 -28:0:4630 -29:2:3291 -30:0:4630 -31:2:3292 -32:0:4630 -33:2:3294 -34:0:4630 -35:2:3295 -36:0:4630 -37:2:3296 -38:2:3297 -39:2:3301 -40:2:3302 -41:2:3310 -42:2:3311 -43:2:3315 -44:2:3316 -45:2:3324 -46:2:3329 -47:2:3333 -48:2:3334 -49:2:3342 -50:2:3343 -51:2:3347 -52:2:3348 -53:2:3342 -54:2:3343 -55:2:3347 -56:2:3348 -57:2:3356 -58:2:3361 -59:2:3362 -60:2:3373 -61:2:3374 -62:2:3375 -63:2:3386 -64:2:3391 -65:2:3392 -66:2:3403 -67:2:3404 -68:2:3405 -69:2:3403 -70:2:3404 -71:2:3405 -72:2:3416 -73:2:3424 -74:0:4630 -75:2:3295 -76:0:4630 -77:2:3428 -78:2:3432 -79:2:3433 -80:2:3437 -81:2:3441 -82:2:3442 -83:2:3446 -84:2:3454 -85:2:3455 -86:2:3459 -87:2:3463 -88:2:3464 -89:2:3459 -90:2:3460 -91:2:3468 -92:0:4630 -93:2:3295 -94:0:4630 -95:2:3476 -96:2:3477 -97:2:3478 -98:0:4630 -99:2:3295 -100:0:4630 -101:2:3483 -102:0:4630 -103:2:4187 -104:2:4188 -105:2:4192 -106:2:4196 -107:2:4197 -108:2:4201 -109:2:4206 -110:2:4214 -111:2:4218 -112:2:4219 -113:2:4214 -114:2:4218 -115:2:4219 -116:2:4223 -117:2:4230 -118:2:4237 -119:2:4238 -120:2:4245 -121:2:4250 -122:2:4257 -123:2:4258 -124:2:4257 -125:2:4258 -126:2:4265 -127:2:4269 -128:0:4630 -129:2:3485 -130:2:4168 -131:0:4630 -132:2:3295 -133:0:4630 -134:2:3486 -135:0:4630 -136:2:3295 -137:0:4630 -138:2:3489 -139:2:3490 -140:2:3494 -141:2:3495 -142:2:3503 -143:2:3504 -144:2:3508 -145:2:3509 -146:2:3517 -147:2:3522 -148:2:3526 -149:2:3527 -150:2:3535 -151:2:3536 -152:2:3540 -153:2:3541 -154:2:3535 -155:2:3536 -156:2:3540 -157:2:3541 -158:2:3549 -159:2:3554 -160:2:3555 -161:2:3566 -162:2:3567 -163:2:3568 -164:2:3579 -165:2:3584 -166:2:3585 -167:2:3596 -168:2:3597 -169:2:3598 -170:2:3596 -171:2:3597 -172:2:3598 -173:2:3609 -174:2:3616 -175:0:4630 -176:2:3295 -177:0:4630 -178:2:3620 -179:2:3621 -180:2:3622 -181:2:3634 -182:2:3635 -183:2:3639 -184:2:3640 -185:2:3648 -186:2:3653 -187:2:3657 -188:2:3658 -189:2:3666 -190:2:3667 -191:2:3671 -192:2:3672 -193:2:3666 -194:2:3667 -195:2:3671 -196:2:3672 -197:2:3680 -198:2:3685 -199:2:3686 -200:2:3697 -201:2:3698 -202:2:3699 -203:2:3710 -204:2:3715 -205:2:3716 -206:2:3727 -207:2:3728 -208:2:3729 -209:2:3727 -210:2:3728 -211:2:3729 -212:2:3740 -213:2:3751 -214:2:3752 -215:0:4630 -216:2:3295 -217:0:4630 -218:2:3759 -219:2:3760 -220:2:3764 -221:2:3765 -222:2:3773 -223:2:3774 -224:2:3778 -225:2:3779 -226:2:3787 -227:2:3792 -228:2:3796 -229:2:3797 -230:2:3805 -231:2:3806 -232:2:3810 -233:2:3811 -234:2:3805 -235:2:3806 -236:2:3810 -237:2:3811 -238:2:3819 -239:2:3824 -240:2:3825 -241:2:3836 -242:2:3837 -243:2:3838 -244:2:3849 -245:2:3854 -246:2:3855 -247:2:3866 -248:2:3867 -249:2:3868 -250:2:3866 -251:2:3867 -252:2:3868 -253:2:3879 -254:0:4630 -255:2:3295 -256:0:4630 -257:2:3888 -258:2:3889 -259:2:3893 -260:2:3894 -261:2:3902 -262:2:3903 -263:2:3907 -264:2:3908 -265:2:3916 -266:2:3921 -267:2:3925 -268:2:3926 -269:2:3934 -270:2:3935 -271:2:3939 -272:2:3940 -273:2:3934 -274:2:3935 -275:2:3939 -276:2:3940 -277:2:3948 -278:2:3953 -279:2:3954 -280:2:3965 -281:2:3966 -282:2:3967 -283:2:3978 -284:2:3983 -285:2:3984 -286:2:3995 -287:2:3996 -288:2:3997 -289:2:3995 -290:2:3996 -291:2:3997 -292:2:4008 -293:2:4015 -294:0:4630 -295:2:3295 -296:0:4630 -297:2:4019 -298:2:4020 -299:2:4021 -300:2:4033 -301:2:4034 -302:2:4038 -303:2:4039 -304:2:4047 -305:2:4052 -306:2:4056 -307:2:4057 -308:2:4065 -309:2:4066 -310:2:4070 -311:2:4071 -312:2:4065 -313:2:4066 -314:2:4070 -315:2:4071 -316:2:4079 -317:2:4084 -318:2:4085 -319:2:4096 -320:2:4097 -321:2:4098 -322:2:4109 -323:2:4114 -324:2:4115 -325:2:4126 -326:2:4127 -327:2:4128 -328:2:4126 -329:2:4127 -330:2:4128 -331:2:4139 -332:2:4149 -333:2:4150 -334:0:4630 -335:2:3295 -336:0:4630 -337:2:4156 -338:0:4630 -339:2:4460 -340:2:4461 -341:2:4465 -342:2:4469 -343:2:4470 -344:2:4474 -345:2:4482 -346:2:4483 -347:2:4487 -348:2:4491 -349:2:4492 -350:2:4487 -351:2:4491 -352:2:4492 -353:2:4496 -354:2:4503 -355:2:4510 -356:2:4511 -357:2:4518 -358:2:4523 -359:2:4530 -360:2:4531 -361:2:4530 -362:2:4531 -363:2:4538 -364:2:4542 -365:0:4630 -366:2:4158 -367:2:4168 -368:0:4630 -369:2:3295 -370:0:4630 -371:2:4159 -372:2:4160 -373:0:4630 -374:2:3295 -375:0:4630 -376:2:4164 -377:0:4630 -378:2:4172 -379:0:4630 -380:2:3292 -381:0:4630 -382:2:3294 -383:0:4630 -384:2:3295 -385:0:4630 -386:2:3296 -387:2:3297 -388:2:3301 -389:2:3302 -390:2:3310 -391:2:3311 -392:2:3315 -393:2:3316 -394:2:3324 -395:2:3329 -396:2:3333 -397:2:3334 -398:2:3342 -399:2:3343 -400:2:3344 -401:2:3342 -402:2:3343 -403:2:3347 -404:2:3348 -405:2:3356 -406:2:3361 -407:2:3362 -408:2:3373 -409:2:3374 -410:2:3375 -411:2:3386 -412:2:3391 -413:2:3392 -414:2:3403 -415:2:3404 -416:2:3405 -417:2:3403 -418:2:3404 -419:2:3405 -420:2:3416 -421:2:3424 -422:0:4630 -423:2:3295 -424:0:4630 -425:2:3428 -426:2:3432 -427:2:3433 -428:2:3437 -429:2:3441 -430:2:3442 -431:2:3446 -432:2:3454 -433:2:3455 -434:2:3459 -435:2:3460 -436:2:3459 -437:2:3463 -438:2:3464 -439:2:3468 -440:0:4630 -441:2:3295 -442:0:4630 -443:2:3476 -444:2:3477 -445:2:3478 -446:0:4630 -447:2:3295 -448:0:4630 -449:2:3483 -450:0:4630 -451:2:4187 -452:2:4188 -453:2:4192 -454:2:4196 -455:2:4197 -456:2:4201 -457:2:4206 -458:2:4214 -459:2:4218 -460:2:4219 -461:2:4214 -462:2:4218 -463:2:4219 -464:2:4223 -465:2:4230 -466:2:4237 -467:2:4238 -468:2:4245 -469:2:4250 -470:2:4257 -471:2:4258 -472:2:4257 -473:2:4258 -474:2:4265 -475:2:4269 -476:0:4630 -477:2:3485 -478:2:4168 -479:0:4630 -480:2:3295 -481:0:4630 -482:2:3486 -483:0:4630 -484:2:3295 -485:0:4630 -486:2:3489 -487:2:3490 -488:2:3494 -489:2:3495 -490:2:3503 -491:2:3504 -492:2:3508 -493:2:3509 -494:2:3517 -495:2:3522 -496:2:3526 -497:2:3527 -498:2:3535 -499:2:3536 -500:2:3540 -501:2:3541 -502:2:3535 -503:2:3536 -504:2:3540 -505:2:3541 -506:2:3549 -507:2:3554 -508:2:3555 -509:2:3566 -510:2:3567 -511:2:3568 -512:2:3579 -513:2:3584 -514:2:3585 -515:2:3596 -516:2:3597 -517:2:3598 -518:2:3596 -519:2:3597 -520:2:3598 -521:2:3609 -522:2:3616 -523:0:4630 -524:2:3295 -525:0:4630 -526:2:3620 -527:2:3621 -528:2:3622 -529:2:3634 -530:2:3635 -531:2:3639 -532:2:3640 -533:2:3648 -534:2:3653 -535:2:3657 -536:2:3658 -537:2:3666 -538:2:3667 -539:2:3671 -540:2:3672 -541:2:3666 -542:2:3667 -543:2:3671 -544:2:3672 -545:2:3680 -546:2:3685 -547:2:3686 -548:2:3697 -549:2:3698 -550:2:3699 -551:2:3710 -552:2:3715 -553:2:3716 -554:2:3727 -555:2:3728 -556:2:3729 -557:2:3727 -558:2:3728 -559:2:3729 -560:2:3740 -561:2:3751 -562:2:3752 -563:0:4630 -564:2:3295 -565:0:4630 -566:2:3759 -567:2:3760 -568:2:3764 -569:2:3765 -570:2:3773 -571:2:3774 -572:2:3778 -573:2:3779 -574:2:3787 -575:2:3792 -576:2:3796 -577:2:3797 -578:2:3805 -579:2:3806 -580:2:3810 -581:2:3811 -582:2:3805 -583:2:3806 -584:2:3810 -585:2:3811 -586:2:3819 -587:2:3824 -588:2:3825 -589:2:3836 -590:2:3837 -591:2:3838 -592:2:3849 -593:2:3854 -594:2:3855 -595:2:3866 -596:2:3867 -597:2:3868 -598:2:3866 -599:2:3867 -600:2:3868 -601:2:3879 -602:0:4630 -603:2:3295 -604:0:4630 -605:2:3888 -606:2:3889 -607:2:3893 -608:2:3894 -609:2:3902 -610:2:3903 -611:2:3907 -612:2:3908 -613:2:3916 -614:2:3921 -615:2:3925 -616:2:3926 -617:2:3934 -618:2:3935 -619:2:3939 -620:2:3940 -621:2:3934 -622:2:3935 -623:2:3939 -624:2:3940 -625:2:3948 -626:2:3953 -627:2:3954 -628:2:3965 -629:2:3966 -630:2:3967 -631:2:3978 -632:2:3983 -633:2:3984 -634:2:3995 -635:2:3996 -636:2:3997 -637:2:3995 -638:2:3996 -639:2:3997 -640:2:4008 -641:2:4015 -642:0:4630 -643:2:3295 -644:0:4630 -645:2:4019 -646:2:4020 -647:2:4021 -648:2:4033 -649:2:4034 -650:2:4038 -651:2:4039 -652:2:4047 -653:2:4052 -654:2:4056 -655:2:4057 -656:2:4065 -657:2:4066 -658:2:4070 -659:2:4071 -660:2:4065 -661:2:4066 -662:2:4070 -663:2:4071 -664:2:4079 -665:2:4084 -666:2:4085 -667:2:4096 -668:2:4097 -669:2:4098 -670:2:4109 -671:2:4114 -672:2:4115 -673:2:4126 -674:2:4127 -675:2:4128 -676:2:4126 -677:2:4127 -678:2:4128 -679:2:4139 -680:2:4149 -681:2:4150 -682:0:4630 -683:2:3295 -684:0:4630 -685:2:4156 -686:0:4630 -687:2:4460 -688:2:4461 -689:2:4465 -690:2:4469 -691:2:4470 -692:2:4474 -693:2:4482 -694:2:4483 -695:2:4487 -696:2:4491 -697:2:4492 -698:2:4487 -699:2:4491 -700:2:4492 -701:2:4496 -702:2:4503 -703:2:4510 -704:2:4511 -705:2:4518 -706:2:4523 -707:2:4530 -708:2:4531 -709:2:4530 -710:2:4531 -711:2:4538 -712:2:4542 -713:0:4630 -714:2:4158 -715:2:4168 -716:0:4630 -717:2:3295 -718:0:4630 -719:2:4159 -720:2:4160 -721:0:4630 -722:2:3295 -723:0:4630 -724:2:4164 -725:0:4630 -726:2:4172 -727:0:4630 -728:2:3292 -729:0:4630 -730:2:3294 -731:0:4630 -732:2:3295 -733:0:4630 -734:2:3296 -735:2:3297 -736:2:3301 -737:2:3302 -738:2:3310 -739:2:3311 -740:2:3315 -741:2:3316 -742:2:3324 -743:2:3329 -744:2:3333 -745:2:3334 -746:2:3342 -747:2:3343 -748:2:3347 -749:2:3348 -750:2:3342 -751:2:3343 -752:2:3344 -753:2:3356 -754:2:3361 -755:2:3362 -756:2:3373 -757:2:3374 -758:2:3375 -759:2:3386 -760:2:3391 -761:2:3392 -762:2:3403 -763:2:3404 -764:2:3405 -765:2:3403 -766:2:3404 -767:2:3405 -768:2:3416 -769:2:3424 -770:0:4630 -771:2:3295 -772:0:4630 -773:1:2 -774:0:4630 -775:1:8 -776:0:4630 -777:1:9 -778:0:4630 -779:1:10 -780:0:4630 -781:1:11 -782:0:4630 -783:1:12 -784:1:13 -785:1:17 -786:1:18 -787:1:26 -788:1:27 -789:1:31 -790:1:32 -791:1:40 -792:1:45 -793:1:49 -794:1:50 -795:1:58 -796:1:59 -797:1:63 -798:1:64 -799:1:58 -800:1:59 -801:1:63 -802:1:64 -803:1:72 -804:1:77 -805:1:78 -806:1:89 -807:1:90 -808:1:91 -809:1:102 -810:1:107 -811:1:108 -812:1:119 -813:1:120 -814:1:121 -815:1:119 -816:1:120 -817:1:121 -818:1:132 -819:0:4630 -820:1:11 -821:0:4630 -822:1:141 -823:1:142 -824:0:4630 -825:1:11 -826:0:4630 -827:1:148 -828:1:149 -829:1:153 -830:1:154 -831:1:162 -832:1:163 -833:1:167 -834:1:168 -835:1:176 -836:1:181 -837:1:185 -838:1:186 -839:1:194 -840:1:195 -841:1:199 -842:1:200 -843:1:194 -844:1:195 -845:1:199 -846:1:200 -847:1:208 -848:1:213 -849:1:214 -850:1:225 -851:1:226 -852:1:227 -853:1:238 -854:1:243 -855:1:244 -856:1:255 -857:1:256 -858:1:257 -859:1:255 -860:1:256 -861:1:257 -862:1:268 -863:0:4630 -864:1:11 -865:0:4630 -866:1:277 -867:1:278 -868:1:282 -869:1:283 -870:1:291 -871:1:292 -872:1:296 -873:1:297 -874:1:305 -875:1:310 -876:1:314 -877:1:315 -878:1:323 -879:1:324 -880:1:328 -881:1:329 -882:1:323 -883:1:324 -884:1:328 -885:1:329 -886:1:337 -887:1:342 -888:1:343 -889:1:354 -890:1:355 -891:1:356 -892:1:367 -893:1:372 -894:1:373 -895:1:384 -896:1:385 -897:1:386 -898:1:384 -899:1:385 -900:1:386 -901:1:397 -902:1:404 -903:0:4630 -904:1:11 -905:0:4630 -906:1:540 -907:1:544 -908:1:545 -909:1:549 -910:1:550 -911:1:558 -912:1:566 -913:1:567 -914:1:571 -915:1:575 -916:1:576 -917:1:571 -918:1:575 -919:1:576 -920:1:580 -921:1:587 -922:1:594 -923:1:595 -924:1:602 -925:1:607 -926:1:614 -927:1:615 -928:1:614 -929:1:615 -930:1:622 -931:0:4630 -932:1:11 -933:0:4630 -934:2:3428 -935:2:3432 -936:2:3433 -937:2:3437 -938:2:3441 -939:2:3442 -940:2:3446 -941:2:3454 -942:2:3455 -943:2:3459 -944:2:3463 -945:2:3464 -946:2:3459 -947:2:3460 -948:2:3468 -949:0:4630 -950:2:3295 -951:0:4630 -952:2:3476 -953:2:3477 -954:2:3478 -955:0:4630 -956:2:3295 -957:0:4630 -958:2:3483 -959:0:4630 -960:2:4187 -961:2:4188 -962:2:4192 -963:2:4196 -964:2:4197 -965:2:4201 -966:2:4206 -967:2:4214 -968:2:4218 -969:2:4219 -970:2:4214 -971:2:4218 -972:2:4219 -973:2:4223 -974:2:4230 -975:2:4237 -976:2:4238 -977:2:4245 -978:2:4250 -979:2:4257 -980:2:4258 -981:2:4257 -982:2:4258 -983:2:4265 -984:2:4269 -985:0:4630 -986:2:3485 -987:2:4168 -988:0:4630 -989:2:3295 -990:0:4630 -991:2:3486 -992:0:4630 -993:2:3295 -994:0:4630 -995:2:3489 -996:2:3490 -997:2:3494 -998:2:3495 -999:2:3503 -1000:2:3504 -1001:2:3508 -1002:2:3509 -1003:2:3517 -1004:2:3522 -1005:2:3526 -1006:2:3527 -1007:2:3535 -1008:2:3536 -1009:2:3540 -1010:2:3541 -1011:2:3535 -1012:2:3536 -1013:2:3540 -1014:2:3541 -1015:2:3549 -1016:2:3554 -1017:2:3555 -1018:2:3566 -1019:2:3567 -1020:2:3568 -1021:2:3579 -1022:2:3584 -1023:2:3585 -1024:2:3596 -1025:2:3597 -1026:2:3598 -1027:2:3596 -1028:2:3597 -1029:2:3598 -1030:2:3609 -1031:2:3616 -1032:0:4630 -1033:2:3295 -1034:0:4630 -1035:2:3620 -1036:2:3621 -1037:2:3622 -1038:2:3634 -1039:2:3635 -1040:2:3639 -1041:2:3640 -1042:2:3648 -1043:2:3653 -1044:2:3657 -1045:2:3658 -1046:2:3666 -1047:2:3667 -1048:2:3671 -1049:2:3672 -1050:2:3666 -1051:2:3667 -1052:2:3671 -1053:2:3672 -1054:2:3680 -1055:2:3685 -1056:2:3686 -1057:2:3697 -1058:2:3698 -1059:2:3699 -1060:2:3710 -1061:2:3715 -1062:2:3716 -1063:2:3727 -1064:2:3728 -1065:2:3729 -1066:2:3727 -1067:2:3728 -1068:2:3729 -1069:2:3740 -1070:2:3749 -1071:0:4630 -1072:2:3295 -1073:0:4630 -1074:2:3755 -1075:0:4630 -1076:2:4278 -1077:2:4279 -1078:2:4283 -1079:2:4287 -1080:2:4288 -1081:2:4292 -1082:2:4300 -1083:2:4301 -1084:2:4305 -1085:2:4309 -1086:2:4310 -1087:2:4305 -1088:2:4309 -1089:2:4310 -1090:2:4314 -1091:2:4321 -1092:2:4328 -1093:2:4329 -1094:2:4336 -1095:2:4341 -1096:2:4348 -1097:2:4349 -1098:2:4348 -1099:2:4349 -1100:2:4356 -1101:2:4360 -1102:0:4630 -1103:2:3757 -1104:2:3758 -1105:0:4630 -1106:2:3295 -1107:0:4630 -1108:2:3759 -1109:2:3760 -1110:2:3764 -1111:2:3765 -1112:2:3773 -1113:2:3774 -1114:2:3778 -1115:2:3779 -1116:2:3787 -1117:2:3792 -1118:2:3796 -1119:2:3797 -1120:2:3805 -1121:2:3806 -1122:2:3810 -1123:2:3811 -1124:2:3805 -1125:2:3806 -1126:2:3810 -1127:2:3811 -1128:2:3819 -1129:2:3824 -1130:2:3825 -1131:2:3836 -1132:2:3837 -1133:2:3838 -1134:2:3849 -1135:2:3854 -1136:2:3855 -1137:2:3866 -1138:2:3867 -1139:2:3868 -1140:2:3866 -1141:2:3867 -1142:2:3868 -1143:2:3879 -1144:0:4630 -1145:2:3295 -1146:0:4630 -1147:2:3620 -1148:2:3621 -1149:2:3625 -1150:2:3626 -1151:2:3634 -1152:2:3635 -1153:2:3639 -1154:2:3640 -1155:2:3648 -1156:2:3653 -1157:2:3657 -1158:2:3658 -1159:2:3666 -1160:2:3667 -1161:2:3671 -1162:2:3672 -1163:2:3666 -1164:2:3667 -1165:2:3671 -1166:2:3672 -1167:2:3680 -1168:2:3685 -1169:2:3686 -1170:2:3697 -1171:2:3698 -1172:2:3699 -1173:2:3710 -1174:2:3715 -1175:2:3716 -1176:2:3727 -1177:2:3728 -1178:2:3729 -1179:2:3727 -1180:2:3728 -1181:2:3729 -1182:2:3740 -1183:2:3749 -1184:0:4630 -1185:2:3295 -1186:0:4630 -1187:2:3755 -1188:0:4630 -1189:2:4278 -1190:2:4279 -1191:2:4283 -1192:2:4287 -1193:2:4288 -1194:2:4292 -1195:2:4300 -1196:2:4301 -1197:2:4305 -1198:2:4309 -1199:2:4310 -1200:2:4305 -1201:2:4309 -1202:2:4310 -1203:2:4314 -1204:2:4321 -1205:2:4328 -1206:2:4329 -1207:2:4336 -1208:2:4341 -1209:2:4348 -1210:2:4349 -1211:2:4348 -1212:2:4349 -1213:2:4356 -1214:2:4360 -1215:0:4630 -1216:2:3757 -1217:2:3758 -1218:0:4630 -1219:2:3295 -1220:0:4630 -1221:2:3620 -1222:2:3621 -1223:2:3625 -1224:2:3626 -1225:2:3634 -1226:2:3635 -1227:2:3639 -1228:2:3640 -1229:2:3648 -1230:2:3653 -1231:2:3657 -1232:2:3658 -1233:2:3666 -1234:2:3667 -1235:2:3671 -1236:2:3672 -1237:2:3666 -1238:2:3667 -1239:2:3671 -1240:2:3672 -1241:2:3680 -1242:2:3685 -1243:2:3686 -1244:2:3697 -1245:2:3698 -1246:2:3699 -1247:2:3710 -1248:2:3715 -1249:2:3716 -1250:2:3727 -1251:2:3728 -1252:2:3729 -1253:2:3727 -1254:2:3728 -1255:2:3729 -1256:2:3740 -1257:2:3749 -1258:0:4630 -1259:2:3295 -1260:0:4630 -1261:2:3755 -1262:0:4630 -1263:2:4278 -1264:2:4279 -1265:2:4283 -1266:2:4287 -1267:2:4288 -1268:2:4292 -1269:2:4300 -1270:2:4301 -1271:2:4305 -1272:2:4309 -1273:2:4310 -1274:2:4305 -1275:2:4309 -1276:2:4310 -1277:2:4314 -1278:2:4321 -1279:2:4328 -1280:2:4329 -1281:2:4336 -1282:2:4341 -1283:2:4348 -1284:2:4349 -1285:2:4348 -1286:2:4349 -1287:2:4356 -1288:2:4360 -1289:0:4630 -1290:1:632 -1291:1:633 -1292:1:637 -1293:1:638 -1294:1:646 -1295:1:647 -1296:1:651 -1297:1:652 -1298:1:660 -1299:1:665 -1300:1:669 -1301:1:670 -1302:1:678 -1303:1:679 -1304:1:683 -1305:1:684 -1306:1:678 -1307:1:679 -1308:1:683 -1309:1:684 -1310:1:692 -1311:1:697 -1312:1:698 -1313:1:709 -1314:1:710 -1315:1:711 -1316:1:722 -1317:1:727 -1318:1:728 -1319:1:739 -1320:1:740 -1321:1:741 -1322:1:739 -1323:1:747 -1324:1:748 -1325:1:752 -1326:0:4630 -1327:1:11 -1328:0:4630 -1329:2:3757 -1330:2:3758 -1331:0:4630 -1332:2:3295 -1333:0:4630 -1334:2:3620 -1335:2:3621 -1336:2:3625 -1337:2:3626 -1338:2:3634 -1339:2:3635 -1340:2:3639 -1341:2:3640 -1342:2:3648 -1343:2:3653 -1344:2:3657 -1345:2:3658 -1346:2:3666 -1347:2:3667 -1348:2:3671 -1349:2:3672 -1350:2:3666 -1351:2:3667 -1352:2:3671 -1353:2:3672 -1354:2:3680 -1355:2:3685 -1356:2:3686 -1357:2:3697 -1358:2:3698 -1359:2:3699 -1360:2:3710 -1361:2:3715 -1362:2:3716 -1363:2:3727 -1364:2:3728 -1365:2:3729 -1366:2:3727 -1367:2:3728 -1368:2:3729 -1369:2:3740 -1370:2:3749 -1371:0:4630 -1372:2:3295 -1373:0:4630 -1374:2:3755 -1375:0:4630 -1376:1:761 -1377:1:764 -1378:1:765 -1379:0:4630 -1380:1:11 -1381:0:4630 -1382:2:4278 -1383:2:4279 -1384:2:4283 -1385:2:4287 -1386:2:4288 -1387:2:4292 -1388:2:4300 -1389:2:4301 -1390:2:4305 -1391:2:4309 -1392:2:4310 -1393:2:4305 -1394:2:4309 -1395:2:4310 -1396:2:4314 -1397:2:4321 -1398:2:4328 -1399:2:4329 -1400:2:4336 -1401:2:4341 -1402:2:4348 -1403:2:4349 -1404:2:4348 -1405:2:4349 -1406:2:4356 -1407:2:4360 -1408:0:4630 -1409:2:3757 -1410:2:3758 -1411:0:4630 -1412:2:3295 -1413:0:4630 -1414:2:3620 -1415:2:3621 -1416:2:3625 -1417:2:3626 -1418:2:3634 -1419:2:3635 -1420:2:3639 -1421:2:3640 -1422:2:3648 -1423:2:3653 -1424:2:3657 -1425:2:3658 -1426:2:3666 -1427:2:3667 -1428:2:3671 -1429:2:3672 -1430:2:3666 -1431:2:3667 -1432:2:3671 -1433:2:3672 -1434:2:3680 -1435:2:3685 -1436:2:3686 -1437:2:3697 -1438:2:3698 -1439:2:3699 -1440:2:3710 -1441:2:3715 -1442:2:3716 -1443:2:3727 -1444:2:3728 -1445:2:3729 -1446:2:3727 -1447:2:3728 -1448:2:3729 -1449:2:3740 -1450:2:3749 -1451:0:4630 -1452:2:3295 -1453:0:4630 -1454:2:3759 -1455:2:3760 -1456:2:3764 -1457:2:3765 -1458:2:3773 -1459:2:3774 -1460:2:3778 -1461:2:3779 -1462:2:3787 -1463:2:3792 -1464:2:3796 -1465:2:3797 -1466:2:3805 -1467:2:3806 -1468:2:3810 -1469:2:3811 -1470:2:3805 -1471:2:3806 -1472:2:3810 -1473:2:3811 -1474:2:3819 -1475:2:3824 -1476:2:3825 -1477:2:3836 -1478:2:3837 -1479:2:3838 -1480:2:3849 -1481:2:3854 -1482:2:3855 -1483:2:3866 -1484:2:3867 -1485:2:3868 -1486:2:3866 -1487:2:3867 -1488:2:3868 -1489:2:3879 -1490:0:4630 -1491:2:3295 -1492:0:4630 -1493:2:3755 -1494:0:4630 -1495:2:4278 -1496:2:4279 -1497:2:4283 -1498:2:4287 -1499:2:4288 -1500:2:4292 -1501:2:4300 -1502:2:4301 -1503:2:4305 -1504:2:4309 -1505:2:4310 -1506:2:4305 -1507:2:4309 -1508:2:4310 -1509:2:4314 -1510:2:4321 -1511:2:4328 -1512:2:4329 -1513:2:4336 -1514:2:4341 -1515:2:4348 -1516:2:4349 -1517:2:4348 -1518:2:4349 -1519:2:4356 -1520:2:4360 -1521:0:4630 -1522:1:768 -1523:1:769 -1524:1:773 -1525:1:774 -1526:1:782 -1527:1:783 -1528:1:787 -1529:1:788 -1530:1:796 -1531:1:801 -1532:1:805 -1533:1:806 -1534:1:814 -1535:1:815 -1536:1:819 -1537:1:820 -1538:1:814 -1539:1:815 -1540:1:819 -1541:1:820 -1542:1:828 -1543:1:833 -1544:1:834 -1545:1:845 -1546:1:846 -1547:1:847 -1548:1:858 -1549:1:863 -1550:1:864 -1551:1:875 -1552:1:876 -1553:1:877 -1554:1:875 -1555:1:883 -1556:1:884 -1557:1:888 -1558:0:4630 -1559:1:11 -1560:0:4630 -1561:2:3757 -1562:2:3758 -1563:0:4630 -1564:2:3295 -1565:0:4630 -1566:2:3620 -1567:2:3621 -1568:2:3625 -1569:2:3626 -1570:2:3634 -1571:2:3635 -1572:2:3639 -1573:2:3640 -1574:2:3648 -1575:2:3653 -1576:2:3657 -1577:2:3658 -1578:2:3666 -1579:2:3667 -1580:2:3671 -1581:2:3672 -1582:2:3666 -1583:2:3667 -1584:2:3671 -1585:2:3672 -1586:2:3680 -1587:2:3685 -1588:2:3686 -1589:2:3697 -1590:2:3698 -1591:2:3699 -1592:2:3710 -1593:2:3715 -1594:2:3716 -1595:2:3727 -1596:2:3728 -1597:2:3729 -1598:2:3727 -1599:2:3728 -1600:2:3729 -1601:2:3740 -1602:2:3749 -1603:0:4630 -1604:2:3295 -1605:0:4630 -1606:2:3755 -1607:0:4630 -1608:2:4278 -1609:2:4279 -1610:2:4283 -1611:2:4287 -1612:2:4288 -1613:2:4292 -1614:2:4300 -1615:2:4301 -1616:2:4305 -1617:2:4309 -1618:2:4310 -1619:2:4305 -1620:2:4309 -1621:2:4310 -1622:2:4314 -1623:2:4321 -1624:2:4328 -1625:2:4329 -1626:2:4336 -1627:2:4341 -1628:2:4348 -1629:2:4349 -1630:2:4348 -1631:2:4349 -1632:2:4356 -1633:2:4360 -1634:0:4630 -1635:1:1028 -1636:1:1029 -1637:1:1033 -1638:1:1034 -1639:1:1042 -1640:1:1043 -1641:1:1047 -1642:1:1048 -1643:1:1056 -1644:1:1061 -1645:1:1065 -1646:1:1066 -1647:1:1074 -1648:1:1075 -1649:1:1079 -1650:1:1080 -1651:1:1074 -1652:1:1075 -1653:1:1079 -1654:1:1080 -1655:1:1088 -1656:1:1093 -1657:1:1094 -1658:1:1105 -1659:1:1106 -1660:1:1107 -1661:1:1118 -1662:1:1123 -1663:1:1124 -1664:1:1135 -1665:1:1136 -1666:1:1137 -1667:1:1135 -1668:1:1143 -1669:1:1144 -1670:1:1148 -1671:1:1155 -1672:1:1159 -1673:0:4630 -1674:1:11 -1675:0:4630 -1676:2:3757 -1677:2:3758 -1678:0:4630 -1679:2:3295 -1680:0:4630 -1681:2:3620 -1682:2:3621 -1683:2:3625 -1684:2:3626 -1685:2:3634 -1686:2:3635 -1687:2:3639 -1688:2:3640 -1689:2:3648 -1690:2:3653 -1691:2:3657 -1692:2:3658 -1693:2:3666 -1694:2:3667 -1695:2:3671 -1696:2:3672 -1697:2:3666 -1698:2:3667 -1699:2:3671 -1700:2:3672 -1701:2:3680 -1702:2:3685 -1703:2:3686 -1704:2:3697 -1705:2:3698 -1706:2:3699 -1707:2:3710 -1708:2:3715 -1709:2:3716 -1710:2:3727 -1711:2:3728 -1712:2:3729 -1713:2:3727 -1714:2:3728 -1715:2:3729 -1716:2:3740 -1717:2:3749 -1718:0:4630 -1719:2:3295 -1720:0:4630 -1721:2:3755 -1722:0:4630 -1723:1:1160 -1724:1:1161 -1725:1:1165 -1726:1:1166 -1727:1:1174 -1728:1:1175 -1729:1:1176 -1730:1:1188 -1731:1:1193 -1732:1:1197 -1733:1:1198 -1734:1:1206 -1735:1:1207 -1736:1:1211 -1737:1:1212 -1738:1:1206 -1739:1:1207 -1740:1:1211 -1741:1:1212 -1742:1:1220 -1743:1:1225 -1744:1:1226 -1745:1:1237 -1746:1:1238 -1747:1:1239 -1748:1:1250 -1749:1:1255 -1750:1:1256 -1751:1:1267 -1752:1:1268 -1753:1:1269 -1754:1:1267 -1755:1:1275 -1756:1:1276 -1757:1:1280 -1758:0:4630 -1759:1:11 -1760:0:4630 -1761:2:4278 -1762:2:4279 -1763:2:4283 -1764:2:4287 -1765:2:4288 -1766:2:4292 -1767:2:4300 -1768:2:4301 -1769:2:4305 -1770:2:4309 -1771:2:4310 -1772:2:4305 -1773:2:4309 -1774:2:4310 -1775:2:4314 -1776:2:4321 -1777:2:4328 -1778:2:4329 -1779:2:4336 -1780:2:4341 -1781:2:4348 -1782:2:4349 -1783:2:4348 -1784:2:4349 -1785:2:4356 -1786:2:4360 -1787:0:4630 -1788:2:3757 -1789:2:3758 -1790:0:4630 -1791:2:3295 -1792:0:4630 -1793:2:3620 -1794:2:3621 -1795:2:3625 -1796:2:3626 -1797:2:3634 -1798:2:3635 -1799:2:3639 -1800:2:3640 -1801:2:3648 -1802:2:3653 -1803:2:3657 -1804:2:3658 -1805:2:3666 -1806:2:3667 -1807:2:3671 -1808:2:3672 -1809:2:3666 -1810:2:3667 -1811:2:3671 -1812:2:3672 -1813:2:3680 -1814:2:3685 -1815:2:3686 -1816:2:3697 -1817:2:3698 -1818:2:3699 -1819:2:3710 -1820:2:3715 -1821:2:3716 -1822:2:3727 -1823:2:3728 -1824:2:3729 -1825:2:3727 -1826:2:3728 -1827:2:3729 -1828:2:3740 -1829:2:3749 -1830:0:4630 -1831:2:3295 -1832:0:4630 -1833:2:3755 -1834:0:4630 -1835:1:1289 -1836:0:4630 -1837:2:4278 -1838:2:4279 -1839:2:4283 -1840:2:4287 -1841:2:4288 -1842:2:4292 -1843:2:4300 -1844:2:4301 -1845:2:4305 -1846:2:4309 -1847:2:4310 -1848:2:4305 -1849:2:4309 -1850:2:4310 -1851:2:4314 -1852:2:4321 -1853:2:4328 -1854:2:4329 -1855:2:4336 -1856:2:4341 -1857:2:4348 -1858:2:4349 -1859:2:4348 -1860:2:4349 -1861:2:4356 -1862:2:4360 -1863:0:4630 -1864:2:3757 -1865:2:3758 -1866:0:4630 -1867:2:3295 -1868:0:4630 -1869:2:3620 -1870:2:3621 -1871:2:3625 -1872:2:3626 -1873:2:3634 -1874:2:3635 -1875:2:3639 -1876:2:3640 -1877:2:3648 -1878:2:3653 -1879:2:3657 -1880:2:3658 -1881:2:3666 -1882:2:3667 -1883:2:3671 -1884:2:3672 -1885:2:3666 -1886:2:3667 -1887:2:3671 -1888:2:3672 -1889:2:3680 -1890:2:3685 -1891:2:3686 -1892:2:3697 -1893:2:3698 -1894:2:3699 -1895:2:3710 -1896:2:3715 -1897:2:3716 -1898:2:3727 -1899:2:3728 -1900:2:3729 -1901:2:3727 -1902:2:3728 -1903:2:3729 -1904:2:3740 -1905:2:3749 -1906:0:4630 -1907:2:3295 -1908:0:4630 -1909:2:3759 -1910:2:3760 -1911:2:3764 -1912:2:3765 -1913:2:3773 -1914:2:3774 -1915:2:3778 -1916:2:3779 -1917:2:3787 -1918:2:3792 -1919:2:3796 -1920:2:3797 -1921:2:3805 -1922:2:3806 -1923:2:3810 -1924:2:3811 -1925:2:3805 -1926:2:3806 -1927:2:3810 -1928:2:3811 -1929:2:3819 -1930:2:3824 -1931:2:3825 -1932:2:3836 -1933:2:3837 -1934:2:3838 -1935:2:3849 -1936:2:3854 -1937:2:3855 -1938:2:3866 -1939:2:3867 -1940:2:3868 -1941:2:3866 -1942:2:3867 -1943:2:3868 -1944:2:3879 -1945:0:4630 -1946:2:3295 -1947:0:4630 -1948:2:3755 -1949:0:4630 -1950:2:4278 -1951:2:4279 -1952:2:4283 -1953:2:4287 -1954:2:4288 -1955:2:4292 -1956:2:4300 -1957:2:4301 -1958:2:4305 -1959:2:4309 -1960:2:4310 -1961:2:4305 -1962:2:4309 -1963:2:4310 -1964:2:4314 -1965:2:4321 -1966:2:4328 -1967:2:4329 -1968:2:4336 -1969:2:4341 -1970:2:4348 -1971:2:4349 -1972:2:4348 -1973:2:4349 -1974:2:4356 -1975:2:4360 -1976:0:4630 -1977:1:3023 -1978:1:3027 -1979:1:3028 -1980:1:3036 -1981:1:3037 -1982:1:3041 -1983:1:3042 -1984:1:3050 -1985:1:3055 -1986:1:3059 -1987:1:3060 -1988:1:3068 -1989:1:3069 -1990:1:3073 -1991:1:3074 -1992:1:3068 -1993:1:3069 -1994:1:3073 -1995:1:3074 -1996:1:3082 -1997:1:3087 -1998:1:3088 -1999:1:3099 -2000:1:3100 -2001:1:3101 -2002:1:3112 -2003:1:3117 -2004:1:3118 -2005:1:3129 -2006:1:3130 -2007:1:3131 -2008:1:3129 -2009:1:3137 -2010:1:3138 -2011:1:3142 -2012:1:3146 -2013:0:4630 -2014:2:3757 -2015:2:3758 -2016:0:4630 -2017:2:3295 -2018:0:4630 -2019:2:3620 -2020:2:3621 -2021:2:3625 -2022:2:3626 -2023:2:3634 -2024:2:3635 -2025:2:3639 -2026:2:3640 -2027:2:3648 -2028:2:3653 -2029:2:3657 -2030:2:3658 -2031:2:3666 -2032:2:3667 -2033:2:3671 -2034:2:3672 -2035:2:3666 -2036:2:3667 -2037:2:3671 -2038:2:3672 -2039:2:3680 -2040:2:3685 -2041:2:3686 -2042:2:3697 -2043:2:3698 -2044:2:3699 -2045:2:3710 -2046:2:3715 -2047:2:3716 -2048:2:3727 -2049:2:3728 -2050:2:3729 -2051:2:3727 -2052:2:3728 -2053:2:3729 -2054:2:3740 -2055:2:3749 -2056:0:4630 -2057:2:3295 -2058:0:4630 -2059:2:3755 -2060:0:4630 -2061:2:4278 -2062:2:4279 -2063:2:4283 -2064:2:4287 -2065:2:4288 -2066:2:4292 -2067:2:4300 -2068:2:4301 -2069:2:4305 -2070:2:4309 -2071:2:4310 -2072:2:4305 -2073:2:4309 -2074:2:4310 -2075:2:4314 -2076:2:4321 -2077:2:4328 -2078:2:4329 -2079:2:4336 -2080:2:4341 -2081:2:4348 -2082:2:4349 -2083:2:4348 -2084:2:4349 -2085:2:4356 -2086:2:4360 -2087:0:4630 -2088:1:1291 -2089:1:1292 -2090:0:4628 -2091:1:11 -2092:0:4634 -2093:1:3146 diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_wmb.define b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_wmb.log b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_wmb.log deleted file mode 100644 index 5c504a7..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_wmb.log +++ /dev/null @@ -1,505 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_wmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1295) -Depth= 5131 States= 1e+06 Transitions= 5.44e+08 Memory= 550.432 t= 664 R= 2e+03 -Depth= 5131 States= 2e+06 Transitions= 1.26e+09 Memory= 634.318 t= 1.56e+03 R= 1e+03 -Depth= 5422 States= 3e+06 Transitions= 1.93e+09 Memory= 718.303 t= 2.43e+03 R= 1e+03 -pan: resizing hashtable to -w22.. done -Depth= 5422 States= 4e+06 Transitions= 2.58e+09 Memory= 833.311 t= 3.23e+03 R= 1e+03 -Depth= 5422 States= 5e+06 Transitions= 3.25e+09 Memory= 917.295 t= 4.07e+03 R= 1e+03 -pan: claim violated! (at depth 1420) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 5422, errors: 1 - 5523708 states, stored -3.5450503e+09 states, matched -3.550574e+09 transitions (= stored+matched) -2.0146324e+10 atomic steps -hash conflicts: 2.4095106e+09 (resolved) - -Stats on memory usage (in Megabytes): - 611.067 equivalent memory usage for states (stored*(State-vector + overhead)) - 471.813 actual memory usage for states (compression: 77.21%) - state-vector as stored = 62 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 961.240 total actual memory usage - -unreached in proctype urcu_reader - line 411, "pan.___", state 17, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 49, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 63, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 82, "(1)" - line 438, "pan.___", state 112, "(1)" - line 442, "pan.___", state 125, "(1)" - line 597, "pan.___", state 146, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 411, "pan.___", state 153, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 185, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 199, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 218, "(1)" - line 438, "pan.___", state 248, "(1)" - line 442, "pan.___", state 261, "(1)" - line 411, "pan.___", state 282, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 314, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 328, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 347, "(1)" - line 438, "pan.___", state 377, "(1)" - line 442, "pan.___", state 390, "(1)" - line 411, "pan.___", state 413, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 415, "(1)" - line 411, "pan.___", state 416, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 416, "else" - line 411, "pan.___", state 419, "(1)" - line 415, "pan.___", state 427, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 429, "(1)" - line 415, "pan.___", state 430, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 430, "else" - line 415, "pan.___", state 433, "(1)" - line 415, "pan.___", state 434, "(1)" - line 415, "pan.___", state 434, "(1)" - line 413, "pan.___", state 439, "((i<1))" - line 413, "pan.___", state 439, "((i>=1))" - line 420, "pan.___", state 445, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 447, "(1)" - line 420, "pan.___", state 448, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 448, "else" - line 420, "pan.___", state 451, "(1)" - line 420, "pan.___", state 452, "(1)" - line 420, "pan.___", state 452, "(1)" - line 424, "pan.___", state 459, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 461, "(1)" - line 424, "pan.___", state 462, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 462, "else" - line 424, "pan.___", state 465, "(1)" - line 424, "pan.___", state 466, "(1)" - line 424, "pan.___", state 466, "(1)" - line 422, "pan.___", state 471, "((i<2))" - line 422, "pan.___", state 471, "((i>=2))" - line 429, "pan.___", state 478, "(1)" - line 429, "pan.___", state 479, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 479, "else" - line 429, "pan.___", state 482, "(1)" - line 429, "pan.___", state 483, "(1)" - line 429, "pan.___", state 483, "(1)" - line 433, "pan.___", state 491, "(1)" - line 433, "pan.___", state 492, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 492, "else" - line 433, "pan.___", state 495, "(1)" - line 433, "pan.___", state 496, "(1)" - line 433, "pan.___", state 496, "(1)" - line 431, "pan.___", state 501, "((i<1))" - line 431, "pan.___", state 501, "((i>=1))" - line 438, "pan.___", state 508, "(1)" - line 438, "pan.___", state 509, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 509, "else" - line 438, "pan.___", state 512, "(1)" - line 438, "pan.___", state 513, "(1)" - line 438, "pan.___", state 513, "(1)" - line 442, "pan.___", state 521, "(1)" - line 442, "pan.___", state 522, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 522, "else" - line 442, "pan.___", state 525, "(1)" - line 442, "pan.___", state 526, "(1)" - line 442, "pan.___", state 526, "(1)" - line 440, "pan.___", state 531, "((i<2))" - line 440, "pan.___", state 531, "((i>=2))" - line 450, "pan.___", state 535, "(1)" - line 450, "pan.___", state 535, "(1)" - line 597, "pan.___", state 538, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 597, "pan.___", state 539, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 597, "pan.___", state 540, "(1)" - line 272, "pan.___", state 544, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 555, "(1)" - line 280, "pan.___", state 566, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 575, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 591, "(1)" - line 253, "pan.___", state 599, "(1)" - line 257, "pan.___", state 611, "(1)" - line 261, "pan.___", state 619, "(1)" - line 411, "pan.___", state 637, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 651, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 669, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 683, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 702, "(1)" - line 433, "pan.___", state 715, "(1)" - line 438, "pan.___", state 732, "(1)" - line 442, "pan.___", state 745, "(1)" - line 411, "pan.___", state 773, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 805, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 819, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 838, "(1)" - line 438, "pan.___", state 868, "(1)" - line 442, "pan.___", state 881, "(1)" - line 411, "pan.___", state 902, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 904, "(1)" - line 411, "pan.___", state 905, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 905, "else" - line 411, "pan.___", state 908, "(1)" - line 415, "pan.___", state 916, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 918, "(1)" - line 415, "pan.___", state 919, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 919, "else" - line 415, "pan.___", state 922, "(1)" - line 415, "pan.___", state 923, "(1)" - line 415, "pan.___", state 923, "(1)" - line 413, "pan.___", state 928, "((i<1))" - line 413, "pan.___", state 928, "((i>=1))" - line 420, "pan.___", state 934, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 936, "(1)" - line 420, "pan.___", state 937, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 937, "else" - line 420, "pan.___", state 940, "(1)" - line 420, "pan.___", state 941, "(1)" - line 420, "pan.___", state 941, "(1)" - line 424, "pan.___", state 948, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 950, "(1)" - line 424, "pan.___", state 951, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 951, "else" - line 424, "pan.___", state 954, "(1)" - line 424, "pan.___", state 955, "(1)" - line 424, "pan.___", state 955, "(1)" - line 422, "pan.___", state 960, "((i<2))" - line 422, "pan.___", state 960, "((i>=2))" - line 429, "pan.___", state 967, "(1)" - line 429, "pan.___", state 968, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 968, "else" - line 429, "pan.___", state 971, "(1)" - line 429, "pan.___", state 972, "(1)" - line 429, "pan.___", state 972, "(1)" - line 433, "pan.___", state 980, "(1)" - line 433, "pan.___", state 981, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 981, "else" - line 433, "pan.___", state 984, "(1)" - line 433, "pan.___", state 985, "(1)" - line 433, "pan.___", state 985, "(1)" - line 431, "pan.___", state 990, "((i<1))" - line 431, "pan.___", state 990, "((i>=1))" - line 438, "pan.___", state 997, "(1)" - line 438, "pan.___", state 998, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 998, "else" - line 438, "pan.___", state 1001, "(1)" - line 438, "pan.___", state 1002, "(1)" - line 438, "pan.___", state 1002, "(1)" - line 442, "pan.___", state 1010, "(1)" - line 442, "pan.___", state 1011, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 1011, "else" - line 442, "pan.___", state 1014, "(1)" - line 442, "pan.___", state 1015, "(1)" - line 442, "pan.___", state 1015, "(1)" - line 440, "pan.___", state 1020, "((i<2))" - line 440, "pan.___", state 1020, "((i>=2))" - line 450, "pan.___", state 1024, "(1)" - line 450, "pan.___", state 1024, "(1)" - line 605, "pan.___", state 1028, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 411, "pan.___", state 1033, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1047, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1065, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1079, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1098, "(1)" - line 433, "pan.___", state 1111, "(1)" - line 438, "pan.___", state 1128, "(1)" - line 442, "pan.___", state 1141, "(1)" - line 411, "pan.___", state 1165, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1197, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1211, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1230, "(1)" - line 438, "pan.___", state 1260, "(1)" - line 442, "pan.___", state 1273, "(1)" - line 411, "pan.___", state 1298, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1330, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1344, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1363, "(1)" - line 438, "pan.___", state 1393, "(1)" - line 442, "pan.___", state 1406, "(1)" - line 411, "pan.___", state 1427, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1459, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1473, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1492, "(1)" - line 438, "pan.___", state 1522, "(1)" - line 442, "pan.___", state 1535, "(1)" - line 272, "pan.___", state 1558, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1580, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1589, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1605, "(1)" - line 253, "pan.___", state 1613, "(1)" - line 257, "pan.___", state 1625, "(1)" - line 261, "pan.___", state 1633, "(1)" - line 411, "pan.___", state 1651, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1665, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1683, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1697, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1716, "(1)" - line 433, "pan.___", state 1729, "(1)" - line 438, "pan.___", state 1746, "(1)" - line 442, "pan.___", state 1759, "(1)" - line 411, "pan.___", state 1780, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1794, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1812, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1826, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1845, "(1)" - line 433, "pan.___", state 1858, "(1)" - line 438, "pan.___", state 1875, "(1)" - line 442, "pan.___", state 1888, "(1)" - line 411, "pan.___", state 1912, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1944, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1958, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1977, "(1)" - line 438, "pan.___", state 2007, "(1)" - line 442, "pan.___", state 2020, "(1)" - line 644, "pan.___", state 2041, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 411, "pan.___", state 2048, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2080, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2094, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2113, "(1)" - line 438, "pan.___", state 2143, "(1)" - line 442, "pan.___", state 2156, "(1)" - line 411, "pan.___", state 2177, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2209, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2223, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2242, "(1)" - line 438, "pan.___", state 2272, "(1)" - line 442, "pan.___", state 2285, "(1)" - line 411, "pan.___", state 2308, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 2310, "(1)" - line 411, "pan.___", state 2311, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 2311, "else" - line 411, "pan.___", state 2314, "(1)" - line 415, "pan.___", state 2322, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2324, "(1)" - line 415, "pan.___", state 2325, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 2325, "else" - line 415, "pan.___", state 2328, "(1)" - line 415, "pan.___", state 2329, "(1)" - line 415, "pan.___", state 2329, "(1)" - line 413, "pan.___", state 2334, "((i<1))" - line 413, "pan.___", state 2334, "((i>=1))" - line 420, "pan.___", state 2340, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2342, "(1)" - line 420, "pan.___", state 2343, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 2343, "else" - line 420, "pan.___", state 2346, "(1)" - line 420, "pan.___", state 2347, "(1)" - line 420, "pan.___", state 2347, "(1)" - line 424, "pan.___", state 2354, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2356, "(1)" - line 424, "pan.___", state 2357, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 2357, "else" - line 424, "pan.___", state 2360, "(1)" - line 424, "pan.___", state 2361, "(1)" - line 424, "pan.___", state 2361, "(1)" - line 422, "pan.___", state 2366, "((i<2))" - line 422, "pan.___", state 2366, "((i>=2))" - line 429, "pan.___", state 2373, "(1)" - line 429, "pan.___", state 2374, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 2374, "else" - line 429, "pan.___", state 2377, "(1)" - line 429, "pan.___", state 2378, "(1)" - line 429, "pan.___", state 2378, "(1)" - line 433, "pan.___", state 2386, "(1)" - line 433, "pan.___", state 2387, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 2387, "else" - line 433, "pan.___", state 2390, "(1)" - line 433, "pan.___", state 2391, "(1)" - line 433, "pan.___", state 2391, "(1)" - line 431, "pan.___", state 2396, "((i<1))" - line 431, "pan.___", state 2396, "((i>=1))" - line 438, "pan.___", state 2403, "(1)" - line 438, "pan.___", state 2404, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 2404, "else" - line 438, "pan.___", state 2407, "(1)" - line 438, "pan.___", state 2408, "(1)" - line 438, "pan.___", state 2408, "(1)" - line 442, "pan.___", state 2416, "(1)" - line 442, "pan.___", state 2417, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 2417, "else" - line 442, "pan.___", state 2420, "(1)" - line 442, "pan.___", state 2421, "(1)" - line 442, "pan.___", state 2421, "(1)" - line 440, "pan.___", state 2426, "((i<2))" - line 440, "pan.___", state 2426, "((i>=2))" - line 450, "pan.___", state 2430, "(1)" - line 450, "pan.___", state 2430, "(1)" - line 644, "pan.___", state 2433, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 644, "pan.___", state 2434, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 644, "pan.___", state 2435, "(1)" - line 272, "pan.___", state 2439, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2461, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2470, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2486, "(1)" - line 253, "pan.___", state 2494, "(1)" - line 257, "pan.___", state 2506, "(1)" - line 261, "pan.___", state 2514, "(1)" - line 411, "pan.___", state 2532, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2546, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2564, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2578, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2597, "(1)" - line 433, "pan.___", state 2610, "(1)" - line 438, "pan.___", state 2627, "(1)" - line 442, "pan.___", state 2640, "(1)" - line 272, "pan.___", state 2664, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 2673, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2686, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2695, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2711, "(1)" - line 253, "pan.___", state 2719, "(1)" - line 257, "pan.___", state 2731, "(1)" - line 261, "pan.___", state 2739, "(1)" - line 411, "pan.___", state 2757, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2771, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2789, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2803, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2822, "(1)" - line 433, "pan.___", state 2835, "(1)" - line 438, "pan.___", state 2852, "(1)" - line 442, "pan.___", state 2865, "(1)" - line 411, "pan.___", state 2886, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2900, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2918, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2932, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2951, "(1)" - line 433, "pan.___", state 2964, "(1)" - line 438, "pan.___", state 2981, "(1)" - line 442, "pan.___", state 2994, "(1)" - line 249, "pan.___", state 3027, "(1)" - line 257, "pan.___", state 3047, "(1)" - line 261, "pan.___", state 3055, "(1)" - line 249, "pan.___", state 3070, "(1)" - line 253, "pan.___", state 3078, "(1)" - line 257, "pan.___", state 3090, "(1)" - line 261, "pan.___", state 3098, "(1)" - line 898, "pan.___", state 3115, "-end-" - (283 of 3115 states) -unreached in proctype urcu_writer - line 411, "pan.___", state 19, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 33, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 429, "pan.___", state 84, "(1)" - line 433, "pan.___", state 97, "(1)" - line 272, "pan.___", state 150, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 152, "(1)" - line 276, "pan.___", state 159, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 161, "(1)" - line 276, "pan.___", state 162, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 162, "else" - line 274, "pan.___", state 167, "((i<1))" - line 274, "pan.___", state 167, "((i>=1))" - line 280, "pan.___", state 172, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 174, "(1)" - line 280, "pan.___", state 175, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 175, "else" - line 284, "pan.___", state 181, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 183, "(1)" - line 284, "pan.___", state 184, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 184, "else" - line 289, "pan.___", state 193, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 289, "pan.___", state 193, "else" - line 411, "pan.___", state 212, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 226, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 244, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 258, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 277, "(1)" - line 433, "pan.___", state 290, "(1)" - line 438, "pan.___", state 307, "(1)" - line 442, "pan.___", state 320, "(1)" - line 415, "pan.___", state 357, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 375, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 389, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 421, "(1)" - line 438, "pan.___", state 438, "(1)" - line 442, "pan.___", state 451, "(1)" - line 415, "pan.___", state 496, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 514, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 528, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 560, "(1)" - line 438, "pan.___", state 577, "(1)" - line 442, "pan.___", state 590, "(1)" - line 415, "pan.___", state 625, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 643, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 657, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 689, "(1)" - line 438, "pan.___", state 706, "(1)" - line 442, "pan.___", state 719, "(1)" - line 415, "pan.___", state 756, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 774, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 788, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 820, "(1)" - line 438, "pan.___", state 837, "(1)" - line 442, "pan.___", state 850, "(1)" - line 272, "pan.___", state 905, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 914, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 249, "pan.___", state 952, "(1)" - line 253, "pan.___", state 960, "(1)" - line 257, "pan.___", state 972, "(1)" - line 261, "pan.___", state 980, "(1)" - line 276, "pan.___", state 1005, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1018, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1027, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1043, "(1)" - line 253, "pan.___", state 1051, "(1)" - line 257, "pan.___", state 1063, "(1)" - line 261, "pan.___", state 1071, "(1)" - line 276, "pan.___", state 1096, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1109, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1118, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1134, "(1)" - line 253, "pan.___", state 1142, "(1)" - line 257, "pan.___", state 1154, "(1)" - line 261, "pan.___", state 1162, "(1)" - line 276, "pan.___", state 1187, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1200, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1209, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1225, "(1)" - line 253, "pan.___", state 1233, "(1)" - line 257, "pan.___", state 1245, "(1)" - line 261, "pan.___", state 1253, "(1)" - line 1237, "pan.___", state 1268, "-end-" - (77 of 1268 states) -unreached in proctype :init: - line 1248, "pan.___", state 9, "((j<2))" - line 1248, "pan.___", state 9, "((j>=2))" - line 1249, "pan.___", state 20, "((j<2))" - line 1249, "pan.___", state 20, "((j>=2))" - line 1254, "pan.___", state 33, "((j<2))" - line 1254, "pan.___", state 33, "((j>=2))" - line 1252, "pan.___", state 43, "((i<1))" - line 1252, "pan.___", state 43, "((i>=1))" - line 1262, "pan.___", state 54, "((j<2))" - line 1262, "pan.___", state 54, "((j>=2))" - line 1266, "pan.___", state 67, "((j<2))" - line 1266, "pan.___", state 67, "((j>=2))" - (6 of 78 states) -unreached in proctype :never: - line 1300, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 4.43e+03 seconds -pan: rate 1246.6728 states/second -pan: avg transition delay 1.2479e-06 usec -cp .input.spin urcu_free_no_wmb.spin.input -cp .input.spin.trail urcu_free_no_wmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_wmb.spin.input b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_wmb.spin.input deleted file mode 100644 index 49791b0..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_wmb.spin.input +++ /dev/null @@ -1,1273 +0,0 @@ -#define NO_WMB - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_wmb.spin.input.trail deleted file mode 100644 index b250110..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_no_wmb.spin.input.trail +++ /dev/null @@ -1,1423 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:4463 -2:3:4383 -3:3:4386 -4:3:4386 -5:3:4389 -6:3:4397 -7:3:4397 -8:3:4400 -9:3:4406 -10:3:4410 -11:3:4410 -12:3:4413 -13:3:4423 -14:3:4431 -15:3:4431 -16:3:4434 -17:3:4440 -18:3:4444 -19:3:4444 -20:3:4447 -21:3:4453 -22:3:4457 -23:3:4458 -24:0:4463 -25:3:4460 -26:0:4463 -27:2:3117 -28:0:4463 -29:2:3123 -30:0:4463 -31:2:3124 -32:0:4463 -33:2:3126 -34:0:4463 -35:2:3127 -36:0:4463 -37:2:3128 -38:0:4463 -39:2:3129 -40:2:3130 -41:2:3134 -42:2:3135 -43:2:3143 -44:2:3144 -45:2:3148 -46:2:3149 -47:2:3157 -48:2:3162 -49:2:3166 -50:2:3167 -51:2:3175 -52:2:3176 -53:2:3180 -54:2:3181 -55:2:3175 -56:2:3176 -57:2:3180 -58:2:3181 -59:2:3189 -60:2:3194 -61:2:3195 -62:2:3206 -63:2:3207 -64:2:3208 -65:2:3219 -66:2:3224 -67:2:3225 -68:2:3236 -69:2:3237 -70:2:3238 -71:2:3236 -72:2:3237 -73:2:3238 -74:2:3249 -75:2:3257 -76:0:4463 -77:2:3128 -78:0:4463 -79:2:3309 -80:2:3310 -81:2:3311 -82:0:4463 -83:2:3128 -84:0:4463 -85:2:3316 -86:0:4463 -87:2:4020 -88:2:4021 -89:2:4025 -90:2:4029 -91:2:4030 -92:2:4034 -93:2:4039 -94:2:4047 -95:2:4051 -96:2:4052 -97:2:4047 -98:2:4048 -99:2:4056 -100:2:4063 -101:2:4070 -102:2:4071 -103:2:4078 -104:2:4083 -105:2:4090 -106:2:4091 -107:2:4090 -108:2:4091 -109:2:4098 -110:2:4102 -111:0:4463 -112:2:3318 -113:2:4001 -114:0:4463 -115:2:3128 -116:0:4463 -117:2:3319 -118:0:4463 -119:2:3128 -120:0:4463 -121:2:3322 -122:2:3323 -123:2:3327 -124:2:3328 -125:2:3336 -126:2:3337 -127:2:3341 -128:2:3342 -129:2:3350 -130:2:3355 -131:2:3359 -132:2:3360 -133:2:3368 -134:2:3369 -135:2:3373 -136:2:3374 -137:2:3368 -138:2:3369 -139:2:3373 -140:2:3374 -141:2:3382 -142:2:3387 -143:2:3388 -144:2:3399 -145:2:3400 -146:2:3401 -147:2:3412 -148:2:3417 -149:2:3418 -150:2:3429 -151:2:3430 -152:2:3431 -153:2:3429 -154:2:3430 -155:2:3431 -156:2:3442 -157:2:3449 -158:0:4463 -159:2:3128 -160:0:4463 -161:2:3453 -162:2:3454 -163:2:3455 -164:2:3467 -165:2:3468 -166:2:3472 -167:2:3473 -168:2:3481 -169:2:3486 -170:2:3490 -171:2:3491 -172:2:3499 -173:2:3500 -174:2:3504 -175:2:3505 -176:2:3499 -177:2:3500 -178:2:3504 -179:2:3505 -180:2:3513 -181:2:3518 -182:2:3519 -183:2:3530 -184:2:3531 -185:2:3532 -186:2:3543 -187:2:3548 -188:2:3549 -189:2:3560 -190:2:3561 -191:2:3562 -192:2:3560 -193:2:3561 -194:2:3562 -195:2:3573 -196:2:3584 -197:2:3585 -198:0:4463 -199:2:3128 -200:0:4463 -201:2:3592 -202:2:3593 -203:2:3597 -204:2:3598 -205:2:3606 -206:2:3607 -207:2:3611 -208:2:3612 -209:2:3620 -210:2:3625 -211:2:3629 -212:2:3630 -213:2:3638 -214:2:3639 -215:2:3643 -216:2:3644 -217:2:3638 -218:2:3639 -219:2:3643 -220:2:3644 -221:2:3652 -222:2:3657 -223:2:3658 -224:2:3669 -225:2:3670 -226:2:3671 -227:2:3682 -228:2:3687 -229:2:3688 -230:2:3699 -231:2:3700 -232:2:3701 -233:2:3699 -234:2:3700 -235:2:3701 -236:2:3712 -237:0:4463 -238:2:3128 -239:0:4463 -240:2:3721 -241:2:3722 -242:2:3726 -243:2:3727 -244:2:3735 -245:2:3736 -246:2:3740 -247:2:3741 -248:2:3749 -249:2:3754 -250:2:3758 -251:2:3759 -252:2:3767 -253:2:3768 -254:2:3772 -255:2:3773 -256:2:3767 -257:2:3768 -258:2:3772 -259:2:3773 -260:2:3781 -261:2:3786 -262:2:3787 -263:2:3798 -264:2:3799 -265:2:3800 -266:2:3811 -267:2:3816 -268:2:3817 -269:2:3828 -270:2:3829 -271:2:3830 -272:2:3828 -273:2:3829 -274:2:3830 -275:2:3841 -276:2:3848 -277:0:4463 -278:2:3128 -279:0:4463 -280:2:3852 -281:2:3853 -282:2:3854 -283:2:3866 -284:2:3867 -285:2:3871 -286:2:3872 -287:2:3880 -288:2:3885 -289:2:3889 -290:2:3890 -291:2:3898 -292:2:3899 -293:2:3903 -294:2:3904 -295:2:3898 -296:2:3899 -297:2:3903 -298:2:3904 -299:2:3912 -300:2:3917 -301:2:3918 -302:2:3929 -303:2:3930 -304:2:3931 -305:2:3942 -306:2:3947 -307:2:3948 -308:2:3959 -309:2:3960 -310:2:3961 -311:2:3959 -312:2:3960 -313:2:3961 -314:2:3972 -315:2:3982 -316:2:3983 -317:0:4463 -318:2:3128 -319:0:4463 -320:2:3989 -321:0:4463 -322:2:4293 -323:2:4294 -324:2:4298 -325:2:4302 -326:2:4303 -327:2:4307 -328:2:4315 -329:2:4316 -330:2:4320 -331:2:4324 -332:2:4325 -333:2:4320 -334:2:4324 -335:2:4325 -336:2:4329 -337:2:4336 -338:2:4343 -339:2:4344 -340:2:4351 -341:2:4356 -342:2:4363 -343:2:4364 -344:2:4363 -345:2:4364 -346:2:4371 -347:2:4375 -348:0:4463 -349:2:3991 -350:2:4001 -351:0:4463 -352:2:3128 -353:0:4463 -354:2:3992 -355:2:3993 -356:0:4463 -357:2:3128 -358:0:4463 -359:2:3997 -360:0:4463 -361:2:4005 -362:0:4463 -363:2:3124 -364:0:4463 -365:2:3126 -366:0:4463 -367:2:3127 -368:0:4463 -369:2:3128 -370:0:4463 -371:2:3309 -372:2:3310 -373:2:3311 -374:0:4463 -375:2:3128 -376:0:4463 -377:2:3129 -378:2:3130 -379:2:3134 -380:2:3135 -381:2:3143 -382:2:3144 -383:2:3148 -384:2:3149 -385:2:3157 -386:2:3162 -387:2:3163 -388:2:3175 -389:2:3176 -390:2:3177 -391:2:3175 -392:2:3176 -393:2:3180 -394:2:3181 -395:2:3189 -396:2:3194 -397:2:3195 -398:2:3206 -399:2:3207 -400:2:3208 -401:2:3219 -402:2:3224 -403:2:3225 -404:2:3236 -405:2:3237 -406:2:3238 -407:2:3236 -408:2:3237 -409:2:3238 -410:2:3249 -411:2:3257 -412:0:4463 -413:2:3128 -414:0:4463 -415:2:3316 -416:0:4463 -417:2:4020 -418:2:4021 -419:2:4025 -420:2:4029 -421:2:4030 -422:2:4034 -423:2:4042 -424:2:4043 -425:2:4047 -426:2:4048 -427:2:4047 -428:2:4051 -429:2:4052 -430:2:4056 -431:2:4063 -432:2:4070 -433:2:4071 -434:2:4078 -435:2:4083 -436:2:4090 -437:2:4091 -438:2:4090 -439:2:4091 -440:2:4098 -441:2:4102 -442:0:4463 -443:2:3318 -444:2:4001 -445:0:4463 -446:2:3128 -447:0:4463 -448:2:3319 -449:0:4463 -450:2:3128 -451:0:4463 -452:2:3322 -453:2:3323 -454:2:3327 -455:2:3328 -456:2:3336 -457:2:3337 -458:2:3341 -459:2:3342 -460:2:3350 -461:2:3355 -462:2:3359 -463:2:3360 -464:2:3368 -465:2:3369 -466:2:3373 -467:2:3374 -468:2:3368 -469:2:3369 -470:2:3373 -471:2:3374 -472:2:3382 -473:2:3387 -474:2:3388 -475:2:3399 -476:2:3400 -477:2:3401 -478:2:3412 -479:2:3417 -480:2:3418 -481:2:3429 -482:2:3430 -483:2:3431 -484:2:3429 -485:2:3430 -486:2:3431 -487:2:3442 -488:2:3449 -489:0:4463 -490:2:3128 -491:0:4463 -492:2:3453 -493:2:3454 -494:2:3455 -495:2:3467 -496:2:3468 -497:2:3472 -498:2:3473 -499:2:3481 -500:2:3486 -501:2:3490 -502:2:3491 -503:2:3499 -504:2:3500 -505:2:3504 -506:2:3505 -507:2:3499 -508:2:3500 -509:2:3504 -510:2:3505 -511:2:3513 -512:2:3518 -513:2:3519 -514:2:3530 -515:2:3531 -516:2:3532 -517:2:3543 -518:2:3548 -519:2:3549 -520:2:3560 -521:2:3561 -522:2:3562 -523:2:3560 -524:2:3561 -525:2:3562 -526:2:3573 -527:2:3584 -528:2:3585 -529:0:4463 -530:2:3128 -531:0:4463 -532:2:3592 -533:2:3593 -534:2:3597 -535:2:3598 -536:2:3606 -537:2:3607 -538:2:3611 -539:2:3612 -540:2:3620 -541:2:3625 -542:2:3629 -543:2:3630 -544:2:3638 -545:2:3639 -546:2:3643 -547:2:3644 -548:2:3638 -549:2:3639 -550:2:3643 -551:2:3644 -552:2:3652 -553:2:3657 -554:2:3658 -555:2:3669 -556:2:3670 -557:2:3671 -558:2:3682 -559:2:3687 -560:2:3688 -561:2:3699 -562:2:3700 -563:2:3701 -564:2:3699 -565:2:3700 -566:2:3701 -567:2:3712 -568:0:4463 -569:2:3128 -570:0:4463 -571:2:3721 -572:2:3722 -573:2:3726 -574:2:3727 -575:2:3735 -576:2:3736 -577:2:3740 -578:2:3741 -579:2:3749 -580:2:3754 -581:2:3758 -582:2:3759 -583:2:3767 -584:2:3768 -585:2:3772 -586:2:3773 -587:2:3767 -588:2:3768 -589:2:3772 -590:2:3773 -591:2:3781 -592:2:3786 -593:2:3787 -594:2:3798 -595:2:3799 -596:2:3800 -597:2:3811 -598:2:3816 -599:2:3817 -600:2:3828 -601:2:3829 -602:2:3830 -603:2:3828 -604:2:3829 -605:2:3830 -606:2:3841 -607:2:3848 -608:0:4463 -609:2:3128 -610:0:4463 -611:2:3852 -612:2:3853 -613:2:3854 -614:2:3866 -615:2:3867 -616:2:3871 -617:2:3872 -618:2:3880 -619:2:3885 -620:2:3889 -621:2:3890 -622:2:3898 -623:2:3899 -624:2:3903 -625:2:3904 -626:2:3898 -627:2:3899 -628:2:3903 -629:2:3904 -630:2:3912 -631:2:3917 -632:2:3918 -633:2:3929 -634:2:3930 -635:2:3931 -636:2:3942 -637:2:3947 -638:2:3948 -639:2:3959 -640:2:3960 -641:2:3961 -642:2:3959 -643:2:3960 -644:2:3961 -645:2:3972 -646:2:3982 -647:2:3983 -648:0:4463 -649:2:3128 -650:0:4463 -651:2:3989 -652:0:4463 -653:2:4293 -654:2:4294 -655:2:4298 -656:2:4302 -657:2:4303 -658:2:4307 -659:2:4315 -660:2:4316 -661:2:4320 -662:2:4324 -663:2:4325 -664:2:4320 -665:2:4324 -666:2:4325 -667:2:4329 -668:2:4336 -669:2:4343 -670:2:4344 -671:2:4351 -672:2:4356 -673:2:4363 -674:2:4364 -675:2:4363 -676:2:4364 -677:2:4371 -678:2:4375 -679:0:4463 -680:2:3991 -681:2:4001 -682:0:4463 -683:2:3128 -684:0:4463 -685:2:3992 -686:2:3993 -687:0:4463 -688:2:3128 -689:0:4463 -690:2:3997 -691:0:4463 -692:2:4005 -693:0:4463 -694:2:3124 -695:0:4463 -696:2:3126 -697:0:4463 -698:2:3127 -699:0:4463 -700:2:3128 -701:0:4463 -702:2:3129 -703:2:3130 -704:2:3134 -705:2:3135 -706:2:3143 -707:2:3144 -708:2:3148 -709:2:3149 -710:2:3157 -711:2:3162 -712:2:3166 -713:2:3167 -714:2:3175 -715:2:3176 -716:2:3180 -717:2:3181 -718:2:3175 -719:2:3176 -720:2:3177 -721:2:3189 -722:2:3194 -723:2:3195 -724:2:3206 -725:2:3207 -726:2:3208 -727:2:3219 -728:2:3224 -729:2:3225 -730:2:3236 -731:2:3237 -732:2:3238 -733:2:3236 -734:2:3237 -735:2:3238 -736:2:3249 -737:2:3257 -738:0:4463 -739:2:3128 -740:0:4463 -741:2:3309 -742:2:3310 -743:2:3311 -744:0:4463 -745:2:3128 -746:0:4463 -747:2:3316 -748:0:4463 -749:1:2 -750:0:4463 -751:1:8 -752:0:4463 -753:1:9 -754:0:4463 -755:1:10 -756:0:4463 -757:1:11 -758:0:4463 -759:1:12 -760:1:13 -761:1:17 -762:1:18 -763:1:26 -764:1:27 -765:1:31 -766:1:32 -767:1:40 -768:1:45 -769:1:49 -770:1:50 -771:1:58 -772:1:59 -773:1:63 -774:1:64 -775:1:58 -776:1:59 -777:1:63 -778:1:64 -779:1:72 -780:1:77 -781:1:78 -782:1:89 -783:1:90 -784:1:91 -785:1:102 -786:1:107 -787:1:108 -788:1:119 -789:1:120 -790:1:121 -791:1:119 -792:1:120 -793:1:121 -794:1:132 -795:0:4463 -796:1:11 -797:0:4463 -798:1:141 -799:1:142 -800:0:4463 -801:1:11 -802:0:4463 -803:1:148 -804:1:149 -805:1:153 -806:1:154 -807:1:162 -808:1:163 -809:1:167 -810:1:168 -811:1:176 -812:1:181 -813:1:185 -814:1:186 -815:1:194 -816:1:195 -817:1:199 -818:1:200 -819:1:194 -820:1:195 -821:1:199 -822:1:200 -823:1:208 -824:1:213 -825:1:214 -826:1:225 -827:1:226 -828:1:227 -829:1:238 -830:1:243 -831:1:244 -832:1:255 -833:1:256 -834:1:257 -835:1:255 -836:1:256 -837:1:257 -838:1:268 -839:0:4463 -840:1:11 -841:0:4463 -842:1:277 -843:1:278 -844:1:282 -845:1:283 -846:1:291 -847:1:292 -848:1:296 -849:1:297 -850:1:305 -851:1:310 -852:1:314 -853:1:315 -854:1:323 -855:1:324 -856:1:328 -857:1:329 -858:1:323 -859:1:324 -860:1:328 -861:1:329 -862:1:337 -863:1:342 -864:1:343 -865:1:354 -866:1:355 -867:1:356 -868:1:367 -869:1:372 -870:1:373 -871:1:384 -872:1:385 -873:1:386 -874:1:384 -875:1:385 -876:1:386 -877:1:397 -878:1:404 -879:0:4463 -880:1:11 -881:0:4463 -882:1:540 -883:1:544 -884:1:545 -885:1:549 -886:1:550 -887:1:558 -888:1:566 -889:1:567 -890:1:571 -891:1:575 -892:1:576 -893:1:571 -894:1:575 -895:1:576 -896:1:580 -897:1:587 -898:1:594 -899:1:595 -900:1:602 -901:1:607 -902:1:614 -903:1:615 -904:1:614 -905:1:615 -906:1:622 -907:0:4463 -908:1:11 -909:0:4463 -910:1:632 -911:1:633 -912:1:637 -913:1:638 -914:1:646 -915:1:647 -916:1:651 -917:1:652 -918:1:660 -919:1:665 -920:1:669 -921:1:670 -922:1:678 -923:1:679 -924:1:683 -925:1:684 -926:1:678 -927:1:679 -928:1:683 -929:1:684 -930:1:692 -931:1:697 -932:1:698 -933:1:709 -934:1:710 -935:1:711 -936:1:722 -937:1:727 -938:1:728 -939:1:739 -940:1:740 -941:1:741 -942:1:739 -943:1:740 -944:1:741 -945:1:752 -946:0:4463 -947:1:11 -948:0:4463 -949:1:761 -950:1:764 -951:1:765 -952:0:4463 -953:1:11 -954:0:4463 -955:1:768 -956:1:769 -957:1:773 -958:1:774 -959:1:782 -960:1:783 -961:1:787 -962:1:788 -963:1:796 -964:1:801 -965:1:805 -966:1:806 -967:1:814 -968:1:815 -969:1:819 -970:1:820 -971:1:814 -972:1:815 -973:1:819 -974:1:820 -975:1:828 -976:1:833 -977:1:834 -978:1:845 -979:1:846 -980:1:847 -981:1:858 -982:1:863 -983:1:864 -984:1:875 -985:1:876 -986:1:877 -987:1:875 -988:1:876 -989:1:877 -990:1:888 -991:0:4463 -992:1:11 -993:0:4463 -994:1:1028 -995:1:1029 -996:1:1033 -997:1:1034 -998:1:1042 -999:1:1043 -1000:1:1047 -1001:1:1048 -1002:1:1056 -1003:1:1061 -1004:1:1065 -1005:1:1066 -1006:1:1074 -1007:1:1075 -1008:1:1079 -1009:1:1080 -1010:1:1074 -1011:1:1075 -1012:1:1079 -1013:1:1080 -1014:1:1088 -1015:1:1093 -1016:1:1094 -1017:1:1105 -1018:1:1106 -1019:1:1107 -1020:1:1118 -1021:1:1123 -1022:1:1124 -1023:1:1135 -1024:1:1136 -1025:1:1137 -1026:1:1135 -1027:1:1136 -1028:1:1137 -1029:1:1148 -1030:1:1155 -1031:1:1159 -1032:0:4463 -1033:1:11 -1034:0:4463 -1035:1:1160 -1036:1:1161 -1037:1:1165 -1038:1:1166 -1039:1:1174 -1040:1:1175 -1041:1:1176 -1042:1:1188 -1043:1:1193 -1044:1:1197 -1045:1:1198 -1046:1:1206 -1047:1:1207 -1048:1:1211 -1049:1:1212 -1050:1:1206 -1051:1:1207 -1052:1:1211 -1053:1:1212 -1054:1:1220 -1055:1:1225 -1056:1:1226 -1057:1:1237 -1058:1:1238 -1059:1:1239 -1060:1:1250 -1061:1:1255 -1062:1:1256 -1063:1:1267 -1064:1:1268 -1065:1:1269 -1066:1:1267 -1067:1:1268 -1068:1:1269 -1069:1:1280 -1070:0:4463 -1071:1:11 -1072:0:4463 -1073:1:1289 -1074:0:4463 -1075:1:3023 -1076:1:3030 -1077:1:3031 -1078:1:3038 -1079:1:3043 -1080:1:3050 -1081:1:3051 -1082:1:3050 -1083:1:3051 -1084:1:3058 -1085:1:3062 -1086:0:4463 -1087:2:4020 -1088:2:4021 -1089:2:4025 -1090:2:4029 -1091:2:4030 -1092:2:4034 -1093:2:4039 -1094:2:4047 -1095:2:4051 -1096:2:4052 -1097:2:4047 -1098:2:4048 -1099:2:4056 -1100:2:4063 -1101:2:4070 -1102:2:4071 -1103:2:4078 -1104:2:4083 -1105:2:4090 -1106:2:4091 -1107:2:4090 -1108:2:4091 -1109:2:4098 -1110:2:4102 -1111:0:4463 -1112:2:3318 -1113:2:4001 -1114:0:4463 -1115:2:3128 -1116:0:4463 -1117:2:3319 -1118:0:4463 -1119:2:3128 -1120:0:4463 -1121:2:3322 -1122:2:3323 -1123:2:3327 -1124:2:3328 -1125:2:3336 -1126:2:3337 -1127:2:3341 -1128:2:3342 -1129:2:3350 -1130:2:3355 -1131:2:3359 -1132:2:3360 -1133:2:3368 -1134:2:3369 -1135:2:3373 -1136:2:3374 -1137:2:3368 -1138:2:3369 -1139:2:3373 -1140:2:3374 -1141:2:3382 -1142:2:3387 -1143:2:3388 -1144:2:3399 -1145:2:3400 -1146:2:3401 -1147:2:3412 -1148:2:3417 -1149:2:3418 -1150:2:3429 -1151:2:3430 -1152:2:3431 -1153:2:3429 -1154:2:3430 -1155:2:3431 -1156:2:3442 -1157:2:3449 -1158:0:4463 -1159:2:3128 -1160:0:4463 -1161:2:3453 -1162:2:3454 -1163:2:3455 -1164:2:3467 -1165:2:3468 -1166:2:3472 -1167:2:3473 -1168:2:3481 -1169:2:3486 -1170:2:3490 -1171:2:3491 -1172:2:3499 -1173:2:3500 -1174:2:3504 -1175:2:3505 -1176:2:3499 -1177:2:3500 -1178:2:3504 -1179:2:3505 -1180:2:3513 -1181:2:3518 -1182:2:3519 -1183:2:3530 -1184:2:3531 -1185:2:3532 -1186:2:3543 -1187:2:3548 -1188:2:3549 -1189:2:3560 -1190:2:3561 -1191:2:3562 -1192:2:3560 -1193:2:3561 -1194:2:3562 -1195:2:3573 -1196:2:3582 -1197:0:4463 -1198:2:3128 -1199:0:4463 -1200:2:3588 -1201:0:4463 -1202:2:4111 -1203:2:4112 -1204:2:4116 -1205:2:4120 -1206:2:4121 -1207:2:4125 -1208:2:4133 -1209:2:4134 -1210:2:4138 -1211:2:4142 -1212:2:4143 -1213:2:4138 -1214:2:4142 -1215:2:4143 -1216:2:4147 -1217:2:4154 -1218:2:4161 -1219:2:4162 -1220:2:4169 -1221:2:4174 -1222:2:4181 -1223:2:4182 -1224:2:4181 -1225:2:4182 -1226:2:4189 -1227:2:4193 -1228:0:4463 -1229:2:3590 -1230:2:3591 -1231:0:4463 -1232:2:3128 -1233:0:4463 -1234:2:3592 -1235:2:3593 -1236:2:3597 -1237:2:3598 -1238:2:3606 -1239:2:3607 -1240:2:3611 -1241:2:3612 -1242:2:3620 -1243:2:3625 -1244:2:3629 -1245:2:3630 -1246:2:3638 -1247:2:3639 -1248:2:3643 -1249:2:3644 -1250:2:3638 -1251:2:3639 -1252:2:3643 -1253:2:3644 -1254:2:3652 -1255:2:3657 -1256:2:3658 -1257:2:3669 -1258:2:3670 -1259:2:3671 -1260:2:3682 -1261:2:3687 -1262:2:3688 -1263:2:3699 -1264:2:3700 -1265:2:3701 -1266:2:3699 -1267:2:3700 -1268:2:3701 -1269:2:3712 -1270:0:4463 -1271:2:3128 -1272:0:4463 -1273:2:3453 -1274:2:3454 -1275:2:3458 -1276:2:3459 -1277:2:3467 -1278:2:3468 -1279:2:3472 -1280:2:3473 -1281:2:3481 -1282:2:3486 -1283:2:3490 -1284:2:3491 -1285:2:3499 -1286:2:3500 -1287:2:3504 -1288:2:3505 -1289:2:3499 -1290:2:3500 -1291:2:3504 -1292:2:3505 -1293:2:3513 -1294:2:3518 -1295:2:3519 -1296:2:3530 -1297:2:3531 -1298:2:3532 -1299:2:3543 -1300:2:3548 -1301:2:3549 -1302:2:3560 -1303:2:3561 -1304:2:3562 -1305:2:3560 -1306:2:3561 -1307:2:3562 -1308:2:3573 -1309:2:3582 -1310:0:4463 -1311:2:3128 -1312:0:4463 -1313:2:3588 -1314:0:4463 -1315:2:4111 -1316:2:4112 -1317:2:4116 -1318:2:4120 -1319:2:4121 -1320:2:4125 -1321:2:4133 -1322:2:4134 -1323:2:4138 -1324:2:4142 -1325:2:4143 -1326:2:4138 -1327:2:4142 -1328:2:4143 -1329:2:4147 -1330:2:4154 -1331:2:4161 -1332:2:4162 -1333:2:4169 -1334:2:4174 -1335:2:4181 -1336:2:4182 -1337:2:4181 -1338:2:4182 -1339:2:4189 -1340:2:4193 -1341:0:4463 -1342:2:3590 -1343:2:3591 -1344:0:4463 -1345:2:3128 -1346:0:4463 -1347:2:3453 -1348:2:3454 -1349:2:3458 -1350:2:3459 -1351:2:3467 -1352:2:3468 -1353:2:3472 -1354:2:3473 -1355:2:3481 -1356:2:3486 -1357:2:3490 -1358:2:3491 -1359:2:3499 -1360:2:3500 -1361:2:3504 -1362:2:3505 -1363:2:3499 -1364:2:3500 -1365:2:3504 -1366:2:3505 -1367:2:3513 -1368:2:3518 -1369:2:3519 -1370:2:3530 -1371:2:3531 -1372:2:3532 -1373:2:3543 -1374:2:3548 -1375:2:3549 -1376:2:3560 -1377:2:3561 -1378:2:3562 -1379:2:3560 -1380:2:3561 -1381:2:3562 -1382:2:3573 -1383:2:3582 -1384:0:4463 -1385:2:3128 -1386:0:4463 -1387:2:3588 -1388:0:4463 -1389:2:4111 -1390:2:4112 -1391:2:4116 -1392:2:4120 -1393:2:4121 -1394:2:4125 -1395:2:4133 -1396:2:4134 -1397:2:4138 -1398:2:4142 -1399:2:4143 -1400:2:4138 -1401:2:4142 -1402:2:4143 -1403:2:4147 -1404:2:4154 -1405:2:4161 -1406:2:4162 -1407:2:4169 -1408:2:4174 -1409:2:4181 -1410:2:4182 -1411:2:4181 -1412:2:4182 -1413:2:4189 -1414:2:4193 -1415:0:4463 -1416:1:1291 -1417:1:1292 -1418:0:4461 -1419:1:11 -1420:0:4467 -1421:1:2299 diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_single_flip.define b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_single_flip.log b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_single_flip.log deleted file mode 100644 index 90b0d78..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_single_flip.log +++ /dev/null @@ -1,632 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_single_flip.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1295) -Depth= 5164 States= 1e+06 Transitions= 4.75e+08 Memory= 550.432 t= 582 R= 2e+03 -Depth= 5746 States= 2e+06 Transitions= 1.02e+09 Memory= 634.318 t= 1.27e+03 R= 2e+03 -pan: claim violated! (at depth 1144) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 5746, errors: 1 - 2322493 states, stored -1.1944827e+09 states, matched -1.1968052e+09 transitions (= stored+matched) -6.6651798e+09 atomic steps -hash conflicts: 7.6855101e+08 (resolved) - -Stats on memory usage (in Megabytes): - 256.929 equivalent memory usage for states (stored*(State-vector + overhead)) - 195.871 actual memory usage for states (compression: 76.24%) - state-vector as stored = 60 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 661.467 total actual memory usage - -unreached in proctype urcu_reader - line 411, "pan.___", state 17, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 49, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 63, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 82, "(1)" - line 438, "pan.___", state 112, "(1)" - line 442, "pan.___", state 125, "(1)" - line 597, "pan.___", state 146, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 411, "pan.___", state 153, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 185, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 199, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 218, "(1)" - line 438, "pan.___", state 248, "(1)" - line 442, "pan.___", state 261, "(1)" - line 411, "pan.___", state 282, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 314, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 328, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 347, "(1)" - line 438, "pan.___", state 377, "(1)" - line 442, "pan.___", state 390, "(1)" - line 411, "pan.___", state 413, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 415, "(1)" - line 411, "pan.___", state 416, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 416, "else" - line 411, "pan.___", state 419, "(1)" - line 415, "pan.___", state 427, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 429, "(1)" - line 415, "pan.___", state 430, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 430, "else" - line 415, "pan.___", state 433, "(1)" - line 415, "pan.___", state 434, "(1)" - line 415, "pan.___", state 434, "(1)" - line 413, "pan.___", state 439, "((i<1))" - line 413, "pan.___", state 439, "((i>=1))" - line 420, "pan.___", state 445, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 447, "(1)" - line 420, "pan.___", state 448, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 448, "else" - line 420, "pan.___", state 451, "(1)" - line 420, "pan.___", state 452, "(1)" - line 420, "pan.___", state 452, "(1)" - line 424, "pan.___", state 459, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 461, "(1)" - line 424, "pan.___", state 462, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 462, "else" - line 424, "pan.___", state 465, "(1)" - line 424, "pan.___", state 466, "(1)" - line 424, "pan.___", state 466, "(1)" - line 422, "pan.___", state 471, "((i<2))" - line 422, "pan.___", state 471, "((i>=2))" - line 429, "pan.___", state 478, "(1)" - line 429, "pan.___", state 479, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 479, "else" - line 429, "pan.___", state 482, "(1)" - line 429, "pan.___", state 483, "(1)" - line 429, "pan.___", state 483, "(1)" - line 433, "pan.___", state 491, "(1)" - line 433, "pan.___", state 492, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 492, "else" - line 433, "pan.___", state 495, "(1)" - line 433, "pan.___", state 496, "(1)" - line 433, "pan.___", state 496, "(1)" - line 431, "pan.___", state 501, "((i<1))" - line 431, "pan.___", state 501, "((i>=1))" - line 438, "pan.___", state 508, "(1)" - line 438, "pan.___", state 509, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 509, "else" - line 438, "pan.___", state 512, "(1)" - line 438, "pan.___", state 513, "(1)" - line 438, "pan.___", state 513, "(1)" - line 442, "pan.___", state 521, "(1)" - line 442, "pan.___", state 522, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 522, "else" - line 442, "pan.___", state 525, "(1)" - line 442, "pan.___", state 526, "(1)" - line 442, "pan.___", state 526, "(1)" - line 440, "pan.___", state 531, "((i<2))" - line 440, "pan.___", state 531, "((i>=2))" - line 450, "pan.___", state 535, "(1)" - line 450, "pan.___", state 535, "(1)" - line 597, "pan.___", state 538, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 597, "pan.___", state 539, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 597, "pan.___", state 540, "(1)" - line 272, "pan.___", state 544, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 555, "(1)" - line 280, "pan.___", state 566, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 575, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 591, "(1)" - line 253, "pan.___", state 599, "(1)" - line 257, "pan.___", state 611, "(1)" - line 261, "pan.___", state 619, "(1)" - line 411, "pan.___", state 637, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 651, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 669, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 683, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 702, "(1)" - line 433, "pan.___", state 715, "(1)" - line 438, "pan.___", state 732, "(1)" - line 442, "pan.___", state 745, "(1)" - line 411, "pan.___", state 773, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 805, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 819, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 838, "(1)" - line 438, "pan.___", state 868, "(1)" - line 442, "pan.___", state 881, "(1)" - line 411, "pan.___", state 902, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 904, "(1)" - line 411, "pan.___", state 905, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 905, "else" - line 411, "pan.___", state 908, "(1)" - line 415, "pan.___", state 916, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 918, "(1)" - line 415, "pan.___", state 919, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 919, "else" - line 415, "pan.___", state 922, "(1)" - line 415, "pan.___", state 923, "(1)" - line 415, "pan.___", state 923, "(1)" - line 413, "pan.___", state 928, "((i<1))" - line 413, "pan.___", state 928, "((i>=1))" - line 420, "pan.___", state 934, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 936, "(1)" - line 420, "pan.___", state 937, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 937, "else" - line 420, "pan.___", state 940, "(1)" - line 420, "pan.___", state 941, "(1)" - line 420, "pan.___", state 941, "(1)" - line 424, "pan.___", state 948, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 950, "(1)" - line 424, "pan.___", state 951, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 951, "else" - line 424, "pan.___", state 954, "(1)" - line 424, "pan.___", state 955, "(1)" - line 424, "pan.___", state 955, "(1)" - line 422, "pan.___", state 960, "((i<2))" - line 422, "pan.___", state 960, "((i>=2))" - line 429, "pan.___", state 967, "(1)" - line 429, "pan.___", state 968, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 968, "else" - line 429, "pan.___", state 971, "(1)" - line 429, "pan.___", state 972, "(1)" - line 429, "pan.___", state 972, "(1)" - line 433, "pan.___", state 980, "(1)" - line 433, "pan.___", state 981, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 981, "else" - line 433, "pan.___", state 984, "(1)" - line 433, "pan.___", state 985, "(1)" - line 433, "pan.___", state 985, "(1)" - line 431, "pan.___", state 990, "((i<1))" - line 431, "pan.___", state 990, "((i>=1))" - line 438, "pan.___", state 997, "(1)" - line 438, "pan.___", state 998, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 998, "else" - line 438, "pan.___", state 1001, "(1)" - line 438, "pan.___", state 1002, "(1)" - line 438, "pan.___", state 1002, "(1)" - line 442, "pan.___", state 1010, "(1)" - line 442, "pan.___", state 1011, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 1011, "else" - line 442, "pan.___", state 1014, "(1)" - line 442, "pan.___", state 1015, "(1)" - line 442, "pan.___", state 1015, "(1)" - line 440, "pan.___", state 1020, "((i<2))" - line 440, "pan.___", state 1020, "((i>=2))" - line 450, "pan.___", state 1024, "(1)" - line 450, "pan.___", state 1024, "(1)" - line 605, "pan.___", state 1028, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 411, "pan.___", state 1033, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1047, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1065, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1079, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1098, "(1)" - line 433, "pan.___", state 1111, "(1)" - line 438, "pan.___", state 1128, "(1)" - line 442, "pan.___", state 1141, "(1)" - line 411, "pan.___", state 1165, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1197, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1211, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1230, "(1)" - line 438, "pan.___", state 1260, "(1)" - line 442, "pan.___", state 1273, "(1)" - line 411, "pan.___", state 1298, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1330, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1344, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1363, "(1)" - line 438, "pan.___", state 1393, "(1)" - line 442, "pan.___", state 1406, "(1)" - line 411, "pan.___", state 1427, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1459, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1473, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1492, "(1)" - line 438, "pan.___", state 1522, "(1)" - line 442, "pan.___", state 1535, "(1)" - line 272, "pan.___", state 1558, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1580, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1589, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1605, "(1)" - line 253, "pan.___", state 1613, "(1)" - line 257, "pan.___", state 1625, "(1)" - line 261, "pan.___", state 1633, "(1)" - line 411, "pan.___", state 1651, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1665, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1683, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1697, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1716, "(1)" - line 433, "pan.___", state 1729, "(1)" - line 438, "pan.___", state 1746, "(1)" - line 442, "pan.___", state 1759, "(1)" - line 411, "pan.___", state 1780, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1794, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1812, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1826, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1845, "(1)" - line 433, "pan.___", state 1858, "(1)" - line 438, "pan.___", state 1875, "(1)" - line 442, "pan.___", state 1888, "(1)" - line 411, "pan.___", state 1912, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1944, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1958, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1977, "(1)" - line 438, "pan.___", state 2007, "(1)" - line 442, "pan.___", state 2020, "(1)" - line 644, "pan.___", state 2041, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 411, "pan.___", state 2048, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2080, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2094, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2113, "(1)" - line 438, "pan.___", state 2143, "(1)" - line 442, "pan.___", state 2156, "(1)" - line 411, "pan.___", state 2177, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2209, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2223, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2242, "(1)" - line 438, "pan.___", state 2272, "(1)" - line 442, "pan.___", state 2285, "(1)" - line 411, "pan.___", state 2308, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 2310, "(1)" - line 411, "pan.___", state 2311, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 2311, "else" - line 411, "pan.___", state 2314, "(1)" - line 415, "pan.___", state 2322, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2324, "(1)" - line 415, "pan.___", state 2325, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 2325, "else" - line 415, "pan.___", state 2328, "(1)" - line 415, "pan.___", state 2329, "(1)" - line 415, "pan.___", state 2329, "(1)" - line 413, "pan.___", state 2334, "((i<1))" - line 413, "pan.___", state 2334, "((i>=1))" - line 420, "pan.___", state 2340, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2342, "(1)" - line 420, "pan.___", state 2343, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 2343, "else" - line 420, "pan.___", state 2346, "(1)" - line 420, "pan.___", state 2347, "(1)" - line 420, "pan.___", state 2347, "(1)" - line 424, "pan.___", state 2354, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2356, "(1)" - line 424, "pan.___", state 2357, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 2357, "else" - line 424, "pan.___", state 2360, "(1)" - line 424, "pan.___", state 2361, "(1)" - line 424, "pan.___", state 2361, "(1)" - line 422, "pan.___", state 2366, "((i<2))" - line 422, "pan.___", state 2366, "((i>=2))" - line 429, "pan.___", state 2373, "(1)" - line 429, "pan.___", state 2374, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 2374, "else" - line 429, "pan.___", state 2377, "(1)" - line 429, "pan.___", state 2378, "(1)" - line 429, "pan.___", state 2378, "(1)" - line 433, "pan.___", state 2386, "(1)" - line 433, "pan.___", state 2387, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 2387, "else" - line 433, "pan.___", state 2390, "(1)" - line 433, "pan.___", state 2391, "(1)" - line 433, "pan.___", state 2391, "(1)" - line 431, "pan.___", state 2396, "((i<1))" - line 431, "pan.___", state 2396, "((i>=1))" - line 438, "pan.___", state 2403, "(1)" - line 438, "pan.___", state 2404, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 2404, "else" - line 438, "pan.___", state 2407, "(1)" - line 438, "pan.___", state 2408, "(1)" - line 438, "pan.___", state 2408, "(1)" - line 442, "pan.___", state 2416, "(1)" - line 442, "pan.___", state 2417, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 2417, "else" - line 442, "pan.___", state 2420, "(1)" - line 442, "pan.___", state 2421, "(1)" - line 442, "pan.___", state 2421, "(1)" - line 440, "pan.___", state 2426, "((i<2))" - line 440, "pan.___", state 2426, "((i>=2))" - line 450, "pan.___", state 2430, "(1)" - line 450, "pan.___", state 2430, "(1)" - line 644, "pan.___", state 2433, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 644, "pan.___", state 2434, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 644, "pan.___", state 2435, "(1)" - line 272, "pan.___", state 2439, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2461, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2470, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2486, "(1)" - line 253, "pan.___", state 2494, "(1)" - line 257, "pan.___", state 2506, "(1)" - line 261, "pan.___", state 2514, "(1)" - line 411, "pan.___", state 2532, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2546, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2564, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2578, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2597, "(1)" - line 433, "pan.___", state 2610, "(1)" - line 438, "pan.___", state 2627, "(1)" - line 442, "pan.___", state 2640, "(1)" - line 272, "pan.___", state 2664, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 2673, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2686, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2695, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2711, "(1)" - line 253, "pan.___", state 2719, "(1)" - line 257, "pan.___", state 2731, "(1)" - line 261, "pan.___", state 2739, "(1)" - line 411, "pan.___", state 2757, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2771, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2789, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2803, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2822, "(1)" - line 433, "pan.___", state 2835, "(1)" - line 438, "pan.___", state 2852, "(1)" - line 442, "pan.___", state 2865, "(1)" - line 411, "pan.___", state 2886, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2900, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2918, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2932, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2951, "(1)" - line 433, "pan.___", state 2964, "(1)" - line 438, "pan.___", state 2981, "(1)" - line 442, "pan.___", state 2994, "(1)" - line 249, "pan.___", state 3027, "(1)" - line 257, "pan.___", state 3047, "(1)" - line 261, "pan.___", state 3055, "(1)" - line 249, "pan.___", state 3070, "(1)" - line 253, "pan.___", state 3078, "(1)" - line 257, "pan.___", state 3090, "(1)" - line 261, "pan.___", state 3098, "(1)" - line 898, "pan.___", state 3115, "-end-" - (283 of 3115 states) -unreached in proctype urcu_writer - line 411, "pan.___", state 22, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 36, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 54, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 429, "pan.___", state 87, "(1)" - line 433, "pan.___", state 100, "(1)" - line 438, "pan.___", state 117, "(1)" - line 272, "pan.___", state 153, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 162, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 175, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 215, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 229, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 247, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 261, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 280, "(1)" - line 433, "pan.___", state 293, "(1)" - line 438, "pan.___", state 310, "(1)" - line 442, "pan.___", state 323, "(1)" - line 415, "pan.___", state 360, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 378, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 392, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 424, "(1)" - line 438, "pan.___", state 441, "(1)" - line 442, "pan.___", state 454, "(1)" - line 411, "pan.___", state 484, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 498, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 516, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 530, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 549, "(1)" - line 433, "pan.___", state 562, "(1)" - line 438, "pan.___", state 579, "(1)" - line 442, "pan.___", state 592, "(1)" - line 411, "pan.___", state 613, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 615, "(1)" - line 411, "pan.___", state 616, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 616, "else" - line 411, "pan.___", state 619, "(1)" - line 415, "pan.___", state 627, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 629, "(1)" - line 415, "pan.___", state 630, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 630, "else" - line 415, "pan.___", state 633, "(1)" - line 415, "pan.___", state 634, "(1)" - line 415, "pan.___", state 634, "(1)" - line 413, "pan.___", state 639, "((i<1))" - line 413, "pan.___", state 639, "((i>=1))" - line 420, "pan.___", state 645, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 647, "(1)" - line 420, "pan.___", state 648, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 648, "else" - line 420, "pan.___", state 651, "(1)" - line 420, "pan.___", state 652, "(1)" - line 420, "pan.___", state 652, "(1)" - line 424, "pan.___", state 659, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 661, "(1)" - line 424, "pan.___", state 662, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 662, "else" - line 424, "pan.___", state 665, "(1)" - line 424, "pan.___", state 666, "(1)" - line 424, "pan.___", state 666, "(1)" - line 422, "pan.___", state 671, "((i<2))" - line 422, "pan.___", state 671, "((i>=2))" - line 429, "pan.___", state 678, "(1)" - line 429, "pan.___", state 679, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 679, "else" - line 429, "pan.___", state 682, "(1)" - line 429, "pan.___", state 683, "(1)" - line 429, "pan.___", state 683, "(1)" - line 433, "pan.___", state 691, "(1)" - line 433, "pan.___", state 692, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 692, "else" - line 433, "pan.___", state 695, "(1)" - line 433, "pan.___", state 696, "(1)" - line 433, "pan.___", state 696, "(1)" - line 431, "pan.___", state 701, "((i<1))" - line 431, "pan.___", state 701, "((i>=1))" - line 438, "pan.___", state 708, "(1)" - line 438, "pan.___", state 709, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 709, "else" - line 438, "pan.___", state 712, "(1)" - line 438, "pan.___", state 713, "(1)" - line 438, "pan.___", state 713, "(1)" - line 442, "pan.___", state 721, "(1)" - line 442, "pan.___", state 722, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 722, "else" - line 442, "pan.___", state 725, "(1)" - line 442, "pan.___", state 726, "(1)" - line 442, "pan.___", state 726, "(1)" - line 440, "pan.___", state 731, "((i<2))" - line 440, "pan.___", state 731, "((i>=2))" - line 450, "pan.___", state 735, "(1)" - line 450, "pan.___", state 735, "(1)" - line 1117, "pan.___", state 739, "_proc_urcu_writer = (_proc_urcu_writer|(1<<10))" - line 411, "pan.___", state 744, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 746, "(1)" - line 411, "pan.___", state 747, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 747, "else" - line 411, "pan.___", state 750, "(1)" - line 415, "pan.___", state 758, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 760, "(1)" - line 415, "pan.___", state 761, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 761, "else" - line 415, "pan.___", state 764, "(1)" - line 415, "pan.___", state 765, "(1)" - line 415, "pan.___", state 765, "(1)" - line 413, "pan.___", state 770, "((i<1))" - line 413, "pan.___", state 770, "((i>=1))" - line 420, "pan.___", state 776, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 778, "(1)" - line 420, "pan.___", state 779, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 779, "else" - line 420, "pan.___", state 782, "(1)" - line 420, "pan.___", state 783, "(1)" - line 420, "pan.___", state 783, "(1)" - line 424, "pan.___", state 790, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 792, "(1)" - line 424, "pan.___", state 793, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 793, "else" - line 424, "pan.___", state 796, "(1)" - line 424, "pan.___", state 797, "(1)" - line 424, "pan.___", state 797, "(1)" - line 422, "pan.___", state 802, "((i<2))" - line 422, "pan.___", state 802, "((i>=2))" - line 429, "pan.___", state 809, "(1)" - line 429, "pan.___", state 810, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 810, "else" - line 429, "pan.___", state 813, "(1)" - line 429, "pan.___", state 814, "(1)" - line 429, "pan.___", state 814, "(1)" - line 433, "pan.___", state 822, "(1)" - line 433, "pan.___", state 823, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 823, "else" - line 433, "pan.___", state 826, "(1)" - line 433, "pan.___", state 827, "(1)" - line 433, "pan.___", state 827, "(1)" - line 431, "pan.___", state 832, "((i<1))" - line 431, "pan.___", state 832, "((i>=1))" - line 438, "pan.___", state 839, "(1)" - line 438, "pan.___", state 840, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 840, "else" - line 438, "pan.___", state 843, "(1)" - line 438, "pan.___", state 844, "(1)" - line 438, "pan.___", state 844, "(1)" - line 442, "pan.___", state 852, "(1)" - line 442, "pan.___", state 853, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 853, "else" - line 442, "pan.___", state 856, "(1)" - line 442, "pan.___", state 857, "(1)" - line 442, "pan.___", state 857, "(1)" - line 440, "pan.___", state 862, "((i<2))" - line 440, "pan.___", state 862, "((i>=2))" - line 450, "pan.___", state 866, "(1)" - line 450, "pan.___", state 866, "(1)" - line 1133, "pan.___", state 871, "_proc_urcu_writer = (_proc_urcu_writer|(1<<11))" - line 1128, "pan.___", state 872, "(((tmp2&((1<<7)-1))&&((tmp2^0)&(1<<7))))" - line 1128, "pan.___", state 872, "else" - line 1153, "pan.___", state 876, "_proc_urcu_writer = (_proc_urcu_writer&~(((1<<12)|(1<<11))))" - line 272, "pan.___", state 907, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 916, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 931, "(1)" - line 284, "pan.___", state 938, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 954, "(1)" - line 253, "pan.___", state 962, "(1)" - line 257, "pan.___", state 974, "(1)" - line 261, "pan.___", state 982, "(1)" - line 276, "pan.___", state 1007, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1020, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1029, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1045, "(1)" - line 253, "pan.___", state 1053, "(1)" - line 257, "pan.___", state 1065, "(1)" - line 261, "pan.___", state 1073, "(1)" - line 272, "pan.___", state 1089, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 1091, "(1)" - line 276, "pan.___", state 1098, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1100, "(1)" - line 276, "pan.___", state 1101, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 1101, "else" - line 274, "pan.___", state 1106, "((i<1))" - line 274, "pan.___", state 1106, "((i>=1))" - line 280, "pan.___", state 1111, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1113, "(1)" - line 280, "pan.___", state 1114, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 1114, "else" - line 284, "pan.___", state 1120, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1122, "(1)" - line 284, "pan.___", state 1123, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 1123, "else" - line 282, "pan.___", state 1128, "((i<2))" - line 282, "pan.___", state 1128, "((i>=2))" - line 249, "pan.___", state 1136, "(1)" - line 253, "pan.___", state 1144, "(1)" - line 253, "pan.___", state 1145, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 1145, "else" - line 251, "pan.___", state 1150, "((i<1))" - line 251, "pan.___", state 1150, "((i>=1))" - line 257, "pan.___", state 1156, "(1)" - line 257, "pan.___", state 1157, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 1157, "else" - line 261, "pan.___", state 1164, "(1)" - line 261, "pan.___", state 1165, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 1165, "else" - line 266, "pan.___", state 1174, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 1174, "else" - line 299, "pan.___", state 1176, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 1176, "else" - line 276, "pan.___", state 1189, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1202, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1211, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1227, "(1)" - line 253, "pan.___", state 1235, "(1)" - line 257, "pan.___", state 1247, "(1)" - line 261, "pan.___", state 1255, "(1)" - line 1237, "pan.___", state 1270, "-end-" - (161 of 1270 states) -unreached in proctype :init: - line 1248, "pan.___", state 9, "((j<2))" - line 1248, "pan.___", state 9, "((j>=2))" - line 1249, "pan.___", state 20, "((j<2))" - line 1249, "pan.___", state 20, "((j>=2))" - line 1254, "pan.___", state 33, "((j<2))" - line 1254, "pan.___", state 33, "((j>=2))" - line 1252, "pan.___", state 43, "((i<1))" - line 1252, "pan.___", state 43, "((i>=1))" - line 1262, "pan.___", state 54, "((j<2))" - line 1262, "pan.___", state 54, "((j>=2))" - line 1266, "pan.___", state 67, "((j<2))" - line 1266, "pan.___", state 67, "((j>=2))" - (6 of 78 states) -unreached in proctype :never: - line 1300, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 1.49e+03 seconds -pan: rate 1556.4638 states/second -pan: avg transition delay 1.2468e-06 usec -cp .input.spin urcu_free_single_flip.spin.input -cp .input.spin.trail urcu_free_single_flip.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_single_flip.spin.input b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_single_flip.spin.input deleted file mode 100644 index 38db318..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_single_flip.spin.input +++ /dev/null @@ -1,1273 +0,0 @@ -#define SINGLE_FLIP - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_single_flip.spin.input.trail b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_single_flip.spin.input.trail deleted file mode 100644 index fe03394..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_free_single_flip.spin.input.trail +++ /dev/null @@ -1,1147 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:4465 -2:3:4385 -3:3:4388 -4:3:4388 -5:3:4391 -6:3:4399 -7:3:4399 -8:3:4402 -9:3:4408 -10:3:4412 -11:3:4412 -12:3:4415 -13:3:4425 -14:3:4433 -15:3:4433 -16:3:4436 -17:3:4442 -18:3:4446 -19:3:4446 -20:3:4449 -21:3:4455 -22:3:4459 -23:3:4460 -24:0:4465 -25:3:4462 -26:0:4465 -27:2:3117 -28:0:4465 -29:2:3123 -30:0:4465 -31:2:3124 -32:0:4465 -33:2:3126 -34:0:4465 -35:2:3127 -36:0:4465 -37:2:3128 -38:0:4465 -39:2:3129 -40:0:4465 -41:2:3130 -42:0:4465 -43:2:3131 -44:0:4465 -45:2:3132 -46:2:3133 -47:2:3137 -48:2:3138 -49:2:3146 -50:2:3147 -51:2:3151 -52:2:3152 -53:2:3160 -54:2:3165 -55:2:3169 -56:2:3170 -57:2:3178 -58:2:3179 -59:2:3183 -60:2:3184 -61:2:3178 -62:2:3179 -63:2:3183 -64:2:3184 -65:2:3192 -66:2:3197 -67:2:3198 -68:2:3209 -69:2:3210 -70:2:3211 -71:2:3222 -72:2:3227 -73:2:3228 -74:2:3239 -75:2:3240 -76:2:3241 -77:2:3239 -78:2:3240 -79:2:3241 -80:2:3252 -81:2:3260 -82:0:4465 -83:2:3131 -84:0:4465 -85:2:3264 -86:2:3268 -87:2:3269 -88:2:3273 -89:2:3277 -90:2:3278 -91:2:3282 -92:2:3290 -93:2:3291 -94:2:3295 -95:2:3299 -96:2:3300 -97:2:3295 -98:2:3296 -99:2:3304 -100:0:4465 -101:2:3131 -102:0:4465 -103:2:3312 -104:2:3313 -105:2:3314 -106:0:4465 -107:2:3131 -108:0:4465 -109:2:3319 -110:0:4465 -111:2:4022 -112:2:4023 -113:2:4027 -114:2:4031 -115:2:4032 -116:2:4036 -117:2:4041 -118:2:4049 -119:2:4053 -120:2:4054 -121:2:4049 -122:2:4053 -123:2:4054 -124:2:4058 -125:2:4065 -126:2:4072 -127:2:4073 -128:2:4080 -129:2:4085 -130:2:4092 -131:2:4093 -132:2:4092 -133:2:4093 -134:2:4100 -135:2:4104 -136:0:4465 -137:2:3321 -138:2:4003 -139:0:4465 -140:2:3131 -141:0:4465 -142:2:3322 -143:0:4465 -144:2:3131 -145:0:4465 -146:2:3325 -147:2:3326 -148:2:3330 -149:2:3331 -150:2:3339 -151:2:3340 -152:2:3344 -153:2:3345 -154:2:3353 -155:2:3358 -156:2:3362 -157:2:3363 -158:2:3371 -159:2:3372 -160:2:3376 -161:2:3377 -162:2:3371 -163:2:3372 -164:2:3376 -165:2:3377 -166:2:3385 -167:2:3390 -168:2:3391 -169:2:3402 -170:2:3403 -171:2:3404 -172:2:3415 -173:2:3420 -174:2:3421 -175:2:3432 -176:2:3433 -177:2:3434 -178:2:3432 -179:2:3433 -180:2:3434 -181:2:3445 -182:2:3452 -183:0:4465 -184:2:3131 -185:0:4465 -186:2:3456 -187:2:3457 -188:2:3458 -189:2:3470 -190:2:3471 -191:2:3475 -192:2:3476 -193:2:3484 -194:2:3489 -195:2:3493 -196:2:3494 -197:2:3502 -198:2:3503 -199:2:3507 -200:2:3508 -201:2:3502 -202:2:3503 -203:2:3507 -204:2:3508 -205:2:3516 -206:2:3521 -207:2:3522 -208:2:3533 -209:2:3534 -210:2:3535 -211:2:3546 -212:2:3551 -213:2:3552 -214:2:3563 -215:2:3564 -216:2:3565 -217:2:3563 -218:2:3564 -219:2:3565 -220:2:3576 -221:2:3586 -222:2:3587 -223:0:4465 -224:2:3131 -225:0:4465 -226:2:3991 -227:0:4465 -228:2:4295 -229:2:4296 -230:2:4300 -231:2:4304 -232:2:4305 -233:2:4309 -234:2:4317 -235:2:4318 -236:2:4322 -237:2:4326 -238:2:4327 -239:2:4322 -240:2:4326 -241:2:4327 -242:2:4331 -243:2:4338 -244:2:4345 -245:2:4346 -246:2:4353 -247:2:4358 -248:2:4365 -249:2:4366 -250:2:4365 -251:2:4366 -252:2:4373 -253:2:4377 -254:0:4465 -255:2:3993 -256:2:4003 -257:0:4465 -258:2:3131 -259:0:4465 -260:2:3994 -261:2:3995 -262:0:4465 -263:2:3131 -264:0:4465 -265:2:3999 -266:0:4465 -267:2:4007 -268:0:4465 -269:2:3124 -270:0:4465 -271:2:3126 -272:0:4465 -273:2:3127 -274:0:4465 -275:2:3128 -276:0:4465 -277:2:3129 -278:0:4465 -279:2:3130 -280:0:4465 -281:2:3131 -282:0:4465 -283:2:3132 -284:2:3133 -285:2:3137 -286:2:3138 -287:2:3146 -288:2:3147 -289:2:3151 -290:2:3152 -291:2:3160 -292:2:3165 -293:2:3169 -294:2:3170 -295:2:3178 -296:2:3179 -297:2:3180 -298:2:3178 -299:2:3179 -300:2:3183 -301:2:3184 -302:2:3192 -303:2:3197 -304:2:3198 -305:2:3209 -306:2:3210 -307:2:3211 -308:2:3222 -309:2:3227 -310:2:3228 -311:2:3239 -312:2:3240 -313:2:3241 -314:2:3239 -315:2:3240 -316:2:3241 -317:2:3252 -318:2:3260 -319:0:4465 -320:2:3131 -321:0:4465 -322:2:3264 -323:2:3268 -324:2:3269 -325:2:3273 -326:2:3277 -327:2:3278 -328:2:3282 -329:2:3290 -330:2:3291 -331:2:3295 -332:2:3296 -333:2:3295 -334:2:3299 -335:2:3300 -336:2:3304 -337:0:4465 -338:2:3131 -339:0:4465 -340:2:3312 -341:2:3313 -342:2:3314 -343:0:4465 -344:2:3131 -345:0:4465 -346:2:3319 -347:0:4465 -348:1:2 -349:0:4465 -350:1:8 -351:0:4465 -352:1:9 -353:0:4465 -354:1:10 -355:0:4465 -356:1:11 -357:0:4465 -358:1:12 -359:1:13 -360:1:17 -361:1:18 -362:1:26 -363:1:27 -364:1:31 -365:1:32 -366:1:40 -367:1:45 -368:1:49 -369:1:50 -370:1:58 -371:1:59 -372:1:63 -373:1:64 -374:1:58 -375:1:59 -376:1:63 -377:1:64 -378:1:72 -379:1:84 -380:1:85 -381:1:89 -382:1:90 -383:1:91 -384:1:102 -385:1:107 -386:1:108 -387:1:119 -388:1:120 -389:1:121 -390:1:119 -391:1:120 -392:1:121 -393:1:132 -394:0:4465 -395:1:11 -396:0:4465 -397:1:141 -398:1:142 -399:0:4465 -400:1:11 -401:0:4465 -402:1:148 -403:1:149 -404:1:153 -405:1:154 -406:1:162 -407:1:163 -408:1:167 -409:1:168 -410:1:176 -411:1:181 -412:1:185 -413:1:186 -414:1:194 -415:1:195 -416:1:199 -417:1:200 -418:1:194 -419:1:195 -420:1:199 -421:1:200 -422:1:208 -423:1:220 -424:1:221 -425:1:225 -426:1:226 -427:1:227 -428:1:238 -429:1:243 -430:1:244 -431:1:255 -432:1:256 -433:1:257 -434:1:255 -435:1:256 -436:1:257 -437:1:268 -438:0:4465 -439:1:11 -440:0:4465 -441:1:277 -442:1:278 -443:1:282 -444:1:283 -445:1:291 -446:1:292 -447:1:296 -448:1:297 -449:1:305 -450:1:310 -451:1:314 -452:1:315 -453:1:323 -454:1:324 -455:1:328 -456:1:329 -457:1:323 -458:1:324 -459:1:328 -460:1:329 -461:1:337 -462:1:342 -463:1:343 -464:1:354 -465:1:355 -466:1:356 -467:1:367 -468:1:372 -469:1:373 -470:1:384 -471:1:385 -472:1:386 -473:1:384 -474:1:385 -475:1:386 -476:1:397 -477:1:404 -478:0:4465 -479:1:11 -480:0:4465 -481:1:540 -482:1:544 -483:1:545 -484:1:549 -485:1:550 -486:1:558 -487:1:566 -488:1:567 -489:1:571 -490:1:575 -491:1:576 -492:1:571 -493:1:575 -494:1:576 -495:1:580 -496:1:587 -497:1:594 -498:1:595 -499:1:602 -500:1:607 -501:1:614 -502:1:615 -503:1:614 -504:1:615 -505:1:622 -506:0:4465 -507:1:11 -508:0:4465 -509:2:4022 -510:2:4023 -511:2:4027 -512:2:4031 -513:2:4032 -514:2:4036 -515:2:4041 -516:2:4049 -517:2:4053 -518:2:4054 -519:2:4049 -520:2:4053 -521:2:4054 -522:2:4058 -523:2:4065 -524:2:4072 -525:2:4073 -526:2:4080 -527:2:4085 -528:2:4092 -529:2:4093 -530:2:4092 -531:2:4093 -532:2:4100 -533:2:4104 -534:0:4465 -535:2:3321 -536:2:4003 -537:0:4465 -538:2:3131 -539:0:4465 -540:2:3322 -541:0:4465 -542:2:3131 -543:0:4465 -544:2:3325 -545:2:3326 -546:2:3330 -547:2:3331 -548:2:3339 -549:2:3340 -550:2:3344 -551:2:3345 -552:2:3353 -553:2:3358 -554:2:3362 -555:2:3363 -556:2:3371 -557:2:3372 -558:2:3376 -559:2:3377 -560:2:3371 -561:2:3372 -562:2:3376 -563:2:3377 -564:2:3385 -565:2:3390 -566:2:3391 -567:2:3402 -568:2:3403 -569:2:3404 -570:2:3415 -571:2:3420 -572:2:3421 -573:2:3432 -574:2:3433 -575:2:3434 -576:2:3432 -577:2:3433 -578:2:3434 -579:2:3445 -580:2:3452 -581:0:4465 -582:2:3131 -583:0:4465 -584:2:3456 -585:2:3457 -586:2:3458 -587:2:3470 -588:2:3471 -589:2:3475 -590:2:3476 -591:2:3484 -592:2:3489 -593:2:3493 -594:2:3494 -595:2:3502 -596:2:3503 -597:2:3507 -598:2:3508 -599:2:3502 -600:2:3503 -601:2:3507 -602:2:3508 -603:2:3516 -604:2:3521 -605:2:3522 -606:2:3533 -607:2:3534 -608:2:3535 -609:2:3546 -610:2:3551 -611:2:3552 -612:2:3563 -613:2:3564 -614:2:3565 -615:2:3563 -616:2:3564 -617:2:3565 -618:2:3576 -619:2:3586 -620:2:3587 -621:0:4465 -622:2:3131 -623:0:4465 -624:2:3991 -625:0:4465 -626:2:4295 -627:2:4296 -628:2:4300 -629:2:4304 -630:2:4305 -631:2:4309 -632:2:4317 -633:2:4318 -634:2:4322 -635:2:4326 -636:2:4327 -637:2:4322 -638:2:4326 -639:2:4327 -640:2:4331 -641:2:4338 -642:2:4345 -643:2:4346 -644:2:4353 -645:2:4358 -646:2:4365 -647:2:4366 -648:2:4365 -649:2:4366 -650:2:4373 -651:2:4377 -652:0:4465 -653:2:3993 -654:2:4003 -655:0:4465 -656:2:3131 -657:0:4465 -658:2:3994 -659:2:3995 -660:0:4465 -661:2:3131 -662:0:4465 -663:2:3999 -664:0:4465 -665:2:4007 -666:0:4465 -667:2:3124 -668:0:4465 -669:2:3126 -670:0:4465 -671:2:3127 -672:0:4465 -673:2:3128 -674:0:4465 -675:2:3129 -676:0:4465 -677:2:3130 -678:0:4465 -679:2:3131 -680:0:4465 -681:2:3132 -682:2:3133 -683:2:3137 -684:2:3138 -685:2:3146 -686:2:3147 -687:2:3151 -688:2:3152 -689:2:3160 -690:2:3165 -691:2:3169 -692:2:3170 -693:2:3178 -694:2:3179 -695:2:3183 -696:2:3184 -697:2:3178 -698:2:3179 -699:2:3180 -700:2:3192 -701:2:3197 -702:2:3198 -703:2:3209 -704:2:3210 -705:2:3211 -706:2:3222 -707:2:3227 -708:2:3228 -709:2:3239 -710:2:3240 -711:2:3241 -712:2:3239 -713:2:3240 -714:2:3241 -715:2:3252 -716:2:3260 -717:0:4465 -718:2:3131 -719:0:4465 -720:1:632 -721:1:633 -722:1:637 -723:1:638 -724:1:646 -725:1:647 -726:1:651 -727:1:652 -728:1:660 -729:1:665 -730:1:669 -731:1:670 -732:1:678 -733:1:679 -734:1:683 -735:1:684 -736:1:678 -737:1:679 -738:1:683 -739:1:684 -740:1:692 -741:1:697 -742:1:698 -743:1:709 -744:1:710 -745:1:711 -746:1:722 -747:1:734 -748:1:735 -749:1:739 -750:1:740 -751:1:741 -752:1:739 -753:1:740 -754:1:741 -755:1:752 -756:0:4465 -757:1:11 -758:0:4465 -759:1:761 -760:1:764 -761:1:765 -762:0:4465 -763:1:11 -764:0:4465 -765:1:768 -766:1:769 -767:1:773 -768:1:774 -769:1:782 -770:1:783 -771:1:787 -772:1:788 -773:1:796 -774:1:801 -775:1:805 -776:1:806 -777:1:814 -778:1:815 -779:1:819 -780:1:820 -781:1:814 -782:1:815 -783:1:819 -784:1:820 -785:1:828 -786:1:833 -787:1:834 -788:1:845 -789:1:846 -790:1:847 -791:1:858 -792:1:870 -793:1:871 -794:1:875 -795:1:876 -796:1:877 -797:1:875 -798:1:876 -799:1:877 -800:1:888 -801:0:4465 -802:1:11 -803:0:4465 -804:1:1028 -805:1:1029 -806:1:1033 -807:1:1034 -808:1:1042 -809:1:1043 -810:1:1047 -811:1:1048 -812:1:1056 -813:1:1061 -814:1:1065 -815:1:1066 -816:1:1074 -817:1:1075 -818:1:1079 -819:1:1080 -820:1:1074 -821:1:1075 -822:1:1079 -823:1:1080 -824:1:1088 -825:1:1093 -826:1:1094 -827:1:1105 -828:1:1106 -829:1:1107 -830:1:1118 -831:1:1130 -832:1:1131 -833:1:1135 -834:1:1136 -835:1:1137 -836:1:1135 -837:1:1136 -838:1:1137 -839:1:1148 -840:1:1155 -841:1:1159 -842:0:4465 -843:1:11 -844:0:4465 -845:1:1160 -846:1:1161 -847:1:1165 -848:1:1166 -849:1:1174 -850:1:1175 -851:1:1176 -852:1:1188 -853:1:1193 -854:1:1197 -855:1:1198 -856:1:1206 -857:1:1207 -858:1:1211 -859:1:1212 -860:1:1206 -861:1:1207 -862:1:1211 -863:1:1212 -864:1:1220 -865:1:1225 -866:1:1226 -867:1:1237 -868:1:1238 -869:1:1239 -870:1:1250 -871:1:1262 -872:1:1263 -873:1:1267 -874:1:1268 -875:1:1269 -876:1:1267 -877:1:1268 -878:1:1269 -879:1:1280 -880:0:4465 -881:1:11 -882:0:4465 -883:1:1289 -884:0:4465 -885:1:3023 -886:1:3030 -887:1:3031 -888:1:3038 -889:1:3043 -890:1:3050 -891:1:3051 -892:1:3050 -893:1:3051 -894:1:3058 -895:1:3062 -896:0:4465 -897:2:3264 -898:2:3268 -899:2:3269 -900:2:3273 -901:2:3277 -902:2:3278 -903:2:3282 -904:2:3290 -905:2:3291 -906:2:3295 -907:2:3299 -908:2:3300 -909:2:3295 -910:2:3296 -911:2:3304 -912:0:4465 -913:2:3131 -914:0:4465 -915:2:3312 -916:2:3313 -917:2:3314 -918:0:4465 -919:2:3131 -920:0:4465 -921:2:3319 -922:0:4465 -923:2:4022 -924:2:4023 -925:2:4027 -926:2:4031 -927:2:4032 -928:2:4036 -929:2:4041 -930:2:4049 -931:2:4053 -932:2:4054 -933:2:4049 -934:2:4053 -935:2:4054 -936:2:4058 -937:2:4065 -938:2:4072 -939:2:4073 -940:2:4080 -941:2:4085 -942:2:4092 -943:2:4093 -944:2:4092 -945:2:4093 -946:2:4100 -947:2:4104 -948:0:4465 -949:2:3321 -950:2:4003 -951:0:4465 -952:2:3131 -953:0:4465 -954:2:3322 -955:0:4465 -956:2:3131 -957:0:4465 -958:2:3325 -959:2:3326 -960:2:3330 -961:2:3331 -962:2:3339 -963:2:3340 -964:2:3344 -965:2:3345 -966:2:3353 -967:2:3358 -968:2:3362 -969:2:3363 -970:2:3371 -971:2:3372 -972:2:3376 -973:2:3377 -974:2:3371 -975:2:3372 -976:2:3376 -977:2:3377 -978:2:3385 -979:2:3390 -980:2:3391 -981:2:3402 -982:2:3403 -983:2:3404 -984:2:3415 -985:2:3420 -986:2:3421 -987:2:3432 -988:2:3433 -989:2:3434 -990:2:3432 -991:2:3433 -992:2:3434 -993:2:3445 -994:2:3452 -995:0:4465 -996:2:3131 -997:0:4465 -998:2:3456 -999:2:3457 -1000:2:3458 -1001:2:3470 -1002:2:3471 -1003:2:3475 -1004:2:3476 -1005:2:3484 -1006:2:3489 -1007:2:3493 -1008:2:3494 -1009:2:3502 -1010:2:3503 -1011:2:3507 -1012:2:3508 -1013:2:3502 -1014:2:3503 -1015:2:3507 -1016:2:3508 -1017:2:3516 -1018:2:3521 -1019:2:3522 -1020:2:3533 -1021:2:3534 -1022:2:3535 -1023:2:3546 -1024:2:3551 -1025:2:3552 -1026:2:3563 -1027:2:3564 -1028:2:3565 -1029:2:3563 -1030:2:3564 -1031:2:3565 -1032:2:3576 -1033:2:3584 -1034:0:4465 -1035:2:3131 -1036:0:4465 -1037:2:3590 -1038:0:4465 -1039:2:4113 -1040:2:4114 -1041:2:4118 -1042:2:4122 -1043:2:4123 -1044:2:4127 -1045:2:4135 -1046:2:4136 -1047:2:4140 -1048:2:4144 -1049:2:4145 -1050:2:4140 -1051:2:4144 -1052:2:4145 -1053:2:4149 -1054:2:4156 -1055:2:4163 -1056:2:4164 -1057:2:4171 -1058:2:4176 -1059:2:4183 -1060:2:4184 -1061:2:4183 -1062:2:4184 -1063:2:4191 -1064:2:4195 -1065:0:4465 -1066:2:3592 -1067:2:3593 -1068:0:4465 -1069:2:3131 -1070:0:4465 -1071:2:3456 -1072:2:3457 -1073:2:3461 -1074:2:3462 -1075:2:3470 -1076:2:3471 -1077:2:3475 -1078:2:3476 -1079:2:3484 -1080:2:3489 -1081:2:3493 -1082:2:3494 -1083:2:3502 -1084:2:3503 -1085:2:3507 -1086:2:3508 -1087:2:3502 -1088:2:3503 -1089:2:3507 -1090:2:3508 -1091:2:3516 -1092:2:3521 -1093:2:3522 -1094:2:3533 -1095:2:3534 -1096:2:3535 -1097:2:3546 -1098:2:3551 -1099:2:3552 -1100:2:3563 -1101:2:3564 -1102:2:3565 -1103:2:3563 -1104:2:3564 -1105:2:3565 -1106:2:3576 -1107:2:3584 -1108:0:4465 -1109:2:3131 -1110:0:4465 -1111:2:3590 -1112:0:4465 -1113:2:4113 -1114:2:4114 -1115:2:4118 -1116:2:4122 -1117:2:4123 -1118:2:4127 -1119:2:4135 -1120:2:4136 -1121:2:4140 -1122:2:4144 -1123:2:4145 -1124:2:4140 -1125:2:4144 -1126:2:4145 -1127:2:4149 -1128:2:4156 -1129:2:4163 -1130:2:4164 -1131:2:4171 -1132:2:4176 -1133:2:4183 -1134:2:4184 -1135:2:4183 -1136:2:4184 -1137:2:4191 -1138:2:4195 -1139:0:4465 -1140:1:1291 -1141:1:1292 -1142:0:4463 -1143:1:11 -1144:0:4469 -1145:2:3684 diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress.ltl b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_reader.define b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_reader.log b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_reader.log deleted file mode 100644 index f854122..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_reader.log +++ /dev/null @@ -1,512 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_reader.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1295) -depth 23: Claim reached state 9 (line 1300) -depth 1143: Claim reached state 9 (line 1299) -Depth= 6515 States= 1e+06 Transitions= 5.44e+08 Memory= 507.561 t= 715 R= 1e+03 -Depth= 6515 States= 2e+06 Transitions= 1.44e+09 Memory= 545.940 t= 1.93e+03 R= 1e+03 -Depth= 6515 States= 3e+06 Transitions= 2.29e+09 Memory= 584.416 t= 3.08e+03 R= 1e+03 -pan: resizing hashtable to -w22.. done -Depth= 6515 States= 4e+06 Transitions= 3.07e+09 Memory= 646.299 t= 4.13e+03 R= 1e+03 -Depth= 6515 States= 5e+06 Transitions= 3.84e+09 Memory= 681.065 t= 5.17e+03 R= 1e+03 -Depth= 6515 States= 6e+06 Transitions= 4.91e+09 Memory= 728.916 t= 6.63e+03 R= 9e+02 -Depth= 6515 States= 7e+06 Transitions= 5.88e+09 Memory= 767.393 t= 7.96e+03 R= 9e+02 -Depth= 6515 States= 8e+06 Transitions= 6.76e+09 Memory= 808.018 t= 9.16e+03 R= 9e+02 -Depth= 6515 States= 9e+06 Transitions= 7.69e+09 Memory= 846.885 t= 1.04e+04 R= 9e+02 -pan: resizing hashtable to -w24.. done -Depth= 6515 States= 1e+07 Transitions= 8.63e+09 Memory= 1015.705 t= 1.17e+04 R= 9e+02 -Depth= 6515 States= 1.1e+07 Transitions= 9.44e+09 Memory= 1054.572 t= 1.28e+04 R= 9e+02 -Depth= 6515 States= 1.2e+07 Transitions= 1.02e+10 Memory= 1095.490 t= 1.39e+04 R= 9e+02 -Depth= 6515 States= 1.3e+07 Transitions= 1.11e+10 Memory= 1129.182 t= 1.51e+04 R= 9e+02 -Depth= 6515 States= 1.4e+07 Transitions= 1.22e+10 Memory= 1173.518 t= 1.65e+04 R= 8e+02 -Depth= 6515 States= 1.5e+07 Transitions= 1.3e+10 Memory= 1207.893 t= 1.76e+04 R= 9e+02 -Depth= 6515 States= 1.6e+07 Transitions= 1.38e+10 Memory= 1234.065 t= 1.86e+04 R= 9e+02 -Depth= 6515 States= 1.7e+07 Transitions= 1.47e+10 Memory= 1277.424 t= 1.99e+04 R= 9e+02 -Depth= 6515 States= 1.8e+07 Transitions= 1.58e+10 Memory= 1325.568 t= 2.13e+04 R= 8e+02 -Depth= 6515 States= 1.9e+07 Transitions= 1.67e+10 Memory= 1366.486 t= 2.26e+04 R= 8e+02 -Depth= 6515 States= 2e+07 Transitions= 1.76e+10 Memory= 1405.940 t= 2.38e+04 R= 8e+02 -Depth= 6515 States= 2.1e+07 Transitions= 1.85e+10 Memory= 1450.080 t= 2.51e+04 R= 8e+02 -Depth= 6515 States= 2.2e+07 Transitions= 1.94e+10 Memory= 1491.291 t= 2.63e+04 R= 8e+02 -Depth= 6515 States= 2.3e+07 Transitions= 2.02e+10 Memory= 1530.744 t= 2.74e+04 R= 8e+02 -Depth= 6515 States= 2.4e+07 Transitions= 2.12e+10 Memory= 1565.217 t= 2.87e+04 R= 8e+02 -Depth= 6515 States= 2.5e+07 Transitions= 2.22e+10 Memory= 1608.479 t= 3e+04 R= 8e+02 -Depth= 6515 States= 2.6e+07 Transitions= 2.3e+10 Memory= 1634.651 t= 3.11e+04 R= 8e+02 -Depth= 6515 States= 2.7e+07 Transitions= 2.4e+10 Memory= 1685.725 t= 3.25e+04 R= 8e+02 -Depth= 6515 States= 2.8e+07 Transitions= 2.49e+10 Memory= 1724.885 t= 3.37e+04 R= 8e+02 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 6515, errors: 0 - 13561338 states, stored (2.88138e+07 visited) -2.5567499e+10 states, matched -2.5596313e+10 transitions (= visited+matched) -1.4615258e+11 atomic steps -hash conflicts: 8.6536644e+09 (resolved) - -Stats on memory usage (in Megabytes): - 1500.240 equivalent memory usage for states (stored*(State-vector + overhead)) - 1175.180 actual memory usage for states (compression: 78.33%) - state-vector as stored = 63 byte + 28 byte overhead - 128.000 memory used for hash table (-w24) - 457.764 memory used for DFS stack (-m10000000) - 1760.236 total actual memory usage - -unreached in proctype urcu_reader - line 411, "pan.___", state 17, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 49, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 63, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 82, "(1)" - line 438, "pan.___", state 112, "(1)" - line 442, "pan.___", state 125, "(1)" - line 597, "pan.___", state 146, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 411, "pan.___", state 153, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 185, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 199, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 218, "(1)" - line 438, "pan.___", state 248, "(1)" - line 442, "pan.___", state 261, "(1)" - line 411, "pan.___", state 282, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 314, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 328, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 347, "(1)" - line 438, "pan.___", state 377, "(1)" - line 442, "pan.___", state 390, "(1)" - line 411, "pan.___", state 413, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 415, "(1)" - line 411, "pan.___", state 416, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 416, "else" - line 411, "pan.___", state 419, "(1)" - line 415, "pan.___", state 427, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 429, "(1)" - line 415, "pan.___", state 430, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 430, "else" - line 415, "pan.___", state 433, "(1)" - line 415, "pan.___", state 434, "(1)" - line 415, "pan.___", state 434, "(1)" - line 413, "pan.___", state 439, "((i<1))" - line 413, "pan.___", state 439, "((i>=1))" - line 420, "pan.___", state 445, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 447, "(1)" - line 420, "pan.___", state 448, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 448, "else" - line 420, "pan.___", state 451, "(1)" - line 420, "pan.___", state 452, "(1)" - line 420, "pan.___", state 452, "(1)" - line 424, "pan.___", state 459, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 461, "(1)" - line 424, "pan.___", state 462, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 462, "else" - line 424, "pan.___", state 465, "(1)" - line 424, "pan.___", state 466, "(1)" - line 424, "pan.___", state 466, "(1)" - line 422, "pan.___", state 471, "((i<2))" - line 422, "pan.___", state 471, "((i>=2))" - line 429, "pan.___", state 478, "(1)" - line 429, "pan.___", state 479, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 479, "else" - line 429, "pan.___", state 482, "(1)" - line 429, "pan.___", state 483, "(1)" - line 429, "pan.___", state 483, "(1)" - line 433, "pan.___", state 491, "(1)" - line 433, "pan.___", state 492, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 492, "else" - line 433, "pan.___", state 495, "(1)" - line 433, "pan.___", state 496, "(1)" - line 433, "pan.___", state 496, "(1)" - line 431, "pan.___", state 501, "((i<1))" - line 431, "pan.___", state 501, "((i>=1))" - line 438, "pan.___", state 508, "(1)" - line 438, "pan.___", state 509, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 509, "else" - line 438, "pan.___", state 512, "(1)" - line 438, "pan.___", state 513, "(1)" - line 438, "pan.___", state 513, "(1)" - line 442, "pan.___", state 521, "(1)" - line 442, "pan.___", state 522, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 522, "else" - line 442, "pan.___", state 525, "(1)" - line 442, "pan.___", state 526, "(1)" - line 442, "pan.___", state 526, "(1)" - line 440, "pan.___", state 531, "((i<2))" - line 440, "pan.___", state 531, "((i>=2))" - line 450, "pan.___", state 535, "(1)" - line 450, "pan.___", state 535, "(1)" - line 597, "pan.___", state 538, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 597, "pan.___", state 539, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 597, "pan.___", state 540, "(1)" - line 272, "pan.___", state 544, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 555, "(1)" - line 280, "pan.___", state 566, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 575, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 591, "(1)" - line 253, "pan.___", state 599, "(1)" - line 257, "pan.___", state 611, "(1)" - line 261, "pan.___", state 619, "(1)" - line 411, "pan.___", state 637, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 651, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 669, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 683, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 702, "(1)" - line 433, "pan.___", state 715, "(1)" - line 438, "pan.___", state 732, "(1)" - line 442, "pan.___", state 745, "(1)" - line 411, "pan.___", state 773, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 805, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 819, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 838, "(1)" - line 438, "pan.___", state 868, "(1)" - line 442, "pan.___", state 881, "(1)" - line 411, "pan.___", state 902, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 904, "(1)" - line 411, "pan.___", state 905, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 905, "else" - line 411, "pan.___", state 908, "(1)" - line 415, "pan.___", state 916, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 918, "(1)" - line 415, "pan.___", state 919, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 919, "else" - line 415, "pan.___", state 922, "(1)" - line 415, "pan.___", state 923, "(1)" - line 415, "pan.___", state 923, "(1)" - line 413, "pan.___", state 928, "((i<1))" - line 413, "pan.___", state 928, "((i>=1))" - line 420, "pan.___", state 934, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 936, "(1)" - line 420, "pan.___", state 937, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 937, "else" - line 420, "pan.___", state 940, "(1)" - line 420, "pan.___", state 941, "(1)" - line 420, "pan.___", state 941, "(1)" - line 424, "pan.___", state 948, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 950, "(1)" - line 424, "pan.___", state 951, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 951, "else" - line 424, "pan.___", state 954, "(1)" - line 424, "pan.___", state 955, "(1)" - line 424, "pan.___", state 955, "(1)" - line 422, "pan.___", state 960, "((i<2))" - line 422, "pan.___", state 960, "((i>=2))" - line 429, "pan.___", state 967, "(1)" - line 429, "pan.___", state 968, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 968, "else" - line 429, "pan.___", state 971, "(1)" - line 429, "pan.___", state 972, "(1)" - line 429, "pan.___", state 972, "(1)" - line 433, "pan.___", state 980, "(1)" - line 433, "pan.___", state 981, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 981, "else" - line 433, "pan.___", state 984, "(1)" - line 433, "pan.___", state 985, "(1)" - line 433, "pan.___", state 985, "(1)" - line 431, "pan.___", state 990, "((i<1))" - line 431, "pan.___", state 990, "((i>=1))" - line 438, "pan.___", state 997, "(1)" - line 438, "pan.___", state 998, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 998, "else" - line 438, "pan.___", state 1001, "(1)" - line 438, "pan.___", state 1002, "(1)" - line 438, "pan.___", state 1002, "(1)" - line 442, "pan.___", state 1010, "(1)" - line 442, "pan.___", state 1011, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 1011, "else" - line 442, "pan.___", state 1014, "(1)" - line 442, "pan.___", state 1015, "(1)" - line 442, "pan.___", state 1015, "(1)" - line 440, "pan.___", state 1020, "((i<2))" - line 440, "pan.___", state 1020, "((i>=2))" - line 450, "pan.___", state 1024, "(1)" - line 450, "pan.___", state 1024, "(1)" - line 605, "pan.___", state 1028, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 411, "pan.___", state 1033, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1047, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1065, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1079, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1098, "(1)" - line 433, "pan.___", state 1111, "(1)" - line 438, "pan.___", state 1128, "(1)" - line 442, "pan.___", state 1141, "(1)" - line 411, "pan.___", state 1165, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1197, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1211, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1230, "(1)" - line 438, "pan.___", state 1260, "(1)" - line 442, "pan.___", state 1273, "(1)" - line 411, "pan.___", state 1298, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1330, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1344, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1363, "(1)" - line 438, "pan.___", state 1393, "(1)" - line 442, "pan.___", state 1406, "(1)" - line 411, "pan.___", state 1427, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1459, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1473, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1492, "(1)" - line 438, "pan.___", state 1522, "(1)" - line 442, "pan.___", state 1535, "(1)" - line 272, "pan.___", state 1558, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1580, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1589, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1605, "(1)" - line 253, "pan.___", state 1613, "(1)" - line 257, "pan.___", state 1625, "(1)" - line 261, "pan.___", state 1633, "(1)" - line 411, "pan.___", state 1651, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1665, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1683, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1697, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1716, "(1)" - line 433, "pan.___", state 1729, "(1)" - line 438, "pan.___", state 1746, "(1)" - line 442, "pan.___", state 1759, "(1)" - line 411, "pan.___", state 1780, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1794, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1812, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1826, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1845, "(1)" - line 433, "pan.___", state 1858, "(1)" - line 438, "pan.___", state 1875, "(1)" - line 442, "pan.___", state 1888, "(1)" - line 411, "pan.___", state 1912, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1944, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1958, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1977, "(1)" - line 438, "pan.___", state 2007, "(1)" - line 442, "pan.___", state 2020, "(1)" - line 644, "pan.___", state 2041, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 411, "pan.___", state 2048, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2080, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2094, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2113, "(1)" - line 438, "pan.___", state 2143, "(1)" - line 442, "pan.___", state 2156, "(1)" - line 411, "pan.___", state 2177, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2209, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2223, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2242, "(1)" - line 438, "pan.___", state 2272, "(1)" - line 442, "pan.___", state 2285, "(1)" - line 411, "pan.___", state 2308, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 2310, "(1)" - line 411, "pan.___", state 2311, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 2311, "else" - line 411, "pan.___", state 2314, "(1)" - line 415, "pan.___", state 2322, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2324, "(1)" - line 415, "pan.___", state 2325, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 2325, "else" - line 415, "pan.___", state 2328, "(1)" - line 415, "pan.___", state 2329, "(1)" - line 415, "pan.___", state 2329, "(1)" - line 413, "pan.___", state 2334, "((i<1))" - line 413, "pan.___", state 2334, "((i>=1))" - line 420, "pan.___", state 2340, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2342, "(1)" - line 420, "pan.___", state 2343, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 2343, "else" - line 420, "pan.___", state 2346, "(1)" - line 420, "pan.___", state 2347, "(1)" - line 420, "pan.___", state 2347, "(1)" - line 424, "pan.___", state 2354, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2356, "(1)" - line 424, "pan.___", state 2357, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 2357, "else" - line 424, "pan.___", state 2360, "(1)" - line 424, "pan.___", state 2361, "(1)" - line 424, "pan.___", state 2361, "(1)" - line 422, "pan.___", state 2366, "((i<2))" - line 422, "pan.___", state 2366, "((i>=2))" - line 429, "pan.___", state 2373, "(1)" - line 429, "pan.___", state 2374, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 2374, "else" - line 429, "pan.___", state 2377, "(1)" - line 429, "pan.___", state 2378, "(1)" - line 429, "pan.___", state 2378, "(1)" - line 433, "pan.___", state 2386, "(1)" - line 433, "pan.___", state 2387, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 2387, "else" - line 433, "pan.___", state 2390, "(1)" - line 433, "pan.___", state 2391, "(1)" - line 433, "pan.___", state 2391, "(1)" - line 431, "pan.___", state 2396, "((i<1))" - line 431, "pan.___", state 2396, "((i>=1))" - line 438, "pan.___", state 2403, "(1)" - line 438, "pan.___", state 2404, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 2404, "else" - line 438, "pan.___", state 2407, "(1)" - line 438, "pan.___", state 2408, "(1)" - line 438, "pan.___", state 2408, "(1)" - line 442, "pan.___", state 2416, "(1)" - line 442, "pan.___", state 2417, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 2417, "else" - line 442, "pan.___", state 2420, "(1)" - line 442, "pan.___", state 2421, "(1)" - line 442, "pan.___", state 2421, "(1)" - line 440, "pan.___", state 2426, "((i<2))" - line 440, "pan.___", state 2426, "((i>=2))" - line 450, "pan.___", state 2430, "(1)" - line 450, "pan.___", state 2430, "(1)" - line 644, "pan.___", state 2433, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 644, "pan.___", state 2434, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 644, "pan.___", state 2435, "(1)" - line 272, "pan.___", state 2439, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2461, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2470, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2486, "(1)" - line 253, "pan.___", state 2494, "(1)" - line 257, "pan.___", state 2506, "(1)" - line 261, "pan.___", state 2514, "(1)" - line 411, "pan.___", state 2532, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2546, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2564, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2578, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2597, "(1)" - line 433, "pan.___", state 2610, "(1)" - line 438, "pan.___", state 2627, "(1)" - line 442, "pan.___", state 2640, "(1)" - line 272, "pan.___", state 2664, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 2673, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2686, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2695, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2711, "(1)" - line 253, "pan.___", state 2719, "(1)" - line 257, "pan.___", state 2731, "(1)" - line 261, "pan.___", state 2739, "(1)" - line 411, "pan.___", state 2757, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2771, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2789, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2803, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2822, "(1)" - line 433, "pan.___", state 2835, "(1)" - line 438, "pan.___", state 2852, "(1)" - line 442, "pan.___", state 2865, "(1)" - line 411, "pan.___", state 2886, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2900, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2918, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2932, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2951, "(1)" - line 433, "pan.___", state 2964, "(1)" - line 438, "pan.___", state 2981, "(1)" - line 442, "pan.___", state 2994, "(1)" - line 249, "pan.___", state 3027, "(1)" - line 257, "pan.___", state 3047, "(1)" - line 261, "pan.___", state 3055, "(1)" - line 249, "pan.___", state 3070, "(1)" - line 253, "pan.___", state 3078, "(1)" - line 257, "pan.___", state 3090, "(1)" - line 261, "pan.___", state 3098, "(1)" - line 898, "pan.___", state 3115, "-end-" - (283 of 3115 states) -unreached in proctype urcu_writer - line 411, "pan.___", state 18, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 32, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 50, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 429, "pan.___", state 83, "(1)" - line 433, "pan.___", state 96, "(1)" - line 438, "pan.___", state 113, "(1)" - line 272, "pan.___", state 149, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 158, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 171, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 225, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 243, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 257, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 276, "(1)" - line 433, "pan.___", state 289, "(1)" - line 438, "pan.___", state 306, "(1)" - line 442, "pan.___", state 319, "(1)" - line 415, "pan.___", state 356, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 374, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 388, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 420, "(1)" - line 438, "pan.___", state 437, "(1)" - line 442, "pan.___", state 450, "(1)" - line 415, "pan.___", state 495, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 513, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 527, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 559, "(1)" - line 438, "pan.___", state 576, "(1)" - line 442, "pan.___", state 589, "(1)" - line 415, "pan.___", state 624, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 642, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 656, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 688, "(1)" - line 438, "pan.___", state 705, "(1)" - line 442, "pan.___", state 718, "(1)" - line 415, "pan.___", state 755, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 773, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 787, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 819, "(1)" - line 438, "pan.___", state 836, "(1)" - line 442, "pan.___", state 849, "(1)" - line 272, "pan.___", state 899, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 908, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 921, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 249, "pan.___", state 946, "(1)" - line 253, "pan.___", state 954, "(1)" - line 257, "pan.___", state 966, "(1)" - line 261, "pan.___", state 974, "(1)" - line 272, "pan.___", state 994, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1003, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1018, "(1)" - line 284, "pan.___", state 1025, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1041, "(1)" - line 253, "pan.___", state 1049, "(1)" - line 257, "pan.___", state 1061, "(1)" - line 261, "pan.___", state 1069, "(1)" - line 276, "pan.___", state 1094, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1107, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1116, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1132, "(1)" - line 253, "pan.___", state 1140, "(1)" - line 257, "pan.___", state 1152, "(1)" - line 261, "pan.___", state 1160, "(1)" - line 276, "pan.___", state 1185, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1198, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1207, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1223, "(1)" - line 253, "pan.___", state 1231, "(1)" - line 257, "pan.___", state 1243, "(1)" - line 261, "pan.___", state 1251, "(1)" - line 276, "pan.___", state 1276, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1289, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1298, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1314, "(1)" - line 253, "pan.___", state 1322, "(1)" - line 257, "pan.___", state 1334, "(1)" - line 261, "pan.___", state 1342, "(1)" - line 1237, "pan.___", state 1357, "-end-" - (78 of 1357 states) -unreached in proctype :init: - (0 of 78 states) -unreached in proctype :never: - line 1302, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 3.47e+04 seconds -pan: rate 831.51243 states/second -pan: avg transition delay 1.3538e-06 usec -cp .input.spin urcu_progress_reader.spin.input -cp .input.spin.trail urcu_progress_reader.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_reader.spin.input b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_reader.spin.input deleted file mode 100644 index da34f03..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_reader.spin.input +++ /dev/null @@ -1,1273 +0,0 @@ -#define READER_PROGRESS - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer.define b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer.log b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer.log deleted file mode 100644 index 9bc0ba8..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer.log +++ /dev/null @@ -1,505 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1295) -depth 23: Claim reached state 9 (line 1300) -depth 1559: Claim reached state 9 (line 1299) -Depth= 4420 States= 1e+06 Transitions= 6.06e+08 Memory= 491.936 t= 782 R= 1e+03 -Depth= 4420 States= 2e+06 Transitions= 1.36e+09 Memory= 516.838 t= 1.76e+03 R= 1e+03 -Depth= 4477 States= 3e+06 Transitions= 1.91e+09 Memory= 542.424 t= 2.47e+03 R= 1e+03 -pan: resizing hashtable to -w22.. done -Depth= 4770 States= 4e+06 Transitions= 2.71e+09 Memory= 598.545 t= 3.51e+03 R= 1e+03 -Depth= 4829 States= 5e+06 Transitions= 3.25e+09 Memory= 623.838 t= 4.2e+03 R= 1e+03 -Depth= 5120 States= 6e+06 Transitions= 4.02e+09 Memory= 648.838 t= 5.19e+03 R= 1e+03 -Depth= 5188 States= 7e+06 Transitions= 4.89e+09 Memory= 693.662 t= 6.32e+03 R= 1e+03 -Depth= 5188 States= 8e+06 Transitions= 5.86e+09 Memory= 742.588 t= 7.58e+03 R= 1e+03 -Depth= 5188 States= 9e+06 Transitions= 6.88e+09 Memory= 781.651 t= 8.92e+03 R= 1e+03 -pan: resizing hashtable to -w24.. done -Depth= 5188 States= 1e+07 Transitions= 7.86e+09 Memory= 952.229 t= 1.02e+04 R= 1e+03 -Depth= 5188 States= 1.1e+07 Transitions= 8.82e+09 Memory= 991.096 t= 1.15e+04 R= 1e+03 -Depth= 5436 States= 1.2e+07 Transitions= 9.74e+09 Memory= 1031.037 t= 1.27e+04 R= 9e+02 -Depth= 5479 States= 1.3e+07 Transitions= 1.07e+10 Memory= 1074.006 t= 1.4e+04 R= 9e+02 -Depth= 5479 States= 1.4e+07 Transitions= 1.16e+10 Memory= 1117.658 t= 1.52e+04 R= 9e+02 -Depth= 5479 States= 1.5e+07 Transitions= 1.25e+10 Memory= 1160.529 t= 1.63e+04 R= 9e+02 -Depth= 5479 States= 1.6e+07 Transitions= 1.36e+10 Memory= 1208.772 t= 1.77e+04 R= 9e+02 -Depth= 5479 States= 1.7e+07 Transitions= 1.45e+10 Memory= 1253.401 t= 1.88e+04 R= 9e+02 -Depth= 5479 States= 1.8e+07 Transitions= 1.54e+10 Memory= 1278.986 t= 2.01e+04 R= 9e+02 -Depth= 5479 States= 1.9e+07 Transitions= 1.64e+10 Memory= 1333.186 t= 2.14e+04 R= 9e+02 -Depth= 5479 States= 2e+07 Transitions= 1.73e+10 Memory= 1370.979 t= 2.26e+04 R= 9e+02 -Depth= 5479 States= 2.1e+07 Transitions= 1.83e+10 Memory= 1415.998 t= 2.39e+04 R= 9e+02 -Depth= 5479 States= 2.2e+07 Transitions= 1.92e+10 Memory= 1455.940 t= 2.51e+04 R= 9e+02 -Depth= 5479 States= 2.3e+07 Transitions= 2.02e+10 Memory= 1499.397 t= 2.63e+04 R= 9e+02 -Depth= 5479 States= 2.4e+07 Transitions= 2.1e+10 Memory= 1542.951 t= 2.75e+04 R= 9e+02 -Depth= 5588 States= 2.5e+07 Transitions= 2.21e+10 Memory= 1589.533 t= 2.89e+04 R= 9e+02 -Depth= 5588 States= 2.6e+07 Transitions= 2.31e+10 Memory= 1630.647 t= 3.02e+04 R= 9e+02 -Depth= 5588 States= 2.7e+07 Transitions= 2.4e+10 Memory= 1669.123 t= 3.14e+04 R= 9e+02 -Depth= 5588 States= 2.8e+07 Transitions= 2.5e+10 Memory= 1714.533 t= 3.27e+04 R= 9e+02 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 5588, errors: 0 - 13563866 states, stored (2.88596e+07 visited) -2.5765769e+10 states, matched -2.5794629e+10 transitions (= visited+matched) -1.4717516e+11 atomic steps -hash conflicts: 6.8547236e+09 (resolved) - -Stats on memory usage (in Megabytes): - 1500.519 equivalent memory usage for states (stored*(State-vector + overhead)) - 1175.436 actual memory usage for states (compression: 78.34%) - state-vector as stored = 63 byte + 28 byte overhead - 128.000 memory used for hash table (-w24) - 457.764 memory used for DFS stack (-m10000000) - 1760.432 total actual memory usage - -unreached in proctype urcu_reader - line 411, "pan.___", state 17, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 49, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 63, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 82, "(1)" - line 438, "pan.___", state 112, "(1)" - line 442, "pan.___", state 125, "(1)" - line 597, "pan.___", state 146, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 411, "pan.___", state 153, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 185, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 199, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 218, "(1)" - line 438, "pan.___", state 248, "(1)" - line 442, "pan.___", state 261, "(1)" - line 411, "pan.___", state 282, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 314, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 328, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 347, "(1)" - line 438, "pan.___", state 377, "(1)" - line 442, "pan.___", state 390, "(1)" - line 411, "pan.___", state 413, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 415, "(1)" - line 411, "pan.___", state 416, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 416, "else" - line 411, "pan.___", state 419, "(1)" - line 415, "pan.___", state 427, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 429, "(1)" - line 415, "pan.___", state 430, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 430, "else" - line 415, "pan.___", state 433, "(1)" - line 415, "pan.___", state 434, "(1)" - line 415, "pan.___", state 434, "(1)" - line 413, "pan.___", state 439, "((i<1))" - line 413, "pan.___", state 439, "((i>=1))" - line 420, "pan.___", state 445, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 447, "(1)" - line 420, "pan.___", state 448, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 448, "else" - line 420, "pan.___", state 451, "(1)" - line 420, "pan.___", state 452, "(1)" - line 420, "pan.___", state 452, "(1)" - line 424, "pan.___", state 459, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 461, "(1)" - line 424, "pan.___", state 462, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 462, "else" - line 424, "pan.___", state 465, "(1)" - line 424, "pan.___", state 466, "(1)" - line 424, "pan.___", state 466, "(1)" - line 422, "pan.___", state 471, "((i<2))" - line 422, "pan.___", state 471, "((i>=2))" - line 429, "pan.___", state 478, "(1)" - line 429, "pan.___", state 479, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 479, "else" - line 429, "pan.___", state 482, "(1)" - line 429, "pan.___", state 483, "(1)" - line 429, "pan.___", state 483, "(1)" - line 433, "pan.___", state 491, "(1)" - line 433, "pan.___", state 492, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 492, "else" - line 433, "pan.___", state 495, "(1)" - line 433, "pan.___", state 496, "(1)" - line 433, "pan.___", state 496, "(1)" - line 431, "pan.___", state 501, "((i<1))" - line 431, "pan.___", state 501, "((i>=1))" - line 438, "pan.___", state 508, "(1)" - line 438, "pan.___", state 509, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 509, "else" - line 438, "pan.___", state 512, "(1)" - line 438, "pan.___", state 513, "(1)" - line 438, "pan.___", state 513, "(1)" - line 442, "pan.___", state 521, "(1)" - line 442, "pan.___", state 522, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 522, "else" - line 442, "pan.___", state 525, "(1)" - line 442, "pan.___", state 526, "(1)" - line 442, "pan.___", state 526, "(1)" - line 440, "pan.___", state 531, "((i<2))" - line 440, "pan.___", state 531, "((i>=2))" - line 450, "pan.___", state 535, "(1)" - line 450, "pan.___", state 535, "(1)" - line 597, "pan.___", state 538, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 597, "pan.___", state 539, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 597, "pan.___", state 540, "(1)" - line 272, "pan.___", state 544, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 555, "(1)" - line 280, "pan.___", state 566, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 575, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 591, "(1)" - line 253, "pan.___", state 599, "(1)" - line 257, "pan.___", state 611, "(1)" - line 261, "pan.___", state 619, "(1)" - line 411, "pan.___", state 637, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 651, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 669, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 683, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 702, "(1)" - line 433, "pan.___", state 715, "(1)" - line 438, "pan.___", state 732, "(1)" - line 442, "pan.___", state 745, "(1)" - line 411, "pan.___", state 773, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 805, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 819, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 838, "(1)" - line 438, "pan.___", state 868, "(1)" - line 442, "pan.___", state 881, "(1)" - line 411, "pan.___", state 902, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 904, "(1)" - line 411, "pan.___", state 905, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 905, "else" - line 411, "pan.___", state 908, "(1)" - line 415, "pan.___", state 916, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 918, "(1)" - line 415, "pan.___", state 919, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 919, "else" - line 415, "pan.___", state 922, "(1)" - line 415, "pan.___", state 923, "(1)" - line 415, "pan.___", state 923, "(1)" - line 413, "pan.___", state 928, "((i<1))" - line 413, "pan.___", state 928, "((i>=1))" - line 420, "pan.___", state 934, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 936, "(1)" - line 420, "pan.___", state 937, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 937, "else" - line 420, "pan.___", state 940, "(1)" - line 420, "pan.___", state 941, "(1)" - line 420, "pan.___", state 941, "(1)" - line 424, "pan.___", state 948, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 950, "(1)" - line 424, "pan.___", state 951, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 951, "else" - line 424, "pan.___", state 954, "(1)" - line 424, "pan.___", state 955, "(1)" - line 424, "pan.___", state 955, "(1)" - line 422, "pan.___", state 960, "((i<2))" - line 422, "pan.___", state 960, "((i>=2))" - line 429, "pan.___", state 967, "(1)" - line 429, "pan.___", state 968, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 968, "else" - line 429, "pan.___", state 971, "(1)" - line 429, "pan.___", state 972, "(1)" - line 429, "pan.___", state 972, "(1)" - line 433, "pan.___", state 980, "(1)" - line 433, "pan.___", state 981, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 981, "else" - line 433, "pan.___", state 984, "(1)" - line 433, "pan.___", state 985, "(1)" - line 433, "pan.___", state 985, "(1)" - line 431, "pan.___", state 990, "((i<1))" - line 431, "pan.___", state 990, "((i>=1))" - line 438, "pan.___", state 997, "(1)" - line 438, "pan.___", state 998, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 998, "else" - line 438, "pan.___", state 1001, "(1)" - line 438, "pan.___", state 1002, "(1)" - line 438, "pan.___", state 1002, "(1)" - line 442, "pan.___", state 1010, "(1)" - line 442, "pan.___", state 1011, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 1011, "else" - line 442, "pan.___", state 1014, "(1)" - line 442, "pan.___", state 1015, "(1)" - line 442, "pan.___", state 1015, "(1)" - line 440, "pan.___", state 1020, "((i<2))" - line 440, "pan.___", state 1020, "((i>=2))" - line 450, "pan.___", state 1024, "(1)" - line 450, "pan.___", state 1024, "(1)" - line 605, "pan.___", state 1028, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 411, "pan.___", state 1033, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1047, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1065, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1079, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1098, "(1)" - line 433, "pan.___", state 1111, "(1)" - line 438, "pan.___", state 1128, "(1)" - line 442, "pan.___", state 1141, "(1)" - line 411, "pan.___", state 1165, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1197, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1211, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1230, "(1)" - line 438, "pan.___", state 1260, "(1)" - line 442, "pan.___", state 1273, "(1)" - line 411, "pan.___", state 1298, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1330, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1344, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1363, "(1)" - line 438, "pan.___", state 1393, "(1)" - line 442, "pan.___", state 1406, "(1)" - line 411, "pan.___", state 1427, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1459, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1473, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1492, "(1)" - line 438, "pan.___", state 1522, "(1)" - line 442, "pan.___", state 1535, "(1)" - line 272, "pan.___", state 1558, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1580, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1589, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1605, "(1)" - line 253, "pan.___", state 1613, "(1)" - line 257, "pan.___", state 1625, "(1)" - line 261, "pan.___", state 1633, "(1)" - line 411, "pan.___", state 1651, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1665, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1683, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1697, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1716, "(1)" - line 433, "pan.___", state 1729, "(1)" - line 438, "pan.___", state 1746, "(1)" - line 442, "pan.___", state 1759, "(1)" - line 411, "pan.___", state 1780, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1794, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1812, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1826, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1845, "(1)" - line 433, "pan.___", state 1858, "(1)" - line 438, "pan.___", state 1875, "(1)" - line 442, "pan.___", state 1888, "(1)" - line 411, "pan.___", state 1912, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1944, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1958, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 1977, "(1)" - line 438, "pan.___", state 2007, "(1)" - line 442, "pan.___", state 2020, "(1)" - line 644, "pan.___", state 2041, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 411, "pan.___", state 2048, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2080, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2094, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2113, "(1)" - line 438, "pan.___", state 2143, "(1)" - line 442, "pan.___", state 2156, "(1)" - line 411, "pan.___", state 2177, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2209, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2223, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2242, "(1)" - line 438, "pan.___", state 2272, "(1)" - line 442, "pan.___", state 2285, "(1)" - line 411, "pan.___", state 2308, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 2310, "(1)" - line 411, "pan.___", state 2311, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 2311, "else" - line 411, "pan.___", state 2314, "(1)" - line 415, "pan.___", state 2322, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2324, "(1)" - line 415, "pan.___", state 2325, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 2325, "else" - line 415, "pan.___", state 2328, "(1)" - line 415, "pan.___", state 2329, "(1)" - line 415, "pan.___", state 2329, "(1)" - line 413, "pan.___", state 2334, "((i<1))" - line 413, "pan.___", state 2334, "((i>=1))" - line 420, "pan.___", state 2340, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2342, "(1)" - line 420, "pan.___", state 2343, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 2343, "else" - line 420, "pan.___", state 2346, "(1)" - line 420, "pan.___", state 2347, "(1)" - line 420, "pan.___", state 2347, "(1)" - line 424, "pan.___", state 2354, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2356, "(1)" - line 424, "pan.___", state 2357, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 2357, "else" - line 424, "pan.___", state 2360, "(1)" - line 424, "pan.___", state 2361, "(1)" - line 424, "pan.___", state 2361, "(1)" - line 422, "pan.___", state 2366, "((i<2))" - line 422, "pan.___", state 2366, "((i>=2))" - line 429, "pan.___", state 2373, "(1)" - line 429, "pan.___", state 2374, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 429, "pan.___", state 2374, "else" - line 429, "pan.___", state 2377, "(1)" - line 429, "pan.___", state 2378, "(1)" - line 429, "pan.___", state 2378, "(1)" - line 433, "pan.___", state 2386, "(1)" - line 433, "pan.___", state 2387, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 433, "pan.___", state 2387, "else" - line 433, "pan.___", state 2390, "(1)" - line 433, "pan.___", state 2391, "(1)" - line 433, "pan.___", state 2391, "(1)" - line 431, "pan.___", state 2396, "((i<1))" - line 431, "pan.___", state 2396, "((i>=1))" - line 438, "pan.___", state 2403, "(1)" - line 438, "pan.___", state 2404, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 438, "pan.___", state 2404, "else" - line 438, "pan.___", state 2407, "(1)" - line 438, "pan.___", state 2408, "(1)" - line 438, "pan.___", state 2408, "(1)" - line 442, "pan.___", state 2416, "(1)" - line 442, "pan.___", state 2417, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 442, "pan.___", state 2417, "else" - line 442, "pan.___", state 2420, "(1)" - line 442, "pan.___", state 2421, "(1)" - line 442, "pan.___", state 2421, "(1)" - line 440, "pan.___", state 2426, "((i<2))" - line 440, "pan.___", state 2426, "((i>=2))" - line 450, "pan.___", state 2430, "(1)" - line 450, "pan.___", state 2430, "(1)" - line 644, "pan.___", state 2433, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 644, "pan.___", state 2434, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 644, "pan.___", state 2435, "(1)" - line 272, "pan.___", state 2439, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2461, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2470, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2486, "(1)" - line 253, "pan.___", state 2494, "(1)" - line 257, "pan.___", state 2506, "(1)" - line 261, "pan.___", state 2514, "(1)" - line 411, "pan.___", state 2532, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2546, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2564, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2578, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2597, "(1)" - line 433, "pan.___", state 2610, "(1)" - line 438, "pan.___", state 2627, "(1)" - line 442, "pan.___", state 2640, "(1)" - line 272, "pan.___", state 2664, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 2673, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2686, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2695, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2711, "(1)" - line 253, "pan.___", state 2719, "(1)" - line 257, "pan.___", state 2731, "(1)" - line 261, "pan.___", state 2739, "(1)" - line 411, "pan.___", state 2757, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2771, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2789, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2803, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2822, "(1)" - line 433, "pan.___", state 2835, "(1)" - line 438, "pan.___", state 2852, "(1)" - line 442, "pan.___", state 2865, "(1)" - line 411, "pan.___", state 2886, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2900, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2918, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2932, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 2951, "(1)" - line 433, "pan.___", state 2964, "(1)" - line 438, "pan.___", state 2981, "(1)" - line 442, "pan.___", state 2994, "(1)" - line 249, "pan.___", state 3027, "(1)" - line 257, "pan.___", state 3047, "(1)" - line 261, "pan.___", state 3055, "(1)" - line 249, "pan.___", state 3070, "(1)" - line 253, "pan.___", state 3078, "(1)" - line 257, "pan.___", state 3090, "(1)" - line 261, "pan.___", state 3098, "(1)" - line 898, "pan.___", state 3115, "-end-" - (283 of 3115 states) -unreached in proctype urcu_writer - line 411, "pan.___", state 18, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 32, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 50, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 429, "pan.___", state 83, "(1)" - line 433, "pan.___", state 96, "(1)" - line 438, "pan.___", state 113, "(1)" - line 272, "pan.___", state 149, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 158, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 171, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 225, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 243, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 257, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 429, "pan.___", state 276, "(1)" - line 433, "pan.___", state 289, "(1)" - line 438, "pan.___", state 306, "(1)" - line 442, "pan.___", state 319, "(1)" - line 415, "pan.___", state 356, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 374, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 388, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 420, "(1)" - line 438, "pan.___", state 437, "(1)" - line 442, "pan.___", state 450, "(1)" - line 415, "pan.___", state 495, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 513, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 527, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 559, "(1)" - line 438, "pan.___", state 576, "(1)" - line 442, "pan.___", state 589, "(1)" - line 415, "pan.___", state 624, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 642, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 656, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 688, "(1)" - line 438, "pan.___", state 705, "(1)" - line 442, "pan.___", state 718, "(1)" - line 415, "pan.___", state 755, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 773, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 787, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 433, "pan.___", state 819, "(1)" - line 438, "pan.___", state 836, "(1)" - line 442, "pan.___", state 849, "(1)" - line 272, "pan.___", state 904, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 913, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 928, "(1)" - line 284, "pan.___", state 935, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 951, "(1)" - line 253, "pan.___", state 959, "(1)" - line 257, "pan.___", state 971, "(1)" - line 261, "pan.___", state 979, "(1)" - line 276, "pan.___", state 1004, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1017, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1026, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1042, "(1)" - line 253, "pan.___", state 1050, "(1)" - line 257, "pan.___", state 1062, "(1)" - line 261, "pan.___", state 1070, "(1)" - line 276, "pan.___", state 1095, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1108, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1117, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1133, "(1)" - line 253, "pan.___", state 1141, "(1)" - line 257, "pan.___", state 1153, "(1)" - line 261, "pan.___", state 1161, "(1)" - line 276, "pan.___", state 1186, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1199, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1208, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1224, "(1)" - line 253, "pan.___", state 1232, "(1)" - line 257, "pan.___", state 1244, "(1)" - line 261, "pan.___", state 1252, "(1)" - line 1237, "pan.___", state 1267, "-end-" - (71 of 1267 states) -unreached in proctype :init: - (0 of 78 states) -unreached in proctype :never: - line 1302, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 3.38e+04 seconds -pan: rate 854.75351 states/second -pan: avg transition delay 1.3089e-06 usec -cp .input.spin urcu_progress_writer.spin.input -cp .input.spin.trail urcu_progress_writer.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer.spin.input b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer.spin.input deleted file mode 100644 index 051f2f3..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer.spin.input +++ /dev/null @@ -1,1273 +0,0 @@ -#define WRITER_PROGRESS - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer_error.define b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer_error.log b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer_error.log deleted file mode 100644 index 0912929..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer_error.log +++ /dev/null @@ -1,757 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer_error.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1296) -depth 23: Claim reached state 9 (line 1301) -depth 1559: Claim reached state 9 (line 1300) -pan: acceptance cycle (at depth 6380) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 7421, errors: 1 - 55319 states, stored (173044 visited) - 69543507 states, matched - 69716551 transitions (= visited+matched) -3.7666148e+08 atomic steps -hash conflicts: 1148679 (resolved) - -Stats on memory usage (in Megabytes): - 6.120 equivalent memory usage for states (stored*(State-vector + overhead)) - 5.332 actual memory usage for states (compression: 87.12%) - state-vector as stored = 73 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 471.037 total actual memory usage - -unreached in proctype urcu_reader - line 412, "pan.___", state 17, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 49, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 63, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 82, "(1)" - line 439, "pan.___", state 112, "(1)" - line 443, "pan.___", state 125, "(1)" - line 598, "pan.___", state 146, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 412, "pan.___", state 153, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 185, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 199, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 218, "(1)" - line 439, "pan.___", state 248, "(1)" - line 443, "pan.___", state 261, "(1)" - line 412, "pan.___", state 282, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 314, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 328, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 347, "(1)" - line 439, "pan.___", state 377, "(1)" - line 443, "pan.___", state 390, "(1)" - line 412, "pan.___", state 413, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 415, "(1)" - line 412, "pan.___", state 416, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 412, "pan.___", state 416, "else" - line 412, "pan.___", state 419, "(1)" - line 416, "pan.___", state 427, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 429, "(1)" - line 416, "pan.___", state 430, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 416, "pan.___", state 430, "else" - line 416, "pan.___", state 433, "(1)" - line 416, "pan.___", state 434, "(1)" - line 416, "pan.___", state 434, "(1)" - line 414, "pan.___", state 439, "((i<1))" - line 414, "pan.___", state 439, "((i>=1))" - line 421, "pan.___", state 445, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 447, "(1)" - line 421, "pan.___", state 448, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 421, "pan.___", state 448, "else" - line 421, "pan.___", state 451, "(1)" - line 421, "pan.___", state 452, "(1)" - line 421, "pan.___", state 452, "(1)" - line 425, "pan.___", state 459, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 461, "(1)" - line 425, "pan.___", state 462, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 425, "pan.___", state 462, "else" - line 425, "pan.___", state 465, "(1)" - line 425, "pan.___", state 466, "(1)" - line 425, "pan.___", state 466, "(1)" - line 423, "pan.___", state 471, "((i<2))" - line 423, "pan.___", state 471, "((i>=2))" - line 430, "pan.___", state 478, "(1)" - line 430, "pan.___", state 479, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 430, "pan.___", state 479, "else" - line 430, "pan.___", state 482, "(1)" - line 430, "pan.___", state 483, "(1)" - line 430, "pan.___", state 483, "(1)" - line 434, "pan.___", state 491, "(1)" - line 434, "pan.___", state 492, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 434, "pan.___", state 492, "else" - line 434, "pan.___", state 495, "(1)" - line 434, "pan.___", state 496, "(1)" - line 434, "pan.___", state 496, "(1)" - line 432, "pan.___", state 501, "((i<1))" - line 432, "pan.___", state 501, "((i>=1))" - line 439, "pan.___", state 508, "(1)" - line 439, "pan.___", state 509, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 439, "pan.___", state 509, "else" - line 439, "pan.___", state 512, "(1)" - line 439, "pan.___", state 513, "(1)" - line 439, "pan.___", state 513, "(1)" - line 443, "pan.___", state 521, "(1)" - line 443, "pan.___", state 522, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 443, "pan.___", state 522, "else" - line 443, "pan.___", state 525, "(1)" - line 443, "pan.___", state 526, "(1)" - line 443, "pan.___", state 526, "(1)" - line 441, "pan.___", state 531, "((i<2))" - line 441, "pan.___", state 531, "((i>=2))" - line 451, "pan.___", state 535, "(1)" - line 451, "pan.___", state 535, "(1)" - line 598, "pan.___", state 538, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 598, "pan.___", state 539, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 598, "pan.___", state 540, "(1)" - line 273, "pan.___", state 544, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 277, "pan.___", state 555, "(1)" - line 281, "pan.___", state 566, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 285, "pan.___", state 575, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 591, "(1)" - line 254, "pan.___", state 599, "(1)" - line 258, "pan.___", state 611, "(1)" - line 262, "pan.___", state 619, "(1)" - line 412, "pan.___", state 637, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 651, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 669, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 683, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 702, "(1)" - line 434, "pan.___", state 715, "(1)" - line 439, "pan.___", state 732, "(1)" - line 443, "pan.___", state 745, "(1)" - line 412, "pan.___", state 773, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 805, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 819, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 838, "(1)" - line 439, "pan.___", state 868, "(1)" - line 443, "pan.___", state 881, "(1)" - line 412, "pan.___", state 902, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 904, "(1)" - line 412, "pan.___", state 905, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 412, "pan.___", state 905, "else" - line 412, "pan.___", state 908, "(1)" - line 416, "pan.___", state 916, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 918, "(1)" - line 416, "pan.___", state 919, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 416, "pan.___", state 919, "else" - line 416, "pan.___", state 922, "(1)" - line 416, "pan.___", state 923, "(1)" - line 416, "pan.___", state 923, "(1)" - line 414, "pan.___", state 928, "((i<1))" - line 414, "pan.___", state 928, "((i>=1))" - line 421, "pan.___", state 934, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 936, "(1)" - line 421, "pan.___", state 937, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 421, "pan.___", state 937, "else" - line 421, "pan.___", state 940, "(1)" - line 421, "pan.___", state 941, "(1)" - line 421, "pan.___", state 941, "(1)" - line 425, "pan.___", state 948, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 950, "(1)" - line 425, "pan.___", state 951, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 425, "pan.___", state 951, "else" - line 425, "pan.___", state 954, "(1)" - line 425, "pan.___", state 955, "(1)" - line 425, "pan.___", state 955, "(1)" - line 423, "pan.___", state 960, "((i<2))" - line 423, "pan.___", state 960, "((i>=2))" - line 430, "pan.___", state 967, "(1)" - line 430, "pan.___", state 968, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 430, "pan.___", state 968, "else" - line 430, "pan.___", state 971, "(1)" - line 430, "pan.___", state 972, "(1)" - line 430, "pan.___", state 972, "(1)" - line 434, "pan.___", state 980, "(1)" - line 434, "pan.___", state 981, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 434, "pan.___", state 981, "else" - line 434, "pan.___", state 984, "(1)" - line 434, "pan.___", state 985, "(1)" - line 434, "pan.___", state 985, "(1)" - line 432, "pan.___", state 990, "((i<1))" - line 432, "pan.___", state 990, "((i>=1))" - line 439, "pan.___", state 997, "(1)" - line 439, "pan.___", state 998, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 439, "pan.___", state 998, "else" - line 439, "pan.___", state 1001, "(1)" - line 439, "pan.___", state 1002, "(1)" - line 439, "pan.___", state 1002, "(1)" - line 443, "pan.___", state 1010, "(1)" - line 443, "pan.___", state 1011, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 443, "pan.___", state 1011, "else" - line 443, "pan.___", state 1014, "(1)" - line 443, "pan.___", state 1015, "(1)" - line 443, "pan.___", state 1015, "(1)" - line 441, "pan.___", state 1020, "((i<2))" - line 441, "pan.___", state 1020, "((i>=2))" - line 451, "pan.___", state 1024, "(1)" - line 451, "pan.___", state 1024, "(1)" - line 606, "pan.___", state 1028, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 412, "pan.___", state 1033, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 1047, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 1065, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 1079, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 1098, "(1)" - line 434, "pan.___", state 1111, "(1)" - line 439, "pan.___", state 1128, "(1)" - line 443, "pan.___", state 1141, "(1)" - line 412, "pan.___", state 1165, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 1197, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 1211, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 1230, "(1)" - line 439, "pan.___", state 1260, "(1)" - line 443, "pan.___", state 1273, "(1)" - line 412, "pan.___", state 1298, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 1330, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 1344, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 1363, "(1)" - line 439, "pan.___", state 1393, "(1)" - line 443, "pan.___", state 1406, "(1)" - line 412, "pan.___", state 1427, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 1459, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 1473, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 1492, "(1)" - line 439, "pan.___", state 1522, "(1)" - line 443, "pan.___", state 1535, "(1)" - line 273, "pan.___", state 1558, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 281, "pan.___", state 1580, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 285, "pan.___", state 1589, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 1605, "(1)" - line 254, "pan.___", state 1613, "(1)" - line 258, "pan.___", state 1625, "(1)" - line 262, "pan.___", state 1633, "(1)" - line 412, "pan.___", state 1651, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 1665, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 1683, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 1697, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 1716, "(1)" - line 434, "pan.___", state 1729, "(1)" - line 439, "pan.___", state 1746, "(1)" - line 443, "pan.___", state 1759, "(1)" - line 412, "pan.___", state 1780, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 1794, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 1812, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 1826, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 1845, "(1)" - line 434, "pan.___", state 1858, "(1)" - line 439, "pan.___", state 1875, "(1)" - line 443, "pan.___", state 1888, "(1)" - line 412, "pan.___", state 1912, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 1944, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 1958, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 1977, "(1)" - line 439, "pan.___", state 2007, "(1)" - line 443, "pan.___", state 2020, "(1)" - line 645, "pan.___", state 2041, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 412, "pan.___", state 2048, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 2080, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 2094, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 2113, "(1)" - line 439, "pan.___", state 2143, "(1)" - line 443, "pan.___", state 2156, "(1)" - line 412, "pan.___", state 2177, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 2209, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 2223, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 2242, "(1)" - line 439, "pan.___", state 2272, "(1)" - line 443, "pan.___", state 2285, "(1)" - line 412, "pan.___", state 2308, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 2310, "(1)" - line 412, "pan.___", state 2311, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 412, "pan.___", state 2311, "else" - line 412, "pan.___", state 2314, "(1)" - line 416, "pan.___", state 2322, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 2324, "(1)" - line 416, "pan.___", state 2325, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 416, "pan.___", state 2325, "else" - line 416, "pan.___", state 2328, "(1)" - line 416, "pan.___", state 2329, "(1)" - line 416, "pan.___", state 2329, "(1)" - line 414, "pan.___", state 2334, "((i<1))" - line 414, "pan.___", state 2334, "((i>=1))" - line 421, "pan.___", state 2340, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 2342, "(1)" - line 421, "pan.___", state 2343, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 421, "pan.___", state 2343, "else" - line 421, "pan.___", state 2346, "(1)" - line 421, "pan.___", state 2347, "(1)" - line 421, "pan.___", state 2347, "(1)" - line 425, "pan.___", state 2354, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 2356, "(1)" - line 425, "pan.___", state 2357, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 425, "pan.___", state 2357, "else" - line 425, "pan.___", state 2360, "(1)" - line 425, "pan.___", state 2361, "(1)" - line 425, "pan.___", state 2361, "(1)" - line 423, "pan.___", state 2366, "((i<2))" - line 423, "pan.___", state 2366, "((i>=2))" - line 430, "pan.___", state 2373, "(1)" - line 430, "pan.___", state 2374, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 430, "pan.___", state 2374, "else" - line 430, "pan.___", state 2377, "(1)" - line 430, "pan.___", state 2378, "(1)" - line 430, "pan.___", state 2378, "(1)" - line 434, "pan.___", state 2386, "(1)" - line 434, "pan.___", state 2387, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 434, "pan.___", state 2387, "else" - line 434, "pan.___", state 2390, "(1)" - line 434, "pan.___", state 2391, "(1)" - line 434, "pan.___", state 2391, "(1)" - line 432, "pan.___", state 2396, "((i<1))" - line 432, "pan.___", state 2396, "((i>=1))" - line 439, "pan.___", state 2403, "(1)" - line 439, "pan.___", state 2404, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 439, "pan.___", state 2404, "else" - line 439, "pan.___", state 2407, "(1)" - line 439, "pan.___", state 2408, "(1)" - line 439, "pan.___", state 2408, "(1)" - line 443, "pan.___", state 2416, "(1)" - line 443, "pan.___", state 2417, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 443, "pan.___", state 2417, "else" - line 443, "pan.___", state 2420, "(1)" - line 443, "pan.___", state 2421, "(1)" - line 443, "pan.___", state 2421, "(1)" - line 441, "pan.___", state 2426, "((i<2))" - line 441, "pan.___", state 2426, "((i>=2))" - line 451, "pan.___", state 2430, "(1)" - line 451, "pan.___", state 2430, "(1)" - line 645, "pan.___", state 2433, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 645, "pan.___", state 2434, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 645, "pan.___", state 2435, "(1)" - line 273, "pan.___", state 2439, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 281, "pan.___", state 2461, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 285, "pan.___", state 2470, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 2486, "(1)" - line 254, "pan.___", state 2494, "(1)" - line 258, "pan.___", state 2506, "(1)" - line 262, "pan.___", state 2514, "(1)" - line 412, "pan.___", state 2532, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 2546, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 2564, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 2578, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 2597, "(1)" - line 434, "pan.___", state 2610, "(1)" - line 439, "pan.___", state 2627, "(1)" - line 443, "pan.___", state 2640, "(1)" - line 273, "pan.___", state 2664, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 277, "pan.___", state 2673, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 281, "pan.___", state 2686, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 285, "pan.___", state 2695, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 2711, "(1)" - line 254, "pan.___", state 2719, "(1)" - line 258, "pan.___", state 2731, "(1)" - line 262, "pan.___", state 2739, "(1)" - line 412, "pan.___", state 2757, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 2771, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 2789, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 2803, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 2822, "(1)" - line 434, "pan.___", state 2835, "(1)" - line 439, "pan.___", state 2852, "(1)" - line 443, "pan.___", state 2865, "(1)" - line 412, "pan.___", state 2886, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 2900, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 2918, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 2932, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 2951, "(1)" - line 434, "pan.___", state 2964, "(1)" - line 439, "pan.___", state 2981, "(1)" - line 443, "pan.___", state 2994, "(1)" - line 250, "pan.___", state 3027, "(1)" - line 258, "pan.___", state 3047, "(1)" - line 262, "pan.___", state 3055, "(1)" - line 250, "pan.___", state 3070, "(1)" - line 254, "pan.___", state 3078, "(1)" - line 258, "pan.___", state 3090, "(1)" - line 262, "pan.___", state 3098, "(1)" - line 899, "pan.___", state 3115, "-end-" - (283 of 3115 states) -unreached in proctype urcu_writer - line 412, "pan.___", state 18, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 24, "(1)" - line 416, "pan.___", state 32, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 38, "(1)" - line 416, "pan.___", state 39, "(1)" - line 416, "pan.___", state 39, "(1)" - line 414, "pan.___", state 44, "((i<1))" - line 414, "pan.___", state 44, "((i>=1))" - line 421, "pan.___", state 50, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 56, "(1)" - line 421, "pan.___", state 57, "(1)" - line 421, "pan.___", state 57, "(1)" - line 425, "pan.___", state 64, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 70, "(1)" - line 425, "pan.___", state 71, "(1)" - line 425, "pan.___", state 71, "(1)" - line 423, "pan.___", state 76, "((i<2))" - line 423, "pan.___", state 76, "((i>=2))" - line 430, "pan.___", state 83, "(1)" - line 430, "pan.___", state 84, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 430, "pan.___", state 84, "else" - line 430, "pan.___", state 87, "(1)" - line 430, "pan.___", state 88, "(1)" - line 430, "pan.___", state 88, "(1)" - line 434, "pan.___", state 96, "(1)" - line 434, "pan.___", state 97, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 434, "pan.___", state 97, "else" - line 434, "pan.___", state 100, "(1)" - line 434, "pan.___", state 101, "(1)" - line 434, "pan.___", state 101, "(1)" - line 432, "pan.___", state 106, "((i<1))" - line 432, "pan.___", state 106, "((i>=1))" - line 439, "pan.___", state 113, "(1)" - line 439, "pan.___", state 114, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 439, "pan.___", state 114, "else" - line 439, "pan.___", state 117, "(1)" - line 439, "pan.___", state 118, "(1)" - line 439, "pan.___", state 118, "(1)" - line 443, "pan.___", state 126, "(1)" - line 443, "pan.___", state 127, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 443, "pan.___", state 127, "else" - line 443, "pan.___", state 130, "(1)" - line 443, "pan.___", state 131, "(1)" - line 443, "pan.___", state 131, "(1)" - line 441, "pan.___", state 136, "((i<2))" - line 441, "pan.___", state 136, "((i>=2))" - line 451, "pan.___", state 140, "(1)" - line 451, "pan.___", state 140, "(1)" - line 273, "pan.___", state 149, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 277, "pan.___", state 158, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 166, "((i<1))" - line 275, "pan.___", state 166, "((i>=1))" - line 281, "pan.___", state 171, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 1022, "pan.___", state 199, "old_data = cached_rcu_ptr.val[_pid]" - line 412, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 217, "(1)" - line 416, "pan.___", state 225, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 231, "(1)" - line 416, "pan.___", state 232, "(1)" - line 416, "pan.___", state 232, "(1)" - line 414, "pan.___", state 237, "((i<1))" - line 414, "pan.___", state 237, "((i>=1))" - line 421, "pan.___", state 243, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 249, "(1)" - line 421, "pan.___", state 250, "(1)" - line 421, "pan.___", state 250, "(1)" - line 425, "pan.___", state 257, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 263, "(1)" - line 425, "pan.___", state 264, "(1)" - line 425, "pan.___", state 264, "(1)" - line 423, "pan.___", state 269, "((i<2))" - line 423, "pan.___", state 269, "((i>=2))" - line 430, "pan.___", state 276, "(1)" - line 430, "pan.___", state 277, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 430, "pan.___", state 277, "else" - line 430, "pan.___", state 280, "(1)" - line 430, "pan.___", state 281, "(1)" - line 430, "pan.___", state 281, "(1)" - line 434, "pan.___", state 289, "(1)" - line 434, "pan.___", state 290, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 434, "pan.___", state 290, "else" - line 434, "pan.___", state 293, "(1)" - line 434, "pan.___", state 294, "(1)" - line 434, "pan.___", state 294, "(1)" - line 432, "pan.___", state 299, "((i<1))" - line 432, "pan.___", state 299, "((i>=1))" - line 439, "pan.___", state 306, "(1)" - line 439, "pan.___", state 307, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 439, "pan.___", state 307, "else" - line 439, "pan.___", state 310, "(1)" - line 439, "pan.___", state 311, "(1)" - line 439, "pan.___", state 311, "(1)" - line 443, "pan.___", state 319, "(1)" - line 443, "pan.___", state 320, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 443, "pan.___", state 320, "else" - line 443, "pan.___", state 323, "(1)" - line 443, "pan.___", state 324, "(1)" - line 443, "pan.___", state 324, "(1)" - line 441, "pan.___", state 329, "((i<2))" - line 441, "pan.___", state 329, "((i>=2))" - line 451, "pan.___", state 333, "(1)" - line 451, "pan.___", state 333, "(1)" - line 412, "pan.___", state 344, "(1)" - line 412, "pan.___", state 345, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 412, "pan.___", state 345, "else" - line 412, "pan.___", state 348, "(1)" - line 416, "pan.___", state 356, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 362, "(1)" - line 416, "pan.___", state 363, "(1)" - line 416, "pan.___", state 363, "(1)" - line 414, "pan.___", state 368, "((i<1))" - line 414, "pan.___", state 368, "((i>=1))" - line 421, "pan.___", state 374, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 380, "(1)" - line 421, "pan.___", state 381, "(1)" - line 421, "pan.___", state 381, "(1)" - line 425, "pan.___", state 388, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 394, "(1)" - line 425, "pan.___", state 395, "(1)" - line 425, "pan.___", state 395, "(1)" - line 423, "pan.___", state 400, "((i<2))" - line 423, "pan.___", state 400, "((i>=2))" - line 430, "pan.___", state 407, "(1)" - line 430, "pan.___", state 408, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 430, "pan.___", state 408, "else" - line 430, "pan.___", state 411, "(1)" - line 430, "pan.___", state 412, "(1)" - line 430, "pan.___", state 412, "(1)" - line 434, "pan.___", state 420, "(1)" - line 434, "pan.___", state 421, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 434, "pan.___", state 421, "else" - line 434, "pan.___", state 424, "(1)" - line 434, "pan.___", state 425, "(1)" - line 434, "pan.___", state 425, "(1)" - line 432, "pan.___", state 430, "((i<1))" - line 432, "pan.___", state 430, "((i>=1))" - line 439, "pan.___", state 437, "(1)" - line 439, "pan.___", state 438, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 439, "pan.___", state 438, "else" - line 439, "pan.___", state 441, "(1)" - line 439, "pan.___", state 442, "(1)" - line 439, "pan.___", state 442, "(1)" - line 443, "pan.___", state 450, "(1)" - line 443, "pan.___", state 451, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 443, "pan.___", state 451, "else" - line 443, "pan.___", state 454, "(1)" - line 443, "pan.___", state 455, "(1)" - line 443, "pan.___", state 455, "(1)" - line 441, "pan.___", state 460, "((i<2))" - line 441, "pan.___", state 460, "((i>=2))" - line 451, "pan.___", state 464, "(1)" - line 451, "pan.___", state 464, "(1)" - line 412, "pan.___", state 477, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 479, "(1)" - line 412, "pan.___", state 480, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 412, "pan.___", state 480, "else" - line 412, "pan.___", state 483, "(1)" - line 416, "pan.___", state 491, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 493, "(1)" - line 416, "pan.___", state 494, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 416, "pan.___", state 494, "else" - line 416, "pan.___", state 497, "(1)" - line 416, "pan.___", state 498, "(1)" - line 416, "pan.___", state 498, "(1)" - line 414, "pan.___", state 503, "((i<1))" - line 414, "pan.___", state 503, "((i>=1))" - line 421, "pan.___", state 509, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 511, "(1)" - line 421, "pan.___", state 512, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 421, "pan.___", state 512, "else" - line 421, "pan.___", state 515, "(1)" - line 421, "pan.___", state 516, "(1)" - line 421, "pan.___", state 516, "(1)" - line 425, "pan.___", state 523, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 525, "(1)" - line 425, "pan.___", state 526, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 425, "pan.___", state 526, "else" - line 425, "pan.___", state 529, "(1)" - line 425, "pan.___", state 530, "(1)" - line 425, "pan.___", state 530, "(1)" - line 423, "pan.___", state 535, "((i<2))" - line 423, "pan.___", state 535, "((i>=2))" - line 430, "pan.___", state 542, "(1)" - line 430, "pan.___", state 543, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 430, "pan.___", state 543, "else" - line 430, "pan.___", state 546, "(1)" - line 430, "pan.___", state 547, "(1)" - line 430, "pan.___", state 547, "(1)" - line 434, "pan.___", state 555, "(1)" - line 434, "pan.___", state 556, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 434, "pan.___", state 556, "else" - line 434, "pan.___", state 559, "(1)" - line 434, "pan.___", state 560, "(1)" - line 434, "pan.___", state 560, "(1)" - line 432, "pan.___", state 565, "((i<1))" - line 432, "pan.___", state 565, "((i>=1))" - line 439, "pan.___", state 572, "(1)" - line 439, "pan.___", state 573, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 439, "pan.___", state 573, "else" - line 439, "pan.___", state 576, "(1)" - line 439, "pan.___", state 577, "(1)" - line 439, "pan.___", state 577, "(1)" - line 443, "pan.___", state 585, "(1)" - line 443, "pan.___", state 586, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 443, "pan.___", state 586, "else" - line 443, "pan.___", state 589, "(1)" - line 443, "pan.___", state 590, "(1)" - line 443, "pan.___", state 590, "(1)" - line 451, "pan.___", state 599, "(1)" - line 451, "pan.___", state 599, "(1)" - line 412, "pan.___", state 605, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 611, "(1)" - line 416, "pan.___", state 619, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 625, "(1)" - line 416, "pan.___", state 626, "(1)" - line 416, "pan.___", state 626, "(1)" - line 414, "pan.___", state 631, "((i<1))" - line 414, "pan.___", state 631, "((i>=1))" - line 421, "pan.___", state 637, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 643, "(1)" - line 421, "pan.___", state 644, "(1)" - line 421, "pan.___", state 644, "(1)" - line 425, "pan.___", state 651, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 657, "(1)" - line 425, "pan.___", state 658, "(1)" - line 425, "pan.___", state 658, "(1)" - line 423, "pan.___", state 663, "((i<2))" - line 423, "pan.___", state 663, "((i>=2))" - line 430, "pan.___", state 670, "(1)" - line 430, "pan.___", state 671, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 430, "pan.___", state 671, "else" - line 430, "pan.___", state 674, "(1)" - line 430, "pan.___", state 675, "(1)" - line 430, "pan.___", state 675, "(1)" - line 434, "pan.___", state 683, "(1)" - line 434, "pan.___", state 684, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 434, "pan.___", state 684, "else" - line 434, "pan.___", state 687, "(1)" - line 434, "pan.___", state 688, "(1)" - line 434, "pan.___", state 688, "(1)" - line 432, "pan.___", state 693, "((i<1))" - line 432, "pan.___", state 693, "((i>=1))" - line 439, "pan.___", state 700, "(1)" - line 439, "pan.___", state 701, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 439, "pan.___", state 701, "else" - line 439, "pan.___", state 704, "(1)" - line 439, "pan.___", state 705, "(1)" - line 439, "pan.___", state 705, "(1)" - line 443, "pan.___", state 713, "(1)" - line 443, "pan.___", state 714, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 443, "pan.___", state 714, "else" - line 443, "pan.___", state 717, "(1)" - line 443, "pan.___", state 718, "(1)" - line 443, "pan.___", state 718, "(1)" - line 451, "pan.___", state 727, "(1)" - line 451, "pan.___", state 727, "(1)" - line 412, "pan.___", state 734, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 740, "(1)" - line 416, "pan.___", state 748, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 754, "(1)" - line 416, "pan.___", state 755, "(1)" - line 416, "pan.___", state 755, "(1)" - line 414, "pan.___", state 760, "((i<1))" - line 414, "pan.___", state 760, "((i>=1))" - line 421, "pan.___", state 766, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 772, "(1)" - line 421, "pan.___", state 773, "(1)" - line 421, "pan.___", state 773, "(1)" - line 425, "pan.___", state 780, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 786, "(1)" - line 425, "pan.___", state 787, "(1)" - line 425, "pan.___", state 787, "(1)" - line 423, "pan.___", state 792, "((i<2))" - line 423, "pan.___", state 792, "((i>=2))" - line 430, "pan.___", state 799, "(1)" - line 430, "pan.___", state 800, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 430, "pan.___", state 800, "else" - line 430, "pan.___", state 803, "(1)" - line 430, "pan.___", state 804, "(1)" - line 430, "pan.___", state 804, "(1)" - line 434, "pan.___", state 812, "(1)" - line 434, "pan.___", state 813, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 434, "pan.___", state 813, "else" - line 434, "pan.___", state 816, "(1)" - line 434, "pan.___", state 817, "(1)" - line 434, "pan.___", state 817, "(1)" - line 432, "pan.___", state 822, "((i<1))" - line 432, "pan.___", state 822, "((i>=1))" - line 439, "pan.___", state 829, "(1)" - line 439, "pan.___", state 830, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 439, "pan.___", state 830, "else" - line 439, "pan.___", state 833, "(1)" - line 439, "pan.___", state 834, "(1)" - line 439, "pan.___", state 834, "(1)" - line 443, "pan.___", state 842, "(1)" - line 443, "pan.___", state 843, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 443, "pan.___", state 843, "else" - line 443, "pan.___", state 846, "(1)" - line 443, "pan.___", state 847, "(1)" - line 443, "pan.___", state 847, "(1)" - line 441, "pan.___", state 852, "((i<2))" - line 441, "pan.___", state 852, "((i>=2))" - line 451, "pan.___", state 856, "(1)" - line 451, "pan.___", state 856, "(1)" - line 416, "pan.___", state 879, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 897, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 911, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 434, "pan.___", state 943, "(1)" - line 439, "pan.___", state 960, "(1)" - line 443, "pan.___", state 973, "(1)" - line 412, "pan.___", state 999, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 1013, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 1031, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 1045, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 430, "pan.___", state 1064, "(1)" - line 434, "pan.___", state 1077, "(1)" - line 439, "pan.___", state 1094, "(1)" - line 443, "pan.___", state 1107, "(1)" - line 273, "pan.___", state 1153, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 277, "pan.___", state 1162, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 1170, "((i<1))" - line 275, "pan.___", state 1170, "((i>=1))" - line 281, "pan.___", state 1177, "(1)" - line 281, "pan.___", state 1178, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 281, "pan.___", state 1178, "else" - line 285, "pan.___", state 1184, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 283, "pan.___", state 1192, "((i<2))" - line 283, "pan.___", state 1192, "((i>=2))" - line 250, "pan.___", state 1200, "(1)" - line 254, "pan.___", state 1208, "(1)" - line 254, "pan.___", state 1209, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 254, "pan.___", state 1209, "else" - line 252, "pan.___", state 1214, "((i<1))" - line 252, "pan.___", state 1214, "((i>=1))" - line 258, "pan.___", state 1220, "(1)" - line 258, "pan.___", state 1221, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 258, "pan.___", state 1221, "else" - line 262, "pan.___", state 1228, "(1)" - line 262, "pan.___", state 1229, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 262, "pan.___", state 1229, "else" - line 267, "pan.___", state 1238, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 267, "pan.___", state 1238, "else" - line 277, "pan.___", state 1253, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 281, "pan.___", state 1266, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 285, "pan.___", state 1275, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 1291, "(1)" - line 254, "pan.___", state 1299, "(1)" - line 258, "pan.___", state 1311, "(1)" - line 262, "pan.___", state 1319, "(1)" - line 1238, "pan.___", state 1334, "-end-" - (242 of 1334 states) -unreached in proctype :init: - (0 of 78 states) -unreached in proctype :never: - line 1303, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 88.5 seconds -pan: rate 1954.1954 states/second -pan: avg transition delay 1.2701e-06 usec -cp .input.spin urcu_progress_writer_error.spin.input -cp .input.spin.trail urcu_progress_writer_error.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-alpha-no-ipi' diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer_error.spin.input b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer_error.spin.input deleted file mode 100644 index ad4f91f..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer_error.spin.input +++ /dev/null @@ -1,1274 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer_error.spin.input.trail deleted file mode 100644 index 8ab0111..0000000 --- a/formal-model/urcu-controldataflow-alpha-no-ipi/urcu_progress_writer_error.spin.input.trail +++ /dev/null @@ -1,7390 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:4529 -2:3:4449 -3:3:4452 -4:3:4452 -5:3:4455 -6:3:4463 -7:3:4463 -8:3:4466 -9:3:4472 -10:3:4476 -11:3:4476 -12:3:4479 -13:3:4489 -14:3:4497 -15:3:4497 -16:3:4500 -17:3:4506 -18:3:4510 -19:3:4510 -20:3:4513 -21:3:4519 -22:3:4523 -23:3:4524 -24:0:4529 -25:3:4526 -26:0:4529 -27:2:3117 -28:0:4529 -29:2:3123 -30:0:4529 -31:2:3124 -32:0:4529 -33:2:3125 -34:0:4527 -35:2:3126 -36:0:4533 -37:2:3127 -38:0:4533 -39:2:3128 -40:2:3129 -41:2:3133 -42:2:3134 -43:2:3142 -44:2:3143 -45:2:3147 -46:2:3148 -47:2:3156 -48:2:3161 -49:2:3165 -50:2:3166 -51:2:3174 -52:2:3175 -53:2:3179 -54:2:3180 -55:2:3174 -56:2:3175 -57:2:3179 -58:2:3180 -59:2:3188 -60:2:3193 -61:2:3194 -62:2:3205 -63:2:3206 -64:2:3207 -65:2:3218 -66:2:3223 -67:2:3224 -68:2:3235 -69:2:3236 -70:2:3237 -71:2:3235 -72:2:3236 -73:2:3237 -74:2:3248 -75:2:3256 -76:0:4533 -77:2:3127 -78:0:4533 -79:2:3260 -80:2:3264 -81:2:3265 -82:2:3269 -83:2:3273 -84:2:3274 -85:2:3278 -86:2:3286 -87:2:3287 -88:2:3291 -89:2:3295 -90:2:3296 -91:2:3291 -92:2:3292 -93:2:3300 -94:0:4533 -95:2:3127 -96:0:4533 -97:2:3308 -98:2:3309 -99:2:3310 -100:0:4533 -101:2:3127 -102:0:4533 -103:2:3315 -104:0:4533 -105:2:4268 -106:2:4269 -107:2:4273 -108:2:4277 -109:2:4278 -110:2:4282 -111:2:4287 -112:2:4295 -113:2:4299 -114:2:4300 -115:2:4295 -116:2:4299 -117:2:4300 -118:2:4304 -119:2:4311 -120:2:4318 -121:2:4319 -122:2:4326 -123:2:4331 -124:2:4338 -125:2:4339 -126:2:4338 -127:2:4339 -128:2:4346 -129:2:4350 -130:0:4533 -131:2:3317 -132:2:4249 -133:0:4533 -134:2:3127 -135:0:4533 -136:2:3318 -137:0:4533 -138:2:3127 -139:0:4533 -140:2:3321 -141:2:3322 -142:2:3326 -143:2:3327 -144:2:3335 -145:2:3336 -146:2:3340 -147:2:3341 -148:2:3349 -149:2:3354 -150:2:3358 -151:2:3359 -152:2:3367 -153:2:3368 -154:2:3372 -155:2:3373 -156:2:3367 -157:2:3368 -158:2:3372 -159:2:3373 -160:2:3381 -161:2:3386 -162:2:3387 -163:2:3398 -164:2:3399 -165:2:3400 -166:2:3411 -167:2:3416 -168:2:3417 -169:2:3428 -170:2:3429 -171:2:3430 -172:2:3428 -173:2:3429 -174:2:3430 -175:2:3441 -176:2:3448 -177:0:4533 -178:2:3127 -179:0:4533 -180:2:3452 -181:2:3453 -182:2:3454 -183:2:3466 -184:2:3467 -185:2:3471 -186:2:3472 -187:2:3480 -188:2:3485 -189:2:3489 -190:2:3490 -191:2:3498 -192:2:3499 -193:2:3503 -194:2:3504 -195:2:3498 -196:2:3499 -197:2:3503 -198:2:3504 -199:2:3512 -200:2:3517 -201:2:3518 -202:2:3529 -203:2:3530 -204:2:3531 -205:2:3542 -206:2:3547 -207:2:3548 -208:2:3559 -209:2:3560 -210:2:3561 -211:2:3559 -212:2:3560 -213:2:3561 -214:2:3572 -215:2:3583 -216:2:3584 -217:0:4533 -218:2:3127 -219:0:4533 -220:2:3715 -221:2:3716 -222:2:3720 -223:2:3721 -224:2:3729 -225:2:3730 -226:2:3734 -227:2:3735 -228:2:3743 -229:2:3748 -230:2:3752 -231:2:3753 -232:2:3761 -233:2:3762 -234:2:3766 -235:2:3767 -236:2:3761 -237:2:3762 -238:2:3766 -239:2:3767 -240:2:3775 -241:2:3780 -242:2:3781 -243:2:3792 -244:2:3793 -245:2:3794 -246:2:3805 -247:2:3810 -248:2:3811 -249:2:3822 -250:2:3823 -251:2:3824 -252:2:3822 -253:2:3823 -254:2:3824 -255:2:3835 -256:0:4533 -257:2:3127 -258:0:4533 -259:2:3844 -260:2:3845 -261:2:3849 -262:2:3850 -263:2:3858 -264:2:3859 -265:2:3863 -266:2:3864 -267:2:3872 -268:2:3877 -269:2:3881 -270:2:3882 -271:2:3890 -272:2:3891 -273:2:3895 -274:2:3896 -275:2:3890 -276:2:3891 -277:2:3895 -278:2:3896 -279:2:3904 -280:2:3909 -281:2:3910 -282:2:3921 -283:2:3922 -284:2:3923 -285:2:3934 -286:2:3939 -287:2:3940 -288:2:3951 -289:2:3952 -290:2:3953 -291:2:3951 -292:2:3952 -293:2:3953 -294:2:3964 -295:2:3971 -296:0:4533 -297:2:3127 -298:0:4533 -299:1:2 -300:0:4533 -301:1:8 -302:0:4533 -303:1:9 -304:0:4533 -305:1:10 -306:0:4533 -307:1:11 -308:0:4533 -309:1:12 -310:1:13 -311:1:17 -312:1:18 -313:1:26 -314:1:27 -315:1:31 -316:1:32 -317:1:40 -318:1:45 -319:1:49 -320:1:50 -321:1:58 -322:1:59 -323:1:63 -324:1:64 -325:1:58 -326:1:59 -327:1:63 -328:1:64 -329:1:72 -330:1:77 -331:1:78 -332:1:89 -333:1:90 -334:1:91 -335:1:102 -336:1:107 -337:1:108 -338:1:119 -339:1:120 -340:1:121 -341:1:119 -342:1:120 -343:1:121 -344:1:132 -345:0:4533 -346:1:11 -347:0:4533 -348:1:141 -349:1:142 -350:0:4533 -351:1:11 -352:0:4533 -353:1:148 -354:1:149 -355:1:153 -356:1:154 -357:1:162 -358:1:163 -359:1:167 -360:1:168 -361:1:176 -362:1:181 -363:1:185 -364:1:186 -365:1:194 -366:1:195 -367:1:199 -368:1:200 -369:1:194 -370:1:195 -371:1:199 -372:1:200 -373:1:208 -374:1:213 -375:1:214 -376:1:225 -377:1:226 -378:1:227 -379:1:238 -380:1:243 -381:1:244 -382:1:255 -383:1:256 -384:1:257 -385:1:255 -386:1:256 -387:1:257 -388:1:268 -389:0:4533 -390:1:11 -391:0:4533 -392:1:277 -393:1:278 -394:1:282 -395:1:283 -396:1:291 -397:1:292 -398:1:296 -399:1:297 -400:1:305 -401:1:310 -402:1:314 -403:1:315 -404:1:323 -405:1:324 -406:1:328 -407:1:329 -408:1:323 -409:1:324 -410:1:328 -411:1:329 -412:1:337 -413:1:342 -414:1:343 -415:1:354 -416:1:355 -417:1:356 -418:1:367 -419:1:372 -420:1:373 -421:1:384 -422:1:385 -423:1:386 -424:1:384 -425:1:385 -426:1:386 -427:1:397 -428:1:404 -429:0:4533 -430:1:11 -431:0:4533 -432:1:540 -433:1:544 -434:1:545 -435:1:549 -436:1:550 -437:1:558 -438:1:566 -439:1:567 -440:1:571 -441:1:575 -442:1:576 -443:1:571 -444:1:575 -445:1:576 -446:1:580 -447:1:587 -448:1:594 -449:1:595 -450:1:602 -451:1:607 -452:1:614 -453:1:615 -454:1:614 -455:1:615 -456:1:622 -457:0:4533 -458:1:11 -459:0:4533 -460:2:3975 -461:2:3976 -462:2:3977 -463:2:3989 -464:2:3990 -465:2:3994 -466:2:3995 -467:2:4003 -468:2:4008 -469:2:4012 -470:2:4013 -471:2:4021 -472:2:4022 -473:2:4026 -474:2:4027 -475:2:4021 -476:2:4022 -477:2:4026 -478:2:4027 -479:2:4035 -480:2:4040 -481:2:4041 -482:2:4052 -483:2:4053 -484:2:4054 -485:2:4065 -486:2:4070 -487:2:4071 -488:2:4082 -489:2:4083 -490:2:4084 -491:2:4082 -492:2:4083 -493:2:4084 -494:2:4095 -495:2:4103 -496:0:4533 -497:2:3127 -498:0:4533 -499:2:4109 -500:2:4110 -501:2:4114 -502:2:4115 -503:2:4123 -504:2:4124 -505:2:4128 -506:2:4129 -507:2:4137 -508:2:4142 -509:2:4146 -510:2:4147 -511:2:4155 -512:2:4156 -513:2:4160 -514:2:4161 -515:2:4155 -516:2:4156 -517:2:4160 -518:2:4161 -519:2:4169 -520:2:4174 -521:2:4175 -522:2:4186 -523:2:4187 -524:2:4188 -525:2:4199 -526:2:4204 -527:2:4205 -528:2:4216 -529:2:4217 -530:2:4218 -531:2:4216 -532:2:4217 -533:2:4218 -534:2:4229 -535:0:4533 -536:2:3127 -537:0:4533 -538:1:632 -539:1:633 -540:1:637 -541:1:638 -542:1:646 -543:1:647 -544:1:651 -545:1:652 -546:1:660 -547:1:665 -548:1:669 -549:1:670 -550:1:678 -551:1:679 -552:1:683 -553:1:684 -554:1:678 -555:1:679 -556:1:683 -557:1:684 -558:1:692 -559:1:697 -560:1:698 -561:1:709 -562:1:710 -563:1:711 -564:1:722 -565:1:727 -566:1:728 -567:1:739 -568:1:740 -569:1:741 -570:1:739 -571:1:740 -572:1:741 -573:1:752 -574:0:4533 -575:1:11 -576:0:4533 -577:2:3975 -578:2:3976 -579:2:3980 -580:2:3981 -581:2:3989 -582:2:3990 -583:2:3994 -584:2:3995 -585:2:4003 -586:2:4008 -587:2:4012 -588:2:4013 -589:2:4021 -590:2:4022 -591:2:4026 -592:2:4027 -593:2:4021 -594:2:4022 -595:2:4026 -596:2:4027 -597:2:4035 -598:2:4040 -599:2:4041 -600:2:4052 -601:2:4053 -602:2:4054 -603:2:4065 -604:2:4070 -605:2:4071 -606:2:4082 -607:2:4083 -608:2:4084 -609:2:4082 -610:2:4083 -611:2:4084 -612:2:4095 -613:2:4103 -614:0:4533 -615:2:3127 -616:0:4533 -617:2:4109 -618:2:4110 -619:2:4114 -620:2:4115 -621:2:4123 -622:2:4124 -623:2:4128 -624:2:4129 -625:2:4137 -626:2:4142 -627:2:4146 -628:2:4147 -629:2:4155 -630:2:4156 -631:2:4160 -632:2:4161 -633:2:4155 -634:2:4156 -635:2:4160 -636:2:4161 -637:2:4169 -638:2:4174 -639:2:4175 -640:2:4186 -641:2:4187 -642:2:4188 -643:2:4199 -644:2:4204 -645:2:4205 -646:2:4216 -647:2:4217 -648:2:4218 -649:2:4216 -650:2:4217 -651:2:4218 -652:2:4229 -653:0:4533 -654:2:3127 -655:0:4533 -656:1:761 -657:1:764 -658:1:765 -659:0:4533 -660:1:11 -661:0:4533 -662:2:3975 -663:2:3976 -664:2:3980 -665:2:3981 -666:2:3989 -667:2:3990 -668:2:3994 -669:2:3995 -670:2:4003 -671:2:4008 -672:2:4012 -673:2:4013 -674:2:4021 -675:2:4022 -676:2:4026 -677:2:4027 -678:2:4021 -679:2:4022 -680:2:4026 -681:2:4027 -682:2:4035 -683:2:4040 -684:2:4041 -685:2:4052 -686:2:4053 -687:2:4054 -688:2:4065 -689:2:4070 -690:2:4071 -691:2:4082 -692:2:4083 -693:2:4084 -694:2:4082 -695:2:4083 -696:2:4084 -697:2:4095 -698:2:4103 -699:0:4533 -700:2:3127 -701:0:4533 -702:2:4109 -703:2:4110 -704:2:4114 -705:2:4115 -706:2:4123 -707:2:4124 -708:2:4128 -709:2:4129 -710:2:4137 -711:2:4142 -712:2:4146 -713:2:4147 -714:2:4155 -715:2:4156 -716:2:4160 -717:2:4161 -718:2:4155 -719:2:4156 -720:2:4160 -721:2:4161 -722:2:4169 -723:2:4174 -724:2:4175 -725:2:4186 -726:2:4187 -727:2:4188 -728:2:4199 -729:2:4204 -730:2:4205 -731:2:4216 -732:2:4217 -733:2:4218 -734:2:4216 -735:2:4217 -736:2:4218 -737:2:4229 -738:0:4533 -739:2:3127 -740:0:4533 -741:1:768 -742:1:769 -743:1:773 -744:1:774 -745:1:782 -746:1:783 -747:1:787 -748:1:788 -749:1:796 -750:1:801 -751:1:805 -752:1:806 -753:1:814 -754:1:815 -755:1:819 -756:1:820 -757:1:814 -758:1:815 -759:1:819 -760:1:820 -761:1:828 -762:1:833 -763:1:834 -764:1:845 -765:1:846 -766:1:847 -767:1:858 -768:1:863 -769:1:864 -770:1:875 -771:1:876 -772:1:877 -773:1:875 -774:1:876 -775:1:877 -776:1:888 -777:0:4533 -778:1:11 -779:0:4533 -780:2:3975 -781:2:3976 -782:2:3980 -783:2:3981 -784:2:3989 -785:2:3990 -786:2:3994 -787:2:3995 -788:2:4003 -789:2:4008 -790:2:4012 -791:2:4013 -792:2:4021 -793:2:4022 -794:2:4026 -795:2:4027 -796:2:4021 -797:2:4022 -798:2:4026 -799:2:4027 -800:2:4035 -801:2:4040 -802:2:4041 -803:2:4052 -804:2:4053 -805:2:4054 -806:2:4065 -807:2:4070 -808:2:4071 -809:2:4082 -810:2:4083 -811:2:4084 -812:2:4082 -813:2:4083 -814:2:4084 -815:2:4095 -816:2:4103 -817:0:4533 -818:2:3127 -819:0:4533 -820:2:4109 -821:2:4110 -822:2:4114 -823:2:4115 -824:2:4123 -825:2:4124 -826:2:4128 -827:2:4129 -828:2:4137 -829:2:4142 -830:2:4146 -831:2:4147 -832:2:4155 -833:2:4156 -834:2:4160 -835:2:4161 -836:2:4155 -837:2:4156 -838:2:4160 -839:2:4161 -840:2:4169 -841:2:4174 -842:2:4175 -843:2:4186 -844:2:4187 -845:2:4188 -846:2:4199 -847:2:4204 -848:2:4205 -849:2:4216 -850:2:4217 -851:2:4218 -852:2:4216 -853:2:4217 -854:2:4218 -855:2:4229 -856:0:4533 -857:2:3127 -858:0:4533 -859:1:1028 -860:1:1029 -861:1:1033 -862:1:1034 -863:1:1042 -864:1:1043 -865:1:1047 -866:1:1048 -867:1:1056 -868:1:1061 -869:1:1065 -870:1:1066 -871:1:1074 -872:1:1075 -873:1:1079 -874:1:1080 -875:1:1074 -876:1:1075 -877:1:1079 -878:1:1080 -879:1:1088 -880:1:1093 -881:1:1094 -882:1:1105 -883:1:1106 -884:1:1107 -885:1:1118 -886:1:1123 -887:1:1124 -888:1:1135 -889:1:1136 -890:1:1137 -891:1:1135 -892:1:1136 -893:1:1137 -894:1:1148 -895:1:1155 -896:1:1159 -897:0:4533 -898:1:11 -899:0:4533 -900:2:3975 -901:2:3976 -902:2:3980 -903:2:3981 -904:2:3989 -905:2:3990 -906:2:3994 -907:2:3995 -908:2:4003 -909:2:4008 -910:2:4012 -911:2:4013 -912:2:4021 -913:2:4022 -914:2:4026 -915:2:4027 -916:2:4021 -917:2:4022 -918:2:4026 -919:2:4027 -920:2:4035 -921:2:4040 -922:2:4041 -923:2:4052 -924:2:4053 -925:2:4054 -926:2:4065 -927:2:4070 -928:2:4071 -929:2:4082 -930:2:4083 -931:2:4084 -932:2:4082 -933:2:4083 -934:2:4084 -935:2:4095 -936:2:4103 -937:0:4533 -938:2:3127 -939:0:4533 -940:2:4109 -941:2:4110 -942:2:4114 -943:2:4115 -944:2:4123 -945:2:4124 -946:2:4128 -947:2:4129 -948:2:4137 -949:2:4142 -950:2:4146 -951:2:4147 -952:2:4155 -953:2:4156 -954:2:4160 -955:2:4161 -956:2:4155 -957:2:4156 -958:2:4160 -959:2:4161 -960:2:4169 -961:2:4174 -962:2:4175 -963:2:4186 -964:2:4187 -965:2:4188 -966:2:4199 -967:2:4204 -968:2:4205 -969:2:4216 -970:2:4217 -971:2:4218 -972:2:4216 -973:2:4217 -974:2:4218 -975:2:4229 -976:0:4533 -977:2:3127 -978:0:4533 -979:1:1160 -980:1:1161 -981:1:1165 -982:1:1166 -983:1:1174 -984:1:1175 -985:1:1176 -986:1:1188 -987:1:1193 -988:1:1197 -989:1:1198 -990:1:1206 -991:1:1207 -992:1:1211 -993:1:1212 -994:1:1206 -995:1:1207 -996:1:1211 -997:1:1212 -998:1:1220 -999:1:1225 -1000:1:1226 -1001:1:1237 -1002:1:1238 -1003:1:1239 -1004:1:1250 -1005:1:1255 -1006:1:1256 -1007:1:1267 -1008:1:1268 -1009:1:1269 -1010:1:1267 -1011:1:1268 -1012:1:1269 -1013:1:1280 -1014:0:4533 -1015:1:11 -1016:0:4533 -1017:2:3975 -1018:2:3976 -1019:2:3980 -1020:2:3981 -1021:2:3989 -1022:2:3990 -1023:2:3994 -1024:2:3995 -1025:2:4003 -1026:2:4008 -1027:2:4012 -1028:2:4013 -1029:2:4021 -1030:2:4022 -1031:2:4026 -1032:2:4027 -1033:2:4021 -1034:2:4022 -1035:2:4026 -1036:2:4027 -1037:2:4035 -1038:2:4040 -1039:2:4041 -1040:2:4052 -1041:2:4053 -1042:2:4054 -1043:2:4065 -1044:2:4070 -1045:2:4071 -1046:2:4082 -1047:2:4083 -1048:2:4084 -1049:2:4082 -1050:2:4083 -1051:2:4084 -1052:2:4095 -1053:2:4103 -1054:0:4533 -1055:2:3127 -1056:0:4533 -1057:2:4109 -1058:2:4110 -1059:2:4114 -1060:2:4115 -1061:2:4123 -1062:2:4124 -1063:2:4128 -1064:2:4129 -1065:2:4137 -1066:2:4142 -1067:2:4146 -1068:2:4147 -1069:2:4155 -1070:2:4156 -1071:2:4160 -1072:2:4161 -1073:2:4155 -1074:2:4156 -1075:2:4160 -1076:2:4161 -1077:2:4169 -1078:2:4174 -1079:2:4175 -1080:2:4186 -1081:2:4187 -1082:2:4188 -1083:2:4199 -1084:2:4204 -1085:2:4205 -1086:2:4216 -1087:2:4217 -1088:2:4218 -1089:2:4216 -1090:2:4217 -1091:2:4218 -1092:2:4229 -1093:0:4533 -1094:2:3127 -1095:0:4533 -1096:1:1289 -1097:0:4533 -1098:2:3975 -1099:2:3976 -1100:2:3980 -1101:2:3981 -1102:2:3989 -1103:2:3990 -1104:2:3994 -1105:2:3995 -1106:2:4003 -1107:2:4008 -1108:2:4012 -1109:2:4013 -1110:2:4021 -1111:2:4022 -1112:2:4026 -1113:2:4027 -1114:2:4021 -1115:2:4022 -1116:2:4026 -1117:2:4027 -1118:2:4035 -1119:2:4040 -1120:2:4041 -1121:2:4052 -1122:2:4053 -1123:2:4054 -1124:2:4065 -1125:2:4070 -1126:2:4071 -1127:2:4082 -1128:2:4083 -1129:2:4084 -1130:2:4082 -1131:2:4083 -1132:2:4084 -1133:2:4095 -1134:2:4103 -1135:0:4533 -1136:2:3127 -1137:0:4533 -1138:2:4109 -1139:2:4110 -1140:2:4114 -1141:2:4115 -1142:2:4123 -1143:2:4124 -1144:2:4128 -1145:2:4129 -1146:2:4137 -1147:2:4142 -1148:2:4146 -1149:2:4147 -1150:2:4155 -1151:2:4156 -1152:2:4160 -1153:2:4161 -1154:2:4155 -1155:2:4156 -1156:2:4160 -1157:2:4161 -1158:2:4169 -1159:2:4174 -1160:2:4175 -1161:2:4186 -1162:2:4187 -1163:2:4188 -1164:2:4199 -1165:2:4204 -1166:2:4205 -1167:2:4216 -1168:2:4217 -1169:2:4218 -1170:2:4216 -1171:2:4217 -1172:2:4218 -1173:2:4229 -1174:0:4533 -1175:2:3127 -1176:0:4533 -1177:1:3023 -1178:1:3030 -1179:1:3031 -1180:1:3038 -1181:1:3043 -1182:1:3050 -1183:1:3051 -1184:1:3050 -1185:1:3051 -1186:1:3058 -1187:1:3062 -1188:0:4533 -1189:2:3975 -1190:2:3976 -1191:2:3980 -1192:2:3981 -1193:2:3989 -1194:2:3990 -1195:2:3994 -1196:2:3995 -1197:2:4003 -1198:2:4008 -1199:2:4012 -1200:2:4013 -1201:2:4021 -1202:2:4022 -1203:2:4026 -1204:2:4027 -1205:2:4021 -1206:2:4022 -1207:2:4026 -1208:2:4027 -1209:2:4035 -1210:2:4040 -1211:2:4041 -1212:2:4052 -1213:2:4053 -1214:2:4054 -1215:2:4065 -1216:2:4070 -1217:2:4071 -1218:2:4082 -1219:2:4083 -1220:2:4084 -1221:2:4082 -1222:2:4083 -1223:2:4084 -1224:2:4095 -1225:2:4103 -1226:0:4533 -1227:2:3127 -1228:0:4533 -1229:2:4109 -1230:2:4110 -1231:2:4114 -1232:2:4115 -1233:2:4123 -1234:2:4124 -1235:2:4128 -1236:2:4129 -1237:2:4137 -1238:2:4142 -1239:2:4146 -1240:2:4147 -1241:2:4155 -1242:2:4156 -1243:2:4160 -1244:2:4161 -1245:2:4155 -1246:2:4156 -1247:2:4160 -1248:2:4161 -1249:2:4169 -1250:2:4174 -1251:2:4175 -1252:2:4186 -1253:2:4187 -1254:2:4188 -1255:2:4199 -1256:2:4204 -1257:2:4205 -1258:2:4216 -1259:2:4217 -1260:2:4218 -1261:2:4216 -1262:2:4217 -1263:2:4218 -1264:2:4229 -1265:0:4533 -1266:2:3127 -1267:0:4533 -1268:1:1291 -1269:1:1292 -1270:0:4533 -1271:1:11 -1272:0:4533 -1273:2:3975 -1274:2:3976 -1275:2:3980 -1276:2:3981 -1277:2:3989 -1278:2:3990 -1279:2:3994 -1280:2:3995 -1281:2:4003 -1282:2:4008 -1283:2:4012 -1284:2:4013 -1285:2:4021 -1286:2:4022 -1287:2:4026 -1288:2:4027 -1289:2:4021 -1290:2:4022 -1291:2:4026 -1292:2:4027 -1293:2:4035 -1294:2:4040 -1295:2:4041 -1296:2:4052 -1297:2:4053 -1298:2:4054 -1299:2:4065 -1300:2:4070 -1301:2:4071 -1302:2:4082 -1303:2:4083 -1304:2:4084 -1305:2:4082 -1306:2:4083 -1307:2:4084 -1308:2:4095 -1309:2:4103 -1310:0:4533 -1311:2:3127 -1312:0:4533 -1313:2:4109 -1314:2:4110 -1315:2:4114 -1316:2:4115 -1317:2:4123 -1318:2:4124 -1319:2:4128 -1320:2:4129 -1321:2:4137 -1322:2:4142 -1323:2:4146 -1324:2:4147 -1325:2:4155 -1326:2:4156 -1327:2:4160 -1328:2:4161 -1329:2:4155 -1330:2:4156 -1331:2:4160 -1332:2:4161 -1333:2:4169 -1334:2:4174 -1335:2:4175 -1336:2:4186 -1337:2:4187 -1338:2:4188 -1339:2:4199 -1340:2:4204 -1341:2:4205 -1342:2:4216 -1343:2:4217 -1344:2:4218 -1345:2:4216 -1346:2:4217 -1347:2:4218 -1348:2:4229 -1349:0:4533 -1350:2:3127 -1351:0:4533 -1352:1:1293 -1353:1:1294 -1354:1:1298 -1355:1:1299 -1356:1:1307 -1357:1:1308 -1358:1:1312 -1359:1:1313 -1360:1:1321 -1361:1:1326 -1362:1:1330 -1363:1:1331 -1364:1:1339 -1365:1:1340 -1366:1:1344 -1367:1:1345 -1368:1:1339 -1369:1:1340 -1370:1:1344 -1371:1:1345 -1372:1:1353 -1373:1:1358 -1374:1:1359 -1375:1:1370 -1376:1:1371 -1377:1:1372 -1378:1:1383 -1379:1:1388 -1380:1:1389 -1381:1:1400 -1382:1:1401 -1383:1:1402 -1384:1:1400 -1385:1:1401 -1386:1:1402 -1387:1:1413 -1388:0:4533 -1389:1:11 -1390:0:4533 -1391:2:3975 -1392:2:3976 -1393:2:3980 -1394:2:3981 -1395:2:3989 -1396:2:3990 -1397:2:3994 -1398:2:3995 -1399:2:4003 -1400:2:4008 -1401:2:4012 -1402:2:4013 -1403:2:4021 -1404:2:4022 -1405:2:4026 -1406:2:4027 -1407:2:4021 -1408:2:4022 -1409:2:4026 -1410:2:4027 -1411:2:4035 -1412:2:4040 -1413:2:4041 -1414:2:4052 -1415:2:4053 -1416:2:4054 -1417:2:4065 -1418:2:4070 -1419:2:4071 -1420:2:4082 -1421:2:4083 -1422:2:4084 -1423:2:4082 -1424:2:4083 -1425:2:4084 -1426:2:4095 -1427:2:4103 -1428:0:4533 -1429:2:3127 -1430:0:4533 -1431:2:4109 -1432:2:4110 -1433:2:4114 -1434:2:4115 -1435:2:4123 -1436:2:4124 -1437:2:4128 -1438:2:4129 -1439:2:4137 -1440:2:4142 -1441:2:4146 -1442:2:4147 -1443:2:4155 -1444:2:4156 -1445:2:4160 -1446:2:4161 -1447:2:4155 -1448:2:4156 -1449:2:4160 -1450:2:4161 -1451:2:4169 -1452:2:4174 -1453:2:4175 -1454:2:4186 -1455:2:4187 -1456:2:4188 -1457:2:4199 -1458:2:4204 -1459:2:4205 -1460:2:4216 -1461:2:4217 -1462:2:4218 -1463:2:4216 -1464:2:4217 -1465:2:4218 -1466:2:4229 -1467:0:4533 -1468:2:3127 -1469:0:4533 -1470:1:1422 -1471:1:1423 -1472:1:1427 -1473:1:1428 -1474:1:1436 -1475:1:1437 -1476:1:1441 -1477:1:1442 -1478:1:1450 -1479:1:1455 -1480:1:1459 -1481:1:1460 -1482:1:1468 -1483:1:1469 -1484:1:1473 -1485:1:1474 -1486:1:1468 -1487:1:1469 -1488:1:1473 -1489:1:1474 -1490:1:1482 -1491:1:1487 -1492:1:1488 -1493:1:1499 -1494:1:1500 -1495:1:1501 -1496:1:1512 -1497:1:1517 -1498:1:1518 -1499:1:1529 -1500:1:1530 -1501:1:1531 -1502:1:1529 -1503:1:1530 -1504:1:1531 -1505:1:1542 -1506:1:1549 -1507:1:1553 -1508:0:4533 -1509:1:11 -1510:0:4533 -1511:2:3975 -1512:2:3976 -1513:2:3980 -1514:2:3981 -1515:2:3989 -1516:2:3990 -1517:2:3994 -1518:2:3995 -1519:2:4003 -1520:2:4008 -1521:2:4012 -1522:2:4013 -1523:2:4021 -1524:2:4022 -1525:2:4026 -1526:2:4027 -1527:2:4021 -1528:2:4022 -1529:2:4026 -1530:2:4027 -1531:2:4035 -1532:2:4040 -1533:2:4041 -1534:2:4052 -1535:2:4053 -1536:2:4054 -1537:2:4065 -1538:2:4070 -1539:2:4071 -1540:2:4082 -1541:2:4083 -1542:2:4084 -1543:2:4082 -1544:2:4083 -1545:2:4084 -1546:2:4095 -1547:2:4103 -1548:0:4533 -1549:2:3127 -1550:0:4533 -1551:2:4109 -1552:2:4110 -1553:2:4114 -1554:2:4115 -1555:2:4123 -1556:2:4124 -1557:2:4128 -1558:2:4129 -1559:2:4137 -1560:2:4142 -1561:2:4146 -1562:2:4147 -1563:2:4155 -1564:2:4156 -1565:2:4160 -1566:2:4161 -1567:2:4155 -1568:2:4156 -1569:2:4160 -1570:2:4161 -1571:2:4169 -1572:2:4174 -1573:2:4175 -1574:2:4186 -1575:2:4187 -1576:2:4188 -1577:2:4199 -1578:2:4204 -1579:2:4205 -1580:2:4216 -1581:2:4217 -1582:2:4218 -1583:2:4216 -1584:2:4217 -1585:2:4218 -1586:2:4229 -1587:0:4533 -1588:2:3127 -1589:0:4533 -1590:1:1554 -1591:1:1558 -1592:1:1559 -1593:1:1563 -1594:1:1564 -1595:1:1572 -1596:1:1580 -1597:1:1581 -1598:1:1585 -1599:1:1589 -1600:1:1590 -1601:1:1585 -1602:1:1589 -1603:1:1590 -1604:1:1594 -1605:1:1601 -1606:1:1608 -1607:1:1609 -1608:1:1616 -1609:1:1621 -1610:1:1628 -1611:1:1629 -1612:1:1628 -1613:1:1629 -1614:1:1636 -1615:0:4533 -1616:1:11 -1617:0:4533 -1618:2:3975 -1619:2:3976 -1620:2:3980 -1621:2:3981 -1622:2:3989 -1623:2:3990 -1624:2:3994 -1625:2:3995 -1626:2:4003 -1627:2:4008 -1628:2:4012 -1629:2:4013 -1630:2:4021 -1631:2:4022 -1632:2:4026 -1633:2:4027 -1634:2:4021 -1635:2:4022 -1636:2:4026 -1637:2:4027 -1638:2:4035 -1639:2:4040 -1640:2:4041 -1641:2:4052 -1642:2:4053 -1643:2:4054 -1644:2:4065 -1645:2:4070 -1646:2:4071 -1647:2:4082 -1648:2:4083 -1649:2:4084 -1650:2:4082 -1651:2:4083 -1652:2:4084 -1653:2:4095 -1654:2:4103 -1655:0:4533 -1656:2:3127 -1657:0:4533 -1658:2:4109 -1659:2:4110 -1660:2:4114 -1661:2:4115 -1662:2:4123 -1663:2:4124 -1664:2:4128 -1665:2:4129 -1666:2:4137 -1667:2:4142 -1668:2:4146 -1669:2:4147 -1670:2:4155 -1671:2:4156 -1672:2:4160 -1673:2:4161 -1674:2:4155 -1675:2:4156 -1676:2:4160 -1677:2:4161 -1678:2:4169 -1679:2:4174 -1680:2:4175 -1681:2:4186 -1682:2:4187 -1683:2:4188 -1684:2:4199 -1685:2:4204 -1686:2:4205 -1687:2:4216 -1688:2:4217 -1689:2:4218 -1690:2:4216 -1691:2:4217 -1692:2:4218 -1693:2:4229 -1694:0:4533 -1695:2:3127 -1696:0:4533 -1697:1:1646 -1698:1:1647 -1699:1:1651 -1700:1:1652 -1701:1:1660 -1702:1:1661 -1703:1:1665 -1704:1:1666 -1705:1:1674 -1706:1:1679 -1707:1:1683 -1708:1:1684 -1709:1:1692 -1710:1:1693 -1711:1:1697 -1712:1:1698 -1713:1:1692 -1714:1:1693 -1715:1:1697 -1716:1:1698 -1717:1:1706 -1718:1:1711 -1719:1:1712 -1720:1:1723 -1721:1:1724 -1722:1:1725 -1723:1:1736 -1724:1:1741 -1725:1:1742 -1726:1:1753 -1727:1:1754 -1728:1:1755 -1729:1:1753 -1730:1:1754 -1731:1:1755 -1732:1:1766 -1733:0:4533 -1734:1:11 -1735:0:4533 -1736:2:3975 -1737:2:3976 -1738:2:3980 -1739:2:3981 -1740:2:3989 -1741:2:3990 -1742:2:3994 -1743:2:3995 -1744:2:4003 -1745:2:4008 -1746:2:4012 -1747:2:4013 -1748:2:4021 -1749:2:4022 -1750:2:4026 -1751:2:4027 -1752:2:4021 -1753:2:4022 -1754:2:4026 -1755:2:4027 -1756:2:4035 -1757:2:4040 -1758:2:4041 -1759:2:4052 -1760:2:4053 -1761:2:4054 -1762:2:4065 -1763:2:4070 -1764:2:4071 -1765:2:4082 -1766:2:4083 -1767:2:4084 -1768:2:4082 -1769:2:4083 -1770:2:4084 -1771:2:4095 -1772:2:4103 -1773:0:4533 -1774:2:3127 -1775:0:4533 -1776:2:4109 -1777:2:4110 -1778:2:4114 -1779:2:4115 -1780:2:4123 -1781:2:4124 -1782:2:4128 -1783:2:4129 -1784:2:4137 -1785:2:4142 -1786:2:4146 -1787:2:4147 -1788:2:4155 -1789:2:4156 -1790:2:4160 -1791:2:4161 -1792:2:4155 -1793:2:4156 -1794:2:4160 -1795:2:4161 -1796:2:4169 -1797:2:4174 -1798:2:4175 -1799:2:4186 -1800:2:4187 -1801:2:4188 -1802:2:4199 -1803:2:4204 -1804:2:4205 -1805:2:4216 -1806:2:4217 -1807:2:4218 -1808:2:4216 -1809:2:4217 -1810:2:4218 -1811:2:4229 -1812:0:4533 -1813:2:3127 -1814:0:4533 -1815:1:1775 -1816:1:1776 -1817:1:1780 -1818:1:1781 -1819:1:1789 -1820:1:1790 -1821:1:1794 -1822:1:1795 -1823:1:1803 -1824:1:1808 -1825:1:1812 -1826:1:1813 -1827:1:1821 -1828:1:1822 -1829:1:1826 -1830:1:1827 -1831:1:1821 -1832:1:1822 -1833:1:1826 -1834:1:1827 -1835:1:1835 -1836:1:1840 -1837:1:1841 -1838:1:1852 -1839:1:1853 -1840:1:1854 -1841:1:1865 -1842:1:1870 -1843:1:1871 -1844:1:1882 -1845:1:1883 -1846:1:1884 -1847:1:1882 -1848:1:1883 -1849:1:1884 -1850:1:1895 -1851:1:1902 -1852:1:1906 -1853:0:4533 -1854:1:11 -1855:0:4533 -1856:2:3975 -1857:2:3976 -1858:2:3980 -1859:2:3981 -1860:2:3989 -1861:2:3990 -1862:2:3994 -1863:2:3995 -1864:2:4003 -1865:2:4008 -1866:2:4012 -1867:2:4013 -1868:2:4021 -1869:2:4022 -1870:2:4026 -1871:2:4027 -1872:2:4021 -1873:2:4022 -1874:2:4026 -1875:2:4027 -1876:2:4035 -1877:2:4040 -1878:2:4041 -1879:2:4052 -1880:2:4053 -1881:2:4054 -1882:2:4065 -1883:2:4070 -1884:2:4071 -1885:2:4082 -1886:2:4083 -1887:2:4084 -1888:2:4082 -1889:2:4083 -1890:2:4084 -1891:2:4095 -1892:2:4103 -1893:0:4533 -1894:2:3127 -1895:0:4533 -1896:2:4109 -1897:2:4110 -1898:2:4114 -1899:2:4115 -1900:2:4123 -1901:2:4124 -1902:2:4128 -1903:2:4129 -1904:2:4137 -1905:2:4142 -1906:2:4146 -1907:2:4147 -1908:2:4155 -1909:2:4156 -1910:2:4160 -1911:2:4161 -1912:2:4155 -1913:2:4156 -1914:2:4160 -1915:2:4161 -1916:2:4169 -1917:2:4174 -1918:2:4175 -1919:2:4186 -1920:2:4187 -1921:2:4188 -1922:2:4199 -1923:2:4204 -1924:2:4205 -1925:2:4216 -1926:2:4217 -1927:2:4218 -1928:2:4216 -1929:2:4217 -1930:2:4218 -1931:2:4229 -1932:0:4533 -1933:2:3127 -1934:0:4533 -1935:1:1907 -1936:1:1908 -1937:1:1912 -1938:1:1913 -1939:1:1921 -1940:1:1922 -1941:1:1923 -1942:1:1935 -1943:1:1940 -1944:1:1944 -1945:1:1945 -1946:1:1953 -1947:1:1954 -1948:1:1958 -1949:1:1959 -1950:1:1953 -1951:1:1954 -1952:1:1958 -1953:1:1959 -1954:1:1967 -1955:1:1972 -1956:1:1973 -1957:1:1984 -1958:1:1985 -1959:1:1986 -1960:1:1997 -1961:1:2002 -1962:1:2003 -1963:1:2014 -1964:1:2015 -1965:1:2016 -1966:1:2014 -1967:1:2015 -1968:1:2016 -1969:1:2027 -1970:0:4533 -1971:1:11 -1972:0:4533 -1973:2:3975 -1974:2:3976 -1975:2:3980 -1976:2:3981 -1977:2:3989 -1978:2:3990 -1979:2:3994 -1980:2:3995 -1981:2:4003 -1982:2:4008 -1983:2:4012 -1984:2:4013 -1985:2:4021 -1986:2:4022 -1987:2:4026 -1988:2:4027 -1989:2:4021 -1990:2:4022 -1991:2:4026 -1992:2:4027 -1993:2:4035 -1994:2:4040 -1995:2:4041 -1996:2:4052 -1997:2:4060 -1998:2:4061 -1999:2:4065 -2000:2:4070 -2001:2:4071 -2002:2:4082 -2003:2:4083 -2004:2:4084 -2005:2:4082 -2006:2:4083 -2007:2:4084 -2008:2:4095 -2009:2:4103 -2010:0:4533 -2011:2:3127 -2012:0:4533 -2013:2:4109 -2014:2:4110 -2015:2:4114 -2016:2:4115 -2017:2:4123 -2018:2:4124 -2019:2:4128 -2020:2:4129 -2021:2:4137 -2022:2:4142 -2023:2:4146 -2024:2:4147 -2025:2:4155 -2026:2:4156 -2027:2:4160 -2028:2:4161 -2029:2:4155 -2030:2:4156 -2031:2:4160 -2032:2:4161 -2033:2:4169 -2034:2:4174 -2035:2:4175 -2036:2:4186 -2037:2:4194 -2038:2:4195 -2039:2:4199 -2040:2:4204 -2041:2:4205 -2042:2:4216 -2043:2:4217 -2044:2:4218 -2045:2:4216 -2046:2:4217 -2047:2:4218 -2048:2:4229 -2049:0:4533 -2050:2:3127 -2051:0:4533 -2052:1:2036 -2053:1:2037 -2054:0:4533 -2055:1:11 -2056:0:4533 -2057:2:3975 -2058:2:3976 -2059:2:3980 -2060:2:3981 -2061:2:3989 -2062:2:3990 -2063:2:3994 -2064:2:3995 -2065:2:4003 -2066:2:4008 -2067:2:4012 -2068:2:4013 -2069:2:4021 -2070:2:4022 -2071:2:4026 -2072:2:4027 -2073:2:4021 -2074:2:4022 -2075:2:4026 -2076:2:4027 -2077:2:4035 -2078:2:4040 -2079:2:4041 -2080:2:4052 -2081:2:4060 -2082:2:4061 -2083:2:4065 -2084:2:4070 -2085:2:4071 -2086:2:4082 -2087:2:4083 -2088:2:4084 -2089:2:4082 -2090:2:4083 -2091:2:4084 -2092:2:4095 -2093:2:4103 -2094:0:4533 -2095:2:3127 -2096:0:4533 -2097:2:4109 -2098:2:4110 -2099:2:4114 -2100:2:4115 -2101:2:4123 -2102:2:4124 -2103:2:4128 -2104:2:4129 -2105:2:4137 -2106:2:4142 -2107:2:4146 -2108:2:4147 -2109:2:4155 -2110:2:4156 -2111:2:4160 -2112:2:4161 -2113:2:4155 -2114:2:4156 -2115:2:4160 -2116:2:4161 -2117:2:4169 -2118:2:4174 -2119:2:4175 -2120:2:4186 -2121:2:4194 -2122:2:4195 -2123:2:4199 -2124:2:4204 -2125:2:4205 -2126:2:4216 -2127:2:4217 -2128:2:4218 -2129:2:4216 -2130:2:4217 -2131:2:4218 -2132:2:4229 -2133:0:4533 -2134:2:3127 -2135:0:4533 -2136:1:2043 -2137:1:2044 -2138:1:2048 -2139:1:2049 -2140:1:2057 -2141:1:2058 -2142:1:2062 -2143:1:2063 -2144:1:2071 -2145:1:2076 -2146:1:2080 -2147:1:2081 -2148:1:2089 -2149:1:2090 -2150:1:2094 -2151:1:2095 -2152:1:2089 -2153:1:2090 -2154:1:2094 -2155:1:2095 -2156:1:2103 -2157:1:2108 -2158:1:2109 -2159:1:2120 -2160:1:2121 -2161:1:2122 -2162:1:2133 -2163:1:2138 -2164:1:2139 -2165:1:2150 -2166:1:2151 -2167:1:2152 -2168:1:2150 -2169:1:2151 -2170:1:2152 -2171:1:2163 -2172:0:4533 -2173:1:11 -2174:0:4533 -2175:2:3975 -2176:2:3976 -2177:2:3980 -2178:2:3981 -2179:2:3989 -2180:2:3990 -2181:2:3994 -2182:2:3995 -2183:2:4003 -2184:2:4008 -2185:2:4012 -2186:2:4013 -2187:2:4021 -2188:2:4022 -2189:2:4026 -2190:2:4027 -2191:2:4021 -2192:2:4022 -2193:2:4026 -2194:2:4027 -2195:2:4035 -2196:2:4040 -2197:2:4041 -2198:2:4052 -2199:2:4060 -2200:2:4061 -2201:2:4065 -2202:2:4070 -2203:2:4071 -2204:2:4082 -2205:2:4083 -2206:2:4084 -2207:2:4082 -2208:2:4083 -2209:2:4084 -2210:2:4095 -2211:2:4103 -2212:0:4533 -2213:2:3127 -2214:0:4533 -2215:2:4109 -2216:2:4110 -2217:2:4114 -2218:2:4115 -2219:2:4123 -2220:2:4124 -2221:2:4128 -2222:2:4129 -2223:2:4137 -2224:2:4142 -2225:2:4146 -2226:2:4147 -2227:2:4155 -2228:2:4156 -2229:2:4160 -2230:2:4161 -2231:2:4155 -2232:2:4156 -2233:2:4160 -2234:2:4161 -2235:2:4169 -2236:2:4174 -2237:2:4175 -2238:2:4186 -2239:2:4194 -2240:2:4195 -2241:2:4199 -2242:2:4204 -2243:2:4205 -2244:2:4216 -2245:2:4217 -2246:2:4218 -2247:2:4216 -2248:2:4217 -2249:2:4218 -2250:2:4229 -2251:0:4533 -2252:2:3127 -2253:0:4533 -2254:1:2172 -2255:1:2173 -2256:1:2177 -2257:1:2178 -2258:1:2186 -2259:1:2187 -2260:1:2191 -2261:1:2192 -2262:1:2200 -2263:1:2205 -2264:1:2209 -2265:1:2210 -2266:1:2218 -2267:1:2219 -2268:1:2223 -2269:1:2224 -2270:1:2218 -2271:1:2219 -2272:1:2223 -2273:1:2224 -2274:1:2232 -2275:1:2237 -2276:1:2238 -2277:1:2249 -2278:1:2250 -2279:1:2251 -2280:1:2262 -2281:1:2267 -2282:1:2268 -2283:1:2279 -2284:1:2280 -2285:1:2281 -2286:1:2279 -2287:1:2280 -2288:1:2281 -2289:1:2292 -2290:1:2299 -2291:0:4533 -2292:1:11 -2293:0:4533 -2294:2:3975 -2295:2:3976 -2296:2:3980 -2297:2:3981 -2298:2:3989 -2299:2:3990 -2300:2:3994 -2301:2:3995 -2302:2:4003 -2303:2:4008 -2304:2:4012 -2305:2:4013 -2306:2:4021 -2307:2:4022 -2308:2:4026 -2309:2:4027 -2310:2:4021 -2311:2:4022 -2312:2:4026 -2313:2:4027 -2314:2:4035 -2315:2:4040 -2316:2:4041 -2317:2:4052 -2318:2:4060 -2319:2:4061 -2320:2:4065 -2321:2:4070 -2322:2:4071 -2323:2:4082 -2324:2:4083 -2325:2:4084 -2326:2:4082 -2327:2:4083 -2328:2:4084 -2329:2:4095 -2330:2:4103 -2331:0:4533 -2332:2:3127 -2333:0:4533 -2334:2:4109 -2335:2:4110 -2336:2:4114 -2337:2:4115 -2338:2:4123 -2339:2:4124 -2340:2:4128 -2341:2:4129 -2342:2:4137 -2343:2:4142 -2344:2:4146 -2345:2:4147 -2346:2:4155 -2347:2:4156 -2348:2:4160 -2349:2:4161 -2350:2:4155 -2351:2:4156 -2352:2:4160 -2353:2:4161 -2354:2:4169 -2355:2:4174 -2356:2:4175 -2357:2:4186 -2358:2:4194 -2359:2:4195 -2360:2:4199 -2361:2:4204 -2362:2:4205 -2363:2:4216 -2364:2:4217 -2365:2:4218 -2366:2:4216 -2367:2:4217 -2368:2:4218 -2369:2:4229 -2370:0:4533 -2371:2:3127 -2372:0:4533 -2373:1:2435 -2374:1:2439 -2375:1:2440 -2376:1:2444 -2377:1:2445 -2378:1:2453 -2379:1:2461 -2380:1:2462 -2381:1:2466 -2382:1:2470 -2383:1:2471 -2384:1:2466 -2385:1:2470 -2386:1:2471 -2387:1:2475 -2388:1:2482 -2389:1:2489 -2390:1:2490 -2391:1:2497 -2392:1:2502 -2393:1:2509 -2394:1:2510 -2395:1:2509 -2396:1:2510 -2397:1:2517 -2398:0:4533 -2399:1:11 -2400:0:4533 -2401:2:3975 -2402:2:3976 -2403:2:3980 -2404:2:3981 -2405:2:3989 -2406:2:3990 -2407:2:3994 -2408:2:3995 -2409:2:4003 -2410:2:4008 -2411:2:4012 -2412:2:4013 -2413:2:4021 -2414:2:4022 -2415:2:4026 -2416:2:4027 -2417:2:4021 -2418:2:4022 -2419:2:4026 -2420:2:4027 -2421:2:4035 -2422:2:4040 -2423:2:4041 -2424:2:4052 -2425:2:4060 -2426:2:4061 -2427:2:4065 -2428:2:4070 -2429:2:4071 -2430:2:4082 -2431:2:4083 -2432:2:4084 -2433:2:4082 -2434:2:4083 -2435:2:4084 -2436:2:4095 -2437:2:4103 -2438:0:4533 -2439:2:3127 -2440:0:4533 -2441:2:4109 -2442:2:4110 -2443:2:4114 -2444:2:4115 -2445:2:4123 -2446:2:4124 -2447:2:4128 -2448:2:4129 -2449:2:4137 -2450:2:4142 -2451:2:4146 -2452:2:4147 -2453:2:4155 -2454:2:4156 -2455:2:4160 -2456:2:4161 -2457:2:4155 -2458:2:4156 -2459:2:4160 -2460:2:4161 -2461:2:4169 -2462:2:4174 -2463:2:4175 -2464:2:4186 -2465:2:4194 -2466:2:4195 -2467:2:4199 -2468:2:4204 -2469:2:4205 -2470:2:4216 -2471:2:4217 -2472:2:4218 -2473:2:4216 -2474:2:4217 -2475:2:4218 -2476:2:4229 -2477:0:4533 -2478:2:3127 -2479:0:4533 -2480:1:2527 -2481:1:2528 -2482:1:2532 -2483:1:2533 -2484:1:2541 -2485:1:2542 -2486:1:2546 -2487:1:2547 -2488:1:2555 -2489:1:2560 -2490:1:2564 -2491:1:2565 -2492:1:2573 -2493:1:2574 -2494:1:2578 -2495:1:2579 -2496:1:2573 -2497:1:2574 -2498:1:2578 -2499:1:2579 -2500:1:2587 -2501:1:2592 -2502:1:2593 -2503:1:2604 -2504:1:2605 -2505:1:2606 -2506:1:2617 -2507:1:2622 -2508:1:2623 -2509:1:2634 -2510:1:2635 -2511:1:2636 -2512:1:2634 -2513:1:2635 -2514:1:2636 -2515:1:2647 -2516:0:4533 -2517:1:11 -2518:0:4533 -2519:2:3975 -2520:2:3976 -2521:2:3980 -2522:2:3981 -2523:2:3989 -2524:2:3990 -2525:2:3994 -2526:2:3995 -2527:2:4003 -2528:2:4008 -2529:2:4012 -2530:2:4013 -2531:2:4021 -2532:2:4022 -2533:2:4026 -2534:2:4027 -2535:2:4021 -2536:2:4022 -2537:2:4026 -2538:2:4027 -2539:2:4035 -2540:2:4040 -2541:2:4041 -2542:2:4052 -2543:2:4060 -2544:2:4061 -2545:2:4065 -2546:2:4070 -2547:2:4071 -2548:2:4082 -2549:2:4083 -2550:2:4084 -2551:2:4082 -2552:2:4083 -2553:2:4084 -2554:2:4095 -2555:2:4103 -2556:0:4533 -2557:2:3127 -2558:0:4533 -2559:2:4109 -2560:2:4110 -2561:2:4114 -2562:2:4115 -2563:2:4123 -2564:2:4124 -2565:2:4128 -2566:2:4129 -2567:2:4137 -2568:2:4142 -2569:2:4146 -2570:2:4147 -2571:2:4155 -2572:2:4156 -2573:2:4160 -2574:2:4161 -2575:2:4155 -2576:2:4156 -2577:2:4160 -2578:2:4161 -2579:2:4169 -2580:2:4174 -2581:2:4175 -2582:2:4186 -2583:2:4194 -2584:2:4195 -2585:2:4199 -2586:2:4204 -2587:2:4205 -2588:2:4216 -2589:2:4217 -2590:2:4218 -2591:2:4216 -2592:2:4217 -2593:2:4218 -2594:2:4229 -2595:0:4533 -2596:2:3127 -2597:0:4533 -2598:1:2656 -2599:0:4533 -2600:2:3975 -2601:2:3976 -2602:2:3980 -2603:2:3981 -2604:2:3989 -2605:2:3990 -2606:2:3994 -2607:2:3995 -2608:2:4003 -2609:2:4008 -2610:2:4012 -2611:2:4013 -2612:2:4021 -2613:2:4022 -2614:2:4026 -2615:2:4027 -2616:2:4021 -2617:2:4022 -2618:2:4026 -2619:2:4027 -2620:2:4035 -2621:2:4040 -2622:2:4041 -2623:2:4052 -2624:2:4060 -2625:2:4061 -2626:2:4065 -2627:2:4070 -2628:2:4071 -2629:2:4082 -2630:2:4083 -2631:2:4084 -2632:2:4082 -2633:2:4083 -2634:2:4084 -2635:2:4095 -2636:2:4103 -2637:0:4533 -2638:2:3127 -2639:0:4533 -2640:2:4109 -2641:2:4110 -2642:2:4114 -2643:2:4115 -2644:2:4123 -2645:2:4124 -2646:2:4128 -2647:2:4129 -2648:2:4137 -2649:2:4142 -2650:2:4146 -2651:2:4147 -2652:2:4155 -2653:2:4156 -2654:2:4160 -2655:2:4161 -2656:2:4155 -2657:2:4156 -2658:2:4160 -2659:2:4161 -2660:2:4169 -2661:2:4174 -2662:2:4175 -2663:2:4186 -2664:2:4194 -2665:2:4195 -2666:2:4199 -2667:2:4204 -2668:2:4205 -2669:2:4216 -2670:2:4217 -2671:2:4218 -2672:2:4216 -2673:2:4217 -2674:2:4218 -2675:2:4229 -2676:0:4533 -2677:2:3127 -2678:0:4533 -2679:1:3066 -2680:1:3073 -2681:1:3074 -2682:1:3081 -2683:1:3086 -2684:1:3093 -2685:1:3094 -2686:1:3093 -2687:1:3094 -2688:1:3101 -2689:1:3105 -2690:0:4533 -2691:2:3975 -2692:2:3976 -2693:2:3980 -2694:2:3981 -2695:2:3989 -2696:2:3990 -2697:2:3994 -2698:2:3995 -2699:2:4003 -2700:2:4008 -2701:2:4012 -2702:2:4013 -2703:2:4021 -2704:2:4022 -2705:2:4026 -2706:2:4027 -2707:2:4021 -2708:2:4022 -2709:2:4026 -2710:2:4027 -2711:2:4035 -2712:2:4040 -2713:2:4041 -2714:2:4052 -2715:2:4060 -2716:2:4061 -2717:2:4065 -2718:2:4070 -2719:2:4071 -2720:2:4082 -2721:2:4083 -2722:2:4084 -2723:2:4082 -2724:2:4083 -2725:2:4084 -2726:2:4095 -2727:2:4103 -2728:0:4533 -2729:2:3127 -2730:0:4533 -2731:2:4109 -2732:2:4110 -2733:2:4114 -2734:2:4115 -2735:2:4123 -2736:2:4124 -2737:2:4128 -2738:2:4129 -2739:2:4137 -2740:2:4142 -2741:2:4146 -2742:2:4147 -2743:2:4155 -2744:2:4156 -2745:2:4160 -2746:2:4161 -2747:2:4155 -2748:2:4156 -2749:2:4160 -2750:2:4161 -2751:2:4169 -2752:2:4174 -2753:2:4175 -2754:2:4186 -2755:2:4194 -2756:2:4195 -2757:2:4199 -2758:2:4204 -2759:2:4205 -2760:2:4216 -2761:2:4217 -2762:2:4218 -2763:2:4216 -2764:2:4217 -2765:2:4218 -2766:2:4229 -2767:0:4533 -2768:2:3127 -2769:0:4533 -2770:1:2658 -2771:1:2659 -2772:0:4533 -2773:1:11 -2774:0:4533 -2775:2:3975 -2776:2:3976 -2777:2:3980 -2778:2:3981 -2779:2:3989 -2780:2:3990 -2781:2:3994 -2782:2:3995 -2783:2:4003 -2784:2:4008 -2785:2:4012 -2786:2:4013 -2787:2:4021 -2788:2:4022 -2789:2:4026 -2790:2:4027 -2791:2:4021 -2792:2:4022 -2793:2:4026 -2794:2:4027 -2795:2:4035 -2796:2:4040 -2797:2:4041 -2798:2:4052 -2799:2:4060 -2800:2:4061 -2801:2:4065 -2802:2:4070 -2803:2:4071 -2804:2:4082 -2805:2:4083 -2806:2:4084 -2807:2:4082 -2808:2:4083 -2809:2:4084 -2810:2:4095 -2811:2:4103 -2812:0:4533 -2813:2:3127 -2814:0:4533 -2815:2:4109 -2816:2:4110 -2817:2:4114 -2818:2:4115 -2819:2:4123 -2820:2:4124 -2821:2:4128 -2822:2:4129 -2823:2:4137 -2824:2:4142 -2825:2:4146 -2826:2:4147 -2827:2:4155 -2828:2:4156 -2829:2:4160 -2830:2:4161 -2831:2:4155 -2832:2:4156 -2833:2:4160 -2834:2:4161 -2835:2:4169 -2836:2:4174 -2837:2:4175 -2838:2:4186 -2839:2:4194 -2840:2:4195 -2841:2:4199 -2842:2:4204 -2843:2:4205 -2844:2:4216 -2845:2:4217 -2846:2:4218 -2847:2:4216 -2848:2:4217 -2849:2:4218 -2850:2:4229 -2851:0:4533 -2852:2:3127 -2853:0:4533 -2854:1:2660 -2855:1:2664 -2856:1:2665 -2857:1:2669 -2858:1:2673 -2859:1:2674 -2860:1:2678 -2861:1:2686 -2862:1:2687 -2863:1:2691 -2864:1:2695 -2865:1:2696 -2866:1:2691 -2867:1:2695 -2868:1:2696 -2869:1:2700 -2870:1:2707 -2871:1:2714 -2872:1:2715 -2873:1:2722 -2874:1:2727 -2875:1:2734 -2876:1:2735 -2877:1:2734 -2878:1:2735 -2879:1:2742 -2880:0:4533 -2881:1:11 -2882:0:4533 -2883:2:3975 -2884:2:3976 -2885:2:3980 -2886:2:3981 -2887:2:3989 -2888:2:3990 -2889:2:3994 -2890:2:3995 -2891:2:4003 -2892:2:4008 -2893:2:4012 -2894:2:4013 -2895:2:4021 -2896:2:4022 -2897:2:4026 -2898:2:4027 -2899:2:4021 -2900:2:4022 -2901:2:4026 -2902:2:4027 -2903:2:4035 -2904:2:4040 -2905:2:4041 -2906:2:4052 -2907:2:4060 -2908:2:4061 -2909:2:4065 -2910:2:4070 -2911:2:4071 -2912:2:4082 -2913:2:4083 -2914:2:4084 -2915:2:4082 -2916:2:4083 -2917:2:4084 -2918:2:4095 -2919:2:4103 -2920:0:4533 -2921:2:3127 -2922:0:4533 -2923:2:4109 -2924:2:4110 -2925:2:4114 -2926:2:4115 -2927:2:4123 -2928:2:4124 -2929:2:4128 -2930:2:4129 -2931:2:4137 -2932:2:4142 -2933:2:4146 -2934:2:4147 -2935:2:4155 -2936:2:4156 -2937:2:4160 -2938:2:4161 -2939:2:4155 -2940:2:4156 -2941:2:4160 -2942:2:4161 -2943:2:4169 -2944:2:4174 -2945:2:4175 -2946:2:4186 -2947:2:4194 -2948:2:4195 -2949:2:4199 -2950:2:4204 -2951:2:4205 -2952:2:4216 -2953:2:4217 -2954:2:4218 -2955:2:4216 -2956:2:4217 -2957:2:4218 -2958:2:4229 -2959:0:4533 -2960:2:3127 -2961:0:4533 -2962:1:2752 -2963:1:2753 -2964:1:2757 -2965:1:2758 -2966:1:2766 -2967:1:2767 -2968:1:2771 -2969:1:2772 -2970:1:2780 -2971:1:2785 -2972:1:2789 -2973:1:2790 -2974:1:2798 -2975:1:2799 -2976:1:2803 -2977:1:2804 -2978:1:2798 -2979:1:2799 -2980:1:2803 -2981:1:2804 -2982:1:2812 -2983:1:2817 -2984:1:2818 -2985:1:2829 -2986:1:2830 -2987:1:2831 -2988:1:2842 -2989:1:2847 -2990:1:2848 -2991:1:2859 -2992:1:2860 -2993:1:2861 -2994:1:2859 -2995:1:2860 -2996:1:2861 -2997:1:2872 -2998:0:4533 -2999:1:11 -3000:0:4533 -3001:2:3975 -3002:2:3976 -3003:2:3980 -3004:2:3981 -3005:2:3989 -3006:2:3990 -3007:2:3994 -3008:2:3995 -3009:2:4003 -3010:2:4008 -3011:2:4012 -3012:2:4013 -3013:2:4021 -3014:2:4022 -3015:2:4026 -3016:2:4027 -3017:2:4021 -3018:2:4022 -3019:2:4026 -3020:2:4027 -3021:2:4035 -3022:2:4040 -3023:2:4041 -3024:2:4052 -3025:2:4060 -3026:2:4061 -3027:2:4065 -3028:2:4070 -3029:2:4071 -3030:2:4082 -3031:2:4083 -3032:2:4084 -3033:2:4082 -3034:2:4083 -3035:2:4084 -3036:2:4095 -3037:2:4103 -3038:0:4533 -3039:2:3127 -3040:0:4533 -3041:2:4109 -3042:2:4110 -3043:2:4114 -3044:2:4115 -3045:2:4123 -3046:2:4124 -3047:2:4128 -3048:2:4129 -3049:2:4137 -3050:2:4142 -3051:2:4146 -3052:2:4147 -3053:2:4155 -3054:2:4156 -3055:2:4160 -3056:2:4161 -3057:2:4155 -3058:2:4156 -3059:2:4160 -3060:2:4161 -3061:2:4169 -3062:2:4174 -3063:2:4175 -3064:2:4186 -3065:2:4194 -3066:2:4195 -3067:2:4199 -3068:2:4204 -3069:2:4205 -3070:2:4216 -3071:2:4217 -3072:2:4218 -3073:2:4216 -3074:2:4217 -3075:2:4218 -3076:2:4229 -3077:0:4533 -3078:2:3127 -3079:0:4533 -3080:1:2881 -3081:1:2882 -3082:1:2886 -3083:1:2887 -3084:1:2895 -3085:1:2896 -3086:1:2900 -3087:1:2901 -3088:1:2909 -3089:1:2914 -3090:1:2918 -3091:1:2919 -3092:1:2927 -3093:1:2928 -3094:1:2932 -3095:1:2933 -3096:1:2927 -3097:1:2928 -3098:1:2932 -3099:1:2933 -3100:1:2941 -3101:1:2946 -3102:1:2947 -3103:1:2958 -3104:1:2959 -3105:1:2960 -3106:1:2971 -3107:1:2976 -3108:1:2977 -3109:1:2988 -3110:1:2989 -3111:1:2990 -3112:1:2988 -3113:1:2989 -3114:1:2990 -3115:1:3001 -3116:1:3008 -3117:1:3012 -3118:0:4533 -3119:1:11 -3120:0:4533 -3121:2:3975 -3122:2:3976 -3123:2:3980 -3124:2:3981 -3125:2:3989 -3126:2:3990 -3127:2:3994 -3128:2:3995 -3129:2:4003 -3130:2:4008 -3131:2:4012 -3132:2:4013 -3133:2:4021 -3134:2:4022 -3135:2:4026 -3136:2:4027 -3137:2:4021 -3138:2:4022 -3139:2:4026 -3140:2:4027 -3141:2:4035 -3142:2:4040 -3143:2:4041 -3144:2:4052 -3145:2:4060 -3146:2:4061 -3147:2:4065 -3148:2:4070 -3149:2:4071 -3150:2:4082 -3151:2:4083 -3152:2:4084 -3153:2:4082 -3154:2:4083 -3155:2:4084 -3156:2:4095 -3157:2:4103 -3158:0:4533 -3159:2:3127 -3160:0:4533 -3161:2:4109 -3162:2:4110 -3163:2:4114 -3164:2:4115 -3165:2:4123 -3166:2:4124 -3167:2:4128 -3168:2:4129 -3169:2:4137 -3170:2:4142 -3171:2:4146 -3172:2:4147 -3173:2:4155 -3174:2:4156 -3175:2:4160 -3176:2:4161 -3177:2:4155 -3178:2:4156 -3179:2:4160 -3180:2:4161 -3181:2:4169 -3182:2:4174 -3183:2:4175 -3184:2:4186 -3185:2:4194 -3186:2:4195 -3187:2:4199 -3188:2:4204 -3189:2:4205 -3190:2:4216 -3191:2:4217 -3192:2:4218 -3193:2:4216 -3194:2:4217 -3195:2:4218 -3196:2:4229 -3197:0:4533 -3198:2:3127 -3199:0:4533 -3200:1:3013 -3201:0:4533 -3202:1:3021 -3203:0:4533 -3204:1:3109 -3205:0:4533 -3206:1:9 -3207:0:4533 -3208:2:3975 -3209:2:3976 -3210:2:3980 -3211:2:3981 -3212:2:3989 -3213:2:3990 -3214:2:3994 -3215:2:3995 -3216:2:4003 -3217:2:4008 -3218:2:4012 -3219:2:4013 -3220:2:4021 -3221:2:4022 -3222:2:4026 -3223:2:4027 -3224:2:4021 -3225:2:4022 -3226:2:4026 -3227:2:4027 -3228:2:4035 -3229:2:4040 -3230:2:4041 -3231:2:4052 -3232:2:4060 -3233:2:4061 -3234:2:4065 -3235:2:4070 -3236:2:4071 -3237:2:4082 -3238:2:4083 -3239:2:4084 -3240:2:4082 -3241:2:4083 -3242:2:4084 -3243:2:4095 -3244:2:4103 -3245:0:4533 -3246:2:3127 -3247:0:4533 -3248:2:4109 -3249:2:4110 -3250:2:4114 -3251:2:4115 -3252:2:4123 -3253:2:4124 -3254:2:4128 -3255:2:4129 -3256:2:4137 -3257:2:4142 -3258:2:4146 -3259:2:4147 -3260:2:4155 -3261:2:4156 -3262:2:4160 -3263:2:4161 -3264:2:4155 -3265:2:4156 -3266:2:4160 -3267:2:4161 -3268:2:4169 -3269:2:4174 -3270:2:4175 -3271:2:4186 -3272:2:4194 -3273:2:4195 -3274:2:4199 -3275:2:4204 -3276:2:4205 -3277:2:4216 -3278:2:4217 -3279:2:4218 -3280:2:4216 -3281:2:4217 -3282:2:4218 -3283:2:4229 -3284:0:4533 -3285:2:3127 -3286:0:4533 -3287:1:10 -3288:0:4533 -3289:1:11 -3290:0:4533 -3291:2:3975 -3292:2:3976 -3293:2:3980 -3294:2:3981 -3295:2:3989 -3296:2:3990 -3297:2:3994 -3298:2:3995 -3299:2:4003 -3300:2:4008 -3301:2:4012 -3302:2:4013 -3303:2:4021 -3304:2:4022 -3305:2:4026 -3306:2:4027 -3307:2:4021 -3308:2:4022 -3309:2:4026 -3310:2:4027 -3311:2:4035 -3312:2:4040 -3313:2:4041 -3314:2:4052 -3315:2:4060 -3316:2:4061 -3317:2:4065 -3318:2:4070 -3319:2:4071 -3320:2:4082 -3321:2:4083 -3322:2:4084 -3323:2:4082 -3324:2:4083 -3325:2:4084 -3326:2:4095 -3327:2:4103 -3328:0:4533 -3329:2:3127 -3330:0:4533 -3331:2:4109 -3332:2:4110 -3333:2:4114 -3334:2:4115 -3335:2:4123 -3336:2:4124 -3337:2:4128 -3338:2:4129 -3339:2:4137 -3340:2:4142 -3341:2:4146 -3342:2:4147 -3343:2:4155 -3344:2:4156 -3345:2:4160 -3346:2:4161 -3347:2:4155 -3348:2:4156 -3349:2:4160 -3350:2:4161 -3351:2:4169 -3352:2:4174 -3353:2:4175 -3354:2:4186 -3355:2:4194 -3356:2:4195 -3357:2:4199 -3358:2:4204 -3359:2:4205 -3360:2:4216 -3361:2:4217 -3362:2:4218 -3363:2:4216 -3364:2:4217 -3365:2:4218 -3366:2:4229 -3367:0:4533 -3368:2:3127 -3369:0:4533 -3370:1:12 -3371:1:13 -3372:1:17 -3373:1:18 -3374:1:26 -3375:1:27 -3376:1:28 -3377:1:40 -3378:1:45 -3379:1:49 -3380:1:50 -3381:1:58 -3382:1:59 -3383:1:63 -3384:1:64 -3385:1:58 -3386:1:59 -3387:1:63 -3388:1:64 -3389:1:72 -3390:1:77 -3391:1:78 -3392:1:89 -3393:1:90 -3394:1:91 -3395:1:102 -3396:1:107 -3397:1:108 -3398:1:119 -3399:1:120 -3400:1:121 -3401:1:119 -3402:1:120 -3403:1:121 -3404:1:132 -3405:0:4533 -3406:1:11 -3407:0:4533 -3408:2:3975 -3409:2:3976 -3410:2:3980 -3411:2:3981 -3412:2:3989 -3413:2:3990 -3414:2:3994 -3415:2:3995 -3416:2:4003 -3417:2:4008 -3418:2:4012 -3419:2:4013 -3420:2:4021 -3421:2:4022 -3422:2:4026 -3423:2:4027 -3424:2:4021 -3425:2:4022 -3426:2:4026 -3427:2:4027 -3428:2:4035 -3429:2:4040 -3430:2:4041 -3431:2:4052 -3432:2:4060 -3433:2:4061 -3434:2:4065 -3435:2:4070 -3436:2:4071 -3437:2:4082 -3438:2:4083 -3439:2:4084 -3440:2:4082 -3441:2:4083 -3442:2:4084 -3443:2:4095 -3444:2:4103 -3445:0:4533 -3446:2:3127 -3447:0:4533 -3448:2:4109 -3449:2:4110 -3450:2:4114 -3451:2:4115 -3452:2:4123 -3453:2:4124 -3454:2:4128 -3455:2:4129 -3456:2:4137 -3457:2:4142 -3458:2:4146 -3459:2:4147 -3460:2:4155 -3461:2:4156 -3462:2:4160 -3463:2:4161 -3464:2:4155 -3465:2:4156 -3466:2:4160 -3467:2:4161 -3468:2:4169 -3469:2:4174 -3470:2:4175 -3471:2:4186 -3472:2:4194 -3473:2:4195 -3474:2:4199 -3475:2:4204 -3476:2:4205 -3477:2:4216 -3478:2:4217 -3479:2:4218 -3480:2:4216 -3481:2:4217 -3482:2:4218 -3483:2:4229 -3484:0:4533 -3485:2:3127 -3486:0:4533 -3487:1:141 -3488:1:142 -3489:0:4533 -3490:1:11 -3491:0:4533 -3492:2:3975 -3493:2:3976 -3494:2:3980 -3495:2:3981 -3496:2:3989 -3497:2:3990 -3498:2:3994 -3499:2:3995 -3500:2:4003 -3501:2:4008 -3502:2:4012 -3503:2:4013 -3504:2:4021 -3505:2:4022 -3506:2:4026 -3507:2:4027 -3508:2:4021 -3509:2:4022 -3510:2:4026 -3511:2:4027 -3512:2:4035 -3513:2:4040 -3514:2:4041 -3515:2:4052 -3516:2:4060 -3517:2:4061 -3518:2:4065 -3519:2:4070 -3520:2:4071 -3521:2:4082 -3522:2:4083 -3523:2:4084 -3524:2:4082 -3525:2:4083 -3526:2:4084 -3527:2:4095 -3528:2:4103 -3529:0:4533 -3530:2:3127 -3531:0:4533 -3532:2:4109 -3533:2:4110 -3534:2:4114 -3535:2:4115 -3536:2:4123 -3537:2:4124 -3538:2:4128 -3539:2:4129 -3540:2:4137 -3541:2:4142 -3542:2:4146 -3543:2:4147 -3544:2:4155 -3545:2:4156 -3546:2:4160 -3547:2:4161 -3548:2:4155 -3549:2:4156 -3550:2:4160 -3551:2:4161 -3552:2:4169 -3553:2:4174 -3554:2:4175 -3555:2:4186 -3556:2:4194 -3557:2:4195 -3558:2:4199 -3559:2:4204 -3560:2:4205 -3561:2:4216 -3562:2:4217 -3563:2:4218 -3564:2:4216 -3565:2:4217 -3566:2:4218 -3567:2:4229 -3568:0:4533 -3569:2:3127 -3570:0:4533 -3571:1:148 -3572:1:149 -3573:1:153 -3574:1:154 -3575:1:162 -3576:1:163 -3577:1:167 -3578:1:168 -3579:1:176 -3580:1:181 -3581:1:185 -3582:1:186 -3583:1:194 -3584:1:195 -3585:1:199 -3586:1:200 -3587:1:194 -3588:1:195 -3589:1:199 -3590:1:200 -3591:1:208 -3592:1:213 -3593:1:214 -3594:1:225 -3595:1:226 -3596:1:227 -3597:1:238 -3598:1:243 -3599:1:244 -3600:1:255 -3601:1:256 -3602:1:257 -3603:1:255 -3604:1:256 -3605:1:257 -3606:1:268 -3607:0:4533 -3608:1:11 -3609:0:4533 -3610:2:3975 -3611:2:3976 -3612:2:3980 -3613:2:3981 -3614:2:3989 -3615:2:3990 -3616:2:3994 -3617:2:3995 -3618:2:4003 -3619:2:4008 -3620:2:4012 -3621:2:4013 -3622:2:4021 -3623:2:4022 -3624:2:4026 -3625:2:4027 -3626:2:4021 -3627:2:4022 -3628:2:4026 -3629:2:4027 -3630:2:4035 -3631:2:4040 -3632:2:4041 -3633:2:4052 -3634:2:4060 -3635:2:4061 -3636:2:4065 -3637:2:4070 -3638:2:4071 -3639:2:4082 -3640:2:4083 -3641:2:4084 -3642:2:4082 -3643:2:4083 -3644:2:4084 -3645:2:4095 -3646:2:4103 -3647:0:4533 -3648:2:3127 -3649:0:4533 -3650:2:4109 -3651:2:4110 -3652:2:4114 -3653:2:4115 -3654:2:4123 -3655:2:4124 -3656:2:4128 -3657:2:4129 -3658:2:4137 -3659:2:4142 -3660:2:4146 -3661:2:4147 -3662:2:4155 -3663:2:4156 -3664:2:4160 -3665:2:4161 -3666:2:4155 -3667:2:4156 -3668:2:4160 -3669:2:4161 -3670:2:4169 -3671:2:4174 -3672:2:4175 -3673:2:4186 -3674:2:4194 -3675:2:4195 -3676:2:4199 -3677:2:4204 -3678:2:4205 -3679:2:4216 -3680:2:4217 -3681:2:4218 -3682:2:4216 -3683:2:4217 -3684:2:4218 -3685:2:4229 -3686:0:4533 -3687:2:3127 -3688:0:4533 -3689:1:277 -3690:1:278 -3691:1:282 -3692:1:283 -3693:1:291 -3694:1:292 -3695:1:296 -3696:1:297 -3697:1:305 -3698:1:310 -3699:1:314 -3700:1:315 -3701:1:323 -3702:1:324 -3703:1:328 -3704:1:329 -3705:1:323 -3706:1:324 -3707:1:328 -3708:1:329 -3709:1:337 -3710:1:342 -3711:1:343 -3712:1:354 -3713:1:355 -3714:1:356 -3715:1:367 -3716:1:372 -3717:1:373 -3718:1:384 -3719:1:385 -3720:1:386 -3721:1:384 -3722:1:385 -3723:1:386 -3724:1:397 -3725:1:404 -3726:0:4533 -3727:1:11 -3728:0:4533 -3729:2:3975 -3730:2:3976 -3731:2:3980 -3732:2:3981 -3733:2:3989 -3734:2:3990 -3735:2:3994 -3736:2:3995 -3737:2:4003 -3738:2:4008 -3739:2:4012 -3740:2:4013 -3741:2:4021 -3742:2:4022 -3743:2:4026 -3744:2:4027 -3745:2:4021 -3746:2:4022 -3747:2:4026 -3748:2:4027 -3749:2:4035 -3750:2:4040 -3751:2:4041 -3752:2:4052 -3753:2:4060 -3754:2:4061 -3755:2:4065 -3756:2:4070 -3757:2:4071 -3758:2:4082 -3759:2:4083 -3760:2:4084 -3761:2:4082 -3762:2:4083 -3763:2:4084 -3764:2:4095 -3765:2:4103 -3766:0:4533 -3767:2:3127 -3768:0:4533 -3769:2:4109 -3770:2:4110 -3771:2:4114 -3772:2:4115 -3773:2:4123 -3774:2:4124 -3775:2:4128 -3776:2:4129 -3777:2:4137 -3778:2:4142 -3779:2:4146 -3780:2:4147 -3781:2:4155 -3782:2:4156 -3783:2:4160 -3784:2:4161 -3785:2:4155 -3786:2:4156 -3787:2:4160 -3788:2:4161 -3789:2:4169 -3790:2:4174 -3791:2:4175 -3792:2:4186 -3793:2:4194 -3794:2:4195 -3795:2:4199 -3796:2:4204 -3797:2:4205 -3798:2:4216 -3799:2:4217 -3800:2:4218 -3801:2:4216 -3802:2:4217 -3803:2:4218 -3804:2:4229 -3805:0:4533 -3806:2:3127 -3807:0:4533 -3808:1:540 -3809:1:544 -3810:1:545 -3811:1:549 -3812:1:550 -3813:1:558 -3814:1:566 -3815:1:567 -3816:1:571 -3817:1:575 -3818:1:576 -3819:1:571 -3820:1:575 -3821:1:576 -3822:1:580 -3823:1:587 -3824:1:594 -3825:1:595 -3826:1:602 -3827:1:607 -3828:1:614 -3829:1:615 -3830:1:614 -3831:1:615 -3832:1:622 -3833:0:4533 -3834:1:11 -3835:0:4533 -3836:2:3975 -3837:2:3976 -3838:2:3980 -3839:2:3981 -3840:2:3989 -3841:2:3990 -3842:2:3994 -3843:2:3995 -3844:2:4003 -3845:2:4008 -3846:2:4012 -3847:2:4013 -3848:2:4021 -3849:2:4022 -3850:2:4026 -3851:2:4027 -3852:2:4021 -3853:2:4022 -3854:2:4026 -3855:2:4027 -3856:2:4035 -3857:2:4040 -3858:2:4041 -3859:2:4052 -3860:2:4060 -3861:2:4061 -3862:2:4065 -3863:2:4070 -3864:2:4071 -3865:2:4082 -3866:2:4083 -3867:2:4084 -3868:2:4082 -3869:2:4083 -3870:2:4084 -3871:2:4095 -3872:2:4103 -3873:0:4533 -3874:2:3127 -3875:0:4533 -3876:2:4109 -3877:2:4110 -3878:2:4114 -3879:2:4115 -3880:2:4123 -3881:2:4124 -3882:2:4128 -3883:2:4129 -3884:2:4137 -3885:2:4142 -3886:2:4146 -3887:2:4147 -3888:2:4155 -3889:2:4156 -3890:2:4160 -3891:2:4161 -3892:2:4155 -3893:2:4156 -3894:2:4160 -3895:2:4161 -3896:2:4169 -3897:2:4174 -3898:2:4175 -3899:2:4186 -3900:2:4194 -3901:2:4195 -3902:2:4199 -3903:2:4204 -3904:2:4205 -3905:2:4216 -3906:2:4217 -3907:2:4218 -3908:2:4216 -3909:2:4217 -3910:2:4218 -3911:2:4229 -3912:0:4533 -3913:2:3127 -3914:0:4533 -3915:1:632 -3916:1:633 -3917:1:637 -3918:1:638 -3919:1:646 -3920:1:647 -3921:1:651 -3922:1:652 -3923:1:660 -3924:1:665 -3925:1:669 -3926:1:670 -3927:1:678 -3928:1:679 -3929:1:683 -3930:1:684 -3931:1:678 -3932:1:679 -3933:1:683 -3934:1:684 -3935:1:692 -3936:1:697 -3937:1:698 -3938:1:709 -3939:1:710 -3940:1:711 -3941:1:722 -3942:1:727 -3943:1:728 -3944:1:739 -3945:1:740 -3946:1:741 -3947:1:739 -3948:1:740 -3949:1:741 -3950:1:752 -3951:0:4533 -3952:1:11 -3953:0:4533 -3954:2:3975 -3955:2:3976 -3956:2:3980 -3957:2:3981 -3958:2:3989 -3959:2:3990 -3960:2:3994 -3961:2:3995 -3962:2:4003 -3963:2:4008 -3964:2:4012 -3965:2:4013 -3966:2:4021 -3967:2:4022 -3968:2:4026 -3969:2:4027 -3970:2:4021 -3971:2:4022 -3972:2:4026 -3973:2:4027 -3974:2:4035 -3975:2:4040 -3976:2:4041 -3977:2:4052 -3978:2:4060 -3979:2:4061 -3980:2:4065 -3981:2:4070 -3982:2:4071 -3983:2:4082 -3984:2:4083 -3985:2:4084 -3986:2:4082 -3987:2:4083 -3988:2:4084 -3989:2:4095 -3990:2:4103 -3991:0:4533 -3992:2:3127 -3993:0:4533 -3994:2:4109 -3995:2:4110 -3996:2:4114 -3997:2:4115 -3998:2:4123 -3999:2:4124 -4000:2:4128 -4001:2:4129 -4002:2:4137 -4003:2:4142 -4004:2:4146 -4005:2:4147 -4006:2:4155 -4007:2:4156 -4008:2:4160 -4009:2:4161 -4010:2:4155 -4011:2:4156 -4012:2:4160 -4013:2:4161 -4014:2:4169 -4015:2:4174 -4016:2:4175 -4017:2:4186 -4018:2:4194 -4019:2:4195 -4020:2:4199 -4021:2:4204 -4022:2:4205 -4023:2:4216 -4024:2:4217 -4025:2:4218 -4026:2:4216 -4027:2:4217 -4028:2:4218 -4029:2:4229 -4030:0:4533 -4031:2:3127 -4032:0:4533 -4033:1:761 -4034:1:764 -4035:1:765 -4036:0:4533 -4037:1:11 -4038:0:4533 -4039:2:3975 -4040:2:3976 -4041:2:3980 -4042:2:3981 -4043:2:3989 -4044:2:3990 -4045:2:3994 -4046:2:3995 -4047:2:4003 -4048:2:4008 -4049:2:4012 -4050:2:4013 -4051:2:4021 -4052:2:4022 -4053:2:4026 -4054:2:4027 -4055:2:4021 -4056:2:4022 -4057:2:4026 -4058:2:4027 -4059:2:4035 -4060:2:4040 -4061:2:4041 -4062:2:4052 -4063:2:4060 -4064:2:4061 -4065:2:4065 -4066:2:4070 -4067:2:4071 -4068:2:4082 -4069:2:4083 -4070:2:4084 -4071:2:4082 -4072:2:4083 -4073:2:4084 -4074:2:4095 -4075:2:4103 -4076:0:4533 -4077:2:3127 -4078:0:4533 -4079:2:4109 -4080:2:4110 -4081:2:4114 -4082:2:4115 -4083:2:4123 -4084:2:4124 -4085:2:4128 -4086:2:4129 -4087:2:4137 -4088:2:4142 -4089:2:4146 -4090:2:4147 -4091:2:4155 -4092:2:4156 -4093:2:4160 -4094:2:4161 -4095:2:4155 -4096:2:4156 -4097:2:4160 -4098:2:4161 -4099:2:4169 -4100:2:4174 -4101:2:4175 -4102:2:4186 -4103:2:4194 -4104:2:4195 -4105:2:4199 -4106:2:4204 -4107:2:4205 -4108:2:4216 -4109:2:4217 -4110:2:4218 -4111:2:4216 -4112:2:4217 -4113:2:4218 -4114:2:4229 -4115:0:4533 -4116:2:3127 -4117:0:4533 -4118:1:768 -4119:1:769 -4120:1:773 -4121:1:774 -4122:1:782 -4123:1:783 -4124:1:787 -4125:1:788 -4126:1:796 -4127:1:801 -4128:1:805 -4129:1:806 -4130:1:814 -4131:1:815 -4132:1:819 -4133:1:820 -4134:1:814 -4135:1:815 -4136:1:819 -4137:1:820 -4138:1:828 -4139:1:833 -4140:1:834 -4141:1:845 -4142:1:846 -4143:1:847 -4144:1:858 -4145:1:863 -4146:1:864 -4147:1:875 -4148:1:876 -4149:1:877 -4150:1:875 -4151:1:876 -4152:1:877 -4153:1:888 -4154:0:4533 -4155:1:11 -4156:0:4533 -4157:2:3975 -4158:2:3976 -4159:2:3980 -4160:2:3981 -4161:2:3989 -4162:2:3990 -4163:2:3994 -4164:2:3995 -4165:2:4003 -4166:2:4008 -4167:2:4012 -4168:2:4013 -4169:2:4021 -4170:2:4022 -4171:2:4026 -4172:2:4027 -4173:2:4021 -4174:2:4022 -4175:2:4026 -4176:2:4027 -4177:2:4035 -4178:2:4040 -4179:2:4041 -4180:2:4052 -4181:2:4060 -4182:2:4061 -4183:2:4065 -4184:2:4070 -4185:2:4071 -4186:2:4082 -4187:2:4083 -4188:2:4084 -4189:2:4082 -4190:2:4083 -4191:2:4084 -4192:2:4095 -4193:2:4103 -4194:0:4533 -4195:2:3127 -4196:0:4533 -4197:2:4109 -4198:2:4110 -4199:2:4114 -4200:2:4115 -4201:2:4123 -4202:2:4124 -4203:2:4128 -4204:2:4129 -4205:2:4137 -4206:2:4142 -4207:2:4146 -4208:2:4147 -4209:2:4155 -4210:2:4156 -4211:2:4160 -4212:2:4161 -4213:2:4155 -4214:2:4156 -4215:2:4160 -4216:2:4161 -4217:2:4169 -4218:2:4174 -4219:2:4175 -4220:2:4186 -4221:2:4194 -4222:2:4195 -4223:2:4199 -4224:2:4204 -4225:2:4205 -4226:2:4216 -4227:2:4217 -4228:2:4218 -4229:2:4216 -4230:2:4217 -4231:2:4218 -4232:2:4229 -4233:0:4533 -4234:2:3127 -4235:0:4533 -4236:1:1028 -4237:1:1029 -4238:1:1033 -4239:1:1034 -4240:1:1042 -4241:1:1043 -4242:1:1047 -4243:1:1048 -4244:1:1056 -4245:1:1061 -4246:1:1065 -4247:1:1066 -4248:1:1074 -4249:1:1075 -4250:1:1079 -4251:1:1080 -4252:1:1074 -4253:1:1075 -4254:1:1079 -4255:1:1080 -4256:1:1088 -4257:1:1093 -4258:1:1094 -4259:1:1105 -4260:1:1106 -4261:1:1107 -4262:1:1118 -4263:1:1123 -4264:1:1124 -4265:1:1135 -4266:1:1136 -4267:1:1137 -4268:1:1135 -4269:1:1136 -4270:1:1137 -4271:1:1148 -4272:1:1155 -4273:1:1159 -4274:0:4533 -4275:1:11 -4276:0:4533 -4277:2:3975 -4278:2:3976 -4279:2:3980 -4280:2:3981 -4281:2:3989 -4282:2:3990 -4283:2:3994 -4284:2:3995 -4285:2:4003 -4286:2:4008 -4287:2:4012 -4288:2:4013 -4289:2:4021 -4290:2:4022 -4291:2:4026 -4292:2:4027 -4293:2:4021 -4294:2:4022 -4295:2:4026 -4296:2:4027 -4297:2:4035 -4298:2:4040 -4299:2:4041 -4300:2:4052 -4301:2:4060 -4302:2:4061 -4303:2:4065 -4304:2:4070 -4305:2:4071 -4306:2:4082 -4307:2:4083 -4308:2:4084 -4309:2:4082 -4310:2:4083 -4311:2:4084 -4312:2:4095 -4313:2:4103 -4314:0:4533 -4315:2:3127 -4316:0:4533 -4317:2:4109 -4318:2:4110 -4319:2:4114 -4320:2:4115 -4321:2:4123 -4322:2:4124 -4323:2:4128 -4324:2:4129 -4325:2:4137 -4326:2:4142 -4327:2:4146 -4328:2:4147 -4329:2:4155 -4330:2:4156 -4331:2:4160 -4332:2:4161 -4333:2:4155 -4334:2:4156 -4335:2:4160 -4336:2:4161 -4337:2:4169 -4338:2:4174 -4339:2:4175 -4340:2:4186 -4341:2:4194 -4342:2:4195 -4343:2:4199 -4344:2:4204 -4345:2:4205 -4346:2:4216 -4347:2:4217 -4348:2:4218 -4349:2:4216 -4350:2:4217 -4351:2:4218 -4352:2:4229 -4353:0:4533 -4354:2:3127 -4355:0:4533 -4356:1:1160 -4357:1:1161 -4358:1:1165 -4359:1:1166 -4360:1:1174 -4361:1:1175 -4362:1:1176 -4363:1:1188 -4364:1:1193 -4365:1:1197 -4366:1:1198 -4367:1:1206 -4368:1:1207 -4369:1:1211 -4370:1:1212 -4371:1:1206 -4372:1:1207 -4373:1:1211 -4374:1:1212 -4375:1:1220 -4376:1:1225 -4377:1:1226 -4378:1:1237 -4379:1:1238 -4380:1:1239 -4381:1:1250 -4382:1:1255 -4383:1:1256 -4384:1:1267 -4385:1:1268 -4386:1:1269 -4387:1:1267 -4388:1:1268 -4389:1:1269 -4390:1:1280 -4391:0:4533 -4392:1:11 -4393:0:4533 -4394:2:3975 -4395:2:3976 -4396:2:3980 -4397:2:3981 -4398:2:3989 -4399:2:3990 -4400:2:3994 -4401:2:3995 -4402:2:4003 -4403:2:4008 -4404:2:4012 -4405:2:4013 -4406:2:4021 -4407:2:4022 -4408:2:4026 -4409:2:4027 -4410:2:4021 -4411:2:4022 -4412:2:4026 -4413:2:4027 -4414:2:4035 -4415:2:4040 -4416:2:4041 -4417:2:4052 -4418:2:4060 -4419:2:4061 -4420:2:4065 -4421:2:4070 -4422:2:4071 -4423:2:4082 -4424:2:4083 -4425:2:4084 -4426:2:4082 -4427:2:4083 -4428:2:4084 -4429:2:4095 -4430:2:4103 -4431:0:4533 -4432:2:3127 -4433:0:4533 -4434:2:4109 -4435:2:4110 -4436:2:4114 -4437:2:4115 -4438:2:4123 -4439:2:4124 -4440:2:4128 -4441:2:4129 -4442:2:4137 -4443:2:4142 -4444:2:4146 -4445:2:4147 -4446:2:4155 -4447:2:4156 -4448:2:4160 -4449:2:4161 -4450:2:4155 -4451:2:4156 -4452:2:4160 -4453:2:4161 -4454:2:4169 -4455:2:4174 -4456:2:4175 -4457:2:4186 -4458:2:4194 -4459:2:4195 -4460:2:4199 -4461:2:4204 -4462:2:4205 -4463:2:4216 -4464:2:4217 -4465:2:4218 -4466:2:4216 -4467:2:4217 -4468:2:4218 -4469:2:4229 -4470:0:4533 -4471:2:3127 -4472:0:4533 -4473:1:1289 -4474:0:4533 -4475:2:3975 -4476:2:3976 -4477:2:3980 -4478:2:3981 -4479:2:3989 -4480:2:3990 -4481:2:3994 -4482:2:3995 -4483:2:4003 -4484:2:4008 -4485:2:4012 -4486:2:4013 -4487:2:4021 -4488:2:4022 -4489:2:4026 -4490:2:4027 -4491:2:4021 -4492:2:4022 -4493:2:4026 -4494:2:4027 -4495:2:4035 -4496:2:4040 -4497:2:4041 -4498:2:4052 -4499:2:4060 -4500:2:4061 -4501:2:4065 -4502:2:4070 -4503:2:4071 -4504:2:4082 -4505:2:4083 -4506:2:4084 -4507:2:4082 -4508:2:4083 -4509:2:4084 -4510:2:4095 -4511:2:4103 -4512:0:4533 -4513:2:3127 -4514:0:4533 -4515:2:4109 -4516:2:4110 -4517:2:4114 -4518:2:4115 -4519:2:4123 -4520:2:4124 -4521:2:4128 -4522:2:4129 -4523:2:4137 -4524:2:4142 -4525:2:4146 -4526:2:4147 -4527:2:4155 -4528:2:4156 -4529:2:4160 -4530:2:4161 -4531:2:4155 -4532:2:4156 -4533:2:4160 -4534:2:4161 -4535:2:4169 -4536:2:4174 -4537:2:4175 -4538:2:4186 -4539:2:4194 -4540:2:4195 -4541:2:4199 -4542:2:4204 -4543:2:4205 -4544:2:4216 -4545:2:4217 -4546:2:4218 -4547:2:4216 -4548:2:4217 -4549:2:4218 -4550:2:4229 -4551:0:4533 -4552:2:3127 -4553:0:4533 -4554:1:3023 -4555:1:3030 -4556:1:3031 -4557:1:3038 -4558:1:3043 -4559:1:3050 -4560:1:3051 -4561:1:3050 -4562:1:3051 -4563:1:3058 -4564:1:3062 -4565:0:4533 -4566:2:3975 -4567:2:3976 -4568:2:3980 -4569:2:3981 -4570:2:3989 -4571:2:3990 -4572:2:3994 -4573:2:3995 -4574:2:4003 -4575:2:4008 -4576:2:4012 -4577:2:4013 -4578:2:4021 -4579:2:4022 -4580:2:4026 -4581:2:4027 -4582:2:4021 -4583:2:4022 -4584:2:4026 -4585:2:4027 -4586:2:4035 -4587:2:4040 -4588:2:4041 -4589:2:4052 -4590:2:4060 -4591:2:4061 -4592:2:4065 -4593:2:4070 -4594:2:4071 -4595:2:4082 -4596:2:4083 -4597:2:4084 -4598:2:4082 -4599:2:4083 -4600:2:4084 -4601:2:4095 -4602:2:4103 -4603:0:4533 -4604:2:3127 -4605:0:4533 -4606:2:4109 -4607:2:4110 -4608:2:4114 -4609:2:4115 -4610:2:4123 -4611:2:4124 -4612:2:4128 -4613:2:4129 -4614:2:4137 -4615:2:4142 -4616:2:4146 -4617:2:4147 -4618:2:4155 -4619:2:4156 -4620:2:4160 -4621:2:4161 -4622:2:4155 -4623:2:4156 -4624:2:4160 -4625:2:4161 -4626:2:4169 -4627:2:4174 -4628:2:4175 -4629:2:4186 -4630:2:4194 -4631:2:4195 -4632:2:4199 -4633:2:4204 -4634:2:4205 -4635:2:4216 -4636:2:4217 -4637:2:4218 -4638:2:4216 -4639:2:4217 -4640:2:4218 -4641:2:4229 -4642:0:4533 -4643:2:3127 -4644:0:4533 -4645:1:1291 -4646:1:1292 -4647:0:4533 -4648:1:11 -4649:0:4533 -4650:2:3975 -4651:2:3976 -4652:2:3980 -4653:2:3981 -4654:2:3989 -4655:2:3990 -4656:2:3994 -4657:2:3995 -4658:2:4003 -4659:2:4008 -4660:2:4012 -4661:2:4013 -4662:2:4021 -4663:2:4022 -4664:2:4026 -4665:2:4027 -4666:2:4021 -4667:2:4022 -4668:2:4026 -4669:2:4027 -4670:2:4035 -4671:2:4040 -4672:2:4041 -4673:2:4052 -4674:2:4060 -4675:2:4061 -4676:2:4065 -4677:2:4070 -4678:2:4071 -4679:2:4082 -4680:2:4083 -4681:2:4084 -4682:2:4082 -4683:2:4083 -4684:2:4084 -4685:2:4095 -4686:2:4103 -4687:0:4533 -4688:2:3127 -4689:0:4533 -4690:2:4109 -4691:2:4110 -4692:2:4114 -4693:2:4115 -4694:2:4123 -4695:2:4124 -4696:2:4128 -4697:2:4129 -4698:2:4137 -4699:2:4142 -4700:2:4146 -4701:2:4147 -4702:2:4155 -4703:2:4156 -4704:2:4160 -4705:2:4161 -4706:2:4155 -4707:2:4156 -4708:2:4160 -4709:2:4161 -4710:2:4169 -4711:2:4174 -4712:2:4175 -4713:2:4186 -4714:2:4194 -4715:2:4195 -4716:2:4199 -4717:2:4204 -4718:2:4205 -4719:2:4216 -4720:2:4217 -4721:2:4218 -4722:2:4216 -4723:2:4217 -4724:2:4218 -4725:2:4229 -4726:0:4533 -4727:2:3127 -4728:0:4533 -4729:1:1293 -4730:1:1294 -4731:1:1298 -4732:1:1299 -4733:1:1307 -4734:1:1308 -4735:1:1312 -4736:1:1313 -4737:1:1321 -4738:1:1326 -4739:1:1330 -4740:1:1331 -4741:1:1339 -4742:1:1340 -4743:1:1344 -4744:1:1345 -4745:1:1339 -4746:1:1340 -4747:1:1344 -4748:1:1345 -4749:1:1353 -4750:1:1358 -4751:1:1359 -4752:1:1370 -4753:1:1371 -4754:1:1372 -4755:1:1383 -4756:1:1388 -4757:1:1389 -4758:1:1400 -4759:1:1401 -4760:1:1402 -4761:1:1400 -4762:1:1401 -4763:1:1402 -4764:1:1413 -4765:0:4533 -4766:1:11 -4767:0:4533 -4768:2:3975 -4769:2:3976 -4770:2:3980 -4771:2:3981 -4772:2:3989 -4773:2:3990 -4774:2:3994 -4775:2:3995 -4776:2:4003 -4777:2:4008 -4778:2:4012 -4779:2:4013 -4780:2:4021 -4781:2:4022 -4782:2:4026 -4783:2:4027 -4784:2:4021 -4785:2:4022 -4786:2:4026 -4787:2:4027 -4788:2:4035 -4789:2:4040 -4790:2:4041 -4791:2:4052 -4792:2:4060 -4793:2:4061 -4794:2:4065 -4795:2:4070 -4796:2:4071 -4797:2:4082 -4798:2:4083 -4799:2:4084 -4800:2:4082 -4801:2:4083 -4802:2:4084 -4803:2:4095 -4804:2:4103 -4805:0:4533 -4806:2:3127 -4807:0:4533 -4808:2:4109 -4809:2:4110 -4810:2:4114 -4811:2:4115 -4812:2:4123 -4813:2:4124 -4814:2:4128 -4815:2:4129 -4816:2:4137 -4817:2:4142 -4818:2:4146 -4819:2:4147 -4820:2:4155 -4821:2:4156 -4822:2:4160 -4823:2:4161 -4824:2:4155 -4825:2:4156 -4826:2:4160 -4827:2:4161 -4828:2:4169 -4829:2:4174 -4830:2:4175 -4831:2:4186 -4832:2:4194 -4833:2:4195 -4834:2:4199 -4835:2:4204 -4836:2:4205 -4837:2:4216 -4838:2:4217 -4839:2:4218 -4840:2:4216 -4841:2:4217 -4842:2:4218 -4843:2:4229 -4844:0:4533 -4845:2:3127 -4846:0:4533 -4847:1:1422 -4848:1:1423 -4849:1:1427 -4850:1:1428 -4851:1:1436 -4852:1:1437 -4853:1:1441 -4854:1:1442 -4855:1:1450 -4856:1:1455 -4857:1:1459 -4858:1:1460 -4859:1:1468 -4860:1:1469 -4861:1:1473 -4862:1:1474 -4863:1:1468 -4864:1:1469 -4865:1:1473 -4866:1:1474 -4867:1:1482 -4868:1:1487 -4869:1:1488 -4870:1:1499 -4871:1:1500 -4872:1:1501 -4873:1:1512 -4874:1:1517 -4875:1:1518 -4876:1:1529 -4877:1:1530 -4878:1:1531 -4879:1:1529 -4880:1:1530 -4881:1:1531 -4882:1:1542 -4883:1:1549 -4884:1:1553 -4885:0:4533 -4886:1:11 -4887:0:4533 -4888:2:3975 -4889:2:3976 -4890:2:3980 -4891:2:3981 -4892:2:3989 -4893:2:3990 -4894:2:3994 -4895:2:3995 -4896:2:4003 -4897:2:4008 -4898:2:4012 -4899:2:4013 -4900:2:4021 -4901:2:4022 -4902:2:4026 -4903:2:4027 -4904:2:4021 -4905:2:4022 -4906:2:4026 -4907:2:4027 -4908:2:4035 -4909:2:4040 -4910:2:4041 -4911:2:4052 -4912:2:4060 -4913:2:4061 -4914:2:4065 -4915:2:4070 -4916:2:4071 -4917:2:4082 -4918:2:4083 -4919:2:4084 -4920:2:4082 -4921:2:4083 -4922:2:4084 -4923:2:4095 -4924:2:4103 -4925:0:4533 -4926:2:3127 -4927:0:4533 -4928:2:4109 -4929:2:4110 -4930:2:4114 -4931:2:4115 -4932:2:4123 -4933:2:4124 -4934:2:4128 -4935:2:4129 -4936:2:4137 -4937:2:4142 -4938:2:4146 -4939:2:4147 -4940:2:4155 -4941:2:4156 -4942:2:4160 -4943:2:4161 -4944:2:4155 -4945:2:4156 -4946:2:4160 -4947:2:4161 -4948:2:4169 -4949:2:4174 -4950:2:4175 -4951:2:4186 -4952:2:4194 -4953:2:4195 -4954:2:4199 -4955:2:4204 -4956:2:4205 -4957:2:4216 -4958:2:4217 -4959:2:4218 -4960:2:4216 -4961:2:4217 -4962:2:4218 -4963:2:4229 -4964:0:4533 -4965:2:3127 -4966:0:4533 -4967:1:1554 -4968:1:1558 -4969:1:1559 -4970:1:1563 -4971:1:1564 -4972:1:1572 -4973:1:1580 -4974:1:1581 -4975:1:1585 -4976:1:1589 -4977:1:1590 -4978:1:1585 -4979:1:1589 -4980:1:1590 -4981:1:1594 -4982:1:1601 -4983:1:1608 -4984:1:1609 -4985:1:1616 -4986:1:1621 -4987:1:1628 -4988:1:1629 -4989:1:1628 -4990:1:1629 -4991:1:1636 -4992:0:4533 -4993:1:11 -4994:0:4533 -4995:2:3975 -4996:2:3976 -4997:2:3980 -4998:2:3981 -4999:2:3989 -5000:2:3990 -5001:2:3994 -5002:2:3995 -5003:2:4003 -5004:2:4008 -5005:2:4012 -5006:2:4013 -5007:2:4021 -5008:2:4022 -5009:2:4026 -5010:2:4027 -5011:2:4021 -5012:2:4022 -5013:2:4026 -5014:2:4027 -5015:2:4035 -5016:2:4040 -5017:2:4041 -5018:2:4052 -5019:2:4060 -5020:2:4061 -5021:2:4065 -5022:2:4070 -5023:2:4071 -5024:2:4082 -5025:2:4083 -5026:2:4084 -5027:2:4082 -5028:2:4083 -5029:2:4084 -5030:2:4095 -5031:2:4103 -5032:0:4533 -5033:2:3127 -5034:0:4533 -5035:2:4109 -5036:2:4110 -5037:2:4114 -5038:2:4115 -5039:2:4123 -5040:2:4124 -5041:2:4128 -5042:2:4129 -5043:2:4137 -5044:2:4142 -5045:2:4146 -5046:2:4147 -5047:2:4155 -5048:2:4156 -5049:2:4160 -5050:2:4161 -5051:2:4155 -5052:2:4156 -5053:2:4160 -5054:2:4161 -5055:2:4169 -5056:2:4174 -5057:2:4175 -5058:2:4186 -5059:2:4194 -5060:2:4195 -5061:2:4199 -5062:2:4204 -5063:2:4205 -5064:2:4216 -5065:2:4217 -5066:2:4218 -5067:2:4216 -5068:2:4217 -5069:2:4218 -5070:2:4229 -5071:0:4533 -5072:2:3127 -5073:0:4533 -5074:1:1646 -5075:1:1647 -5076:1:1651 -5077:1:1652 -5078:1:1660 -5079:1:1661 -5080:1:1665 -5081:1:1666 -5082:1:1674 -5083:1:1679 -5084:1:1683 -5085:1:1684 -5086:1:1692 -5087:1:1693 -5088:1:1697 -5089:1:1698 -5090:1:1692 -5091:1:1693 -5092:1:1697 -5093:1:1698 -5094:1:1706 -5095:1:1711 -5096:1:1712 -5097:1:1723 -5098:1:1724 -5099:1:1725 -5100:1:1736 -5101:1:1741 -5102:1:1742 -5103:1:1753 -5104:1:1754 -5105:1:1755 -5106:1:1753 -5107:1:1754 -5108:1:1755 -5109:1:1766 -5110:0:4533 -5111:1:11 -5112:0:4533 -5113:2:3975 -5114:2:3976 -5115:2:3980 -5116:2:3981 -5117:2:3989 -5118:2:3990 -5119:2:3994 -5120:2:3995 -5121:2:4003 -5122:2:4008 -5123:2:4012 -5124:2:4013 -5125:2:4021 -5126:2:4022 -5127:2:4026 -5128:2:4027 -5129:2:4021 -5130:2:4022 -5131:2:4026 -5132:2:4027 -5133:2:4035 -5134:2:4040 -5135:2:4041 -5136:2:4052 -5137:2:4060 -5138:2:4061 -5139:2:4065 -5140:2:4070 -5141:2:4071 -5142:2:4082 -5143:2:4083 -5144:2:4084 -5145:2:4082 -5146:2:4083 -5147:2:4084 -5148:2:4095 -5149:2:4103 -5150:0:4533 -5151:2:3127 -5152:0:4533 -5153:2:4109 -5154:2:4110 -5155:2:4114 -5156:2:4115 -5157:2:4123 -5158:2:4124 -5159:2:4128 -5160:2:4129 -5161:2:4137 -5162:2:4142 -5163:2:4146 -5164:2:4147 -5165:2:4155 -5166:2:4156 -5167:2:4160 -5168:2:4161 -5169:2:4155 -5170:2:4156 -5171:2:4160 -5172:2:4161 -5173:2:4169 -5174:2:4174 -5175:2:4175 -5176:2:4186 -5177:2:4194 -5178:2:4195 -5179:2:4199 -5180:2:4204 -5181:2:4205 -5182:2:4216 -5183:2:4217 -5184:2:4218 -5185:2:4216 -5186:2:4217 -5187:2:4218 -5188:2:4229 -5189:0:4533 -5190:2:3127 -5191:0:4533 -5192:1:1775 -5193:1:1776 -5194:1:1780 -5195:1:1781 -5196:1:1789 -5197:1:1790 -5198:1:1794 -5199:1:1795 -5200:1:1803 -5201:1:1808 -5202:1:1812 -5203:1:1813 -5204:1:1821 -5205:1:1822 -5206:1:1826 -5207:1:1827 -5208:1:1821 -5209:1:1822 -5210:1:1826 -5211:1:1827 -5212:1:1835 -5213:1:1840 -5214:1:1841 -5215:1:1852 -5216:1:1853 -5217:1:1854 -5218:1:1865 -5219:1:1870 -5220:1:1871 -5221:1:1882 -5222:1:1883 -5223:1:1884 -5224:1:1882 -5225:1:1883 -5226:1:1884 -5227:1:1895 -5228:1:1902 -5229:1:1906 -5230:0:4533 -5231:1:11 -5232:0:4533 -5233:2:3975 -5234:2:3976 -5235:2:3980 -5236:2:3981 -5237:2:3989 -5238:2:3990 -5239:2:3994 -5240:2:3995 -5241:2:4003 -5242:2:4008 -5243:2:4012 -5244:2:4013 -5245:2:4021 -5246:2:4022 -5247:2:4026 -5248:2:4027 -5249:2:4021 -5250:2:4022 -5251:2:4026 -5252:2:4027 -5253:2:4035 -5254:2:4040 -5255:2:4041 -5256:2:4052 -5257:2:4060 -5258:2:4061 -5259:2:4065 -5260:2:4070 -5261:2:4071 -5262:2:4082 -5263:2:4083 -5264:2:4084 -5265:2:4082 -5266:2:4083 -5267:2:4084 -5268:2:4095 -5269:2:4103 -5270:0:4533 -5271:2:3127 -5272:0:4533 -5273:2:4109 -5274:2:4110 -5275:2:4114 -5276:2:4115 -5277:2:4123 -5278:2:4124 -5279:2:4128 -5280:2:4129 -5281:2:4137 -5282:2:4142 -5283:2:4146 -5284:2:4147 -5285:2:4155 -5286:2:4156 -5287:2:4160 -5288:2:4161 -5289:2:4155 -5290:2:4156 -5291:2:4160 -5292:2:4161 -5293:2:4169 -5294:2:4174 -5295:2:4175 -5296:2:4186 -5297:2:4194 -5298:2:4195 -5299:2:4199 -5300:2:4204 -5301:2:4205 -5302:2:4216 -5303:2:4217 -5304:2:4218 -5305:2:4216 -5306:2:4217 -5307:2:4218 -5308:2:4229 -5309:0:4533 -5310:2:3127 -5311:0:4533 -5312:1:1907 -5313:1:1908 -5314:1:1912 -5315:1:1913 -5316:1:1921 -5317:1:1922 -5318:1:1923 -5319:1:1935 -5320:1:1940 -5321:1:1944 -5322:1:1945 -5323:1:1953 -5324:1:1954 -5325:1:1958 -5326:1:1959 -5327:1:1953 -5328:1:1954 -5329:1:1958 -5330:1:1959 -5331:1:1967 -5332:1:1972 -5333:1:1973 -5334:1:1984 -5335:1:1985 -5336:1:1986 -5337:1:1997 -5338:1:2002 -5339:1:2003 -5340:1:2014 -5341:1:2015 -5342:1:2016 -5343:1:2014 -5344:1:2015 -5345:1:2016 -5346:1:2027 -5347:0:4533 -5348:1:11 -5349:0:4533 -5350:2:3975 -5351:2:3976 -5352:2:3980 -5353:2:3981 -5354:2:3989 -5355:2:3990 -5356:2:3994 -5357:2:3995 -5358:2:4003 -5359:2:4008 -5360:2:4012 -5361:2:4013 -5362:2:4021 -5363:2:4022 -5364:2:4026 -5365:2:4027 -5366:2:4021 -5367:2:4022 -5368:2:4026 -5369:2:4027 -5370:2:4035 -5371:2:4040 -5372:2:4041 -5373:2:4052 -5374:2:4060 -5375:2:4061 -5376:2:4065 -5377:2:4070 -5378:2:4071 -5379:2:4082 -5380:2:4083 -5381:2:4084 -5382:2:4082 -5383:2:4083 -5384:2:4084 -5385:2:4095 -5386:2:4103 -5387:0:4533 -5388:2:3127 -5389:0:4533 -5390:2:4109 -5391:2:4110 -5392:2:4114 -5393:2:4115 -5394:2:4123 -5395:2:4124 -5396:2:4128 -5397:2:4129 -5398:2:4137 -5399:2:4142 -5400:2:4146 -5401:2:4147 -5402:2:4155 -5403:2:4156 -5404:2:4160 -5405:2:4161 -5406:2:4155 -5407:2:4156 -5408:2:4160 -5409:2:4161 -5410:2:4169 -5411:2:4174 -5412:2:4175 -5413:2:4186 -5414:2:4194 -5415:2:4195 -5416:2:4199 -5417:2:4204 -5418:2:4205 -5419:2:4216 -5420:2:4217 -5421:2:4218 -5422:2:4216 -5423:2:4217 -5424:2:4218 -5425:2:4229 -5426:0:4533 -5427:2:3127 -5428:0:4533 -5429:1:2036 -5430:1:2037 -5431:0:4533 -5432:1:11 -5433:0:4533 -5434:2:3975 -5435:2:3976 -5436:2:3980 -5437:2:3981 -5438:2:3989 -5439:2:3990 -5440:2:3994 -5441:2:3995 -5442:2:4003 -5443:2:4008 -5444:2:4012 -5445:2:4013 -5446:2:4021 -5447:2:4022 -5448:2:4026 -5449:2:4027 -5450:2:4021 -5451:2:4022 -5452:2:4026 -5453:2:4027 -5454:2:4035 -5455:2:4040 -5456:2:4041 -5457:2:4052 -5458:2:4060 -5459:2:4061 -5460:2:4065 -5461:2:4070 -5462:2:4071 -5463:2:4082 -5464:2:4083 -5465:2:4084 -5466:2:4082 -5467:2:4083 -5468:2:4084 -5469:2:4095 -5470:2:4103 -5471:0:4533 -5472:2:3127 -5473:0:4533 -5474:2:4109 -5475:2:4110 -5476:2:4114 -5477:2:4115 -5478:2:4123 -5479:2:4124 -5480:2:4128 -5481:2:4129 -5482:2:4137 -5483:2:4142 -5484:2:4146 -5485:2:4147 -5486:2:4155 -5487:2:4156 -5488:2:4160 -5489:2:4161 -5490:2:4155 -5491:2:4156 -5492:2:4160 -5493:2:4161 -5494:2:4169 -5495:2:4174 -5496:2:4175 -5497:2:4186 -5498:2:4194 -5499:2:4195 -5500:2:4199 -5501:2:4204 -5502:2:4205 -5503:2:4216 -5504:2:4217 -5505:2:4218 -5506:2:4216 -5507:2:4217 -5508:2:4218 -5509:2:4229 -5510:0:4533 -5511:2:3127 -5512:0:4533 -5513:1:2043 -5514:1:2044 -5515:1:2048 -5516:1:2049 -5517:1:2057 -5518:1:2058 -5519:1:2062 -5520:1:2063 -5521:1:2071 -5522:1:2076 -5523:1:2080 -5524:1:2081 -5525:1:2089 -5526:1:2090 -5527:1:2094 -5528:1:2095 -5529:1:2089 -5530:1:2090 -5531:1:2094 -5532:1:2095 -5533:1:2103 -5534:1:2108 -5535:1:2109 -5536:1:2120 -5537:1:2121 -5538:1:2122 -5539:1:2133 -5540:1:2138 -5541:1:2139 -5542:1:2150 -5543:1:2151 -5544:1:2152 -5545:1:2150 -5546:1:2151 -5547:1:2152 -5548:1:2163 -5549:0:4533 -5550:1:11 -5551:0:4533 -5552:2:3975 -5553:2:3976 -5554:2:3980 -5555:2:3981 -5556:2:3989 -5557:2:3990 -5558:2:3994 -5559:2:3995 -5560:2:4003 -5561:2:4008 -5562:2:4012 -5563:2:4013 -5564:2:4021 -5565:2:4022 -5566:2:4026 -5567:2:4027 -5568:2:4021 -5569:2:4022 -5570:2:4026 -5571:2:4027 -5572:2:4035 -5573:2:4040 -5574:2:4041 -5575:2:4052 -5576:2:4060 -5577:2:4061 -5578:2:4065 -5579:2:4070 -5580:2:4071 -5581:2:4082 -5582:2:4083 -5583:2:4084 -5584:2:4082 -5585:2:4083 -5586:2:4084 -5587:2:4095 -5588:2:4103 -5589:0:4533 -5590:2:3127 -5591:0:4533 -5592:2:4109 -5593:2:4110 -5594:2:4114 -5595:2:4115 -5596:2:4123 -5597:2:4124 -5598:2:4128 -5599:2:4129 -5600:2:4137 -5601:2:4142 -5602:2:4146 -5603:2:4147 -5604:2:4155 -5605:2:4156 -5606:2:4160 -5607:2:4161 -5608:2:4155 -5609:2:4156 -5610:2:4160 -5611:2:4161 -5612:2:4169 -5613:2:4174 -5614:2:4175 -5615:2:4186 -5616:2:4194 -5617:2:4195 -5618:2:4199 -5619:2:4204 -5620:2:4205 -5621:2:4216 -5622:2:4217 -5623:2:4218 -5624:2:4216 -5625:2:4217 -5626:2:4218 -5627:2:4229 -5628:0:4533 -5629:2:3127 -5630:0:4533 -5631:1:2172 -5632:1:2173 -5633:1:2177 -5634:1:2178 -5635:1:2186 -5636:1:2187 -5637:1:2191 -5638:1:2192 -5639:1:2200 -5640:1:2205 -5641:1:2209 -5642:1:2210 -5643:1:2218 -5644:1:2219 -5645:1:2223 -5646:1:2224 -5647:1:2218 -5648:1:2219 -5649:1:2223 -5650:1:2224 -5651:1:2232 -5652:1:2237 -5653:1:2238 -5654:1:2249 -5655:1:2250 -5656:1:2251 -5657:1:2262 -5658:1:2267 -5659:1:2268 -5660:1:2279 -5661:1:2280 -5662:1:2281 -5663:1:2279 -5664:1:2280 -5665:1:2281 -5666:1:2292 -5667:1:2299 -5668:0:4533 -5669:1:11 -5670:0:4533 -5671:2:3975 -5672:2:3976 -5673:2:3980 -5674:2:3981 -5675:2:3989 -5676:2:3990 -5677:2:3994 -5678:2:3995 -5679:2:4003 -5680:2:4008 -5681:2:4012 -5682:2:4013 -5683:2:4021 -5684:2:4022 -5685:2:4026 -5686:2:4027 -5687:2:4021 -5688:2:4022 -5689:2:4026 -5690:2:4027 -5691:2:4035 -5692:2:4040 -5693:2:4041 -5694:2:4052 -5695:2:4060 -5696:2:4061 -5697:2:4065 -5698:2:4070 -5699:2:4071 -5700:2:4082 -5701:2:4083 -5702:2:4084 -5703:2:4082 -5704:2:4083 -5705:2:4084 -5706:2:4095 -5707:2:4103 -5708:0:4533 -5709:2:3127 -5710:0:4533 -5711:2:4109 -5712:2:4110 -5713:2:4114 -5714:2:4115 -5715:2:4123 -5716:2:4124 -5717:2:4128 -5718:2:4129 -5719:2:4137 -5720:2:4142 -5721:2:4146 -5722:2:4147 -5723:2:4155 -5724:2:4156 -5725:2:4160 -5726:2:4161 -5727:2:4155 -5728:2:4156 -5729:2:4160 -5730:2:4161 -5731:2:4169 -5732:2:4174 -5733:2:4175 -5734:2:4186 -5735:2:4194 -5736:2:4195 -5737:2:4199 -5738:2:4204 -5739:2:4205 -5740:2:4216 -5741:2:4217 -5742:2:4218 -5743:2:4216 -5744:2:4217 -5745:2:4218 -5746:2:4229 -5747:0:4533 -5748:2:3127 -5749:0:4533 -5750:1:2435 -5751:1:2439 -5752:1:2440 -5753:1:2444 -5754:1:2445 -5755:1:2453 -5756:1:2461 -5757:1:2462 -5758:1:2466 -5759:1:2470 -5760:1:2471 -5761:1:2466 -5762:1:2470 -5763:1:2471 -5764:1:2475 -5765:1:2482 -5766:1:2489 -5767:1:2490 -5768:1:2497 -5769:1:2502 -5770:1:2509 -5771:1:2510 -5772:1:2509 -5773:1:2510 -5774:1:2517 -5775:0:4533 -5776:1:11 -5777:0:4533 -5778:2:3975 -5779:2:3976 -5780:2:3980 -5781:2:3981 -5782:2:3989 -5783:2:3990 -5784:2:3994 -5785:2:3995 -5786:2:4003 -5787:2:4008 -5788:2:4012 -5789:2:4013 -5790:2:4021 -5791:2:4022 -5792:2:4026 -5793:2:4027 -5794:2:4021 -5795:2:4022 -5796:2:4026 -5797:2:4027 -5798:2:4035 -5799:2:4040 -5800:2:4041 -5801:2:4052 -5802:2:4060 -5803:2:4061 -5804:2:4065 -5805:2:4070 -5806:2:4071 -5807:2:4082 -5808:2:4083 -5809:2:4084 -5810:2:4082 -5811:2:4083 -5812:2:4084 -5813:2:4095 -5814:2:4103 -5815:0:4533 -5816:2:3127 -5817:0:4533 -5818:2:4109 -5819:2:4110 -5820:2:4114 -5821:2:4115 -5822:2:4123 -5823:2:4124 -5824:2:4128 -5825:2:4129 -5826:2:4137 -5827:2:4142 -5828:2:4146 -5829:2:4147 -5830:2:4155 -5831:2:4156 -5832:2:4160 -5833:2:4161 -5834:2:4155 -5835:2:4156 -5836:2:4160 -5837:2:4161 -5838:2:4169 -5839:2:4174 -5840:2:4175 -5841:2:4186 -5842:2:4194 -5843:2:4195 -5844:2:4199 -5845:2:4204 -5846:2:4205 -5847:2:4216 -5848:2:4217 -5849:2:4218 -5850:2:4216 -5851:2:4217 -5852:2:4218 -5853:2:4229 -5854:0:4533 -5855:2:3127 -5856:0:4533 -5857:1:2527 -5858:1:2528 -5859:1:2532 -5860:1:2533 -5861:1:2541 -5862:1:2542 -5863:1:2546 -5864:1:2547 -5865:1:2555 -5866:1:2560 -5867:1:2564 -5868:1:2565 -5869:1:2573 -5870:1:2574 -5871:1:2578 -5872:1:2579 -5873:1:2573 -5874:1:2574 -5875:1:2578 -5876:1:2579 -5877:1:2587 -5878:1:2592 -5879:1:2593 -5880:1:2604 -5881:1:2605 -5882:1:2606 -5883:1:2617 -5884:1:2622 -5885:1:2623 -5886:1:2634 -5887:1:2635 -5888:1:2636 -5889:1:2634 -5890:1:2635 -5891:1:2636 -5892:1:2647 -5893:0:4533 -5894:1:11 -5895:0:4533 -5896:2:3975 -5897:2:3976 -5898:2:3980 -5899:2:3981 -5900:2:3989 -5901:2:3990 -5902:2:3994 -5903:2:3995 -5904:2:4003 -5905:2:4008 -5906:2:4012 -5907:2:4013 -5908:2:4021 -5909:2:4022 -5910:2:4026 -5911:2:4027 -5912:2:4021 -5913:2:4022 -5914:2:4026 -5915:2:4027 -5916:2:4035 -5917:2:4040 -5918:2:4041 -5919:2:4052 -5920:2:4060 -5921:2:4061 -5922:2:4065 -5923:2:4070 -5924:2:4071 -5925:2:4082 -5926:2:4083 -5927:2:4084 -5928:2:4082 -5929:2:4083 -5930:2:4084 -5931:2:4095 -5932:2:4103 -5933:0:4533 -5934:2:3127 -5935:0:4533 -5936:2:4109 -5937:2:4110 -5938:2:4114 -5939:2:4115 -5940:2:4123 -5941:2:4124 -5942:2:4128 -5943:2:4129 -5944:2:4137 -5945:2:4142 -5946:2:4146 -5947:2:4147 -5948:2:4155 -5949:2:4156 -5950:2:4160 -5951:2:4161 -5952:2:4155 -5953:2:4156 -5954:2:4160 -5955:2:4161 -5956:2:4169 -5957:2:4174 -5958:2:4175 -5959:2:4186 -5960:2:4194 -5961:2:4195 -5962:2:4199 -5963:2:4204 -5964:2:4205 -5965:2:4216 -5966:2:4217 -5967:2:4218 -5968:2:4216 -5969:2:4217 -5970:2:4218 -5971:2:4229 -5972:0:4533 -5973:2:3127 -5974:0:4533 -5975:1:2656 -5976:0:4533 -5977:2:3975 -5978:2:3976 -5979:2:3980 -5980:2:3981 -5981:2:3989 -5982:2:3990 -5983:2:3994 -5984:2:3995 -5985:2:4003 -5986:2:4008 -5987:2:4012 -5988:2:4013 -5989:2:4021 -5990:2:4022 -5991:2:4026 -5992:2:4027 -5993:2:4021 -5994:2:4022 -5995:2:4026 -5996:2:4027 -5997:2:4035 -5998:2:4040 -5999:2:4041 -6000:2:4052 -6001:2:4060 -6002:2:4061 -6003:2:4065 -6004:2:4070 -6005:2:4071 -6006:2:4082 -6007:2:4083 -6008:2:4084 -6009:2:4082 -6010:2:4083 -6011:2:4084 -6012:2:4095 -6013:2:4103 -6014:0:4533 -6015:2:3127 -6016:0:4533 -6017:2:4109 -6018:2:4110 -6019:2:4114 -6020:2:4115 -6021:2:4123 -6022:2:4124 -6023:2:4128 -6024:2:4129 -6025:2:4137 -6026:2:4142 -6027:2:4146 -6028:2:4147 -6029:2:4155 -6030:2:4156 -6031:2:4160 -6032:2:4161 -6033:2:4155 -6034:2:4156 -6035:2:4160 -6036:2:4161 -6037:2:4169 -6038:2:4174 -6039:2:4175 -6040:2:4186 -6041:2:4194 -6042:2:4195 -6043:2:4199 -6044:2:4204 -6045:2:4205 -6046:2:4216 -6047:2:4217 -6048:2:4218 -6049:2:4216 -6050:2:4217 -6051:2:4218 -6052:2:4229 -6053:0:4533 -6054:2:3127 -6055:0:4533 -6056:1:3066 -6057:1:3073 -6058:1:3074 -6059:1:3081 -6060:1:3086 -6061:1:3093 -6062:1:3094 -6063:1:3093 -6064:1:3094 -6065:1:3101 -6066:1:3105 -6067:0:4533 -6068:2:3975 -6069:2:3976 -6070:2:3980 -6071:2:3981 -6072:2:3989 -6073:2:3990 -6074:2:3994 -6075:2:3995 -6076:2:4003 -6077:2:4008 -6078:2:4012 -6079:2:4013 -6080:2:4021 -6081:2:4022 -6082:2:4026 -6083:2:4027 -6084:2:4021 -6085:2:4022 -6086:2:4026 -6087:2:4027 -6088:2:4035 -6089:2:4040 -6090:2:4041 -6091:2:4052 -6092:2:4060 -6093:2:4061 -6094:2:4065 -6095:2:4070 -6096:2:4071 -6097:2:4082 -6098:2:4083 -6099:2:4084 -6100:2:4082 -6101:2:4083 -6102:2:4084 -6103:2:4095 -6104:2:4103 -6105:0:4533 -6106:2:3127 -6107:0:4533 -6108:2:4109 -6109:2:4110 -6110:2:4114 -6111:2:4115 -6112:2:4123 -6113:2:4124 -6114:2:4128 -6115:2:4129 -6116:2:4137 -6117:2:4142 -6118:2:4146 -6119:2:4147 -6120:2:4155 -6121:2:4156 -6122:2:4160 -6123:2:4161 -6124:2:4155 -6125:2:4156 -6126:2:4160 -6127:2:4161 -6128:2:4169 -6129:2:4174 -6130:2:4175 -6131:2:4186 -6132:2:4194 -6133:2:4195 -6134:2:4199 -6135:2:4204 -6136:2:4205 -6137:2:4216 -6138:2:4217 -6139:2:4218 -6140:2:4216 -6141:2:4217 -6142:2:4218 -6143:2:4229 -6144:0:4533 -6145:2:3127 -6146:0:4533 -6147:1:2658 -6148:1:2659 -6149:0:4533 -6150:1:11 -6151:0:4533 -6152:2:3975 -6153:2:3976 -6154:2:3980 -6155:2:3981 -6156:2:3989 -6157:2:3990 -6158:2:3994 -6159:2:3995 -6160:2:4003 -6161:2:4008 -6162:2:4012 -6163:2:4013 -6164:2:4021 -6165:2:4022 -6166:2:4026 -6167:2:4027 -6168:2:4021 -6169:2:4022 -6170:2:4026 -6171:2:4027 -6172:2:4035 -6173:2:4040 -6174:2:4041 -6175:2:4052 -6176:2:4060 -6177:2:4061 -6178:2:4065 -6179:2:4070 -6180:2:4071 -6181:2:4082 -6182:2:4083 -6183:2:4084 -6184:2:4082 -6185:2:4083 -6186:2:4084 -6187:2:4095 -6188:2:4103 -6189:0:4533 -6190:2:3127 -6191:0:4533 -6192:2:4109 -6193:2:4110 -6194:2:4114 -6195:2:4115 -6196:2:4123 -6197:2:4124 -6198:2:4128 -6199:2:4129 -6200:2:4137 -6201:2:4142 -6202:2:4146 -6203:2:4147 -6204:2:4155 -6205:2:4156 -6206:2:4160 -6207:2:4161 -6208:2:4155 -6209:2:4156 -6210:2:4160 -6211:2:4161 -6212:2:4169 -6213:2:4174 -6214:2:4175 -6215:2:4186 -6216:2:4194 -6217:2:4195 -6218:2:4199 -6219:2:4204 -6220:2:4205 -6221:2:4216 -6222:2:4217 -6223:2:4218 -6224:2:4216 -6225:2:4217 -6226:2:4218 -6227:2:4229 -6228:0:4533 -6229:2:3127 -6230:0:4533 -6231:1:2660 -6232:1:2664 -6233:1:2665 -6234:1:2669 -6235:1:2673 -6236:1:2674 -6237:1:2678 -6238:1:2686 -6239:1:2687 -6240:1:2691 -6241:1:2695 -6242:1:2696 -6243:1:2691 -6244:1:2695 -6245:1:2696 -6246:1:2700 -6247:1:2707 -6248:1:2714 -6249:1:2715 -6250:1:2722 -6251:1:2727 -6252:1:2734 -6253:1:2735 -6254:1:2734 -6255:1:2735 -6256:1:2742 -6257:0:4533 -6258:1:11 -6259:0:4533 -6260:2:3975 -6261:2:3976 -6262:2:3980 -6263:2:3981 -6264:2:3989 -6265:2:3990 -6266:2:3994 -6267:2:3995 -6268:2:4003 -6269:2:4008 -6270:2:4012 -6271:2:4013 -6272:2:4021 -6273:2:4022 -6274:2:4026 -6275:2:4027 -6276:2:4021 -6277:2:4022 -6278:2:4026 -6279:2:4027 -6280:2:4035 -6281:2:4040 -6282:2:4041 -6283:2:4052 -6284:2:4060 -6285:2:4061 -6286:2:4065 -6287:2:4070 -6288:2:4071 -6289:2:4082 -6290:2:4083 -6291:2:4084 -6292:2:4082 -6293:2:4083 -6294:2:4084 -6295:2:4095 -6296:2:4103 -6297:0:4533 -6298:2:3127 -6299:0:4533 -6300:1:2752 -6301:1:2753 -6302:1:2757 -6303:1:2758 -6304:1:2766 -6305:1:2767 -6306:1:2771 -6307:1:2772 -6308:1:2780 -6309:1:2785 -6310:1:2789 -6311:1:2790 -6312:1:2798 -6313:1:2799 -6314:1:2803 -6315:1:2804 -6316:1:2798 -6317:1:2799 -6318:1:2803 -6319:1:2804 -6320:1:2812 -6321:1:2817 -6322:1:2818 -6323:1:2829 -6324:1:2830 -6325:1:2831 -6326:1:2842 -6327:1:2847 -6328:1:2848 -6329:1:2859 -6330:1:2860 -6331:1:2861 -6332:1:2859 -6333:1:2860 -6334:1:2861 -6335:1:2872 -6336:0:4533 -6337:1:11 -6338:0:4533 -6339:1:2881 -6340:1:2882 -6341:1:2886 -6342:1:2887 -6343:1:2895 -6344:1:2896 -6345:1:2900 -6346:1:2901 -6347:1:2909 -6348:1:2914 -6349:1:2918 -6350:1:2919 -6351:1:2927 -6352:1:2928 -6353:1:2932 -6354:1:2933 -6355:1:2927 -6356:1:2928 -6357:1:2932 -6358:1:2933 -6359:1:2941 -6360:1:2946 -6361:1:2947 -6362:1:2958 -6363:1:2959 -6364:1:2960 -6365:1:2971 -6366:1:2976 -6367:1:2977 -6368:1:2988 -6369:1:2989 -6370:1:2990 -6371:1:2988 -6372:1:2989 -6373:1:2990 -6374:1:3001 -6375:1:3008 -6376:1:3012 -6377:0:4533 -6378:1:11 -6379:0:4533 -6380:1:3013 --1:-1:-1 -6381:0:4533 -6382:1:3021 -6383:0:4533 -6384:1:3109 -6385:0:4533 -6386:1:9 -6387:0:4533 -6388:1:10 -6389:0:4533 -6390:1:11 -6391:0:4533 -6392:1:12 -6393:1:13 -6394:1:17 -6395:1:18 -6396:1:26 -6397:1:27 -6398:1:28 -6399:1:40 -6400:1:45 -6401:1:49 -6402:1:50 -6403:1:58 -6404:1:59 -6405:1:63 -6406:1:64 -6407:1:58 -6408:1:59 -6409:1:63 -6410:1:64 -6411:1:72 -6412:1:77 -6413:1:78 -6414:1:89 -6415:1:90 -6416:1:91 -6417:1:102 -6418:1:107 -6419:1:108 -6420:1:119 -6421:1:120 -6422:1:121 -6423:1:119 -6424:1:120 -6425:1:121 -6426:1:132 -6427:0:4533 -6428:1:11 -6429:0:4533 -6430:1:141 -6431:1:142 -6432:0:4533 -6433:1:11 -6434:0:4533 -6435:1:148 -6436:1:149 -6437:1:153 -6438:1:154 -6439:1:162 -6440:1:163 -6441:1:167 -6442:1:168 -6443:1:176 -6444:1:181 -6445:1:185 -6446:1:186 -6447:1:194 -6448:1:195 -6449:1:199 -6450:1:200 -6451:1:194 -6452:1:195 -6453:1:199 -6454:1:200 -6455:1:208 -6456:1:213 -6457:1:214 -6458:1:225 -6459:1:226 -6460:1:227 -6461:1:238 -6462:1:243 -6463:1:244 -6464:1:255 -6465:1:256 -6466:1:257 -6467:1:255 -6468:1:256 -6469:1:257 -6470:1:268 -6471:0:4533 -6472:1:11 -6473:0:4533 -6474:1:277 -6475:1:278 -6476:1:282 -6477:1:283 -6478:1:291 -6479:1:292 -6480:1:296 -6481:1:297 -6482:1:305 -6483:1:310 -6484:1:314 -6485:1:315 -6486:1:323 -6487:1:324 -6488:1:328 -6489:1:329 -6490:1:323 -6491:1:324 -6492:1:328 -6493:1:329 -6494:1:337 -6495:1:342 -6496:1:343 -6497:1:354 -6498:1:355 -6499:1:356 -6500:1:367 -6501:1:372 -6502:1:373 -6503:1:384 -6504:1:385 -6505:1:386 -6506:1:384 -6507:1:385 -6508:1:386 -6509:1:397 -6510:1:404 -6511:0:4533 -6512:1:11 -6513:0:4533 -6514:1:540 -6515:1:544 -6516:1:545 -6517:1:549 -6518:1:550 -6519:1:558 -6520:1:566 -6521:1:567 -6522:1:571 -6523:1:575 -6524:1:576 -6525:1:571 -6526:1:575 -6527:1:576 -6528:1:580 -6529:1:587 -6530:1:594 -6531:1:595 -6532:1:602 -6533:1:607 -6534:1:614 -6535:1:615 -6536:1:614 -6537:1:615 -6538:1:622 -6539:0:4533 -6540:1:11 -6541:0:4533 -6542:1:632 -6543:1:633 -6544:1:637 -6545:1:638 -6546:1:646 -6547:1:647 -6548:1:651 -6549:1:652 -6550:1:660 -6551:1:665 -6552:1:669 -6553:1:670 -6554:1:678 -6555:1:679 -6556:1:683 -6557:1:684 -6558:1:678 -6559:1:679 -6560:1:683 -6561:1:684 -6562:1:692 -6563:1:697 -6564:1:698 -6565:1:709 -6566:1:710 -6567:1:711 -6568:1:722 -6569:1:727 -6570:1:728 -6571:1:739 -6572:1:740 -6573:1:741 -6574:1:739 -6575:1:740 -6576:1:741 -6577:1:752 -6578:0:4533 -6579:1:11 -6580:0:4533 -6581:1:761 -6582:1:764 -6583:1:765 -6584:0:4533 -6585:1:11 -6586:0:4533 -6587:1:768 -6588:1:769 -6589:1:773 -6590:1:774 -6591:1:782 -6592:1:783 -6593:1:787 -6594:1:788 -6595:1:796 -6596:1:801 -6597:1:805 -6598:1:806 -6599:1:814 -6600:1:815 -6601:1:819 -6602:1:820 -6603:1:814 -6604:1:815 -6605:1:819 -6606:1:820 -6607:1:828 -6608:1:833 -6609:1:834 -6610:1:845 -6611:1:846 -6612:1:847 -6613:1:858 -6614:1:863 -6615:1:864 -6616:1:875 -6617:1:876 -6618:1:877 -6619:1:875 -6620:1:876 -6621:1:877 -6622:1:888 -6623:0:4533 -6624:1:11 -6625:0:4533 -6626:1:1028 -6627:1:1029 -6628:1:1033 -6629:1:1034 -6630:1:1042 -6631:1:1043 -6632:1:1047 -6633:1:1048 -6634:1:1056 -6635:1:1061 -6636:1:1065 -6637:1:1066 -6638:1:1074 -6639:1:1075 -6640:1:1079 -6641:1:1080 -6642:1:1074 -6643:1:1075 -6644:1:1079 -6645:1:1080 -6646:1:1088 -6647:1:1093 -6648:1:1094 -6649:1:1105 -6650:1:1106 -6651:1:1107 -6652:1:1118 -6653:1:1123 -6654:1:1124 -6655:1:1135 -6656:1:1136 -6657:1:1137 -6658:1:1135 -6659:1:1136 -6660:1:1137 -6661:1:1148 -6662:1:1155 -6663:1:1159 -6664:0:4533 -6665:1:11 -6666:0:4533 -6667:1:1160 -6668:1:1161 -6669:1:1165 -6670:1:1166 -6671:1:1174 -6672:1:1175 -6673:1:1176 -6674:1:1188 -6675:1:1193 -6676:1:1197 -6677:1:1198 -6678:1:1206 -6679:1:1207 -6680:1:1211 -6681:1:1212 -6682:1:1206 -6683:1:1207 -6684:1:1211 -6685:1:1212 -6686:1:1220 -6687:1:1225 -6688:1:1226 -6689:1:1237 -6690:1:1238 -6691:1:1239 -6692:1:1250 -6693:1:1255 -6694:1:1256 -6695:1:1267 -6696:1:1268 -6697:1:1269 -6698:1:1267 -6699:1:1268 -6700:1:1269 -6701:1:1280 -6702:0:4533 -6703:1:11 -6704:0:4533 -6705:1:1289 -6706:0:4533 -6707:1:3023 -6708:1:3030 -6709:1:3031 -6710:1:3038 -6711:1:3043 -6712:1:3050 -6713:1:3051 -6714:1:3050 -6715:1:3051 -6716:1:3058 -6717:1:3062 -6718:0:4533 -6719:1:1291 -6720:1:1292 -6721:0:4533 -6722:1:11 -6723:0:4533 -6724:1:1293 -6725:1:1294 -6726:1:1298 -6727:1:1299 -6728:1:1307 -6729:1:1308 -6730:1:1312 -6731:1:1313 -6732:1:1321 -6733:1:1326 -6734:1:1330 -6735:1:1331 -6736:1:1339 -6737:1:1340 -6738:1:1344 -6739:1:1345 -6740:1:1339 -6741:1:1340 -6742:1:1344 -6743:1:1345 -6744:1:1353 -6745:1:1358 -6746:1:1359 -6747:1:1370 -6748:1:1371 -6749:1:1372 -6750:1:1383 -6751:1:1388 -6752:1:1389 -6753:1:1400 -6754:1:1401 -6755:1:1402 -6756:1:1400 -6757:1:1401 -6758:1:1402 -6759:1:1413 -6760:0:4533 -6761:1:11 -6762:0:4533 -6763:1:1422 -6764:1:1423 -6765:1:1427 -6766:1:1428 -6767:1:1436 -6768:1:1437 -6769:1:1441 -6770:1:1442 -6771:1:1450 -6772:1:1455 -6773:1:1459 -6774:1:1460 -6775:1:1468 -6776:1:1469 -6777:1:1473 -6778:1:1474 -6779:1:1468 -6780:1:1469 -6781:1:1473 -6782:1:1474 -6783:1:1482 -6784:1:1487 -6785:1:1488 -6786:1:1499 -6787:1:1500 -6788:1:1501 -6789:1:1512 -6790:1:1517 -6791:1:1518 -6792:1:1529 -6793:1:1530 -6794:1:1531 -6795:1:1529 -6796:1:1530 -6797:1:1531 -6798:1:1542 -6799:1:1549 -6800:1:1553 -6801:0:4533 -6802:1:11 -6803:0:4533 -6804:1:1554 -6805:1:1558 -6806:1:1559 -6807:1:1563 -6808:1:1564 -6809:1:1572 -6810:1:1580 -6811:1:1581 -6812:1:1585 -6813:1:1589 -6814:1:1590 -6815:1:1585 -6816:1:1589 -6817:1:1590 -6818:1:1594 -6819:1:1601 -6820:1:1608 -6821:1:1609 -6822:1:1616 -6823:1:1621 -6824:1:1628 -6825:1:1629 -6826:1:1628 -6827:1:1629 -6828:1:1636 -6829:0:4533 -6830:1:11 -6831:0:4533 -6832:1:1646 -6833:1:1647 -6834:1:1651 -6835:1:1652 -6836:1:1660 -6837:1:1661 -6838:1:1665 -6839:1:1666 -6840:1:1674 -6841:1:1679 -6842:1:1683 -6843:1:1684 -6844:1:1692 -6845:1:1693 -6846:1:1697 -6847:1:1698 -6848:1:1692 -6849:1:1693 -6850:1:1697 -6851:1:1698 -6852:1:1706 -6853:1:1711 -6854:1:1712 -6855:1:1723 -6856:1:1724 -6857:1:1725 -6858:1:1736 -6859:1:1741 -6860:1:1742 -6861:1:1753 -6862:1:1754 -6863:1:1755 -6864:1:1753 -6865:1:1754 -6866:1:1755 -6867:1:1766 -6868:0:4533 -6869:1:11 -6870:0:4533 -6871:1:1775 -6872:1:1776 -6873:1:1780 -6874:1:1781 -6875:1:1789 -6876:1:1790 -6877:1:1794 -6878:1:1795 -6879:1:1803 -6880:1:1808 -6881:1:1812 -6882:1:1813 -6883:1:1821 -6884:1:1822 -6885:1:1826 -6886:1:1827 -6887:1:1821 -6888:1:1822 -6889:1:1826 -6890:1:1827 -6891:1:1835 -6892:1:1840 -6893:1:1841 -6894:1:1852 -6895:1:1853 -6896:1:1854 -6897:1:1865 -6898:1:1870 -6899:1:1871 -6900:1:1882 -6901:1:1883 -6902:1:1884 -6903:1:1882 -6904:1:1883 -6905:1:1884 -6906:1:1895 -6907:1:1902 -6908:1:1906 -6909:0:4533 -6910:1:11 -6911:0:4533 -6912:1:1907 -6913:1:1908 -6914:1:1912 -6915:1:1913 -6916:1:1921 -6917:1:1922 -6918:1:1923 -6919:1:1935 -6920:1:1940 -6921:1:1944 -6922:1:1945 -6923:1:1953 -6924:1:1954 -6925:1:1958 -6926:1:1959 -6927:1:1953 -6928:1:1954 -6929:1:1958 -6930:1:1959 -6931:1:1967 -6932:1:1972 -6933:1:1973 -6934:1:1984 -6935:1:1985 -6936:1:1986 -6937:1:1997 -6938:1:2002 -6939:1:2003 -6940:1:2014 -6941:1:2015 -6942:1:2016 -6943:1:2014 -6944:1:2015 -6945:1:2016 -6946:1:2027 -6947:0:4533 -6948:1:11 -6949:0:4533 -6950:1:2036 -6951:1:2037 -6952:0:4533 -6953:1:11 -6954:0:4533 -6955:1:2043 -6956:1:2044 -6957:1:2048 -6958:1:2049 -6959:1:2057 -6960:1:2058 -6961:1:2062 -6962:1:2063 -6963:1:2071 -6964:1:2076 -6965:1:2080 -6966:1:2081 -6967:1:2089 -6968:1:2090 -6969:1:2094 -6970:1:2095 -6971:1:2089 -6972:1:2090 -6973:1:2094 -6974:1:2095 -6975:1:2103 -6976:1:2108 -6977:1:2109 -6978:1:2120 -6979:1:2121 -6980:1:2122 -6981:1:2133 -6982:1:2138 -6983:1:2139 -6984:1:2150 -6985:1:2151 -6986:1:2152 -6987:1:2150 -6988:1:2151 -6989:1:2152 -6990:1:2163 -6991:0:4533 -6992:1:11 -6993:0:4533 -6994:1:2172 -6995:1:2173 -6996:1:2177 -6997:1:2178 -6998:1:2186 -6999:1:2187 -7000:1:2191 -7001:1:2192 -7002:1:2200 -7003:1:2205 -7004:1:2209 -7005:1:2210 -7006:1:2218 -7007:1:2219 -7008:1:2223 -7009:1:2224 -7010:1:2218 -7011:1:2219 -7012:1:2223 -7013:1:2224 -7014:1:2232 -7015:1:2237 -7016:1:2238 -7017:1:2249 -7018:1:2250 -7019:1:2251 -7020:1:2262 -7021:1:2267 -7022:1:2268 -7023:1:2279 -7024:1:2280 -7025:1:2281 -7026:1:2279 -7027:1:2280 -7028:1:2281 -7029:1:2292 -7030:1:2299 -7031:0:4533 -7032:1:11 -7033:0:4533 -7034:1:2435 -7035:1:2439 -7036:1:2440 -7037:1:2444 -7038:1:2445 -7039:1:2453 -7040:1:2461 -7041:1:2462 -7042:1:2466 -7043:1:2470 -7044:1:2471 -7045:1:2466 -7046:1:2470 -7047:1:2471 -7048:1:2475 -7049:1:2482 -7050:1:2489 -7051:1:2490 -7052:1:2497 -7053:1:2502 -7054:1:2509 -7055:1:2510 -7056:1:2509 -7057:1:2510 -7058:1:2517 -7059:0:4533 -7060:1:11 -7061:0:4533 -7062:1:2527 -7063:1:2528 -7064:1:2532 -7065:1:2533 -7066:1:2541 -7067:1:2542 -7068:1:2546 -7069:1:2547 -7070:1:2555 -7071:1:2560 -7072:1:2564 -7073:1:2565 -7074:1:2573 -7075:1:2574 -7076:1:2578 -7077:1:2579 -7078:1:2573 -7079:1:2574 -7080:1:2578 -7081:1:2579 -7082:1:2587 -7083:1:2592 -7084:1:2593 -7085:1:2604 -7086:1:2605 -7087:1:2606 -7088:1:2617 -7089:1:2622 -7090:1:2623 -7091:1:2634 -7092:1:2635 -7093:1:2636 -7094:1:2634 -7095:1:2635 -7096:1:2636 -7097:1:2647 -7098:0:4533 -7099:1:11 -7100:0:4533 -7101:1:2656 -7102:0:4533 -7103:1:3066 -7104:1:3073 -7105:1:3074 -7106:1:3081 -7107:1:3086 -7108:1:3093 -7109:1:3094 -7110:1:3093 -7111:1:3094 -7112:1:3101 -7113:1:3105 -7114:0:4533 -7115:1:2658 -7116:1:2659 -7117:0:4533 -7118:1:11 -7119:0:4533 -7120:1:2660 -7121:1:2664 -7122:1:2665 -7123:1:2669 -7124:1:2673 -7125:1:2674 -7126:1:2678 -7127:1:2686 -7128:1:2687 -7129:1:2691 -7130:1:2695 -7131:1:2696 -7132:1:2691 -7133:1:2695 -7134:1:2696 -7135:1:2700 -7136:1:2707 -7137:1:2714 -7138:1:2715 -7139:1:2722 -7140:1:2727 -7141:1:2734 -7142:1:2735 -7143:1:2734 -7144:1:2735 -7145:1:2742 -7146:0:4533 -7147:1:11 -7148:0:4533 -7149:1:2752 -7150:1:2753 -7151:1:2757 -7152:1:2758 -7153:1:2766 -7154:1:2767 -7155:1:2771 -7156:1:2772 -7157:1:2780 -7158:1:2785 -7159:1:2789 -7160:1:2790 -7161:1:2798 -7162:1:2799 -7163:1:2803 -7164:1:2804 -7165:1:2798 -7166:1:2799 -7167:1:2803 -7168:1:2804 -7169:1:2812 -7170:1:2817 -7171:1:2818 -7172:1:2829 -7173:1:2830 -7174:1:2831 -7175:1:2842 -7176:1:2847 -7177:1:2848 -7178:1:2859 -7179:1:2860 -7180:1:2861 -7181:1:2859 -7182:1:2860 -7183:1:2861 -7184:1:2872 -7185:0:4533 -7186:2:4109 -7187:2:4110 -7188:2:4114 -7189:2:4115 -7190:2:4123 -7191:2:4124 -7192:2:4128 -7193:2:4129 -7194:2:4137 -7195:2:4142 -7196:2:4146 -7197:2:4147 -7198:2:4155 -7199:2:4156 -7200:2:4160 -7201:2:4161 -7202:2:4155 -7203:2:4156 -7204:2:4160 -7205:2:4161 -7206:2:4169 -7207:2:4174 -7208:2:4175 -7209:2:4186 -7210:2:4194 -7211:2:4195 -7212:2:4199 -7213:2:4204 -7214:2:4205 -7215:2:4216 -7216:2:4217 -7217:2:4218 -7218:2:4216 -7219:2:4217 -7220:2:4218 -7221:2:4229 -7222:0:4533 -7223:2:3127 -7224:0:4533 -7225:1:11 -7226:0:4533 -7227:1:2881 -7228:1:2882 -7229:1:2886 -7230:1:2887 -7231:1:2895 -7232:1:2896 -7233:1:2900 -7234:1:2901 -7235:1:2909 -7236:1:2914 -7237:1:2918 -7238:1:2919 -7239:1:2927 -7240:1:2928 -7241:1:2932 -7242:1:2933 -7243:1:2927 -7244:1:2928 -7245:1:2932 -7246:1:2933 -7247:1:2941 -7248:1:2946 -7249:1:2947 -7250:1:2958 -7251:1:2959 -7252:1:2960 -7253:1:2971 -7254:1:2976 -7255:1:2977 -7256:1:2988 -7257:1:2989 -7258:1:2990 -7259:1:2988 -7260:1:2989 -7261:1:2990 -7262:1:3001 -7263:1:3008 -7264:1:3012 -7265:0:4533 -7266:2:3975 -7267:2:3976 -7268:2:3980 -7269:2:3981 -7270:2:3989 -7271:2:3990 -7272:2:3994 -7273:2:3995 -7274:2:4003 -7275:2:4008 -7276:2:4012 -7277:2:4013 -7278:2:4021 -7279:2:4022 -7280:2:4026 -7281:2:4027 -7282:2:4021 -7283:2:4022 -7284:2:4026 -7285:2:4027 -7286:2:4035 -7287:2:4040 -7288:2:4041 -7289:2:4052 -7290:2:4060 -7291:2:4061 -7292:2:4065 -7293:2:4070 -7294:2:4071 -7295:2:4082 -7296:2:4083 -7297:2:4084 -7298:2:4082 -7299:2:4083 -7300:2:4084 -7301:2:4095 -7302:2:4103 -7303:0:4533 -7304:2:3127 -7305:0:4533 -7306:1:11 -7307:0:4533 -7308:2:4109 -7309:2:4110 -7310:2:4114 -7311:2:4115 -7312:2:4123 -7313:2:4124 -7314:2:4128 -7315:2:4129 -7316:2:4137 -7317:2:4142 -7318:2:4146 -7319:2:4147 -7320:2:4155 -7321:2:4156 -7322:2:4160 -7323:2:4161 -7324:2:4155 -7325:2:4156 -7326:2:4160 -7327:2:4161 -7328:2:4169 -7329:2:4174 -7330:2:4175 -7331:2:4186 -7332:2:4194 -7333:2:4195 -7334:2:4199 -7335:2:4204 -7336:2:4205 -7337:2:4216 -7338:2:4217 -7339:2:4218 -7340:2:4216 -7341:2:4217 -7342:2:4218 -7343:2:4229 -7344:0:4533 -7345:2:3127 -7346:0:4533 -7347:2:3975 -7348:2:3976 -7349:2:3980 -7350:2:3981 -7351:2:3989 -7352:2:3990 -7353:2:3994 -7354:2:3995 -7355:2:4003 -7356:2:4008 -7357:2:4012 -7358:2:4013 -7359:2:4021 -7360:2:4022 -7361:2:4026 -7362:2:4027 -7363:2:4021 -7364:2:4022 -7365:2:4026 -7366:2:4027 -7367:2:4035 -7368:2:4040 -7369:2:4041 -7370:2:4052 -7371:2:4060 -7372:2:4061 -7373:2:4065 -7374:2:4070 -7375:2:4071 -7376:2:4082 -7377:2:4083 -7378:2:4084 -7379:2:4082 -7380:2:4083 -7381:2:4084 -7382:2:4095 -7383:2:4103 -7384:0:4533 -7385:2:3127 -7386:0:4533 -7387:1:3013 diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/.input.define b/formal-model/urcu-controldataflow-intel-ipi-compress/.input.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/.input.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/.input.spin b/formal-model/urcu-controldataflow-intel-ipi-compress/.input.spin deleted file mode 100644 index 6cccb27..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/.input.spin +++ /dev/null @@ -1,1341 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/.input.spin.trail b/formal-model/urcu-controldataflow-intel-ipi-compress/.input.spin.trail deleted file mode 100644 index e9b06b3..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/.input.spin.trail +++ /dev/null @@ -1,1699 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:3997 -2:2:2536 -3:2:2541 -4:2:2545 -5:2:2553 -6:2:2557 -7:2:2561 -8:0:3997 -9:1:0 -10:1:5 -11:1:9 -12:1:17 -13:1:21 -14:1:25 -15:0:3997 -16:3:3967 -17:3:3970 -18:3:3977 -19:3:3984 -20:3:3987 -21:3:3991 -22:3:3992 -23:0:3997 -24:3:3994 -25:0:3997 -26:2:2565 -27:0:3997 -28:2:2571 -29:0:3997 -30:2:2572 -31:0:3997 -32:2:2573 -33:0:3997 -34:2:2574 -35:0:3997 -36:2:2575 -37:0:3997 -38:2:2576 -39:2:2577 -40:2:2581 -41:2:2582 -42:2:2590 -43:2:2591 -44:2:2595 -45:2:2596 -46:2:2604 -47:2:2609 -48:2:2613 -49:2:2614 -50:2:2622 -51:2:2623 -52:2:2627 -53:2:2628 -54:2:2622 -55:2:2623 -56:2:2627 -57:2:2628 -58:2:2636 -59:2:2641 -60:2:2648 -61:2:2649 -62:2:2656 -63:2:2661 -64:2:2668 -65:2:2669 -66:2:2668 -67:2:2669 -68:2:2676 -69:2:2686 -70:0:3997 -71:2:2575 -72:0:3997 -73:2:2690 -74:2:2694 -75:2:2695 -76:2:2699 -77:2:2703 -78:2:2704 -79:2:2708 -80:2:2716 -81:2:2717 -82:2:2721 -83:2:2725 -84:2:2726 -85:2:2721 -86:2:2722 -87:2:2730 -88:0:3997 -89:2:2575 -90:0:3997 -91:2:2738 -92:2:2739 -93:2:2740 -94:0:3997 -95:2:2575 -96:0:3997 -97:2:2745 -98:0:3997 -99:2:3572 -100:2:3573 -101:2:3577 -102:2:3581 -103:2:3582 -104:2:3586 -105:2:3591 -106:2:3599 -107:2:3603 -108:2:3604 -109:2:3599 -110:2:3603 -111:2:3604 -112:2:3608 -113:2:3615 -114:2:3622 -115:2:3623 -116:2:3630 -117:2:3635 -118:2:3642 -119:2:3643 -120:2:3642 -121:2:3643 -122:2:3650 -123:2:3654 -124:0:3997 -125:2:3659 -126:0:3997 -127:2:3660 -128:0:3997 -129:2:3661 -130:0:3997 -131:2:3662 -132:0:3997 -133:1:29 -134:0:3997 -135:1:35 -136:0:3997 -137:1:36 -138:0:3997 -139:2:3663 -140:0:3997 -141:1:37 -142:0:3997 -143:2:3662 -144:0:3997 -145:1:38 -146:0:3997 -147:2:3663 -148:0:3997 -149:1:39 -150:0:3997 -151:2:3662 -152:0:3997 -153:1:40 -154:0:3997 -155:2:3663 -156:0:3997 -157:1:41 -158:0:3997 -159:1:42 -160:0:3997 -161:1:43 -162:0:3997 -163:2:3662 -164:0:3997 -165:1:44 -166:0:3997 -167:2:3663 -168:0:3997 -169:1:53 -170:0:3997 -171:2:3662 -172:0:3997 -173:1:57 -174:1:58 -175:1:62 -176:1:66 -177:1:67 -178:1:71 -179:1:79 -180:1:80 -181:1:84 -182:1:88 -183:1:89 -184:1:84 -185:1:88 -186:1:89 -187:1:93 -188:1:100 -189:1:107 -190:1:108 -191:1:115 -192:1:120 -193:1:127 -194:1:128 -195:1:127 -196:1:128 -197:1:135 -198:1:139 -199:0:3997 -200:2:3663 -201:0:3997 -202:1:144 -203:0:3997 -204:2:3664 -205:0:3997 -206:2:3669 -207:0:3997 -208:2:3670 -209:0:3997 -210:2:3678 -211:2:3679 -212:2:3683 -213:2:3687 -214:2:3688 -215:2:3692 -216:2:3700 -217:2:3701 -218:2:3705 -219:2:3709 -220:2:3710 -221:2:3705 -222:2:3709 -223:2:3710 -224:2:3714 -225:2:3721 -226:2:3728 -227:2:3729 -228:2:3736 -229:2:3741 -230:2:3748 -231:2:3749 -232:2:3748 -233:2:3749 -234:2:3756 -235:2:3760 -236:0:3997 -237:2:2747 -238:2:3553 -239:0:3997 -240:2:2575 -241:0:3997 -242:2:2748 -243:0:3997 -244:2:2575 -245:0:3997 -246:2:2751 -247:2:2752 -248:2:2756 -249:2:2757 -250:2:2765 -251:2:2766 -252:2:2770 -253:2:2771 -254:2:2779 -255:2:2784 -256:2:2788 -257:2:2789 -258:2:2797 -259:2:2798 -260:2:2802 -261:2:2803 -262:2:2797 -263:2:2798 -264:2:2802 -265:2:2803 -266:2:2811 -267:2:2816 -268:2:2823 -269:2:2824 -270:2:2831 -271:2:2836 -272:2:2843 -273:2:2844 -274:2:2843 -275:2:2844 -276:2:2851 -277:2:2860 -278:0:3997 -279:2:2575 -280:0:3997 -281:2:2864 -282:2:2865 -283:2:2866 -284:2:2878 -285:2:2879 -286:2:2883 -287:2:2884 -288:2:2892 -289:2:2897 -290:2:2901 -291:2:2902 -292:2:2910 -293:2:2911 -294:2:2915 -295:2:2916 -296:2:2910 -297:2:2911 -298:2:2915 -299:2:2916 -300:2:2924 -301:2:2929 -302:2:2936 -303:2:2937 -304:2:2944 -305:2:2949 -306:2:2956 -307:2:2957 -308:2:2956 -309:2:2957 -310:2:2964 -311:2:2977 -312:2:2978 -313:0:3997 -314:2:2575 -315:0:3997 -316:2:3091 -317:2:3092 -318:2:3096 -319:2:3097 -320:2:3105 -321:2:3106 -322:2:3110 -323:2:3111 -324:2:3119 -325:2:3124 -326:2:3128 -327:2:3129 -328:2:3137 -329:2:3138 -330:2:3142 -331:2:3143 -332:2:3137 -333:2:3138 -334:2:3142 -335:2:3143 -336:2:3151 -337:2:3156 -338:2:3163 -339:2:3164 -340:2:3171 -341:2:3176 -342:2:3183 -343:2:3184 -344:2:3183 -345:2:3184 -346:2:3191 -347:0:3997 -348:2:2575 -349:0:3997 -350:2:3202 -351:2:3203 -352:2:3207 -353:2:3208 -354:2:3216 -355:2:3217 -356:2:3221 -357:2:3222 -358:2:3230 -359:2:3235 -360:2:3239 -361:2:3240 -362:2:3248 -363:2:3249 -364:2:3253 -365:2:3254 -366:2:3248 -367:2:3249 -368:2:3253 -369:2:3254 -370:2:3262 -371:2:3267 -372:2:3274 -373:2:3275 -374:2:3282 -375:2:3287 -376:2:3294 -377:2:3295 -378:2:3294 -379:2:3295 -380:2:3302 -381:2:3311 -382:0:3997 -383:2:2575 -384:0:3997 -385:2:3315 -386:2:3316 -387:2:3317 -388:2:3329 -389:2:3330 -390:2:3334 -391:2:3335 -392:2:3343 -393:2:3348 -394:2:3352 -395:2:3353 -396:2:3361 -397:2:3362 -398:2:3366 -399:2:3367 -400:2:3361 -401:2:3362 -402:2:3366 -403:2:3367 -404:2:3375 -405:2:3380 -406:2:3387 -407:2:3388 -408:2:3395 -409:2:3400 -410:2:3407 -411:2:3408 -412:2:3407 -413:2:3408 -414:2:3415 -415:2:3427 -416:2:3428 -417:0:3997 -418:2:2575 -419:0:3997 -420:2:3541 -421:0:3997 -422:2:3770 -423:2:3771 -424:2:3775 -425:2:3779 -426:2:3780 -427:2:3784 -428:2:3792 -429:2:3793 -430:2:3797 -431:2:3801 -432:2:3802 -433:2:3797 -434:2:3801 -435:2:3802 -436:2:3806 -437:2:3813 -438:2:3820 -439:2:3821 -440:2:3828 -441:2:3833 -442:2:3840 -443:2:3841 -444:2:3840 -445:2:3841 -446:2:3848 -447:2:3852 -448:0:3997 -449:2:3857 -450:0:3997 -451:2:3858 -452:0:3997 -453:2:3859 -454:0:3997 -455:2:3860 -456:0:3997 -457:1:53 -458:0:3997 -459:2:3861 -460:0:3997 -461:1:57 -462:1:58 -463:1:62 -464:1:66 -465:1:67 -466:1:71 -467:1:79 -468:1:80 -469:1:84 -470:1:88 -471:1:89 -472:1:84 -473:1:88 -474:1:89 -475:1:93 -476:1:100 -477:1:107 -478:1:108 -479:1:115 -480:1:120 -481:1:127 -482:1:128 -483:1:127 -484:1:128 -485:1:135 -486:1:139 -487:0:3997 -488:2:3860 -489:0:3997 -490:1:144 -491:0:3997 -492:2:3861 -493:0:3997 -494:2:3862 -495:0:3997 -496:2:3867 -497:0:3997 -498:2:3868 -499:0:3997 -500:2:3876 -501:2:3877 -502:2:3881 -503:2:3885 -504:2:3886 -505:2:3890 -506:2:3898 -507:2:3899 -508:2:3903 -509:2:3907 -510:2:3908 -511:2:3903 -512:2:3907 -513:2:3908 -514:2:3912 -515:2:3919 -516:2:3926 -517:2:3927 -518:2:3934 -519:2:3939 -520:2:3946 -521:2:3947 -522:2:3946 -523:2:3947 -524:2:3954 -525:2:3958 -526:0:3997 -527:2:3543 -528:2:3553 -529:0:3997 -530:2:2575 -531:0:3997 -532:2:3544 -533:2:3545 -534:0:3997 -535:2:2575 -536:0:3997 -537:2:3549 -538:0:3997 -539:2:3557 -540:0:3997 -541:2:2572 -542:0:3997 -543:2:2573 -544:0:3997 -545:2:2574 -546:0:3997 -547:2:2575 -548:0:3997 -549:2:2576 -550:2:2577 -551:2:2581 -552:2:2582 -553:2:2590 -554:2:2591 -555:2:2595 -556:2:2596 -557:2:2604 -558:2:2609 -559:2:2613 -560:2:2614 -561:2:2622 -562:2:2623 -563:2:2624 -564:2:2622 -565:2:2623 -566:2:2627 -567:2:2628 -568:2:2636 -569:2:2641 -570:2:2648 -571:2:2649 -572:2:2656 -573:2:2661 -574:2:2668 -575:2:2669 -576:2:2668 -577:2:2669 -578:2:2676 -579:2:2686 -580:0:3997 -581:2:2575 -582:0:3997 -583:2:2690 -584:2:2694 -585:2:2695 -586:2:2699 -587:2:2703 -588:2:2704 -589:2:2708 -590:2:2716 -591:2:2717 -592:2:2721 -593:2:2722 -594:2:2721 -595:2:2725 -596:2:2726 -597:2:2730 -598:0:3997 -599:2:2575 -600:0:3997 -601:2:2738 -602:2:2739 -603:2:2740 -604:0:3997 -605:2:2575 -606:0:3997 -607:2:2745 -608:0:3997 -609:2:3572 -610:2:3573 -611:2:3577 -612:2:3581 -613:2:3582 -614:2:3586 -615:2:3591 -616:2:3599 -617:2:3603 -618:2:3604 -619:2:3599 -620:2:3603 -621:2:3604 -622:2:3608 -623:2:3615 -624:2:3622 -625:2:3623 -626:2:3630 -627:2:3635 -628:2:3642 -629:2:3643 -630:2:3642 -631:2:3643 -632:2:3650 -633:2:3654 -634:0:3997 -635:2:3659 -636:0:3997 -637:2:3660 -638:0:3997 -639:2:3661 -640:0:3997 -641:2:3662 -642:0:3997 -643:1:53 -644:0:3997 -645:2:3663 -646:0:3997 -647:1:57 -648:1:58 -649:1:62 -650:1:66 -651:1:67 -652:1:71 -653:1:79 -654:1:80 -655:1:84 -656:1:88 -657:1:89 -658:1:84 -659:1:88 -660:1:89 -661:1:93 -662:1:100 -663:1:107 -664:1:108 -665:1:115 -666:1:120 -667:1:127 -668:1:128 -669:1:127 -670:1:128 -671:1:135 -672:1:139 -673:0:3997 -674:2:3662 -675:0:3997 -676:1:144 -677:0:3997 -678:2:3663 -679:0:3997 -680:2:3664 -681:0:3997 -682:2:3669 -683:0:3997 -684:2:3670 -685:0:3997 -686:2:3678 -687:2:3679 -688:2:3683 -689:2:3687 -690:2:3688 -691:2:3692 -692:2:3700 -693:2:3701 -694:2:3705 -695:2:3709 -696:2:3710 -697:2:3705 -698:2:3709 -699:2:3710 -700:2:3714 -701:2:3721 -702:2:3728 -703:2:3729 -704:2:3736 -705:2:3741 -706:2:3748 -707:2:3749 -708:2:3748 -709:2:3749 -710:2:3756 -711:2:3760 -712:0:3997 -713:2:2747 -714:2:3553 -715:0:3997 -716:2:2575 -717:0:3997 -718:2:2748 -719:0:3997 -720:2:2575 -721:0:3997 -722:2:2751 -723:2:2752 -724:2:2756 -725:2:2757 -726:2:2765 -727:2:2766 -728:2:2770 -729:2:2771 -730:2:2779 -731:2:2784 -732:2:2788 -733:2:2789 -734:2:2797 -735:2:2798 -736:2:2802 -737:2:2803 -738:2:2797 -739:2:2798 -740:2:2802 -741:2:2803 -742:2:2811 -743:2:2816 -744:2:2823 -745:2:2824 -746:2:2831 -747:2:2836 -748:2:2843 -749:2:2844 -750:2:2843 -751:2:2844 -752:2:2851 -753:2:2860 -754:0:3997 -755:2:2575 -756:0:3997 -757:2:2864 -758:2:2865 -759:2:2866 -760:2:2878 -761:2:2879 -762:2:2883 -763:2:2884 -764:2:2892 -765:2:2897 -766:2:2901 -767:2:2902 -768:2:2910 -769:2:2911 -770:2:2915 -771:2:2916 -772:2:2910 -773:2:2911 -774:2:2915 -775:2:2916 -776:2:2924 -777:2:2929 -778:2:2936 -779:2:2937 -780:2:2944 -781:2:2949 -782:2:2956 -783:2:2957 -784:2:2956 -785:2:2957 -786:2:2964 -787:2:2977 -788:2:2978 -789:0:3997 -790:2:2575 -791:0:3997 -792:2:3091 -793:2:3092 -794:2:3096 -795:2:3097 -796:2:3105 -797:2:3106 -798:2:3110 -799:2:3111 -800:2:3119 -801:2:3124 -802:2:3128 -803:2:3129 -804:2:3137 -805:2:3138 -806:2:3142 -807:2:3143 -808:2:3137 -809:2:3138 -810:2:3142 -811:2:3143 -812:2:3151 -813:2:3156 -814:2:3163 -815:2:3164 -816:2:3171 -817:2:3176 -818:2:3183 -819:2:3184 -820:2:3183 -821:2:3184 -822:2:3191 -823:0:3997 -824:2:2575 -825:0:3997 -826:2:3202 -827:2:3203 -828:2:3207 -829:2:3208 -830:2:3216 -831:2:3217 -832:2:3221 -833:2:3222 -834:2:3230 -835:2:3235 -836:2:3239 -837:2:3240 -838:2:3248 -839:2:3249 -840:2:3253 -841:2:3254 -842:2:3248 -843:2:3249 -844:2:3253 -845:2:3254 -846:2:3262 -847:2:3267 -848:2:3274 -849:2:3275 -850:2:3282 -851:2:3287 -852:2:3294 -853:2:3295 -854:2:3294 -855:2:3295 -856:2:3302 -857:2:3311 -858:0:3997 -859:2:2575 -860:0:3997 -861:2:3315 -862:2:3316 -863:2:3317 -864:2:3329 -865:2:3330 -866:2:3334 -867:2:3335 -868:2:3343 -869:2:3348 -870:2:3352 -871:2:3353 -872:2:3361 -873:2:3362 -874:2:3366 -875:2:3367 -876:2:3361 -877:2:3362 -878:2:3366 -879:2:3367 -880:2:3375 -881:2:3380 -882:2:3387 -883:2:3388 -884:2:3395 -885:2:3400 -886:2:3407 -887:2:3408 -888:2:3407 -889:2:3408 -890:2:3415 -891:2:3427 -892:2:3428 -893:0:3997 -894:2:2575 -895:0:3997 -896:2:3541 -897:0:3997 -898:2:3770 -899:2:3771 -900:2:3775 -901:2:3779 -902:2:3780 -903:2:3784 -904:2:3792 -905:2:3793 -906:2:3797 -907:2:3801 -908:2:3802 -909:2:3797 -910:2:3801 -911:2:3802 -912:2:3806 -913:2:3813 -914:2:3820 -915:2:3821 -916:2:3828 -917:2:3833 -918:2:3840 -919:2:3841 -920:2:3840 -921:2:3841 -922:2:3848 -923:2:3852 -924:0:3997 -925:2:3857 -926:0:3997 -927:2:3858 -928:0:3997 -929:2:3859 -930:0:3997 -931:2:3860 -932:0:3997 -933:1:53 -934:0:3997 -935:2:3861 -936:0:3997 -937:1:57 -938:1:58 -939:1:62 -940:1:66 -941:1:67 -942:1:71 -943:1:79 -944:1:80 -945:1:84 -946:1:88 -947:1:89 -948:1:84 -949:1:88 -950:1:89 -951:1:93 -952:1:100 -953:1:107 -954:1:108 -955:1:115 -956:1:120 -957:1:127 -958:1:128 -959:1:127 -960:1:128 -961:1:135 -962:1:139 -963:0:3997 -964:2:3860 -965:0:3997 -966:1:144 -967:0:3997 -968:2:3861 -969:0:3997 -970:2:3862 -971:0:3997 -972:2:3867 -973:0:3997 -974:2:3868 -975:0:3997 -976:2:3876 -977:2:3877 -978:2:3881 -979:2:3885 -980:2:3886 -981:2:3890 -982:2:3898 -983:2:3899 -984:2:3903 -985:2:3907 -986:2:3908 -987:2:3903 -988:2:3907 -989:2:3908 -990:2:3912 -991:2:3919 -992:2:3926 -993:2:3927 -994:2:3934 -995:2:3939 -996:2:3946 -997:2:3947 -998:2:3946 -999:2:3947 -1000:2:3954 -1001:2:3958 -1002:0:3997 -1003:2:3543 -1004:2:3553 -1005:0:3997 -1006:2:2575 -1007:0:3997 -1008:2:3544 -1009:2:3545 -1010:0:3997 -1011:2:2575 -1012:0:3997 -1013:2:3549 -1014:0:3997 -1015:2:3557 -1016:0:3997 -1017:2:2572 -1018:0:3997 -1019:2:2573 -1020:0:3997 -1021:2:2574 -1022:0:3997 -1023:2:2575 -1024:0:3997 -1025:2:2576 -1026:2:2577 -1027:2:2581 -1028:2:2582 -1029:2:2590 -1030:2:2591 -1031:2:2595 -1032:2:2596 -1033:2:2604 -1034:2:2609 -1035:2:2613 -1036:2:2614 -1037:2:2622 -1038:2:2623 -1039:2:2627 -1040:2:2628 -1041:2:2622 -1042:2:2623 -1043:2:2624 -1044:2:2636 -1045:2:2641 -1046:2:2648 -1047:2:2649 -1048:2:2656 -1049:2:2661 -1050:2:2668 -1051:2:2669 -1052:2:2668 -1053:2:2669 -1054:2:2676 -1055:2:2686 -1056:0:3997 -1057:2:2575 -1058:0:3997 -1059:2:2690 -1060:2:2694 -1061:2:2695 -1062:2:2699 -1063:2:2703 -1064:2:2704 -1065:2:2708 -1066:2:2716 -1067:2:2717 -1068:2:2721 -1069:2:2725 -1070:2:2726 -1071:2:2721 -1072:2:2722 -1073:2:2730 -1074:0:3997 -1075:2:2575 -1076:0:3997 -1077:2:2738 -1078:2:2739 -1079:2:2740 -1080:0:3997 -1081:2:2575 -1082:0:3997 -1083:2:2745 -1084:0:3997 -1085:2:3572 -1086:2:3573 -1087:2:3577 -1088:2:3581 -1089:2:3582 -1090:2:3586 -1091:2:3591 -1092:2:3599 -1093:2:3603 -1094:2:3604 -1095:2:3599 -1096:2:3603 -1097:2:3604 -1098:2:3608 -1099:2:3615 -1100:2:3622 -1101:2:3623 -1102:2:3630 -1103:2:3635 -1104:2:3642 -1105:2:3643 -1106:2:3642 -1107:2:3643 -1108:2:3650 -1109:2:3654 -1110:0:3997 -1111:2:3659 -1112:0:3997 -1113:2:3660 -1114:0:3997 -1115:2:3661 -1116:0:3997 -1117:2:3662 -1118:0:3997 -1119:1:53 -1120:0:3997 -1121:2:3663 -1122:0:3997 -1123:1:57 -1124:1:58 -1125:1:62 -1126:1:66 -1127:1:67 -1128:1:71 -1129:1:79 -1130:1:80 -1131:1:84 -1132:1:88 -1133:1:89 -1134:1:84 -1135:1:88 -1136:1:89 -1137:1:93 -1138:1:100 -1139:1:107 -1140:1:108 -1141:1:115 -1142:1:120 -1143:1:127 -1144:1:128 -1145:1:127 -1146:1:128 -1147:1:135 -1148:1:139 -1149:0:3997 -1150:2:3662 -1151:0:3997 -1152:1:144 -1153:0:3997 -1154:2:3663 -1155:0:3997 -1156:2:3664 -1157:0:3997 -1158:2:3669 -1159:0:3997 -1160:2:3670 -1161:0:3997 -1162:2:3678 -1163:2:3679 -1164:2:3683 -1165:2:3687 -1166:2:3688 -1167:2:3692 -1168:2:3700 -1169:2:3701 -1170:2:3705 -1171:2:3709 -1172:2:3710 -1173:2:3705 -1174:2:3709 -1175:2:3710 -1176:2:3714 -1177:2:3721 -1178:2:3728 -1179:2:3729 -1180:2:3736 -1181:2:3741 -1182:2:3748 -1183:2:3749 -1184:2:3748 -1185:2:3749 -1186:2:3756 -1187:2:3760 -1188:0:3997 -1189:2:2747 -1190:2:3553 -1191:0:3997 -1192:2:2575 -1193:0:3997 -1194:2:2748 -1195:0:3997 -1196:2:2575 -1197:0:3997 -1198:2:2751 -1199:2:2752 -1200:2:2756 -1201:2:2757 -1202:2:2765 -1203:2:2766 -1204:2:2770 -1205:2:2771 -1206:2:2779 -1207:2:2784 -1208:2:2788 -1209:2:2789 -1210:2:2797 -1211:2:2798 -1212:2:2802 -1213:2:2803 -1214:2:2797 -1215:2:2798 -1216:2:2802 -1217:2:2803 -1218:2:2811 -1219:2:2816 -1220:2:2823 -1221:2:2824 -1222:2:2831 -1223:2:2836 -1224:2:2843 -1225:2:2844 -1226:2:2843 -1227:2:2844 -1228:2:2851 -1229:2:2860 -1230:0:3997 -1231:2:2575 -1232:0:3997 -1233:2:2864 -1234:2:2865 -1235:2:2866 -1236:2:2878 -1237:2:2879 -1238:2:2883 -1239:2:2884 -1240:2:2892 -1241:2:2897 -1242:2:2901 -1243:2:2902 -1244:2:2910 -1245:2:2911 -1246:2:2915 -1247:2:2916 -1248:2:2910 -1249:2:2911 -1250:2:2915 -1251:2:2916 -1252:2:2924 -1253:2:2929 -1254:2:2936 -1255:2:2937 -1256:2:2944 -1257:2:2949 -1258:2:2956 -1259:2:2957 -1260:2:2956 -1261:2:2957 -1262:2:2964 -1263:2:2977 -1264:2:2978 -1265:0:3997 -1266:2:2575 -1267:0:3997 -1268:2:3091 -1269:2:3092 -1270:2:3096 -1271:2:3097 -1272:2:3105 -1273:2:3106 -1274:2:3110 -1275:2:3111 -1276:2:3119 -1277:2:3124 -1278:2:3128 -1279:2:3129 -1280:2:3137 -1281:2:3138 -1282:2:3142 -1283:2:3143 -1284:2:3137 -1285:2:3138 -1286:2:3142 -1287:2:3143 -1288:2:3151 -1289:2:3156 -1290:2:3163 -1291:2:3164 -1292:2:3171 -1293:2:3176 -1294:2:3183 -1295:2:3184 -1296:2:3183 -1297:2:3184 -1298:2:3191 -1299:0:3997 -1300:2:2575 -1301:0:3997 -1302:2:3202 -1303:2:3203 -1304:2:3207 -1305:2:3208 -1306:2:3216 -1307:2:3217 -1308:2:3221 -1309:2:3222 -1310:2:3230 -1311:2:3235 -1312:2:3239 -1313:2:3240 -1314:2:3248 -1315:2:3249 -1316:2:3253 -1317:2:3254 -1318:2:3248 -1319:2:3249 -1320:2:3253 -1321:2:3254 -1322:2:3262 -1323:2:3267 -1324:2:3274 -1325:2:3275 -1326:2:3282 -1327:2:3287 -1328:2:3294 -1329:2:3295 -1330:2:3294 -1331:2:3295 -1332:2:3302 -1333:2:3311 -1334:0:3997 -1335:2:2575 -1336:0:3997 -1337:1:145 -1338:0:3997 -1339:1:147 -1340:0:3997 -1341:1:46 -1342:0:3997 -1343:1:153 -1344:1:154 -1345:1:158 -1346:1:159 -1347:1:167 -1348:1:168 -1349:1:172 -1350:1:173 -1351:1:181 -1352:1:186 -1353:1:190 -1354:1:191 -1355:1:199 -1356:1:200 -1357:1:204 -1358:1:205 -1359:1:199 -1360:1:200 -1361:1:204 -1362:1:205 -1363:1:213 -1364:1:218 -1365:1:225 -1366:1:226 -1367:1:233 -1368:1:238 -1369:1:245 -1370:1:246 -1371:1:245 -1372:1:246 -1373:1:253 -1374:0:3997 -1375:1:42 -1376:0:3997 -1377:1:43 -1378:0:3997 -1379:1:44 -1380:0:3997 -1381:1:145 -1382:0:3997 -1383:1:147 -1384:0:3997 -1385:1:46 -1386:0:3997 -1387:1:264 -1388:1:265 -1389:0:3997 -1390:1:42 -1391:0:3997 -1392:1:43 -1393:0:3997 -1394:1:44 -1395:0:3997 -1396:1:145 -1397:0:3997 -1398:1:147 -1399:0:3997 -1400:1:46 -1401:0:3997 -1402:1:271 -1403:1:272 -1404:1:276 -1405:1:277 -1406:1:285 -1407:1:286 -1408:1:290 -1409:1:291 -1410:1:299 -1411:1:304 -1412:1:308 -1413:1:309 -1414:1:317 -1415:1:318 -1416:1:322 -1417:1:323 -1418:1:317 -1419:1:318 -1420:1:322 -1421:1:323 -1422:1:331 -1423:1:336 -1424:1:343 -1425:1:344 -1426:1:351 -1427:1:356 -1428:1:363 -1429:1:364 -1430:1:363 -1431:1:364 -1432:1:371 -1433:0:3997 -1434:1:42 -1435:0:3997 -1436:1:43 -1437:0:3997 -1438:1:44 -1439:0:3997 -1440:1:145 -1441:0:3997 -1442:1:147 -1443:0:3997 -1444:1:46 -1445:0:3997 -1446:1:382 -1447:1:383 -1448:1:387 -1449:1:388 -1450:1:396 -1451:1:397 -1452:1:401 -1453:1:402 -1454:1:410 -1455:1:415 -1456:1:419 -1457:1:420 -1458:1:428 -1459:1:429 -1460:1:433 -1461:1:434 -1462:1:428 -1463:1:429 -1464:1:433 -1465:1:434 -1466:1:442 -1467:1:447 -1468:1:454 -1469:1:455 -1470:1:462 -1471:1:467 -1472:1:474 -1473:1:475 -1474:1:474 -1475:1:475 -1476:1:482 -1477:1:491 -1478:0:3997 -1479:1:42 -1480:0:3997 -1481:1:43 -1482:0:3997 -1483:1:44 -1484:0:3997 -1485:1:145 -1486:0:3997 -1487:1:147 -1488:0:3995 -1489:1:46 -1490:0:4001 -1491:1:1067 -1492:1:1068 -1493:1:1072 -1494:1:1073 -1495:1:1081 -1496:1:1082 -1497:1:1083 -1498:1:1095 -1499:1:1100 -1500:1:1104 -1501:1:1105 -1502:1:1113 -1503:1:1114 -1504:1:1118 -1505:1:1119 -1506:1:1113 -1507:1:1114 -1508:1:1118 -1509:1:1119 -1510:1:1127 -1511:1:1132 -1512:1:1139 -1513:1:1140 -1514:1:1147 -1515:1:1152 -1516:1:1159 -1517:1:1160 -1518:1:1159 -1519:1:1160 -1520:1:1167 -1521:0:4001 -1522:1:42 -1523:0:4001 -1524:1:43 -1525:0:4001 -1526:2:3315 -1527:2:3316 -1528:2:3317 -1529:2:3329 -1530:2:3330 -1531:2:3334 -1532:2:3335 -1533:2:3343 -1534:2:3348 -1535:2:3352 -1536:2:3353 -1537:2:3361 -1538:2:3362 -1539:2:3366 -1540:2:3367 -1541:2:3361 -1542:2:3362 -1543:2:3366 -1544:2:3367 -1545:2:3375 -1546:2:3380 -1547:2:3387 -1548:2:3388 -1549:2:3395 -1550:2:3400 -1551:2:3407 -1552:2:3408 -1553:2:3407 -1554:2:3408 -1555:2:3415 -1556:2:3425 -1557:0:4001 -1558:2:2575 --1:-1:-1 -1559:0:4001 -1560:2:3431 -1561:2:3432 -1562:2:3436 -1563:2:3437 -1564:2:3445 -1565:2:3446 -1566:2:3450 -1567:2:3451 -1568:2:3459 -1569:2:3464 -1570:2:3468 -1571:2:3469 -1572:2:3477 -1573:2:3478 -1574:2:3482 -1575:2:3483 -1576:2:3477 -1577:2:3478 -1578:2:3482 -1579:2:3483 -1580:2:3491 -1581:2:3496 -1582:2:3503 -1583:2:3504 -1584:2:3511 -1585:2:3516 -1586:2:3523 -1587:2:3524 -1588:2:3523 -1589:2:3524 -1590:2:3531 -1591:0:4001 -1592:2:2575 -1593:0:4001 -1594:2:3315 -1595:2:3316 -1596:2:3320 -1597:2:3321 -1598:2:3329 -1599:2:3330 -1600:2:3334 -1601:2:3335 -1602:2:3343 -1603:2:3348 -1604:2:3352 -1605:2:3353 -1606:2:3361 -1607:2:3362 -1608:2:3366 -1609:2:3367 -1610:2:3361 -1611:2:3362 -1612:2:3366 -1613:2:3367 -1614:2:3375 -1615:2:3380 -1616:2:3387 -1617:2:3388 -1618:2:3395 -1619:2:3400 -1620:2:3407 -1621:2:3408 -1622:2:3407 -1623:2:3408 -1624:2:3415 -1625:2:3425 -1626:0:4001 -1627:2:2575 -1628:0:4001 -1629:2:3431 -1630:2:3432 -1631:2:3436 -1632:2:3437 -1633:2:3445 -1634:2:3446 -1635:2:3450 -1636:2:3451 -1637:2:3459 -1638:2:3464 -1639:2:3468 -1640:2:3469 -1641:2:3477 -1642:2:3478 -1643:2:3482 -1644:2:3483 -1645:2:3477 -1646:2:3478 -1647:2:3482 -1648:2:3483 -1649:2:3491 -1650:2:3496 -1651:2:3503 -1652:2:3504 -1653:2:3511 -1654:2:3516 -1655:2:3523 -1656:2:3524 -1657:2:3523 -1658:2:3524 -1659:2:3531 -1660:0:4001 -1661:2:2575 -1662:0:4001 -1663:2:3315 -1664:2:3316 -1665:2:3320 -1666:2:3321 -1667:2:3329 -1668:2:3330 -1669:2:3334 -1670:2:3335 -1671:2:3343 -1672:2:3348 -1673:2:3352 -1674:2:3353 -1675:2:3361 -1676:2:3362 -1677:2:3366 -1678:2:3367 -1679:2:3361 -1680:2:3362 -1681:2:3366 -1682:2:3367 -1683:2:3375 -1684:2:3380 -1685:2:3387 -1686:2:3388 -1687:2:3395 -1688:2:3400 -1689:2:3407 -1690:2:3408 -1691:2:3407 -1692:2:3408 -1693:2:3415 -1694:2:3425 -1695:0:4001 -1696:2:2575 diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/DEFINES b/formal-model/urcu-controldataflow-intel-ipi-compress/DEFINES deleted file mode 100644 index abea5ff..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/DEFINES +++ /dev/null @@ -1,18 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/Makefile b/formal-model/urcu-controldataflow-intel-ipi-compress/Makefile deleted file mode 100644 index f8bfd31..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/Makefile +++ /dev/null @@ -1,171 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 -DCOLLAPSE -#CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - #make urcu_free | tee urcu_free.log - #make urcu_free_no_mb | tee urcu_free_no_mb.log - #make urcu_free_no_rmb | tee urcu_free_no_rmb.log - #make urcu_free_no_wmb | tee urcu_free_no_wmb.log - #make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - #make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/references.txt b/formal-model/urcu-controldataflow-intel-ipi-compress/references.txt deleted file mode 100644 index 72c67a2..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/references.txt +++ /dev/null @@ -1,13 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html - -LTL vs CTL : - -http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 -http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf - (downloaded) diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu.sh b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu.spin b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu.spin deleted file mode 100644 index 8075506..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu.spin +++ /dev/null @@ -1,1321 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free.log b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free.log deleted file mode 100644 index 43e9bba..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free.log +++ /dev/null @@ -1,55 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi-compress' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1294) -Depth= 9223 States= 1e+06 Transitions= 6.87e+06 Memory= 516.350 t= 19.4 R= 5e+04 -Depth= 9223 States= 2e+06 Transitions= 1.47e+07 Memory= 563.713 t= 43.1 R= 5e+04 -Depth= 9223 States= 3e+06 Transitions= 2.46e+07 Memory= 613.127 t= 73.9 R= 4e+04 -pan: resizing hashtable to -w22.. done -Depth= 9223 States= 4e+06 Transitions= 3.19e+07 Memory= 690.440 t= 95.5 R= 4e+04 -Depth= 9223 States= 5e+06 Transitions= 3.95e+07 Memory= 736.533 t= 118 R= 4e+04 -Depth= 9223 States= 6e+06 Transitions= 5.71e+07 Memory= 785.068 t= 174 R= 3e+04 -Depth= 9223 States= 7e+06 Transitions= 6.81e+07 Memory= 834.580 t= 209 R= 3e+04 -Depth= 9223 States= 8e+06 Transitions= 8.22e+07 Memory= 883.311 t= 254 R= 3e+04 -Depth= 9223 States= 9e+06 Transitions= 9.54e+07 Memory= 932.139 t= 296 R= 3e+04 -pan: resizing hashtable to -w24.. done -Depth= 9223 States= 1e+07 Transitions= 1.08e+08 Memory= 1104.670 t= 338 R= 3e+04 -Depth= 9223 States= 1.1e+07 Transitions= 1.21e+08 Memory= 1155.451 t= 375 R= 3e+04 -Depth= 9223 States= 1.2e+07 Transitions= 1.3e+08 Memory= 1205.744 t= 403 R= 3e+04 -Depth= 9223 States= 1.3e+07 Transitions= 1.42e+08 Memory= 1254.572 t= 442 R= 3e+04 -Depth= 9223 States= 1.4e+07 Transitions= 1.72e+08 Memory= 1302.717 t= 539 R= 3e+04 -Depth= 9223 States= 1.5e+07 Transitions= 1.91e+08 Memory= 1354.768 t= 600 R= 3e+04 -Depth= 9223 States= 1.6e+07 Transitions= 2.08e+08 Memory= 1405.842 t= 653 R= 2e+04 -Depth= 9223 States= 1.7e+07 Transitions= 2.2e+08 Memory= 1456.818 t= 691 R= 2e+04 -Depth= 9223 States= 1.8e+07 Transitions= 2.39e+08 Memory= 1506.135 t= 751 R= 2e+04 -Depth= 9223 States= 1.9e+07 Transitions= 2.55e+08 Memory= 1556.330 t= 801 R= 2e+04 -Depth= 9223 States= 2e+07 Transitions= 2.72e+08 Memory= 1604.084 t= 856 R= 2e+04 -Depth= 9285 States= 2.1e+07 Transitions= 2.85e+08 Memory= 1650.080 t= 898 R= 2e+04 -Depth= 9324 States= 2.2e+07 Transitions= 2.99e+08 Memory= 1696.760 t= 941 R= 2e+04 -Depth= 9324 States= 2.3e+07 Transitions= 3.1e+08 Memory= 1746.369 t= 976 R= 2e+04 -Depth= 9324 States= 2.4e+07 Transitions= 3.21e+08 Memory= 1792.561 t= 1.01e+03 R= 2e+04 -Depth= 9324 States= 2.5e+07 Transitions= 3.34e+08 Memory= 1841.096 t= 1.05e+03 R= 2e+04 -Depth= 9324 States= 2.6e+07 Transitions= 3.45e+08 Memory= 1890.998 t= 1.09e+03 R= 2e+04 -Depth= 9324 States= 2.7e+07 Transitions= 3.59e+08 Memory= 1940.412 t= 1.13e+03 R= 2e+04 -Depth= 9324 States= 2.8e+07 Transitions= 3.71e+08 Memory= 1987.776 t= 1.17e+03 R= 2e+04 -Depth= 9324 States= 2.9e+07 Transitions= 3.84e+08 Memory= 2034.846 t= 1.21e+03 R= 2e+04 -Depth= 9324 States= 3e+07 Transitions= 3.96e+08 Memory= 2081.233 t= 1.25e+03 R= 2e+04 -Depth= 9324 States= 3.1e+07 Transitions= 4.09e+08 Memory= 2129.865 t= 1.29e+03 R= 2e+04 -Depth= 9324 States= 3.2e+07 Transitions= 4.19e+08 Memory= 2179.670 t= 1.32e+03 R= 2e+04 -Depth= 9324 States= 3.3e+07 Transitions= 4.3e+08 Memory= 2227.717 t= 1.36e+03 R= 2e+04 -Depth= 9324 States= 3.4e+07 Transitions= 4.44e+08 Memory= 2277.033 t= 1.4e+03 R= 2e+04 -pan: resizing hashtable to -w26.. done -Depth= 9324 States= 3.5e+07 Transitions= 4.6e+08 Memory= 2824.190 t= 1.46e+03 R= 2e+04 diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free.ltl b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free.ltl deleted file mode 100644 index 6be1be9..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free.ltl +++ /dev/null @@ -1 +0,0 @@ -[] (!read_poison) diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free_nested.define b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free_nested.define deleted file mode 100644 index 0fb59bd..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free_nested.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_NEST_LEVEL 2 diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free_no_mb.define b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free_no_mb.define deleted file mode 100644 index d99d793..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free_no_mb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_MB diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free_no_rmb.define b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free_no_wmb.define b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free_single_flip.define b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress.ltl b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_reader.define b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_reader.log b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_reader.log deleted file mode 100644 index d087e70..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_reader.log +++ /dev/null @@ -1,703 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi-compress' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_reader.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1362) -depth 7: Claim reached state 9 (line 1367) -depth 131: Claim reached state 9 (line 1366) -Depth= 108226 States= 1e+06 Transitions= 1.1e+07 Memory= 495.354 t= 32.5 R= 3e+04 -Depth= 108226 States= 2e+06 Transitions= 2.2e+07 Memory= 526.018 t= 65.8 R= 3e+04 -Depth= 108226 States= 3e+06 Transitions= 3.31e+07 Memory= 555.510 t= 99.5 R= 3e+04 -pan: resizing hashtable to -w22.. done -Depth= 108226 States= 4e+06 Transitions= 4.38e+07 Memory= 615.733 t= 132 R= 3e+04 -Depth= 108226 States= 5e+06 Transitions= 5.47e+07 Memory= 644.346 t= 164 R= 3e+04 -Depth= 108226 States= 6e+06 Transitions= 6.54e+07 Memory= 671.983 t= 197 R= 3e+04 -Depth= 108226 States= 7e+06 Transitions= 7.64e+07 Memory= 700.108 t= 230 R= 3e+04 -Depth= 110273 States= 8e+06 Transitions= 8.89e+07 Memory= 728.428 t= 268 R= 3e+04 -Depth= 110273 States= 9e+06 Transitions= 1.02e+08 Memory= 757.920 t= 310 R= 3e+04 -pan: resizing hashtable to -w24.. done -Depth= 110273 States= 1e+07 Transitions= 1.14e+08 Memory= 911.408 t= 347 R= 3e+04 -Depth= 110273 States= 1.1e+07 Transitions= 1.26e+08 Memory= 939.924 t= 380 R= 3e+04 -Depth= 110273 States= 1.2e+07 Transitions= 1.37e+08 Memory= 968.440 t= 414 R= 3e+04 -Depth= 110273 States= 1.3e+07 Transitions= 1.58e+08 Memory= 996.272 t= 479 R= 3e+04 -Depth= 110273 States= 1.4e+07 Transitions= 1.69e+08 Memory= 1026.545 t= 513 R= 3e+04 -Depth= 110273 States= 1.5e+07 Transitions= 1.81e+08 Memory= 1055.451 t= 550 R= 3e+04 -Depth= 110273 States= 1.6e+07 Transitions= 1.92e+08 Memory= 1084.943 t= 583 R= 3e+04 -Depth= 110273 States= 1.7e+07 Transitions= 2.03e+08 Memory= 1114.045 t= 615 R= 3e+04 -Depth= 110273 States= 1.8e+07 Transitions= 2.14e+08 Memory= 1144.318 t= 647 R= 3e+04 -Depth= 110273 States= 1.9e+07 Transitions= 2.25e+08 Memory= 1173.420 t= 680 R= 3e+04 -Depth= 110273 States= 2e+07 Transitions= 2.36e+08 Memory= 1202.717 t= 713 R= 3e+04 -Depth= 110273 States= 2.1e+07 Transitions= 2.47e+08 Memory= 1232.404 t= 746 R= 3e+04 -Depth= 110273 States= 2.2e+07 Transitions= 2.58e+08 Memory= 1262.092 t= 778 R= 3e+04 -Depth= 110273 States= 2.3e+07 Transitions= 2.69e+08 Memory= 1290.119 t= 811 R= 3e+04 -Depth= 110273 States= 2.4e+07 Transitions= 2.82e+08 Memory= 1317.268 t= 851 R= 3e+04 -Depth= 110273 States= 2.5e+07 Transitions= 2.96e+08 Memory= 1345.783 t= 893 R= 3e+04 -Depth= 110273 States= 2.6e+07 Transitions= 3.13e+08 Memory= 1373.615 t= 948 R= 3e+04 -Depth= 110273 States= 2.7e+07 Transitions= 3.48e+08 Memory= 1403.889 t= 1.06e+03 R= 3e+04 -Depth= 110273 States= 2.8e+07 Transitions= 3.7e+08 Memory= 1434.651 t= 1.13e+03 R= 2e+04 -Depth= 110273 States= 2.9e+07 Transitions= 3.84e+08 Memory= 1464.338 t= 1.17e+03 R= 2e+04 -Depth= 110273 States= 3e+07 Transitions= 4.04e+08 Memory= 1492.365 t= 1.24e+03 R= 2e+04 -Depth= 110273 States= 3.1e+07 Transitions= 4.26e+08 Memory= 1520.490 t= 1.31e+03 R= 2e+04 -Depth= 110273 States= 3.2e+07 Transitions= 4.42e+08 Memory= 1550.080 t= 1.36e+03 R= 2e+04 -Depth= 110273 States= 3.3e+07 Transitions= 4.63e+08 Memory= 1578.791 t= 1.42e+03 R= 2e+04 -Depth= 110273 States= 3.4e+07 Transitions= 4.87e+08 Memory= 1605.842 t= 1.5e+03 R= 2e+04 -pan: resizing hashtable to -w26.. done -Depth= 110273 States= 3.5e+07 Transitions= 5.01e+08 Memory= 2130.147 t= 1.55e+03 R= 2e+04 -Depth= 110273 States= 3.6e+07 Transitions= 5.22e+08 Memory= 2158.467 t= 1.61e+03 R= 2e+04 -Depth= 110273 States= 3.7e+07 Transitions= 5.4e+08 Memory= 2186.006 t= 1.67e+03 R= 2e+04 -Depth= 110273 States= 3.8e+07 Transitions= 5.61e+08 Memory= 2213.545 t= 1.74e+03 R= 2e+04 -Depth= 110273 States= 3.9e+07 Transitions= 5.82e+08 Memory= 2242.061 t= 1.82e+03 R= 2e+04 -Depth= 110273 States= 4e+07 Transitions= 6e+08 Memory= 2270.088 t= 1.87e+03 R= 2e+04 -Depth= 110273 States= 4.1e+07 Transitions= 6.18e+08 Memory= 2298.408 t= 1.93e+03 R= 2e+04 -Depth= 110273 States= 4.2e+07 Transitions= 6.37e+08 Memory= 2325.850 t= 1.99e+03 R= 2e+04 -Depth= 110273 States= 4.3e+07 Transitions= 6.65e+08 Memory= 2352.803 t= 2.08e+03 R= 2e+04 -Depth= 110273 States= 4.4e+07 Transitions= 6.82e+08 Memory= 2380.733 t= 2.13e+03 R= 2e+04 -Depth= 110273 States= 4.5e+07 Transitions= 6.99e+08 Memory= 2408.076 t= 2.18e+03 R= 2e+04 -Depth= 110273 States= 4.6e+07 Transitions= 7.12e+08 Memory= 2434.346 t= 2.23e+03 R= 2e+04 -Depth= 110273 States= 4.7e+07 Transitions= 7.26e+08 Memory= 2462.959 t= 2.27e+03 R= 2e+04 -Depth= 110273 States= 4.8e+07 Transitions= 7.4e+08 Memory= 2493.721 t= 2.31e+03 R= 2e+04 -Depth= 110273 States= 4.9e+07 Transitions= 7.53e+08 Memory= 2522.627 t= 2.35e+03 R= 2e+04 -Depth= 110273 States= 5e+07 Transitions= 7.66e+08 Memory= 2552.803 t= 2.39e+03 R= 2e+04 -Depth= 110273 States= 5.1e+07 Transitions= 7.77e+08 Memory= 2583.565 t= 2.42e+03 R= 2e+04 -Depth= 110273 States= 5.2e+07 Transitions= 7.9e+08 Memory= 2611.006 t= 2.46e+03 R= 2e+04 -Depth= 110273 States= 5.3e+07 Transitions= 8.16e+08 Memory= 2641.182 t= 2.54e+03 R= 2e+04 -Depth= 110273 States= 5.4e+07 Transitions= 8.52e+08 Memory= 2673.213 t= 2.66e+03 R= 2e+04 -Depth= 110273 States= 5.5e+07 Transitions= 8.93e+08 Memory= 2707.197 t= 2.79e+03 R= 2e+04 -Depth= 110273 States= 5.6e+07 Transitions= 9.4e+08 Memory= 2738.447 t= 2.94e+03 R= 2e+04 -Depth= 110273 States= 5.7e+07 Transitions= 9.81e+08 Memory= 2767.354 t= 3.08e+03 R= 2e+04 -Depth= 110273 States= 5.8e+07 Transitions= 1.01e+09 Memory= 2794.111 t= 3.16e+03 R= 2e+04 -Depth= 110273 States= 5.9e+07 Transitions= 1.02e+09 Memory= 2822.529 t= 3.21e+03 R= 2e+04 -Depth= 110273 States= 6e+07 Transitions= 1.05e+09 Memory= 2850.654 t= 3.28e+03 R= 2e+04 -Depth= 110273 States= 6.1e+07 Transitions= 1.08e+09 Memory= 2879.170 t= 3.39e+03 R= 2e+04 -Depth= 110273 States= 6.2e+07 Transitions= 1.1e+09 Memory= 2908.858 t= 3.44e+03 R= 2e+04 -Depth= 110273 States= 6.3e+07 Transitions= 1.11e+09 Memory= 2935.908 t= 3.49e+03 R= 2e+04 -Depth= 110273 States= 6.4e+07 Transitions= 1.13e+09 Memory= 2960.518 t= 3.54e+03 R= 2e+04 -Depth= 110273 States= 6.5e+07 Transitions= 1.14e+09 Memory= 2990.205 t= 3.58e+03 R= 2e+04 -Depth= 110273 States= 6.6e+07 Transitions= 1.17e+09 Memory= 3018.721 t= 3.67e+03 R= 2e+04 -Depth= 110273 States= 6.7e+07 Transitions= 1.18e+09 Memory= 3047.041 t= 3.71e+03 R= 2e+04 -Depth= 110273 States= 6.8e+07 Transitions= 1.21e+09 Memory= 3074.580 t= 3.79e+03 R= 2e+04 -Depth= 110273 States= 6.9e+07 Transitions= 1.23e+09 Memory= 3101.826 t= 3.87e+03 R= 2e+04 -Depth= 110273 States= 7e+07 Transitions= 1.27e+09 Memory= 3130.635 t= 3.98e+03 R= 2e+04 -Depth= 110273 States= 7.1e+07 Transitions= 1.29e+09 Memory= 3157.197 t= 4.06e+03 R= 2e+04 -Depth= 110273 States= 7.2e+07 Transitions= 1.32e+09 Memory= 3184.443 t= 4.16e+03 R= 2e+04 -Depth= 110273 States= 7.3e+07 Transitions= 1.34e+09 Memory= 3211.690 t= 4.24e+03 R= 2e+04 -Depth= 110273 States= 7.4e+07 Transitions= 1.37e+09 Memory= 3239.229 t= 4.32e+03 R= 2e+04 -Depth= 110273 States= 7.5e+07 Transitions= 1.38e+09 Memory= 3266.670 t= 4.38e+03 R= 2e+04 -Depth= 110273 States= 7.6e+07 Transitions= 1.41e+09 Memory= 3294.307 t= 4.46e+03 R= 2e+04 -Depth= 110273 States= 7.7e+07 Transitions= 1.44e+09 Memory= 3322.432 t= 4.55e+03 R= 2e+04 -Depth= 110273 States= 7.8e+07 Transitions= 1.46e+09 Memory= 3352.608 t= 4.62e+03 R= 2e+04 -Depth= 110273 States= 7.9e+07 Transitions= 1.47e+09 Memory= 3378.193 t= 4.66e+03 R= 2e+04 -Depth= 110273 States= 8e+07 Transitions= 1.49e+09 Memory= 3407.490 t= 4.71e+03 R= 2e+04 -Depth= 110273 States= 8.1e+07 Transitions= 1.52e+09 Memory= 3436.397 t= 4.8e+03 R= 2e+04 -Depth= 110273 States= 8.2e+07 Transitions= 1.53e+09 Memory= 3461.690 t= 4.84e+03 R= 2e+04 -Depth= 110273 States= 8.3e+07 Transitions= 1.56e+09 Memory= 3491.182 t= 4.92e+03 R= 2e+04 -Depth= 110273 States= 8.4e+07 Transitions= 1.57e+09 Memory= 3519.990 t= 4.98e+03 R= 2e+04 -Depth= 110273 States= 8.5e+07 Transitions= 1.59e+09 Memory= 3546.065 t= 5.02e+03 R= 2e+04 -Depth= 110273 States= 8.6e+07 Transitions= 1.6e+09 Memory= 3575.459 t= 5.07e+03 R= 2e+04 -Depth= 110273 States= 8.7e+07 Transitions= 1.63e+09 Memory= 3605.049 t= 5.14e+03 R= 2e+04 -Depth= 110273 States= 8.8e+07 Transitions= 1.64e+09 Memory= 3632.588 t= 5.2e+03 R= 2e+04 -Depth= 110273 States= 8.9e+07 Transitions= 1.66e+09 Memory= 3661.787 t= 5.26e+03 R= 2e+04 -Depth= 110273 States= 9e+07 Transitions= 1.68e+09 Memory= 3688.154 t= 5.3e+03 R= 2e+04 -Depth= 110273 States= 9.1e+07 Transitions= 1.7e+09 Memory= 3715.986 t= 5.36e+03 R= 2e+04 -Depth= 110273 States= 9.2e+07 Transitions= 1.71e+09 Memory= 3743.623 t= 5.41e+03 R= 2e+04 -Depth= 110273 States= 9.3e+07 Transitions= 1.73e+09 Memory= 3771.358 t= 5.46e+03 R= 2e+04 -Depth= 110273 States= 9.4e+07 Transitions= 1.75e+09 Memory= 3797.920 t= 5.53e+03 R= 2e+04 -Depth= 110273 States= 9.5e+07 Transitions= 1.77e+09 Memory= 3827.119 t= 5.6e+03 R= 2e+04 -Depth= 110273 States= 9.6e+07 Transitions= 1.79e+09 Memory= 3858.858 t= 5.64e+03 R= 2e+04 -Depth= 110273 States= 9.7e+07 Transitions= 1.8e+09 Memory= 3885.713 t= 5.7e+03 R= 2e+04 -Depth= 110273 States= 9.8e+07 Transitions= 1.82e+09 Memory= 3914.717 t= 5.75e+03 R= 2e+04 -Depth= 110273 States= 9.9e+07 Transitions= 1.84e+09 Memory= 3941.670 t= 5.81e+03 R= 2e+04 -Depth= 110273 States= 1e+08 Transitions= 1.86e+09 Memory= 3968.818 t= 5.87e+03 R= 2e+04 -Depth= 110273 States= 1.01e+08 Transitions= 1.88e+09 Memory= 3994.990 t= 5.94e+03 R= 2e+04 -Depth= 110273 States= 1.02e+08 Transitions= 1.9e+09 Memory= 4023.311 t= 6.01e+03 R= 2e+04 -Depth= 110273 States= 1.03e+08 Transitions= 1.92e+09 Memory= 4053.193 t= 6.08e+03 R= 2e+04 -Depth= 110273 States= 1.04e+08 Transitions= 1.94e+09 Memory= 4078.389 t= 6.12e+03 R= 2e+04 -Depth= 110273 States= 1.05e+08 Transitions= 1.96e+09 Memory= 4108.467 t= 6.2e+03 R= 2e+04 -Depth= 110273 States= 1.06e+08 Transitions= 1.98e+09 Memory= 4137.080 t= 6.25e+03 R= 2e+04 -Depth= 110273 States= 1.07e+08 Transitions= 1.99e+09 Memory= 4163.740 t= 6.29e+03 R= 2e+04 -Depth= 110273 States= 1.08e+08 Transitions= 2.01e+09 Memory= 4191.768 t= 6.35e+03 R= 2e+04 -Depth= 110273 States= 1.09e+08 Transitions= 2.03e+09 Memory= 4221.651 t= 6.4e+03 R= 2e+04 -Depth= 110273 States= 1.1e+08 Transitions= 2.04e+09 Memory= 4249.971 t= 6.45e+03 R= 2e+04 -Depth= 110273 States= 1.11e+08 Transitions= 2.07e+09 Memory= 4278.877 t= 6.52e+03 R= 2e+04 -Depth= 110273 States= 1.12e+08 Transitions= 2.09e+09 Memory= 4308.174 t= 6.59e+03 R= 2e+04 -Depth= 110273 States= 1.13e+08 Transitions= 2.1e+09 Memory= 4333.760 t= 6.64e+03 R= 2e+04 -Depth= 110273 States= 1.14e+08 Transitions= 2.13e+09 Memory= 4363.740 t= 6.71e+03 R= 2e+04 -Depth= 110273 States= 1.15e+08 Transitions= 2.14e+09 Memory= 4392.158 t= 6.76e+03 R= 2e+04 -Depth= 110273 States= 1.16e+08 Transitions= 2.16e+09 Memory= 4419.014 t= 6.81e+03 R= 2e+04 -Depth= 110273 States= 1.17e+08 Transitions= 2.17e+09 Memory= 4446.846 t= 6.86e+03 R= 2e+04 -Depth= 110273 States= 1.18e+08 Transitions= 2.19e+09 Memory= 4476.338 t= 6.91e+03 R= 2e+04 -Depth= 110273 States= 1.19e+08 Transitions= 2.21e+09 Memory= 4505.440 t= 6.96e+03 R= 2e+04 -Depth= 110273 States= 1.2e+08 Transitions= 2.22e+09 Memory= 4529.561 t= 7.01e+03 R= 2e+04 -Depth= 110273 States= 1.21e+08 Transitions= 2.24e+09 Memory= 4557.588 t= 7.07e+03 R= 2e+04 -Depth= 110273 States= 1.22e+08 Transitions= 2.26e+09 Memory= 4584.736 t= 7.12e+03 R= 2e+04 -Depth= 110273 States= 1.23e+08 Transitions= 2.27e+09 Memory= 4612.764 t= 7.18e+03 R= 2e+04 -Depth= 110273 States= 1.24e+08 Transitions= 2.29e+09 Memory= 4640.303 t= 7.22e+03 R= 2e+04 -Depth= 110273 States= 1.25e+08 Transitions= 2.32e+09 Memory= 4669.404 t= 7.32e+03 R= 2e+04 -Depth= 110273 States= 1.26e+08 Transitions= 2.35e+09 Memory= 4698.018 t= 7.44e+03 R= 2e+04 -Depth= 110273 States= 1.27e+08 Transitions= 2.37e+09 Memory= 4728.877 t= 7.49e+03 R= 2e+04 -Depth= 110273 States= 1.28e+08 Transitions= 2.38e+09 Memory= 4757.393 t= 7.54e+03 R= 2e+04 -Depth= 110273 States= 1.29e+08 Transitions= 2.4e+09 Memory= 4785.811 t= 7.6e+03 R= 2e+04 -Depth= 110273 States= 1.3e+08 Transitions= 2.42e+09 Memory= 4814.033 t= 7.66e+03 R= 2e+04 -Depth= 110273 States= 1.31e+08 Transitions= 2.44e+09 Memory= 4843.428 t= 7.72e+03 R= 2e+04 -Depth= 110273 States= 1.32e+08 Transitions= 2.46e+09 Memory= 4871.943 t= 7.78e+03 R= 2e+04 -Depth= 110273 States= 1.33e+08 Transitions= 2.49e+09 Memory= 4898.311 t= 7.88e+03 R= 2e+04 -Depth= 110273 States= 1.34e+08 Transitions= 2.51e+09 Memory= 4926.143 t= 7.95e+03 R= 2e+04 -Depth= 110273 States= 1.35e+08 Transitions= 2.54e+09 Memory= 4953.389 t= 8.02e+03 R= 2e+04 -pan: resizing hashtable to -w28.. done -Depth= 110273 States= 1.36e+08 Transitions= 2.56e+09 Memory= 7001.389 t= 8.13e+03 R= 2e+04 -Depth= 110273 States= 1.37e+08 Transitions= 2.58e+09 Memory= 7001.389 t= 8.19e+03 R= 2e+04 -Depth= 110273 States= 1.38e+08 Transitions= 2.61e+09 Memory= 7018.381 t= 8.26e+03 R= 2e+04 -Depth= 110273 States= 1.39e+08 Transitions= 2.63e+09 Memory= 7045.236 t= 8.33e+03 R= 2e+04 -Depth= 110273 States= 1.4e+08 Transitions= 2.65e+09 Memory= 7073.068 t= 8.39e+03 R= 2e+04 -Depth= 110273 States= 1.41e+08 Transitions= 2.68e+09 Memory= 7100.022 t= 8.48e+03 R= 2e+04 -Depth= 110273 States= 1.42e+08 Transitions= 2.7e+09 Memory= 7128.733 t= 8.54e+03 R= 2e+04 -Depth= 110273 States= 1.43e+08 Transitions= 2.72e+09 Memory= 7155.686 t= 8.6e+03 R= 2e+04 -Depth= 110273 States= 1.44e+08 Transitions= 2.73e+09 Memory= 7181.662 t= 8.65e+03 R= 2e+04 -Depth= 110273 States= 1.45e+08 Transitions= 2.74e+09 Memory= 7209.885 t= 8.69e+03 R= 2e+04 -Depth= 110273 States= 1.46e+08 Transitions= 2.76e+09 Memory= 7239.963 t= 8.73e+03 R= 2e+04 -Depth= 110273 States= 1.47e+08 Transitions= 2.77e+09 Memory= 7269.846 t= 8.77e+03 R= 2e+04 -Depth= 110273 States= 1.48e+08 Transitions= 2.79e+09 Memory= 7299.533 t= 8.82e+03 R= 2e+04 -Depth= 110273 States= 1.49e+08 Transitions= 2.8e+09 Memory= 7327.365 t= 8.87e+03 R= 2e+04 -Depth= 110273 States= 1.5e+08 Transitions= 2.82e+09 Memory= 7356.760 t= 8.92e+03 R= 2e+04 -Depth= 110273 States= 1.51e+08 Transitions= 2.84e+09 Memory= 7384.983 t= 8.97e+03 R= 2e+04 -Depth= 110273 States= 1.52e+08 Transitions= 2.85e+09 Memory= 7412.522 t= 9.02e+03 R= 2e+04 -Depth= 110273 States= 1.53e+08 Transitions= 2.87e+09 Memory= 7440.256 t= 9.09e+03 R= 2e+04 -Depth= 110273 States= 1.54e+08 Transitions= 2.91e+09 Memory= 7471.604 t= 9.2e+03 R= 2e+04 -Depth= 110273 States= 1.55e+08 Transitions= 2.95e+09 Memory= 7506.662 t= 9.32e+03 R= 2e+04 -Depth= 110273 States= 1.56e+08 Transitions= 3e+09 Memory= 7540.744 t= 9.48e+03 R= 2e+04 -Depth= 110273 States= 1.57e+08 Transitions= 3.04e+09 Memory= 7570.041 t= 9.62e+03 R= 2e+04 -Depth= 110273 States= 1.58e+08 Transitions= 3.07e+09 Memory= 7593.772 t= 9.72e+03 R= 2e+04 -Depth= 110273 States= 1.59e+08 Transitions= 3.09e+09 Memory= 7622.580 t= 9.77e+03 R= 2e+04 -Depth= 110273 States= 1.6e+08 Transitions= 3.11e+09 Memory= 7650.315 t= 9.83e+03 R= 2e+04 -Depth= 110273 States= 1.61e+08 Transitions= 3.14e+09 Memory= 7678.733 t= 9.93e+03 R= 2e+04 -Depth= 110273 States= 1.62e+08 Transitions= 3.16e+09 Memory= 7707.639 t= 1e+04 R= 2e+04 -Depth= 110273 States= 1.63e+08 Transitions= 3.18e+09 Memory= 7735.276 t= 1.01e+04 R= 2e+04 -Depth= 110273 States= 1.64e+08 Transitions= 3.2e+09 Memory= 7761.350 t= 1.01e+04 R= 2e+04 -Depth= 110273 States= 1.65e+08 Transitions= 3.21e+09 Memory= 7787.326 t= 1.02e+04 R= 2e+04 -Depth= 110273 States= 1.66e+08 Transitions= 3.23e+09 Memory= 7817.111 t= 1.02e+04 R= 2e+04 -Depth= 110273 States= 1.67e+08 Transitions= 3.25e+09 Memory= 7844.065 t= 1.03e+04 R= 2e+04 -Depth= 110273 States= 1.68e+08 Transitions= 3.28e+09 Memory= 7871.213 t= 1.04e+04 R= 2e+04 -Depth= 110273 States= 1.69e+08 Transitions= 3.3e+09 Memory= 7898.264 t= 1.04e+04 R= 2e+04 -Depth= 110273 States= 1.7e+08 Transitions= 3.32e+09 Memory= 7925.608 t= 1.05e+04 R= 2e+04 -Depth= 110273 States= 1.71e+08 Transitions= 3.35e+09 Memory= 7952.658 t= 1.06e+04 R= 2e+04 -Depth= 110273 States= 1.72e+08 Transitions= 3.38e+09 Memory= 7981.467 t= 1.07e+04 R= 2e+04 -Depth= 110273 States= 1.73e+08 Transitions= 3.4e+09 Memory= 8009.592 t= 1.08e+04 R= 2e+04 -Depth= 110273 States= 1.74e+08 Transitions= 3.43e+09 Memory= 8036.154 t= 1.08e+04 R= 2e+04 -Depth= 110273 States= 1.75e+08 Transitions= 3.45e+09 Memory= 8063.108 t= 1.09e+04 R= 2e+04 -Depth= 110273 States= 1.76e+08 Transitions= 3.48e+09 Memory= 8091.428 t= 1.1e+04 R= 2e+04 -Depth= 110273 States= 1.77e+08 Transitions= 3.5e+09 Memory= 8119.943 t= 1.11e+04 R= 2e+04 -Depth= 110273 States= 1.78e+08 Transitions= 3.53e+09 Memory= 8148.459 t= 1.12e+04 R= 2e+04 -Depth= 110273 States= 1.79e+08 Transitions= 3.54e+09 Memory= 8176.779 t= 1.12e+04 R= 2e+04 -Depth= 110273 States= 1.8e+08 Transitions= 3.56e+09 Memory= 8202.463 t= 1.12e+04 R= 2e+04 -Depth= 110273 States= 1.81e+08 Transitions= 3.58e+09 Memory= 8232.053 t= 1.13e+04 R= 2e+04 -Depth= 110273 States= 1.82e+08 Transitions= 3.6e+09 Memory= 8260.178 t= 1.14e+04 R= 2e+04 -Depth= 110273 States= 1.83e+08 Transitions= 3.62e+09 Memory= 8288.596 t= 1.14e+04 R= 2e+04 -Depth= 110273 States= 1.84e+08 Transitions= 3.64e+09 Memory= 8317.502 t= 1.15e+04 R= 2e+04 -Depth= 110273 States= 1.85e+08 Transitions= 3.66e+09 Memory= 8342.697 t= 1.16e+04 R= 2e+04 -Depth= 110273 States= 1.86e+08 Transitions= 3.67e+09 Memory= 8371.506 t= 1.16e+04 R= 2e+04 -Depth= 110273 States= 1.87e+08 Transitions= 3.69e+09 Memory= 8400.803 t= 1.17e+04 R= 2e+04 -Depth= 110273 States= 1.88e+08 Transitions= 3.71e+09 Memory= 8428.440 t= 1.17e+04 R= 2e+04 -Depth= 110273 States= 1.89e+08 Transitions= 3.73e+09 Memory= 8458.029 t= 1.18e+04 R= 2e+04 -Depth= 110273 States= 1.9e+08 Transitions= 3.75e+09 Memory= 8484.885 t= 1.18e+04 R= 2e+04 -Depth= 110273 States= 1.91e+08 Transitions= 3.76e+09 Memory= 8512.522 t= 1.19e+04 R= 2e+04 -Depth= 110273 States= 1.92e+08 Transitions= 3.78e+09 Memory= 8540.549 t= 1.19e+04 R= 2e+04 -Depth= 110273 States= 1.93e+08 Transitions= 3.79e+09 Memory= 8567.893 t= 1.2e+04 R= 2e+04 -Depth= 110273 States= 1.94e+08 Transitions= 3.82e+09 Memory= 8595.041 t= 1.21e+04 R= 2e+04 -Depth= 110273 States= 1.95e+08 Transitions= 3.84e+09 Memory= 8626.584 t= 1.21e+04 R= 2e+04 -Depth= 110273 States= 1.96e+08 Transitions= 3.85e+09 Memory= 8655.295 t= 1.22e+04 R= 2e+04 -Depth= 110273 States= 1.97e+08 Transitions= 3.87e+09 Memory= 8683.908 t= 1.22e+04 R= 2e+04 -Depth= 110273 States= 1.98e+08 Transitions= 3.89e+09 Memory= 8711.447 t= 1.23e+04 R= 2e+04 -Depth= 110273 States= 1.99e+08 Transitions= 3.91e+09 Memory= 8738.108 t= 1.23e+04 R= 2e+04 -Depth= 110273 States= 2e+08 Transitions= 3.93e+09 Memory= 8766.818 t= 1.24e+04 R= 2e+04 -Depth= 110273 States= 2.01e+08 Transitions= 3.95e+09 Memory= 8796.701 t= 1.25e+04 R= 2e+04 -Depth= 110273 States= 2.02e+08 Transitions= 3.96e+09 Memory= 8821.897 t= 1.25e+04 R= 2e+04 -Depth= 110273 States= 2.03e+08 Transitions= 3.99e+09 Memory= 8852.072 t= 1.26e+04 R= 2e+04 -Depth= 110273 States= 2.04e+08 Transitions= 4e+09 Memory= 8880.490 t= 1.26e+04 R= 2e+04 -Depth= 110273 States= 2.05e+08 Transitions= 4.02e+09 Memory= 8907.541 t= 1.27e+04 R= 2e+04 -Depth= 110273 States= 2.06e+08 Transitions= 4.03e+09 Memory= 8935.373 t= 1.27e+04 R= 2e+04 -Depth= 110273 States= 2.07e+08 Transitions= 4.05e+09 Memory= 8965.354 t= 1.28e+04 R= 2e+04 -Depth= 110273 States= 2.08e+08 Transitions= 4.07e+09 Memory= 8993.674 t= 1.28e+04 R= 2e+04 -Depth= 110273 States= 2.09e+08 Transitions= 4.09e+09 Memory= 9022.190 t= 1.29e+04 R= 2e+04 -Depth= 110273 States= 2.1e+08 Transitions= 4.11e+09 Memory= 9052.072 t= 1.3e+04 R= 2e+04 -Depth= 110273 States= 2.11e+08 Transitions= 4.13e+09 Memory= 9077.268 t= 1.3e+04 R= 2e+04 -Depth= 110273 States= 2.12e+08 Transitions= 4.15e+09 Memory= 9107.248 t= 1.31e+04 R= 2e+04 -Depth= 110273 States= 2.13e+08 Transitions= 4.16e+09 Memory= 9135.861 t= 1.31e+04 R= 2e+04 -Depth= 110273 States= 2.14e+08 Transitions= 4.18e+09 Memory= 9162.619 t= 1.32e+04 R= 2e+04 -Depth= 110273 States= 2.15e+08 Transitions= 4.2e+09 Memory= 9190.549 t= 1.32e+04 R= 2e+04 -Depth= 110273 States= 2.16e+08 Transitions= 4.21e+09 Memory= 9220.139 t= 1.33e+04 R= 2e+04 -Depth= 110273 States= 2.17e+08 Transitions= 4.23e+09 Memory= 9248.947 t= 1.33e+04 R= 2e+04 -Depth= 110273 States= 2.18e+08 Transitions= 4.25e+09 Memory= 9273.166 t= 1.34e+04 R= 2e+04 -Depth= 110273 States= 2.19e+08 Transitions= 4.26e+09 Memory= 9301.096 t= 1.34e+04 R= 2e+04 -Depth= 110273 States= 2.2e+08 Transitions= 4.28e+09 Memory= 9329.221 t= 1.35e+04 R= 2e+04 -Depth= 110273 States= 2.21e+08 Transitions= 4.29e+09 Memory= 9356.858 t= 1.35e+04 R= 2e+04 -Depth= 110273 States= 2.22e+08 Transitions= 4.32e+09 Memory= 9384.494 t= 1.36e+04 R= 2e+04 -Depth= 110273 States= 2.23e+08 Transitions= 4.35e+09 Memory= 9414.279 t= 1.37e+04 R= 2e+04 -Depth= 110273 States= 2.24e+08 Transitions= 4.37e+09 Memory= 9445.139 t= 1.38e+04 R= 2e+04 -Depth= 110273 States= 2.25e+08 Transitions= 4.39e+09 Memory= 9473.361 t= 1.38e+04 R= 2e+04 -Depth= 110273 States= 2.26e+08 Transitions= 4.4e+09 Memory= 9502.365 t= 1.39e+04 R= 2e+04 -Depth= 110273 States= 2.27e+08 Transitions= 4.42e+09 Memory= 9530.783 t= 1.39e+04 R= 2e+04 -Depth= 110273 States= 2.28e+08 Transitions= 4.44e+09 Memory= 9559.592 t= 1.4e+04 R= 2e+04 -Depth= 110273 States= 2.29e+08 Transitions= 4.47e+09 Memory= 9586.838 t= 1.41e+04 R= 2e+04 -Depth= 110273 States= 2.3e+08 Transitions= 4.49e+09 Memory= 9612.815 t= 1.42e+04 R= 2e+04 -Depth= 110273 States= 2.31e+08 Transitions= 4.52e+09 Memory= 9639.572 t= 1.42e+04 R= 2e+04 -Depth= 110273 States= 2.32e+08 Transitions= 4.54e+09 Memory= 9666.233 t= 1.43e+04 R= 2e+04 -Depth= 110273 States= 2.33e+08 Transitions= 4.57e+09 Memory= 9692.307 t= 1.44e+04 R= 2e+04 -Depth= 110273 States= 2.34e+08 Transitions= 4.59e+09 Memory= 9718.186 t= 1.45e+04 R= 2e+04 -Depth= 110273 States= 2.35e+08 Transitions= 4.61e+09 Memory= 9746.604 t= 1.45e+04 R= 2e+04 -Depth= 110273 States= 2.36e+08 Transitions= 4.63e+09 Memory= 9772.678 t= 1.46e+04 R= 2e+04 -Depth= 110273 States= 2.37e+08 Transitions= 4.65e+09 Memory= 9799.826 t= 1.46e+04 R= 2e+04 -Depth= 110273 States= 2.38e+08 Transitions= 4.67e+09 Memory= 9826.779 t= 1.47e+04 R= 2e+04 -Depth= 110273 States= 2.39e+08 Transitions= 4.7e+09 Memory= 9853.342 t= 1.48e+04 R= 2e+04 -Depth= 110273 States= 2.4e+08 Transitions= 4.72e+09 Memory= 9879.709 t= 1.49e+04 R= 2e+04 -Depth= 110273 States= 2.41e+08 Transitions= 4.75e+09 Memory= 9906.174 t= 1.49e+04 R= 2e+04 -Depth= 110273 States= 2.42e+08 Transitions= 4.77e+09 Memory= 9934.006 t= 1.5e+04 R= 2e+04 -Depth= 110273 States= 2.43e+08 Transitions= 4.79e+09 Memory= 9960.471 t= 1.51e+04 R= 2e+04 -Depth= 110273 States= 2.44e+08 Transitions= 4.81e+09 Memory= 9987.229 t= 1.51e+04 R= 2e+04 -Depth= 110273 States= 2.45e+08 Transitions= 4.83e+09 Memory= 10014.084 t= 1.52e+04 R= 2e+04 -Depth= 110273 States= 2.46e+08 Transitions= 4.85e+09 Memory= 10040.842 t= 1.53e+04 R= 2e+04 -Depth= 110273 States= 2.47e+08 Transitions= 4.87e+09 Memory= 10067.404 t= 1.53e+04 R= 2e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 80 byte, depth reached 110273, errors: 0 -1.5183145e+08 states, stored (2.47605e+08 visited) -4.6348493e+09 states, matched -4.8824543e+09 transitions (= visited+matched) -7.5925477e+10 atomic steps -hash conflicts: 9.7802755e+08 (resolved) - -Stats on memory usage (in Megabytes): -16796.540 equivalent memory usage for states (stored*(State-vector + overhead)) - 7578.458 actual memory usage for states (compression: 45.12%) - state-vector as stored = 16 byte + 36 byte overhead - 2048.000 memory used for hash table (-w28) - 457.764 memory used for DFS stack (-m10000000) - 1.290 memory lost to fragmentation -10082.932 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 547261 4207 4043 2 2 ] -unreached in proctype urcu_reader - line 268, "pan.___", state 57, "cache_dirty_urcu_gp_ctr = 0" - line 276, "pan.___", state 79, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 88, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 104, "(1)" - line 249, "pan.___", state 112, "(1)" - line 253, "pan.___", state 124, "(1)" - line 257, "pan.___", state 132, "(1)" - line 407, "pan.___", state 158, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 190, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 204, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 222, "(1)" - line 253, "pan.___", state 242, "(1)" - line 257, "pan.___", state 250, "(1)" - line 687, "pan.___", state 269, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 407, "pan.___", state 276, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 308, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 322, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 340, "(1)" - line 253, "pan.___", state 360, "(1)" - line 257, "pan.___", state 368, "(1)" - line 407, "pan.___", state 387, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 419, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 433, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 451, "(1)" - line 253, "pan.___", state 471, "(1)" - line 257, "pan.___", state 479, "(1)" - line 407, "pan.___", state 500, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 502, "(1)" - line 407, "pan.___", state 503, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 503, "else" - line 407, "pan.___", state 506, "(1)" - line 411, "pan.___", state 514, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 516, "(1)" - line 411, "pan.___", state 517, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 517, "else" - line 411, "pan.___", state 520, "(1)" - line 411, "pan.___", state 521, "(1)" - line 411, "pan.___", state 521, "(1)" - line 409, "pan.___", state 526, "((i<1))" - line 409, "pan.___", state 526, "((i>=1))" - line 416, "pan.___", state 532, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 534, "(1)" - line 416, "pan.___", state 535, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 535, "else" - line 416, "pan.___", state 538, "(1)" - line 416, "pan.___", state 539, "(1)" - line 416, "pan.___", state 539, "(1)" - line 420, "pan.___", state 546, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 548, "(1)" - line 420, "pan.___", state 549, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 549, "else" - line 420, "pan.___", state 552, "(1)" - line 420, "pan.___", state 553, "(1)" - line 420, "pan.___", state 553, "(1)" - line 418, "pan.___", state 558, "((i<2))" - line 418, "pan.___", state 558, "((i>=2))" - line 245, "pan.___", state 564, "(1)" - line 249, "pan.___", state 572, "(1)" - line 249, "pan.___", state 573, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 573, "else" - line 247, "pan.___", state 578, "((i<1))" - line 247, "pan.___", state 578, "((i>=1))" - line 253, "pan.___", state 584, "(1)" - line 253, "pan.___", state 585, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 585, "else" - line 257, "pan.___", state 592, "(1)" - line 257, "pan.___", state 593, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 593, "else" - line 255, "pan.___", state 598, "((i<2))" - line 255, "pan.___", state 598, "((i>=2))" - line 262, "pan.___", state 602, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 602, "else" - line 427, "pan.___", state 604, "(1)" - line 427, "pan.___", state 604, "(1)" - line 687, "pan.___", state 607, "cached_urcu_active_readers = (tmp+1)" - line 687, "pan.___", state 608, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 687, "pan.___", state 609, "(1)" - line 407, "pan.___", state 616, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 648, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 662, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 680, "(1)" - line 253, "pan.___", state 700, "(1)" - line 257, "pan.___", state 708, "(1)" - line 407, "pan.___", state 734, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 766, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 780, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 798, "(1)" - line 253, "pan.___", state 818, "(1)" - line 257, "pan.___", state 826, "(1)" - line 407, "pan.___", state 845, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 847, "(1)" - line 407, "pan.___", state 848, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 848, "else" - line 407, "pan.___", state 851, "(1)" - line 411, "pan.___", state 859, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 861, "(1)" - line 411, "pan.___", state 862, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 862, "else" - line 411, "pan.___", state 865, "(1)" - line 411, "pan.___", state 866, "(1)" - line 411, "pan.___", state 866, "(1)" - line 409, "pan.___", state 871, "((i<1))" - line 409, "pan.___", state 871, "((i>=1))" - line 416, "pan.___", state 877, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 879, "(1)" - line 416, "pan.___", state 880, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 880, "else" - line 416, "pan.___", state 883, "(1)" - line 416, "pan.___", state 884, "(1)" - line 416, "pan.___", state 884, "(1)" - line 420, "pan.___", state 891, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 893, "(1)" - line 420, "pan.___", state 894, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 894, "else" - line 420, "pan.___", state 897, "(1)" - line 420, "pan.___", state 898, "(1)" - line 420, "pan.___", state 898, "(1)" - line 418, "pan.___", state 903, "((i<2))" - line 418, "pan.___", state 903, "((i>=2))" - line 245, "pan.___", state 909, "(1)" - line 249, "pan.___", state 917, "(1)" - line 249, "pan.___", state 918, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 918, "else" - line 247, "pan.___", state 923, "((i<1))" - line 247, "pan.___", state 923, "((i>=1))" - line 253, "pan.___", state 929, "(1)" - line 253, "pan.___", state 930, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 930, "else" - line 257, "pan.___", state 937, "(1)" - line 257, "pan.___", state 938, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 938, "else" - line 255, "pan.___", state 943, "((i<2))" - line 255, "pan.___", state 943, "((i>=2))" - line 262, "pan.___", state 947, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 947, "else" - line 427, "pan.___", state 949, "(1)" - line 427, "pan.___", state 949, "(1)" - line 695, "pan.___", state 953, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 407, "pan.___", state 958, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 990, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1004, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1022, "(1)" - line 253, "pan.___", state 1042, "(1)" - line 257, "pan.___", state 1050, "(1)" - line 407, "pan.___", state 1072, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1104, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1118, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1136, "(1)" - line 253, "pan.___", state 1156, "(1)" - line 257, "pan.___", state 1164, "(1)" - line 407, "pan.___", state 1187, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1219, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1233, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1251, "(1)" - line 253, "pan.___", state 1271, "(1)" - line 257, "pan.___", state 1279, "(1)" - line 407, "pan.___", state 1298, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1330, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1344, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1362, "(1)" - line 253, "pan.___", state 1382, "(1)" - line 257, "pan.___", state 1390, "(1)" - line 407, "pan.___", state 1414, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1446, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1460, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1478, "(1)" - line 253, "pan.___", state 1498, "(1)" - line 257, "pan.___", state 1506, "(1)" - line 407, "pan.___", state 1525, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1557, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1571, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1589, "(1)" - line 253, "pan.___", state 1609, "(1)" - line 257, "pan.___", state 1617, "(1)" - line 407, "pan.___", state 1639, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1671, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1685, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1703, "(1)" - line 253, "pan.___", state 1723, "(1)" - line 257, "pan.___", state 1731, "(1)" - line 734, "pan.___", state 1750, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 407, "pan.___", state 1757, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1789, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1803, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1821, "(1)" - line 253, "pan.___", state 1841, "(1)" - line 257, "pan.___", state 1849, "(1)" - line 407, "pan.___", state 1868, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1900, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1914, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1932, "(1)" - line 253, "pan.___", state 1952, "(1)" - line 257, "pan.___", state 1960, "(1)" - line 407, "pan.___", state 1981, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 1983, "(1)" - line 407, "pan.___", state 1984, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 1984, "else" - line 407, "pan.___", state 1987, "(1)" - line 411, "pan.___", state 1995, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 1997, "(1)" - line 411, "pan.___", state 1998, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 1998, "else" - line 411, "pan.___", state 2001, "(1)" - line 411, "pan.___", state 2002, "(1)" - line 411, "pan.___", state 2002, "(1)" - line 409, "pan.___", state 2007, "((i<1))" - line 409, "pan.___", state 2007, "((i>=1))" - line 416, "pan.___", state 2013, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 2015, "(1)" - line 416, "pan.___", state 2016, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 2016, "else" - line 416, "pan.___", state 2019, "(1)" - line 416, "pan.___", state 2020, "(1)" - line 416, "pan.___", state 2020, "(1)" - line 420, "pan.___", state 2027, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 2029, "(1)" - line 420, "pan.___", state 2030, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 2030, "else" - line 420, "pan.___", state 2033, "(1)" - line 420, "pan.___", state 2034, "(1)" - line 420, "pan.___", state 2034, "(1)" - line 418, "pan.___", state 2039, "((i<2))" - line 418, "pan.___", state 2039, "((i>=2))" - line 245, "pan.___", state 2045, "(1)" - line 249, "pan.___", state 2053, "(1)" - line 249, "pan.___", state 2054, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 2054, "else" - line 247, "pan.___", state 2059, "((i<1))" - line 247, "pan.___", state 2059, "((i>=1))" - line 253, "pan.___", state 2065, "(1)" - line 253, "pan.___", state 2066, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 2066, "else" - line 257, "pan.___", state 2073, "(1)" - line 257, "pan.___", state 2074, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 2074, "else" - line 255, "pan.___", state 2079, "((i<2))" - line 255, "pan.___", state 2079, "((i>=2))" - line 262, "pan.___", state 2083, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 2083, "else" - line 427, "pan.___", state 2085, "(1)" - line 427, "pan.___", state 2085, "(1)" - line 734, "pan.___", state 2088, "cached_urcu_active_readers = (tmp+1)" - line 734, "pan.___", state 2089, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 734, "pan.___", state 2090, "(1)" - line 407, "pan.___", state 2097, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2129, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2143, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 2161, "(1)" - line 253, "pan.___", state 2181, "(1)" - line 257, "pan.___", state 2189, "(1)" - line 407, "pan.___", state 2214, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2246, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2260, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 2278, "(1)" - line 253, "pan.___", state 2298, "(1)" - line 257, "pan.___", state 2306, "(1)" - line 407, "pan.___", state 2325, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2357, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2371, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 2389, "(1)" - line 253, "pan.___", state 2409, "(1)" - line 257, "pan.___", state 2417, "(1)" - line 245, "pan.___", state 2448, "(1)" - line 253, "pan.___", state 2468, "(1)" - line 257, "pan.___", state 2476, "(1)" - line 245, "pan.___", state 2491, "(1)" - line 253, "pan.___", state 2511, "(1)" - line 257, "pan.___", state 2519, "(1)" - line 929, "pan.___", state 2536, "-end-" - (221 of 2536 states) -unreached in proctype urcu_writer - line 407, "pan.___", state 45, "cache_dirty_urcu_gp_ctr = 0" - line 411, "pan.___", state 59, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 245, "pan.___", state 109, "(1)" - line 249, "pan.___", state 117, "(1)" - line 253, "pan.___", state 129, "(1)" - line 268, "pan.___", state 158, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 167, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 180, "cache_dirty_rcu_ptr = 0" - line 407, "pan.___", state 220, "cache_dirty_urcu_gp_ctr = 0" - line 411, "pan.___", state 234, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 252, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 266, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 284, "(1)" - line 249, "pan.___", state 292, "(1)" - line 253, "pan.___", state 304, "(1)" - line 257, "pan.___", state 312, "(1)" - line 411, "pan.___", state 347, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 365, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 379, "cache_dirty_rcu_data[i] = 0" - line 249, "pan.___", state 405, "(1)" - line 253, "pan.___", state 417, "(1)" - line 257, "pan.___", state 425, "(1)" - line 411, "pan.___", state 468, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 486, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 500, "cache_dirty_rcu_data[i] = 0" - line 249, "pan.___", state 526, "(1)" - line 253, "pan.___", state 538, "(1)" - line 257, "pan.___", state 546, "(1)" - line 411, "pan.___", state 579, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 597, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 611, "cache_dirty_rcu_data[i] = 0" - line 249, "pan.___", state 637, "(1)" - line 253, "pan.___", state 649, "(1)" - line 257, "pan.___", state 657, "(1)" - line 411, "pan.___", state 692, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 710, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 724, "cache_dirty_rcu_data[i] = 0" - line 249, "pan.___", state 750, "(1)" - line 253, "pan.___", state 762, "(1)" - line 257, "pan.___", state 770, "(1)" - line 268, "pan.___", state 818, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 827, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 840, "cache_dirty_rcu_ptr = 0" - line 245, "pan.___", state 865, "(1)" - line 249, "pan.___", state 873, "(1)" - line 253, "pan.___", state 885, "(1)" - line 257, "pan.___", state 893, "(1)" - line 268, "pan.___", state 924, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 933, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 946, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 955, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 971, "(1)" - line 249, "pan.___", state 979, "(1)" - line 253, "pan.___", state 991, "(1)" - line 257, "pan.___", state 999, "(1)" - line 268, "pan.___", state 1020, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1029, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1044, "(1)" - line 280, "pan.___", state 1051, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1067, "(1)" - line 249, "pan.___", state 1075, "(1)" - line 253, "pan.___", state 1087, "(1)" - line 257, "pan.___", state 1095, "(1)" - line 268, "pan.___", state 1126, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1135, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1148, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1157, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1173, "(1)" - line 249, "pan.___", state 1181, "(1)" - line 253, "pan.___", state 1193, "(1)" - line 257, "pan.___", state 1201, "(1)" - line 272, "pan.___", state 1227, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1240, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1249, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1265, "(1)" - line 249, "pan.___", state 1273, "(1)" - line 253, "pan.___", state 1285, "(1)" - line 257, "pan.___", state 1293, "(1)" - line 268, "pan.___", state 1324, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1333, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1346, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1355, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1371, "(1)" - line 249, "pan.___", state 1379, "(1)" - line 253, "pan.___", state 1391, "(1)" - line 257, "pan.___", state 1399, "(1)" - line 272, "pan.___", state 1425, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1438, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1447, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1463, "(1)" - line 249, "pan.___", state 1471, "(1)" - line 253, "pan.___", state 1483, "(1)" - line 257, "pan.___", state 1491, "(1)" - line 268, "pan.___", state 1522, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1531, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1544, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1553, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1569, "(1)" - line 249, "pan.___", state 1577, "(1)" - line 253, "pan.___", state 1589, "(1)" - line 257, "pan.___", state 1597, "(1)" - line 272, "pan.___", state 1623, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1636, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1645, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1661, "(1)" - line 249, "pan.___", state 1669, "(1)" - line 253, "pan.___", state 1681, "(1)" - line 257, "pan.___", state 1689, "(1)" - line 268, "pan.___", state 1720, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1729, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1742, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1751, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1767, "(1)" - line 249, "pan.___", state 1775, "(1)" - line 253, "pan.___", state 1787, "(1)" - line 257, "pan.___", state 1795, "(1)" - line 1304, "pan.___", state 1811, "-end-" - (118 of 1811 states) -unreached in proctype :init: - (0 of 28 states) -unreached in proctype :never: - line 1369, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 1.54e+04 seconds -pan: rate 16109.46 states/second -pan: avg transition delay 3.148e-06 usec -cp .input.spin urcu_progress_reader.spin.input -cp .input.spin.trail urcu_progress_reader.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi-compress' diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_reader.spin.input b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_reader.spin.input deleted file mode 100644 index 83c0751..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_reader.spin.input +++ /dev/null @@ -1,1340 +0,0 @@ -#define READER_PROGRESS - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer.define b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer.log b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer.log deleted file mode 100644 index a04140c..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer.log +++ /dev/null @@ -1,681 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi-compress' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1362) -depth 7: Claim reached state 9 (line 1367) -depth 50: Claim reached state 9 (line 1366) -Depth= 7070 States= 1e+06 Transitions= 1.16e+07 Memory= 493.010 t= 34.5 R= 3e+04 -Depth= 7070 States= 2e+06 Transitions= 2.31e+07 Memory= 521.330 t= 69.3 R= 3e+04 -Depth= 7070 States= 3e+06 Transitions= 3.43e+07 Memory= 549.455 t= 103 R= 3e+04 -pan: resizing hashtable to -w22.. done -Depth= 8814 States= 4e+06 Transitions= 4.57e+07 Memory= 607.041 t= 138 R= 3e+04 -Depth= 8814 States= 5e+06 Transitions= 5.73e+07 Memory= 632.920 t= 174 R= 3e+04 -Depth= 8814 States= 6e+06 Transitions= 7.04e+07 Memory= 662.217 t= 215 R= 3e+04 -Depth= 8814 States= 7e+06 Transitions= 8.38e+07 Memory= 690.049 t= 257 R= 3e+04 -Depth= 8814 States= 8e+06 Transitions= 9.59e+07 Memory= 717.588 t= 294 R= 3e+04 -Depth= 8814 States= 9e+06 Transitions= 1.08e+08 Memory= 745.127 t= 332 R= 3e+04 -pan: resizing hashtable to -w24.. done -Depth= 8814 States= 1e+07 Transitions= 1.29e+08 Memory= 897.639 t= 398 R= 3e+04 -Depth= 8814 States= 1.1e+07 Transitions= 1.41e+08 Memory= 926.154 t= 434 R= 3e+04 -Depth= 8814 States= 1.2e+07 Transitions= 1.53e+08 Memory= 953.401 t= 471 R= 3e+04 -Depth= 8814 States= 1.3e+07 Transitions= 1.64e+08 Memory= 980.940 t= 505 R= 3e+04 -Depth= 8814 States= 1.4e+07 Transitions= 1.75e+08 Memory= 1010.725 t= 539 R= 3e+04 -Depth= 8814 States= 1.5e+07 Transitions= 1.87e+08 Memory= 1037.580 t= 573 R= 3e+04 -Depth= 8814 States= 1.6e+07 Transitions= 1.98e+08 Memory= 1064.924 t= 607 R= 3e+04 -Depth= 8814 States= 1.7e+07 Transitions= 2.09e+08 Memory= 1094.904 t= 641 R= 3e+04 -Depth= 8814 States= 1.8e+07 Transitions= 2.23e+08 Memory= 1119.514 t= 683 R= 3e+04 -Depth= 8814 States= 1.9e+07 Transitions= 2.36e+08 Memory= 1146.662 t= 725 R= 3e+04 -Depth= 8814 States= 2e+07 Transitions= 2.57e+08 Memory= 1174.201 t= 790 R= 3e+04 -Depth= 8814 States= 2.1e+07 Transitions= 2.93e+08 Memory= 1205.549 t= 908 R= 2e+04 -Depth= 9015 States= 2.2e+07 Transitions= 3.11e+08 Memory= 1235.822 t= 965 R= 2e+04 -Depth= 9015 States= 2.3e+07 Transitions= 3.25e+08 Memory= 1264.533 t= 1.01e+03 R= 2e+04 -Depth= 9015 States= 2.4e+07 Transitions= 3.45e+08 Memory= 1293.244 t= 1.07e+03 R= 2e+04 -Depth= 9015 States= 2.5e+07 Transitions= 3.67e+08 Memory= 1321.467 t= 1.14e+03 R= 2e+04 -Depth= 9015 States= 2.6e+07 Transitions= 3.84e+08 Memory= 1350.764 t= 1.2e+03 R= 2e+04 -Depth= 9015 States= 2.7e+07 Transitions= 4.07e+08 Memory= 1380.158 t= 1.27e+03 R= 2e+04 -Depth= 9015 States= 2.8e+07 Transitions= 4.29e+08 Memory= 1405.940 t= 1.34e+03 R= 2e+04 -Depth= 9015 States= 2.9e+07 Transitions= 4.48e+08 Memory= 1433.381 t= 1.4e+03 R= 2e+04 -Depth= 9015 States= 3e+07 Transitions= 4.66e+08 Memory= 1461.506 t= 1.46e+03 R= 2e+04 -Depth= 9015 States= 3.1e+07 Transitions= 4.86e+08 Memory= 1489.143 t= 1.52e+03 R= 2e+04 -Depth= 9015 States= 3.2e+07 Transitions= 5.1e+08 Memory= 1516.486 t= 1.6e+03 R= 2e+04 -Depth= 9015 States= 3.3e+07 Transitions= 5.29e+08 Memory= 1543.733 t= 1.66e+03 R= 2e+04 -Depth= 9015 States= 3.4e+07 Transitions= 5.47e+08 Memory= 1571.760 t= 1.72e+03 R= 2e+04 -pan: resizing hashtable to -w26.. done -Depth= 9015 States= 3.5e+07 Transitions= 5.69e+08 Memory= 2095.088 t= 1.79e+03 R= 2e+04 -Depth= 9015 States= 3.6e+07 Transitions= 5.95e+08 Memory= 2122.041 t= 1.87e+03 R= 2e+04 -Depth= 9015 States= 3.7e+07 Transitions= 6.12e+08 Memory= 2149.971 t= 1.93e+03 R= 2e+04 -Depth= 9015 States= 3.8e+07 Transitions= 6.29e+08 Memory= 2176.045 t= 1.98e+03 R= 2e+04 -Depth= 9015 States= 3.9e+07 Transitions= 6.42e+08 Memory= 2204.268 t= 2.02e+03 R= 2e+04 -Depth= 9015 States= 4e+07 Transitions= 6.56e+08 Memory= 2233.565 t= 2.06e+03 R= 2e+04 -Depth= 9015 States= 4.1e+07 Transitions= 6.69e+08 Memory= 2264.424 t= 2.1e+03 R= 2e+04 -Depth= 9015 States= 4.2e+07 Transitions= 6.82e+08 Memory= 2292.940 t= 2.14e+03 R= 2e+04 -Depth= 9015 States= 4.3e+07 Transitions= 6.95e+08 Memory= 2322.529 t= 2.18e+03 R= 2e+04 -Depth= 9015 States= 4.4e+07 Transitions= 7.07e+08 Memory= 2350.654 t= 2.22e+03 R= 2e+04 -Depth= 9015 States= 4.5e+07 Transitions= 7.28e+08 Memory= 2378.193 t= 2.29e+03 R= 2e+04 -Depth= 9015 States= 4.6e+07 Transitions= 7.63e+08 Memory= 2409.443 t= 2.4e+03 R= 2e+04 -Depth= 9015 States= 4.7e+07 Transitions= 7.99e+08 Memory= 2445.088 t= 2.52e+03 R= 2e+04 -Depth= 9015 States= 4.8e+07 Transitions= 8.49e+08 Memory= 2479.072 t= 2.69e+03 R= 2e+04 -Depth= 9015 States= 4.9e+07 Transitions= 8.91e+08 Memory= 2508.076 t= 2.82e+03 R= 2e+04 -Depth= 9015 States= 5e+07 Transitions= 9.24e+08 Memory= 2532.295 t= 2.93e+03 R= 2e+04 -Depth= 9015 States= 5.1e+07 Transitions= 9.39e+08 Memory= 2561.494 t= 2.98e+03 R= 2e+04 -Depth= 9015 States= 5.2e+07 Transitions= 9.6e+08 Memory= 2589.522 t= 3.05e+03 R= 2e+04 -Depth= 9015 States= 5.3e+07 Transitions= 9.99e+08 Memory= 2617.158 t= 3.17e+03 R= 2e+04 -Depth= 9015 States= 5.4e+07 Transitions= 1.01e+09 Memory= 2647.725 t= 3.22e+03 R= 2e+04 -Depth= 9015 States= 5.5e+07 Transitions= 1.03e+09 Memory= 2674.580 t= 3.27e+03 R= 2e+04 -Depth= 9015 States= 5.6e+07 Transitions= 1.05e+09 Memory= 2701.143 t= 3.32e+03 R= 2e+04 -Depth= 9015 States= 5.7e+07 Transitions= 1.06e+09 Memory= 2730.928 t= 3.36e+03 R= 2e+04 -Depth= 9015 States= 5.8e+07 Transitions= 1.09e+09 Memory= 2759.053 t= 3.45e+03 R= 2e+04 -Depth= 9015 States= 5.9e+07 Transitions= 1.1e+09 Memory= 2786.983 t= 3.5e+03 R= 2e+04 -Depth= 9015 States= 6e+07 Transitions= 1.13e+09 Memory= 2814.619 t= 3.6e+03 R= 2e+04 -Depth= 9015 States= 6.1e+07 Transitions= 1.15e+09 Memory= 2841.670 t= 3.66e+03 R= 2e+04 -Depth= 9015 States= 6.2e+07 Transitions= 1.19e+09 Memory= 2870.576 t= 3.77e+03 R= 2e+04 -Depth= 9015 States= 6.3e+07 Transitions= 1.21e+09 Memory= 2897.627 t= 3.84e+03 R= 2e+04 -Depth= 9015 States= 6.4e+07 Transitions= 1.24e+09 Memory= 2925.166 t= 3.94e+03 R= 2e+04 -Depth= 9015 States= 6.5e+07 Transitions= 1.26e+09 Memory= 2952.803 t= 4.01e+03 R= 2e+04 -Depth= 9015 States= 6.6e+07 Transitions= 1.28e+09 Memory= 2979.756 t= 4.09e+03 R= 2e+04 -Depth= 9015 States= 6.7e+07 Transitions= 1.3e+09 Memory= 3007.686 t= 4.15e+03 R= 2e+04 -Depth= 9015 States= 6.8e+07 Transitions= 1.33e+09 Memory= 3035.811 t= 4.23e+03 R= 2e+04 -Depth= 9015 States= 6.9e+07 Transitions= 1.36e+09 Memory= 3063.838 t= 4.32e+03 R= 2e+04 -Depth= 9522 States= 7e+07 Transitions= 1.38e+09 Memory= 3094.795 t= 4.39e+03 R= 2e+04 -Depth= 9522 States= 7.1e+07 Transitions= 1.39e+09 Memory= 3120.186 t= 4.43e+03 R= 2e+04 -Depth= 9522 States= 7.2e+07 Transitions= 1.41e+09 Memory= 3149.971 t= 4.5e+03 R= 2e+04 -Depth= 9553 States= 7.3e+07 Transitions= 1.44e+09 Memory= 3179.365 t= 4.57e+03 R= 2e+04 -Depth= 9553 States= 7.4e+07 Transitions= 1.45e+09 Memory= 3205.244 t= 4.61e+03 R= 2e+04 -Depth= 9553 States= 7.5e+07 Transitions= 1.47e+09 Memory= 3235.225 t= 4.69e+03 R= 2e+04 -Depth= 9553 States= 7.6e+07 Transitions= 1.49e+09 Memory= 3263.545 t= 4.75e+03 R= 2e+04 -Depth= 9553 States= 7.7e+07 Transitions= 1.51e+09 Memory= 3290.401 t= 4.8e+03 R= 2e+04 -Depth= 9553 States= 7.8e+07 Transitions= 1.52e+09 Memory= 3319.795 t= 4.84e+03 R= 2e+04 -Depth= 9553 States= 7.9e+07 Transitions= 1.54e+09 Memory= 3349.190 t= 4.91e+03 R= 2e+04 -Depth= 9553 States= 8e+07 Transitions= 1.56e+09 Memory= 3377.803 t= 4.98e+03 R= 2e+04 -Depth= 9553 States= 8.1e+07 Transitions= 1.58e+09 Memory= 3406.904 t= 5.04e+03 R= 2e+04 -Depth= 9553 States= 8.2e+07 Transitions= 1.6e+09 Memory= 3434.443 t= 5.08e+03 R= 2e+04 -Depth= 9553 States= 8.3e+07 Transitions= 1.61e+09 Memory= 3462.178 t= 5.14e+03 R= 2e+04 -Depth= 9553 States= 8.4e+07 Transitions= 1.63e+09 Memory= 3490.205 t= 5.18e+03 R= 2e+04 -Depth= 9553 States= 8.5e+07 Transitions= 1.65e+09 Memory= 3517.549 t= 5.24e+03 R= 2e+04 -Depth= 9553 States= 8.6e+07 Transitions= 1.67e+09 Memory= 3544.502 t= 5.31e+03 R= 2e+04 -Depth= 9553 States= 8.7e+07 Transitions= 1.69e+09 Memory= 3574.190 t= 5.38e+03 R= 2e+04 -Depth= 9553 States= 8.8e+07 Transitions= 1.7e+09 Memory= 3606.026 t= 5.42e+03 R= 2e+04 -Depth= 9553 States= 8.9e+07 Transitions= 1.72e+09 Memory= 3632.588 t= 5.48e+03 R= 2e+04 -Depth= 9553 States= 9e+07 Transitions= 1.74e+09 Memory= 3662.080 t= 5.53e+03 R= 2e+04 -Depth= 9553 States= 9.1e+07 Transitions= 1.76e+09 Memory= 3689.229 t= 5.59e+03 R= 2e+04 -Depth= 9553 States= 9.2e+07 Transitions= 1.78e+09 Memory= 3716.572 t= 5.65e+03 R= 2e+04 -Depth= 9553 States= 9.3e+07 Transitions= 1.8e+09 Memory= 3743.135 t= 5.72e+03 R= 2e+04 -Depth= 9553 States= 9.4e+07 Transitions= 1.82e+09 Memory= 3771.553 t= 5.8e+03 R= 2e+04 -Depth= 9553 States= 9.5e+07 Transitions= 1.84e+09 Memory= 3801.436 t= 5.86e+03 R= 2e+04 -Depth= 9553 States= 9.6e+07 Transitions= 1.86e+09 Memory= 3827.803 t= 5.91e+03 R= 2e+04 -Depth= 9553 States= 9.7e+07 Transitions= 1.88e+09 Memory= 3857.881 t= 5.99e+03 R= 2e+04 -Depth= 9553 States= 9.8e+07 Transitions= 1.9e+09 Memory= 3886.494 t= 6.03e+03 R= 2e+04 -Depth= 9553 States= 9.9e+07 Transitions= 1.91e+09 Memory= 3914.229 t= 6.08e+03 R= 2e+04 -Depth= 9553 States= 1e+08 Transitions= 1.93e+09 Memory= 3942.549 t= 6.13e+03 R= 2e+04 -Depth= 9553 States= 1.01e+08 Transitions= 1.94e+09 Memory= 3972.236 t= 6.19e+03 R= 2e+04 -Depth= 9553 States= 1.02e+08 Transitions= 1.96e+09 Memory= 4001.729 t= 6.24e+03 R= 2e+04 -Depth= 9553 States= 1.03e+08 Transitions= 1.98e+09 Memory= 4030.049 t= 6.3e+03 R= 2e+04 -Depth= 9553 States= 1.04e+08 Transitions= 2e+09 Memory= 4059.639 t= 6.38e+03 R= 2e+04 -Depth= 9553 States= 1.05e+08 Transitions= 2.02e+09 Memory= 4086.006 t= 6.43e+03 R= 2e+04 -Depth= 9553 States= 1.06e+08 Transitions= 2.04e+09 Memory= 4115.889 t= 6.49e+03 R= 2e+04 -Depth= 9553 States= 1.07e+08 Transitions= 2.06e+09 Memory= 4144.990 t= 6.55e+03 R= 2e+04 -Depth= 9553 States= 1.08e+08 Transitions= 2.07e+09 Memory= 4172.822 t= 6.6e+03 R= 2e+04 -Depth= 9553 States= 1.09e+08 Transitions= 2.09e+09 Memory= 4200.752 t= 6.65e+03 R= 2e+04 -Depth= 9553 States= 1.1e+08 Transitions= 2.11e+09 Memory= 4230.147 t= 6.7e+03 R= 2e+04 -Depth= 9553 States= 1.11e+08 Transitions= 2.12e+09 Memory= 4259.932 t= 6.75e+03 R= 2e+04 -Depth= 9553 States= 1.12e+08 Transitions= 2.14e+09 Memory= 4284.541 t= 6.81e+03 R= 2e+04 -Depth= 9553 States= 1.13e+08 Transitions= 2.16e+09 Memory= 4312.471 t= 6.86e+03 R= 2e+04 -Depth= 9553 States= 1.14e+08 Transitions= 2.17e+09 Memory= 4340.401 t= 6.91e+03 R= 2e+04 -Depth= 9553 States= 1.15e+08 Transitions= 2.19e+09 Memory= 4368.526 t= 6.97e+03 R= 2e+04 -Depth= 9553 States= 1.16e+08 Transitions= 2.21e+09 Memory= 4396.651 t= 7.02e+03 R= 2e+04 -Depth= 9553 States= 1.17e+08 Transitions= 2.23e+09 Memory= 4423.897 t= 7.1e+03 R= 2e+04 -Depth= 9553 States= 1.18e+08 Transitions= 2.27e+09 Memory= 4453.779 t= 7.22e+03 R= 2e+04 -Depth= 9553 States= 1.19e+08 Transitions= 2.29e+09 Memory= 4483.955 t= 7.29e+03 R= 2e+04 -Depth= 9553 States= 1.2e+08 Transitions= 2.3e+09 Memory= 4513.545 t= 7.33e+03 R= 2e+04 -Depth= 9553 States= 1.21e+08 Transitions= 2.32e+09 Memory= 4541.279 t= 7.4e+03 R= 2e+04 -Depth= 9553 States= 1.22e+08 Transitions= 2.34e+09 Memory= 4569.893 t= 7.45e+03 R= 2e+04 -Depth= 9553 States= 1.23e+08 Transitions= 2.36e+09 Memory= 4599.483 t= 7.52e+03 R= 2e+04 -Depth= 9553 States= 1.24e+08 Transitions= 2.38e+09 Memory= 4627.705 t= 7.58e+03 R= 2e+04 -Depth= 9553 States= 1.25e+08 Transitions= 2.41e+09 Memory= 4654.658 t= 7.68e+03 R= 2e+04 -Depth= 9553 States= 1.26e+08 Transitions= 2.43e+09 Memory= 4681.807 t= 7.76e+03 R= 2e+04 -Depth= 9553 States= 1.27e+08 Transitions= 2.45e+09 Memory= 4708.760 t= 7.83e+03 R= 2e+04 -Depth= 9553 States= 1.28e+08 Transitions= 2.48e+09 Memory= 4735.518 t= 7.93e+03 R= 2e+04 -Depth= 9553 States= 1.29e+08 Transitions= 2.5e+09 Memory= 4762.178 t= 8e+03 R= 2e+04 -Depth= 9553 States= 1.3e+08 Transitions= 2.52e+09 Memory= 4790.303 t= 8.07e+03 R= 2e+04 -Depth= 9553 States= 1.31e+08 Transitions= 2.55e+09 Memory= 4817.451 t= 8.15e+03 R= 2e+04 -Depth= 9553 States= 1.32e+08 Transitions= 2.57e+09 Memory= 4845.186 t= 8.22e+03 R= 2e+04 -Depth= 9553 States= 1.33e+08 Transitions= 2.59e+09 Memory= 4872.139 t= 8.3e+03 R= 2e+04 -Depth= 9553 States= 1.34e+08 Transitions= 2.61e+09 Memory= 4900.850 t= 8.37e+03 R= 2e+04 -Depth= 9553 States= 1.35e+08 Transitions= 2.63e+09 Memory= 4927.803 t= 8.43e+03 R= 2e+04 -pan: resizing hashtable to -w28.. done -Depth= 9553 States= 1.36e+08 Transitions= 2.65e+09 Memory= 6975.803 t= 8.5e+03 R= 2e+04 -Depth= 9553 States= 1.37e+08 Transitions= 2.66e+09 Memory= 6975.803 t= 8.54e+03 R= 2e+04 -Depth= 9553 States= 1.38e+08 Transitions= 2.67e+09 Memory= 6996.799 t= 8.58e+03 R= 2e+04 -Depth= 9553 States= 1.39e+08 Transitions= 2.69e+09 Memory= 7026.779 t= 8.62e+03 R= 2e+04 -Depth= 9553 States= 1.4e+08 Transitions= 2.7e+09 Memory= 7056.467 t= 8.68e+03 R= 2e+04 -Depth= 9553 States= 1.41e+08 Transitions= 2.72e+09 Memory= 7084.787 t= 8.72e+03 R= 2e+04 -Depth= 9553 States= 1.42e+08 Transitions= 2.74e+09 Memory= 7114.084 t= 8.77e+03 R= 2e+04 -Depth= 9553 States= 1.43e+08 Transitions= 2.75e+09 Memory= 7143.088 t= 8.82e+03 R= 2e+04 -Depth= 9553 States= 1.44e+08 Transitions= 2.77e+09 Memory= 7170.920 t= 8.88e+03 R= 2e+04 -Depth= 9553 States= 1.45e+08 Transitions= 2.79e+09 Memory= 7198.166 t= 8.94e+03 R= 2e+04 -Depth= 9553 States= 1.46e+08 Transitions= 2.82e+09 Memory= 7229.514 t= 9.06e+03 R= 2e+04 -Depth= 9553 States= 1.47e+08 Transitions= 2.86e+09 Memory= 7265.158 t= 9.18e+03 R= 2e+04 -Depth= 9553 States= 1.48e+08 Transitions= 2.91e+09 Memory= 7299.143 t= 9.34e+03 R= 2e+04 -Depth= 9553 States= 1.49e+08 Transitions= 2.95e+09 Memory= 7327.170 t= 9.47e+03 R= 2e+04 -Depth= 9553 States= 1.5e+08 Transitions= 2.99e+09 Memory= 7352.561 t= 9.59e+03 R= 2e+04 -Depth= 9553 States= 1.51e+08 Transitions= 3e+09 Memory= 7380.881 t= 9.64e+03 R= 2e+04 -Depth= 9553 States= 1.52e+08 Transitions= 3.02e+09 Memory= 7408.908 t= 9.7e+03 R= 2e+04 -Depth= 9553 States= 1.53e+08 Transitions= 3.05e+09 Memory= 7437.033 t= 9.8e+03 R= 2e+04 -Depth= 9553 States= 1.54e+08 Transitions= 3.08e+09 Memory= 7465.744 t= 9.89e+03 R= 2e+04 -Depth= 9553 States= 1.55e+08 Transitions= 3.1e+09 Memory= 7493.869 t= 9.95e+03 R= 2e+04 -Depth= 9553 States= 1.56e+08 Transitions= 3.11e+09 Memory= 7520.529 t= 9.99e+03 R= 2e+04 -Depth= 9553 States= 1.57e+08 Transitions= 3.13e+09 Memory= 7547.092 t= 1e+04 R= 2e+04 -Depth= 9553 States= 1.58e+08 Transitions= 3.14e+09 Memory= 7577.170 t= 1.01e+04 R= 2e+04 -Depth= 9553 States= 1.59e+08 Transitions= 3.17e+09 Memory= 7604.611 t= 1.02e+04 R= 2e+04 -Depth= 9553 States= 1.6e+08 Transitions= 3.19e+09 Memory= 7631.955 t= 1.02e+04 R= 2e+04 -Depth= 9553 States= 1.61e+08 Transitions= 3.21e+09 Memory= 7659.299 t= 1.03e+04 R= 2e+04 -Depth= 9553 States= 1.62e+08 Transitions= 3.24e+09 Memory= 7686.740 t= 1.04e+04 R= 2e+04 -Depth= 9553 States= 1.63e+08 Transitions= 3.27e+09 Memory= 7713.791 t= 1.05e+04 R= 2e+04 -Depth= 9553 States= 1.64e+08 Transitions= 3.29e+09 Memory= 7743.186 t= 1.06e+04 R= 2e+04 -Depth= 9553 States= 1.65e+08 Transitions= 3.31e+09 Memory= 7771.604 t= 1.06e+04 R= 2e+04 -Depth= 9553 States= 1.66e+08 Transitions= 3.34e+09 Memory= 7797.971 t= 1.07e+04 R= 2e+04 -Depth= 9553 States= 1.67e+08 Transitions= 3.37e+09 Memory= 7825.217 t= 1.08e+04 R= 2e+04 -Depth= 9553 States= 1.68e+08 Transitions= 3.39e+09 Memory= 7853.733 t= 1.09e+04 R= 2e+04 -Depth= 9553 States= 1.69e+08 Transitions= 3.41e+09 Memory= 7880.686 t= 1.09e+04 R= 2e+04 -Depth= 9553 States= 1.7e+08 Transitions= 3.44e+09 Memory= 7909.690 t= 1.1e+04 R= 2e+04 -Depth= 9553 States= 1.71e+08 Transitions= 3.46e+09 Memory= 7939.279 t= 1.11e+04 R= 2e+04 -Depth= 9553 States= 1.72e+08 Transitions= 3.47e+09 Memory= 7964.768 t= 1.11e+04 R= 2e+04 -Depth= 9553 States= 1.73e+08 Transitions= 3.5e+09 Memory= 7994.260 t= 1.12e+04 R= 2e+04 -Depth= 9553 States= 1.74e+08 Transitions= 3.52e+09 Memory= 8023.850 t= 1.13e+04 R= 2e+04 -Depth= 9553 States= 1.75e+08 Transitions= 3.53e+09 Memory= 8051.877 t= 1.13e+04 R= 2e+04 -Depth= 9553 States= 1.76e+08 Transitions= 3.56e+09 Memory= 8080.979 t= 1.14e+04 R= 2e+04 -Depth= 9553 States= 1.77e+08 Transitions= 3.57e+09 Memory= 8107.834 t= 1.15e+04 R= 2e+04 -Depth= 9553 States= 1.78e+08 Transitions= 3.59e+09 Memory= 8137.033 t= 1.15e+04 R= 2e+04 -Depth= 9553 States= 1.79e+08 Transitions= 3.61e+09 Memory= 8165.158 t= 1.16e+04 R= 2e+04 -Depth= 9553 States= 1.8e+08 Transitions= 3.63e+09 Memory= 8194.065 t= 1.16e+04 R= 2e+04 -Depth= 9553 States= 1.81e+08 Transitions= 3.65e+09 Memory= 8222.971 t= 1.17e+04 R= 2e+04 -Depth= 9553 States= 1.82e+08 Transitions= 3.66e+09 Memory= 8251.096 t= 1.17e+04 R= 2e+04 -Depth= 9553 States= 1.83e+08 Transitions= 3.68e+09 Memory= 8279.514 t= 1.18e+04 R= 2e+04 -Depth= 9553 States= 1.84e+08 Transitions= 3.69e+09 Memory= 8307.151 t= 1.18e+04 R= 2e+04 -Depth= 9553 States= 1.85e+08 Transitions= 3.71e+09 Memory= 8334.787 t= 1.19e+04 R= 2e+04 -Depth= 9553 States= 1.86e+08 Transitions= 3.73e+09 Memory= 8361.838 t= 1.2e+04 R= 2e+04 -Depth= 9553 States= 1.87e+08 Transitions= 3.75e+09 Memory= 8392.209 t= 1.2e+04 R= 2e+04 -Depth= 9553 States= 1.88e+08 Transitions= 3.77e+09 Memory= 8423.361 t= 1.21e+04 R= 2e+04 -Depth= 9553 States= 1.89e+08 Transitions= 3.78e+09 Memory= 8449.826 t= 1.21e+04 R= 2e+04 -Depth= 9553 States= 1.9e+08 Transitions= 3.8e+09 Memory= 8479.026 t= 1.22e+04 R= 2e+04 -Depth= 9553 States= 1.91e+08 Transitions= 3.82e+09 Memory= 8506.076 t= 1.22e+04 R= 2e+04 -Depth= 9553 States= 1.92e+08 Transitions= 3.84e+09 Memory= 8533.029 t= 1.23e+04 R= 2e+04 -Depth= 9553 States= 1.93e+08 Transitions= 3.86e+09 Memory= 8563.889 t= 1.24e+04 R= 2e+04 -Depth= 9553 States= 1.94e+08 Transitions= 3.88e+09 Memory= 8590.744 t= 1.24e+04 R= 2e+04 -Depth= 9553 States= 1.95e+08 Transitions= 3.9e+09 Memory= 8620.334 t= 1.25e+04 R= 2e+04 -Depth= 9553 States= 1.96e+08 Transitions= 3.92e+09 Memory= 8649.826 t= 1.25e+04 R= 2e+04 -Depth= 9553 States= 1.97e+08 Transitions= 3.93e+09 Memory= 8676.486 t= 1.26e+04 R= 2e+04 -Depth= 9553 States= 1.98e+08 Transitions= 3.95e+09 Memory= 8705.197 t= 1.26e+04 R= 2e+04 -Depth= 9553 States= 1.99e+08 Transitions= 3.96e+09 Memory= 8734.006 t= 1.27e+04 R= 2e+04 -Depth= 9553 States= 2e+08 Transitions= 3.98e+09 Memory= 8764.279 t= 1.27e+04 R= 2e+04 -Depth= 9553 States= 2.01e+08 Transitions= 4e+09 Memory= 8792.209 t= 1.28e+04 R= 2e+04 -Depth= 9553 States= 2.02e+08 Transitions= 4.03e+09 Memory= 8821.408 t= 1.29e+04 R= 2e+04 -Depth= 9553 States= 2.03e+08 Transitions= 4.04e+09 Memory= 8849.338 t= 1.29e+04 R= 2e+04 -Depth= 9553 States= 2.04e+08 Transitions= 4.06e+09 Memory= 8878.733 t= 1.3e+04 R= 2e+04 -Depth= 9553 States= 2.05e+08 Transitions= 4.08e+09 Memory= 8908.322 t= 1.31e+04 R= 2e+04 -Depth= 9553 States= 2.06e+08 Transitions= 4.09e+09 Memory= 8934.494 t= 1.31e+04 R= 2e+04 -Depth= 9553 States= 2.07e+08 Transitions= 4.11e+09 Memory= 8963.498 t= 1.32e+04 R= 2e+04 -Depth= 9553 States= 2.08e+08 Transitions= 4.13e+09 Memory= 8991.818 t= 1.32e+04 R= 2e+04 -Depth= 9553 States= 2.09e+08 Transitions= 4.14e+09 Memory= 9022.287 t= 1.33e+04 R= 2e+04 -Depth= 9553 States= 2.1e+08 Transitions= 4.16e+09 Memory= 9047.580 t= 1.33e+04 R= 2e+04 -Depth= 9553 States= 2.11e+08 Transitions= 4.18e+09 Memory= 9075.412 t= 1.34e+04 R= 2e+04 -Depth= 9553 States= 2.12e+08 Transitions= 4.19e+09 Memory= 9103.244 t= 1.34e+04 R= 2e+04 -Depth= 9553 States= 2.13e+08 Transitions= 4.21e+09 Memory= 9131.467 t= 1.35e+04 R= 2e+04 -Depth= 9553 States= 2.14e+08 Transitions= 4.22e+09 Memory= 9159.006 t= 1.35e+04 R= 2e+04 -Depth= 9553 States= 2.15e+08 Transitions= 4.26e+09 Memory= 9188.010 t= 1.36e+04 R= 2e+04 -Depth= 9553 States= 2.16e+08 Transitions= 4.29e+09 Memory= 9218.283 t= 1.37e+04 R= 2e+04 -Depth= 9553 States= 2.17e+08 Transitions= 4.3e+09 Memory= 9246.897 t= 1.37e+04 R= 2e+04 -Depth= 9553 States= 2.18e+08 Transitions= 4.32e+09 Memory= 9276.193 t= 1.38e+04 R= 2e+04 -Depth= 9553 States= 2.19e+08 Transitions= 4.33e+09 Memory= 9305.002 t= 1.39e+04 R= 2e+04 -Depth= 9553 States= 2.2e+08 Transitions= 4.35e+09 Memory= 9334.299 t= 1.39e+04 R= 2e+04 -Depth= 9553 States= 2.21e+08 Transitions= 4.37e+09 Memory= 9362.619 t= 1.4e+04 R= 2e+04 -Depth= 9553 States= 2.22e+08 Transitions= 4.4e+09 Memory= 9388.108 t= 1.41e+04 R= 2e+04 -Depth= 9553 States= 2.23e+08 Transitions= 4.43e+09 Memory= 9415.354 t= 1.42e+04 R= 2e+04 -Depth= 9553 States= 2.24e+08 Transitions= 4.45e+09 Memory= 9442.111 t= 1.42e+04 R= 2e+04 -Depth= 9553 States= 2.25e+08 Transitions= 4.48e+09 Memory= 9468.967 t= 1.43e+04 R= 2e+04 -Depth= 9553 States= 2.26e+08 Transitions= 4.5e+09 Memory= 9495.041 t= 1.44e+04 R= 2e+04 -Depth= 9553 States= 2.27e+08 Transitions= 4.52e+09 Memory= 9522.580 t= 1.44e+04 R= 2e+04 -Depth= 9553 States= 2.28e+08 Transitions= 4.54e+09 Memory= 9549.631 t= 1.45e+04 R= 2e+04 -Depth= 9553 States= 2.29e+08 Transitions= 4.56e+09 Memory= 9576.096 t= 1.46e+04 R= 2e+04 -Depth= 9553 States= 2.3e+08 Transitions= 4.59e+09 Memory= 9602.268 t= 1.47e+04 R= 2e+04 -Depth= 9553 States= 2.31e+08 Transitions= 4.6e+09 Memory= 9630.197 t= 1.47e+04 R= 2e+04 -Depth= 9553 States= 2.32e+08 Transitions= 4.63e+09 Memory= 9656.858 t= 1.48e+04 R= 2e+04 -Depth= 9553 States= 2.33e+08 Transitions= 4.66e+09 Memory= 9683.713 t= 1.49e+04 R= 2e+04 -Depth= 9553 States= 2.34e+08 Transitions= 4.68e+09 Memory= 9710.373 t= 1.5e+04 R= 2e+04 -Depth= 9553 States= 2.35e+08 Transitions= 4.7e+09 Memory= 9738.108 t= 1.5e+04 R= 2e+04 -Depth= 9553 States= 2.36e+08 Transitions= 4.72e+09 Memory= 9765.158 t= 1.51e+04 R= 2e+04 -Depth= 9553 States= 2.37e+08 Transitions= 4.74e+09 Memory= 9792.404 t= 1.52e+04 R= 2e+04 -Depth= 9553 States= 2.38e+08 Transitions= 4.77e+09 Memory= 9818.576 t= 1.52e+04 R= 2e+04 -Depth= 9553 States= 2.39e+08 Transitions= 4.79e+09 Memory= 9845.432 t= 1.53e+04 R= 2e+04 -Depth= 9553 States= 2.4e+08 Transitions= 4.8e+09 Memory= 9871.701 t= 1.53e+04 R= 2e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 80 byte, depth reached 9553, errors: 0 -1.4728139e+08 states, stored (2.40187e+08 visited) -4.565323e+09 states, matched -4.8055096e+09 transitions (= visited+matched) -7.4787137e+10 atomic steps -hash conflicts: 1.0275497e+09 (resolved) - -Stats on memory usage (in Megabytes): -16293.183 equivalent memory usage for states (stored*(State-vector + overhead)) - 7372.383 actual memory usage for states (compression: 45.25%) - state-vector as stored = 16 byte + 36 byte overhead - 2048.000 memory used for hash table (-w28) - 457.764 memory used for DFS stack (-m10000000) - 1.367 memory lost to fragmentation - 9876.779 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 592075 4097 3828 2 2 ] -unreached in proctype urcu_reader - line 268, "pan.___", state 57, "cache_dirty_urcu_gp_ctr = 0" - line 276, "pan.___", state 79, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 88, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 104, "(1)" - line 249, "pan.___", state 112, "(1)" - line 253, "pan.___", state 124, "(1)" - line 257, "pan.___", state 132, "(1)" - line 407, "pan.___", state 158, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 190, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 204, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 222, "(1)" - line 253, "pan.___", state 242, "(1)" - line 257, "pan.___", state 250, "(1)" - line 687, "pan.___", state 269, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 407, "pan.___", state 276, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 308, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 322, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 340, "(1)" - line 253, "pan.___", state 360, "(1)" - line 257, "pan.___", state 368, "(1)" - line 407, "pan.___", state 387, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 419, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 433, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 451, "(1)" - line 253, "pan.___", state 471, "(1)" - line 257, "pan.___", state 479, "(1)" - line 407, "pan.___", state 500, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 502, "(1)" - line 407, "pan.___", state 503, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 503, "else" - line 407, "pan.___", state 506, "(1)" - line 411, "pan.___", state 514, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 516, "(1)" - line 411, "pan.___", state 517, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 517, "else" - line 411, "pan.___", state 520, "(1)" - line 411, "pan.___", state 521, "(1)" - line 411, "pan.___", state 521, "(1)" - line 409, "pan.___", state 526, "((i<1))" - line 409, "pan.___", state 526, "((i>=1))" - line 416, "pan.___", state 532, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 534, "(1)" - line 416, "pan.___", state 535, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 535, "else" - line 416, "pan.___", state 538, "(1)" - line 416, "pan.___", state 539, "(1)" - line 416, "pan.___", state 539, "(1)" - line 420, "pan.___", state 546, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 548, "(1)" - line 420, "pan.___", state 549, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 549, "else" - line 420, "pan.___", state 552, "(1)" - line 420, "pan.___", state 553, "(1)" - line 420, "pan.___", state 553, "(1)" - line 418, "pan.___", state 558, "((i<2))" - line 418, "pan.___", state 558, "((i>=2))" - line 245, "pan.___", state 564, "(1)" - line 249, "pan.___", state 572, "(1)" - line 249, "pan.___", state 573, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 573, "else" - line 247, "pan.___", state 578, "((i<1))" - line 247, "pan.___", state 578, "((i>=1))" - line 253, "pan.___", state 584, "(1)" - line 253, "pan.___", state 585, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 585, "else" - line 257, "pan.___", state 592, "(1)" - line 257, "pan.___", state 593, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 593, "else" - line 255, "pan.___", state 598, "((i<2))" - line 255, "pan.___", state 598, "((i>=2))" - line 262, "pan.___", state 602, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 602, "else" - line 427, "pan.___", state 604, "(1)" - line 427, "pan.___", state 604, "(1)" - line 687, "pan.___", state 607, "cached_urcu_active_readers = (tmp+1)" - line 687, "pan.___", state 608, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 687, "pan.___", state 609, "(1)" - line 407, "pan.___", state 616, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 648, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 662, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 680, "(1)" - line 253, "pan.___", state 700, "(1)" - line 257, "pan.___", state 708, "(1)" - line 407, "pan.___", state 734, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 766, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 780, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 798, "(1)" - line 253, "pan.___", state 818, "(1)" - line 257, "pan.___", state 826, "(1)" - line 407, "pan.___", state 845, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 847, "(1)" - line 407, "pan.___", state 848, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 848, "else" - line 407, "pan.___", state 851, "(1)" - line 411, "pan.___", state 859, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 861, "(1)" - line 411, "pan.___", state 862, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 862, "else" - line 411, "pan.___", state 865, "(1)" - line 411, "pan.___", state 866, "(1)" - line 411, "pan.___", state 866, "(1)" - line 409, "pan.___", state 871, "((i<1))" - line 409, "pan.___", state 871, "((i>=1))" - line 416, "pan.___", state 877, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 879, "(1)" - line 416, "pan.___", state 880, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 880, "else" - line 416, "pan.___", state 883, "(1)" - line 416, "pan.___", state 884, "(1)" - line 416, "pan.___", state 884, "(1)" - line 420, "pan.___", state 891, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 893, "(1)" - line 420, "pan.___", state 894, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 894, "else" - line 420, "pan.___", state 897, "(1)" - line 420, "pan.___", state 898, "(1)" - line 420, "pan.___", state 898, "(1)" - line 418, "pan.___", state 903, "((i<2))" - line 418, "pan.___", state 903, "((i>=2))" - line 245, "pan.___", state 909, "(1)" - line 249, "pan.___", state 917, "(1)" - line 249, "pan.___", state 918, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 918, "else" - line 247, "pan.___", state 923, "((i<1))" - line 247, "pan.___", state 923, "((i>=1))" - line 253, "pan.___", state 929, "(1)" - line 253, "pan.___", state 930, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 930, "else" - line 257, "pan.___", state 937, "(1)" - line 257, "pan.___", state 938, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 938, "else" - line 255, "pan.___", state 943, "((i<2))" - line 255, "pan.___", state 943, "((i>=2))" - line 262, "pan.___", state 947, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 947, "else" - line 427, "pan.___", state 949, "(1)" - line 427, "pan.___", state 949, "(1)" - line 695, "pan.___", state 953, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 407, "pan.___", state 958, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 990, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1004, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1022, "(1)" - line 253, "pan.___", state 1042, "(1)" - line 257, "pan.___", state 1050, "(1)" - line 407, "pan.___", state 1072, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1104, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1118, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1136, "(1)" - line 253, "pan.___", state 1156, "(1)" - line 257, "pan.___", state 1164, "(1)" - line 407, "pan.___", state 1187, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1219, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1233, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1251, "(1)" - line 253, "pan.___", state 1271, "(1)" - line 257, "pan.___", state 1279, "(1)" - line 407, "pan.___", state 1298, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1330, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1344, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1362, "(1)" - line 253, "pan.___", state 1382, "(1)" - line 257, "pan.___", state 1390, "(1)" - line 407, "pan.___", state 1414, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1446, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1460, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1478, "(1)" - line 253, "pan.___", state 1498, "(1)" - line 257, "pan.___", state 1506, "(1)" - line 407, "pan.___", state 1525, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1557, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1571, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1589, "(1)" - line 253, "pan.___", state 1609, "(1)" - line 257, "pan.___", state 1617, "(1)" - line 407, "pan.___", state 1639, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1671, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1685, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1703, "(1)" - line 253, "pan.___", state 1723, "(1)" - line 257, "pan.___", state 1731, "(1)" - line 734, "pan.___", state 1750, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 407, "pan.___", state 1757, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1789, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1803, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1821, "(1)" - line 253, "pan.___", state 1841, "(1)" - line 257, "pan.___", state 1849, "(1)" - line 407, "pan.___", state 1868, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 1900, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 1914, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1932, "(1)" - line 253, "pan.___", state 1952, "(1)" - line 257, "pan.___", state 1960, "(1)" - line 407, "pan.___", state 1981, "cache_dirty_urcu_gp_ctr = 0" - line 407, "pan.___", state 1983, "(1)" - line 407, "pan.___", state 1984, "(cache_dirty_urcu_gp_ctr)" - line 407, "pan.___", state 1984, "else" - line 407, "pan.___", state 1987, "(1)" - line 411, "pan.___", state 1995, "cache_dirty_urcu_active_readers = 0" - line 411, "pan.___", state 1997, "(1)" - line 411, "pan.___", state 1998, "(cache_dirty_urcu_active_readers)" - line 411, "pan.___", state 1998, "else" - line 411, "pan.___", state 2001, "(1)" - line 411, "pan.___", state 2002, "(1)" - line 411, "pan.___", state 2002, "(1)" - line 409, "pan.___", state 2007, "((i<1))" - line 409, "pan.___", state 2007, "((i>=1))" - line 416, "pan.___", state 2013, "cache_dirty_rcu_ptr = 0" - line 416, "pan.___", state 2015, "(1)" - line 416, "pan.___", state 2016, "(cache_dirty_rcu_ptr)" - line 416, "pan.___", state 2016, "else" - line 416, "pan.___", state 2019, "(1)" - line 416, "pan.___", state 2020, "(1)" - line 416, "pan.___", state 2020, "(1)" - line 420, "pan.___", state 2027, "cache_dirty_rcu_data[i] = 0" - line 420, "pan.___", state 2029, "(1)" - line 420, "pan.___", state 2030, "(cache_dirty_rcu_data[i])" - line 420, "pan.___", state 2030, "else" - line 420, "pan.___", state 2033, "(1)" - line 420, "pan.___", state 2034, "(1)" - line 420, "pan.___", state 2034, "(1)" - line 418, "pan.___", state 2039, "((i<2))" - line 418, "pan.___", state 2039, "((i>=2))" - line 245, "pan.___", state 2045, "(1)" - line 249, "pan.___", state 2053, "(1)" - line 249, "pan.___", state 2054, "(!(cache_dirty_urcu_active_readers))" - line 249, "pan.___", state 2054, "else" - line 247, "pan.___", state 2059, "((i<1))" - line 247, "pan.___", state 2059, "((i>=1))" - line 253, "pan.___", state 2065, "(1)" - line 253, "pan.___", state 2066, "(!(cache_dirty_rcu_ptr))" - line 253, "pan.___", state 2066, "else" - line 257, "pan.___", state 2073, "(1)" - line 257, "pan.___", state 2074, "(!(cache_dirty_rcu_data[i]))" - line 257, "pan.___", state 2074, "else" - line 255, "pan.___", state 2079, "((i<2))" - line 255, "pan.___", state 2079, "((i>=2))" - line 262, "pan.___", state 2083, "(!(cache_dirty_urcu_gp_ctr))" - line 262, "pan.___", state 2083, "else" - line 427, "pan.___", state 2085, "(1)" - line 427, "pan.___", state 2085, "(1)" - line 734, "pan.___", state 2088, "cached_urcu_active_readers = (tmp+1)" - line 734, "pan.___", state 2089, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 734, "pan.___", state 2090, "(1)" - line 407, "pan.___", state 2097, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2129, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2143, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 2161, "(1)" - line 253, "pan.___", state 2181, "(1)" - line 257, "pan.___", state 2189, "(1)" - line 407, "pan.___", state 2214, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2246, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2260, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 2278, "(1)" - line 253, "pan.___", state 2298, "(1)" - line 257, "pan.___", state 2306, "(1)" - line 407, "pan.___", state 2325, "cache_dirty_urcu_gp_ctr = 0" - line 416, "pan.___", state 2357, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 2371, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 2389, "(1)" - line 253, "pan.___", state 2409, "(1)" - line 257, "pan.___", state 2417, "(1)" - line 245, "pan.___", state 2448, "(1)" - line 253, "pan.___", state 2468, "(1)" - line 257, "pan.___", state 2476, "(1)" - line 245, "pan.___", state 2491, "(1)" - line 253, "pan.___", state 2511, "(1)" - line 257, "pan.___", state 2519, "(1)" - line 929, "pan.___", state 2536, "-end-" - (221 of 2536 states) -unreached in proctype urcu_writer - line 407, "pan.___", state 45, "cache_dirty_urcu_gp_ctr = 0" - line 411, "pan.___", state 59, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 245, "pan.___", state 109, "(1)" - line 249, "pan.___", state 117, "(1)" - line 253, "pan.___", state 129, "(1)" - line 268, "pan.___", state 158, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 167, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 180, "cache_dirty_rcu_ptr = 0" - line 407, "pan.___", state 220, "cache_dirty_urcu_gp_ctr = 0" - line 411, "pan.___", state 234, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 252, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 266, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 284, "(1)" - line 249, "pan.___", state 292, "(1)" - line 253, "pan.___", state 304, "(1)" - line 257, "pan.___", state 312, "(1)" - line 411, "pan.___", state 347, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 365, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 379, "cache_dirty_rcu_data[i] = 0" - line 249, "pan.___", state 405, "(1)" - line 253, "pan.___", state 417, "(1)" - line 257, "pan.___", state 425, "(1)" - line 411, "pan.___", state 468, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 486, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 500, "cache_dirty_rcu_data[i] = 0" - line 249, "pan.___", state 526, "(1)" - line 253, "pan.___", state 538, "(1)" - line 257, "pan.___", state 546, "(1)" - line 411, "pan.___", state 579, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 597, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 611, "cache_dirty_rcu_data[i] = 0" - line 249, "pan.___", state 637, "(1)" - line 253, "pan.___", state 649, "(1)" - line 257, "pan.___", state 657, "(1)" - line 411, "pan.___", state 692, "cache_dirty_urcu_active_readers = 0" - line 416, "pan.___", state 710, "cache_dirty_rcu_ptr = 0" - line 420, "pan.___", state 724, "cache_dirty_rcu_data[i] = 0" - line 249, "pan.___", state 750, "(1)" - line 253, "pan.___", state 762, "(1)" - line 257, "pan.___", state 770, "(1)" - line 268, "pan.___", state 823, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 832, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 847, "(1)" - line 280, "pan.___", state 854, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 870, "(1)" - line 249, "pan.___", state 878, "(1)" - line 253, "pan.___", state 890, "(1)" - line 257, "pan.___", state 898, "(1)" - line 268, "pan.___", state 929, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 938, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 951, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 960, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 976, "(1)" - line 249, "pan.___", state 984, "(1)" - line 253, "pan.___", state 996, "(1)" - line 257, "pan.___", state 1004, "(1)" - line 272, "pan.___", state 1030, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1043, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1052, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1068, "(1)" - line 249, "pan.___", state 1076, "(1)" - line 253, "pan.___", state 1088, "(1)" - line 257, "pan.___", state 1096, "(1)" - line 268, "pan.___", state 1127, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1136, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1149, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1158, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1174, "(1)" - line 249, "pan.___", state 1182, "(1)" - line 253, "pan.___", state 1194, "(1)" - line 257, "pan.___", state 1202, "(1)" - line 272, "pan.___", state 1228, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1241, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1250, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1266, "(1)" - line 249, "pan.___", state 1274, "(1)" - line 253, "pan.___", state 1286, "(1)" - line 257, "pan.___", state 1294, "(1)" - line 268, "pan.___", state 1325, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1334, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1347, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1356, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1372, "(1)" - line 249, "pan.___", state 1380, "(1)" - line 253, "pan.___", state 1392, "(1)" - line 257, "pan.___", state 1400, "(1)" - line 272, "pan.___", state 1426, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1439, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1448, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1464, "(1)" - line 249, "pan.___", state 1472, "(1)" - line 253, "pan.___", state 1484, "(1)" - line 257, "pan.___", state 1492, "(1)" - line 268, "pan.___", state 1523, "cache_dirty_urcu_gp_ctr = 0" - line 272, "pan.___", state 1532, "cache_dirty_urcu_active_readers = 0" - line 276, "pan.___", state 1545, "cache_dirty_rcu_ptr = 0" - line 280, "pan.___", state 1554, "cache_dirty_rcu_data[i] = 0" - line 245, "pan.___", state 1570, "(1)" - line 249, "pan.___", state 1578, "(1)" - line 253, "pan.___", state 1590, "(1)" - line 257, "pan.___", state 1598, "(1)" - line 1304, "pan.___", state 1614, "-end-" - (103 of 1614 states) -unreached in proctype :init: - (0 of 28 states) -unreached in proctype :never: - line 1369, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 1.54e+04 seconds -pan: rate 15645.145 states/second -pan: avg transition delay 3.1947e-06 usec -cp .input.spin urcu_progress_writer.spin.input -cp .input.spin.trail urcu_progress_writer.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi-compress' diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer.spin.input b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer.spin.input deleted file mode 100644 index b353239..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer.spin.input +++ /dev/null @@ -1,1340 +0,0 @@ -#define WRITER_PROGRESS - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer_error.define b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer_error.log b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer_error.log deleted file mode 100644 index 52db020..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer_error.log +++ /dev/null @@ -1,465 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi-compress' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer_error.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DCOLLAPSE -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1363) -depth 7: Claim reached state 9 (line 1368) -depth 50: Claim reached state 9 (line 1367) -Depth= 7070 States= 1e+06 Transitions= 1.16e+07 Memory= 492.912 t= 33.7 R= 3e+04 -Depth= 7070 States= 2e+06 Transitions= 2.31e+07 Memory= 521.233 t= 68 R= 3e+04 -Depth= 7070 States= 3e+06 Transitions= 3.43e+07 Memory= 549.358 t= 102 R= 3e+04 -pan: resizing hashtable to -w22.. done -pan: acceptance cycle (at depth 1558) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - + Compression - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 80 byte, depth reached 7070, errors: 1 - 1856640 states, stored (3.13554e+06 visited) - 32657997 states, matched - 35793542 transitions (= visited+matched) -5.1088012e+08 atomic steps -hash conflicts: 10885217 (resolved) - -Stats on memory usage (in Megabytes): - 205.393 equivalent memory usage for states (stored*(State-vector + overhead)) - 93.456 actual memory usage for states (compression: 45.50%) - state-vector as stored = 17 byte + 36 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 583.115 total actual memory usage - -nr of templates: [ globals chans procs ] -collapse counts: [ 12368 744 254 2 2 ] -unreached in proctype urcu_reader - line 269, "pan.___", state 57, "cache_dirty_urcu_gp_ctr = 0" - line 277, "pan.___", state 79, "cache_dirty_rcu_ptr = 0" - line 281, "pan.___", state 88, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 104, "(1)" - line 250, "pan.___", state 112, "(1)" - line 254, "pan.___", state 124, "(1)" - line 258, "pan.___", state 132, "(1)" - line 408, "pan.___", state 158, "cache_dirty_urcu_gp_ctr = 0" - line 417, "pan.___", state 190, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 204, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 222, "(1)" - line 254, "pan.___", state 242, "(1)" - line 258, "pan.___", state 250, "(1)" - line 688, "pan.___", state 269, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 408, "pan.___", state 276, "cache_dirty_urcu_gp_ctr = 0" - line 417, "pan.___", state 308, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 322, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 340, "(1)" - line 254, "pan.___", state 360, "(1)" - line 258, "pan.___", state 368, "(1)" - line 408, "pan.___", state 387, "cache_dirty_urcu_gp_ctr = 0" - line 417, "pan.___", state 419, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 433, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 451, "(1)" - line 254, "pan.___", state 471, "(1)" - line 258, "pan.___", state 479, "(1)" - line 408, "pan.___", state 500, "cache_dirty_urcu_gp_ctr = 0" - line 408, "pan.___", state 502, "(1)" - line 408, "pan.___", state 503, "(cache_dirty_urcu_gp_ctr)" - line 408, "pan.___", state 503, "else" - line 408, "pan.___", state 506, "(1)" - line 412, "pan.___", state 514, "cache_dirty_urcu_active_readers = 0" - line 412, "pan.___", state 516, "(1)" - line 412, "pan.___", state 517, "(cache_dirty_urcu_active_readers)" - line 412, "pan.___", state 517, "else" - line 412, "pan.___", state 520, "(1)" - line 412, "pan.___", state 521, "(1)" - line 412, "pan.___", state 521, "(1)" - line 410, "pan.___", state 526, "((i<1))" - line 410, "pan.___", state 526, "((i>=1))" - line 417, "pan.___", state 532, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 534, "(1)" - line 417, "pan.___", state 535, "(cache_dirty_rcu_ptr)" - line 417, "pan.___", state 535, "else" - line 417, "pan.___", state 538, "(1)" - line 417, "pan.___", state 539, "(1)" - line 417, "pan.___", state 539, "(1)" - line 421, "pan.___", state 546, "cache_dirty_rcu_data[i] = 0" - line 421, "pan.___", state 548, "(1)" - line 421, "pan.___", state 549, "(cache_dirty_rcu_data[i])" - line 421, "pan.___", state 549, "else" - line 421, "pan.___", state 552, "(1)" - line 421, "pan.___", state 553, "(1)" - line 421, "pan.___", state 553, "(1)" - line 419, "pan.___", state 558, "((i<2))" - line 419, "pan.___", state 558, "((i>=2))" - line 246, "pan.___", state 564, "(1)" - line 250, "pan.___", state 572, "(1)" - line 250, "pan.___", state 573, "(!(cache_dirty_urcu_active_readers))" - line 250, "pan.___", state 573, "else" - line 248, "pan.___", state 578, "((i<1))" - line 248, "pan.___", state 578, "((i>=1))" - line 254, "pan.___", state 584, "(1)" - line 254, "pan.___", state 585, "(!(cache_dirty_rcu_ptr))" - line 254, "pan.___", state 585, "else" - line 258, "pan.___", state 592, "(1)" - line 258, "pan.___", state 593, "(!(cache_dirty_rcu_data[i]))" - line 258, "pan.___", state 593, "else" - line 256, "pan.___", state 598, "((i<2))" - line 256, "pan.___", state 598, "((i>=2))" - line 263, "pan.___", state 602, "(!(cache_dirty_urcu_gp_ctr))" - line 263, "pan.___", state 602, "else" - line 428, "pan.___", state 604, "(1)" - line 428, "pan.___", state 604, "(1)" - line 688, "pan.___", state 607, "cached_urcu_active_readers = (tmp+1)" - line 688, "pan.___", state 608, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 688, "pan.___", state 609, "(1)" - line 408, "pan.___", state 616, "cache_dirty_urcu_gp_ctr = 0" - line 417, "pan.___", state 648, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 662, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 680, "(1)" - line 254, "pan.___", state 700, "(1)" - line 258, "pan.___", state 708, "(1)" - line 408, "pan.___", state 734, "cache_dirty_urcu_gp_ctr = 0" - line 417, "pan.___", state 766, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 780, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 798, "(1)" - line 254, "pan.___", state 818, "(1)" - line 258, "pan.___", state 826, "(1)" - line 408, "pan.___", state 845, "cache_dirty_urcu_gp_ctr = 0" - line 408, "pan.___", state 847, "(1)" - line 408, "pan.___", state 848, "(cache_dirty_urcu_gp_ctr)" - line 408, "pan.___", state 848, "else" - line 408, "pan.___", state 851, "(1)" - line 412, "pan.___", state 859, "cache_dirty_urcu_active_readers = 0" - line 412, "pan.___", state 861, "(1)" - line 412, "pan.___", state 862, "(cache_dirty_urcu_active_readers)" - line 412, "pan.___", state 862, "else" - line 412, "pan.___", state 865, "(1)" - line 412, "pan.___", state 866, "(1)" - line 412, "pan.___", state 866, "(1)" - line 410, "pan.___", state 871, "((i<1))" - line 410, "pan.___", state 871, "((i>=1))" - line 417, "pan.___", state 877, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 879, "(1)" - line 417, "pan.___", state 880, "(cache_dirty_rcu_ptr)" - line 417, "pan.___", state 880, "else" - line 417, "pan.___", state 883, "(1)" - line 417, "pan.___", state 884, "(1)" - line 417, "pan.___", state 884, "(1)" - line 421, "pan.___", state 891, "cache_dirty_rcu_data[i] = 0" - line 421, "pan.___", state 893, "(1)" - line 421, "pan.___", state 894, "(cache_dirty_rcu_data[i])" - line 421, "pan.___", state 894, "else" - line 421, "pan.___", state 897, "(1)" - line 421, "pan.___", state 898, "(1)" - line 421, "pan.___", state 898, "(1)" - line 419, "pan.___", state 903, "((i<2))" - line 419, "pan.___", state 903, "((i>=2))" - line 246, "pan.___", state 909, "(1)" - line 250, "pan.___", state 917, "(1)" - line 250, "pan.___", state 918, "(!(cache_dirty_urcu_active_readers))" - line 250, "pan.___", state 918, "else" - line 248, "pan.___", state 923, "((i<1))" - line 248, "pan.___", state 923, "((i>=1))" - line 254, "pan.___", state 929, "(1)" - line 254, "pan.___", state 930, "(!(cache_dirty_rcu_ptr))" - line 254, "pan.___", state 930, "else" - line 258, "pan.___", state 937, "(1)" - line 258, "pan.___", state 938, "(!(cache_dirty_rcu_data[i]))" - line 258, "pan.___", state 938, "else" - line 256, "pan.___", state 943, "((i<2))" - line 256, "pan.___", state 943, "((i>=2))" - line 263, "pan.___", state 947, "(!(cache_dirty_urcu_gp_ctr))" - line 263, "pan.___", state 947, "else" - line 428, "pan.___", state 949, "(1)" - line 428, "pan.___", state 949, "(1)" - line 696, "pan.___", state 953, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 408, "pan.___", state 958, "cache_dirty_urcu_gp_ctr = 0" - line 417, "pan.___", state 990, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 1004, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 1022, "(1)" - line 254, "pan.___", state 1042, "(1)" - line 258, "pan.___", state 1050, "(1)" - line 408, "pan.___", state 1072, "cache_dirty_urcu_gp_ctr = 0" - line 417, "pan.___", state 1104, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 1118, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 1136, "(1)" - line 254, "pan.___", state 1156, "(1)" - line 258, "pan.___", state 1164, "(1)" - line 408, "pan.___", state 1187, "cache_dirty_urcu_gp_ctr = 0" - line 417, "pan.___", state 1219, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 1233, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 1251, "(1)" - line 254, "pan.___", state 1271, "(1)" - line 258, "pan.___", state 1279, "(1)" - line 408, "pan.___", state 1298, "cache_dirty_urcu_gp_ctr = 0" - line 417, "pan.___", state 1330, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 1344, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 1362, "(1)" - line 254, "pan.___", state 1382, "(1)" - line 258, "pan.___", state 1390, "(1)" - line 408, "pan.___", state 1414, "cache_dirty_urcu_gp_ctr = 0" - line 417, "pan.___", state 1446, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 1460, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 1478, "(1)" - line 254, "pan.___", state 1498, "(1)" - line 258, "pan.___", state 1506, "(1)" - line 408, "pan.___", state 1525, "cache_dirty_urcu_gp_ctr = 0" - line 417, "pan.___", state 1557, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 1571, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 1589, "(1)" - line 254, "pan.___", state 1609, "(1)" - line 258, "pan.___", state 1617, "(1)" - line 408, "pan.___", state 1639, "cache_dirty_urcu_gp_ctr = 0" - line 417, "pan.___", state 1671, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 1685, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 1703, "(1)" - line 254, "pan.___", state 1723, "(1)" - line 258, "pan.___", state 1731, "(1)" - line 735, "pan.___", state 1750, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 408, "pan.___", state 1757, "cache_dirty_urcu_gp_ctr = 0" - line 417, "pan.___", state 1789, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 1803, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 1821, "(1)" - line 254, "pan.___", state 1841, "(1)" - line 258, "pan.___", state 1849, "(1)" - line 408, "pan.___", state 1868, "cache_dirty_urcu_gp_ctr = 0" - line 417, "pan.___", state 1900, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 1914, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 1932, "(1)" - line 254, "pan.___", state 1952, "(1)" - line 258, "pan.___", state 1960, "(1)" - line 408, "pan.___", state 1981, "cache_dirty_urcu_gp_ctr = 0" - line 408, "pan.___", state 1983, "(1)" - line 408, "pan.___", state 1984, "(cache_dirty_urcu_gp_ctr)" - line 408, "pan.___", state 1984, "else" - line 408, "pan.___", state 1987, "(1)" - line 412, "pan.___", state 1995, "cache_dirty_urcu_active_readers = 0" - line 412, "pan.___", state 1997, "(1)" - line 412, "pan.___", state 1998, "(cache_dirty_urcu_active_readers)" - line 412, "pan.___", state 1998, "else" - line 412, "pan.___", state 2001, "(1)" - line 412, "pan.___", state 2002, "(1)" - line 412, "pan.___", state 2002, "(1)" - line 410, "pan.___", state 2007, "((i<1))" - line 410, "pan.___", state 2007, "((i>=1))" - line 417, "pan.___", state 2013, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 2015, "(1)" - line 417, "pan.___", state 2016, "(cache_dirty_rcu_ptr)" - line 417, "pan.___", state 2016, "else" - line 417, "pan.___", state 2019, "(1)" - line 417, "pan.___", state 2020, "(1)" - line 417, "pan.___", state 2020, "(1)" - line 421, "pan.___", state 2027, "cache_dirty_rcu_data[i] = 0" - line 421, "pan.___", state 2029, "(1)" - line 421, "pan.___", state 2030, "(cache_dirty_rcu_data[i])" - line 421, "pan.___", state 2030, "else" - line 421, "pan.___", state 2033, "(1)" - line 421, "pan.___", state 2034, "(1)" - line 421, "pan.___", state 2034, "(1)" - line 419, "pan.___", state 2039, "((i<2))" - line 419, "pan.___", state 2039, "((i>=2))" - line 246, "pan.___", state 2045, "(1)" - line 250, "pan.___", state 2053, "(1)" - line 250, "pan.___", state 2054, "(!(cache_dirty_urcu_active_readers))" - line 250, "pan.___", state 2054, "else" - line 248, "pan.___", state 2059, "((i<1))" - line 248, "pan.___", state 2059, "((i>=1))" - line 254, "pan.___", state 2065, "(1)" - line 254, "pan.___", state 2066, "(!(cache_dirty_rcu_ptr))" - line 254, "pan.___", state 2066, "else" - line 258, "pan.___", state 2073, "(1)" - line 258, "pan.___", state 2074, "(!(cache_dirty_rcu_data[i]))" - line 258, "pan.___", state 2074, "else" - line 256, "pan.___", state 2079, "((i<2))" - line 256, "pan.___", state 2079, "((i>=2))" - line 263, "pan.___", state 2083, "(!(cache_dirty_urcu_gp_ctr))" - line 263, "pan.___", state 2083, "else" - line 428, "pan.___", state 2085, "(1)" - line 428, "pan.___", state 2085, "(1)" - line 735, "pan.___", state 2088, "cached_urcu_active_readers = (tmp+1)" - line 735, "pan.___", state 2089, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 735, "pan.___", state 2090, "(1)" - line 408, "pan.___", state 2097, "cache_dirty_urcu_gp_ctr = 0" - line 417, "pan.___", state 2129, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 2143, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 2161, "(1)" - line 254, "pan.___", state 2181, "(1)" - line 258, "pan.___", state 2189, "(1)" - line 408, "pan.___", state 2214, "cache_dirty_urcu_gp_ctr = 0" - line 417, "pan.___", state 2246, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 2260, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 2278, "(1)" - line 254, "pan.___", state 2298, "(1)" - line 258, "pan.___", state 2306, "(1)" - line 408, "pan.___", state 2325, "cache_dirty_urcu_gp_ctr = 0" - line 417, "pan.___", state 2357, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 2371, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 2389, "(1)" - line 254, "pan.___", state 2409, "(1)" - line 258, "pan.___", state 2417, "(1)" - line 246, "pan.___", state 2448, "(1)" - line 254, "pan.___", state 2468, "(1)" - line 258, "pan.___", state 2476, "(1)" - line 246, "pan.___", state 2491, "(1)" - line 254, "pan.___", state 2511, "(1)" - line 258, "pan.___", state 2519, "(1)" - line 930, "pan.___", state 2536, "-end-" - (221 of 2536 states) -unreached in proctype urcu_writer - line 408, "pan.___", state 45, "cache_dirty_urcu_gp_ctr = 0" - line 412, "pan.___", state 59, "cache_dirty_urcu_active_readers = 0" - line 417, "pan.___", state 77, "cache_dirty_rcu_ptr = 0" - line 246, "pan.___", state 109, "(1)" - line 250, "pan.___", state 117, "(1)" - line 254, "pan.___", state 129, "(1)" - line 269, "pan.___", state 158, "cache_dirty_urcu_gp_ctr = 0" - line 273, "pan.___", state 167, "cache_dirty_urcu_active_readers = 0" - line 277, "pan.___", state 180, "cache_dirty_rcu_ptr = 0" - line 408, "pan.___", state 220, "cache_dirty_urcu_gp_ctr = 0" - line 412, "pan.___", state 234, "cache_dirty_urcu_active_readers = 0" - line 417, "pan.___", state 252, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 266, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 284, "(1)" - line 250, "pan.___", state 292, "(1)" - line 254, "pan.___", state 304, "(1)" - line 258, "pan.___", state 312, "(1)" - line 412, "pan.___", state 347, "cache_dirty_urcu_active_readers = 0" - line 417, "pan.___", state 365, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 379, "cache_dirty_rcu_data[i] = 0" - line 250, "pan.___", state 405, "(1)" - line 254, "pan.___", state 417, "(1)" - line 258, "pan.___", state 425, "(1)" - line 408, "pan.___", state 450, "cache_dirty_urcu_gp_ctr = 0" - line 408, "pan.___", state 452, "(1)" - line 408, "pan.___", state 453, "(cache_dirty_urcu_gp_ctr)" - line 408, "pan.___", state 453, "else" - line 408, "pan.___", state 456, "(1)" - line 412, "pan.___", state 464, "cache_dirty_urcu_active_readers = 0" - line 412, "pan.___", state 466, "(1)" - line 412, "pan.___", state 467, "(cache_dirty_urcu_active_readers)" - line 412, "pan.___", state 467, "else" - line 412, "pan.___", state 470, "(1)" - line 412, "pan.___", state 471, "(1)" - line 412, "pan.___", state 471, "(1)" - line 410, "pan.___", state 476, "((i<1))" - line 410, "pan.___", state 476, "((i>=1))" - line 417, "pan.___", state 482, "cache_dirty_rcu_ptr = 0" - line 417, "pan.___", state 484, "(1)" - line 417, "pan.___", state 485, "(cache_dirty_rcu_ptr)" - line 417, "pan.___", state 485, "else" - line 417, "pan.___", state 488, "(1)" - line 417, "pan.___", state 489, "(1)" - line 417, "pan.___", state 489, "(1)" - line 421, "pan.___", state 496, "cache_dirty_rcu_data[i] = 0" - line 421, "pan.___", state 498, "(1)" - line 421, "pan.___", state 499, "(cache_dirty_rcu_data[i])" - line 421, "pan.___", state 499, "else" - line 421, "pan.___", state 502, "(1)" - line 421, "pan.___", state 503, "(1)" - line 421, "pan.___", state 503, "(1)" - line 419, "pan.___", state 508, "((i<2))" - line 419, "pan.___", state 508, "((i>=2))" - line 246, "pan.___", state 514, "(1)" - line 250, "pan.___", state 522, "(1)" - line 250, "pan.___", state 523, "(!(cache_dirty_urcu_active_readers))" - line 250, "pan.___", state 523, "else" - line 248, "pan.___", state 528, "((i<1))" - line 248, "pan.___", state 528, "((i>=1))" - line 254, "pan.___", state 534, "(1)" - line 254, "pan.___", state 535, "(!(cache_dirty_rcu_ptr))" - line 254, "pan.___", state 535, "else" - line 258, "pan.___", state 542, "(1)" - line 258, "pan.___", state 543, "(!(cache_dirty_rcu_data[i]))" - line 258, "pan.___", state 543, "else" - line 263, "pan.___", state 552, "(!(cache_dirty_urcu_gp_ctr))" - line 263, "pan.___", state 552, "else" - line 428, "pan.___", state 554, "(1)" - line 428, "pan.___", state 554, "(1)" - line 412, "pan.___", state 574, "cache_dirty_urcu_active_readers = 0" - line 417, "pan.___", state 592, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 606, "cache_dirty_rcu_data[i] = 0" - line 250, "pan.___", state 632, "(1)" - line 254, "pan.___", state 644, "(1)" - line 258, "pan.___", state 652, "(1)" - line 412, "pan.___", state 685, "cache_dirty_urcu_active_readers = 0" - line 417, "pan.___", state 703, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 717, "cache_dirty_rcu_data[i] = 0" - line 250, "pan.___", state 743, "(1)" - line 254, "pan.___", state 755, "(1)" - line 258, "pan.___", state 763, "(1)" - line 412, "pan.___", state 798, "cache_dirty_urcu_active_readers = 0" - line 417, "pan.___", state 816, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 830, "cache_dirty_rcu_data[i] = 0" - line 250, "pan.___", state 856, "(1)" - line 254, "pan.___", state 868, "(1)" - line 258, "pan.___", state 876, "(1)" - line 412, "pan.___", state 914, "cache_dirty_urcu_active_readers = 0" - line 417, "pan.___", state 932, "cache_dirty_rcu_ptr = 0" - line 421, "pan.___", state 946, "cache_dirty_rcu_data[i] = 0" - line 250, "pan.___", state 972, "(1)" - line 254, "pan.___", state 984, "(1)" - line 258, "pan.___", state 992, "(1)" - line 269, "pan.___", state 1036, "cache_dirty_urcu_gp_ctr = 0" - line 273, "pan.___", state 1045, "cache_dirty_urcu_active_readers = 0" - line 277, "pan.___", state 1060, "(1)" - line 281, "pan.___", state 1067, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 1083, "(1)" - line 250, "pan.___", state 1091, "(1)" - line 254, "pan.___", state 1103, "(1)" - line 258, "pan.___", state 1111, "(1)" - line 269, "pan.___", state 1142, "cache_dirty_urcu_gp_ctr = 0" - line 273, "pan.___", state 1151, "cache_dirty_urcu_active_readers = 0" - line 277, "pan.___", state 1164, "cache_dirty_rcu_ptr = 0" - line 281, "pan.___", state 1173, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 1189, "(1)" - line 250, "pan.___", state 1197, "(1)" - line 254, "pan.___", state 1209, "(1)" - line 258, "pan.___", state 1217, "(1)" - line 273, "pan.___", state 1243, "cache_dirty_urcu_active_readers = 0" - line 277, "pan.___", state 1256, "cache_dirty_rcu_ptr = 0" - line 281, "pan.___", state 1265, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 1281, "(1)" - line 250, "pan.___", state 1289, "(1)" - line 254, "pan.___", state 1301, "(1)" - line 258, "pan.___", state 1309, "(1)" - line 269, "pan.___", state 1340, "cache_dirty_urcu_gp_ctr = 0" - line 273, "pan.___", state 1349, "cache_dirty_urcu_active_readers = 0" - line 277, "pan.___", state 1362, "cache_dirty_rcu_ptr = 0" - line 281, "pan.___", state 1371, "cache_dirty_rcu_data[i] = 0" - line 246, "pan.___", state 1387, "(1)" - line 250, "pan.___", state 1395, "(1)" - line 254, "pan.___", state 1407, "(1)" - line 258, "pan.___", state 1415, "(1)" - line 1305, "pan.___", state 1431, "-end-" - (110 of 1431 states) -unreached in proctype :init: - (0 of 28 states) -unreached in proctype :never: - line 1370, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 106 seconds -pan: rate 29466.638 states/second -pan: avg transition delay 2.9729e-06 usec -cp .input.spin urcu_progress_writer_error.spin.input -cp .input.spin.trail urcu_progress_writer_error.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi-compress' diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer_error.spin.input b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer_error.spin.input deleted file mode 100644 index 6cccb27..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer_error.spin.input +++ /dev/null @@ -1,1341 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer_error.spin.input.trail deleted file mode 100644 index e9b06b3..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi-compress/urcu_progress_writer_error.spin.input.trail +++ /dev/null @@ -1,1699 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:3997 -2:2:2536 -3:2:2541 -4:2:2545 -5:2:2553 -6:2:2557 -7:2:2561 -8:0:3997 -9:1:0 -10:1:5 -11:1:9 -12:1:17 -13:1:21 -14:1:25 -15:0:3997 -16:3:3967 -17:3:3970 -18:3:3977 -19:3:3984 -20:3:3987 -21:3:3991 -22:3:3992 -23:0:3997 -24:3:3994 -25:0:3997 -26:2:2565 -27:0:3997 -28:2:2571 -29:0:3997 -30:2:2572 -31:0:3997 -32:2:2573 -33:0:3997 -34:2:2574 -35:0:3997 -36:2:2575 -37:0:3997 -38:2:2576 -39:2:2577 -40:2:2581 -41:2:2582 -42:2:2590 -43:2:2591 -44:2:2595 -45:2:2596 -46:2:2604 -47:2:2609 -48:2:2613 -49:2:2614 -50:2:2622 -51:2:2623 -52:2:2627 -53:2:2628 -54:2:2622 -55:2:2623 -56:2:2627 -57:2:2628 -58:2:2636 -59:2:2641 -60:2:2648 -61:2:2649 -62:2:2656 -63:2:2661 -64:2:2668 -65:2:2669 -66:2:2668 -67:2:2669 -68:2:2676 -69:2:2686 -70:0:3997 -71:2:2575 -72:0:3997 -73:2:2690 -74:2:2694 -75:2:2695 -76:2:2699 -77:2:2703 -78:2:2704 -79:2:2708 -80:2:2716 -81:2:2717 -82:2:2721 -83:2:2725 -84:2:2726 -85:2:2721 -86:2:2722 -87:2:2730 -88:0:3997 -89:2:2575 -90:0:3997 -91:2:2738 -92:2:2739 -93:2:2740 -94:0:3997 -95:2:2575 -96:0:3997 -97:2:2745 -98:0:3997 -99:2:3572 -100:2:3573 -101:2:3577 -102:2:3581 -103:2:3582 -104:2:3586 -105:2:3591 -106:2:3599 -107:2:3603 -108:2:3604 -109:2:3599 -110:2:3603 -111:2:3604 -112:2:3608 -113:2:3615 -114:2:3622 -115:2:3623 -116:2:3630 -117:2:3635 -118:2:3642 -119:2:3643 -120:2:3642 -121:2:3643 -122:2:3650 -123:2:3654 -124:0:3997 -125:2:3659 -126:0:3997 -127:2:3660 -128:0:3997 -129:2:3661 -130:0:3997 -131:2:3662 -132:0:3997 -133:1:29 -134:0:3997 -135:1:35 -136:0:3997 -137:1:36 -138:0:3997 -139:2:3663 -140:0:3997 -141:1:37 -142:0:3997 -143:2:3662 -144:0:3997 -145:1:38 -146:0:3997 -147:2:3663 -148:0:3997 -149:1:39 -150:0:3997 -151:2:3662 -152:0:3997 -153:1:40 -154:0:3997 -155:2:3663 -156:0:3997 -157:1:41 -158:0:3997 -159:1:42 -160:0:3997 -161:1:43 -162:0:3997 -163:2:3662 -164:0:3997 -165:1:44 -166:0:3997 -167:2:3663 -168:0:3997 -169:1:53 -170:0:3997 -171:2:3662 -172:0:3997 -173:1:57 -174:1:58 -175:1:62 -176:1:66 -177:1:67 -178:1:71 -179:1:79 -180:1:80 -181:1:84 -182:1:88 -183:1:89 -184:1:84 -185:1:88 -186:1:89 -187:1:93 -188:1:100 -189:1:107 -190:1:108 -191:1:115 -192:1:120 -193:1:127 -194:1:128 -195:1:127 -196:1:128 -197:1:135 -198:1:139 -199:0:3997 -200:2:3663 -201:0:3997 -202:1:144 -203:0:3997 -204:2:3664 -205:0:3997 -206:2:3669 -207:0:3997 -208:2:3670 -209:0:3997 -210:2:3678 -211:2:3679 -212:2:3683 -213:2:3687 -214:2:3688 -215:2:3692 -216:2:3700 -217:2:3701 -218:2:3705 -219:2:3709 -220:2:3710 -221:2:3705 -222:2:3709 -223:2:3710 -224:2:3714 -225:2:3721 -226:2:3728 -227:2:3729 -228:2:3736 -229:2:3741 -230:2:3748 -231:2:3749 -232:2:3748 -233:2:3749 -234:2:3756 -235:2:3760 -236:0:3997 -237:2:2747 -238:2:3553 -239:0:3997 -240:2:2575 -241:0:3997 -242:2:2748 -243:0:3997 -244:2:2575 -245:0:3997 -246:2:2751 -247:2:2752 -248:2:2756 -249:2:2757 -250:2:2765 -251:2:2766 -252:2:2770 -253:2:2771 -254:2:2779 -255:2:2784 -256:2:2788 -257:2:2789 -258:2:2797 -259:2:2798 -260:2:2802 -261:2:2803 -262:2:2797 -263:2:2798 -264:2:2802 -265:2:2803 -266:2:2811 -267:2:2816 -268:2:2823 -269:2:2824 -270:2:2831 -271:2:2836 -272:2:2843 -273:2:2844 -274:2:2843 -275:2:2844 -276:2:2851 -277:2:2860 -278:0:3997 -279:2:2575 -280:0:3997 -281:2:2864 -282:2:2865 -283:2:2866 -284:2:2878 -285:2:2879 -286:2:2883 -287:2:2884 -288:2:2892 -289:2:2897 -290:2:2901 -291:2:2902 -292:2:2910 -293:2:2911 -294:2:2915 -295:2:2916 -296:2:2910 -297:2:2911 -298:2:2915 -299:2:2916 -300:2:2924 -301:2:2929 -302:2:2936 -303:2:2937 -304:2:2944 -305:2:2949 -306:2:2956 -307:2:2957 -308:2:2956 -309:2:2957 -310:2:2964 -311:2:2977 -312:2:2978 -313:0:3997 -314:2:2575 -315:0:3997 -316:2:3091 -317:2:3092 -318:2:3096 -319:2:3097 -320:2:3105 -321:2:3106 -322:2:3110 -323:2:3111 -324:2:3119 -325:2:3124 -326:2:3128 -327:2:3129 -328:2:3137 -329:2:3138 -330:2:3142 -331:2:3143 -332:2:3137 -333:2:3138 -334:2:3142 -335:2:3143 -336:2:3151 -337:2:3156 -338:2:3163 -339:2:3164 -340:2:3171 -341:2:3176 -342:2:3183 -343:2:3184 -344:2:3183 -345:2:3184 -346:2:3191 -347:0:3997 -348:2:2575 -349:0:3997 -350:2:3202 -351:2:3203 -352:2:3207 -353:2:3208 -354:2:3216 -355:2:3217 -356:2:3221 -357:2:3222 -358:2:3230 -359:2:3235 -360:2:3239 -361:2:3240 -362:2:3248 -363:2:3249 -364:2:3253 -365:2:3254 -366:2:3248 -367:2:3249 -368:2:3253 -369:2:3254 -370:2:3262 -371:2:3267 -372:2:3274 -373:2:3275 -374:2:3282 -375:2:3287 -376:2:3294 -377:2:3295 -378:2:3294 -379:2:3295 -380:2:3302 -381:2:3311 -382:0:3997 -383:2:2575 -384:0:3997 -385:2:3315 -386:2:3316 -387:2:3317 -388:2:3329 -389:2:3330 -390:2:3334 -391:2:3335 -392:2:3343 -393:2:3348 -394:2:3352 -395:2:3353 -396:2:3361 -397:2:3362 -398:2:3366 -399:2:3367 -400:2:3361 -401:2:3362 -402:2:3366 -403:2:3367 -404:2:3375 -405:2:3380 -406:2:3387 -407:2:3388 -408:2:3395 -409:2:3400 -410:2:3407 -411:2:3408 -412:2:3407 -413:2:3408 -414:2:3415 -415:2:3427 -416:2:3428 -417:0:3997 -418:2:2575 -419:0:3997 -420:2:3541 -421:0:3997 -422:2:3770 -423:2:3771 -424:2:3775 -425:2:3779 -426:2:3780 -427:2:3784 -428:2:3792 -429:2:3793 -430:2:3797 -431:2:3801 -432:2:3802 -433:2:3797 -434:2:3801 -435:2:3802 -436:2:3806 -437:2:3813 -438:2:3820 -439:2:3821 -440:2:3828 -441:2:3833 -442:2:3840 -443:2:3841 -444:2:3840 -445:2:3841 -446:2:3848 -447:2:3852 -448:0:3997 -449:2:3857 -450:0:3997 -451:2:3858 -452:0:3997 -453:2:3859 -454:0:3997 -455:2:3860 -456:0:3997 -457:1:53 -458:0:3997 -459:2:3861 -460:0:3997 -461:1:57 -462:1:58 -463:1:62 -464:1:66 -465:1:67 -466:1:71 -467:1:79 -468:1:80 -469:1:84 -470:1:88 -471:1:89 -472:1:84 -473:1:88 -474:1:89 -475:1:93 -476:1:100 -477:1:107 -478:1:108 -479:1:115 -480:1:120 -481:1:127 -482:1:128 -483:1:127 -484:1:128 -485:1:135 -486:1:139 -487:0:3997 -488:2:3860 -489:0:3997 -490:1:144 -491:0:3997 -492:2:3861 -493:0:3997 -494:2:3862 -495:0:3997 -496:2:3867 -497:0:3997 -498:2:3868 -499:0:3997 -500:2:3876 -501:2:3877 -502:2:3881 -503:2:3885 -504:2:3886 -505:2:3890 -506:2:3898 -507:2:3899 -508:2:3903 -509:2:3907 -510:2:3908 -511:2:3903 -512:2:3907 -513:2:3908 -514:2:3912 -515:2:3919 -516:2:3926 -517:2:3927 -518:2:3934 -519:2:3939 -520:2:3946 -521:2:3947 -522:2:3946 -523:2:3947 -524:2:3954 -525:2:3958 -526:0:3997 -527:2:3543 -528:2:3553 -529:0:3997 -530:2:2575 -531:0:3997 -532:2:3544 -533:2:3545 -534:0:3997 -535:2:2575 -536:0:3997 -537:2:3549 -538:0:3997 -539:2:3557 -540:0:3997 -541:2:2572 -542:0:3997 -543:2:2573 -544:0:3997 -545:2:2574 -546:0:3997 -547:2:2575 -548:0:3997 -549:2:2576 -550:2:2577 -551:2:2581 -552:2:2582 -553:2:2590 -554:2:2591 -555:2:2595 -556:2:2596 -557:2:2604 -558:2:2609 -559:2:2613 -560:2:2614 -561:2:2622 -562:2:2623 -563:2:2624 -564:2:2622 -565:2:2623 -566:2:2627 -567:2:2628 -568:2:2636 -569:2:2641 -570:2:2648 -571:2:2649 -572:2:2656 -573:2:2661 -574:2:2668 -575:2:2669 -576:2:2668 -577:2:2669 -578:2:2676 -579:2:2686 -580:0:3997 -581:2:2575 -582:0:3997 -583:2:2690 -584:2:2694 -585:2:2695 -586:2:2699 -587:2:2703 -588:2:2704 -589:2:2708 -590:2:2716 -591:2:2717 -592:2:2721 -593:2:2722 -594:2:2721 -595:2:2725 -596:2:2726 -597:2:2730 -598:0:3997 -599:2:2575 -600:0:3997 -601:2:2738 -602:2:2739 -603:2:2740 -604:0:3997 -605:2:2575 -606:0:3997 -607:2:2745 -608:0:3997 -609:2:3572 -610:2:3573 -611:2:3577 -612:2:3581 -613:2:3582 -614:2:3586 -615:2:3591 -616:2:3599 -617:2:3603 -618:2:3604 -619:2:3599 -620:2:3603 -621:2:3604 -622:2:3608 -623:2:3615 -624:2:3622 -625:2:3623 -626:2:3630 -627:2:3635 -628:2:3642 -629:2:3643 -630:2:3642 -631:2:3643 -632:2:3650 -633:2:3654 -634:0:3997 -635:2:3659 -636:0:3997 -637:2:3660 -638:0:3997 -639:2:3661 -640:0:3997 -641:2:3662 -642:0:3997 -643:1:53 -644:0:3997 -645:2:3663 -646:0:3997 -647:1:57 -648:1:58 -649:1:62 -650:1:66 -651:1:67 -652:1:71 -653:1:79 -654:1:80 -655:1:84 -656:1:88 -657:1:89 -658:1:84 -659:1:88 -660:1:89 -661:1:93 -662:1:100 -663:1:107 -664:1:108 -665:1:115 -666:1:120 -667:1:127 -668:1:128 -669:1:127 -670:1:128 -671:1:135 -672:1:139 -673:0:3997 -674:2:3662 -675:0:3997 -676:1:144 -677:0:3997 -678:2:3663 -679:0:3997 -680:2:3664 -681:0:3997 -682:2:3669 -683:0:3997 -684:2:3670 -685:0:3997 -686:2:3678 -687:2:3679 -688:2:3683 -689:2:3687 -690:2:3688 -691:2:3692 -692:2:3700 -693:2:3701 -694:2:3705 -695:2:3709 -696:2:3710 -697:2:3705 -698:2:3709 -699:2:3710 -700:2:3714 -701:2:3721 -702:2:3728 -703:2:3729 -704:2:3736 -705:2:3741 -706:2:3748 -707:2:3749 -708:2:3748 -709:2:3749 -710:2:3756 -711:2:3760 -712:0:3997 -713:2:2747 -714:2:3553 -715:0:3997 -716:2:2575 -717:0:3997 -718:2:2748 -719:0:3997 -720:2:2575 -721:0:3997 -722:2:2751 -723:2:2752 -724:2:2756 -725:2:2757 -726:2:2765 -727:2:2766 -728:2:2770 -729:2:2771 -730:2:2779 -731:2:2784 -732:2:2788 -733:2:2789 -734:2:2797 -735:2:2798 -736:2:2802 -737:2:2803 -738:2:2797 -739:2:2798 -740:2:2802 -741:2:2803 -742:2:2811 -743:2:2816 -744:2:2823 -745:2:2824 -746:2:2831 -747:2:2836 -748:2:2843 -749:2:2844 -750:2:2843 -751:2:2844 -752:2:2851 -753:2:2860 -754:0:3997 -755:2:2575 -756:0:3997 -757:2:2864 -758:2:2865 -759:2:2866 -760:2:2878 -761:2:2879 -762:2:2883 -763:2:2884 -764:2:2892 -765:2:2897 -766:2:2901 -767:2:2902 -768:2:2910 -769:2:2911 -770:2:2915 -771:2:2916 -772:2:2910 -773:2:2911 -774:2:2915 -775:2:2916 -776:2:2924 -777:2:2929 -778:2:2936 -779:2:2937 -780:2:2944 -781:2:2949 -782:2:2956 -783:2:2957 -784:2:2956 -785:2:2957 -786:2:2964 -787:2:2977 -788:2:2978 -789:0:3997 -790:2:2575 -791:0:3997 -792:2:3091 -793:2:3092 -794:2:3096 -795:2:3097 -796:2:3105 -797:2:3106 -798:2:3110 -799:2:3111 -800:2:3119 -801:2:3124 -802:2:3128 -803:2:3129 -804:2:3137 -805:2:3138 -806:2:3142 -807:2:3143 -808:2:3137 -809:2:3138 -810:2:3142 -811:2:3143 -812:2:3151 -813:2:3156 -814:2:3163 -815:2:3164 -816:2:3171 -817:2:3176 -818:2:3183 -819:2:3184 -820:2:3183 -821:2:3184 -822:2:3191 -823:0:3997 -824:2:2575 -825:0:3997 -826:2:3202 -827:2:3203 -828:2:3207 -829:2:3208 -830:2:3216 -831:2:3217 -832:2:3221 -833:2:3222 -834:2:3230 -835:2:3235 -836:2:3239 -837:2:3240 -838:2:3248 -839:2:3249 -840:2:3253 -841:2:3254 -842:2:3248 -843:2:3249 -844:2:3253 -845:2:3254 -846:2:3262 -847:2:3267 -848:2:3274 -849:2:3275 -850:2:3282 -851:2:3287 -852:2:3294 -853:2:3295 -854:2:3294 -855:2:3295 -856:2:3302 -857:2:3311 -858:0:3997 -859:2:2575 -860:0:3997 -861:2:3315 -862:2:3316 -863:2:3317 -864:2:3329 -865:2:3330 -866:2:3334 -867:2:3335 -868:2:3343 -869:2:3348 -870:2:3352 -871:2:3353 -872:2:3361 -873:2:3362 -874:2:3366 -875:2:3367 -876:2:3361 -877:2:3362 -878:2:3366 -879:2:3367 -880:2:3375 -881:2:3380 -882:2:3387 -883:2:3388 -884:2:3395 -885:2:3400 -886:2:3407 -887:2:3408 -888:2:3407 -889:2:3408 -890:2:3415 -891:2:3427 -892:2:3428 -893:0:3997 -894:2:2575 -895:0:3997 -896:2:3541 -897:0:3997 -898:2:3770 -899:2:3771 -900:2:3775 -901:2:3779 -902:2:3780 -903:2:3784 -904:2:3792 -905:2:3793 -906:2:3797 -907:2:3801 -908:2:3802 -909:2:3797 -910:2:3801 -911:2:3802 -912:2:3806 -913:2:3813 -914:2:3820 -915:2:3821 -916:2:3828 -917:2:3833 -918:2:3840 -919:2:3841 -920:2:3840 -921:2:3841 -922:2:3848 -923:2:3852 -924:0:3997 -925:2:3857 -926:0:3997 -927:2:3858 -928:0:3997 -929:2:3859 -930:0:3997 -931:2:3860 -932:0:3997 -933:1:53 -934:0:3997 -935:2:3861 -936:0:3997 -937:1:57 -938:1:58 -939:1:62 -940:1:66 -941:1:67 -942:1:71 -943:1:79 -944:1:80 -945:1:84 -946:1:88 -947:1:89 -948:1:84 -949:1:88 -950:1:89 -951:1:93 -952:1:100 -953:1:107 -954:1:108 -955:1:115 -956:1:120 -957:1:127 -958:1:128 -959:1:127 -960:1:128 -961:1:135 -962:1:139 -963:0:3997 -964:2:3860 -965:0:3997 -966:1:144 -967:0:3997 -968:2:3861 -969:0:3997 -970:2:3862 -971:0:3997 -972:2:3867 -973:0:3997 -974:2:3868 -975:0:3997 -976:2:3876 -977:2:3877 -978:2:3881 -979:2:3885 -980:2:3886 -981:2:3890 -982:2:3898 -983:2:3899 -984:2:3903 -985:2:3907 -986:2:3908 -987:2:3903 -988:2:3907 -989:2:3908 -990:2:3912 -991:2:3919 -992:2:3926 -993:2:3927 -994:2:3934 -995:2:3939 -996:2:3946 -997:2:3947 -998:2:3946 -999:2:3947 -1000:2:3954 -1001:2:3958 -1002:0:3997 -1003:2:3543 -1004:2:3553 -1005:0:3997 -1006:2:2575 -1007:0:3997 -1008:2:3544 -1009:2:3545 -1010:0:3997 -1011:2:2575 -1012:0:3997 -1013:2:3549 -1014:0:3997 -1015:2:3557 -1016:0:3997 -1017:2:2572 -1018:0:3997 -1019:2:2573 -1020:0:3997 -1021:2:2574 -1022:0:3997 -1023:2:2575 -1024:0:3997 -1025:2:2576 -1026:2:2577 -1027:2:2581 -1028:2:2582 -1029:2:2590 -1030:2:2591 -1031:2:2595 -1032:2:2596 -1033:2:2604 -1034:2:2609 -1035:2:2613 -1036:2:2614 -1037:2:2622 -1038:2:2623 -1039:2:2627 -1040:2:2628 -1041:2:2622 -1042:2:2623 -1043:2:2624 -1044:2:2636 -1045:2:2641 -1046:2:2648 -1047:2:2649 -1048:2:2656 -1049:2:2661 -1050:2:2668 -1051:2:2669 -1052:2:2668 -1053:2:2669 -1054:2:2676 -1055:2:2686 -1056:0:3997 -1057:2:2575 -1058:0:3997 -1059:2:2690 -1060:2:2694 -1061:2:2695 -1062:2:2699 -1063:2:2703 -1064:2:2704 -1065:2:2708 -1066:2:2716 -1067:2:2717 -1068:2:2721 -1069:2:2725 -1070:2:2726 -1071:2:2721 -1072:2:2722 -1073:2:2730 -1074:0:3997 -1075:2:2575 -1076:0:3997 -1077:2:2738 -1078:2:2739 -1079:2:2740 -1080:0:3997 -1081:2:2575 -1082:0:3997 -1083:2:2745 -1084:0:3997 -1085:2:3572 -1086:2:3573 -1087:2:3577 -1088:2:3581 -1089:2:3582 -1090:2:3586 -1091:2:3591 -1092:2:3599 -1093:2:3603 -1094:2:3604 -1095:2:3599 -1096:2:3603 -1097:2:3604 -1098:2:3608 -1099:2:3615 -1100:2:3622 -1101:2:3623 -1102:2:3630 -1103:2:3635 -1104:2:3642 -1105:2:3643 -1106:2:3642 -1107:2:3643 -1108:2:3650 -1109:2:3654 -1110:0:3997 -1111:2:3659 -1112:0:3997 -1113:2:3660 -1114:0:3997 -1115:2:3661 -1116:0:3997 -1117:2:3662 -1118:0:3997 -1119:1:53 -1120:0:3997 -1121:2:3663 -1122:0:3997 -1123:1:57 -1124:1:58 -1125:1:62 -1126:1:66 -1127:1:67 -1128:1:71 -1129:1:79 -1130:1:80 -1131:1:84 -1132:1:88 -1133:1:89 -1134:1:84 -1135:1:88 -1136:1:89 -1137:1:93 -1138:1:100 -1139:1:107 -1140:1:108 -1141:1:115 -1142:1:120 -1143:1:127 -1144:1:128 -1145:1:127 -1146:1:128 -1147:1:135 -1148:1:139 -1149:0:3997 -1150:2:3662 -1151:0:3997 -1152:1:144 -1153:0:3997 -1154:2:3663 -1155:0:3997 -1156:2:3664 -1157:0:3997 -1158:2:3669 -1159:0:3997 -1160:2:3670 -1161:0:3997 -1162:2:3678 -1163:2:3679 -1164:2:3683 -1165:2:3687 -1166:2:3688 -1167:2:3692 -1168:2:3700 -1169:2:3701 -1170:2:3705 -1171:2:3709 -1172:2:3710 -1173:2:3705 -1174:2:3709 -1175:2:3710 -1176:2:3714 -1177:2:3721 -1178:2:3728 -1179:2:3729 -1180:2:3736 -1181:2:3741 -1182:2:3748 -1183:2:3749 -1184:2:3748 -1185:2:3749 -1186:2:3756 -1187:2:3760 -1188:0:3997 -1189:2:2747 -1190:2:3553 -1191:0:3997 -1192:2:2575 -1193:0:3997 -1194:2:2748 -1195:0:3997 -1196:2:2575 -1197:0:3997 -1198:2:2751 -1199:2:2752 -1200:2:2756 -1201:2:2757 -1202:2:2765 -1203:2:2766 -1204:2:2770 -1205:2:2771 -1206:2:2779 -1207:2:2784 -1208:2:2788 -1209:2:2789 -1210:2:2797 -1211:2:2798 -1212:2:2802 -1213:2:2803 -1214:2:2797 -1215:2:2798 -1216:2:2802 -1217:2:2803 -1218:2:2811 -1219:2:2816 -1220:2:2823 -1221:2:2824 -1222:2:2831 -1223:2:2836 -1224:2:2843 -1225:2:2844 -1226:2:2843 -1227:2:2844 -1228:2:2851 -1229:2:2860 -1230:0:3997 -1231:2:2575 -1232:0:3997 -1233:2:2864 -1234:2:2865 -1235:2:2866 -1236:2:2878 -1237:2:2879 -1238:2:2883 -1239:2:2884 -1240:2:2892 -1241:2:2897 -1242:2:2901 -1243:2:2902 -1244:2:2910 -1245:2:2911 -1246:2:2915 -1247:2:2916 -1248:2:2910 -1249:2:2911 -1250:2:2915 -1251:2:2916 -1252:2:2924 -1253:2:2929 -1254:2:2936 -1255:2:2937 -1256:2:2944 -1257:2:2949 -1258:2:2956 -1259:2:2957 -1260:2:2956 -1261:2:2957 -1262:2:2964 -1263:2:2977 -1264:2:2978 -1265:0:3997 -1266:2:2575 -1267:0:3997 -1268:2:3091 -1269:2:3092 -1270:2:3096 -1271:2:3097 -1272:2:3105 -1273:2:3106 -1274:2:3110 -1275:2:3111 -1276:2:3119 -1277:2:3124 -1278:2:3128 -1279:2:3129 -1280:2:3137 -1281:2:3138 -1282:2:3142 -1283:2:3143 -1284:2:3137 -1285:2:3138 -1286:2:3142 -1287:2:3143 -1288:2:3151 -1289:2:3156 -1290:2:3163 -1291:2:3164 -1292:2:3171 -1293:2:3176 -1294:2:3183 -1295:2:3184 -1296:2:3183 -1297:2:3184 -1298:2:3191 -1299:0:3997 -1300:2:2575 -1301:0:3997 -1302:2:3202 -1303:2:3203 -1304:2:3207 -1305:2:3208 -1306:2:3216 -1307:2:3217 -1308:2:3221 -1309:2:3222 -1310:2:3230 -1311:2:3235 -1312:2:3239 -1313:2:3240 -1314:2:3248 -1315:2:3249 -1316:2:3253 -1317:2:3254 -1318:2:3248 -1319:2:3249 -1320:2:3253 -1321:2:3254 -1322:2:3262 -1323:2:3267 -1324:2:3274 -1325:2:3275 -1326:2:3282 -1327:2:3287 -1328:2:3294 -1329:2:3295 -1330:2:3294 -1331:2:3295 -1332:2:3302 -1333:2:3311 -1334:0:3997 -1335:2:2575 -1336:0:3997 -1337:1:145 -1338:0:3997 -1339:1:147 -1340:0:3997 -1341:1:46 -1342:0:3997 -1343:1:153 -1344:1:154 -1345:1:158 -1346:1:159 -1347:1:167 -1348:1:168 -1349:1:172 -1350:1:173 -1351:1:181 -1352:1:186 -1353:1:190 -1354:1:191 -1355:1:199 -1356:1:200 -1357:1:204 -1358:1:205 -1359:1:199 -1360:1:200 -1361:1:204 -1362:1:205 -1363:1:213 -1364:1:218 -1365:1:225 -1366:1:226 -1367:1:233 -1368:1:238 -1369:1:245 -1370:1:246 -1371:1:245 -1372:1:246 -1373:1:253 -1374:0:3997 -1375:1:42 -1376:0:3997 -1377:1:43 -1378:0:3997 -1379:1:44 -1380:0:3997 -1381:1:145 -1382:0:3997 -1383:1:147 -1384:0:3997 -1385:1:46 -1386:0:3997 -1387:1:264 -1388:1:265 -1389:0:3997 -1390:1:42 -1391:0:3997 -1392:1:43 -1393:0:3997 -1394:1:44 -1395:0:3997 -1396:1:145 -1397:0:3997 -1398:1:147 -1399:0:3997 -1400:1:46 -1401:0:3997 -1402:1:271 -1403:1:272 -1404:1:276 -1405:1:277 -1406:1:285 -1407:1:286 -1408:1:290 -1409:1:291 -1410:1:299 -1411:1:304 -1412:1:308 -1413:1:309 -1414:1:317 -1415:1:318 -1416:1:322 -1417:1:323 -1418:1:317 -1419:1:318 -1420:1:322 -1421:1:323 -1422:1:331 -1423:1:336 -1424:1:343 -1425:1:344 -1426:1:351 -1427:1:356 -1428:1:363 -1429:1:364 -1430:1:363 -1431:1:364 -1432:1:371 -1433:0:3997 -1434:1:42 -1435:0:3997 -1436:1:43 -1437:0:3997 -1438:1:44 -1439:0:3997 -1440:1:145 -1441:0:3997 -1442:1:147 -1443:0:3997 -1444:1:46 -1445:0:3997 -1446:1:382 -1447:1:383 -1448:1:387 -1449:1:388 -1450:1:396 -1451:1:397 -1452:1:401 -1453:1:402 -1454:1:410 -1455:1:415 -1456:1:419 -1457:1:420 -1458:1:428 -1459:1:429 -1460:1:433 -1461:1:434 -1462:1:428 -1463:1:429 -1464:1:433 -1465:1:434 -1466:1:442 -1467:1:447 -1468:1:454 -1469:1:455 -1470:1:462 -1471:1:467 -1472:1:474 -1473:1:475 -1474:1:474 -1475:1:475 -1476:1:482 -1477:1:491 -1478:0:3997 -1479:1:42 -1480:0:3997 -1481:1:43 -1482:0:3997 -1483:1:44 -1484:0:3997 -1485:1:145 -1486:0:3997 -1487:1:147 -1488:0:3995 -1489:1:46 -1490:0:4001 -1491:1:1067 -1492:1:1068 -1493:1:1072 -1494:1:1073 -1495:1:1081 -1496:1:1082 -1497:1:1083 -1498:1:1095 -1499:1:1100 -1500:1:1104 -1501:1:1105 -1502:1:1113 -1503:1:1114 -1504:1:1118 -1505:1:1119 -1506:1:1113 -1507:1:1114 -1508:1:1118 -1509:1:1119 -1510:1:1127 -1511:1:1132 -1512:1:1139 -1513:1:1140 -1514:1:1147 -1515:1:1152 -1516:1:1159 -1517:1:1160 -1518:1:1159 -1519:1:1160 -1520:1:1167 -1521:0:4001 -1522:1:42 -1523:0:4001 -1524:1:43 -1525:0:4001 -1526:2:3315 -1527:2:3316 -1528:2:3317 -1529:2:3329 -1530:2:3330 -1531:2:3334 -1532:2:3335 -1533:2:3343 -1534:2:3348 -1535:2:3352 -1536:2:3353 -1537:2:3361 -1538:2:3362 -1539:2:3366 -1540:2:3367 -1541:2:3361 -1542:2:3362 -1543:2:3366 -1544:2:3367 -1545:2:3375 -1546:2:3380 -1547:2:3387 -1548:2:3388 -1549:2:3395 -1550:2:3400 -1551:2:3407 -1552:2:3408 -1553:2:3407 -1554:2:3408 -1555:2:3415 -1556:2:3425 -1557:0:4001 -1558:2:2575 --1:-1:-1 -1559:0:4001 -1560:2:3431 -1561:2:3432 -1562:2:3436 -1563:2:3437 -1564:2:3445 -1565:2:3446 -1566:2:3450 -1567:2:3451 -1568:2:3459 -1569:2:3464 -1570:2:3468 -1571:2:3469 -1572:2:3477 -1573:2:3478 -1574:2:3482 -1575:2:3483 -1576:2:3477 -1577:2:3478 -1578:2:3482 -1579:2:3483 -1580:2:3491 -1581:2:3496 -1582:2:3503 -1583:2:3504 -1584:2:3511 -1585:2:3516 -1586:2:3523 -1587:2:3524 -1588:2:3523 -1589:2:3524 -1590:2:3531 -1591:0:4001 -1592:2:2575 -1593:0:4001 -1594:2:3315 -1595:2:3316 -1596:2:3320 -1597:2:3321 -1598:2:3329 -1599:2:3330 -1600:2:3334 -1601:2:3335 -1602:2:3343 -1603:2:3348 -1604:2:3352 -1605:2:3353 -1606:2:3361 -1607:2:3362 -1608:2:3366 -1609:2:3367 -1610:2:3361 -1611:2:3362 -1612:2:3366 -1613:2:3367 -1614:2:3375 -1615:2:3380 -1616:2:3387 -1617:2:3388 -1618:2:3395 -1619:2:3400 -1620:2:3407 -1621:2:3408 -1622:2:3407 -1623:2:3408 -1624:2:3415 -1625:2:3425 -1626:0:4001 -1627:2:2575 -1628:0:4001 -1629:2:3431 -1630:2:3432 -1631:2:3436 -1632:2:3437 -1633:2:3445 -1634:2:3446 -1635:2:3450 -1636:2:3451 -1637:2:3459 -1638:2:3464 -1639:2:3468 -1640:2:3469 -1641:2:3477 -1642:2:3478 -1643:2:3482 -1644:2:3483 -1645:2:3477 -1646:2:3478 -1647:2:3482 -1648:2:3483 -1649:2:3491 -1650:2:3496 -1651:2:3503 -1652:2:3504 -1653:2:3511 -1654:2:3516 -1655:2:3523 -1656:2:3524 -1657:2:3523 -1658:2:3524 -1659:2:3531 -1660:0:4001 -1661:2:2575 -1662:0:4001 -1663:2:3315 -1664:2:3316 -1665:2:3320 -1666:2:3321 -1667:2:3329 -1668:2:3330 -1669:2:3334 -1670:2:3335 -1671:2:3343 -1672:2:3348 -1673:2:3352 -1674:2:3353 -1675:2:3361 -1676:2:3362 -1677:2:3366 -1678:2:3367 -1679:2:3361 -1680:2:3362 -1681:2:3366 -1682:2:3367 -1683:2:3375 -1684:2:3380 -1685:2:3387 -1686:2:3388 -1687:2:3395 -1688:2:3400 -1689:2:3407 -1690:2:3408 -1691:2:3407 -1692:2:3408 -1693:2:3415 -1694:2:3425 -1695:0:4001 -1696:2:2575 diff --git a/formal-model/urcu-controldataflow-intel-ipi/.input.define b/formal-model/urcu-controldataflow-intel-ipi/.input.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/.input.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu-controldataflow-intel-ipi/.input.spin b/formal-model/urcu-controldataflow-intel-ipi/.input.spin deleted file mode 100644 index 10c14d2..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/.input.spin +++ /dev/null @@ -1,1273 +0,0 @@ -#define WRITER_PROGRESS - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-ipi/DEFINES b/formal-model/urcu-controldataflow-intel-ipi/DEFINES deleted file mode 100644 index abea5ff..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/DEFINES +++ /dev/null @@ -1,18 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC diff --git a/formal-model/urcu-controldataflow-intel-ipi/Makefile b/formal-model/urcu-controldataflow-intel-ipi/Makefile deleted file mode 100644 index de47dff..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/Makefile +++ /dev/null @@ -1,170 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu-controldataflow-intel-ipi/references.txt b/formal-model/urcu-controldataflow-intel-ipi/references.txt deleted file mode 100644 index 72c67a2..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/references.txt +++ /dev/null @@ -1,13 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html - -LTL vs CTL : - -http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 -http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf - (downloaded) diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu.sh b/formal-model/urcu-controldataflow-intel-ipi/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu.spin b/formal-model/urcu-controldataflow-intel-ipi/urcu.spin deleted file mode 100644 index 54752a1..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu.spin +++ /dev/null @@ -1,1254 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free.log b/formal-model/urcu-controldataflow-intel-ipi/urcu_free.log deleted file mode 100644 index afb21ca..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free.log +++ /dev/null @@ -1,503 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1294) -Depth= 9223 States= 1e+06 Transitions= 6.87e+06 Memory= 550.432 t= 16.6 R= 6e+04 -Depth= 9223 States= 2e+06 Transitions= 1.47e+07 Memory= 634.318 t= 36.7 R= 5e+04 -Depth= 9223 States= 3e+06 Transitions= 2.46e+07 Memory= 718.303 t= 62.6 R= 5e+04 -pan: resizing hashtable to -w22.. done -Depth= 9223 States= 4e+06 Transitions= 3.19e+07 Memory= 833.311 t= 81.2 R= 5e+04 -Depth= 9223 States= 5e+06 Transitions= 3.95e+07 Memory= 917.295 t= 100 R= 5e+04 -Depth= 9223 States= 6e+06 Transitions= 5.71e+07 Memory= 1001.279 t= 149 R= 4e+04 -Depth= 9223 States= 7e+06 Transitions= 6.81e+07 Memory= 1085.264 t= 178 R= 4e+04 -Depth= 9223 States= 8e+06 Transitions= 8.22e+07 Memory= 1169.151 t= 216 R= 4e+04 -Depth= 9223 States= 9e+06 Transitions= 9.54e+07 Memory= 1253.135 t= 252 R= 4e+04 -pan: resizing hashtable to -w24.. done -Depth= 9223 States= 1e+07 Transitions= 1.08e+08 Memory= 1461.115 t= 288 R= 3e+04 -Depth= 9223 States= 1.1e+07 Transitions= 1.21e+08 Memory= 1545.100 t= 321 R= 3e+04 -Depth= 9223 States= 1.2e+07 Transitions= 1.3e+08 Memory= 1629.084 t= 345 R= 3e+04 -Depth= 9223 States= 1.3e+07 Transitions= 1.42e+08 Memory= 1713.068 t= 378 R= 3e+04 -Depth= 9223 States= 1.4e+07 Transitions= 1.72e+08 Memory= 1797.053 t= 463 R= 3e+04 -Depth= 9223 States= 1.5e+07 Transitions= 1.91e+08 Memory= 1881.037 t= 516 R= 3e+04 -Depth= 9223 States= 1.6e+07 Transitions= 2.08e+08 Memory= 1964.924 t= 562 R= 3e+04 -Depth= 9223 States= 1.7e+07 Transitions= 2.2e+08 Memory= 2048.908 t= 595 R= 3e+04 -Depth= 9223 States= 1.8e+07 Transitions= 2.39e+08 Memory= 2132.893 t= 647 R= 3e+04 -Depth= 9223 States= 1.9e+07 Transitions= 2.55e+08 Memory= 2216.877 t= 691 R= 3e+04 -Depth= 9223 States= 2e+07 Transitions= 2.72e+08 Memory= 2300.861 t= 739 R= 3e+04 -Depth= 9285 States= 2.1e+07 Transitions= 2.85e+08 Memory= 2384.846 t= 774 R= 3e+04 -Depth= 9324 States= 2.2e+07 Transitions= 2.99e+08 Memory= 2468.830 t= 812 R= 3e+04 -Depth= 9324 States= 2.3e+07 Transitions= 3.1e+08 Memory= 2552.717 t= 842 R= 3e+04 -Depth= 9324 States= 2.4e+07 Transitions= 3.21e+08 Memory= 2636.701 t= 873 R= 3e+04 -Depth= 9324 States= 2.5e+07 Transitions= 3.34e+08 Memory= 2720.686 t= 908 R= 3e+04 -Depth= 9324 States= 2.6e+07 Transitions= 3.45e+08 Memory= 2804.670 t= 939 R= 3e+04 -Depth= 9324 States= 2.7e+07 Transitions= 3.59e+08 Memory= 2888.654 t= 975 R= 3e+04 -Depth= 9324 States= 2.8e+07 Transitions= 3.71e+08 Memory= 2972.639 t= 1.01e+03 R= 3e+04 -Depth= 9324 States= 2.9e+07 Transitions= 3.84e+08 Memory= 3056.526 t= 1.04e+03 R= 3e+04 -Depth= 9324 States= 3e+07 Transitions= 3.96e+08 Memory= 3140.510 t= 1.08e+03 R= 3e+04 -Depth= 9324 States= 3.1e+07 Transitions= 4.09e+08 Memory= 3224.494 t= 1.11e+03 R= 3e+04 -Depth= 9324 States= 3.2e+07 Transitions= 4.19e+08 Memory= 3308.479 t= 1.14e+03 R= 3e+04 -Depth= 9324 States= 3.3e+07 Transitions= 4.3e+08 Memory= 3392.463 t= 1.17e+03 R= 3e+04 -Depth= 9324 States= 3.4e+07 Transitions= 4.44e+08 Memory= 3476.447 t= 1.21e+03 R= 3e+04 -pan: resizing hashtable to -w26.. done -Depth= 9324 States= 3.5e+07 Transitions= 4.6e+08 Memory= 4056.416 t= 1.26e+03 R= 3e+04 -Depth= 9324 States= 3.6e+07 Transitions= 4.73e+08 Memory= 4140.401 t= 1.3e+03 R= 3e+04 -Depth= 9324 States= 3.7e+07 Transitions= 4.89e+08 Memory= 4224.385 t= 1.34e+03 R= 3e+04 -Depth= 9324 States= 3.8e+07 Transitions= 5.04e+08 Memory= 4308.369 t= 1.38e+03 R= 3e+04 -Depth= 9324 States= 3.9e+07 Transitions= 5.18e+08 Memory= 4392.354 t= 1.42e+03 R= 3e+04 -Depth= 9324 States= 4e+07 Transitions= 5.28e+08 Memory= 4476.338 t= 1.44e+03 R= 3e+04 -Depth= 9324 States= 4.1e+07 Transitions= 5.38e+08 Memory= 4560.225 t= 1.47e+03 R= 3e+04 -Depth= 9324 States= 4.2e+07 Transitions= 5.5e+08 Memory= 4644.209 t= 1.5e+03 R= 3e+04 -Depth= 9324 States= 4.3e+07 Transitions= 5.76e+08 Memory= 4728.193 t= 1.58e+03 R= 3e+04 -Depth= 9324 States= 4.4e+07 Transitions= 6.01e+08 Memory= 4812.178 t= 1.65e+03 R= 3e+04 -Depth= 9324 States= 4.5e+07 Transitions= 6.18e+08 Memory= 4896.162 t= 1.69e+03 R= 3e+04 -Depth= 9324 States= 4.6e+07 Transitions= 6.29e+08 Memory= 4980.147 t= 1.72e+03 R= 3e+04 -Depth= 9324 States= 4.7e+07 Transitions= 6.44e+08 Memory= 5064.131 t= 1.76e+03 R= 3e+04 -Depth= 9324 States= 4.8e+07 Transitions= 6.63e+08 Memory= 5148.018 t= 1.82e+03 R= 3e+04 -Depth= 9324 States= 4.9e+07 Transitions= 6.8e+08 Memory= 5232.002 t= 1.86e+03 R= 3e+04 -Depth= 9324 States= 5e+07 Transitions= 6.94e+08 Memory= 5315.986 t= 1.9e+03 R= 3e+04 -Depth= 9324 States= 5.1e+07 Transitions= 7.07e+08 Memory= 5399.971 t= 1.94e+03 R= 3e+04 -Depth= 9324 States= 5.2e+07 Transitions= 7.19e+08 Memory= 5483.955 t= 1.97e+03 R= 3e+04 -Depth= 9324 States= 5.3e+07 Transitions= 7.33e+08 Memory= 5567.940 t= 2.01e+03 R= 3e+04 -Depth= 9324 States= 5.4e+07 Transitions= 7.43e+08 Memory= 5651.826 t= 2.03e+03 R= 3e+04 -Depth= 9324 States= 5.5e+07 Transitions= 7.56e+08 Memory= 5735.811 t= 2.07e+03 R= 3e+04 -Depth= 9324 States= 5.6e+07 Transitions= 7.67e+08 Memory= 5819.795 t= 2.1e+03 R= 3e+04 -Depth= 9324 States= 5.7e+07 Transitions= 7.82e+08 Memory= 5903.779 t= 2.14e+03 R= 3e+04 -Depth= 9324 States= 5.8e+07 Transitions= 7.92e+08 Memory= 5987.764 t= 2.17e+03 R= 3e+04 -Depth= 9324 States= 5.9e+07 Transitions= 8.05e+08 Memory= 6071.748 t= 2.2e+03 R= 3e+04 -Depth= 9324 States= 6e+07 Transitions= 8.17e+08 Memory= 6155.733 t= 2.23e+03 R= 3e+04 -Depth= 9324 States= 6.1e+07 Transitions= 8.27e+08 Memory= 6239.619 t= 2.26e+03 R= 3e+04 -Depth= 9324 States= 6.2e+07 Transitions= 8.39e+08 Memory= 6323.604 t= 2.29e+03 R= 3e+04 -Depth= 9324 States= 6.3e+07 Transitions= 8.57e+08 Memory= 6407.588 t= 2.34e+03 R= 3e+04 -Depth= 9324 States= 6.4e+07 Transitions= 8.68e+08 Memory= 6491.572 t= 2.37e+03 R= 3e+04 -Depth= 9324 States= 6.5e+07 Transitions= 8.83e+08 Memory= 6575.557 t= 2.41e+03 R= 3e+04 -Depth= 9324 States= 6.6e+07 Transitions= 8.98e+08 Memory= 6659.541 t= 2.45e+03 R= 3e+04 -Depth= 9324 States= 6.7e+07 Transitions= 9.13e+08 Memory= 6743.428 t= 2.49e+03 R= 3e+04 -Depth= 9324 States= 6.8e+07 Transitions= 9.28e+08 Memory= 6827.412 t= 2.53e+03 R= 3e+04 -Depth= 9324 States= 6.9e+07 Transitions= 9.42e+08 Memory= 6911.397 t= 2.57e+03 R= 3e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 9324, errors: 0 - 69786664 states, stored -8.8218731e+08 states, matched -9.5197398e+08 transitions (= stored+matched) -1.4613809e+10 atomic steps -hash conflicts: 5.3037519e+08 (resolved) - -Stats on memory usage (in Megabytes): - 7720.235 equivalent memory usage for states (stored*(State-vector + overhead)) - 6011.129 actual memory usage for states (compression: 77.86%) - state-vector as stored = 62 byte + 28 byte overhead - 512.000 memory used for hash table (-w26) - 457.764 memory used for DFS stack (-m10000000) - 3.383 memory lost to fragmentation - 6977.510 total actual memory usage - -unreached in proctype urcu_reader - line 271, "pan.___", state 30, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 52, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 61, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 77, "(1)" - line 252, "pan.___", state 85, "(1)" - line 256, "pan.___", state 97, "(1)" - line 260, "pan.___", state 105, "(1)" - line 410, "pan.___", state 131, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 163, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 177, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 195, "(1)" - line 256, "pan.___", state 215, "(1)" - line 260, "pan.___", state 223, "(1)" - line 690, "pan.___", state 242, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 410, "pan.___", state 249, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 281, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 295, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 313, "(1)" - line 256, "pan.___", state 333, "(1)" - line 260, "pan.___", state 341, "(1)" - line 410, "pan.___", state 360, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 392, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 406, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 424, "(1)" - line 256, "pan.___", state 444, "(1)" - line 260, "pan.___", state 452, "(1)" - line 410, "pan.___", state 473, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 475, "(1)" - line 410, "pan.___", state 476, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 410, "pan.___", state 476, "else" - line 410, "pan.___", state 479, "(1)" - line 414, "pan.___", state 487, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 489, "(1)" - line 414, "pan.___", state 490, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 414, "pan.___", state 490, "else" - line 414, "pan.___", state 493, "(1)" - line 414, "pan.___", state 494, "(1)" - line 414, "pan.___", state 494, "(1)" - line 412, "pan.___", state 499, "((i<1))" - line 412, "pan.___", state 499, "((i>=1))" - line 419, "pan.___", state 505, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 507, "(1)" - line 419, "pan.___", state 508, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 419, "pan.___", state 508, "else" - line 419, "pan.___", state 511, "(1)" - line 419, "pan.___", state 512, "(1)" - line 419, "pan.___", state 512, "(1)" - line 423, "pan.___", state 519, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 423, "pan.___", state 521, "(1)" - line 423, "pan.___", state 522, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 423, "pan.___", state 522, "else" - line 423, "pan.___", state 525, "(1)" - line 423, "pan.___", state 526, "(1)" - line 423, "pan.___", state 526, "(1)" - line 421, "pan.___", state 531, "((i<2))" - line 421, "pan.___", state 531, "((i>=2))" - line 248, "pan.___", state 537, "(1)" - line 252, "pan.___", state 545, "(1)" - line 252, "pan.___", state 546, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 252, "pan.___", state 546, "else" - line 250, "pan.___", state 551, "((i<1))" - line 250, "pan.___", state 551, "((i>=1))" - line 256, "pan.___", state 557, "(1)" - line 256, "pan.___", state 558, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 256, "pan.___", state 558, "else" - line 260, "pan.___", state 565, "(1)" - line 260, "pan.___", state 566, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 260, "pan.___", state 566, "else" - line 258, "pan.___", state 571, "((i<2))" - line 258, "pan.___", state 571, "((i>=2))" - line 265, "pan.___", state 575, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 265, "pan.___", state 575, "else" - line 430, "pan.___", state 577, "(1)" - line 430, "pan.___", state 577, "(1)" - line 690, "pan.___", state 580, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 690, "pan.___", state 581, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 690, "pan.___", state 582, "(1)" - line 410, "pan.___", state 589, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 621, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 635, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 653, "(1)" - line 256, "pan.___", state 673, "(1)" - line 260, "pan.___", state 681, "(1)" - line 410, "pan.___", state 707, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 739, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 753, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 771, "(1)" - line 256, "pan.___", state 791, "(1)" - line 260, "pan.___", state 799, "(1)" - line 410, "pan.___", state 818, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 820, "(1)" - line 410, "pan.___", state 821, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 410, "pan.___", state 821, "else" - line 410, "pan.___", state 824, "(1)" - line 414, "pan.___", state 832, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 834, "(1)" - line 414, "pan.___", state 835, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 414, "pan.___", state 835, "else" - line 414, "pan.___", state 838, "(1)" - line 414, "pan.___", state 839, "(1)" - line 414, "pan.___", state 839, "(1)" - line 412, "pan.___", state 844, "((i<1))" - line 412, "pan.___", state 844, "((i>=1))" - line 419, "pan.___", state 850, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 852, "(1)" - line 419, "pan.___", state 853, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 419, "pan.___", state 853, "else" - line 419, "pan.___", state 856, "(1)" - line 419, "pan.___", state 857, "(1)" - line 419, "pan.___", state 857, "(1)" - line 423, "pan.___", state 864, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 423, "pan.___", state 866, "(1)" - line 423, "pan.___", state 867, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 423, "pan.___", state 867, "else" - line 423, "pan.___", state 870, "(1)" - line 423, "pan.___", state 871, "(1)" - line 423, "pan.___", state 871, "(1)" - line 421, "pan.___", state 876, "((i<2))" - line 421, "pan.___", state 876, "((i>=2))" - line 248, "pan.___", state 882, "(1)" - line 252, "pan.___", state 890, "(1)" - line 252, "pan.___", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 252, "pan.___", state 891, "else" - line 250, "pan.___", state 896, "((i<1))" - line 250, "pan.___", state 896, "((i>=1))" - line 256, "pan.___", state 902, "(1)" - line 256, "pan.___", state 903, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 256, "pan.___", state 903, "else" - line 260, "pan.___", state 910, "(1)" - line 260, "pan.___", state 911, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 260, "pan.___", state 911, "else" - line 258, "pan.___", state 916, "((i<2))" - line 258, "pan.___", state 916, "((i>=2))" - line 265, "pan.___", state 920, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 265, "pan.___", state 920, "else" - line 430, "pan.___", state 922, "(1)" - line 430, "pan.___", state 922, "(1)" - line 698, "pan.___", state 926, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 410, "pan.___", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 963, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 977, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 995, "(1)" - line 256, "pan.___", state 1015, "(1)" - line 260, "pan.___", state 1023, "(1)" - line 410, "pan.___", state 1045, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1077, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1091, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1109, "(1)" - line 256, "pan.___", state 1129, "(1)" - line 260, "pan.___", state 1137, "(1)" - line 410, "pan.___", state 1160, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1192, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1206, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1224, "(1)" - line 256, "pan.___", state 1244, "(1)" - line 260, "pan.___", state 1252, "(1)" - line 410, "pan.___", state 1271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1303, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1317, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1335, "(1)" - line 256, "pan.___", state 1355, "(1)" - line 260, "pan.___", state 1363, "(1)" - line 410, "pan.___", state 1387, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1419, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1433, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1451, "(1)" - line 256, "pan.___", state 1471, "(1)" - line 260, "pan.___", state 1479, "(1)" - line 410, "pan.___", state 1498, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1530, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1544, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1562, "(1)" - line 256, "pan.___", state 1582, "(1)" - line 260, "pan.___", state 1590, "(1)" - line 410, "pan.___", state 1612, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1644, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1658, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1676, "(1)" - line 256, "pan.___", state 1696, "(1)" - line 260, "pan.___", state 1704, "(1)" - line 737, "pan.___", state 1723, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 410, "pan.___", state 1730, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1762, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1776, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1794, "(1)" - line 256, "pan.___", state 1814, "(1)" - line 260, "pan.___", state 1822, "(1)" - line 410, "pan.___", state 1841, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1873, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1887, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1905, "(1)" - line 256, "pan.___", state 1925, "(1)" - line 260, "pan.___", state 1933, "(1)" - line 410, "pan.___", state 1954, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 1956, "(1)" - line 410, "pan.___", state 1957, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 410, "pan.___", state 1957, "else" - line 410, "pan.___", state 1960, "(1)" - line 414, "pan.___", state 1968, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1970, "(1)" - line 414, "pan.___", state 1971, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 414, "pan.___", state 1971, "else" - line 414, "pan.___", state 1974, "(1)" - line 414, "pan.___", state 1975, "(1)" - line 414, "pan.___", state 1975, "(1)" - line 412, "pan.___", state 1980, "((i<1))" - line 412, "pan.___", state 1980, "((i>=1))" - line 419, "pan.___", state 1986, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1988, "(1)" - line 419, "pan.___", state 1989, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 419, "pan.___", state 1989, "else" - line 419, "pan.___", state 1992, "(1)" - line 419, "pan.___", state 1993, "(1)" - line 419, "pan.___", state 1993, "(1)" - line 423, "pan.___", state 2000, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 423, "pan.___", state 2002, "(1)" - line 423, "pan.___", state 2003, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 423, "pan.___", state 2003, "else" - line 423, "pan.___", state 2006, "(1)" - line 423, "pan.___", state 2007, "(1)" - line 423, "pan.___", state 2007, "(1)" - line 421, "pan.___", state 2012, "((i<2))" - line 421, "pan.___", state 2012, "((i>=2))" - line 248, "pan.___", state 2018, "(1)" - line 252, "pan.___", state 2026, "(1)" - line 252, "pan.___", state 2027, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 252, "pan.___", state 2027, "else" - line 250, "pan.___", state 2032, "((i<1))" - line 250, "pan.___", state 2032, "((i>=1))" - line 256, "pan.___", state 2038, "(1)" - line 256, "pan.___", state 2039, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 256, "pan.___", state 2039, "else" - line 260, "pan.___", state 2046, "(1)" - line 260, "pan.___", state 2047, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 260, "pan.___", state 2047, "else" - line 258, "pan.___", state 2052, "((i<2))" - line 258, "pan.___", state 2052, "((i>=2))" - line 265, "pan.___", state 2056, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 265, "pan.___", state 2056, "else" - line 430, "pan.___", state 2058, "(1)" - line 430, "pan.___", state 2058, "(1)" - line 737, "pan.___", state 2061, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 737, "pan.___", state 2062, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 737, "pan.___", state 2063, "(1)" - line 410, "pan.___", state 2070, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 2102, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 2116, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 2134, "(1)" - line 256, "pan.___", state 2154, "(1)" - line 260, "pan.___", state 2162, "(1)" - line 410, "pan.___", state 2187, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 2219, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 2233, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 2251, "(1)" - line 256, "pan.___", state 2271, "(1)" - line 260, "pan.___", state 2279, "(1)" - line 410, "pan.___", state 2298, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 2330, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 2344, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 2362, "(1)" - line 256, "pan.___", state 2382, "(1)" - line 260, "pan.___", state 2390, "(1)" - line 248, "pan.___", state 2421, "(1)" - line 256, "pan.___", state 2441, "(1)" - line 260, "pan.___", state 2449, "(1)" - line 248, "pan.___", state 2464, "(1)" - line 256, "pan.___", state 2484, "(1)" - line 260, "pan.___", state 2492, "(1)" - line 897, "pan.___", state 2509, "-end-" - (221 of 2509 states) -unreached in proctype urcu_writer - line 410, "pan.___", state 18, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 32, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 50, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 248, "pan.___", state 82, "(1)" - line 252, "pan.___", state 90, "(1)" - line 256, "pan.___", state 102, "(1)" - line 271, "pan.___", state 131, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 140, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 153, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 207, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 225, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 239, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 257, "(1)" - line 252, "pan.___", state 265, "(1)" - line 256, "pan.___", state 277, "(1)" - line 260, "pan.___", state 285, "(1)" - line 414, "pan.___", state 320, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 338, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 352, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 252, "pan.___", state 378, "(1)" - line 256, "pan.___", state 390, "(1)" - line 260, "pan.___", state 398, "(1)" - line 414, "pan.___", state 441, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 459, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 473, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 252, "pan.___", state 499, "(1)" - line 256, "pan.___", state 511, "(1)" - line 260, "pan.___", state 519, "(1)" - line 414, "pan.___", state 552, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 570, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 584, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 252, "pan.___", state 610, "(1)" - line 256, "pan.___", state 622, "(1)" - line 260, "pan.___", state 630, "(1)" - line 414, "pan.___", state 665, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 683, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 697, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 252, "pan.___", state 723, "(1)" - line 256, "pan.___", state 735, "(1)" - line 260, "pan.___", state 743, "(1)" - line 271, "pan.___", state 796, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 805, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 820, "(1)" - line 283, "pan.___", state 827, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 843, "(1)" - line 252, "pan.___", state 851, "(1)" - line 256, "pan.___", state 863, "(1)" - line 260, "pan.___", state 871, "(1)" - line 271, "pan.___", state 902, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 911, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 924, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 933, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 949, "(1)" - line 252, "pan.___", state 957, "(1)" - line 256, "pan.___", state 969, "(1)" - line 260, "pan.___", state 977, "(1)" - line 275, "pan.___", state 1003, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 1016, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 1025, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1041, "(1)" - line 252, "pan.___", state 1049, "(1)" - line 256, "pan.___", state 1061, "(1)" - line 260, "pan.___", state 1069, "(1)" - line 271, "pan.___", state 1100, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 1109, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 1122, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 1131, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1147, "(1)" - line 252, "pan.___", state 1155, "(1)" - line 256, "pan.___", state 1167, "(1)" - line 260, "pan.___", state 1175, "(1)" - line 275, "pan.___", state 1201, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 1214, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 1223, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1239, "(1)" - line 252, "pan.___", state 1247, "(1)" - line 256, "pan.___", state 1259, "(1)" - line 260, "pan.___", state 1267, "(1)" - line 271, "pan.___", state 1298, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 1307, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 1320, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 1329, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1345, "(1)" - line 252, "pan.___", state 1353, "(1)" - line 256, "pan.___", state 1365, "(1)" - line 260, "pan.___", state 1373, "(1)" - line 275, "pan.___", state 1399, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 1412, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 1421, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1437, "(1)" - line 252, "pan.___", state 1445, "(1)" - line 256, "pan.___", state 1457, "(1)" - line 260, "pan.___", state 1465, "(1)" - line 271, "pan.___", state 1496, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 1505, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 1518, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 1527, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1543, "(1)" - line 252, "pan.___", state 1551, "(1)" - line 256, "pan.___", state 1563, "(1)" - line 260, "pan.___", state 1571, "(1)" - line 1236, "pan.___", state 1587, "-end-" - (103 of 1587 states) -unreached in proctype :init: - (0 of 78 states) -unreached in proctype :never: - line 1299, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 2.6e+03 seconds -pan: rate 26856.415 states/second -pan: avg transition delay 2.7296e-06 usec -cp .input.spin urcu_free.spin.input -cp .input.spin.trail urcu_free.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi' diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free.ltl b/formal-model/urcu-controldataflow-intel-ipi/urcu_free.ltl deleted file mode 100644 index 6be1be9..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free.ltl +++ /dev/null @@ -1 +0,0 @@ -[] (!read_poison) diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free.spin.input b/formal-model/urcu-controldataflow-intel-ipi/urcu_free.spin.input deleted file mode 100644 index 66927ee..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free.spin.input +++ /dev/null @@ -1,1272 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_nested.define b/formal-model/urcu-controldataflow-intel-ipi/urcu_free_nested.define deleted file mode 100644 index 0fb59bd..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_nested.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_NEST_LEVEL 2 diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_mb.define b/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_mb.define deleted file mode 100644 index d99d793..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_mb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_MB diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_mb.log b/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_mb.log deleted file mode 100644 index 1984f88..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_mb.log +++ /dev/null @@ -1,592 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_mb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1295) -Depth= 8619 States= 1e+06 Transitions= 8e+06 Memory= 550.432 t= 20.2 R= 5e+04 -Depth= 8619 States= 2e+06 Transitions= 1.8e+07 Memory= 634.318 t= 46.3 R= 4e+04 -Depth= 8619 States= 3e+06 Transitions= 2.53e+07 Memory= 718.303 t= 64.9 R= 5e+04 -pan: resizing hashtable to -w22.. done -Depth= 8619 States= 4e+06 Transitions= 3.53e+07 Memory= 833.311 t= 91.4 R= 4e+04 -Depth= 8619 States= 5e+06 Transitions= 5.71e+07 Memory= 917.295 t= 152 R= 3e+04 -Depth= 8619 States= 6e+06 Transitions= 6.81e+07 Memory= 1001.279 t= 181 R= 3e+04 -Depth= 8619 States= 7e+06 Transitions= 8.02e+07 Memory= 1085.264 t= 214 R= 3e+04 -Depth= 8619 States= 8e+06 Transitions= 8.9e+07 Memory= 1169.151 t= 238 R= 3e+04 -pan: claim violated! (at depth 1359) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 8619, errors: 1 - 8162162 states, stored - 81941434 states, matched - 90103596 transitions (= stored+matched) -1.3256628e+09 atomic steps -hash conflicts: 60101961 (resolved) - -Stats on memory usage (in Megabytes): - 902.949 equivalent memory usage for states (stored*(State-vector + overhead)) - 693.526 actual memory usage for states (compression: 76.81%) - state-vector as stored = 61 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 1182.822 total actual memory usage - -unreached in proctype urcu_reader - line 272, "pan.___", state 34, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 56, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 65, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 81, "(1)" - line 253, "pan.___", state 89, "(1)" - line 257, "pan.___", state 101, "(1)" - line 261, "pan.___", state 109, "(1)" - line 411, "pan.___", state 135, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 167, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 181, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 199, "(1)" - line 257, "pan.___", state 219, "(1)" - line 261, "pan.___", state 227, "(1)" - line 700, "pan.___", state 246, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 411, "pan.___", state 253, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 285, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 299, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 317, "(1)" - line 257, "pan.___", state 337, "(1)" - line 261, "pan.___", state 345, "(1)" - line 411, "pan.___", state 364, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 396, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 410, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 428, "(1)" - line 257, "pan.___", state 448, "(1)" - line 261, "pan.___", state 456, "(1)" - line 411, "pan.___", state 477, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 479, "(1)" - line 411, "pan.___", state 480, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 480, "else" - line 411, "pan.___", state 483, "(1)" - line 415, "pan.___", state 491, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 493, "(1)" - line 415, "pan.___", state 494, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 494, "else" - line 415, "pan.___", state 497, "(1)" - line 415, "pan.___", state 498, "(1)" - line 415, "pan.___", state 498, "(1)" - line 413, "pan.___", state 503, "((i<1))" - line 413, "pan.___", state 503, "((i>=1))" - line 420, "pan.___", state 509, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 511, "(1)" - line 420, "pan.___", state 512, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 512, "else" - line 420, "pan.___", state 515, "(1)" - line 420, "pan.___", state 516, "(1)" - line 420, "pan.___", state 516, "(1)" - line 424, "pan.___", state 523, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 525, "(1)" - line 424, "pan.___", state 526, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 526, "else" - line 424, "pan.___", state 529, "(1)" - line 424, "pan.___", state 530, "(1)" - line 424, "pan.___", state 530, "(1)" - line 422, "pan.___", state 535, "((i<2))" - line 422, "pan.___", state 535, "((i>=2))" - line 249, "pan.___", state 541, "(1)" - line 253, "pan.___", state 549, "(1)" - line 253, "pan.___", state 550, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 550, "else" - line 251, "pan.___", state 555, "((i<1))" - line 251, "pan.___", state 555, "((i>=1))" - line 257, "pan.___", state 561, "(1)" - line 257, "pan.___", state 562, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 562, "else" - line 261, "pan.___", state 569, "(1)" - line 261, "pan.___", state 570, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 570, "else" - line 259, "pan.___", state 575, "((i<2))" - line 259, "pan.___", state 575, "((i>=2))" - line 266, "pan.___", state 579, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 579, "else" - line 431, "pan.___", state 581, "(1)" - line 431, "pan.___", state 581, "(1)" - line 700, "pan.___", state 584, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 700, "pan.___", state 585, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 700, "pan.___", state 586, "(1)" - line 411, "pan.___", state 593, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 625, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 639, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 657, "(1)" - line 257, "pan.___", state 677, "(1)" - line 261, "pan.___", state 685, "(1)" - line 411, "pan.___", state 711, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 743, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 757, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 775, "(1)" - line 257, "pan.___", state 795, "(1)" - line 261, "pan.___", state 803, "(1)" - line 411, "pan.___", state 822, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 824, "(1)" - line 411, "pan.___", state 825, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 825, "else" - line 411, "pan.___", state 828, "(1)" - line 415, "pan.___", state 836, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 838, "(1)" - line 415, "pan.___", state 839, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 839, "else" - line 415, "pan.___", state 842, "(1)" - line 415, "pan.___", state 843, "(1)" - line 415, "pan.___", state 843, "(1)" - line 413, "pan.___", state 848, "((i<1))" - line 413, "pan.___", state 848, "((i>=1))" - line 420, "pan.___", state 854, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 856, "(1)" - line 420, "pan.___", state 857, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 857, "else" - line 420, "pan.___", state 860, "(1)" - line 420, "pan.___", state 861, "(1)" - line 420, "pan.___", state 861, "(1)" - line 424, "pan.___", state 868, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 870, "(1)" - line 424, "pan.___", state 871, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 871, "else" - line 424, "pan.___", state 874, "(1)" - line 424, "pan.___", state 875, "(1)" - line 424, "pan.___", state 875, "(1)" - line 422, "pan.___", state 880, "((i<2))" - line 422, "pan.___", state 880, "((i>=2))" - line 249, "pan.___", state 886, "(1)" - line 253, "pan.___", state 894, "(1)" - line 253, "pan.___", state 895, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 895, "else" - line 251, "pan.___", state 900, "((i<1))" - line 251, "pan.___", state 900, "((i>=1))" - line 257, "pan.___", state 906, "(1)" - line 257, "pan.___", state 907, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 907, "else" - line 261, "pan.___", state 914, "(1)" - line 261, "pan.___", state 915, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 915, "else" - line 259, "pan.___", state 920, "((i<2))" - line 259, "pan.___", state 920, "((i>=2))" - line 266, "pan.___", state 924, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 924, "else" - line 431, "pan.___", state 926, "(1)" - line 431, "pan.___", state 926, "(1)" - line 708, "pan.___", state 930, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 411, "pan.___", state 935, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 967, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 981, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 999, "(1)" - line 257, "pan.___", state 1019, "(1)" - line 261, "pan.___", state 1027, "(1)" - line 411, "pan.___", state 1049, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1081, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1095, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1113, "(1)" - line 257, "pan.___", state 1133, "(1)" - line 261, "pan.___", state 1141, "(1)" - line 411, "pan.___", state 1164, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1196, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1210, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1228, "(1)" - line 257, "pan.___", state 1248, "(1)" - line 261, "pan.___", state 1256, "(1)" - line 411, "pan.___", state 1275, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1307, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1321, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1339, "(1)" - line 257, "pan.___", state 1359, "(1)" - line 261, "pan.___", state 1367, "(1)" - line 411, "pan.___", state 1391, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1423, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1437, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1455, "(1)" - line 257, "pan.___", state 1475, "(1)" - line 261, "pan.___", state 1483, "(1)" - line 411, "pan.___", state 1502, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1534, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1548, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1566, "(1)" - line 257, "pan.___", state 1586, "(1)" - line 261, "pan.___", state 1594, "(1)" - line 411, "pan.___", state 1616, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1648, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1662, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1680, "(1)" - line 257, "pan.___", state 1700, "(1)" - line 261, "pan.___", state 1708, "(1)" - line 747, "pan.___", state 1727, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 411, "pan.___", state 1734, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1766, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1780, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1798, "(1)" - line 257, "pan.___", state 1818, "(1)" - line 261, "pan.___", state 1826, "(1)" - line 411, "pan.___", state 1845, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1877, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1891, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1909, "(1)" - line 257, "pan.___", state 1929, "(1)" - line 261, "pan.___", state 1937, "(1)" - line 411, "pan.___", state 1958, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 1960, "(1)" - line 411, "pan.___", state 1961, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 1961, "else" - line 411, "pan.___", state 1964, "(1)" - line 415, "pan.___", state 1972, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1974, "(1)" - line 415, "pan.___", state 1975, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 1975, "else" - line 415, "pan.___", state 1978, "(1)" - line 415, "pan.___", state 1979, "(1)" - line 415, "pan.___", state 1979, "(1)" - line 413, "pan.___", state 1984, "((i<1))" - line 413, "pan.___", state 1984, "((i>=1))" - line 420, "pan.___", state 1990, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1992, "(1)" - line 420, "pan.___", state 1993, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 1993, "else" - line 420, "pan.___", state 1996, "(1)" - line 420, "pan.___", state 1997, "(1)" - line 420, "pan.___", state 1997, "(1)" - line 424, "pan.___", state 2004, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2006, "(1)" - line 424, "pan.___", state 2007, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 2007, "else" - line 424, "pan.___", state 2010, "(1)" - line 424, "pan.___", state 2011, "(1)" - line 424, "pan.___", state 2011, "(1)" - line 422, "pan.___", state 2016, "((i<2))" - line 422, "pan.___", state 2016, "((i>=2))" - line 249, "pan.___", state 2022, "(1)" - line 253, "pan.___", state 2030, "(1)" - line 253, "pan.___", state 2031, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 2031, "else" - line 251, "pan.___", state 2036, "((i<1))" - line 251, "pan.___", state 2036, "((i>=1))" - line 257, "pan.___", state 2042, "(1)" - line 257, "pan.___", state 2043, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 2043, "else" - line 261, "pan.___", state 2050, "(1)" - line 261, "pan.___", state 2051, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 2051, "else" - line 259, "pan.___", state 2056, "((i<2))" - line 259, "pan.___", state 2056, "((i>=2))" - line 266, "pan.___", state 2060, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 2060, "else" - line 431, "pan.___", state 2062, "(1)" - line 431, "pan.___", state 2062, "(1)" - line 747, "pan.___", state 2065, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 747, "pan.___", state 2066, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 747, "pan.___", state 2067, "(1)" - line 411, "pan.___", state 2074, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2106, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2120, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2138, "(1)" - line 257, "pan.___", state 2158, "(1)" - line 261, "pan.___", state 2166, "(1)" - line 411, "pan.___", state 2191, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2223, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2237, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2255, "(1)" - line 257, "pan.___", state 2275, "(1)" - line 261, "pan.___", state 2283, "(1)" - line 411, "pan.___", state 2302, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2334, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2348, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2366, "(1)" - line 257, "pan.___", state 2386, "(1)" - line 261, "pan.___", state 2394, "(1)" - line 249, "pan.___", state 2425, "(1)" - line 257, "pan.___", state 2445, "(1)" - line 261, "pan.___", state 2453, "(1)" - line 249, "pan.___", state 2468, "(1)" - line 257, "pan.___", state 2488, "(1)" - line 261, "pan.___", state 2496, "(1)" - line 898, "pan.___", state 2513, "-end-" - (221 of 2513 states) -unreached in proctype urcu_writer - line 411, "pan.___", state 20, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 26, "(1)" - line 415, "pan.___", state 34, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 40, "(1)" - line 415, "pan.___", state 41, "(1)" - line 415, "pan.___", state 41, "(1)" - line 413, "pan.___", state 46, "((i<1))" - line 413, "pan.___", state 46, "((i>=1))" - line 420, "pan.___", state 52, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 58, "(1)" - line 420, "pan.___", state 59, "(1)" - line 420, "pan.___", state 59, "(1)" - line 424, "pan.___", state 72, "(1)" - line 424, "pan.___", state 73, "(1)" - line 424, "pan.___", state 73, "(1)" - line 422, "pan.___", state 78, "((i<2))" - line 422, "pan.___", state 78, "((i>=2))" - line 249, "pan.___", state 84, "(1)" - line 253, "pan.___", state 92, "(1)" - line 253, "pan.___", state 93, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 93, "else" - line 251, "pan.___", state 98, "((i<1))" - line 251, "pan.___", state 98, "((i>=1))" - line 257, "pan.___", state 104, "(1)" - line 257, "pan.___", state 105, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 105, "else" - line 261, "pan.___", state 112, "(1)" - line 261, "pan.___", state 113, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 113, "else" - line 259, "pan.___", state 118, "((i<2))" - line 259, "pan.___", state 118, "((i>=2))" - line 266, "pan.___", state 122, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 122, "else" - line 431, "pan.___", state 124, "(1)" - line 431, "pan.___", state 124, "(1)" - line 272, "pan.___", state 133, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 142, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 274, "pan.___", state 150, "((i<1))" - line 274, "pan.___", state 150, "((i>=1))" - line 280, "pan.___", state 155, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 1021, "pan.___", state 183, "old_data = cached_rcu_ptr.val[_pid]" - line 1032, "pan.___", state 187, "_proc_urcu_writer = (_proc_urcu_writer|(1<<4))" - line 411, "pan.___", state 195, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 201, "(1)" - line 415, "pan.___", state 209, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 215, "(1)" - line 415, "pan.___", state 216, "(1)" - line 415, "pan.___", state 216, "(1)" - line 420, "pan.___", state 229, "(1)" - line 424, "pan.___", state 241, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 259, "(1)" - line 253, "pan.___", state 267, "(1)" - line 261, "pan.___", state 287, "(1)" - line 431, "pan.___", state 299, "(1)" - line 431, "pan.___", state 299, "(1)" - line 415, "pan.___", state 322, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 354, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 380, "(1)" - line 261, "pan.___", state 400, "(1)" - line 415, "pan.___", state 443, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 253, "pan.___", state 501, "(1)" - line 415, "pan.___", state 554, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 253, "pan.___", state 612, "(1)" - line 415, "pan.___", state 667, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 699, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 725, "(1)" - line 261, "pan.___", state 745, "(1)" - line 1168, "pan.___", state 770, "_proc_urcu_writer = (_proc_urcu_writer|(1<<13))" - line 272, "pan.___", state 798, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 800, "(1)" - line 276, "pan.___", state 807, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 809, "(1)" - line 276, "pan.___", state 810, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 810, "else" - line 274, "pan.___", state 815, "((i<1))" - line 274, "pan.___", state 815, "((i>=1))" - line 280, "pan.___", state 820, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 822, "(1)" - line 280, "pan.___", state 823, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 823, "else" - line 284, "pan.___", state 829, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 831, "(1)" - line 284, "pan.___", state 832, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 832, "else" - line 282, "pan.___", state 837, "((i<2))" - line 282, "pan.___", state 837, "((i>=2))" - line 249, "pan.___", state 845, "(1)" - line 253, "pan.___", state 853, "(1)" - line 253, "pan.___", state 854, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 854, "else" - line 251, "pan.___", state 859, "((i<1))" - line 251, "pan.___", state 859, "((i>=1))" - line 257, "pan.___", state 865, "(1)" - line 257, "pan.___", state 866, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 866, "else" - line 261, "pan.___", state 873, "(1)" - line 261, "pan.___", state 874, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 874, "else" - line 266, "pan.___", state 883, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 883, "else" - line 1222, "pan.___", state 899, "((i<1))" - line 1222, "pan.___", state 899, "((i>=1))" - line 272, "pan.___", state 904, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 906, "(1)" - line 276, "pan.___", state 913, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 915, "(1)" - line 276, "pan.___", state 916, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 916, "else" - line 274, "pan.___", state 921, "((i<1))" - line 274, "pan.___", state 921, "((i>=1))" - line 280, "pan.___", state 926, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 928, "(1)" - line 280, "pan.___", state 929, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 929, "else" - line 284, "pan.___", state 935, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 937, "(1)" - line 284, "pan.___", state 938, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 938, "else" - line 282, "pan.___", state 943, "((i<2))" - line 282, "pan.___", state 943, "((i>=2))" - line 249, "pan.___", state 951, "(1)" - line 253, "pan.___", state 959, "(1)" - line 253, "pan.___", state 960, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 960, "else" - line 251, "pan.___", state 965, "((i<1))" - line 251, "pan.___", state 965, "((i>=1))" - line 257, "pan.___", state 971, "(1)" - line 257, "pan.___", state 972, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 972, "else" - line 261, "pan.___", state 979, "(1)" - line 261, "pan.___", state 980, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 980, "else" - line 266, "pan.___", state 989, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 989, "else" - line 299, "pan.___", state 991, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 991, "else" - line 1222, "pan.___", state 992, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 1222, "pan.___", state 992, "else" - line 276, "pan.___", state 1005, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1018, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1027, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1043, "(1)" - line 253, "pan.___", state 1051, "(1)" - line 257, "pan.___", state 1063, "(1)" - line 261, "pan.___", state 1071, "(1)" - line 272, "pan.___", state 1102, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1111, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1124, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1133, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1149, "(1)" - line 253, "pan.___", state 1157, "(1)" - line 257, "pan.___", state 1169, "(1)" - line 261, "pan.___", state 1177, "(1)" - line 276, "pan.___", state 1203, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1225, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1241, "(1)" - line 253, "pan.___", state 1249, "(1)" - line 257, "pan.___", state 1261, "(1)" - line 261, "pan.___", state 1269, "(1)" - line 272, "pan.___", state 1300, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1309, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1322, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1331, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1347, "(1)" - line 253, "pan.___", state 1355, "(1)" - line 257, "pan.___", state 1367, "(1)" - line 261, "pan.___", state 1375, "(1)" - line 272, "pan.___", state 1392, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 1394, "(1)" - line 276, "pan.___", state 1401, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1403, "(1)" - line 276, "pan.___", state 1404, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 1404, "else" - line 274, "pan.___", state 1409, "((i<1))" - line 274, "pan.___", state 1409, "((i>=1))" - line 280, "pan.___", state 1414, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1416, "(1)" - line 280, "pan.___", state 1417, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 1417, "else" - line 284, "pan.___", state 1423, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1425, "(1)" - line 284, "pan.___", state 1426, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 1426, "else" - line 282, "pan.___", state 1431, "((i<2))" - line 282, "pan.___", state 1431, "((i>=2))" - line 249, "pan.___", state 1439, "(1)" - line 253, "pan.___", state 1447, "(1)" - line 253, "pan.___", state 1448, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 1448, "else" - line 251, "pan.___", state 1453, "((i<1))" - line 251, "pan.___", state 1453, "((i>=1))" - line 257, "pan.___", state 1459, "(1)" - line 257, "pan.___", state 1460, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 1460, "else" - line 261, "pan.___", state 1467, "(1)" - line 261, "pan.___", state 1468, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 1468, "else" - line 266, "pan.___", state 1477, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 1477, "else" - line 1233, "pan.___", state 1480, "i = 0" - line 1233, "pan.___", state 1482, "reader_barrier = 1" - line 1233, "pan.___", state 1493, "((i<1))" - line 1233, "pan.___", state 1493, "((i>=1))" - line 272, "pan.___", state 1498, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 1500, "(1)" - line 276, "pan.___", state 1507, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1509, "(1)" - line 276, "pan.___", state 1510, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 1510, "else" - line 274, "pan.___", state 1515, "((i<1))" - line 274, "pan.___", state 1515, "((i>=1))" - line 280, "pan.___", state 1520, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1522, "(1)" - line 280, "pan.___", state 1523, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 1523, "else" - line 284, "pan.___", state 1529, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1531, "(1)" - line 284, "pan.___", state 1532, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 1532, "else" - line 282, "pan.___", state 1537, "((i<2))" - line 282, "pan.___", state 1537, "((i>=2))" - line 249, "pan.___", state 1545, "(1)" - line 253, "pan.___", state 1553, "(1)" - line 253, "pan.___", state 1554, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 1554, "else" - line 251, "pan.___", state 1559, "((i<1))" - line 251, "pan.___", state 1559, "((i>=1))" - line 257, "pan.___", state 1565, "(1)" - line 257, "pan.___", state 1566, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 1566, "else" - line 261, "pan.___", state 1573, "(1)" - line 261, "pan.___", state 1574, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 1574, "else" - line 266, "pan.___", state 1583, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 1583, "else" - line 299, "pan.___", state 1585, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 1585, "else" - line 1233, "pan.___", state 1586, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 1233, "pan.___", state 1586, "else" - line 1237, "pan.___", state 1589, "-end-" - (179 of 1589 states) -unreached in proctype :init: - line 1248, "pan.___", state 9, "((j<2))" - line 1248, "pan.___", state 9, "((j>=2))" - line 1249, "pan.___", state 20, "((j<2))" - line 1249, "pan.___", state 20, "((j>=2))" - line 1254, "pan.___", state 33, "((j<2))" - line 1254, "pan.___", state 33, "((j>=2))" - line 1252, "pan.___", state 43, "((i<1))" - line 1252, "pan.___", state 43, "((i>=1))" - line 1262, "pan.___", state 54, "((j<2))" - line 1262, "pan.___", state 54, "((j>=2))" - line 1266, "pan.___", state 67, "((j<2))" - line 1266, "pan.___", state 67, "((j>=2))" - (6 of 78 states) -unreached in proctype :never: - line 1300, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 241 seconds -pan: rate 33888.985 states/second -pan: avg transition delay 2.673e-06 usec -cp .input.spin urcu_free_no_mb.spin.input -cp .input.spin.trail urcu_free_no_mb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi' diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_mb.spin.input b/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_mb.spin.input deleted file mode 100644 index ddb4112..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_mb.spin.input +++ /dev/null @@ -1,1273 +0,0 @@ -#define NO_MB - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_mb.spin.input.trail b/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_mb.spin.input.trail deleted file mode 100644 index e886f80..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_mb.spin.input.trail +++ /dev/null @@ -1,1362 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:4182 -2:3:4102 -3:3:4105 -4:3:4105 -5:3:4108 -6:3:4116 -7:3:4116 -8:3:4119 -9:3:4125 -10:3:4129 -11:3:4129 -12:3:4132 -13:3:4142 -14:3:4150 -15:3:4150 -16:3:4153 -17:3:4159 -18:3:4163 -19:3:4163 -20:3:4166 -21:3:4172 -22:3:4176 -23:3:4177 -24:0:4182 -25:3:4179 -26:0:4182 -27:2:2515 -28:0:4182 -29:2:2521 -30:0:4182 -31:2:2522 -32:0:4182 -33:2:2524 -34:0:4182 -35:2:2525 -36:0:4182 -37:2:2526 -38:0:4182 -39:2:2527 -40:0:4182 -41:2:2528 -42:2:2529 -43:2:2533 -44:2:2534 -45:2:2542 -46:2:2543 -47:2:2547 -48:2:2548 -49:2:2556 -50:2:2561 -51:2:2565 -52:2:2566 -53:2:2574 -54:2:2575 -55:2:2579 -56:2:2580 -57:2:2574 -58:2:2575 -59:2:2579 -60:2:2580 -61:2:2588 -62:2:2593 -63:2:2600 -64:2:2601 -65:2:2608 -66:2:2613 -67:2:2620 -68:2:2621 -69:2:2620 -70:2:2621 -71:2:2628 -72:2:2638 -73:0:4182 -74:2:2527 -75:0:4182 -76:2:2642 -77:2:2646 -78:2:2647 -79:2:2651 -80:2:2655 -81:2:2656 -82:2:2660 -83:2:2668 -84:2:2669 -85:2:2673 -86:2:2677 -87:2:2678 -88:2:2673 -89:2:2674 -90:2:2682 -91:0:4182 -92:2:2527 -93:0:4182 -94:2:2690 -95:2:2691 -96:2:2692 -97:0:4182 -98:2:2527 -99:0:4182 -100:2:2700 -101:0:4182 -102:2:2527 -103:0:4182 -104:2:2703 -105:2:2704 -106:2:2708 -107:2:2709 -108:2:2717 -109:2:2718 -110:2:2722 -111:2:2723 -112:2:2731 -113:2:2736 -114:2:2737 -115:2:2749 -116:2:2750 -117:2:2754 -118:2:2755 -119:2:2749 -120:2:2750 -121:2:2754 -122:2:2755 -123:2:2763 -124:2:2768 -125:2:2775 -126:2:2776 -127:2:2783 -128:2:2788 -129:2:2795 -130:2:2796 -131:2:2795 -132:2:2796 -133:2:2803 -134:2:2812 -135:0:4182 -136:2:2527 -137:0:4182 -138:2:2816 -139:2:2817 -140:2:2818 -141:2:2830 -142:2:2831 -143:2:2835 -144:2:2836 -145:2:2844 -146:2:2849 -147:2:2853 -148:2:2854 -149:2:2862 -150:2:2863 -151:2:2867 -152:2:2868 -153:2:2862 -154:2:2863 -155:2:2867 -156:2:2868 -157:2:2876 -158:2:2881 -159:2:2888 -160:2:2889 -161:2:2896 -162:2:2901 -163:2:2908 -164:2:2909 -165:2:2908 -166:2:2909 -167:2:2916 -168:2:2929 -169:2:2930 -170:0:4182 -171:2:2527 -172:0:4182 -173:2:2937 -174:2:2938 -175:2:2942 -176:2:2943 -177:2:2951 -178:2:2952 -179:2:2956 -180:2:2957 -181:2:2965 -182:2:2970 -183:2:2974 -184:2:2975 -185:2:2983 -186:2:2984 -187:2:2988 -188:2:2989 -189:2:2983 -190:2:2984 -191:2:2988 -192:2:2989 -193:2:2997 -194:2:3002 -195:2:3009 -196:2:3010 -197:2:3017 -198:2:3022 -199:2:3029 -200:2:3030 -201:2:3029 -202:2:3030 -203:2:3037 -204:0:4182 -205:2:2527 -206:0:4182 -207:2:3048 -208:2:3049 -209:2:3053 -210:2:3054 -211:2:3062 -212:2:3063 -213:2:3067 -214:2:3068 -215:2:3076 -216:2:3081 -217:2:3085 -218:2:3086 -219:2:3094 -220:2:3095 -221:2:3099 -222:2:3100 -223:2:3094 -224:2:3095 -225:2:3099 -226:2:3100 -227:2:3108 -228:2:3113 -229:2:3120 -230:2:3121 -231:2:3128 -232:2:3133 -233:2:3140 -234:2:3141 -235:2:3140 -236:2:3141 -237:2:3148 -238:2:3157 -239:0:4182 -240:2:2527 -241:0:4182 -242:2:3161 -243:2:3162 -244:2:3163 -245:2:3175 -246:2:3176 -247:2:3180 -248:2:3181 -249:2:3189 -250:2:3194 -251:2:3198 -252:2:3199 -253:2:3207 -254:2:3208 -255:2:3212 -256:2:3213 -257:2:3207 -258:2:3208 -259:2:3212 -260:2:3213 -261:2:3221 -262:2:3226 -263:2:3233 -264:2:3234 -265:2:3241 -266:2:3246 -267:2:3253 -268:2:3254 -269:2:3253 -270:2:3254 -271:2:3261 -272:2:3273 -273:2:3274 -274:0:4182 -275:2:2527 -276:0:4182 -277:2:3283 -278:2:3284 -279:0:4182 -280:2:2527 -281:0:4182 -282:2:3288 -283:0:4182 -284:2:3296 -285:0:4182 -286:2:2522 -287:0:4182 -288:2:2524 -289:0:4182 -290:2:2525 -291:0:4182 -292:2:2526 -293:0:4182 -294:2:2527 -295:0:4182 -296:2:2528 -297:2:2529 -298:2:2533 -299:2:2534 -300:2:2542 -301:2:2543 -302:2:2547 -303:2:2548 -304:2:2556 -305:2:2561 -306:2:2565 -307:2:2566 -308:2:2574 -309:2:2575 -310:2:2576 -311:2:2574 -312:2:2575 -313:2:2579 -314:2:2580 -315:2:2588 -316:2:2593 -317:2:2600 -318:2:2601 -319:2:2608 -320:2:2613 -321:2:2620 -322:2:2621 -323:2:2620 -324:2:2621 -325:2:2628 -326:2:2638 -327:0:4182 -328:2:2527 -329:0:4182 -330:2:2642 -331:2:2646 -332:2:2647 -333:2:2651 -334:2:2655 -335:2:2656 -336:2:2660 -337:2:2668 -338:2:2669 -339:2:2673 -340:2:2674 -341:2:2673 -342:2:2677 -343:2:2678 -344:2:2682 -345:0:4182 -346:2:2527 -347:0:4182 -348:2:2690 -349:2:2691 -350:2:2692 -351:0:4182 -352:2:2527 -353:0:4182 -354:2:2700 -355:0:4182 -356:2:2527 -357:0:4182 -358:2:2703 -359:2:2704 -360:2:2708 -361:2:2709 -362:2:2717 -363:2:2718 -364:2:2722 -365:2:2723 -366:2:2731 -367:2:2736 -368:2:2737 -369:2:2749 -370:2:2750 -371:2:2754 -372:2:2755 -373:2:2749 -374:2:2750 -375:2:2754 -376:2:2755 -377:2:2763 -378:2:2768 -379:2:2775 -380:2:2776 -381:2:2783 -382:2:2788 -383:2:2795 -384:2:2796 -385:2:2795 -386:2:2796 -387:2:2803 -388:2:2812 -389:0:4182 -390:2:2527 -391:0:4182 -392:2:2816 -393:2:2817 -394:2:2818 -395:2:2830 -396:2:2831 -397:2:2835 -398:2:2836 -399:2:2844 -400:2:2849 -401:2:2853 -402:2:2854 -403:2:2862 -404:2:2863 -405:2:2867 -406:2:2868 -407:2:2862 -408:2:2863 -409:2:2867 -410:2:2868 -411:2:2876 -412:2:2881 -413:2:2888 -414:2:2889 -415:2:2896 -416:2:2901 -417:2:2908 -418:2:2909 -419:2:2908 -420:2:2909 -421:2:2916 -422:2:2929 -423:2:2930 -424:0:4182 -425:2:2527 -426:0:4182 -427:2:2937 -428:2:2938 -429:2:2942 -430:2:2943 -431:2:2951 -432:2:2952 -433:2:2956 -434:2:2957 -435:2:2965 -436:2:2970 -437:2:2974 -438:2:2975 -439:2:2983 -440:2:2984 -441:2:2988 -442:2:2989 -443:2:2983 -444:2:2984 -445:2:2988 -446:2:2989 -447:2:2997 -448:2:3002 -449:2:3009 -450:2:3010 -451:2:3017 -452:2:3022 -453:2:3029 -454:2:3030 -455:2:3029 -456:2:3030 -457:2:3037 -458:0:4182 -459:2:2527 -460:0:4182 -461:2:3048 -462:2:3049 -463:2:3053 -464:2:3054 -465:2:3062 -466:2:3063 -467:2:3067 -468:2:3068 -469:2:3076 -470:2:3081 -471:2:3085 -472:2:3086 -473:2:3094 -474:2:3095 -475:2:3099 -476:2:3100 -477:2:3094 -478:2:3095 -479:2:3099 -480:2:3100 -481:2:3108 -482:2:3113 -483:2:3120 -484:2:3121 -485:2:3128 -486:2:3133 -487:2:3140 -488:2:3141 -489:2:3140 -490:2:3141 -491:2:3148 -492:2:3157 -493:0:4182 -494:2:2527 -495:0:4182 -496:2:3161 -497:2:3162 -498:2:3163 -499:2:3175 -500:2:3176 -501:2:3180 -502:2:3181 -503:2:3189 -504:2:3194 -505:2:3198 -506:2:3199 -507:2:3207 -508:2:3208 -509:2:3212 -510:2:3213 -511:2:3207 -512:2:3208 -513:2:3212 -514:2:3213 -515:2:3221 -516:2:3226 -517:2:3233 -518:2:3234 -519:2:3241 -520:2:3246 -521:2:3253 -522:2:3254 -523:2:3253 -524:2:3254 -525:2:3261 -526:2:3273 -527:2:3274 -528:0:4182 -529:2:2527 -530:0:4182 -531:2:3283 -532:2:3284 -533:0:4182 -534:2:2527 -535:0:4182 -536:2:3288 -537:0:4182 -538:2:3296 -539:0:4182 -540:2:2522 -541:0:4182 -542:2:2524 -543:0:4182 -544:2:2525 -545:0:4182 -546:2:2526 -547:0:4182 -548:2:2527 -549:0:4182 -550:2:2528 -551:2:2529 -552:2:2533 -553:2:2534 -554:2:2542 -555:2:2543 -556:2:2547 -557:2:2548 -558:2:2556 -559:2:2561 -560:2:2565 -561:2:2566 -562:2:2574 -563:2:2575 -564:2:2579 -565:2:2580 -566:2:2574 -567:2:2575 -568:2:2576 -569:2:2588 -570:2:2593 -571:2:2600 -572:2:2601 -573:2:2608 -574:2:2613 -575:2:2620 -576:2:2621 -577:2:2620 -578:2:2621 -579:2:2628 -580:2:2638 -581:0:4182 -582:2:2527 -583:0:4182 -584:2:2642 -585:2:2646 -586:2:2647 -587:2:2651 -588:2:2655 -589:2:2656 -590:2:2660 -591:2:2668 -592:2:2669 -593:2:2673 -594:2:2677 -595:2:2678 -596:2:2673 -597:2:2674 -598:2:2682 -599:0:4182 -600:2:2527 -601:0:4182 -602:2:2690 -603:2:2691 -604:2:2692 -605:0:4182 -606:2:2527 -607:0:4182 -608:2:2700 -609:0:4182 -610:2:2527 -611:0:4182 -612:2:2703 -613:2:2704 -614:2:2708 -615:2:2709 -616:2:2717 -617:2:2718 -618:2:2722 -619:2:2723 -620:2:2731 -621:2:2744 -622:2:2745 -623:2:2749 -624:2:2750 -625:2:2754 -626:2:2755 -627:2:2749 -628:2:2750 -629:2:2754 -630:2:2755 -631:2:2763 -632:2:2768 -633:2:2775 -634:2:2776 -635:2:2783 -636:2:2790 -637:2:2791 -638:2:2795 -639:2:2796 -640:2:2795 -641:2:2796 -642:2:2803 -643:2:2812 -644:0:4182 -645:2:2527 -646:0:4182 -647:2:2816 -648:2:2817 -649:2:2818 -650:2:2830 -651:2:2831 -652:2:2835 -653:2:2836 -654:2:2844 -655:2:2857 -656:2:2858 -657:2:2862 -658:2:2863 -659:2:2867 -660:2:2868 -661:2:2862 -662:2:2863 -663:2:2867 -664:2:2868 -665:2:2876 -666:2:2881 -667:2:2888 -668:2:2889 -669:2:2896 -670:2:2903 -671:2:2904 -672:2:2908 -673:2:2909 -674:2:2908 -675:2:2909 -676:2:2916 -677:2:2929 -678:2:2930 -679:0:4182 -680:2:2527 -681:0:4182 -682:2:2937 -683:2:2938 -684:2:2942 -685:2:2943 -686:2:2951 -687:2:2952 -688:2:2956 -689:2:2957 -690:2:2965 -691:2:2978 -692:2:2979 -693:2:2983 -694:2:2984 -695:2:2988 -696:2:2989 -697:2:2983 -698:2:2984 -699:2:2988 -700:2:2989 -701:2:2997 -702:2:3002 -703:2:3009 -704:2:3010 -705:2:3017 -706:2:3024 -707:2:3025 -708:2:3029 -709:2:3030 -710:2:3029 -711:2:3030 -712:2:3037 -713:0:4182 -714:2:2527 -715:0:4182 -716:2:3161 -717:2:3162 -718:2:3166 -719:2:3167 -720:2:3175 -721:2:3176 -722:2:3180 -723:2:3181 -724:2:3189 -725:2:3202 -726:2:3203 -727:2:3207 -728:2:3208 -729:2:3212 -730:2:3213 -731:2:3207 -732:2:3208 -733:2:3212 -734:2:3213 -735:2:3221 -736:2:3226 -737:2:3233 -738:2:3234 -739:2:3241 -740:2:3248 -741:2:3249 -742:2:3253 -743:2:3254 -744:2:3253 -745:2:3254 -746:2:3261 -747:2:3273 -748:2:3274 -749:0:4182 -750:2:2527 -751:0:4182 -752:2:3283 -753:2:3284 -754:0:4182 -755:2:2527 -756:0:4182 -757:2:3048 -758:2:3049 -759:2:3053 -760:2:3054 -761:2:3062 -762:2:3063 -763:2:3067 -764:2:3068 -765:2:3076 -766:2:3089 -767:2:3090 -768:2:3094 -769:2:3095 -770:2:3096 -771:2:3094 -772:2:3095 -773:2:3099 -774:2:3100 -775:2:3108 -776:2:3113 -777:2:3120 -778:2:3121 -779:2:3128 -780:2:3135 -781:2:3136 -782:2:3140 -783:2:3141 -784:2:3140 -785:2:3141 -786:2:3148 -787:2:3157 -788:0:4182 -789:2:2527 -790:0:4182 -791:2:3288 -792:0:4182 -793:2:3296 -794:0:4182 -795:2:3297 -796:0:4182 -797:2:3302 -798:0:4182 -799:1:2 -800:0:4182 -801:2:3303 -802:0:4182 -803:1:8 -804:0:4182 -805:2:3302 -806:0:4182 -807:1:9 -808:0:4182 -809:2:3303 -810:0:4182 -811:1:10 -812:0:4182 -813:2:3302 -814:0:4182 -815:1:11 -816:0:4182 -817:2:3303 -818:0:4182 -819:1:12 -820:0:4182 -821:2:3302 -822:0:4182 -823:1:13 -824:0:4182 -825:2:3303 -826:0:4182 -827:1:14 -828:0:4182 -829:2:3302 -830:0:4182 -831:1:15 -832:0:4182 -833:2:3303 -834:0:4182 -835:1:16 -836:0:4182 -837:2:3302 -838:0:4182 -839:1:17 -840:0:4182 -841:2:3303 -842:0:4182 -843:1:18 -844:0:4182 -845:2:3302 -846:0:4182 -847:1:19 -848:0:4182 -849:2:3303 -850:0:4182 -851:1:20 -852:0:4182 -853:2:3302 -854:0:4182 -855:1:21 -856:0:4182 -857:2:3303 -858:0:4182 -859:1:122 -860:0:4182 -861:2:3302 -862:0:4182 -863:1:124 -864:0:4182 -865:2:3303 -866:0:4182 -867:1:23 -868:0:4182 -869:2:3302 -870:0:4182 -871:1:130 -872:1:131 -873:1:135 -874:1:136 -875:1:144 -876:1:145 -877:1:149 -878:1:150 -879:1:158 -880:1:163 -881:1:167 -882:1:168 -883:1:176 -884:1:177 -885:1:181 -886:1:182 -887:1:176 -888:1:177 -889:1:181 -890:1:182 -891:1:190 -892:1:195 -893:1:202 -894:1:203 -895:1:210 -896:1:215 -897:1:222 -898:1:223 -899:1:222 -900:1:223 -901:1:230 -902:0:4182 -903:2:3303 -904:0:4182 -905:1:19 -906:0:4182 -907:2:3302 -908:0:4182 -909:1:20 -910:0:4182 -911:2:3303 -912:0:4182 -913:1:21 -914:0:4182 -915:2:3302 -916:0:4182 -917:1:122 -918:0:4182 -919:2:3303 -920:0:4182 -921:1:124 -922:0:4182 -923:2:3302 -924:0:4182 -925:1:23 -926:0:4182 -927:2:3303 -928:0:4182 -929:1:241 -930:1:242 -931:0:4182 -932:2:3302 -933:0:4182 -934:1:19 -935:0:4182 -936:2:3303 -937:0:4182 -938:1:20 -939:0:4182 -940:2:3302 -941:0:4182 -942:1:21 -943:0:4182 -944:2:3303 -945:0:4182 -946:1:122 -947:0:4182 -948:2:3302 -949:0:4182 -950:1:124 -951:0:4182 -952:2:3303 -953:0:4182 -954:1:23 -955:0:4182 -956:2:3302 -957:0:4182 -958:1:248 -959:1:249 -960:1:253 -961:1:254 -962:1:262 -963:1:263 -964:1:267 -965:1:268 -966:1:276 -967:1:281 -968:1:285 -969:1:286 -970:1:294 -971:1:295 -972:1:299 -973:1:300 -974:1:294 -975:1:295 -976:1:299 -977:1:300 -978:1:308 -979:1:313 -980:1:320 -981:1:321 -982:1:328 -983:1:333 -984:1:340 -985:1:341 -986:1:340 -987:1:341 -988:1:348 -989:0:4182 -990:2:3303 -991:0:4182 -992:1:19 -993:0:4182 -994:2:3302 -995:0:4182 -996:1:20 -997:0:4182 -998:2:3303 -999:0:4182 -1000:1:21 -1001:0:4182 -1002:2:3302 -1003:0:4182 -1004:1:122 -1005:0:4182 -1006:2:3303 -1007:0:4182 -1008:1:124 -1009:0:4182 -1010:2:3302 -1011:0:4182 -1012:1:23 -1013:0:4182 -1014:2:3303 -1015:0:4182 -1016:1:359 -1017:1:360 -1018:1:364 -1019:1:365 -1020:1:373 -1021:1:374 -1022:1:378 -1023:1:379 -1024:1:387 -1025:1:392 -1026:1:396 -1027:1:397 -1028:1:405 -1029:1:406 -1030:1:410 -1031:1:411 -1032:1:405 -1033:1:406 -1034:1:410 -1035:1:411 -1036:1:419 -1037:1:424 -1038:1:431 -1039:1:432 -1040:1:439 -1041:1:444 -1042:1:451 -1043:1:452 -1044:1:451 -1045:1:452 -1046:1:459 -1047:1:468 -1048:0:4182 -1049:2:3302 -1050:0:4182 -1051:1:19 -1052:0:4182 -1053:2:3303 -1054:0:4182 -1055:1:20 -1056:0:4182 -1057:2:3302 -1058:0:4182 -1059:1:21 -1060:0:4182 -1061:2:3303 -1062:0:4182 -1063:1:122 -1064:0:4182 -1065:2:3302 -1066:0:4182 -1067:1:124 -1068:0:4182 -1069:2:3303 -1070:0:4182 -1071:1:23 -1072:0:4182 -1073:2:3302 -1074:0:4182 -1075:1:588 -1076:1:589 -1077:1:593 -1078:1:594 -1079:1:602 -1080:1:603 -1081:1:604 -1082:1:616 -1083:1:621 -1084:1:625 -1085:1:626 -1086:1:634 -1087:1:635 -1088:1:639 -1089:1:640 -1090:1:634 -1091:1:635 -1092:1:639 -1093:1:640 -1094:1:648 -1095:1:653 -1096:1:660 -1097:1:661 -1098:1:668 -1099:1:673 -1100:1:680 -1101:1:681 -1102:1:680 -1103:1:681 -1104:1:688 -1105:0:4182 -1106:2:3303 -1107:0:4182 -1108:1:19 -1109:0:4182 -1110:2:3302 -1111:0:4182 -1112:1:20 -1113:0:4182 -1114:2:3303 -1115:0:4182 -1116:1:21 -1117:0:4182 -1118:2:3302 -1119:0:4182 -1120:1:122 -1121:0:4182 -1122:2:3303 -1123:0:4182 -1124:1:124 -1125:0:4182 -1126:2:3302 -1127:0:4182 -1128:1:23 -1129:0:4182 -1130:2:3303 -1131:0:4182 -1132:1:699 -1133:1:702 -1134:1:703 -1135:0:4182 -1136:2:3302 -1137:0:4182 -1138:1:19 -1139:0:4182 -1140:2:3303 -1141:0:4182 -1142:1:20 -1143:0:4182 -1144:2:3302 -1145:0:4182 -1146:1:21 -1147:0:4182 -1148:2:3303 -1149:0:4182 -1150:1:122 -1151:0:4182 -1152:2:3302 -1153:0:4182 -1154:1:124 -1155:0:4182 -1156:2:3303 -1157:0:4182 -1158:1:23 -1159:0:4182 -1160:2:3302 -1161:0:4182 -1162:1:706 -1163:1:707 -1164:1:711 -1165:1:712 -1166:1:720 -1167:1:721 -1168:1:725 -1169:1:726 -1170:1:734 -1171:1:739 -1172:1:743 -1173:1:744 -1174:1:752 -1175:1:753 -1176:1:757 -1177:1:758 -1178:1:752 -1179:1:753 -1180:1:757 -1181:1:758 -1182:1:766 -1183:1:771 -1184:1:778 -1185:1:779 -1186:1:786 -1187:1:791 -1188:1:798 -1189:1:799 -1190:1:798 -1191:1:799 -1192:1:806 -1193:0:4182 -1194:2:3303 -1195:0:4182 -1196:1:19 -1197:0:4182 -1198:2:3302 -1199:0:4182 -1200:1:20 -1201:0:4182 -1202:2:3303 -1203:0:4182 -1204:1:21 -1205:0:4182 -1206:2:3302 -1207:0:4182 -1208:1:122 -1209:0:4182 -1210:2:3303 -1211:0:4182 -1212:1:124 -1213:0:4182 -1214:2:3302 -1215:0:4182 -1216:1:23 -1217:0:4182 -1218:2:3303 -1219:0:4182 -1220:1:930 -1221:1:931 -1222:1:935 -1223:1:936 -1224:1:944 -1225:1:945 -1226:1:949 -1227:1:950 -1228:1:958 -1229:1:963 -1230:1:967 -1231:1:968 -1232:1:976 -1233:1:977 -1234:1:981 -1235:1:982 -1236:1:976 -1237:1:977 -1238:1:981 -1239:1:982 -1240:1:990 -1241:1:995 -1242:1:1002 -1243:1:1003 -1244:1:1010 -1245:1:1015 -1246:1:1022 -1247:1:1023 -1248:1:1022 -1249:1:1023 -1250:1:1030 -1251:1:1039 -1252:1:1043 -1253:0:4182 -1254:2:3302 -1255:0:4182 -1256:1:19 -1257:0:4182 -1258:2:3303 -1259:0:4182 -1260:1:20 -1261:0:4182 -1262:2:3302 -1263:0:4182 -1264:1:21 -1265:0:4182 -1266:2:3303 -1267:0:4182 -1268:1:122 -1269:0:4182 -1270:2:3302 -1271:0:4182 -1272:1:124 -1273:0:4182 -1274:2:3303 -1275:0:4182 -1276:1:23 -1277:0:4182 -1278:2:3302 -1279:0:4182 -1280:1:1044 -1281:1:1045 -1282:1:1049 -1283:1:1050 -1284:1:1058 -1285:1:1059 -1286:1:1060 -1287:1:1072 -1288:1:1077 -1289:1:1081 -1290:1:1082 -1291:1:1090 -1292:1:1091 -1293:1:1095 -1294:1:1096 -1295:1:1090 -1296:1:1091 -1297:1:1095 -1298:1:1096 -1299:1:1104 -1300:1:1109 -1301:1:1116 -1302:1:1117 -1303:1:1124 -1304:1:1129 -1305:1:1136 -1306:1:1137 -1307:1:1136 -1308:1:1137 -1309:1:1144 -1310:0:4182 -1311:2:3303 -1312:0:4182 -1313:1:19 -1314:0:4182 -1315:2:3302 -1316:0:4182 -1317:1:20 -1318:0:4182 -1319:2:3303 -1320:0:4182 -1321:1:21 -1322:0:4182 -1323:2:3302 -1324:0:4182 -1325:1:122 -1326:0:4182 -1327:2:3303 -1328:0:4182 -1329:1:124 -1330:0:4182 -1331:2:3302 -1332:0:4182 -1333:1:23 -1334:0:4182 -1335:2:3303 -1336:0:4182 -1337:1:1155 -1338:0:4182 -1339:2:3302 -1340:0:4182 -1341:1:2421 -1342:1:2428 -1343:1:2429 -1344:1:2436 -1345:1:2441 -1346:1:2448 -1347:1:2449 -1348:1:2448 -1349:1:2449 -1350:1:2456 -1351:1:2460 -1352:0:4182 -1353:2:3303 -1354:0:4182 -1355:1:1157 -1356:1:1158 -1357:0:4180 -1358:2:3302 -1359:0:4186 -1360:1:2169 diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_rmb.define b/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_rmb.log b/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_rmb.log deleted file mode 100644 index 42698f6..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_rmb.log +++ /dev/null @@ -1,510 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_rmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1295) -Depth= 9420 States= 1e+06 Transitions= 7.12e+06 Memory= 550.432 t= 17.7 R= 6e+04 -Depth= 9420 States= 2e+06 Transitions= 1.53e+07 Memory= 634.318 t= 38.9 R= 5e+04 -Depth= 9420 States= 3e+06 Transitions= 2.54e+07 Memory= 718.303 t= 66.3 R= 5e+04 -pan: resizing hashtable to -w22.. done -Depth= 9420 States= 4e+06 Transitions= 3.3e+07 Memory= 833.311 t= 86.1 R= 5e+04 -Depth= 9420 States= 5e+06 Transitions= 4.08e+07 Memory= 917.295 t= 106 R= 5e+04 -Depth= 9420 States= 6e+06 Transitions= 5.88e+07 Memory= 1001.279 t= 157 R= 4e+04 -Depth= 9420 States= 7e+06 Transitions= 7.01e+07 Memory= 1085.264 t= 187 R= 4e+04 -Depth= 9420 States= 8e+06 Transitions= 8.44e+07 Memory= 1169.151 t= 227 R= 4e+04 -Depth= 9420 States= 9e+06 Transitions= 9.77e+07 Memory= 1253.135 t= 264 R= 3e+04 -pan: resizing hashtable to -w24.. done -Depth= 9420 States= 1e+07 Transitions= 1.11e+08 Memory= 1461.115 t= 302 R= 3e+04 -Depth= 9420 States= 1.1e+07 Transitions= 1.24e+08 Memory= 1545.100 t= 336 R= 3e+04 -Depth= 9420 States= 1.2e+07 Transitions= 1.33e+08 Memory= 1629.084 t= 362 R= 3e+04 -Depth= 9420 States= 1.3e+07 Transitions= 1.46e+08 Memory= 1713.068 t= 397 R= 3e+04 -Depth= 9420 States= 1.4e+07 Transitions= 1.76e+08 Memory= 1797.053 t= 485 R= 3e+04 -Depth= 9420 States= 1.5e+07 Transitions= 1.95e+08 Memory= 1881.037 t= 540 R= 3e+04 -Depth= 9420 States= 1.6e+07 Transitions= 2.12e+08 Memory= 1964.924 t= 587 R= 3e+04 -Depth= 9420 States= 1.7e+07 Transitions= 2.25e+08 Memory= 2048.908 t= 622 R= 3e+04 -Depth= 9420 States= 1.8e+07 Transitions= 2.44e+08 Memory= 2132.893 t= 676 R= 3e+04 -Depth= 9420 States= 1.9e+07 Transitions= 2.6e+08 Memory= 2216.877 t= 721 R= 3e+04 -Depth= 9420 States= 2e+07 Transitions= 2.78e+08 Memory= 2300.861 t= 771 R= 3e+04 -Depth= 9522 States= 2.1e+07 Transitions= 2.91e+08 Memory= 2384.846 t= 808 R= 3e+04 -Depth= 9542 States= 2.2e+07 Transitions= 3.05e+08 Memory= 2468.830 t= 847 R= 3e+04 -Depth= 9542 States= 2.3e+07 Transitions= 3.16e+08 Memory= 2552.717 t= 878 R= 3e+04 -Depth= 9542 States= 2.4e+07 Transitions= 3.28e+08 Memory= 2636.701 t= 910 R= 3e+04 -Depth= 9542 States= 2.5e+07 Transitions= 3.41e+08 Memory= 2720.686 t= 947 R= 3e+04 -Depth= 9542 States= 2.6e+07 Transitions= 3.53e+08 Memory= 2804.670 t= 979 R= 3e+04 -Depth= 9542 States= 2.7e+07 Transitions= 3.66e+08 Memory= 2888.654 t= 1.02e+03 R= 3e+04 -Depth= 9542 States= 2.8e+07 Transitions= 3.79e+08 Memory= 2972.639 t= 1.05e+03 R= 3e+04 -Depth= 9542 States= 2.9e+07 Transitions= 3.92e+08 Memory= 3056.526 t= 1.09e+03 R= 3e+04 -Depth= 9542 States= 3e+07 Transitions= 4.04e+08 Memory= 3140.510 t= 1.12e+03 R= 3e+04 -Depth= 9542 States= 3.1e+07 Transitions= 4.17e+08 Memory= 3224.494 t= 1.16e+03 R= 3e+04 -Depth= 9542 States= 3.2e+07 Transitions= 4.28e+08 Memory= 3308.479 t= 1.19e+03 R= 3e+04 -Depth= 9542 States= 3.3e+07 Transitions= 4.39e+08 Memory= 3392.463 t= 1.22e+03 R= 3e+04 -Depth= 9542 States= 3.4e+07 Transitions= 4.53e+08 Memory= 3476.447 t= 1.26e+03 R= 3e+04 -pan: resizing hashtable to -w26.. done -Depth= 9542 States= 3.5e+07 Transitions= 4.7e+08 Memory= 4056.416 t= 1.32e+03 R= 3e+04 -Depth= 9542 States= 3.6e+07 Transitions= 4.83e+08 Memory= 4140.401 t= 1.35e+03 R= 3e+04 -Depth= 9542 States= 3.7e+07 Transitions= 4.99e+08 Memory= 4224.385 t= 1.4e+03 R= 3e+04 -Depth= 9542 States= 3.8e+07 Transitions= 5.14e+08 Memory= 4308.369 t= 1.44e+03 R= 3e+04 -Depth= 9542 States= 3.9e+07 Transitions= 5.29e+08 Memory= 4392.354 t= 1.48e+03 R= 3e+04 -Depth= 9542 States= 4e+07 Transitions= 5.39e+08 Memory= 4476.338 t= 1.51e+03 R= 3e+04 -Depth= 9542 States= 4.1e+07 Transitions= 5.49e+08 Memory= 4560.225 t= 1.53e+03 R= 3e+04 -Depth= 9542 States= 4.2e+07 Transitions= 5.61e+08 Memory= 4644.209 t= 1.56e+03 R= 3e+04 -Depth= 9542 States= 4.3e+07 Transitions= 5.88e+08 Memory= 4728.193 t= 1.64e+03 R= 3e+04 -Depth= 9542 States= 4.4e+07 Transitions= 6.14e+08 Memory= 4812.178 t= 1.72e+03 R= 3e+04 -Depth= 9542 States= 4.5e+07 Transitions= 6.31e+08 Memory= 4896.162 t= 1.76e+03 R= 3e+04 -Depth= 9542 States= 4.6e+07 Transitions= 6.41e+08 Memory= 4980.147 t= 1.79e+03 R= 3e+04 -Depth= 9542 States= 4.7e+07 Transitions= 6.57e+08 Memory= 5064.131 t= 1.84e+03 R= 3e+04 -Depth= 9542 States= 4.8e+07 Transitions= 6.76e+08 Memory= 5148.018 t= 1.89e+03 R= 3e+04 -Depth= 9542 States= 4.9e+07 Transitions= 6.93e+08 Memory= 5232.002 t= 1.94e+03 R= 3e+04 -Depth= 9542 States= 5e+07 Transitions= 7.08e+08 Memory= 5315.986 t= 1.98e+03 R= 3e+04 -Depth= 9542 States= 5.1e+07 Transitions= 7.21e+08 Memory= 5399.971 t= 2.02e+03 R= 3e+04 -Depth= 9542 States= 5.2e+07 Transitions= 7.34e+08 Memory= 5483.955 t= 2.05e+03 R= 3e+04 -Depth= 9542 States= 5.3e+07 Transitions= 7.47e+08 Memory= 5567.940 t= 2.09e+03 R= 3e+04 -Depth= 9542 States= 5.4e+07 Transitions= 7.58e+08 Memory= 5651.826 t= 2.12e+03 R= 3e+04 -Depth= 9542 States= 5.5e+07 Transitions= 7.71e+08 Memory= 5735.811 t= 2.15e+03 R= 3e+04 -Depth= 9542 States= 5.6e+07 Transitions= 7.83e+08 Memory= 5819.795 t= 2.19e+03 R= 3e+04 -Depth= 9542 States= 5.7e+07 Transitions= 7.98e+08 Memory= 5903.779 t= 2.23e+03 R= 3e+04 -Depth= 9542 States= 5.8e+07 Transitions= 8.08e+08 Memory= 5987.764 t= 2.25e+03 R= 3e+04 -Depth= 9542 States= 5.9e+07 Transitions= 8.22e+08 Memory= 6071.748 t= 2.29e+03 R= 3e+04 -Depth= 9542 States= 6e+07 Transitions= 8.33e+08 Memory= 6155.733 t= 2.32e+03 R= 3e+04 -Depth= 9542 States= 6.1e+07 Transitions= 8.44e+08 Memory= 6239.619 t= 2.35e+03 R= 3e+04 -Depth= 9542 States= 6.2e+07 Transitions= 8.56e+08 Memory= 6323.604 t= 2.39e+03 R= 3e+04 -Depth= 9542 States= 6.3e+07 Transitions= 8.74e+08 Memory= 6407.588 t= 2.44e+03 R= 3e+04 -Depth= 9542 States= 6.4e+07 Transitions= 8.86e+08 Memory= 6491.572 t= 2.47e+03 R= 3e+04 -Depth= 9542 States= 6.5e+07 Transitions= 9.01e+08 Memory= 6575.557 t= 2.51e+03 R= 3e+04 -Depth= 9542 States= 6.6e+07 Transitions= 9.17e+08 Memory= 6659.541 t= 2.55e+03 R= 3e+04 -Depth= 9542 States= 6.7e+07 Transitions= 9.31e+08 Memory= 6743.428 t= 2.59e+03 R= 3e+04 -Depth= 9542 States= 6.8e+07 Transitions= 9.46e+08 Memory= 6827.412 t= 2.64e+03 R= 3e+04 -Depth= 9542 States= 6.9e+07 Transitions= 9.6e+08 Memory= 6911.397 t= 2.67e+03 R= 3e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 9542, errors: 0 - 69795266 states, stored -9.0126381e+08 states, matched -9.7105908e+08 transitions (= stored+matched) -1.4943649e+10 atomic steps -hash conflicts: 5.4028862e+08 (resolved) - -Stats on memory usage (in Megabytes): - 7721.187 equivalent memory usage for states (stored*(State-vector + overhead)) - 6011.798 actual memory usage for states (compression: 77.86%) - state-vector as stored = 62 byte + 28 byte overhead - 512.000 memory used for hash table (-w26) - 457.764 memory used for DFS stack (-m10000000) - 3.368 memory lost to fragmentation - 6978.193 total actual memory usage - -unreached in proctype urcu_reader - line 272, "pan.___", state 30, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 52, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 61, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 77, "(1)" - line 253, "pan.___", state 85, "(1)" - line 257, "pan.___", state 97, "(1)" - line 261, "pan.___", state 105, "(1)" - line 411, "pan.___", state 131, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 163, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 177, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 195, "(1)" - line 257, "pan.___", state 215, "(1)" - line 261, "pan.___", state 223, "(1)" - line 691, "pan.___", state 242, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 411, "pan.___", state 249, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 281, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 295, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 313, "(1)" - line 257, "pan.___", state 333, "(1)" - line 261, "pan.___", state 341, "(1)" - line 411, "pan.___", state 360, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 392, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 406, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 424, "(1)" - line 257, "pan.___", state 444, "(1)" - line 261, "pan.___", state 452, "(1)" - line 411, "pan.___", state 473, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 475, "(1)" - line 411, "pan.___", state 476, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 476, "else" - line 411, "pan.___", state 479, "(1)" - line 415, "pan.___", state 487, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 489, "(1)" - line 415, "pan.___", state 490, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 490, "else" - line 415, "pan.___", state 493, "(1)" - line 415, "pan.___", state 494, "(1)" - line 415, "pan.___", state 494, "(1)" - line 413, "pan.___", state 499, "((i<1))" - line 413, "pan.___", state 499, "((i>=1))" - line 420, "pan.___", state 505, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 507, "(1)" - line 420, "pan.___", state 508, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 508, "else" - line 420, "pan.___", state 511, "(1)" - line 420, "pan.___", state 512, "(1)" - line 420, "pan.___", state 512, "(1)" - line 424, "pan.___", state 519, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 521, "(1)" - line 424, "pan.___", state 522, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 522, "else" - line 424, "pan.___", state 525, "(1)" - line 424, "pan.___", state 526, "(1)" - line 424, "pan.___", state 526, "(1)" - line 422, "pan.___", state 531, "((i<2))" - line 422, "pan.___", state 531, "((i>=2))" - line 249, "pan.___", state 537, "(1)" - line 253, "pan.___", state 545, "(1)" - line 253, "pan.___", state 546, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 546, "else" - line 251, "pan.___", state 551, "((i<1))" - line 251, "pan.___", state 551, "((i>=1))" - line 257, "pan.___", state 557, "(1)" - line 257, "pan.___", state 558, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 558, "else" - line 261, "pan.___", state 565, "(1)" - line 261, "pan.___", state 566, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 566, "else" - line 259, "pan.___", state 571, "((i<2))" - line 259, "pan.___", state 571, "((i>=2))" - line 266, "pan.___", state 575, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 575, "else" - line 431, "pan.___", state 577, "(1)" - line 431, "pan.___", state 577, "(1)" - line 691, "pan.___", state 580, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 691, "pan.___", state 581, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 691, "pan.___", state 582, "(1)" - line 411, "pan.___", state 589, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 621, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 635, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 653, "(1)" - line 257, "pan.___", state 673, "(1)" - line 261, "pan.___", state 681, "(1)" - line 411, "pan.___", state 707, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 739, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 753, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 771, "(1)" - line 257, "pan.___", state 791, "(1)" - line 261, "pan.___", state 799, "(1)" - line 411, "pan.___", state 818, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 820, "(1)" - line 411, "pan.___", state 821, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 821, "else" - line 411, "pan.___", state 824, "(1)" - line 415, "pan.___", state 832, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 834, "(1)" - line 415, "pan.___", state 835, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 835, "else" - line 415, "pan.___", state 838, "(1)" - line 415, "pan.___", state 839, "(1)" - line 415, "pan.___", state 839, "(1)" - line 413, "pan.___", state 844, "((i<1))" - line 413, "pan.___", state 844, "((i>=1))" - line 420, "pan.___", state 850, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 852, "(1)" - line 420, "pan.___", state 853, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 853, "else" - line 420, "pan.___", state 856, "(1)" - line 420, "pan.___", state 857, "(1)" - line 420, "pan.___", state 857, "(1)" - line 424, "pan.___", state 864, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 866, "(1)" - line 424, "pan.___", state 867, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 867, "else" - line 424, "pan.___", state 870, "(1)" - line 424, "pan.___", state 871, "(1)" - line 424, "pan.___", state 871, "(1)" - line 422, "pan.___", state 876, "((i<2))" - line 422, "pan.___", state 876, "((i>=2))" - line 249, "pan.___", state 882, "(1)" - line 253, "pan.___", state 890, "(1)" - line 253, "pan.___", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 891, "else" - line 251, "pan.___", state 896, "((i<1))" - line 251, "pan.___", state 896, "((i>=1))" - line 257, "pan.___", state 902, "(1)" - line 257, "pan.___", state 903, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 903, "else" - line 261, "pan.___", state 910, "(1)" - line 261, "pan.___", state 911, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 911, "else" - line 259, "pan.___", state 916, "((i<2))" - line 259, "pan.___", state 916, "((i>=2))" - line 266, "pan.___", state 920, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 920, "else" - line 431, "pan.___", state 922, "(1)" - line 431, "pan.___", state 922, "(1)" - line 699, "pan.___", state 926, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 411, "pan.___", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 963, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 977, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 995, "(1)" - line 257, "pan.___", state 1015, "(1)" - line 261, "pan.___", state 1023, "(1)" - line 411, "pan.___", state 1045, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1077, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1091, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1109, "(1)" - line 257, "pan.___", state 1129, "(1)" - line 261, "pan.___", state 1137, "(1)" - line 411, "pan.___", state 1160, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1192, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1206, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1224, "(1)" - line 257, "pan.___", state 1244, "(1)" - line 261, "pan.___", state 1252, "(1)" - line 411, "pan.___", state 1271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1303, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1317, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1335, "(1)" - line 257, "pan.___", state 1355, "(1)" - line 261, "pan.___", state 1363, "(1)" - line 411, "pan.___", state 1387, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1419, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1433, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1451, "(1)" - line 257, "pan.___", state 1471, "(1)" - line 261, "pan.___", state 1479, "(1)" - line 411, "pan.___", state 1498, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1530, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1544, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1562, "(1)" - line 257, "pan.___", state 1582, "(1)" - line 261, "pan.___", state 1590, "(1)" - line 411, "pan.___", state 1612, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1644, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1658, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1676, "(1)" - line 257, "pan.___", state 1696, "(1)" - line 261, "pan.___", state 1704, "(1)" - line 738, "pan.___", state 1723, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 411, "pan.___", state 1730, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1762, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1776, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1794, "(1)" - line 257, "pan.___", state 1814, "(1)" - line 261, "pan.___", state 1822, "(1)" - line 411, "pan.___", state 1841, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1873, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1887, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1905, "(1)" - line 257, "pan.___", state 1925, "(1)" - line 261, "pan.___", state 1933, "(1)" - line 411, "pan.___", state 1954, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 1956, "(1)" - line 411, "pan.___", state 1957, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 1957, "else" - line 411, "pan.___", state 1960, "(1)" - line 415, "pan.___", state 1968, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1970, "(1)" - line 415, "pan.___", state 1971, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 1971, "else" - line 415, "pan.___", state 1974, "(1)" - line 415, "pan.___", state 1975, "(1)" - line 415, "pan.___", state 1975, "(1)" - line 413, "pan.___", state 1980, "((i<1))" - line 413, "pan.___", state 1980, "((i>=1))" - line 420, "pan.___", state 1986, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1988, "(1)" - line 420, "pan.___", state 1989, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 1989, "else" - line 420, "pan.___", state 1992, "(1)" - line 420, "pan.___", state 1993, "(1)" - line 420, "pan.___", state 1993, "(1)" - line 424, "pan.___", state 2000, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2002, "(1)" - line 424, "pan.___", state 2003, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 2003, "else" - line 424, "pan.___", state 2006, "(1)" - line 424, "pan.___", state 2007, "(1)" - line 424, "pan.___", state 2007, "(1)" - line 422, "pan.___", state 2012, "((i<2))" - line 422, "pan.___", state 2012, "((i>=2))" - line 249, "pan.___", state 2018, "(1)" - line 253, "pan.___", state 2026, "(1)" - line 253, "pan.___", state 2027, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 2027, "else" - line 251, "pan.___", state 2032, "((i<1))" - line 251, "pan.___", state 2032, "((i>=1))" - line 257, "pan.___", state 2038, "(1)" - line 257, "pan.___", state 2039, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 2039, "else" - line 261, "pan.___", state 2046, "(1)" - line 261, "pan.___", state 2047, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 2047, "else" - line 259, "pan.___", state 2052, "((i<2))" - line 259, "pan.___", state 2052, "((i>=2))" - line 266, "pan.___", state 2056, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 2056, "else" - line 431, "pan.___", state 2058, "(1)" - line 431, "pan.___", state 2058, "(1)" - line 738, "pan.___", state 2061, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 738, "pan.___", state 2062, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 738, "pan.___", state 2063, "(1)" - line 411, "pan.___", state 2070, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2102, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2116, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2134, "(1)" - line 257, "pan.___", state 2154, "(1)" - line 261, "pan.___", state 2162, "(1)" - line 411, "pan.___", state 2187, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2219, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2233, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2251, "(1)" - line 257, "pan.___", state 2271, "(1)" - line 261, "pan.___", state 2279, "(1)" - line 411, "pan.___", state 2298, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2330, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2344, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2362, "(1)" - line 257, "pan.___", state 2382, "(1)" - line 261, "pan.___", state 2390, "(1)" - line 411, "pan.___", state 2421, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2453, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2467, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2485, "(1)" - line 257, "pan.___", state 2505, "(1)" - line 261, "pan.___", state 2513, "(1)" - line 411, "pan.___", state 2530, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2562, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2576, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2594, "(1)" - line 257, "pan.___", state 2614, "(1)" - line 261, "pan.___", state 2622, "(1)" - line 898, "pan.___", state 2641, "-end-" - (227 of 2641 states) -unreached in proctype urcu_writer - line 411, "pan.___", state 18, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 32, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 50, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 249, "pan.___", state 82, "(1)" - line 253, "pan.___", state 90, "(1)" - line 257, "pan.___", state 102, "(1)" - line 272, "pan.___", state 131, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 140, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 153, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 207, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 225, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 239, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 257, "(1)" - line 253, "pan.___", state 265, "(1)" - line 257, "pan.___", state 277, "(1)" - line 261, "pan.___", state 285, "(1)" - line 415, "pan.___", state 320, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 338, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 352, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 378, "(1)" - line 257, "pan.___", state 390, "(1)" - line 261, "pan.___", state 398, "(1)" - line 415, "pan.___", state 441, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 459, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 473, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 499, "(1)" - line 257, "pan.___", state 511, "(1)" - line 261, "pan.___", state 519, "(1)" - line 415, "pan.___", state 552, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 570, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 584, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 610, "(1)" - line 257, "pan.___", state 622, "(1)" - line 261, "pan.___", state 630, "(1)" - line 415, "pan.___", state 665, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 683, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 697, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 723, "(1)" - line 257, "pan.___", state 735, "(1)" - line 261, "pan.___", state 743, "(1)" - line 272, "pan.___", state 796, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 805, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 820, "(1)" - line 284, "pan.___", state 827, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 843, "(1)" - line 253, "pan.___", state 851, "(1)" - line 257, "pan.___", state 863, "(1)" - line 261, "pan.___", state 871, "(1)" - line 272, "pan.___", state 902, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 911, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 924, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 933, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 949, "(1)" - line 253, "pan.___", state 957, "(1)" - line 257, "pan.___", state 969, "(1)" - line 261, "pan.___", state 977, "(1)" - line 276, "pan.___", state 1003, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1016, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1025, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1041, "(1)" - line 253, "pan.___", state 1049, "(1)" - line 257, "pan.___", state 1061, "(1)" - line 261, "pan.___", state 1069, "(1)" - line 272, "pan.___", state 1100, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1109, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1122, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1131, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1147, "(1)" - line 253, "pan.___", state 1155, "(1)" - line 257, "pan.___", state 1167, "(1)" - line 261, "pan.___", state 1175, "(1)" - line 276, "pan.___", state 1201, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1214, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1223, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1239, "(1)" - line 253, "pan.___", state 1247, "(1)" - line 257, "pan.___", state 1259, "(1)" - line 261, "pan.___", state 1267, "(1)" - line 272, "pan.___", state 1298, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1307, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1320, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1329, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1345, "(1)" - line 253, "pan.___", state 1353, "(1)" - line 257, "pan.___", state 1365, "(1)" - line 261, "pan.___", state 1373, "(1)" - line 276, "pan.___", state 1399, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1412, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1421, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1437, "(1)" - line 253, "pan.___", state 1445, "(1)" - line 257, "pan.___", state 1457, "(1)" - line 261, "pan.___", state 1465, "(1)" - line 272, "pan.___", state 1496, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1505, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1518, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1527, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1543, "(1)" - line 253, "pan.___", state 1551, "(1)" - line 257, "pan.___", state 1563, "(1)" - line 261, "pan.___", state 1571, "(1)" - line 1237, "pan.___", state 1587, "-end-" - (103 of 1587 states) -unreached in proctype :init: - (0 of 78 states) -unreached in proctype :never: - line 1300, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 2.7e+03 seconds -pan: rate 25814.341 states/second -pan: avg transition delay 2.7843e-06 usec -cp .input.spin urcu_free_no_rmb.spin.input -cp .input.spin.trail urcu_free_no_rmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi' diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_rmb.spin.input b/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_rmb.spin.input deleted file mode 100644 index 80445f6..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_rmb.spin.input +++ /dev/null @@ -1,1273 +0,0 @@ -#define NO_RMB - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_wmb.define b/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_wmb.log b/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_wmb.log deleted file mode 100644 index 319fbe9..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_wmb.log +++ /dev/null @@ -1,530 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_wmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1295) -Depth= 9172 States= 1e+06 Transitions= 6.87e+06 Memory= 550.432 t= 17 R= 6e+04 -Depth= 9172 States= 2e+06 Transitions= 1.47e+07 Memory= 634.318 t= 37.6 R= 5e+04 -Depth= 9172 States= 3e+06 Transitions= 2.46e+07 Memory= 718.303 t= 64.2 R= 5e+04 -pan: resizing hashtable to -w22.. done -Depth= 9172 States= 4e+06 Transitions= 3.19e+07 Memory= 833.311 t= 83.2 R= 5e+04 -Depth= 9172 States= 5e+06 Transitions= 3.95e+07 Memory= 917.295 t= 103 R= 5e+04 -Depth= 9172 States= 6e+06 Transitions= 5.71e+07 Memory= 1001.279 t= 152 R= 4e+04 -Depth= 9172 States= 7e+06 Transitions= 6.81e+07 Memory= 1085.264 t= 182 R= 4e+04 -Depth= 9172 States= 8e+06 Transitions= 8.22e+07 Memory= 1169.151 t= 221 R= 4e+04 -Depth= 9172 States= 9e+06 Transitions= 9.54e+07 Memory= 1253.135 t= 258 R= 3e+04 -pan: resizing hashtable to -w24.. done -Depth= 9172 States= 1e+07 Transitions= 1.08e+08 Memory= 1461.115 t= 295 R= 3e+04 -Depth= 9172 States= 1.1e+07 Transitions= 1.2e+08 Memory= 1545.100 t= 327 R= 3e+04 -Depth= 9172 States= 1.2e+07 Transitions= 1.27e+08 Memory= 1629.084 t= 344 R= 3e+04 -Depth= 9172 States= 1.3e+07 Transitions= 1.35e+08 Memory= 1713.068 t= 365 R= 4e+04 -Depth= 9172 States= 1.4e+07 Transitions= 1.46e+08 Memory= 1797.053 t= 394 R= 4e+04 -Depth= 9172 States= 1.5e+07 Transitions= 1.53e+08 Memory= 1881.037 t= 413 R= 4e+04 -Depth= 9172 States= 1.6e+07 Transitions= 1.6e+08 Memory= 1964.924 t= 432 R= 4e+04 -Depth= 9172 States= 1.7e+07 Transitions= 1.76e+08 Memory= 2048.908 t= 475 R= 4e+04 -Depth= 9172 States= 1.8e+07 Transitions= 1.9e+08 Memory= 2132.893 t= 515 R= 3e+04 -Depth= 9172 States= 1.9e+07 Transitions= 2.02e+08 Memory= 2216.877 t= 548 R= 3e+04 -Depth= 9172 States= 2e+07 Transitions= 2.15e+08 Memory= 2300.861 t= 585 R= 3e+04 -Depth= 9172 States= 2.1e+07 Transitions= 2.25e+08 Memory= 2384.846 t= 610 R= 3e+04 -Depth= 9172 States= 2.2e+07 Transitions= 2.38e+08 Memory= 2468.830 t= 646 R= 3e+04 -Depth= 9172 States= 2.3e+07 Transitions= 2.67e+08 Memory= 2552.717 t= 732 R= 3e+04 -Depth= 9172 States= 2.4e+07 Transitions= 2.86e+08 Memory= 2636.701 t= 785 R= 3e+04 -Depth= 9172 States= 2.5e+07 Transitions= 3.03e+08 Memory= 2720.686 t= 832 R= 3e+04 -Depth= 9172 States= 2.6e+07 Transitions= 3.12e+08 Memory= 2804.670 t= 857 R= 3e+04 -Depth= 9172 States= 2.7e+07 Transitions= 3.27e+08 Memory= 2888.654 t= 899 R= 3e+04 -Depth= 9172 States= 2.8e+07 Transitions= 3.57e+08 Memory= 2972.639 t= 987 R= 3e+04 -Depth= 9172 States= 2.9e+07 Transitions= 3.73e+08 Memory= 3056.526 t= 1.03e+03 R= 3e+04 -Depth= 9172 States= 3e+07 Transitions= 3.86e+08 Memory= 3140.510 t= 1.07e+03 R= 3e+04 -Depth= 9172 States= 3.1e+07 Transitions= 4.03e+08 Memory= 3224.494 t= 1.12e+03 R= 3e+04 -Depth= 9172 States= 3.2e+07 Transitions= 4.22e+08 Memory= 3308.479 t= 1.17e+03 R= 3e+04 -Depth= 9172 States= 3.3e+07 Transitions= 4.39e+08 Memory= 3392.463 t= 1.22e+03 R= 3e+04 -Depth= 9172 States= 3.4e+07 Transitions= 4.56e+08 Memory= 3476.447 t= 1.27e+03 R= 3e+04 -pan: resizing hashtable to -w26.. done -Depth= 9234 States= 3.5e+07 Transitions= 4.73e+08 Memory= 4056.416 t= 1.33e+03 R= 3e+04 -Depth= 9234 States= 3.6e+07 Transitions= 4.85e+08 Memory= 4140.401 t= 1.36e+03 R= 3e+04 -Depth= 9273 States= 3.7e+07 Transitions= 5e+08 Memory= 4224.385 t= 1.4e+03 R= 3e+04 -Depth= 9273 States= 3.8e+07 Transitions= 5.14e+08 Memory= 4308.369 t= 1.44e+03 R= 3e+04 -Depth= 9273 States= 3.9e+07 Transitions= 5.26e+08 Memory= 4392.354 t= 1.47e+03 R= 3e+04 -Depth= 9273 States= 4e+07 Transitions= 5.39e+08 Memory= 4476.338 t= 1.51e+03 R= 3e+04 -Depth= 9273 States= 4.1e+07 Transitions= 5.5e+08 Memory= 4560.322 t= 1.54e+03 R= 3e+04 -Depth= 9273 States= 4.2e+07 Transitions= 5.64e+08 Memory= 4644.209 t= 1.58e+03 R= 3e+04 -Depth= 9273 States= 4.3e+07 Transitions= 5.75e+08 Memory= 4728.193 t= 1.61e+03 R= 3e+04 -Depth= 9273 States= 4.4e+07 Transitions= 5.86e+08 Memory= 4812.178 t= 1.64e+03 R= 3e+04 -Depth= 9273 States= 4.5e+07 Transitions= 6.01e+08 Memory= 4896.162 t= 1.68e+03 R= 3e+04 -Depth= 9273 States= 4.6e+07 Transitions= 6.16e+08 Memory= 4980.147 t= 1.72e+03 R= 3e+04 -Depth= 9273 States= 4.7e+07 Transitions= 6.29e+08 Memory= 5064.131 t= 1.76e+03 R= 3e+04 -Depth= 9273 States= 4.8e+07 Transitions= 6.4e+08 Memory= 5148.018 t= 1.79e+03 R= 3e+04 -Depth= 9273 States= 4.9e+07 Transitions= 6.51e+08 Memory= 5232.002 t= 1.82e+03 R= 3e+04 -Depth= 9273 States= 5e+07 Transitions= 6.66e+08 Memory= 5315.986 t= 1.86e+03 R= 3e+04 -Depth= 9273 States= 5.1e+07 Transitions= 6.8e+08 Memory= 5399.971 t= 1.9e+03 R= 3e+04 -Depth= 9273 States= 5.2e+07 Transitions= 6.9e+08 Memory= 5483.955 t= 1.93e+03 R= 3e+04 -Depth= 9273 States= 5.3e+07 Transitions= 7.01e+08 Memory= 5567.940 t= 1.96e+03 R= 3e+04 -Depth= 9273 States= 5.4e+07 Transitions= 7.14e+08 Memory= 5651.826 t= 1.99e+03 R= 3e+04 -Depth= 9273 States= 5.5e+07 Transitions= 7.26e+08 Memory= 5735.811 t= 2.02e+03 R= 3e+04 -Depth= 9273 States= 5.6e+07 Transitions= 7.44e+08 Memory= 5819.795 t= 2.07e+03 R= 3e+04 -Depth= 9273 States= 5.7e+07 Transitions= 7.57e+08 Memory= 5903.779 t= 2.11e+03 R= 3e+04 -Depth= 9273 States= 5.8e+07 Transitions= 7.72e+08 Memory= 5987.764 t= 2.15e+03 R= 3e+04 -Depth= 9273 States= 5.9e+07 Transitions= 7.87e+08 Memory= 6071.748 t= 2.19e+03 R= 3e+04 -Depth= 9273 States= 6e+07 Transitions= 8.03e+08 Memory= 6155.733 t= 2.24e+03 R= 3e+04 -Depth= 9273 States= 6.1e+07 Transitions= 8.18e+08 Memory= 6239.619 t= 2.28e+03 R= 3e+04 -Depth= 9273 States= 6.2e+07 Transitions= 8.31e+08 Memory= 6323.604 t= 2.31e+03 R= 3e+04 -Depth= 9273 States= 6.3e+07 Transitions= 8.38e+08 Memory= 6407.588 t= 2.33e+03 R= 3e+04 -Depth= 9273 States= 6.4e+07 Transitions= 8.46e+08 Memory= 6491.572 t= 2.35e+03 R= 3e+04 -Depth= 9273 States= 6.5e+07 Transitions= 8.56e+08 Memory= 6575.557 t= 2.38e+03 R= 3e+04 -Depth= 9273 States= 6.6e+07 Transitions= 8.63e+08 Memory= 6659.541 t= 2.4e+03 R= 3e+04 -Depth= 9273 States= 6.7e+07 Transitions= 8.7e+08 Memory= 6743.428 t= 2.42e+03 R= 3e+04 -Depth= 9273 States= 6.8e+07 Transitions= 8.88e+08 Memory= 6827.412 t= 2.47e+03 R= 3e+04 -Depth= 9273 States= 6.9e+07 Transitions= 9e+08 Memory= 6911.397 t= 2.5e+03 R= 3e+04 -pan: claim violated! (at depth 1431) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 9273, errors: 1 - 69874699 states, stored -8.4222224e+08 states, matched -9.1209694e+08 transitions (= stored+matched) -1.3919028e+10 atomic steps -hash conflicts: 5.0632776e+08 (resolved) - -Stats on memory usage (in Megabytes): - 7729.974 equivalent memory usage for states (stored*(State-vector + overhead)) - 6018.458 actual memory usage for states (compression: 77.86%) - state-vector as stored = 62 byte + 28 byte overhead - 512.000 memory used for hash table (-w26) - 457.764 memory used for DFS stack (-m10000000) - 3.388 memory lost to fragmentation - 6984.834 total actual memory usage - -unreached in proctype urcu_reader - line 272, "pan.___", state 30, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 52, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 61, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 77, "(1)" - line 253, "pan.___", state 85, "(1)" - line 257, "pan.___", state 97, "(1)" - line 261, "pan.___", state 105, "(1)" - line 411, "pan.___", state 131, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 163, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 177, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 195, "(1)" - line 257, "pan.___", state 215, "(1)" - line 261, "pan.___", state 223, "(1)" - line 691, "pan.___", state 242, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 411, "pan.___", state 249, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 281, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 295, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 313, "(1)" - line 257, "pan.___", state 333, "(1)" - line 261, "pan.___", state 341, "(1)" - line 411, "pan.___", state 360, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 392, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 406, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 424, "(1)" - line 257, "pan.___", state 444, "(1)" - line 261, "pan.___", state 452, "(1)" - line 411, "pan.___", state 473, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 475, "(1)" - line 411, "pan.___", state 476, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 476, "else" - line 411, "pan.___", state 479, "(1)" - line 415, "pan.___", state 487, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 489, "(1)" - line 415, "pan.___", state 490, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 490, "else" - line 415, "pan.___", state 493, "(1)" - line 415, "pan.___", state 494, "(1)" - line 415, "pan.___", state 494, "(1)" - line 413, "pan.___", state 499, "((i<1))" - line 413, "pan.___", state 499, "((i>=1))" - line 420, "pan.___", state 505, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 507, "(1)" - line 420, "pan.___", state 508, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 508, "else" - line 420, "pan.___", state 511, "(1)" - line 420, "pan.___", state 512, "(1)" - line 420, "pan.___", state 512, "(1)" - line 424, "pan.___", state 519, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 521, "(1)" - line 424, "pan.___", state 522, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 522, "else" - line 424, "pan.___", state 525, "(1)" - line 424, "pan.___", state 526, "(1)" - line 424, "pan.___", state 526, "(1)" - line 422, "pan.___", state 531, "((i<2))" - line 422, "pan.___", state 531, "((i>=2))" - line 249, "pan.___", state 537, "(1)" - line 253, "pan.___", state 545, "(1)" - line 253, "pan.___", state 546, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 546, "else" - line 251, "pan.___", state 551, "((i<1))" - line 251, "pan.___", state 551, "((i>=1))" - line 257, "pan.___", state 557, "(1)" - line 257, "pan.___", state 558, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 558, "else" - line 261, "pan.___", state 565, "(1)" - line 261, "pan.___", state 566, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 566, "else" - line 259, "pan.___", state 571, "((i<2))" - line 259, "pan.___", state 571, "((i>=2))" - line 266, "pan.___", state 575, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 575, "else" - line 431, "pan.___", state 577, "(1)" - line 431, "pan.___", state 577, "(1)" - line 691, "pan.___", state 580, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 691, "pan.___", state 581, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 691, "pan.___", state 582, "(1)" - line 411, "pan.___", state 589, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 621, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 635, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 653, "(1)" - line 257, "pan.___", state 673, "(1)" - line 261, "pan.___", state 681, "(1)" - line 411, "pan.___", state 707, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 739, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 753, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 771, "(1)" - line 257, "pan.___", state 791, "(1)" - line 261, "pan.___", state 799, "(1)" - line 411, "pan.___", state 818, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 820, "(1)" - line 411, "pan.___", state 821, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 821, "else" - line 411, "pan.___", state 824, "(1)" - line 415, "pan.___", state 832, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 834, "(1)" - line 415, "pan.___", state 835, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 835, "else" - line 415, "pan.___", state 838, "(1)" - line 415, "pan.___", state 839, "(1)" - line 415, "pan.___", state 839, "(1)" - line 413, "pan.___", state 844, "((i<1))" - line 413, "pan.___", state 844, "((i>=1))" - line 420, "pan.___", state 850, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 852, "(1)" - line 420, "pan.___", state 853, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 853, "else" - line 420, "pan.___", state 856, "(1)" - line 420, "pan.___", state 857, "(1)" - line 420, "pan.___", state 857, "(1)" - line 424, "pan.___", state 864, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 866, "(1)" - line 424, "pan.___", state 867, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 867, "else" - line 424, "pan.___", state 870, "(1)" - line 424, "pan.___", state 871, "(1)" - line 424, "pan.___", state 871, "(1)" - line 422, "pan.___", state 876, "((i<2))" - line 422, "pan.___", state 876, "((i>=2))" - line 249, "pan.___", state 882, "(1)" - line 253, "pan.___", state 890, "(1)" - line 253, "pan.___", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 891, "else" - line 251, "pan.___", state 896, "((i<1))" - line 251, "pan.___", state 896, "((i>=1))" - line 257, "pan.___", state 902, "(1)" - line 257, "pan.___", state 903, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 903, "else" - line 261, "pan.___", state 910, "(1)" - line 261, "pan.___", state 911, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 911, "else" - line 259, "pan.___", state 916, "((i<2))" - line 259, "pan.___", state 916, "((i>=2))" - line 266, "pan.___", state 920, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 920, "else" - line 431, "pan.___", state 922, "(1)" - line 431, "pan.___", state 922, "(1)" - line 699, "pan.___", state 926, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 411, "pan.___", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 963, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 977, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 995, "(1)" - line 257, "pan.___", state 1015, "(1)" - line 261, "pan.___", state 1023, "(1)" - line 411, "pan.___", state 1045, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1077, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1091, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1109, "(1)" - line 257, "pan.___", state 1129, "(1)" - line 261, "pan.___", state 1137, "(1)" - line 411, "pan.___", state 1160, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1192, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1206, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1224, "(1)" - line 257, "pan.___", state 1244, "(1)" - line 261, "pan.___", state 1252, "(1)" - line 411, "pan.___", state 1271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1303, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1317, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1335, "(1)" - line 257, "pan.___", state 1355, "(1)" - line 261, "pan.___", state 1363, "(1)" - line 411, "pan.___", state 1387, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1419, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1433, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1451, "(1)" - line 257, "pan.___", state 1471, "(1)" - line 261, "pan.___", state 1479, "(1)" - line 411, "pan.___", state 1498, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1530, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1544, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1562, "(1)" - line 257, "pan.___", state 1582, "(1)" - line 261, "pan.___", state 1590, "(1)" - line 411, "pan.___", state 1612, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1644, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1658, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1676, "(1)" - line 257, "pan.___", state 1696, "(1)" - line 261, "pan.___", state 1704, "(1)" - line 738, "pan.___", state 1723, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 411, "pan.___", state 1730, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1762, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1776, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1794, "(1)" - line 257, "pan.___", state 1814, "(1)" - line 261, "pan.___", state 1822, "(1)" - line 411, "pan.___", state 1841, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1873, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1887, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1905, "(1)" - line 257, "pan.___", state 1925, "(1)" - line 261, "pan.___", state 1933, "(1)" - line 411, "pan.___", state 1954, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 1956, "(1)" - line 411, "pan.___", state 1957, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 1957, "else" - line 411, "pan.___", state 1960, "(1)" - line 415, "pan.___", state 1968, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1970, "(1)" - line 415, "pan.___", state 1971, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 1971, "else" - line 415, "pan.___", state 1974, "(1)" - line 415, "pan.___", state 1975, "(1)" - line 415, "pan.___", state 1975, "(1)" - line 413, "pan.___", state 1980, "((i<1))" - line 413, "pan.___", state 1980, "((i>=1))" - line 420, "pan.___", state 1986, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1988, "(1)" - line 420, "pan.___", state 1989, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 1989, "else" - line 420, "pan.___", state 1992, "(1)" - line 420, "pan.___", state 1993, "(1)" - line 420, "pan.___", state 1993, "(1)" - line 424, "pan.___", state 2000, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2002, "(1)" - line 424, "pan.___", state 2003, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 2003, "else" - line 424, "pan.___", state 2006, "(1)" - line 424, "pan.___", state 2007, "(1)" - line 424, "pan.___", state 2007, "(1)" - line 422, "pan.___", state 2012, "((i<2))" - line 422, "pan.___", state 2012, "((i>=2))" - line 249, "pan.___", state 2018, "(1)" - line 253, "pan.___", state 2026, "(1)" - line 253, "pan.___", state 2027, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 2027, "else" - line 251, "pan.___", state 2032, "((i<1))" - line 251, "pan.___", state 2032, "((i>=1))" - line 257, "pan.___", state 2038, "(1)" - line 257, "pan.___", state 2039, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 2039, "else" - line 261, "pan.___", state 2046, "(1)" - line 261, "pan.___", state 2047, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 2047, "else" - line 259, "pan.___", state 2052, "((i<2))" - line 259, "pan.___", state 2052, "((i>=2))" - line 266, "pan.___", state 2056, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 2056, "else" - line 431, "pan.___", state 2058, "(1)" - line 431, "pan.___", state 2058, "(1)" - line 738, "pan.___", state 2061, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 738, "pan.___", state 2062, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 738, "pan.___", state 2063, "(1)" - line 411, "pan.___", state 2070, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2102, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2116, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2134, "(1)" - line 257, "pan.___", state 2154, "(1)" - line 261, "pan.___", state 2162, "(1)" - line 411, "pan.___", state 2187, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2219, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2233, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2251, "(1)" - line 257, "pan.___", state 2271, "(1)" - line 261, "pan.___", state 2279, "(1)" - line 411, "pan.___", state 2298, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2330, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2344, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2362, "(1)" - line 257, "pan.___", state 2382, "(1)" - line 261, "pan.___", state 2390, "(1)" - line 249, "pan.___", state 2421, "(1)" - line 257, "pan.___", state 2441, "(1)" - line 261, "pan.___", state 2449, "(1)" - line 249, "pan.___", state 2464, "(1)" - line 257, "pan.___", state 2484, "(1)" - line 261, "pan.___", state 2492, "(1)" - line 898, "pan.___", state 2509, "-end-" - (221 of 2509 states) -unreached in proctype urcu_writer - line 411, "pan.___", state 19, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 33, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 249, "pan.___", state 83, "(1)" - line 253, "pan.___", state 91, "(1)" - line 272, "pan.___", state 132, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 134, "(1)" - line 276, "pan.___", state 141, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 143, "(1)" - line 276, "pan.___", state 144, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 144, "else" - line 274, "pan.___", state 149, "((i<1))" - line 274, "pan.___", state 149, "((i>=1))" - line 280, "pan.___", state 154, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 156, "(1)" - line 280, "pan.___", state 157, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 157, "else" - line 284, "pan.___", state 163, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 165, "(1)" - line 284, "pan.___", state 166, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 166, "else" - line 289, "pan.___", state 175, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 289, "pan.___", state 175, "else" - line 411, "pan.___", state 194, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 208, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 226, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 240, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 258, "(1)" - line 253, "pan.___", state 266, "(1)" - line 257, "pan.___", state 278, "(1)" - line 261, "pan.___", state 286, "(1)" - line 415, "pan.___", state 321, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 339, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 353, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 379, "(1)" - line 257, "pan.___", state 391, "(1)" - line 261, "pan.___", state 399, "(1)" - line 415, "pan.___", state 442, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 460, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 474, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 500, "(1)" - line 257, "pan.___", state 512, "(1)" - line 261, "pan.___", state 520, "(1)" - line 415, "pan.___", state 553, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 571, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 585, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 611, "(1)" - line 257, "pan.___", state 623, "(1)" - line 261, "pan.___", state 631, "(1)" - line 415, "pan.___", state 666, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 684, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 698, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 724, "(1)" - line 257, "pan.___", state 736, "(1)" - line 261, "pan.___", state 744, "(1)" - line 272, "pan.___", state 797, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 806, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 249, "pan.___", state 844, "(1)" - line 253, "pan.___", state 852, "(1)" - line 257, "pan.___", state 864, "(1)" - line 261, "pan.___", state 872, "(1)" - line 272, "pan.___", state 903, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 912, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 925, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 934, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 950, "(1)" - line 253, "pan.___", state 958, "(1)" - line 257, "pan.___", state 970, "(1)" - line 261, "pan.___", state 978, "(1)" - line 276, "pan.___", state 1004, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1017, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1026, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1042, "(1)" - line 253, "pan.___", state 1050, "(1)" - line 257, "pan.___", state 1062, "(1)" - line 261, "pan.___", state 1070, "(1)" - line 272, "pan.___", state 1101, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1110, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1123, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1132, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1148, "(1)" - line 253, "pan.___", state 1156, "(1)" - line 257, "pan.___", state 1168, "(1)" - line 261, "pan.___", state 1176, "(1)" - line 276, "pan.___", state 1202, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1215, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1224, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1240, "(1)" - line 253, "pan.___", state 1248, "(1)" - line 257, "pan.___", state 1260, "(1)" - line 261, "pan.___", state 1268, "(1)" - line 272, "pan.___", state 1299, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1308, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1321, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1330, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1346, "(1)" - line 253, "pan.___", state 1354, "(1)" - line 257, "pan.___", state 1366, "(1)" - line 261, "pan.___", state 1374, "(1)" - line 276, "pan.___", state 1400, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1413, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1422, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1438, "(1)" - line 253, "pan.___", state 1446, "(1)" - line 257, "pan.___", state 1458, "(1)" - line 261, "pan.___", state 1466, "(1)" - line 272, "pan.___", state 1497, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1506, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1519, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1528, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1544, "(1)" - line 253, "pan.___", state 1552, "(1)" - line 257, "pan.___", state 1564, "(1)" - line 261, "pan.___", state 1572, "(1)" - line 1237, "pan.___", state 1588, "-end-" - (109 of 1588 states) -unreached in proctype :init: - line 1248, "pan.___", state 9, "((j<2))" - line 1248, "pan.___", state 9, "((j>=2))" - line 1249, "pan.___", state 20, "((j<2))" - line 1249, "pan.___", state 20, "((j>=2))" - line 1254, "pan.___", state 33, "((j<2))" - line 1254, "pan.___", state 33, "((j>=2))" - line 1252, "pan.___", state 43, "((i<1))" - line 1252, "pan.___", state 43, "((i>=1))" - line 1262, "pan.___", state 54, "((j<2))" - line 1262, "pan.___", state 54, "((j>=2))" - line 1266, "pan.___", state 67, "((j<2))" - line 1266, "pan.___", state 67, "((j>=2))" - (6 of 78 states) -unreached in proctype :never: - line 1300, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 2.53e+03 seconds -pan: rate 27617.257 states/second -pan: avg transition delay 2.7739e-06 usec -cp .input.spin urcu_free_no_wmb.spin.input -cp .input.spin.trail urcu_free_no_wmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi' diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_wmb.spin.input b/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_wmb.spin.input deleted file mode 100644 index 511c963..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_wmb.spin.input +++ /dev/null @@ -1,1273 +0,0 @@ -#define NO_WMB - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_wmb.spin.input.trail deleted file mode 100644 index 62969b9..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_no_wmb.spin.input.trail +++ /dev/null @@ -1,1434 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:4177 -2:3:4097 -3:3:4100 -4:3:4100 -5:3:4103 -6:3:4111 -7:3:4111 -8:3:4114 -9:3:4120 -10:3:4124 -11:3:4124 -12:3:4127 -13:3:4137 -14:3:4145 -15:3:4145 -16:3:4148 -17:3:4154 -18:3:4158 -19:3:4158 -20:3:4161 -21:3:4167 -22:3:4171 -23:3:4172 -24:0:4177 -25:3:4174 -26:0:4177 -27:2:2511 -28:0:4177 -29:2:2517 -30:0:4177 -31:2:2518 -32:0:4177 -33:2:2520 -34:0:4177 -35:2:2521 -36:0:4177 -37:2:2522 -38:0:4177 -39:2:2523 -40:2:2524 -41:2:2528 -42:2:2529 -43:2:2537 -44:2:2538 -45:2:2542 -46:2:2543 -47:2:2551 -48:2:2556 -49:2:2560 -50:2:2561 -51:2:2569 -52:2:2570 -53:2:2574 -54:2:2575 -55:2:2569 -56:2:2570 -57:2:2574 -58:2:2575 -59:2:2583 -60:2:2588 -61:2:2595 -62:2:2596 -63:2:2603 -64:2:2608 -65:2:2615 -66:2:2616 -67:2:2615 -68:2:2616 -69:2:2623 -70:2:2633 -71:0:4177 -72:2:2522 -73:0:4177 -74:2:2685 -75:2:2686 -76:2:2687 -77:0:4177 -78:2:2522 -79:0:4177 -80:2:2692 -81:0:4177 -82:2:3306 -83:2:3307 -84:2:3311 -85:2:3315 -86:2:3316 -87:2:3320 -88:2:3325 -89:2:3333 -90:2:3337 -91:2:3338 -92:2:3333 -93:2:3334 -94:2:3342 -95:2:3349 -96:2:3356 -97:2:3357 -98:2:3364 -99:2:3369 -100:2:3376 -101:2:3377 -102:2:3376 -103:2:3377 -104:2:3384 -105:2:3388 -106:0:4177 -107:2:3393 -108:0:4177 -109:2:3394 -110:0:4177 -111:2:3395 -112:0:4177 -113:2:3396 -114:0:4177 -115:1:2 -116:0:4177 -117:2:3397 -118:0:4177 -119:1:8 -120:0:4177 -121:1:9 -122:0:4177 -123:2:3396 -124:0:4177 -125:1:10 -126:0:4177 -127:2:3397 -128:0:4177 -129:1:11 -130:0:4177 -131:2:3396 -132:0:4177 -133:1:12 -134:0:4177 -135:2:3397 -136:0:4177 -137:1:13 -138:0:4177 -139:2:3396 -140:0:4177 -141:1:14 -142:0:4177 -143:2:3397 -144:0:4177 -145:1:15 -146:0:4177 -147:1:16 -148:0:4177 -149:2:3396 -150:0:4177 -151:1:17 -152:0:4177 -153:2:3397 -154:0:4177 -155:1:26 -156:0:4177 -157:2:3396 -158:0:4177 -159:1:30 -160:1:31 -161:1:35 -162:1:39 -163:1:40 -164:1:44 -165:1:52 -166:1:53 -167:1:57 -168:1:61 -169:1:62 -170:1:57 -171:1:61 -172:1:62 -173:1:66 -174:1:73 -175:1:80 -176:1:81 -177:1:88 -178:1:93 -179:1:100 -180:1:101 -181:1:100 -182:1:101 -183:1:108 -184:1:112 -185:0:4177 -186:2:3397 -187:0:4177 -188:1:117 -189:0:4177 -190:2:3398 -191:0:4177 -192:2:3403 -193:0:4177 -194:2:3404 -195:0:4177 -196:2:3412 -197:2:3413 -198:2:3417 -199:2:3421 -200:2:3422 -201:2:3426 -202:2:3434 -203:2:3435 -204:2:3439 -205:2:3443 -206:2:3444 -207:2:3439 -208:2:3443 -209:2:3444 -210:2:3448 -211:2:3455 -212:2:3462 -213:2:3463 -214:2:3470 -215:2:3475 -216:2:3482 -217:2:3483 -218:2:3482 -219:2:3483 -220:2:3490 -221:2:3494 -222:0:4177 -223:2:2694 -224:2:3287 -225:0:4177 -226:2:2522 -227:0:4177 -228:2:2695 -229:0:4177 -230:2:2522 -231:0:4177 -232:2:2698 -233:2:2699 -234:2:2703 -235:2:2704 -236:2:2712 -237:2:2713 -238:2:2717 -239:2:2718 -240:2:2726 -241:2:2731 -242:2:2735 -243:2:2736 -244:2:2744 -245:2:2745 -246:2:2749 -247:2:2750 -248:2:2744 -249:2:2745 -250:2:2749 -251:2:2750 -252:2:2758 -253:2:2763 -254:2:2770 -255:2:2771 -256:2:2778 -257:2:2783 -258:2:2790 -259:2:2791 -260:2:2790 -261:2:2791 -262:2:2798 -263:2:2807 -264:0:4177 -265:2:2522 -266:0:4177 -267:2:2811 -268:2:2812 -269:2:2813 -270:2:2825 -271:2:2826 -272:2:2830 -273:2:2831 -274:2:2839 -275:2:2844 -276:2:2848 -277:2:2849 -278:2:2857 -279:2:2858 -280:2:2862 -281:2:2863 -282:2:2857 -283:2:2858 -284:2:2862 -285:2:2863 -286:2:2871 -287:2:2876 -288:2:2883 -289:2:2884 -290:2:2891 -291:2:2896 -292:2:2903 -293:2:2904 -294:2:2903 -295:2:2904 -296:2:2911 -297:2:2924 -298:2:2925 -299:0:4177 -300:2:2522 -301:0:4177 -302:2:2932 -303:2:2933 -304:2:2937 -305:2:2938 -306:2:2946 -307:2:2947 -308:2:2951 -309:2:2952 -310:2:2960 -311:2:2965 -312:2:2969 -313:2:2970 -314:2:2978 -315:2:2979 -316:2:2983 -317:2:2984 -318:2:2978 -319:2:2979 -320:2:2983 -321:2:2984 -322:2:2992 -323:2:2997 -324:2:3004 -325:2:3005 -326:2:3012 -327:2:3017 -328:2:3024 -329:2:3025 -330:2:3024 -331:2:3025 -332:2:3032 -333:0:4177 -334:2:2522 -335:0:4177 -336:2:3043 -337:2:3044 -338:2:3048 -339:2:3049 -340:2:3057 -341:2:3058 -342:2:3062 -343:2:3063 -344:2:3071 -345:2:3076 -346:2:3080 -347:2:3081 -348:2:3089 -349:2:3090 -350:2:3094 -351:2:3095 -352:2:3089 -353:2:3090 -354:2:3094 -355:2:3095 -356:2:3103 -357:2:3108 -358:2:3115 -359:2:3116 -360:2:3123 -361:2:3128 -362:2:3135 -363:2:3136 -364:2:3135 -365:2:3136 -366:2:3143 -367:2:3152 -368:0:4177 -369:2:2522 -370:0:4177 -371:2:3156 -372:2:3157 -373:2:3158 -374:2:3170 -375:2:3171 -376:2:3175 -377:2:3176 -378:2:3184 -379:2:3189 -380:2:3193 -381:2:3194 -382:2:3202 -383:2:3203 -384:2:3207 -385:2:3208 -386:2:3202 -387:2:3203 -388:2:3207 -389:2:3208 -390:2:3216 -391:2:3221 -392:2:3228 -393:2:3229 -394:2:3236 -395:2:3241 -396:2:3248 -397:2:3249 -398:2:3248 -399:2:3249 -400:2:3256 -401:2:3268 -402:2:3269 -403:0:4177 -404:2:2522 -405:0:4177 -406:2:3275 -407:0:4177 -408:2:3900 -409:2:3901 -410:2:3905 -411:2:3909 -412:2:3910 -413:2:3914 -414:2:3922 -415:2:3923 -416:2:3927 -417:2:3931 -418:2:3932 -419:2:3927 -420:2:3931 -421:2:3932 -422:2:3936 -423:2:3943 -424:2:3950 -425:2:3951 -426:2:3958 -427:2:3963 -428:2:3970 -429:2:3971 -430:2:3970 -431:2:3971 -432:2:3978 -433:2:3982 -434:0:4177 -435:2:3987 -436:0:4177 -437:2:3988 -438:0:4177 -439:2:3989 -440:0:4177 -441:2:3990 -442:0:4177 -443:1:26 -444:0:4177 -445:2:3991 -446:0:4177 -447:1:30 -448:1:31 -449:1:35 -450:1:39 -451:1:40 -452:1:44 -453:1:52 -454:1:53 -455:1:57 -456:1:61 -457:1:62 -458:1:57 -459:1:61 -460:1:62 -461:1:66 -462:1:73 -463:1:80 -464:1:81 -465:1:88 -466:1:93 -467:1:100 -468:1:101 -469:1:100 -470:1:101 -471:1:108 -472:1:112 -473:0:4177 -474:2:3990 -475:0:4177 -476:1:117 -477:0:4177 -478:2:3991 -479:0:4177 -480:2:3992 -481:0:4177 -482:2:3997 -483:0:4177 -484:2:3998 -485:0:4177 -486:2:4006 -487:2:4007 -488:2:4011 -489:2:4015 -490:2:4016 -491:2:4020 -492:2:4028 -493:2:4029 -494:2:4033 -495:2:4037 -496:2:4038 -497:2:4033 -498:2:4037 -499:2:4038 -500:2:4042 -501:2:4049 -502:2:4056 -503:2:4057 -504:2:4064 -505:2:4069 -506:2:4076 -507:2:4077 -508:2:4076 -509:2:4077 -510:2:4084 -511:2:4088 -512:0:4177 -513:2:3277 -514:2:3287 -515:0:4177 -516:2:2522 -517:0:4177 -518:2:3278 -519:2:3279 -520:0:4177 -521:2:2522 -522:0:4177 -523:2:3283 -524:0:4177 -525:2:3291 -526:0:4177 -527:2:2518 -528:0:4177 -529:2:2520 -530:0:4177 -531:2:2521 -532:0:4177 -533:2:2522 -534:0:4177 -535:2:2685 -536:2:2686 -537:2:2687 -538:0:4177 -539:2:2522 -540:0:4177 -541:2:2523 -542:2:2524 -543:2:2528 -544:2:2529 -545:2:2537 -546:2:2538 -547:2:2542 -548:2:2543 -549:2:2551 -550:2:2556 -551:2:2557 -552:2:2569 -553:2:2570 -554:2:2571 -555:2:2569 -556:2:2570 -557:2:2574 -558:2:2575 -559:2:2583 -560:2:2588 -561:2:2595 -562:2:2596 -563:2:2603 -564:2:2608 -565:2:2615 -566:2:2616 -567:2:2615 -568:2:2616 -569:2:2623 -570:2:2633 -571:0:4177 -572:2:2522 -573:0:4177 -574:2:2692 -575:0:4177 -576:2:3306 -577:2:3307 -578:2:3311 -579:2:3315 -580:2:3316 -581:2:3320 -582:2:3328 -583:2:3329 -584:2:3333 -585:2:3334 -586:2:3333 -587:2:3337 -588:2:3338 -589:2:3342 -590:2:3349 -591:2:3356 -592:2:3357 -593:2:3364 -594:2:3369 -595:2:3376 -596:2:3377 -597:2:3376 -598:2:3377 -599:2:3384 -600:2:3388 -601:0:4177 -602:2:3393 -603:0:4177 -604:2:3394 -605:0:4177 -606:2:3395 -607:0:4177 -608:2:3396 -609:0:4177 -610:1:26 -611:0:4177 -612:2:3397 -613:0:4177 -614:1:30 -615:1:31 -616:1:35 -617:1:39 -618:1:40 -619:1:44 -620:1:52 -621:1:53 -622:1:57 -623:1:61 -624:1:62 -625:1:57 -626:1:61 -627:1:62 -628:1:66 -629:1:73 -630:1:80 -631:1:81 -632:1:88 -633:1:93 -634:1:100 -635:1:101 -636:1:100 -637:1:101 -638:1:108 -639:1:112 -640:0:4177 -641:2:3396 -642:0:4177 -643:1:117 -644:0:4177 -645:2:3397 -646:0:4177 -647:2:3398 -648:0:4177 -649:2:3403 -650:0:4177 -651:2:3404 -652:0:4177 -653:2:3412 -654:2:3413 -655:2:3417 -656:2:3421 -657:2:3422 -658:2:3426 -659:2:3434 -660:2:3435 -661:2:3439 -662:2:3443 -663:2:3444 -664:2:3439 -665:2:3443 -666:2:3444 -667:2:3448 -668:2:3455 -669:2:3462 -670:2:3463 -671:2:3470 -672:2:3475 -673:2:3482 -674:2:3483 -675:2:3482 -676:2:3483 -677:2:3490 -678:2:3494 -679:0:4177 -680:2:2694 -681:2:3287 -682:0:4177 -683:2:2522 -684:0:4177 -685:2:2695 -686:0:4177 -687:2:2522 -688:0:4177 -689:2:2698 -690:2:2699 -691:2:2703 -692:2:2704 -693:2:2712 -694:2:2713 -695:2:2717 -696:2:2718 -697:2:2726 -698:2:2731 -699:2:2735 -700:2:2736 -701:2:2744 -702:2:2745 -703:2:2749 -704:2:2750 -705:2:2744 -706:2:2745 -707:2:2749 -708:2:2750 -709:2:2758 -710:2:2763 -711:2:2770 -712:2:2771 -713:2:2778 -714:2:2783 -715:2:2790 -716:2:2791 -717:2:2790 -718:2:2791 -719:2:2798 -720:2:2807 -721:0:4177 -722:2:2522 -723:0:4177 -724:2:2811 -725:2:2812 -726:2:2813 -727:2:2825 -728:2:2826 -729:2:2830 -730:2:2831 -731:2:2839 -732:2:2844 -733:2:2848 -734:2:2849 -735:2:2857 -736:2:2858 -737:2:2862 -738:2:2863 -739:2:2857 -740:2:2858 -741:2:2862 -742:2:2863 -743:2:2871 -744:2:2876 -745:2:2883 -746:2:2884 -747:2:2891 -748:2:2896 -749:2:2903 -750:2:2904 -751:2:2903 -752:2:2904 -753:2:2911 -754:2:2924 -755:2:2925 -756:0:4177 -757:2:2522 -758:0:4177 -759:2:2932 -760:2:2933 -761:2:2937 -762:2:2938 -763:2:2946 -764:2:2947 -765:2:2951 -766:2:2952 -767:2:2960 -768:2:2965 -769:2:2969 -770:2:2970 -771:2:2978 -772:2:2979 -773:2:2983 -774:2:2984 -775:2:2978 -776:2:2979 -777:2:2983 -778:2:2984 -779:2:2992 -780:2:2997 -781:2:3004 -782:2:3005 -783:2:3012 -784:2:3017 -785:2:3024 -786:2:3025 -787:2:3024 -788:2:3025 -789:2:3032 -790:0:4177 -791:2:2522 -792:0:4177 -793:2:3043 -794:2:3044 -795:2:3048 -796:2:3049 -797:2:3057 -798:2:3058 -799:2:3062 -800:2:3063 -801:2:3071 -802:2:3076 -803:2:3080 -804:2:3081 -805:2:3089 -806:2:3090 -807:2:3094 -808:2:3095 -809:2:3089 -810:2:3090 -811:2:3094 -812:2:3095 -813:2:3103 -814:2:3108 -815:2:3115 -816:2:3116 -817:2:3123 -818:2:3128 -819:2:3135 -820:2:3136 -821:2:3135 -822:2:3136 -823:2:3143 -824:2:3152 -825:0:4177 -826:2:2522 -827:0:4177 -828:2:3156 -829:2:3157 -830:2:3158 -831:2:3170 -832:2:3171 -833:2:3175 -834:2:3176 -835:2:3184 -836:2:3189 -837:2:3193 -838:2:3194 -839:2:3202 -840:2:3203 -841:2:3207 -842:2:3208 -843:2:3202 -844:2:3203 -845:2:3207 -846:2:3208 -847:2:3216 -848:2:3221 -849:2:3228 -850:2:3229 -851:2:3236 -852:2:3241 -853:2:3248 -854:2:3249 -855:2:3248 -856:2:3249 -857:2:3256 -858:2:3268 -859:2:3269 -860:0:4177 -861:2:2522 -862:0:4177 -863:2:3275 -864:0:4177 -865:2:3900 -866:2:3901 -867:2:3905 -868:2:3909 -869:2:3910 -870:2:3914 -871:2:3922 -872:2:3923 -873:2:3927 -874:2:3931 -875:2:3932 -876:2:3927 -877:2:3931 -878:2:3932 -879:2:3936 -880:2:3943 -881:2:3950 -882:2:3951 -883:2:3958 -884:2:3963 -885:2:3970 -886:2:3971 -887:2:3970 -888:2:3971 -889:2:3978 -890:2:3982 -891:0:4177 -892:2:3987 -893:0:4177 -894:2:3988 -895:0:4177 -896:2:3989 -897:0:4177 -898:2:3990 -899:0:4177 -900:1:26 -901:0:4177 -902:2:3991 -903:0:4177 -904:1:30 -905:1:31 -906:1:35 -907:1:39 -908:1:40 -909:1:44 -910:1:52 -911:1:53 -912:1:57 -913:1:61 -914:1:62 -915:1:57 -916:1:61 -917:1:62 -918:1:66 -919:1:73 -920:1:80 -921:1:81 -922:1:88 -923:1:93 -924:1:100 -925:1:101 -926:1:100 -927:1:101 -928:1:108 -929:1:112 -930:0:4177 -931:2:3990 -932:0:4177 -933:1:117 -934:0:4177 -935:2:3991 -936:0:4177 -937:2:3992 -938:0:4177 -939:2:3997 -940:0:4177 -941:2:3998 -942:0:4177 -943:2:4006 -944:2:4007 -945:2:4011 -946:2:4015 -947:2:4016 -948:2:4020 -949:2:4028 -950:2:4029 -951:2:4033 -952:2:4037 -953:2:4038 -954:2:4033 -955:2:4037 -956:2:4038 -957:2:4042 -958:2:4049 -959:2:4056 -960:2:4057 -961:2:4064 -962:2:4069 -963:2:4076 -964:2:4077 -965:2:4076 -966:2:4077 -967:2:4084 -968:2:4088 -969:0:4177 -970:2:3277 -971:2:3287 -972:0:4177 -973:2:2522 -974:0:4177 -975:2:3278 -976:2:3279 -977:0:4177 -978:2:2522 -979:0:4177 -980:2:3283 -981:0:4177 -982:2:3291 -983:0:4177 -984:2:2518 -985:0:4177 -986:2:2520 -987:0:4177 -988:2:2521 -989:0:4177 -990:2:2522 -991:0:4177 -992:2:2523 -993:2:2524 -994:2:2528 -995:2:2529 -996:2:2537 -997:2:2538 -998:2:2542 -999:2:2543 -1000:2:2551 -1001:2:2556 -1002:2:2560 -1003:2:2561 -1004:2:2569 -1005:2:2570 -1006:2:2574 -1007:2:2575 -1008:2:2569 -1009:2:2570 -1010:2:2571 -1011:2:2583 -1012:2:2588 -1013:2:2595 -1014:2:2596 -1015:2:2603 -1016:2:2608 -1017:2:2615 -1018:2:2616 -1019:2:2615 -1020:2:2616 -1021:2:2623 -1022:2:2633 -1023:0:4177 -1024:2:2522 -1025:0:4177 -1026:2:2685 -1027:2:2686 -1028:2:2687 -1029:0:4177 -1030:2:2522 -1031:0:4177 -1032:2:2692 -1033:0:4177 -1034:1:118 -1035:0:4177 -1036:1:120 -1037:0:4177 -1038:1:19 -1039:0:4177 -1040:1:126 -1041:1:127 -1042:1:131 -1043:1:132 -1044:1:140 -1045:1:141 -1046:1:145 -1047:1:146 -1048:1:154 -1049:1:159 -1050:1:163 -1051:1:164 -1052:1:172 -1053:1:173 -1054:1:177 -1055:1:178 -1056:1:172 -1057:1:173 -1058:1:177 -1059:1:178 -1060:1:186 -1061:1:191 -1062:1:198 -1063:1:199 -1064:1:206 -1065:1:211 -1066:1:218 -1067:1:219 -1068:1:218 -1069:1:219 -1070:1:226 -1071:0:4177 -1072:1:15 -1073:0:4177 -1074:1:16 -1075:0:4177 -1076:1:17 -1077:0:4177 -1078:1:118 -1079:0:4177 -1080:1:120 -1081:0:4177 -1082:1:19 -1083:0:4177 -1084:1:237 -1085:1:238 -1086:0:4177 -1087:1:15 -1088:0:4177 -1089:1:16 -1090:0:4177 -1091:1:17 -1092:0:4177 -1093:1:118 -1094:0:4177 -1095:1:120 -1096:0:4177 -1097:1:19 -1098:0:4177 -1099:1:244 -1100:1:245 -1101:1:249 -1102:1:250 -1103:1:258 -1104:1:259 -1105:1:263 -1106:1:264 -1107:1:272 -1108:1:277 -1109:1:281 -1110:1:282 -1111:1:290 -1112:1:291 -1113:1:295 -1114:1:296 -1115:1:290 -1116:1:291 -1117:1:295 -1118:1:296 -1119:1:304 -1120:1:309 -1121:1:316 -1122:1:317 -1123:1:324 -1124:1:329 -1125:1:336 -1126:1:337 -1127:1:336 -1128:1:337 -1129:1:344 -1130:0:4177 -1131:1:15 -1132:0:4177 -1133:1:16 -1134:0:4177 -1135:1:17 -1136:0:4177 -1137:1:118 -1138:0:4177 -1139:1:120 -1140:0:4177 -1141:1:19 -1142:0:4177 -1143:1:355 -1144:1:356 -1145:1:360 -1146:1:361 -1147:1:369 -1148:1:370 -1149:1:374 -1150:1:375 -1151:1:383 -1152:1:388 -1153:1:392 -1154:1:393 -1155:1:401 -1156:1:402 -1157:1:406 -1158:1:407 -1159:1:401 -1160:1:402 -1161:1:406 -1162:1:407 -1163:1:415 -1164:1:420 -1165:1:427 -1166:1:428 -1167:1:435 -1168:1:440 -1169:1:447 -1170:1:448 -1171:1:447 -1172:1:448 -1173:1:455 -1174:1:464 -1175:0:4177 -1176:1:15 -1177:0:4177 -1178:1:16 -1179:0:4177 -1180:1:17 -1181:0:4177 -1182:1:118 -1183:0:4177 -1184:1:120 -1185:0:4177 -1186:1:19 -1187:0:4177 -1188:1:584 -1189:1:585 -1190:1:589 -1191:1:590 -1192:1:598 -1193:1:599 -1194:1:600 -1195:1:612 -1196:1:617 -1197:1:621 -1198:1:622 -1199:1:630 -1200:1:631 -1201:1:635 -1202:1:636 -1203:1:630 -1204:1:631 -1205:1:635 -1206:1:636 -1207:1:644 -1208:1:649 -1209:1:656 -1210:1:657 -1211:1:664 -1212:1:669 -1213:1:676 -1214:1:677 -1215:1:676 -1216:1:677 -1217:1:684 -1218:0:4177 -1219:1:15 -1220:0:4177 -1221:1:16 -1222:0:4177 -1223:1:17 -1224:0:4177 -1225:1:118 -1226:0:4177 -1227:1:120 -1228:0:4177 -1229:1:19 -1230:0:4177 -1231:1:695 -1232:1:698 -1233:1:699 -1234:0:4177 -1235:1:15 -1236:0:4177 -1237:1:16 -1238:0:4177 -1239:1:17 -1240:0:4177 -1241:1:118 -1242:0:4177 -1243:1:120 -1244:0:4177 -1245:1:19 -1246:0:4177 -1247:1:702 -1248:1:703 -1249:1:707 -1250:1:708 -1251:1:716 -1252:1:717 -1253:1:721 -1254:1:722 -1255:1:730 -1256:1:735 -1257:1:739 -1258:1:740 -1259:1:748 -1260:1:749 -1261:1:753 -1262:1:754 -1263:1:748 -1264:1:749 -1265:1:753 -1266:1:754 -1267:1:762 -1268:1:767 -1269:1:774 -1270:1:775 -1271:1:782 -1272:1:787 -1273:1:794 -1274:1:795 -1275:1:794 -1276:1:795 -1277:1:802 -1278:0:4177 -1279:1:15 -1280:0:4177 -1281:1:16 -1282:0:4177 -1283:1:17 -1284:0:4177 -1285:1:118 -1286:0:4177 -1287:1:120 -1288:0:4177 -1289:1:19 -1290:0:4177 -1291:1:926 -1292:1:927 -1293:1:931 -1294:1:932 -1295:1:940 -1296:1:941 -1297:1:945 -1298:1:946 -1299:1:954 -1300:1:959 -1301:1:963 -1302:1:964 -1303:1:972 -1304:1:973 -1305:1:977 -1306:1:978 -1307:1:972 -1308:1:973 -1309:1:977 -1310:1:978 -1311:1:986 -1312:1:991 -1313:1:998 -1314:1:999 -1315:1:1006 -1316:1:1011 -1317:1:1018 -1318:1:1019 -1319:1:1018 -1320:1:1019 -1321:1:1026 -1322:1:1035 -1323:1:1039 -1324:0:4177 -1325:1:15 -1326:0:4177 -1327:1:16 -1328:0:4177 -1329:1:17 -1330:0:4177 -1331:1:118 -1332:0:4177 -1333:1:120 -1334:0:4177 -1335:1:19 -1336:0:4177 -1337:1:1040 -1338:1:1041 -1339:1:1045 -1340:1:1046 -1341:1:1054 -1342:1:1055 -1343:1:1056 -1344:1:1068 -1345:1:1073 -1346:1:1077 -1347:1:1078 -1348:1:1086 -1349:1:1087 -1350:1:1091 -1351:1:1092 -1352:1:1086 -1353:1:1087 -1354:1:1091 -1355:1:1092 -1356:1:1100 -1357:1:1105 -1358:1:1112 -1359:1:1113 -1360:1:1120 -1361:1:1125 -1362:1:1132 -1363:1:1133 -1364:1:1132 -1365:1:1133 -1366:1:1140 -1367:0:4177 -1368:1:15 -1369:0:4177 -1370:1:16 -1371:0:4177 -1372:1:17 -1373:0:4177 -1374:1:118 -1375:0:4177 -1376:1:120 -1377:0:4177 -1378:1:19 -1379:0:4177 -1380:1:1151 -1381:0:4177 -1382:1:2417 -1383:1:2424 -1384:1:2425 -1385:1:2432 -1386:1:2437 -1387:1:2444 -1388:1:2445 -1389:1:2444 -1390:1:2445 -1391:1:2452 -1392:1:2456 -1393:0:4177 -1394:2:3306 -1395:2:3307 -1396:2:3311 -1397:2:3315 -1398:2:3316 -1399:2:3320 -1400:2:3325 -1401:2:3333 -1402:2:3337 -1403:2:3338 -1404:2:3333 -1405:2:3334 -1406:2:3342 -1407:2:3349 -1408:2:3356 -1409:2:3357 -1410:2:3364 -1411:2:3369 -1412:2:3376 -1413:2:3377 -1414:2:3376 -1415:2:3377 -1416:2:3384 -1417:2:3388 -1418:0:4177 -1419:2:3393 -1420:0:4177 -1421:2:3394 -1422:0:4177 -1423:2:3395 -1424:0:4177 -1425:2:3396 -1426:0:4177 -1427:1:1153 -1428:1:1154 -1429:0:4175 -1430:2:3397 -1431:0:4181 -1432:1:2165 diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_single_flip.define b/formal-model/urcu-controldataflow-intel-ipi/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_single_flip.log b/formal-model/urcu-controldataflow-intel-ipi/urcu_free_single_flip.log deleted file mode 100644 index 3fc8991..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_single_flip.log +++ /dev/null @@ -1,635 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_single_flip.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1295) -Depth= 9112 States= 1e+06 Transitions= 7.1e+06 Memory= 550.432 t= 17.4 R= 6e+04 -Depth= 9112 States= 2e+06 Transitions= 1.64e+07 Memory= 634.318 t= 41.8 R= 5e+04 -Depth= 9112 States= 3e+06 Transitions= 2.63e+07 Memory= 718.303 t= 68.2 R= 4e+04 -pan: resizing hashtable to -w22.. done -Depth= 9112 States= 4e+06 Transitions= 3.56e+07 Memory= 833.311 t= 93.2 R= 4e+04 -Depth= 9112 States= 5e+06 Transitions= 4.66e+07 Memory= 917.295 t= 122 R= 4e+04 -Depth= 9112 States= 6e+06 Transitions= 5.77e+07 Memory= 1001.279 t= 152 R= 4e+04 -Depth= 9112 States= 7e+06 Transitions= 6.72e+07 Memory= 1085.264 t= 177 R= 4e+04 -Depth= 9112 States= 8e+06 Transitions= 7.41e+07 Memory= 1169.151 t= 194 R= 4e+04 -Depth= 9112 States= 9e+06 Transitions= 8.11e+07 Memory= 1253.135 t= 212 R= 4e+04 -pan: resizing hashtable to -w24.. done -Depth= 9112 States= 1e+07 Transitions= 8.81e+07 Memory= 1461.115 t= 231 R= 4e+04 -Depth= 9112 States= 1.1e+07 Transitions= 9.84e+07 Memory= 1545.100 t= 259 R= 4e+04 -Depth= 9112 States= 1.2e+07 Transitions= 1.08e+08 Memory= 1629.084 t= 282 R= 4e+04 -Depth= 9112 States= 1.3e+07 Transitions= 1.16e+08 Memory= 1713.068 t= 304 R= 4e+04 -Depth= 9112 States= 1.4e+07 Transitions= 1.25e+08 Memory= 1797.053 t= 329 R= 4e+04 -Depth= 9112 States= 1.5e+07 Transitions= 1.35e+08 Memory= 1881.037 t= 352 R= 4e+04 -Depth= 9278 States= 1.6e+07 Transitions= 1.45e+08 Memory= 1964.924 t= 382 R= 4e+04 -Depth= 9283 States= 1.7e+07 Transitions= 1.56e+08 Memory= 2048.908 t= 409 R= 4e+04 -Depth= 9283 States= 1.8e+07 Transitions= 1.66e+08 Memory= 2132.893 t= 437 R= 4e+04 -Depth= 9283 States= 1.9e+07 Transitions= 1.76e+08 Memory= 2216.877 t= 464 R= 4e+04 -Depth= 9283 States= 2e+07 Transitions= 1.87e+08 Memory= 2300.861 t= 493 R= 4e+04 -Depth= 9283 States= 2.1e+07 Transitions= 1.97e+08 Memory= 2384.846 t= 521 R= 4e+04 -Depth= 9283 States= 2.2e+07 Transitions= 2.08e+08 Memory= 2468.830 t= 549 R= 4e+04 -Depth= 9283 States= 2.3e+07 Transitions= 2.17e+08 Memory= 2552.717 t= 572 R= 4e+04 -Depth= 9283 States= 2.4e+07 Transitions= 2.26e+08 Memory= 2636.701 t= 596 R= 4e+04 -Depth= 9283 States= 2.5e+07 Transitions= 2.37e+08 Memory= 2720.686 t= 627 R= 4e+04 -Depth= 9283 States= 2.6e+07 Transitions= 2.49e+08 Memory= 2804.670 t= 659 R= 4e+04 -Depth= 9283 States= 2.7e+07 Transitions= 2.6e+08 Memory= 2888.654 t= 689 R= 4e+04 -Depth= 9283 States= 2.8e+07 Transitions= 2.71e+08 Memory= 2972.639 t= 718 R= 4e+04 -Depth= 9283 States= 2.9e+07 Transitions= 2.8e+08 Memory= 3056.526 t= 741 R= 4e+04 -Depth= 9283 States= 3e+07 Transitions= 2.89e+08 Memory= 3140.510 t= 764 R= 4e+04 -Depth= 9283 States= 3.1e+07 Transitions= 2.99e+08 Memory= 3224.494 t= 791 R= 4e+04 -Depth= 9283 States= 3.2e+07 Transitions= 3.09e+08 Memory= 3308.479 t= 818 R= 4e+04 -Depth= 9283 States= 3.3e+07 Transitions= 3.19e+08 Memory= 3392.463 t= 846 R= 4e+04 -Depth= 9283 States= 3.4e+07 Transitions= 3.29e+08 Memory= 3476.447 t= 873 R= 4e+04 -pan: resizing hashtable to -w26.. done -Depth= 9283 States= 3.5e+07 Transitions= 3.39e+08 Memory= 4056.416 t= 908 R= 4e+04 -Depth= 9283 States= 3.6e+07 Transitions= 3.49e+08 Memory= 4140.401 t= 934 R= 4e+04 -Depth= 9283 States= 3.7e+07 Transitions= 3.59e+08 Memory= 4224.385 t= 959 R= 4e+04 -pan: claim violated! (at depth 1298) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 9283, errors: 1 - 37684654 states, stored -3.2905753e+08 states, matched -3.6674218e+08 transitions (= stored+matched) -5.3145922e+09 atomic steps -hash conflicts: 2.6456917e+08 (resolved) - -Stats on memory usage (in Megabytes): - 4168.911 equivalent memory usage for states (stored*(State-vector + overhead)) - 3314.050 actual memory usage for states (compression: 79.49%) - state-vector as stored = 64 byte + 28 byte overhead - 512.000 memory used for hash table (-w26) - 457.764 memory used for DFS stack (-m10000000) - 1.910 memory lost to fragmentation - 4281.904 total actual memory usage - -unreached in proctype urcu_reader - line 272, "pan.___", state 30, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 52, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 61, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 77, "(1)" - line 253, "pan.___", state 85, "(1)" - line 257, "pan.___", state 97, "(1)" - line 261, "pan.___", state 105, "(1)" - line 411, "pan.___", state 131, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 163, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 177, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 195, "(1)" - line 257, "pan.___", state 215, "(1)" - line 261, "pan.___", state 223, "(1)" - line 691, "pan.___", state 242, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 411, "pan.___", state 249, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 281, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 295, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 313, "(1)" - line 257, "pan.___", state 333, "(1)" - line 261, "pan.___", state 341, "(1)" - line 411, "pan.___", state 360, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 392, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 406, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 424, "(1)" - line 257, "pan.___", state 444, "(1)" - line 261, "pan.___", state 452, "(1)" - line 411, "pan.___", state 473, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 475, "(1)" - line 411, "pan.___", state 476, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 476, "else" - line 411, "pan.___", state 479, "(1)" - line 415, "pan.___", state 487, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 489, "(1)" - line 415, "pan.___", state 490, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 490, "else" - line 415, "pan.___", state 493, "(1)" - line 415, "pan.___", state 494, "(1)" - line 415, "pan.___", state 494, "(1)" - line 413, "pan.___", state 499, "((i<1))" - line 413, "pan.___", state 499, "((i>=1))" - line 420, "pan.___", state 505, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 507, "(1)" - line 420, "pan.___", state 508, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 508, "else" - line 420, "pan.___", state 511, "(1)" - line 420, "pan.___", state 512, "(1)" - line 420, "pan.___", state 512, "(1)" - line 424, "pan.___", state 519, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 521, "(1)" - line 424, "pan.___", state 522, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 522, "else" - line 424, "pan.___", state 525, "(1)" - line 424, "pan.___", state 526, "(1)" - line 424, "pan.___", state 526, "(1)" - line 422, "pan.___", state 531, "((i<2))" - line 422, "pan.___", state 531, "((i>=2))" - line 249, "pan.___", state 537, "(1)" - line 253, "pan.___", state 545, "(1)" - line 253, "pan.___", state 546, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 546, "else" - line 251, "pan.___", state 551, "((i<1))" - line 251, "pan.___", state 551, "((i>=1))" - line 257, "pan.___", state 557, "(1)" - line 257, "pan.___", state 558, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 558, "else" - line 261, "pan.___", state 565, "(1)" - line 261, "pan.___", state 566, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 566, "else" - line 259, "pan.___", state 571, "((i<2))" - line 259, "pan.___", state 571, "((i>=2))" - line 266, "pan.___", state 575, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 575, "else" - line 431, "pan.___", state 577, "(1)" - line 431, "pan.___", state 577, "(1)" - line 691, "pan.___", state 580, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 691, "pan.___", state 581, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 691, "pan.___", state 582, "(1)" - line 411, "pan.___", state 589, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 621, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 635, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 653, "(1)" - line 257, "pan.___", state 673, "(1)" - line 261, "pan.___", state 681, "(1)" - line 411, "pan.___", state 707, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 739, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 753, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 771, "(1)" - line 257, "pan.___", state 791, "(1)" - line 261, "pan.___", state 799, "(1)" - line 411, "pan.___", state 818, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 820, "(1)" - line 411, "pan.___", state 821, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 821, "else" - line 411, "pan.___", state 824, "(1)" - line 415, "pan.___", state 832, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 834, "(1)" - line 415, "pan.___", state 835, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 835, "else" - line 415, "pan.___", state 838, "(1)" - line 415, "pan.___", state 839, "(1)" - line 415, "pan.___", state 839, "(1)" - line 413, "pan.___", state 844, "((i<1))" - line 413, "pan.___", state 844, "((i>=1))" - line 420, "pan.___", state 850, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 852, "(1)" - line 420, "pan.___", state 853, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 853, "else" - line 420, "pan.___", state 856, "(1)" - line 420, "pan.___", state 857, "(1)" - line 420, "pan.___", state 857, "(1)" - line 424, "pan.___", state 864, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 866, "(1)" - line 424, "pan.___", state 867, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 867, "else" - line 424, "pan.___", state 870, "(1)" - line 424, "pan.___", state 871, "(1)" - line 424, "pan.___", state 871, "(1)" - line 422, "pan.___", state 876, "((i<2))" - line 422, "pan.___", state 876, "((i>=2))" - line 249, "pan.___", state 882, "(1)" - line 253, "pan.___", state 890, "(1)" - line 253, "pan.___", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 891, "else" - line 251, "pan.___", state 896, "((i<1))" - line 251, "pan.___", state 896, "((i>=1))" - line 257, "pan.___", state 902, "(1)" - line 257, "pan.___", state 903, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 903, "else" - line 261, "pan.___", state 910, "(1)" - line 261, "pan.___", state 911, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 911, "else" - line 259, "pan.___", state 916, "((i<2))" - line 259, "pan.___", state 916, "((i>=2))" - line 266, "pan.___", state 920, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 920, "else" - line 431, "pan.___", state 922, "(1)" - line 431, "pan.___", state 922, "(1)" - line 699, "pan.___", state 926, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 411, "pan.___", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 963, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 977, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 995, "(1)" - line 257, "pan.___", state 1015, "(1)" - line 261, "pan.___", state 1023, "(1)" - line 411, "pan.___", state 1045, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1077, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1091, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1109, "(1)" - line 257, "pan.___", state 1129, "(1)" - line 261, "pan.___", state 1137, "(1)" - line 411, "pan.___", state 1160, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1192, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1206, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1224, "(1)" - line 257, "pan.___", state 1244, "(1)" - line 261, "pan.___", state 1252, "(1)" - line 411, "pan.___", state 1271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1303, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1317, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1335, "(1)" - line 257, "pan.___", state 1355, "(1)" - line 261, "pan.___", state 1363, "(1)" - line 411, "pan.___", state 1387, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1419, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1433, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1451, "(1)" - line 257, "pan.___", state 1471, "(1)" - line 261, "pan.___", state 1479, "(1)" - line 411, "pan.___", state 1498, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1530, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1544, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1562, "(1)" - line 257, "pan.___", state 1582, "(1)" - line 261, "pan.___", state 1590, "(1)" - line 411, "pan.___", state 1612, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1644, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1658, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1676, "(1)" - line 257, "pan.___", state 1696, "(1)" - line 261, "pan.___", state 1704, "(1)" - line 738, "pan.___", state 1723, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 411, "pan.___", state 1730, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1762, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1776, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1794, "(1)" - line 257, "pan.___", state 1814, "(1)" - line 261, "pan.___", state 1822, "(1)" - line 411, "pan.___", state 1841, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1873, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1887, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1905, "(1)" - line 257, "pan.___", state 1925, "(1)" - line 261, "pan.___", state 1933, "(1)" - line 411, "pan.___", state 1954, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 1956, "(1)" - line 411, "pan.___", state 1957, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 1957, "else" - line 411, "pan.___", state 1960, "(1)" - line 415, "pan.___", state 1968, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1970, "(1)" - line 415, "pan.___", state 1971, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 1971, "else" - line 415, "pan.___", state 1974, "(1)" - line 415, "pan.___", state 1975, "(1)" - line 415, "pan.___", state 1975, "(1)" - line 413, "pan.___", state 1980, "((i<1))" - line 413, "pan.___", state 1980, "((i>=1))" - line 420, "pan.___", state 1986, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1988, "(1)" - line 420, "pan.___", state 1989, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 1989, "else" - line 420, "pan.___", state 1992, "(1)" - line 420, "pan.___", state 1993, "(1)" - line 420, "pan.___", state 1993, "(1)" - line 424, "pan.___", state 2000, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2002, "(1)" - line 424, "pan.___", state 2003, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 2003, "else" - line 424, "pan.___", state 2006, "(1)" - line 424, "pan.___", state 2007, "(1)" - line 424, "pan.___", state 2007, "(1)" - line 422, "pan.___", state 2012, "((i<2))" - line 422, "pan.___", state 2012, "((i>=2))" - line 249, "pan.___", state 2018, "(1)" - line 253, "pan.___", state 2026, "(1)" - line 253, "pan.___", state 2027, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 2027, "else" - line 251, "pan.___", state 2032, "((i<1))" - line 251, "pan.___", state 2032, "((i>=1))" - line 257, "pan.___", state 2038, "(1)" - line 257, "pan.___", state 2039, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 2039, "else" - line 261, "pan.___", state 2046, "(1)" - line 261, "pan.___", state 2047, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 2047, "else" - line 259, "pan.___", state 2052, "((i<2))" - line 259, "pan.___", state 2052, "((i>=2))" - line 266, "pan.___", state 2056, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 2056, "else" - line 431, "pan.___", state 2058, "(1)" - line 431, "pan.___", state 2058, "(1)" - line 738, "pan.___", state 2061, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 738, "pan.___", state 2062, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 738, "pan.___", state 2063, "(1)" - line 411, "pan.___", state 2070, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2102, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2116, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2134, "(1)" - line 257, "pan.___", state 2154, "(1)" - line 261, "pan.___", state 2162, "(1)" - line 411, "pan.___", state 2187, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2219, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2233, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2251, "(1)" - line 257, "pan.___", state 2271, "(1)" - line 261, "pan.___", state 2279, "(1)" - line 411, "pan.___", state 2298, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2330, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2344, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2362, "(1)" - line 257, "pan.___", state 2382, "(1)" - line 261, "pan.___", state 2390, "(1)" - line 249, "pan.___", state 2421, "(1)" - line 257, "pan.___", state 2441, "(1)" - line 261, "pan.___", state 2449, "(1)" - line 249, "pan.___", state 2464, "(1)" - line 257, "pan.___", state 2484, "(1)" - line 261, "pan.___", state 2492, "(1)" - line 898, "pan.___", state 2509, "-end-" - (221 of 2509 states) -unreached in proctype urcu_writer - line 411, "pan.___", state 22, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 36, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 54, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 249, "pan.___", state 86, "(1)" - line 253, "pan.___", state 94, "(1)" - line 257, "pan.___", state 106, "(1)" - line 272, "pan.___", state 135, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 144, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 157, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 211, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 229, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 243, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 261, "(1)" - line 253, "pan.___", state 269, "(1)" - line 257, "pan.___", state 281, "(1)" - line 261, "pan.___", state 289, "(1)" - line 415, "pan.___", state 324, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 342, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 356, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 382, "(1)" - line 257, "pan.___", state 394, "(1)" - line 261, "pan.___", state 402, "(1)" - line 411, "pan.___", state 430, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 444, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 462, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 476, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 494, "(1)" - line 253, "pan.___", state 502, "(1)" - line 257, "pan.___", state 514, "(1)" - line 261, "pan.___", state 522, "(1)" - line 411, "pan.___", state 541, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 543, "(1)" - line 411, "pan.___", state 544, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 544, "else" - line 411, "pan.___", state 547, "(1)" - line 415, "pan.___", state 555, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 557, "(1)" - line 415, "pan.___", state 558, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 558, "else" - line 415, "pan.___", state 561, "(1)" - line 415, "pan.___", state 562, "(1)" - line 415, "pan.___", state 562, "(1)" - line 413, "pan.___", state 567, "((i<1))" - line 413, "pan.___", state 567, "((i>=1))" - line 420, "pan.___", state 573, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 575, "(1)" - line 420, "pan.___", state 576, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 576, "else" - line 420, "pan.___", state 579, "(1)" - line 420, "pan.___", state 580, "(1)" - line 420, "pan.___", state 580, "(1)" - line 424, "pan.___", state 587, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 589, "(1)" - line 424, "pan.___", state 590, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 590, "else" - line 424, "pan.___", state 593, "(1)" - line 424, "pan.___", state 594, "(1)" - line 424, "pan.___", state 594, "(1)" - line 422, "pan.___", state 599, "((i<2))" - line 422, "pan.___", state 599, "((i>=2))" - line 249, "pan.___", state 605, "(1)" - line 253, "pan.___", state 613, "(1)" - line 253, "pan.___", state 614, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 614, "else" - line 251, "pan.___", state 619, "((i<1))" - line 251, "pan.___", state 619, "((i>=1))" - line 257, "pan.___", state 625, "(1)" - line 257, "pan.___", state 626, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 626, "else" - line 261, "pan.___", state 633, "(1)" - line 261, "pan.___", state 634, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 634, "else" - line 259, "pan.___", state 639, "((i<2))" - line 259, "pan.___", state 639, "((i>=2))" - line 266, "pan.___", state 643, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 643, "else" - line 431, "pan.___", state 645, "(1)" - line 431, "pan.___", state 645, "(1)" - line 1117, "pan.___", state 649, "_proc_urcu_writer = (_proc_urcu_writer|(1<<10))" - line 411, "pan.___", state 654, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 656, "(1)" - line 411, "pan.___", state 657, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 657, "else" - line 411, "pan.___", state 660, "(1)" - line 415, "pan.___", state 668, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 670, "(1)" - line 415, "pan.___", state 671, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 671, "else" - line 415, "pan.___", state 674, "(1)" - line 415, "pan.___", state 675, "(1)" - line 415, "pan.___", state 675, "(1)" - line 413, "pan.___", state 680, "((i<1))" - line 413, "pan.___", state 680, "((i>=1))" - line 420, "pan.___", state 686, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 688, "(1)" - line 420, "pan.___", state 689, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 689, "else" - line 420, "pan.___", state 692, "(1)" - line 420, "pan.___", state 693, "(1)" - line 420, "pan.___", state 693, "(1)" - line 424, "pan.___", state 700, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 702, "(1)" - line 424, "pan.___", state 703, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 703, "else" - line 424, "pan.___", state 706, "(1)" - line 424, "pan.___", state 707, "(1)" - line 424, "pan.___", state 707, "(1)" - line 422, "pan.___", state 712, "((i<2))" - line 422, "pan.___", state 712, "((i>=2))" - line 249, "pan.___", state 718, "(1)" - line 253, "pan.___", state 726, "(1)" - line 253, "pan.___", state 727, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 727, "else" - line 251, "pan.___", state 732, "((i<1))" - line 251, "pan.___", state 732, "((i>=1))" - line 257, "pan.___", state 738, "(1)" - line 257, "pan.___", state 739, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 739, "else" - line 261, "pan.___", state 746, "(1)" - line 261, "pan.___", state 747, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 747, "else" - line 259, "pan.___", state 752, "((i<2))" - line 259, "pan.___", state 752, "((i>=2))" - line 266, "pan.___", state 756, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 756, "else" - line 431, "pan.___", state 758, "(1)" - line 431, "pan.___", state 758, "(1)" - line 1133, "pan.___", state 763, "_proc_urcu_writer = (_proc_urcu_writer|(1<<11))" - line 1128, "pan.___", state 764, "(((tmp2&((1<<7)-1))&&((tmp2^0)&(1<<7))))" - line 1128, "pan.___", state 764, "else" - line 1153, "pan.___", state 768, "_proc_urcu_writer = (_proc_urcu_writer&~(((1<<12)|(1<<11))))" - line 272, "pan.___", state 799, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 808, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 823, "(1)" - line 284, "pan.___", state 830, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 846, "(1)" - line 253, "pan.___", state 854, "(1)" - line 257, "pan.___", state 866, "(1)" - line 261, "pan.___", state 874, "(1)" - line 272, "pan.___", state 905, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 914, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 927, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 936, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 952, "(1)" - line 253, "pan.___", state 960, "(1)" - line 257, "pan.___", state 972, "(1)" - line 261, "pan.___", state 980, "(1)" - line 276, "pan.___", state 1006, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1019, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1028, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1044, "(1)" - line 253, "pan.___", state 1052, "(1)" - line 257, "pan.___", state 1064, "(1)" - line 261, "pan.___", state 1072, "(1)" - line 272, "pan.___", state 1103, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1112, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1125, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1134, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1150, "(1)" - line 253, "pan.___", state 1158, "(1)" - line 257, "pan.___", state 1170, "(1)" - line 261, "pan.___", state 1178, "(1)" - line 272, "pan.___", state 1195, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 1197, "(1)" - line 276, "pan.___", state 1204, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1206, "(1)" - line 276, "pan.___", state 1207, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 1207, "else" - line 274, "pan.___", state 1212, "((i<1))" - line 274, "pan.___", state 1212, "((i>=1))" - line 280, "pan.___", state 1217, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1219, "(1)" - line 280, "pan.___", state 1220, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 1220, "else" - line 284, "pan.___", state 1226, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1228, "(1)" - line 284, "pan.___", state 1229, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 1229, "else" - line 282, "pan.___", state 1234, "((i<2))" - line 282, "pan.___", state 1234, "((i>=2))" - line 249, "pan.___", state 1242, "(1)" - line 253, "pan.___", state 1250, "(1)" - line 253, "pan.___", state 1251, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 1251, "else" - line 251, "pan.___", state 1256, "((i<1))" - line 251, "pan.___", state 1256, "((i>=1))" - line 257, "pan.___", state 1262, "(1)" - line 257, "pan.___", state 1263, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 1263, "else" - line 261, "pan.___", state 1270, "(1)" - line 261, "pan.___", state 1271, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 1271, "else" - line 266, "pan.___", state 1280, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 1280, "else" - line 1229, "pan.___", state 1283, "i = 0" - line 1229, "pan.___", state 1285, "reader_barrier = 1" - line 1229, "pan.___", state 1296, "((i<1))" - line 1229, "pan.___", state 1296, "((i>=1))" - line 272, "pan.___", state 1301, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 1303, "(1)" - line 276, "pan.___", state 1310, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1312, "(1)" - line 276, "pan.___", state 1313, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 1313, "else" - line 274, "pan.___", state 1318, "((i<1))" - line 274, "pan.___", state 1318, "((i>=1))" - line 280, "pan.___", state 1323, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1325, "(1)" - line 280, "pan.___", state 1326, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 1326, "else" - line 284, "pan.___", state 1332, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1334, "(1)" - line 284, "pan.___", state 1335, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 1335, "else" - line 282, "pan.___", state 1340, "((i<2))" - line 282, "pan.___", state 1340, "((i>=2))" - line 249, "pan.___", state 1348, "(1)" - line 253, "pan.___", state 1356, "(1)" - line 253, "pan.___", state 1357, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 1357, "else" - line 251, "pan.___", state 1362, "((i<1))" - line 251, "pan.___", state 1362, "((i>=1))" - line 257, "pan.___", state 1368, "(1)" - line 257, "pan.___", state 1369, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 1369, "else" - line 261, "pan.___", state 1376, "(1)" - line 261, "pan.___", state 1377, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 1377, "else" - line 266, "pan.___", state 1386, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 1386, "else" - line 299, "pan.___", state 1388, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 1388, "else" - line 1229, "pan.___", state 1389, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 1229, "pan.___", state 1389, "else" - line 276, "pan.___", state 1402, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1415, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1424, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1440, "(1)" - line 253, "pan.___", state 1448, "(1)" - line 257, "pan.___", state 1460, "(1)" - line 261, "pan.___", state 1468, "(1)" - line 272, "pan.___", state 1499, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1508, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1521, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1530, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1546, "(1)" - line 253, "pan.___", state 1554, "(1)" - line 257, "pan.___", state 1566, "(1)" - line 261, "pan.___", state 1574, "(1)" - line 1237, "pan.___", state 1590, "-end-" - (195 of 1590 states) -unreached in proctype :init: - line 1248, "pan.___", state 9, "((j<2))" - line 1248, "pan.___", state 9, "((j>=2))" - line 1249, "pan.___", state 20, "((j<2))" - line 1249, "pan.___", state 20, "((j>=2))" - line 1254, "pan.___", state 33, "((j<2))" - line 1254, "pan.___", state 33, "((j>=2))" - line 1252, "pan.___", state 43, "((i<1))" - line 1252, "pan.___", state 43, "((i>=1))" - line 1262, "pan.___", state 54, "((j<2))" - line 1262, "pan.___", state 54, "((j>=2))" - line 1266, "pan.___", state 67, "((j<2))" - line 1266, "pan.___", state 67, "((j>=2))" - (6 of 78 states) -unreached in proctype :never: - line 1300, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 982 seconds -pan: rate 38391.44 states/second -pan: avg transition delay 2.6765e-06 usec -cp .input.spin urcu_free_single_flip.spin.input -cp .input.spin.trail urcu_free_single_flip.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi' diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_single_flip.spin.input b/formal-model/urcu-controldataflow-intel-ipi/urcu_free_single_flip.spin.input deleted file mode 100644 index 6e6560d..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_single_flip.spin.input +++ /dev/null @@ -1,1273 +0,0 @@ -#define SINGLE_FLIP - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_single_flip.spin.input.trail b/formal-model/urcu-controldataflow-intel-ipi/urcu_free_single_flip.spin.input.trail deleted file mode 100644 index 05857aa..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_free_single_flip.spin.input.trail +++ /dev/null @@ -1,1301 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:4179 -2:3:4099 -3:3:4102 -4:3:4102 -5:3:4105 -6:3:4113 -7:3:4113 -8:3:4116 -9:3:4122 -10:3:4126 -11:3:4126 -12:3:4129 -13:3:4139 -14:3:4147 -15:3:4147 -16:3:4150 -17:3:4156 -18:3:4160 -19:3:4160 -20:3:4163 -21:3:4169 -22:3:4173 -23:3:4174 -24:0:4179 -25:3:4176 -26:0:4179 -27:2:2511 -28:0:4179 -29:2:2517 -30:0:4179 -31:2:2518 -32:0:4179 -33:2:2520 -34:0:4179 -35:2:2521 -36:0:4179 -37:2:2522 -38:0:4179 -39:2:2523 -40:0:4179 -41:2:2524 -42:0:4179 -43:2:2525 -44:0:4179 -45:2:2526 -46:2:2527 -47:2:2531 -48:2:2532 -49:2:2540 -50:2:2541 -51:2:2545 -52:2:2546 -53:2:2554 -54:2:2559 -55:2:2563 -56:2:2564 -57:2:2572 -58:2:2573 -59:2:2577 -60:2:2578 -61:2:2572 -62:2:2573 -63:2:2577 -64:2:2578 -65:2:2586 -66:2:2591 -67:2:2598 -68:2:2599 -69:2:2606 -70:2:2611 -71:2:2618 -72:2:2619 -73:2:2618 -74:2:2619 -75:2:2626 -76:2:2636 -77:0:4179 -78:2:2525 -79:0:4179 -80:2:2640 -81:2:2644 -82:2:2645 -83:2:2649 -84:2:2653 -85:2:2654 -86:2:2658 -87:2:2666 -88:2:2667 -89:2:2671 -90:2:2675 -91:2:2676 -92:2:2671 -93:2:2672 -94:2:2680 -95:0:4179 -96:2:2525 -97:0:4179 -98:2:2688 -99:2:2689 -100:2:2690 -101:0:4179 -102:2:2525 -103:0:4179 -104:2:2695 -105:0:4179 -106:2:3308 -107:2:3309 -108:2:3313 -109:2:3317 -110:2:3318 -111:2:3322 -112:2:3327 -113:2:3335 -114:2:3339 -115:2:3340 -116:2:3335 -117:2:3339 -118:2:3340 -119:2:3344 -120:2:3351 -121:2:3358 -122:2:3359 -123:2:3366 -124:2:3371 -125:2:3378 -126:2:3379 -127:2:3378 -128:2:3379 -129:2:3386 -130:2:3390 -131:0:4179 -132:2:3395 -133:0:4179 -134:2:3396 -135:0:4179 -136:2:3397 -137:0:4179 -138:2:3398 -139:0:4179 -140:1:2 -141:0:4179 -142:2:3399 -143:0:4179 -144:1:8 -145:0:4179 -146:1:9 -147:0:4179 -148:2:3398 -149:0:4179 -150:1:10 -151:0:4179 -152:2:3399 -153:0:4179 -154:1:11 -155:0:4179 -156:2:3398 -157:0:4179 -158:1:12 -159:0:4179 -160:2:3399 -161:0:4179 -162:1:13 -163:0:4179 -164:2:3398 -165:0:4179 -166:1:14 -167:0:4179 -168:2:3399 -169:0:4179 -170:1:15 -171:0:4179 -172:1:16 -173:0:4179 -174:2:3398 -175:0:4179 -176:1:17 -177:0:4179 -178:2:3399 -179:0:4179 -180:1:26 -181:0:4179 -182:2:3398 -183:0:4179 -184:1:30 -185:1:31 -186:1:35 -187:1:39 -188:1:40 -189:1:44 -190:1:52 -191:1:53 -192:1:57 -193:1:61 -194:1:62 -195:1:57 -196:1:61 -197:1:62 -198:1:66 -199:1:73 -200:1:80 -201:1:81 -202:1:88 -203:1:93 -204:1:100 -205:1:101 -206:1:100 -207:1:101 -208:1:108 -209:1:112 -210:0:4179 -211:2:3399 -212:0:4179 -213:1:117 -214:0:4179 -215:2:3400 -216:0:4179 -217:2:3405 -218:0:4179 -219:2:3406 -220:0:4179 -221:2:3414 -222:2:3415 -223:2:3419 -224:2:3423 -225:2:3424 -226:2:3428 -227:2:3436 -228:2:3437 -229:2:3441 -230:2:3445 -231:2:3446 -232:2:3441 -233:2:3445 -234:2:3446 -235:2:3450 -236:2:3457 -237:2:3464 -238:2:3465 -239:2:3472 -240:2:3477 -241:2:3484 -242:2:3485 -243:2:3484 -244:2:3485 -245:2:3492 -246:2:3496 -247:0:4179 -248:2:2697 -249:2:3289 -250:0:4179 -251:2:2525 -252:0:4179 -253:2:2698 -254:0:4179 -255:2:2525 -256:0:4179 -257:2:2701 -258:2:2702 -259:2:2706 -260:2:2707 -261:2:2715 -262:2:2716 -263:2:2720 -264:2:2721 -265:2:2729 -266:2:2734 -267:2:2738 -268:2:2739 -269:2:2747 -270:2:2748 -271:2:2752 -272:2:2753 -273:2:2747 -274:2:2748 -275:2:2752 -276:2:2753 -277:2:2761 -278:2:2766 -279:2:2773 -280:2:2774 -281:2:2781 -282:2:2786 -283:2:2793 -284:2:2794 -285:2:2793 -286:2:2794 -287:2:2801 -288:2:2810 -289:0:4179 -290:2:2525 -291:0:4179 -292:2:2814 -293:2:2823 -294:2:2824 -295:2:2828 -296:2:2829 -297:2:2833 -298:2:2834 -299:2:2842 -300:2:2847 -301:2:2851 -302:2:2852 -303:2:2860 -304:2:2861 -305:2:2865 -306:2:2866 -307:2:2860 -308:2:2861 -309:2:2865 -310:2:2866 -311:2:2874 -312:2:2881 -313:2:2882 -314:2:2886 -315:2:2887 -316:2:2894 -317:2:2899 -318:2:2906 -319:2:2907 -320:2:2906 -321:2:2907 -322:2:2914 -323:2:2926 -324:2:2927 -325:0:4179 -326:2:2525 -327:0:4179 -328:2:3277 -329:0:4179 -330:1:118 -331:0:4179 -332:1:120 -333:0:4179 -334:1:19 -335:0:4179 -336:1:126 -337:1:127 -338:1:131 -339:1:132 -340:1:140 -341:1:141 -342:1:145 -343:1:146 -344:1:154 -345:1:159 -346:1:163 -347:1:164 -348:1:172 -349:1:173 -350:1:177 -351:1:178 -352:1:172 -353:1:173 -354:1:177 -355:1:178 -356:1:186 -357:1:191 -358:1:198 -359:1:199 -360:1:206 -361:1:211 -362:1:218 -363:1:219 -364:1:218 -365:1:219 -366:1:226 -367:0:4179 -368:1:15 -369:0:4179 -370:1:16 -371:0:4179 -372:1:17 -373:0:4179 -374:1:118 -375:0:4179 -376:1:120 -377:0:4179 -378:1:19 -379:0:4179 -380:1:237 -381:1:238 -382:0:4179 -383:1:15 -384:0:4179 -385:1:16 -386:0:4179 -387:1:17 -388:0:4179 -389:1:118 -390:0:4179 -391:1:120 -392:0:4179 -393:1:19 -394:0:4179 -395:1:244 -396:1:245 -397:1:249 -398:1:250 -399:1:258 -400:1:259 -401:1:263 -402:1:264 -403:1:272 -404:1:277 -405:1:281 -406:1:282 -407:1:290 -408:1:291 -409:1:295 -410:1:296 -411:1:290 -412:1:291 -413:1:295 -414:1:296 -415:1:304 -416:1:309 -417:1:316 -418:1:317 -419:1:324 -420:1:329 -421:1:336 -422:1:337 -423:1:336 -424:1:337 -425:1:344 -426:0:4179 -427:1:15 -428:0:4179 -429:1:16 -430:0:4179 -431:2:3899 -432:2:3907 -433:2:3911 -434:2:3912 -435:2:3916 -436:2:3924 -437:2:3925 -438:2:3929 -439:2:3933 -440:2:3934 -441:2:3929 -442:2:3933 -443:2:3934 -444:2:3938 -445:2:3945 -446:2:3952 -447:2:3953 -448:2:3960 -449:2:3965 -450:2:3972 -451:2:3973 -452:2:3972 -453:2:3973 -454:2:3980 -455:2:3984 -456:0:4179 -457:2:3989 -458:0:4179 -459:2:3990 -460:0:4179 -461:2:3991 -462:0:4179 -463:2:3992 -464:0:4179 -465:1:17 -466:0:4179 -467:2:3993 -468:0:4179 -469:1:26 -470:0:4179 -471:2:3992 -472:0:4179 -473:1:30 -474:1:31 -475:1:35 -476:1:39 -477:1:40 -478:1:44 -479:1:52 -480:1:53 -481:1:57 -482:1:61 -483:1:62 -484:1:57 -485:1:61 -486:1:62 -487:1:66 -488:1:73 -489:1:80 -490:1:81 -491:1:88 -492:1:93 -493:1:100 -494:1:101 -495:1:100 -496:1:101 -497:1:108 -498:1:112 -499:0:4179 -500:2:3993 -501:0:4179 -502:1:117 -503:0:4179 -504:2:3994 -505:0:4179 -506:2:3999 -507:0:4179 -508:2:4000 -509:0:4179 -510:2:4008 -511:2:4009 -512:2:4013 -513:2:4017 -514:2:4018 -515:2:4022 -516:2:4030 -517:2:4031 -518:2:4035 -519:2:4039 -520:2:4040 -521:2:4035 -522:2:4039 -523:2:4040 -524:2:4044 -525:2:4051 -526:2:4058 -527:2:4059 -528:2:4066 -529:2:4071 -530:2:4078 -531:2:4079 -532:2:4078 -533:2:4079 -534:2:4086 -535:2:4090 -536:0:4179 -537:2:3279 -538:2:3289 -539:0:4179 -540:2:2525 -541:0:4179 -542:2:3280 -543:2:3281 -544:0:4179 -545:2:2525 -546:0:4179 -547:2:3285 -548:0:4179 -549:2:3293 -550:0:4179 -551:2:2518 -552:0:4179 -553:2:2520 -554:0:4179 -555:2:2521 -556:0:4179 -557:2:2522 -558:0:4179 -559:2:2523 -560:0:4179 -561:2:2524 -562:0:4179 -563:2:2525 -564:0:4179 -565:2:2526 -566:2:2527 -567:2:2531 -568:2:2532 -569:2:2540 -570:2:2541 -571:2:2545 -572:2:2546 -573:2:2554 -574:2:2559 -575:2:2563 -576:2:2564 -577:2:2572 -578:2:2573 -579:2:2574 -580:2:2572 -581:2:2573 -582:2:2577 -583:2:2578 -584:2:2586 -585:2:2591 -586:2:2598 -587:2:2599 -588:2:2606 -589:2:2611 -590:2:2618 -591:2:2619 -592:2:2618 -593:2:2619 -594:2:2626 -595:2:2636 -596:0:4179 -597:2:2525 -598:0:4179 -599:2:2640 -600:2:2644 -601:2:2645 -602:2:2649 -603:2:2653 -604:2:2654 -605:2:2658 -606:2:2666 -607:2:2667 -608:2:2671 -609:2:2672 -610:2:2671 -611:2:2675 -612:2:2676 -613:2:2680 -614:0:4179 -615:2:2525 -616:0:4179 -617:2:2688 -618:2:2689 -619:2:2690 -620:0:4179 -621:2:2525 -622:0:4179 -623:2:2695 -624:0:4179 -625:1:118 -626:0:4179 -627:1:120 -628:0:4179 -629:1:19 -630:0:4179 -631:1:355 -632:1:356 -633:1:360 -634:1:361 -635:1:369 -636:1:370 -637:1:374 -638:1:375 -639:1:383 -640:1:388 -641:1:392 -642:1:393 -643:1:401 -644:1:402 -645:1:406 -646:1:407 -647:1:401 -648:1:402 -649:1:406 -650:1:407 -651:1:415 -652:1:420 -653:1:427 -654:1:428 -655:1:435 -656:1:440 -657:1:447 -658:1:448 -659:1:447 -660:1:448 -661:1:455 -662:1:464 -663:0:4179 -664:1:15 -665:0:4179 -666:1:16 -667:0:4179 -668:1:17 -669:0:4179 -670:1:118 -671:0:4179 -672:1:120 -673:0:4179 -674:1:19 -675:0:4179 -676:1:584 -677:1:585 -678:1:589 -679:1:590 -680:1:598 -681:1:599 -682:1:600 -683:1:612 -684:1:617 -685:1:621 -686:1:622 -687:1:630 -688:1:631 -689:1:635 -690:1:636 -691:1:630 -692:1:631 -693:1:635 -694:1:636 -695:1:644 -696:1:649 -697:1:656 -698:1:657 -699:1:664 -700:1:669 -701:1:676 -702:1:677 -703:1:676 -704:1:677 -705:1:684 -706:0:4179 -707:1:15 -708:0:4179 -709:1:16 -710:0:4179 -711:1:17 -712:0:4179 -713:1:118 -714:0:4179 -715:1:120 -716:0:4179 -717:1:19 -718:0:4179 -719:1:695 -720:1:698 -721:1:699 -722:0:4179 -723:1:15 -724:0:4179 -725:1:16 -726:0:4179 -727:1:17 -728:0:4179 -729:1:118 -730:0:4179 -731:1:120 -732:0:4179 -733:1:19 -734:0:4179 -735:1:702 -736:1:703 -737:1:707 -738:1:708 -739:1:716 -740:1:717 -741:1:721 -742:1:722 -743:1:730 -744:1:735 -745:1:739 -746:1:740 -747:1:748 -748:1:749 -749:1:753 -750:1:754 -751:1:748 -752:1:749 -753:1:753 -754:1:754 -755:1:762 -756:1:767 -757:1:774 -758:1:775 -759:1:782 -760:1:787 -761:1:794 -762:1:795 -763:1:794 -764:1:795 -765:1:802 -766:0:4179 -767:1:15 -768:0:4179 -769:1:16 -770:0:4179 -771:1:17 -772:0:4179 -773:1:118 -774:0:4179 -775:1:120 -776:0:4179 -777:1:19 -778:0:4179 -779:1:926 -780:1:927 -781:1:931 -782:1:932 -783:1:940 -784:1:941 -785:1:945 -786:1:946 -787:1:954 -788:1:959 -789:1:963 -790:1:964 -791:1:972 -792:1:973 -793:1:977 -794:1:978 -795:1:972 -796:1:973 -797:1:977 -798:1:978 -799:1:986 -800:1:991 -801:1:998 -802:1:999 -803:1:1006 -804:1:1011 -805:1:1018 -806:1:1019 -807:1:1018 -808:1:1019 -809:1:1026 -810:1:1035 -811:1:1039 -812:0:4179 -813:1:15 -814:0:4179 -815:1:16 -816:0:4179 -817:1:17 -818:0:4179 -819:1:118 -820:0:4179 -821:1:120 -822:0:4179 -823:1:19 -824:0:4179 -825:1:1040 -826:1:1041 -827:1:1045 -828:1:1046 -829:1:1054 -830:1:1055 -831:1:1056 -832:1:1068 -833:1:1073 -834:1:1077 -835:1:1078 -836:1:1086 -837:1:1087 -838:1:1091 -839:1:1092 -840:1:1086 -841:1:1087 -842:1:1091 -843:1:1092 -844:1:1100 -845:1:1105 -846:1:1112 -847:1:1113 -848:1:1120 -849:1:1125 -850:1:1132 -851:1:1133 -852:1:1132 -853:1:1133 -854:1:1140 -855:0:4179 -856:1:15 -857:0:4179 -858:1:16 -859:0:4179 -860:2:3308 -861:2:3309 -862:2:3313 -863:2:3317 -864:2:3318 -865:2:3322 -866:2:3327 -867:2:3335 -868:2:3339 -869:2:3340 -870:2:3335 -871:2:3339 -872:2:3340 -873:2:3344 -874:2:3351 -875:2:3358 -876:2:3359 -877:2:3366 -878:2:3371 -879:2:3378 -880:2:3379 -881:2:3378 -882:2:3379 -883:2:3386 -884:2:3390 -885:0:4179 -886:2:3395 -887:0:4179 -888:2:3396 -889:0:4179 -890:2:3397 -891:0:4179 -892:2:3398 -893:0:4179 -894:1:17 -895:0:4179 -896:2:3399 -897:0:4179 -898:1:26 -899:0:4179 -900:2:3398 -901:0:4179 -902:1:30 -903:1:31 -904:1:35 -905:1:39 -906:1:40 -907:1:44 -908:1:52 -909:1:53 -910:1:57 -911:1:61 -912:1:62 -913:1:57 -914:1:61 -915:1:62 -916:1:66 -917:1:73 -918:1:80 -919:1:81 -920:1:88 -921:1:93 -922:1:100 -923:1:101 -924:1:100 -925:1:101 -926:1:108 -927:1:112 -928:0:4179 -929:2:3399 -930:0:4179 -931:1:117 -932:0:4179 -933:2:3400 -934:0:4179 -935:2:3405 -936:0:4179 -937:2:3406 -938:0:4179 -939:2:3414 -940:2:3415 -941:2:3419 -942:2:3423 -943:2:3424 -944:2:3428 -945:2:3436 -946:2:3437 -947:2:3441 -948:2:3445 -949:2:3446 -950:2:3441 -951:2:3445 -952:2:3446 -953:2:3450 -954:2:3457 -955:2:3464 -956:2:3465 -957:2:3472 -958:2:3477 -959:2:3484 -960:2:3485 -961:2:3484 -962:2:3485 -963:2:3492 -964:2:3496 -965:0:4179 -966:2:2697 -967:2:3289 -968:0:4179 -969:2:2525 -970:0:4179 -971:2:2698 -972:0:4179 -973:2:2525 -974:0:4179 -975:2:2701 -976:2:2702 -977:2:2706 -978:2:2707 -979:2:2715 -980:2:2716 -981:2:2720 -982:2:2721 -983:2:2729 -984:2:2734 -985:2:2738 -986:2:2739 -987:2:2747 -988:2:2748 -989:2:2752 -990:2:2753 -991:2:2747 -992:2:2748 -993:2:2752 -994:2:2753 -995:2:2761 -996:2:2766 -997:2:2773 -998:2:2774 -999:2:2781 -1000:2:2786 -1001:2:2793 -1002:2:2794 -1003:2:2793 -1004:2:2794 -1005:2:2801 -1006:2:2810 -1007:0:4179 -1008:2:2525 -1009:0:4179 -1010:2:2814 -1011:2:2815 -1012:2:2816 -1013:2:2828 -1014:2:2829 -1015:2:2833 -1016:2:2834 -1017:2:2842 -1018:2:2847 -1019:2:2851 -1020:2:2852 -1021:2:2860 -1022:2:2861 -1023:2:2865 -1024:2:2866 -1025:2:2860 -1026:2:2861 -1027:2:2865 -1028:2:2866 -1029:2:2874 -1030:2:2879 -1031:2:2886 -1032:2:2887 -1033:2:2894 -1034:2:2899 -1035:2:2906 -1036:2:2907 -1037:2:2906 -1038:2:2907 -1039:2:2914 -1040:2:2926 -1041:2:2927 -1042:0:4179 -1043:2:2525 -1044:0:4179 -1045:2:3277 -1046:0:4179 -1047:2:3902 -1048:2:3903 -1049:2:3907 -1050:2:3911 -1051:2:3912 -1052:2:3916 -1053:2:3924 -1054:2:3925 -1055:2:3929 -1056:2:3933 -1057:2:3934 -1058:2:3929 -1059:2:3933 -1060:2:3934 -1061:2:3938 -1062:2:3945 -1063:2:3952 -1064:2:3953 -1065:2:3960 -1066:2:3965 -1067:2:3972 -1068:2:3973 -1069:2:3972 -1070:2:3973 -1071:2:3980 -1072:2:3984 -1073:0:4179 -1074:2:3989 -1075:0:4179 -1076:2:3990 -1077:0:4179 -1078:2:3991 -1079:0:4179 -1080:2:3992 -1081:0:4179 -1082:1:26 -1083:0:4179 -1084:2:3993 -1085:0:4179 -1086:1:30 -1087:1:31 -1088:1:35 -1089:1:39 -1090:1:40 -1091:1:44 -1092:1:52 -1093:1:53 -1094:1:57 -1095:1:61 -1096:1:62 -1097:1:57 -1098:1:61 -1099:1:62 -1100:1:66 -1101:1:73 -1102:1:80 -1103:1:81 -1104:1:88 -1105:1:93 -1106:1:100 -1107:1:101 -1108:1:100 -1109:1:101 -1110:1:108 -1111:1:112 -1112:0:4179 -1113:2:3992 -1114:0:4179 -1115:1:117 -1116:0:4179 -1117:2:3993 -1118:0:4179 -1119:2:3994 -1120:0:4179 -1121:2:3999 -1122:0:4179 -1123:2:4000 -1124:0:4179 -1125:2:4008 -1126:2:4009 -1127:2:4013 -1128:2:4017 -1129:2:4018 -1130:2:4022 -1131:2:4030 -1132:2:4031 -1133:2:4035 -1134:2:4039 -1135:2:4040 -1136:2:4035 -1137:2:4039 -1138:2:4040 -1139:2:4044 -1140:2:4051 -1141:2:4058 -1142:2:4059 -1143:2:4066 -1144:2:4071 -1145:2:4078 -1146:2:4079 -1147:2:4078 -1148:2:4079 -1149:2:4086 -1150:2:4090 -1151:0:4179 -1152:2:3279 -1153:2:3289 -1154:0:4179 -1155:2:2525 -1156:0:4179 -1157:2:3280 -1158:2:3281 -1159:0:4179 -1160:2:2525 -1161:0:4179 -1162:2:3285 -1163:0:4179 -1164:2:3293 -1165:0:4179 -1166:2:2518 -1167:0:4179 -1168:2:2520 -1169:0:4179 -1170:2:2521 -1171:0:4179 -1172:2:2522 -1173:0:4179 -1174:2:2523 -1175:0:4179 -1176:2:2524 -1177:0:4179 -1178:2:2525 -1179:0:4179 -1180:2:2526 -1181:2:2527 -1182:2:2531 -1183:2:2532 -1184:2:2540 -1185:2:2541 -1186:2:2545 -1187:2:2546 -1188:2:2554 -1189:2:2559 -1190:2:2563 -1191:2:2564 -1192:2:2572 -1193:2:2573 -1194:2:2577 -1195:2:2578 -1196:2:2572 -1197:2:2573 -1198:2:2574 -1199:2:2586 -1200:2:2591 -1201:2:2598 -1202:2:2599 -1203:2:2606 -1204:2:2611 -1205:2:2618 -1206:2:2619 -1207:2:2618 -1208:2:2619 -1209:2:2626 -1210:2:2636 -1211:0:4179 -1212:2:2525 -1213:0:4179 -1214:1:118 -1215:0:4179 -1216:1:120 -1217:0:4179 -1218:1:19 -1219:0:4179 -1220:1:1151 -1221:0:4179 -1222:1:2417 -1223:1:2424 -1224:1:2425 -1225:1:2432 -1226:1:2437 -1227:1:2444 -1228:1:2445 -1229:1:2444 -1230:1:2445 -1231:1:2452 -1232:1:2456 -1233:0:4179 -1234:2:2640 -1235:2:2644 -1236:2:2645 -1237:2:2649 -1238:2:2653 -1239:2:2654 -1240:2:2658 -1241:2:2666 -1242:2:2667 -1243:2:2671 -1244:2:2675 -1245:2:2676 -1246:2:2671 -1247:2:2672 -1248:2:2680 -1249:0:4179 -1250:2:2525 -1251:0:4179 -1252:2:2688 -1253:2:2689 -1254:2:2690 -1255:0:4179 -1256:2:2525 -1257:0:4179 -1258:2:2695 -1259:0:4179 -1260:2:3308 -1261:2:3309 -1262:2:3313 -1263:2:3317 -1264:2:3318 -1265:2:3322 -1266:2:3327 -1267:2:3335 -1268:2:3339 -1269:2:3340 -1270:2:3335 -1271:2:3339 -1272:2:3340 -1273:2:3344 -1274:2:3351 -1275:2:3358 -1276:2:3359 -1277:2:3366 -1278:2:3371 -1279:2:3378 -1280:2:3379 -1281:2:3378 -1282:2:3379 -1283:2:3386 -1284:2:3390 -1285:0:4179 -1286:2:3395 -1287:0:4179 -1288:2:3396 -1289:0:4179 -1290:2:3397 -1291:0:4179 -1292:2:3398 -1293:0:4179 -1294:1:1153 -1295:1:1154 -1296:0:4177 -1297:2:3399 -1298:0:4183 -1299:1:2145 diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_progress.ltl b/formal-model/urcu-controldataflow-intel-ipi/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_progress_reader.define b/formal-model/urcu-controldataflow-intel-ipi/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_progress_writer.define b/formal-model/urcu-controldataflow-intel-ipi/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_progress_writer.log b/formal-model/urcu-controldataflow-intel-ipi/urcu_progress_writer.log deleted file mode 100644 index e238402..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_progress_writer.log +++ /dev/null @@ -1,256 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1295) -depth 23: Claim reached state 9 (line 1300) -depth 51: Claim reached state 9 (line 1299) -Depth= 7071 States= 1e+06 Transitions= 1.16e+07 Memory= 514.397 t= 30.7 R= 3e+04 -Depth= 7071 States= 2e+06 Transitions= 2.31e+07 Memory= 566.252 t= 61.5 R= 3e+04 -Depth= 7071 States= 3e+06 Transitions= 3.43e+07 Memory= 617.326 t= 91.6 R= 3e+04 -pan: resizing hashtable to -w22.. done -Depth= 8815 States= 4e+06 Transitions= 4.57e+07 Memory= 696.592 t= 122 R= 3e+04 -Depth= 8815 States= 5e+06 Transitions= 5.73e+07 Memory= 743.955 t= 153 R= 3e+04 -Depth= 8815 States= 6e+06 Transitions= 7.04e+07 Memory= 797.373 t= 190 R= 3e+04 -Depth= 8815 States= 7e+06 Transitions= 8.38e+07 Memory= 847.861 t= 226 R= 3e+04 -Depth= 8815 States= 8e+06 Transitions= 9.59e+07 Memory= 898.057 t= 259 R= 3e+04 -Depth= 8815 States= 9e+06 Transitions= 1.08e+08 Memory= 948.350 t= 293 R= 3e+04 -pan: resizing hashtable to -w24.. done -Depth= 8815 States= 1e+07 Transitions= 1.29e+08 Memory= 1123.615 t= 352 R= 3e+04 -Depth= 8815 States= 1.1e+07 Transitions= 1.41e+08 Memory= 1175.764 t= 385 R= 3e+04 -Depth= 8815 States= 1.2e+07 Transitions= 1.53e+08 Memory= 1225.471 t= 417 R= 3e+04 -Depth= 8815 States= 1.3e+07 Transitions= 1.64e+08 Memory= 1276.057 t= 447 R= 3e+04 -Depth= 8815 States= 1.4e+07 Transitions= 1.75e+08 Memory= 1330.451 t= 477 R= 3e+04 -Depth= 8815 States= 1.5e+07 Transitions= 1.87e+08 Memory= 1379.670 t= 508 R= 3e+04 -Depth= 8815 States= 1.6e+07 Transitions= 1.98e+08 Memory= 1429.865 t= 538 R= 3e+04 -Depth= 8815 States= 1.7e+07 Transitions= 2.09e+08 Memory= 1484.748 t= 568 R= 3e+04 -Depth= 8815 States= 1.8e+07 Transitions= 2.23e+08 Memory= 1529.670 t= 606 R= 3e+04 -Depth= 8815 States= 1.9e+07 Transitions= 2.36e+08 Memory= 1579.377 t= 643 R= 3e+04 -Depth= 8815 States= 2e+07 Transitions= 2.57e+08 Memory= 1629.279 t= 701 R= 3e+04 -Depth= 8815 States= 2.1e+07 Transitions= 2.93e+08 Memory= 1686.115 t= 807 R= 3e+04 -Depth= 9016 States= 2.2e+07 Transitions= 3.11e+08 Memory= 1741.193 t= 858 R= 3e+04 -Depth= 9016 States= 2.3e+07 Transitions= 3.25e+08 Memory= 1793.733 t= 897 R= 3e+04 -Depth= 9016 States= 2.4e+07 Transitions= 3.45e+08 Memory= 1846.272 t= 954 R= 3e+04 -Depth= 9016 States= 2.5e+07 Transitions= 3.67e+08 Memory= 1897.639 t= 1.02e+03 R= 2e+04 -Depth= 9016 States= 2.6e+07 Transitions= 3.84e+08 Memory= 1951.447 t= 1.06e+03 R= 2e+04 -Depth= 9016 States= 2.7e+07 Transitions= 4.07e+08 Memory= 2004.670 t= 1.13e+03 R= 2e+04 -Depth= 9016 States= 2.8e+07 Transitions= 4.29e+08 Memory= 2050.764 t= 1.19e+03 R= 2e+04 -Depth= 9016 States= 2.9e+07 Transitions= 4.48e+08 Memory= 2100.373 t= 1.25e+03 R= 2e+04 -Depth= 9016 States= 3e+07 Transitions= 4.66e+08 Memory= 2151.545 t= 1.3e+03 R= 2e+04 -Depth= 9016 States= 3.1e+07 Transitions= 4.86e+08 Memory= 2201.838 t= 1.36e+03 R= 2e+04 -Depth= 9016 States= 3.2e+07 Transitions= 5.1e+08 Memory= 2250.861 t= 1.43e+03 R= 2e+04 -Depth= 9016 States= 3.3e+07 Transitions= 5.29e+08 Memory= 2299.983 t= 1.48e+03 R= 2e+04 -Depth= 9016 States= 3.4e+07 Transitions= 5.47e+08 Memory= 2351.057 t= 1.53e+03 R= 2e+04 -pan: resizing hashtable to -w26.. done -Depth= 9016 States= 3.5e+07 Transitions= 5.69e+08 Memory= 2896.943 t= 1.6e+03 R= 2e+04 -Depth= 9016 States= 3.6e+07 Transitions= 5.95e+08 Memory= 2945.186 t= 1.67e+03 R= 2e+04 -Depth= 9016 States= 3.7e+07 Transitions= 6.12e+08 Memory= 2995.576 t= 1.72e+03 R= 2e+04 -Depth= 9016 States= 3.8e+07 Transitions= 6.29e+08 Memory= 3042.256 t= 1.77e+03 R= 2e+04 -Depth= 9016 States= 3.9e+07 Transitions= 6.42e+08 Memory= 3093.135 t= 1.8e+03 R= 2e+04 -Depth= 9016 States= 4e+07 Transitions= 6.56e+08 Memory= 3146.651 t= 1.84e+03 R= 2e+04 -Depth= 9016 States= 4.1e+07 Transitions= 6.69e+08 Memory= 3202.901 t= 1.88e+03 R= 2e+04 -Depth= 9016 States= 4.2e+07 Transitions= 6.82e+08 Memory= 3254.951 t= 1.91e+03 R= 2e+04 -Depth= 9016 States= 4.3e+07 Transitions= 6.95e+08 Memory= 3309.053 t= 1.95e+03 R= 2e+04 -Depth= 9016 States= 4.4e+07 Transitions= 7.07e+08 Memory= 3360.615 t= 1.98e+03 R= 2e+04 -Depth= 9016 States= 4.5e+07 Transitions= 7.28e+08 Memory= 3410.713 t= 2.04e+03 R= 2e+04 -Depth= 9016 States= 4.6e+07 Transitions= 7.63e+08 Memory= 3466.963 t= 2.14e+03 R= 2e+04 -Depth= 9016 States= 4.7e+07 Transitions= 7.99e+08 Memory= 3532.295 t= 2.25e+03 R= 2e+04 -Depth= 9016 States= 4.8e+07 Transitions= 8.49e+08 Memory= 3594.307 t= 2.4e+03 R= 2e+04 -Depth= 9016 States= 4.9e+07 Transitions= 8.91e+08 Memory= 3646.455 t= 2.52e+03 R= 2e+04 -Depth= 9016 States= 5e+07 Transitions= 9.24e+08 Memory= 3689.912 t= 2.62e+03 R= 2e+04 -Depth= 9016 States= 5.1e+07 Transitions= 9.39e+08 Memory= 3742.940 t= 2.66e+03 R= 2e+04 -Depth= 9016 States= 5.2e+07 Transitions= 9.6e+08 Memory= 3793.721 t= 2.72e+03 R= 2e+04 -Depth= 9016 States= 5.3e+07 Transitions= 9.99e+08 Memory= 3843.721 t= 2.84e+03 R= 2e+04 -Depth= 9016 States= 5.4e+07 Transitions= 1.01e+09 Memory= 3899.287 t= 2.88e+03 R= 2e+04 -Depth= 9016 States= 5.5e+07 Transitions= 1.03e+09 Memory= 3947.627 t= 2.93e+03 R= 2e+04 -Depth= 9016 States= 5.6e+07 Transitions= 1.05e+09 Memory= 3995.479 t= 2.97e+03 R= 2e+04 -Depth= 9016 States= 5.7e+07 Transitions= 1.06e+09 Memory= 4049.776 t= 3.01e+03 R= 2e+04 -Depth= 9016 States= 5.8e+07 Transitions= 1.09e+09 Memory= 4100.947 t= 3.09e+03 R= 2e+04 -Depth= 9016 States= 5.9e+07 Transitions= 1.1e+09 Memory= 4151.533 t= 3.13e+03 R= 2e+04 -Depth= 9016 States= 6e+07 Transitions= 1.13e+09 Memory= 4201.924 t= 3.22e+03 R= 2e+04 -Depth= 9016 States= 6.1e+07 Transitions= 1.15e+09 Memory= 4251.240 t= 3.28e+03 R= 2e+04 -Depth= 9016 States= 6.2e+07 Transitions= 1.19e+09 Memory= 4303.779 t= 3.38e+03 R= 2e+04 -Depth= 9016 States= 6.3e+07 Transitions= 1.21e+09 Memory= 4352.998 t= 3.43e+03 R= 2e+04 -Depth= 9016 States= 6.4e+07 Transitions= 1.24e+09 Memory= 4403.096 t= 3.53e+03 R= 2e+04 -Depth= 9016 States= 6.5e+07 Transitions= 1.26e+09 Memory= 4453.682 t= 3.59e+03 R= 2e+04 -Depth= 9016 States= 6.6e+07 Transitions= 1.28e+09 Memory= 4503.096 t= 3.66e+03 R= 2e+04 -Depth= 9016 States= 6.7e+07 Transitions= 1.3e+09 Memory= 4554.072 t= 3.71e+03 R= 2e+04 -Depth= 9016 States= 6.8e+07 Transitions= 1.33e+09 Memory= 4604.951 t= 3.79e+03 R= 2e+04 -Depth= 9016 States= 6.9e+07 Transitions= 1.36e+09 Memory= 4656.221 t= 3.87e+03 R= 2e+04 -Depth= 9523 States= 7e+07 Transitions= 1.38e+09 Memory= 4712.959 t= 3.93e+03 R= 2e+04 -Depth= 9523 States= 7.1e+07 Transitions= 1.39e+09 Memory= 4759.443 t= 3.97e+03 R= 2e+04 -Depth= 9523 States= 7.2e+07 Transitions= 1.41e+09 Memory= 4814.033 t= 4.03e+03 R= 2e+04 -Depth= 9554 States= 7.3e+07 Transitions= 1.44e+09 Memory= 4868.037 t= 4.09e+03 R= 2e+04 -Depth= 9554 States= 7.4e+07 Transitions= 1.45e+09 Memory= 4915.401 t= 4.13e+03 R= 2e+04 -Depth= 9554 States= 7.5e+07 Transitions= 1.47e+09 Memory= 4970.479 t= 4.2e+03 R= 2e+04 -Depth= 9554 States= 7.6e+07 Transitions= 1.49e+09 Memory= 5022.334 t= 4.26e+03 R= 2e+04 -Depth= 9554 States= 7.7e+07 Transitions= 1.51e+09 Memory= 5071.358 t= 4.3e+03 R= 2e+04 -Depth= 9554 States= 7.8e+07 Transitions= 1.52e+09 Memory= 5124.971 t= 4.33e+03 R= 2e+04 -Depth= 9554 States= 7.9e+07 Transitions= 1.54e+09 Memory= 5178.779 t= 4.4e+03 R= 2e+04 -Depth= 9554 States= 8e+07 Transitions= 1.56e+09 Memory= 5231.221 t= 4.46e+03 R= 2e+04 -Depth= 9554 States= 8.1e+07 Transitions= 1.58e+09 Memory= 5284.541 t= 4.51e+03 R= 2e+04 -Depth= 9554 States= 8.2e+07 Transitions= 1.6e+09 Memory= 5335.029 t= 4.55e+03 R= 2e+04 -Depth= 9554 States= 8.3e+07 Transitions= 1.61e+09 Memory= 5385.908 t= 4.6e+03 R= 2e+04 -Depth= 9554 States= 8.4e+07 Transitions= 1.63e+09 Memory= 5437.276 t= 4.64e+03 R= 2e+04 -Depth= 9554 States= 8.5e+07 Transitions= 1.65e+09 Memory= 5486.787 t= 4.69e+03 R= 2e+04 -Depth= 9554 States= 8.6e+07 Transitions= 1.67e+09 Memory= 5535.615 t= 4.76e+03 R= 2e+04 -Depth= 9554 States= 8.7e+07 Transitions= 1.69e+09 Memory= 5589.522 t= 4.81e+03 R= 2e+04 -Depth= 9554 States= 8.8e+07 Transitions= 1.7e+09 Memory= 5647.627 t= 4.86e+03 R= 2e+04 -Depth= 9554 States= 8.9e+07 Transitions= 1.72e+09 Memory= 5695.967 t= 4.9e+03 R= 2e+04 -Depth= 9554 States= 9e+07 Transitions= 1.74e+09 Memory= 5749.971 t= 4.95e+03 R= 2e+04 -Depth= 9554 States= 9.1e+07 Transitions= 1.76e+09 Memory= 5799.483 t= 5.01e+03 R= 2e+04 -Depth= 9554 States= 9.2e+07 Transitions= 1.78e+09 Memory= 5849.092 t= 5.06e+03 R= 2e+04 -Depth= 9554 States= 9.3e+07 Transitions= 1.8e+09 Memory= 5897.529 t= 5.12e+03 R= 2e+04 -Depth= 9554 States= 9.4e+07 Transitions= 1.82e+09 Memory= 5949.287 t= 5.19e+03 R= 2e+04 -Depth= 9554 States= 9.5e+07 Transitions= 1.84e+09 Memory= 6004.072 t= 5.25e+03 R= 2e+04 -Depth= 9554 States= 9.6e+07 Transitions= 1.86e+09 Memory= 6052.412 t= 5.29e+03 R= 2e+04 -Depth= 9554 States= 9.7e+07 Transitions= 1.88e+09 Memory= 6107.588 t= 5.36e+03 R= 2e+04 -Depth= 9554 States= 9.8e+07 Transitions= 1.9e+09 Memory= 6160.029 t= 5.4e+03 R= 2e+04 -Depth= 9554 States= 9.9e+07 Transitions= 1.91e+09 Memory= 6211.006 t= 5.44e+03 R= 2e+04 -Depth= 9554 States= 1e+08 Transitions= 1.93e+09 Memory= 6262.861 t= 5.49e+03 R= 2e+04 -Depth= 9554 States= 1.01e+08 Transitions= 1.94e+09 Memory= 6317.256 t= 5.54e+03 R= 2e+04 -Depth= 9554 States= 1.02e+08 Transitions= 1.96e+09 Memory= 6371.455 t= 5.58e+03 R= 2e+04 -Depth= 9554 States= 1.03e+08 Transitions= 1.98e+09 Memory= 6423.311 t= 5.64e+03 R= 2e+04 -Depth= 9554 States= 1.04e+08 Transitions= 2e+09 Memory= 6477.608 t= 5.71e+03 R= 2e+04 -Depth= 9554 States= 1.05e+08 Transitions= 2.02e+09 Memory= 6526.045 t= 5.75e+03 R= 2e+04 -Depth= 9554 States= 1.06e+08 Transitions= 2.04e+09 Memory= 6580.733 t= 5.81e+03 R= 2e+04 -Depth= 9554 States= 1.07e+08 Transitions= 2.06e+09 Memory= 6634.053 t= 5.87e+03 R= 2e+04 -Depth= 9554 States= 1.08e+08 Transitions= 2.07e+09 Memory= 6685.127 t= 5.9e+03 R= 2e+04 -Depth= 9554 States= 1.09e+08 Transitions= 2.09e+09 Memory= 6736.299 t= 5.96e+03 R= 2e+04 -Depth= 9554 States= 1.1e+08 Transitions= 2.11e+09 Memory= 6790.401 t= 6e+03 R= 2e+04 -Depth= 9554 States= 1.11e+08 Transitions= 2.12e+09 Memory= 6844.990 t= 6.05e+03 R= 2e+04 -Depth= 9554 States= 1.12e+08 Transitions= 2.14e+09 Memory= 6890.010 t= 6.09e+03 R= 2e+04 -Depth= 9554 States= 1.13e+08 Transitions= 2.16e+09 Memory= 6940.889 t= 6.14e+03 R= 2e+04 -Depth= 9554 States= 1.14e+08 Transitions= 2.17e+09 Memory= 6992.061 t= 6.19e+03 R= 2e+04 -Depth= 9554 States= 1.15e+08 Transitions= 2.19e+09 Memory= 7043.623 t= 6.24e+03 R= 2e+04 -Depth= 9554 States= 1.16e+08 Transitions= 2.21e+09 Memory= 7095.186 t= 6.28e+03 R= 2e+04 -Depth= 9554 States= 1.17e+08 Transitions= 2.23e+09 Memory= 7144.600 t= 6.36e+03 R= 2e+04 -Depth= 9554 States= 1.18e+08 Transitions= 2.27e+09 Memory= 7198.897 t= 6.46e+03 R= 2e+04 -Depth= 9554 States= 1.19e+08 Transitions= 2.29e+09 Memory= 7253.779 t= 6.52e+03 R= 2e+04 -Depth= 9554 States= 1.2e+08 Transitions= 2.3e+09 Memory= 7307.783 t= 6.56e+03 R= 2e+04 -Depth= 9554 States= 1.21e+08 Transitions= 2.32e+09 Memory= 7358.467 t= 6.62e+03 R= 2e+04 -Depth= 9554 States= 1.22e+08 Transitions= 2.34e+09 Memory= 7410.811 t= 6.67e+03 R= 2e+04 -Depth= 9554 States= 1.23e+08 Transitions= 2.36e+09 Memory= 7465.010 t= 6.72e+03 R= 2e+04 -Depth= 9554 States= 1.24e+08 Transitions= 2.38e+09 Memory= 7516.670 t= 6.78e+03 R= 2e+04 -Depth= 9554 States= 1.25e+08 Transitions= 2.41e+09 Memory= 7565.205 t= 6.87e+03 R= 2e+04 -Depth= 9554 States= 1.26e+08 Transitions= 2.43e+09 Memory= 7613.936 t= 6.93e+03 R= 2e+04 -Depth= 9554 States= 1.27e+08 Transitions= 2.45e+09 Memory= 7662.471 t= 7e+03 R= 2e+04 -Depth= 9554 States= 1.28e+08 Transitions= 2.48e+09 Memory= 7710.713 t= 7.08e+03 R= 2e+04 -Depth= 9554 States= 1.29e+08 Transitions= 2.5e+09 Memory= 7759.346 t= 7.14e+03 R= 2e+04 -Depth= 9554 States= 1.3e+08 Transitions= 2.52e+09 Memory= 7810.322 t= 7.2e+03 R= 2e+04 -Depth= 9554 States= 1.31e+08 Transitions= 2.55e+09 Memory= 7859.834 t= 7.26e+03 R= 2e+04 -Depth= 9554 States= 1.32e+08 Transitions= 2.57e+09 Memory= 7910.615 t= 7.33e+03 R= 2e+04 -Depth= 9554 States= 1.33e+08 Transitions= 2.59e+09 Memory= 7959.248 t= 7.4e+03 R= 2e+04 -Depth= 9554 States= 1.34e+08 Transitions= 2.61e+09 Memory= 8011.787 t= 7.46e+03 R= 2e+04 -Depth= 9554 States= 1.35e+08 Transitions= 2.63e+09 Memory= 8060.713 t= 7.51e+03 R= 2e+04 -pan: resizing hashtable to -w28.. done -Depth= 9554 States= 1.36e+08 Transitions= 2.65e+09 Memory= 10108.713 t= 7.58e+03 R= 2e+04 -Depth= 9554 States= 1.37e+08 Transitions= 2.66e+09 Memory= 10144.455 t= 7.62e+03 R= 2e+04 -Depth= 9554 States= 1.38e+08 Transitions= 2.67e+09 Memory= 10199.143 t= 7.65e+03 R= 2e+04 -Depth= 9554 States= 1.39e+08 Transitions= 2.69e+09 Memory= 10253.830 t= 7.69e+03 R= 2e+04 -Depth= 9554 States= 1.4e+08 Transitions= 2.7e+09 Memory= 10308.127 t= 7.74e+03 R= 2e+04 -Depth= 9554 States= 1.41e+08 Transitions= 2.72e+09 Memory= 10360.178 t= 7.78e+03 R= 2e+04 -Depth= 9554 States= 1.42e+08 Transitions= 2.74e+09 Memory= 10413.889 t= 7.83e+03 R= 2e+04 -Depth= 9554 States= 1.43e+08 Transitions= 2.75e+09 Memory= 10467.111 t= 7.87e+03 R= 2e+04 -Depth= 9554 States= 1.44e+08 Transitions= 2.77e+09 Memory= 10518.088 t= 7.92e+03 R= 2e+04 -Depth= 9554 States= 1.45e+08 Transitions= 2.79e+09 Memory= 10567.795 t= 7.98e+03 R= 2e+04 -Depth= 9554 States= 1.46e+08 Transitions= 2.82e+09 Memory= 10624.631 t= 8.08e+03 R= 2e+04 -Depth= 9554 States= 1.47e+08 Transitions= 2.86e+09 Memory= 10689.963 t= 8.19e+03 R= 2e+04 -Depth= 9554 States= 1.48e+08 Transitions= 2.91e+09 Memory= 10752.072 t= 8.34e+03 R= 2e+04 -Depth= 9554 States= 1.49e+08 Transitions= 2.95e+09 Memory= 10802.658 t= 8.46e+03 R= 2e+04 -Depth= 9554 States= 1.5e+08 Transitions= 2.99e+09 Memory= 10848.361 t= 8.56e+03 R= 2e+04 -Depth= 9554 States= 1.51e+08 Transitions= 3e+09 Memory= 10900.022 t= 8.61e+03 R= 2e+04 -Depth= 9554 States= 1.52e+08 Transitions= 3.02e+09 Memory= 10951.096 t= 8.66e+03 R= 2e+04 -Depth= 9554 States= 1.53e+08 Transitions= 3.05e+09 Memory= 11002.365 t= 8.75e+03 R= 2e+04 -Depth= 9554 States= 1.54e+08 Transitions= 3.08e+09 Memory= 11054.611 t= 8.83e+03 R= 2e+04 -Depth= 9554 States= 1.55e+08 Transitions= 3.1e+09 Memory= 11105.783 t= 8.88e+03 R= 2e+04 -Depth= 9554 States= 1.56e+08 Transitions= 3.11e+09 Memory= 11153.830 t= 8.92e+03 R= 2e+04 -Depth= 9554 States= 1.57e+08 Transitions= 3.13e+09 Memory= 11202.365 t= 8.96e+03 R= 2e+04 -Depth= 9554 States= 1.58e+08 Transitions= 3.14e+09 Memory= 11257.443 t= 9e+03 R= 2e+04 -Depth= 9554 States= 1.59e+08 Transitions= 3.17e+09 Memory= 11307.639 t= 9.08e+03 R= 2e+04 -Depth= 9554 States= 1.6e+08 Transitions= 3.19e+09 Memory= 11357.541 t= 9.15e+03 R= 2e+04 -Depth= 9554 States= 1.61e+08 Transitions= 3.21e+09 Memory= 11407.541 t= 9.21e+03 R= 2e+04 -Depth= 9554 States= 1.62e+08 Transitions= 3.24e+09 Memory= 11457.736 t= 9.28e+03 R= 2e+04 -Depth= 9554 States= 1.63e+08 Transitions= 3.27e+09 Memory= 11507.053 t= 9.36e+03 R= 2e+04 -Depth= 9554 States= 1.64e+08 Transitions= 3.29e+09 Memory= 11560.959 t= 9.44e+03 R= 2e+04 -Depth= 9554 States= 1.65e+08 Transitions= 3.31e+09 Memory= 11613.108 t= 9.5e+03 R= 2e+04 -Depth= 9554 States= 1.66e+08 Transitions= 3.34e+09 Memory= 11661.252 t= 9.58e+03 R= 2e+04 -Depth= 9554 States= 1.67e+08 Transitions= 3.37e+09 Memory= 11711.154 t= 9.66e+03 R= 2e+04 -Depth= 9554 States= 1.68e+08 Transitions= 3.39e+09 Memory= 11763.596 t= 9.72e+03 R= 2e+04 -Depth= 9554 States= 1.69e+08 Transitions= 3.41e+09 Memory= 11812.912 t= 9.78e+03 R= 2e+04 -Depth= 9554 States= 1.7e+08 Transitions= 3.44e+09 Memory= 11866.135 t= 9.87e+03 R= 2e+04 -Depth= 9554 States= 1.71e+08 Transitions= 3.46e+09 Memory= 11920.139 t= 9.91e+03 R= 2e+04 -Depth= 9554 States= 1.72e+08 Transitions= 3.47e+09 Memory= 11967.014 t= 9.95e+03 R= 2e+04 -Depth= 9554 States= 1.73e+08 Transitions= 3.5e+09 Memory= 12021.115 t= 1e+04 R= 2e+04 -Depth= 9554 States= 1.74e+08 Transitions= 3.52e+09 Memory= 12075.315 t= 1.01e+04 R= 2e+04 -Depth= 9554 States= 1.75e+08 Transitions= 3.53e+09 Memory= 12126.779 t= 1.01e+04 R= 2e+04 -Depth= 9554 States= 1.76e+08 Transitions= 3.56e+09 Memory= 12180.002 t= 1.02e+04 R= 2e+04 -Depth= 9554 States= 1.77e+08 Transitions= 3.57e+09 Memory= 12229.416 t= 1.02e+04 R= 2e+04 -Depth= 9554 States= 1.78e+08 Transitions= 3.59e+09 Memory= 12282.834 t= 1.03e+04 R= 2e+04 -Depth= 9554 States= 1.79e+08 Transitions= 3.61e+09 Memory= 12334.494 t= 1.03e+04 R= 2e+04 -Depth= 9554 States= 1.8e+08 Transitions= 3.63e+09 Memory= 12387.522 t= 1.04e+04 R= 2e+04 -Depth= 9554 States= 1.81e+08 Transitions= 3.65e+09 Memory= 12440.451 t= 1.05e+04 R= 2e+04 -Depth= 9554 States= 1.82e+08 Transitions= 3.66e+09 Memory= 12492.111 t= 1.05e+04 R= 2e+04 -Depth= 9554 States= 1.83e+08 Transitions= 3.68e+09 Memory= 12544.162 t= 1.05e+04 R= 2e+04 -Depth= 9554 States= 1.84e+08 Transitions= 3.69e+09 Memory= 12594.943 t= 1.06e+04 R= 2e+04 -Depth= 9554 States= 1.85e+08 Transitions= 3.71e+09 Memory= 12645.627 t= 1.06e+04 R= 2e+04 -Depth= 9554 States= 1.86e+08 Transitions= 3.73e+09 Memory= 12695.236 t= 1.07e+04 R= 2e+04 -Depth= 9554 States= 1.87e+08 Transitions= 3.75e+09 Memory= 12750.705 t= 1.07e+04 R= 2e+04 -Depth= 9554 States= 1.88e+08 Transitions= 3.77e+09 Memory= 12807.639 t= 1.08e+04 R= 2e+04 -Depth= 9554 States= 1.89e+08 Transitions= 3.78e+09 Memory= 12855.979 t= 1.08e+04 R= 2e+04 -Depth= 9554 States= 1.9e+08 Transitions= 3.8e+09 Memory= 12909.592 t= 1.09e+04 R= 2e+04 -Depth= 9554 States= 1.91e+08 Transitions= 3.82e+09 Memory= 12959.104 t= 1.09e+04 R= 2e+04 -Depth= 9554 States= 1.92e+08 Transitions= 3.84e+09 Memory= 13008.615 t= 1.1e+04 R= 2e+04 -Depth= 9554 States= 1.93e+08 Transitions= 3.86e+09 Memory= 13065.061 t= 1.11e+04 R= 2e+04 -Depth= 9554 States= 1.94e+08 Transitions= 3.88e+09 Memory= 13114.377 t= 1.11e+04 R= 2e+04 -Depth= 9554 States= 1.95e+08 Transitions= 3.9e+09 Memory= 13168.674 t= 1.12e+04 R= 2e+04 -Depth= 9554 States= 1.96e+08 Transitions= 3.92e+09 Memory= 13222.678 t= 1.12e+04 R= 2e+04 -Depth= 9554 States= 1.97e+08 Transitions= 3.93e+09 Memory= 13271.701 t= 1.13e+04 R= 2e+04 -Depth= 9554 States= 1.98e+08 Transitions= 3.95e+09 Memory= 13324.338 t= 1.13e+04 R= 2e+04 -Depth= 9554 States= 1.99e+08 Transitions= 3.96e+09 Memory= 13377.170 t= 1.13e+04 R= 2e+04 -Depth= 9554 States= 2e+08 Transitions= 3.98e+09 Memory= 13432.639 t= 1.14e+04 R= 2e+04 -Depth= 9554 States= 2.01e+08 Transitions= 4e+09 Memory= 13483.811 t= 1.14e+04 R= 2e+04 -Depth= 9554 States= 2.02e+08 Transitions= 4.03e+09 Memory= 13537.522 t= 1.15e+04 R= 2e+04 -Depth= 9554 States= 2.03e+08 Transitions= 4.04e+09 Memory= 13588.693 t= 1.16e+04 R= 2e+04 -Depth= 9554 States= 2.04e+08 Transitions= 4.06e+09 Memory= 13642.600 t= 1.16e+04 R= 2e+04 -Depth= 9554 States= 2.05e+08 Transitions= 4.08e+09 Memory= 13696.799 t= 1.17e+04 R= 2e+04 -Depth= 9554 States= 2.06e+08 Transitions= 4.09e+09 Memory= 13744.748 t= 1.17e+04 R= 2e+04 -Depth= 9554 States= 2.07e+08 Transitions= 4.11e+09 Memory= 13798.068 t= 1.18e+04 R= 2e+04 -Depth= 9554 States= 2.08e+08 Transitions= 4.13e+09 Memory= 13850.022 t= 1.18e+04 R= 2e+04 -Depth= 9554 States= 2.09e+08 Transitions= 4.14e+09 Memory= 13905.783 t= 1.18e+04 R= 2e+04 -Depth= 9554 States= 2.1e+08 Transitions= 4.16e+09 Memory= 13952.365 t= 1.19e+04 R= 2e+04 -Depth= 9554 States= 2.11e+08 Transitions= 4.18e+09 Memory= 14003.244 t= 1.19e+04 R= 2e+04 -Depth= 9554 States= 2.12e+08 Transitions= 4.19e+09 Memory= 14054.318 t= 1.2e+04 R= 2e+04 -Depth= 9554 States= 2.13e+08 Transitions= 4.21e+09 Memory= 14106.076 t= 1.2e+04 R= 2e+04 -Depth= 9554 States= 2.14e+08 Transitions= 4.22e+09 Memory= 14156.662 t= 1.21e+04 R= 2e+04 -Depth= 9554 States= 2.15e+08 Transitions= 4.26e+09 Memory= 14209.690 t= 1.22e+04 R= 2e+04 -Depth= 9554 States= 2.16e+08 Transitions= 4.29e+09 Memory= 14265.256 t= 1.23e+04 R= 2e+04 -Depth= 9554 States= 2.17e+08 Transitions= 4.3e+09 Memory= 14317.697 t= 1.23e+04 R= 2e+04 -Depth= 9554 States= 2.18e+08 Transitions= 4.32e+09 Memory= 14371.311 t= 1.23e+04 R= 2e+04 -Depth= 9554 States= 2.19e+08 Transitions= 4.33e+09 Memory= 14424.045 t= 1.24e+04 R= 2e+04 -Depth= 9554 States= 2.2e+08 Transitions= 4.35e+09 Memory= 14477.854 t= 1.24e+04 R= 2e+04 -Depth= 9554 States= 2.21e+08 Transitions= 4.37e+09 Memory= 14529.611 t= 1.25e+04 R= 2e+04 -Depth= 9554 States= 2.22e+08 Transitions= 4.4e+09 Memory= 14576.291 t= 1.26e+04 R= 2e+04 -Depth= 9554 States= 2.23e+08 Transitions= 4.43e+09 Memory= 14625.608 t= 1.27e+04 R= 2e+04 -Depth= 9554 States= 2.24e+08 Transitions= 4.45e+09 Memory= 14674.045 t= 1.27e+04 R= 2e+04 -Depth= 9554 States= 2.25e+08 Transitions= 4.48e+09 Memory= 14722.776 t= 1.28e+04 R= 2e+04 -Depth= 9554 States= 2.26e+08 Transitions= 4.5e+09 Memory= 14770.529 t= 1.29e+04 R= 2e+04 -Depth= 9554 States= 2.27e+08 Transitions= 4.52e+09 Memory= 14821.018 t= 1.29e+04 R= 2e+04 -Depth= 9554 States= 2.28e+08 Transitions= 4.54e+09 Memory= 14870.529 t= 1.3e+04 R= 2e+04 -Depth= 9554 States= 2.29e+08 Transitions= 4.56e+09 Memory= 14918.967 t= 1.3e+04 R= 2e+04 -Depth= 9554 States= 2.3e+08 Transitions= 4.59e+09 Memory= 14966.916 t= 1.31e+04 R= 2e+04 -Depth= 9554 States= 2.31e+08 Transitions= 4.6e+09 Memory= 15017.600 t= 1.32e+04 R= 2e+04 -Depth= 9554 States= 2.32e+08 Transitions= 4.63e+09 Memory= 15066.330 t= 1.32e+04 R= 2e+04 diff --git a/formal-model/urcu-controldataflow-intel-ipi/urcu_progress_writer_error.define b/formal-model/urcu-controldataflow-intel-ipi/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu-controldataflow-intel-ipi/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/.input.spin b/formal-model/urcu-controldataflow-intel-no-ipi/.input.spin deleted file mode 100644 index 3191ba1..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/.input.spin +++ /dev/null @@ -1,1272 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/DEFINES b/formal-model/urcu-controldataflow-intel-no-ipi/DEFINES deleted file mode 100644 index b4d92d7..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/DEFINES +++ /dev/null @@ -1,18 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/Makefile b/formal-model/urcu-controldataflow-intel-no-ipi/Makefile deleted file mode 100644 index de47dff..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/Makefile +++ /dev/null @@ -1,170 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/asserts.log b/formal-model/urcu-controldataflow-intel-no-ipi/asserts.log deleted file mode 100644 index fe09a53..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/asserts.log +++ /dev/null @@ -1,429 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -cat DEFINES > .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w20 -Depth= 4473 States= 1e+06 Transitions= 2.37e+07 Memory= 542.619 t= 57.3 R= 2e+04 -Depth= 4540 States= 2e+06 Transitions= 4.8e+07 Memory= 618.889 t= 117 R= 2e+04 -Depth= 4540 States= 3e+06 Transitions= 7.25e+07 Memory= 695.158 t= 178 R= 2e+04 -pan: resizing hashtable to -w22.. done - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim - (none specified) - assertion violations + - cycle checks - (disabled by -DSAFETY) - invalid end states + - -State-vector 72 byte, depth reached 4540, errors: 0 - 3841511 states, stored - 90242688 states, matched - 94084199 transitions (= stored+matched) -1.5073578e+09 atomic steps -hash conflicts: 63759942 (resolved) - -Stats on memory usage (in Megabytes): - 366.355 equivalent memory usage for states (stored*(State-vector + overhead)) - 300.680 actual memory usage for states (compression: 82.07%) - state-vector as stored = 54 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 790.440 total actual memory usage - -unreached in proctype urcu_reader - line 410, ".input.spin", state 17, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 49, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 63, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 81, "(1)" - line 256, ".input.spin", state 101, "(1)" - line 260, ".input.spin", state 109, "(1)" - line 596, ".input.spin", state 128, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 410, ".input.spin", state 135, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 167, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 181, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 199, "(1)" - line 256, ".input.spin", state 219, "(1)" - line 260, ".input.spin", state 227, "(1)" - line 410, ".input.spin", state 246, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 278, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 292, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 310, "(1)" - line 256, ".input.spin", state 330, "(1)" - line 260, ".input.spin", state 338, "(1)" - line 410, ".input.spin", state 359, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 410, ".input.spin", state 361, "(1)" - line 410, ".input.spin", state 362, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 410, ".input.spin", state 362, "else" - line 410, ".input.spin", state 365, "(1)" - line 414, ".input.spin", state 373, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 375, "(1)" - line 414, ".input.spin", state 376, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 414, ".input.spin", state 376, "else" - line 414, ".input.spin", state 379, "(1)" - line 414, ".input.spin", state 380, "(1)" - line 414, ".input.spin", state 380, "(1)" - line 412, ".input.spin", state 385, "((i<1))" - line 412, ".input.spin", state 385, "((i>=1))" - line 419, ".input.spin", state 391, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 393, "(1)" - line 419, ".input.spin", state 394, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 419, ".input.spin", state 394, "else" - line 419, ".input.spin", state 397, "(1)" - line 419, ".input.spin", state 398, "(1)" - line 419, ".input.spin", state 398, "(1)" - line 423, ".input.spin", state 405, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 407, "(1)" - line 423, ".input.spin", state 408, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 423, ".input.spin", state 408, "else" - line 423, ".input.spin", state 411, "(1)" - line 423, ".input.spin", state 412, "(1)" - line 423, ".input.spin", state 412, "(1)" - line 421, ".input.spin", state 417, "((i<2))" - line 421, ".input.spin", state 417, "((i>=2))" - line 248, ".input.spin", state 423, "(1)" - line 252, ".input.spin", state 431, "(1)" - line 252, ".input.spin", state 432, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 252, ".input.spin", state 432, "else" - line 250, ".input.spin", state 437, "((i<1))" - line 250, ".input.spin", state 437, "((i>=1))" - line 256, ".input.spin", state 443, "(1)" - line 256, ".input.spin", state 444, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 256, ".input.spin", state 444, "else" - line 260, ".input.spin", state 451, "(1)" - line 260, ".input.spin", state 452, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 260, ".input.spin", state 452, "else" - line 258, ".input.spin", state 457, "((i<2))" - line 258, ".input.spin", state 457, "((i>=2))" - line 265, ".input.spin", state 461, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 265, ".input.spin", state 461, "else" - line 430, ".input.spin", state 463, "(1)" - line 430, ".input.spin", state 463, "(1)" - line 596, ".input.spin", state 466, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 596, ".input.spin", state 467, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 596, ".input.spin", state 468, "(1)" - line 271, ".input.spin", state 472, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, ".input.spin", state 483, "(1)" - line 279, ".input.spin", state 494, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, ".input.spin", state 503, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 519, "(1)" - line 252, ".input.spin", state 527, "(1)" - line 256, ".input.spin", state 539, "(1)" - line 260, ".input.spin", state 547, "(1)" - line 410, ".input.spin", state 565, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 579, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 597, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 611, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 629, "(1)" - line 252, ".input.spin", state 637, "(1)" - line 256, ".input.spin", state 649, "(1)" - line 260, ".input.spin", state 657, "(1)" - line 410, ".input.spin", state 683, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 715, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 729, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 747, "(1)" - line 256, ".input.spin", state 767, "(1)" - line 260, ".input.spin", state 775, "(1)" - line 410, ".input.spin", state 794, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 410, ".input.spin", state 796, "(1)" - line 410, ".input.spin", state 797, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 410, ".input.spin", state 797, "else" - line 410, ".input.spin", state 800, "(1)" - line 414, ".input.spin", state 808, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 810, "(1)" - line 414, ".input.spin", state 811, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 414, ".input.spin", state 811, "else" - line 414, ".input.spin", state 814, "(1)" - line 414, ".input.spin", state 815, "(1)" - line 414, ".input.spin", state 815, "(1)" - line 412, ".input.spin", state 820, "((i<1))" - line 412, ".input.spin", state 820, "((i>=1))" - line 419, ".input.spin", state 826, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 828, "(1)" - line 419, ".input.spin", state 829, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 419, ".input.spin", state 829, "else" - line 419, ".input.spin", state 832, "(1)" - line 419, ".input.spin", state 833, "(1)" - line 419, ".input.spin", state 833, "(1)" - line 423, ".input.spin", state 840, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 842, "(1)" - line 423, ".input.spin", state 843, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 423, ".input.spin", state 843, "else" - line 423, ".input.spin", state 846, "(1)" - line 423, ".input.spin", state 847, "(1)" - line 423, ".input.spin", state 847, "(1)" - line 421, ".input.spin", state 852, "((i<2))" - line 421, ".input.spin", state 852, "((i>=2))" - line 248, ".input.spin", state 858, "(1)" - line 252, ".input.spin", state 866, "(1)" - line 252, ".input.spin", state 867, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 252, ".input.spin", state 867, "else" - line 250, ".input.spin", state 872, "((i<1))" - line 250, ".input.spin", state 872, "((i>=1))" - line 256, ".input.spin", state 878, "(1)" - line 256, ".input.spin", state 879, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 256, ".input.spin", state 879, "else" - line 260, ".input.spin", state 886, "(1)" - line 260, ".input.spin", state 887, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 260, ".input.spin", state 887, "else" - line 258, ".input.spin", state 892, "((i<2))" - line 258, ".input.spin", state 892, "((i>=2))" - line 265, ".input.spin", state 896, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 265, ".input.spin", state 896, "else" - line 430, ".input.spin", state 898, "(1)" - line 430, ".input.spin", state 898, "(1)" - line 604, ".input.spin", state 902, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 410, ".input.spin", state 907, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 921, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 939, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 953, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 971, "(1)" - line 252, ".input.spin", state 979, "(1)" - line 256, ".input.spin", state 991, "(1)" - line 260, ".input.spin", state 999, "(1)" - line 410, ".input.spin", state 1021, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 1053, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 1067, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 1085, "(1)" - line 256, ".input.spin", state 1105, "(1)" - line 260, ".input.spin", state 1113, "(1)" - line 410, ".input.spin", state 1136, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 1168, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 1182, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 1200, "(1)" - line 256, ".input.spin", state 1220, "(1)" - line 260, ".input.spin", state 1228, "(1)" - line 410, ".input.spin", state 1247, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 1279, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 1293, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 1311, "(1)" - line 256, ".input.spin", state 1331, "(1)" - line 260, ".input.spin", state 1339, "(1)" - line 271, ".input.spin", state 1360, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 279, ".input.spin", state 1382, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, ".input.spin", state 1391, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 1407, "(1)" - line 252, ".input.spin", state 1415, "(1)" - line 256, ".input.spin", state 1427, "(1)" - line 260, ".input.spin", state 1435, "(1)" - line 410, ".input.spin", state 1453, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 1467, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 1485, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 1499, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 1517, "(1)" - line 252, ".input.spin", state 1525, "(1)" - line 256, ".input.spin", state 1537, "(1)" - line 260, ".input.spin", state 1545, "(1)" - line 410, ".input.spin", state 1564, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 1578, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 1596, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 1610, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 1628, "(1)" - line 252, ".input.spin", state 1636, "(1)" - line 256, ".input.spin", state 1648, "(1)" - line 260, ".input.spin", state 1656, "(1)" - line 410, ".input.spin", state 1678, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 1710, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 1724, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 1742, "(1)" - line 256, ".input.spin", state 1762, "(1)" - line 260, ".input.spin", state 1770, "(1)" - line 643, ".input.spin", state 1789, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 410, ".input.spin", state 1796, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 1828, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 1842, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 1860, "(1)" - line 256, ".input.spin", state 1880, "(1)" - line 260, ".input.spin", state 1888, "(1)" - line 410, ".input.spin", state 1907, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 1939, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 1953, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 1971, "(1)" - line 256, ".input.spin", state 1991, "(1)" - line 260, ".input.spin", state 1999, "(1)" - line 410, ".input.spin", state 2020, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 410, ".input.spin", state 2022, "(1)" - line 410, ".input.spin", state 2023, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 410, ".input.spin", state 2023, "else" - line 410, ".input.spin", state 2026, "(1)" - line 414, ".input.spin", state 2034, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 2036, "(1)" - line 414, ".input.spin", state 2037, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 414, ".input.spin", state 2037, "else" - line 414, ".input.spin", state 2040, "(1)" - line 414, ".input.spin", state 2041, "(1)" - line 414, ".input.spin", state 2041, "(1)" - line 412, ".input.spin", state 2046, "((i<1))" - line 412, ".input.spin", state 2046, "((i>=1))" - line 419, ".input.spin", state 2052, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 2054, "(1)" - line 419, ".input.spin", state 2055, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 419, ".input.spin", state 2055, "else" - line 419, ".input.spin", state 2058, "(1)" - line 419, ".input.spin", state 2059, "(1)" - line 419, ".input.spin", state 2059, "(1)" - line 423, ".input.spin", state 2066, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 2068, "(1)" - line 423, ".input.spin", state 2069, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 423, ".input.spin", state 2069, "else" - line 423, ".input.spin", state 2072, "(1)" - line 423, ".input.spin", state 2073, "(1)" - line 423, ".input.spin", state 2073, "(1)" - line 421, ".input.spin", state 2078, "((i<2))" - line 421, ".input.spin", state 2078, "((i>=2))" - line 248, ".input.spin", state 2084, "(1)" - line 252, ".input.spin", state 2092, "(1)" - line 252, ".input.spin", state 2093, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 252, ".input.spin", state 2093, "else" - line 250, ".input.spin", state 2098, "((i<1))" - line 250, ".input.spin", state 2098, "((i>=1))" - line 256, ".input.spin", state 2104, "(1)" - line 256, ".input.spin", state 2105, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 256, ".input.spin", state 2105, "else" - line 260, ".input.spin", state 2112, "(1)" - line 260, ".input.spin", state 2113, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 260, ".input.spin", state 2113, "else" - line 258, ".input.spin", state 2118, "((i<2))" - line 258, ".input.spin", state 2118, "((i>=2))" - line 265, ".input.spin", state 2122, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 265, ".input.spin", state 2122, "else" - line 430, ".input.spin", state 2124, "(1)" - line 430, ".input.spin", state 2124, "(1)" - line 643, ".input.spin", state 2127, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 643, ".input.spin", state 2128, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 643, ".input.spin", state 2129, "(1)" - line 271, ".input.spin", state 2133, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 279, ".input.spin", state 2155, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, ".input.spin", state 2164, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 2180, "(1)" - line 252, ".input.spin", state 2188, "(1)" - line 256, ".input.spin", state 2200, "(1)" - line 260, ".input.spin", state 2208, "(1)" - line 410, ".input.spin", state 2226, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 2240, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 2258, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 2272, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 2290, "(1)" - line 252, ".input.spin", state 2298, "(1)" - line 256, ".input.spin", state 2310, "(1)" - line 260, ".input.spin", state 2318, "(1)" - line 271, ".input.spin", state 2340, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, ".input.spin", state 2349, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, ".input.spin", state 2362, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, ".input.spin", state 2371, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 2387, "(1)" - line 252, ".input.spin", state 2395, "(1)" - line 256, ".input.spin", state 2407, "(1)" - line 260, ".input.spin", state 2415, "(1)" - line 410, ".input.spin", state 2433, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 2447, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 2465, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 2479, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 2497, "(1)" - line 252, ".input.spin", state 2505, "(1)" - line 256, ".input.spin", state 2517, "(1)" - line 260, ".input.spin", state 2525, "(1)" - line 410, ".input.spin", state 2544, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 2558, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 2576, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 2590, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 2608, "(1)" - line 252, ".input.spin", state 2616, "(1)" - line 256, ".input.spin", state 2628, "(1)" - line 260, ".input.spin", state 2636, "(1)" - line 248, ".input.spin", state 2667, "(1)" - line 256, ".input.spin", state 2687, "(1)" - line 260, ".input.spin", state 2695, "(1)" - line 248, ".input.spin", state 2710, "(1)" - line 252, ".input.spin", state 2718, "(1)" - line 256, ".input.spin", state 2730, "(1)" - line 260, ".input.spin", state 2738, "(1)" - line 897, ".input.spin", state 2755, "-end-" - (259 of 2755 states) -unreached in proctype urcu_writer - line 410, ".input.spin", state 18, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 32, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 50, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 82, "(1)" - line 252, ".input.spin", state 90, "(1)" - line 256, ".input.spin", state 102, "(1)" - line 271, ".input.spin", state 131, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, ".input.spin", state 140, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, ".input.spin", state 153, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 410, ".input.spin", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, ".input.spin", state 207, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 225, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 239, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 257, "(1)" - line 252, ".input.spin", state 265, "(1)" - line 256, ".input.spin", state 277, "(1)" - line 260, ".input.spin", state 285, "(1)" - line 414, ".input.spin", state 320, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 338, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 352, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 252, ".input.spin", state 378, "(1)" - line 256, ".input.spin", state 390, "(1)" - line 260, ".input.spin", state 398, "(1)" - line 414, ".input.spin", state 441, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 459, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 473, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 252, ".input.spin", state 499, "(1)" - line 256, ".input.spin", state 511, "(1)" - line 260, ".input.spin", state 519, "(1)" - line 414, ".input.spin", state 552, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 570, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 584, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 252, ".input.spin", state 610, "(1)" - line 256, ".input.spin", state 622, "(1)" - line 260, ".input.spin", state 630, "(1)" - line 414, ".input.spin", state 665, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, ".input.spin", state 683, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, ".input.spin", state 697, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 252, ".input.spin", state 723, "(1)" - line 256, ".input.spin", state 735, "(1)" - line 260, ".input.spin", state 743, "(1)" - line 271, ".input.spin", state 796, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, ".input.spin", state 805, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, ".input.spin", state 820, "(1)" - line 283, ".input.spin", state 827, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 843, "(1)" - line 252, ".input.spin", state 851, "(1)" - line 256, ".input.spin", state 863, "(1)" - line 260, ".input.spin", state 871, "(1)" - line 275, ".input.spin", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, ".input.spin", state 909, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, ".input.spin", state 918, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 934, "(1)" - line 252, ".input.spin", state 942, "(1)" - line 256, ".input.spin", state 954, "(1)" - line 260, ".input.spin", state 962, "(1)" - line 275, ".input.spin", state 987, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, ".input.spin", state 1000, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, ".input.spin", state 1009, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 1025, "(1)" - line 252, ".input.spin", state 1033, "(1)" - line 256, ".input.spin", state 1045, "(1)" - line 260, ".input.spin", state 1053, "(1)" - line 275, ".input.spin", state 1078, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, ".input.spin", state 1091, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, ".input.spin", state 1100, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, ".input.spin", state 1116, "(1)" - line 252, ".input.spin", state 1124, "(1)" - line 256, ".input.spin", state 1136, "(1)" - line 260, ".input.spin", state 1144, "(1)" - line 1236, ".input.spin", state 1159, "-end-" - (71 of 1159 states) -unreached in proctype :init: - (0 of 78 states) - -pan: elapsed time 231 seconds -pan: rate 16628.478 states/second -pan: avg transition delay 2.4555e-06 usec -cp .input.spin asserts.spin.input -cp .input.spin.trail asserts.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/asserts.spin.input b/formal-model/urcu-controldataflow-intel-no-ipi/asserts.spin.input deleted file mode 100644 index 3191ba1..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/asserts.spin.input +++ /dev/null @@ -1,1272 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/references.txt b/formal-model/urcu-controldataflow-intel-no-ipi/references.txt deleted file mode 100644 index 72c67a2..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/references.txt +++ /dev/null @@ -1,13 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html - -LTL vs CTL : - -http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 -http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf - (downloaded) diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu.sh b/formal-model/urcu-controldataflow-intel-no-ipi/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu.spin b/formal-model/urcu-controldataflow-intel-no-ipi/urcu.spin deleted file mode 100644 index 54752a1..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu.spin +++ /dev/null @@ -1,1254 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free.log b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free.log deleted file mode 100644 index aaa4217..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free.log +++ /dev/null @@ -1,440 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1294) -Depth= 4900 States= 1e+06 Transitions= 2.37e+07 Memory= 550.334 t= 65.5 R= 2e+04 -Depth= 4973 States= 2e+06 Transitions= 4.8e+07 Memory= 634.221 t= 134 R= 1e+04 -Depth= 4973 States= 3e+06 Transitions= 7.25e+07 Memory= 718.205 t= 204 R= 1e+04 -pan: resizing hashtable to -w22.. done - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 4973, errors: 0 - 3841511 states, stored - 90254094 states, matched - 94095605 transitions (= stored+matched) -1.5073578e+09 atomic steps -hash conflicts: 63765708 (resolved) - -Stats on memory usage (in Megabytes): - 424.972 equivalent memory usage for states (stored*(State-vector + overhead)) - 330.368 actual memory usage for states (compression: 77.74%) - state-vector as stored = 62 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 819.932 total actual memory usage - -unreached in proctype urcu_reader - line 410, "pan.___", state 17, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 49, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 63, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 81, "(1)" - line 256, "pan.___", state 101, "(1)" - line 260, "pan.___", state 109, "(1)" - line 596, "pan.___", state 128, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 410, "pan.___", state 135, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 167, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 181, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 199, "(1)" - line 256, "pan.___", state 219, "(1)" - line 260, "pan.___", state 227, "(1)" - line 410, "pan.___", state 246, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 278, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 292, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 310, "(1)" - line 256, "pan.___", state 330, "(1)" - line 260, "pan.___", state 338, "(1)" - line 410, "pan.___", state 359, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 361, "(1)" - line 410, "pan.___", state 362, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 410, "pan.___", state 362, "else" - line 410, "pan.___", state 365, "(1)" - line 414, "pan.___", state 373, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 375, "(1)" - line 414, "pan.___", state 376, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 414, "pan.___", state 376, "else" - line 414, "pan.___", state 379, "(1)" - line 414, "pan.___", state 380, "(1)" - line 414, "pan.___", state 380, "(1)" - line 412, "pan.___", state 385, "((i<1))" - line 412, "pan.___", state 385, "((i>=1))" - line 419, "pan.___", state 391, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 393, "(1)" - line 419, "pan.___", state 394, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 419, "pan.___", state 394, "else" - line 419, "pan.___", state 397, "(1)" - line 419, "pan.___", state 398, "(1)" - line 419, "pan.___", state 398, "(1)" - line 423, "pan.___", state 405, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 423, "pan.___", state 407, "(1)" - line 423, "pan.___", state 408, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 423, "pan.___", state 408, "else" - line 423, "pan.___", state 411, "(1)" - line 423, "pan.___", state 412, "(1)" - line 423, "pan.___", state 412, "(1)" - line 421, "pan.___", state 417, "((i<2))" - line 421, "pan.___", state 417, "((i>=2))" - line 248, "pan.___", state 423, "(1)" - line 252, "pan.___", state 431, "(1)" - line 252, "pan.___", state 432, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 252, "pan.___", state 432, "else" - line 250, "pan.___", state 437, "((i<1))" - line 250, "pan.___", state 437, "((i>=1))" - line 256, "pan.___", state 443, "(1)" - line 256, "pan.___", state 444, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 256, "pan.___", state 444, "else" - line 260, "pan.___", state 451, "(1)" - line 260, "pan.___", state 452, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 260, "pan.___", state 452, "else" - line 258, "pan.___", state 457, "((i<2))" - line 258, "pan.___", state 457, "((i>=2))" - line 265, "pan.___", state 461, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 265, "pan.___", state 461, "else" - line 430, "pan.___", state 463, "(1)" - line 430, "pan.___", state 463, "(1)" - line 596, "pan.___", state 466, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 596, "pan.___", state 467, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 596, "pan.___", state 468, "(1)" - line 271, "pan.___", state 472, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 483, "(1)" - line 279, "pan.___", state 494, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 503, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 519, "(1)" - line 252, "pan.___", state 527, "(1)" - line 256, "pan.___", state 539, "(1)" - line 260, "pan.___", state 547, "(1)" - line 410, "pan.___", state 565, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 579, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 597, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 611, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 629, "(1)" - line 252, "pan.___", state 637, "(1)" - line 256, "pan.___", state 649, "(1)" - line 260, "pan.___", state 657, "(1)" - line 410, "pan.___", state 683, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 715, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 729, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 747, "(1)" - line 256, "pan.___", state 767, "(1)" - line 260, "pan.___", state 775, "(1)" - line 410, "pan.___", state 794, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 796, "(1)" - line 410, "pan.___", state 797, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 410, "pan.___", state 797, "else" - line 410, "pan.___", state 800, "(1)" - line 414, "pan.___", state 808, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 810, "(1)" - line 414, "pan.___", state 811, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 414, "pan.___", state 811, "else" - line 414, "pan.___", state 814, "(1)" - line 414, "pan.___", state 815, "(1)" - line 414, "pan.___", state 815, "(1)" - line 412, "pan.___", state 820, "((i<1))" - line 412, "pan.___", state 820, "((i>=1))" - line 419, "pan.___", state 826, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 828, "(1)" - line 419, "pan.___", state 829, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 419, "pan.___", state 829, "else" - line 419, "pan.___", state 832, "(1)" - line 419, "pan.___", state 833, "(1)" - line 419, "pan.___", state 833, "(1)" - line 423, "pan.___", state 840, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 423, "pan.___", state 842, "(1)" - line 423, "pan.___", state 843, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 423, "pan.___", state 843, "else" - line 423, "pan.___", state 846, "(1)" - line 423, "pan.___", state 847, "(1)" - line 423, "pan.___", state 847, "(1)" - line 421, "pan.___", state 852, "((i<2))" - line 421, "pan.___", state 852, "((i>=2))" - line 248, "pan.___", state 858, "(1)" - line 252, "pan.___", state 866, "(1)" - line 252, "pan.___", state 867, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 252, "pan.___", state 867, "else" - line 250, "pan.___", state 872, "((i<1))" - line 250, "pan.___", state 872, "((i>=1))" - line 256, "pan.___", state 878, "(1)" - line 256, "pan.___", state 879, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 256, "pan.___", state 879, "else" - line 260, "pan.___", state 886, "(1)" - line 260, "pan.___", state 887, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 260, "pan.___", state 887, "else" - line 258, "pan.___", state 892, "((i<2))" - line 258, "pan.___", state 892, "((i>=2))" - line 265, "pan.___", state 896, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 265, "pan.___", state 896, "else" - line 430, "pan.___", state 898, "(1)" - line 430, "pan.___", state 898, "(1)" - line 604, "pan.___", state 902, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 410, "pan.___", state 907, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 921, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 939, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 953, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 971, "(1)" - line 252, "pan.___", state 979, "(1)" - line 256, "pan.___", state 991, "(1)" - line 260, "pan.___", state 999, "(1)" - line 410, "pan.___", state 1021, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1053, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1067, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1085, "(1)" - line 256, "pan.___", state 1105, "(1)" - line 260, "pan.___", state 1113, "(1)" - line 410, "pan.___", state 1136, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1168, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1182, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1200, "(1)" - line 256, "pan.___", state 1220, "(1)" - line 260, "pan.___", state 1228, "(1)" - line 410, "pan.___", state 1247, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1279, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1293, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1311, "(1)" - line 256, "pan.___", state 1331, "(1)" - line 260, "pan.___", state 1339, "(1)" - line 271, "pan.___", state 1360, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 1382, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 1391, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1407, "(1)" - line 252, "pan.___", state 1415, "(1)" - line 256, "pan.___", state 1427, "(1)" - line 260, "pan.___", state 1435, "(1)" - line 410, "pan.___", state 1453, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1467, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1485, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1499, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1517, "(1)" - line 252, "pan.___", state 1525, "(1)" - line 256, "pan.___", state 1537, "(1)" - line 260, "pan.___", state 1545, "(1)" - line 410, "pan.___", state 1564, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1578, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1596, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1610, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1628, "(1)" - line 252, "pan.___", state 1636, "(1)" - line 256, "pan.___", state 1648, "(1)" - line 260, "pan.___", state 1656, "(1)" - line 410, "pan.___", state 1678, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1710, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1724, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1742, "(1)" - line 256, "pan.___", state 1762, "(1)" - line 260, "pan.___", state 1770, "(1)" - line 643, "pan.___", state 1789, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 410, "pan.___", state 1796, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1828, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1842, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1860, "(1)" - line 256, "pan.___", state 1880, "(1)" - line 260, "pan.___", state 1888, "(1)" - line 410, "pan.___", state 1907, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 1939, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 1953, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1971, "(1)" - line 256, "pan.___", state 1991, "(1)" - line 260, "pan.___", state 1999, "(1)" - line 410, "pan.___", state 2020, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 2022, "(1)" - line 410, "pan.___", state 2023, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 410, "pan.___", state 2023, "else" - line 410, "pan.___", state 2026, "(1)" - line 414, "pan.___", state 2034, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 2036, "(1)" - line 414, "pan.___", state 2037, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 414, "pan.___", state 2037, "else" - line 414, "pan.___", state 2040, "(1)" - line 414, "pan.___", state 2041, "(1)" - line 414, "pan.___", state 2041, "(1)" - line 412, "pan.___", state 2046, "((i<1))" - line 412, "pan.___", state 2046, "((i>=1))" - line 419, "pan.___", state 2052, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 2054, "(1)" - line 419, "pan.___", state 2055, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 419, "pan.___", state 2055, "else" - line 419, "pan.___", state 2058, "(1)" - line 419, "pan.___", state 2059, "(1)" - line 419, "pan.___", state 2059, "(1)" - line 423, "pan.___", state 2066, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 423, "pan.___", state 2068, "(1)" - line 423, "pan.___", state 2069, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 423, "pan.___", state 2069, "else" - line 423, "pan.___", state 2072, "(1)" - line 423, "pan.___", state 2073, "(1)" - line 423, "pan.___", state 2073, "(1)" - line 421, "pan.___", state 2078, "((i<2))" - line 421, "pan.___", state 2078, "((i>=2))" - line 248, "pan.___", state 2084, "(1)" - line 252, "pan.___", state 2092, "(1)" - line 252, "pan.___", state 2093, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 252, "pan.___", state 2093, "else" - line 250, "pan.___", state 2098, "((i<1))" - line 250, "pan.___", state 2098, "((i>=1))" - line 256, "pan.___", state 2104, "(1)" - line 256, "pan.___", state 2105, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 256, "pan.___", state 2105, "else" - line 260, "pan.___", state 2112, "(1)" - line 260, "pan.___", state 2113, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 260, "pan.___", state 2113, "else" - line 258, "pan.___", state 2118, "((i<2))" - line 258, "pan.___", state 2118, "((i>=2))" - line 265, "pan.___", state 2122, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 265, "pan.___", state 2122, "else" - line 430, "pan.___", state 2124, "(1)" - line 430, "pan.___", state 2124, "(1)" - line 643, "pan.___", state 2127, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 643, "pan.___", state 2128, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 643, "pan.___", state 2129, "(1)" - line 271, "pan.___", state 2133, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 2155, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 2164, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 2180, "(1)" - line 252, "pan.___", state 2188, "(1)" - line 256, "pan.___", state 2200, "(1)" - line 260, "pan.___", state 2208, "(1)" - line 410, "pan.___", state 2226, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 2240, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 2258, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 2272, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 2290, "(1)" - line 252, "pan.___", state 2298, "(1)" - line 256, "pan.___", state 2310, "(1)" - line 260, "pan.___", state 2318, "(1)" - line 271, "pan.___", state 2340, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 2349, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 2362, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 2371, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 2387, "(1)" - line 252, "pan.___", state 2395, "(1)" - line 256, "pan.___", state 2407, "(1)" - line 260, "pan.___", state 2415, "(1)" - line 410, "pan.___", state 2433, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 2447, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 2465, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 2479, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 2497, "(1)" - line 252, "pan.___", state 2505, "(1)" - line 256, "pan.___", state 2517, "(1)" - line 260, "pan.___", state 2525, "(1)" - line 410, "pan.___", state 2544, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 2558, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 2576, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 2590, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 2608, "(1)" - line 252, "pan.___", state 2616, "(1)" - line 256, "pan.___", state 2628, "(1)" - line 260, "pan.___", state 2636, "(1)" - line 248, "pan.___", state 2667, "(1)" - line 256, "pan.___", state 2687, "(1)" - line 260, "pan.___", state 2695, "(1)" - line 248, "pan.___", state 2710, "(1)" - line 252, "pan.___", state 2718, "(1)" - line 256, "pan.___", state 2730, "(1)" - line 260, "pan.___", state 2738, "(1)" - line 897, "pan.___", state 2755, "-end-" - (259 of 2755 states) -unreached in proctype urcu_writer - line 410, "pan.___", state 18, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 32, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 50, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 248, "pan.___", state 82, "(1)" - line 252, "pan.___", state 90, "(1)" - line 256, "pan.___", state 102, "(1)" - line 271, "pan.___", state 131, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 140, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 153, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 207, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 225, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 239, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 257, "(1)" - line 252, "pan.___", state 265, "(1)" - line 256, "pan.___", state 277, "(1)" - line 260, "pan.___", state 285, "(1)" - line 414, "pan.___", state 320, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 338, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 352, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 252, "pan.___", state 378, "(1)" - line 256, "pan.___", state 390, "(1)" - line 260, "pan.___", state 398, "(1)" - line 414, "pan.___", state 441, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 459, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 473, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 252, "pan.___", state 499, "(1)" - line 256, "pan.___", state 511, "(1)" - line 260, "pan.___", state 519, "(1)" - line 414, "pan.___", state 552, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 570, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 584, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 252, "pan.___", state 610, "(1)" - line 256, "pan.___", state 622, "(1)" - line 260, "pan.___", state 630, "(1)" - line 414, "pan.___", state 665, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 419, "pan.___", state 683, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 423, "pan.___", state 697, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 252, "pan.___", state 723, "(1)" - line 256, "pan.___", state 735, "(1)" - line 260, "pan.___", state 743, "(1)" - line 271, "pan.___", state 796, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 805, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 820, "(1)" - line 283, "pan.___", state 827, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 843, "(1)" - line 252, "pan.___", state 851, "(1)" - line 256, "pan.___", state 863, "(1)" - line 260, "pan.___", state 871, "(1)" - line 275, "pan.___", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 909, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 918, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 934, "(1)" - line 252, "pan.___", state 942, "(1)" - line 256, "pan.___", state 954, "(1)" - line 260, "pan.___", state 962, "(1)" - line 275, "pan.___", state 987, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 1000, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 1009, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1025, "(1)" - line 252, "pan.___", state 1033, "(1)" - line 256, "pan.___", state 1045, "(1)" - line 260, "pan.___", state 1053, "(1)" - line 275, "pan.___", state 1078, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 279, "pan.___", state 1091, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 283, "pan.___", state 1100, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 248, "pan.___", state 1116, "(1)" - line 252, "pan.___", state 1124, "(1)" - line 256, "pan.___", state 1136, "(1)" - line 260, "pan.___", state 1144, "(1)" - line 1236, "pan.___", state 1159, "-end-" - (71 of 1159 states) -unreached in proctype :init: - (0 of 78 states) -unreached in proctype :never: - line 1299, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 265 seconds -pan: rate 14518.182 states/second -pan: avg transition delay 2.812e-06 usec -cp .input.spin urcu_free.spin.input -cp .input.spin.trail urcu_free.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free.ltl b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free.ltl deleted file mode 100644 index 6be1be9..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free.ltl +++ /dev/null @@ -1 +0,0 @@ -[] (!read_poison) diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free.spin.input b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free.spin.input deleted file mode 100644 index 3191ba1..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free.spin.input +++ /dev/null @@ -1,1272 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_nested.define b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_nested.define deleted file mode 100644 index 0fb59bd..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_nested.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_NEST_LEVEL 2 diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_mb.define b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_mb.define deleted file mode 100644 index d99d793..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_mb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_MB diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_mb.log b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_mb.log deleted file mode 100644 index 4cf70c8..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_mb.log +++ /dev/null @@ -1,639 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_mb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1295) -Depth= 8086 States= 1e+06 Transitions= 1.91e+07 Memory= 550.334 t= 51.2 R= 2e+04 -Depth= 8086 States= 2e+06 Transitions= 3.68e+07 Memory= 634.318 t= 98.4 R= 2e+04 -Depth= 8086 States= 3e+06 Transitions= 5.68e+07 Memory= 718.205 t= 153 R= 2e+04 -pan: resizing hashtable to -w22.. done -Depth= 8086 States= 4e+06 Transitions= 7.01e+07 Memory= 833.213 t= 188 R= 2e+04 -Depth= 8086 States= 5e+06 Transitions= 8.42e+07 Memory= 917.197 t= 225 R= 2e+04 -Depth= 8086 States= 6e+06 Transitions= 9.87e+07 Memory= 1001.182 t= 263 R= 2e+04 -Depth= 8086 States= 7e+06 Transitions= 1.12e+08 Memory= 1085.166 t= 298 R= 2e+04 -Depth= 8086 States= 8e+06 Transitions= 1.28e+08 Memory= 1169.053 t= 342 R= 2e+04 -Depth= 8086 States= 9e+06 Transitions= 1.62e+08 Memory= 1253.037 t= 436 R= 2e+04 -pan: resizing hashtable to -w24.. done -Depth= 8086 States= 1e+07 Transitions= 1.95e+08 Memory= 1461.018 t= 530 R= 2e+04 -Depth= 13700 States= 1.1e+07 Transitions= 2.31e+08 Memory= 1545.002 t= 629 R= 2e+04 -Depth= 13700 States= 1.2e+07 Transitions= 2.64e+08 Memory= 1628.986 t= 721 R= 2e+04 -Depth= 13700 States= 1.3e+07 Transitions= 2.89e+08 Memory= 1712.971 t= 789 R= 2e+04 -Depth= 13700 States= 1.4e+07 Transitions= 3.09e+08 Memory= 1796.955 t= 844 R= 2e+04 -Depth= 13700 States= 1.5e+07 Transitions= 3.29e+08 Memory= 1880.940 t= 897 R= 2e+04 -pan: claim violated! (at depth 1143) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 13700, errors: 1 - 15925114 states, stored -3.2589318e+08 states, matched -3.418183e+08 transitions (= stored+matched) -5.3108495e+09 atomic steps -hash conflicts: 1.8673119e+08 (resolved) - -Stats on memory usage (in Megabytes): - 1761.735 equivalent memory usage for states (stored*(State-vector + overhead)) - 1373.571 actual memory usage for states (compression: 77.97%) - state-vector as stored = 62 byte + 28 byte overhead - 128.000 memory used for hash table (-w24) - 457.764 memory used for DFS stack (-m10000000) - 1958.576 total actual memory usage - -unreached in proctype urcu_reader - line 411, "pan.___", state 21, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 53, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 67, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 85, "(1)" - line 257, "pan.___", state 105, "(1)" - line 261, "pan.___", state 113, "(1)" - line 603, "pan.___", state 132, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 411, "pan.___", state 139, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 171, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 185, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 203, "(1)" - line 257, "pan.___", state 223, "(1)" - line 261, "pan.___", state 231, "(1)" - line 411, "pan.___", state 250, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 282, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 296, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 314, "(1)" - line 257, "pan.___", state 334, "(1)" - line 261, "pan.___", state 342, "(1)" - line 411, "pan.___", state 363, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 365, "(1)" - line 411, "pan.___", state 366, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 366, "else" - line 411, "pan.___", state 369, "(1)" - line 415, "pan.___", state 377, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 379, "(1)" - line 415, "pan.___", state 380, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 380, "else" - line 415, "pan.___", state 383, "(1)" - line 415, "pan.___", state 384, "(1)" - line 415, "pan.___", state 384, "(1)" - line 413, "pan.___", state 389, "((i<1))" - line 413, "pan.___", state 389, "((i>=1))" - line 420, "pan.___", state 395, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 397, "(1)" - line 420, "pan.___", state 398, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 398, "else" - line 420, "pan.___", state 401, "(1)" - line 420, "pan.___", state 402, "(1)" - line 420, "pan.___", state 402, "(1)" - line 424, "pan.___", state 409, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 411, "(1)" - line 424, "pan.___", state 412, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 412, "else" - line 424, "pan.___", state 415, "(1)" - line 424, "pan.___", state 416, "(1)" - line 424, "pan.___", state 416, "(1)" - line 422, "pan.___", state 421, "((i<2))" - line 422, "pan.___", state 421, "((i>=2))" - line 249, "pan.___", state 427, "(1)" - line 253, "pan.___", state 435, "(1)" - line 253, "pan.___", state 436, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 436, "else" - line 251, "pan.___", state 441, "((i<1))" - line 251, "pan.___", state 441, "((i>=1))" - line 257, "pan.___", state 447, "(1)" - line 257, "pan.___", state 448, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 448, "else" - line 261, "pan.___", state 455, "(1)" - line 261, "pan.___", state 456, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 456, "else" - line 259, "pan.___", state 461, "((i<2))" - line 259, "pan.___", state 461, "((i>=2))" - line 266, "pan.___", state 465, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 465, "else" - line 431, "pan.___", state 467, "(1)" - line 431, "pan.___", state 467, "(1)" - line 603, "pan.___", state 470, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 603, "pan.___", state 471, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 603, "pan.___", state 472, "(1)" - line 272, "pan.___", state 476, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 478, "(1)" - line 276, "pan.___", state 485, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 487, "(1)" - line 276, "pan.___", state 488, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 488, "else" - line 274, "pan.___", state 493, "((i<1))" - line 274, "pan.___", state 493, "((i>=1))" - line 280, "pan.___", state 498, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 500, "(1)" - line 280, "pan.___", state 501, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 501, "else" - line 284, "pan.___", state 507, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 509, "(1)" - line 284, "pan.___", state 510, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 510, "else" - line 282, "pan.___", state 515, "((i<2))" - line 282, "pan.___", state 515, "((i>=2))" - line 249, "pan.___", state 523, "(1)" - line 253, "pan.___", state 531, "(1)" - line 253, "pan.___", state 532, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 532, "else" - line 251, "pan.___", state 537, "((i<1))" - line 251, "pan.___", state 537, "((i>=1))" - line 257, "pan.___", state 543, "(1)" - line 257, "pan.___", state 544, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 544, "else" - line 261, "pan.___", state 551, "(1)" - line 261, "pan.___", state 552, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 552, "else" - line 266, "pan.___", state 561, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 561, "else" - line 299, "pan.___", state 563, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 563, "else" - line 411, "pan.___", state 569, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 601, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 615, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 633, "(1)" - line 257, "pan.___", state 653, "(1)" - line 261, "pan.___", state 661, "(1)" - line 411, "pan.___", state 687, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 719, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 733, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 751, "(1)" - line 257, "pan.___", state 771, "(1)" - line 261, "pan.___", state 779, "(1)" - line 411, "pan.___", state 798, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 800, "(1)" - line 411, "pan.___", state 801, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 801, "else" - line 411, "pan.___", state 804, "(1)" - line 415, "pan.___", state 812, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 814, "(1)" - line 415, "pan.___", state 815, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 815, "else" - line 415, "pan.___", state 818, "(1)" - line 415, "pan.___", state 819, "(1)" - line 415, "pan.___", state 819, "(1)" - line 413, "pan.___", state 824, "((i<1))" - line 413, "pan.___", state 824, "((i>=1))" - line 420, "pan.___", state 830, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 832, "(1)" - line 420, "pan.___", state 833, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 833, "else" - line 420, "pan.___", state 836, "(1)" - line 420, "pan.___", state 837, "(1)" - line 420, "pan.___", state 837, "(1)" - line 424, "pan.___", state 844, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 846, "(1)" - line 424, "pan.___", state 847, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 847, "else" - line 424, "pan.___", state 850, "(1)" - line 424, "pan.___", state 851, "(1)" - line 424, "pan.___", state 851, "(1)" - line 422, "pan.___", state 856, "((i<2))" - line 422, "pan.___", state 856, "((i>=2))" - line 249, "pan.___", state 862, "(1)" - line 253, "pan.___", state 870, "(1)" - line 253, "pan.___", state 871, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 871, "else" - line 251, "pan.___", state 876, "((i<1))" - line 251, "pan.___", state 876, "((i>=1))" - line 257, "pan.___", state 882, "(1)" - line 257, "pan.___", state 883, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 883, "else" - line 261, "pan.___", state 890, "(1)" - line 261, "pan.___", state 891, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 891, "else" - line 259, "pan.___", state 896, "((i<2))" - line 259, "pan.___", state 896, "((i>=2))" - line 266, "pan.___", state 900, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 900, "else" - line 431, "pan.___", state 902, "(1)" - line 431, "pan.___", state 902, "(1)" - line 611, "pan.___", state 906, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 411, "pan.___", state 911, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 943, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 957, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 975, "(1)" - line 257, "pan.___", state 995, "(1)" - line 261, "pan.___", state 1003, "(1)" - line 411, "pan.___", state 1025, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1057, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1071, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1089, "(1)" - line 257, "pan.___", state 1109, "(1)" - line 261, "pan.___", state 1117, "(1)" - line 411, "pan.___", state 1140, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1172, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1186, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1204, "(1)" - line 257, "pan.___", state 1224, "(1)" - line 261, "pan.___", state 1232, "(1)" - line 411, "pan.___", state 1251, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1283, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1297, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1315, "(1)" - line 257, "pan.___", state 1335, "(1)" - line 261, "pan.___", state 1343, "(1)" - line 272, "pan.___", state 1364, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 1366, "(1)" - line 276, "pan.___", state 1373, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1375, "(1)" - line 276, "pan.___", state 1376, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 1376, "else" - line 274, "pan.___", state 1381, "((i<1))" - line 274, "pan.___", state 1381, "((i>=1))" - line 280, "pan.___", state 1386, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1388, "(1)" - line 280, "pan.___", state 1389, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 1389, "else" - line 284, "pan.___", state 1395, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1397, "(1)" - line 284, "pan.___", state 1398, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 1398, "else" - line 282, "pan.___", state 1403, "((i<2))" - line 282, "pan.___", state 1403, "((i>=2))" - line 249, "pan.___", state 1411, "(1)" - line 253, "pan.___", state 1419, "(1)" - line 253, "pan.___", state 1420, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 1420, "else" - line 251, "pan.___", state 1425, "((i<1))" - line 251, "pan.___", state 1425, "((i>=1))" - line 257, "pan.___", state 1431, "(1)" - line 257, "pan.___", state 1432, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 1432, "else" - line 261, "pan.___", state 1439, "(1)" - line 261, "pan.___", state 1440, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 1440, "else" - line 266, "pan.___", state 1449, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 1449, "else" - line 299, "pan.___", state 1451, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 1451, "else" - line 411, "pan.___", state 1457, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1489, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1503, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1521, "(1)" - line 257, "pan.___", state 1541, "(1)" - line 261, "pan.___", state 1549, "(1)" - line 411, "pan.___", state 1568, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1600, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1614, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1632, "(1)" - line 257, "pan.___", state 1652, "(1)" - line 261, "pan.___", state 1660, "(1)" - line 411, "pan.___", state 1682, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1714, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1728, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1746, "(1)" - line 257, "pan.___", state 1766, "(1)" - line 261, "pan.___", state 1774, "(1)" - line 650, "pan.___", state 1793, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 411, "pan.___", state 1800, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1832, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1846, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1864, "(1)" - line 257, "pan.___", state 1884, "(1)" - line 261, "pan.___", state 1892, "(1)" - line 411, "pan.___", state 1911, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1943, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1957, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1975, "(1)" - line 257, "pan.___", state 1995, "(1)" - line 261, "pan.___", state 2003, "(1)" - line 411, "pan.___", state 2024, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 2026, "(1)" - line 411, "pan.___", state 2027, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 2027, "else" - line 411, "pan.___", state 2030, "(1)" - line 415, "pan.___", state 2038, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2040, "(1)" - line 415, "pan.___", state 2041, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 2041, "else" - line 415, "pan.___", state 2044, "(1)" - line 415, "pan.___", state 2045, "(1)" - line 415, "pan.___", state 2045, "(1)" - line 413, "pan.___", state 2050, "((i<1))" - line 413, "pan.___", state 2050, "((i>=1))" - line 420, "pan.___", state 2056, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2058, "(1)" - line 420, "pan.___", state 2059, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 2059, "else" - line 420, "pan.___", state 2062, "(1)" - line 420, "pan.___", state 2063, "(1)" - line 420, "pan.___", state 2063, "(1)" - line 424, "pan.___", state 2070, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2072, "(1)" - line 424, "pan.___", state 2073, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 2073, "else" - line 424, "pan.___", state 2076, "(1)" - line 424, "pan.___", state 2077, "(1)" - line 424, "pan.___", state 2077, "(1)" - line 422, "pan.___", state 2082, "((i<2))" - line 422, "pan.___", state 2082, "((i>=2))" - line 249, "pan.___", state 2088, "(1)" - line 253, "pan.___", state 2096, "(1)" - line 253, "pan.___", state 2097, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 2097, "else" - line 251, "pan.___", state 2102, "((i<1))" - line 251, "pan.___", state 2102, "((i>=1))" - line 257, "pan.___", state 2108, "(1)" - line 257, "pan.___", state 2109, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 2109, "else" - line 261, "pan.___", state 2116, "(1)" - line 261, "pan.___", state 2117, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 2117, "else" - line 259, "pan.___", state 2122, "((i<2))" - line 259, "pan.___", state 2122, "((i>=2))" - line 266, "pan.___", state 2126, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 2126, "else" - line 431, "pan.___", state 2128, "(1)" - line 431, "pan.___", state 2128, "(1)" - line 650, "pan.___", state 2131, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 650, "pan.___", state 2132, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 650, "pan.___", state 2133, "(1)" - line 272, "pan.___", state 2137, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 2139, "(1)" - line 276, "pan.___", state 2146, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 2148, "(1)" - line 276, "pan.___", state 2149, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 2149, "else" - line 274, "pan.___", state 2154, "((i<1))" - line 274, "pan.___", state 2154, "((i>=1))" - line 280, "pan.___", state 2159, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2161, "(1)" - line 280, "pan.___", state 2162, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 2162, "else" - line 284, "pan.___", state 2168, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2170, "(1)" - line 284, "pan.___", state 2171, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 2171, "else" - line 282, "pan.___", state 2176, "((i<2))" - line 282, "pan.___", state 2176, "((i>=2))" - line 249, "pan.___", state 2184, "(1)" - line 253, "pan.___", state 2192, "(1)" - line 253, "pan.___", state 2193, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 2193, "else" - line 251, "pan.___", state 2198, "((i<1))" - line 251, "pan.___", state 2198, "((i>=1))" - line 257, "pan.___", state 2204, "(1)" - line 257, "pan.___", state 2205, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 2205, "else" - line 261, "pan.___", state 2212, "(1)" - line 261, "pan.___", state 2213, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 2213, "else" - line 266, "pan.___", state 2222, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 2222, "else" - line 299, "pan.___", state 2224, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 2224, "else" - line 411, "pan.___", state 2230, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2262, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2276, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2294, "(1)" - line 257, "pan.___", state 2314, "(1)" - line 261, "pan.___", state 2322, "(1)" - line 272, "pan.___", state 2344, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 2346, "(1)" - line 276, "pan.___", state 2353, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 2355, "(1)" - line 276, "pan.___", state 2356, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 2356, "else" - line 274, "pan.___", state 2361, "((i<1))" - line 274, "pan.___", state 2361, "((i>=1))" - line 280, "pan.___", state 2366, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2368, "(1)" - line 280, "pan.___", state 2369, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 2369, "else" - line 284, "pan.___", state 2375, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2377, "(1)" - line 284, "pan.___", state 2378, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 2378, "else" - line 282, "pan.___", state 2383, "((i<2))" - line 282, "pan.___", state 2383, "((i>=2))" - line 249, "pan.___", state 2391, "(1)" - line 253, "pan.___", state 2399, "(1)" - line 253, "pan.___", state 2400, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 2400, "else" - line 251, "pan.___", state 2405, "((i<1))" - line 251, "pan.___", state 2405, "((i>=1))" - line 257, "pan.___", state 2411, "(1)" - line 257, "pan.___", state 2412, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 2412, "else" - line 261, "pan.___", state 2419, "(1)" - line 261, "pan.___", state 2420, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 2420, "else" - line 266, "pan.___", state 2429, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 2429, "else" - line 299, "pan.___", state 2431, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 2431, "else" - line 411, "pan.___", state 2437, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2469, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2483, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2501, "(1)" - line 257, "pan.___", state 2521, "(1)" - line 261, "pan.___", state 2529, "(1)" - line 411, "pan.___", state 2548, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2580, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2594, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2612, "(1)" - line 257, "pan.___", state 2632, "(1)" - line 261, "pan.___", state 2640, "(1)" - line 249, "pan.___", state 2671, "(1)" - line 257, "pan.___", state 2691, "(1)" - line 261, "pan.___", state 2699, "(1)" - line 249, "pan.___", state 2714, "(1)" - line 257, "pan.___", state 2734, "(1)" - line 261, "pan.___", state 2742, "(1)" - line 898, "pan.___", state 2759, "-end-" - (306 of 2759 states) -unreached in proctype urcu_writer - line 411, "pan.___", state 20, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 26, "(1)" - line 415, "pan.___", state 34, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 40, "(1)" - line 415, "pan.___", state 41, "(1)" - line 415, "pan.___", state 41, "(1)" - line 413, "pan.___", state 46, "((i<1))" - line 413, "pan.___", state 46, "((i>=1))" - line 420, "pan.___", state 52, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 58, "(1)" - line 420, "pan.___", state 59, "(1)" - line 420, "pan.___", state 59, "(1)" - line 424, "pan.___", state 72, "(1)" - line 424, "pan.___", state 73, "(1)" - line 424, "pan.___", state 73, "(1)" - line 422, "pan.___", state 78, "((i<2))" - line 422, "pan.___", state 78, "((i>=2))" - line 249, "pan.___", state 84, "(1)" - line 253, "pan.___", state 92, "(1)" - line 253, "pan.___", state 93, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 93, "else" - line 251, "pan.___", state 98, "((i<1))" - line 251, "pan.___", state 98, "((i>=1))" - line 257, "pan.___", state 104, "(1)" - line 257, "pan.___", state 105, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 105, "else" - line 261, "pan.___", state 112, "(1)" - line 261, "pan.___", state 113, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 113, "else" - line 259, "pan.___", state 118, "((i<2))" - line 259, "pan.___", state 118, "((i>=2))" - line 266, "pan.___", state 122, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 122, "else" - line 431, "pan.___", state 124, "(1)" - line 431, "pan.___", state 124, "(1)" - line 272, "pan.___", state 133, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 142, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 274, "pan.___", state 150, "((i<1))" - line 274, "pan.___", state 150, "((i>=1))" - line 280, "pan.___", state 155, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 1021, "pan.___", state 183, "old_data = cached_rcu_ptr.val[_pid]" - line 1032, "pan.___", state 187, "_proc_urcu_writer = (_proc_urcu_writer|(1<<4))" - line 411, "pan.___", state 195, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 201, "(1)" - line 415, "pan.___", state 209, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 215, "(1)" - line 415, "pan.___", state 216, "(1)" - line 415, "pan.___", state 216, "(1)" - line 420, "pan.___", state 229, "(1)" - line 424, "pan.___", state 241, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 259, "(1)" - line 253, "pan.___", state 267, "(1)" - line 261, "pan.___", state 287, "(1)" - line 431, "pan.___", state 299, "(1)" - line 431, "pan.___", state 299, "(1)" - line 415, "pan.___", state 322, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 354, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 380, "(1)" - line 261, "pan.___", state 400, "(1)" - line 415, "pan.___", state 443, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 253, "pan.___", state 501, "(1)" - line 415, "pan.___", state 554, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 253, "pan.___", state 612, "(1)" - line 415, "pan.___", state 667, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 699, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 725, "(1)" - line 261, "pan.___", state 745, "(1)" - line 1168, "pan.___", state 770, "_proc_urcu_writer = (_proc_urcu_writer|(1<<13))" - line 272, "pan.___", state 798, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 800, "(1)" - line 276, "pan.___", state 807, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 809, "(1)" - line 276, "pan.___", state 810, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 810, "else" - line 274, "pan.___", state 815, "((i<1))" - line 274, "pan.___", state 815, "((i>=1))" - line 280, "pan.___", state 820, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 822, "(1)" - line 280, "pan.___", state 823, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 823, "else" - line 284, "pan.___", state 829, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 831, "(1)" - line 284, "pan.___", state 832, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 832, "else" - line 282, "pan.___", state 837, "((i<2))" - line 282, "pan.___", state 837, "((i>=2))" - line 249, "pan.___", state 845, "(1)" - line 253, "pan.___", state 853, "(1)" - line 253, "pan.___", state 854, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 854, "else" - line 251, "pan.___", state 859, "((i<1))" - line 251, "pan.___", state 859, "((i>=1))" - line 257, "pan.___", state 865, "(1)" - line 257, "pan.___", state 866, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 866, "else" - line 261, "pan.___", state 873, "(1)" - line 261, "pan.___", state 874, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 874, "else" - line 266, "pan.___", state 883, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 883, "else" - line 299, "pan.___", state 885, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 885, "else" - line 276, "pan.___", state 898, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 911, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 920, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 936, "(1)" - line 253, "pan.___", state 944, "(1)" - line 257, "pan.___", state 956, "(1)" - line 261, "pan.___", state 964, "(1)" - line 276, "pan.___", state 989, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1011, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1027, "(1)" - line 253, "pan.___", state 1035, "(1)" - line 257, "pan.___", state 1047, "(1)" - line 261, "pan.___", state 1055, "(1)" - line 272, "pan.___", state 1071, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 1073, "(1)" - line 276, "pan.___", state 1080, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 1082, "(1)" - line 276, "pan.___", state 1083, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 1083, "else" - line 274, "pan.___", state 1088, "((i<1))" - line 274, "pan.___", state 1088, "((i>=1))" - line 280, "pan.___", state 1093, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1095, "(1)" - line 280, "pan.___", state 1096, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 1096, "else" - line 284, "pan.___", state 1102, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1104, "(1)" - line 284, "pan.___", state 1105, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 1105, "else" - line 282, "pan.___", state 1110, "((i<2))" - line 282, "pan.___", state 1110, "((i>=2))" - line 249, "pan.___", state 1118, "(1)" - line 253, "pan.___", state 1126, "(1)" - line 253, "pan.___", state 1127, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 1127, "else" - line 251, "pan.___", state 1132, "((i<1))" - line 251, "pan.___", state 1132, "((i>=1))" - line 257, "pan.___", state 1138, "(1)" - line 257, "pan.___", state 1139, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 1139, "else" - line 261, "pan.___", state 1146, "(1)" - line 261, "pan.___", state 1147, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 1147, "else" - line 266, "pan.___", state 1156, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 1156, "else" - line 299, "pan.___", state 1158, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 1158, "else" - line 1237, "pan.___", state 1161, "-end-" - (113 of 1161 states) -unreached in proctype :init: - line 1248, "pan.___", state 9, "((j<2))" - line 1248, "pan.___", state 9, "((j>=2))" - line 1249, "pan.___", state 20, "((j<2))" - line 1249, "pan.___", state 20, "((j>=2))" - line 1254, "pan.___", state 33, "((j<2))" - line 1254, "pan.___", state 33, "((j>=2))" - line 1252, "pan.___", state 43, "((i<1))" - line 1252, "pan.___", state 43, "((i>=1))" - line 1262, "pan.___", state 54, "((j<2))" - line 1262, "pan.___", state 54, "((j>=2))" - line 1266, "pan.___", state 67, "((j<2))" - line 1266, "pan.___", state 67, "((j>=2))" - (6 of 78 states) -unreached in proctype :never: - line 1300, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 933 seconds -pan: rate 17076.039 states/second -pan: avg transition delay 2.7284e-06 usec -cp .input.spin urcu_free_no_mb.spin.input -cp .input.spin.trail urcu_free_no_mb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_mb.spin.input b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_mb.spin.input deleted file mode 100644 index a7ea865..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_mb.spin.input +++ /dev/null @@ -1,1273 +0,0 @@ -#define NO_MB - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_mb.spin.input.trail b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_mb.spin.input.trail deleted file mode 100644 index 39bdf85..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_mb.spin.input.trail +++ /dev/null @@ -1,1146 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:4000 -2:3:3920 -3:3:3923 -4:3:3923 -5:3:3926 -6:3:3934 -7:3:3934 -8:3:3937 -9:3:3943 -10:3:3947 -11:3:3947 -12:3:3950 -13:3:3960 -14:3:3968 -15:3:3968 -16:3:3971 -17:3:3977 -18:3:3981 -19:3:3981 -20:3:3984 -21:3:3990 -22:3:3994 -23:3:3995 -24:0:4000 -25:3:3997 -26:0:4000 -27:2:2761 -28:0:4000 -29:2:2767 -30:0:4000 -31:2:2768 -32:0:4000 -33:2:2770 -34:0:4000 -35:2:2771 -36:0:4000 -37:2:2772 -38:0:4000 -39:2:2773 -40:0:4000 -41:2:2774 -42:2:2775 -43:2:2779 -44:2:2780 -45:2:2788 -46:2:2789 -47:2:2793 -48:2:2794 -49:2:2802 -50:2:2807 -51:2:2811 -52:2:2812 -53:2:2820 -54:2:2821 -55:2:2825 -56:2:2826 -57:2:2820 -58:2:2821 -59:2:2825 -60:2:2826 -61:2:2834 -62:2:2839 -63:2:2846 -64:2:2847 -65:2:2854 -66:2:2859 -67:2:2866 -68:2:2867 -69:2:2866 -70:2:2867 -71:2:2874 -72:2:2884 -73:0:4000 -74:2:2773 -75:0:4000 -76:2:2888 -77:2:2892 -78:2:2893 -79:2:2897 -80:2:2901 -81:2:2902 -82:2:2906 -83:2:2914 -84:2:2915 -85:2:2919 -86:2:2923 -87:2:2924 -88:2:2919 -89:2:2920 -90:2:2928 -91:0:4000 -92:2:2773 -93:0:4000 -94:2:2936 -95:2:2937 -96:2:2938 -97:0:4000 -98:2:2773 -99:0:4000 -100:2:2946 -101:0:4000 -102:2:2773 -103:0:4000 -104:2:2949 -105:2:2950 -106:2:2954 -107:2:2955 -108:2:2963 -109:2:2964 -110:2:2968 -111:2:2969 -112:2:2977 -113:2:2982 -114:2:2983 -115:2:2995 -116:2:2996 -117:2:3000 -118:2:3001 -119:2:2995 -120:2:2996 -121:2:3000 -122:2:3001 -123:2:3009 -124:2:3014 -125:2:3021 -126:2:3022 -127:2:3029 -128:2:3034 -129:2:3041 -130:2:3042 -131:2:3041 -132:2:3042 -133:2:3049 -134:2:3058 -135:0:4000 -136:2:2773 -137:0:4000 -138:2:3062 -139:2:3063 -140:2:3064 -141:2:3076 -142:2:3077 -143:2:3081 -144:2:3082 -145:2:3090 -146:2:3095 -147:2:3099 -148:2:3100 -149:2:3108 -150:2:3109 -151:2:3113 -152:2:3114 -153:2:3108 -154:2:3109 -155:2:3113 -156:2:3114 -157:2:3122 -158:2:3127 -159:2:3134 -160:2:3135 -161:2:3142 -162:2:3147 -163:2:3154 -164:2:3155 -165:2:3154 -166:2:3155 -167:2:3162 -168:2:3175 -169:2:3176 -170:0:4000 -171:2:2773 -172:0:4000 -173:2:3183 -174:2:3184 -175:2:3188 -176:2:3189 -177:2:3197 -178:2:3198 -179:2:3202 -180:2:3203 -181:2:3211 -182:2:3216 -183:2:3220 -184:2:3221 -185:2:3229 -186:2:3230 -187:2:3234 -188:2:3235 -189:2:3229 -190:2:3230 -191:2:3234 -192:2:3235 -193:2:3243 -194:2:3248 -195:2:3255 -196:2:3256 -197:2:3263 -198:2:3268 -199:2:3275 -200:2:3276 -201:2:3275 -202:2:3276 -203:2:3283 -204:0:4000 -205:2:2773 -206:0:4000 -207:2:3294 -208:2:3295 -209:2:3299 -210:2:3300 -211:2:3308 -212:2:3309 -213:2:3313 -214:2:3314 -215:2:3322 -216:2:3327 -217:2:3331 -218:2:3332 -219:2:3340 -220:2:3341 -221:2:3345 -222:2:3346 -223:2:3340 -224:2:3341 -225:2:3345 -226:2:3346 -227:2:3354 -228:2:3359 -229:2:3366 -230:2:3367 -231:2:3374 -232:2:3379 -233:2:3386 -234:2:3387 -235:2:3386 -236:2:3387 -237:2:3394 -238:2:3403 -239:0:4000 -240:2:2773 -241:0:4000 -242:2:3407 -243:2:3408 -244:2:3409 -245:2:3421 -246:2:3422 -247:2:3426 -248:2:3427 -249:2:3435 -250:2:3440 -251:2:3444 -252:2:3445 -253:2:3453 -254:2:3454 -255:2:3458 -256:2:3459 -257:2:3453 -258:2:3454 -259:2:3458 -260:2:3459 -261:2:3467 -262:2:3472 -263:2:3479 -264:2:3480 -265:2:3487 -266:2:3492 -267:2:3499 -268:2:3500 -269:2:3499 -270:2:3500 -271:2:3507 -272:2:3519 -273:2:3520 -274:0:4000 -275:2:2773 -276:0:4000 -277:2:3529 -278:2:3530 -279:0:4000 -280:2:2773 -281:0:4000 -282:2:3534 -283:0:4000 -284:2:3542 -285:0:4000 -286:2:2768 -287:0:4000 -288:2:2770 -289:0:4000 -290:2:2771 -291:0:4000 -292:2:2772 -293:0:4000 -294:2:2773 -295:0:4000 -296:2:2774 -297:2:2775 -298:2:2779 -299:2:2780 -300:2:2788 -301:2:2789 -302:2:2793 -303:2:2794 -304:2:2802 -305:2:2807 -306:2:2811 -307:2:2812 -308:2:2820 -309:2:2821 -310:2:2822 -311:2:2820 -312:2:2821 -313:2:2825 -314:2:2826 -315:2:2834 -316:2:2839 -317:2:2846 -318:2:2847 -319:2:2854 -320:2:2859 -321:2:2866 -322:2:2867 -323:2:2866 -324:2:2867 -325:2:2874 -326:2:2884 -327:0:4000 -328:2:2773 -329:0:4000 -330:2:2888 -331:2:2892 -332:2:2893 -333:2:2897 -334:2:2901 -335:2:2902 -336:2:2906 -337:2:2914 -338:2:2915 -339:2:2919 -340:2:2920 -341:2:2919 -342:2:2923 -343:2:2924 -344:2:2928 -345:0:4000 -346:2:2773 -347:0:4000 -348:2:2936 -349:2:2937 -350:2:2938 -351:0:4000 -352:2:2773 -353:0:4000 -354:2:2946 -355:0:4000 -356:2:2773 -357:0:4000 -358:2:2949 -359:2:2950 -360:2:2954 -361:2:2955 -362:2:2963 -363:2:2964 -364:2:2968 -365:2:2969 -366:2:2977 -367:2:2982 -368:2:2983 -369:2:2995 -370:2:2996 -371:2:3000 -372:2:3001 -373:2:2995 -374:2:2996 -375:2:3000 -376:2:3001 -377:2:3009 -378:2:3014 -379:2:3021 -380:2:3022 -381:2:3029 -382:2:3034 -383:2:3041 -384:2:3042 -385:2:3041 -386:2:3042 -387:2:3049 -388:2:3058 -389:0:4000 -390:2:2773 -391:0:4000 -392:2:3062 -393:2:3063 -394:2:3064 -395:2:3076 -396:2:3077 -397:2:3081 -398:2:3082 -399:2:3090 -400:2:3095 -401:2:3099 -402:2:3100 -403:2:3108 -404:2:3109 -405:2:3113 -406:2:3114 -407:2:3108 -408:2:3109 -409:2:3113 -410:2:3114 -411:2:3122 -412:2:3127 -413:2:3134 -414:2:3135 -415:2:3142 -416:2:3147 -417:2:3154 -418:2:3155 -419:2:3154 -420:2:3155 -421:2:3162 -422:2:3175 -423:2:3176 -424:0:4000 -425:2:2773 -426:0:4000 -427:2:3183 -428:2:3184 -429:2:3188 -430:2:3189 -431:2:3197 -432:2:3198 -433:2:3202 -434:2:3203 -435:2:3211 -436:2:3216 -437:2:3220 -438:2:3221 -439:2:3229 -440:2:3230 -441:2:3234 -442:2:3235 -443:2:3229 -444:2:3230 -445:2:3234 -446:2:3235 -447:2:3243 -448:2:3248 -449:2:3255 -450:2:3256 -451:2:3263 -452:2:3268 -453:2:3275 -454:2:3276 -455:2:3275 -456:2:3276 -457:2:3283 -458:0:4000 -459:2:2773 -460:0:4000 -461:2:3294 -462:2:3295 -463:2:3299 -464:2:3300 -465:2:3308 -466:2:3309 -467:2:3313 -468:2:3314 -469:2:3322 -470:2:3327 -471:2:3331 -472:2:3332 -473:2:3340 -474:2:3341 -475:2:3345 -476:2:3346 -477:2:3340 -478:2:3341 -479:2:3345 -480:2:3346 -481:2:3354 -482:2:3359 -483:2:3366 -484:2:3367 -485:2:3374 -486:2:3379 -487:2:3386 -488:2:3387 -489:2:3386 -490:2:3387 -491:2:3394 -492:2:3403 -493:0:4000 -494:2:2773 -495:0:4000 -496:2:3407 -497:2:3408 -498:2:3409 -499:2:3421 -500:2:3422 -501:2:3426 -502:2:3427 -503:2:3435 -504:2:3440 -505:2:3444 -506:2:3445 -507:2:3453 -508:2:3454 -509:2:3458 -510:2:3459 -511:2:3453 -512:2:3454 -513:2:3458 -514:2:3459 -515:2:3467 -516:2:3472 -517:2:3479 -518:2:3480 -519:2:3487 -520:2:3492 -521:2:3499 -522:2:3500 -523:2:3499 -524:2:3500 -525:2:3507 -526:2:3519 -527:2:3520 -528:0:4000 -529:2:2773 -530:0:4000 -531:2:3529 -532:2:3530 -533:0:4000 -534:2:2773 -535:0:4000 -536:2:3534 -537:0:4000 -538:2:3542 -539:0:4000 -540:2:2768 -541:0:4000 -542:2:2770 -543:0:4000 -544:2:2771 -545:0:4000 -546:2:2772 -547:0:4000 -548:2:2773 -549:0:4000 -550:2:2774 -551:2:2775 -552:2:2779 -553:2:2780 -554:2:2788 -555:2:2789 -556:2:2793 -557:2:2794 -558:2:2802 -559:2:2807 -560:2:2811 -561:2:2812 -562:2:2820 -563:2:2821 -564:2:2825 -565:2:2826 -566:2:2820 -567:2:2821 -568:2:2822 -569:2:2834 -570:2:2839 -571:2:2846 -572:2:2847 -573:2:2854 -574:2:2859 -575:2:2866 -576:2:2867 -577:2:2866 -578:2:2867 -579:2:2874 -580:2:2884 -581:0:4000 -582:2:2773 -583:0:4000 -584:2:2888 -585:2:2892 -586:2:2893 -587:2:2897 -588:2:2901 -589:2:2902 -590:2:2906 -591:2:2914 -592:2:2915 -593:2:2919 -594:2:2923 -595:2:2924 -596:2:2919 -597:2:2920 -598:2:2928 -599:0:4000 -600:2:2773 -601:0:4000 -602:2:2936 -603:2:2937 -604:2:2938 -605:0:4000 -606:2:2773 -607:0:4000 -608:2:2946 -609:0:4000 -610:2:2773 -611:0:4000 -612:2:2949 -613:2:2950 -614:2:2954 -615:2:2955 -616:2:2963 -617:2:2964 -618:2:2968 -619:2:2969 -620:2:2977 -621:2:2990 -622:2:2991 -623:2:2995 -624:2:2996 -625:2:3000 -626:2:3001 -627:2:2995 -628:2:2996 -629:2:3000 -630:2:3001 -631:2:3009 -632:2:3014 -633:2:3021 -634:2:3022 -635:2:3029 -636:2:3036 -637:2:3037 -638:2:3041 -639:2:3042 -640:2:3041 -641:2:3042 -642:2:3049 -643:2:3058 -644:0:4000 -645:2:2773 -646:0:4000 -647:2:3062 -648:2:3063 -649:2:3064 -650:2:3076 -651:2:3077 -652:2:3081 -653:2:3082 -654:2:3090 -655:2:3103 -656:2:3104 -657:2:3108 -658:2:3109 -659:2:3113 -660:2:3114 -661:2:3108 -662:2:3109 -663:2:3113 -664:2:3114 -665:2:3122 -666:2:3127 -667:2:3134 -668:2:3135 -669:2:3142 -670:2:3149 -671:2:3150 -672:2:3154 -673:2:3155 -674:2:3154 -675:2:3155 -676:2:3162 -677:2:3175 -678:2:3176 -679:0:4000 -680:2:2773 -681:0:4000 -682:2:3183 -683:2:3184 -684:2:3188 -685:2:3189 -686:2:3197 -687:2:3198 -688:2:3202 -689:2:3203 -690:2:3211 -691:2:3224 -692:2:3225 -693:2:3229 -694:2:3230 -695:2:3234 -696:2:3235 -697:2:3229 -698:2:3230 -699:2:3234 -700:2:3235 -701:2:3243 -702:2:3248 -703:2:3255 -704:2:3256 -705:2:3263 -706:2:3270 -707:2:3271 -708:2:3275 -709:2:3276 -710:2:3275 -711:2:3276 -712:2:3283 -713:0:4000 -714:2:2773 -715:0:4000 -716:2:3407 -717:2:3408 -718:2:3412 -719:2:3413 -720:2:3421 -721:2:3422 -722:2:3426 -723:2:3427 -724:2:3435 -725:2:3448 -726:2:3449 -727:2:3453 -728:2:3454 -729:2:3458 -730:2:3459 -731:2:3453 -732:2:3454 -733:2:3458 -734:2:3459 -735:2:3467 -736:2:3472 -737:2:3479 -738:2:3480 -739:2:3487 -740:2:3494 -741:2:3495 -742:2:3499 -743:2:3500 -744:2:3499 -745:2:3500 -746:2:3507 -747:2:3519 -748:2:3520 -749:0:4000 -750:2:2773 -751:0:4000 -752:2:3529 -753:2:3530 -754:0:4000 -755:2:2773 -756:0:4000 -757:2:3294 -758:2:3295 -759:2:3299 -760:2:3300 -761:2:3308 -762:2:3309 -763:2:3313 -764:2:3314 -765:2:3322 -766:2:3335 -767:2:3336 -768:2:3340 -769:2:3341 -770:2:3342 -771:2:3340 -772:2:3341 -773:2:3345 -774:2:3346 -775:2:3354 -776:2:3359 -777:2:3366 -778:2:3367 -779:2:3374 -780:2:3381 -781:2:3382 -782:2:3386 -783:2:3387 -784:2:3386 -785:2:3387 -786:2:3394 -787:2:3403 -788:0:4000 -789:2:2773 -790:0:4000 -791:2:3534 -792:0:4000 -793:2:3542 -794:0:4000 -795:2:3543 -796:0:4000 -797:2:3548 -798:0:4000 -799:1:2 -800:0:4000 -801:2:3549 -802:0:4000 -803:1:8 -804:0:4000 -805:2:3548 -806:0:4000 -807:1:9 -808:0:4000 -809:2:3549 -810:0:4000 -811:1:10 -812:0:4000 -813:2:3548 -814:0:4000 -815:1:11 -816:0:4000 -817:2:3549 -818:0:4000 -819:1:12 -820:0:4000 -821:2:3548 -822:0:4000 -823:1:13 -824:0:4000 -825:2:3549 -826:0:4000 -827:1:14 -828:0:4000 -829:2:3548 -830:0:4000 -831:1:15 -832:0:4000 -833:2:3549 -834:0:4000 -835:1:16 -836:1:17 -837:1:21 -838:1:22 -839:1:30 -840:1:31 -841:1:35 -842:1:36 -843:1:44 -844:1:49 -845:1:53 -846:1:54 -847:1:62 -848:1:63 -849:1:67 -850:1:68 -851:1:62 -852:1:63 -853:1:67 -854:1:68 -855:1:76 -856:1:81 -857:1:88 -858:1:89 -859:1:96 -860:1:101 -861:1:108 -862:1:109 -863:1:108 -864:1:109 -865:1:116 -866:0:4000 -867:2:3548 -868:0:4000 -869:1:15 -870:0:4000 -871:2:3549 -872:0:4000 -873:1:127 -874:1:128 -875:0:4000 -876:2:3548 -877:0:4000 -878:1:15 -879:0:4000 -880:2:3549 -881:0:4000 -882:1:134 -883:1:135 -884:1:139 -885:1:140 -886:1:148 -887:1:149 -888:1:153 -889:1:154 -890:1:162 -891:1:167 -892:1:171 -893:1:172 -894:1:180 -895:1:181 -896:1:185 -897:1:186 -898:1:180 -899:1:181 -900:1:185 -901:1:186 -902:1:194 -903:1:199 -904:1:206 -905:1:207 -906:1:214 -907:1:219 -908:1:226 -909:1:227 -910:1:226 -911:1:227 -912:1:234 -913:0:4000 -914:2:3548 -915:0:4000 -916:1:15 -917:0:4000 -918:2:3549 -919:0:4000 -920:1:245 -921:1:246 -922:1:250 -923:1:251 -924:1:259 -925:1:260 -926:1:264 -927:1:265 -928:1:273 -929:1:278 -930:1:282 -931:1:283 -932:1:291 -933:1:292 -934:1:296 -935:1:297 -936:1:291 -937:1:292 -938:1:296 -939:1:297 -940:1:305 -941:1:310 -942:1:317 -943:1:318 -944:1:325 -945:1:330 -946:1:337 -947:1:338 -948:1:337 -949:1:338 -950:1:345 -951:1:354 -952:0:4000 -953:2:3548 -954:0:4000 -955:1:15 -956:0:4000 -957:2:3549 -958:0:4000 -959:1:564 -960:1:565 -961:1:569 -962:1:570 -963:1:578 -964:1:579 -965:1:580 -966:1:592 -967:1:597 -968:1:601 -969:1:602 -970:1:610 -971:1:611 -972:1:615 -973:1:616 -974:1:610 -975:1:611 -976:1:615 -977:1:616 -978:1:624 -979:1:629 -980:1:636 -981:1:637 -982:1:644 -983:1:649 -984:1:656 -985:1:657 -986:1:656 -987:1:657 -988:1:664 -989:0:4000 -990:2:3548 -991:0:4000 -992:1:15 -993:0:4000 -994:2:3549 -995:0:4000 -996:1:675 -997:1:678 -998:1:679 -999:0:4000 -1000:2:3548 -1001:0:4000 -1002:1:15 -1003:0:4000 -1004:2:3549 -1005:0:4000 -1006:1:682 -1007:1:683 -1008:1:687 -1009:1:688 -1010:1:696 -1011:1:697 -1012:1:701 -1013:1:702 -1014:1:710 -1015:1:715 -1016:1:719 -1017:1:720 -1018:1:728 -1019:1:729 -1020:1:733 -1021:1:734 -1022:1:728 -1023:1:729 -1024:1:733 -1025:1:734 -1026:1:742 -1027:1:747 -1028:1:754 -1029:1:755 -1030:1:762 -1031:1:767 -1032:1:774 -1033:1:775 -1034:1:774 -1035:1:775 -1036:1:782 -1037:0:4000 -1038:2:3548 -1039:0:4000 -1040:1:15 -1041:0:4000 -1042:2:3549 -1043:0:4000 -1044:1:906 -1045:1:907 -1046:1:911 -1047:1:912 -1048:1:920 -1049:1:921 -1050:1:925 -1051:1:926 -1052:1:934 -1053:1:939 -1054:1:943 -1055:1:944 -1056:1:952 -1057:1:953 -1058:1:957 -1059:1:958 -1060:1:952 -1061:1:953 -1062:1:957 -1063:1:958 -1064:1:966 -1065:1:971 -1066:1:978 -1067:1:979 -1068:1:986 -1069:1:991 -1070:1:998 -1071:1:999 -1072:1:998 -1073:1:999 -1074:1:1006 -1075:1:1015 -1076:1:1019 -1077:0:4000 -1078:2:3548 -1079:0:4000 -1080:1:15 -1081:0:4000 -1082:2:3549 -1083:0:4000 -1084:1:1020 -1085:1:1021 -1086:1:1025 -1087:1:1026 -1088:1:1034 -1089:1:1035 -1090:1:1036 -1091:1:1048 -1092:1:1053 -1093:1:1057 -1094:1:1058 -1095:1:1066 -1096:1:1067 -1097:1:1071 -1098:1:1072 -1099:1:1066 -1100:1:1067 -1101:1:1071 -1102:1:1072 -1103:1:1080 -1104:1:1085 -1105:1:1092 -1106:1:1093 -1107:1:1100 -1108:1:1105 -1109:1:1112 -1110:1:1113 -1111:1:1112 -1112:1:1113 -1113:1:1120 -1114:0:4000 -1115:2:3548 -1116:0:4000 -1117:1:15 -1118:0:4000 -1119:2:3549 -1120:0:4000 -1121:1:1131 -1122:0:4000 -1123:2:3548 -1124:0:4000 -1125:1:2667 -1126:1:2674 -1127:1:2675 -1128:1:2682 -1129:1:2687 -1130:1:2694 -1131:1:2695 -1132:1:2694 -1133:1:2695 -1134:1:2702 -1135:1:2706 -1136:0:4000 -1137:2:3549 -1138:0:4000 -1139:1:1133 -1140:1:1134 -1141:0:3998 -1142:2:3548 -1143:0:4004 -1144:0:4000 diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_rmb.define b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_rmb.log b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_rmb.log deleted file mode 100644 index 00d7df3..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_rmb.log +++ /dev/null @@ -1,448 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_rmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1295) -Depth= 4907 States= 1e+06 Transitions= 2.54e+07 Memory= 550.432 t= 71.2 R= 1e+04 -Depth= 5133 States= 2e+06 Transitions= 5.13e+07 Memory= 634.318 t= 145 R= 1e+04 -Depth= 5133 States= 3e+06 Transitions= 7.76e+07 Memory= 718.303 t= 220 R= 1e+04 -pan: resizing hashtable to -w22.. done - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 5133, errors: 0 - 3846927 states, stored - 96650452 states, matched -1.0049738e+08 transitions (= stored+matched) -1.6169296e+09 atomic steps -hash conflicts: 68306904 (resolved) - -Stats on memory usage (in Megabytes): - 425.571 equivalent memory usage for states (stored*(State-vector + overhead)) - 330.939 actual memory usage for states (compression: 77.76%) - state-vector as stored = 62 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 820.420 total actual memory usage - -unreached in proctype urcu_reader - line 411, "pan.___", state 17, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 49, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 63, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 81, "(1)" - line 257, "pan.___", state 101, "(1)" - line 261, "pan.___", state 109, "(1)" - line 597, "pan.___", state 128, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 411, "pan.___", state 135, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 167, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 181, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 199, "(1)" - line 257, "pan.___", state 219, "(1)" - line 261, "pan.___", state 227, "(1)" - line 411, "pan.___", state 246, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 278, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 292, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 310, "(1)" - line 257, "pan.___", state 330, "(1)" - line 261, "pan.___", state 338, "(1)" - line 411, "pan.___", state 359, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 361, "(1)" - line 411, "pan.___", state 362, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 362, "else" - line 411, "pan.___", state 365, "(1)" - line 415, "pan.___", state 373, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 375, "(1)" - line 415, "pan.___", state 376, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 376, "else" - line 415, "pan.___", state 379, "(1)" - line 415, "pan.___", state 380, "(1)" - line 415, "pan.___", state 380, "(1)" - line 413, "pan.___", state 385, "((i<1))" - line 413, "pan.___", state 385, "((i>=1))" - line 420, "pan.___", state 391, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 393, "(1)" - line 420, "pan.___", state 394, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 394, "else" - line 420, "pan.___", state 397, "(1)" - line 420, "pan.___", state 398, "(1)" - line 420, "pan.___", state 398, "(1)" - line 424, "pan.___", state 405, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 407, "(1)" - line 424, "pan.___", state 408, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 408, "else" - line 424, "pan.___", state 411, "(1)" - line 424, "pan.___", state 412, "(1)" - line 424, "pan.___", state 412, "(1)" - line 422, "pan.___", state 417, "((i<2))" - line 422, "pan.___", state 417, "((i>=2))" - line 249, "pan.___", state 423, "(1)" - line 253, "pan.___", state 431, "(1)" - line 253, "pan.___", state 432, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 432, "else" - line 251, "pan.___", state 437, "((i<1))" - line 251, "pan.___", state 437, "((i>=1))" - line 257, "pan.___", state 443, "(1)" - line 257, "pan.___", state 444, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 444, "else" - line 261, "pan.___", state 451, "(1)" - line 261, "pan.___", state 452, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 452, "else" - line 259, "pan.___", state 457, "((i<2))" - line 259, "pan.___", state 457, "((i>=2))" - line 266, "pan.___", state 461, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 461, "else" - line 431, "pan.___", state 463, "(1)" - line 431, "pan.___", state 463, "(1)" - line 597, "pan.___", state 466, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 597, "pan.___", state 467, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 597, "pan.___", state 468, "(1)" - line 272, "pan.___", state 472, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 483, "(1)" - line 280, "pan.___", state 494, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 503, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 519, "(1)" - line 253, "pan.___", state 527, "(1)" - line 257, "pan.___", state 539, "(1)" - line 261, "pan.___", state 547, "(1)" - line 411, "pan.___", state 565, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 579, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 597, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 611, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 629, "(1)" - line 253, "pan.___", state 637, "(1)" - line 257, "pan.___", state 649, "(1)" - line 261, "pan.___", state 657, "(1)" - line 411, "pan.___", state 683, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 715, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 729, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 747, "(1)" - line 257, "pan.___", state 767, "(1)" - line 261, "pan.___", state 775, "(1)" - line 411, "pan.___", state 794, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 796, "(1)" - line 411, "pan.___", state 797, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 797, "else" - line 411, "pan.___", state 800, "(1)" - line 415, "pan.___", state 808, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 810, "(1)" - line 415, "pan.___", state 811, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 811, "else" - line 415, "pan.___", state 814, "(1)" - line 415, "pan.___", state 815, "(1)" - line 415, "pan.___", state 815, "(1)" - line 413, "pan.___", state 820, "((i<1))" - line 413, "pan.___", state 820, "((i>=1))" - line 420, "pan.___", state 826, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 828, "(1)" - line 420, "pan.___", state 829, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 829, "else" - line 420, "pan.___", state 832, "(1)" - line 420, "pan.___", state 833, "(1)" - line 420, "pan.___", state 833, "(1)" - line 424, "pan.___", state 840, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 842, "(1)" - line 424, "pan.___", state 843, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 843, "else" - line 424, "pan.___", state 846, "(1)" - line 424, "pan.___", state 847, "(1)" - line 424, "pan.___", state 847, "(1)" - line 422, "pan.___", state 852, "((i<2))" - line 422, "pan.___", state 852, "((i>=2))" - line 249, "pan.___", state 858, "(1)" - line 253, "pan.___", state 866, "(1)" - line 253, "pan.___", state 867, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 867, "else" - line 251, "pan.___", state 872, "((i<1))" - line 251, "pan.___", state 872, "((i>=1))" - line 257, "pan.___", state 878, "(1)" - line 257, "pan.___", state 879, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 879, "else" - line 261, "pan.___", state 886, "(1)" - line 261, "pan.___", state 887, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 887, "else" - line 259, "pan.___", state 892, "((i<2))" - line 259, "pan.___", state 892, "((i>=2))" - line 266, "pan.___", state 896, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 896, "else" - line 431, "pan.___", state 898, "(1)" - line 431, "pan.___", state 898, "(1)" - line 605, "pan.___", state 902, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 411, "pan.___", state 907, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 921, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 939, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 953, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 971, "(1)" - line 253, "pan.___", state 979, "(1)" - line 257, "pan.___", state 991, "(1)" - line 261, "pan.___", state 999, "(1)" - line 411, "pan.___", state 1021, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1053, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1067, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1085, "(1)" - line 257, "pan.___", state 1105, "(1)" - line 261, "pan.___", state 1113, "(1)" - line 411, "pan.___", state 1136, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1168, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1182, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1200, "(1)" - line 257, "pan.___", state 1220, "(1)" - line 261, "pan.___", state 1228, "(1)" - line 411, "pan.___", state 1247, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1279, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1293, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1311, "(1)" - line 257, "pan.___", state 1331, "(1)" - line 261, "pan.___", state 1339, "(1)" - line 272, "pan.___", state 1360, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1382, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1391, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1407, "(1)" - line 253, "pan.___", state 1415, "(1)" - line 257, "pan.___", state 1427, "(1)" - line 261, "pan.___", state 1435, "(1)" - line 411, "pan.___", state 1453, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1467, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1485, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1499, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1517, "(1)" - line 253, "pan.___", state 1525, "(1)" - line 257, "pan.___", state 1537, "(1)" - line 261, "pan.___", state 1545, "(1)" - line 411, "pan.___", state 1564, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1578, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1596, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1610, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1628, "(1)" - line 253, "pan.___", state 1636, "(1)" - line 257, "pan.___", state 1648, "(1)" - line 261, "pan.___", state 1656, "(1)" - line 411, "pan.___", state 1678, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1710, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1724, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1742, "(1)" - line 257, "pan.___", state 1762, "(1)" - line 261, "pan.___", state 1770, "(1)" - line 644, "pan.___", state 1789, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 411, "pan.___", state 1796, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1828, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1842, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1860, "(1)" - line 257, "pan.___", state 1880, "(1)" - line 261, "pan.___", state 1888, "(1)" - line 411, "pan.___", state 1907, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1939, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1953, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1971, "(1)" - line 257, "pan.___", state 1991, "(1)" - line 261, "pan.___", state 1999, "(1)" - line 411, "pan.___", state 2020, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 2022, "(1)" - line 411, "pan.___", state 2023, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 2023, "else" - line 411, "pan.___", state 2026, "(1)" - line 415, "pan.___", state 2034, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2036, "(1)" - line 415, "pan.___", state 2037, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 2037, "else" - line 415, "pan.___", state 2040, "(1)" - line 415, "pan.___", state 2041, "(1)" - line 415, "pan.___", state 2041, "(1)" - line 413, "pan.___", state 2046, "((i<1))" - line 413, "pan.___", state 2046, "((i>=1))" - line 420, "pan.___", state 2052, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2054, "(1)" - line 420, "pan.___", state 2055, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 2055, "else" - line 420, "pan.___", state 2058, "(1)" - line 420, "pan.___", state 2059, "(1)" - line 420, "pan.___", state 2059, "(1)" - line 424, "pan.___", state 2066, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2068, "(1)" - line 424, "pan.___", state 2069, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 2069, "else" - line 424, "pan.___", state 2072, "(1)" - line 424, "pan.___", state 2073, "(1)" - line 424, "pan.___", state 2073, "(1)" - line 422, "pan.___", state 2078, "((i<2))" - line 422, "pan.___", state 2078, "((i>=2))" - line 249, "pan.___", state 2084, "(1)" - line 253, "pan.___", state 2092, "(1)" - line 253, "pan.___", state 2093, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 2093, "else" - line 251, "pan.___", state 2098, "((i<1))" - line 251, "pan.___", state 2098, "((i>=1))" - line 257, "pan.___", state 2104, "(1)" - line 257, "pan.___", state 2105, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 2105, "else" - line 261, "pan.___", state 2112, "(1)" - line 261, "pan.___", state 2113, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 2113, "else" - line 259, "pan.___", state 2118, "((i<2))" - line 259, "pan.___", state 2118, "((i>=2))" - line 266, "pan.___", state 2122, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 2122, "else" - line 431, "pan.___", state 2124, "(1)" - line 431, "pan.___", state 2124, "(1)" - line 644, "pan.___", state 2127, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 644, "pan.___", state 2128, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 644, "pan.___", state 2129, "(1)" - line 272, "pan.___", state 2133, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2155, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2164, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2180, "(1)" - line 253, "pan.___", state 2188, "(1)" - line 257, "pan.___", state 2200, "(1)" - line 261, "pan.___", state 2208, "(1)" - line 411, "pan.___", state 2226, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2240, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2258, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2272, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2290, "(1)" - line 253, "pan.___", state 2298, "(1)" - line 257, "pan.___", state 2310, "(1)" - line 261, "pan.___", state 2318, "(1)" - line 272, "pan.___", state 2340, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 2349, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2362, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2371, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2387, "(1)" - line 253, "pan.___", state 2395, "(1)" - line 257, "pan.___", state 2407, "(1)" - line 261, "pan.___", state 2415, "(1)" - line 411, "pan.___", state 2433, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2447, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2465, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2479, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2497, "(1)" - line 253, "pan.___", state 2505, "(1)" - line 257, "pan.___", state 2517, "(1)" - line 261, "pan.___", state 2525, "(1)" - line 411, "pan.___", state 2544, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2558, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2576, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2590, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2608, "(1)" - line 253, "pan.___", state 2616, "(1)" - line 257, "pan.___", state 2628, "(1)" - line 261, "pan.___", state 2636, "(1)" - line 411, "pan.___", state 2667, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2699, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2713, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2731, "(1)" - line 257, "pan.___", state 2751, "(1)" - line 261, "pan.___", state 2759, "(1)" - line 411, "pan.___", state 2776, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2790, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2808, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2822, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2840, "(1)" - line 253, "pan.___", state 2848, "(1)" - line 257, "pan.___", state 2860, "(1)" - line 261, "pan.___", state 2868, "(1)" - line 898, "pan.___", state 2887, "-end-" - (266 of 2887 states) -unreached in proctype urcu_writer - line 411, "pan.___", state 18, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 32, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 50, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 249, "pan.___", state 82, "(1)" - line 253, "pan.___", state 90, "(1)" - line 257, "pan.___", state 102, "(1)" - line 272, "pan.___", state 131, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 140, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 153, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 207, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 225, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 239, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 257, "(1)" - line 253, "pan.___", state 265, "(1)" - line 257, "pan.___", state 277, "(1)" - line 261, "pan.___", state 285, "(1)" - line 415, "pan.___", state 320, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 338, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 352, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 378, "(1)" - line 257, "pan.___", state 390, "(1)" - line 261, "pan.___", state 398, "(1)" - line 415, "pan.___", state 441, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 459, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 473, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 499, "(1)" - line 257, "pan.___", state 511, "(1)" - line 261, "pan.___", state 519, "(1)" - line 415, "pan.___", state 552, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 570, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 584, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 610, "(1)" - line 257, "pan.___", state 622, "(1)" - line 261, "pan.___", state 630, "(1)" - line 415, "pan.___", state 665, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 683, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 697, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 723, "(1)" - line 257, "pan.___", state 735, "(1)" - line 261, "pan.___", state 743, "(1)" - line 272, "pan.___", state 796, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 805, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 820, "(1)" - line 284, "pan.___", state 827, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 843, "(1)" - line 253, "pan.___", state 851, "(1)" - line 257, "pan.___", state 863, "(1)" - line 261, "pan.___", state 871, "(1)" - line 276, "pan.___", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 909, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 918, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 934, "(1)" - line 253, "pan.___", state 942, "(1)" - line 257, "pan.___", state 954, "(1)" - line 261, "pan.___", state 962, "(1)" - line 276, "pan.___", state 987, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1000, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1009, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1025, "(1)" - line 253, "pan.___", state 1033, "(1)" - line 257, "pan.___", state 1045, "(1)" - line 261, "pan.___", state 1053, "(1)" - line 276, "pan.___", state 1078, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1091, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1100, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1116, "(1)" - line 253, "pan.___", state 1124, "(1)" - line 257, "pan.___", state 1136, "(1)" - line 261, "pan.___", state 1144, "(1)" - line 1237, "pan.___", state 1159, "-end-" - (71 of 1159 states) -unreached in proctype :init: - (0 of 78 states) -unreached in proctype :never: - line 1300, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 285 seconds -pan: rate 13484.269 states/second -pan: avg transition delay 2.8388e-06 usec -cp .input.spin urcu_free_no_rmb.spin.input -cp .input.spin.trail urcu_free_no_rmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_rmb.spin.input b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_rmb.spin.input deleted file mode 100644 index d0fd74e..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_rmb.spin.input +++ /dev/null @@ -1,1273 +0,0 @@ -#define NO_RMB - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_wmb.define b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_wmb.log b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_wmb.log deleted file mode 100644 index 6c01490..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_wmb.log +++ /dev/null @@ -1,467 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_wmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1295) -Depth= 4736 States= 1e+06 Transitions= 2.14e+07 Memory= 550.334 t= 59.2 R= 2e+04 -Depth= 4922 States= 2e+06 Transitions= 4.72e+07 Memory= 634.221 t= 132 R= 2e+04 -Depth= 4922 States= 3e+06 Transitions= 7.19e+07 Memory= 718.205 t= 203 R= 1e+04 -pan: resizing hashtable to -w22.. done -pan: claim violated! (at depth 1295) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 4922, errors: 1 - 3435201 states, stored - 77730101 states, matched - 81165302 transitions (= stored+matched) -1.2953753e+09 atomic steps -hash conflicts: 60833788 (resolved) - -Stats on memory usage (in Megabytes): - 380.023 equivalent memory usage for states (stored*(State-vector + overhead)) - 296.169 actual memory usage for states (compression: 77.93%) - state-vector as stored = 62 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 785.752 total actual memory usage - -unreached in proctype urcu_reader - line 411, "pan.___", state 17, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 49, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 63, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 81, "(1)" - line 257, "pan.___", state 101, "(1)" - line 261, "pan.___", state 109, "(1)" - line 597, "pan.___", state 128, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 411, "pan.___", state 135, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 167, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 181, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 199, "(1)" - line 257, "pan.___", state 219, "(1)" - line 261, "pan.___", state 227, "(1)" - line 411, "pan.___", state 246, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 278, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 292, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 310, "(1)" - line 257, "pan.___", state 330, "(1)" - line 261, "pan.___", state 338, "(1)" - line 411, "pan.___", state 359, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 361, "(1)" - line 411, "pan.___", state 362, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 362, "else" - line 411, "pan.___", state 365, "(1)" - line 415, "pan.___", state 373, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 375, "(1)" - line 415, "pan.___", state 376, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 376, "else" - line 415, "pan.___", state 379, "(1)" - line 415, "pan.___", state 380, "(1)" - line 415, "pan.___", state 380, "(1)" - line 413, "pan.___", state 385, "((i<1))" - line 413, "pan.___", state 385, "((i>=1))" - line 420, "pan.___", state 391, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 393, "(1)" - line 420, "pan.___", state 394, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 394, "else" - line 420, "pan.___", state 397, "(1)" - line 420, "pan.___", state 398, "(1)" - line 420, "pan.___", state 398, "(1)" - line 424, "pan.___", state 405, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 407, "(1)" - line 424, "pan.___", state 408, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 408, "else" - line 424, "pan.___", state 411, "(1)" - line 424, "pan.___", state 412, "(1)" - line 424, "pan.___", state 412, "(1)" - line 422, "pan.___", state 417, "((i<2))" - line 422, "pan.___", state 417, "((i>=2))" - line 249, "pan.___", state 423, "(1)" - line 253, "pan.___", state 431, "(1)" - line 253, "pan.___", state 432, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 432, "else" - line 251, "pan.___", state 437, "((i<1))" - line 251, "pan.___", state 437, "((i>=1))" - line 257, "pan.___", state 443, "(1)" - line 257, "pan.___", state 444, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 444, "else" - line 261, "pan.___", state 451, "(1)" - line 261, "pan.___", state 452, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 452, "else" - line 259, "pan.___", state 457, "((i<2))" - line 259, "pan.___", state 457, "((i>=2))" - line 266, "pan.___", state 461, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 461, "else" - line 431, "pan.___", state 463, "(1)" - line 431, "pan.___", state 463, "(1)" - line 597, "pan.___", state 466, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 597, "pan.___", state 467, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 597, "pan.___", state 468, "(1)" - line 272, "pan.___", state 472, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 483, "(1)" - line 280, "pan.___", state 494, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 503, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 519, "(1)" - line 253, "pan.___", state 527, "(1)" - line 257, "pan.___", state 539, "(1)" - line 261, "pan.___", state 547, "(1)" - line 411, "pan.___", state 565, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 579, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 597, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 611, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 629, "(1)" - line 253, "pan.___", state 637, "(1)" - line 257, "pan.___", state 649, "(1)" - line 261, "pan.___", state 657, "(1)" - line 411, "pan.___", state 683, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 715, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 729, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 747, "(1)" - line 257, "pan.___", state 767, "(1)" - line 261, "pan.___", state 775, "(1)" - line 411, "pan.___", state 794, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 796, "(1)" - line 411, "pan.___", state 797, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 797, "else" - line 411, "pan.___", state 800, "(1)" - line 415, "pan.___", state 808, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 810, "(1)" - line 415, "pan.___", state 811, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 811, "else" - line 415, "pan.___", state 814, "(1)" - line 415, "pan.___", state 815, "(1)" - line 415, "pan.___", state 815, "(1)" - line 413, "pan.___", state 820, "((i<1))" - line 413, "pan.___", state 820, "((i>=1))" - line 420, "pan.___", state 826, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 828, "(1)" - line 420, "pan.___", state 829, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 829, "else" - line 420, "pan.___", state 832, "(1)" - line 420, "pan.___", state 833, "(1)" - line 420, "pan.___", state 833, "(1)" - line 424, "pan.___", state 840, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 842, "(1)" - line 424, "pan.___", state 843, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 843, "else" - line 424, "pan.___", state 846, "(1)" - line 424, "pan.___", state 847, "(1)" - line 424, "pan.___", state 847, "(1)" - line 422, "pan.___", state 852, "((i<2))" - line 422, "pan.___", state 852, "((i>=2))" - line 249, "pan.___", state 858, "(1)" - line 253, "pan.___", state 866, "(1)" - line 253, "pan.___", state 867, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 867, "else" - line 251, "pan.___", state 872, "((i<1))" - line 251, "pan.___", state 872, "((i>=1))" - line 257, "pan.___", state 878, "(1)" - line 257, "pan.___", state 879, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 879, "else" - line 261, "pan.___", state 886, "(1)" - line 261, "pan.___", state 887, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 887, "else" - line 259, "pan.___", state 892, "((i<2))" - line 259, "pan.___", state 892, "((i>=2))" - line 266, "pan.___", state 896, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 896, "else" - line 431, "pan.___", state 898, "(1)" - line 431, "pan.___", state 898, "(1)" - line 605, "pan.___", state 902, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 411, "pan.___", state 907, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 921, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 939, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 953, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 971, "(1)" - line 253, "pan.___", state 979, "(1)" - line 257, "pan.___", state 991, "(1)" - line 261, "pan.___", state 999, "(1)" - line 411, "pan.___", state 1021, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1053, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1067, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1085, "(1)" - line 257, "pan.___", state 1105, "(1)" - line 261, "pan.___", state 1113, "(1)" - line 411, "pan.___", state 1136, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1168, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1182, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1200, "(1)" - line 257, "pan.___", state 1220, "(1)" - line 261, "pan.___", state 1228, "(1)" - line 411, "pan.___", state 1247, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1279, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1293, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1311, "(1)" - line 257, "pan.___", state 1331, "(1)" - line 261, "pan.___", state 1339, "(1)" - line 272, "pan.___", state 1360, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1382, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1391, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1407, "(1)" - line 253, "pan.___", state 1415, "(1)" - line 257, "pan.___", state 1427, "(1)" - line 261, "pan.___", state 1435, "(1)" - line 411, "pan.___", state 1453, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1467, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1485, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1499, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1517, "(1)" - line 253, "pan.___", state 1525, "(1)" - line 257, "pan.___", state 1537, "(1)" - line 261, "pan.___", state 1545, "(1)" - line 411, "pan.___", state 1564, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1578, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1596, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1610, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1628, "(1)" - line 253, "pan.___", state 1636, "(1)" - line 257, "pan.___", state 1648, "(1)" - line 261, "pan.___", state 1656, "(1)" - line 411, "pan.___", state 1678, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1710, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1724, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1742, "(1)" - line 257, "pan.___", state 1762, "(1)" - line 261, "pan.___", state 1770, "(1)" - line 644, "pan.___", state 1789, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 411, "pan.___", state 1796, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1828, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1842, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1860, "(1)" - line 257, "pan.___", state 1880, "(1)" - line 261, "pan.___", state 1888, "(1)" - line 411, "pan.___", state 1907, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1939, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1953, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1971, "(1)" - line 257, "pan.___", state 1991, "(1)" - line 261, "pan.___", state 1999, "(1)" - line 411, "pan.___", state 2020, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 2022, "(1)" - line 411, "pan.___", state 2023, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 2023, "else" - line 411, "pan.___", state 2026, "(1)" - line 415, "pan.___", state 2034, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2036, "(1)" - line 415, "pan.___", state 2037, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 2037, "else" - line 415, "pan.___", state 2040, "(1)" - line 415, "pan.___", state 2041, "(1)" - line 415, "pan.___", state 2041, "(1)" - line 413, "pan.___", state 2046, "((i<1))" - line 413, "pan.___", state 2046, "((i>=1))" - line 420, "pan.___", state 2052, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2054, "(1)" - line 420, "pan.___", state 2055, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 2055, "else" - line 420, "pan.___", state 2058, "(1)" - line 420, "pan.___", state 2059, "(1)" - line 420, "pan.___", state 2059, "(1)" - line 424, "pan.___", state 2066, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2068, "(1)" - line 424, "pan.___", state 2069, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 2069, "else" - line 424, "pan.___", state 2072, "(1)" - line 424, "pan.___", state 2073, "(1)" - line 424, "pan.___", state 2073, "(1)" - line 422, "pan.___", state 2078, "((i<2))" - line 422, "pan.___", state 2078, "((i>=2))" - line 249, "pan.___", state 2084, "(1)" - line 253, "pan.___", state 2092, "(1)" - line 253, "pan.___", state 2093, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 2093, "else" - line 251, "pan.___", state 2098, "((i<1))" - line 251, "pan.___", state 2098, "((i>=1))" - line 257, "pan.___", state 2104, "(1)" - line 257, "pan.___", state 2105, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 2105, "else" - line 261, "pan.___", state 2112, "(1)" - line 261, "pan.___", state 2113, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 2113, "else" - line 259, "pan.___", state 2118, "((i<2))" - line 259, "pan.___", state 2118, "((i>=2))" - line 266, "pan.___", state 2122, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 2122, "else" - line 431, "pan.___", state 2124, "(1)" - line 431, "pan.___", state 2124, "(1)" - line 644, "pan.___", state 2127, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 644, "pan.___", state 2128, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 644, "pan.___", state 2129, "(1)" - line 272, "pan.___", state 2133, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2155, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2164, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2180, "(1)" - line 253, "pan.___", state 2188, "(1)" - line 257, "pan.___", state 2200, "(1)" - line 261, "pan.___", state 2208, "(1)" - line 411, "pan.___", state 2226, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2240, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2258, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2272, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2290, "(1)" - line 253, "pan.___", state 2298, "(1)" - line 257, "pan.___", state 2310, "(1)" - line 261, "pan.___", state 2318, "(1)" - line 272, "pan.___", state 2340, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 2349, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2362, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2371, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2387, "(1)" - line 253, "pan.___", state 2395, "(1)" - line 257, "pan.___", state 2407, "(1)" - line 261, "pan.___", state 2415, "(1)" - line 411, "pan.___", state 2433, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2447, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2465, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2479, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2497, "(1)" - line 253, "pan.___", state 2505, "(1)" - line 257, "pan.___", state 2517, "(1)" - line 261, "pan.___", state 2525, "(1)" - line 411, "pan.___", state 2544, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2558, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2576, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2590, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2608, "(1)" - line 253, "pan.___", state 2616, "(1)" - line 257, "pan.___", state 2628, "(1)" - line 261, "pan.___", state 2636, "(1)" - line 249, "pan.___", state 2667, "(1)" - line 257, "pan.___", state 2687, "(1)" - line 261, "pan.___", state 2695, "(1)" - line 249, "pan.___", state 2710, "(1)" - line 253, "pan.___", state 2718, "(1)" - line 257, "pan.___", state 2730, "(1)" - line 261, "pan.___", state 2738, "(1)" - line 898, "pan.___", state 2755, "-end-" - (259 of 2755 states) -unreached in proctype urcu_writer - line 411, "pan.___", state 19, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 33, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 249, "pan.___", state 83, "(1)" - line 253, "pan.___", state 91, "(1)" - line 272, "pan.___", state 132, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 134, "(1)" - line 276, "pan.___", state 141, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 143, "(1)" - line 276, "pan.___", state 144, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 144, "else" - line 274, "pan.___", state 149, "((i<1))" - line 274, "pan.___", state 149, "((i>=1))" - line 280, "pan.___", state 154, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 156, "(1)" - line 280, "pan.___", state 157, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 157, "else" - line 284, "pan.___", state 163, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 165, "(1)" - line 284, "pan.___", state 166, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 166, "else" - line 289, "pan.___", state 175, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 289, "pan.___", state 175, "else" - line 411, "pan.___", state 194, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 208, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 226, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 240, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 258, "(1)" - line 253, "pan.___", state 266, "(1)" - line 257, "pan.___", state 278, "(1)" - line 261, "pan.___", state 286, "(1)" - line 415, "pan.___", state 321, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 339, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 353, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 379, "(1)" - line 257, "pan.___", state 391, "(1)" - line 261, "pan.___", state 399, "(1)" - line 415, "pan.___", state 442, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 460, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 474, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 500, "(1)" - line 257, "pan.___", state 512, "(1)" - line 261, "pan.___", state 520, "(1)" - line 415, "pan.___", state 553, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 571, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 585, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 611, "(1)" - line 257, "pan.___", state 623, "(1)" - line 261, "pan.___", state 631, "(1)" - line 415, "pan.___", state 666, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 684, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 698, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 724, "(1)" - line 257, "pan.___", state 736, "(1)" - line 261, "pan.___", state 744, "(1)" - line 272, "pan.___", state 797, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 806, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 249, "pan.___", state 844, "(1)" - line 253, "pan.___", state 852, "(1)" - line 257, "pan.___", state 864, "(1)" - line 261, "pan.___", state 872, "(1)" - line 276, "pan.___", state 897, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 910, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 919, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 935, "(1)" - line 253, "pan.___", state 943, "(1)" - line 257, "pan.___", state 955, "(1)" - line 261, "pan.___", state 963, "(1)" - line 276, "pan.___", state 988, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1001, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1010, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1026, "(1)" - line 253, "pan.___", state 1034, "(1)" - line 257, "pan.___", state 1046, "(1)" - line 261, "pan.___", state 1054, "(1)" - line 276, "pan.___", state 1079, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1092, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1101, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1117, "(1)" - line 253, "pan.___", state 1125, "(1)" - line 257, "pan.___", state 1137, "(1)" - line 261, "pan.___", state 1145, "(1)" - line 1237, "pan.___", state 1160, "-end-" - (77 of 1160 states) -unreached in proctype :init: - line 1248, "pan.___", state 9, "((j<2))" - line 1248, "pan.___", state 9, "((j>=2))" - line 1249, "pan.___", state 20, "((j<2))" - line 1249, "pan.___", state 20, "((j>=2))" - line 1254, "pan.___", state 33, "((j<2))" - line 1254, "pan.___", state 33, "((j>=2))" - line 1252, "pan.___", state 43, "((i<1))" - line 1252, "pan.___", state 43, "((i>=1))" - line 1262, "pan.___", state 54, "((j<2))" - line 1262, "pan.___", state 54, "((j>=2))" - line 1266, "pan.___", state 67, "((j<2))" - line 1266, "pan.___", state 67, "((j>=2))" - (6 of 78 states) -unreached in proctype :never: - line 1300, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 229 seconds -pan: rate 14976.68 states/second -pan: avg transition delay 2.826e-06 usec -cp .input.spin urcu_free_no_wmb.spin.input -cp .input.spin.trail urcu_free_no_wmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_wmb.spin.input b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_wmb.spin.input deleted file mode 100644 index dc68ded..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_wmb.spin.input +++ /dev/null @@ -1,1273 +0,0 @@ -#define NO_WMB - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_wmb.spin.input.trail deleted file mode 100644 index aca9da8..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_no_wmb.spin.input.trail +++ /dev/null @@ -1,1298 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:3995 -2:3:3915 -3:3:3918 -4:3:3918 -5:3:3921 -6:3:3929 -7:3:3929 -8:3:3932 -9:3:3938 -10:3:3942 -11:3:3942 -12:3:3945 -13:3:3955 -14:3:3963 -15:3:3963 -16:3:3966 -17:3:3972 -18:3:3976 -19:3:3976 -20:3:3979 -21:3:3985 -22:3:3989 -23:3:3990 -24:0:3995 -25:3:3992 -26:0:3995 -27:2:2757 -28:0:3995 -29:2:2763 -30:0:3995 -31:2:2764 -32:0:3995 -33:2:2766 -34:0:3995 -35:2:2767 -36:0:3995 -37:2:2768 -38:0:3995 -39:2:2769 -40:2:2770 -41:2:2774 -42:2:2775 -43:2:2783 -44:2:2784 -45:2:2788 -46:2:2789 -47:2:2797 -48:2:2802 -49:2:2806 -50:2:2807 -51:2:2815 -52:2:2816 -53:2:2820 -54:2:2821 -55:2:2815 -56:2:2816 -57:2:2820 -58:2:2821 -59:2:2829 -60:2:2834 -61:2:2841 -62:2:2842 -63:2:2849 -64:2:2854 -65:2:2861 -66:2:2862 -67:2:2861 -68:2:2862 -69:2:2869 -70:2:2879 -71:0:3995 -72:2:2768 -73:0:3995 -74:2:2931 -75:2:2932 -76:2:2933 -77:0:3995 -78:2:2768 -79:0:3995 -80:2:2938 -81:0:3995 -82:2:3552 -83:2:3553 -84:2:3557 -85:2:3561 -86:2:3562 -87:2:3566 -88:2:3571 -89:2:3579 -90:2:3583 -91:2:3584 -92:2:3579 -93:2:3580 -94:2:3588 -95:2:3595 -96:2:3602 -97:2:3603 -98:2:3610 -99:2:3615 -100:2:3622 -101:2:3623 -102:2:3622 -103:2:3623 -104:2:3630 -105:2:3634 -106:0:3995 -107:2:2940 -108:2:3533 -109:0:3995 -110:2:2768 -111:0:3995 -112:2:2941 -113:0:3995 -114:2:2768 -115:0:3995 -116:2:2944 -117:2:2945 -118:2:2949 -119:2:2950 -120:2:2958 -121:2:2959 -122:2:2963 -123:2:2964 -124:2:2972 -125:2:2977 -126:2:2981 -127:2:2982 -128:2:2990 -129:2:2991 -130:2:2995 -131:2:2996 -132:2:2990 -133:2:2991 -134:2:2995 -135:2:2996 -136:2:3004 -137:2:3009 -138:2:3016 -139:2:3017 -140:2:3024 -141:2:3029 -142:2:3036 -143:2:3037 -144:2:3036 -145:2:3037 -146:2:3044 -147:2:3053 -148:0:3995 -149:2:2768 -150:0:3995 -151:2:3057 -152:2:3058 -153:2:3059 -154:2:3071 -155:2:3072 -156:2:3076 -157:2:3077 -158:2:3085 -159:2:3090 -160:2:3094 -161:2:3095 -162:2:3103 -163:2:3104 -164:2:3108 -165:2:3109 -166:2:3103 -167:2:3104 -168:2:3108 -169:2:3109 -170:2:3117 -171:2:3122 -172:2:3129 -173:2:3130 -174:2:3137 -175:2:3142 -176:2:3149 -177:2:3150 -178:2:3149 -179:2:3150 -180:2:3157 -181:2:3170 -182:2:3171 -183:0:3995 -184:2:2768 -185:0:3995 -186:2:3178 -187:2:3179 -188:2:3183 -189:2:3184 -190:2:3192 -191:2:3193 -192:2:3197 -193:2:3198 -194:2:3206 -195:2:3211 -196:2:3215 -197:2:3216 -198:2:3224 -199:2:3225 -200:2:3229 -201:2:3230 -202:2:3224 -203:2:3225 -204:2:3229 -205:2:3230 -206:2:3238 -207:2:3243 -208:2:3250 -209:2:3251 -210:2:3258 -211:2:3263 -212:2:3270 -213:2:3271 -214:2:3270 -215:2:3271 -216:2:3278 -217:0:3995 -218:2:2768 -219:0:3995 -220:2:3289 -221:2:3290 -222:2:3294 -223:2:3295 -224:2:3303 -225:2:3304 -226:2:3308 -227:2:3309 -228:2:3317 -229:2:3322 -230:2:3326 -231:2:3327 -232:2:3335 -233:2:3336 -234:2:3340 -235:2:3341 -236:2:3335 -237:2:3336 -238:2:3340 -239:2:3341 -240:2:3349 -241:2:3354 -242:2:3361 -243:2:3362 -244:2:3369 -245:2:3374 -246:2:3381 -247:2:3382 -248:2:3381 -249:2:3382 -250:2:3389 -251:2:3398 -252:0:3995 -253:2:2768 -254:0:3995 -255:2:3402 -256:2:3403 -257:2:3404 -258:2:3416 -259:2:3417 -260:2:3421 -261:2:3422 -262:2:3430 -263:2:3435 -264:2:3439 -265:2:3440 -266:2:3448 -267:2:3449 -268:2:3453 -269:2:3454 -270:2:3448 -271:2:3449 -272:2:3453 -273:2:3454 -274:2:3462 -275:2:3467 -276:2:3474 -277:2:3475 -278:2:3482 -279:2:3487 -280:2:3494 -281:2:3495 -282:2:3494 -283:2:3495 -284:2:3502 -285:2:3514 -286:2:3515 -287:0:3995 -288:2:2768 -289:0:3995 -290:2:3521 -291:0:3995 -292:2:3825 -293:2:3826 -294:2:3830 -295:2:3834 -296:2:3835 -297:2:3839 -298:2:3847 -299:2:3848 -300:2:3852 -301:2:3856 -302:2:3857 -303:2:3852 -304:2:3856 -305:2:3857 -306:2:3861 -307:2:3868 -308:2:3875 -309:2:3876 -310:2:3883 -311:2:3888 -312:2:3895 -313:2:3896 -314:2:3895 -315:2:3896 -316:2:3903 -317:2:3907 -318:0:3995 -319:2:3523 -320:2:3533 -321:0:3995 -322:2:2768 -323:0:3995 -324:2:3524 -325:2:3525 -326:0:3995 -327:2:2768 -328:0:3995 -329:2:3529 -330:0:3995 -331:2:3537 -332:0:3995 -333:2:2764 -334:0:3995 -335:2:2766 -336:0:3995 -337:2:2767 -338:0:3995 -339:2:2768 -340:0:3995 -341:2:2931 -342:2:2932 -343:2:2933 -344:0:3995 -345:2:2768 -346:0:3995 -347:2:2769 -348:2:2770 -349:2:2774 -350:2:2775 -351:2:2783 -352:2:2784 -353:2:2788 -354:2:2789 -355:2:2797 -356:2:2802 -357:2:2803 -358:2:2815 -359:2:2816 -360:2:2817 -361:2:2815 -362:2:2816 -363:2:2820 -364:2:2821 -365:2:2829 -366:2:2834 -367:2:2841 -368:2:2842 -369:2:2849 -370:2:2854 -371:2:2861 -372:2:2862 -373:2:2861 -374:2:2862 -375:2:2869 -376:2:2879 -377:0:3995 -378:2:2768 -379:0:3995 -380:2:2938 -381:0:3995 -382:2:3552 -383:2:3553 -384:2:3557 -385:2:3561 -386:2:3562 -387:2:3566 -388:2:3574 -389:2:3575 -390:2:3579 -391:2:3580 -392:2:3579 -393:2:3583 -394:2:3584 -395:2:3588 -396:2:3595 -397:2:3602 -398:2:3603 -399:2:3610 -400:2:3615 -401:2:3622 -402:2:3623 -403:2:3622 -404:2:3623 -405:2:3630 -406:2:3634 -407:0:3995 -408:2:2940 -409:2:3533 -410:0:3995 -411:2:2768 -412:0:3995 -413:2:2941 -414:0:3995 -415:2:2768 -416:0:3995 -417:2:2944 -418:2:2945 -419:2:2949 -420:2:2950 -421:2:2958 -422:2:2959 -423:2:2963 -424:2:2964 -425:2:2972 -426:2:2977 -427:2:2981 -428:2:2982 -429:2:2990 -430:2:2991 -431:2:2995 -432:2:2996 -433:2:2990 -434:2:2991 -435:2:2995 -436:2:2996 -437:2:3004 -438:2:3009 -439:2:3016 -440:2:3017 -441:2:3024 -442:2:3029 -443:2:3036 -444:2:3037 -445:2:3036 -446:2:3037 -447:2:3044 -448:2:3053 -449:0:3995 -450:2:2768 -451:0:3995 -452:2:3057 -453:2:3058 -454:2:3059 -455:2:3071 -456:2:3072 -457:2:3076 -458:2:3077 -459:2:3085 -460:2:3090 -461:2:3094 -462:2:3095 -463:2:3103 -464:2:3104 -465:2:3108 -466:2:3109 -467:2:3103 -468:2:3104 -469:2:3108 -470:2:3109 -471:2:3117 -472:2:3122 -473:2:3129 -474:2:3130 -475:2:3137 -476:2:3142 -477:2:3149 -478:2:3150 -479:2:3149 -480:2:3150 -481:2:3157 -482:2:3170 -483:2:3171 -484:0:3995 -485:2:2768 -486:0:3995 -487:2:3178 -488:2:3179 -489:2:3183 -490:2:3184 -491:2:3192 -492:2:3193 -493:2:3197 -494:2:3198 -495:2:3206 -496:2:3211 -497:2:3215 -498:2:3216 -499:2:3224 -500:2:3225 -501:2:3229 -502:2:3230 -503:2:3224 -504:2:3225 -505:2:3229 -506:2:3230 -507:2:3238 -508:2:3243 -509:2:3250 -510:2:3251 -511:2:3258 -512:2:3263 -513:2:3270 -514:2:3271 -515:2:3270 -516:2:3271 -517:2:3278 -518:0:3995 -519:2:2768 -520:0:3995 -521:2:3289 -522:2:3290 -523:2:3294 -524:2:3295 -525:2:3303 -526:2:3304 -527:2:3308 -528:2:3309 -529:2:3317 -530:2:3322 -531:2:3326 -532:2:3327 -533:2:3335 -534:2:3336 -535:2:3340 -536:2:3341 -537:2:3335 -538:2:3336 -539:2:3340 -540:2:3341 -541:2:3349 -542:2:3354 -543:2:3361 -544:2:3362 -545:2:3369 -546:2:3374 -547:2:3381 -548:2:3382 -549:2:3381 -550:2:3382 -551:2:3389 -552:2:3398 -553:0:3995 -554:2:2768 -555:0:3995 -556:2:3402 -557:2:3403 -558:2:3404 -559:2:3416 -560:2:3417 -561:2:3421 -562:2:3422 -563:2:3430 -564:2:3435 -565:2:3439 -566:2:3440 -567:2:3448 -568:2:3449 -569:2:3453 -570:2:3454 -571:2:3448 -572:2:3449 -573:2:3453 -574:2:3454 -575:2:3462 -576:2:3467 -577:2:3474 -578:2:3475 -579:2:3482 -580:2:3487 -581:2:3494 -582:2:3495 -583:2:3494 -584:2:3495 -585:2:3502 -586:2:3514 -587:2:3515 -588:0:3995 -589:2:2768 -590:0:3995 -591:2:3521 -592:0:3995 -593:2:3825 -594:2:3826 -595:2:3830 -596:2:3834 -597:2:3835 -598:2:3839 -599:2:3847 -600:2:3848 -601:2:3852 -602:2:3856 -603:2:3857 -604:2:3852 -605:2:3856 -606:2:3857 -607:2:3861 -608:2:3868 -609:2:3875 -610:2:3876 -611:2:3883 -612:2:3888 -613:2:3895 -614:2:3896 -615:2:3895 -616:2:3896 -617:2:3903 -618:2:3907 -619:0:3995 -620:2:3523 -621:2:3533 -622:0:3995 -623:2:2768 -624:0:3995 -625:2:3524 -626:2:3525 -627:0:3995 -628:2:2768 -629:0:3995 -630:2:3529 -631:0:3995 -632:2:3537 -633:0:3995 -634:2:2764 -635:0:3995 -636:2:2766 -637:0:3995 -638:2:2767 -639:0:3995 -640:2:2768 -641:0:3995 -642:2:2769 -643:2:2770 -644:2:2774 -645:2:2775 -646:2:2783 -647:2:2784 -648:2:2788 -649:2:2789 -650:2:2797 -651:2:2802 -652:2:2806 -653:2:2807 -654:2:2815 -655:2:2816 -656:2:2820 -657:2:2821 -658:2:2815 -659:2:2816 -660:2:2817 -661:2:2829 -662:2:2834 -663:2:2841 -664:2:2842 -665:2:2849 -666:2:2854 -667:2:2861 -668:2:2862 -669:2:2861 -670:2:2862 -671:2:2869 -672:2:2879 -673:0:3995 -674:2:2768 -675:0:3995 -676:2:2931 -677:2:2932 -678:2:2933 -679:0:3995 -680:2:2768 -681:0:3995 -682:2:2938 -683:0:3995 -684:1:2 -685:0:3995 -686:1:8 -687:0:3995 -688:1:9 -689:0:3995 -690:1:10 -691:0:3995 -692:1:11 -693:0:3995 -694:1:12 -695:1:13 -696:1:17 -697:1:18 -698:1:26 -699:1:27 -700:1:31 -701:1:32 -702:1:40 -703:1:45 -704:1:49 -705:1:50 -706:1:58 -707:1:59 -708:1:63 -709:1:64 -710:1:58 -711:1:59 -712:1:63 -713:1:64 -714:1:72 -715:1:77 -716:1:84 -717:1:85 -718:1:92 -719:1:97 -720:1:104 -721:1:105 -722:1:104 -723:1:105 -724:1:112 -725:0:3995 -726:1:11 -727:0:3995 -728:1:123 -729:1:124 -730:0:3995 -731:1:11 -732:0:3995 -733:1:130 -734:1:131 -735:1:135 -736:1:136 -737:1:144 -738:1:145 -739:1:149 -740:1:150 -741:1:158 -742:1:163 -743:1:167 -744:1:168 -745:1:176 -746:1:177 -747:1:181 -748:1:182 -749:1:176 -750:1:177 -751:1:181 -752:1:182 -753:1:190 -754:1:195 -755:1:202 -756:1:203 -757:1:210 -758:1:215 -759:1:222 -760:1:223 -761:1:222 -762:1:223 -763:1:230 -764:0:3995 -765:1:11 -766:0:3995 -767:1:241 -768:1:242 -769:1:246 -770:1:247 -771:1:255 -772:1:256 -773:1:260 -774:1:261 -775:1:269 -776:1:274 -777:1:278 -778:1:279 -779:1:287 -780:1:288 -781:1:292 -782:1:293 -783:1:287 -784:1:288 -785:1:292 -786:1:293 -787:1:301 -788:1:306 -789:1:313 -790:1:314 -791:1:321 -792:1:326 -793:1:333 -794:1:334 -795:1:333 -796:1:334 -797:1:341 -798:1:350 -799:0:3995 -800:1:11 -801:0:3995 -802:1:468 -803:1:472 -804:1:473 -805:1:477 -806:1:478 -807:1:486 -808:1:494 -809:1:495 -810:1:499 -811:1:503 -812:1:504 -813:1:499 -814:1:503 -815:1:504 -816:1:508 -817:1:515 -818:1:522 -819:1:523 -820:1:530 -821:1:535 -822:1:542 -823:1:543 -824:1:542 -825:1:543 -826:1:550 -827:0:3995 -828:1:11 -829:0:3995 -830:1:560 -831:1:561 -832:1:565 -833:1:566 -834:1:574 -835:1:575 -836:1:579 -837:1:580 -838:1:588 -839:1:593 -840:1:597 -841:1:598 -842:1:606 -843:1:607 -844:1:611 -845:1:612 -846:1:606 -847:1:607 -848:1:611 -849:1:612 -850:1:620 -851:1:625 -852:1:632 -853:1:633 -854:1:640 -855:1:645 -856:1:652 -857:1:653 -858:1:652 -859:1:653 -860:1:660 -861:0:3995 -862:1:11 -863:0:3995 -864:1:671 -865:1:674 -866:1:675 -867:0:3995 -868:1:11 -869:0:3995 -870:1:678 -871:1:679 -872:1:683 -873:1:684 -874:1:692 -875:1:693 -876:1:697 -877:1:698 -878:1:706 -879:1:711 -880:1:715 -881:1:716 -882:1:724 -883:1:725 -884:1:729 -885:1:730 -886:1:724 -887:1:725 -888:1:729 -889:1:730 -890:1:738 -891:1:743 -892:1:750 -893:1:751 -894:1:758 -895:1:763 -896:1:770 -897:1:771 -898:1:770 -899:1:771 -900:1:778 -901:0:3995 -902:1:11 -903:0:3995 -904:1:902 -905:1:903 -906:1:907 -907:1:908 -908:1:916 -909:1:917 -910:1:921 -911:1:922 -912:1:930 -913:1:935 -914:1:939 -915:1:940 -916:1:948 -917:1:949 -918:1:953 -919:1:954 -920:1:948 -921:1:949 -922:1:953 -923:1:954 -924:1:962 -925:1:967 -926:1:974 -927:1:975 -928:1:982 -929:1:987 -930:1:994 -931:1:995 -932:1:994 -933:1:995 -934:1:1002 -935:1:1011 -936:1:1015 -937:0:3995 -938:1:11 -939:0:3995 -940:1:1016 -941:1:1017 -942:1:1021 -943:1:1022 -944:1:1030 -945:1:1031 -946:1:1032 -947:1:1044 -948:1:1049 -949:1:1053 -950:1:1054 -951:1:1062 -952:1:1063 -953:1:1067 -954:1:1068 -955:1:1062 -956:1:1063 -957:1:1067 -958:1:1068 -959:1:1076 -960:1:1081 -961:1:1088 -962:1:1089 -963:1:1096 -964:1:1101 -965:1:1108 -966:1:1109 -967:1:1108 -968:1:1109 -969:1:1116 -970:0:3995 -971:1:11 -972:0:3995 -973:1:1127 -974:0:3995 -975:1:2663 -976:1:2670 -977:1:2671 -978:1:2678 -979:1:2683 -980:1:2690 -981:1:2691 -982:1:2690 -983:1:2691 -984:1:2698 -985:1:2702 -986:0:3995 -987:2:3552 -988:2:3553 -989:2:3557 -990:2:3561 -991:2:3562 -992:2:3566 -993:2:3571 -994:2:3579 -995:2:3583 -996:2:3584 -997:2:3579 -998:2:3580 -999:2:3588 -1000:2:3595 -1001:2:3602 -1002:2:3603 -1003:2:3610 -1004:2:3615 -1005:2:3622 -1006:2:3623 -1007:2:3622 -1008:2:3623 -1009:2:3630 -1010:2:3634 -1011:0:3995 -1012:2:2940 -1013:2:3533 -1014:0:3995 -1015:2:2768 -1016:0:3995 -1017:2:2941 -1018:0:3995 -1019:2:2768 -1020:0:3995 -1021:2:2944 -1022:2:2945 -1023:2:2949 -1024:2:2950 -1025:2:2958 -1026:2:2959 -1027:2:2963 -1028:2:2964 -1029:2:2972 -1030:2:2977 -1031:2:2981 -1032:2:2982 -1033:2:2990 -1034:2:2991 -1035:2:2995 -1036:2:2996 -1037:2:2990 -1038:2:2991 -1039:2:2995 -1040:2:2996 -1041:2:3004 -1042:2:3009 -1043:2:3016 -1044:2:3017 -1045:2:3024 -1046:2:3029 -1047:2:3036 -1048:2:3037 -1049:2:3036 -1050:2:3037 -1051:2:3044 -1052:2:3053 -1053:0:3995 -1054:2:2768 -1055:0:3995 -1056:2:3057 -1057:2:3058 -1058:2:3059 -1059:2:3071 -1060:2:3072 -1061:2:3076 -1062:2:3077 -1063:2:3085 -1064:2:3090 -1065:2:3094 -1066:2:3095 -1067:2:3103 -1068:2:3104 -1069:2:3108 -1070:2:3109 -1071:2:3103 -1072:2:3104 -1073:2:3108 -1074:2:3109 -1075:2:3117 -1076:2:3122 -1077:2:3129 -1078:2:3130 -1079:2:3137 -1080:2:3142 -1081:2:3149 -1082:2:3150 -1083:2:3149 -1084:2:3150 -1085:2:3157 -1086:2:3168 -1087:0:3995 -1088:2:2768 -1089:0:3995 -1090:2:3174 -1091:0:3995 -1092:2:3643 -1093:2:3644 -1094:2:3648 -1095:2:3652 -1096:2:3653 -1097:2:3657 -1098:2:3665 -1099:2:3666 -1100:2:3670 -1101:2:3674 -1102:2:3675 -1103:2:3670 -1104:2:3674 -1105:2:3675 -1106:2:3679 -1107:2:3686 -1108:2:3693 -1109:2:3694 -1110:2:3701 -1111:2:3706 -1112:2:3713 -1113:2:3714 -1114:2:3713 -1115:2:3714 -1116:2:3721 -1117:2:3725 -1118:0:3995 -1119:2:3176 -1120:2:3177 -1121:0:3995 -1122:2:2768 -1123:0:3995 -1124:2:3178 -1125:2:3179 -1126:2:3183 -1127:2:3184 -1128:2:3192 -1129:2:3193 -1130:2:3197 -1131:2:3198 -1132:2:3206 -1133:2:3211 -1134:2:3215 -1135:2:3216 -1136:2:3224 -1137:2:3225 -1138:2:3229 -1139:2:3230 -1140:2:3224 -1141:2:3225 -1142:2:3229 -1143:2:3230 -1144:2:3238 -1145:2:3243 -1146:2:3250 -1147:2:3251 -1148:2:3258 -1149:2:3263 -1150:2:3270 -1151:2:3271 -1152:2:3270 -1153:2:3271 -1154:2:3278 -1155:0:3995 -1156:2:2768 -1157:0:3995 -1158:2:3057 -1159:2:3058 -1160:2:3062 -1161:2:3063 -1162:2:3071 -1163:2:3072 -1164:2:3076 -1165:2:3077 -1166:2:3085 -1167:2:3090 -1168:2:3094 -1169:2:3095 -1170:2:3103 -1171:2:3104 -1172:2:3108 -1173:2:3109 -1174:2:3103 -1175:2:3104 -1176:2:3108 -1177:2:3109 -1178:2:3117 -1179:2:3122 -1180:2:3129 -1181:2:3130 -1182:2:3137 -1183:2:3142 -1184:2:3149 -1185:2:3150 -1186:2:3149 -1187:2:3150 -1188:2:3157 -1189:2:3168 -1190:0:3995 -1191:2:2768 -1192:0:3995 -1193:2:3174 -1194:0:3995 -1195:2:3643 -1196:2:3644 -1197:2:3648 -1198:2:3652 -1199:2:3653 -1200:2:3657 -1201:2:3665 -1202:2:3666 -1203:2:3670 -1204:2:3674 -1205:2:3675 -1206:2:3670 -1207:2:3674 -1208:2:3675 -1209:2:3679 -1210:2:3686 -1211:2:3693 -1212:2:3694 -1213:2:3701 -1214:2:3706 -1215:2:3713 -1216:2:3714 -1217:2:3713 -1218:2:3714 -1219:2:3721 -1220:2:3725 -1221:0:3995 -1222:2:3176 -1223:2:3177 -1224:0:3995 -1225:2:2768 -1226:0:3995 -1227:2:3057 -1228:2:3058 -1229:2:3062 -1230:2:3063 -1231:2:3071 -1232:2:3072 -1233:2:3076 -1234:2:3077 -1235:2:3085 -1236:2:3090 -1237:2:3094 -1238:2:3095 -1239:2:3103 -1240:2:3104 -1241:2:3108 -1242:2:3109 -1243:2:3103 -1244:2:3104 -1245:2:3108 -1246:2:3109 -1247:2:3117 -1248:2:3122 -1249:2:3129 -1250:2:3130 -1251:2:3137 -1252:2:3142 -1253:2:3149 -1254:2:3150 -1255:2:3149 -1256:2:3150 -1257:2:3157 -1258:2:3168 -1259:0:3995 -1260:2:2768 -1261:0:3995 -1262:2:3174 -1263:0:3995 -1264:2:3643 -1265:2:3644 -1266:2:3648 -1267:2:3652 -1268:2:3653 -1269:2:3657 -1270:2:3665 -1271:2:3666 -1272:2:3670 -1273:2:3674 -1274:2:3675 -1275:2:3670 -1276:2:3674 -1277:2:3675 -1278:2:3679 -1279:2:3686 -1280:2:3693 -1281:2:3694 -1282:2:3701 -1283:2:3706 -1284:2:3713 -1285:2:3714 -1286:2:3713 -1287:2:3714 -1288:2:3721 -1289:2:3725 -1290:0:3995 -1291:1:1129 -1292:1:1130 -1293:0:3993 -1294:1:11 -1295:0:3999 -1296:1:2142 diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_single_flip.define b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_single_flip.log b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_single_flip.log deleted file mode 100644 index 92cda73..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_single_flip.log +++ /dev/null @@ -1,571 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_single_flip.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1295) -Depth= 5162 States= 1e+06 Transitions= 1.79e+07 Memory= 550.334 t= 49 R= 2e+04 -pan: claim violated! (at depth 1059) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 5162, errors: 1 - 1708535 states, stored - 29763099 states, matched - 31471634 transitions (= stored+matched) -4.8935629e+08 atomic steps -hash conflicts: 14510834 (resolved) - -Stats on memory usage (in Megabytes): - 189.009 equivalent memory usage for states (stored*(State-vector + overhead)) - 144.122 actual memory usage for states (compression: 76.25%) - state-vector as stored = 60 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 609.807 total actual memory usage - -unreached in proctype urcu_reader - line 411, "pan.___", state 17, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 49, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 63, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 81, "(1)" - line 257, "pan.___", state 101, "(1)" - line 261, "pan.___", state 109, "(1)" - line 597, "pan.___", state 128, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 411, "pan.___", state 135, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 167, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 181, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 199, "(1)" - line 257, "pan.___", state 219, "(1)" - line 261, "pan.___", state 227, "(1)" - line 411, "pan.___", state 246, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 278, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 292, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 310, "(1)" - line 257, "pan.___", state 330, "(1)" - line 261, "pan.___", state 338, "(1)" - line 411, "pan.___", state 359, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 361, "(1)" - line 411, "pan.___", state 362, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 362, "else" - line 411, "pan.___", state 365, "(1)" - line 415, "pan.___", state 373, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 375, "(1)" - line 415, "pan.___", state 376, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 376, "else" - line 415, "pan.___", state 379, "(1)" - line 415, "pan.___", state 380, "(1)" - line 415, "pan.___", state 380, "(1)" - line 413, "pan.___", state 385, "((i<1))" - line 413, "pan.___", state 385, "((i>=1))" - line 420, "pan.___", state 391, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 393, "(1)" - line 420, "pan.___", state 394, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 394, "else" - line 420, "pan.___", state 397, "(1)" - line 420, "pan.___", state 398, "(1)" - line 420, "pan.___", state 398, "(1)" - line 424, "pan.___", state 405, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 407, "(1)" - line 424, "pan.___", state 408, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 408, "else" - line 424, "pan.___", state 411, "(1)" - line 424, "pan.___", state 412, "(1)" - line 424, "pan.___", state 412, "(1)" - line 422, "pan.___", state 417, "((i<2))" - line 422, "pan.___", state 417, "((i>=2))" - line 249, "pan.___", state 423, "(1)" - line 253, "pan.___", state 431, "(1)" - line 253, "pan.___", state 432, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 432, "else" - line 251, "pan.___", state 437, "((i<1))" - line 251, "pan.___", state 437, "((i>=1))" - line 257, "pan.___", state 443, "(1)" - line 257, "pan.___", state 444, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 444, "else" - line 261, "pan.___", state 451, "(1)" - line 261, "pan.___", state 452, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 452, "else" - line 259, "pan.___", state 457, "((i<2))" - line 259, "pan.___", state 457, "((i>=2))" - line 266, "pan.___", state 461, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 461, "else" - line 431, "pan.___", state 463, "(1)" - line 431, "pan.___", state 463, "(1)" - line 597, "pan.___", state 466, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 597, "pan.___", state 467, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 597, "pan.___", state 468, "(1)" - line 272, "pan.___", state 472, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 483, "(1)" - line 280, "pan.___", state 494, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 503, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 519, "(1)" - line 253, "pan.___", state 527, "(1)" - line 257, "pan.___", state 539, "(1)" - line 261, "pan.___", state 547, "(1)" - line 411, "pan.___", state 565, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 579, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 597, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 611, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 629, "(1)" - line 253, "pan.___", state 637, "(1)" - line 257, "pan.___", state 649, "(1)" - line 261, "pan.___", state 657, "(1)" - line 411, "pan.___", state 683, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 715, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 729, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 747, "(1)" - line 257, "pan.___", state 767, "(1)" - line 261, "pan.___", state 775, "(1)" - line 411, "pan.___", state 794, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 796, "(1)" - line 411, "pan.___", state 797, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 797, "else" - line 411, "pan.___", state 800, "(1)" - line 415, "pan.___", state 808, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 810, "(1)" - line 415, "pan.___", state 811, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 811, "else" - line 415, "pan.___", state 814, "(1)" - line 415, "pan.___", state 815, "(1)" - line 415, "pan.___", state 815, "(1)" - line 413, "pan.___", state 820, "((i<1))" - line 413, "pan.___", state 820, "((i>=1))" - line 420, "pan.___", state 826, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 828, "(1)" - line 420, "pan.___", state 829, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 829, "else" - line 420, "pan.___", state 832, "(1)" - line 420, "pan.___", state 833, "(1)" - line 420, "pan.___", state 833, "(1)" - line 424, "pan.___", state 840, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 842, "(1)" - line 424, "pan.___", state 843, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 843, "else" - line 424, "pan.___", state 846, "(1)" - line 424, "pan.___", state 847, "(1)" - line 424, "pan.___", state 847, "(1)" - line 422, "pan.___", state 852, "((i<2))" - line 422, "pan.___", state 852, "((i>=2))" - line 249, "pan.___", state 858, "(1)" - line 253, "pan.___", state 866, "(1)" - line 253, "pan.___", state 867, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 867, "else" - line 251, "pan.___", state 872, "((i<1))" - line 251, "pan.___", state 872, "((i>=1))" - line 257, "pan.___", state 878, "(1)" - line 257, "pan.___", state 879, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 879, "else" - line 261, "pan.___", state 886, "(1)" - line 261, "pan.___", state 887, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 887, "else" - line 259, "pan.___", state 892, "((i<2))" - line 259, "pan.___", state 892, "((i>=2))" - line 266, "pan.___", state 896, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 896, "else" - line 431, "pan.___", state 898, "(1)" - line 431, "pan.___", state 898, "(1)" - line 605, "pan.___", state 902, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 411, "pan.___", state 907, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 921, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 939, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 953, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 971, "(1)" - line 253, "pan.___", state 979, "(1)" - line 257, "pan.___", state 991, "(1)" - line 261, "pan.___", state 999, "(1)" - line 411, "pan.___", state 1021, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1053, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1067, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1085, "(1)" - line 257, "pan.___", state 1105, "(1)" - line 261, "pan.___", state 1113, "(1)" - line 411, "pan.___", state 1136, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1168, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1182, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1200, "(1)" - line 257, "pan.___", state 1220, "(1)" - line 261, "pan.___", state 1228, "(1)" - line 411, "pan.___", state 1247, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1279, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1293, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1311, "(1)" - line 257, "pan.___", state 1331, "(1)" - line 261, "pan.___", state 1339, "(1)" - line 272, "pan.___", state 1360, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1382, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1391, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1407, "(1)" - line 253, "pan.___", state 1415, "(1)" - line 257, "pan.___", state 1427, "(1)" - line 261, "pan.___", state 1435, "(1)" - line 411, "pan.___", state 1453, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1467, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1485, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1499, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1517, "(1)" - line 253, "pan.___", state 1525, "(1)" - line 257, "pan.___", state 1537, "(1)" - line 261, "pan.___", state 1545, "(1)" - line 411, "pan.___", state 1564, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1578, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1596, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1610, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1628, "(1)" - line 253, "pan.___", state 1636, "(1)" - line 257, "pan.___", state 1648, "(1)" - line 261, "pan.___", state 1656, "(1)" - line 411, "pan.___", state 1678, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1710, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1724, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1742, "(1)" - line 257, "pan.___", state 1762, "(1)" - line 261, "pan.___", state 1770, "(1)" - line 644, "pan.___", state 1789, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 411, "pan.___", state 1796, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1828, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1842, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1860, "(1)" - line 257, "pan.___", state 1880, "(1)" - line 261, "pan.___", state 1888, "(1)" - line 411, "pan.___", state 1907, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1939, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1953, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1971, "(1)" - line 257, "pan.___", state 1991, "(1)" - line 261, "pan.___", state 1999, "(1)" - line 411, "pan.___", state 2020, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 2022, "(1)" - line 411, "pan.___", state 2023, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 2023, "else" - line 411, "pan.___", state 2026, "(1)" - line 415, "pan.___", state 2034, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2036, "(1)" - line 415, "pan.___", state 2037, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 2037, "else" - line 415, "pan.___", state 2040, "(1)" - line 415, "pan.___", state 2041, "(1)" - line 415, "pan.___", state 2041, "(1)" - line 413, "pan.___", state 2046, "((i<1))" - line 413, "pan.___", state 2046, "((i>=1))" - line 420, "pan.___", state 2052, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2054, "(1)" - line 420, "pan.___", state 2055, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 2055, "else" - line 420, "pan.___", state 2058, "(1)" - line 420, "pan.___", state 2059, "(1)" - line 420, "pan.___", state 2059, "(1)" - line 424, "pan.___", state 2066, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2068, "(1)" - line 424, "pan.___", state 2069, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 2069, "else" - line 424, "pan.___", state 2072, "(1)" - line 424, "pan.___", state 2073, "(1)" - line 424, "pan.___", state 2073, "(1)" - line 422, "pan.___", state 2078, "((i<2))" - line 422, "pan.___", state 2078, "((i>=2))" - line 249, "pan.___", state 2084, "(1)" - line 253, "pan.___", state 2092, "(1)" - line 253, "pan.___", state 2093, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 2093, "else" - line 251, "pan.___", state 2098, "((i<1))" - line 251, "pan.___", state 2098, "((i>=1))" - line 257, "pan.___", state 2104, "(1)" - line 257, "pan.___", state 2105, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 2105, "else" - line 261, "pan.___", state 2112, "(1)" - line 261, "pan.___", state 2113, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 2113, "else" - line 259, "pan.___", state 2118, "((i<2))" - line 259, "pan.___", state 2118, "((i>=2))" - line 266, "pan.___", state 2122, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 2122, "else" - line 431, "pan.___", state 2124, "(1)" - line 431, "pan.___", state 2124, "(1)" - line 644, "pan.___", state 2127, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 644, "pan.___", state 2128, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 644, "pan.___", state 2129, "(1)" - line 272, "pan.___", state 2133, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2155, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2164, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2180, "(1)" - line 253, "pan.___", state 2188, "(1)" - line 257, "pan.___", state 2200, "(1)" - line 261, "pan.___", state 2208, "(1)" - line 411, "pan.___", state 2226, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2240, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2258, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2272, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2290, "(1)" - line 253, "pan.___", state 2298, "(1)" - line 257, "pan.___", state 2310, "(1)" - line 261, "pan.___", state 2318, "(1)" - line 272, "pan.___", state 2340, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 2349, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2362, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2371, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2387, "(1)" - line 253, "pan.___", state 2395, "(1)" - line 257, "pan.___", state 2407, "(1)" - line 261, "pan.___", state 2415, "(1)" - line 411, "pan.___", state 2433, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2447, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2465, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2479, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2497, "(1)" - line 253, "pan.___", state 2505, "(1)" - line 257, "pan.___", state 2517, "(1)" - line 261, "pan.___", state 2525, "(1)" - line 411, "pan.___", state 2544, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2558, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2576, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2590, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2608, "(1)" - line 253, "pan.___", state 2616, "(1)" - line 257, "pan.___", state 2628, "(1)" - line 261, "pan.___", state 2636, "(1)" - line 249, "pan.___", state 2667, "(1)" - line 257, "pan.___", state 2687, "(1)" - line 261, "pan.___", state 2695, "(1)" - line 249, "pan.___", state 2710, "(1)" - line 253, "pan.___", state 2718, "(1)" - line 257, "pan.___", state 2730, "(1)" - line 261, "pan.___", state 2738, "(1)" - line 898, "pan.___", state 2755, "-end-" - (259 of 2755 states) -unreached in proctype urcu_writer - line 411, "pan.___", state 22, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 36, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 54, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 249, "pan.___", state 86, "(1)" - line 253, "pan.___", state 94, "(1)" - line 257, "pan.___", state 106, "(1)" - line 272, "pan.___", state 135, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 144, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 157, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 211, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 229, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 243, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 261, "(1)" - line 253, "pan.___", state 269, "(1)" - line 257, "pan.___", state 281, "(1)" - line 261, "pan.___", state 289, "(1)" - line 415, "pan.___", state 324, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 342, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 356, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 382, "(1)" - line 257, "pan.___", state 394, "(1)" - line 261, "pan.___", state 402, "(1)" - line 411, "pan.___", state 430, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 444, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 462, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 476, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 494, "(1)" - line 253, "pan.___", state 502, "(1)" - line 257, "pan.___", state 514, "(1)" - line 261, "pan.___", state 522, "(1)" - line 411, "pan.___", state 541, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 543, "(1)" - line 411, "pan.___", state 544, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 544, "else" - line 411, "pan.___", state 547, "(1)" - line 415, "pan.___", state 555, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 557, "(1)" - line 415, "pan.___", state 558, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 558, "else" - line 415, "pan.___", state 561, "(1)" - line 415, "pan.___", state 562, "(1)" - line 415, "pan.___", state 562, "(1)" - line 413, "pan.___", state 567, "((i<1))" - line 413, "pan.___", state 567, "((i>=1))" - line 420, "pan.___", state 573, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 575, "(1)" - line 420, "pan.___", state 576, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 576, "else" - line 420, "pan.___", state 579, "(1)" - line 420, "pan.___", state 580, "(1)" - line 420, "pan.___", state 580, "(1)" - line 424, "pan.___", state 587, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 589, "(1)" - line 424, "pan.___", state 590, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 590, "else" - line 424, "pan.___", state 593, "(1)" - line 424, "pan.___", state 594, "(1)" - line 424, "pan.___", state 594, "(1)" - line 422, "pan.___", state 599, "((i<2))" - line 422, "pan.___", state 599, "((i>=2))" - line 249, "pan.___", state 605, "(1)" - line 253, "pan.___", state 613, "(1)" - line 253, "pan.___", state 614, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 614, "else" - line 251, "pan.___", state 619, "((i<1))" - line 251, "pan.___", state 619, "((i>=1))" - line 257, "pan.___", state 625, "(1)" - line 257, "pan.___", state 626, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 626, "else" - line 261, "pan.___", state 633, "(1)" - line 261, "pan.___", state 634, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 634, "else" - line 259, "pan.___", state 639, "((i<2))" - line 259, "pan.___", state 639, "((i>=2))" - line 266, "pan.___", state 643, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 643, "else" - line 431, "pan.___", state 645, "(1)" - line 431, "pan.___", state 645, "(1)" - line 1117, "pan.___", state 649, "_proc_urcu_writer = (_proc_urcu_writer|(1<<10))" - line 411, "pan.___", state 654, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 656, "(1)" - line 411, "pan.___", state 657, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 657, "else" - line 411, "pan.___", state 660, "(1)" - line 415, "pan.___", state 668, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 670, "(1)" - line 415, "pan.___", state 671, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 671, "else" - line 415, "pan.___", state 674, "(1)" - line 415, "pan.___", state 675, "(1)" - line 415, "pan.___", state 675, "(1)" - line 413, "pan.___", state 680, "((i<1))" - line 413, "pan.___", state 680, "((i>=1))" - line 420, "pan.___", state 686, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 688, "(1)" - line 420, "pan.___", state 689, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 689, "else" - line 420, "pan.___", state 692, "(1)" - line 420, "pan.___", state 693, "(1)" - line 420, "pan.___", state 693, "(1)" - line 424, "pan.___", state 700, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 702, "(1)" - line 424, "pan.___", state 703, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 703, "else" - line 424, "pan.___", state 706, "(1)" - line 424, "pan.___", state 707, "(1)" - line 424, "pan.___", state 707, "(1)" - line 422, "pan.___", state 712, "((i<2))" - line 422, "pan.___", state 712, "((i>=2))" - line 249, "pan.___", state 718, "(1)" - line 253, "pan.___", state 726, "(1)" - line 253, "pan.___", state 727, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 727, "else" - line 251, "pan.___", state 732, "((i<1))" - line 251, "pan.___", state 732, "((i>=1))" - line 257, "pan.___", state 738, "(1)" - line 257, "pan.___", state 739, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 739, "else" - line 261, "pan.___", state 746, "(1)" - line 261, "pan.___", state 747, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 747, "else" - line 259, "pan.___", state 752, "((i<2))" - line 259, "pan.___", state 752, "((i>=2))" - line 266, "pan.___", state 756, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 756, "else" - line 431, "pan.___", state 758, "(1)" - line 431, "pan.___", state 758, "(1)" - line 1133, "pan.___", state 763, "_proc_urcu_writer = (_proc_urcu_writer|(1<<11))" - line 1128, "pan.___", state 764, "(((tmp2&((1<<7)-1))&&((tmp2^0)&(1<<7))))" - line 1128, "pan.___", state 764, "else" - line 1153, "pan.___", state 768, "_proc_urcu_writer = (_proc_urcu_writer&~(((1<<12)|(1<<11))))" - line 272, "pan.___", state 799, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 808, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 823, "(1)" - line 284, "pan.___", state 830, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 846, "(1)" - line 253, "pan.___", state 854, "(1)" - line 257, "pan.___", state 866, "(1)" - line 261, "pan.___", state 874, "(1)" - line 276, "pan.___", state 899, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 912, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 921, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 937, "(1)" - line 253, "pan.___", state 945, "(1)" - line 257, "pan.___", state 957, "(1)" - line 261, "pan.___", state 965, "(1)" - line 272, "pan.___", state 981, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 272, "pan.___", state 983, "(1)" - line 276, "pan.___", state 990, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 992, "(1)" - line 276, "pan.___", state 993, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 276, "pan.___", state 993, "else" - line 274, "pan.___", state 998, "((i<1))" - line 274, "pan.___", state 998, "((i>=1))" - line 280, "pan.___", state 1003, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1005, "(1)" - line 280, "pan.___", state 1006, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 280, "pan.___", state 1006, "else" - line 284, "pan.___", state 1012, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1014, "(1)" - line 284, "pan.___", state 1015, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 284, "pan.___", state 1015, "else" - line 282, "pan.___", state 1020, "((i<2))" - line 282, "pan.___", state 1020, "((i>=2))" - line 249, "pan.___", state 1028, "(1)" - line 253, "pan.___", state 1036, "(1)" - line 253, "pan.___", state 1037, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 1037, "else" - line 251, "pan.___", state 1042, "((i<1))" - line 251, "pan.___", state 1042, "((i>=1))" - line 257, "pan.___", state 1048, "(1)" - line 257, "pan.___", state 1049, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 1049, "else" - line 261, "pan.___", state 1056, "(1)" - line 261, "pan.___", state 1057, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 1057, "else" - line 266, "pan.___", state 1066, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 1066, "else" - line 299, "pan.___", state 1068, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 299, "pan.___", state 1068, "else" - line 276, "pan.___", state 1081, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1094, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1103, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1119, "(1)" - line 253, "pan.___", state 1127, "(1)" - line 257, "pan.___", state 1139, "(1)" - line 261, "pan.___", state 1147, "(1)" - line 1237, "pan.___", state 1162, "-end-" - (145 of 1162 states) -unreached in proctype :init: - line 1248, "pan.___", state 9, "((j<2))" - line 1248, "pan.___", state 9, "((j>=2))" - line 1249, "pan.___", state 20, "((j<2))" - line 1249, "pan.___", state 20, "((j>=2))" - line 1254, "pan.___", state 33, "((j<2))" - line 1254, "pan.___", state 33, "((j>=2))" - line 1252, "pan.___", state 43, "((i<1))" - line 1252, "pan.___", state 43, "((i>=1))" - line 1262, "pan.___", state 54, "((j<2))" - line 1262, "pan.___", state 54, "((j>=2))" - line 1266, "pan.___", state 67, "((j<2))" - line 1266, "pan.___", state 67, "((j>=2))" - (6 of 78 states) -unreached in proctype :never: - line 1300, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 86.8 seconds -pan: rate 19690.388 states/second -pan: avg transition delay 2.7571e-06 usec -cp .input.spin urcu_free_single_flip.spin.input -cp .input.spin.trail urcu_free_single_flip.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_single_flip.spin.input b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_single_flip.spin.input deleted file mode 100644 index e7189ef..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_single_flip.spin.input +++ /dev/null @@ -1,1273 +0,0 @@ -#define SINGLE_FLIP - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_single_flip.spin.input.trail b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_single_flip.spin.input.trail deleted file mode 100644 index 6eb297f..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_free_single_flip.spin.input.trail +++ /dev/null @@ -1,1062 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:3997 -2:3:3917 -3:3:3920 -4:3:3920 -5:3:3923 -6:3:3931 -7:3:3931 -8:3:3934 -9:3:3940 -10:3:3944 -11:3:3944 -12:3:3947 -13:3:3957 -14:3:3965 -15:3:3965 -16:3:3968 -17:3:3974 -18:3:3978 -19:3:3978 -20:3:3981 -21:3:3987 -22:3:3991 -23:3:3992 -24:0:3997 -25:3:3994 -26:0:3997 -27:2:2757 -28:0:3997 -29:2:2763 -30:0:3997 -31:2:2764 -32:0:3997 -33:2:2766 -34:0:3997 -35:2:2767 -36:0:3997 -37:2:2768 -38:0:3997 -39:2:2769 -40:0:3997 -41:2:2770 -42:0:3997 -43:2:2771 -44:0:3997 -45:2:2772 -46:2:2773 -47:2:2777 -48:2:2778 -49:2:2786 -50:2:2787 -51:2:2791 -52:2:2792 -53:2:2800 -54:2:2805 -55:2:2809 -56:2:2810 -57:2:2818 -58:2:2819 -59:2:2823 -60:2:2824 -61:2:2818 -62:2:2819 -63:2:2823 -64:2:2824 -65:2:2832 -66:2:2837 -67:2:2844 -68:2:2845 -69:2:2852 -70:2:2857 -71:2:2864 -72:2:2865 -73:2:2864 -74:2:2865 -75:2:2872 -76:2:2882 -77:0:3997 -78:2:2771 -79:0:3997 -80:2:2886 -81:2:2890 -82:2:2891 -83:2:2895 -84:2:2899 -85:2:2900 -86:2:2904 -87:2:2912 -88:2:2913 -89:2:2917 -90:2:2921 -91:2:2922 -92:2:2917 -93:2:2918 -94:2:2926 -95:0:3997 -96:2:2771 -97:0:3997 -98:2:2934 -99:2:2935 -100:2:2936 -101:0:3997 -102:2:2771 -103:0:3997 -104:2:2941 -105:0:3997 -106:2:3554 -107:2:3555 -108:2:3559 -109:2:3563 -110:2:3564 -111:2:3568 -112:2:3573 -113:2:3581 -114:2:3585 -115:2:3586 -116:2:3581 -117:2:3585 -118:2:3586 -119:2:3590 -120:2:3597 -121:2:3604 -122:2:3605 -123:2:3612 -124:2:3617 -125:2:3624 -126:2:3625 -127:2:3624 -128:2:3625 -129:2:3632 -130:2:3636 -131:0:3997 -132:2:2943 -133:2:3535 -134:0:3997 -135:2:2771 -136:0:3997 -137:2:2944 -138:0:3997 -139:2:2771 -140:0:3997 -141:2:2947 -142:2:2948 -143:2:2952 -144:2:2953 -145:2:2961 -146:2:2962 -147:2:2966 -148:2:2967 -149:2:2975 -150:2:2980 -151:2:2984 -152:2:2985 -153:2:2993 -154:2:2994 -155:2:2998 -156:2:2999 -157:2:2993 -158:2:2994 -159:2:2998 -160:2:2999 -161:2:3007 -162:2:3012 -163:2:3019 -164:2:3020 -165:2:3027 -166:2:3032 -167:2:3039 -168:2:3040 -169:2:3039 -170:2:3040 -171:2:3047 -172:2:3056 -173:0:3997 -174:2:2771 -175:0:3997 -176:2:3060 -177:2:3069 -178:2:3070 -179:2:3074 -180:2:3075 -181:2:3079 -182:2:3080 -183:2:3088 -184:2:3093 -185:2:3097 -186:2:3098 -187:2:3106 -188:2:3107 -189:2:3111 -190:2:3112 -191:2:3106 -192:2:3107 -193:2:3111 -194:2:3112 -195:2:3120 -196:2:3127 -197:2:3128 -198:2:3132 -199:2:3133 -200:2:3140 -201:2:3145 -202:2:3152 -203:2:3153 -204:2:3152 -205:2:3153 -206:2:3160 -207:2:3172 -208:2:3173 -209:0:3997 -210:2:2771 -211:0:3997 -212:2:3523 -213:0:3997 -214:1:2 -215:0:3997 -216:1:8 -217:0:3997 -218:1:9 -219:0:3997 -220:1:10 -221:0:3997 -222:1:11 -223:0:3997 -224:1:12 -225:1:13 -226:1:17 -227:1:18 -228:1:26 -229:1:27 -230:1:31 -231:1:32 -232:1:40 -233:1:45 -234:1:49 -235:1:50 -236:1:58 -237:1:59 -238:1:63 -239:1:64 -240:1:58 -241:1:59 -242:1:63 -243:1:64 -244:1:72 -245:1:77 -246:1:84 -247:1:85 -248:1:92 -249:1:97 -250:1:104 -251:1:105 -252:1:104 -253:1:105 -254:1:112 -255:0:3997 -256:1:11 -257:0:3997 -258:1:123 -259:1:124 -260:0:3997 -261:1:11 -262:0:3997 -263:1:130 -264:1:131 -265:1:135 -266:1:136 -267:1:144 -268:1:145 -269:1:149 -270:1:150 -271:1:158 -272:1:163 -273:1:167 -274:1:168 -275:1:176 -276:1:177 -277:1:181 -278:1:182 -279:1:176 -280:1:177 -281:1:181 -282:1:182 -283:1:190 -284:1:195 -285:1:202 -286:1:203 -287:1:210 -288:1:215 -289:1:222 -290:1:223 -291:1:222 -292:1:223 -293:1:230 -294:0:3997 -295:1:11 -296:0:3997 -297:2:3824 -298:2:3832 -299:2:3836 -300:2:3837 -301:2:3841 -302:2:3849 -303:2:3850 -304:2:3854 -305:2:3858 -306:2:3859 -307:2:3854 -308:2:3858 -309:2:3859 -310:2:3863 -311:2:3870 -312:2:3877 -313:2:3878 -314:2:3885 -315:2:3890 -316:2:3897 -317:2:3898 -318:2:3897 -319:2:3898 -320:2:3905 -321:2:3909 -322:0:3997 -323:2:3525 -324:2:3535 -325:0:3997 -326:2:2771 -327:0:3997 -328:2:3526 -329:2:3527 -330:0:3997 -331:2:2771 -332:0:3997 -333:2:3531 -334:0:3997 -335:2:3539 -336:0:3997 -337:2:2764 -338:0:3997 -339:2:2766 -340:0:3997 -341:2:2767 -342:0:3997 -343:2:2768 -344:0:3997 -345:2:2769 -346:0:3997 -347:2:2770 -348:0:3997 -349:2:2771 -350:0:3997 -351:2:2772 -352:2:2773 -353:2:2777 -354:2:2778 -355:2:2786 -356:2:2787 -357:2:2791 -358:2:2792 -359:2:2800 -360:2:2805 -361:2:2809 -362:2:2810 -363:2:2818 -364:2:2819 -365:2:2820 -366:2:2818 -367:2:2819 -368:2:2823 -369:2:2824 -370:2:2832 -371:2:2837 -372:2:2844 -373:2:2845 -374:2:2852 -375:2:2857 -376:2:2864 -377:2:2865 -378:2:2864 -379:2:2865 -380:2:2872 -381:2:2882 -382:0:3997 -383:2:2771 -384:0:3997 -385:2:2886 -386:2:2890 -387:2:2891 -388:2:2895 -389:2:2899 -390:2:2900 -391:2:2904 -392:2:2912 -393:2:2913 -394:2:2917 -395:2:2918 -396:2:2917 -397:2:2921 -398:2:2922 -399:2:2926 -400:0:3997 -401:2:2771 -402:0:3997 -403:2:2934 -404:2:2935 -405:2:2936 -406:0:3997 -407:2:2771 -408:0:3997 -409:2:2941 -410:0:3997 -411:1:241 -412:1:242 -413:1:246 -414:1:247 -415:1:255 -416:1:256 -417:1:260 -418:1:261 -419:1:269 -420:1:274 -421:1:278 -422:1:279 -423:1:287 -424:1:288 -425:1:292 -426:1:293 -427:1:287 -428:1:288 -429:1:292 -430:1:293 -431:1:301 -432:1:306 -433:1:313 -434:1:314 -435:1:321 -436:1:326 -437:1:333 -438:1:334 -439:1:333 -440:1:334 -441:1:341 -442:1:350 -443:0:3997 -444:1:11 -445:0:3997 -446:1:468 -447:1:472 -448:1:473 -449:1:477 -450:1:478 -451:1:486 -452:1:494 -453:1:495 -454:1:499 -455:1:503 -456:1:504 -457:1:499 -458:1:503 -459:1:504 -460:1:508 -461:1:515 -462:1:522 -463:1:523 -464:1:530 -465:1:535 -466:1:542 -467:1:543 -468:1:542 -469:1:543 -470:1:550 -471:0:3997 -472:1:11 -473:0:3997 -474:1:560 -475:1:561 -476:1:565 -477:1:566 -478:1:574 -479:1:575 -480:1:579 -481:1:580 -482:1:588 -483:1:593 -484:1:597 -485:1:598 -486:1:606 -487:1:607 -488:1:611 -489:1:612 -490:1:606 -491:1:607 -492:1:611 -493:1:612 -494:1:620 -495:1:625 -496:1:632 -497:1:633 -498:1:640 -499:1:645 -500:1:652 -501:1:653 -502:1:652 -503:1:653 -504:1:660 -505:0:3997 -506:1:11 -507:0:3997 -508:1:671 -509:1:674 -510:1:675 -511:0:3997 -512:1:11 -513:0:3997 -514:1:678 -515:1:679 -516:1:683 -517:1:684 -518:1:692 -519:1:693 -520:1:697 -521:1:698 -522:1:706 -523:1:711 -524:1:715 -525:1:716 -526:1:724 -527:1:725 -528:1:729 -529:1:730 -530:1:724 -531:1:725 -532:1:729 -533:1:730 -534:1:738 -535:1:743 -536:1:750 -537:1:751 -538:1:758 -539:1:763 -540:1:770 -541:1:771 -542:1:770 -543:1:771 -544:1:778 -545:0:3997 -546:1:11 -547:0:3997 -548:1:902 -549:1:903 -550:1:907 -551:1:908 -552:1:916 -553:1:917 -554:1:921 -555:1:922 -556:1:930 -557:1:935 -558:1:939 -559:1:940 -560:1:948 -561:1:949 -562:1:953 -563:1:954 -564:1:948 -565:1:949 -566:1:953 -567:1:954 -568:1:962 -569:1:967 -570:1:974 -571:1:975 -572:1:982 -573:1:987 -574:1:994 -575:1:995 -576:1:994 -577:1:995 -578:1:1002 -579:1:1011 -580:1:1015 -581:0:3997 -582:1:11 -583:0:3997 -584:1:1016 -585:1:1017 -586:1:1021 -587:1:1022 -588:1:1030 -589:1:1031 -590:1:1032 -591:1:1044 -592:1:1049 -593:1:1053 -594:1:1054 -595:1:1062 -596:1:1063 -597:1:1067 -598:1:1068 -599:1:1062 -600:1:1063 -601:1:1067 -602:1:1068 -603:1:1076 -604:1:1081 -605:1:1088 -606:1:1089 -607:1:1096 -608:1:1101 -609:1:1108 -610:1:1109 -611:1:1108 -612:1:1109 -613:1:1116 -614:0:3997 -615:1:11 -616:0:3997 -617:2:3554 -618:2:3555 -619:2:3559 -620:2:3563 -621:2:3564 -622:2:3568 -623:2:3573 -624:2:3581 -625:2:3585 -626:2:3586 -627:2:3581 -628:2:3585 -629:2:3586 -630:2:3590 -631:2:3597 -632:2:3604 -633:2:3605 -634:2:3612 -635:2:3617 -636:2:3624 -637:2:3625 -638:2:3624 -639:2:3625 -640:2:3632 -641:2:3636 -642:0:3997 -643:2:2943 -644:2:3535 -645:0:3997 -646:2:2771 -647:0:3997 -648:2:2944 -649:0:3997 -650:2:2771 -651:0:3997 -652:2:2947 -653:2:2948 -654:2:2952 -655:2:2953 -656:2:2961 -657:2:2962 -658:2:2966 -659:2:2967 -660:2:2975 -661:2:2980 -662:2:2984 -663:2:2985 -664:2:2993 -665:2:2994 -666:2:2998 -667:2:2999 -668:2:2993 -669:2:2994 -670:2:2998 -671:2:2999 -672:2:3007 -673:2:3012 -674:2:3019 -675:2:3020 -676:2:3027 -677:2:3032 -678:2:3039 -679:2:3040 -680:2:3039 -681:2:3040 -682:2:3047 -683:2:3056 -684:0:3997 -685:2:2771 -686:0:3997 -687:2:3060 -688:2:3061 -689:2:3062 -690:2:3074 -691:2:3075 -692:2:3079 -693:2:3080 -694:2:3088 -695:2:3093 -696:2:3097 -697:2:3098 -698:2:3106 -699:2:3107 -700:2:3111 -701:2:3112 -702:2:3106 -703:2:3107 -704:2:3111 -705:2:3112 -706:2:3120 -707:2:3125 -708:2:3132 -709:2:3133 -710:2:3140 -711:2:3145 -712:2:3152 -713:2:3153 -714:2:3152 -715:2:3153 -716:2:3160 -717:2:3172 -718:2:3173 -719:0:3997 -720:2:2771 -721:0:3997 -722:2:3523 -723:0:3997 -724:2:3827 -725:2:3828 -726:2:3832 -727:2:3836 -728:2:3837 -729:2:3841 -730:2:3849 -731:2:3850 -732:2:3854 -733:2:3858 -734:2:3859 -735:2:3854 -736:2:3858 -737:2:3859 -738:2:3863 -739:2:3870 -740:2:3877 -741:2:3878 -742:2:3885 -743:2:3890 -744:2:3897 -745:2:3898 -746:2:3897 -747:2:3898 -748:2:3905 -749:2:3909 -750:0:3997 -751:2:3525 -752:2:3535 -753:0:3997 -754:2:2771 -755:0:3997 -756:2:3526 -757:2:3527 -758:0:3997 -759:2:2771 -760:0:3997 -761:2:3531 -762:0:3997 -763:2:3539 -764:0:3997 -765:2:2764 -766:0:3997 -767:2:2766 -768:0:3997 -769:2:2767 -770:0:3997 -771:2:2768 -772:0:3997 -773:2:2769 -774:0:3997 -775:2:2770 -776:0:3997 -777:2:2771 -778:0:3997 -779:2:2772 -780:2:2773 -781:2:2777 -782:2:2778 -783:2:2786 -784:2:2787 -785:2:2791 -786:2:2792 -787:2:2800 -788:2:2805 -789:2:2809 -790:2:2810 -791:2:2818 -792:2:2819 -793:2:2823 -794:2:2824 -795:2:2818 -796:2:2819 -797:2:2820 -798:2:2832 -799:2:2837 -800:2:2844 -801:2:2845 -802:2:2852 -803:2:2857 -804:2:2864 -805:2:2865 -806:2:2864 -807:2:2865 -808:2:2872 -809:2:2882 -810:0:3997 -811:2:2771 -812:0:3997 -813:1:1127 -814:0:3997 -815:1:2663 -816:1:2670 -817:1:2671 -818:1:2678 -819:1:2683 -820:1:2690 -821:1:2691 -822:1:2690 -823:1:2691 -824:1:2698 -825:1:2702 -826:0:3997 -827:2:2886 -828:2:2890 -829:2:2891 -830:2:2895 -831:2:2899 -832:2:2900 -833:2:2904 -834:2:2912 -835:2:2913 -836:2:2917 -837:2:2921 -838:2:2922 -839:2:2917 -840:2:2918 -841:2:2926 -842:0:3997 -843:2:2771 -844:0:3997 -845:2:2934 -846:2:2935 -847:2:2936 -848:0:3997 -849:2:2771 -850:0:3997 -851:2:2941 -852:0:3997 -853:2:3554 -854:2:3555 -855:2:3559 -856:2:3563 -857:2:3564 -858:2:3568 -859:2:3573 -860:2:3581 -861:2:3585 -862:2:3586 -863:2:3581 -864:2:3585 -865:2:3586 -866:2:3590 -867:2:3597 -868:2:3604 -869:2:3605 -870:2:3612 -871:2:3617 -872:2:3624 -873:2:3625 -874:2:3624 -875:2:3625 -876:2:3632 -877:2:3636 -878:0:3997 -879:2:2943 -880:2:3535 -881:0:3997 -882:2:2771 -883:0:3997 -884:2:2944 -885:0:3997 -886:2:2771 -887:0:3997 -888:2:2947 -889:2:2948 -890:2:2952 -891:2:2953 -892:2:2961 -893:2:2962 -894:2:2966 -895:2:2967 -896:2:2975 -897:2:2980 -898:2:2984 -899:2:2985 -900:2:2993 -901:2:2994 -902:2:2998 -903:2:2999 -904:2:2993 -905:2:2994 -906:2:2998 -907:2:2999 -908:2:3007 -909:2:3012 -910:2:3019 -911:2:3020 -912:2:3027 -913:2:3032 -914:2:3039 -915:2:3040 -916:2:3039 -917:2:3040 -918:2:3047 -919:2:3056 -920:0:3997 -921:2:2771 -922:0:3997 -923:2:3060 -924:2:3061 -925:2:3062 -926:2:3074 -927:2:3075 -928:2:3079 -929:2:3080 -930:2:3088 -931:2:3093 -932:2:3097 -933:2:3098 -934:2:3106 -935:2:3107 -936:2:3111 -937:2:3112 -938:2:3106 -939:2:3107 -940:2:3111 -941:2:3112 -942:2:3120 -943:2:3125 -944:2:3132 -945:2:3133 -946:2:3140 -947:2:3145 -948:2:3152 -949:2:3153 -950:2:3152 -951:2:3153 -952:2:3160 -953:2:3170 -954:0:3997 -955:2:2771 -956:0:3997 -957:2:3176 -958:0:3997 -959:2:3645 -960:2:3646 -961:2:3650 -962:2:3654 -963:2:3655 -964:2:3659 -965:2:3667 -966:2:3668 -967:2:3672 -968:2:3676 -969:2:3677 -970:2:3672 -971:2:3676 -972:2:3677 -973:2:3681 -974:2:3688 -975:2:3695 -976:2:3696 -977:2:3703 -978:2:3708 -979:2:3715 -980:2:3716 -981:2:3715 -982:2:3716 -983:2:3723 -984:2:3727 -985:0:3997 -986:2:3178 -987:2:3179 -988:0:3997 -989:2:2771 -990:0:3997 -991:2:3060 -992:2:3061 -993:2:3065 -994:2:3066 -995:2:3074 -996:2:3075 -997:2:3079 -998:2:3080 -999:2:3088 -1000:2:3093 -1001:2:3097 -1002:2:3098 -1003:2:3106 -1004:2:3107 -1005:2:3111 -1006:2:3112 -1007:2:3106 -1008:2:3107 -1009:2:3111 -1010:2:3112 -1011:2:3120 -1012:2:3125 -1013:2:3132 -1014:2:3133 -1015:2:3140 -1016:2:3145 -1017:2:3152 -1018:2:3153 -1019:2:3152 -1020:2:3153 -1021:2:3160 -1022:2:3170 -1023:0:3997 -1024:2:2771 -1025:0:3997 -1026:2:3176 -1027:0:3997 -1028:2:3645 -1029:2:3646 -1030:2:3650 -1031:2:3654 -1032:2:3655 -1033:2:3659 -1034:2:3667 -1035:2:3668 -1036:2:3672 -1037:2:3676 -1038:2:3677 -1039:2:3672 -1040:2:3676 -1041:2:3677 -1042:2:3681 -1043:2:3688 -1044:2:3695 -1045:2:3696 -1046:2:3703 -1047:2:3708 -1048:2:3715 -1049:2:3716 -1050:2:3715 -1051:2:3716 -1052:2:3723 -1053:2:3727 -1054:0:3997 -1055:1:1129 -1056:1:1130 -1057:0:3995 -1058:1:11 -1059:0:4001 -1060:1:1715 diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress.ltl b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_reader.define b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_reader.log b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_reader.log deleted file mode 100644 index c286056..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_reader.log +++ /dev/null @@ -1,462 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_reader.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1295) -depth 23: Claim reached state 9 (line 1300) -depth 1053: Claim reached state 9 (line 1299) -Depth= 6090 States= 1e+06 Transitions= 2.22e+07 Memory= 510.295 t= 64.5 R= 2e+04 -Depth= 6090 States= 2e+06 Transitions= 5.32e+07 Memory= 552.776 t= 157 R= 1e+04 -Depth= 6090 States= 3e+06 Transitions= 8.56e+07 Memory= 597.014 t= 253 R= 1e+04 -pan: resizing hashtable to -w22.. done -Depth= 6090 States= 4e+06 Transitions= 1.18e+08 Memory= 672.764 t= 351 R= 1e+04 -Depth= 6090 States= 5e+06 Transitions= 1.49e+08 Memory= 716.416 t= 443 R= 1e+04 -Depth= 6090 States= 6e+06 Transitions= 1.79e+08 Memory= 760.459 t= 531 R= 1e+04 -Depth= 6090 States= 7e+06 Transitions= 2.11e+08 Memory= 804.990 t= 627 R= 1e+04 -Depth= 6090 States= 8e+06 Transitions= 2.44e+08 Memory= 848.057 t= 727 R= 1e+04 -Depth= 6090 States= 9e+06 Transitions= 2.77e+08 Memory= 891.807 t= 827 R= 1e+04 -pan: resizing hashtable to -w24.. done -Depth= 6090 States= 1e+07 Transitions= 3.11e+08 Memory= 1062.385 t= 928 R= 1e+04 -Depth= 6090 States= 1.1e+07 Transitions= 3.41e+08 Memory= 1105.744 t= 1.02e+03 R= 1e+04 -Depth= 6090 States= 1.2e+07 Transitions= 3.7e+08 Memory= 1151.252 t= 1.1e+03 R= 1e+04 -Depth= 6090 States= 1.3e+07 Transitions= 4.06e+08 Memory= 1193.635 t= 1.21e+03 R= 1e+04 -Depth= 6090 States= 1.4e+07 Transitions= 4.4e+08 Memory= 1236.506 t= 1.31e+03 R= 1e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 6090, errors: 0 - 7774591 states, stored (1.48046e+07 visited) -4.51403e+08 states, matched -4.6620756e+08 transitions (= visited+matched) -7.4729019e+09 atomic steps -hash conflicts: 1.6384912e+08 (resolved) - -Stats on memory usage (in Megabytes): - 860.074 equivalent memory usage for states (stored*(State-vector + overhead)) - 689.043 actual memory usage for states (compression: 80.11%) - state-vector as stored = 65 byte + 28 byte overhead - 128.000 memory used for hash table (-w24) - 457.764 memory used for DFS stack (-m10000000) - 1274.299 total actual memory usage - -unreached in proctype urcu_reader - line 411, "pan.___", state 17, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 49, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 63, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 81, "(1)" - line 257, "pan.___", state 101, "(1)" - line 261, "pan.___", state 109, "(1)" - line 597, "pan.___", state 128, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 411, "pan.___", state 135, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 167, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 181, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 199, "(1)" - line 257, "pan.___", state 219, "(1)" - line 261, "pan.___", state 227, "(1)" - line 411, "pan.___", state 246, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 278, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 292, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 310, "(1)" - line 257, "pan.___", state 330, "(1)" - line 261, "pan.___", state 338, "(1)" - line 411, "pan.___", state 359, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 361, "(1)" - line 411, "pan.___", state 362, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 362, "else" - line 411, "pan.___", state 365, "(1)" - line 415, "pan.___", state 373, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 375, "(1)" - line 415, "pan.___", state 376, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 376, "else" - line 415, "pan.___", state 379, "(1)" - line 415, "pan.___", state 380, "(1)" - line 415, "pan.___", state 380, "(1)" - line 413, "pan.___", state 385, "((i<1))" - line 413, "pan.___", state 385, "((i>=1))" - line 420, "pan.___", state 391, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 393, "(1)" - line 420, "pan.___", state 394, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 394, "else" - line 420, "pan.___", state 397, "(1)" - line 420, "pan.___", state 398, "(1)" - line 420, "pan.___", state 398, "(1)" - line 424, "pan.___", state 405, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 407, "(1)" - line 424, "pan.___", state 408, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 408, "else" - line 424, "pan.___", state 411, "(1)" - line 424, "pan.___", state 412, "(1)" - line 424, "pan.___", state 412, "(1)" - line 422, "pan.___", state 417, "((i<2))" - line 422, "pan.___", state 417, "((i>=2))" - line 249, "pan.___", state 423, "(1)" - line 253, "pan.___", state 431, "(1)" - line 253, "pan.___", state 432, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 432, "else" - line 251, "pan.___", state 437, "((i<1))" - line 251, "pan.___", state 437, "((i>=1))" - line 257, "pan.___", state 443, "(1)" - line 257, "pan.___", state 444, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 444, "else" - line 261, "pan.___", state 451, "(1)" - line 261, "pan.___", state 452, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 452, "else" - line 259, "pan.___", state 457, "((i<2))" - line 259, "pan.___", state 457, "((i>=2))" - line 266, "pan.___", state 461, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 461, "else" - line 431, "pan.___", state 463, "(1)" - line 431, "pan.___", state 463, "(1)" - line 597, "pan.___", state 466, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 597, "pan.___", state 467, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 597, "pan.___", state 468, "(1)" - line 272, "pan.___", state 472, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 483, "(1)" - line 280, "pan.___", state 494, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 503, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 519, "(1)" - line 253, "pan.___", state 527, "(1)" - line 257, "pan.___", state 539, "(1)" - line 261, "pan.___", state 547, "(1)" - line 411, "pan.___", state 565, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 579, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 597, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 611, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 629, "(1)" - line 253, "pan.___", state 637, "(1)" - line 257, "pan.___", state 649, "(1)" - line 261, "pan.___", state 657, "(1)" - line 411, "pan.___", state 683, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 715, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 729, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 747, "(1)" - line 257, "pan.___", state 767, "(1)" - line 261, "pan.___", state 775, "(1)" - line 411, "pan.___", state 794, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 796, "(1)" - line 411, "pan.___", state 797, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 797, "else" - line 411, "pan.___", state 800, "(1)" - line 415, "pan.___", state 808, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 810, "(1)" - line 415, "pan.___", state 811, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 811, "else" - line 415, "pan.___", state 814, "(1)" - line 415, "pan.___", state 815, "(1)" - line 415, "pan.___", state 815, "(1)" - line 413, "pan.___", state 820, "((i<1))" - line 413, "pan.___", state 820, "((i>=1))" - line 420, "pan.___", state 826, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 828, "(1)" - line 420, "pan.___", state 829, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 829, "else" - line 420, "pan.___", state 832, "(1)" - line 420, "pan.___", state 833, "(1)" - line 420, "pan.___", state 833, "(1)" - line 424, "pan.___", state 840, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 842, "(1)" - line 424, "pan.___", state 843, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 843, "else" - line 424, "pan.___", state 846, "(1)" - line 424, "pan.___", state 847, "(1)" - line 424, "pan.___", state 847, "(1)" - line 422, "pan.___", state 852, "((i<2))" - line 422, "pan.___", state 852, "((i>=2))" - line 249, "pan.___", state 858, "(1)" - line 253, "pan.___", state 866, "(1)" - line 253, "pan.___", state 867, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 867, "else" - line 251, "pan.___", state 872, "((i<1))" - line 251, "pan.___", state 872, "((i>=1))" - line 257, "pan.___", state 878, "(1)" - line 257, "pan.___", state 879, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 879, "else" - line 261, "pan.___", state 886, "(1)" - line 261, "pan.___", state 887, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 887, "else" - line 259, "pan.___", state 892, "((i<2))" - line 259, "pan.___", state 892, "((i>=2))" - line 266, "pan.___", state 896, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 896, "else" - line 431, "pan.___", state 898, "(1)" - line 431, "pan.___", state 898, "(1)" - line 605, "pan.___", state 902, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 411, "pan.___", state 907, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 921, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 939, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 953, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 971, "(1)" - line 253, "pan.___", state 979, "(1)" - line 257, "pan.___", state 991, "(1)" - line 261, "pan.___", state 999, "(1)" - line 411, "pan.___", state 1021, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1053, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1067, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1085, "(1)" - line 257, "pan.___", state 1105, "(1)" - line 261, "pan.___", state 1113, "(1)" - line 411, "pan.___", state 1136, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1168, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1182, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1200, "(1)" - line 257, "pan.___", state 1220, "(1)" - line 261, "pan.___", state 1228, "(1)" - line 411, "pan.___", state 1247, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1279, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1293, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1311, "(1)" - line 257, "pan.___", state 1331, "(1)" - line 261, "pan.___", state 1339, "(1)" - line 272, "pan.___", state 1360, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1382, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1391, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1407, "(1)" - line 253, "pan.___", state 1415, "(1)" - line 257, "pan.___", state 1427, "(1)" - line 261, "pan.___", state 1435, "(1)" - line 411, "pan.___", state 1453, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1467, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1485, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1499, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1517, "(1)" - line 253, "pan.___", state 1525, "(1)" - line 257, "pan.___", state 1537, "(1)" - line 261, "pan.___", state 1545, "(1)" - line 411, "pan.___", state 1564, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1578, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1596, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1610, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1628, "(1)" - line 253, "pan.___", state 1636, "(1)" - line 257, "pan.___", state 1648, "(1)" - line 261, "pan.___", state 1656, "(1)" - line 411, "pan.___", state 1678, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1710, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1724, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1742, "(1)" - line 257, "pan.___", state 1762, "(1)" - line 261, "pan.___", state 1770, "(1)" - line 644, "pan.___", state 1789, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 411, "pan.___", state 1796, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1828, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1842, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1860, "(1)" - line 257, "pan.___", state 1880, "(1)" - line 261, "pan.___", state 1888, "(1)" - line 411, "pan.___", state 1907, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1939, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1953, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1971, "(1)" - line 257, "pan.___", state 1991, "(1)" - line 261, "pan.___", state 1999, "(1)" - line 411, "pan.___", state 2020, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 2022, "(1)" - line 411, "pan.___", state 2023, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 2023, "else" - line 411, "pan.___", state 2026, "(1)" - line 415, "pan.___", state 2034, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2036, "(1)" - line 415, "pan.___", state 2037, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 2037, "else" - line 415, "pan.___", state 2040, "(1)" - line 415, "pan.___", state 2041, "(1)" - line 415, "pan.___", state 2041, "(1)" - line 413, "pan.___", state 2046, "((i<1))" - line 413, "pan.___", state 2046, "((i>=1))" - line 420, "pan.___", state 2052, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2054, "(1)" - line 420, "pan.___", state 2055, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 2055, "else" - line 420, "pan.___", state 2058, "(1)" - line 420, "pan.___", state 2059, "(1)" - line 420, "pan.___", state 2059, "(1)" - line 424, "pan.___", state 2066, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2068, "(1)" - line 424, "pan.___", state 2069, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 2069, "else" - line 424, "pan.___", state 2072, "(1)" - line 424, "pan.___", state 2073, "(1)" - line 424, "pan.___", state 2073, "(1)" - line 422, "pan.___", state 2078, "((i<2))" - line 422, "pan.___", state 2078, "((i>=2))" - line 249, "pan.___", state 2084, "(1)" - line 253, "pan.___", state 2092, "(1)" - line 253, "pan.___", state 2093, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 2093, "else" - line 251, "pan.___", state 2098, "((i<1))" - line 251, "pan.___", state 2098, "((i>=1))" - line 257, "pan.___", state 2104, "(1)" - line 257, "pan.___", state 2105, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 2105, "else" - line 261, "pan.___", state 2112, "(1)" - line 261, "pan.___", state 2113, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 2113, "else" - line 259, "pan.___", state 2118, "((i<2))" - line 259, "pan.___", state 2118, "((i>=2))" - line 266, "pan.___", state 2122, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 2122, "else" - line 431, "pan.___", state 2124, "(1)" - line 431, "pan.___", state 2124, "(1)" - line 644, "pan.___", state 2127, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 644, "pan.___", state 2128, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 644, "pan.___", state 2129, "(1)" - line 272, "pan.___", state 2133, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2155, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2164, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2180, "(1)" - line 253, "pan.___", state 2188, "(1)" - line 257, "pan.___", state 2200, "(1)" - line 261, "pan.___", state 2208, "(1)" - line 411, "pan.___", state 2226, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2240, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2258, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2272, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2290, "(1)" - line 253, "pan.___", state 2298, "(1)" - line 257, "pan.___", state 2310, "(1)" - line 261, "pan.___", state 2318, "(1)" - line 272, "pan.___", state 2340, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 2349, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2362, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2371, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2387, "(1)" - line 253, "pan.___", state 2395, "(1)" - line 257, "pan.___", state 2407, "(1)" - line 261, "pan.___", state 2415, "(1)" - line 411, "pan.___", state 2433, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2447, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2465, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2479, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2497, "(1)" - line 253, "pan.___", state 2505, "(1)" - line 257, "pan.___", state 2517, "(1)" - line 261, "pan.___", state 2525, "(1)" - line 411, "pan.___", state 2544, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2558, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2576, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2590, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2608, "(1)" - line 253, "pan.___", state 2616, "(1)" - line 257, "pan.___", state 2628, "(1)" - line 261, "pan.___", state 2636, "(1)" - line 249, "pan.___", state 2667, "(1)" - line 257, "pan.___", state 2687, "(1)" - line 261, "pan.___", state 2695, "(1)" - line 249, "pan.___", state 2710, "(1)" - line 253, "pan.___", state 2718, "(1)" - line 257, "pan.___", state 2730, "(1)" - line 261, "pan.___", state 2738, "(1)" - line 898, "pan.___", state 2755, "-end-" - (259 of 2755 states) -unreached in proctype urcu_writer - line 411, "pan.___", state 18, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 32, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 50, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 249, "pan.___", state 82, "(1)" - line 253, "pan.___", state 90, "(1)" - line 257, "pan.___", state 102, "(1)" - line 272, "pan.___", state 131, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 140, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 153, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 207, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 225, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 239, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 257, "(1)" - line 253, "pan.___", state 265, "(1)" - line 257, "pan.___", state 277, "(1)" - line 261, "pan.___", state 285, "(1)" - line 415, "pan.___", state 320, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 338, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 352, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 378, "(1)" - line 257, "pan.___", state 390, "(1)" - line 261, "pan.___", state 398, "(1)" - line 415, "pan.___", state 441, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 459, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 473, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 499, "(1)" - line 257, "pan.___", state 511, "(1)" - line 261, "pan.___", state 519, "(1)" - line 415, "pan.___", state 552, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 570, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 584, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 610, "(1)" - line 257, "pan.___", state 622, "(1)" - line 261, "pan.___", state 630, "(1)" - line 415, "pan.___", state 665, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 683, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 697, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 723, "(1)" - line 257, "pan.___", state 735, "(1)" - line 261, "pan.___", state 743, "(1)" - line 272, "pan.___", state 791, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 800, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 813, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 249, "pan.___", state 838, "(1)" - line 253, "pan.___", state 846, "(1)" - line 257, "pan.___", state 858, "(1)" - line 261, "pan.___", state 866, "(1)" - line 272, "pan.___", state 886, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 895, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 910, "(1)" - line 284, "pan.___", state 917, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 933, "(1)" - line 253, "pan.___", state 941, "(1)" - line 257, "pan.___", state 953, "(1)" - line 261, "pan.___", state 961, "(1)" - line 276, "pan.___", state 986, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 999, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1008, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1024, "(1)" - line 253, "pan.___", state 1032, "(1)" - line 257, "pan.___", state 1044, "(1)" - line 261, "pan.___", state 1052, "(1)" - line 276, "pan.___", state 1077, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1090, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1099, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1115, "(1)" - line 253, "pan.___", state 1123, "(1)" - line 257, "pan.___", state 1135, "(1)" - line 261, "pan.___", state 1143, "(1)" - line 276, "pan.___", state 1168, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1181, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1190, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1206, "(1)" - line 253, "pan.___", state 1214, "(1)" - line 257, "pan.___", state 1226, "(1)" - line 261, "pan.___", state 1234, "(1)" - line 1237, "pan.___", state 1249, "-end-" - (78 of 1249 states) -unreached in proctype :init: - (0 of 78 states) -unreached in proctype :never: - line 1302, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 1.39e+03 seconds -pan: rate 10656.973 states/second -pan: avg transition delay 2.9798e-06 usec -cp .input.spin urcu_progress_reader.spin.input -cp .input.spin.trail urcu_progress_reader.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_reader.spin.input b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_reader.spin.input deleted file mode 100644 index 7cbeb11..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_reader.spin.input +++ /dev/null @@ -1,1273 +0,0 @@ -#define READER_PROGRESS - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer.define b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer.log b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer.log deleted file mode 100644 index 065cb84..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer.log +++ /dev/null @@ -1,455 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1295) -depth 23: Claim reached state 9 (line 1300) -depth 1404: Claim reached state 9 (line 1299) -Depth= 4122 States= 1e+06 Transitions= 2.18e+07 Memory= 494.377 t= 63.1 R= 2e+04 -Depth= 4237 States= 2e+06 Transitions= 4.19e+07 Memory= 522.209 t= 122 R= 2e+04 -Depth= 4557 States= 3e+06 Transitions= 6.67e+07 Memory= 550.139 t= 195 R= 2e+04 -pan: resizing hashtable to -w22.. done -Depth= 4762 States= 4e+06 Transitions= 9.06e+07 Memory= 609.190 t= 264 R= 2e+04 -Depth= 4793 States= 5e+06 Transitions= 1.25e+08 Memory= 666.709 t= 366 R= 1e+04 -Depth= 4793 States= 6e+06 Transitions= 1.62e+08 Memory= 713.877 t= 473 R= 1e+04 -Depth= 4980 States= 7e+06 Transitions= 1.97e+08 Memory= 760.752 t= 578 R= 1e+04 -Depth= 4980 States= 8e+06 Transitions= 2.29e+08 Memory= 809.190 t= 674 R= 1e+04 -Depth= 4980 States= 9e+06 Transitions= 2.66e+08 Memory= 862.803 t= 784 R= 1e+04 -pan: resizing hashtable to -w24.. done -Depth= 4980 States= 1e+07 Transitions= 2.98e+08 Memory= 1029.377 t= 880 R= 1e+04 -Depth= 4980 States= 1.1e+07 Transitions= 3.34e+08 Memory= 1080.061 t= 987 R= 1e+04 -Depth= 4980 States= 1.2e+07 Transitions= 3.69e+08 Memory= 1129.279 t= 1.09e+03 R= 1e+04 -Depth= 4980 States= 1.3e+07 Transitions= 4.01e+08 Memory= 1177.912 t= 1.18e+03 R= 1e+04 -Depth= 4980 States= 1.4e+07 Transitions= 4.4e+08 Memory= 1226.447 t= 1.3e+03 R= 1e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 4980, errors: 0 - 7808338 states, stored (1.48869e+07 visited) -4.5734827e+08 states, matched -4.7223515e+08 transitions (= visited+matched) -7.5648218e+09 atomic steps -hash conflicts: 1.2909926e+08 (resolved) - -Stats on memory usage (in Megabytes): - 863.807 equivalent memory usage for states (stored*(State-vector + overhead)) - 691.866 actual memory usage for states (compression: 80.09%) - state-vector as stored = 65 byte + 28 byte overhead - 128.000 memory used for hash table (-w24) - 457.764 memory used for DFS stack (-m10000000) - 1277.131 total actual memory usage - -unreached in proctype urcu_reader - line 411, "pan.___", state 17, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 49, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 63, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 81, "(1)" - line 257, "pan.___", state 101, "(1)" - line 261, "pan.___", state 109, "(1)" - line 597, "pan.___", state 128, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 411, "pan.___", state 135, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 167, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 181, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 199, "(1)" - line 257, "pan.___", state 219, "(1)" - line 261, "pan.___", state 227, "(1)" - line 411, "pan.___", state 246, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 278, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 292, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 310, "(1)" - line 257, "pan.___", state 330, "(1)" - line 261, "pan.___", state 338, "(1)" - line 411, "pan.___", state 359, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 361, "(1)" - line 411, "pan.___", state 362, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 362, "else" - line 411, "pan.___", state 365, "(1)" - line 415, "pan.___", state 373, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 375, "(1)" - line 415, "pan.___", state 376, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 376, "else" - line 415, "pan.___", state 379, "(1)" - line 415, "pan.___", state 380, "(1)" - line 415, "pan.___", state 380, "(1)" - line 413, "pan.___", state 385, "((i<1))" - line 413, "pan.___", state 385, "((i>=1))" - line 420, "pan.___", state 391, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 393, "(1)" - line 420, "pan.___", state 394, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 394, "else" - line 420, "pan.___", state 397, "(1)" - line 420, "pan.___", state 398, "(1)" - line 420, "pan.___", state 398, "(1)" - line 424, "pan.___", state 405, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 407, "(1)" - line 424, "pan.___", state 408, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 408, "else" - line 424, "pan.___", state 411, "(1)" - line 424, "pan.___", state 412, "(1)" - line 424, "pan.___", state 412, "(1)" - line 422, "pan.___", state 417, "((i<2))" - line 422, "pan.___", state 417, "((i>=2))" - line 249, "pan.___", state 423, "(1)" - line 253, "pan.___", state 431, "(1)" - line 253, "pan.___", state 432, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 432, "else" - line 251, "pan.___", state 437, "((i<1))" - line 251, "pan.___", state 437, "((i>=1))" - line 257, "pan.___", state 443, "(1)" - line 257, "pan.___", state 444, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 444, "else" - line 261, "pan.___", state 451, "(1)" - line 261, "pan.___", state 452, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 452, "else" - line 259, "pan.___", state 457, "((i<2))" - line 259, "pan.___", state 457, "((i>=2))" - line 266, "pan.___", state 461, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 461, "else" - line 431, "pan.___", state 463, "(1)" - line 431, "pan.___", state 463, "(1)" - line 597, "pan.___", state 466, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 597, "pan.___", state 467, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 597, "pan.___", state 468, "(1)" - line 272, "pan.___", state 472, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 483, "(1)" - line 280, "pan.___", state 494, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 503, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 519, "(1)" - line 253, "pan.___", state 527, "(1)" - line 257, "pan.___", state 539, "(1)" - line 261, "pan.___", state 547, "(1)" - line 411, "pan.___", state 565, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 579, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 597, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 611, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 629, "(1)" - line 253, "pan.___", state 637, "(1)" - line 257, "pan.___", state 649, "(1)" - line 261, "pan.___", state 657, "(1)" - line 411, "pan.___", state 683, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 715, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 729, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 747, "(1)" - line 257, "pan.___", state 767, "(1)" - line 261, "pan.___", state 775, "(1)" - line 411, "pan.___", state 794, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 796, "(1)" - line 411, "pan.___", state 797, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 797, "else" - line 411, "pan.___", state 800, "(1)" - line 415, "pan.___", state 808, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 810, "(1)" - line 415, "pan.___", state 811, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 811, "else" - line 415, "pan.___", state 814, "(1)" - line 415, "pan.___", state 815, "(1)" - line 415, "pan.___", state 815, "(1)" - line 413, "pan.___", state 820, "((i<1))" - line 413, "pan.___", state 820, "((i>=1))" - line 420, "pan.___", state 826, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 828, "(1)" - line 420, "pan.___", state 829, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 829, "else" - line 420, "pan.___", state 832, "(1)" - line 420, "pan.___", state 833, "(1)" - line 420, "pan.___", state 833, "(1)" - line 424, "pan.___", state 840, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 842, "(1)" - line 424, "pan.___", state 843, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 843, "else" - line 424, "pan.___", state 846, "(1)" - line 424, "pan.___", state 847, "(1)" - line 424, "pan.___", state 847, "(1)" - line 422, "pan.___", state 852, "((i<2))" - line 422, "pan.___", state 852, "((i>=2))" - line 249, "pan.___", state 858, "(1)" - line 253, "pan.___", state 866, "(1)" - line 253, "pan.___", state 867, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 867, "else" - line 251, "pan.___", state 872, "((i<1))" - line 251, "pan.___", state 872, "((i>=1))" - line 257, "pan.___", state 878, "(1)" - line 257, "pan.___", state 879, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 879, "else" - line 261, "pan.___", state 886, "(1)" - line 261, "pan.___", state 887, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 887, "else" - line 259, "pan.___", state 892, "((i<2))" - line 259, "pan.___", state 892, "((i>=2))" - line 266, "pan.___", state 896, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 896, "else" - line 431, "pan.___", state 898, "(1)" - line 431, "pan.___", state 898, "(1)" - line 605, "pan.___", state 902, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 411, "pan.___", state 907, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 921, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 939, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 953, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 971, "(1)" - line 253, "pan.___", state 979, "(1)" - line 257, "pan.___", state 991, "(1)" - line 261, "pan.___", state 999, "(1)" - line 411, "pan.___", state 1021, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1053, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1067, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1085, "(1)" - line 257, "pan.___", state 1105, "(1)" - line 261, "pan.___", state 1113, "(1)" - line 411, "pan.___", state 1136, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1168, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1182, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1200, "(1)" - line 257, "pan.___", state 1220, "(1)" - line 261, "pan.___", state 1228, "(1)" - line 411, "pan.___", state 1247, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1279, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1293, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1311, "(1)" - line 257, "pan.___", state 1331, "(1)" - line 261, "pan.___", state 1339, "(1)" - line 272, "pan.___", state 1360, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1382, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1391, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1407, "(1)" - line 253, "pan.___", state 1415, "(1)" - line 257, "pan.___", state 1427, "(1)" - line 261, "pan.___", state 1435, "(1)" - line 411, "pan.___", state 1453, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1467, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1485, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1499, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1517, "(1)" - line 253, "pan.___", state 1525, "(1)" - line 257, "pan.___", state 1537, "(1)" - line 261, "pan.___", state 1545, "(1)" - line 411, "pan.___", state 1564, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 1578, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1596, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1610, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1628, "(1)" - line 253, "pan.___", state 1636, "(1)" - line 257, "pan.___", state 1648, "(1)" - line 261, "pan.___", state 1656, "(1)" - line 411, "pan.___", state 1678, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1710, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1724, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1742, "(1)" - line 257, "pan.___", state 1762, "(1)" - line 261, "pan.___", state 1770, "(1)" - line 644, "pan.___", state 1789, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 411, "pan.___", state 1796, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1828, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1842, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1860, "(1)" - line 257, "pan.___", state 1880, "(1)" - line 261, "pan.___", state 1888, "(1)" - line 411, "pan.___", state 1907, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 1939, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 1953, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1971, "(1)" - line 257, "pan.___", state 1991, "(1)" - line 261, "pan.___", state 1999, "(1)" - line 411, "pan.___", state 2020, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 2022, "(1)" - line 411, "pan.___", state 2023, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 411, "pan.___", state 2023, "else" - line 411, "pan.___", state 2026, "(1)" - line 415, "pan.___", state 2034, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2036, "(1)" - line 415, "pan.___", state 2037, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 415, "pan.___", state 2037, "else" - line 415, "pan.___", state 2040, "(1)" - line 415, "pan.___", state 2041, "(1)" - line 415, "pan.___", state 2041, "(1)" - line 413, "pan.___", state 2046, "((i<1))" - line 413, "pan.___", state 2046, "((i>=1))" - line 420, "pan.___", state 2052, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2054, "(1)" - line 420, "pan.___", state 2055, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 420, "pan.___", state 2055, "else" - line 420, "pan.___", state 2058, "(1)" - line 420, "pan.___", state 2059, "(1)" - line 420, "pan.___", state 2059, "(1)" - line 424, "pan.___", state 2066, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2068, "(1)" - line 424, "pan.___", state 2069, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 424, "pan.___", state 2069, "else" - line 424, "pan.___", state 2072, "(1)" - line 424, "pan.___", state 2073, "(1)" - line 424, "pan.___", state 2073, "(1)" - line 422, "pan.___", state 2078, "((i<2))" - line 422, "pan.___", state 2078, "((i>=2))" - line 249, "pan.___", state 2084, "(1)" - line 253, "pan.___", state 2092, "(1)" - line 253, "pan.___", state 2093, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 253, "pan.___", state 2093, "else" - line 251, "pan.___", state 2098, "((i<1))" - line 251, "pan.___", state 2098, "((i>=1))" - line 257, "pan.___", state 2104, "(1)" - line 257, "pan.___", state 2105, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 257, "pan.___", state 2105, "else" - line 261, "pan.___", state 2112, "(1)" - line 261, "pan.___", state 2113, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 261, "pan.___", state 2113, "else" - line 259, "pan.___", state 2118, "((i<2))" - line 259, "pan.___", state 2118, "((i>=2))" - line 266, "pan.___", state 2122, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 266, "pan.___", state 2122, "else" - line 431, "pan.___", state 2124, "(1)" - line 431, "pan.___", state 2124, "(1)" - line 644, "pan.___", state 2127, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 644, "pan.___", state 2128, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 644, "pan.___", state 2129, "(1)" - line 272, "pan.___", state 2133, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2155, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2164, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2180, "(1)" - line 253, "pan.___", state 2188, "(1)" - line 257, "pan.___", state 2200, "(1)" - line 261, "pan.___", state 2208, "(1)" - line 411, "pan.___", state 2226, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2240, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2258, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2272, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2290, "(1)" - line 253, "pan.___", state 2298, "(1)" - line 257, "pan.___", state 2310, "(1)" - line 261, "pan.___", state 2318, "(1)" - line 272, "pan.___", state 2340, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 2349, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 2362, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 2371, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2387, "(1)" - line 253, "pan.___", state 2395, "(1)" - line 257, "pan.___", state 2407, "(1)" - line 261, "pan.___", state 2415, "(1)" - line 411, "pan.___", state 2433, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2447, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2465, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2479, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2497, "(1)" - line 253, "pan.___", state 2505, "(1)" - line 257, "pan.___", state 2517, "(1)" - line 261, "pan.___", state 2525, "(1)" - line 411, "pan.___", state 2544, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 2558, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 2576, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 2590, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 2608, "(1)" - line 253, "pan.___", state 2616, "(1)" - line 257, "pan.___", state 2628, "(1)" - line 261, "pan.___", state 2636, "(1)" - line 249, "pan.___", state 2667, "(1)" - line 257, "pan.___", state 2687, "(1)" - line 261, "pan.___", state 2695, "(1)" - line 249, "pan.___", state 2710, "(1)" - line 253, "pan.___", state 2718, "(1)" - line 257, "pan.___", state 2730, "(1)" - line 261, "pan.___", state 2738, "(1)" - line 898, "pan.___", state 2755, "-end-" - (259 of 2755 states) -unreached in proctype urcu_writer - line 411, "pan.___", state 18, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 32, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 50, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 249, "pan.___", state 82, "(1)" - line 253, "pan.___", state 90, "(1)" - line 257, "pan.___", state 102, "(1)" - line 272, "pan.___", state 131, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 140, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 153, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 411, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 415, "pan.___", state 207, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 225, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 239, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 257, "(1)" - line 253, "pan.___", state 265, "(1)" - line 257, "pan.___", state 277, "(1)" - line 261, "pan.___", state 285, "(1)" - line 415, "pan.___", state 320, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 338, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 352, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 378, "(1)" - line 257, "pan.___", state 390, "(1)" - line 261, "pan.___", state 398, "(1)" - line 415, "pan.___", state 441, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 459, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 473, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 499, "(1)" - line 257, "pan.___", state 511, "(1)" - line 261, "pan.___", state 519, "(1)" - line 415, "pan.___", state 552, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 570, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 584, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 610, "(1)" - line 257, "pan.___", state 622, "(1)" - line 261, "pan.___", state 630, "(1)" - line 415, "pan.___", state 665, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 420, "pan.___", state 683, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 424, "pan.___", state 697, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 253, "pan.___", state 723, "(1)" - line 257, "pan.___", state 735, "(1)" - line 261, "pan.___", state 743, "(1)" - line 272, "pan.___", state 796, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 276, "pan.___", state 805, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 820, "(1)" - line 284, "pan.___", state 827, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 843, "(1)" - line 253, "pan.___", state 851, "(1)" - line 257, "pan.___", state 863, "(1)" - line 261, "pan.___", state 871, "(1)" - line 276, "pan.___", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 909, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 918, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 934, "(1)" - line 253, "pan.___", state 942, "(1)" - line 257, "pan.___", state 954, "(1)" - line 261, "pan.___", state 962, "(1)" - line 276, "pan.___", state 987, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1000, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1009, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1025, "(1)" - line 253, "pan.___", state 1033, "(1)" - line 257, "pan.___", state 1045, "(1)" - line 261, "pan.___", state 1053, "(1)" - line 276, "pan.___", state 1078, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 280, "pan.___", state 1091, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 284, "pan.___", state 1100, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 249, "pan.___", state 1116, "(1)" - line 253, "pan.___", state 1124, "(1)" - line 257, "pan.___", state 1136, "(1)" - line 261, "pan.___", state 1144, "(1)" - line 1237, "pan.___", state 1159, "-end-" - (71 of 1159 states) -unreached in proctype :init: - (0 of 78 states) -unreached in proctype :never: - line 1302, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 1.4e+03 seconds -pan: rate 10667.087 states/second -pan: avg transition delay 2.9553e-06 usec -cp .input.spin urcu_progress_writer.spin.input -cp .input.spin.trail urcu_progress_writer.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer.spin.input b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer.spin.input deleted file mode 100644 index 323cc66..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer.spin.input +++ /dev/null @@ -1,1273 +0,0 @@ -#define WRITER_PROGRESS - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer_error.define b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer_error.log b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer_error.log deleted file mode 100644 index 43b08ac..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer_error.log +++ /dev/null @@ -1,647 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer_error.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 1296) -depth 23: Claim reached state 9 (line 1301) -depth 1404: Claim reached state 9 (line 1300) -pan: acceptance cycle (at depth 1950) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 4997, errors: 1 - 64372 states, stored (197067 visited) - 2733089 states, matched - 2930156 transitions (= visited+matched) - 44244571 atomic steps -hash conflicts: 43483 (resolved) - -Stats on memory usage (in Megabytes): - 7.121 equivalent memory usage for states (stored*(State-vector + overhead)) - 6.154 actual memory usage for states (compression: 86.41%) - state-vector as stored = 72 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 471.818 total actual memory usage - -unreached in proctype urcu_reader - line 412, "pan.___", state 17, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 49, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 63, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 81, "(1)" - line 258, "pan.___", state 101, "(1)" - line 262, "pan.___", state 109, "(1)" - line 598, "pan.___", state 128, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<1))" - line 412, "pan.___", state 135, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 167, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 181, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 199, "(1)" - line 258, "pan.___", state 219, "(1)" - line 262, "pan.___", state 227, "(1)" - line 412, "pan.___", state 246, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 278, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 292, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 310, "(1)" - line 258, "pan.___", state 330, "(1)" - line 262, "pan.___", state 338, "(1)" - line 412, "pan.___", state 359, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 361, "(1)" - line 412, "pan.___", state 362, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 412, "pan.___", state 362, "else" - line 412, "pan.___", state 365, "(1)" - line 416, "pan.___", state 373, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 375, "(1)" - line 416, "pan.___", state 376, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 416, "pan.___", state 376, "else" - line 416, "pan.___", state 379, "(1)" - line 416, "pan.___", state 380, "(1)" - line 416, "pan.___", state 380, "(1)" - line 414, "pan.___", state 385, "((i<1))" - line 414, "pan.___", state 385, "((i>=1))" - line 421, "pan.___", state 391, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 393, "(1)" - line 421, "pan.___", state 394, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 421, "pan.___", state 394, "else" - line 421, "pan.___", state 397, "(1)" - line 421, "pan.___", state 398, "(1)" - line 421, "pan.___", state 398, "(1)" - line 425, "pan.___", state 405, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 407, "(1)" - line 425, "pan.___", state 408, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 425, "pan.___", state 408, "else" - line 425, "pan.___", state 411, "(1)" - line 425, "pan.___", state 412, "(1)" - line 425, "pan.___", state 412, "(1)" - line 423, "pan.___", state 417, "((i<2))" - line 423, "pan.___", state 417, "((i>=2))" - line 250, "pan.___", state 423, "(1)" - line 254, "pan.___", state 431, "(1)" - line 254, "pan.___", state 432, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 254, "pan.___", state 432, "else" - line 252, "pan.___", state 437, "((i<1))" - line 252, "pan.___", state 437, "((i>=1))" - line 258, "pan.___", state 443, "(1)" - line 258, "pan.___", state 444, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 258, "pan.___", state 444, "else" - line 262, "pan.___", state 451, "(1)" - line 262, "pan.___", state 452, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 262, "pan.___", state 452, "else" - line 260, "pan.___", state 457, "((i<2))" - line 260, "pan.___", state 457, "((i>=2))" - line 267, "pan.___", state 461, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 267, "pan.___", state 461, "else" - line 432, "pan.___", state 463, "(1)" - line 432, "pan.___", state 463, "(1)" - line 598, "pan.___", state 466, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 598, "pan.___", state 467, "_proc_urcu_reader = (_proc_urcu_reader|(1<<5))" - line 598, "pan.___", state 468, "(1)" - line 273, "pan.___", state 472, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 277, "pan.___", state 483, "(1)" - line 281, "pan.___", state 494, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 285, "pan.___", state 503, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 519, "(1)" - line 254, "pan.___", state 527, "(1)" - line 258, "pan.___", state 539, "(1)" - line 262, "pan.___", state 547, "(1)" - line 412, "pan.___", state 565, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 579, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 597, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 611, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 629, "(1)" - line 254, "pan.___", state 637, "(1)" - line 258, "pan.___", state 649, "(1)" - line 262, "pan.___", state 657, "(1)" - line 412, "pan.___", state 683, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 715, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 729, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 747, "(1)" - line 258, "pan.___", state 767, "(1)" - line 262, "pan.___", state 775, "(1)" - line 412, "pan.___", state 794, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 796, "(1)" - line 412, "pan.___", state 797, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 412, "pan.___", state 797, "else" - line 412, "pan.___", state 800, "(1)" - line 416, "pan.___", state 808, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 810, "(1)" - line 416, "pan.___", state 811, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 416, "pan.___", state 811, "else" - line 416, "pan.___", state 814, "(1)" - line 416, "pan.___", state 815, "(1)" - line 416, "pan.___", state 815, "(1)" - line 414, "pan.___", state 820, "((i<1))" - line 414, "pan.___", state 820, "((i>=1))" - line 421, "pan.___", state 826, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 828, "(1)" - line 421, "pan.___", state 829, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 421, "pan.___", state 829, "else" - line 421, "pan.___", state 832, "(1)" - line 421, "pan.___", state 833, "(1)" - line 421, "pan.___", state 833, "(1)" - line 425, "pan.___", state 840, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 842, "(1)" - line 425, "pan.___", state 843, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 425, "pan.___", state 843, "else" - line 425, "pan.___", state 846, "(1)" - line 425, "pan.___", state 847, "(1)" - line 425, "pan.___", state 847, "(1)" - line 423, "pan.___", state 852, "((i<2))" - line 423, "pan.___", state 852, "((i>=2))" - line 250, "pan.___", state 858, "(1)" - line 254, "pan.___", state 866, "(1)" - line 254, "pan.___", state 867, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 254, "pan.___", state 867, "else" - line 252, "pan.___", state 872, "((i<1))" - line 252, "pan.___", state 872, "((i>=1))" - line 258, "pan.___", state 878, "(1)" - line 258, "pan.___", state 879, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 258, "pan.___", state 879, "else" - line 262, "pan.___", state 886, "(1)" - line 262, "pan.___", state 887, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 262, "pan.___", state 887, "else" - line 260, "pan.___", state 892, "((i<2))" - line 260, "pan.___", state 892, "((i>=2))" - line 267, "pan.___", state 896, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 267, "pan.___", state 896, "else" - line 432, "pan.___", state 898, "(1)" - line 432, "pan.___", state 898, "(1)" - line 606, "pan.___", state 902, "_proc_urcu_reader = (_proc_urcu_reader|(1<<11))" - line 412, "pan.___", state 907, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 921, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 939, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 953, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 971, "(1)" - line 254, "pan.___", state 979, "(1)" - line 258, "pan.___", state 991, "(1)" - line 262, "pan.___", state 999, "(1)" - line 412, "pan.___", state 1021, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 1053, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 1067, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 1085, "(1)" - line 258, "pan.___", state 1105, "(1)" - line 262, "pan.___", state 1113, "(1)" - line 412, "pan.___", state 1136, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 1168, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 1182, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 1200, "(1)" - line 258, "pan.___", state 1220, "(1)" - line 262, "pan.___", state 1228, "(1)" - line 412, "pan.___", state 1247, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 1279, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 1293, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 1311, "(1)" - line 258, "pan.___", state 1331, "(1)" - line 262, "pan.___", state 1339, "(1)" - line 273, "pan.___", state 1360, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 281, "pan.___", state 1382, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 285, "pan.___", state 1391, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 1407, "(1)" - line 254, "pan.___", state 1415, "(1)" - line 258, "pan.___", state 1427, "(1)" - line 262, "pan.___", state 1435, "(1)" - line 412, "pan.___", state 1453, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 1467, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 1485, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 1499, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 1517, "(1)" - line 254, "pan.___", state 1525, "(1)" - line 258, "pan.___", state 1537, "(1)" - line 262, "pan.___", state 1545, "(1)" - line 412, "pan.___", state 1564, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 1578, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 1596, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 1610, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 1628, "(1)" - line 254, "pan.___", state 1636, "(1)" - line 258, "pan.___", state 1648, "(1)" - line 262, "pan.___", state 1656, "(1)" - line 412, "pan.___", state 1678, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 1710, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 1724, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 1742, "(1)" - line 258, "pan.___", state 1762, "(1)" - line 262, "pan.___", state 1770, "(1)" - line 645, "pan.___", state 1789, "_proc_urcu_reader = (_proc_urcu_reader|((1<<2)<<19))" - line 412, "pan.___", state 1796, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 1828, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 1842, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 1860, "(1)" - line 258, "pan.___", state 1880, "(1)" - line 262, "pan.___", state 1888, "(1)" - line 412, "pan.___", state 1907, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 1939, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 1953, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 1971, "(1)" - line 258, "pan.___", state 1991, "(1)" - line 262, "pan.___", state 1999, "(1)" - line 412, "pan.___", state 2020, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 2022, "(1)" - line 412, "pan.___", state 2023, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 412, "pan.___", state 2023, "else" - line 412, "pan.___", state 2026, "(1)" - line 416, "pan.___", state 2034, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 2036, "(1)" - line 416, "pan.___", state 2037, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 416, "pan.___", state 2037, "else" - line 416, "pan.___", state 2040, "(1)" - line 416, "pan.___", state 2041, "(1)" - line 416, "pan.___", state 2041, "(1)" - line 414, "pan.___", state 2046, "((i<1))" - line 414, "pan.___", state 2046, "((i>=1))" - line 421, "pan.___", state 2052, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 2054, "(1)" - line 421, "pan.___", state 2055, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 421, "pan.___", state 2055, "else" - line 421, "pan.___", state 2058, "(1)" - line 421, "pan.___", state 2059, "(1)" - line 421, "pan.___", state 2059, "(1)" - line 425, "pan.___", state 2066, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 2068, "(1)" - line 425, "pan.___", state 2069, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 425, "pan.___", state 2069, "else" - line 425, "pan.___", state 2072, "(1)" - line 425, "pan.___", state 2073, "(1)" - line 425, "pan.___", state 2073, "(1)" - line 423, "pan.___", state 2078, "((i<2))" - line 423, "pan.___", state 2078, "((i>=2))" - line 250, "pan.___", state 2084, "(1)" - line 254, "pan.___", state 2092, "(1)" - line 254, "pan.___", state 2093, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 254, "pan.___", state 2093, "else" - line 252, "pan.___", state 2098, "((i<1))" - line 252, "pan.___", state 2098, "((i>=1))" - line 258, "pan.___", state 2104, "(1)" - line 258, "pan.___", state 2105, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 258, "pan.___", state 2105, "else" - line 262, "pan.___", state 2112, "(1)" - line 262, "pan.___", state 2113, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 262, "pan.___", state 2113, "else" - line 260, "pan.___", state 2118, "((i<2))" - line 260, "pan.___", state 2118, "((i>=2))" - line 267, "pan.___", state 2122, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 267, "pan.___", state 2122, "else" - line 432, "pan.___", state 2124, "(1)" - line 432, "pan.___", state 2124, "(1)" - line 645, "pan.___", state 2127, "cached_urcu_active_readers.val[_pid] = (tmp+1)" - line 645, "pan.___", state 2128, "_proc_urcu_reader = (_proc_urcu_reader|(1<<23))" - line 645, "pan.___", state 2129, "(1)" - line 273, "pan.___", state 2133, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 281, "pan.___", state 2155, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 285, "pan.___", state 2164, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 2180, "(1)" - line 254, "pan.___", state 2188, "(1)" - line 258, "pan.___", state 2200, "(1)" - line 262, "pan.___", state 2208, "(1)" - line 412, "pan.___", state 2226, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 2240, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 2258, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 2272, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 2290, "(1)" - line 254, "pan.___", state 2298, "(1)" - line 258, "pan.___", state 2310, "(1)" - line 262, "pan.___", state 2318, "(1)" - line 273, "pan.___", state 2340, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 277, "pan.___", state 2349, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 281, "pan.___", state 2362, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 285, "pan.___", state 2371, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 2387, "(1)" - line 254, "pan.___", state 2395, "(1)" - line 258, "pan.___", state 2407, "(1)" - line 262, "pan.___", state 2415, "(1)" - line 412, "pan.___", state 2433, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 2447, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 2465, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 2479, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 2497, "(1)" - line 254, "pan.___", state 2505, "(1)" - line 258, "pan.___", state 2517, "(1)" - line 262, "pan.___", state 2525, "(1)" - line 412, "pan.___", state 2544, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 2558, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 2576, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 2590, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 2608, "(1)" - line 254, "pan.___", state 2616, "(1)" - line 258, "pan.___", state 2628, "(1)" - line 262, "pan.___", state 2636, "(1)" - line 250, "pan.___", state 2667, "(1)" - line 258, "pan.___", state 2687, "(1)" - line 262, "pan.___", state 2695, "(1)" - line 250, "pan.___", state 2710, "(1)" - line 254, "pan.___", state 2718, "(1)" - line 258, "pan.___", state 2730, "(1)" - line 262, "pan.___", state 2738, "(1)" - line 899, "pan.___", state 2755, "-end-" - (259 of 2755 states) -unreached in proctype urcu_writer - line 412, "pan.___", state 18, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 24, "(1)" - line 416, "pan.___", state 32, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 38, "(1)" - line 416, "pan.___", state 39, "(1)" - line 416, "pan.___", state 39, "(1)" - line 414, "pan.___", state 44, "((i<1))" - line 414, "pan.___", state 44, "((i>=1))" - line 421, "pan.___", state 50, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 56, "(1)" - line 421, "pan.___", state 57, "(1)" - line 421, "pan.___", state 57, "(1)" - line 425, "pan.___", state 64, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 70, "(1)" - line 425, "pan.___", state 71, "(1)" - line 425, "pan.___", state 71, "(1)" - line 423, "pan.___", state 76, "((i<2))" - line 423, "pan.___", state 76, "((i>=2))" - line 250, "pan.___", state 82, "(1)" - line 254, "pan.___", state 90, "(1)" - line 254, "pan.___", state 91, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 254, "pan.___", state 91, "else" - line 252, "pan.___", state 96, "((i<1))" - line 252, "pan.___", state 96, "((i>=1))" - line 258, "pan.___", state 102, "(1)" - line 258, "pan.___", state 103, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 258, "pan.___", state 103, "else" - line 262, "pan.___", state 110, "(1)" - line 262, "pan.___", state 111, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 262, "pan.___", state 111, "else" - line 260, "pan.___", state 116, "((i<2))" - line 260, "pan.___", state 116, "((i>=2))" - line 267, "pan.___", state 120, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 267, "pan.___", state 120, "else" - line 432, "pan.___", state 122, "(1)" - line 432, "pan.___", state 122, "(1)" - line 273, "pan.___", state 131, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 277, "pan.___", state 140, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 148, "((i<1))" - line 275, "pan.___", state 148, "((i>=1))" - line 281, "pan.___", state 153, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 1022, "pan.___", state 181, "old_data = cached_rcu_ptr.val[_pid]" - line 412, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 199, "(1)" - line 416, "pan.___", state 207, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 213, "(1)" - line 416, "pan.___", state 214, "(1)" - line 416, "pan.___", state 214, "(1)" - line 414, "pan.___", state 219, "((i<1))" - line 414, "pan.___", state 219, "((i>=1))" - line 421, "pan.___", state 225, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 231, "(1)" - line 421, "pan.___", state 232, "(1)" - line 421, "pan.___", state 232, "(1)" - line 425, "pan.___", state 239, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 245, "(1)" - line 425, "pan.___", state 246, "(1)" - line 425, "pan.___", state 246, "(1)" - line 423, "pan.___", state 251, "((i<2))" - line 423, "pan.___", state 251, "((i>=2))" - line 250, "pan.___", state 257, "(1)" - line 254, "pan.___", state 265, "(1)" - line 254, "pan.___", state 266, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 254, "pan.___", state 266, "else" - line 252, "pan.___", state 271, "((i<1))" - line 252, "pan.___", state 271, "((i>=1))" - line 258, "pan.___", state 277, "(1)" - line 258, "pan.___", state 278, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 258, "pan.___", state 278, "else" - line 262, "pan.___", state 285, "(1)" - line 262, "pan.___", state 286, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 262, "pan.___", state 286, "else" - line 260, "pan.___", state 291, "((i<2))" - line 260, "pan.___", state 291, "((i>=2))" - line 267, "pan.___", state 295, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 267, "pan.___", state 295, "else" - line 432, "pan.___", state 297, "(1)" - line 432, "pan.___", state 297, "(1)" - line 412, "pan.___", state 308, "(1)" - line 412, "pan.___", state 309, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 412, "pan.___", state 309, "else" - line 412, "pan.___", state 312, "(1)" - line 416, "pan.___", state 320, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 326, "(1)" - line 416, "pan.___", state 327, "(1)" - line 416, "pan.___", state 327, "(1)" - line 414, "pan.___", state 332, "((i<1))" - line 414, "pan.___", state 332, "((i>=1))" - line 421, "pan.___", state 338, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 344, "(1)" - line 421, "pan.___", state 345, "(1)" - line 421, "pan.___", state 345, "(1)" - line 425, "pan.___", state 352, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 358, "(1)" - line 425, "pan.___", state 359, "(1)" - line 425, "pan.___", state 359, "(1)" - line 423, "pan.___", state 364, "((i<2))" - line 423, "pan.___", state 364, "((i>=2))" - line 250, "pan.___", state 370, "(1)" - line 254, "pan.___", state 378, "(1)" - line 254, "pan.___", state 379, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 254, "pan.___", state 379, "else" - line 252, "pan.___", state 384, "((i<1))" - line 252, "pan.___", state 384, "((i>=1))" - line 258, "pan.___", state 390, "(1)" - line 258, "pan.___", state 391, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 258, "pan.___", state 391, "else" - line 262, "pan.___", state 398, "(1)" - line 262, "pan.___", state 399, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 262, "pan.___", state 399, "else" - line 260, "pan.___", state 404, "((i<2))" - line 260, "pan.___", state 404, "((i>=2))" - line 267, "pan.___", state 408, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 267, "pan.___", state 408, "else" - line 432, "pan.___", state 410, "(1)" - line 432, "pan.___", state 410, "(1)" - line 412, "pan.___", state 423, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 425, "(1)" - line 412, "pan.___", state 426, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 412, "pan.___", state 426, "else" - line 412, "pan.___", state 429, "(1)" - line 416, "pan.___", state 437, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 439, "(1)" - line 416, "pan.___", state 440, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 416, "pan.___", state 440, "else" - line 416, "pan.___", state 443, "(1)" - line 416, "pan.___", state 444, "(1)" - line 416, "pan.___", state 444, "(1)" - line 414, "pan.___", state 449, "((i<1))" - line 414, "pan.___", state 449, "((i>=1))" - line 421, "pan.___", state 455, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 457, "(1)" - line 421, "pan.___", state 458, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 421, "pan.___", state 458, "else" - line 421, "pan.___", state 461, "(1)" - line 421, "pan.___", state 462, "(1)" - line 421, "pan.___", state 462, "(1)" - line 425, "pan.___", state 469, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 471, "(1)" - line 425, "pan.___", state 472, "((cache_dirty_rcu_data[i].bitfield&(1<<_pid)))" - line 425, "pan.___", state 472, "else" - line 425, "pan.___", state 475, "(1)" - line 425, "pan.___", state 476, "(1)" - line 425, "pan.___", state 476, "(1)" - line 423, "pan.___", state 481, "((i<2))" - line 423, "pan.___", state 481, "((i>=2))" - line 250, "pan.___", state 487, "(1)" - line 254, "pan.___", state 495, "(1)" - line 254, "pan.___", state 496, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 254, "pan.___", state 496, "else" - line 252, "pan.___", state 501, "((i<1))" - line 252, "pan.___", state 501, "((i>=1))" - line 258, "pan.___", state 507, "(1)" - line 258, "pan.___", state 508, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 258, "pan.___", state 508, "else" - line 262, "pan.___", state 515, "(1)" - line 262, "pan.___", state 516, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 262, "pan.___", state 516, "else" - line 267, "pan.___", state 525, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 267, "pan.___", state 525, "else" - line 432, "pan.___", state 527, "(1)" - line 432, "pan.___", state 527, "(1)" - line 412, "pan.___", state 533, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 539, "(1)" - line 416, "pan.___", state 547, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 553, "(1)" - line 416, "pan.___", state 554, "(1)" - line 416, "pan.___", state 554, "(1)" - line 414, "pan.___", state 559, "((i<1))" - line 414, "pan.___", state 559, "((i>=1))" - line 421, "pan.___", state 565, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 571, "(1)" - line 421, "pan.___", state 572, "(1)" - line 421, "pan.___", state 572, "(1)" - line 425, "pan.___", state 579, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 585, "(1)" - line 425, "pan.___", state 586, "(1)" - line 425, "pan.___", state 586, "(1)" - line 423, "pan.___", state 591, "((i<2))" - line 423, "pan.___", state 591, "((i>=2))" - line 250, "pan.___", state 597, "(1)" - line 254, "pan.___", state 605, "(1)" - line 254, "pan.___", state 606, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 254, "pan.___", state 606, "else" - line 252, "pan.___", state 611, "((i<1))" - line 252, "pan.___", state 611, "((i>=1))" - line 258, "pan.___", state 617, "(1)" - line 258, "pan.___", state 618, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 258, "pan.___", state 618, "else" - line 262, "pan.___", state 625, "(1)" - line 262, "pan.___", state 626, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 262, "pan.___", state 626, "else" - line 267, "pan.___", state 635, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 267, "pan.___", state 635, "else" - line 432, "pan.___", state 637, "(1)" - line 432, "pan.___", state 637, "(1)" - line 412, "pan.___", state 644, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 650, "(1)" - line 416, "pan.___", state 658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 416, "pan.___", state 664, "(1)" - line 416, "pan.___", state 665, "(1)" - line 416, "pan.___", state 665, "(1)" - line 414, "pan.___", state 670, "((i<1))" - line 414, "pan.___", state 670, "((i>=1))" - line 421, "pan.___", state 676, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 682, "(1)" - line 421, "pan.___", state 683, "(1)" - line 421, "pan.___", state 683, "(1)" - line 425, "pan.___", state 690, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 425, "pan.___", state 696, "(1)" - line 425, "pan.___", state 697, "(1)" - line 425, "pan.___", state 697, "(1)" - line 423, "pan.___", state 702, "((i<2))" - line 423, "pan.___", state 702, "((i>=2))" - line 250, "pan.___", state 708, "(1)" - line 254, "pan.___", state 716, "(1)" - line 254, "pan.___", state 717, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 254, "pan.___", state 717, "else" - line 252, "pan.___", state 722, "((i<1))" - line 252, "pan.___", state 722, "((i>=1))" - line 258, "pan.___", state 728, "(1)" - line 258, "pan.___", state 729, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 258, "pan.___", state 729, "else" - line 262, "pan.___", state 736, "(1)" - line 262, "pan.___", state 737, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 262, "pan.___", state 737, "else" - line 260, "pan.___", state 742, "((i<2))" - line 260, "pan.___", state 742, "((i>=2))" - line 267, "pan.___", state 746, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 267, "pan.___", state 746, "else" - line 432, "pan.___", state 748, "(1)" - line 432, "pan.___", state 748, "(1)" - line 416, "pan.___", state 771, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 789, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 803, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 254, "pan.___", state 829, "(1)" - line 258, "pan.___", state 841, "(1)" - line 262, "pan.___", state 849, "(1)" - line 416, "pan.___", state 887, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 421, "pan.___", state 905, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 425, "pan.___", state 919, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 254, "pan.___", state 945, "(1)" - line 258, "pan.___", state 957, "(1)" - line 262, "pan.___", state 965, "(1)" - line 273, "pan.___", state 1009, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 277, "pan.___", state 1018, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 275, "pan.___", state 1026, "((i<1))" - line 275, "pan.___", state 1026, "((i>=1))" - line 281, "pan.___", state 1033, "(1)" - line 281, "pan.___", state 1034, "((cache_dirty_rcu_ptr.bitfield&(1<<_pid)))" - line 281, "pan.___", state 1034, "else" - line 285, "pan.___", state 1040, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 283, "pan.___", state 1048, "((i<2))" - line 283, "pan.___", state 1048, "((i>=2))" - line 250, "pan.___", state 1056, "(1)" - line 254, "pan.___", state 1064, "(1)" - line 254, "pan.___", state 1065, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 254, "pan.___", state 1065, "else" - line 252, "pan.___", state 1070, "((i<1))" - line 252, "pan.___", state 1070, "((i>=1))" - line 258, "pan.___", state 1076, "(1)" - line 258, "pan.___", state 1077, "(!((cache_dirty_rcu_ptr.bitfield&(1<<_pid))))" - line 258, "pan.___", state 1077, "else" - line 262, "pan.___", state 1084, "(1)" - line 262, "pan.___", state 1085, "(!((cache_dirty_rcu_data[i].bitfield&(1<<_pid))))" - line 262, "pan.___", state 1085, "else" - line 267, "pan.___", state 1094, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 267, "pan.___", state 1094, "else" - line 277, "pan.___", state 1109, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 281, "pan.___", state 1122, "cache_dirty_rcu_ptr.bitfield = (cache_dirty_rcu_ptr.bitfield&~((1<<_pid)))" - line 285, "pan.___", state 1131, "cache_dirty_rcu_data[i].bitfield = (cache_dirty_rcu_data[i].bitfield&~((1<<_pid)))" - line 250, "pan.___", state 1147, "(1)" - line 254, "pan.___", state 1155, "(1)" - line 258, "pan.___", state 1167, "(1)" - line 262, "pan.___", state 1175, "(1)" - line 1238, "pan.___", state 1190, "-end-" - (192 of 1190 states) -unreached in proctype :init: - (0 of 78 states) -unreached in proctype :never: - line 1303, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 8.1 seconds -pan: rate 24329.259 states/second -pan: avg transition delay 2.7644e-06 usec -cp .input.spin urcu_progress_writer_error.spin.input -cp .input.spin.trail urcu_progress_writer_error.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu-controldataflow-intel-no-ipi' diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer_error.spin.input b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer_error.spin.input deleted file mode 100644 index 67fec75..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer_error.spin.input +++ /dev/null @@ -1,1274 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -//#define ARCH_ALPHA -#define ARCH_INTEL -//#define ARCH_POWERPC -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bitfield cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(rcu_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE, j); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON, j); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer_error.spin.input.trail deleted file mode 100644 index e5fdf5a..0000000 --- a/formal-model/urcu-controldataflow-intel-no-ipi/urcu_progress_writer_error.spin.input.trail +++ /dev/null @@ -1,5000 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:4025 -2:3:3945 -3:3:3948 -4:3:3948 -5:3:3951 -6:3:3959 -7:3:3959 -8:3:3962 -9:3:3968 -10:3:3972 -11:3:3972 -12:3:3975 -13:3:3985 -14:3:3993 -15:3:3993 -16:3:3996 -17:3:4002 -18:3:4006 -19:3:4006 -20:3:4009 -21:3:4015 -22:3:4019 -23:3:4020 -24:0:4025 -25:3:4022 -26:0:4025 -27:2:2757 -28:0:4025 -29:2:2763 -30:0:4025 -31:2:2764 -32:0:4025 -33:2:2765 -34:0:4023 -35:2:2766 -36:0:4029 -37:2:2767 -38:0:4029 -39:2:2768 -40:2:2769 -41:2:2773 -42:2:2774 -43:2:2782 -44:2:2783 -45:2:2787 -46:2:2788 -47:2:2796 -48:2:2801 -49:2:2805 -50:2:2806 -51:2:2814 -52:2:2815 -53:2:2819 -54:2:2820 -55:2:2814 -56:2:2815 -57:2:2819 -58:2:2820 -59:2:2828 -60:2:2833 -61:2:2840 -62:2:2841 -63:2:2848 -64:2:2853 -65:2:2860 -66:2:2861 -67:2:2860 -68:2:2861 -69:2:2868 -70:2:2878 -71:0:4029 -72:2:2767 -73:0:4029 -74:2:2882 -75:2:2886 -76:2:2887 -77:2:2891 -78:2:2895 -79:2:2896 -80:2:2900 -81:2:2908 -82:2:2909 -83:2:2913 -84:2:2917 -85:2:2918 -86:2:2913 -87:2:2914 -88:2:2922 -89:0:4029 -90:2:2767 -91:0:4029 -92:2:2930 -93:2:2931 -94:2:2932 -95:0:4029 -96:2:2767 -97:0:4029 -98:2:2937 -99:0:4029 -100:2:3764 -101:2:3765 -102:2:3769 -103:2:3773 -104:2:3774 -105:2:3778 -106:2:3783 -107:2:3791 -108:2:3795 -109:2:3796 -110:2:3791 -111:2:3795 -112:2:3796 -113:2:3800 -114:2:3807 -115:2:3814 -116:2:3815 -117:2:3822 -118:2:3827 -119:2:3834 -120:2:3835 -121:2:3834 -122:2:3835 -123:2:3842 -124:2:3846 -125:0:4029 -126:2:2939 -127:2:3745 -128:0:4029 -129:2:2767 -130:0:4029 -131:2:2940 -132:0:4029 -133:2:2767 -134:0:4029 -135:2:2943 -136:2:2944 -137:2:2948 -138:2:2949 -139:2:2957 -140:2:2958 -141:2:2962 -142:2:2963 -143:2:2971 -144:2:2976 -145:2:2980 -146:2:2981 -147:2:2989 -148:2:2990 -149:2:2994 -150:2:2995 -151:2:2989 -152:2:2990 -153:2:2994 -154:2:2995 -155:2:3003 -156:2:3008 -157:2:3015 -158:2:3016 -159:2:3023 -160:2:3028 -161:2:3035 -162:2:3036 -163:2:3035 -164:2:3036 -165:2:3043 -166:2:3052 -167:0:4029 -168:2:2767 -169:0:4029 -170:2:3056 -171:2:3057 -172:2:3058 -173:2:3070 -174:2:3071 -175:2:3075 -176:2:3076 -177:2:3084 -178:2:3089 -179:2:3093 -180:2:3094 -181:2:3102 -182:2:3103 -183:2:3107 -184:2:3108 -185:2:3102 -186:2:3103 -187:2:3107 -188:2:3108 -189:2:3116 -190:2:3121 -191:2:3128 -192:2:3129 -193:2:3136 -194:2:3141 -195:2:3148 -196:2:3149 -197:2:3148 -198:2:3149 -199:2:3156 -200:2:3169 -201:2:3170 -202:0:4029 -203:2:2767 -204:0:4029 -205:2:3283 -206:2:3284 -207:2:3288 -208:2:3289 -209:2:3297 -210:2:3298 -211:2:3302 -212:2:3303 -213:2:3311 -214:2:3316 -215:2:3320 -216:2:3321 -217:2:3329 -218:2:3330 -219:2:3334 -220:2:3335 -221:2:3329 -222:2:3330 -223:2:3334 -224:2:3335 -225:2:3343 -226:2:3348 -227:2:3355 -228:2:3356 -229:2:3363 -230:2:3368 -231:2:3375 -232:2:3376 -233:2:3375 -234:2:3376 -235:2:3383 -236:0:4029 -237:2:2767 -238:0:4029 -239:2:3394 -240:2:3395 -241:2:3399 -242:2:3400 -243:2:3408 -244:2:3409 -245:2:3413 -246:2:3414 -247:2:3422 -248:2:3427 -249:2:3431 -250:2:3432 -251:2:3440 -252:2:3441 -253:2:3445 -254:2:3446 -255:2:3440 -256:2:3441 -257:2:3445 -258:2:3446 -259:2:3454 -260:2:3459 -261:2:3466 -262:2:3467 -263:2:3474 -264:2:3479 -265:2:3486 -266:2:3487 -267:2:3486 -268:2:3487 -269:2:3494 -270:2:3503 -271:0:4029 -272:2:2767 -273:0:4029 -274:1:2 -275:0:4029 -276:1:8 -277:0:4029 -278:1:9 -279:0:4029 -280:1:10 -281:0:4029 -282:1:11 -283:0:4029 -284:1:12 -285:1:13 -286:1:17 -287:1:18 -288:1:26 -289:1:27 -290:1:31 -291:1:32 -292:1:40 -293:1:45 -294:1:49 -295:1:50 -296:1:58 -297:1:59 -298:1:63 -299:1:64 -300:1:58 -301:1:59 -302:1:63 -303:1:64 -304:1:72 -305:1:77 -306:1:84 -307:1:85 -308:1:92 -309:1:97 -310:1:104 -311:1:105 -312:1:104 -313:1:105 -314:1:112 -315:0:4029 -316:1:11 -317:0:4029 -318:1:123 -319:1:124 -320:0:4029 -321:1:11 -322:0:4029 -323:1:130 -324:1:131 -325:1:135 -326:1:136 -327:1:144 -328:1:145 -329:1:149 -330:1:150 -331:1:158 -332:1:163 -333:1:167 -334:1:168 -335:1:176 -336:1:177 -337:1:181 -338:1:182 -339:1:176 -340:1:177 -341:1:181 -342:1:182 -343:1:190 -344:1:195 -345:1:202 -346:1:203 -347:1:210 -348:1:215 -349:1:222 -350:1:223 -351:1:222 -352:1:223 -353:1:230 -354:0:4029 -355:1:11 -356:0:4029 -357:1:241 -358:1:242 -359:1:246 -360:1:247 -361:1:255 -362:1:256 -363:1:260 -364:1:261 -365:1:269 -366:1:274 -367:1:278 -368:1:279 -369:1:287 -370:1:288 -371:1:292 -372:1:293 -373:1:287 -374:1:288 -375:1:292 -376:1:293 -377:1:301 -378:1:306 -379:1:313 -380:1:314 -381:1:321 -382:1:326 -383:1:333 -384:1:334 -385:1:333 -386:1:334 -387:1:341 -388:1:350 -389:0:4029 -390:1:11 -391:0:4029 -392:1:468 -393:1:472 -394:1:473 -395:1:477 -396:1:478 -397:1:486 -398:1:494 -399:1:495 -400:1:499 -401:1:503 -402:1:504 -403:1:499 -404:1:503 -405:1:504 -406:1:508 -407:1:515 -408:1:522 -409:1:523 -410:1:530 -411:1:535 -412:1:542 -413:1:543 -414:1:542 -415:1:543 -416:1:550 -417:0:4029 -418:1:11 -419:0:4029 -420:2:3507 -421:2:3516 -422:2:3517 -423:2:3521 -424:2:3522 -425:2:3526 -426:2:3527 -427:2:3535 -428:2:3540 -429:2:3544 -430:2:3545 -431:2:3553 -432:2:3554 -433:2:3558 -434:2:3559 -435:2:3553 -436:2:3554 -437:2:3558 -438:2:3559 -439:2:3567 -440:2:3574 -441:2:3575 -442:2:3579 -443:2:3580 -444:2:3587 -445:2:3592 -446:2:3599 -447:2:3600 -448:2:3599 -449:2:3600 -450:2:3607 -451:2:3617 -452:0:4029 -453:2:2767 -454:0:4029 -455:2:3623 -456:2:3632 -457:2:3633 -458:2:3637 -459:2:3638 -460:2:3642 -461:2:3643 -462:2:3651 -463:2:3656 -464:2:3660 -465:2:3661 -466:2:3669 -467:2:3670 -468:2:3674 -469:2:3675 -470:2:3669 -471:2:3670 -472:2:3674 -473:2:3675 -474:2:3683 -475:2:3690 -476:2:3691 -477:2:3695 -478:2:3696 -479:2:3703 -480:2:3708 -481:2:3715 -482:2:3716 -483:2:3715 -484:2:3716 -485:2:3723 -486:0:4029 -487:2:2767 -488:0:4029 -489:1:560 -490:1:561 -491:1:565 -492:1:566 -493:1:574 -494:1:575 -495:1:579 -496:1:580 -497:1:588 -498:1:593 -499:1:597 -500:1:598 -501:1:606 -502:1:607 -503:1:611 -504:1:612 -505:1:606 -506:1:607 -507:1:611 -508:1:612 -509:1:620 -510:1:625 -511:1:632 -512:1:633 -513:1:640 -514:1:645 -515:1:652 -516:1:653 -517:1:652 -518:1:653 -519:1:660 -520:0:4029 -521:1:11 -522:0:4029 -523:2:3507 -524:2:3516 -525:2:3517 -526:2:3521 -527:2:3522 -528:2:3526 -529:2:3527 -530:2:3535 -531:2:3540 -532:2:3544 -533:2:3545 -534:2:3553 -535:2:3554 -536:2:3558 -537:2:3559 -538:2:3553 -539:2:3554 -540:2:3558 -541:2:3559 -542:2:3567 -543:2:3574 -544:2:3575 -545:2:3579 -546:2:3580 -547:2:3587 -548:2:3592 -549:2:3599 -550:2:3600 -551:2:3599 -552:2:3600 -553:2:3607 -554:2:3617 -555:0:4029 -556:2:2767 -557:0:4029 -558:2:3623 -559:2:3632 -560:2:3633 -561:2:3637 -562:2:3638 -563:2:3642 -564:2:3643 -565:2:3651 -566:2:3656 -567:2:3660 -568:2:3661 -569:2:3669 -570:2:3670 -571:2:3674 -572:2:3675 -573:2:3669 -574:2:3670 -575:2:3674 -576:2:3675 -577:2:3683 -578:2:3690 -579:2:3691 -580:2:3695 -581:2:3696 -582:2:3703 -583:2:3708 -584:2:3715 -585:2:3716 -586:2:3715 -587:2:3716 -588:2:3723 -589:0:4029 -590:2:2767 -591:0:4029 -592:1:671 -593:1:674 -594:1:675 -595:0:4029 -596:1:11 -597:0:4029 -598:2:3507 -599:2:3516 -600:2:3517 -601:2:3521 -602:2:3522 -603:2:3526 -604:2:3527 -605:2:3535 -606:2:3540 -607:2:3544 -608:2:3545 -609:2:3553 -610:2:3554 -611:2:3558 -612:2:3559 -613:2:3553 -614:2:3554 -615:2:3558 -616:2:3559 -617:2:3567 -618:2:3574 -619:2:3575 -620:2:3579 -621:2:3580 -622:2:3587 -623:2:3592 -624:2:3599 -625:2:3600 -626:2:3599 -627:2:3600 -628:2:3607 -629:2:3617 -630:0:4029 -631:2:2767 -632:0:4029 -633:2:3623 -634:2:3632 -635:2:3633 -636:2:3637 -637:2:3638 -638:2:3642 -639:2:3643 -640:2:3651 -641:2:3656 -642:2:3660 -643:2:3661 -644:2:3669 -645:2:3670 -646:2:3674 -647:2:3675 -648:2:3669 -649:2:3670 -650:2:3674 -651:2:3675 -652:2:3683 -653:2:3690 -654:2:3691 -655:2:3695 -656:2:3696 -657:2:3703 -658:2:3708 -659:2:3715 -660:2:3716 -661:2:3715 -662:2:3716 -663:2:3723 -664:0:4029 -665:2:2767 -666:0:4029 -667:1:678 -668:1:679 -669:1:683 -670:1:684 -671:1:692 -672:1:693 -673:1:697 -674:1:698 -675:1:706 -676:1:711 -677:1:715 -678:1:716 -679:1:724 -680:1:725 -681:1:729 -682:1:730 -683:1:724 -684:1:725 -685:1:729 -686:1:730 -687:1:738 -688:1:743 -689:1:750 -690:1:751 -691:1:758 -692:1:763 -693:1:770 -694:1:771 -695:1:770 -696:1:771 -697:1:778 -698:0:4029 -699:1:11 -700:0:4029 -701:2:3507 -702:2:3516 -703:2:3517 -704:2:3521 -705:2:3522 -706:2:3526 -707:2:3527 -708:2:3535 -709:2:3540 -710:2:3544 -711:2:3545 -712:2:3553 -713:2:3554 -714:2:3558 -715:2:3559 -716:2:3553 -717:2:3554 -718:2:3558 -719:2:3559 -720:2:3567 -721:2:3574 -722:2:3575 -723:2:3579 -724:2:3580 -725:2:3587 -726:2:3592 -727:2:3599 -728:2:3600 -729:2:3599 -730:2:3600 -731:2:3607 -732:2:3617 -733:0:4029 -734:2:2767 -735:0:4029 -736:2:3623 -737:2:3632 -738:2:3633 -739:2:3637 -740:2:3638 -741:2:3642 -742:2:3643 -743:2:3651 -744:2:3656 -745:2:3660 -746:2:3661 -747:2:3669 -748:2:3670 -749:2:3674 -750:2:3675 -751:2:3669 -752:2:3670 -753:2:3674 -754:2:3675 -755:2:3683 -756:2:3690 -757:2:3691 -758:2:3695 -759:2:3696 -760:2:3703 -761:2:3708 -762:2:3715 -763:2:3716 -764:2:3715 -765:2:3716 -766:2:3723 -767:0:4029 -768:2:2767 -769:0:4029 -770:1:902 -771:1:903 -772:1:907 -773:1:908 -774:1:916 -775:1:917 -776:1:921 -777:1:922 -778:1:930 -779:1:935 -780:1:939 -781:1:940 -782:1:948 -783:1:949 -784:1:953 -785:1:954 -786:1:948 -787:1:949 -788:1:953 -789:1:954 -790:1:962 -791:1:967 -792:1:974 -793:1:975 -794:1:982 -795:1:987 -796:1:994 -797:1:995 -798:1:994 -799:1:995 -800:1:1002 -801:1:1011 -802:1:1015 -803:0:4029 -804:1:11 -805:0:4029 -806:2:3507 -807:2:3516 -808:2:3517 -809:2:3521 -810:2:3522 -811:2:3526 -812:2:3527 -813:2:3535 -814:2:3540 -815:2:3544 -816:2:3545 -817:2:3553 -818:2:3554 -819:2:3558 -820:2:3559 -821:2:3553 -822:2:3554 -823:2:3558 -824:2:3559 -825:2:3567 -826:2:3574 -827:2:3575 -828:2:3579 -829:2:3580 -830:2:3587 -831:2:3592 -832:2:3599 -833:2:3600 -834:2:3599 -835:2:3600 -836:2:3607 -837:2:3617 -838:0:4029 -839:2:2767 -840:0:4029 -841:2:3623 -842:2:3632 -843:2:3633 -844:2:3637 -845:2:3638 -846:2:3642 -847:2:3643 -848:2:3651 -849:2:3656 -850:2:3660 -851:2:3661 -852:2:3669 -853:2:3670 -854:2:3674 -855:2:3675 -856:2:3669 -857:2:3670 -858:2:3674 -859:2:3675 -860:2:3683 -861:2:3690 -862:2:3691 -863:2:3695 -864:2:3696 -865:2:3703 -866:2:3708 -867:2:3715 -868:2:3716 -869:2:3715 -870:2:3716 -871:2:3723 -872:0:4029 -873:2:2767 -874:0:4029 -875:1:1016 -876:1:1017 -877:1:1021 -878:1:1022 -879:1:1030 -880:1:1031 -881:1:1032 -882:1:1044 -883:1:1049 -884:1:1053 -885:1:1054 -886:1:1062 -887:1:1063 -888:1:1067 -889:1:1068 -890:1:1062 -891:1:1063 -892:1:1067 -893:1:1068 -894:1:1076 -895:1:1081 -896:1:1088 -897:1:1089 -898:1:1096 -899:1:1101 -900:1:1108 -901:1:1109 -902:1:1108 -903:1:1109 -904:1:1116 -905:0:4029 -906:1:11 -907:0:4029 -908:2:3507 -909:2:3516 -910:2:3517 -911:2:3521 -912:2:3522 -913:2:3526 -914:2:3527 -915:2:3535 -916:2:3540 -917:2:3544 -918:2:3545 -919:2:3553 -920:2:3554 -921:2:3558 -922:2:3559 -923:2:3553 -924:2:3554 -925:2:3558 -926:2:3559 -927:2:3567 -928:2:3574 -929:2:3575 -930:2:3579 -931:2:3580 -932:2:3587 -933:2:3592 -934:2:3599 -935:2:3600 -936:2:3599 -937:2:3600 -938:2:3607 -939:2:3617 -940:0:4029 -941:2:2767 -942:0:4029 -943:2:3623 -944:2:3632 -945:2:3633 -946:2:3637 -947:2:3638 -948:2:3642 -949:2:3643 -950:2:3651 -951:2:3656 -952:2:3660 -953:2:3661 -954:2:3669 -955:2:3670 -956:2:3674 -957:2:3675 -958:2:3669 -959:2:3670 -960:2:3674 -961:2:3675 -962:2:3683 -963:2:3690 -964:2:3691 -965:2:3695 -966:2:3696 -967:2:3703 -968:2:3708 -969:2:3715 -970:2:3716 -971:2:3715 -972:2:3716 -973:2:3723 -974:0:4029 -975:2:2767 -976:0:4029 -977:1:1127 -978:0:4029 -979:2:3507 -980:2:3516 -981:2:3517 -982:2:3521 -983:2:3522 -984:2:3526 -985:2:3527 -986:2:3535 -987:2:3540 -988:2:3544 -989:2:3545 -990:2:3553 -991:2:3554 -992:2:3558 -993:2:3559 -994:2:3553 -995:2:3554 -996:2:3558 -997:2:3559 -998:2:3567 -999:2:3574 -1000:2:3575 -1001:2:3579 -1002:2:3580 -1003:2:3587 -1004:2:3592 -1005:2:3599 -1006:2:3600 -1007:2:3599 -1008:2:3600 -1009:2:3607 -1010:2:3617 -1011:0:4029 -1012:2:2767 -1013:0:4029 -1014:2:3623 -1015:2:3632 -1016:2:3633 -1017:2:3637 -1018:2:3638 -1019:2:3642 -1020:2:3643 -1021:2:3651 -1022:2:3656 -1023:2:3660 -1024:2:3661 -1025:2:3669 -1026:2:3670 -1027:2:3674 -1028:2:3675 -1029:2:3669 -1030:2:3670 -1031:2:3674 -1032:2:3675 -1033:2:3683 -1034:2:3690 -1035:2:3691 -1036:2:3695 -1037:2:3696 -1038:2:3703 -1039:2:3708 -1040:2:3715 -1041:2:3716 -1042:2:3715 -1043:2:3716 -1044:2:3723 -1045:0:4029 -1046:2:2767 -1047:0:4029 -1048:1:2663 -1049:1:2670 -1050:1:2671 -1051:1:2678 -1052:1:2683 -1053:1:2690 -1054:1:2691 -1055:1:2690 -1056:1:2691 -1057:1:2698 -1058:1:2702 -1059:0:4029 -1060:2:3507 -1061:2:3516 -1062:2:3517 -1063:2:3521 -1064:2:3522 -1065:2:3526 -1066:2:3527 -1067:2:3535 -1068:2:3540 -1069:2:3544 -1070:2:3545 -1071:2:3553 -1072:2:3554 -1073:2:3558 -1074:2:3559 -1075:2:3553 -1076:2:3554 -1077:2:3558 -1078:2:3559 -1079:2:3567 -1080:2:3574 -1081:2:3575 -1082:2:3579 -1083:2:3580 -1084:2:3587 -1085:2:3592 -1086:2:3599 -1087:2:3600 -1088:2:3599 -1089:2:3600 -1090:2:3607 -1091:2:3617 -1092:0:4029 -1093:2:2767 -1094:0:4029 -1095:2:3623 -1096:2:3632 -1097:2:3633 -1098:2:3637 -1099:2:3638 -1100:2:3642 -1101:2:3643 -1102:2:3651 -1103:2:3656 -1104:2:3660 -1105:2:3661 -1106:2:3669 -1107:2:3670 -1108:2:3674 -1109:2:3675 -1110:2:3669 -1111:2:3670 -1112:2:3674 -1113:2:3675 -1114:2:3683 -1115:2:3690 -1116:2:3691 -1117:2:3695 -1118:2:3696 -1119:2:3703 -1120:2:3708 -1121:2:3715 -1122:2:3716 -1123:2:3715 -1124:2:3716 -1125:2:3723 -1126:0:4029 -1127:2:2767 -1128:0:4029 -1129:1:1129 -1130:1:1130 -1131:0:4029 -1132:1:11 -1133:0:4029 -1134:2:3507 -1135:2:3516 -1136:2:3517 -1137:2:3521 -1138:2:3522 -1139:2:3526 -1140:2:3527 -1141:2:3535 -1142:2:3540 -1143:2:3544 -1144:2:3545 -1145:2:3553 -1146:2:3554 -1147:2:3558 -1148:2:3559 -1149:2:3553 -1150:2:3554 -1151:2:3558 -1152:2:3559 -1153:2:3567 -1154:2:3574 -1155:2:3575 -1156:2:3579 -1157:2:3580 -1158:2:3587 -1159:2:3592 -1160:2:3599 -1161:2:3600 -1162:2:3599 -1163:2:3600 -1164:2:3607 -1165:2:3617 -1166:0:4029 -1167:2:2767 -1168:0:4029 -1169:2:3623 -1170:2:3632 -1171:2:3633 -1172:2:3637 -1173:2:3638 -1174:2:3642 -1175:2:3643 -1176:2:3651 -1177:2:3656 -1178:2:3660 -1179:2:3661 -1180:2:3669 -1181:2:3670 -1182:2:3674 -1183:2:3675 -1184:2:3669 -1185:2:3670 -1186:2:3674 -1187:2:3675 -1188:2:3683 -1189:2:3690 -1190:2:3691 -1191:2:3695 -1192:2:3696 -1193:2:3703 -1194:2:3708 -1195:2:3715 -1196:2:3716 -1197:2:3715 -1198:2:3716 -1199:2:3723 -1200:0:4029 -1201:2:2767 -1202:0:4029 -1203:1:1131 -1204:1:1132 -1205:1:1136 -1206:1:1137 -1207:1:1145 -1208:1:1146 -1209:1:1150 -1210:1:1151 -1211:1:1159 -1212:1:1164 -1213:1:1168 -1214:1:1169 -1215:1:1177 -1216:1:1178 -1217:1:1182 -1218:1:1183 -1219:1:1177 -1220:1:1178 -1221:1:1182 -1222:1:1183 -1223:1:1191 -1224:1:1196 -1225:1:1203 -1226:1:1204 -1227:1:1211 -1228:1:1216 -1229:1:1223 -1230:1:1224 -1231:1:1223 -1232:1:1224 -1233:1:1231 -1234:0:4029 -1235:1:11 -1236:0:4029 -1237:2:3507 -1238:2:3516 -1239:2:3517 -1240:2:3521 -1241:2:3522 -1242:2:3526 -1243:2:3527 -1244:2:3535 -1245:2:3540 -1246:2:3544 -1247:2:3545 -1248:2:3553 -1249:2:3554 -1250:2:3558 -1251:2:3559 -1252:2:3553 -1253:2:3554 -1254:2:3558 -1255:2:3559 -1256:2:3567 -1257:2:3574 -1258:2:3575 -1259:2:3579 -1260:2:3580 -1261:2:3587 -1262:2:3592 -1263:2:3599 -1264:2:3600 -1265:2:3599 -1266:2:3600 -1267:2:3607 -1268:2:3617 -1269:0:4029 -1270:2:2767 -1271:0:4029 -1272:2:3623 -1273:2:3632 -1274:2:3633 -1275:2:3637 -1276:2:3638 -1277:2:3642 -1278:2:3643 -1279:2:3651 -1280:2:3656 -1281:2:3660 -1282:2:3661 -1283:2:3669 -1284:2:3670 -1285:2:3674 -1286:2:3675 -1287:2:3669 -1288:2:3670 -1289:2:3674 -1290:2:3675 -1291:2:3683 -1292:2:3690 -1293:2:3691 -1294:2:3695 -1295:2:3696 -1296:2:3703 -1297:2:3708 -1298:2:3715 -1299:2:3716 -1300:2:3715 -1301:2:3716 -1302:2:3723 -1303:0:4029 -1304:2:2767 -1305:0:4029 -1306:1:1242 -1307:1:1243 -1308:1:1247 -1309:1:1248 -1310:1:1256 -1311:1:1257 -1312:1:1261 -1313:1:1262 -1314:1:1270 -1315:1:1275 -1316:1:1279 -1317:1:1280 -1318:1:1288 -1319:1:1289 -1320:1:1293 -1321:1:1294 -1322:1:1288 -1323:1:1289 -1324:1:1293 -1325:1:1294 -1326:1:1302 -1327:1:1307 -1328:1:1314 -1329:1:1315 -1330:1:1322 -1331:1:1327 -1332:1:1334 -1333:1:1335 -1334:1:1334 -1335:1:1335 -1336:1:1342 -1337:1:1351 -1338:1:1355 -1339:0:4029 -1340:1:11 -1341:0:4029 -1342:2:3507 -1343:2:3516 -1344:2:3517 -1345:2:3521 -1346:2:3522 -1347:2:3526 -1348:2:3527 -1349:2:3535 -1350:2:3540 -1351:2:3544 -1352:2:3545 -1353:2:3553 -1354:2:3554 -1355:2:3558 -1356:2:3559 -1357:2:3553 -1358:2:3554 -1359:2:3558 -1360:2:3559 -1361:2:3567 -1362:2:3574 -1363:2:3575 -1364:2:3579 -1365:2:3580 -1366:2:3587 -1367:2:3592 -1368:2:3599 -1369:2:3600 -1370:2:3599 -1371:2:3600 -1372:2:3607 -1373:2:3617 -1374:0:4029 -1375:2:2767 -1376:0:4029 -1377:2:3623 -1378:2:3632 -1379:2:3633 -1380:2:3637 -1381:2:3638 -1382:2:3642 -1383:2:3643 -1384:2:3651 -1385:2:3656 -1386:2:3660 -1387:2:3661 -1388:2:3669 -1389:2:3670 -1390:2:3674 -1391:2:3675 -1392:2:3669 -1393:2:3670 -1394:2:3674 -1395:2:3675 -1396:2:3683 -1397:2:3690 -1398:2:3691 -1399:2:3695 -1400:2:3696 -1401:2:3703 -1402:2:3708 -1403:2:3715 -1404:2:3716 -1405:2:3715 -1406:2:3716 -1407:2:3723 -1408:0:4029 -1409:2:2767 -1410:0:4029 -1411:1:1356 -1412:1:1360 -1413:1:1361 -1414:1:1365 -1415:1:1366 -1416:1:1374 -1417:1:1382 -1418:1:1383 -1419:1:1387 -1420:1:1391 -1421:1:1392 -1422:1:1387 -1423:1:1391 -1424:1:1392 -1425:1:1396 -1426:1:1403 -1427:1:1410 -1428:1:1411 -1429:1:1418 -1430:1:1423 -1431:1:1430 -1432:1:1431 -1433:1:1430 -1434:1:1431 -1435:1:1438 -1436:0:4029 -1437:1:11 -1438:0:4029 -1439:2:3507 -1440:2:3516 -1441:2:3517 -1442:2:3521 -1443:2:3522 -1444:2:3526 -1445:2:3527 -1446:2:3535 -1447:2:3540 -1448:2:3544 -1449:2:3545 -1450:2:3553 -1451:2:3554 -1452:2:3558 -1453:2:3559 -1454:2:3553 -1455:2:3554 -1456:2:3558 -1457:2:3559 -1458:2:3567 -1459:2:3574 -1460:2:3575 -1461:2:3579 -1462:2:3580 -1463:2:3587 -1464:2:3592 -1465:2:3599 -1466:2:3600 -1467:2:3599 -1468:2:3600 -1469:2:3607 -1470:2:3617 -1471:0:4029 -1472:2:2767 -1473:0:4029 -1474:2:3623 -1475:2:3632 -1476:2:3633 -1477:2:3637 -1478:2:3638 -1479:2:3642 -1480:2:3643 -1481:2:3651 -1482:2:3656 -1483:2:3660 -1484:2:3661 -1485:2:3669 -1486:2:3670 -1487:2:3674 -1488:2:3675 -1489:2:3669 -1490:2:3670 -1491:2:3674 -1492:2:3675 -1493:2:3683 -1494:2:3690 -1495:2:3691 -1496:2:3695 -1497:2:3696 -1498:2:3703 -1499:2:3708 -1500:2:3715 -1501:2:3716 -1502:2:3715 -1503:2:3716 -1504:2:3723 -1505:0:4029 -1506:2:2767 -1507:0:4029 -1508:1:1448 -1509:1:1449 -1510:1:1453 -1511:1:1454 -1512:1:1462 -1513:1:1463 -1514:1:1467 -1515:1:1468 -1516:1:1476 -1517:1:1481 -1518:1:1485 -1519:1:1486 -1520:1:1494 -1521:1:1495 -1522:1:1499 -1523:1:1500 -1524:1:1494 -1525:1:1495 -1526:1:1499 -1527:1:1500 -1528:1:1508 -1529:1:1513 -1530:1:1520 -1531:1:1521 -1532:1:1528 -1533:1:1533 -1534:1:1540 -1535:1:1541 -1536:1:1540 -1537:1:1541 -1538:1:1548 -1539:0:4029 -1540:1:11 -1541:0:4029 -1542:2:3507 -1543:2:3516 -1544:2:3517 -1545:2:3521 -1546:2:3522 -1547:2:3526 -1548:2:3527 -1549:2:3535 -1550:2:3540 -1551:2:3544 -1552:2:3545 -1553:2:3553 -1554:2:3554 -1555:2:3558 -1556:2:3559 -1557:2:3553 -1558:2:3554 -1559:2:3558 -1560:2:3559 -1561:2:3567 -1562:2:3574 -1563:2:3575 -1564:2:3579 -1565:2:3580 -1566:2:3587 -1567:2:3592 -1568:2:3599 -1569:2:3600 -1570:2:3599 -1571:2:3600 -1572:2:3607 -1573:2:3617 -1574:0:4029 -1575:2:2767 -1576:0:4029 -1577:2:3623 -1578:2:3632 -1579:2:3633 -1580:2:3637 -1581:2:3638 -1582:2:3642 -1583:2:3643 -1584:2:3651 -1585:2:3656 -1586:2:3660 -1587:2:3661 -1588:2:3669 -1589:2:3670 -1590:2:3674 -1591:2:3675 -1592:2:3669 -1593:2:3670 -1594:2:3674 -1595:2:3675 -1596:2:3683 -1597:2:3690 -1598:2:3691 -1599:2:3695 -1600:2:3696 -1601:2:3703 -1602:2:3708 -1603:2:3715 -1604:2:3716 -1605:2:3715 -1606:2:3716 -1607:2:3723 -1608:0:4029 -1609:2:2767 -1610:0:4029 -1611:1:1559 -1612:1:1560 -1613:1:1564 -1614:1:1565 -1615:1:1573 -1616:1:1574 -1617:1:1578 -1618:1:1579 -1619:1:1587 -1620:1:1592 -1621:1:1596 -1622:1:1597 -1623:1:1605 -1624:1:1606 -1625:1:1610 -1626:1:1611 -1627:1:1605 -1628:1:1606 -1629:1:1610 -1630:1:1611 -1631:1:1619 -1632:1:1624 -1633:1:1631 -1634:1:1632 -1635:1:1639 -1636:1:1644 -1637:1:1651 -1638:1:1652 -1639:1:1651 -1640:1:1652 -1641:1:1659 -1642:1:1668 -1643:1:1672 -1644:0:4029 -1645:1:11 -1646:0:4029 -1647:2:3507 -1648:2:3516 -1649:2:3517 -1650:2:3521 -1651:2:3522 -1652:2:3526 -1653:2:3527 -1654:2:3535 -1655:2:3540 -1656:2:3544 -1657:2:3545 -1658:2:3553 -1659:2:3554 -1660:2:3558 -1661:2:3559 -1662:2:3553 -1663:2:3554 -1664:2:3558 -1665:2:3559 -1666:2:3567 -1667:2:3574 -1668:2:3575 -1669:2:3579 -1670:2:3580 -1671:2:3587 -1672:2:3592 -1673:2:3599 -1674:2:3600 -1675:2:3599 -1676:2:3600 -1677:2:3607 -1678:2:3617 -1679:0:4029 -1680:2:2767 -1681:0:4029 -1682:2:3623 -1683:2:3632 -1684:2:3633 -1685:2:3637 -1686:2:3638 -1687:2:3642 -1688:2:3643 -1689:2:3651 -1690:2:3656 -1691:2:3660 -1692:2:3661 -1693:2:3669 -1694:2:3670 -1695:2:3674 -1696:2:3675 -1697:2:3669 -1698:2:3670 -1699:2:3674 -1700:2:3675 -1701:2:3683 -1702:2:3690 -1703:2:3691 -1704:2:3695 -1705:2:3696 -1706:2:3703 -1707:2:3708 -1708:2:3715 -1709:2:3716 -1710:2:3715 -1711:2:3716 -1712:2:3723 -1713:0:4029 -1714:2:2767 -1715:0:4029 -1716:1:1673 -1717:1:1674 -1718:1:1678 -1719:1:1679 -1720:1:1687 -1721:1:1688 -1722:1:1689 -1723:1:1701 -1724:1:1706 -1725:1:1710 -1726:1:1711 -1727:1:1719 -1728:1:1720 -1729:1:1724 -1730:1:1725 -1731:1:1719 -1732:1:1720 -1733:1:1724 -1734:1:1725 -1735:1:1733 -1736:1:1738 -1737:1:1745 -1738:1:1746 -1739:1:1753 -1740:1:1758 -1741:1:1765 -1742:1:1766 -1743:1:1765 -1744:1:1766 -1745:1:1773 -1746:0:4029 -1747:1:11 -1748:0:4029 -1749:1:1784 -1750:1:1785 -1751:0:4029 -1752:1:11 -1753:0:4029 -1754:1:1791 -1755:1:1792 -1756:1:1796 -1757:1:1797 -1758:1:1805 -1759:1:1806 -1760:1:1810 -1761:1:1811 -1762:1:1819 -1763:1:1824 -1764:1:1828 -1765:1:1829 -1766:1:1837 -1767:1:1838 -1768:1:1842 -1769:1:1843 -1770:1:1837 -1771:1:1838 -1772:1:1842 -1773:1:1843 -1774:1:1851 -1775:1:1856 -1776:1:1863 -1777:1:1864 -1778:1:1871 -1779:1:1876 -1780:1:1883 -1781:1:1884 -1782:1:1883 -1783:1:1884 -1784:1:1891 -1785:0:4029 -1786:1:11 -1787:0:4029 -1788:1:1902 -1789:1:1903 -1790:1:1907 -1791:1:1908 -1792:1:1916 -1793:1:1917 -1794:1:1921 -1795:1:1922 -1796:1:1930 -1797:1:1935 -1798:1:1939 -1799:1:1940 -1800:1:1948 -1801:1:1949 -1802:1:1953 -1803:1:1954 -1804:1:1948 -1805:1:1949 -1806:1:1953 -1807:1:1954 -1808:1:1962 -1809:1:1967 -1810:1:1974 -1811:1:1975 -1812:1:1982 -1813:1:1987 -1814:1:1994 -1815:1:1995 -1816:1:1994 -1817:1:1995 -1818:1:2002 -1819:1:2011 -1820:0:4029 -1821:1:11 -1822:0:4029 -1823:1:2129 -1824:1:2133 -1825:1:2134 -1826:1:2138 -1827:1:2139 -1828:1:2147 -1829:1:2155 -1830:1:2156 -1831:1:2160 -1832:1:2164 -1833:1:2165 -1834:1:2160 -1835:1:2164 -1836:1:2165 -1837:1:2169 -1838:1:2176 -1839:1:2183 -1840:1:2184 -1841:1:2191 -1842:1:2196 -1843:1:2203 -1844:1:2204 -1845:1:2203 -1846:1:2204 -1847:1:2211 -1848:0:4029 -1849:1:11 -1850:0:4029 -1851:2:3507 -1852:2:3516 -1853:2:3517 -1854:2:3521 -1855:2:3522 -1856:2:3526 -1857:2:3527 -1858:2:3535 -1859:2:3540 -1860:2:3544 -1861:2:3545 -1862:2:3553 -1863:2:3554 -1864:2:3558 -1865:2:3559 -1866:2:3553 -1867:2:3554 -1868:2:3558 -1869:2:3559 -1870:2:3567 -1871:2:3574 -1872:2:3575 -1873:2:3579 -1874:2:3580 -1875:2:3587 -1876:2:3592 -1877:2:3599 -1878:2:3600 -1879:2:3599 -1880:2:3600 -1881:2:3607 -1882:2:3617 -1883:0:4029 -1884:2:2767 -1885:0:4029 -1886:2:3623 -1887:2:3632 -1888:2:3633 -1889:2:3637 -1890:2:3638 -1891:2:3642 -1892:2:3643 -1893:2:3651 -1894:2:3656 -1895:2:3660 -1896:2:3661 -1897:2:3669 -1898:2:3670 -1899:2:3674 -1900:2:3675 -1901:2:3669 -1902:2:3670 -1903:2:3674 -1904:2:3675 -1905:2:3683 -1906:2:3690 -1907:2:3691 -1908:2:3695 -1909:2:3696 -1910:2:3703 -1911:2:3708 -1912:2:3715 -1913:2:3716 -1914:2:3715 -1915:2:3716 -1916:2:3723 -1917:0:4029 -1918:2:2767 -1919:0:4029 -1920:1:2221 -1921:1:2222 -1922:1:2226 -1923:1:2227 -1924:1:2235 -1925:1:2236 -1926:1:2240 -1927:1:2241 -1928:1:2249 -1929:1:2254 -1930:1:2258 -1931:1:2259 -1932:1:2267 -1933:1:2268 -1934:1:2272 -1935:1:2273 -1936:1:2267 -1937:1:2268 -1938:1:2272 -1939:1:2273 -1940:1:2281 -1941:1:2286 -1942:1:2293 -1943:1:2294 -1944:1:2301 -1945:1:2306 -1946:1:2313 -1947:1:2314 -1948:1:2313 -1949:1:2314 -1950:1:2321 --1:-1:-1 -1951:0:4029 -1952:1:11 -1953:0:4029 -1954:2:3507 -1955:2:3516 -1956:2:3517 -1957:2:3521 -1958:2:3522 -1959:2:3526 -1960:2:3527 -1961:2:3535 -1962:2:3540 -1963:2:3544 -1964:2:3545 -1965:2:3553 -1966:2:3554 -1967:2:3558 -1968:2:3559 -1969:2:3553 -1970:2:3554 -1971:2:3558 -1972:2:3559 -1973:2:3567 -1974:2:3574 -1975:2:3575 -1976:2:3579 -1977:2:3580 -1978:2:3587 -1979:2:3592 -1980:2:3599 -1981:2:3600 -1982:2:3599 -1983:2:3600 -1984:2:3607 -1985:2:3617 -1986:0:4029 -1987:2:2767 -1988:0:4029 -1989:2:3623 -1990:2:3632 -1991:2:3633 -1992:2:3637 -1993:2:3638 -1994:2:3642 -1995:2:3643 -1996:2:3651 -1997:2:3656 -1998:2:3660 -1999:2:3661 -2000:2:3669 -2001:2:3670 -2002:2:3674 -2003:2:3675 -2004:2:3669 -2005:2:3670 -2006:2:3674 -2007:2:3675 -2008:2:3683 -2009:2:3690 -2010:2:3691 -2011:2:3695 -2012:2:3696 -2013:2:3703 -2014:2:3708 -2015:2:3715 -2016:2:3716 -2017:2:3715 -2018:2:3716 -2019:2:3723 -2020:0:4029 -2021:2:2767 -2022:0:4029 -2023:1:2332 -2024:0:4029 -2025:2:3507 -2026:2:3516 -2027:2:3517 -2028:2:3521 -2029:2:3522 -2030:2:3526 -2031:2:3527 -2032:2:3535 -2033:2:3540 -2034:2:3544 -2035:2:3545 -2036:2:3553 -2037:2:3554 -2038:2:3558 -2039:2:3559 -2040:2:3553 -2041:2:3554 -2042:2:3558 -2043:2:3559 -2044:2:3567 -2045:2:3574 -2046:2:3575 -2047:2:3579 -2048:2:3580 -2049:2:3587 -2050:2:3592 -2051:2:3599 -2052:2:3600 -2053:2:3599 -2054:2:3600 -2055:2:3607 -2056:2:3617 -2057:0:4029 -2058:2:2767 -2059:0:4029 -2060:2:3623 -2061:2:3632 -2062:2:3633 -2063:2:3637 -2064:2:3638 -2065:2:3642 -2066:2:3643 -2067:2:3651 -2068:2:3656 -2069:2:3660 -2070:2:3661 -2071:2:3669 -2072:2:3670 -2073:2:3674 -2074:2:3675 -2075:2:3669 -2076:2:3670 -2077:2:3674 -2078:2:3675 -2079:2:3683 -2080:2:3690 -2081:2:3691 -2082:2:3695 -2083:2:3696 -2084:2:3703 -2085:2:3708 -2086:2:3715 -2087:2:3716 -2088:2:3715 -2089:2:3716 -2090:2:3723 -2091:0:4029 -2092:2:2767 -2093:0:4029 -2094:1:2706 -2095:1:2713 -2096:1:2714 -2097:1:2721 -2098:1:2726 -2099:1:2733 -2100:1:2734 -2101:1:2733 -2102:1:2734 -2103:1:2741 -2104:1:2745 -2105:0:4029 -2106:2:3507 -2107:2:3516 -2108:2:3517 -2109:2:3521 -2110:2:3522 -2111:2:3526 -2112:2:3527 -2113:2:3535 -2114:2:3540 -2115:2:3544 -2116:2:3545 -2117:2:3553 -2118:2:3554 -2119:2:3558 -2120:2:3559 -2121:2:3553 -2122:2:3554 -2123:2:3558 -2124:2:3559 -2125:2:3567 -2126:2:3574 -2127:2:3575 -2128:2:3579 -2129:2:3580 -2130:2:3587 -2131:2:3592 -2132:2:3599 -2133:2:3600 -2134:2:3599 -2135:2:3600 -2136:2:3607 -2137:2:3617 -2138:0:4029 -2139:2:2767 -2140:0:4029 -2141:2:3623 -2142:2:3632 -2143:2:3633 -2144:2:3637 -2145:2:3638 -2146:2:3642 -2147:2:3643 -2148:2:3651 -2149:2:3656 -2150:2:3660 -2151:2:3661 -2152:2:3669 -2153:2:3670 -2154:2:3674 -2155:2:3675 -2156:2:3669 -2157:2:3670 -2158:2:3674 -2159:2:3675 -2160:2:3683 -2161:2:3690 -2162:2:3691 -2163:2:3695 -2164:2:3696 -2165:2:3703 -2166:2:3708 -2167:2:3715 -2168:2:3716 -2169:2:3715 -2170:2:3716 -2171:2:3723 -2172:0:4029 -2173:2:2767 -2174:0:4029 -2175:1:2334 -2176:1:2335 -2177:0:4029 -2178:1:11 -2179:0:4029 -2180:2:3507 -2181:2:3516 -2182:2:3517 -2183:2:3521 -2184:2:3522 -2185:2:3526 -2186:2:3527 -2187:2:3535 -2188:2:3540 -2189:2:3544 -2190:2:3545 -2191:2:3553 -2192:2:3554 -2193:2:3558 -2194:2:3559 -2195:2:3553 -2196:2:3554 -2197:2:3558 -2198:2:3559 -2199:2:3567 -2200:2:3574 -2201:2:3575 -2202:2:3579 -2203:2:3580 -2204:2:3587 -2205:2:3592 -2206:2:3599 -2207:2:3600 -2208:2:3599 -2209:2:3600 -2210:2:3607 -2211:2:3617 -2212:0:4029 -2213:2:2767 -2214:0:4029 -2215:2:3623 -2216:2:3632 -2217:2:3633 -2218:2:3637 -2219:2:3638 -2220:2:3642 -2221:2:3643 -2222:2:3651 -2223:2:3656 -2224:2:3660 -2225:2:3661 -2226:2:3669 -2227:2:3670 -2228:2:3674 -2229:2:3675 -2230:2:3669 -2231:2:3670 -2232:2:3674 -2233:2:3675 -2234:2:3683 -2235:2:3690 -2236:2:3691 -2237:2:3695 -2238:2:3696 -2239:2:3703 -2240:2:3708 -2241:2:3715 -2242:2:3716 -2243:2:3715 -2244:2:3716 -2245:2:3723 -2246:0:4029 -2247:2:2767 -2248:0:4029 -2249:1:2336 -2250:1:2340 -2251:1:2341 -2252:1:2345 -2253:1:2349 -2254:1:2350 -2255:1:2354 -2256:1:2362 -2257:1:2363 -2258:1:2367 -2259:1:2371 -2260:1:2372 -2261:1:2367 -2262:1:2371 -2263:1:2372 -2264:1:2376 -2265:1:2383 -2266:1:2390 -2267:1:2391 -2268:1:2398 -2269:1:2403 -2270:1:2410 -2271:1:2411 -2272:1:2410 -2273:1:2411 -2274:1:2418 -2275:0:4029 -2276:1:11 -2277:0:4029 -2278:2:3507 -2279:2:3516 -2280:2:3517 -2281:2:3521 -2282:2:3522 -2283:2:3526 -2284:2:3527 -2285:2:3535 -2286:2:3540 -2287:2:3544 -2288:2:3545 -2289:2:3553 -2290:2:3554 -2291:2:3558 -2292:2:3559 -2293:2:3553 -2294:2:3554 -2295:2:3558 -2296:2:3559 -2297:2:3567 -2298:2:3574 -2299:2:3575 -2300:2:3579 -2301:2:3580 -2302:2:3587 -2303:2:3592 -2304:2:3599 -2305:2:3600 -2306:2:3599 -2307:2:3600 -2308:2:3607 -2309:2:3617 -2310:0:4029 -2311:2:2767 -2312:0:4029 -2313:2:3623 -2314:2:3632 -2315:2:3633 -2316:2:3637 -2317:2:3638 -2318:2:3642 -2319:2:3643 -2320:2:3651 -2321:2:3656 -2322:2:3660 -2323:2:3661 -2324:2:3669 -2325:2:3670 -2326:2:3674 -2327:2:3675 -2328:2:3669 -2329:2:3670 -2330:2:3674 -2331:2:3675 -2332:2:3683 -2333:2:3690 -2334:2:3691 -2335:2:3695 -2336:2:3696 -2337:2:3703 -2338:2:3708 -2339:2:3715 -2340:2:3716 -2341:2:3715 -2342:2:3716 -2343:2:3723 -2344:0:4029 -2345:2:2767 -2346:0:4029 -2347:1:2428 -2348:1:2429 -2349:1:2433 -2350:1:2434 -2351:1:2442 -2352:1:2443 -2353:1:2447 -2354:1:2448 -2355:1:2456 -2356:1:2461 -2357:1:2465 -2358:1:2466 -2359:1:2474 -2360:1:2475 -2361:1:2479 -2362:1:2480 -2363:1:2474 -2364:1:2475 -2365:1:2479 -2366:1:2480 -2367:1:2488 -2368:1:2493 -2369:1:2500 -2370:1:2501 -2371:1:2508 -2372:1:2513 -2373:1:2520 -2374:1:2521 -2375:1:2520 -2376:1:2521 -2377:1:2528 -2378:0:4029 -2379:1:11 -2380:0:4029 -2381:2:3507 -2382:2:3516 -2383:2:3517 -2384:2:3521 -2385:2:3522 -2386:2:3526 -2387:2:3527 -2388:2:3535 -2389:2:3540 -2390:2:3544 -2391:2:3545 -2392:2:3553 -2393:2:3554 -2394:2:3558 -2395:2:3559 -2396:2:3553 -2397:2:3554 -2398:2:3558 -2399:2:3559 -2400:2:3567 -2401:2:3574 -2402:2:3575 -2403:2:3579 -2404:2:3580 -2405:2:3587 -2406:2:3592 -2407:2:3599 -2408:2:3600 -2409:2:3599 -2410:2:3600 -2411:2:3607 -2412:2:3617 -2413:0:4029 -2414:2:2767 -2415:0:4029 -2416:2:3623 -2417:2:3632 -2418:2:3633 -2419:2:3637 -2420:2:3638 -2421:2:3642 -2422:2:3643 -2423:2:3651 -2424:2:3656 -2425:2:3660 -2426:2:3661 -2427:2:3669 -2428:2:3670 -2429:2:3674 -2430:2:3675 -2431:2:3669 -2432:2:3670 -2433:2:3674 -2434:2:3675 -2435:2:3683 -2436:2:3690 -2437:2:3691 -2438:2:3695 -2439:2:3696 -2440:2:3703 -2441:2:3708 -2442:2:3715 -2443:2:3716 -2444:2:3715 -2445:2:3716 -2446:2:3723 -2447:0:4029 -2448:2:2767 -2449:0:4029 -2450:1:2539 -2451:1:2540 -2452:1:2544 -2453:1:2545 -2454:1:2553 -2455:1:2554 -2456:1:2558 -2457:1:2559 -2458:1:2567 -2459:1:2572 -2460:1:2576 -2461:1:2577 -2462:1:2585 -2463:1:2586 -2464:1:2590 -2465:1:2591 -2466:1:2585 -2467:1:2586 -2468:1:2590 -2469:1:2591 -2470:1:2599 -2471:1:2604 -2472:1:2611 -2473:1:2612 -2474:1:2619 -2475:1:2624 -2476:1:2631 -2477:1:2632 -2478:1:2631 -2479:1:2632 -2480:1:2639 -2481:1:2648 -2482:1:2652 -2483:0:4029 -2484:1:11 -2485:0:4029 -2486:2:3507 -2487:2:3516 -2488:2:3517 -2489:2:3521 -2490:2:3522 -2491:2:3526 -2492:2:3527 -2493:2:3535 -2494:2:3540 -2495:2:3544 -2496:2:3545 -2497:2:3553 -2498:2:3554 -2499:2:3558 -2500:2:3559 -2501:2:3553 -2502:2:3554 -2503:2:3558 -2504:2:3559 -2505:2:3567 -2506:2:3574 -2507:2:3575 -2508:2:3579 -2509:2:3580 -2510:2:3587 -2511:2:3592 -2512:2:3599 -2513:2:3600 -2514:2:3599 -2515:2:3600 -2516:2:3607 -2517:2:3617 -2518:0:4029 -2519:2:2767 -2520:0:4029 -2521:2:3623 -2522:2:3632 -2523:2:3633 -2524:2:3637 -2525:2:3638 -2526:2:3642 -2527:2:3643 -2528:2:3651 -2529:2:3656 -2530:2:3660 -2531:2:3661 -2532:2:3669 -2533:2:3670 -2534:2:3674 -2535:2:3675 -2536:2:3669 -2537:2:3670 -2538:2:3674 -2539:2:3675 -2540:2:3683 -2541:2:3690 -2542:2:3691 -2543:2:3695 -2544:2:3696 -2545:2:3703 -2546:2:3708 -2547:2:3715 -2548:2:3716 -2549:2:3715 -2550:2:3716 -2551:2:3723 -2552:0:4029 -2553:2:2767 -2554:0:4029 -2555:1:2653 -2556:0:4029 -2557:1:2661 -2558:0:4029 -2559:1:2749 -2560:0:4029 -2561:1:9 -2562:0:4029 -2563:2:3507 -2564:2:3516 -2565:2:3517 -2566:2:3521 -2567:2:3522 -2568:2:3526 -2569:2:3527 -2570:2:3535 -2571:2:3540 -2572:2:3544 -2573:2:3545 -2574:2:3553 -2575:2:3554 -2576:2:3558 -2577:2:3559 -2578:2:3553 -2579:2:3554 -2580:2:3558 -2581:2:3559 -2582:2:3567 -2583:2:3574 -2584:2:3575 -2585:2:3579 -2586:2:3580 -2587:2:3587 -2588:2:3592 -2589:2:3599 -2590:2:3600 -2591:2:3599 -2592:2:3600 -2593:2:3607 -2594:2:3617 -2595:0:4029 -2596:2:2767 -2597:0:4029 -2598:2:3623 -2599:2:3632 -2600:2:3633 -2601:2:3637 -2602:2:3638 -2603:2:3642 -2604:2:3643 -2605:2:3651 -2606:2:3656 -2607:2:3660 -2608:2:3661 -2609:2:3669 -2610:2:3670 -2611:2:3674 -2612:2:3675 -2613:2:3669 -2614:2:3670 -2615:2:3674 -2616:2:3675 -2617:2:3683 -2618:2:3690 -2619:2:3691 -2620:2:3695 -2621:2:3696 -2622:2:3703 -2623:2:3708 -2624:2:3715 -2625:2:3716 -2626:2:3715 -2627:2:3716 -2628:2:3723 -2629:0:4029 -2630:2:2767 -2631:0:4029 -2632:1:10 -2633:0:4029 -2634:1:11 -2635:0:4029 -2636:2:3507 -2637:2:3516 -2638:2:3517 -2639:2:3521 -2640:2:3522 -2641:2:3526 -2642:2:3527 -2643:2:3535 -2644:2:3540 -2645:2:3544 -2646:2:3545 -2647:2:3553 -2648:2:3554 -2649:2:3558 -2650:2:3559 -2651:2:3553 -2652:2:3554 -2653:2:3558 -2654:2:3559 -2655:2:3567 -2656:2:3574 -2657:2:3575 -2658:2:3579 -2659:2:3580 -2660:2:3587 -2661:2:3592 -2662:2:3599 -2663:2:3600 -2664:2:3599 -2665:2:3600 -2666:2:3607 -2667:2:3617 -2668:0:4029 -2669:2:2767 -2670:0:4029 -2671:2:3623 -2672:2:3632 -2673:2:3633 -2674:2:3637 -2675:2:3638 -2676:2:3642 -2677:2:3643 -2678:2:3651 -2679:2:3656 -2680:2:3660 -2681:2:3661 -2682:2:3669 -2683:2:3670 -2684:2:3674 -2685:2:3675 -2686:2:3669 -2687:2:3670 -2688:2:3674 -2689:2:3675 -2690:2:3683 -2691:2:3690 -2692:2:3691 -2693:2:3695 -2694:2:3696 -2695:2:3703 -2696:2:3708 -2697:2:3715 -2698:2:3716 -2699:2:3715 -2700:2:3716 -2701:2:3723 -2702:0:4029 -2703:2:2767 -2704:0:4029 -2705:1:12 -2706:1:13 -2707:1:17 -2708:1:18 -2709:1:26 -2710:1:27 -2711:1:28 -2712:1:40 -2713:1:45 -2714:1:49 -2715:1:50 -2716:1:58 -2717:1:59 -2718:1:63 -2719:1:64 -2720:1:58 -2721:1:59 -2722:1:63 -2723:1:64 -2724:1:72 -2725:1:77 -2726:1:84 -2727:1:85 -2728:1:92 -2729:1:97 -2730:1:104 -2731:1:105 -2732:1:104 -2733:1:105 -2734:1:112 -2735:0:4029 -2736:1:11 -2737:0:4029 -2738:1:123 -2739:1:124 -2740:0:4029 -2741:1:11 -2742:0:4029 -2743:1:130 -2744:1:131 -2745:1:135 -2746:1:136 -2747:1:144 -2748:1:145 -2749:1:149 -2750:1:150 -2751:1:158 -2752:1:163 -2753:1:167 -2754:1:168 -2755:1:176 -2756:1:177 -2757:1:181 -2758:1:182 -2759:1:176 -2760:1:177 -2761:1:181 -2762:1:182 -2763:1:190 -2764:1:195 -2765:1:202 -2766:1:203 -2767:1:210 -2768:1:215 -2769:1:222 -2770:1:223 -2771:1:222 -2772:1:223 -2773:1:230 -2774:0:4029 -2775:1:11 -2776:0:4029 -2777:1:241 -2778:1:242 -2779:1:246 -2780:1:247 -2781:1:255 -2782:1:256 -2783:1:260 -2784:1:261 -2785:1:269 -2786:1:274 -2787:1:278 -2788:1:279 -2789:1:287 -2790:1:288 -2791:1:292 -2792:1:293 -2793:1:287 -2794:1:288 -2795:1:292 -2796:1:293 -2797:1:301 -2798:1:306 -2799:1:313 -2800:1:314 -2801:1:321 -2802:1:326 -2803:1:333 -2804:1:334 -2805:1:333 -2806:1:334 -2807:1:341 -2808:1:350 -2809:0:4029 -2810:1:11 -2811:0:4029 -2812:1:468 -2813:1:472 -2814:1:473 -2815:1:477 -2816:1:478 -2817:1:486 -2818:1:494 -2819:1:495 -2820:1:499 -2821:1:503 -2822:1:504 -2823:1:499 -2824:1:503 -2825:1:504 -2826:1:508 -2827:1:515 -2828:1:522 -2829:1:523 -2830:1:530 -2831:1:535 -2832:1:542 -2833:1:543 -2834:1:542 -2835:1:543 -2836:1:550 -2837:0:4029 -2838:1:11 -2839:0:4029 -2840:2:3507 -2841:2:3516 -2842:2:3517 -2843:2:3521 -2844:2:3522 -2845:2:3526 -2846:2:3527 -2847:2:3535 -2848:2:3540 -2849:2:3544 -2850:2:3545 -2851:2:3553 -2852:2:3554 -2853:2:3558 -2854:2:3559 -2855:2:3553 -2856:2:3554 -2857:2:3558 -2858:2:3559 -2859:2:3567 -2860:2:3574 -2861:2:3575 -2862:2:3579 -2863:2:3580 -2864:2:3587 -2865:2:3592 -2866:2:3599 -2867:2:3600 -2868:2:3599 -2869:2:3600 -2870:2:3607 -2871:2:3617 -2872:0:4029 -2873:2:2767 -2874:0:4029 -2875:2:3623 -2876:2:3632 -2877:2:3633 -2878:2:3637 -2879:2:3638 -2880:2:3642 -2881:2:3643 -2882:2:3651 -2883:2:3656 -2884:2:3660 -2885:2:3661 -2886:2:3669 -2887:2:3670 -2888:2:3674 -2889:2:3675 -2890:2:3669 -2891:2:3670 -2892:2:3674 -2893:2:3675 -2894:2:3683 -2895:2:3690 -2896:2:3691 -2897:2:3695 -2898:2:3696 -2899:2:3703 -2900:2:3708 -2901:2:3715 -2902:2:3716 -2903:2:3715 -2904:2:3716 -2905:2:3723 -2906:0:4029 -2907:2:2767 -2908:0:4029 -2909:1:678 -2910:1:679 -2911:1:683 -2912:1:684 -2913:1:692 -2914:1:693 -2915:1:697 -2916:1:698 -2917:1:706 -2918:1:711 -2919:1:715 -2920:1:716 -2921:1:724 -2922:1:725 -2923:1:729 -2924:1:730 -2925:1:724 -2926:1:725 -2927:1:729 -2928:1:730 -2929:1:738 -2930:1:743 -2931:1:750 -2932:1:751 -2933:1:758 -2934:1:763 -2935:1:770 -2936:1:771 -2937:1:770 -2938:1:771 -2939:1:778 -2940:0:4029 -2941:1:11 -2942:0:4029 -2943:2:3507 -2944:2:3516 -2945:2:3517 -2946:2:3521 -2947:2:3522 -2948:2:3526 -2949:2:3527 -2950:2:3535 -2951:2:3540 -2952:2:3544 -2953:2:3545 -2954:2:3553 -2955:2:3554 -2956:2:3558 -2957:2:3559 -2958:2:3553 -2959:2:3554 -2960:2:3558 -2961:2:3559 -2962:2:3567 -2963:2:3574 -2964:2:3575 -2965:2:3579 -2966:2:3580 -2967:2:3587 -2968:2:3592 -2969:2:3599 -2970:2:3600 -2971:2:3599 -2972:2:3600 -2973:2:3607 -2974:2:3617 -2975:0:4029 -2976:2:2767 -2977:0:4029 -2978:2:3623 -2979:2:3632 -2980:2:3633 -2981:2:3637 -2982:2:3638 -2983:2:3642 -2984:2:3643 -2985:2:3651 -2986:2:3656 -2987:2:3660 -2988:2:3661 -2989:2:3669 -2990:2:3670 -2991:2:3674 -2992:2:3675 -2993:2:3669 -2994:2:3670 -2995:2:3674 -2996:2:3675 -2997:2:3683 -2998:2:3690 -2999:2:3691 -3000:2:3695 -3001:2:3696 -3002:2:3703 -3003:2:3708 -3004:2:3715 -3005:2:3716 -3006:2:3715 -3007:2:3716 -3008:2:3723 -3009:0:4029 -3010:2:2767 -3011:0:4029 -3012:1:560 -3013:1:561 -3014:1:565 -3015:1:566 -3016:1:574 -3017:1:575 -3018:1:579 -3019:1:580 -3020:1:588 -3021:1:593 -3022:1:597 -3023:1:598 -3024:1:606 -3025:1:607 -3026:1:611 -3027:1:612 -3028:1:606 -3029:1:607 -3030:1:611 -3031:1:612 -3032:1:620 -3033:1:625 -3034:1:632 -3035:1:633 -3036:1:640 -3037:1:645 -3038:1:652 -3039:1:653 -3040:1:652 -3041:1:653 -3042:1:660 -3043:0:4029 -3044:1:11 -3045:0:4029 -3046:2:3507 -3047:2:3516 -3048:2:3517 -3049:2:3521 -3050:2:3522 -3051:2:3526 -3052:2:3527 -3053:2:3535 -3054:2:3540 -3055:2:3544 -3056:2:3545 -3057:2:3553 -3058:2:3554 -3059:2:3558 -3060:2:3559 -3061:2:3553 -3062:2:3554 -3063:2:3558 -3064:2:3559 -3065:2:3567 -3066:2:3574 -3067:2:3575 -3068:2:3579 -3069:2:3580 -3070:2:3587 -3071:2:3592 -3072:2:3599 -3073:2:3600 -3074:2:3599 -3075:2:3600 -3076:2:3607 -3077:2:3617 -3078:0:4029 -3079:2:2767 -3080:0:4029 -3081:2:3623 -3082:2:3632 -3083:2:3633 -3084:2:3637 -3085:2:3638 -3086:2:3642 -3087:2:3643 -3088:2:3651 -3089:2:3656 -3090:2:3660 -3091:2:3661 -3092:2:3669 -3093:2:3670 -3094:2:3674 -3095:2:3675 -3096:2:3669 -3097:2:3670 -3098:2:3674 -3099:2:3675 -3100:2:3683 -3101:2:3690 -3102:2:3691 -3103:2:3695 -3104:2:3696 -3105:2:3703 -3106:2:3708 -3107:2:3715 -3108:2:3716 -3109:2:3715 -3110:2:3716 -3111:2:3723 -3112:0:4029 -3113:2:2767 -3114:0:4029 -3115:1:1016 -3116:1:1017 -3117:1:1021 -3118:1:1022 -3119:1:1030 -3120:1:1031 -3121:1:1035 -3122:1:1036 -3123:1:1044 -3124:1:1049 -3125:1:1053 -3126:1:1054 -3127:1:1062 -3128:1:1063 -3129:1:1067 -3130:1:1068 -3131:1:1062 -3132:1:1063 -3133:1:1067 -3134:1:1068 -3135:1:1076 -3136:1:1081 -3137:1:1088 -3138:1:1089 -3139:1:1096 -3140:1:1101 -3141:1:1108 -3142:1:1109 -3143:1:1108 -3144:1:1109 -3145:1:1116 -3146:0:4029 -3147:1:11 -3148:0:4029 -3149:2:3507 -3150:2:3516 -3151:2:3517 -3152:2:3521 -3153:2:3522 -3154:2:3526 -3155:2:3527 -3156:2:3535 -3157:2:3540 -3158:2:3544 -3159:2:3545 -3160:2:3553 -3161:2:3554 -3162:2:3558 -3163:2:3559 -3164:2:3553 -3165:2:3554 -3166:2:3558 -3167:2:3559 -3168:2:3567 -3169:2:3574 -3170:2:3575 -3171:2:3579 -3172:2:3580 -3173:2:3587 -3174:2:3592 -3175:2:3599 -3176:2:3600 -3177:2:3599 -3178:2:3600 -3179:2:3607 -3180:2:3617 -3181:0:4029 -3182:2:2767 -3183:0:4029 -3184:2:3623 -3185:2:3632 -3186:2:3633 -3187:2:3637 -3188:2:3638 -3189:2:3642 -3190:2:3643 -3191:2:3651 -3192:2:3656 -3193:2:3660 -3194:2:3661 -3195:2:3669 -3196:2:3670 -3197:2:3674 -3198:2:3675 -3199:2:3669 -3200:2:3670 -3201:2:3674 -3202:2:3675 -3203:2:3683 -3204:2:3690 -3205:2:3691 -3206:2:3695 -3207:2:3696 -3208:2:3703 -3209:2:3708 -3210:2:3715 -3211:2:3716 -3212:2:3715 -3213:2:3716 -3214:2:3723 -3215:0:4029 -3216:2:2767 -3217:0:4029 -3218:1:671 -3219:1:674 -3220:1:675 -3221:0:4029 -3222:1:11 -3223:0:4029 -3224:2:3507 -3225:2:3516 -3226:2:3517 -3227:2:3521 -3228:2:3522 -3229:2:3526 -3230:2:3527 -3231:2:3535 -3232:2:3540 -3233:2:3544 -3234:2:3545 -3235:2:3553 -3236:2:3554 -3237:2:3558 -3238:2:3559 -3239:2:3553 -3240:2:3554 -3241:2:3558 -3242:2:3559 -3243:2:3567 -3244:2:3574 -3245:2:3575 -3246:2:3579 -3247:2:3580 -3248:2:3587 -3249:2:3592 -3250:2:3599 -3251:2:3600 -3252:2:3599 -3253:2:3600 -3254:2:3607 -3255:2:3617 -3256:0:4029 -3257:2:2767 -3258:0:4029 -3259:2:3623 -3260:2:3632 -3261:2:3633 -3262:2:3637 -3263:2:3638 -3264:2:3642 -3265:2:3643 -3266:2:3651 -3267:2:3656 -3268:2:3660 -3269:2:3661 -3270:2:3669 -3271:2:3670 -3272:2:3674 -3273:2:3675 -3274:2:3669 -3275:2:3670 -3276:2:3674 -3277:2:3675 -3278:2:3683 -3279:2:3690 -3280:2:3691 -3281:2:3695 -3282:2:3696 -3283:2:3703 -3284:2:3708 -3285:2:3715 -3286:2:3716 -3287:2:3715 -3288:2:3716 -3289:2:3723 -3290:0:4029 -3291:2:2767 -3292:0:4029 -3293:1:902 -3294:1:903 -3295:1:907 -3296:1:908 -3297:1:916 -3298:1:917 -3299:1:921 -3300:1:922 -3301:1:930 -3302:1:935 -3303:1:939 -3304:1:940 -3305:1:948 -3306:1:949 -3307:1:953 -3308:1:954 -3309:1:948 -3310:1:949 -3311:1:953 -3312:1:954 -3313:1:962 -3314:1:967 -3315:1:974 -3316:1:975 -3317:1:982 -3318:1:987 -3319:1:994 -3320:1:995 -3321:1:994 -3322:1:995 -3323:1:1002 -3324:1:1011 -3325:1:1015 -3326:0:4029 -3327:1:11 -3328:0:4029 -3329:2:3507 -3330:2:3516 -3331:2:3517 -3332:2:3521 -3333:2:3522 -3334:2:3526 -3335:2:3527 -3336:2:3535 -3337:2:3540 -3338:2:3544 -3339:2:3545 -3340:2:3553 -3341:2:3554 -3342:2:3558 -3343:2:3559 -3344:2:3553 -3345:2:3554 -3346:2:3558 -3347:2:3559 -3348:2:3567 -3349:2:3574 -3350:2:3575 -3351:2:3579 -3352:2:3580 -3353:2:3587 -3354:2:3592 -3355:2:3599 -3356:2:3600 -3357:2:3599 -3358:2:3600 -3359:2:3607 -3360:2:3617 -3361:0:4029 -3362:2:2767 -3363:0:4029 -3364:2:3623 -3365:2:3632 -3366:2:3633 -3367:2:3637 -3368:2:3638 -3369:2:3642 -3370:2:3643 -3371:2:3651 -3372:2:3656 -3373:2:3660 -3374:2:3661 -3375:2:3669 -3376:2:3670 -3377:2:3674 -3378:2:3675 -3379:2:3669 -3380:2:3670 -3381:2:3674 -3382:2:3675 -3383:2:3683 -3384:2:3690 -3385:2:3691 -3386:2:3695 -3387:2:3696 -3388:2:3703 -3389:2:3708 -3390:2:3715 -3391:2:3716 -3392:2:3715 -3393:2:3716 -3394:2:3723 -3395:0:4029 -3396:2:2767 -3397:0:4029 -3398:1:1127 -3399:0:4029 -3400:2:3507 -3401:2:3516 -3402:2:3517 -3403:2:3521 -3404:2:3522 -3405:2:3526 -3406:2:3527 -3407:2:3535 -3408:2:3540 -3409:2:3544 -3410:2:3545 -3411:2:3553 -3412:2:3554 -3413:2:3558 -3414:2:3559 -3415:2:3553 -3416:2:3554 -3417:2:3558 -3418:2:3559 -3419:2:3567 -3420:2:3574 -3421:2:3575 -3422:2:3579 -3423:2:3580 -3424:2:3587 -3425:2:3592 -3426:2:3599 -3427:2:3600 -3428:2:3599 -3429:2:3600 -3430:2:3607 -3431:2:3617 -3432:0:4029 -3433:2:2767 -3434:0:4029 -3435:2:3623 -3436:2:3632 -3437:2:3633 -3438:2:3637 -3439:2:3638 -3440:2:3642 -3441:2:3643 -3442:2:3651 -3443:2:3656 -3444:2:3660 -3445:2:3661 -3446:2:3669 -3447:2:3670 -3448:2:3674 -3449:2:3675 -3450:2:3669 -3451:2:3670 -3452:2:3674 -3453:2:3675 -3454:2:3683 -3455:2:3690 -3456:2:3691 -3457:2:3695 -3458:2:3696 -3459:2:3703 -3460:2:3708 -3461:2:3715 -3462:2:3716 -3463:2:3715 -3464:2:3716 -3465:2:3723 -3466:0:4029 -3467:2:2767 -3468:0:4029 -3469:1:2663 -3470:1:2670 -3471:1:2673 -3472:1:2674 -3473:1:2678 -3474:1:2683 -3475:1:2690 -3476:1:2691 -3477:1:2690 -3478:1:2691 -3479:1:2698 -3480:1:2702 -3481:0:4029 -3482:2:3507 -3483:2:3516 -3484:2:3517 -3485:2:3521 -3486:2:3522 -3487:2:3526 -3488:2:3527 -3489:2:3535 -3490:2:3540 -3491:2:3544 -3492:2:3545 -3493:2:3553 -3494:2:3554 -3495:2:3558 -3496:2:3559 -3497:2:3553 -3498:2:3554 -3499:2:3558 -3500:2:3559 -3501:2:3567 -3502:2:3574 -3503:2:3575 -3504:2:3579 -3505:2:3580 -3506:2:3587 -3507:2:3592 -3508:2:3599 -3509:2:3600 -3510:2:3599 -3511:2:3600 -3512:2:3607 -3513:2:3617 -3514:0:4029 -3515:2:2767 -3516:0:4029 -3517:2:3623 -3518:2:3632 -3519:2:3633 -3520:2:3637 -3521:2:3638 -3522:2:3642 -3523:2:3643 -3524:2:3651 -3525:2:3656 -3526:2:3660 -3527:2:3661 -3528:2:3669 -3529:2:3670 -3530:2:3674 -3531:2:3675 -3532:2:3669 -3533:2:3670 -3534:2:3674 -3535:2:3675 -3536:2:3683 -3537:2:3690 -3538:2:3691 -3539:2:3695 -3540:2:3696 -3541:2:3703 -3542:2:3708 -3543:2:3715 -3544:2:3716 -3545:2:3715 -3546:2:3716 -3547:2:3723 -3548:0:4029 -3549:2:2767 -3550:0:4029 -3551:1:1129 -3552:1:1130 -3553:0:4029 -3554:1:11 -3555:0:4029 -3556:2:3507 -3557:2:3516 -3558:2:3517 -3559:2:3521 -3560:2:3522 -3561:2:3526 -3562:2:3527 -3563:2:3535 -3564:2:3540 -3565:2:3544 -3566:2:3545 -3567:2:3553 -3568:2:3554 -3569:2:3558 -3570:2:3559 -3571:2:3553 -3572:2:3554 -3573:2:3558 -3574:2:3559 -3575:2:3567 -3576:2:3574 -3577:2:3575 -3578:2:3579 -3579:2:3580 -3580:2:3587 -3581:2:3592 -3582:2:3599 -3583:2:3600 -3584:2:3599 -3585:2:3600 -3586:2:3607 -3587:2:3617 -3588:0:4029 -3589:2:2767 -3590:0:4029 -3591:2:3623 -3592:2:3632 -3593:2:3633 -3594:2:3637 -3595:2:3638 -3596:2:3642 -3597:2:3643 -3598:2:3651 -3599:2:3656 -3600:2:3660 -3601:2:3661 -3602:2:3669 -3603:2:3670 -3604:2:3674 -3605:2:3675 -3606:2:3669 -3607:2:3670 -3608:2:3674 -3609:2:3675 -3610:2:3683 -3611:2:3690 -3612:2:3691 -3613:2:3695 -3614:2:3696 -3615:2:3703 -3616:2:3708 -3617:2:3715 -3618:2:3716 -3619:2:3715 -3620:2:3716 -3621:2:3723 -3622:0:4029 -3623:2:2767 -3624:0:4029 -3625:1:1131 -3626:1:1132 -3627:1:1136 -3628:1:1137 -3629:1:1145 -3630:1:1146 -3631:1:1147 -3632:1:1159 -3633:1:1164 -3634:1:1168 -3635:1:1169 -3636:1:1177 -3637:1:1178 -3638:1:1182 -3639:1:1183 -3640:1:1177 -3641:1:1178 -3642:1:1182 -3643:1:1183 -3644:1:1191 -3645:1:1196 -3646:1:1203 -3647:1:1204 -3648:1:1211 -3649:1:1216 -3650:1:1223 -3651:1:1224 -3652:1:1223 -3653:1:1224 -3654:1:1231 -3655:0:4029 -3656:1:11 -3657:0:4029 -3658:1:1242 -3659:1:1243 -3660:1:1247 -3661:1:1248 -3662:1:1256 -3663:1:1257 -3664:1:1261 -3665:1:1262 -3666:1:1270 -3667:1:1275 -3668:1:1279 -3669:1:1280 -3670:1:1288 -3671:1:1289 -3672:1:1293 -3673:1:1294 -3674:1:1288 -3675:1:1289 -3676:1:1293 -3677:1:1294 -3678:1:1302 -3679:1:1307 -3680:1:1314 -3681:1:1315 -3682:1:1322 -3683:1:1327 -3684:1:1334 -3685:1:1335 -3686:1:1334 -3687:1:1335 -3688:1:1342 -3689:1:1351 -3690:1:1355 -3691:0:4029 -3692:1:11 -3693:0:4029 -3694:1:1356 -3695:1:1360 -3696:1:1361 -3697:1:1365 -3698:1:1366 -3699:1:1374 -3700:1:1382 -3701:1:1383 -3702:1:1387 -3703:1:1391 -3704:1:1392 -3705:1:1387 -3706:1:1391 -3707:1:1392 -3708:1:1396 -3709:1:1403 -3710:1:1410 -3711:1:1411 -3712:1:1418 -3713:1:1423 -3714:1:1430 -3715:1:1431 -3716:1:1430 -3717:1:1431 -3718:1:1438 -3719:0:4029 -3720:1:11 -3721:0:4029 -3722:1:1448 -3723:1:1449 -3724:1:1453 -3725:1:1454 -3726:1:1462 -3727:1:1463 -3728:1:1467 -3729:1:1468 -3730:1:1476 -3731:1:1481 -3732:1:1485 -3733:1:1486 -3734:1:1494 -3735:1:1495 -3736:1:1499 -3737:1:1500 -3738:1:1494 -3739:1:1495 -3740:1:1499 -3741:1:1500 -3742:1:1508 -3743:1:1513 -3744:1:1520 -3745:1:1521 -3746:1:1528 -3747:1:1533 -3748:1:1540 -3749:1:1541 -3750:1:1540 -3751:1:1541 -3752:1:1548 -3753:0:4029 -3754:2:3507 -3755:2:3516 -3756:2:3517 -3757:2:3521 -3758:2:3522 -3759:2:3526 -3760:2:3527 -3761:2:3535 -3762:2:3540 -3763:2:3544 -3764:2:3545 -3765:2:3553 -3766:2:3554 -3767:2:3558 -3768:2:3559 -3769:2:3553 -3770:2:3554 -3771:2:3558 -3772:2:3559 -3773:2:3567 -3774:2:3574 -3775:2:3575 -3776:2:3579 -3777:2:3580 -3778:2:3587 -3779:2:3592 -3780:2:3599 -3781:2:3600 -3782:2:3599 -3783:2:3600 -3784:2:3607 -3785:2:3617 -3786:0:4029 -3787:2:2767 -3788:0:4029 -3789:1:11 -3790:0:4029 -3791:1:1559 -3792:1:1560 -3793:1:1564 -3794:1:1565 -3795:1:1573 -3796:1:1574 -3797:1:1578 -3798:1:1579 -3799:1:1587 -3800:1:1592 -3801:1:1596 -3802:1:1597 -3803:1:1605 -3804:1:1606 -3805:1:1610 -3806:1:1611 -3807:1:1605 -3808:1:1606 -3809:1:1610 -3810:1:1611 -3811:1:1619 -3812:1:1624 -3813:1:1631 -3814:1:1632 -3815:1:1639 -3816:1:1644 -3817:1:1651 -3818:1:1652 -3819:1:1651 -3820:1:1652 -3821:1:1659 -3822:1:1668 -3823:1:1672 -3824:0:4029 -3825:1:11 -3826:0:4029 -3827:1:1673 -3828:1:1674 -3829:1:1678 -3830:1:1679 -3831:1:1687 -3832:1:1688 -3833:1:1689 -3834:1:1701 -3835:1:1706 -3836:1:1710 -3837:1:1711 -3838:1:1719 -3839:1:1720 -3840:1:1724 -3841:1:1725 -3842:1:1719 -3843:1:1720 -3844:1:1724 -3845:1:1725 -3846:1:1733 -3847:1:1738 -3848:1:1745 -3849:1:1746 -3850:1:1753 -3851:1:1758 -3852:1:1765 -3853:1:1766 -3854:1:1765 -3855:1:1766 -3856:1:1773 -3857:0:4029 -3858:1:11 -3859:0:4029 -3860:2:3623 -3861:2:3632 -3862:2:3633 -3863:2:3637 -3864:2:3638 -3865:2:3642 -3866:2:3643 -3867:2:3651 -3868:2:3656 -3869:2:3660 -3870:2:3661 -3871:2:3669 -3872:2:3670 -3873:2:3674 -3874:2:3675 -3875:2:3669 -3876:2:3670 -3877:2:3674 -3878:2:3675 -3879:2:3683 -3880:2:3690 -3881:2:3691 -3882:2:3695 -3883:2:3696 -3884:2:3703 -3885:2:3708 -3886:2:3715 -3887:2:3716 -3888:2:3715 -3889:2:3716 -3890:2:3723 -3891:0:4029 -3892:2:2767 -3893:0:4029 -3894:1:1784 -3895:1:1785 -3896:0:4029 -3897:1:11 -3898:0:4029 -3899:1:1791 -3900:1:1792 -3901:1:1796 -3902:1:1797 -3903:1:1805 -3904:1:1806 -3905:1:1810 -3906:1:1811 -3907:1:1819 -3908:1:1824 -3909:1:1828 -3910:1:1829 -3911:1:1837 -3912:1:1838 -3913:1:1842 -3914:1:1843 -3915:1:1837 -3916:1:1838 -3917:1:1842 -3918:1:1843 -3919:1:1851 -3920:1:1856 -3921:1:1863 -3922:1:1864 -3923:1:1871 -3924:1:1876 -3925:1:1883 -3926:1:1884 -3927:1:1883 -3928:1:1884 -3929:1:1891 -3930:0:4029 -3931:1:11 -3932:0:4029 -3933:1:1902 -3934:1:1903 -3935:1:1907 -3936:1:1908 -3937:1:1916 -3938:1:1917 -3939:1:1921 -3940:1:1922 -3941:1:1930 -3942:1:1935 -3943:1:1939 -3944:1:1940 -3945:1:1948 -3946:1:1949 -3947:1:1953 -3948:1:1954 -3949:1:1948 -3950:1:1949 -3951:1:1953 -3952:1:1954 -3953:1:1962 -3954:1:1967 -3955:1:1974 -3956:1:1975 -3957:1:1982 -3958:1:1987 -3959:1:1994 -3960:1:1995 -3961:1:1994 -3962:1:1995 -3963:1:2002 -3964:1:2011 -3965:0:4029 -3966:1:11 -3967:0:4029 -3968:1:2129 -3969:1:2133 -3970:1:2134 -3971:1:2138 -3972:1:2139 -3973:1:2147 -3974:1:2155 -3975:1:2156 -3976:1:2160 -3977:1:2164 -3978:1:2165 -3979:1:2160 -3980:1:2164 -3981:1:2165 -3982:1:2169 -3983:1:2176 -3984:1:2183 -3985:1:2184 -3986:1:2191 -3987:1:2196 -3988:1:2203 -3989:1:2204 -3990:1:2203 -3991:1:2204 -3992:1:2211 -3993:0:4029 -3994:1:11 -3995:0:4029 -3996:1:2221 -3997:1:2222 -3998:1:2226 -3999:1:2227 -4000:1:2235 -4001:1:2236 -4002:1:2240 -4003:1:2241 -4004:1:2249 -4005:1:2254 -4006:1:2258 -4007:1:2259 -4008:1:2267 -4009:1:2268 -4010:1:2272 -4011:1:2273 -4012:1:2267 -4013:1:2268 -4014:1:2272 -4015:1:2273 -4016:1:2281 -4017:1:2286 -4018:1:2293 -4019:1:2294 -4020:1:2301 -4021:1:2306 -4022:1:2313 -4023:1:2314 -4024:1:2313 -4025:1:2314 -4026:1:2321 -4027:0:4029 -4028:1:11 -4029:0:4029 -4030:1:2332 -4031:0:4029 -4032:1:2706 -4033:1:2713 -4034:1:2714 -4035:1:2721 -4036:1:2726 -4037:1:2733 -4038:1:2734 -4039:1:2733 -4040:1:2734 -4041:1:2741 -4042:1:2745 -4043:0:4029 -4044:1:2334 -4045:1:2335 -4046:0:4029 -4047:1:11 -4048:0:4029 -4049:1:2336 -4050:1:2340 -4051:1:2341 -4052:1:2345 -4053:1:2349 -4054:1:2350 -4055:1:2354 -4056:1:2362 -4057:1:2363 -4058:1:2367 -4059:1:2371 -4060:1:2372 -4061:1:2367 -4062:1:2371 -4063:1:2372 -4064:1:2376 -4065:1:2383 -4066:1:2390 -4067:1:2391 -4068:1:2398 -4069:1:2403 -4070:1:2410 -4071:1:2411 -4072:1:2410 -4073:1:2411 -4074:1:2418 -4075:0:4029 -4076:1:11 -4077:0:4029 -4078:1:2428 -4079:1:2429 -4080:1:2433 -4081:1:2434 -4082:1:2442 -4083:1:2443 -4084:1:2447 -4085:1:2448 -4086:1:2456 -4087:1:2461 -4088:1:2465 -4089:1:2466 -4090:1:2474 -4091:1:2475 -4092:1:2479 -4093:1:2480 -4094:1:2474 -4095:1:2475 -4096:1:2479 -4097:1:2480 -4098:1:2488 -4099:1:2493 -4100:1:2500 -4101:1:2501 -4102:1:2508 -4103:1:2513 -4104:1:2520 -4105:1:2521 -4106:1:2520 -4107:1:2521 -4108:1:2528 -4109:0:4029 -4110:1:11 -4111:0:4029 -4112:1:2539 -4113:1:2540 -4114:1:2544 -4115:1:2545 -4116:1:2553 -4117:1:2554 -4118:1:2558 -4119:1:2559 -4120:1:2567 -4121:1:2572 -4122:1:2576 -4123:1:2577 -4124:1:2585 -4125:1:2586 -4126:1:2590 -4127:1:2591 -4128:1:2585 -4129:1:2586 -4130:1:2590 -4131:1:2591 -4132:1:2599 -4133:1:2604 -4134:1:2611 -4135:1:2612 -4136:1:2619 -4137:1:2624 -4138:1:2631 -4139:1:2632 -4140:1:2631 -4141:1:2632 -4142:1:2639 -4143:1:2648 -4144:1:2652 -4145:0:4029 -4146:1:11 -4147:0:4029 -4148:1:2653 -4149:0:4029 -4150:1:2661 -4151:0:4029 -4152:1:2749 -4153:0:4029 -4154:1:9 -4155:0:4029 -4156:1:10 -4157:0:4029 -4158:1:11 -4159:0:4029 -4160:1:12 -4161:1:13 -4162:1:17 -4163:1:18 -4164:1:26 -4165:1:27 -4166:1:28 -4167:1:40 -4168:1:45 -4169:1:49 -4170:1:50 -4171:1:58 -4172:1:59 -4173:1:63 -4174:1:64 -4175:1:58 -4176:1:59 -4177:1:63 -4178:1:64 -4179:1:72 -4180:1:77 -4181:1:84 -4182:1:85 -4183:1:92 -4184:1:97 -4185:1:104 -4186:1:105 -4187:1:104 -4188:1:105 -4189:1:112 -4190:0:4029 -4191:1:11 -4192:0:4029 -4193:1:123 -4194:1:124 -4195:0:4029 -4196:1:11 -4197:0:4029 -4198:1:130 -4199:1:131 -4200:1:135 -4201:1:136 -4202:1:144 -4203:1:145 -4204:1:149 -4205:1:150 -4206:1:158 -4207:1:163 -4208:1:167 -4209:1:168 -4210:1:176 -4211:1:177 -4212:1:181 -4213:1:182 -4214:1:176 -4215:1:177 -4216:1:181 -4217:1:182 -4218:1:190 -4219:1:195 -4220:1:202 -4221:1:203 -4222:1:210 -4223:1:215 -4224:1:222 -4225:1:223 -4226:1:222 -4227:1:223 -4228:1:230 -4229:0:4029 -4230:1:11 -4231:0:4029 -4232:1:241 -4233:1:242 -4234:1:246 -4235:1:247 -4236:1:255 -4237:1:256 -4238:1:260 -4239:1:261 -4240:1:269 -4241:1:274 -4242:1:278 -4243:1:279 -4244:1:287 -4245:1:288 -4246:1:292 -4247:1:293 -4248:1:287 -4249:1:288 -4250:1:292 -4251:1:293 -4252:1:301 -4253:1:306 -4254:1:313 -4255:1:314 -4256:1:321 -4257:1:326 -4258:1:333 -4259:1:334 -4260:1:333 -4261:1:334 -4262:1:341 -4263:1:350 -4264:0:4029 -4265:1:11 -4266:0:4029 -4267:1:468 -4268:1:472 -4269:1:473 -4270:1:477 -4271:1:478 -4272:1:486 -4273:1:494 -4274:1:495 -4275:1:499 -4276:1:503 -4277:1:504 -4278:1:499 -4279:1:503 -4280:1:504 -4281:1:508 -4282:1:515 -4283:1:522 -4284:1:523 -4285:1:530 -4286:1:535 -4287:1:542 -4288:1:543 -4289:1:542 -4290:1:543 -4291:1:550 -4292:0:4029 -4293:1:11 -4294:0:4029 -4295:1:560 -4296:1:561 -4297:1:565 -4298:1:566 -4299:1:574 -4300:1:575 -4301:1:579 -4302:1:580 -4303:1:588 -4304:1:593 -4305:1:597 -4306:1:598 -4307:1:606 -4308:1:607 -4309:1:611 -4310:1:612 -4311:1:606 -4312:1:607 -4313:1:611 -4314:1:612 -4315:1:620 -4316:1:625 -4317:1:632 -4318:1:633 -4319:1:640 -4320:1:645 -4321:1:652 -4322:1:653 -4323:1:652 -4324:1:653 -4325:1:660 -4326:0:4029 -4327:1:11 -4328:0:4029 -4329:1:671 -4330:1:674 -4331:1:675 -4332:0:4029 -4333:1:11 -4334:0:4029 -4335:1:678 -4336:1:679 -4337:1:683 -4338:1:684 -4339:1:692 -4340:1:693 -4341:1:697 -4342:1:698 -4343:1:706 -4344:1:711 -4345:1:715 -4346:1:716 -4347:1:724 -4348:1:725 -4349:1:729 -4350:1:730 -4351:1:724 -4352:1:725 -4353:1:729 -4354:1:730 -4355:1:738 -4356:1:743 -4357:1:750 -4358:1:751 -4359:1:758 -4360:1:763 -4361:1:770 -4362:1:771 -4363:1:770 -4364:1:771 -4365:1:778 -4366:0:4029 -4367:1:11 -4368:0:4029 -4369:1:902 -4370:1:903 -4371:1:907 -4372:1:908 -4373:1:916 -4374:1:917 -4375:1:921 -4376:1:922 -4377:1:930 -4378:1:935 -4379:1:939 -4380:1:940 -4381:1:948 -4382:1:949 -4383:1:953 -4384:1:954 -4385:1:948 -4386:1:949 -4387:1:953 -4388:1:954 -4389:1:962 -4390:1:967 -4391:1:974 -4392:1:975 -4393:1:982 -4394:1:987 -4395:1:994 -4396:1:995 -4397:1:994 -4398:1:995 -4399:1:1002 -4400:1:1011 -4401:1:1015 -4402:0:4029 -4403:1:11 -4404:0:4029 -4405:1:1016 -4406:1:1017 -4407:1:1021 -4408:1:1022 -4409:1:1030 -4410:1:1031 -4411:1:1032 -4412:1:1044 -4413:1:1049 -4414:1:1053 -4415:1:1054 -4416:1:1062 -4417:1:1063 -4418:1:1067 -4419:1:1068 -4420:1:1062 -4421:1:1063 -4422:1:1067 -4423:1:1068 -4424:1:1076 -4425:1:1081 -4426:1:1088 -4427:1:1089 -4428:1:1096 -4429:1:1101 -4430:1:1108 -4431:1:1109 -4432:1:1108 -4433:1:1109 -4434:1:1116 -4435:0:4029 -4436:1:11 -4437:0:4029 -4438:1:1127 -4439:0:4029 -4440:1:2663 -4441:1:2670 -4442:1:2671 -4443:1:2678 -4444:1:2683 -4445:1:2690 -4446:1:2691 -4447:1:2690 -4448:1:2691 -4449:1:2698 -4450:1:2702 -4451:0:4029 -4452:1:1129 -4453:1:1130 -4454:0:4029 -4455:1:11 -4456:0:4029 -4457:1:1131 -4458:1:1132 -4459:1:1136 -4460:1:1137 -4461:1:1145 -4462:1:1146 -4463:1:1150 -4464:1:1151 -4465:1:1159 -4466:1:1164 -4467:1:1168 -4468:1:1169 -4469:1:1177 -4470:1:1178 -4471:1:1182 -4472:1:1183 -4473:1:1177 -4474:1:1178 -4475:1:1182 -4476:1:1183 -4477:1:1191 -4478:1:1196 -4479:1:1203 -4480:1:1204 -4481:1:1211 -4482:1:1216 -4483:1:1223 -4484:1:1224 -4485:1:1223 -4486:1:1224 -4487:1:1231 -4488:0:4029 -4489:1:11 -4490:0:4029 -4491:1:1242 -4492:1:1243 -4493:1:1247 -4494:1:1248 -4495:1:1256 -4496:1:1257 -4497:1:1261 -4498:1:1262 -4499:1:1270 -4500:1:1275 -4501:1:1279 -4502:1:1280 -4503:1:1288 -4504:1:1289 -4505:1:1293 -4506:1:1294 -4507:1:1288 -4508:1:1289 -4509:1:1293 -4510:1:1294 -4511:1:1302 -4512:1:1307 -4513:1:1314 -4514:1:1315 -4515:1:1322 -4516:1:1327 -4517:1:1334 -4518:1:1335 -4519:1:1334 -4520:1:1335 -4521:1:1342 -4522:1:1351 -4523:1:1355 -4524:0:4029 -4525:1:11 -4526:0:4029 -4527:1:1356 -4528:1:1360 -4529:1:1361 -4530:1:1365 -4531:1:1366 -4532:1:1374 -4533:1:1382 -4534:1:1383 -4535:1:1387 -4536:1:1391 -4537:1:1392 -4538:1:1387 -4539:1:1391 -4540:1:1392 -4541:1:1396 -4542:1:1403 -4543:1:1410 -4544:1:1411 -4545:1:1418 -4546:1:1423 -4547:1:1430 -4548:1:1431 -4549:1:1430 -4550:1:1431 -4551:1:1438 -4552:0:4029 -4553:1:11 -4554:0:4029 -4555:1:1448 -4556:1:1449 -4557:1:1453 -4558:1:1454 -4559:1:1462 -4560:1:1463 -4561:1:1467 -4562:1:1468 -4563:1:1476 -4564:1:1481 -4565:1:1485 -4566:1:1486 -4567:1:1494 -4568:1:1495 -4569:1:1499 -4570:1:1500 -4571:1:1494 -4572:1:1495 -4573:1:1499 -4574:1:1500 -4575:1:1508 -4576:1:1513 -4577:1:1520 -4578:1:1521 -4579:1:1528 -4580:1:1533 -4581:1:1540 -4582:1:1541 -4583:1:1540 -4584:1:1541 -4585:1:1548 -4586:0:4029 -4587:1:11 -4588:0:4029 -4589:1:1559 -4590:1:1560 -4591:1:1564 -4592:1:1565 -4593:1:1573 -4594:1:1574 -4595:1:1578 -4596:1:1579 -4597:1:1587 -4598:1:1592 -4599:1:1596 -4600:1:1597 -4601:1:1605 -4602:1:1606 -4603:1:1610 -4604:1:1611 -4605:1:1605 -4606:1:1606 -4607:1:1610 -4608:1:1611 -4609:1:1619 -4610:1:1624 -4611:1:1631 -4612:1:1632 -4613:1:1639 -4614:1:1644 -4615:1:1651 -4616:1:1652 -4617:1:1651 -4618:1:1652 -4619:1:1659 -4620:1:1668 -4621:1:1672 -4622:0:4029 -4623:1:11 -4624:0:4029 -4625:1:1673 -4626:1:1674 -4627:1:1678 -4628:1:1679 -4629:1:1687 -4630:1:1696 -4631:1:1697 -4632:1:1701 -4633:1:1706 -4634:1:1710 -4635:1:1711 -4636:1:1719 -4637:1:1720 -4638:1:1724 -4639:1:1725 -4640:1:1719 -4641:1:1720 -4642:1:1724 -4643:1:1725 -4644:1:1733 -4645:1:1738 -4646:1:1745 -4647:1:1748 -4648:1:1749 -4649:1:1753 -4650:1:1758 -4651:1:1765 -4652:1:1766 -4653:1:1765 -4654:1:1766 -4655:1:1773 -4656:0:4029 -4657:1:11 -4658:0:4029 -4659:2:3507 -4660:2:3516 -4661:2:3517 -4662:2:3521 -4663:2:3522 -4664:2:3526 -4665:2:3527 -4666:2:3535 -4667:2:3540 -4668:2:3544 -4669:2:3545 -4670:2:3553 -4671:2:3554 -4672:2:3558 -4673:2:3559 -4674:2:3553 -4675:2:3554 -4676:2:3558 -4677:2:3559 -4678:2:3567 -4679:2:3574 -4680:2:3575 -4681:2:3579 -4682:2:3580 -4683:2:3587 -4684:2:3592 -4685:2:3599 -4686:2:3600 -4687:2:3599 -4688:2:3600 -4689:2:3607 -4690:2:3617 -4691:0:4029 -4692:2:2767 -4693:0:4029 -4694:2:3623 -4695:2:3632 -4696:2:3633 -4697:2:3637 -4698:2:3638 -4699:2:3642 -4700:2:3643 -4701:2:3651 -4702:2:3656 -4703:2:3660 -4704:2:3661 -4705:2:3669 -4706:2:3670 -4707:2:3674 -4708:2:3675 -4709:2:3669 -4710:2:3670 -4711:2:3674 -4712:2:3675 -4713:2:3683 -4714:2:3690 -4715:2:3691 -4716:2:3695 -4717:2:3696 -4718:2:3703 -4719:2:3708 -4720:2:3715 -4721:2:3716 -4722:2:3715 -4723:2:3716 -4724:2:3723 -4725:0:4029 -4726:2:2767 -4727:0:4029 -4728:1:1784 -4729:1:1785 -4730:0:4029 -4731:1:11 -4732:0:4029 -4733:2:3507 -4734:2:3516 -4735:2:3517 -4736:2:3521 -4737:2:3522 -4738:2:3526 -4739:2:3527 -4740:2:3535 -4741:2:3540 -4742:2:3544 -4743:2:3545 -4744:2:3553 -4745:2:3554 -4746:2:3558 -4747:2:3559 -4748:2:3553 -4749:2:3554 -4750:2:3558 -4751:2:3559 -4752:2:3567 -4753:2:3574 -4754:2:3575 -4755:2:3579 -4756:2:3580 -4757:2:3587 -4758:2:3592 -4759:2:3599 -4760:2:3600 -4761:2:3599 -4762:2:3600 -4763:2:3607 -4764:2:3617 -4765:0:4029 -4766:2:2767 -4767:0:4029 -4768:2:3623 -4769:2:3632 -4770:2:3633 -4771:2:3637 -4772:2:3638 -4773:2:3642 -4774:2:3643 -4775:2:3651 -4776:2:3656 -4777:2:3660 -4778:2:3661 -4779:2:3669 -4780:2:3670 -4781:2:3674 -4782:2:3675 -4783:2:3669 -4784:2:3670 -4785:2:3674 -4786:2:3675 -4787:2:3683 -4788:2:3690 -4789:2:3691 -4790:2:3695 -4791:2:3696 -4792:2:3703 -4793:2:3708 -4794:2:3715 -4795:2:3716 -4796:2:3715 -4797:2:3716 -4798:2:3723 -4799:0:4029 -4800:2:2767 -4801:0:4029 -4802:1:1791 -4803:1:1792 -4804:1:1796 -4805:1:1797 -4806:1:1805 -4807:1:1806 -4808:1:1807 -4809:1:1819 -4810:1:1824 -4811:1:1828 -4812:1:1829 -4813:1:1837 -4814:1:1838 -4815:1:1842 -4816:1:1843 -4817:1:1837 -4818:1:1838 -4819:1:1842 -4820:1:1843 -4821:1:1851 -4822:1:1856 -4823:1:1863 -4824:1:1864 -4825:1:1871 -4826:1:1876 -4827:1:1883 -4828:1:1884 -4829:1:1883 -4830:1:1884 -4831:1:1891 -4832:0:4029 -4833:1:11 -4834:0:4029 -4835:1:1902 -4836:1:1903 -4837:1:1907 -4838:1:1908 -4839:1:1916 -4840:1:1917 -4841:1:1921 -4842:1:1922 -4843:1:1930 -4844:1:1935 -4845:1:1939 -4846:1:1940 -4847:1:1948 -4848:1:1949 -4849:1:1953 -4850:1:1954 -4851:1:1948 -4852:1:1949 -4853:1:1953 -4854:1:1954 -4855:1:1962 -4856:1:1967 -4857:1:1974 -4858:1:1975 -4859:1:1982 -4860:1:1987 -4861:1:1994 -4862:1:1995 -4863:1:1994 -4864:1:1995 -4865:1:2002 -4866:1:2011 -4867:0:4029 -4868:1:11 -4869:0:4029 -4870:1:2129 -4871:1:2133 -4872:1:2134 -4873:1:2138 -4874:1:2139 -4875:1:2147 -4876:1:2155 -4877:1:2156 -4878:1:2160 -4879:1:2164 -4880:1:2165 -4881:1:2160 -4882:1:2164 -4883:1:2165 -4884:1:2169 -4885:1:2176 -4886:1:2183 -4887:1:2184 -4888:1:2191 -4889:1:2196 -4890:1:2203 -4891:1:2204 -4892:1:2203 -4893:1:2204 -4894:1:2211 -4895:0:4029 -4896:1:11 -4897:0:4029 -4898:2:3507 -4899:2:3516 -4900:2:3517 -4901:2:3521 -4902:2:3522 -4903:2:3526 -4904:2:3527 -4905:2:3535 -4906:2:3540 -4907:2:3544 -4908:2:3545 -4909:2:3553 -4910:2:3554 -4911:2:3558 -4912:2:3559 -4913:2:3553 -4914:2:3554 -4915:2:3558 -4916:2:3559 -4917:2:3567 -4918:2:3574 -4919:2:3575 -4920:2:3579 -4921:2:3580 -4922:2:3587 -4923:2:3592 -4924:2:3599 -4925:2:3600 -4926:2:3599 -4927:2:3600 -4928:2:3607 -4929:2:3617 -4930:0:4029 -4931:2:2767 -4932:0:4029 -4933:2:3623 -4934:2:3632 -4935:2:3633 -4936:2:3637 -4937:2:3638 -4938:2:3642 -4939:2:3643 -4940:2:3651 -4941:2:3656 -4942:2:3660 -4943:2:3661 -4944:2:3669 -4945:2:3670 -4946:2:3674 -4947:2:3675 -4948:2:3669 -4949:2:3670 -4950:2:3674 -4951:2:3675 -4952:2:3683 -4953:2:3690 -4954:2:3691 -4955:2:3695 -4956:2:3696 -4957:2:3703 -4958:2:3708 -4959:2:3715 -4960:2:3716 -4961:2:3715 -4962:2:3716 -4963:2:3723 -4964:0:4029 -4965:2:2767 -4966:0:4029 -4967:1:2221 -4968:1:2222 -4969:1:2226 -4970:1:2227 -4971:1:2235 -4972:1:2236 -4973:1:2240 -4974:1:2241 -4975:1:2249 -4976:1:2254 -4977:1:2258 -4978:1:2259 -4979:1:2267 -4980:1:2268 -4981:1:2272 -4982:1:2273 -4983:1:2267 -4984:1:2268 -4985:1:2272 -4986:1:2273 -4987:1:2281 -4988:1:2286 -4989:1:2293 -4990:1:2294 -4991:1:2301 -4992:1:2306 -4993:1:2313 -4994:1:2314 -4995:1:2313 -4996:1:2314 -4997:1:2321 diff --git a/formal-model/urcu-controldataflow/DEFINES b/formal-model/urcu-controldataflow/DEFINES deleted file mode 100644 index a1008a6..0000000 --- a/formal-model/urcu-controldataflow/DEFINES +++ /dev/null @@ -1,18 +0,0 @@ - -// Poison value for freed memory -#define POISON 1 -// Memory with correct data -#define WINE 0 -#define SLAB_SIZE 2 - -#define read_poison (data_read_first[0] == POISON || data_read_second[0] == POISON) - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -//disabled -//#define REMOTE_BARRIERS - -#define ARCH_ALPHA -//#define ARCH_INTEL -//#define ARCH_POWERPC diff --git a/formal-model/urcu-controldataflow/Makefile b/formal-model/urcu-controldataflow/Makefile deleted file mode 100644 index abf201c..0000000 --- a/formal-model/urcu-controldataflow/Makefile +++ /dev/null @@ -1,171 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 -DCOLLAPSE -#CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu-controldataflow/references.txt b/formal-model/urcu-controldataflow/references.txt deleted file mode 100644 index 72c67a2..0000000 --- a/formal-model/urcu-controldataflow/references.txt +++ /dev/null @@ -1,13 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html - -LTL vs CTL : - -http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 -http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf - (downloaded) diff --git a/formal-model/urcu-controldataflow/urcu.sh b/formal-model/urcu-controldataflow/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu-controldataflow/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu-controldataflow/urcu.spin b/formal-model/urcu-controldataflow/urcu.spin deleted file mode 100644 index 8075506..0000000 --- a/formal-model/urcu-controldataflow/urcu.spin +++ /dev/null @@ -1,1321 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory - * and out-of-order instruction scheduling. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -#define get_readerid() (get_pid()) - -/* - * Produced process control and data flow. Updated after each instruction to - * show which variables are ready. Using one-hot bit encoding per variable to - * save state space. Used as triggers to execute the instructions having those - * variables as input. Leaving bits active to inhibit instruction execution. - * Scheme used to make instruction disabling and automatic dependency fall-back - * automatic. - */ - -#define CONSUME_TOKENS(state, bits, notbits) \ - ((!(state & (notbits))) && (state & (bits)) == (bits)) - -#define PRODUCE_TOKENS(state, bits) \ - state = state | (bits); - -#define CLEAR_TOKENS(state, bits) \ - state = state & ~(bits) - -/* - * Types of dependency : - * - * Data dependency - * - * - True dependency, Read-after-Write (RAW) - * - * This type of dependency happens when a statement depends on the result of a - * previous statement. This applies to any statement which needs to read a - * variable written by a preceding statement. - * - * - False dependency, Write-after-Read (WAR) - * - * Typically, variable renaming can ensure that this dependency goes away. - * However, if the statements must read and then write from/to the same variable - * in the OOO memory model, renaming may be impossible, and therefore this - * causes a WAR dependency. - * - * - Output dependency, Write-after-Write (WAW) - * - * Two writes to the same variable in subsequent statements. Variable renaming - * can ensure this is not needed, but can be required when writing multiple - * times to the same OOO mem model variable. - * - * Control dependency - * - * Execution of a given instruction depends on a previous instruction evaluating - * in a way that allows its execution. E.g. : branches. - * - * Useful considerations for joining dependencies after branch - * - * - Pre-dominance - * - * "We say box i dominates box j if every path (leading from input to output - * through the diagram) which passes through box j must also pass through box - * i. Thus box i dominates box j if box j is subordinate to box i in the - * program." - * - * http://www.hipersoft.rice.edu/grads/publications/dom14.pdf - * Other classic algorithm to calculate dominance : Lengauer-Tarjan (in gcc) - * - * - Post-dominance - * - * Just as pre-dominance, but with arcs of the data flow inverted, and input vs - * output exchanged. Therefore, i post-dominating j ensures that every path - * passing by j will pass by i before reaching the output. - * - * Prefetch and speculative execution - * - * If an instruction depends on the result of a previous branch, but it does not - * have side-effects, it can be executed before the branch result is known. - * however, it must be restarted if a core-synchronizing instruction is issued. - * Note that instructions which depend on the speculative instruction result - * but that have side-effects must depend on the branch completion in addition - * to the speculatively executed instruction. - * - * Other considerations - * - * Note about "volatile" keyword dependency : The compiler will order volatile - * accesses so they appear in the right order on a given CPU. They can be - * reordered by the CPU instruction scheduling. This therefore cannot be - * considered as a depencency. - * - * References : - * - * Cooper, Keith D.; & Torczon, Linda. (2005). Engineering a Compiler. Morgan - * Kaufmann. ISBN 1-55860-698-X. - * Kennedy, Ken; & Allen, Randy. (2001). Optimizing Compilers for Modern - * Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN - * 1-55860-286-0. - * Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. - * Morgan Kaufmann. ISBN 1-55860-320-4. - */ - -/* - * Note about loops and nested calls - * - * To keep this model simple, loops expressed in the framework will behave as if - * there was a core synchronizing instruction between loops. To see the effect - * of loop unrolling, manually unrolling loops is required. Note that if loops - * end or start with a core synchronizing instruction, the model is appropriate. - * Nested calls are not supported. - */ - -/* - * Only Alpha has out-of-order cache bank loads. Other architectures (intel, - * powerpc, arm) ensure that dependent reads won't be reordered. c.f. - * http://www.linuxjournal.com/article/8212) - */ -#ifdef ARCH_ALPHA -#define HAVE_OOO_CACHE_READ -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -typedef per_proc_bit { - bit val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bitfield { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; - -#define DECLARE_PROC_CACHED_VAR(type, x)\ - type cached_##x; \ - bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v) \ - mem_##x = v; - -#define INIT_PROC_CACHED_VAR(x, v) \ - cache_dirty_##x = 0; \ - cached_##x = v; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x) - -#define READ_CACHED_VAR(x) (cached_##x) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x = v; \ - cache_dirty_##x = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x; \ - cache_dirty_##x = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x = mem_##x; \ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* Must consume all prior read tokens. All subsequent reads depend on it. */ -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Must consume all prior write tokens. All subsequent writes depend on it. */ -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; - } -} - -/* Synchronization point. Must consume all prior read and write tokens. All - * subsequent reads and writes depend on it. */ -inline smp_mb(i) -{ - atomic { - smp_wmb(i); - smp_rmb(i); - } -} - -#ifdef REMOTE_BARRIERS - -bit reader_barrier[NR_READERS]; - -/* - * We cannot leave the barriers dependencies in place in REMOTE_BARRIERS mode - * because they would add unexisting core synchronization and would therefore - * create an incomplete model. - * Therefore, we model the read-side memory barriers by completely disabling the - * memory barriers and their dependencies from the read-side. One at a time - * (different verification runs), we make a different instruction listen for - * signals. - */ - -#define smp_mb_reader(i, j) - -/* - * Service 0, 1 or many barrier requests. - */ -inline smp_mb_recv(i, j) -{ - do - :: (reader_barrier[get_readerid()] == 1) -> - /* - * We choose to ignore cycles caused by writer busy-looping, - * waiting for the reader, sending barrier requests, and the - * reader always services them without continuing execution. - */ -progress_ignoring_mb1: - smp_mb(i); - reader_barrier[get_readerid()] = 0; - :: 1 -> - /* - * We choose to ignore writer's non-progress caused by the - * reader ignoring the writer's mb() requests. - */ -progress_ignoring_mb2: - break; - od; -} - -#define PROGRESS_LABEL(progressid) progress_writer_progid_##progressid: - -#define smp_mb_send(i, j, progressid) \ -{ \ - smp_mb(i); \ - i = 0; \ - do \ - :: i < NR_READERS -> \ - reader_barrier[i] = 1; \ - /* \ - * Busy-looping waiting for reader barrier handling is of little\ - * interest, given the reader has the ability to totally ignore \ - * barrier requests. \ - */ \ - do \ - :: (reader_barrier[i] == 1) -> \ -PROGRESS_LABEL(progressid) \ - skip; \ - :: (reader_barrier[i] == 0) -> break; \ - od; \ - i++; \ - :: i >= NR_READERS -> \ - break \ - od; \ - smp_mb(i); \ -} - -#else - -#define smp_mb_send(i, j, progressid) smp_mb(i) -#define smp_mb_reader(i, j) smp_mb(i) -#define smp_mb_recv(i, j) - -#endif - -/* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* RCU data */ -DECLARE_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - -/* RCU pointer */ -#if (SLAB_SIZE == 2) -DECLARE_CACHED_VAR(bit, rcu_ptr); -bit ptr_read_first[NR_READERS]; -bit ptr_read_second[NR_READERS]; -#else -DECLARE_CACHED_VAR(byte, rcu_ptr); -byte ptr_read_first[NR_READERS]; -byte ptr_read_second[NR_READERS]; -#endif - -bit data_read_first[NR_READERS]; -bit data_read_second[NR_READERS]; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_WRITE_TO_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#ifdef HAVE_OOO_CACHE_READ - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(rcu_ptr, get_pid()); - i = 0; - do - :: i < SLAB_SIZE -> - RANDOM_CACHE_READ_FROM_MEM(rcu_data[i], get_pid()); - i++ - :: i >= SLAB_SIZE -> break - od; -#else - smp_rmb(i); -#endif /* HAVE_OOO_CACHE_READ */ - } -} - -/* - * Bit encoding, urcu_reader : - */ - -int _proc_urcu_reader; -#define proc_urcu_reader _proc_urcu_reader - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROD_A_READ (1 << 0) -#define READ_PROD_B_IF_TRUE (1 << 1) -#define READ_PROD_B_IF_FALSE (1 << 2) -#define READ_PROD_C_IF_TRUE_READ (1 << 3) - -#define PROCEDURE_READ_LOCK(base, consumetoken, consumetoken2, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, (consumetoken | consumetoken2), READ_PROD_A_READ << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_A_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - READ_PROD_A_READ << base, /* RAW, pre-dominant */ \ - (READ_PROD_B_IF_TRUE | READ_PROD_B_IF_FALSE) << base) -> \ - if \ - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_TRUE << base); \ - :: else -> \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_B_IF_FALSE << base); \ - fi; \ - /* IF TRUE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, consumetoken, /* prefetch */ \ - READ_PROD_C_IF_TRUE_READ << base) -> \ - ooo_mem(i); \ - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_C_IF_TRUE_READ << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_TRUE \ - | READ_PROD_C_IF_TRUE_READ /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ELSE */ \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - (READ_PROD_B_IF_FALSE /* pre-dominant */ \ - | READ_PROD_A_READ) << base, /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], \ - tmp + 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - /* IF_MERGE implies \ - * post-dominance */ \ - /* ENDIF */ \ - skip - -/* Body of PROCEDURE_READ_LOCK */ -#define READ_PROC_READ_UNLOCK (1 << 0) - -#define PROCEDURE_READ_UNLOCK(base, consumetoken, producetoken) \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken, \ - READ_PROC_READ_UNLOCK << base) -> \ - ooo_mem(i); \ - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); \ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_UNLOCK << base); \ - :: CONSUME_TOKENS(proc_urcu_reader, \ - consumetoken \ - | (READ_PROC_READ_UNLOCK << base), /* WAR */ \ - producetoken) -> \ - ooo_mem(i); \ - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp - 1); \ - PRODUCE_TOKENS(proc_urcu_reader, producetoken); \ - skip - - -#define READ_PROD_NONE (1 << 0) - -/* PROCEDURE_READ_LOCK base = << 1 : 1 to 5 */ -#define READ_LOCK_BASE 1 -#define READ_LOCK_OUT (1 << 5) - -#define READ_PROC_FIRST_MB (1 << 6) - -/* PROCEDURE_READ_LOCK (NESTED) base : << 7 : 7 to 11 */ -#define READ_LOCK_NESTED_BASE 7 -#define READ_LOCK_NESTED_OUT (1 << 11) - -#define READ_PROC_READ_GEN (1 << 12) -#define READ_PROC_ACCESS_GEN (1 << 13) - -/* PROCEDURE_READ_UNLOCK (NESTED) base = << 14 : 14 to 15 */ -#define READ_UNLOCK_NESTED_BASE 14 -#define READ_UNLOCK_NESTED_OUT (1 << 15) - -#define READ_PROC_SECOND_MB (1 << 16) - -/* PROCEDURE_READ_UNLOCK base = << 17 : 17 to 18 */ -#define READ_UNLOCK_BASE 17 -#define READ_UNLOCK_OUT (1 << 18) - -/* PROCEDURE_READ_LOCK_UNROLL base = << 19 : 19 to 23 */ -#define READ_LOCK_UNROLL_BASE 19 -#define READ_LOCK_OUT_UNROLL (1 << 23) - -#define READ_PROC_THIRD_MB (1 << 24) - -#define READ_PROC_READ_GEN_UNROLL (1 << 25) -#define READ_PROC_ACCESS_GEN_UNROLL (1 << 26) - -#define READ_PROC_FOURTH_MB (1 << 27) - -/* PROCEDURE_READ_UNLOCK_UNROLL base = << 28 : 28 to 29 */ -#define READ_UNLOCK_UNROLL_BASE 28 -#define READ_UNLOCK_OUT_UNROLL (1 << 29) - - -/* Should not include branches */ -#define READ_PROC_ALL_TOKENS (READ_PROD_NONE \ - | READ_LOCK_OUT \ - | READ_PROC_FIRST_MB \ - | READ_LOCK_NESTED_OUT \ - | READ_PROC_READ_GEN \ - | READ_PROC_ACCESS_GEN \ - | READ_UNLOCK_NESTED_OUT \ - | READ_PROC_SECOND_MB \ - | READ_UNLOCK_OUT \ - | READ_LOCK_OUT_UNROLL \ - | READ_PROC_THIRD_MB \ - | READ_PROC_READ_GEN_UNROLL \ - | READ_PROC_ACCESS_GEN_UNROLL \ - | READ_PROC_FOURTH_MB \ - | READ_UNLOCK_OUT_UNROLL) - -/* Must clear all tokens, including branches */ -#define READ_PROC_ALL_TOKENS_CLEAR ((1 << 30) - 1) - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - PRODUCE_TOKENS(proc_urcu_reader, READ_PROD_NONE); - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - -#ifdef REMOTE_BARRIERS - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); -#endif - - do - :: 1 -> - -#ifdef REMOTE_BARRIERS - /* - * Signal-based memory barrier will only execute when the - * execution order appears in program order. - */ - if - :: 1 -> - atomic { - if - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE, - READ_LOCK_OUT | READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT, - READ_LOCK_NESTED_OUT - | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT | READ_LOCK_NESTED_OUT, - READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN, - READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT, - READ_UNLOCK_OUT - | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL, - READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL, - READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN - | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL, - READ_UNLOCK_OUT_UNROLL) - || CONSUME_TOKENS(proc_urcu_reader, READ_PROD_NONE | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT | READ_PROC_READ_GEN | READ_PROC_ACCESS_GEN | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT | READ_LOCK_OUT_UNROLL - | READ_PROC_READ_GEN_UNROLL | READ_PROC_ACCESS_GEN_UNROLL | READ_UNLOCK_OUT_UNROLL, - 0) -> - goto non_atomic3; -non_atomic3_end: - skip; - fi; - } - fi; - - goto non_atomic3_skip; -non_atomic3: - smp_mb_recv(i, j); - goto non_atomic3_end; -non_atomic3_skip: - -#endif /* REMOTE_BARRIERS */ - - atomic { - if - PROCEDURE_READ_LOCK(READ_LOCK_BASE, READ_PROD_NONE, 0, READ_LOCK_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_LOCK_OUT, /* post-dominant */ - READ_PROC_FIRST_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FIRST_MB); - - PROCEDURE_READ_LOCK(READ_LOCK_NESTED_BASE, READ_PROC_FIRST_MB, READ_LOCK_OUT, - READ_LOCK_NESTED_OUT); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_PROC_READ_GEN) -> - ooo_mem(i); - ptr_read_first[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_READ_GEN, - READ_PROC_ACCESS_GEN) -> - /* smp_read_barrier_depends */ - goto rmb1; -rmb1_end: - data_read_first[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_first[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN); - - - /* Note : we remove the nested memory barrier from the read unlock - * model, given it is not usually needed. The implementation has the barrier - * because the performance impact added by a branch in the common case does not - * justify it. - */ - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_NESTED_BASE, - READ_PROC_FIRST_MB - | READ_LOCK_OUT - | READ_LOCK_NESTED_OUT, - READ_UNLOCK_NESTED_OUT); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_ACCESS_GEN /* mb() orders reads */ - | READ_PROC_READ_GEN /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_LOCK_OUT /* post-dominant */ - | READ_LOCK_NESTED_OUT /* post-dominant */ - | READ_UNLOCK_NESTED_OUT, - READ_PROC_SECOND_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_SECOND_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT); - - /* Unrolling loop : second consecutive lock */ - /* reading urcu_active_readers, which have been written by - * READ_UNLOCK_OUT : RAW */ - PROCEDURE_READ_LOCK(READ_LOCK_UNROLL_BASE, - READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB, /* mb() orders reads */ - READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT /* RAW */ - | READ_UNLOCK_OUT, /* RAW */ - READ_LOCK_OUT_UNROLL); - - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_THIRD_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_THIRD_MB); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_READ_GEN_UNROLL) -> - ooo_mem(i); - ptr_read_second[get_readerid()] = READ_CACHED_VAR(rcu_ptr); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_READ_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB, /* mb() orders reads */ - READ_PROC_ACCESS_GEN_UNROLL) -> - /* smp_read_barrier_depends */ - goto rmb2; -rmb2_end: - data_read_second[get_readerid()] = - READ_CACHED_VAR(rcu_data[ptr_read_second[get_readerid()]]); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_ACCESS_GEN_UNROLL); - - :: CONSUME_TOKENS(proc_urcu_reader, - READ_PROC_READ_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_ACCESS_GEN_UNROLL /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() ordered */ - | READ_PROC_SECOND_MB /* mb() ordered */ - | READ_PROC_THIRD_MB /* mb() ordered */ - | READ_LOCK_OUT_UNROLL /* post-dominant */ - | READ_LOCK_NESTED_OUT - | READ_LOCK_OUT - | READ_UNLOCK_NESTED_OUT - | READ_UNLOCK_OUT, - READ_PROC_FOURTH_MB) -> - smp_mb_reader(i, j); - PRODUCE_TOKENS(proc_urcu_reader, READ_PROC_FOURTH_MB); - - PROCEDURE_READ_UNLOCK(READ_UNLOCK_UNROLL_BASE, - READ_PROC_FOURTH_MB /* mb() orders reads */ - | READ_PROC_THIRD_MB /* mb() orders reads */ - | READ_LOCK_OUT_UNROLL /* RAW */ - | READ_PROC_SECOND_MB /* mb() orders reads */ - | READ_PROC_FIRST_MB /* mb() orders reads */ - | READ_LOCK_NESTED_OUT /* RAW */ - | READ_LOCK_OUT /* RAW */ - | READ_UNLOCK_NESTED_OUT, /* RAW */ - READ_UNLOCK_OUT_UNROLL); - :: CONSUME_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_reader, READ_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Dependency between consecutive loops : - * RAW dependency on - * WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1) - * tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - * between loops. - * _WHEN THE MB()s are in place_, they add full ordering of the - * generation pointer read wrt active reader count read, which ensures - * execution will not spill across loop execution. - * However, in the event mb()s are removed (execution using signal - * handler to promote barrier()() -> smp_mb()), nothing prevents one loop - * to spill its execution on other loop's execution. - */ - goto end; -rmb1: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb1_end; -rmb2: -#ifndef NO_RMB - smp_rmb(i); -#else - ooo_mem(i); -#endif - goto rmb2_end; -end: - skip; -} - - - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* no name clash please */ -#undef proc_urcu_reader - - -/* Model the RCU update process. */ - -/* - * Bit encoding, urcu_writer : - * Currently only supports one reader. - */ - -int _proc_urcu_writer; -#define proc_urcu_writer _proc_urcu_writer - -#define WRITE_PROD_NONE (1 << 0) - -#define WRITE_DATA (1 << 1) -#define WRITE_PROC_WMB (1 << 2) -#define WRITE_XCHG_PTR (1 << 3) - -#define WRITE_PROC_FIRST_MB (1 << 4) - -/* first flip */ -#define WRITE_PROC_FIRST_READ_GP (1 << 5) -#define WRITE_PROC_FIRST_WRITE_GP (1 << 6) -#define WRITE_PROC_FIRST_WAIT (1 << 7) -#define WRITE_PROC_FIRST_WAIT_LOOP (1 << 8) - -/* second flip */ -#define WRITE_PROC_SECOND_READ_GP (1 << 9) -#define WRITE_PROC_SECOND_WRITE_GP (1 << 10) -#define WRITE_PROC_SECOND_WAIT (1 << 11) -#define WRITE_PROC_SECOND_WAIT_LOOP (1 << 12) - -#define WRITE_PROC_SECOND_MB (1 << 13) - -#define WRITE_FREE (1 << 14) - -#define WRITE_PROC_ALL_TOKENS (WRITE_PROD_NONE \ - | WRITE_DATA \ - | WRITE_PROC_WMB \ - | WRITE_XCHG_PTR \ - | WRITE_PROC_FIRST_MB \ - | WRITE_PROC_FIRST_READ_GP \ - | WRITE_PROC_FIRST_WRITE_GP \ - | WRITE_PROC_FIRST_WAIT \ - | WRITE_PROC_SECOND_READ_GP \ - | WRITE_PROC_SECOND_WRITE_GP \ - | WRITE_PROC_SECOND_WAIT \ - | WRITE_PROC_SECOND_MB \ - | WRITE_FREE) - -#define WRITE_PROC_ALL_TOKENS_CLEAR ((1 << 15) - 1) - -/* - * Mutexes are implied around writer execution. A single writer at a time. - */ -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2, tmpa; - byte cur_data = 0, old_data, loop_nr = 0; - byte cur_gp_val = 0; /* - * Keep a local trace of the current parity so - * we don't add non-existing dependencies on the global - * GP update. Needed to test single flip case. - */ - - /* Keep in sync manually with smp_rmb, smp_wmb, ooo_mem and init() */ - DECLARE_PROC_CACHED_VAR(byte, urcu_gp_ctr); - /* Note ! currently only one reader */ - DECLARE_PROC_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); - /* RCU data */ - DECLARE_PROC_CACHED_VAR(bit, rcu_data[SLAB_SIZE]); - - /* RCU pointer */ -#if (SLAB_SIZE == 2) - DECLARE_PROC_CACHED_VAR(bit, rcu_ptr); -#else - DECLARE_PROC_CACHED_VAR(byte, rcu_ptr); -#endif - - atomic { - INIT_PROC_CACHED_VAR(urcu_gp_ctr, 1); - INIT_PROC_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_PROC_CACHED_VAR(urcu_active_readers[i], 0); - i++; - :: i >= NR_READERS -> break - od; - INIT_PROC_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_PROC_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - } - - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (loop_nr < 3) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - loop_nr = loop_nr + 1; - - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROD_NONE); - -#ifdef NO_WMB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); -#endif - -#ifdef NO_MB - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); -#endif - -#ifdef SINGLE_FLIP - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - /* For single flip, we need to know the current parity */ - cur_gp_val = cur_gp_val ^ RCU_GP_CTR_BIT; -#endif - - do :: 1 -> - atomic { - if - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROD_NONE, - WRITE_DATA) -> - ooo_mem(i); - cur_data = (cur_data + 1) % SLAB_SIZE; - WRITE_CACHED_VAR(rcu_data[cur_data], WINE); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_DATA); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA, - WRITE_PROC_WMB) -> - smp_wmb(i); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_WMB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_WMB, - WRITE_XCHG_PTR) -> - /* rcu_xchg_pointer() */ - atomic { - old_data = READ_CACHED_VAR(rcu_ptr); - WRITE_CACHED_VAR(rcu_ptr, cur_data); - } - PRODUCE_TOKENS(proc_urcu_writer, WRITE_XCHG_PTR); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR, - WRITE_PROC_FIRST_MB) -> - goto smp_mb_send1; -smp_mb_send1_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_MB); - - /* first flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB, - WRITE_PROC_FIRST_READ_GP) -> - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_MB | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP, - WRITE_PROC_FIRST_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_FIRST_WAIT | WRITE_PROC_FIRST_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); -#ifndef SINGLE_FLIP - /* In normal execution, we are always starting by - * waiting for the even parity. - */ - cur_gp_val = RCU_GP_CTR_BIT; -#endif - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ cur_gp_val) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send2; -smp_mb_send2_end: - /* The memory barrier will invalidate the - * second read done as prefetching. Note that all - * instructions with side-effects depending on - * WRITE_PROC_SECOND_READ_GP should also depend on - * completion of this busy-waiting loop. */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_FIRST_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_FIRST_WAIT_LOOP | WRITE_PROC_FIRST_WAIT); - - /* second flip */ - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WAIT | //test /* no dependency. Could pre-fetch, no side-effect. */ - WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_READ_GP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - tmpa = READ_CACHED_VAR(urcu_gp_ctr); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_READ_GP); - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT /* dependency on first wait, because this - * instruction has globally observable - * side-effects. - */ - | WRITE_PROC_FIRST_MB - | WRITE_PROC_WMB - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP, - WRITE_PROC_SECOND_WRITE_GP) -> - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmpa ^ RCU_GP_CTR_BIT); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WRITE_GP); - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - WRITE_PROC_SECOND_WAIT | WRITE_PROC_SECOND_WAIT_LOOP) -> - ooo_mem(i); - //smp_mb(i); /* TEST */ - /* ONLY WAITING FOR READER 0 */ - tmp2 = READ_CACHED_VAR(urcu_active_readers[0]); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ 0) & RCU_GP_CTR_BIT) -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP); - :: else -> - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT); - fi; - - :: CONSUME_TOKENS(proc_urcu_writer, - //WRITE_PROC_FIRST_WRITE_GP | /* TEST ADDING SYNC CORE */ - WRITE_PROC_SECOND_WRITE_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_WAIT_LOOP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, /* can be reordered before/after flips */ - 0) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - goto smp_mb_send3; -smp_mb_send3_end: -#else - ooo_mem(i); -#endif - /* This instruction loops to WRITE_PROC_SECOND_WAIT */ - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_WAIT_LOOP | WRITE_PROC_SECOND_WAIT); - - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_FIRST_READ_GP - | WRITE_PROC_SECOND_READ_GP - | WRITE_PROC_FIRST_WRITE_GP - | WRITE_PROC_SECOND_WRITE_GP - | WRITE_DATA | WRITE_PROC_WMB | WRITE_XCHG_PTR - | WRITE_PROC_FIRST_MB, - WRITE_PROC_SECOND_MB) -> - goto smp_mb_send4; -smp_mb_send4_end: - PRODUCE_TOKENS(proc_urcu_writer, WRITE_PROC_SECOND_MB); - - :: CONSUME_TOKENS(proc_urcu_writer, - WRITE_XCHG_PTR - | WRITE_PROC_FIRST_WAIT - | WRITE_PROC_SECOND_WAIT - | WRITE_PROC_WMB /* No dependency on - * WRITE_DATA because we - * write to a - * different location. */ - | WRITE_PROC_SECOND_MB - | WRITE_PROC_FIRST_MB, - WRITE_FREE) -> - WRITE_CACHED_VAR(rcu_data[old_data], POISON); - PRODUCE_TOKENS(proc_urcu_writer, WRITE_FREE); - - :: CONSUME_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS, 0) -> - CLEAR_TOKENS(proc_urcu_writer, WRITE_PROC_ALL_TOKENS_CLEAR); - break; - fi; - } - od; - /* - * Note : Promela model adds implicit serialization of the - * WRITE_FREE instruction. Normally, it would be permitted to - * spill on the next loop execution. Given the validation we do - * checks for the data entry read to be poisoned, it's ok if - * we do not check "late arriving" memory poisoning. - */ - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif -#ifdef READER_PROGRESS - /* - * Make sure we don't block the reader's progress. - */ - smp_mb_send(i, j, 5); -#endif - skip; - od; - - /* Non-atomic parts of the loop */ - goto end; -smp_mb_send1: - smp_mb_send(i, j, 1); - goto smp_mb_send1_end; -#ifndef GEN_ERROR_WRITER_PROGRESS -smp_mb_send2: - smp_mb_send(i, j, 2); - goto smp_mb_send2_end; -smp_mb_send3: - smp_mb_send(i, j, 3); - goto smp_mb_send3_end; -#endif -smp_mb_send4: - smp_mb_send(i, j, 4); - goto smp_mb_send4_end; -end: - skip; -} - -/* no name clash please */ -#undef proc_urcu_writer - - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1); - INIT_CACHED_VAR(rcu_ptr, 0); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0); - ptr_read_first[i] = 1; - ptr_read_second[i] = 1; - data_read_first[i] = WINE; - data_read_second[i] = WINE; - i++; - :: i >= NR_READERS -> break - od; - INIT_CACHED_VAR(rcu_data[0], WINE); - i = 1; - do - :: i < SLAB_SIZE -> - INIT_CACHED_VAR(rcu_data[i], POISON); - i++ - :: i >= SLAB_SIZE -> break - od; - - init_done = 1; - } -} diff --git a/formal-model/urcu-controldataflow/urcu_free.ltl b/formal-model/urcu-controldataflow/urcu_free.ltl deleted file mode 100644 index 6be1be9..0000000 --- a/formal-model/urcu-controldataflow/urcu_free.ltl +++ /dev/null @@ -1 +0,0 @@ -[] (!read_poison) diff --git a/formal-model/urcu-controldataflow/urcu_free_nested.define b/formal-model/urcu-controldataflow/urcu_free_nested.define deleted file mode 100644 index 0fb59bd..0000000 --- a/formal-model/urcu-controldataflow/urcu_free_nested.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_NEST_LEVEL 2 diff --git a/formal-model/urcu-controldataflow/urcu_free_no_mb.define b/formal-model/urcu-controldataflow/urcu_free_no_mb.define deleted file mode 100644 index d99d793..0000000 --- a/formal-model/urcu-controldataflow/urcu_free_no_mb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_MB diff --git a/formal-model/urcu-controldataflow/urcu_free_no_rmb.define b/formal-model/urcu-controldataflow/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu-controldataflow/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu-controldataflow/urcu_free_no_wmb.define b/formal-model/urcu-controldataflow/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu-controldataflow/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu-controldataflow/urcu_free_single_flip.define b/formal-model/urcu-controldataflow/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu-controldataflow/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu-controldataflow/urcu_progress.ltl b/formal-model/urcu-controldataflow/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu-controldataflow/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu-controldataflow/urcu_progress_reader.define b/formal-model/urcu-controldataflow/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu-controldataflow/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu-controldataflow/urcu_progress_writer.define b/formal-model/urcu-controldataflow/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu-controldataflow/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu-controldataflow/urcu_progress_writer_error.define b/formal-model/urcu-controldataflow/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu-controldataflow/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/DEFINES b/formal-model/urcu-nosched-model/result-signal-over-reader/DEFINES deleted file mode 100644 index 2fcb038..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/DEFINES +++ /dev/null @@ -1,17 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/Makefile b/formal-model/urcu-nosched-model/result-signal-over-reader/Makefile deleted file mode 100644 index 8af320d..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/Makefile +++ /dev/null @@ -1,172 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - #nested useless with signal test. - #make urcu_free_nested | tee urcu_free_nested.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/asserts.log b/formal-model/urcu-nosched-model/result-signal-over-reader/asserts.log deleted file mode 100644 index d317f57..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/asserts.log +++ /dev/null @@ -1,312 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -cat DEFINES > .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w20 -Depth= 4926 States= 1e+06 Transitions= 9.03e+06 Memory= 527.287 t= 5.98 R= 2e+05 -Depth= 7228 States= 2e+06 Transitions= 1.88e+07 Memory= 588.322 t= 12.9 R= 2e+05 -Depth= 7228 States= 3e+06 Transitions= 3.14e+07 Memory= 649.358 t= 21.9 R= 1e+05 -pan: resizing hashtable to -w22.. done -Depth= 7228 States= 4e+06 Transitions= 4.3e+07 Memory= 741.416 t= 30.3 R= 1e+05 -Depth= 7228 States= 5e+06 Transitions= 5.65e+07 Memory= 802.451 t= 39.6 R= 1e+05 -Depth= 7228 States= 6e+06 Transitions= 6.78e+07 Memory= 863.486 t= 47.5 R= 1e+05 -Depth= 7228 States= 7e+06 Transitions= 8.05e+07 Memory= 924.522 t= 56.5 R= 1e+05 -Depth= 7228 States= 8e+06 Transitions= 9.49e+07 Memory= 985.557 t= 66.8 R= 1e+05 -Depth= 7228 States= 9e+06 Transitions= 1.06e+08 Memory= 1046.592 t= 74.7 R= 1e+05 -pan: resizing hashtable to -w24.. done -Depth= 7228 States= 1e+07 Transitions= 1.18e+08 Memory= 1231.721 t= 84.9 R= 1e+05 -Depth= 7228 States= 1.1e+07 Transitions= 1.29e+08 Memory= 1292.756 t= 92.8 R= 1e+05 -Depth= 7228 States= 1.2e+07 Transitions= 1.4e+08 Memory= 1353.791 t= 100 R= 1e+05 -Depth= 7228 States= 1.3e+07 Transitions= 1.53e+08 Memory= 1414.826 t= 109 R= 1e+05 -Depth= 7228 States= 1.4e+07 Transitions= 1.65e+08 Memory= 1475.861 t= 117 R= 1e+05 -Depth= 7228 States= 1.5e+07 Transitions= 1.77e+08 Memory= 1536.897 t= 126 R= 1e+05 -Depth= 7228 States= 1.6e+07 Transitions= 1.89e+08 Memory= 1597.932 t= 134 R= 1e+05 -Depth= 7228 States= 1.7e+07 Transitions= 2.02e+08 Memory= 1658.967 t= 143 R= 1e+05 -Depth= 7228 States= 1.8e+07 Transitions= 2.16e+08 Memory= 1720.002 t= 153 R= 1e+05 -Depth= 7228 States= 1.9e+07 Transitions= 2.27e+08 Memory= 1781.037 t= 160 R= 1e+05 -Depth= 7228 States= 2e+07 Transitions= 2.39e+08 Memory= 1842.072 t= 169 R= 1e+05 -Depth= 7228 States= 2.1e+07 Transitions= 2.51e+08 Memory= 1903.108 t= 177 R= 1e+05 -Depth= 7228 States= 2.2e+07 Transitions= 2.62e+08 Memory= 1964.143 t= 185 R= 1e+05 -Depth= 7228 States= 2.3e+07 Transitions= 2.74e+08 Memory= 2025.178 t= 194 R= 1e+05 -Depth= 7228 States= 2.4e+07 Transitions= 2.86e+08 Memory= 2086.213 t= 203 R= 1e+05 -Depth= 7228 States= 2.5e+07 Transitions= 2.99e+08 Memory= 2147.248 t= 212 R= 1e+05 -Depth= 7228 States= 2.6e+07 Transitions= 3.1e+08 Memory= 2208.283 t= 220 R= 1e+05 -Depth= 7228 States= 2.7e+07 Transitions= 3.24e+08 Memory= 2269.318 t= 230 R= 1e+05 -Depth= 7228 States= 2.8e+07 Transitions= 3.37e+08 Memory= 2330.354 t= 239 R= 1e+05 -Depth= 7228 States= 2.9e+07 Transitions= 3.49e+08 Memory= 2391.389 t= 248 R= 1e+05 -Depth= 7228 States= 3e+07 Transitions= 3.6e+08 Memory= 2452.424 t= 256 R= 1e+05 -Depth= 7228 States= 3.1e+07 Transitions= 3.72e+08 Memory= 2513.459 t= 265 R= 1e+05 -Depth= 7228 States= 3.2e+07 Transitions= 3.83e+08 Memory= 2574.494 t= 273 R= 1e+05 -Depth= 7228 States= 3.3e+07 Transitions= 3.95e+08 Memory= 2635.529 t= 282 R= 1e+05 -Depth= 7228 States= 3.4e+07 Transitions= 4.07e+08 Memory= 2696.565 t= 291 R= 1e+05 -pan: resizing hashtable to -w26.. done -Depth= 7228 States= 3.5e+07 Transitions= 4.2e+08 Memory= 3253.682 t= 308 R= 1e+05 -Depth= 7228 States= 3.6e+07 Transitions= 4.32e+08 Memory= 3314.717 t= 316 R= 1e+05 -Depth= 7228 States= 3.7e+07 Transitions= 4.45e+08 Memory= 3375.752 t= 325 R= 1e+05 -Depth= 7228 States= 3.8e+07 Transitions= 4.58e+08 Memory= 3436.787 t= 334 R= 1e+05 -Depth= 7228 States= 3.9e+07 Transitions= 4.71e+08 Memory= 3497.822 t= 343 R= 1e+05 -Depth= 7228 States= 4e+07 Transitions= 4.82e+08 Memory= 3558.858 t= 350 R= 1e+05 -Depth= 7228 States= 4.1e+07 Transitions= 4.94e+08 Memory= 3619.893 t= 359 R= 1e+05 -Depth= 7228 States= 4.2e+07 Transitions= 5.04e+08 Memory= 3680.928 t= 366 R= 1e+05 -Depth= 7228 States= 4.3e+07 Transitions= 5.16e+08 Memory= 3741.963 t= 374 R= 1e+05 -Depth= 7228 States= 4.4e+07 Transitions= 5.29e+08 Memory= 3802.998 t= 383 R= 1e+05 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim - (none specified) - assertion violations + - cycle checks - (disabled by -DSAFETY) - invalid end states + - -State-vector 56 byte, depth reached 7228, errors: 0 - 44157204 states, stored -4.8641845e+08 states, matched -5.3057565e+08 transitions (= stored+matched) -1.8453582e+09 atomic steps -hash conflicts: 2.8837553e+08 (resolved) - -Stats on memory usage (in Megabytes): - 3537.374 equivalent memory usage for states (stored*(State-vector + overhead)) - 2843.050 actual memory usage for states (compression: 80.37%) - state-vector as stored = 40 byte + 28 byte overhead - 512.000 memory used for hash table (-w26) - 457.764 memory used for DFS stack (-m10000000) - 3812.568 total actual memory usage - -unreached in proctype urcu_reader - line 398, ".input.spin", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 61, "(1)" - line 417, ".input.spin", state 91, "(1)" - line 398, ".input.spin", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 158, "(1)" - line 417, ".input.spin", state 188, "(1)" - line 398, ".input.spin", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 256, "(1)" - line 417, ".input.spin", state 286, "(1)" - line 398, ".input.spin", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 395, "(1)" - line 417, ".input.spin", state 425, "(1)" - line 539, ".input.spin", state 456, "-end-" - (17 of 456 states) -unreached in proctype urcu_reader_sig - line 398, ".input.spin", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 70, "(1)" - line 417, ".input.spin", state 100, "(1)" - line 398, ".input.spin", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 158, "(1)" - line 417, ".input.spin", state 188, "(1)" - line 398, ".input.spin", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 247, "(1)" - line 417, ".input.spin", state 277, "(1)" - line 398, ".input.spin", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 359, "(1)" - line 417, ".input.spin", state 389, "(1)" - line 613, ".input.spin", state 411, "-end-" - (17 of 411 states) -unreached in proctype urcu_writer - line 398, ".input.spin", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, ".input.spin", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 59, "(1)" - line 412, ".input.spin", state 72, "(1)" - line 417, ".input.spin", state 89, "(1)" - line 398, ".input.spin", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, ".input.spin", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 153, "(1)" - line 412, ".input.spin", state 166, "(1)" - line 651, ".input.spin", state 199, "(1)" - line 174, ".input.spin", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 178, ".input.spin", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, ".input.spin", state 240, "(1)" - line 163, ".input.spin", state 248, "(1)" - line 167, ".input.spin", state 260, "(1)" - line 174, ".input.spin", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 178, ".input.spin", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, ".input.spin", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, ".input.spin", state 370, "(1)" - line 163, ".input.spin", state 378, "(1)" - line 167, ".input.spin", state 390, "(1)" - line 398, ".input.spin", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, ".input.spin", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 449, "(1)" - line 412, ".input.spin", state 462, "(1)" - line 417, ".input.spin", state 479, "(1)" - line 398, ".input.spin", state 498, "(1)" - line 402, ".input.spin", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, ".input.spin", state 554, "(1)" - line 417, ".input.spin", state 571, "(1)" - line 402, ".input.spin", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, ".input.spin", state 647, "(1)" - line 417, ".input.spin", state 664, "(1)" - line 178, ".input.spin", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, ".input.spin", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, ".input.spin", state 710, "(1)" - line 163, ".input.spin", state 718, "(1)" - line 167, ".input.spin", state 730, "(1)" - line 174, ".input.spin", state 741, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 178, ".input.spin", state 817, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, ".input.spin", state 830, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, ".input.spin", state 840, "(1)" - line 163, ".input.spin", state 848, "(1)" - line 167, ".input.spin", state 860, "(1)" - line 398, ".input.spin", state 882, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 398, ".input.spin", state 884, "(1)" - line 398, ".input.spin", state 885, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 398, ".input.spin", state 885, "else" - line 398, ".input.spin", state 888, "(1)" - line 402, ".input.spin", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, ".input.spin", state 898, "(1)" - line 402, ".input.spin", state 899, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, ".input.spin", state 899, "else" - line 402, ".input.spin", state 902, "(1)" - line 402, ".input.spin", state 903, "(1)" - line 402, ".input.spin", state 903, "(1)" - line 400, ".input.spin", state 908, "((i<1))" - line 400, ".input.spin", state 908, "((i>=1))" - line 407, ".input.spin", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 927, "(1)" - line 408, ".input.spin", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 408, ".input.spin", state 928, "else" - line 408, ".input.spin", state 931, "(1)" - line 408, ".input.spin", state 932, "(1)" - line 408, ".input.spin", state 932, "(1)" - line 412, ".input.spin", state 940, "(1)" - line 412, ".input.spin", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 412, ".input.spin", state 941, "else" - line 412, ".input.spin", state 944, "(1)" - line 412, ".input.spin", state 945, "(1)" - line 412, ".input.spin", state 945, "(1)" - line 410, ".input.spin", state 950, "((i<1))" - line 410, ".input.spin", state 950, "((i>=1))" - line 417, ".input.spin", state 957, "(1)" - line 417, ".input.spin", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 417, ".input.spin", state 958, "else" - line 417, ".input.spin", state 961, "(1)" - line 417, ".input.spin", state 962, "(1)" - line 417, ".input.spin", state 962, "(1)" - line 419, ".input.spin", state 965, "(1)" - line 419, ".input.spin", state 965, "(1)" - line 402, ".input.spin", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, ".input.spin", state 1040, "(1)" - line 417, ".input.spin", state 1057, "(1)" - line 402, ".input.spin", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, ".input.spin", state 1130, "(1)" - line 417, ".input.spin", state 1147, "(1)" - line 398, ".input.spin", state 1166, "(1)" - line 402, ".input.spin", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, ".input.spin", state 1222, "(1)" - line 417, ".input.spin", state 1239, "(1)" - line 402, ".input.spin", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, ".input.spin", state 1315, "(1)" - line 417, ".input.spin", state 1332, "(1)" - line 178, ".input.spin", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, ".input.spin", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, ".input.spin", state 1378, "(1)" - line 163, ".input.spin", state 1386, "(1)" - line 167, ".input.spin", state 1398, "(1)" - line 174, ".input.spin", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 178, ".input.spin", state 1485, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, ".input.spin", state 1498, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, ".input.spin", state 1508, "(1)" - line 163, ".input.spin", state 1516, "(1)" - line 167, ".input.spin", state 1528, "(1)" - line 398, ".input.spin", state 1550, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 398, ".input.spin", state 1552, "(1)" - line 398, ".input.spin", state 1553, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 398, ".input.spin", state 1553, "else" - line 398, ".input.spin", state 1556, "(1)" - line 402, ".input.spin", state 1564, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, ".input.spin", state 1566, "(1)" - line 402, ".input.spin", state 1567, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, ".input.spin", state 1567, "else" - line 402, ".input.spin", state 1570, "(1)" - line 402, ".input.spin", state 1571, "(1)" - line 402, ".input.spin", state 1571, "(1)" - line 400, ".input.spin", state 1576, "((i<1))" - line 400, ".input.spin", state 1576, "((i>=1))" - line 407, ".input.spin", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 1595, "(1)" - line 408, ".input.spin", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 408, ".input.spin", state 1596, "else" - line 408, ".input.spin", state 1599, "(1)" - line 408, ".input.spin", state 1600, "(1)" - line 408, ".input.spin", state 1600, "(1)" - line 412, ".input.spin", state 1608, "(1)" - line 412, ".input.spin", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 412, ".input.spin", state 1609, "else" - line 412, ".input.spin", state 1612, "(1)" - line 412, ".input.spin", state 1613, "(1)" - line 412, ".input.spin", state 1613, "(1)" - line 410, ".input.spin", state 1618, "((i<1))" - line 410, ".input.spin", state 1618, "((i>=1))" - line 417, ".input.spin", state 1625, "(1)" - line 417, ".input.spin", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 417, ".input.spin", state 1626, "else" - line 417, ".input.spin", state 1629, "(1)" - line 417, ".input.spin", state 1630, "(1)" - line 417, ".input.spin", state 1630, "(1)" - line 419, ".input.spin", state 1633, "(1)" - line 419, ".input.spin", state 1633, "(1)" - line 178, ".input.spin", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, ".input.spin", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, ".input.spin", state 1681, "(1)" - line 163, ".input.spin", state 1689, "(1)" - line 167, ".input.spin", state 1701, "(1)" - line 174, ".input.spin", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 178, ".input.spin", state 1788, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, ".input.spin", state 1801, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, ".input.spin", state 1811, "(1)" - line 163, ".input.spin", state 1819, "(1)" - line 167, ".input.spin", state 1831, "(1)" - line 701, ".input.spin", state 1856, "-end-" - (158 of 1856 states) -unreached in proctype :init: - (0 of 46 states) - -pan: elapsed time 384 seconds -pan: rate 114968.77 states/second -pan: avg transition delay 7.2389e-07 usec -cp .input.spin asserts.spin.input -cp .input.spin.trail asserts.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/asserts.spin.input b/formal-model/urcu-nosched-model/result-signal-over-reader/asserts.spin.input deleted file mode 100644 index 2d7f62d..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/asserts.spin.input +++ /dev/null @@ -1,722 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/asserts.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-reader/asserts.spin.input.trail deleted file mode 100644 index 287e52a..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/asserts.spin.input.trail +++ /dev/null @@ -1,6 +0,0 @@ --4:-4:-4 -1:0:2673 -2:0:2674 -3:0:2675 -4:0:2676 -5:4:1129 diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/references.txt b/formal-model/urcu-nosched-model/result-signal-over-reader/references.txt deleted file mode 100644 index 72c67a2..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/references.txt +++ /dev/null @@ -1,13 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html - -LTL vs CTL : - -http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 -http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf - (downloaded) diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu.sh b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu.spin b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu.spin deleted file mode 100644 index 2cfcb70..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu.spin +++ /dev/null @@ -1,705 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free.log b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free.log deleted file mode 100644 index a6ab537..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free.log +++ /dev/null @@ -1,326 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 743) -Depth= 6837 States= 1e+06 Transitions= 9.03e+06 Memory= 534.904 t= 7.74 R= 1e+05 -Depth= 8887 States= 2e+06 Transitions= 1.88e+07 Memory= 603.557 t= 16.6 R= 1e+05 -Depth= 8887 States= 3e+06 Transitions= 3.14e+07 Memory= 672.209 t= 28 R= 1e+05 -pan: resizing hashtable to -w22.. done -Depth= 8887 States= 4e+06 Transitions= 4.33e+07 Memory= 771.885 t= 39.1 R= 1e+05 -Depth= 8887 States= 5e+06 Transitions= 5.65e+07 Memory= 840.635 t= 50.7 R= 1e+05 -Depth= 8887 States= 6e+06 Transitions= 6.79e+07 Memory= 909.287 t= 61 R= 1e+05 -Depth= 8887 States= 7e+06 Transitions= 8.08e+07 Memory= 977.940 t= 72.6 R= 1e+05 -Depth= 8887 States= 8e+06 Transitions= 9.5e+07 Memory= 1046.592 t= 85.5 R= 9e+04 -Depth= 8887 States= 9e+06 Transitions= 1.07e+08 Memory= 1115.342 t= 96.7 R= 9e+04 -pan: resizing hashtable to -w24.. done -Depth= 8887 States= 1e+07 Transitions= 1.18e+08 Memory= 1308.088 t= 108 R= 9e+04 -Depth= 8887 States= 1.1e+07 Transitions= 1.3e+08 Memory= 1376.740 t= 119 R= 9e+04 -Depth= 8887 States= 1.2e+07 Transitions= 1.41e+08 Memory= 1445.393 t= 128 R= 9e+04 -Depth= 8887 States= 1.3e+07 Transitions= 1.51e+08 Memory= 1514.045 t= 138 R= 9e+04 -Depth= 8887 States= 1.4e+07 Transitions= 1.64e+08 Memory= 1582.795 t= 149 R= 9e+04 -Depth= 8887 States= 1.5e+07 Transitions= 1.77e+08 Memory= 1651.447 t= 160 R= 9e+04 -Depth= 8887 States= 1.6e+07 Transitions= 1.9e+08 Memory= 1720.100 t= 172 R= 9e+04 -Depth= 8887 States= 1.7e+07 Transitions= 2.02e+08 Memory= 1788.752 t= 183 R= 9e+04 -Depth= 8887 States= 1.8e+07 Transitions= 2.15e+08 Memory= 1857.502 t= 194 R= 9e+04 -Depth= 8887 States= 1.9e+07 Transitions= 2.29e+08 Memory= 1926.154 t= 207 R= 9e+04 -Depth= 8887 States= 2e+07 Transitions= 2.4e+08 Memory= 1994.807 t= 217 R= 9e+04 -Depth= 8887 States= 2.1e+07 Transitions= 2.51e+08 Memory= 2063.459 t= 227 R= 9e+04 -Depth= 8887 States= 2.2e+07 Transitions= 2.63e+08 Memory= 2132.209 t= 238 R= 9e+04 -Depth= 8887 States= 2.3e+07 Transitions= 2.74e+08 Memory= 2200.861 t= 248 R= 9e+04 -Depth= 8887 States= 2.4e+07 Transitions= 2.86e+08 Memory= 2269.514 t= 259 R= 9e+04 -Depth= 8887 States= 2.5e+07 Transitions= 2.98e+08 Memory= 2338.166 t= 270 R= 9e+04 -Depth= 8887 States= 2.6e+07 Transitions= 3.1e+08 Memory= 2406.916 t= 281 R= 9e+04 -Depth= 8887 States= 2.7e+07 Transitions= 3.24e+08 Memory= 2475.568 t= 294 R= 9e+04 -Depth= 8887 States= 2.8e+07 Transitions= 3.36e+08 Memory= 2544.221 t= 305 R= 9e+04 -Depth= 8887 States= 2.9e+07 Transitions= 3.49e+08 Memory= 2612.873 t= 317 R= 9e+04 -Depth= 8887 States= 3e+07 Transitions= 3.63e+08 Memory= 2681.526 t= 329 R= 9e+04 -Depth= 8887 States= 3.1e+07 Transitions= 3.73e+08 Memory= 2750.276 t= 339 R= 9e+04 -Depth= 8887 States= 3.2e+07 Transitions= 3.85e+08 Memory= 2818.928 t= 351 R= 9e+04 -Depth= 8887 States= 3.3e+07 Transitions= 3.97e+08 Memory= 2887.580 t= 362 R= 9e+04 -Depth= 8887 States= 3.4e+07 Transitions= 4.08e+08 Memory= 2956.233 t= 373 R= 9e+04 -pan: resizing hashtable to -w26.. done -Depth= 8887 States= 3.5e+07 Transitions= 4.2e+08 Memory= 3520.967 t= 391 R= 9e+04 -Depth= 8887 States= 3.6e+07 Transitions= 4.32e+08 Memory= 3589.619 t= 402 R= 9e+04 -Depth= 8887 States= 3.7e+07 Transitions= 4.44e+08 Memory= 3658.272 t= 413 R= 9e+04 -Depth= 8887 States= 3.8e+07 Transitions= 4.58e+08 Memory= 3727.022 t= 425 R= 9e+04 -Depth= 8887 States= 3.9e+07 Transitions= 4.7e+08 Memory= 3795.674 t= 435 R= 9e+04 -Depth= 8887 States= 4e+07 Transitions= 4.83e+08 Memory= 3864.326 t= 447 R= 9e+04 -Depth= 8887 States= 4.1e+07 Transitions= 4.97e+08 Memory= 3932.979 t= 459 R= 9e+04 -Depth= 8887 States= 4.2e+07 Transitions= 5.07e+08 Memory= 4001.729 t= 468 R= 9e+04 -Depth= 8887 States= 4.3e+07 Transitions= 5.19e+08 Memory= 4070.381 t= 479 R= 9e+04 -Depth= 8887 States= 4.4e+07 Transitions= 5.31e+08 Memory= 4139.033 t= 489 R= 9e+04 -Depth= 8887 States= 4.5e+07 Transitions= 5.42e+08 Memory= 4207.686 t= 499 R= 9e+04 -Depth= 8887 States= 4.6e+07 Transitions= 5.54e+08 Memory= 4276.338 t= 510 R= 9e+04 -Depth= 8887 States= 4.7e+07 Transitions= 5.67e+08 Memory= 4345.088 t= 521 R= 9e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 64 byte, depth reached 8887, errors: 0 - 47143033 states, stored -5.2129161e+08 states, matched -5.6843464e+08 transitions (= stored+matched) -1.9783052e+09 atomic steps -hash conflicts: 3.1395137e+08 (resolved) - -Stats on memory usage (in Megabytes): - 4136.237 equivalent memory usage for states (stored*(State-vector + overhead)) - 3385.741 actual memory usage for states (compression: 81.86%) - state-vector as stored = 47 byte + 28 byte overhead - 512.000 memory used for hash table (-w26) - 457.764 memory used for DFS stack (-m10000000) - 4354.854 total actual memory usage - -unreached in proctype urcu_reader - line 398, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 61, "(1)" - line 417, "pan.___", state 91, "(1)" - line 398, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 158, "(1)" - line 417, "pan.___", state 188, "(1)" - line 398, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 256, "(1)" - line 417, "pan.___", state 286, "(1)" - line 398, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 395, "(1)" - line 417, "pan.___", state 425, "(1)" - line 539, "pan.___", state 456, "-end-" - (17 of 456 states) -unreached in proctype urcu_reader_sig - line 398, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 70, "(1)" - line 417, "pan.___", state 100, "(1)" - line 398, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 158, "(1)" - line 417, "pan.___", state 188, "(1)" - line 398, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 247, "(1)" - line 417, "pan.___", state 277, "(1)" - line 398, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 359, "(1)" - line 417, "pan.___", state 389, "(1)" - line 613, "pan.___", state 411, "-end-" - (17 of 411 states) -unreached in proctype urcu_writer - line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 59, "(1)" - line 412, "pan.___", state 72, "(1)" - line 417, "pan.___", state 89, "(1)" - line 398, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 153, "(1)" - line 412, "pan.___", state 166, "(1)" - line 651, "pan.___", state 199, "(1)" - line 174, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 178, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, "pan.___", state 240, "(1)" - line 163, "pan.___", state 248, "(1)" - line 167, "pan.___", state 260, "(1)" - line 174, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 178, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, "pan.___", state 370, "(1)" - line 163, "pan.___", state 378, "(1)" - line 167, "pan.___", state 390, "(1)" - line 398, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 449, "(1)" - line 412, "pan.___", state 462, "(1)" - line 417, "pan.___", state 479, "(1)" - line 398, "pan.___", state 498, "(1)" - line 402, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, "pan.___", state 554, "(1)" - line 417, "pan.___", state 571, "(1)" - line 402, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, "pan.___", state 647, "(1)" - line 417, "pan.___", state 664, "(1)" - line 178, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, "pan.___", state 710, "(1)" - line 163, "pan.___", state 718, "(1)" - line 167, "pan.___", state 730, "(1)" - line 174, "pan.___", state 741, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 178, "pan.___", state 817, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, "pan.___", state 830, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, "pan.___", state 840, "(1)" - line 163, "pan.___", state 848, "(1)" - line 167, "pan.___", state 860, "(1)" - line 398, "pan.___", state 882, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 398, "pan.___", state 884, "(1)" - line 398, "pan.___", state 885, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 398, "pan.___", state 885, "else" - line 398, "pan.___", state 888, "(1)" - line 402, "pan.___", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, "pan.___", state 898, "(1)" - line 402, "pan.___", state 899, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, "pan.___", state 899, "else" - line 402, "pan.___", state 902, "(1)" - line 402, "pan.___", state 903, "(1)" - line 402, "pan.___", state 903, "(1)" - line 400, "pan.___", state 908, "((i<1))" - line 400, "pan.___", state 908, "((i>=1))" - line 407, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 927, "(1)" - line 408, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 408, "pan.___", state 928, "else" - line 408, "pan.___", state 931, "(1)" - line 408, "pan.___", state 932, "(1)" - line 408, "pan.___", state 932, "(1)" - line 412, "pan.___", state 940, "(1)" - line 412, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 412, "pan.___", state 941, "else" - line 412, "pan.___", state 944, "(1)" - line 412, "pan.___", state 945, "(1)" - line 412, "pan.___", state 945, "(1)" - line 410, "pan.___", state 950, "((i<1))" - line 410, "pan.___", state 950, "((i>=1))" - line 417, "pan.___", state 957, "(1)" - line 417, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 417, "pan.___", state 958, "else" - line 417, "pan.___", state 961, "(1)" - line 417, "pan.___", state 962, "(1)" - line 417, "pan.___", state 962, "(1)" - line 419, "pan.___", state 965, "(1)" - line 419, "pan.___", state 965, "(1)" - line 402, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, "pan.___", state 1040, "(1)" - line 417, "pan.___", state 1057, "(1)" - line 402, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, "pan.___", state 1130, "(1)" - line 417, "pan.___", state 1147, "(1)" - line 398, "pan.___", state 1166, "(1)" - line 402, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, "pan.___", state 1222, "(1)" - line 417, "pan.___", state 1239, "(1)" - line 402, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, "pan.___", state 1315, "(1)" - line 417, "pan.___", state 1332, "(1)" - line 178, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, "pan.___", state 1378, "(1)" - line 163, "pan.___", state 1386, "(1)" - line 167, "pan.___", state 1398, "(1)" - line 174, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 178, "pan.___", state 1485, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, "pan.___", state 1498, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, "pan.___", state 1508, "(1)" - line 163, "pan.___", state 1516, "(1)" - line 167, "pan.___", state 1528, "(1)" - line 398, "pan.___", state 1550, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 398, "pan.___", state 1552, "(1)" - line 398, "pan.___", state 1553, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 398, "pan.___", state 1553, "else" - line 398, "pan.___", state 1556, "(1)" - line 402, "pan.___", state 1564, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, "pan.___", state 1566, "(1)" - line 402, "pan.___", state 1567, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, "pan.___", state 1567, "else" - line 402, "pan.___", state 1570, "(1)" - line 402, "pan.___", state 1571, "(1)" - line 402, "pan.___", state 1571, "(1)" - line 400, "pan.___", state 1576, "((i<1))" - line 400, "pan.___", state 1576, "((i>=1))" - line 407, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1595, "(1)" - line 408, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 408, "pan.___", state 1596, "else" - line 408, "pan.___", state 1599, "(1)" - line 408, "pan.___", state 1600, "(1)" - line 408, "pan.___", state 1600, "(1)" - line 412, "pan.___", state 1608, "(1)" - line 412, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 412, "pan.___", state 1609, "else" - line 412, "pan.___", state 1612, "(1)" - line 412, "pan.___", state 1613, "(1)" - line 412, "pan.___", state 1613, "(1)" - line 410, "pan.___", state 1618, "((i<1))" - line 410, "pan.___", state 1618, "((i>=1))" - line 417, "pan.___", state 1625, "(1)" - line 417, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 417, "pan.___", state 1626, "else" - line 417, "pan.___", state 1629, "(1)" - line 417, "pan.___", state 1630, "(1)" - line 417, "pan.___", state 1630, "(1)" - line 419, "pan.___", state 1633, "(1)" - line 419, "pan.___", state 1633, "(1)" - line 178, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, "pan.___", state 1681, "(1)" - line 163, "pan.___", state 1689, "(1)" - line 167, "pan.___", state 1701, "(1)" - line 174, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 178, "pan.___", state 1788, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, "pan.___", state 1801, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, "pan.___", state 1811, "(1)" - line 163, "pan.___", state 1819, "(1)" - line 167, "pan.___", state 1831, "(1)" - line 701, "pan.___", state 1856, "-end-" - (158 of 1856 states) -unreached in proctype :init: - (0 of 46 states) -unreached in proctype :never: - line 748, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 523 seconds -pan: rate 90149.985 states/second -pan: avg transition delay 9.1997e-07 usec -cp .input.spin urcu_free.spin.input -cp .input.spin.trail urcu_free.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free.ltl b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free.ltl deleted file mode 100644 index 1954414..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free.ltl +++ /dev/null @@ -1 +0,0 @@ -[] (read_free -> !read_free_race) diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free.spin.input b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free.spin.input deleted file mode 100644 index 2d7f62d..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free.spin.input +++ /dev/null @@ -1,722 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free.spin.input.trail deleted file mode 100644 index 837f3d9..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free.spin.input.trail +++ /dev/null @@ -1,15043 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4365 -2:4:4317 -3:4:4320 -4:4:4320 -5:4:4320 -6:4:4323 -7:4:4331 -8:4:4331 -9:4:4331 -10:4:4334 -11:4:4340 -12:4:4344 -13:4:4344 -14:4:4344 -15:4:4347 -16:4:4340 -17:4:4344 -18:4:4344 -19:4:4344 -20:4:4347 -21:4:4355 -22:4:4359 -23:4:4360 -24:0:4365 -25:4:4362 -26:0:4365 -27:3:2331 -28:0:4365 -29:3:2337 -30:0:4365 -31:3:2338 -32:0:4365 -33:3:2339 -34:3:2343 -35:3:2344 -36:3:2352 -37:3:2353 -38:3:2357 -39:3:2358 -40:3:2352 -41:3:2353 -42:3:2357 -43:3:2358 -44:3:2366 -45:3:2371 -46:3:2375 -47:3:2376 -48:3:2383 -49:3:2384 -50:3:2395 -51:3:2396 -52:3:2397 -53:3:2395 -54:3:2396 -55:3:2397 -56:3:2408 -57:3:2413 -58:3:2414 -59:0:4365 -60:3:2426 -61:0:4365 -62:3:2427 -63:0:4365 -64:2:1162 -65:0:4365 -66:3:2428 -67:0:4365 -68:2:1168 -69:0:4365 -70:2:1169 -71:0:4365 -72:3:2427 -73:0:4365 -74:2:1170 -75:0:4365 -76:3:2428 -77:0:4365 -78:3:2429 -79:0:4365 -80:3:2435 -81:3:2436 -82:0:4365 -83:3:2440 -84:3:2444 -85:3:2445 -86:3:2453 -87:3:2454 -88:3:2458 -89:3:2459 -90:3:2453 -91:3:2454 -92:3:2458 -93:3:2459 -94:3:2467 -95:3:2472 -96:3:2473 -97:3:2484 -98:3:2485 -99:3:2496 -100:3:2497 -101:3:2498 -102:3:2496 -103:3:2497 -104:3:2498 -105:3:2509 -106:3:2514 -107:3:2515 -108:0:4365 -109:3:2527 -110:0:4365 -111:3:2528 -112:0:4365 -113:2:1173 -114:0:4365 -115:3:2529 -116:0:4365 -117:2:1179 -118:0:4365 -119:2:1180 -120:0:4365 -121:3:2528 -122:0:4365 -123:2:1181 -124:2:1185 -125:2:1186 -126:2:1194 -127:2:1195 -128:2:1199 -129:2:1200 -130:2:1194 -131:2:1195 -132:2:1199 -133:2:1200 -134:2:1208 -135:2:1213 -136:2:1217 -137:2:1218 -138:2:1225 -139:2:1226 -140:2:1237 -141:2:1238 -142:2:1239 -143:2:1237 -144:2:1238 -145:2:1239 -146:2:1250 -147:2:1255 -148:2:1256 -149:0:4365 -150:3:2529 -151:0:4365 -152:2:1268 -153:0:4365 -154:3:2528 -155:0:4365 -156:2:1270 -157:0:4365 -158:3:2529 -159:0:4365 -160:2:1271 -161:2:1275 -162:2:1276 -163:2:1284 -164:2:1285 -165:2:1289 -166:2:1290 -167:2:1284 -168:2:1285 -169:2:1289 -170:2:1290 -171:2:1298 -172:2:1303 -173:2:1307 -174:2:1308 -175:2:1315 -176:2:1316 -177:2:1327 -178:2:1328 -179:2:1329 -180:2:1327 -181:2:1328 -182:2:1329 -183:2:1340 -184:2:1345 -185:2:1346 -186:0:4365 -187:2:1358 -188:0:4365 -189:2:1360 -190:0:4365 -191:3:2528 -192:0:4365 -193:2:1361 -194:0:4365 -195:3:2529 -196:0:4365 -197:2:1362 -198:2:1366 -199:2:1367 -200:2:1375 -201:2:1376 -202:2:1380 -203:2:1381 -204:2:1375 -205:2:1376 -206:2:1380 -207:2:1381 -208:2:1389 -209:2:1394 -210:2:1398 -211:2:1399 -212:2:1406 -213:2:1407 -214:2:1418 -215:2:1419 -216:2:1420 -217:2:1418 -218:2:1419 -219:2:1420 -220:2:1431 -221:2:1436 -222:2:1437 -223:0:4365 -224:2:1449 -225:0:4365 -226:3:2528 -227:0:4365 -228:2:1451 -229:0:4365 -230:3:2529 -231:0:4365 -232:2:1652 -233:0:4365 -234:2:1653 -235:0:4365 -236:2:1657 -237:0:4365 -238:2:1180 -239:0:4365 -240:3:2528 -241:0:4365 -242:2:1181 -243:2:1185 -244:2:1186 -245:2:1194 -246:2:1195 -247:2:1199 -248:2:1200 -249:2:1194 -250:2:1195 -251:2:1196 -252:2:1208 -253:2:1213 -254:2:1217 -255:2:1218 -256:2:1225 -257:2:1226 -258:2:1237 -259:2:1238 -260:2:1239 -261:2:1237 -262:2:1238 -263:2:1239 -264:2:1250 -265:2:1255 -266:2:1256 -267:0:4365 -268:3:2529 -269:0:4365 -270:2:1268 -271:0:4365 -272:3:2528 -273:0:4365 -274:2:1270 -275:0:4365 -276:3:2529 -277:0:4365 -278:2:1271 -279:2:1275 -280:2:1276 -281:2:1284 -282:2:1285 -283:2:1289 -284:2:1290 -285:2:1284 -286:2:1285 -287:2:1289 -288:2:1290 -289:2:1298 -290:2:1303 -291:2:1307 -292:2:1308 -293:2:1315 -294:2:1316 -295:2:1327 -296:2:1328 -297:2:1329 -298:2:1327 -299:2:1328 -300:2:1329 -301:2:1340 -302:2:1345 -303:2:1346 -304:0:4365 -305:2:1358 -306:0:4365 -307:2:1454 -308:0:4365 -309:3:2528 -310:0:4365 -311:2:1455 -312:0:4365 -313:3:2529 -314:0:4365 -315:2:1652 -316:0:4365 -317:2:1653 -318:0:4365 -319:2:1657 -320:0:4365 -321:2:1660 -322:0:4365 -323:3:2528 -324:0:4365 -325:2:1665 -326:2:1669 -327:2:1670 -328:2:1678 -329:2:1679 -330:2:1683 -331:2:1684 -332:2:1678 -333:2:1679 -334:2:1680 -335:2:1692 -336:2:1697 -337:2:1701 -338:2:1702 -339:2:1709 -340:2:1710 -341:2:1721 -342:2:1722 -343:2:1723 -344:2:1721 -345:2:1722 -346:2:1723 -347:2:1734 -348:2:1739 -349:2:1740 -350:0:4365 -351:3:2529 -352:0:4365 -353:2:1752 -354:0:4365 -355:3:2528 -356:0:4365 -357:2:1754 -358:0:4365 -359:3:2529 -360:0:4365 -361:2:1755 -362:2:1759 -363:2:1760 -364:2:1768 -365:2:1769 -366:2:1773 -367:2:1774 -368:2:1768 -369:2:1769 -370:2:1773 -371:2:1774 -372:2:1782 -373:2:1787 -374:2:1791 -375:2:1792 -376:2:1799 -377:2:1800 -378:2:1811 -379:2:1812 -380:2:1813 -381:2:1811 -382:2:1812 -383:2:1813 -384:2:1824 -385:2:1829 -386:2:1830 -387:0:4365 -388:2:1842 -389:0:4365 -390:3:2528 -391:0:4365 -392:2:1844 -393:0:4365 -394:3:2529 -395:0:4365 -396:2:1845 -397:2:1849 -398:2:1850 -399:2:1858 -400:2:1859 -401:2:1863 -402:2:1864 -403:2:1858 -404:2:1859 -405:2:1863 -406:2:1864 -407:2:1872 -408:2:1877 -409:2:1881 -410:2:1882 -411:2:1889 -412:2:1890 -413:2:1901 -414:2:1902 -415:2:1903 -416:2:1901 -417:2:1902 -418:2:1903 -419:2:1914 -420:2:1919 -421:2:1920 -422:0:4365 -423:2:1932 -424:0:4365 -425:3:2528 -426:0:4365 -427:2:1934 -428:0:4365 -429:3:2529 -430:0:4365 -431:2:1935 -432:0:4365 -433:2:1936 -434:0:4365 -435:2:2129 -436:0:4365 -437:2:2130 -438:0:4365 -439:2:2134 -440:0:4365 -441:3:2528 -442:0:4365 -443:2:2136 -444:0:4365 -445:3:2529 -446:0:4365 -447:2:2137 -448:2:2141 -449:2:2142 -450:2:2150 -451:2:2151 -452:2:2155 -453:2:2156 -454:2:2150 -455:2:2151 -456:2:2155 -457:2:2156 -458:2:2164 -459:2:2169 -460:2:2173 -461:2:2174 -462:2:2181 -463:2:2182 -464:2:2193 -465:2:2194 -466:2:2195 -467:2:2193 -468:2:2194 -469:2:2195 -470:2:2206 -471:2:2211 -472:2:2212 -473:0:4365 -474:2:2224 -475:0:4365 -476:3:2528 -477:0:4365 -478:2:2226 -479:0:4365 -480:3:2529 -481:0:4365 -482:2:1936 -483:0:4365 -484:2:2129 -485:0:4365 -486:2:2130 -487:0:4365 -488:2:2134 -489:0:4365 -490:3:2528 -491:0:4365 -492:2:2136 -493:0:4365 -494:3:2529 -495:0:4365 -496:2:2137 -497:2:2141 -498:2:2142 -499:2:2150 -500:2:2151 -501:2:2155 -502:2:2156 -503:2:2150 -504:2:2151 -505:2:2152 -506:2:2164 -507:2:2169 -508:2:2173 -509:2:2174 -510:2:2181 -511:2:2182 -512:2:2193 -513:2:2194 -514:2:2195 -515:2:2193 -516:2:2194 -517:2:2195 -518:2:2206 -519:2:2211 -520:2:2212 -521:0:4365 -522:2:2224 -523:0:4365 -524:3:2528 -525:0:4365 -526:2:2226 -527:0:4365 -528:3:2529 -529:0:4365 -530:2:2230 -531:0:4365 -532:3:2528 -533:0:4365 -534:2:2235 -535:2:2239 -536:2:2240 -537:2:2248 -538:2:2249 -539:2:2253 -540:2:2254 -541:2:2248 -542:2:2249 -543:2:2250 -544:2:2262 -545:2:2267 -546:2:2271 -547:2:2272 -548:2:2279 -549:2:2280 -550:2:2291 -551:2:2292 -552:2:2293 -553:2:2291 -554:2:2292 -555:2:2293 -556:2:2304 -557:2:2309 -558:2:2310 -559:0:4365 -560:3:2529 -561:0:4365 -562:2:2322 -563:0:4365 -564:2:1169 -565:0:4365 -566:3:2528 -567:0:4365 -568:2:1170 -569:0:4365 -570:3:2529 -571:0:4365 -572:3:2530 -573:0:4365 -574:3:2536 -575:0:4365 -576:3:2537 -577:0:4365 -578:3:2547 -579:0:4365 -580:3:2548 -581:0:4365 -582:3:2552 -583:3:2553 -584:3:2557 -585:3:2561 -586:3:2562 -587:3:2557 -588:3:2561 -589:3:2562 -590:3:2566 -591:3:2574 -592:3:2575 -593:3:2580 -594:3:2587 -595:3:2588 -596:3:2587 -597:3:2588 -598:3:2595 -599:3:2600 -600:0:4365 -601:3:2611 -602:0:4365 -603:3:2615 -604:3:2616 -605:3:2620 -606:3:2624 -607:3:2625 -608:3:2620 -609:3:2624 -610:3:2625 -611:3:2629 -612:3:2637 -613:3:2638 -614:3:2643 -615:3:2650 -616:3:2651 -617:3:2650 -618:3:2651 -619:3:2658 -620:3:2663 -621:0:4365 -622:3:2611 -623:0:4365 -624:3:2615 -625:3:2616 -626:3:2620 -627:3:2624 -628:3:2625 -629:3:2620 -630:3:2624 -631:3:2625 -632:3:2629 -633:3:2637 -634:3:2638 -635:3:2643 -636:3:2650 -637:3:2651 -638:3:2650 -639:3:2651 -640:3:2658 -641:3:2663 -642:0:4365 -643:3:2674 -644:0:4365 -645:3:2682 -646:3:2683 -647:3:2687 -648:3:2691 -649:3:2692 -650:3:2687 -651:3:2691 -652:3:2692 -653:3:2696 -654:3:2704 -655:3:2705 -656:3:2710 -657:3:2717 -658:3:2718 -659:3:2717 -660:3:2718 -661:3:2725 -662:3:2730 -663:0:4365 -664:3:2745 -665:0:4365 -666:3:2746 -667:0:4365 -668:2:1173 -669:0:4365 -670:3:2747 -671:0:4365 -672:2:1179 -673:0:4365 -674:2:1180 -675:0:4365 -676:3:2746 -677:0:4365 -678:2:1181 -679:2:1185 -680:2:1186 -681:2:1194 -682:2:1195 -683:2:1199 -684:2:1200 -685:2:1194 -686:2:1195 -687:2:1199 -688:2:1200 -689:2:1208 -690:2:1213 -691:2:1217 -692:2:1218 -693:2:1225 -694:2:1226 -695:2:1237 -696:2:1238 -697:2:1239 -698:2:1237 -699:2:1238 -700:2:1239 -701:2:1250 -702:2:1255 -703:2:1256 -704:0:4365 -705:3:2747 -706:0:4365 -707:2:1268 -708:0:4365 -709:3:2746 -710:0:4365 -711:2:1270 -712:0:4365 -713:3:2747 -714:0:4365 -715:2:1271 -716:2:1275 -717:2:1276 -718:2:1284 -719:2:1285 -720:2:1289 -721:2:1290 -722:2:1284 -723:2:1285 -724:2:1289 -725:2:1290 -726:2:1298 -727:2:1303 -728:2:1307 -729:2:1308 -730:2:1315 -731:2:1316 -732:2:1327 -733:2:1328 -734:2:1329 -735:2:1327 -736:2:1328 -737:2:1329 -738:2:1340 -739:2:1345 -740:2:1346 -741:0:4365 -742:2:1358 -743:0:4365 -744:2:1360 -745:0:4365 -746:3:2746 -747:0:4365 -748:2:1361 -749:0:4365 -750:3:2747 -751:0:4365 -752:2:1362 -753:2:1366 -754:2:1367 -755:2:1375 -756:2:1376 -757:2:1380 -758:2:1381 -759:2:1375 -760:2:1376 -761:2:1380 -762:2:1381 -763:2:1389 -764:2:1394 -765:2:1398 -766:2:1399 -767:2:1406 -768:2:1407 -769:2:1418 -770:2:1419 -771:2:1420 -772:2:1418 -773:2:1419 -774:2:1420 -775:2:1431 -776:2:1436 -777:2:1437 -778:0:4365 -779:2:1449 -780:0:4365 -781:3:2746 -782:0:4365 -783:2:1451 -784:0:4365 -785:3:2747 -786:0:4365 -787:2:1652 -788:0:4365 -789:2:1653 -790:0:4365 -791:2:1657 -792:0:4365 -793:2:1180 -794:0:4365 -795:3:2746 -796:0:4365 -797:2:1181 -798:2:1185 -799:2:1186 -800:2:1194 -801:2:1195 -802:2:1199 -803:2:1200 -804:2:1194 -805:2:1195 -806:2:1196 -807:2:1208 -808:2:1213 -809:2:1217 -810:2:1218 -811:2:1225 -812:2:1226 -813:2:1237 -814:2:1238 -815:2:1239 -816:2:1237 -817:2:1238 -818:2:1239 -819:2:1250 -820:2:1255 -821:2:1256 -822:0:4365 -823:3:2747 -824:0:4365 -825:2:1268 -826:0:4365 -827:3:2746 -828:0:4365 -829:2:1270 -830:0:4365 -831:3:2747 -832:0:4365 -833:2:1271 -834:2:1275 -835:2:1276 -836:2:1284 -837:2:1285 -838:2:1289 -839:2:1290 -840:2:1284 -841:2:1285 -842:2:1289 -843:2:1290 -844:2:1298 -845:2:1303 -846:2:1307 -847:2:1308 -848:2:1315 -849:2:1316 -850:2:1327 -851:2:1328 -852:2:1329 -853:2:1327 -854:2:1328 -855:2:1329 -856:2:1340 -857:2:1345 -858:2:1346 -859:0:4365 -860:2:1358 -861:0:4365 -862:2:1454 -863:0:4365 -864:3:2746 -865:0:4365 -866:2:1455 -867:0:4365 -868:3:2747 -869:0:4365 -870:2:1652 -871:0:4365 -872:2:1653 -873:0:4365 -874:2:1657 -875:0:4365 -876:2:1660 -877:0:4365 -878:3:2746 -879:0:4365 -880:2:1665 -881:2:1669 -882:2:1670 -883:2:1678 -884:2:1679 -885:2:1683 -886:2:1684 -887:2:1678 -888:2:1679 -889:2:1680 -890:2:1692 -891:2:1697 -892:2:1701 -893:2:1702 -894:2:1709 -895:2:1710 -896:2:1721 -897:2:1722 -898:2:1723 -899:2:1721 -900:2:1722 -901:2:1723 -902:2:1734 -903:2:1739 -904:2:1740 -905:0:4365 -906:3:2747 -907:0:4365 -908:2:1752 -909:0:4365 -910:3:2746 -911:0:4365 -912:2:1754 -913:0:4365 -914:3:2747 -915:0:4365 -916:2:1755 -917:2:1759 -918:2:1760 -919:2:1768 -920:2:1769 -921:2:1773 -922:2:1774 -923:2:1768 -924:2:1769 -925:2:1773 -926:2:1774 -927:2:1782 -928:2:1787 -929:2:1791 -930:2:1792 -931:2:1799 -932:2:1800 -933:2:1811 -934:2:1812 -935:2:1813 -936:2:1811 -937:2:1812 -938:2:1813 -939:2:1824 -940:2:1829 -941:2:1830 -942:0:4365 -943:2:1842 -944:0:4365 -945:3:2746 -946:0:4365 -947:2:1844 -948:0:4365 -949:3:2747 -950:0:4365 -951:2:1845 -952:2:1849 -953:2:1850 -954:2:1858 -955:2:1859 -956:2:1863 -957:2:1864 -958:2:1858 -959:2:1859 -960:2:1863 -961:2:1864 -962:2:1872 -963:2:1877 -964:2:1881 -965:2:1882 -966:2:1889 -967:2:1890 -968:2:1901 -969:2:1902 -970:2:1903 -971:2:1901 -972:2:1902 -973:2:1903 -974:2:1914 -975:2:1919 -976:2:1920 -977:0:4365 -978:2:1932 -979:0:4365 -980:3:2746 -981:0:4365 -982:2:1934 -983:0:4365 -984:3:2747 -985:0:4365 -986:2:1935 -987:0:4365 -988:2:1936 -989:0:4365 -990:2:2129 -991:0:4365 -992:2:2130 -993:0:4365 -994:2:2134 -995:0:4365 -996:3:2746 -997:0:4365 -998:2:2136 -999:0:4365 -1000:3:2747 -1001:0:4365 -1002:2:2137 -1003:2:2141 -1004:2:2142 -1005:2:2150 -1006:2:2151 -1007:2:2155 -1008:2:2156 -1009:2:2150 -1010:2:2151 -1011:2:2155 -1012:2:2156 -1013:2:2164 -1014:2:2169 -1015:2:2173 -1016:2:2174 -1017:2:2181 -1018:2:2182 -1019:2:2193 -1020:2:2194 -1021:2:2195 -1022:2:2193 -1023:2:2194 -1024:2:2195 -1025:2:2206 -1026:2:2211 -1027:2:2212 -1028:0:4365 -1029:2:2224 -1030:0:4365 -1031:3:2746 -1032:0:4365 -1033:2:2226 -1034:0:4365 -1035:3:2747 -1036:0:4365 -1037:2:1936 -1038:0:4365 -1039:2:2129 -1040:0:4365 -1041:2:2130 -1042:0:4365 -1043:2:2134 -1044:0:4365 -1045:3:2746 -1046:0:4365 -1047:2:2136 -1048:0:4365 -1049:3:2747 -1050:0:4365 -1051:2:2137 -1052:2:2141 -1053:2:2142 -1054:2:2150 -1055:2:2151 -1056:2:2155 -1057:2:2156 -1058:2:2150 -1059:2:2151 -1060:2:2152 -1061:2:2164 -1062:2:2169 -1063:2:2173 -1064:2:2174 -1065:2:2181 -1066:2:2182 -1067:2:2193 -1068:2:2194 -1069:2:2195 -1070:2:2193 -1071:2:2194 -1072:2:2195 -1073:2:2206 -1074:2:2211 -1075:2:2212 -1076:0:4365 -1077:2:2224 -1078:0:4365 -1079:3:2746 -1080:0:4365 -1081:2:2226 -1082:0:4365 -1083:3:2747 -1084:0:4365 -1085:2:2230 -1086:0:4365 -1087:3:2746 -1088:0:4365 -1089:2:2235 -1090:2:2239 -1091:2:2240 -1092:2:2248 -1093:2:2249 -1094:2:2253 -1095:2:2254 -1096:2:2248 -1097:2:2249 -1098:2:2250 -1099:2:2262 -1100:2:2267 -1101:2:2271 -1102:2:2272 -1103:2:2279 -1104:2:2280 -1105:2:2291 -1106:2:2292 -1107:2:2293 -1108:2:2291 -1109:2:2292 -1110:2:2293 -1111:2:2304 -1112:2:2309 -1113:2:2310 -1114:0:4365 -1115:3:2747 -1116:0:4365 -1117:2:2322 -1118:0:4365 -1119:2:1169 -1120:0:4365 -1121:3:2746 -1122:0:4365 -1123:2:1170 -1124:0:4365 -1125:3:2747 -1126:0:4365 -1127:3:2748 -1128:0:4365 -1129:3:2754 -1130:0:4365 -1131:3:2755 -1132:3:2759 -1133:3:2760 -1134:3:2768 -1135:3:2769 -1136:3:2773 -1137:3:2774 -1138:3:2768 -1139:3:2769 -1140:3:2773 -1141:3:2774 -1142:3:2782 -1143:3:2787 -1144:3:2791 -1145:3:2792 -1146:3:2799 -1147:3:2800 -1148:3:2811 -1149:3:2812 -1150:3:2813 -1151:3:2811 -1152:3:2812 -1153:3:2813 -1154:3:2824 -1155:3:2829 -1156:3:2830 -1157:0:4365 -1158:3:2842 -1159:0:4365 -1160:3:2843 -1161:0:4365 -1162:2:1173 -1163:0:4365 -1164:3:2844 -1165:0:4365 -1166:2:1179 -1167:0:4365 -1168:2:1180 -1169:0:4365 -1170:3:2843 -1171:0:4365 -1172:2:1181 -1173:2:1185 -1174:2:1186 -1175:2:1194 -1176:2:1195 -1177:2:1199 -1178:2:1200 -1179:2:1194 -1180:2:1195 -1181:2:1199 -1182:2:1200 -1183:2:1208 -1184:2:1213 -1185:2:1217 -1186:2:1218 -1187:2:1225 -1188:2:1226 -1189:2:1237 -1190:2:1238 -1191:2:1239 -1192:2:1237 -1193:2:1238 -1194:2:1239 -1195:2:1250 -1196:2:1255 -1197:2:1256 -1198:0:4365 -1199:3:2844 -1200:0:4365 -1201:2:1268 -1202:0:4365 -1203:3:2843 -1204:0:4365 -1205:2:1270 -1206:0:4365 -1207:3:2844 -1208:0:4365 -1209:2:1271 -1210:2:1275 -1211:2:1276 -1212:2:1284 -1213:2:1285 -1214:2:1289 -1215:2:1290 -1216:2:1284 -1217:2:1285 -1218:2:1289 -1219:2:1290 -1220:2:1298 -1221:2:1303 -1222:2:1307 -1223:2:1308 -1224:2:1315 -1225:2:1316 -1226:2:1327 -1227:2:1328 -1228:2:1329 -1229:2:1327 -1230:2:1328 -1231:2:1329 -1232:2:1340 -1233:2:1345 -1234:2:1346 -1235:0:4365 -1236:2:1358 -1237:0:4365 -1238:2:1360 -1239:0:4365 -1240:3:2843 -1241:0:4365 -1242:2:1361 -1243:0:4365 -1244:3:2844 -1245:0:4365 -1246:2:1362 -1247:2:1366 -1248:2:1367 -1249:2:1375 -1250:2:1376 -1251:2:1380 -1252:2:1381 -1253:2:1375 -1254:2:1376 -1255:2:1380 -1256:2:1381 -1257:2:1389 -1258:2:1394 -1259:2:1398 -1260:2:1399 -1261:2:1406 -1262:2:1407 -1263:2:1418 -1264:2:1419 -1265:2:1420 -1266:2:1418 -1267:2:1419 -1268:2:1420 -1269:2:1431 -1270:2:1436 -1271:2:1437 -1272:0:4365 -1273:2:1449 -1274:0:4365 -1275:3:2843 -1276:0:4365 -1277:2:1451 -1278:0:4365 -1279:3:2844 -1280:0:4365 -1281:2:1652 -1282:0:4365 -1283:2:1653 -1284:0:4365 -1285:2:1657 -1286:0:4365 -1287:2:1180 -1288:0:4365 -1289:3:2843 -1290:0:4365 -1291:2:1181 -1292:2:1185 -1293:2:1186 -1294:2:1194 -1295:2:1195 -1296:2:1199 -1297:2:1200 -1298:2:1194 -1299:2:1195 -1300:2:1196 -1301:2:1208 -1302:2:1213 -1303:2:1217 -1304:2:1218 -1305:2:1225 -1306:2:1226 -1307:2:1237 -1308:2:1238 -1309:2:1239 -1310:2:1237 -1311:2:1238 -1312:2:1239 -1313:2:1250 -1314:2:1255 -1315:2:1256 -1316:0:4365 -1317:3:2844 -1318:0:4365 -1319:2:1268 -1320:0:4365 -1321:3:2843 -1322:0:4365 -1323:2:1270 -1324:0:4365 -1325:3:2844 -1326:0:4365 -1327:2:1271 -1328:2:1275 -1329:2:1276 -1330:2:1284 -1331:2:1285 -1332:2:1289 -1333:2:1290 -1334:2:1284 -1335:2:1285 -1336:2:1289 -1337:2:1290 -1338:2:1298 -1339:2:1303 -1340:2:1307 -1341:2:1308 -1342:2:1315 -1343:2:1316 -1344:2:1327 -1345:2:1328 -1346:2:1329 -1347:2:1327 -1348:2:1328 -1349:2:1329 -1350:2:1340 -1351:2:1345 -1352:2:1346 -1353:0:4365 -1354:2:1358 -1355:0:4365 -1356:2:1454 -1357:0:4365 -1358:3:2843 -1359:0:4365 -1360:2:1455 -1361:0:4365 -1362:3:2844 -1363:0:4365 -1364:2:1652 -1365:0:4365 -1366:2:1653 -1367:0:4365 -1368:2:1657 -1369:0:4365 -1370:2:1660 -1371:0:4365 -1372:3:2843 -1373:0:4365 -1374:2:1665 -1375:2:1669 -1376:2:1670 -1377:2:1678 -1378:2:1679 -1379:2:1683 -1380:2:1684 -1381:2:1678 -1382:2:1679 -1383:2:1680 -1384:2:1692 -1385:2:1697 -1386:2:1701 -1387:2:1702 -1388:2:1709 -1389:2:1710 -1390:2:1721 -1391:2:1722 -1392:2:1723 -1393:2:1721 -1394:2:1722 -1395:2:1723 -1396:2:1734 -1397:2:1739 -1398:2:1740 -1399:0:4365 -1400:3:2844 -1401:0:4365 -1402:2:1752 -1403:0:4365 -1404:3:2843 -1405:0:4365 -1406:2:1754 -1407:0:4365 -1408:3:2844 -1409:0:4365 -1410:2:1755 -1411:2:1759 -1412:2:1760 -1413:2:1768 -1414:2:1769 -1415:2:1773 -1416:2:1774 -1417:2:1768 -1418:2:1769 -1419:2:1773 -1420:2:1774 -1421:2:1782 -1422:2:1787 -1423:2:1791 -1424:2:1792 -1425:2:1799 -1426:2:1800 -1427:2:1811 -1428:2:1812 -1429:2:1813 -1430:2:1811 -1431:2:1812 -1432:2:1813 -1433:2:1824 -1434:2:1829 -1435:2:1830 -1436:0:4365 -1437:2:1842 -1438:0:4365 -1439:3:2843 -1440:0:4365 -1441:2:1844 -1442:0:4365 -1443:3:2844 -1444:0:4365 -1445:2:1845 -1446:2:1849 -1447:2:1850 -1448:2:1858 -1449:2:1859 -1450:2:1863 -1451:2:1864 -1452:2:1858 -1453:2:1859 -1454:2:1863 -1455:2:1864 -1456:2:1872 -1457:2:1877 -1458:2:1881 -1459:2:1882 -1460:2:1889 -1461:2:1890 -1462:2:1901 -1463:2:1902 -1464:2:1903 -1465:2:1901 -1466:2:1902 -1467:2:1903 -1468:2:1914 -1469:2:1919 -1470:2:1920 -1471:0:4365 -1472:2:1932 -1473:0:4365 -1474:3:2843 -1475:0:4365 -1476:2:1934 -1477:0:4365 -1478:3:2844 -1479:0:4365 -1480:2:1935 -1481:0:4365 -1482:2:1936 -1483:0:4365 -1484:2:2129 -1485:0:4365 -1486:2:2130 -1487:0:4365 -1488:2:2134 -1489:0:4365 -1490:3:2843 -1491:0:4365 -1492:2:2136 -1493:0:4365 -1494:3:2844 -1495:0:4365 -1496:2:2137 -1497:2:2141 -1498:2:2142 -1499:2:2150 -1500:2:2151 -1501:2:2155 -1502:2:2156 -1503:2:2150 -1504:2:2151 -1505:2:2155 -1506:2:2156 -1507:2:2164 -1508:2:2169 -1509:2:2173 -1510:2:2174 -1511:2:2181 -1512:2:2182 -1513:2:2193 -1514:2:2194 -1515:2:2195 -1516:2:2193 -1517:2:2194 -1518:2:2195 -1519:2:2206 -1520:2:2211 -1521:2:2212 -1522:0:4365 -1523:2:2224 -1524:0:4365 -1525:3:2843 -1526:0:4365 -1527:2:2226 -1528:0:4365 -1529:3:2844 -1530:0:4365 -1531:2:1936 -1532:0:4365 -1533:2:2129 -1534:0:4365 -1535:2:2130 -1536:0:4365 -1537:2:2134 -1538:0:4365 -1539:3:2843 -1540:0:4365 -1541:2:2136 -1542:0:4365 -1543:3:2844 -1544:0:4365 -1545:2:2137 -1546:2:2141 -1547:2:2142 -1548:2:2150 -1549:2:2151 -1550:2:2155 -1551:2:2156 -1552:2:2150 -1553:2:2151 -1554:2:2152 -1555:2:2164 -1556:2:2169 -1557:2:2173 -1558:2:2174 -1559:2:2181 -1560:2:2182 -1561:2:2193 -1562:2:2194 -1563:2:2195 -1564:2:2193 -1565:2:2194 -1566:2:2195 -1567:2:2206 -1568:2:2211 -1569:2:2212 -1570:0:4365 -1571:2:2224 -1572:0:4365 -1573:3:2843 -1574:0:4365 -1575:2:2226 -1576:0:4365 -1577:3:2844 -1578:0:4365 -1579:2:2230 -1580:0:4365 -1581:3:2843 -1582:0:4365 -1583:2:2235 -1584:2:2239 -1585:2:2240 -1586:2:2248 -1587:2:2249 -1588:2:2253 -1589:2:2254 -1590:2:2248 -1591:2:2249 -1592:2:2250 -1593:2:2262 -1594:2:2267 -1595:2:2271 -1596:2:2272 -1597:2:2279 -1598:2:2280 -1599:2:2291 -1600:2:2292 -1601:2:2293 -1602:2:2291 -1603:2:2292 -1604:2:2293 -1605:2:2304 -1606:2:2309 -1607:2:2310 -1608:0:4365 -1609:3:2844 -1610:0:4365 -1611:2:2322 -1612:0:4365 -1613:2:1169 -1614:0:4365 -1615:3:2843 -1616:0:4365 -1617:2:1170 -1618:0:4365 -1619:3:2844 -1620:0:4365 -1621:3:2845 -1622:0:4365 -1623:3:2851 -1624:0:4365 -1625:3:2854 -1626:3:2855 -1627:3:2867 -1628:3:2868 -1629:3:2872 -1630:3:2873 -1631:3:2867 -1632:3:2868 -1633:3:2872 -1634:3:2873 -1635:3:2881 -1636:3:2886 -1637:3:2890 -1638:3:2891 -1639:3:2898 -1640:3:2899 -1641:3:2910 -1642:3:2911 -1643:3:2912 -1644:3:2910 -1645:3:2911 -1646:3:2912 -1647:3:2923 -1648:3:2928 -1649:3:2929 -1650:0:4365 -1651:3:2941 -1652:0:4365 -1653:3:2942 -1654:0:4365 -1655:2:1173 -1656:0:4365 -1657:3:2943 -1658:0:4365 -1659:2:1179 -1660:0:4365 -1661:2:1180 -1662:0:4365 -1663:3:2942 -1664:0:4365 -1665:2:1181 -1666:2:1185 -1667:2:1186 -1668:2:1194 -1669:2:1195 -1670:2:1199 -1671:2:1200 -1672:2:1194 -1673:2:1195 -1674:2:1199 -1675:2:1200 -1676:2:1208 -1677:2:1213 -1678:2:1217 -1679:2:1218 -1680:2:1225 -1681:2:1226 -1682:2:1237 -1683:2:1238 -1684:2:1239 -1685:2:1237 -1686:2:1238 -1687:2:1239 -1688:2:1250 -1689:2:1255 -1690:2:1256 -1691:0:4365 -1692:3:2943 -1693:0:4365 -1694:2:1268 -1695:0:4365 -1696:3:2942 -1697:0:4365 -1698:2:1270 -1699:0:4365 -1700:3:2943 -1701:0:4365 -1702:2:1271 -1703:2:1275 -1704:2:1276 -1705:2:1284 -1706:2:1285 -1707:2:1289 -1708:2:1290 -1709:2:1284 -1710:2:1285 -1711:2:1289 -1712:2:1290 -1713:2:1298 -1714:2:1303 -1715:2:1307 -1716:2:1308 -1717:2:1315 -1718:2:1316 -1719:2:1327 -1720:2:1328 -1721:2:1329 -1722:2:1327 -1723:2:1328 -1724:2:1329 -1725:2:1340 -1726:2:1345 -1727:2:1346 -1728:0:4365 -1729:2:1358 -1730:0:4365 -1731:2:1360 -1732:0:4365 -1733:3:2942 -1734:0:4365 -1735:2:1361 -1736:0:4365 -1737:3:2943 -1738:0:4365 -1739:2:1362 -1740:2:1366 -1741:2:1367 -1742:2:1375 -1743:2:1376 -1744:2:1380 -1745:2:1381 -1746:2:1375 -1747:2:1376 -1748:2:1380 -1749:2:1381 -1750:2:1389 -1751:2:1394 -1752:2:1398 -1753:2:1399 -1754:2:1406 -1755:2:1407 -1756:2:1418 -1757:2:1419 -1758:2:1420 -1759:2:1418 -1760:2:1419 -1761:2:1420 -1762:2:1431 -1763:2:1436 -1764:2:1437 -1765:0:4365 -1766:2:1449 -1767:0:4365 -1768:3:2942 -1769:0:4365 -1770:2:1451 -1771:0:4365 -1772:3:2943 -1773:0:4365 -1774:2:1652 -1775:0:4365 -1776:2:1653 -1777:0:4365 -1778:2:1657 -1779:0:4365 -1780:2:1180 -1781:0:4365 -1782:3:2942 -1783:0:4365 -1784:2:1181 -1785:2:1185 -1786:2:1186 -1787:2:1194 -1788:2:1195 -1789:2:1199 -1790:2:1200 -1791:2:1194 -1792:2:1195 -1793:2:1196 -1794:2:1208 -1795:2:1213 -1796:2:1217 -1797:2:1218 -1798:2:1225 -1799:2:1226 -1800:2:1237 -1801:2:1238 -1802:2:1239 -1803:2:1237 -1804:2:1238 -1805:2:1239 -1806:2:1250 -1807:2:1255 -1808:2:1256 -1809:0:4365 -1810:3:2943 -1811:0:4365 -1812:2:1268 -1813:0:4365 -1814:3:2942 -1815:0:4365 -1816:2:1270 -1817:0:4365 -1818:3:2943 -1819:0:4365 -1820:2:1271 -1821:2:1275 -1822:2:1276 -1823:2:1284 -1824:2:1285 -1825:2:1289 -1826:2:1290 -1827:2:1284 -1828:2:1285 -1829:2:1289 -1830:2:1290 -1831:2:1298 -1832:2:1303 -1833:2:1307 -1834:2:1308 -1835:2:1315 -1836:2:1316 -1837:2:1327 -1838:2:1328 -1839:2:1329 -1840:2:1327 -1841:2:1328 -1842:2:1329 -1843:2:1340 -1844:2:1345 -1845:2:1346 -1846:0:4365 -1847:2:1358 -1848:0:4365 -1849:2:1454 -1850:0:4365 -1851:3:2942 -1852:0:4365 -1853:2:1455 -1854:0:4365 -1855:3:2943 -1856:0:4365 -1857:2:1652 -1858:0:4365 -1859:2:1653 -1860:0:4365 -1861:2:1657 -1862:0:4365 -1863:2:1660 -1864:0:4365 -1865:3:2942 -1866:0:4365 -1867:2:1665 -1868:2:1669 -1869:2:1670 -1870:2:1678 -1871:2:1679 -1872:2:1683 -1873:2:1684 -1874:2:1678 -1875:2:1679 -1876:2:1680 -1877:2:1692 -1878:2:1697 -1879:2:1701 -1880:2:1702 -1881:2:1709 -1882:2:1710 -1883:2:1721 -1884:2:1722 -1885:2:1723 -1886:2:1721 -1887:2:1722 -1888:2:1723 -1889:2:1734 -1890:2:1739 -1891:2:1740 -1892:0:4365 -1893:3:2943 -1894:0:4365 -1895:2:1752 -1896:0:4365 -1897:3:2942 -1898:0:4365 -1899:2:1754 -1900:0:4365 -1901:3:2943 -1902:0:4365 -1903:2:1755 -1904:2:1759 -1905:2:1760 -1906:2:1768 -1907:2:1769 -1908:2:1773 -1909:2:1774 -1910:2:1768 -1911:2:1769 -1912:2:1773 -1913:2:1774 -1914:2:1782 -1915:2:1787 -1916:2:1791 -1917:2:1792 -1918:2:1799 -1919:2:1800 -1920:2:1811 -1921:2:1812 -1922:2:1813 -1923:2:1811 -1924:2:1812 -1925:2:1813 -1926:2:1824 -1927:2:1829 -1928:2:1830 -1929:0:4365 -1930:2:1842 -1931:0:4365 -1932:3:2942 -1933:0:4365 -1934:2:1844 -1935:0:4365 -1936:3:2943 -1937:0:4365 -1938:2:1845 -1939:2:1849 -1940:2:1850 -1941:2:1858 -1942:2:1859 -1943:2:1863 -1944:2:1864 -1945:2:1858 -1946:2:1859 -1947:2:1863 -1948:2:1864 -1949:2:1872 -1950:2:1877 -1951:2:1881 -1952:2:1882 -1953:2:1889 -1954:2:1890 -1955:2:1901 -1956:2:1902 -1957:2:1903 -1958:2:1901 -1959:2:1902 -1960:2:1903 -1961:2:1914 -1962:2:1919 -1963:2:1920 -1964:0:4365 -1965:2:1932 -1966:0:4365 -1967:3:2942 -1968:0:4365 -1969:2:1934 -1970:0:4365 -1971:3:2943 -1972:0:4365 -1973:2:1935 -1974:0:4365 -1975:2:1936 -1976:0:4365 -1977:2:2129 -1978:0:4365 -1979:2:2130 -1980:0:4365 -1981:2:2134 -1982:0:4365 -1983:3:2942 -1984:0:4365 -1985:2:2136 -1986:0:4365 -1987:3:2943 -1988:0:4365 -1989:2:2137 -1990:2:2141 -1991:2:2142 -1992:2:2150 -1993:2:2151 -1994:2:2155 -1995:2:2156 -1996:2:2150 -1997:2:2151 -1998:2:2155 -1999:2:2156 -2000:2:2164 -2001:2:2169 -2002:2:2173 -2003:2:2174 -2004:2:2181 -2005:2:2182 -2006:2:2193 -2007:2:2194 -2008:2:2195 -2009:2:2193 -2010:2:2194 -2011:2:2195 -2012:2:2206 -2013:2:2211 -2014:2:2212 -2015:0:4365 -2016:2:2224 -2017:0:4365 -2018:3:2942 -2019:0:4365 -2020:2:2226 -2021:0:4365 -2022:3:2943 -2023:0:4365 -2024:2:1936 -2025:0:4365 -2026:2:2129 -2027:0:4365 -2028:2:2130 -2029:0:4365 -2030:2:2134 -2031:0:4365 -2032:3:2942 -2033:0:4365 -2034:2:2136 -2035:0:4365 -2036:3:2943 -2037:0:4365 -2038:2:2137 -2039:2:2141 -2040:2:2142 -2041:2:2150 -2042:2:2151 -2043:2:2155 -2044:2:2156 -2045:2:2150 -2046:2:2151 -2047:2:2152 -2048:2:2164 -2049:2:2169 -2050:2:2173 -2051:2:2174 -2052:2:2181 -2053:2:2182 -2054:2:2193 -2055:2:2194 -2056:2:2195 -2057:2:2193 -2058:2:2194 -2059:2:2195 -2060:2:2206 -2061:2:2211 -2062:2:2212 -2063:0:4365 -2064:2:2224 -2065:0:4365 -2066:3:2942 -2067:0:4365 -2068:2:2226 -2069:0:4365 -2070:3:2943 -2071:0:4365 -2072:2:2230 -2073:0:4365 -2074:3:2942 -2075:0:4365 -2076:2:2235 -2077:2:2239 -2078:2:2240 -2079:2:2248 -2080:2:2249 -2081:2:2253 -2082:2:2254 -2083:2:2248 -2084:2:2249 -2085:2:2250 -2086:2:2262 -2087:2:2267 -2088:2:2271 -2089:2:2272 -2090:2:2279 -2091:2:2280 -2092:2:2291 -2093:2:2292 -2094:2:2293 -2095:2:2291 -2096:2:2292 -2097:2:2293 -2098:2:2304 -2099:2:2309 -2100:2:2310 -2101:0:4365 -2102:3:2943 -2103:0:4365 -2104:2:2322 -2105:0:4365 -2106:2:1169 -2107:0:4365 -2108:3:2942 -2109:0:4365 -2110:2:1170 -2111:0:4365 -2112:3:2943 -2113:0:4365 -2114:3:2944 -2115:0:4365 -2116:3:2950 -2117:0:4365 -2118:3:2951 -2119:0:4365 -2120:3:2952 -2121:0:4365 -2122:3:2953 -2123:0:4365 -2124:3:2954 -2125:3:2958 -2126:3:2959 -2127:3:2967 -2128:3:2968 -2129:3:2972 -2130:3:2973 -2131:3:2967 -2132:3:2968 -2133:3:2972 -2134:3:2973 -2135:3:2981 -2136:3:2986 -2137:3:2990 -2138:3:2991 -2139:3:2998 -2140:3:2999 -2141:3:3010 -2142:3:3011 -2143:3:3012 -2144:3:3010 -2145:3:3011 -2146:3:3012 -2147:3:3023 -2148:3:3028 -2149:3:3029 -2150:0:4365 -2151:3:3041 -2152:0:4365 -2153:3:3042 -2154:0:4365 -2155:2:1173 -2156:0:4365 -2157:3:3043 -2158:0:4365 -2159:2:1179 -2160:0:4365 -2161:2:1180 -2162:0:4365 -2163:3:3042 -2164:0:4365 -2165:2:1181 -2166:2:1185 -2167:2:1186 -2168:2:1194 -2169:2:1195 -2170:2:1199 -2171:2:1200 -2172:2:1194 -2173:2:1195 -2174:2:1199 -2175:2:1200 -2176:2:1208 -2177:2:1213 -2178:2:1217 -2179:2:1218 -2180:2:1225 -2181:2:1226 -2182:2:1237 -2183:2:1238 -2184:2:1239 -2185:2:1237 -2186:2:1238 -2187:2:1239 -2188:2:1250 -2189:2:1255 -2190:2:1256 -2191:0:4365 -2192:3:3043 -2193:0:4365 -2194:2:1268 -2195:0:4365 -2196:3:3042 -2197:0:4365 -2198:2:1270 -2199:0:4365 -2200:3:3043 -2201:0:4365 -2202:2:1271 -2203:2:1275 -2204:2:1276 -2205:2:1284 -2206:2:1285 -2207:2:1289 -2208:2:1290 -2209:2:1284 -2210:2:1285 -2211:2:1289 -2212:2:1290 -2213:2:1298 -2214:2:1303 -2215:2:1307 -2216:2:1308 -2217:2:1315 -2218:2:1316 -2219:2:1327 -2220:2:1328 -2221:2:1329 -2222:2:1327 -2223:2:1328 -2224:2:1329 -2225:2:1340 -2226:2:1345 -2227:2:1346 -2228:0:4365 -2229:2:1358 -2230:0:4365 -2231:2:1360 -2232:0:4365 -2233:3:3042 -2234:0:4365 -2235:2:1361 -2236:0:4365 -2237:3:3043 -2238:0:4365 -2239:2:1362 -2240:2:1366 -2241:2:1367 -2242:2:1375 -2243:2:1376 -2244:2:1380 -2245:2:1381 -2246:2:1375 -2247:2:1376 -2248:2:1380 -2249:2:1381 -2250:2:1389 -2251:2:1394 -2252:2:1398 -2253:2:1399 -2254:2:1406 -2255:2:1407 -2256:2:1418 -2257:2:1419 -2258:2:1420 -2259:2:1418 -2260:2:1419 -2261:2:1420 -2262:2:1431 -2263:2:1436 -2264:2:1437 -2265:0:4365 -2266:2:1449 -2267:0:4365 -2268:3:3042 -2269:0:4365 -2270:2:1451 -2271:0:4365 -2272:3:3043 -2273:0:4365 -2274:2:1652 -2275:0:4365 -2276:2:1653 -2277:0:4365 -2278:2:1657 -2279:0:4365 -2280:2:1180 -2281:0:4365 -2282:3:3042 -2283:0:4365 -2284:2:1181 -2285:2:1185 -2286:2:1186 -2287:2:1194 -2288:2:1195 -2289:2:1199 -2290:2:1200 -2291:2:1194 -2292:2:1195 -2293:2:1196 -2294:2:1208 -2295:2:1213 -2296:2:1217 -2297:2:1218 -2298:2:1225 -2299:2:1226 -2300:2:1237 -2301:2:1238 -2302:2:1239 -2303:2:1237 -2304:2:1238 -2305:2:1239 -2306:2:1250 -2307:2:1255 -2308:2:1256 -2309:0:4365 -2310:3:3043 -2311:0:4365 -2312:2:1268 -2313:0:4365 -2314:3:3042 -2315:0:4365 -2316:2:1270 -2317:0:4365 -2318:3:3043 -2319:0:4365 -2320:2:1271 -2321:2:1275 -2322:2:1276 -2323:2:1284 -2324:2:1285 -2325:2:1289 -2326:2:1290 -2327:2:1284 -2328:2:1285 -2329:2:1289 -2330:2:1290 -2331:2:1298 -2332:2:1303 -2333:2:1307 -2334:2:1308 -2335:2:1315 -2336:2:1316 -2337:2:1327 -2338:2:1328 -2339:2:1329 -2340:2:1327 -2341:2:1328 -2342:2:1329 -2343:2:1340 -2344:2:1345 -2345:2:1346 -2346:0:4365 -2347:2:1358 -2348:0:4365 -2349:2:1454 -2350:0:4365 -2351:3:3042 -2352:0:4365 -2353:2:1455 -2354:0:4365 -2355:3:3043 -2356:0:4365 -2357:2:1652 -2358:0:4365 -2359:2:1653 -2360:0:4365 -2361:2:1657 -2362:0:4365 -2363:2:1660 -2364:0:4365 -2365:3:3042 -2366:0:4365 -2367:2:1665 -2368:2:1669 -2369:2:1670 -2370:2:1678 -2371:2:1679 -2372:2:1683 -2373:2:1684 -2374:2:1678 -2375:2:1679 -2376:2:1680 -2377:2:1692 -2378:2:1697 -2379:2:1701 -2380:2:1702 -2381:2:1709 -2382:2:1710 -2383:2:1721 -2384:2:1722 -2385:2:1723 -2386:2:1721 -2387:2:1722 -2388:2:1723 -2389:2:1734 -2390:2:1739 -2391:2:1740 -2392:0:4365 -2393:3:3043 -2394:0:4365 -2395:2:1752 -2396:0:4365 -2397:3:3042 -2398:0:4365 -2399:2:1754 -2400:0:4365 -2401:3:3043 -2402:0:4365 -2403:2:1755 -2404:2:1759 -2405:2:1760 -2406:2:1768 -2407:2:1769 -2408:2:1773 -2409:2:1774 -2410:2:1768 -2411:2:1769 -2412:2:1773 -2413:2:1774 -2414:2:1782 -2415:2:1787 -2416:2:1791 -2417:2:1792 -2418:2:1799 -2419:2:1800 -2420:2:1811 -2421:2:1812 -2422:2:1813 -2423:2:1811 -2424:2:1812 -2425:2:1813 -2426:2:1824 -2427:2:1829 -2428:2:1830 -2429:0:4365 -2430:2:1842 -2431:0:4365 -2432:3:3042 -2433:0:4365 -2434:2:1844 -2435:0:4365 -2436:3:3043 -2437:0:4365 -2438:2:1845 -2439:2:1849 -2440:2:1850 -2441:2:1858 -2442:2:1859 -2443:2:1863 -2444:2:1864 -2445:2:1858 -2446:2:1859 -2447:2:1863 -2448:2:1864 -2449:2:1872 -2450:2:1877 -2451:2:1881 -2452:2:1882 -2453:2:1889 -2454:2:1890 -2455:2:1901 -2456:2:1902 -2457:2:1903 -2458:2:1901 -2459:2:1902 -2460:2:1903 -2461:2:1914 -2462:2:1919 -2463:2:1920 -2464:0:4365 -2465:2:1932 -2466:0:4365 -2467:3:3042 -2468:0:4365 -2469:2:1934 -2470:0:4365 -2471:3:3043 -2472:0:4365 -2473:2:1935 -2474:0:4365 -2475:2:1936 -2476:0:4365 -2477:2:2129 -2478:0:4365 -2479:2:2130 -2480:0:4365 -2481:2:2134 -2482:0:4365 -2483:3:3042 -2484:0:4365 -2485:2:2136 -2486:0:4365 -2487:3:3043 -2488:0:4365 -2489:2:2137 -2490:2:2141 -2491:2:2142 -2492:2:2150 -2493:2:2151 -2494:2:2155 -2495:2:2156 -2496:2:2150 -2497:2:2151 -2498:2:2155 -2499:2:2156 -2500:2:2164 -2501:2:2169 -2502:2:2173 -2503:2:2174 -2504:2:2181 -2505:2:2182 -2506:2:2193 -2507:2:2194 -2508:2:2195 -2509:2:2193 -2510:2:2194 -2511:2:2195 -2512:2:2206 -2513:2:2211 -2514:2:2212 -2515:0:4365 -2516:2:2224 -2517:0:4365 -2518:3:3042 -2519:0:4365 -2520:2:2226 -2521:0:4365 -2522:3:3043 -2523:0:4365 -2524:2:1936 -2525:0:4365 -2526:2:2129 -2527:0:4365 -2528:2:2130 -2529:0:4365 -2530:2:2134 -2531:0:4365 -2532:3:3042 -2533:0:4365 -2534:2:2136 -2535:0:4365 -2536:3:3043 -2537:0:4365 -2538:2:2137 -2539:2:2141 -2540:2:2142 -2541:2:2150 -2542:2:2151 -2543:2:2155 -2544:2:2156 -2545:2:2150 -2546:2:2151 -2547:2:2152 -2548:2:2164 -2549:2:2169 -2550:2:2173 -2551:2:2174 -2552:2:2181 -2553:2:2182 -2554:2:2193 -2555:2:2194 -2556:2:2195 -2557:2:2193 -2558:2:2194 -2559:2:2195 -2560:2:2206 -2561:2:2211 -2562:2:2212 -2563:0:4365 -2564:2:2224 -2565:0:4365 -2566:3:3042 -2567:0:4365 -2568:2:2226 -2569:0:4365 -2570:3:3043 -2571:0:4365 -2572:2:2230 -2573:0:4365 -2574:3:3042 -2575:0:4365 -2576:2:2235 -2577:2:2239 -2578:2:2240 -2579:2:2248 -2580:2:2249 -2581:2:2253 -2582:2:2254 -2583:2:2248 -2584:2:2249 -2585:2:2250 -2586:2:2262 -2587:2:2267 -2588:2:2271 -2589:2:2272 -2590:2:2279 -2591:2:2280 -2592:2:2291 -2593:2:2292 -2594:2:2293 -2595:2:2291 -2596:2:2292 -2597:2:2293 -2598:2:2304 -2599:2:2309 -2600:2:2310 -2601:0:4365 -2602:3:3043 -2603:0:4365 -2604:2:2322 -2605:0:4365 -2606:2:1169 -2607:0:4365 -2608:3:3042 -2609:0:4365 -2610:2:1170 -2611:0:4365 -2612:3:3043 -2613:0:4365 -2614:3:3044 -2615:0:4365 -2616:3:3257 -2617:0:4365 -2618:3:3265 -2619:0:4365 -2620:3:3266 -2621:3:3270 -2622:3:3271 -2623:3:3279 -2624:3:3280 -2625:3:3284 -2626:3:3285 -2627:3:3279 -2628:3:3280 -2629:3:3284 -2630:3:3285 -2631:3:3293 -2632:3:3298 -2633:3:3302 -2634:3:3303 -2635:3:3310 -2636:3:3311 -2637:3:3322 -2638:3:3323 -2639:3:3324 -2640:3:3322 -2641:3:3323 -2642:3:3324 -2643:3:3335 -2644:3:3340 -2645:3:3341 -2646:0:4365 -2647:3:3353 -2648:0:4365 -2649:3:3354 -2650:0:4365 -2651:2:1173 -2652:0:4365 -2653:3:3355 -2654:0:4365 -2655:2:1179 -2656:0:4365 -2657:2:1180 -2658:0:4365 -2659:3:3354 -2660:0:4365 -2661:2:1181 -2662:2:1185 -2663:2:1186 -2664:2:1194 -2665:2:1195 -2666:2:1199 -2667:2:1200 -2668:2:1194 -2669:2:1195 -2670:2:1199 -2671:2:1200 -2672:2:1208 -2673:2:1213 -2674:2:1217 -2675:2:1218 -2676:2:1225 -2677:2:1226 -2678:2:1237 -2679:2:1238 -2680:2:1239 -2681:2:1237 -2682:2:1238 -2683:2:1239 -2684:2:1250 -2685:2:1255 -2686:2:1256 -2687:0:4365 -2688:3:3355 -2689:0:4365 -2690:2:1268 -2691:0:4365 -2692:3:3354 -2693:0:4365 -2694:2:1270 -2695:0:4365 -2696:3:3355 -2697:0:4365 -2698:2:1271 -2699:2:1275 -2700:2:1276 -2701:2:1284 -2702:2:1285 -2703:2:1289 -2704:2:1290 -2705:2:1284 -2706:2:1285 -2707:2:1289 -2708:2:1290 -2709:2:1298 -2710:2:1303 -2711:2:1307 -2712:2:1308 -2713:2:1315 -2714:2:1316 -2715:2:1327 -2716:2:1328 -2717:2:1329 -2718:2:1327 -2719:2:1328 -2720:2:1329 -2721:2:1340 -2722:2:1345 -2723:2:1346 -2724:0:4365 -2725:2:1358 -2726:0:4365 -2727:2:1360 -2728:0:4365 -2729:3:3354 -2730:0:4365 -2731:2:1361 -2732:0:4365 -2733:3:3355 -2734:0:4365 -2735:2:1362 -2736:2:1366 -2737:2:1367 -2738:2:1375 -2739:2:1376 -2740:2:1380 -2741:2:1381 -2742:2:1375 -2743:2:1376 -2744:2:1380 -2745:2:1381 -2746:2:1389 -2747:2:1394 -2748:2:1398 -2749:2:1399 -2750:2:1406 -2751:2:1407 -2752:2:1418 -2753:2:1419 -2754:2:1420 -2755:2:1418 -2756:2:1419 -2757:2:1420 -2758:2:1431 -2759:2:1436 -2760:2:1437 -2761:0:4365 -2762:2:1449 -2763:0:4365 -2764:3:3354 -2765:0:4365 -2766:2:1451 -2767:0:4365 -2768:3:3355 -2769:0:4365 -2770:2:1652 -2771:0:4365 -2772:2:1653 -2773:0:4365 -2774:2:1657 -2775:0:4365 -2776:2:1180 -2777:0:4365 -2778:3:3354 -2779:0:4365 -2780:2:1181 -2781:2:1185 -2782:2:1186 -2783:2:1194 -2784:2:1195 -2785:2:1199 -2786:2:1200 -2787:2:1194 -2788:2:1195 -2789:2:1196 -2790:2:1208 -2791:2:1213 -2792:2:1217 -2793:2:1218 -2794:2:1225 -2795:2:1226 -2796:2:1237 -2797:2:1238 -2798:2:1239 -2799:2:1237 -2800:2:1238 -2801:2:1239 -2802:2:1250 -2803:2:1255 -2804:2:1256 -2805:0:4365 -2806:3:3355 -2807:0:4365 -2808:2:1268 -2809:0:4365 -2810:3:3354 -2811:0:4365 -2812:2:1270 -2813:0:4365 -2814:3:3355 -2815:0:4365 -2816:2:1271 -2817:2:1275 -2818:2:1276 -2819:2:1284 -2820:2:1285 -2821:2:1289 -2822:2:1290 -2823:2:1284 -2824:2:1285 -2825:2:1289 -2826:2:1290 -2827:2:1298 -2828:2:1303 -2829:2:1307 -2830:2:1308 -2831:2:1315 -2832:2:1316 -2833:2:1327 -2834:2:1328 -2835:2:1329 -2836:2:1327 -2837:2:1328 -2838:2:1329 -2839:2:1340 -2840:2:1345 -2841:2:1346 -2842:0:4365 -2843:2:1358 -2844:0:4365 -2845:2:1454 -2846:0:4365 -2847:3:3354 -2848:0:4365 -2849:2:1455 -2850:0:4365 -2851:3:3355 -2852:0:4365 -2853:2:1652 -2854:0:4365 -2855:2:1653 -2856:0:4365 -2857:2:1657 -2858:0:4365 -2859:2:1660 -2860:0:4365 -2861:3:3354 -2862:0:4365 -2863:2:1665 -2864:2:1669 -2865:2:1670 -2866:2:1678 -2867:2:1679 -2868:2:1683 -2869:2:1684 -2870:2:1678 -2871:2:1679 -2872:2:1680 -2873:2:1692 -2874:2:1697 -2875:2:1701 -2876:2:1702 -2877:2:1709 -2878:2:1710 -2879:2:1721 -2880:2:1722 -2881:2:1723 -2882:2:1721 -2883:2:1722 -2884:2:1723 -2885:2:1734 -2886:2:1739 -2887:2:1740 -2888:0:4365 -2889:3:3355 -2890:0:4365 -2891:2:1752 -2892:0:4365 -2893:3:3354 -2894:0:4365 -2895:2:1754 -2896:0:4365 -2897:3:3355 -2898:0:4365 -2899:2:1755 -2900:2:1759 -2901:2:1760 -2902:2:1768 -2903:2:1769 -2904:2:1773 -2905:2:1774 -2906:2:1768 -2907:2:1769 -2908:2:1773 -2909:2:1774 -2910:2:1782 -2911:2:1787 -2912:2:1791 -2913:2:1792 -2914:2:1799 -2915:2:1800 -2916:2:1811 -2917:2:1812 -2918:2:1813 -2919:2:1811 -2920:2:1812 -2921:2:1813 -2922:2:1824 -2923:2:1829 -2924:2:1830 -2925:0:4365 -2926:2:1842 -2927:0:4365 -2928:3:3354 -2929:0:4365 -2930:2:1844 -2931:0:4365 -2932:3:3355 -2933:0:4365 -2934:2:1845 -2935:2:1849 -2936:2:1850 -2937:2:1858 -2938:2:1859 -2939:2:1863 -2940:2:1864 -2941:2:1858 -2942:2:1859 -2943:2:1863 -2944:2:1864 -2945:2:1872 -2946:2:1877 -2947:2:1881 -2948:2:1882 -2949:2:1889 -2950:2:1890 -2951:2:1901 -2952:2:1902 -2953:2:1903 -2954:2:1901 -2955:2:1902 -2956:2:1903 -2957:2:1914 -2958:2:1919 -2959:2:1920 -2960:0:4365 -2961:2:1932 -2962:0:4365 -2963:3:3354 -2964:0:4365 -2965:2:1934 -2966:0:4365 -2967:3:3355 -2968:0:4365 -2969:2:1935 -2970:0:4365 -2971:2:1936 -2972:0:4365 -2973:2:2129 -2974:0:4365 -2975:2:2130 -2976:0:4365 -2977:2:2134 -2978:0:4365 -2979:3:3354 -2980:0:4365 -2981:2:2136 -2982:0:4365 -2983:3:3355 -2984:0:4365 -2985:2:2137 -2986:2:2141 -2987:2:2142 -2988:2:2150 -2989:2:2151 -2990:2:2155 -2991:2:2156 -2992:2:2150 -2993:2:2151 -2994:2:2155 -2995:2:2156 -2996:2:2164 -2997:2:2169 -2998:2:2173 -2999:2:2174 -3000:2:2181 -3001:2:2182 -3002:2:2193 -3003:2:2194 -3004:2:2195 -3005:2:2193 -3006:2:2194 -3007:2:2195 -3008:2:2206 -3009:2:2211 -3010:2:2212 -3011:0:4365 -3012:2:2224 -3013:0:4365 -3014:3:3354 -3015:0:4365 -3016:2:2226 -3017:0:4365 -3018:3:3355 -3019:0:4365 -3020:2:1936 -3021:0:4365 -3022:2:2129 -3023:0:4365 -3024:2:2130 -3025:0:4365 -3026:2:2134 -3027:0:4365 -3028:3:3354 -3029:0:4365 -3030:2:2136 -3031:0:4365 -3032:3:3355 -3033:0:4365 -3034:2:2137 -3035:2:2141 -3036:2:2142 -3037:2:2150 -3038:2:2151 -3039:2:2155 -3040:2:2156 -3041:2:2150 -3042:2:2151 -3043:2:2152 -3044:2:2164 -3045:2:2169 -3046:2:2173 -3047:2:2174 -3048:2:2181 -3049:2:2182 -3050:2:2193 -3051:2:2194 -3052:2:2195 -3053:2:2193 -3054:2:2194 -3055:2:2195 -3056:2:2206 -3057:2:2211 -3058:2:2212 -3059:0:4365 -3060:2:2224 -3061:0:4365 -3062:3:3354 -3063:0:4365 -3064:2:2226 -3065:0:4365 -3066:3:3355 -3067:0:4365 -3068:2:2230 -3069:0:4365 -3070:3:3354 -3071:0:4365 -3072:2:2235 -3073:2:2239 -3074:2:2240 -3075:2:2248 -3076:2:2249 -3077:2:2253 -3078:2:2254 -3079:2:2248 -3080:2:2249 -3081:2:2250 -3082:2:2262 -3083:2:2267 -3084:2:2271 -3085:2:2272 -3086:2:2279 -3087:2:2280 -3088:2:2291 -3089:2:2292 -3090:2:2293 -3091:2:2291 -3092:2:2292 -3093:2:2293 -3094:2:2304 -3095:2:2309 -3096:2:2310 -3097:0:4365 -3098:3:3355 -3099:0:4365 -3100:2:2322 -3101:0:4365 -3102:2:1169 -3103:0:4365 -3104:3:3354 -3105:0:4365 -3106:2:1170 -3107:0:4365 -3108:3:3355 -3109:0:4365 -3110:3:3356 -3111:0:4365 -3112:3:3366 -3113:0:4365 -3114:3:2951 -3115:0:4365 -3116:3:2952 -3117:0:4365 -3118:3:2953 -3119:0:4365 -3120:3:2954 -3121:3:2958 -3122:3:2959 -3123:3:2967 -3124:3:2968 -3125:3:2972 -3126:3:2973 -3127:3:2967 -3128:3:2968 -3129:3:2972 -3130:3:2973 -3131:3:2981 -3132:3:2986 -3133:3:2990 -3134:3:2991 -3135:3:2998 -3136:3:2999 -3137:3:3010 -3138:3:3011 -3139:3:3012 -3140:3:3010 -3141:3:3011 -3142:3:3012 -3143:3:3023 -3144:3:3028 -3145:3:3029 -3146:0:4365 -3147:3:3041 -3148:0:4365 -3149:3:3042 -3150:0:4365 -3151:2:1173 -3152:0:4365 -3153:3:3043 -3154:0:4365 -3155:2:1179 -3156:0:4365 -3157:2:1180 -3158:0:4365 -3159:3:3042 -3160:0:4365 -3161:2:1181 -3162:2:1185 -3163:2:1186 -3164:2:1194 -3165:2:1195 -3166:2:1199 -3167:2:1200 -3168:2:1194 -3169:2:1195 -3170:2:1199 -3171:2:1200 -3172:2:1208 -3173:2:1213 -3174:2:1217 -3175:2:1218 -3176:2:1225 -3177:2:1226 -3178:2:1237 -3179:2:1238 -3180:2:1239 -3181:2:1237 -3182:2:1238 -3183:2:1239 -3184:2:1250 -3185:2:1255 -3186:2:1256 -3187:0:4365 -3188:3:3043 -3189:0:4365 -3190:2:1268 -3191:0:4365 -3192:3:3042 -3193:0:4365 -3194:2:1270 -3195:0:4365 -3196:3:3043 -3197:0:4365 -3198:2:1271 -3199:2:1275 -3200:2:1276 -3201:2:1284 -3202:2:1285 -3203:2:1289 -3204:2:1290 -3205:2:1284 -3206:2:1285 -3207:2:1289 -3208:2:1290 -3209:2:1298 -3210:2:1303 -3211:2:1307 -3212:2:1308 -3213:2:1315 -3214:2:1316 -3215:2:1327 -3216:2:1328 -3217:2:1329 -3218:2:1327 -3219:2:1328 -3220:2:1329 -3221:2:1340 -3222:2:1345 -3223:2:1346 -3224:0:4365 -3225:2:1358 -3226:0:4365 -3227:2:1360 -3228:0:4365 -3229:3:3042 -3230:0:4365 -3231:2:1361 -3232:0:4365 -3233:3:3043 -3234:0:4365 -3235:2:1362 -3236:2:1366 -3237:2:1367 -3238:2:1375 -3239:2:1376 -3240:2:1380 -3241:2:1381 -3242:2:1375 -3243:2:1376 -3244:2:1380 -3245:2:1381 -3246:2:1389 -3247:2:1394 -3248:2:1398 -3249:2:1399 -3250:2:1406 -3251:2:1407 -3252:2:1418 -3253:2:1419 -3254:2:1420 -3255:2:1418 -3256:2:1419 -3257:2:1420 -3258:2:1431 -3259:2:1436 -3260:2:1437 -3261:0:4365 -3262:2:1449 -3263:0:4365 -3264:3:3042 -3265:0:4365 -3266:2:1451 -3267:0:4365 -3268:3:3043 -3269:0:4365 -3270:2:1652 -3271:0:4365 -3272:2:1653 -3273:0:4365 -3274:2:1657 -3275:0:4365 -3276:2:1180 -3277:0:4365 -3278:3:3042 -3279:0:4365 -3280:2:1181 -3281:2:1185 -3282:2:1186 -3283:2:1194 -3284:2:1195 -3285:2:1199 -3286:2:1200 -3287:2:1194 -3288:2:1195 -3289:2:1196 -3290:2:1208 -3291:2:1213 -3292:2:1217 -3293:2:1218 -3294:2:1225 -3295:2:1226 -3296:2:1237 -3297:2:1238 -3298:2:1239 -3299:2:1237 -3300:2:1238 -3301:2:1239 -3302:2:1250 -3303:2:1255 -3304:2:1256 -3305:0:4365 -3306:3:3043 -3307:0:4365 -3308:2:1268 -3309:0:4365 -3310:3:3042 -3311:0:4365 -3312:2:1270 -3313:0:4365 -3314:3:3043 -3315:0:4365 -3316:2:1271 -3317:2:1275 -3318:2:1276 -3319:2:1284 -3320:2:1285 -3321:2:1289 -3322:2:1290 -3323:2:1284 -3324:2:1285 -3325:2:1289 -3326:2:1290 -3327:2:1298 -3328:2:1303 -3329:2:1307 -3330:2:1308 -3331:2:1315 -3332:2:1316 -3333:2:1327 -3334:2:1328 -3335:2:1329 -3336:2:1327 -3337:2:1328 -3338:2:1329 -3339:2:1340 -3340:2:1345 -3341:2:1346 -3342:0:4365 -3343:2:1358 -3344:0:4365 -3345:2:1454 -3346:0:4365 -3347:3:3042 -3348:0:4365 -3349:2:1455 -3350:0:4365 -3351:3:3043 -3352:0:4365 -3353:2:1652 -3354:0:4365 -3355:2:1653 -3356:0:4365 -3357:2:1657 -3358:0:4365 -3359:2:1660 -3360:0:4365 -3361:3:3042 -3362:0:4365 -3363:2:1665 -3364:2:1669 -3365:2:1670 -3366:2:1678 -3367:2:1679 -3368:2:1683 -3369:2:1684 -3370:2:1678 -3371:2:1679 -3372:2:1680 -3373:2:1692 -3374:2:1697 -3375:2:1701 -3376:2:1702 -3377:2:1709 -3378:2:1710 -3379:2:1721 -3380:2:1722 -3381:2:1723 -3382:2:1721 -3383:2:1722 -3384:2:1723 -3385:2:1734 -3386:2:1739 -3387:2:1740 -3388:0:4365 -3389:3:3043 -3390:0:4365 -3391:2:1752 -3392:0:4365 -3393:3:3042 -3394:0:4365 -3395:2:1754 -3396:0:4365 -3397:3:3043 -3398:0:4365 -3399:2:1755 -3400:2:1759 -3401:2:1760 -3402:2:1768 -3403:2:1769 -3404:2:1773 -3405:2:1774 -3406:2:1768 -3407:2:1769 -3408:2:1773 -3409:2:1774 -3410:2:1782 -3411:2:1787 -3412:2:1791 -3413:2:1792 -3414:2:1799 -3415:2:1800 -3416:2:1811 -3417:2:1812 -3418:2:1813 -3419:2:1811 -3420:2:1812 -3421:2:1813 -3422:2:1824 -3423:2:1829 -3424:2:1830 -3425:0:4365 -3426:2:1842 -3427:0:4365 -3428:3:3042 -3429:0:4365 -3430:2:1844 -3431:0:4365 -3432:3:3043 -3433:0:4365 -3434:2:1845 -3435:2:1849 -3436:2:1850 -3437:2:1858 -3438:2:1859 -3439:2:1863 -3440:2:1864 -3441:2:1858 -3442:2:1859 -3443:2:1863 -3444:2:1864 -3445:2:1872 -3446:2:1877 -3447:2:1881 -3448:2:1882 -3449:2:1889 -3450:2:1890 -3451:2:1901 -3452:2:1902 -3453:2:1903 -3454:2:1901 -3455:2:1902 -3456:2:1903 -3457:2:1914 -3458:2:1919 -3459:2:1920 -3460:0:4365 -3461:2:1932 -3462:0:4365 -3463:3:3042 -3464:0:4365 -3465:2:1934 -3466:0:4365 -3467:3:3043 -3468:0:4365 -3469:2:1935 -3470:0:4365 -3471:2:1936 -3472:0:4365 -3473:2:2129 -3474:0:4365 -3475:2:2130 -3476:0:4365 -3477:2:2134 -3478:0:4365 -3479:3:3042 -3480:0:4365 -3481:2:2136 -3482:0:4365 -3483:3:3043 -3484:0:4365 -3485:2:2137 -3486:2:2141 -3487:2:2142 -3488:2:2150 -3489:2:2151 -3490:2:2155 -3491:2:2156 -3492:2:2150 -3493:2:2151 -3494:2:2155 -3495:2:2156 -3496:2:2164 -3497:2:2169 -3498:2:2173 -3499:2:2174 -3500:2:2181 -3501:2:2182 -3502:2:2193 -3503:2:2194 -3504:2:2195 -3505:2:2193 -3506:2:2194 -3507:2:2195 -3508:2:2206 -3509:2:2211 -3510:2:2212 -3511:0:4365 -3512:2:2224 -3513:0:4365 -3514:3:3042 -3515:0:4365 -3516:2:2226 -3517:0:4365 -3518:3:3043 -3519:0:4365 -3520:2:1936 -3521:0:4365 -3522:2:2129 -3523:0:4365 -3524:2:2130 -3525:0:4365 -3526:2:2134 -3527:0:4365 -3528:3:3042 -3529:0:4365 -3530:2:2136 -3531:0:4365 -3532:3:3043 -3533:0:4365 -3534:2:2137 -3535:2:2141 -3536:2:2142 -3537:2:2150 -3538:2:2151 -3539:2:2155 -3540:2:2156 -3541:2:2150 -3542:2:2151 -3543:2:2152 -3544:2:2164 -3545:2:2169 -3546:2:2173 -3547:2:2174 -3548:2:2181 -3549:2:2182 -3550:2:2193 -3551:2:2194 -3552:2:2195 -3553:2:2193 -3554:2:2194 -3555:2:2195 -3556:2:2206 -3557:2:2211 -3558:2:2212 -3559:0:4365 -3560:2:2224 -3561:0:4365 -3562:3:3042 -3563:0:4365 -3564:2:2226 -3565:0:4365 -3566:3:3043 -3567:0:4365 -3568:2:2230 -3569:0:4365 -3570:3:3042 -3571:0:4365 -3572:2:2235 -3573:2:2239 -3574:2:2240 -3575:2:2248 -3576:2:2249 -3577:2:2253 -3578:2:2254 -3579:2:2248 -3580:2:2249 -3581:2:2250 -3582:2:2262 -3583:2:2267 -3584:2:2271 -3585:2:2272 -3586:2:2279 -3587:2:2280 -3588:2:2291 -3589:2:2292 -3590:2:2293 -3591:2:2291 -3592:2:2292 -3593:2:2293 -3594:2:2304 -3595:2:2309 -3596:2:2310 -3597:0:4365 -3598:3:3043 -3599:0:4365 -3600:2:2322 -3601:0:4365 -3602:2:1169 -3603:0:4365 -3604:3:3042 -3605:0:4365 -3606:2:1170 -3607:0:4365 -3608:3:3043 -3609:0:4365 -3610:3:3044 -3611:0:4365 -3612:3:3257 -3613:0:4365 -3614:3:3362 -3615:0:4365 -3616:3:3363 -3617:0:4365 -3618:3:3367 -3619:0:4365 -3620:3:3373 -3621:3:3377 -3622:3:3378 -3623:3:3386 -3624:3:3387 -3625:3:3391 -3626:3:3392 -3627:3:3386 -3628:3:3387 -3629:3:3391 -3630:3:3392 -3631:3:3400 -3632:3:3405 -3633:3:3409 -3634:3:3410 -3635:3:3417 -3636:3:3418 -3637:3:3429 -3638:3:3430 -3639:3:3431 -3640:3:3429 -3641:3:3430 -3642:3:3431 -3643:3:3442 -3644:3:3447 -3645:3:3448 -3646:0:4365 -3647:3:3460 -3648:0:4365 -3649:3:3461 -3650:0:4365 -3651:2:1173 -3652:0:4365 -3653:3:3462 -3654:0:4365 -3655:2:1179 -3656:0:4365 -3657:2:1180 -3658:0:4365 -3659:3:3461 -3660:0:4365 -3661:2:1181 -3662:2:1185 -3663:2:1186 -3664:2:1194 -3665:2:1195 -3666:2:1199 -3667:2:1200 -3668:2:1194 -3669:2:1195 -3670:2:1199 -3671:2:1200 -3672:2:1208 -3673:2:1213 -3674:2:1217 -3675:2:1218 -3676:2:1225 -3677:2:1226 -3678:2:1237 -3679:2:1238 -3680:2:1239 -3681:2:1237 -3682:2:1238 -3683:2:1239 -3684:2:1250 -3685:2:1255 -3686:2:1256 -3687:0:4365 -3688:3:3462 -3689:0:4365 -3690:2:1268 -3691:0:4365 -3692:3:3461 -3693:0:4365 -3694:2:1270 -3695:0:4365 -3696:3:3462 -3697:0:4365 -3698:2:1271 -3699:2:1275 -3700:2:1276 -3701:2:1284 -3702:2:1285 -3703:2:1289 -3704:2:1290 -3705:2:1284 -3706:2:1285 -3707:2:1289 -3708:2:1290 -3709:2:1298 -3710:2:1303 -3711:2:1307 -3712:2:1308 -3713:2:1315 -3714:2:1316 -3715:2:1327 -3716:2:1328 -3717:2:1329 -3718:2:1327 -3719:2:1328 -3720:2:1329 -3721:2:1340 -3722:2:1345 -3723:2:1346 -3724:0:4365 -3725:2:1358 -3726:0:4365 -3727:2:1360 -3728:0:4365 -3729:3:3461 -3730:0:4365 -3731:2:1361 -3732:0:4365 -3733:3:3462 -3734:0:4365 -3735:2:1362 -3736:2:1366 -3737:2:1367 -3738:2:1375 -3739:2:1376 -3740:2:1380 -3741:2:1381 -3742:2:1375 -3743:2:1376 -3744:2:1380 -3745:2:1381 -3746:2:1389 -3747:2:1394 -3748:2:1398 -3749:2:1399 -3750:2:1406 -3751:2:1407 -3752:2:1418 -3753:2:1419 -3754:2:1420 -3755:2:1418 -3756:2:1419 -3757:2:1420 -3758:2:1431 -3759:2:1436 -3760:2:1437 -3761:0:4365 -3762:2:1449 -3763:0:4365 -3764:3:3461 -3765:0:4365 -3766:2:1451 -3767:0:4365 -3768:3:3462 -3769:0:4365 -3770:2:1652 -3771:0:4365 -3772:2:1653 -3773:0:4365 -3774:2:1657 -3775:0:4365 -3776:2:1180 -3777:0:4365 -3778:3:3461 -3779:0:4365 -3780:2:1181 -3781:2:1185 -3782:2:1186 -3783:2:1194 -3784:2:1195 -3785:2:1199 -3786:2:1200 -3787:2:1194 -3788:2:1195 -3789:2:1196 -3790:2:1208 -3791:2:1213 -3792:2:1217 -3793:2:1218 -3794:2:1225 -3795:2:1226 -3796:2:1237 -3797:2:1238 -3798:2:1239 -3799:2:1237 -3800:2:1238 -3801:2:1239 -3802:2:1250 -3803:2:1255 -3804:2:1256 -3805:0:4365 -3806:3:3462 -3807:0:4365 -3808:2:1268 -3809:0:4365 -3810:3:3461 -3811:0:4365 -3812:2:1270 -3813:0:4365 -3814:3:3462 -3815:0:4365 -3816:2:1271 -3817:2:1275 -3818:2:1276 -3819:2:1284 -3820:2:1285 -3821:2:1289 -3822:2:1290 -3823:2:1284 -3824:2:1285 -3825:2:1289 -3826:2:1290 -3827:2:1298 -3828:2:1303 -3829:2:1307 -3830:2:1308 -3831:2:1315 -3832:2:1316 -3833:2:1327 -3834:2:1328 -3835:2:1329 -3836:2:1327 -3837:2:1328 -3838:2:1329 -3839:2:1340 -3840:2:1345 -3841:2:1346 -3842:0:4365 -3843:2:1358 -3844:0:4365 -3845:2:1454 -3846:0:4365 -3847:3:3461 -3848:0:4365 -3849:2:1455 -3850:0:4365 -3851:3:3462 -3852:0:4365 -3853:2:1652 -3854:0:4365 -3855:2:1653 -3856:0:4365 -3857:2:1657 -3858:0:4365 -3859:2:1660 -3860:0:4365 -3861:3:3461 -3862:0:4365 -3863:2:1665 -3864:2:1669 -3865:2:1670 -3866:2:1678 -3867:2:1679 -3868:2:1683 -3869:2:1684 -3870:2:1678 -3871:2:1679 -3872:2:1680 -3873:2:1692 -3874:2:1697 -3875:2:1701 -3876:2:1702 -3877:2:1709 -3878:2:1710 -3879:2:1721 -3880:2:1722 -3881:2:1723 -3882:2:1721 -3883:2:1722 -3884:2:1723 -3885:2:1734 -3886:2:1739 -3887:2:1740 -3888:0:4365 -3889:3:3462 -3890:0:4365 -3891:2:1752 -3892:0:4365 -3893:3:3461 -3894:0:4365 -3895:2:1754 -3896:0:4365 -3897:3:3462 -3898:0:4365 -3899:2:1755 -3900:2:1759 -3901:2:1760 -3902:2:1768 -3903:2:1769 -3904:2:1773 -3905:2:1774 -3906:2:1768 -3907:2:1769 -3908:2:1773 -3909:2:1774 -3910:2:1782 -3911:2:1787 -3912:2:1791 -3913:2:1792 -3914:2:1799 -3915:2:1800 -3916:2:1811 -3917:2:1812 -3918:2:1813 -3919:2:1811 -3920:2:1812 -3921:2:1813 -3922:2:1824 -3923:2:1829 -3924:2:1830 -3925:0:4365 -3926:2:1842 -3927:0:4365 -3928:3:3461 -3929:0:4365 -3930:2:1844 -3931:0:4365 -3932:3:3462 -3933:0:4365 -3934:2:1845 -3935:2:1849 -3936:2:1850 -3937:2:1858 -3938:2:1859 -3939:2:1863 -3940:2:1864 -3941:2:1858 -3942:2:1859 -3943:2:1863 -3944:2:1864 -3945:2:1872 -3946:2:1877 -3947:2:1881 -3948:2:1882 -3949:2:1889 -3950:2:1890 -3951:2:1901 -3952:2:1902 -3953:2:1903 -3954:2:1901 -3955:2:1902 -3956:2:1903 -3957:2:1914 -3958:2:1919 -3959:2:1920 -3960:0:4365 -3961:2:1932 -3962:0:4365 -3963:3:3461 -3964:0:4365 -3965:2:1934 -3966:0:4365 -3967:3:3462 -3968:0:4365 -3969:2:1935 -3970:0:4365 -3971:2:1936 -3972:0:4365 -3973:2:2129 -3974:0:4365 -3975:2:2130 -3976:0:4365 -3977:2:2134 -3978:0:4365 -3979:3:3461 -3980:0:4365 -3981:2:2136 -3982:0:4365 -3983:3:3462 -3984:0:4365 -3985:2:2137 -3986:2:2141 -3987:2:2142 -3988:2:2150 -3989:2:2151 -3990:2:2155 -3991:2:2156 -3992:2:2150 -3993:2:2151 -3994:2:2155 -3995:2:2156 -3996:2:2164 -3997:2:2169 -3998:2:2173 -3999:2:2174 -4000:2:2181 -4001:2:2182 -4002:2:2193 -4003:2:2194 -4004:2:2195 -4005:2:2193 -4006:2:2194 -4007:2:2195 -4008:2:2206 -4009:2:2211 -4010:2:2212 -4011:0:4365 -4012:2:2224 -4013:0:4365 -4014:3:3461 -4015:0:4365 -4016:2:2226 -4017:0:4365 -4018:3:3462 -4019:0:4365 -4020:2:1936 -4021:0:4365 -4022:2:2129 -4023:0:4365 -4024:2:2130 -4025:0:4365 -4026:2:2134 -4027:0:4365 -4028:3:3461 -4029:0:4365 -4030:2:2136 -4031:0:4365 -4032:3:3462 -4033:0:4365 -4034:2:2137 -4035:2:2141 -4036:2:2142 -4037:2:2150 -4038:2:2151 -4039:2:2155 -4040:2:2156 -4041:2:2150 -4042:2:2151 -4043:2:2152 -4044:2:2164 -4045:2:2169 -4046:2:2173 -4047:2:2174 -4048:2:2181 -4049:2:2182 -4050:2:2193 -4051:2:2194 -4052:2:2195 -4053:2:2193 -4054:2:2194 -4055:2:2195 -4056:2:2206 -4057:2:2211 -4058:2:2212 -4059:0:4365 -4060:2:2224 -4061:0:4365 -4062:3:3461 -4063:0:4365 -4064:2:2226 -4065:0:4365 -4066:3:3462 -4067:0:4365 -4068:2:2230 -4069:0:4365 -4070:3:3461 -4071:0:4365 -4072:2:2235 -4073:2:2239 -4074:2:2240 -4075:2:2248 -4076:2:2249 -4077:2:2253 -4078:2:2254 -4079:2:2248 -4080:2:2249 -4081:2:2250 -4082:2:2262 -4083:2:2267 -4084:2:2271 -4085:2:2272 -4086:2:2279 -4087:2:2280 -4088:2:2291 -4089:2:2292 -4090:2:2293 -4091:2:2291 -4092:2:2292 -4093:2:2293 -4094:2:2304 -4095:2:2309 -4096:2:2310 -4097:0:4365 -4098:3:3462 -4099:0:4365 -4100:2:2322 -4101:0:4365 -4102:2:1169 -4103:0:4365 -4104:3:3461 -4105:0:4365 -4106:2:1170 -4107:0:4365 -4108:3:3462 -4109:0:4365 -4110:3:3463 -4111:0:4365 -4112:3:3469 -4113:0:4365 -4114:3:3470 -4115:3:3474 -4116:3:3475 -4117:3:3483 -4118:3:3484 -4119:3:3488 -4120:3:3489 -4121:3:3483 -4122:3:3484 -4123:3:3488 -4124:3:3489 -4125:3:3497 -4126:3:3502 -4127:3:3506 -4128:3:3507 -4129:3:3514 -4130:3:3515 -4131:3:3526 -4132:3:3527 -4133:3:3528 -4134:3:3526 -4135:3:3527 -4136:3:3528 -4137:3:3539 -4138:3:3544 -4139:3:3545 -4140:0:4365 -4141:3:3557 -4142:0:4365 -4143:3:3558 -4144:0:4365 -4145:2:1173 -4146:0:4365 -4147:3:3559 -4148:0:4365 -4149:2:1179 -4150:0:4365 -4151:2:1180 -4152:0:4365 -4153:3:3558 -4154:0:4365 -4155:2:1181 -4156:2:1185 -4157:2:1186 -4158:2:1194 -4159:2:1195 -4160:2:1199 -4161:2:1200 -4162:2:1194 -4163:2:1195 -4164:2:1199 -4165:2:1200 -4166:2:1208 -4167:2:1213 -4168:2:1217 -4169:2:1218 -4170:2:1225 -4171:2:1226 -4172:2:1237 -4173:2:1238 -4174:2:1239 -4175:2:1237 -4176:2:1238 -4177:2:1239 -4178:2:1250 -4179:2:1255 -4180:2:1256 -4181:0:4365 -4182:3:3559 -4183:0:4365 -4184:2:1268 -4185:0:4365 -4186:3:3558 -4187:0:4365 -4188:2:1270 -4189:0:4365 -4190:3:3559 -4191:0:4365 -4192:2:1271 -4193:2:1275 -4194:2:1276 -4195:2:1284 -4196:2:1285 -4197:2:1289 -4198:2:1290 -4199:2:1284 -4200:2:1285 -4201:2:1289 -4202:2:1290 -4203:2:1298 -4204:2:1303 -4205:2:1307 -4206:2:1308 -4207:2:1315 -4208:2:1316 -4209:2:1327 -4210:2:1328 -4211:2:1329 -4212:2:1327 -4213:2:1328 -4214:2:1329 -4215:2:1340 -4216:2:1345 -4217:2:1346 -4218:0:4365 -4219:2:1358 -4220:0:4365 -4221:2:1360 -4222:0:4365 -4223:3:3558 -4224:0:4365 -4225:2:1361 -4226:0:4365 -4227:3:3559 -4228:0:4365 -4229:2:1362 -4230:2:1366 -4231:2:1367 -4232:2:1375 -4233:2:1376 -4234:2:1380 -4235:2:1381 -4236:2:1375 -4237:2:1376 -4238:2:1380 -4239:2:1381 -4240:2:1389 -4241:2:1394 -4242:2:1398 -4243:2:1399 -4244:2:1406 -4245:2:1407 -4246:2:1418 -4247:2:1419 -4248:2:1420 -4249:2:1418 -4250:2:1419 -4251:2:1420 -4252:2:1431 -4253:2:1436 -4254:2:1437 -4255:0:4365 -4256:2:1449 -4257:0:4365 -4258:3:3558 -4259:0:4365 -4260:2:1451 -4261:0:4365 -4262:3:3559 -4263:0:4365 -4264:2:1652 -4265:0:4365 -4266:2:1653 -4267:0:4365 -4268:2:1657 -4269:0:4365 -4270:2:1180 -4271:0:4365 -4272:3:3558 -4273:0:4365 -4274:2:1181 -4275:2:1185 -4276:2:1186 -4277:2:1194 -4278:2:1195 -4279:2:1199 -4280:2:1200 -4281:2:1194 -4282:2:1195 -4283:2:1196 -4284:2:1208 -4285:2:1213 -4286:2:1217 -4287:2:1218 -4288:2:1225 -4289:2:1226 -4290:2:1237 -4291:2:1238 -4292:2:1239 -4293:2:1237 -4294:2:1238 -4295:2:1239 -4296:2:1250 -4297:2:1255 -4298:2:1256 -4299:0:4365 -4300:3:3559 -4301:0:4365 -4302:2:1268 -4303:0:4365 -4304:3:3558 -4305:0:4365 -4306:2:1270 -4307:0:4365 -4308:3:3559 -4309:0:4365 -4310:2:1271 -4311:2:1275 -4312:2:1276 -4313:2:1284 -4314:2:1285 -4315:2:1289 -4316:2:1290 -4317:2:1284 -4318:2:1285 -4319:2:1289 -4320:2:1290 -4321:2:1298 -4322:2:1303 -4323:2:1307 -4324:2:1308 -4325:2:1315 -4326:2:1316 -4327:2:1327 -4328:2:1328 -4329:2:1329 -4330:2:1327 -4331:2:1328 -4332:2:1329 -4333:2:1340 -4334:2:1345 -4335:2:1346 -4336:0:4365 -4337:2:1358 -4338:0:4365 -4339:2:1454 -4340:0:4365 -4341:3:3558 -4342:0:4365 -4343:2:1455 -4344:0:4365 -4345:3:3559 -4346:0:4365 -4347:2:1652 -4348:0:4365 -4349:2:1653 -4350:0:4365 -4351:2:1657 -4352:0:4365 -4353:2:1660 -4354:0:4365 -4355:3:3558 -4356:0:4365 -4357:2:1665 -4358:2:1669 -4359:2:1670 -4360:2:1678 -4361:2:1679 -4362:2:1683 -4363:2:1684 -4364:2:1678 -4365:2:1679 -4366:2:1680 -4367:2:1692 -4368:2:1697 -4369:2:1701 -4370:2:1702 -4371:2:1709 -4372:2:1710 -4373:2:1721 -4374:2:1722 -4375:2:1723 -4376:2:1721 -4377:2:1722 -4378:2:1723 -4379:2:1734 -4380:2:1739 -4381:2:1740 -4382:0:4365 -4383:3:3559 -4384:0:4365 -4385:2:1752 -4386:0:4365 -4387:3:3558 -4388:0:4365 -4389:2:1754 -4390:0:4365 -4391:3:3559 -4392:0:4365 -4393:2:1755 -4394:2:1759 -4395:2:1760 -4396:2:1768 -4397:2:1769 -4398:2:1773 -4399:2:1774 -4400:2:1768 -4401:2:1769 -4402:2:1773 -4403:2:1774 -4404:2:1782 -4405:2:1787 -4406:2:1791 -4407:2:1792 -4408:2:1799 -4409:2:1800 -4410:2:1811 -4411:2:1812 -4412:2:1813 -4413:2:1811 -4414:2:1812 -4415:2:1813 -4416:2:1824 -4417:2:1829 -4418:2:1830 -4419:0:4365 -4420:2:1842 -4421:0:4365 -4422:3:3558 -4423:0:4365 -4424:2:1844 -4425:0:4365 -4426:3:3559 -4427:0:4365 -4428:2:1845 -4429:2:1849 -4430:2:1850 -4431:2:1858 -4432:2:1859 -4433:2:1863 -4434:2:1864 -4435:2:1858 -4436:2:1859 -4437:2:1863 -4438:2:1864 -4439:2:1872 -4440:2:1877 -4441:2:1881 -4442:2:1882 -4443:2:1889 -4444:2:1890 -4445:2:1901 -4446:2:1902 -4447:2:1903 -4448:2:1901 -4449:2:1902 -4450:2:1903 -4451:2:1914 -4452:2:1919 -4453:2:1920 -4454:0:4365 -4455:2:1932 -4456:0:4365 -4457:3:3558 -4458:0:4365 -4459:2:1934 -4460:0:4365 -4461:3:3559 -4462:0:4365 -4463:2:1935 -4464:0:4365 -4465:2:1936 -4466:0:4365 -4467:2:2129 -4468:0:4365 -4469:2:2130 -4470:0:4365 -4471:2:2134 -4472:0:4365 -4473:3:3558 -4474:0:4365 -4475:2:2136 -4476:0:4365 -4477:3:3559 -4478:0:4365 -4479:2:2137 -4480:2:2141 -4481:2:2142 -4482:2:2150 -4483:2:2151 -4484:2:2155 -4485:2:2156 -4486:2:2150 -4487:2:2151 -4488:2:2155 -4489:2:2156 -4490:2:2164 -4491:2:2169 -4492:2:2173 -4493:2:2174 -4494:2:2181 -4495:2:2182 -4496:2:2193 -4497:2:2194 -4498:2:2195 -4499:2:2193 -4500:2:2194 -4501:2:2195 -4502:2:2206 -4503:2:2211 -4504:2:2212 -4505:0:4365 -4506:2:2224 -4507:0:4365 -4508:3:3558 -4509:0:4365 -4510:2:2226 -4511:0:4365 -4512:3:3559 -4513:0:4365 -4514:2:1936 -4515:0:4365 -4516:2:2129 -4517:0:4365 -4518:2:2130 -4519:0:4365 -4520:2:2134 -4521:0:4365 -4522:3:3558 -4523:0:4365 -4524:2:2136 -4525:0:4365 -4526:3:3559 -4527:0:4365 -4528:2:2137 -4529:2:2141 -4530:2:2142 -4531:2:2150 -4532:2:2151 -4533:2:2155 -4534:2:2156 -4535:2:2150 -4536:2:2151 -4537:2:2152 -4538:2:2164 -4539:2:2169 -4540:2:2173 -4541:2:2174 -4542:2:2181 -4543:2:2182 -4544:2:2193 -4545:2:2194 -4546:2:2195 -4547:2:2193 -4548:2:2194 -4549:2:2195 -4550:2:2206 -4551:2:2211 -4552:2:2212 -4553:0:4365 -4554:2:2224 -4555:0:4365 -4556:3:3558 -4557:0:4365 -4558:2:2226 -4559:0:4365 -4560:3:3559 -4561:0:4365 -4562:2:2230 -4563:0:4365 -4564:3:3558 -4565:0:4365 -4566:2:2235 -4567:2:2239 -4568:2:2240 -4569:2:2248 -4570:2:2249 -4571:2:2253 -4572:2:2254 -4573:2:2248 -4574:2:2249 -4575:2:2250 -4576:2:2262 -4577:2:2267 -4578:2:2271 -4579:2:2272 -4580:2:2279 -4581:2:2280 -4582:2:2291 -4583:2:2292 -4584:2:2293 -4585:2:2291 -4586:2:2292 -4587:2:2293 -4588:2:2304 -4589:2:2309 -4590:2:2310 -4591:0:4365 -4592:3:3559 -4593:0:4365 -4594:2:2322 -4595:0:4365 -4596:2:1169 -4597:0:4365 -4598:3:3558 -4599:0:4365 -4600:2:1170 -4601:0:4365 -4602:3:3559 -4603:0:4365 -4604:3:3560 -4605:0:4365 -4606:3:3566 -4607:0:4365 -4608:3:3569 -4609:3:3570 -4610:3:3582 -4611:3:3583 -4612:3:3587 -4613:3:3588 -4614:3:3582 -4615:3:3583 -4616:3:3587 -4617:3:3588 -4618:3:3596 -4619:3:3601 -4620:3:3605 -4621:3:3606 -4622:3:3613 -4623:3:3614 -4624:3:3625 -4625:3:3626 -4626:3:3627 -4627:3:3625 -4628:3:3626 -4629:3:3627 -4630:3:3638 -4631:3:3643 -4632:3:3644 -4633:0:4365 -4634:3:3656 -4635:0:4365 -4636:3:3657 -4637:0:4365 -4638:2:1173 -4639:0:4365 -4640:3:3658 -4641:0:4365 -4642:2:1179 -4643:0:4365 -4644:2:1180 -4645:0:4365 -4646:3:3657 -4647:0:4365 -4648:2:1181 -4649:2:1185 -4650:2:1186 -4651:2:1194 -4652:2:1195 -4653:2:1199 -4654:2:1200 -4655:2:1194 -4656:2:1195 -4657:2:1199 -4658:2:1200 -4659:2:1208 -4660:2:1213 -4661:2:1217 -4662:2:1218 -4663:2:1225 -4664:2:1226 -4665:2:1237 -4666:2:1238 -4667:2:1239 -4668:2:1237 -4669:2:1238 -4670:2:1239 -4671:2:1250 -4672:2:1255 -4673:2:1256 -4674:0:4365 -4675:3:3658 -4676:0:4365 -4677:2:1268 -4678:0:4365 -4679:3:3657 -4680:0:4365 -4681:2:1270 -4682:0:4365 -4683:3:3658 -4684:0:4365 -4685:2:1271 -4686:2:1275 -4687:2:1276 -4688:2:1284 -4689:2:1285 -4690:2:1289 -4691:2:1290 -4692:2:1284 -4693:2:1285 -4694:2:1289 -4695:2:1290 -4696:2:1298 -4697:2:1303 -4698:2:1307 -4699:2:1308 -4700:2:1315 -4701:2:1316 -4702:2:1327 -4703:2:1328 -4704:2:1329 -4705:2:1327 -4706:2:1328 -4707:2:1329 -4708:2:1340 -4709:2:1345 -4710:2:1346 -4711:0:4365 -4712:2:1358 -4713:0:4365 -4714:2:1360 -4715:0:4365 -4716:3:3657 -4717:0:4365 -4718:2:1361 -4719:0:4365 -4720:3:3658 -4721:0:4365 -4722:2:1362 -4723:2:1366 -4724:2:1367 -4725:2:1375 -4726:2:1376 -4727:2:1380 -4728:2:1381 -4729:2:1375 -4730:2:1376 -4731:2:1380 -4732:2:1381 -4733:2:1389 -4734:2:1394 -4735:2:1398 -4736:2:1399 -4737:2:1406 -4738:2:1407 -4739:2:1418 -4740:2:1419 -4741:2:1420 -4742:2:1418 -4743:2:1419 -4744:2:1420 -4745:2:1431 -4746:2:1436 -4747:2:1437 -4748:0:4365 -4749:2:1449 -4750:0:4365 -4751:3:3657 -4752:0:4365 -4753:2:1451 -4754:0:4365 -4755:3:3658 -4756:0:4365 -4757:2:1652 -4758:0:4365 -4759:2:1653 -4760:0:4365 -4761:2:1657 -4762:0:4365 -4763:2:1180 -4764:0:4365 -4765:3:3657 -4766:0:4365 -4767:2:1181 -4768:2:1185 -4769:2:1186 -4770:2:1194 -4771:2:1195 -4772:2:1199 -4773:2:1200 -4774:2:1194 -4775:2:1195 -4776:2:1196 -4777:2:1208 -4778:2:1213 -4779:2:1217 -4780:2:1218 -4781:2:1225 -4782:2:1226 -4783:2:1237 -4784:2:1238 -4785:2:1239 -4786:2:1237 -4787:2:1238 -4788:2:1239 -4789:2:1250 -4790:2:1255 -4791:2:1256 -4792:0:4365 -4793:3:3658 -4794:0:4365 -4795:2:1268 -4796:0:4365 -4797:3:3657 -4798:0:4365 -4799:2:1270 -4800:0:4365 -4801:3:3658 -4802:0:4365 -4803:2:1271 -4804:2:1275 -4805:2:1276 -4806:2:1284 -4807:2:1285 -4808:2:1289 -4809:2:1290 -4810:2:1284 -4811:2:1285 -4812:2:1289 -4813:2:1290 -4814:2:1298 -4815:2:1303 -4816:2:1307 -4817:2:1308 -4818:2:1315 -4819:2:1316 -4820:2:1327 -4821:2:1328 -4822:2:1329 -4823:2:1327 -4824:2:1328 -4825:2:1329 -4826:2:1340 -4827:2:1345 -4828:2:1346 -4829:0:4365 -4830:2:1358 -4831:0:4365 -4832:2:1454 -4833:0:4365 -4834:3:3657 -4835:0:4365 -4836:2:1455 -4837:0:4365 -4838:3:3658 -4839:0:4365 -4840:2:1652 -4841:0:4365 -4842:2:1653 -4843:0:4365 -4844:2:1657 -4845:0:4365 -4846:2:1660 -4847:0:4365 -4848:3:3657 -4849:0:4365 -4850:2:1665 -4851:2:1669 -4852:2:1670 -4853:2:1678 -4854:2:1679 -4855:2:1683 -4856:2:1684 -4857:2:1678 -4858:2:1679 -4859:2:1680 -4860:2:1692 -4861:2:1697 -4862:2:1701 -4863:2:1702 -4864:2:1709 -4865:2:1710 -4866:2:1721 -4867:2:1722 -4868:2:1723 -4869:2:1721 -4870:2:1722 -4871:2:1723 -4872:2:1734 -4873:2:1739 -4874:2:1740 -4875:0:4365 -4876:3:3658 -4877:0:4365 -4878:2:1752 -4879:0:4365 -4880:3:3657 -4881:0:4365 -4882:2:1754 -4883:0:4365 -4884:3:3658 -4885:0:4365 -4886:2:1755 -4887:2:1759 -4888:2:1760 -4889:2:1768 -4890:2:1769 -4891:2:1773 -4892:2:1774 -4893:2:1768 -4894:2:1769 -4895:2:1773 -4896:2:1774 -4897:2:1782 -4898:2:1787 -4899:2:1791 -4900:2:1792 -4901:2:1799 -4902:2:1800 -4903:2:1811 -4904:2:1812 -4905:2:1813 -4906:2:1811 -4907:2:1812 -4908:2:1813 -4909:2:1824 -4910:2:1829 -4911:2:1830 -4912:0:4365 -4913:2:1842 -4914:0:4365 -4915:3:3657 -4916:0:4365 -4917:2:1844 -4918:0:4365 -4919:3:3658 -4920:0:4365 -4921:2:1845 -4922:2:1849 -4923:2:1850 -4924:2:1858 -4925:2:1859 -4926:2:1863 -4927:2:1864 -4928:2:1858 -4929:2:1859 -4930:2:1863 -4931:2:1864 -4932:2:1872 -4933:2:1877 -4934:2:1881 -4935:2:1882 -4936:2:1889 -4937:2:1890 -4938:2:1901 -4939:2:1902 -4940:2:1903 -4941:2:1901 -4942:2:1902 -4943:2:1903 -4944:2:1914 -4945:2:1919 -4946:2:1920 -4947:0:4365 -4948:2:1932 -4949:0:4365 -4950:3:3657 -4951:0:4365 -4952:2:1934 -4953:0:4365 -4954:3:3658 -4955:0:4365 -4956:2:1935 -4957:0:4365 -4958:2:1936 -4959:0:4365 -4960:2:2129 -4961:0:4365 -4962:2:2130 -4963:0:4365 -4964:2:2134 -4965:0:4365 -4966:3:3657 -4967:0:4365 -4968:2:2136 -4969:0:4365 -4970:3:3658 -4971:0:4365 -4972:2:2137 -4973:2:2141 -4974:2:2142 -4975:2:2150 -4976:2:2151 -4977:2:2155 -4978:2:2156 -4979:2:2150 -4980:2:2151 -4981:2:2155 -4982:2:2156 -4983:2:2164 -4984:2:2169 -4985:2:2173 -4986:2:2174 -4987:2:2181 -4988:2:2182 -4989:2:2193 -4990:2:2194 -4991:2:2195 -4992:2:2193 -4993:2:2194 -4994:2:2195 -4995:2:2206 -4996:2:2211 -4997:2:2212 -4998:0:4365 -4999:2:2224 -5000:0:4365 -5001:3:3657 -5002:0:4365 -5003:2:2226 -5004:0:4365 -5005:3:3658 -5006:0:4365 -5007:2:1936 -5008:0:4365 -5009:2:2129 -5010:0:4365 -5011:2:2130 -5012:0:4365 -5013:2:2134 -5014:0:4365 -5015:3:3657 -5016:0:4365 -5017:2:2136 -5018:0:4365 -5019:3:3658 -5020:0:4365 -5021:2:2137 -5022:2:2141 -5023:2:2142 -5024:2:2150 -5025:2:2151 -5026:2:2155 -5027:2:2156 -5028:2:2150 -5029:2:2151 -5030:2:2152 -5031:2:2164 -5032:2:2169 -5033:2:2173 -5034:2:2174 -5035:2:2181 -5036:2:2182 -5037:2:2193 -5038:2:2194 -5039:2:2195 -5040:2:2193 -5041:2:2194 -5042:2:2195 -5043:2:2206 -5044:2:2211 -5045:2:2212 -5046:0:4365 -5047:2:2224 -5048:0:4365 -5049:3:3657 -5050:0:4365 -5051:2:2226 -5052:0:4365 -5053:3:3658 -5054:0:4365 -5055:2:2230 -5056:0:4365 -5057:3:3657 -5058:0:4365 -5059:2:2235 -5060:2:2239 -5061:2:2240 -5062:2:2248 -5063:2:2249 -5064:2:2253 -5065:2:2254 -5066:2:2248 -5067:2:2249 -5068:2:2250 -5069:2:2262 -5070:2:2267 -5071:2:2271 -5072:2:2272 -5073:2:2279 -5074:2:2280 -5075:2:2291 -5076:2:2292 -5077:2:2293 -5078:2:2291 -5079:2:2292 -5080:2:2293 -5081:2:2304 -5082:2:2309 -5083:2:2310 -5084:0:4365 -5085:3:3658 -5086:0:4365 -5087:2:2322 -5088:0:4365 -5089:2:1169 -5090:0:4365 -5091:3:3657 -5092:0:4365 -5093:2:1170 -5094:0:4365 -5095:3:3658 -5096:0:4365 -5097:3:3659 -5098:0:4365 -5099:3:3665 -5100:0:4365 -5101:3:3666 -5102:0:4365 -5103:3:3667 -5104:0:4365 -5105:3:3668 -5106:0:4365 -5107:3:3669 -5108:3:3673 -5109:3:3674 -5110:3:3682 -5111:3:3683 -5112:3:3687 -5113:3:3688 -5114:3:3682 -5115:3:3683 -5116:3:3687 -5117:3:3688 -5118:3:3696 -5119:3:3701 -5120:3:3705 -5121:3:3706 -5122:3:3713 -5123:3:3714 -5124:3:3725 -5125:3:3726 -5126:3:3727 -5127:3:3725 -5128:3:3726 -5129:3:3727 -5130:3:3738 -5131:3:3743 -5132:3:3744 -5133:0:4365 -5134:3:3756 -5135:0:4365 -5136:3:3757 -5137:0:4365 -5138:2:1173 -5139:0:4365 -5140:3:3758 -5141:0:4365 -5142:2:1179 -5143:0:4365 -5144:2:1180 -5145:0:4365 -5146:3:3757 -5147:0:4365 -5148:2:1181 -5149:2:1185 -5150:2:1186 -5151:2:1194 -5152:2:1195 -5153:2:1199 -5154:2:1200 -5155:2:1194 -5156:2:1195 -5157:2:1199 -5158:2:1200 -5159:2:1208 -5160:2:1213 -5161:2:1217 -5162:2:1218 -5163:2:1225 -5164:2:1226 -5165:2:1237 -5166:2:1238 -5167:2:1239 -5168:2:1237 -5169:2:1238 -5170:2:1239 -5171:2:1250 -5172:2:1255 -5173:2:1256 -5174:0:4365 -5175:3:3758 -5176:0:4365 -5177:2:1268 -5178:0:4365 -5179:3:3757 -5180:0:4365 -5181:2:1270 -5182:0:4365 -5183:3:3758 -5184:0:4365 -5185:2:1271 -5186:2:1275 -5187:2:1276 -5188:2:1284 -5189:2:1285 -5190:2:1289 -5191:2:1290 -5192:2:1284 -5193:2:1285 -5194:2:1289 -5195:2:1290 -5196:2:1298 -5197:2:1303 -5198:2:1307 -5199:2:1308 -5200:2:1315 -5201:2:1316 -5202:2:1327 -5203:2:1328 -5204:2:1329 -5205:2:1327 -5206:2:1328 -5207:2:1329 -5208:2:1340 -5209:2:1345 -5210:2:1346 -5211:0:4365 -5212:2:1358 -5213:0:4365 -5214:2:1360 -5215:0:4365 -5216:3:3757 -5217:0:4365 -5218:2:1361 -5219:0:4365 -5220:3:3758 -5221:0:4365 -5222:2:1362 -5223:2:1366 -5224:2:1367 -5225:2:1375 -5226:2:1376 -5227:2:1380 -5228:2:1381 -5229:2:1375 -5230:2:1376 -5231:2:1380 -5232:2:1381 -5233:2:1389 -5234:2:1394 -5235:2:1398 -5236:2:1399 -5237:2:1406 -5238:2:1407 -5239:2:1418 -5240:2:1419 -5241:2:1420 -5242:2:1418 -5243:2:1419 -5244:2:1420 -5245:2:1431 -5246:2:1436 -5247:2:1437 -5248:0:4365 -5249:2:1449 -5250:0:4365 -5251:3:3757 -5252:0:4365 -5253:2:1451 -5254:0:4365 -5255:3:3758 -5256:0:4365 -5257:2:1652 -5258:0:4365 -5259:2:1653 -5260:0:4365 -5261:2:1657 -5262:0:4365 -5263:2:1180 -5264:0:4365 -5265:3:3757 -5266:0:4365 -5267:2:1181 -5268:2:1185 -5269:2:1186 -5270:2:1194 -5271:2:1195 -5272:2:1199 -5273:2:1200 -5274:2:1194 -5275:2:1195 -5276:2:1196 -5277:2:1208 -5278:2:1213 -5279:2:1217 -5280:2:1218 -5281:2:1225 -5282:2:1226 -5283:2:1237 -5284:2:1238 -5285:2:1239 -5286:2:1237 -5287:2:1238 -5288:2:1239 -5289:2:1250 -5290:2:1255 -5291:2:1256 -5292:0:4365 -5293:3:3758 -5294:0:4365 -5295:2:1268 -5296:0:4365 -5297:3:3757 -5298:0:4365 -5299:2:1270 -5300:0:4365 -5301:3:3758 -5302:0:4365 -5303:2:1271 -5304:2:1275 -5305:2:1276 -5306:2:1284 -5307:2:1285 -5308:2:1289 -5309:2:1290 -5310:2:1284 -5311:2:1285 -5312:2:1289 -5313:2:1290 -5314:2:1298 -5315:2:1303 -5316:2:1307 -5317:2:1308 -5318:2:1315 -5319:2:1316 -5320:2:1327 -5321:2:1328 -5322:2:1329 -5323:2:1327 -5324:2:1328 -5325:2:1329 -5326:2:1340 -5327:2:1345 -5328:2:1346 -5329:0:4365 -5330:2:1358 -5331:0:4365 -5332:2:1454 -5333:0:4365 -5334:3:3757 -5335:0:4365 -5336:2:1455 -5337:0:4365 -5338:3:3758 -5339:0:4365 -5340:2:1652 -5341:0:4365 -5342:2:1653 -5343:0:4365 -5344:2:1657 -5345:0:4365 -5346:2:1660 -5347:0:4365 -5348:3:3757 -5349:0:4365 -5350:2:1665 -5351:2:1669 -5352:2:1670 -5353:2:1678 -5354:2:1679 -5355:2:1683 -5356:2:1684 -5357:2:1678 -5358:2:1679 -5359:2:1680 -5360:2:1692 -5361:2:1697 -5362:2:1701 -5363:2:1702 -5364:2:1709 -5365:2:1710 -5366:2:1721 -5367:2:1722 -5368:2:1723 -5369:2:1721 -5370:2:1722 -5371:2:1723 -5372:2:1734 -5373:2:1739 -5374:2:1740 -5375:0:4365 -5376:3:3758 -5377:0:4365 -5378:2:1752 -5379:0:4365 -5380:3:3757 -5381:0:4365 -5382:2:1754 -5383:0:4365 -5384:3:3758 -5385:0:4365 -5386:2:1755 -5387:2:1759 -5388:2:1760 -5389:2:1768 -5390:2:1769 -5391:2:1773 -5392:2:1774 -5393:2:1768 -5394:2:1769 -5395:2:1773 -5396:2:1774 -5397:2:1782 -5398:2:1787 -5399:2:1791 -5400:2:1792 -5401:2:1799 -5402:2:1800 -5403:2:1811 -5404:2:1812 -5405:2:1813 -5406:2:1811 -5407:2:1812 -5408:2:1813 -5409:2:1824 -5410:2:1829 -5411:2:1830 -5412:0:4365 -5413:2:1842 -5414:0:4365 -5415:3:3757 -5416:0:4365 -5417:2:1844 -5418:0:4365 -5419:3:3758 -5420:0:4365 -5421:2:1845 -5422:2:1849 -5423:2:1850 -5424:2:1858 -5425:2:1859 -5426:2:1863 -5427:2:1864 -5428:2:1858 -5429:2:1859 -5430:2:1863 -5431:2:1864 -5432:2:1872 -5433:2:1877 -5434:2:1881 -5435:2:1882 -5436:2:1889 -5437:2:1890 -5438:2:1901 -5439:2:1902 -5440:2:1903 -5441:2:1901 -5442:2:1902 -5443:2:1903 -5444:2:1914 -5445:2:1919 -5446:2:1920 -5447:0:4365 -5448:2:1932 -5449:0:4365 -5450:3:3757 -5451:0:4365 -5452:2:1934 -5453:0:4365 -5454:3:3758 -5455:0:4365 -5456:2:1935 -5457:0:4365 -5458:2:1936 -5459:0:4365 -5460:2:2129 -5461:0:4365 -5462:2:2130 -5463:0:4365 -5464:2:2134 -5465:0:4365 -5466:3:3757 -5467:0:4365 -5468:2:2136 -5469:0:4365 -5470:3:3758 -5471:0:4365 -5472:2:2137 -5473:2:2141 -5474:2:2142 -5475:2:2150 -5476:2:2151 -5477:2:2155 -5478:2:2156 -5479:2:2150 -5480:2:2151 -5481:2:2155 -5482:2:2156 -5483:2:2164 -5484:2:2169 -5485:2:2173 -5486:2:2174 -5487:2:2181 -5488:2:2182 -5489:2:2193 -5490:2:2194 -5491:2:2195 -5492:2:2193 -5493:2:2194 -5494:2:2195 -5495:2:2206 -5496:2:2211 -5497:2:2212 -5498:0:4365 -5499:2:2224 -5500:0:4365 -5501:3:3757 -5502:0:4365 -5503:2:2226 -5504:0:4365 -5505:3:3758 -5506:0:4365 -5507:2:1936 -5508:0:4365 -5509:2:2129 -5510:0:4365 -5511:2:2130 -5512:0:4365 -5513:2:2134 -5514:0:4365 -5515:3:3757 -5516:0:4365 -5517:2:2136 -5518:0:4365 -5519:3:3758 -5520:0:4365 -5521:2:2137 -5522:2:2141 -5523:2:2142 -5524:2:2150 -5525:2:2151 -5526:2:2155 -5527:2:2156 -5528:2:2150 -5529:2:2151 -5530:2:2152 -5531:2:2164 -5532:2:2169 -5533:2:2173 -5534:2:2174 -5535:2:2181 -5536:2:2182 -5537:2:2193 -5538:2:2194 -5539:2:2195 -5540:2:2193 -5541:2:2194 -5542:2:2195 -5543:2:2206 -5544:2:2211 -5545:2:2212 -5546:0:4365 -5547:2:2224 -5548:0:4365 -5549:3:3757 -5550:0:4365 -5551:2:2226 -5552:0:4365 -5553:3:3758 -5554:0:4365 -5555:2:2230 -5556:0:4365 -5557:3:3757 -5558:0:4365 -5559:2:2235 -5560:2:2239 -5561:2:2240 -5562:2:2248 -5563:2:2249 -5564:2:2253 -5565:2:2254 -5566:2:2248 -5567:2:2249 -5568:2:2250 -5569:2:2262 -5570:2:2267 -5571:2:2271 -5572:2:2272 -5573:2:2279 -5574:2:2280 -5575:2:2291 -5576:2:2292 -5577:2:2293 -5578:2:2291 -5579:2:2292 -5580:2:2293 -5581:2:2304 -5582:2:2309 -5583:2:2310 -5584:0:4365 -5585:3:3758 -5586:0:4365 -5587:2:2322 -5588:0:4365 -5589:2:1169 -5590:0:4365 -5591:3:3757 -5592:0:4365 -5593:2:1170 -5594:0:4365 -5595:3:3758 -5596:0:4365 -5597:3:3759 -5598:0:4365 -5599:3:3972 -5600:0:4365 -5601:3:3980 -5602:0:4365 -5603:3:3981 -5604:3:3985 -5605:3:3986 -5606:3:3994 -5607:3:3995 -5608:3:3999 -5609:3:4000 -5610:3:3994 -5611:3:3995 -5612:3:3999 -5613:3:4000 -5614:3:4008 -5615:3:4013 -5616:3:4017 -5617:3:4018 -5618:3:4025 -5619:3:4026 -5620:3:4037 -5621:3:4038 -5622:3:4039 -5623:3:4037 -5624:3:4038 -5625:3:4039 -5626:3:4050 -5627:3:4055 -5628:3:4056 -5629:0:4365 -5630:3:4068 -5631:0:4365 -5632:3:4069 -5633:0:4365 -5634:2:1173 -5635:0:4365 -5636:3:4070 -5637:0:4365 -5638:2:1179 -5639:0:4365 -5640:2:1180 -5641:0:4365 -5642:3:4069 -5643:0:4365 -5644:2:1181 -5645:2:1185 -5646:2:1186 -5647:2:1194 -5648:2:1195 -5649:2:1199 -5650:2:1200 -5651:2:1194 -5652:2:1195 -5653:2:1199 -5654:2:1200 -5655:2:1208 -5656:2:1213 -5657:2:1217 -5658:2:1218 -5659:2:1225 -5660:2:1226 -5661:2:1237 -5662:2:1238 -5663:2:1239 -5664:2:1237 -5665:2:1238 -5666:2:1239 -5667:2:1250 -5668:2:1255 -5669:2:1256 -5670:0:4365 -5671:3:4070 -5672:0:4365 -5673:2:1268 -5674:0:4365 -5675:3:4069 -5676:0:4365 -5677:2:1270 -5678:0:4365 -5679:3:4070 -5680:0:4365 -5681:2:1271 -5682:2:1275 -5683:2:1276 -5684:2:1284 -5685:2:1285 -5686:2:1289 -5687:2:1290 -5688:2:1284 -5689:2:1285 -5690:2:1289 -5691:2:1290 -5692:2:1298 -5693:2:1303 -5694:2:1307 -5695:2:1308 -5696:2:1315 -5697:2:1316 -5698:2:1327 -5699:2:1328 -5700:2:1329 -5701:2:1327 -5702:2:1328 -5703:2:1329 -5704:2:1340 -5705:2:1345 -5706:2:1346 -5707:0:4365 -5708:2:1358 -5709:0:4365 -5710:2:1360 -5711:0:4365 -5712:3:4069 -5713:0:4365 -5714:2:1361 -5715:0:4365 -5716:3:4070 -5717:0:4365 -5718:2:1362 -5719:2:1366 -5720:2:1367 -5721:2:1375 -5722:2:1376 -5723:2:1380 -5724:2:1381 -5725:2:1375 -5726:2:1376 -5727:2:1380 -5728:2:1381 -5729:2:1389 -5730:2:1394 -5731:2:1398 -5732:2:1399 -5733:2:1406 -5734:2:1407 -5735:2:1418 -5736:2:1419 -5737:2:1420 -5738:2:1418 -5739:2:1419 -5740:2:1420 -5741:2:1431 -5742:2:1436 -5743:2:1437 -5744:0:4365 -5745:2:1449 -5746:0:4365 -5747:3:4069 -5748:0:4365 -5749:2:1451 -5750:0:4365 -5751:3:4070 -5752:0:4365 -5753:2:1652 -5754:0:4365 -5755:2:1653 -5756:0:4365 -5757:2:1657 -5758:0:4365 -5759:2:1180 -5760:0:4365 -5761:3:4069 -5762:0:4365 -5763:2:1181 -5764:2:1185 -5765:2:1186 -5766:2:1194 -5767:2:1195 -5768:2:1199 -5769:2:1200 -5770:2:1194 -5771:2:1195 -5772:2:1196 -5773:2:1208 -5774:2:1213 -5775:2:1217 -5776:2:1218 -5777:2:1225 -5778:2:1226 -5779:2:1237 -5780:2:1238 -5781:2:1239 -5782:2:1237 -5783:2:1238 -5784:2:1239 -5785:2:1250 -5786:2:1255 -5787:2:1256 -5788:0:4365 -5789:3:4070 -5790:0:4365 -5791:2:1268 -5792:0:4365 -5793:3:4069 -5794:0:4365 -5795:2:1270 -5796:0:4365 -5797:3:4070 -5798:0:4365 -5799:2:1271 -5800:2:1275 -5801:2:1276 -5802:2:1284 -5803:2:1285 -5804:2:1289 -5805:2:1290 -5806:2:1284 -5807:2:1285 -5808:2:1289 -5809:2:1290 -5810:2:1298 -5811:2:1303 -5812:2:1307 -5813:2:1308 -5814:2:1315 -5815:2:1316 -5816:2:1327 -5817:2:1328 -5818:2:1329 -5819:2:1327 -5820:2:1328 -5821:2:1329 -5822:2:1340 -5823:2:1345 -5824:2:1346 -5825:0:4365 -5826:2:1358 -5827:0:4365 -5828:2:1454 -5829:0:4365 -5830:3:4069 -5831:0:4365 -5832:2:1455 -5833:0:4365 -5834:3:4070 -5835:0:4365 -5836:2:1652 -5837:0:4365 -5838:2:1653 -5839:0:4365 -5840:2:1657 -5841:0:4365 -5842:2:1660 -5843:0:4365 -5844:3:4069 -5845:0:4365 -5846:2:1665 -5847:2:1669 -5848:2:1670 -5849:2:1678 -5850:2:1679 -5851:2:1683 -5852:2:1684 -5853:2:1678 -5854:2:1679 -5855:2:1680 -5856:2:1692 -5857:2:1697 -5858:2:1701 -5859:2:1702 -5860:2:1709 -5861:2:1710 -5862:2:1721 -5863:2:1722 -5864:2:1723 -5865:2:1721 -5866:2:1722 -5867:2:1723 -5868:2:1734 -5869:2:1739 -5870:2:1740 -5871:0:4365 -5872:3:4070 -5873:0:4365 -5874:2:1752 -5875:0:4365 -5876:3:4069 -5877:0:4365 -5878:2:1754 -5879:0:4365 -5880:3:4070 -5881:0:4365 -5882:2:1755 -5883:2:1759 -5884:2:1760 -5885:2:1768 -5886:2:1769 -5887:2:1773 -5888:2:1774 -5889:2:1768 -5890:2:1769 -5891:2:1773 -5892:2:1774 -5893:2:1782 -5894:2:1787 -5895:2:1791 -5896:2:1792 -5897:2:1799 -5898:2:1800 -5899:2:1811 -5900:2:1812 -5901:2:1813 -5902:2:1811 -5903:2:1812 -5904:2:1813 -5905:2:1824 -5906:2:1829 -5907:2:1830 -5908:0:4365 -5909:2:1842 -5910:0:4365 -5911:3:4069 -5912:0:4365 -5913:2:1844 -5914:0:4365 -5915:3:4070 -5916:0:4365 -5917:2:1845 -5918:2:1849 -5919:2:1850 -5920:2:1858 -5921:2:1859 -5922:2:1863 -5923:2:1864 -5924:2:1858 -5925:2:1859 -5926:2:1863 -5927:2:1864 -5928:2:1872 -5929:2:1877 -5930:2:1881 -5931:2:1882 -5932:2:1889 -5933:2:1890 -5934:2:1901 -5935:2:1902 -5936:2:1903 -5937:2:1901 -5938:2:1902 -5939:2:1903 -5940:2:1914 -5941:2:1919 -5942:2:1920 -5943:0:4365 -5944:2:1932 -5945:0:4365 -5946:3:4069 -5947:0:4365 -5948:2:1934 -5949:0:4365 -5950:3:4070 -5951:0:4365 -5952:2:1935 -5953:0:4365 -5954:2:1936 -5955:0:4365 -5956:2:2129 -5957:0:4365 -5958:2:2130 -5959:0:4365 -5960:2:2134 -5961:0:4365 -5962:3:4069 -5963:0:4365 -5964:2:2136 -5965:0:4365 -5966:3:4070 -5967:0:4365 -5968:2:2137 -5969:2:2141 -5970:2:2142 -5971:2:2150 -5972:2:2151 -5973:2:2155 -5974:2:2156 -5975:2:2150 -5976:2:2151 -5977:2:2155 -5978:2:2156 -5979:2:2164 -5980:2:2169 -5981:2:2173 -5982:2:2174 -5983:2:2181 -5984:2:2182 -5985:2:2193 -5986:2:2194 -5987:2:2195 -5988:2:2193 -5989:2:2194 -5990:2:2195 -5991:2:2206 -5992:2:2211 -5993:2:2212 -5994:0:4365 -5995:2:2224 -5996:0:4365 -5997:3:4069 -5998:0:4365 -5999:2:2226 -6000:0:4365 -6001:3:4070 -6002:0:4365 -6003:2:1936 -6004:0:4365 -6005:2:2129 -6006:0:4365 -6007:2:2130 -6008:0:4365 -6009:2:2134 -6010:0:4365 -6011:3:4069 -6012:0:4365 -6013:2:2136 -6014:0:4365 -6015:3:4070 -6016:0:4365 -6017:2:2137 -6018:2:2141 -6019:2:2142 -6020:2:2150 -6021:2:2151 -6022:2:2155 -6023:2:2156 -6024:2:2150 -6025:2:2151 -6026:2:2152 -6027:2:2164 -6028:2:2169 -6029:2:2173 -6030:2:2174 -6031:2:2181 -6032:2:2182 -6033:2:2193 -6034:2:2194 -6035:2:2195 -6036:2:2193 -6037:2:2194 -6038:2:2195 -6039:2:2206 -6040:2:2211 -6041:2:2212 -6042:0:4365 -6043:2:2224 -6044:0:4365 -6045:3:4069 -6046:0:4365 -6047:2:2226 -6048:0:4365 -6049:3:4070 -6050:0:4365 -6051:2:2230 -6052:0:4365 -6053:3:4069 -6054:0:4365 -6055:2:2235 -6056:2:2239 -6057:2:2240 -6058:2:2248 -6059:2:2249 -6060:2:2253 -6061:2:2254 -6062:2:2248 -6063:2:2249 -6064:2:2250 -6065:2:2262 -6066:2:2267 -6067:2:2271 -6068:2:2272 -6069:2:2279 -6070:2:2280 -6071:2:2291 -6072:2:2292 -6073:2:2293 -6074:2:2291 -6075:2:2292 -6076:2:2293 -6077:2:2304 -6078:2:2309 -6079:2:2310 -6080:0:4365 -6081:3:4070 -6082:0:4365 -6083:2:2322 -6084:0:4365 -6085:2:1169 -6086:0:4365 -6087:3:4069 -6088:0:4365 -6089:2:1170 -6090:0:4365 -6091:3:4070 -6092:0:4365 -6093:3:4071 -6094:0:4365 -6095:3:4081 -6096:0:4365 -6097:3:3666 -6098:0:4365 -6099:3:3667 -6100:0:4365 -6101:3:3668 -6102:0:4365 -6103:3:3669 -6104:3:3673 -6105:3:3674 -6106:3:3682 -6107:3:3683 -6108:3:3687 -6109:3:3688 -6110:3:3682 -6111:3:3683 -6112:3:3687 -6113:3:3688 -6114:3:3696 -6115:3:3701 -6116:3:3705 -6117:3:3706 -6118:3:3713 -6119:3:3714 -6120:3:3725 -6121:3:3726 -6122:3:3727 -6123:3:3725 -6124:3:3726 -6125:3:3727 -6126:3:3738 -6127:3:3743 -6128:3:3744 -6129:0:4365 -6130:3:3756 -6131:0:4365 -6132:3:3757 -6133:0:4365 -6134:2:1173 -6135:0:4365 -6136:3:3758 -6137:0:4365 -6138:2:1179 -6139:0:4365 -6140:2:1180 -6141:0:4365 -6142:3:3757 -6143:0:4365 -6144:2:1181 -6145:2:1185 -6146:2:1186 -6147:2:1194 -6148:2:1195 -6149:2:1199 -6150:2:1200 -6151:2:1194 -6152:2:1195 -6153:2:1199 -6154:2:1200 -6155:2:1208 -6156:2:1213 -6157:2:1217 -6158:2:1218 -6159:2:1225 -6160:2:1226 -6161:2:1237 -6162:2:1238 -6163:2:1239 -6164:2:1237 -6165:2:1238 -6166:2:1239 -6167:2:1250 -6168:2:1255 -6169:2:1256 -6170:0:4365 -6171:3:3758 -6172:0:4365 -6173:2:1268 -6174:0:4365 -6175:3:3757 -6176:0:4365 -6177:2:1270 -6178:0:4365 -6179:3:3758 -6180:0:4365 -6181:2:1271 -6182:2:1275 -6183:2:1276 -6184:2:1284 -6185:2:1285 -6186:2:1289 -6187:2:1290 -6188:2:1284 -6189:2:1285 -6190:2:1289 -6191:2:1290 -6192:2:1298 -6193:2:1303 -6194:2:1307 -6195:2:1308 -6196:2:1315 -6197:2:1316 -6198:2:1327 -6199:2:1328 -6200:2:1329 -6201:2:1327 -6202:2:1328 -6203:2:1329 -6204:2:1340 -6205:2:1345 -6206:2:1346 -6207:0:4365 -6208:2:1358 -6209:0:4365 -6210:2:1360 -6211:0:4365 -6212:3:3757 -6213:0:4365 -6214:2:1361 -6215:0:4365 -6216:3:3758 -6217:0:4365 -6218:2:1362 -6219:2:1366 -6220:2:1367 -6221:2:1375 -6222:2:1376 -6223:2:1380 -6224:2:1381 -6225:2:1375 -6226:2:1376 -6227:2:1380 -6228:2:1381 -6229:2:1389 -6230:2:1394 -6231:2:1398 -6232:2:1399 -6233:2:1406 -6234:2:1407 -6235:2:1418 -6236:2:1419 -6237:2:1420 -6238:2:1418 -6239:2:1419 -6240:2:1420 -6241:2:1431 -6242:2:1436 -6243:2:1437 -6244:0:4365 -6245:2:1449 -6246:0:4365 -6247:3:3757 -6248:0:4365 -6249:2:1451 -6250:0:4365 -6251:3:3758 -6252:0:4365 -6253:2:1652 -6254:0:4365 -6255:2:1653 -6256:0:4365 -6257:2:1657 -6258:0:4365 -6259:2:1180 -6260:0:4365 -6261:3:3757 -6262:0:4365 -6263:2:1181 -6264:2:1185 -6265:2:1186 -6266:2:1194 -6267:2:1195 -6268:2:1199 -6269:2:1200 -6270:2:1194 -6271:2:1195 -6272:2:1196 -6273:2:1208 -6274:2:1213 -6275:2:1217 -6276:2:1218 -6277:2:1225 -6278:2:1226 -6279:2:1237 -6280:2:1238 -6281:2:1239 -6282:2:1237 -6283:2:1238 -6284:2:1239 -6285:2:1250 -6286:2:1255 -6287:2:1256 -6288:0:4365 -6289:3:3758 -6290:0:4365 -6291:2:1268 -6292:0:4365 -6293:3:3757 -6294:0:4365 -6295:2:1270 -6296:0:4365 -6297:3:3758 -6298:0:4365 -6299:2:1271 -6300:2:1275 -6301:2:1276 -6302:2:1284 -6303:2:1285 -6304:2:1289 -6305:2:1290 -6306:2:1284 -6307:2:1285 -6308:2:1289 -6309:2:1290 -6310:2:1298 -6311:2:1303 -6312:2:1307 -6313:2:1308 -6314:2:1315 -6315:2:1316 -6316:2:1327 -6317:2:1328 -6318:2:1329 -6319:2:1327 -6320:2:1328 -6321:2:1329 -6322:2:1340 -6323:2:1345 -6324:2:1346 -6325:0:4365 -6326:2:1358 -6327:0:4365 -6328:2:1454 -6329:0:4365 -6330:3:3757 -6331:0:4365 -6332:2:1455 -6333:0:4365 -6334:3:3758 -6335:0:4365 -6336:2:1652 -6337:0:4365 -6338:2:1653 -6339:0:4365 -6340:2:1657 -6341:0:4365 -6342:2:1660 -6343:0:4365 -6344:3:3757 -6345:0:4365 -6346:2:1665 -6347:2:1669 -6348:2:1670 -6349:2:1678 -6350:2:1679 -6351:2:1683 -6352:2:1684 -6353:2:1678 -6354:2:1679 -6355:2:1680 -6356:2:1692 -6357:2:1697 -6358:2:1701 -6359:2:1702 -6360:2:1709 -6361:2:1710 -6362:2:1721 -6363:2:1722 -6364:2:1723 -6365:2:1721 -6366:2:1722 -6367:2:1723 -6368:2:1734 -6369:2:1739 -6370:2:1740 -6371:0:4365 -6372:3:3758 -6373:0:4365 -6374:2:1752 -6375:0:4365 -6376:3:3757 -6377:0:4365 -6378:2:1754 -6379:0:4365 -6380:3:3758 -6381:0:4365 -6382:2:1755 -6383:2:1759 -6384:2:1760 -6385:2:1768 -6386:2:1769 -6387:2:1773 -6388:2:1774 -6389:2:1768 -6390:2:1769 -6391:2:1773 -6392:2:1774 -6393:2:1782 -6394:2:1787 -6395:2:1791 -6396:2:1792 -6397:2:1799 -6398:2:1800 -6399:2:1811 -6400:2:1812 -6401:2:1813 -6402:2:1811 -6403:2:1812 -6404:2:1813 -6405:2:1824 -6406:2:1829 -6407:2:1830 -6408:0:4365 -6409:2:1842 -6410:0:4365 -6411:3:3757 -6412:0:4365 -6413:2:1844 -6414:0:4365 -6415:3:3758 -6416:0:4365 -6417:2:1845 -6418:2:1849 -6419:2:1850 -6420:2:1858 -6421:2:1859 -6422:2:1863 -6423:2:1864 -6424:2:1858 -6425:2:1859 -6426:2:1863 -6427:2:1864 -6428:2:1872 -6429:2:1877 -6430:2:1881 -6431:2:1882 -6432:2:1889 -6433:2:1890 -6434:2:1901 -6435:2:1902 -6436:2:1903 -6437:2:1901 -6438:2:1902 -6439:2:1903 -6440:2:1914 -6441:2:1919 -6442:2:1920 -6443:0:4365 -6444:2:1932 -6445:0:4365 -6446:3:3757 -6447:0:4365 -6448:2:1934 -6449:0:4365 -6450:3:3758 -6451:0:4365 -6452:2:1935 -6453:0:4365 -6454:2:1936 -6455:0:4365 -6456:2:2129 -6457:0:4365 -6458:2:2130 -6459:0:4365 -6460:2:2134 -6461:0:4365 -6462:3:3757 -6463:0:4365 -6464:2:2136 -6465:0:4365 -6466:3:3758 -6467:0:4365 -6468:2:2137 -6469:2:2141 -6470:2:2142 -6471:2:2150 -6472:2:2151 -6473:2:2155 -6474:2:2156 -6475:2:2150 -6476:2:2151 -6477:2:2155 -6478:2:2156 -6479:2:2164 -6480:2:2169 -6481:2:2173 -6482:2:2174 -6483:2:2181 -6484:2:2182 -6485:2:2193 -6486:2:2194 -6487:2:2195 -6488:2:2193 -6489:2:2194 -6490:2:2195 -6491:2:2206 -6492:2:2211 -6493:2:2212 -6494:0:4365 -6495:2:2224 -6496:0:4365 -6497:3:3757 -6498:0:4365 -6499:2:2226 -6500:0:4365 -6501:3:3758 -6502:0:4365 -6503:2:1936 -6504:0:4365 -6505:2:2129 -6506:0:4365 -6507:2:2130 -6508:0:4365 -6509:2:2134 -6510:0:4365 -6511:3:3757 -6512:0:4365 -6513:2:2136 -6514:0:4365 -6515:3:3758 -6516:0:4365 -6517:2:2137 -6518:2:2141 -6519:2:2142 -6520:2:2150 -6521:2:2151 -6522:2:2155 -6523:2:2156 -6524:2:2150 -6525:2:2151 -6526:2:2152 -6527:2:2164 -6528:2:2169 -6529:2:2173 -6530:2:2174 -6531:2:2181 -6532:2:2182 -6533:2:2193 -6534:2:2194 -6535:2:2195 -6536:2:2193 -6537:2:2194 -6538:2:2195 -6539:2:2206 -6540:2:2211 -6541:2:2212 -6542:0:4365 -6543:2:2224 -6544:0:4365 -6545:3:3757 -6546:0:4365 -6547:2:2226 -6548:0:4365 -6549:3:3758 -6550:0:4365 -6551:2:2230 -6552:0:4365 -6553:3:3757 -6554:0:4365 -6555:2:2235 -6556:2:2239 -6557:2:2240 -6558:2:2248 -6559:2:2249 -6560:2:2253 -6561:2:2254 -6562:2:2248 -6563:2:2249 -6564:2:2250 -6565:2:2262 -6566:2:2267 -6567:2:2271 -6568:2:2272 -6569:2:2279 -6570:2:2280 -6571:2:2291 -6572:2:2292 -6573:2:2293 -6574:2:2291 -6575:2:2292 -6576:2:2293 -6577:2:2304 -6578:2:2309 -6579:2:2310 -6580:0:4365 -6581:3:3758 -6582:0:4365 -6583:2:2322 -6584:0:4365 -6585:2:1169 -6586:0:4365 -6587:3:3757 -6588:0:4365 -6589:2:1170 -6590:0:4365 -6591:3:3758 -6592:0:4365 -6593:3:3759 -6594:0:4365 -6595:3:3972 -6596:0:4365 -6597:3:4077 -6598:0:4365 -6599:3:4078 -6600:0:4365 -6601:3:4082 -6602:0:4365 -6603:3:4088 -6604:0:4365 -6605:3:4092 -6606:3:4093 -6607:3:4097 -6608:3:4101 -6609:3:4102 -6610:3:4097 -6611:3:4101 -6612:3:4102 -6613:3:4106 -6614:3:4114 -6615:3:4115 -6616:3:4120 -6617:3:4127 -6618:3:4128 -6619:3:4127 -6620:3:4128 -6621:3:4135 -6622:3:4140 -6623:0:4365 -6624:3:4151 -6625:0:4365 -6626:3:4155 -6627:3:4156 -6628:3:4160 -6629:3:4164 -6630:3:4165 -6631:3:4160 -6632:3:4164 -6633:3:4165 -6634:3:4169 -6635:3:4177 -6636:3:4178 -6637:3:4183 -6638:3:4190 -6639:3:4191 -6640:3:4190 -6641:3:4191 -6642:3:4198 -6643:3:4203 -6644:0:4365 -6645:3:4151 -6646:0:4365 -6647:3:4155 -6648:3:4156 -6649:3:4160 -6650:3:4164 -6651:3:4165 -6652:3:4160 -6653:3:4164 -6654:3:4165 -6655:3:4169 -6656:3:4177 -6657:3:4178 -6658:3:4183 -6659:3:4190 -6660:3:4191 -6661:3:4190 -6662:3:4191 -6663:3:4198 -6664:3:4203 -6665:0:4365 -6666:3:4214 -6667:0:4365 -6668:3:4222 -6669:3:4223 -6670:3:4227 -6671:3:4231 -6672:3:4232 -6673:3:4227 -6674:3:4231 -6675:3:4232 -6676:3:4236 -6677:3:4244 -6678:3:4245 -6679:3:4250 -6680:3:4257 -6681:3:4258 -6682:3:4257 -6683:3:4258 -6684:3:4265 -6685:3:4270 -6686:0:4365 -6687:3:4285 -6688:0:4365 -6689:3:4286 -6690:0:4365 -6691:2:1173 -6692:0:4365 -6693:3:4287 -6694:0:4365 -6695:2:1179 -6696:0:4365 -6697:2:1180 -6698:0:4365 -6699:3:4286 -6700:0:4365 -6701:2:1181 -6702:2:1185 -6703:2:1186 -6704:2:1194 -6705:2:1195 -6706:2:1199 -6707:2:1200 -6708:2:1194 -6709:2:1195 -6710:2:1199 -6711:2:1200 -6712:2:1208 -6713:2:1213 -6714:2:1217 -6715:2:1218 -6716:2:1225 -6717:2:1226 -6718:2:1237 -6719:2:1238 -6720:2:1239 -6721:2:1237 -6722:2:1238 -6723:2:1239 -6724:2:1250 -6725:2:1255 -6726:2:1256 -6727:0:4365 -6728:3:4287 -6729:0:4365 -6730:2:1268 -6731:0:4365 -6732:3:4286 -6733:0:4365 -6734:2:1270 -6735:0:4365 -6736:3:4287 -6737:0:4365 -6738:2:1271 -6739:2:1275 -6740:2:1276 -6741:2:1284 -6742:2:1285 -6743:2:1289 -6744:2:1290 -6745:2:1284 -6746:2:1285 -6747:2:1289 -6748:2:1290 -6749:2:1298 -6750:2:1303 -6751:2:1307 -6752:2:1308 -6753:2:1315 -6754:2:1316 -6755:2:1327 -6756:2:1328 -6757:2:1329 -6758:2:1327 -6759:2:1328 -6760:2:1329 -6761:2:1340 -6762:2:1345 -6763:2:1346 -6764:0:4365 -6765:2:1358 -6766:0:4365 -6767:2:1360 -6768:0:4365 -6769:3:4286 -6770:0:4365 -6771:2:1361 -6772:0:4365 -6773:3:4287 -6774:0:4365 -6775:2:1362 -6776:2:1366 -6777:2:1367 -6778:2:1375 -6779:2:1376 -6780:2:1380 -6781:2:1381 -6782:2:1375 -6783:2:1376 -6784:2:1380 -6785:2:1381 -6786:2:1389 -6787:2:1394 -6788:2:1398 -6789:2:1399 -6790:2:1406 -6791:2:1407 -6792:2:1418 -6793:2:1419 -6794:2:1420 -6795:2:1418 -6796:2:1419 -6797:2:1420 -6798:2:1431 -6799:2:1436 -6800:2:1437 -6801:0:4365 -6802:2:1449 -6803:0:4365 -6804:3:4286 -6805:0:4365 -6806:2:1451 -6807:0:4365 -6808:3:4287 -6809:0:4365 -6810:2:1652 -6811:0:4365 -6812:2:1653 -6813:0:4365 -6814:2:1657 -6815:0:4365 -6816:2:1180 -6817:0:4365 -6818:3:4286 -6819:0:4365 -6820:2:1181 -6821:2:1185 -6822:2:1186 -6823:2:1194 -6824:2:1195 -6825:2:1199 -6826:2:1200 -6827:2:1194 -6828:2:1195 -6829:2:1196 -6830:2:1208 -6831:2:1213 -6832:2:1217 -6833:2:1218 -6834:2:1225 -6835:2:1226 -6836:2:1237 -6837:2:1238 -6838:2:1239 -6839:2:1237 -6840:2:1238 -6841:2:1239 -6842:2:1250 -6843:2:1255 -6844:2:1256 -6845:0:4365 -6846:3:4287 -6847:0:4365 -6848:2:1268 -6849:0:4365 -6850:3:4286 -6851:0:4365 -6852:2:1270 -6853:0:4365 -6854:3:4287 -6855:0:4365 -6856:2:1271 -6857:2:1275 -6858:2:1276 -6859:2:1284 -6860:2:1285 -6861:2:1289 -6862:2:1290 -6863:2:1284 -6864:2:1285 -6865:2:1289 -6866:2:1290 -6867:2:1298 -6868:2:1303 -6869:2:1307 -6870:2:1308 -6871:2:1315 -6872:2:1316 -6873:2:1327 -6874:2:1328 -6875:2:1329 -6876:2:1327 -6877:2:1328 -6878:2:1329 -6879:2:1340 -6880:2:1345 -6881:2:1346 -6882:0:4365 -6883:2:1358 -6884:0:4365 -6885:2:1454 -6886:0:4365 -6887:3:4286 -6888:0:4365 -6889:2:1455 -6890:0:4365 -6891:3:4287 -6892:0:4365 -6893:2:1652 -6894:0:4365 -6895:2:1653 -6896:0:4365 -6897:2:1657 -6898:0:4365 -6899:2:1660 -6900:0:4365 -6901:3:4286 -6902:0:4365 -6903:2:1665 -6904:2:1669 -6905:2:1670 -6906:2:1678 -6907:2:1679 -6908:2:1683 -6909:2:1684 -6910:2:1678 -6911:2:1679 -6912:2:1680 -6913:2:1692 -6914:2:1697 -6915:2:1701 -6916:2:1702 -6917:2:1709 -6918:2:1710 -6919:2:1721 -6920:2:1722 -6921:2:1723 -6922:2:1721 -6923:2:1722 -6924:2:1723 -6925:2:1734 -6926:2:1739 -6927:2:1740 -6928:0:4365 -6929:3:4287 -6930:0:4365 -6931:2:1752 -6932:0:4365 -6933:3:4286 -6934:0:4365 -6935:2:1754 -6936:0:4365 -6937:3:4287 -6938:0:4365 -6939:2:1755 -6940:2:1759 -6941:2:1760 -6942:2:1768 -6943:2:1769 -6944:2:1773 -6945:2:1774 -6946:2:1768 -6947:2:1769 -6948:2:1773 -6949:2:1774 -6950:2:1782 -6951:2:1787 -6952:2:1791 -6953:2:1792 -6954:2:1799 -6955:2:1800 -6956:2:1811 -6957:2:1812 -6958:2:1813 -6959:2:1811 -6960:2:1812 -6961:2:1813 -6962:2:1824 -6963:2:1829 -6964:2:1830 -6965:0:4365 -6966:2:1842 -6967:0:4365 -6968:3:4286 -6969:0:4365 -6970:2:1844 -6971:0:4365 -6972:3:4287 -6973:0:4365 -6974:2:1845 -6975:2:1849 -6976:2:1850 -6977:2:1858 -6978:2:1859 -6979:2:1863 -6980:2:1864 -6981:2:1858 -6982:2:1859 -6983:2:1863 -6984:2:1864 -6985:2:1872 -6986:2:1877 -6987:2:1881 -6988:2:1882 -6989:2:1889 -6990:2:1890 -6991:2:1901 -6992:2:1902 -6993:2:1903 -6994:2:1901 -6995:2:1902 -6996:2:1903 -6997:2:1914 -6998:2:1919 -6999:2:1920 -7000:0:4365 -7001:2:1932 -7002:0:4365 -7003:3:4286 -7004:0:4365 -7005:2:1934 -7006:0:4365 -7007:3:4287 -7008:0:4365 -7009:2:1935 -7010:0:4365 -7011:2:1936 -7012:0:4365 -7013:2:2129 -7014:0:4365 -7015:2:2130 -7016:0:4365 -7017:2:2134 -7018:0:4365 -7019:3:4286 -7020:0:4365 -7021:2:2136 -7022:0:4365 -7023:3:4287 -7024:0:4365 -7025:2:2137 -7026:2:2141 -7027:2:2142 -7028:2:2150 -7029:2:2151 -7030:2:2155 -7031:2:2156 -7032:2:2150 -7033:2:2151 -7034:2:2155 -7035:2:2156 -7036:2:2164 -7037:2:2169 -7038:2:2173 -7039:2:2174 -7040:2:2181 -7041:2:2182 -7042:2:2193 -7043:2:2194 -7044:2:2195 -7045:2:2193 -7046:2:2194 -7047:2:2195 -7048:2:2206 -7049:2:2211 -7050:2:2212 -7051:0:4365 -7052:2:2224 -7053:0:4365 -7054:3:4286 -7055:0:4365 -7056:2:2226 -7057:0:4365 -7058:3:4287 -7059:0:4365 -7060:2:1936 -7061:0:4365 -7062:2:2129 -7063:0:4365 -7064:2:2130 -7065:0:4365 -7066:2:2134 -7067:0:4365 -7068:3:4286 -7069:0:4365 -7070:2:2136 -7071:0:4365 -7072:3:4287 -7073:0:4365 -7074:2:2137 -7075:2:2141 -7076:2:2142 -7077:2:2150 -7078:2:2151 -7079:2:2155 -7080:2:2156 -7081:2:2150 -7082:2:2151 -7083:2:2152 -7084:2:2164 -7085:2:2169 -7086:2:2173 -7087:2:2174 -7088:2:2181 -7089:2:2182 -7090:2:2193 -7091:2:2194 -7092:2:2195 -7093:2:2193 -7094:2:2194 -7095:2:2195 -7096:2:2206 -7097:2:2211 -7098:2:2212 -7099:0:4365 -7100:2:2224 -7101:0:4365 -7102:3:4286 -7103:0:4365 -7104:2:2226 -7105:0:4365 -7106:3:4287 -7107:0:4365 -7108:2:2230 -7109:0:4365 -7110:3:4286 -7111:0:4365 -7112:2:2235 -7113:2:2239 -7114:2:2240 -7115:2:2248 -7116:2:2249 -7117:2:2253 -7118:2:2254 -7119:2:2248 -7120:2:2249 -7121:2:2250 -7122:2:2262 -7123:2:2267 -7124:2:2271 -7125:2:2272 -7126:2:2279 -7127:2:2280 -7128:2:2291 -7129:2:2292 -7130:2:2293 -7131:2:2291 -7132:2:2292 -7133:2:2293 -7134:2:2304 -7135:2:2309 -7136:2:2310 -7137:0:4365 -7138:3:4287 -7139:0:4365 -7140:2:2322 -7141:0:4365 -7142:2:1169 -7143:0:4365 -7144:3:4286 -7145:0:4365 -7146:2:1170 -7147:0:4365 -7148:3:4287 -7149:0:4365 -7150:3:4288 -7151:0:4365 -7152:3:4294 -7153:0:4365 -7154:3:4295 -7155:0:4365 -7156:3:2338 -7157:0:4365 -7158:3:2339 -7159:3:2343 -7160:3:2344 -7161:3:2352 -7162:3:2353 -7163:3:2357 -7164:3:2358 -7165:3:2352 -7166:3:2353 -7167:3:2357 -7168:3:2358 -7169:3:2366 -7170:3:2371 -7171:3:2375 -7172:3:2376 -7173:3:2383 -7174:3:2384 -7175:3:2395 -7176:3:2396 -7177:3:2397 -7178:3:2395 -7179:3:2396 -7180:3:2397 -7181:3:2408 -7182:3:2413 -7183:3:2414 -7184:0:4365 -7185:3:2426 -7186:0:4365 -7187:3:2427 -7188:0:4365 -7189:2:1173 -7190:0:4365 -7191:3:2428 -7192:0:4365 -7193:2:1179 -7194:0:4365 -7195:2:1180 -7196:0:4365 -7197:3:2427 -7198:0:4365 -7199:2:1181 -7200:2:1185 -7201:2:1186 -7202:2:1194 -7203:2:1195 -7204:2:1199 -7205:2:1200 -7206:2:1194 -7207:2:1195 -7208:2:1199 -7209:2:1200 -7210:2:1208 -7211:2:1213 -7212:2:1217 -7213:2:1218 -7214:2:1225 -7215:2:1226 -7216:2:1237 -7217:2:1238 -7218:2:1239 -7219:2:1237 -7220:2:1238 -7221:2:1239 -7222:2:1250 -7223:2:1255 -7224:2:1256 -7225:0:4365 -7226:3:2428 -7227:0:4365 -7228:2:1268 -7229:0:4365 -7230:3:2427 -7231:0:4365 -7232:2:1270 -7233:0:4365 -7234:3:2428 -7235:0:4365 -7236:2:1271 -7237:2:1275 -7238:2:1276 -7239:2:1284 -7240:2:1285 -7241:2:1289 -7242:2:1290 -7243:2:1284 -7244:2:1285 -7245:2:1289 -7246:2:1290 -7247:2:1298 -7248:2:1303 -7249:2:1307 -7250:2:1308 -7251:2:1315 -7252:2:1316 -7253:2:1327 -7254:2:1328 -7255:2:1329 -7256:2:1327 -7257:2:1328 -7258:2:1329 -7259:2:1340 -7260:2:1345 -7261:2:1346 -7262:0:4365 -7263:2:1358 -7264:0:4365 -7265:2:1360 -7266:0:4365 -7267:3:2427 -7268:0:4365 -7269:2:1361 -7270:0:4365 -7271:3:2428 -7272:0:4365 -7273:2:1362 -7274:2:1366 -7275:2:1367 -7276:2:1375 -7277:2:1376 -7278:2:1380 -7279:2:1381 -7280:2:1375 -7281:2:1376 -7282:2:1380 -7283:2:1381 -7284:2:1389 -7285:2:1394 -7286:2:1398 -7287:2:1399 -7288:2:1406 -7289:2:1407 -7290:2:1418 -7291:2:1419 -7292:2:1420 -7293:2:1418 -7294:2:1419 -7295:2:1420 -7296:2:1431 -7297:2:1436 -7298:2:1437 -7299:0:4365 -7300:2:1449 -7301:0:4365 -7302:3:2427 -7303:0:4365 -7304:2:1451 -7305:0:4365 -7306:3:2428 -7307:0:4365 -7308:2:1652 -7309:0:4365 -7310:2:1653 -7311:0:4365 -7312:2:1657 -7313:0:4365 -7314:2:1180 -7315:0:4365 -7316:3:2427 -7317:0:4365 -7318:2:1181 -7319:2:1185 -7320:2:1186 -7321:2:1194 -7322:2:1195 -7323:2:1199 -7324:2:1200 -7325:2:1194 -7326:2:1195 -7327:2:1196 -7328:2:1208 -7329:2:1213 -7330:2:1217 -7331:2:1218 -7332:2:1225 -7333:2:1226 -7334:2:1237 -7335:2:1238 -7336:2:1239 -7337:2:1237 -7338:2:1238 -7339:2:1239 -7340:2:1250 -7341:2:1255 -7342:2:1256 -7343:0:4365 -7344:3:2428 -7345:0:4365 -7346:2:1268 -7347:0:4365 -7348:3:2427 -7349:0:4365 -7350:2:1270 -7351:0:4365 -7352:3:2428 -7353:0:4365 -7354:2:1271 -7355:2:1275 -7356:2:1276 -7357:2:1284 -7358:2:1285 -7359:2:1289 -7360:2:1290 -7361:2:1284 -7362:2:1285 -7363:2:1289 -7364:2:1290 -7365:2:1298 -7366:2:1303 -7367:2:1307 -7368:2:1308 -7369:2:1315 -7370:2:1316 -7371:2:1327 -7372:2:1328 -7373:2:1329 -7374:2:1327 -7375:2:1328 -7376:2:1329 -7377:2:1340 -7378:2:1345 -7379:2:1346 -7380:0:4365 -7381:2:1358 -7382:0:4365 -7383:2:1454 -7384:0:4365 -7385:3:2427 -7386:0:4365 -7387:2:1455 -7388:0:4365 -7389:3:2428 -7390:0:4365 -7391:2:1652 -7392:0:4365 -7393:2:1653 -7394:0:4365 -7395:2:1657 -7396:0:4365 -7397:2:1660 -7398:0:4365 -7399:3:2427 -7400:0:4365 -7401:2:1665 -7402:2:1669 -7403:2:1670 -7404:2:1678 -7405:2:1679 -7406:2:1683 -7407:2:1684 -7408:2:1678 -7409:2:1679 -7410:2:1680 -7411:2:1692 -7412:2:1697 -7413:2:1701 -7414:2:1702 -7415:2:1709 -7416:2:1710 -7417:2:1721 -7418:2:1722 -7419:2:1723 -7420:2:1721 -7421:2:1722 -7422:2:1723 -7423:2:1734 -7424:2:1739 -7425:2:1740 -7426:0:4365 -7427:3:2428 -7428:0:4365 -7429:2:1752 -7430:0:4365 -7431:3:2427 -7432:0:4365 -7433:2:1754 -7434:0:4365 -7435:3:2428 -7436:0:4365 -7437:2:1755 -7438:2:1759 -7439:2:1760 -7440:2:1768 -7441:2:1769 -7442:2:1773 -7443:2:1774 -7444:2:1768 -7445:2:1769 -7446:2:1773 -7447:2:1774 -7448:2:1782 -7449:2:1787 -7450:2:1791 -7451:2:1792 -7452:2:1799 -7453:2:1800 -7454:2:1811 -7455:2:1812 -7456:2:1813 -7457:2:1811 -7458:2:1812 -7459:2:1813 -7460:2:1824 -7461:2:1829 -7462:2:1830 -7463:0:4365 -7464:2:1842 -7465:0:4365 -7466:3:2427 -7467:0:4365 -7468:2:1844 -7469:0:4365 -7470:3:2428 -7471:0:4365 -7472:2:1845 -7473:2:1849 -7474:2:1850 -7475:2:1858 -7476:2:1859 -7477:2:1863 -7478:2:1864 -7479:2:1858 -7480:2:1859 -7481:2:1863 -7482:2:1864 -7483:2:1872 -7484:2:1877 -7485:2:1881 -7486:2:1882 -7487:2:1889 -7488:2:1890 -7489:2:1901 -7490:2:1902 -7491:2:1903 -7492:2:1901 -7493:2:1902 -7494:2:1903 -7495:2:1914 -7496:2:1919 -7497:2:1920 -7498:0:4365 -7499:2:1932 -7500:0:4365 -7501:3:2427 -7502:0:4365 -7503:2:1934 -7504:0:4365 -7505:3:2428 -7506:0:4365 -7507:2:1935 -7508:0:4365 -7509:2:1936 -7510:0:4365 -7511:2:2129 -7512:0:4365 -7513:2:2130 -7514:0:4365 -7515:2:2134 -7516:0:4365 -7517:3:2427 -7518:0:4365 -7519:2:2136 -7520:0:4365 -7521:3:2428 -7522:0:4365 -7523:2:2137 -7524:2:2141 -7525:2:2142 -7526:2:2150 -7527:2:2151 -7528:2:2155 -7529:2:2156 -7530:2:2150 -7531:2:2151 -7532:2:2155 -7533:2:2156 -7534:2:2164 -7535:2:2169 -7536:2:2173 -7537:2:2174 -7538:2:2181 -7539:2:2182 -7540:2:2193 -7541:2:2194 -7542:2:2195 -7543:2:2193 -7544:2:2194 -7545:2:2195 -7546:2:2206 -7547:2:2211 -7548:2:2212 -7549:0:4365 -7550:2:2224 -7551:0:4365 -7552:3:2427 -7553:0:4365 -7554:2:2226 -7555:0:4365 -7556:3:2428 -7557:0:4365 -7558:2:1936 -7559:0:4365 -7560:2:2129 -7561:0:4365 -7562:2:2130 -7563:0:4365 -7564:2:2134 -7565:0:4365 -7566:3:2427 -7567:0:4365 -7568:2:2136 -7569:0:4365 -7570:3:2428 -7571:0:4365 -7572:2:2137 -7573:2:2141 -7574:2:2142 -7575:2:2150 -7576:2:2151 -7577:2:2155 -7578:2:2156 -7579:2:2150 -7580:2:2151 -7581:2:2152 -7582:2:2164 -7583:2:2169 -7584:2:2173 -7585:2:2174 -7586:2:2181 -7587:2:2182 -7588:2:2193 -7589:2:2194 -7590:2:2195 -7591:2:2193 -7592:2:2194 -7593:2:2195 -7594:2:2206 -7595:2:2211 -7596:2:2212 -7597:0:4365 -7598:2:2224 -7599:0:4365 -7600:3:2427 -7601:0:4365 -7602:2:2226 -7603:0:4365 -7604:3:2428 -7605:0:4365 -7606:2:2230 -7607:0:4365 -7608:3:2427 -7609:0:4365 -7610:2:2235 -7611:2:2239 -7612:2:2240 -7613:2:2248 -7614:2:2249 -7615:2:2253 -7616:2:2254 -7617:2:2248 -7618:2:2249 -7619:2:2250 -7620:2:2262 -7621:2:2267 -7622:2:2271 -7623:2:2272 -7624:2:2279 -7625:2:2280 -7626:2:2291 -7627:2:2292 -7628:2:2293 -7629:2:2291 -7630:2:2292 -7631:2:2293 -7632:2:2304 -7633:2:2309 -7634:2:2310 -7635:0:4365 -7636:3:2428 -7637:0:4365 -7638:2:2322 -7639:0:4365 -7640:2:1169 -7641:0:4365 -7642:3:2427 -7643:0:4365 -7644:2:1170 -7645:0:4365 -7646:3:2428 -7647:0:4365 -7648:3:2429 -7649:0:4365 -7650:3:2435 -7651:3:2436 -7652:0:4365 -7653:3:2440 -7654:3:2444 -7655:3:2445 -7656:3:2453 -7657:3:2454 -7658:3:2458 -7659:3:2459 -7660:3:2453 -7661:3:2454 -7662:3:2458 -7663:3:2459 -7664:3:2467 -7665:3:2472 -7666:3:2473 -7667:3:2484 -7668:3:2485 -7669:3:2496 -7670:3:2497 -7671:3:2498 -7672:3:2496 -7673:3:2497 -7674:3:2498 -7675:3:2509 -7676:3:2514 -7677:3:2515 -7678:0:4365 -7679:3:2527 -7680:0:4365 -7681:3:2528 -7682:0:4365 -7683:2:1173 -7684:0:4365 -7685:3:2529 -7686:0:4365 -7687:2:1179 -7688:0:4365 -7689:2:1180 -7690:0:4365 -7691:3:2528 -7692:0:4365 -7693:2:1181 -7694:2:1185 -7695:2:1186 -7696:2:1194 -7697:2:1195 -7698:2:1199 -7699:2:1200 -7700:2:1194 -7701:2:1195 -7702:2:1199 -7703:2:1200 -7704:2:1208 -7705:2:1213 -7706:2:1217 -7707:2:1218 -7708:2:1225 -7709:2:1226 -7710:2:1237 -7711:2:1238 -7712:2:1239 -7713:2:1237 -7714:2:1238 -7715:2:1239 -7716:2:1250 -7717:2:1255 -7718:2:1256 -7719:0:4365 -7720:3:2529 -7721:0:4365 -7722:2:1268 -7723:0:4365 -7724:3:2528 -7725:0:4365 -7726:2:1270 -7727:0:4365 -7728:3:2529 -7729:0:4365 -7730:2:1271 -7731:2:1275 -7732:2:1276 -7733:2:1284 -7734:2:1285 -7735:2:1289 -7736:2:1290 -7737:2:1284 -7738:2:1285 -7739:2:1289 -7740:2:1290 -7741:2:1298 -7742:2:1303 -7743:2:1307 -7744:2:1308 -7745:2:1315 -7746:2:1316 -7747:2:1327 -7748:2:1328 -7749:2:1329 -7750:2:1327 -7751:2:1328 -7752:2:1329 -7753:2:1340 -7754:2:1345 -7755:2:1346 -7756:0:4365 -7757:2:1358 -7758:0:4365 -7759:2:1360 -7760:0:4365 -7761:3:2528 -7762:0:4365 -7763:2:1361 -7764:0:4365 -7765:3:2529 -7766:0:4365 -7767:2:1362 -7768:2:1366 -7769:2:1367 -7770:2:1375 -7771:2:1376 -7772:2:1380 -7773:2:1381 -7774:2:1375 -7775:2:1376 -7776:2:1380 -7777:2:1381 -7778:2:1389 -7779:2:1394 -7780:2:1398 -7781:2:1399 -7782:2:1406 -7783:2:1407 -7784:2:1418 -7785:2:1419 -7786:2:1420 -7787:2:1418 -7788:2:1419 -7789:2:1420 -7790:2:1431 -7791:2:1436 -7792:2:1437 -7793:0:4365 -7794:2:1449 -7795:0:4365 -7796:3:2528 -7797:0:4365 -7798:2:1451 -7799:0:4365 -7800:3:2529 -7801:0:4365 -7802:2:1652 -7803:0:4365 -7804:2:1653 -7805:0:4365 -7806:2:1657 -7807:0:4365 -7808:2:1180 -7809:0:4365 -7810:3:2528 -7811:0:4365 -7812:2:1181 -7813:2:1185 -7814:2:1186 -7815:2:1194 -7816:2:1195 -7817:2:1199 -7818:2:1200 -7819:2:1194 -7820:2:1195 -7821:2:1196 -7822:2:1208 -7823:2:1213 -7824:2:1217 -7825:2:1218 -7826:2:1225 -7827:2:1226 -7828:2:1237 -7829:2:1238 -7830:2:1239 -7831:2:1237 -7832:2:1238 -7833:2:1239 -7834:2:1250 -7835:2:1255 -7836:2:1256 -7837:0:4365 -7838:3:2529 -7839:0:4365 -7840:2:1268 -7841:0:4365 -7842:3:2528 -7843:0:4365 -7844:2:1270 -7845:0:4365 -7846:3:2529 -7847:0:4365 -7848:2:1271 -7849:2:1275 -7850:2:1276 -7851:2:1284 -7852:2:1285 -7853:2:1289 -7854:2:1290 -7855:2:1284 -7856:2:1285 -7857:2:1289 -7858:2:1290 -7859:2:1298 -7860:2:1303 -7861:2:1307 -7862:2:1308 -7863:2:1315 -7864:2:1316 -7865:2:1327 -7866:2:1328 -7867:2:1329 -7868:2:1327 -7869:2:1328 -7870:2:1329 -7871:2:1340 -7872:2:1345 -7873:2:1346 -7874:0:4365 -7875:2:1358 -7876:0:4365 -7877:2:1454 -7878:0:4365 -7879:3:2528 -7880:0:4365 -7881:2:1455 -7882:0:4365 -7883:3:2529 -7884:0:4365 -7885:2:1652 -7886:0:4365 -7887:2:1653 -7888:0:4365 -7889:2:1657 -7890:0:4365 -7891:2:1660 -7892:0:4365 -7893:3:2528 -7894:0:4365 -7895:2:1665 -7896:2:1669 -7897:2:1670 -7898:2:1678 -7899:2:1679 -7900:2:1683 -7901:2:1684 -7902:2:1678 -7903:2:1679 -7904:2:1680 -7905:2:1692 -7906:2:1697 -7907:2:1701 -7908:2:1702 -7909:2:1709 -7910:2:1710 -7911:2:1721 -7912:2:1722 -7913:2:1723 -7914:2:1721 -7915:2:1722 -7916:2:1723 -7917:2:1734 -7918:2:1739 -7919:2:1740 -7920:0:4365 -7921:3:2529 -7922:0:4365 -7923:2:1752 -7924:0:4365 -7925:3:2528 -7926:0:4365 -7927:2:1754 -7928:0:4365 -7929:3:2529 -7930:0:4365 -7931:2:1755 -7932:2:1759 -7933:2:1760 -7934:2:1768 -7935:2:1769 -7936:2:1773 -7937:2:1774 -7938:2:1768 -7939:2:1769 -7940:2:1773 -7941:2:1774 -7942:2:1782 -7943:2:1787 -7944:2:1791 -7945:2:1792 -7946:2:1799 -7947:2:1800 -7948:2:1811 -7949:2:1812 -7950:2:1813 -7951:2:1811 -7952:2:1812 -7953:2:1813 -7954:2:1824 -7955:2:1829 -7956:2:1830 -7957:0:4365 -7958:2:1842 -7959:0:4365 -7960:3:2528 -7961:0:4365 -7962:2:1844 -7963:0:4365 -7964:3:2529 -7965:0:4365 -7966:2:1845 -7967:2:1849 -7968:2:1850 -7969:2:1858 -7970:2:1859 -7971:2:1863 -7972:2:1864 -7973:2:1858 -7974:2:1859 -7975:2:1863 -7976:2:1864 -7977:2:1872 -7978:2:1877 -7979:2:1881 -7980:2:1882 -7981:2:1889 -7982:2:1890 -7983:2:1901 -7984:2:1902 -7985:2:1903 -7986:2:1901 -7987:2:1902 -7988:2:1903 -7989:2:1914 -7990:2:1919 -7991:2:1920 -7992:0:4365 -7993:2:1932 -7994:0:4365 -7995:3:2528 -7996:0:4365 -7997:2:1934 -7998:0:4365 -7999:3:2529 -8000:0:4365 -8001:2:1935 -8002:0:4365 -8003:2:1936 -8004:0:4365 -8005:2:2129 -8006:0:4365 -8007:2:2130 -8008:0:4365 -8009:2:2134 -8010:0:4365 -8011:3:2528 -8012:0:4365 -8013:2:2136 -8014:0:4365 -8015:3:2529 -8016:0:4365 -8017:2:2137 -8018:2:2141 -8019:2:2142 -8020:2:2150 -8021:2:2151 -8022:2:2155 -8023:2:2156 -8024:2:2150 -8025:2:2151 -8026:2:2155 -8027:2:2156 -8028:2:2164 -8029:2:2169 -8030:2:2173 -8031:2:2174 -8032:2:2181 -8033:2:2182 -8034:2:2193 -8035:2:2194 -8036:2:2195 -8037:2:2193 -8038:2:2194 -8039:2:2195 -8040:2:2206 -8041:2:2211 -8042:2:2212 -8043:0:4365 -8044:2:2224 -8045:0:4365 -8046:3:2528 -8047:0:4365 -8048:2:2226 -8049:0:4365 -8050:3:2529 -8051:0:4365 -8052:2:1936 -8053:0:4365 -8054:2:2129 -8055:0:4365 -8056:2:2130 -8057:0:4365 -8058:2:2134 -8059:0:4365 -8060:3:2528 -8061:0:4365 -8062:2:2136 -8063:0:4365 -8064:3:2529 -8065:0:4365 -8066:2:2137 -8067:2:2141 -8068:2:2142 -8069:2:2150 -8070:2:2151 -8071:2:2155 -8072:2:2156 -8073:2:2150 -8074:2:2151 -8075:2:2152 -8076:2:2164 -8077:2:2169 -8078:2:2173 -8079:2:2174 -8080:2:2181 -8081:2:2182 -8082:2:2193 -8083:2:2194 -8084:2:2195 -8085:2:2193 -8086:2:2194 -8087:2:2195 -8088:2:2206 -8089:2:2211 -8090:2:2212 -8091:0:4365 -8092:2:2224 -8093:0:4365 -8094:3:2528 -8095:0:4365 -8096:2:2226 -8097:0:4365 -8098:3:2529 -8099:0:4365 -8100:2:2230 -8101:0:4365 -8102:3:2528 -8103:0:4365 -8104:2:2235 -8105:2:2239 -8106:2:2240 -8107:2:2248 -8108:2:2249 -8109:2:2253 -8110:2:2254 -8111:2:2248 -8112:2:2249 -8113:2:2250 -8114:2:2262 -8115:2:2267 -8116:2:2271 -8117:2:2272 -8118:2:2279 -8119:2:2280 -8120:2:2291 -8121:2:2292 -8122:2:2293 -8123:2:2291 -8124:2:2292 -8125:2:2293 -8126:2:2304 -8127:2:2309 -8128:2:2310 -8129:0:4365 -8130:3:2529 -8131:0:4365 -8132:2:2322 -8133:0:4365 -8134:2:1169 -8135:0:4365 -8136:3:2528 -8137:0:4365 -8138:2:1170 -8139:0:4365 -8140:3:2529 -8141:0:4365 -8142:3:2530 -8143:0:4365 -8144:3:2536 -8145:0:4365 -8146:3:2537 -8147:0:4365 -8148:3:2547 -8149:0:4365 -8150:3:2548 -8151:0:4365 -8152:3:2552 -8153:3:2553 -8154:3:2557 -8155:3:2561 -8156:3:2562 -8157:3:2557 -8158:3:2561 -8159:3:2562 -8160:3:2566 -8161:3:2574 -8162:3:2575 -8163:3:2580 -8164:3:2587 -8165:3:2588 -8166:3:2587 -8167:3:2588 -8168:3:2595 -8169:3:2600 -8170:0:4365 -8171:3:2611 -8172:0:4365 -8173:3:2615 -8174:3:2616 -8175:3:2620 -8176:3:2624 -8177:3:2625 -8178:3:2620 -8179:3:2624 -8180:3:2625 -8181:3:2629 -8182:3:2637 -8183:3:2638 -8184:3:2643 -8185:3:2650 -8186:3:2651 -8187:3:2650 -8188:3:2651 -8189:3:2658 -8190:3:2663 -8191:0:4365 -8192:3:2611 -8193:0:4365 -8194:3:2615 -8195:3:2616 -8196:3:2620 -8197:3:2624 -8198:3:2625 -8199:3:2620 -8200:3:2624 -8201:3:2625 -8202:3:2629 -8203:3:2637 -8204:3:2638 -8205:3:2643 -8206:3:2650 -8207:3:2651 -8208:3:2650 -8209:3:2651 -8210:3:2658 -8211:3:2663 -8212:0:4365 -8213:3:2674 -8214:0:4365 -8215:3:2682 -8216:3:2683 -8217:3:2687 -8218:3:2691 -8219:3:2692 -8220:3:2687 -8221:3:2691 -8222:3:2692 -8223:3:2696 -8224:3:2704 -8225:3:2705 -8226:3:2710 -8227:3:2717 -8228:3:2718 -8229:3:2717 -8230:3:2718 -8231:3:2725 -8232:3:2730 -8233:0:4365 -8234:3:2745 -8235:0:4365 -8236:3:2746 -8237:0:4365 -8238:2:1173 -8239:0:4365 -8240:3:2747 -8241:0:4365 -8242:2:1179 -8243:0:4365 -8244:2:1180 -8245:0:4365 -8246:3:2746 -8247:0:4365 -8248:2:1181 -8249:2:1185 -8250:2:1186 -8251:2:1194 -8252:2:1195 -8253:2:1199 -8254:2:1200 -8255:2:1194 -8256:2:1195 -8257:2:1199 -8258:2:1200 -8259:2:1208 -8260:2:1213 -8261:2:1217 -8262:2:1218 -8263:2:1225 -8264:2:1226 -8265:2:1237 -8266:2:1238 -8267:2:1239 -8268:2:1237 -8269:2:1238 -8270:2:1239 -8271:2:1250 -8272:2:1255 -8273:2:1256 -8274:0:4365 -8275:3:2747 -8276:0:4365 -8277:2:1268 -8278:0:4365 -8279:3:2746 -8280:0:4365 -8281:2:1270 -8282:0:4365 -8283:3:2747 -8284:0:4365 -8285:2:1271 -8286:2:1275 -8287:2:1276 -8288:2:1284 -8289:2:1285 -8290:2:1289 -8291:2:1290 -8292:2:1284 -8293:2:1285 -8294:2:1289 -8295:2:1290 -8296:2:1298 -8297:2:1303 -8298:2:1307 -8299:2:1308 -8300:2:1315 -8301:2:1316 -8302:2:1327 -8303:2:1328 -8304:2:1329 -8305:2:1327 -8306:2:1328 -8307:2:1329 -8308:2:1340 -8309:2:1345 -8310:2:1346 -8311:0:4365 -8312:2:1358 -8313:0:4365 -8314:2:1360 -8315:0:4365 -8316:3:2746 -8317:0:4365 -8318:2:1361 -8319:0:4365 -8320:3:2747 -8321:0:4365 -8322:2:1362 -8323:2:1366 -8324:2:1367 -8325:2:1375 -8326:2:1376 -8327:2:1380 -8328:2:1381 -8329:2:1375 -8330:2:1376 -8331:2:1380 -8332:2:1381 -8333:2:1389 -8334:2:1394 -8335:2:1398 -8336:2:1399 -8337:2:1406 -8338:2:1407 -8339:2:1418 -8340:2:1419 -8341:2:1420 -8342:2:1418 -8343:2:1419 -8344:2:1420 -8345:2:1431 -8346:2:1436 -8347:2:1437 -8348:0:4365 -8349:2:1449 -8350:0:4365 -8351:3:2746 -8352:0:4365 -8353:2:1451 -8354:0:4365 -8355:3:2747 -8356:0:4365 -8357:2:1652 -8358:0:4365 -8359:2:1653 -8360:0:4365 -8361:2:1657 -8362:0:4365 -8363:2:1180 -8364:0:4365 -8365:3:2746 -8366:0:4365 -8367:2:1181 -8368:2:1185 -8369:2:1186 -8370:2:1194 -8371:2:1195 -8372:2:1199 -8373:2:1200 -8374:2:1194 -8375:2:1195 -8376:2:1196 -8377:2:1208 -8378:2:1213 -8379:2:1217 -8380:2:1218 -8381:2:1225 -8382:2:1226 -8383:2:1237 -8384:2:1238 -8385:2:1239 -8386:2:1237 -8387:2:1238 -8388:2:1239 -8389:2:1250 -8390:2:1255 -8391:2:1256 -8392:0:4365 -8393:3:2747 -8394:0:4365 -8395:2:1268 -8396:0:4365 -8397:3:2746 -8398:0:4365 -8399:2:1270 -8400:0:4365 -8401:3:2747 -8402:0:4365 -8403:2:1271 -8404:2:1275 -8405:2:1276 -8406:2:1284 -8407:2:1285 -8408:2:1289 -8409:2:1290 -8410:2:1284 -8411:2:1285 -8412:2:1289 -8413:2:1290 -8414:2:1298 -8415:2:1303 -8416:2:1307 -8417:2:1308 -8418:2:1315 -8419:2:1316 -8420:2:1327 -8421:2:1328 -8422:2:1329 -8423:2:1327 -8424:2:1328 -8425:2:1329 -8426:2:1340 -8427:2:1345 -8428:2:1346 -8429:0:4365 -8430:2:1358 -8431:0:4365 -8432:2:1454 -8433:0:4365 -8434:3:2746 -8435:0:4365 -8436:2:1455 -8437:0:4365 -8438:3:2747 -8439:0:4365 -8440:2:1652 -8441:0:4365 -8442:2:1653 -8443:0:4365 -8444:2:1657 -8445:0:4365 -8446:2:1660 -8447:0:4365 -8448:3:2746 -8449:0:4365 -8450:2:1665 -8451:2:1669 -8452:2:1670 -8453:2:1678 -8454:2:1679 -8455:2:1683 -8456:2:1684 -8457:2:1678 -8458:2:1679 -8459:2:1680 -8460:2:1692 -8461:2:1697 -8462:2:1701 -8463:2:1702 -8464:2:1709 -8465:2:1710 -8466:2:1721 -8467:2:1722 -8468:2:1723 -8469:2:1721 -8470:2:1722 -8471:2:1723 -8472:2:1734 -8473:2:1739 -8474:2:1740 -8475:0:4365 -8476:3:2747 -8477:0:4365 -8478:2:1752 -8479:0:4365 -8480:3:2746 -8481:0:4365 -8482:2:1754 -8483:0:4365 -8484:3:2747 -8485:0:4365 -8486:2:1755 -8487:2:1759 -8488:2:1760 -8489:2:1768 -8490:2:1769 -8491:2:1773 -8492:2:1774 -8493:2:1768 -8494:2:1769 -8495:2:1773 -8496:2:1774 -8497:2:1782 -8498:2:1787 -8499:2:1791 -8500:2:1792 -8501:2:1799 -8502:2:1800 -8503:2:1811 -8504:2:1812 -8505:2:1813 -8506:2:1811 -8507:2:1812 -8508:2:1813 -8509:2:1824 -8510:2:1829 -8511:2:1830 -8512:0:4365 -8513:2:1842 -8514:0:4365 -8515:3:2746 -8516:0:4365 -8517:2:1844 -8518:0:4365 -8519:3:2747 -8520:0:4365 -8521:2:1845 -8522:2:1849 -8523:2:1850 -8524:2:1858 -8525:2:1859 -8526:2:1863 -8527:2:1864 -8528:2:1858 -8529:2:1859 -8530:2:1863 -8531:2:1864 -8532:2:1872 -8533:2:1877 -8534:2:1881 -8535:2:1882 -8536:2:1889 -8537:2:1890 -8538:2:1901 -8539:2:1902 -8540:2:1903 -8541:2:1901 -8542:2:1902 -8543:2:1903 -8544:2:1914 -8545:2:1919 -8546:2:1920 -8547:0:4365 -8548:2:1932 -8549:0:4365 -8550:3:2746 -8551:0:4365 -8552:2:1934 -8553:0:4365 -8554:3:2747 -8555:0:4365 -8556:2:1935 -8557:0:4365 -8558:2:1936 -8559:0:4365 -8560:2:2129 -8561:0:4365 -8562:2:2130 -8563:0:4365 -8564:2:2134 -8565:0:4365 -8566:3:2746 -8567:0:4365 -8568:2:2136 -8569:0:4365 -8570:3:2747 -8571:0:4365 -8572:2:2137 -8573:2:2141 -8574:2:2142 -8575:2:2150 -8576:2:2151 -8577:2:2155 -8578:2:2156 -8579:2:2150 -8580:2:2151 -8581:2:2155 -8582:2:2156 -8583:2:2164 -8584:2:2169 -8585:2:2173 -8586:2:2174 -8587:2:2181 -8588:2:2182 -8589:2:2193 -8590:2:2194 -8591:2:2195 -8592:2:2193 -8593:2:2194 -8594:2:2195 -8595:2:2206 -8596:2:2211 -8597:2:2212 -8598:0:4365 -8599:2:2224 -8600:0:4365 -8601:3:2746 -8602:0:4365 -8603:2:2226 -8604:0:4365 -8605:3:2747 -8606:0:4365 -8607:2:1936 -8608:0:4365 -8609:2:2129 -8610:0:4365 -8611:2:2130 -8612:0:4365 -8613:2:2134 -8614:0:4365 -8615:3:2746 -8616:0:4365 -8617:2:2136 -8618:0:4365 -8619:3:2747 -8620:0:4365 -8621:2:2137 -8622:2:2141 -8623:2:2142 -8624:2:2150 -8625:2:2151 -8626:2:2155 -8627:2:2156 -8628:2:2150 -8629:2:2151 -8630:2:2152 -8631:2:2164 -8632:2:2169 -8633:2:2173 -8634:2:2174 -8635:2:2181 -8636:2:2182 -8637:2:2193 -8638:2:2194 -8639:2:2195 -8640:2:2193 -8641:2:2194 -8642:2:2195 -8643:2:2206 -8644:2:2211 -8645:2:2212 -8646:0:4365 -8647:2:2224 -8648:0:4365 -8649:3:2746 -8650:0:4365 -8651:2:2226 -8652:0:4365 -8653:3:2747 -8654:0:4365 -8655:2:2230 -8656:0:4365 -8657:3:2746 -8658:0:4365 -8659:2:2235 -8660:2:2239 -8661:2:2240 -8662:2:2248 -8663:2:2249 -8664:2:2253 -8665:2:2254 -8666:2:2248 -8667:2:2249 -8668:2:2250 -8669:2:2262 -8670:2:2267 -8671:2:2271 -8672:2:2272 -8673:2:2279 -8674:2:2280 -8675:2:2291 -8676:2:2292 -8677:2:2293 -8678:2:2291 -8679:2:2292 -8680:2:2293 -8681:2:2304 -8682:2:2309 -8683:2:2310 -8684:0:4365 -8685:3:2747 -8686:0:4365 -8687:2:2322 -8688:0:4365 -8689:2:1169 -8690:0:4365 -8691:3:2746 -8692:0:4365 -8693:2:1170 -8694:0:4365 -8695:3:2747 -8696:0:4365 -8697:3:2748 -8698:0:4365 -8699:3:2754 -8700:0:4365 -8701:3:2755 -8702:3:2759 -8703:3:2760 -8704:3:2768 -8705:3:2769 -8706:3:2773 -8707:3:2774 -8708:3:2768 -8709:3:2769 -8710:3:2773 -8711:3:2774 -8712:3:2782 -8713:3:2787 -8714:3:2791 -8715:3:2792 -8716:3:2799 -8717:3:2800 -8718:3:2811 -8719:3:2812 -8720:3:2813 -8721:3:2811 -8722:3:2812 -8723:3:2813 -8724:3:2824 -8725:3:2829 -8726:3:2830 -8727:0:4365 -8728:3:2842 -8729:0:4365 -8730:3:2843 -8731:0:4365 -8732:2:1173 -8733:0:4365 -8734:3:2844 -8735:0:4365 -8736:2:1179 -8737:0:4365 -8738:2:1180 -8739:0:4365 -8740:3:2843 -8741:0:4365 -8742:2:1181 -8743:2:1185 -8744:2:1186 -8745:2:1194 -8746:2:1195 -8747:2:1199 -8748:2:1200 -8749:2:1194 -8750:2:1195 -8751:2:1199 -8752:2:1200 -8753:2:1208 -8754:2:1213 -8755:2:1217 -8756:2:1218 -8757:2:1225 -8758:2:1226 -8759:2:1237 -8760:2:1238 -8761:2:1239 -8762:2:1237 -8763:2:1238 -8764:2:1239 -8765:2:1250 -8766:2:1255 -8767:2:1256 -8768:0:4365 -8769:3:2844 -8770:0:4365 -8771:2:1268 -8772:0:4365 -8773:3:2843 -8774:0:4365 -8775:2:1270 -8776:0:4365 -8777:3:2844 -8778:0:4365 -8779:2:1271 -8780:2:1275 -8781:2:1276 -8782:2:1284 -8783:2:1285 -8784:2:1289 -8785:2:1290 -8786:2:1284 -8787:2:1285 -8788:2:1289 -8789:2:1290 -8790:2:1298 -8791:2:1303 -8792:2:1307 -8793:2:1308 -8794:2:1315 -8795:2:1316 -8796:2:1327 -8797:2:1328 -8798:2:1329 -8799:2:1327 -8800:2:1328 -8801:2:1329 -8802:2:1340 -8803:2:1345 -8804:2:1346 -8805:0:4365 -8806:2:1358 -8807:0:4365 -8808:2:1360 -8809:0:4365 -8810:3:2843 -8811:0:4365 -8812:2:1361 -8813:0:4365 -8814:3:2844 -8815:0:4365 -8816:2:1362 -8817:2:1366 -8818:2:1367 -8819:2:1375 -8820:2:1376 -8821:2:1380 -8822:2:1381 -8823:2:1375 -8824:2:1376 -8825:2:1380 -8826:2:1381 -8827:2:1389 -8828:2:1394 -8829:2:1398 -8830:2:1399 -8831:2:1406 -8832:2:1407 -8833:2:1418 -8834:2:1419 -8835:2:1420 -8836:2:1418 -8837:2:1419 -8838:2:1420 -8839:2:1431 -8840:2:1436 -8841:2:1437 -8842:0:4365 -8843:2:1449 -8844:0:4365 -8845:3:2843 -8846:0:4365 -8847:2:1451 -8848:0:4365 -8849:3:2844 -8850:0:4365 -8851:2:1652 -8852:0:4365 -8853:2:1653 -8854:0:4365 -8855:2:1657 -8856:0:4365 -8857:2:1180 -8858:0:4365 -8859:3:2843 -8860:0:4365 -8861:2:1181 -8862:2:1185 -8863:2:1186 -8864:2:1194 -8865:2:1195 -8866:2:1199 -8867:2:1200 -8868:2:1194 -8869:2:1195 -8870:2:1196 -8871:2:1208 -8872:2:1213 -8873:2:1217 -8874:2:1218 -8875:2:1225 -8876:2:1226 -8877:2:1237 -8878:2:1238 -8879:2:1239 -8880:2:1237 -8881:2:1238 -8882:2:1239 -8883:2:1250 -8884:2:1255 -8885:2:1256 -8886:0:4365 -8887:3:2844 -8888:0:4365 -8889:2:1268 -8890:0:4365 -8891:3:2843 -8892:0:4365 -8893:2:1270 -8894:0:4365 -8895:3:2844 -8896:0:4365 -8897:2:1271 -8898:2:1275 -8899:2:1276 -8900:2:1284 -8901:2:1285 -8902:2:1289 -8903:2:1290 -8904:2:1284 -8905:2:1285 -8906:2:1289 -8907:2:1290 -8908:2:1298 -8909:2:1303 -8910:2:1307 -8911:2:1308 -8912:2:1315 -8913:2:1316 -8914:2:1327 -8915:2:1328 -8916:2:1329 -8917:2:1327 -8918:2:1328 -8919:2:1329 -8920:2:1340 -8921:2:1345 -8922:2:1346 -8923:0:4365 -8924:2:1358 -8925:0:4365 -8926:2:1454 -8927:0:4365 -8928:3:2843 -8929:0:4365 -8930:2:1455 -8931:0:4365 -8932:3:2844 -8933:0:4365 -8934:2:1652 -8935:0:4365 -8936:2:1653 -8937:0:4365 -8938:2:1657 -8939:0:4365 -8940:2:1660 -8941:0:4365 -8942:3:2843 -8943:0:4365 -8944:2:1665 -8945:2:1669 -8946:2:1670 -8947:2:1678 -8948:2:1679 -8949:2:1683 -8950:2:1684 -8951:2:1678 -8952:2:1679 -8953:2:1680 -8954:2:1692 -8955:2:1697 -8956:2:1701 -8957:2:1702 -8958:2:1709 -8959:2:1710 -8960:2:1721 -8961:2:1722 -8962:2:1723 -8963:2:1721 -8964:2:1722 -8965:2:1723 -8966:2:1734 -8967:2:1739 -8968:2:1740 -8969:0:4365 -8970:3:2844 -8971:0:4365 -8972:2:1752 -8973:0:4365 -8974:3:2843 -8975:0:4365 -8976:2:1754 -8977:0:4365 -8978:3:2844 -8979:0:4365 -8980:2:1755 -8981:2:1759 -8982:2:1760 -8983:2:1768 -8984:2:1769 -8985:2:1773 -8986:2:1774 -8987:2:1768 -8988:2:1769 -8989:2:1773 -8990:2:1774 -8991:2:1782 -8992:2:1787 -8993:2:1791 -8994:2:1792 -8995:2:1799 -8996:2:1800 -8997:2:1811 -8998:2:1812 -8999:2:1813 -9000:2:1811 -9001:2:1812 -9002:2:1813 -9003:2:1824 -9004:2:1829 -9005:2:1830 -9006:0:4365 -9007:2:1842 -9008:0:4365 -9009:3:2843 -9010:0:4365 -9011:2:1844 -9012:0:4365 -9013:3:2844 -9014:0:4365 -9015:2:1845 -9016:2:1849 -9017:2:1850 -9018:2:1858 -9019:2:1859 -9020:2:1863 -9021:2:1864 -9022:2:1858 -9023:2:1859 -9024:2:1863 -9025:2:1864 -9026:2:1872 -9027:2:1877 -9028:2:1881 -9029:2:1882 -9030:2:1889 -9031:2:1890 -9032:2:1901 -9033:2:1902 -9034:2:1903 -9035:2:1901 -9036:2:1902 -9037:2:1903 -9038:2:1914 -9039:2:1919 -9040:2:1920 -9041:0:4365 -9042:2:1932 -9043:0:4365 -9044:3:2843 -9045:0:4365 -9046:2:1934 -9047:0:4365 -9048:3:2844 -9049:0:4365 -9050:2:1935 -9051:0:4365 -9052:2:1936 -9053:0:4365 -9054:2:2129 -9055:0:4365 -9056:2:2130 -9057:0:4365 -9058:2:2134 -9059:0:4365 -9060:3:2843 -9061:0:4365 -9062:2:2136 -9063:0:4365 -9064:3:2844 -9065:0:4365 -9066:2:2137 -9067:2:2141 -9068:2:2142 -9069:2:2150 -9070:2:2151 -9071:2:2155 -9072:2:2156 -9073:2:2150 -9074:2:2151 -9075:2:2155 -9076:2:2156 -9077:2:2164 -9078:2:2169 -9079:2:2173 -9080:2:2174 -9081:2:2181 -9082:2:2182 -9083:2:2193 -9084:2:2194 -9085:2:2195 -9086:2:2193 -9087:2:2194 -9088:2:2195 -9089:2:2206 -9090:2:2211 -9091:2:2212 -9092:0:4365 -9093:2:2224 -9094:0:4365 -9095:3:2843 -9096:0:4365 -9097:2:2226 -9098:0:4365 -9099:3:2844 -9100:0:4365 -9101:2:1936 -9102:0:4365 -9103:2:2129 -9104:0:4365 -9105:2:2130 -9106:0:4365 -9107:2:2134 -9108:0:4365 -9109:3:2843 -9110:0:4365 -9111:2:2136 -9112:0:4365 -9113:3:2844 -9114:0:4365 -9115:2:2137 -9116:2:2141 -9117:2:2142 -9118:2:2150 -9119:2:2151 -9120:2:2155 -9121:2:2156 -9122:2:2150 -9123:2:2151 -9124:2:2152 -9125:2:2164 -9126:2:2169 -9127:2:2173 -9128:2:2174 -9129:2:2181 -9130:2:2182 -9131:2:2193 -9132:2:2194 -9133:2:2195 -9134:2:2193 -9135:2:2194 -9136:2:2195 -9137:2:2206 -9138:2:2211 -9139:2:2212 -9140:0:4365 -9141:2:2224 -9142:0:4365 -9143:3:2843 -9144:0:4365 -9145:2:2226 -9146:0:4365 -9147:3:2844 -9148:0:4365 -9149:2:2230 -9150:0:4365 -9151:3:2843 -9152:0:4365 -9153:2:2235 -9154:2:2239 -9155:2:2240 -9156:2:2248 -9157:2:2249 -9158:2:2253 -9159:2:2254 -9160:2:2248 -9161:2:2249 -9162:2:2250 -9163:2:2262 -9164:2:2267 -9165:2:2271 -9166:2:2272 -9167:2:2279 -9168:2:2280 -9169:2:2291 -9170:2:2292 -9171:2:2293 -9172:2:2291 -9173:2:2292 -9174:2:2293 -9175:2:2304 -9176:2:2309 -9177:2:2310 -9178:0:4365 -9179:3:2844 -9180:0:4365 -9181:2:2322 -9182:0:4365 -9183:2:1169 -9184:0:4365 -9185:3:2843 -9186:0:4365 -9187:2:1170 -9188:0:4365 -9189:3:2844 -9190:0:4365 -9191:3:2845 -9192:0:4365 -9193:3:2851 -9194:0:4365 -9195:3:2854 -9196:3:2855 -9197:3:2867 -9198:3:2868 -9199:3:2872 -9200:3:2873 -9201:3:2867 -9202:3:2868 -9203:3:2872 -9204:3:2873 -9205:3:2881 -9206:3:2886 -9207:3:2890 -9208:3:2891 -9209:3:2898 -9210:3:2899 -9211:3:2910 -9212:3:2911 -9213:3:2912 -9214:3:2910 -9215:3:2911 -9216:3:2912 -9217:3:2923 -9218:3:2928 -9219:3:2929 -9220:0:4365 -9221:3:2941 -9222:0:4365 -9223:3:2942 -9224:0:4365 -9225:2:1173 -9226:0:4365 -9227:3:2943 -9228:0:4365 -9229:2:1179 -9230:0:4365 -9231:2:1180 -9232:0:4365 -9233:3:2942 -9234:0:4365 -9235:2:1181 -9236:2:1185 -9237:2:1186 -9238:2:1194 -9239:2:1195 -9240:2:1199 -9241:2:1200 -9242:2:1194 -9243:2:1195 -9244:2:1199 -9245:2:1200 -9246:2:1208 -9247:2:1213 -9248:2:1217 -9249:2:1218 -9250:2:1225 -9251:2:1226 -9252:2:1237 -9253:2:1238 -9254:2:1239 -9255:2:1237 -9256:2:1238 -9257:2:1239 -9258:2:1250 -9259:2:1255 -9260:2:1256 -9261:0:4365 -9262:3:2943 -9263:0:4365 -9264:2:1268 -9265:0:4365 -9266:3:2942 -9267:0:4365 -9268:2:1270 -9269:0:4365 -9270:3:2943 -9271:0:4365 -9272:2:1271 -9273:2:1275 -9274:2:1276 -9275:2:1284 -9276:2:1285 -9277:2:1289 -9278:2:1290 -9279:2:1284 -9280:2:1285 -9281:2:1289 -9282:2:1290 -9283:2:1298 -9284:2:1303 -9285:2:1307 -9286:2:1308 -9287:2:1315 -9288:2:1316 -9289:2:1327 -9290:2:1328 -9291:2:1329 -9292:2:1327 -9293:2:1328 -9294:2:1329 -9295:2:1340 -9296:2:1345 -9297:2:1346 -9298:0:4365 -9299:2:1358 -9300:0:4365 -9301:2:1360 -9302:0:4365 -9303:3:2942 -9304:0:4365 -9305:2:1361 -9306:0:4365 -9307:3:2943 -9308:0:4365 -9309:2:1362 -9310:2:1366 -9311:2:1367 -9312:2:1375 -9313:2:1376 -9314:2:1380 -9315:2:1381 -9316:2:1375 -9317:2:1376 -9318:2:1380 -9319:2:1381 -9320:2:1389 -9321:2:1394 -9322:2:1398 -9323:2:1399 -9324:2:1406 -9325:2:1407 -9326:2:1418 -9327:2:1419 -9328:2:1420 -9329:2:1418 -9330:2:1419 -9331:2:1420 -9332:2:1431 -9333:2:1436 -9334:2:1437 -9335:0:4365 -9336:2:1449 -9337:0:4365 -9338:3:2942 -9339:0:4365 -9340:2:1451 -9341:0:4365 -9342:3:2943 -9343:0:4365 -9344:2:1652 -9345:0:4365 -9346:2:1653 -9347:0:4365 -9348:2:1657 -9349:0:4365 -9350:2:1180 -9351:0:4365 -9352:3:2942 -9353:0:4365 -9354:2:1181 -9355:2:1185 -9356:2:1186 -9357:2:1194 -9358:2:1195 -9359:2:1199 -9360:2:1200 -9361:2:1194 -9362:2:1195 -9363:2:1196 -9364:2:1208 -9365:2:1213 -9366:2:1217 -9367:2:1218 -9368:2:1225 -9369:2:1226 -9370:2:1237 -9371:2:1238 -9372:2:1239 -9373:2:1237 -9374:2:1238 -9375:2:1239 -9376:2:1250 -9377:2:1255 -9378:2:1256 -9379:0:4365 -9380:3:2943 -9381:0:4365 -9382:2:1268 -9383:0:4365 -9384:3:2942 -9385:0:4365 -9386:2:1270 -9387:0:4365 -9388:3:2943 -9389:0:4365 -9390:2:1271 -9391:2:1275 -9392:2:1276 -9393:2:1284 -9394:2:1285 -9395:2:1289 -9396:2:1290 -9397:2:1284 -9398:2:1285 -9399:2:1289 -9400:2:1290 -9401:2:1298 -9402:2:1303 -9403:2:1307 -9404:2:1308 -9405:2:1315 -9406:2:1316 -9407:2:1327 -9408:2:1328 -9409:2:1329 -9410:2:1327 -9411:2:1328 -9412:2:1329 -9413:2:1340 -9414:2:1345 -9415:2:1346 -9416:0:4365 -9417:2:1358 -9418:0:4365 -9419:2:1454 -9420:0:4365 -9421:3:2942 -9422:0:4365 -9423:2:1455 -9424:0:4365 -9425:3:2943 -9426:0:4365 -9427:2:1652 -9428:0:4365 -9429:2:1653 -9430:0:4365 -9431:2:1657 -9432:0:4365 -9433:2:1660 -9434:0:4365 -9435:3:2942 -9436:0:4365 -9437:2:1665 -9438:2:1669 -9439:2:1670 -9440:2:1678 -9441:2:1679 -9442:2:1683 -9443:2:1684 -9444:2:1678 -9445:2:1679 -9446:2:1680 -9447:2:1692 -9448:2:1697 -9449:2:1701 -9450:2:1702 -9451:2:1709 -9452:2:1710 -9453:2:1721 -9454:2:1722 -9455:2:1723 -9456:2:1721 -9457:2:1722 -9458:2:1723 -9459:2:1734 -9460:2:1739 -9461:2:1740 -9462:0:4365 -9463:3:2943 -9464:0:4365 -9465:2:1752 -9466:0:4365 -9467:3:2942 -9468:0:4365 -9469:2:1754 -9470:0:4365 -9471:3:2943 -9472:0:4365 -9473:2:1755 -9474:2:1759 -9475:2:1760 -9476:2:1768 -9477:2:1769 -9478:2:1773 -9479:2:1774 -9480:2:1768 -9481:2:1769 -9482:2:1773 -9483:2:1774 -9484:2:1782 -9485:2:1787 -9486:2:1791 -9487:2:1792 -9488:2:1799 -9489:2:1800 -9490:2:1811 -9491:2:1812 -9492:2:1813 -9493:2:1811 -9494:2:1812 -9495:2:1813 -9496:2:1824 -9497:2:1829 -9498:2:1830 -9499:0:4365 -9500:2:1842 -9501:0:4365 -9502:3:2942 -9503:0:4365 -9504:2:1844 -9505:0:4365 -9506:3:2943 -9507:0:4365 -9508:2:1845 -9509:2:1849 -9510:2:1850 -9511:2:1858 -9512:2:1859 -9513:2:1863 -9514:2:1864 -9515:2:1858 -9516:2:1859 -9517:2:1863 -9518:2:1864 -9519:2:1872 -9520:2:1877 -9521:2:1881 -9522:2:1882 -9523:2:1889 -9524:2:1890 -9525:2:1901 -9526:2:1902 -9527:2:1903 -9528:2:1901 -9529:2:1902 -9530:2:1903 -9531:2:1914 -9532:2:1919 -9533:2:1920 -9534:0:4365 -9535:2:1932 -9536:0:4365 -9537:3:2942 -9538:0:4365 -9539:2:1934 -9540:0:4365 -9541:3:2943 -9542:0:4365 -9543:2:1935 -9544:0:4365 -9545:2:1936 -9546:0:4365 -9547:2:2129 -9548:0:4365 -9549:2:2130 -9550:0:4365 -9551:2:2134 -9552:0:4365 -9553:3:2942 -9554:0:4365 -9555:2:2136 -9556:0:4365 -9557:3:2943 -9558:0:4365 -9559:2:2137 -9560:2:2141 -9561:2:2142 -9562:2:2150 -9563:2:2151 -9564:2:2155 -9565:2:2156 -9566:2:2150 -9567:2:2151 -9568:2:2155 -9569:2:2156 -9570:2:2164 -9571:2:2169 -9572:2:2173 -9573:2:2174 -9574:2:2181 -9575:2:2182 -9576:2:2193 -9577:2:2194 -9578:2:2195 -9579:2:2193 -9580:2:2194 -9581:2:2195 -9582:2:2206 -9583:2:2211 -9584:2:2212 -9585:0:4365 -9586:2:2224 -9587:0:4365 -9588:3:2942 -9589:0:4365 -9590:2:2226 -9591:0:4365 -9592:3:2943 -9593:0:4365 -9594:2:1936 -9595:0:4365 -9596:2:2129 -9597:0:4365 -9598:2:2130 -9599:0:4365 -9600:2:2134 -9601:0:4365 -9602:3:2942 -9603:0:4365 -9604:2:2136 -9605:0:4365 -9606:3:2943 -9607:0:4365 -9608:2:2137 -9609:2:2141 -9610:2:2142 -9611:2:2150 -9612:2:2151 -9613:2:2155 -9614:2:2156 -9615:2:2150 -9616:2:2151 -9617:2:2152 -9618:2:2164 -9619:2:2169 -9620:2:2173 -9621:2:2174 -9622:2:2181 -9623:2:2182 -9624:2:2193 -9625:2:2194 -9626:2:2195 -9627:2:2193 -9628:2:2194 -9629:2:2195 -9630:2:2206 -9631:2:2211 -9632:2:2212 -9633:0:4365 -9634:2:2224 -9635:0:4365 -9636:3:2942 -9637:0:4365 -9638:2:2226 -9639:0:4365 -9640:3:2943 -9641:0:4365 -9642:2:2230 -9643:0:4365 -9644:3:2942 -9645:0:4365 -9646:2:2235 -9647:2:2239 -9648:2:2240 -9649:2:2248 -9650:2:2249 -9651:2:2253 -9652:2:2254 -9653:2:2248 -9654:2:2249 -9655:2:2250 -9656:2:2262 -9657:2:2267 -9658:2:2271 -9659:2:2272 -9660:2:2279 -9661:2:2280 -9662:2:2291 -9663:2:2292 -9664:2:2293 -9665:2:2291 -9666:2:2292 -9667:2:2293 -9668:2:2304 -9669:2:2309 -9670:2:2310 -9671:0:4365 -9672:3:2943 -9673:0:4365 -9674:2:2322 -9675:0:4365 -9676:2:1169 -9677:0:4365 -9678:3:2942 -9679:0:4365 -9680:2:1170 -9681:0:4365 -9682:3:2943 -9683:0:4365 -9684:3:2944 -9685:0:4365 -9686:3:2950 -9687:0:4365 -9688:3:2951 -9689:0:4365 -9690:3:2952 -9691:0:4365 -9692:3:2953 -9693:0:4365 -9694:3:2954 -9695:3:2958 -9696:3:2959 -9697:3:2967 -9698:3:2968 -9699:3:2972 -9700:3:2973 -9701:3:2967 -9702:3:2968 -9703:3:2972 -9704:3:2973 -9705:3:2981 -9706:3:2986 -9707:3:2990 -9708:3:2991 -9709:3:2998 -9710:3:2999 -9711:3:3010 -9712:3:3011 -9713:3:3012 -9714:3:3010 -9715:3:3011 -9716:3:3012 -9717:3:3023 -9718:3:3028 -9719:3:3029 -9720:0:4365 -9721:3:3041 -9722:0:4365 -9723:3:3042 -9724:0:4365 -9725:2:1173 -9726:0:4365 -9727:3:3043 -9728:0:4365 -9729:2:1179 -9730:0:4365 -9731:2:1180 -9732:0:4365 -9733:3:3042 -9734:0:4365 -9735:2:1181 -9736:2:1185 -9737:2:1186 -9738:2:1194 -9739:2:1195 -9740:2:1199 -9741:2:1200 -9742:2:1194 -9743:2:1195 -9744:2:1199 -9745:2:1200 -9746:2:1208 -9747:2:1213 -9748:2:1217 -9749:2:1218 -9750:2:1225 -9751:2:1226 -9752:2:1237 -9753:2:1238 -9754:2:1239 -9755:2:1237 -9756:2:1238 -9757:2:1239 -9758:2:1250 -9759:2:1255 -9760:2:1256 -9761:0:4365 -9762:3:3043 -9763:0:4365 -9764:2:1268 -9765:0:4365 -9766:3:3042 -9767:0:4365 -9768:2:1270 -9769:0:4365 -9770:3:3043 -9771:0:4365 -9772:2:1271 -9773:2:1275 -9774:2:1276 -9775:2:1284 -9776:2:1285 -9777:2:1289 -9778:2:1290 -9779:2:1284 -9780:2:1285 -9781:2:1289 -9782:2:1290 -9783:2:1298 -9784:2:1303 -9785:2:1307 -9786:2:1308 -9787:2:1315 -9788:2:1316 -9789:2:1327 -9790:2:1328 -9791:2:1329 -9792:2:1327 -9793:2:1328 -9794:2:1329 -9795:2:1340 -9796:2:1345 -9797:2:1346 -9798:0:4365 -9799:2:1358 -9800:0:4365 -9801:2:1360 -9802:0:4365 -9803:3:3042 -9804:0:4365 -9805:2:1361 -9806:0:4365 -9807:3:3043 -9808:0:4365 -9809:2:1362 -9810:2:1366 -9811:2:1367 -9812:2:1375 -9813:2:1376 -9814:2:1380 -9815:2:1381 -9816:2:1375 -9817:2:1376 -9818:2:1380 -9819:2:1381 -9820:2:1389 -9821:2:1394 -9822:2:1398 -9823:2:1399 -9824:2:1406 -9825:2:1407 -9826:2:1418 -9827:2:1419 -9828:2:1420 -9829:2:1418 -9830:2:1419 -9831:2:1420 -9832:2:1431 -9833:2:1436 -9834:2:1437 -9835:0:4365 -9836:2:1449 -9837:0:4365 -9838:3:3042 -9839:0:4365 -9840:2:1451 -9841:0:4365 -9842:3:3043 -9843:0:4365 -9844:2:1652 -9845:0:4365 -9846:2:1653 -9847:0:4365 -9848:2:1657 -9849:0:4365 -9850:2:1180 -9851:0:4365 -9852:3:3042 -9853:0:4365 -9854:2:1181 -9855:2:1185 -9856:2:1186 -9857:2:1194 -9858:2:1195 -9859:2:1199 -9860:2:1200 -9861:2:1194 -9862:2:1195 -9863:2:1196 -9864:2:1208 -9865:2:1213 -9866:2:1217 -9867:2:1218 -9868:2:1225 -9869:2:1226 -9870:2:1237 -9871:2:1238 -9872:2:1239 -9873:2:1237 -9874:2:1238 -9875:2:1239 -9876:2:1250 -9877:2:1255 -9878:2:1256 -9879:0:4365 -9880:3:3043 -9881:0:4365 -9882:2:1268 -9883:0:4365 -9884:3:3042 -9885:0:4365 -9886:2:1270 -9887:0:4365 -9888:3:3043 -9889:0:4365 -9890:2:1271 -9891:2:1275 -9892:2:1276 -9893:2:1284 -9894:2:1285 -9895:2:1289 -9896:2:1290 -9897:2:1284 -9898:2:1285 -9899:2:1289 -9900:2:1290 -9901:2:1298 -9902:2:1303 -9903:2:1307 -9904:2:1308 -9905:2:1315 -9906:2:1316 -9907:2:1327 -9908:2:1328 -9909:2:1329 -9910:2:1327 -9911:2:1328 -9912:2:1329 -9913:2:1340 -9914:2:1345 -9915:2:1346 -9916:0:4365 -9917:2:1358 -9918:0:4365 -9919:2:1454 -9920:0:4365 -9921:3:3042 -9922:0:4365 -9923:2:1455 -9924:0:4365 -9925:3:3043 -9926:0:4365 -9927:2:1652 -9928:0:4365 -9929:2:1653 -9930:0:4365 -9931:2:1657 -9932:0:4365 -9933:2:1660 -9934:0:4365 -9935:3:3042 -9936:0:4365 -9937:2:1665 -9938:2:1669 -9939:2:1670 -9940:2:1678 -9941:2:1679 -9942:2:1683 -9943:2:1684 -9944:2:1678 -9945:2:1679 -9946:2:1680 -9947:2:1692 -9948:2:1697 -9949:2:1701 -9950:2:1702 -9951:2:1709 -9952:2:1710 -9953:2:1721 -9954:2:1722 -9955:2:1723 -9956:2:1721 -9957:2:1722 -9958:2:1723 -9959:2:1734 -9960:2:1739 -9961:2:1740 -9962:0:4365 -9963:3:3043 -9964:0:4365 -9965:2:1752 -9966:0:4365 -9967:3:3042 -9968:0:4365 -9969:2:1754 -9970:0:4365 -9971:3:3043 -9972:0:4365 -9973:2:1755 -9974:2:1759 -9975:2:1760 -9976:2:1768 -9977:2:1769 -9978:2:1773 -9979:2:1774 -9980:2:1768 -9981:2:1769 -9982:2:1773 -9983:2:1774 -9984:2:1782 -9985:2:1787 -9986:2:1791 -9987:2:1792 -9988:2:1799 -9989:2:1800 -9990:2:1811 -9991:2:1812 -9992:2:1813 -9993:2:1811 -9994:2:1812 -9995:2:1813 -9996:2:1824 -9997:2:1829 -9998:2:1830 -9999:0:4365 -10000:2:1842 -10001:0:4365 -10002:3:3042 -10003:0:4365 -10004:2:1844 -10005:0:4365 -10006:3:3043 -10007:0:4365 -10008:2:1845 -10009:2:1849 -10010:2:1850 -10011:2:1858 -10012:2:1859 -10013:2:1863 -10014:2:1864 -10015:2:1858 -10016:2:1859 -10017:2:1863 -10018:2:1864 -10019:2:1872 -10020:2:1877 -10021:2:1881 -10022:2:1882 -10023:2:1889 -10024:2:1890 -10025:2:1901 -10026:2:1902 -10027:2:1903 -10028:2:1901 -10029:2:1902 -10030:2:1903 -10031:2:1914 -10032:2:1919 -10033:2:1920 -10034:0:4365 -10035:2:1932 -10036:0:4365 -10037:3:3042 -10038:0:4365 -10039:2:1934 -10040:0:4365 -10041:3:3043 -10042:0:4365 -10043:2:1935 -10044:0:4365 -10045:2:1936 -10046:0:4365 -10047:2:2129 -10048:0:4365 -10049:2:2130 -10050:0:4365 -10051:2:2134 -10052:0:4365 -10053:3:3042 -10054:0:4365 -10055:2:2136 -10056:0:4365 -10057:3:3043 -10058:0:4365 -10059:2:2137 -10060:2:2141 -10061:2:2142 -10062:2:2150 -10063:2:2151 -10064:2:2155 -10065:2:2156 -10066:2:2150 -10067:2:2151 -10068:2:2155 -10069:2:2156 -10070:2:2164 -10071:2:2169 -10072:2:2173 -10073:2:2174 -10074:2:2181 -10075:2:2182 -10076:2:2193 -10077:2:2194 -10078:2:2195 -10079:2:2193 -10080:2:2194 -10081:2:2195 -10082:2:2206 -10083:2:2211 -10084:2:2212 -10085:0:4365 -10086:2:2224 -10087:0:4365 -10088:3:3042 -10089:0:4365 -10090:2:2226 -10091:0:4365 -10092:3:3043 -10093:0:4365 -10094:2:1936 -10095:0:4365 -10096:2:2129 -10097:0:4365 -10098:2:2130 -10099:0:4365 -10100:2:2134 -10101:0:4365 -10102:3:3042 -10103:0:4365 -10104:2:2136 -10105:0:4365 -10106:3:3043 -10107:0:4365 -10108:2:2137 -10109:2:2141 -10110:2:2142 -10111:2:2150 -10112:2:2151 -10113:2:2155 -10114:2:2156 -10115:2:2150 -10116:2:2151 -10117:2:2152 -10118:2:2164 -10119:2:2169 -10120:2:2173 -10121:2:2174 -10122:2:2181 -10123:2:2182 -10124:2:2193 -10125:2:2194 -10126:2:2195 -10127:2:2193 -10128:2:2194 -10129:2:2195 -10130:2:2206 -10131:2:2211 -10132:2:2212 -10133:0:4365 -10134:2:2224 -10135:0:4365 -10136:3:3042 -10137:0:4365 -10138:2:2226 -10139:0:4365 -10140:3:3043 -10141:0:4365 -10142:2:2230 -10143:0:4365 -10144:3:3042 -10145:0:4365 -10146:2:2235 -10147:2:2239 -10148:2:2240 -10149:2:2248 -10150:2:2249 -10151:2:2253 -10152:2:2254 -10153:2:2248 -10154:2:2249 -10155:2:2250 -10156:2:2262 -10157:2:2267 -10158:2:2271 -10159:2:2272 -10160:2:2279 -10161:2:2280 -10162:2:2291 -10163:2:2292 -10164:2:2293 -10165:2:2291 -10166:2:2292 -10167:2:2293 -10168:2:2304 -10169:2:2309 -10170:2:2310 -10171:0:4365 -10172:3:3043 -10173:0:4365 -10174:2:2322 -10175:0:4365 -10176:2:1169 -10177:0:4365 -10178:3:3042 -10179:0:4365 -10180:2:1170 -10181:0:4365 -10182:3:3043 -10183:0:4365 -10184:3:3044 -10185:0:4365 -10186:3:3257 -10187:0:4365 -10188:3:3265 -10189:0:4365 -10190:3:3266 -10191:3:3270 -10192:3:3271 -10193:3:3279 -10194:3:3280 -10195:3:3284 -10196:3:3285 -10197:3:3279 -10198:3:3280 -10199:3:3284 -10200:3:3285 -10201:3:3293 -10202:3:3298 -10203:3:3302 -10204:3:3303 -10205:3:3310 -10206:3:3311 -10207:3:3322 -10208:3:3323 -10209:3:3324 -10210:3:3322 -10211:3:3323 -10212:3:3324 -10213:3:3335 -10214:3:3340 -10215:3:3341 -10216:0:4365 -10217:3:3353 -10218:0:4365 -10219:3:3354 -10220:0:4365 -10221:2:1173 -10222:0:4365 -10223:3:3355 -10224:0:4365 -10225:2:1179 -10226:0:4365 -10227:2:1180 -10228:0:4365 -10229:3:3354 -10230:0:4365 -10231:2:1181 -10232:2:1185 -10233:2:1186 -10234:2:1194 -10235:2:1195 -10236:2:1199 -10237:2:1200 -10238:2:1194 -10239:2:1195 -10240:2:1199 -10241:2:1200 -10242:2:1208 -10243:2:1213 -10244:2:1217 -10245:2:1218 -10246:2:1225 -10247:2:1226 -10248:2:1237 -10249:2:1238 -10250:2:1239 -10251:2:1237 -10252:2:1238 -10253:2:1239 -10254:2:1250 -10255:2:1255 -10256:2:1256 -10257:0:4365 -10258:3:3355 -10259:0:4365 -10260:2:1268 -10261:0:4365 -10262:3:3354 -10263:0:4365 -10264:2:1270 -10265:0:4365 -10266:3:3355 -10267:0:4365 -10268:2:1271 -10269:2:1275 -10270:2:1276 -10271:2:1284 -10272:2:1285 -10273:2:1289 -10274:2:1290 -10275:2:1284 -10276:2:1285 -10277:2:1289 -10278:2:1290 -10279:2:1298 -10280:2:1303 -10281:2:1307 -10282:2:1308 -10283:2:1315 -10284:2:1316 -10285:2:1327 -10286:2:1328 -10287:2:1329 -10288:2:1327 -10289:2:1328 -10290:2:1329 -10291:2:1340 -10292:2:1345 -10293:2:1346 -10294:0:4365 -10295:2:1358 -10296:0:4365 -10297:2:1360 -10298:0:4365 -10299:3:3354 -10300:0:4365 -10301:2:1361 -10302:0:4365 -10303:3:3355 -10304:0:4365 -10305:2:1362 -10306:2:1366 -10307:2:1367 -10308:2:1375 -10309:2:1376 -10310:2:1380 -10311:2:1381 -10312:2:1375 -10313:2:1376 -10314:2:1380 -10315:2:1381 -10316:2:1389 -10317:2:1394 -10318:2:1398 -10319:2:1399 -10320:2:1406 -10321:2:1407 -10322:2:1418 -10323:2:1419 -10324:2:1420 -10325:2:1418 -10326:2:1419 -10327:2:1420 -10328:2:1431 -10329:2:1436 -10330:2:1437 -10331:0:4365 -10332:2:1449 -10333:0:4365 -10334:3:3354 -10335:0:4365 -10336:2:1451 -10337:0:4365 -10338:3:3355 -10339:0:4365 -10340:2:1652 -10341:0:4365 -10342:2:1653 -10343:0:4365 -10344:2:1657 -10345:0:4365 -10346:2:1180 -10347:0:4365 -10348:3:3354 -10349:0:4365 -10350:2:1181 -10351:2:1185 -10352:2:1186 -10353:2:1194 -10354:2:1195 -10355:2:1199 -10356:2:1200 -10357:2:1194 -10358:2:1195 -10359:2:1196 -10360:2:1208 -10361:2:1213 -10362:2:1217 -10363:2:1218 -10364:2:1225 -10365:2:1226 -10366:2:1237 -10367:2:1238 -10368:2:1239 -10369:2:1237 -10370:2:1238 -10371:2:1239 -10372:2:1250 -10373:2:1255 -10374:2:1256 -10375:0:4365 -10376:3:3355 -10377:0:4365 -10378:2:1268 -10379:0:4365 -10380:3:3354 -10381:0:4365 -10382:2:1270 -10383:0:4365 -10384:3:3355 -10385:0:4365 -10386:2:1271 -10387:2:1275 -10388:2:1276 -10389:2:1284 -10390:2:1285 -10391:2:1289 -10392:2:1290 -10393:2:1284 -10394:2:1285 -10395:2:1289 -10396:2:1290 -10397:2:1298 -10398:2:1303 -10399:2:1307 -10400:2:1308 -10401:2:1315 -10402:2:1316 -10403:2:1327 -10404:2:1328 -10405:2:1329 -10406:2:1327 -10407:2:1328 -10408:2:1329 -10409:2:1340 -10410:2:1345 -10411:2:1346 -10412:0:4365 -10413:2:1358 -10414:0:4365 -10415:2:1454 -10416:0:4365 -10417:3:3354 -10418:0:4365 -10419:2:1455 -10420:0:4365 -10421:3:3355 -10422:0:4365 -10423:2:1652 -10424:0:4365 -10425:2:1653 -10426:0:4365 -10427:2:1657 -10428:0:4365 -10429:2:1660 -10430:0:4365 -10431:3:3354 -10432:0:4365 -10433:2:1665 -10434:2:1669 -10435:2:1670 -10436:2:1678 -10437:2:1679 -10438:2:1683 -10439:2:1684 -10440:2:1678 -10441:2:1679 -10442:2:1680 -10443:2:1692 -10444:2:1697 -10445:2:1701 -10446:2:1702 -10447:2:1709 -10448:2:1710 -10449:2:1721 -10450:2:1722 -10451:2:1723 -10452:2:1721 -10453:2:1722 -10454:2:1723 -10455:2:1734 -10456:2:1739 -10457:2:1740 -10458:0:4365 -10459:3:3355 -10460:0:4365 -10461:2:1752 -10462:0:4365 -10463:3:3354 -10464:0:4365 -10465:2:1754 -10466:0:4365 -10467:3:3355 -10468:0:4365 -10469:2:1755 -10470:2:1759 -10471:2:1760 -10472:2:1768 -10473:2:1769 -10474:2:1773 -10475:2:1774 -10476:2:1768 -10477:2:1769 -10478:2:1773 -10479:2:1774 -10480:2:1782 -10481:2:1787 -10482:2:1791 -10483:2:1792 -10484:2:1799 -10485:2:1800 -10486:2:1811 -10487:2:1812 -10488:2:1813 -10489:2:1811 -10490:2:1812 -10491:2:1813 -10492:2:1824 -10493:2:1829 -10494:2:1830 -10495:0:4365 -10496:2:1842 -10497:0:4365 -10498:3:3354 -10499:0:4365 -10500:2:1844 -10501:0:4365 -10502:3:3355 -10503:0:4365 -10504:2:1845 -10505:2:1849 -10506:2:1850 -10507:2:1858 -10508:2:1859 -10509:2:1863 -10510:2:1864 -10511:2:1858 -10512:2:1859 -10513:2:1863 -10514:2:1864 -10515:2:1872 -10516:2:1877 -10517:2:1881 -10518:2:1882 -10519:2:1889 -10520:2:1890 -10521:2:1901 -10522:2:1902 -10523:2:1903 -10524:2:1901 -10525:2:1902 -10526:2:1903 -10527:2:1914 -10528:2:1919 -10529:2:1920 -10530:0:4365 -10531:2:1932 -10532:0:4365 -10533:3:3354 -10534:0:4365 -10535:2:1934 -10536:0:4365 -10537:3:3355 -10538:0:4365 -10539:2:1935 -10540:0:4365 -10541:2:1936 -10542:0:4365 -10543:2:2129 -10544:0:4365 -10545:2:2130 -10546:0:4365 -10547:2:2134 -10548:0:4365 -10549:3:3354 -10550:0:4365 -10551:2:2136 -10552:0:4365 -10553:3:3355 -10554:0:4365 -10555:2:2137 -10556:2:2141 -10557:2:2142 -10558:2:2150 -10559:2:2151 -10560:2:2155 -10561:2:2156 -10562:2:2150 -10563:2:2151 -10564:2:2155 -10565:2:2156 -10566:2:2164 -10567:2:2169 -10568:2:2173 -10569:2:2174 -10570:2:2181 -10571:2:2182 -10572:2:2193 -10573:2:2194 -10574:2:2195 -10575:2:2193 -10576:2:2194 -10577:2:2195 -10578:2:2206 -10579:2:2211 -10580:2:2212 -10581:0:4365 -10582:2:2224 -10583:0:4365 -10584:3:3354 -10585:0:4365 -10586:2:2226 -10587:0:4365 -10588:3:3355 -10589:0:4365 -10590:2:1936 -10591:0:4365 -10592:2:2129 -10593:0:4365 -10594:2:2130 -10595:0:4365 -10596:2:2134 -10597:0:4365 -10598:3:3354 -10599:0:4365 -10600:2:2136 -10601:0:4365 -10602:3:3355 -10603:0:4365 -10604:2:2137 -10605:2:2141 -10606:2:2142 -10607:2:2150 -10608:2:2151 -10609:2:2155 -10610:2:2156 -10611:2:2150 -10612:2:2151 -10613:2:2152 -10614:2:2164 -10615:2:2169 -10616:2:2173 -10617:2:2174 -10618:2:2181 -10619:2:2182 -10620:2:2193 -10621:2:2194 -10622:2:2195 -10623:2:2193 -10624:2:2194 -10625:2:2195 -10626:2:2206 -10627:2:2211 -10628:2:2212 -10629:0:4365 -10630:2:2224 -10631:0:4365 -10632:3:3354 -10633:0:4365 -10634:2:2226 -10635:0:4365 -10636:3:3355 -10637:0:4365 -10638:2:2230 -10639:0:4365 -10640:3:3354 -10641:0:4365 -10642:2:2235 -10643:2:2239 -10644:2:2240 -10645:2:2248 -10646:2:2249 -10647:2:2253 -10648:2:2254 -10649:2:2248 -10650:2:2249 -10651:2:2250 -10652:2:2262 -10653:2:2267 -10654:2:2271 -10655:2:2272 -10656:2:2279 -10657:2:2280 -10658:2:2291 -10659:2:2292 -10660:2:2293 -10661:2:2291 -10662:2:2292 -10663:2:2293 -10664:2:2304 -10665:2:2309 -10666:2:2310 -10667:0:4365 -10668:3:3355 -10669:0:4365 -10670:2:2322 -10671:0:4365 -10672:2:1169 -10673:0:4365 -10674:3:3354 -10675:0:4365 -10676:2:1170 -10677:0:4365 -10678:3:3355 -10679:0:4365 -10680:3:3356 -10681:0:4365 -10682:3:3366 -10683:0:4365 -10684:3:2951 -10685:0:4365 -10686:3:2952 -10687:0:4365 -10688:3:2953 -10689:0:4365 -10690:3:2954 -10691:3:2958 -10692:3:2959 -10693:3:2967 -10694:3:2968 -10695:3:2972 -10696:3:2973 -10697:3:2967 -10698:3:2968 -10699:3:2972 -10700:3:2973 -10701:3:2981 -10702:3:2986 -10703:3:2990 -10704:3:2991 -10705:3:2998 -10706:3:2999 -10707:3:3010 -10708:3:3011 -10709:3:3012 -10710:3:3010 -10711:3:3011 -10712:3:3012 -10713:3:3023 -10714:3:3028 -10715:3:3029 -10716:0:4365 -10717:3:3041 -10718:0:4365 -10719:3:3042 -10720:0:4365 -10721:2:1173 -10722:0:4365 -10723:3:3043 -10724:0:4365 -10725:2:1179 -10726:0:4365 -10727:2:1180 -10728:0:4365 -10729:3:3042 -10730:0:4365 -10731:2:1181 -10732:2:1185 -10733:2:1186 -10734:2:1194 -10735:2:1195 -10736:2:1199 -10737:2:1200 -10738:2:1194 -10739:2:1195 -10740:2:1199 -10741:2:1200 -10742:2:1208 -10743:2:1213 -10744:2:1217 -10745:2:1218 -10746:2:1225 -10747:2:1226 -10748:2:1237 -10749:2:1238 -10750:2:1239 -10751:2:1237 -10752:2:1238 -10753:2:1239 -10754:2:1250 -10755:2:1255 -10756:2:1256 -10757:0:4365 -10758:3:3043 -10759:0:4365 -10760:2:1268 -10761:0:4365 -10762:3:3042 -10763:0:4365 -10764:2:1270 -10765:0:4365 -10766:3:3043 -10767:0:4365 -10768:2:1271 -10769:2:1275 -10770:2:1276 -10771:2:1284 -10772:2:1285 -10773:2:1289 -10774:2:1290 -10775:2:1284 -10776:2:1285 -10777:2:1289 -10778:2:1290 -10779:2:1298 -10780:2:1303 -10781:2:1307 -10782:2:1308 -10783:2:1315 -10784:2:1316 -10785:2:1327 -10786:2:1328 -10787:2:1329 -10788:2:1327 -10789:2:1328 -10790:2:1329 -10791:2:1340 -10792:2:1345 -10793:2:1346 -10794:0:4365 -10795:2:1358 -10796:0:4365 -10797:2:1360 -10798:0:4365 -10799:3:3042 -10800:0:4365 -10801:2:1361 -10802:0:4365 -10803:3:3043 -10804:0:4365 -10805:2:1362 -10806:2:1366 -10807:2:1367 -10808:2:1375 -10809:2:1376 -10810:2:1380 -10811:2:1381 -10812:2:1375 -10813:2:1376 -10814:2:1380 -10815:2:1381 -10816:2:1389 -10817:2:1394 -10818:2:1398 -10819:2:1399 -10820:2:1406 -10821:2:1407 -10822:2:1418 -10823:2:1419 -10824:2:1420 -10825:2:1418 -10826:2:1419 -10827:2:1420 -10828:2:1431 -10829:2:1436 -10830:2:1437 -10831:0:4365 -10832:2:1449 -10833:0:4365 -10834:3:3042 -10835:0:4365 -10836:2:1451 -10837:0:4365 -10838:3:3043 -10839:0:4365 -10840:2:1652 -10841:0:4365 -10842:2:1653 -10843:0:4365 -10844:2:1657 -10845:0:4365 -10846:2:1180 -10847:0:4365 -10848:3:3042 -10849:0:4365 -10850:2:1181 -10851:2:1185 -10852:2:1186 -10853:2:1194 -10854:2:1195 -10855:2:1199 -10856:2:1200 -10857:2:1194 -10858:2:1195 -10859:2:1196 -10860:2:1208 -10861:2:1213 -10862:2:1217 -10863:2:1218 -10864:2:1225 -10865:2:1226 -10866:2:1237 -10867:2:1238 -10868:2:1239 -10869:2:1237 -10870:2:1238 -10871:2:1239 -10872:2:1250 -10873:2:1255 -10874:2:1256 -10875:0:4365 -10876:3:3043 -10877:0:4365 -10878:2:1268 -10879:0:4365 -10880:3:3042 -10881:0:4365 -10882:2:1270 -10883:0:4365 -10884:3:3043 -10885:0:4365 -10886:2:1271 -10887:2:1275 -10888:2:1276 -10889:2:1284 -10890:2:1285 -10891:2:1289 -10892:2:1290 -10893:2:1284 -10894:2:1285 -10895:2:1289 -10896:2:1290 -10897:2:1298 -10898:2:1303 -10899:2:1307 -10900:2:1308 -10901:2:1315 -10902:2:1316 -10903:2:1327 -10904:2:1328 -10905:2:1329 -10906:2:1327 -10907:2:1328 -10908:2:1329 -10909:2:1340 -10910:2:1345 -10911:2:1346 -10912:0:4365 -10913:2:1358 -10914:0:4365 -10915:2:1454 -10916:0:4365 -10917:3:3042 -10918:0:4365 -10919:2:1455 -10920:0:4365 -10921:3:3043 -10922:0:4365 -10923:2:1652 -10924:0:4365 -10925:2:1653 -10926:0:4365 -10927:2:1657 -10928:0:4365 -10929:2:1660 -10930:0:4365 -10931:3:3042 -10932:0:4365 -10933:2:1665 -10934:2:1669 -10935:2:1670 -10936:2:1678 -10937:2:1679 -10938:2:1683 -10939:2:1684 -10940:2:1678 -10941:2:1679 -10942:2:1680 -10943:2:1692 -10944:2:1697 -10945:2:1701 -10946:2:1702 -10947:2:1709 -10948:2:1710 -10949:2:1721 -10950:2:1722 -10951:2:1723 -10952:2:1721 -10953:2:1722 -10954:2:1723 -10955:2:1734 -10956:2:1739 -10957:2:1740 -10958:0:4365 -10959:3:3043 -10960:0:4365 -10961:2:1752 -10962:0:4365 -10963:3:3042 -10964:0:4365 -10965:2:1754 -10966:0:4365 -10967:3:3043 -10968:0:4365 -10969:2:1755 -10970:2:1759 -10971:2:1760 -10972:2:1768 -10973:2:1769 -10974:2:1773 -10975:2:1774 -10976:2:1768 -10977:2:1769 -10978:2:1773 -10979:2:1774 -10980:2:1782 -10981:2:1787 -10982:2:1791 -10983:2:1792 -10984:2:1799 -10985:2:1800 -10986:2:1811 -10987:2:1812 -10988:2:1813 -10989:2:1811 -10990:2:1812 -10991:2:1813 -10992:2:1824 -10993:2:1829 -10994:2:1830 -10995:0:4365 -10996:2:1842 -10997:0:4365 -10998:3:3042 -10999:0:4365 -11000:2:1844 -11001:0:4365 -11002:3:3043 -11003:0:4365 -11004:2:1845 -11005:2:1849 -11006:2:1850 -11007:2:1858 -11008:2:1859 -11009:2:1863 -11010:2:1864 -11011:2:1858 -11012:2:1859 -11013:2:1863 -11014:2:1864 -11015:2:1872 -11016:2:1877 -11017:2:1881 -11018:2:1882 -11019:2:1889 -11020:2:1890 -11021:2:1901 -11022:2:1902 -11023:2:1903 -11024:2:1901 -11025:2:1902 -11026:2:1903 -11027:2:1914 -11028:2:1919 -11029:2:1920 -11030:0:4365 -11031:2:1932 -11032:0:4365 -11033:3:3042 -11034:0:4365 -11035:2:1934 -11036:0:4365 -11037:3:3043 -11038:0:4365 -11039:2:1935 -11040:0:4365 -11041:2:1936 -11042:0:4365 -11043:2:2129 -11044:0:4365 -11045:2:2130 -11046:0:4365 -11047:2:2134 -11048:0:4365 -11049:3:3042 -11050:0:4365 -11051:2:2136 -11052:0:4365 -11053:3:3043 -11054:0:4365 -11055:2:2137 -11056:2:2141 -11057:2:2142 -11058:2:2150 -11059:2:2151 -11060:2:2155 -11061:2:2156 -11062:2:2150 -11063:2:2151 -11064:2:2155 -11065:2:2156 -11066:2:2164 -11067:2:2169 -11068:2:2173 -11069:2:2174 -11070:2:2181 -11071:2:2182 -11072:2:2193 -11073:2:2194 -11074:2:2195 -11075:2:2193 -11076:2:2194 -11077:2:2195 -11078:2:2206 -11079:2:2211 -11080:2:2212 -11081:0:4365 -11082:2:2224 -11083:0:4365 -11084:3:3042 -11085:0:4365 -11086:2:2226 -11087:0:4365 -11088:3:3043 -11089:0:4365 -11090:2:1936 -11091:0:4365 -11092:2:2129 -11093:0:4365 -11094:2:2130 -11095:0:4365 -11096:2:2134 -11097:0:4365 -11098:3:3042 -11099:0:4365 -11100:2:2136 -11101:0:4365 -11102:3:3043 -11103:0:4365 -11104:2:2137 -11105:2:2141 -11106:2:2142 -11107:2:2150 -11108:2:2151 -11109:2:2155 -11110:2:2156 -11111:2:2150 -11112:2:2151 -11113:2:2152 -11114:2:2164 -11115:2:2169 -11116:2:2173 -11117:2:2174 -11118:2:2181 -11119:2:2182 -11120:2:2193 -11121:2:2194 -11122:2:2195 -11123:2:2193 -11124:2:2194 -11125:2:2195 -11126:2:2206 -11127:2:2211 -11128:2:2212 -11129:0:4365 -11130:2:2224 -11131:0:4365 -11132:3:3042 -11133:0:4365 -11134:2:2226 -11135:0:4365 -11136:3:3043 -11137:0:4365 -11138:2:2230 -11139:0:4365 -11140:3:3042 -11141:0:4365 -11142:2:2235 -11143:2:2239 -11144:2:2240 -11145:2:2248 -11146:2:2249 -11147:2:2253 -11148:2:2254 -11149:2:2248 -11150:2:2249 -11151:2:2250 -11152:2:2262 -11153:2:2267 -11154:2:2271 -11155:2:2272 -11156:2:2279 -11157:2:2280 -11158:2:2291 -11159:2:2292 -11160:2:2293 -11161:2:2291 -11162:2:2292 -11163:2:2293 -11164:2:2304 -11165:2:2309 -11166:2:2310 -11167:0:4365 -11168:3:3043 -11169:0:4365 -11170:2:2322 -11171:0:4365 -11172:2:1169 -11173:0:4365 -11174:3:3042 -11175:0:4365 -11176:2:1170 -11177:0:4365 -11178:3:3043 -11179:0:4365 -11180:3:3044 -11181:0:4365 -11182:3:3257 -11183:0:4365 -11184:3:3362 -11185:0:4365 -11186:3:3363 -11187:0:4365 -11188:3:3367 -11189:0:4365 -11190:3:3373 -11191:3:3377 -11192:3:3378 -11193:3:3386 -11194:3:3387 -11195:3:3391 -11196:3:3392 -11197:3:3386 -11198:3:3387 -11199:3:3391 -11200:3:3392 -11201:3:3400 -11202:3:3405 -11203:3:3409 -11204:3:3410 -11205:3:3417 -11206:3:3418 -11207:3:3429 -11208:3:3430 -11209:3:3431 -11210:3:3429 -11211:3:3430 -11212:3:3431 -11213:3:3442 -11214:3:3447 -11215:3:3448 -11216:0:4365 -11217:3:3460 -11218:0:4365 -11219:3:3461 -11220:0:4365 -11221:2:1173 -11222:0:4365 -11223:3:3462 -11224:0:4365 -11225:2:1179 -11226:0:4365 -11227:2:1180 -11228:0:4365 -11229:3:3461 -11230:0:4365 -11231:2:1181 -11232:2:1185 -11233:2:1186 -11234:2:1194 -11235:2:1195 -11236:2:1199 -11237:2:1200 -11238:2:1194 -11239:2:1195 -11240:2:1199 -11241:2:1200 -11242:2:1208 -11243:2:1213 -11244:2:1217 -11245:2:1218 -11246:2:1225 -11247:2:1226 -11248:2:1237 -11249:2:1238 -11250:2:1239 -11251:2:1237 -11252:2:1238 -11253:2:1239 -11254:2:1250 -11255:2:1255 -11256:2:1256 -11257:0:4365 -11258:3:3462 -11259:0:4365 -11260:2:1268 -11261:0:4365 -11262:3:3461 -11263:0:4365 -11264:2:1270 -11265:0:4365 -11266:3:3462 -11267:0:4365 -11268:2:1271 -11269:2:1275 -11270:2:1276 -11271:2:1284 -11272:2:1285 -11273:2:1289 -11274:2:1290 -11275:2:1284 -11276:2:1285 -11277:2:1289 -11278:2:1290 -11279:2:1298 -11280:2:1303 -11281:2:1307 -11282:2:1308 -11283:2:1315 -11284:2:1316 -11285:2:1327 -11286:2:1328 -11287:2:1329 -11288:2:1327 -11289:2:1328 -11290:2:1329 -11291:2:1340 -11292:2:1345 -11293:2:1346 -11294:0:4365 -11295:2:1358 -11296:0:4365 -11297:2:1360 -11298:0:4365 -11299:3:3461 -11300:0:4365 -11301:2:1361 -11302:0:4365 -11303:3:3462 -11304:0:4365 -11305:2:1362 -11306:2:1366 -11307:2:1367 -11308:2:1375 -11309:2:1376 -11310:2:1380 -11311:2:1381 -11312:2:1375 -11313:2:1376 -11314:2:1380 -11315:2:1381 -11316:2:1389 -11317:2:1394 -11318:2:1398 -11319:2:1399 -11320:2:1406 -11321:2:1407 -11322:2:1418 -11323:2:1419 -11324:2:1420 -11325:2:1418 -11326:2:1419 -11327:2:1420 -11328:2:1431 -11329:2:1436 -11330:2:1437 -11331:0:4365 -11332:2:1449 -11333:0:4365 -11334:3:3461 -11335:0:4365 -11336:2:1451 -11337:0:4365 -11338:3:3462 -11339:0:4365 -11340:2:1652 -11341:0:4365 -11342:2:1653 -11343:0:4365 -11344:2:1657 -11345:0:4365 -11346:2:1180 -11347:0:4365 -11348:3:3461 -11349:0:4365 -11350:2:1181 -11351:2:1185 -11352:2:1186 -11353:2:1194 -11354:2:1195 -11355:2:1199 -11356:2:1200 -11357:2:1194 -11358:2:1195 -11359:2:1196 -11360:2:1208 -11361:2:1213 -11362:2:1217 -11363:2:1218 -11364:2:1225 -11365:2:1226 -11366:2:1237 -11367:2:1238 -11368:2:1239 -11369:2:1237 -11370:2:1238 -11371:2:1239 -11372:2:1250 -11373:2:1255 -11374:2:1256 -11375:0:4365 -11376:3:3462 -11377:0:4365 -11378:2:1268 -11379:0:4365 -11380:3:3461 -11381:0:4365 -11382:2:1270 -11383:0:4365 -11384:3:3462 -11385:0:4365 -11386:2:1271 -11387:2:1275 -11388:2:1276 -11389:2:1284 -11390:2:1285 -11391:2:1289 -11392:2:1290 -11393:2:1284 -11394:2:1285 -11395:2:1289 -11396:2:1290 -11397:2:1298 -11398:2:1303 -11399:2:1307 -11400:2:1308 -11401:2:1315 -11402:2:1316 -11403:2:1327 -11404:2:1328 -11405:2:1329 -11406:2:1327 -11407:2:1328 -11408:2:1329 -11409:2:1340 -11410:2:1345 -11411:2:1346 -11412:0:4365 -11413:2:1358 -11414:0:4365 -11415:2:1454 -11416:0:4365 -11417:3:3461 -11418:0:4365 -11419:2:1455 -11420:0:4365 -11421:3:3462 -11422:0:4365 -11423:2:1652 -11424:0:4365 -11425:2:1653 -11426:0:4365 -11427:2:1657 -11428:0:4365 -11429:2:1660 -11430:0:4365 -11431:3:3461 -11432:0:4365 -11433:2:1665 -11434:2:1669 -11435:2:1670 -11436:2:1678 -11437:2:1679 -11438:2:1683 -11439:2:1684 -11440:2:1678 -11441:2:1679 -11442:2:1680 -11443:2:1692 -11444:2:1697 -11445:2:1701 -11446:2:1702 -11447:2:1709 -11448:2:1710 -11449:2:1721 -11450:2:1722 -11451:2:1723 -11452:2:1721 -11453:2:1722 -11454:2:1723 -11455:2:1734 -11456:2:1739 -11457:2:1740 -11458:0:4365 -11459:3:3462 -11460:0:4365 -11461:2:1752 -11462:0:4365 -11463:3:3461 -11464:0:4365 -11465:2:1754 -11466:0:4365 -11467:3:3462 -11468:0:4365 -11469:2:1755 -11470:2:1759 -11471:2:1760 -11472:2:1768 -11473:2:1769 -11474:2:1773 -11475:2:1774 -11476:2:1768 -11477:2:1769 -11478:2:1773 -11479:2:1774 -11480:2:1782 -11481:2:1787 -11482:2:1791 -11483:2:1792 -11484:2:1799 -11485:2:1800 -11486:2:1811 -11487:2:1812 -11488:2:1813 -11489:2:1811 -11490:2:1812 -11491:2:1813 -11492:2:1824 -11493:2:1829 -11494:2:1830 -11495:0:4365 -11496:2:1842 -11497:0:4365 -11498:3:3461 -11499:0:4365 -11500:2:1844 -11501:0:4365 -11502:3:3462 -11503:0:4365 -11504:2:1845 -11505:2:1849 -11506:2:1850 -11507:2:1858 -11508:2:1859 -11509:2:1863 -11510:2:1864 -11511:2:1858 -11512:2:1859 -11513:2:1863 -11514:2:1864 -11515:2:1872 -11516:2:1877 -11517:2:1881 -11518:2:1882 -11519:2:1889 -11520:2:1890 -11521:2:1901 -11522:2:1902 -11523:2:1903 -11524:2:1901 -11525:2:1902 -11526:2:1903 -11527:2:1914 -11528:2:1919 -11529:2:1920 -11530:0:4365 -11531:2:1932 -11532:0:4365 -11533:3:3461 -11534:0:4365 -11535:2:1934 -11536:0:4365 -11537:3:3462 -11538:0:4365 -11539:2:1935 -11540:0:4365 -11541:2:1936 -11542:0:4365 -11543:2:2129 -11544:0:4365 -11545:2:2130 -11546:0:4365 -11547:2:2134 -11548:0:4365 -11549:3:3461 -11550:0:4365 -11551:2:2136 -11552:0:4365 -11553:3:3462 -11554:0:4365 -11555:2:2137 -11556:2:2141 -11557:2:2142 -11558:2:2150 -11559:2:2151 -11560:2:2155 -11561:2:2156 -11562:2:2150 -11563:2:2151 -11564:2:2155 -11565:2:2156 -11566:2:2164 -11567:2:2169 -11568:2:2173 -11569:2:2174 -11570:2:2181 -11571:2:2182 -11572:2:2193 -11573:2:2194 -11574:2:2195 -11575:2:2193 -11576:2:2194 -11577:2:2195 -11578:2:2206 -11579:2:2211 -11580:2:2212 -11581:0:4365 -11582:2:2224 -11583:0:4365 -11584:3:3461 -11585:0:4365 -11586:2:2226 -11587:0:4365 -11588:3:3462 -11589:0:4365 -11590:2:1936 -11591:0:4365 -11592:2:2129 -11593:0:4365 -11594:2:2130 -11595:0:4365 -11596:2:2134 -11597:0:4365 -11598:3:3461 -11599:0:4365 -11600:2:2136 -11601:0:4365 -11602:3:3462 -11603:0:4365 -11604:2:2137 -11605:2:2141 -11606:2:2142 -11607:2:2150 -11608:2:2151 -11609:2:2155 -11610:2:2156 -11611:2:2150 -11612:2:2151 -11613:2:2152 -11614:2:2164 -11615:2:2169 -11616:2:2173 -11617:2:2174 -11618:2:2181 -11619:2:2182 -11620:2:2193 -11621:2:2194 -11622:2:2195 -11623:2:2193 -11624:2:2194 -11625:2:2195 -11626:2:2206 -11627:2:2211 -11628:2:2212 -11629:0:4365 -11630:2:2224 -11631:0:4365 -11632:3:3461 -11633:0:4365 -11634:2:2226 -11635:0:4365 -11636:3:3462 -11637:0:4365 -11638:2:2230 -11639:0:4365 -11640:3:3461 -11641:0:4365 -11642:2:2235 -11643:2:2239 -11644:2:2240 -11645:2:2248 -11646:2:2249 -11647:2:2253 -11648:2:2254 -11649:2:2248 -11650:2:2249 -11651:2:2250 -11652:2:2262 -11653:2:2267 -11654:2:2271 -11655:2:2272 -11656:2:2279 -11657:2:2280 -11658:2:2291 -11659:2:2292 -11660:2:2293 -11661:2:2291 -11662:2:2292 -11663:2:2293 -11664:2:2304 -11665:2:2309 -11666:2:2310 -11667:0:4365 -11668:3:3462 -11669:0:4365 -11670:2:2322 -11671:0:4365 -11672:2:1169 -11673:0:4365 -11674:3:3461 -11675:0:4365 -11676:2:1170 -11677:0:4365 -11678:3:3462 -11679:0:4365 -11680:3:3463 -11681:0:4365 -11682:3:3469 -11683:0:4365 -11684:3:3470 -11685:3:3474 -11686:3:3475 -11687:3:3483 -11688:3:3484 -11689:3:3488 -11690:3:3489 -11691:3:3483 -11692:3:3484 -11693:3:3488 -11694:3:3489 -11695:3:3497 -11696:3:3502 -11697:3:3506 -11698:3:3507 -11699:3:3514 -11700:3:3515 -11701:3:3526 -11702:3:3527 -11703:3:3528 -11704:3:3526 -11705:3:3527 -11706:3:3528 -11707:3:3539 -11708:3:3544 -11709:3:3545 -11710:0:4365 -11711:3:3557 -11712:0:4365 -11713:3:3558 -11714:0:4365 -11715:2:1173 -11716:0:4365 -11717:3:3559 -11718:0:4365 -11719:2:1179 -11720:0:4365 -11721:2:1180 -11722:0:4365 -11723:3:3558 -11724:0:4365 -11725:2:1181 -11726:2:1185 -11727:2:1186 -11728:2:1194 -11729:2:1195 -11730:2:1199 -11731:2:1200 -11732:2:1194 -11733:2:1195 -11734:2:1199 -11735:2:1200 -11736:2:1208 -11737:2:1213 -11738:2:1217 -11739:2:1218 -11740:2:1225 -11741:2:1226 -11742:2:1237 -11743:2:1238 -11744:2:1239 -11745:2:1237 -11746:2:1238 -11747:2:1239 -11748:2:1250 -11749:2:1255 -11750:2:1256 -11751:0:4365 -11752:3:3559 -11753:0:4365 -11754:2:1268 -11755:0:4365 -11756:3:3558 -11757:0:4365 -11758:2:1270 -11759:0:4365 -11760:3:3559 -11761:0:4365 -11762:2:1271 -11763:2:1275 -11764:2:1276 -11765:2:1284 -11766:2:1285 -11767:2:1289 -11768:2:1290 -11769:2:1284 -11770:2:1285 -11771:2:1289 -11772:2:1290 -11773:2:1298 -11774:2:1303 -11775:2:1307 -11776:2:1308 -11777:2:1315 -11778:2:1316 -11779:2:1327 -11780:2:1328 -11781:2:1329 -11782:2:1327 -11783:2:1328 -11784:2:1329 -11785:2:1340 -11786:2:1345 -11787:2:1346 -11788:0:4365 -11789:2:1358 -11790:0:4365 -11791:2:1360 -11792:0:4365 -11793:3:3558 -11794:0:4365 -11795:2:1361 -11796:0:4365 -11797:3:3559 -11798:0:4365 -11799:2:1362 -11800:2:1366 -11801:2:1367 -11802:2:1375 -11803:2:1376 -11804:2:1380 -11805:2:1381 -11806:2:1375 -11807:2:1376 -11808:2:1380 -11809:2:1381 -11810:2:1389 -11811:2:1394 -11812:2:1398 -11813:2:1399 -11814:2:1406 -11815:2:1407 -11816:2:1418 -11817:2:1419 -11818:2:1420 -11819:2:1418 -11820:2:1419 -11821:2:1420 -11822:2:1431 -11823:2:1436 -11824:2:1437 -11825:0:4365 -11826:2:1449 -11827:0:4365 -11828:3:3558 -11829:0:4365 -11830:2:1451 -11831:0:4365 -11832:3:3559 -11833:0:4365 -11834:2:1652 -11835:0:4365 -11836:2:1653 -11837:0:4365 -11838:2:1657 -11839:0:4365 -11840:2:1180 -11841:0:4365 -11842:3:3558 -11843:0:4365 -11844:2:1181 -11845:2:1185 -11846:2:1186 -11847:2:1194 -11848:2:1195 -11849:2:1199 -11850:2:1200 -11851:2:1194 -11852:2:1195 -11853:2:1196 -11854:2:1208 -11855:2:1213 -11856:2:1217 -11857:2:1218 -11858:2:1225 -11859:2:1226 -11860:2:1237 -11861:2:1238 -11862:2:1239 -11863:2:1237 -11864:2:1238 -11865:2:1239 -11866:2:1250 -11867:2:1255 -11868:2:1256 -11869:0:4365 -11870:3:3559 -11871:0:4365 -11872:2:1268 -11873:0:4365 -11874:3:3558 -11875:0:4365 -11876:2:1270 -11877:0:4365 -11878:3:3559 -11879:0:4365 -11880:2:1271 -11881:2:1275 -11882:2:1276 -11883:2:1284 -11884:2:1285 -11885:2:1289 -11886:2:1290 -11887:2:1284 -11888:2:1285 -11889:2:1289 -11890:2:1290 -11891:2:1298 -11892:2:1303 -11893:2:1307 -11894:2:1308 -11895:2:1315 -11896:2:1316 -11897:2:1327 -11898:2:1328 -11899:2:1329 -11900:2:1327 -11901:2:1328 -11902:2:1329 -11903:2:1340 -11904:2:1345 -11905:2:1346 -11906:0:4365 -11907:2:1358 -11908:0:4365 -11909:2:1454 -11910:0:4365 -11911:3:3558 -11912:0:4365 -11913:2:1455 -11914:0:4365 -11915:3:3559 -11916:0:4365 -11917:2:1652 -11918:0:4365 -11919:2:1653 -11920:0:4365 -11921:2:1657 -11922:0:4365 -11923:2:1660 -11924:0:4365 -11925:3:3558 -11926:0:4365 -11927:2:1665 -11928:2:1669 -11929:2:1670 -11930:2:1678 -11931:2:1679 -11932:2:1683 -11933:2:1684 -11934:2:1678 -11935:2:1679 -11936:2:1680 -11937:2:1692 -11938:2:1697 -11939:2:1701 -11940:2:1702 -11941:2:1709 -11942:2:1710 -11943:2:1721 -11944:2:1722 -11945:2:1723 -11946:2:1721 -11947:2:1722 -11948:2:1723 -11949:2:1734 -11950:2:1739 -11951:2:1740 -11952:0:4365 -11953:3:3559 -11954:0:4365 -11955:2:1752 -11956:0:4365 -11957:3:3558 -11958:0:4365 -11959:2:1754 -11960:0:4365 -11961:3:3559 -11962:0:4365 -11963:2:1755 -11964:2:1759 -11965:2:1760 -11966:2:1768 -11967:2:1769 -11968:2:1773 -11969:2:1774 -11970:2:1768 -11971:2:1769 -11972:2:1773 -11973:2:1774 -11974:2:1782 -11975:2:1787 -11976:2:1791 -11977:2:1792 -11978:2:1799 -11979:2:1800 -11980:2:1811 -11981:2:1812 -11982:2:1813 -11983:2:1811 -11984:2:1812 -11985:2:1813 -11986:2:1824 -11987:2:1829 -11988:2:1830 -11989:0:4365 -11990:2:1842 -11991:0:4365 -11992:3:3558 -11993:0:4365 -11994:2:1844 -11995:0:4365 -11996:3:3559 -11997:0:4365 -11998:2:1845 -11999:2:1849 -12000:2:1850 -12001:2:1858 -12002:2:1859 -12003:2:1863 -12004:2:1864 -12005:2:1858 -12006:2:1859 -12007:2:1863 -12008:2:1864 -12009:2:1872 -12010:2:1877 -12011:2:1881 -12012:2:1882 -12013:2:1889 -12014:2:1890 -12015:2:1901 -12016:2:1902 -12017:2:1903 -12018:2:1901 -12019:2:1902 -12020:2:1903 -12021:2:1914 -12022:2:1919 -12023:2:1920 -12024:0:4365 -12025:2:1932 -12026:0:4365 -12027:3:3558 -12028:0:4365 -12029:2:1934 -12030:0:4365 -12031:3:3559 -12032:0:4365 -12033:2:1935 -12034:0:4365 -12035:2:1936 -12036:0:4365 -12037:2:2129 -12038:0:4365 -12039:2:2130 -12040:0:4365 -12041:2:2134 -12042:0:4365 -12043:3:3558 -12044:0:4365 -12045:2:2136 -12046:0:4365 -12047:3:3559 -12048:0:4365 -12049:2:2137 -12050:2:2141 -12051:2:2142 -12052:2:2150 -12053:2:2151 -12054:2:2155 -12055:2:2156 -12056:2:2150 -12057:2:2151 -12058:2:2155 -12059:2:2156 -12060:2:2164 -12061:2:2169 -12062:2:2173 -12063:2:2174 -12064:2:2181 -12065:2:2182 -12066:2:2193 -12067:2:2194 -12068:2:2195 -12069:2:2193 -12070:2:2194 -12071:2:2195 -12072:2:2206 -12073:2:2211 -12074:2:2212 -12075:0:4365 -12076:2:2224 -12077:0:4365 -12078:3:3558 -12079:0:4365 -12080:2:2226 -12081:0:4365 -12082:3:3559 -12083:0:4365 -12084:2:1936 -12085:0:4365 -12086:2:2129 -12087:0:4365 -12088:2:2130 -12089:0:4365 -12090:2:2134 -12091:0:4365 -12092:3:3558 -12093:0:4365 -12094:2:2136 -12095:0:4365 -12096:3:3559 -12097:0:4365 -12098:2:2137 -12099:2:2141 -12100:2:2142 -12101:2:2150 -12102:2:2151 -12103:2:2155 -12104:2:2156 -12105:2:2150 -12106:2:2151 -12107:2:2152 -12108:2:2164 -12109:2:2169 -12110:2:2173 -12111:2:2174 -12112:2:2181 -12113:2:2182 -12114:2:2193 -12115:2:2194 -12116:2:2195 -12117:2:2193 -12118:2:2194 -12119:2:2195 -12120:2:2206 -12121:2:2211 -12122:2:2212 -12123:0:4365 -12124:2:2224 -12125:0:4365 -12126:3:3558 -12127:0:4365 -12128:2:2226 -12129:0:4365 -12130:3:3559 -12131:0:4365 -12132:2:2230 -12133:0:4365 -12134:3:3558 -12135:0:4365 -12136:2:2235 -12137:2:2239 -12138:2:2240 -12139:2:2248 -12140:2:2249 -12141:2:2253 -12142:2:2254 -12143:2:2248 -12144:2:2249 -12145:2:2250 -12146:2:2262 -12147:2:2267 -12148:2:2271 -12149:2:2272 -12150:2:2279 -12151:2:2280 -12152:2:2291 -12153:2:2292 -12154:2:2293 -12155:2:2291 -12156:2:2292 -12157:2:2293 -12158:2:2304 -12159:2:2309 -12160:2:2310 -12161:0:4365 -12162:3:3559 -12163:0:4365 -12164:2:2322 -12165:0:4365 -12166:2:1169 -12167:0:4365 -12168:3:3558 -12169:0:4365 -12170:2:1170 -12171:0:4365 -12172:3:3559 -12173:0:4365 -12174:3:3560 -12175:0:4365 -12176:3:3566 -12177:0:4365 -12178:3:3569 -12179:3:3570 -12180:3:3582 -12181:3:3583 -12182:3:3587 -12183:3:3588 -12184:3:3582 -12185:3:3583 -12186:3:3587 -12187:3:3588 -12188:3:3596 -12189:3:3601 -12190:3:3605 -12191:3:3606 -12192:3:3613 -12193:3:3614 -12194:3:3625 -12195:3:3626 -12196:3:3627 -12197:3:3625 -12198:3:3626 -12199:3:3627 -12200:3:3638 -12201:3:3643 -12202:3:3644 -12203:0:4365 -12204:3:3656 -12205:0:4365 -12206:3:3657 -12207:0:4365 -12208:2:1173 -12209:0:4365 -12210:3:3658 -12211:0:4365 -12212:2:1179 -12213:0:4365 -12214:2:1180 -12215:0:4365 -12216:3:3657 -12217:0:4365 -12218:2:1181 -12219:2:1185 -12220:2:1186 -12221:2:1194 -12222:2:1195 -12223:2:1199 -12224:2:1200 -12225:2:1194 -12226:2:1195 -12227:2:1199 -12228:2:1200 -12229:2:1208 -12230:2:1213 -12231:2:1217 -12232:2:1218 -12233:2:1225 -12234:2:1226 -12235:2:1237 -12236:2:1238 -12237:2:1239 -12238:2:1237 -12239:2:1238 -12240:2:1239 -12241:2:1250 -12242:2:1255 -12243:2:1256 -12244:0:4365 -12245:3:3658 -12246:0:4365 -12247:2:1268 -12248:0:4365 -12249:3:3657 -12250:0:4365 -12251:2:1270 -12252:0:4365 -12253:3:3658 -12254:0:4365 -12255:2:1271 -12256:2:1275 -12257:2:1276 -12258:2:1284 -12259:2:1285 -12260:2:1289 -12261:2:1290 -12262:2:1284 -12263:2:1285 -12264:2:1289 -12265:2:1290 -12266:2:1298 -12267:2:1303 -12268:2:1307 -12269:2:1308 -12270:2:1315 -12271:2:1316 -12272:2:1327 -12273:2:1328 -12274:2:1329 -12275:2:1327 -12276:2:1328 -12277:2:1329 -12278:2:1340 -12279:2:1345 -12280:2:1346 -12281:0:4365 -12282:2:1358 -12283:0:4365 -12284:2:1360 -12285:0:4365 -12286:3:3657 -12287:0:4365 -12288:2:1361 -12289:0:4365 -12290:3:3658 -12291:0:4365 -12292:2:1362 -12293:2:1366 -12294:2:1367 -12295:2:1375 -12296:2:1376 -12297:2:1380 -12298:2:1381 -12299:2:1375 -12300:2:1376 -12301:2:1380 -12302:2:1381 -12303:2:1389 -12304:2:1394 -12305:2:1398 -12306:2:1399 -12307:2:1406 -12308:2:1407 -12309:2:1418 -12310:2:1419 -12311:2:1420 -12312:2:1418 -12313:2:1419 -12314:2:1420 -12315:2:1431 -12316:2:1436 -12317:2:1437 -12318:0:4365 -12319:2:1449 -12320:0:4365 -12321:3:3657 -12322:0:4365 -12323:2:1451 -12324:0:4365 -12325:3:3658 -12326:0:4365 -12327:2:1652 -12328:0:4365 -12329:2:1653 -12330:0:4365 -12331:2:1657 -12332:0:4365 -12333:2:1180 -12334:0:4365 -12335:3:3657 -12336:0:4365 -12337:2:1181 -12338:2:1185 -12339:2:1186 -12340:2:1194 -12341:2:1195 -12342:2:1199 -12343:2:1200 -12344:2:1194 -12345:2:1195 -12346:2:1196 -12347:2:1208 -12348:2:1213 -12349:2:1217 -12350:2:1218 -12351:2:1225 -12352:2:1226 -12353:2:1237 -12354:2:1238 -12355:2:1239 -12356:2:1237 -12357:2:1238 -12358:2:1239 -12359:2:1250 -12360:2:1255 -12361:2:1256 -12362:0:4365 -12363:3:3658 -12364:0:4365 -12365:2:1268 -12366:0:4365 -12367:3:3657 -12368:0:4365 -12369:2:1270 -12370:0:4365 -12371:3:3658 -12372:0:4365 -12373:2:1271 -12374:2:1275 -12375:2:1276 -12376:2:1284 -12377:2:1285 -12378:2:1289 -12379:2:1290 -12380:2:1284 -12381:2:1285 -12382:2:1289 -12383:2:1290 -12384:2:1298 -12385:2:1303 -12386:2:1307 -12387:2:1308 -12388:2:1315 -12389:2:1316 -12390:2:1327 -12391:2:1328 -12392:2:1329 -12393:2:1327 -12394:2:1328 -12395:2:1329 -12396:2:1340 -12397:2:1345 -12398:2:1346 -12399:0:4365 -12400:2:1358 -12401:0:4365 -12402:2:1454 -12403:0:4365 -12404:3:3657 -12405:0:4365 -12406:2:1455 -12407:0:4365 -12408:3:3658 -12409:0:4365 -12410:2:1652 -12411:0:4365 -12412:2:1653 -12413:0:4365 -12414:2:1657 -12415:0:4365 -12416:2:1660 -12417:0:4365 -12418:3:3657 -12419:0:4365 -12420:2:1665 -12421:2:1669 -12422:2:1670 -12423:2:1678 -12424:2:1679 -12425:2:1683 -12426:2:1684 -12427:2:1678 -12428:2:1679 -12429:2:1680 -12430:2:1692 -12431:2:1697 -12432:2:1701 -12433:2:1702 -12434:2:1709 -12435:2:1710 -12436:2:1721 -12437:2:1722 -12438:2:1723 -12439:2:1721 -12440:2:1722 -12441:2:1723 -12442:2:1734 -12443:2:1739 -12444:2:1740 -12445:0:4365 -12446:3:3658 -12447:0:4365 -12448:2:1752 -12449:0:4365 -12450:3:3657 -12451:0:4365 -12452:2:1754 -12453:0:4365 -12454:3:3658 -12455:0:4365 -12456:2:1755 -12457:2:1759 -12458:2:1760 -12459:2:1768 -12460:2:1769 -12461:2:1773 -12462:2:1774 -12463:2:1768 -12464:2:1769 -12465:2:1773 -12466:2:1774 -12467:2:1782 -12468:2:1787 -12469:2:1791 -12470:2:1792 -12471:2:1799 -12472:2:1800 -12473:2:1811 -12474:2:1812 -12475:2:1813 -12476:2:1811 -12477:2:1812 -12478:2:1813 -12479:2:1824 -12480:2:1829 -12481:2:1830 -12482:0:4365 -12483:2:1842 -12484:0:4365 -12485:3:3657 -12486:0:4365 -12487:2:1844 -12488:0:4365 -12489:3:3658 -12490:0:4365 -12491:2:1845 -12492:2:1849 -12493:2:1850 -12494:2:1858 -12495:2:1859 -12496:2:1863 -12497:2:1864 -12498:2:1858 -12499:2:1859 -12500:2:1863 -12501:2:1864 -12502:2:1872 -12503:2:1877 -12504:2:1881 -12505:2:1882 -12506:2:1889 -12507:2:1890 -12508:2:1901 -12509:2:1902 -12510:2:1903 -12511:2:1901 -12512:2:1902 -12513:2:1903 -12514:2:1914 -12515:2:1919 -12516:2:1920 -12517:0:4365 -12518:2:1932 -12519:0:4365 -12520:3:3657 -12521:0:4365 -12522:2:1934 -12523:0:4365 -12524:3:3658 -12525:0:4365 -12526:2:1935 -12527:0:4365 -12528:2:1936 -12529:0:4365 -12530:2:2129 -12531:0:4365 -12532:2:2130 -12533:0:4365 -12534:2:2134 -12535:0:4365 -12536:3:3657 -12537:0:4365 -12538:2:2136 -12539:0:4365 -12540:3:3658 -12541:0:4365 -12542:2:2137 -12543:2:2141 -12544:2:2142 -12545:2:2150 -12546:2:2151 -12547:2:2155 -12548:2:2156 -12549:2:2150 -12550:2:2151 -12551:2:2155 -12552:2:2156 -12553:2:2164 -12554:2:2169 -12555:2:2173 -12556:2:2174 -12557:2:2181 -12558:2:2182 -12559:2:2193 -12560:2:2194 -12561:2:2195 -12562:2:2193 -12563:2:2194 -12564:2:2195 -12565:2:2206 -12566:2:2211 -12567:2:2212 -12568:0:4365 -12569:2:2224 -12570:0:4365 -12571:3:3657 -12572:0:4365 -12573:2:2226 -12574:0:4365 -12575:3:3658 -12576:0:4365 -12577:2:1936 -12578:0:4365 -12579:2:2129 -12580:0:4365 -12581:2:2130 -12582:0:4365 -12583:2:2134 -12584:0:4365 -12585:3:3657 -12586:0:4365 -12587:2:2136 -12588:0:4365 -12589:3:3658 -12590:0:4365 -12591:2:2137 -12592:2:2141 -12593:2:2142 -12594:2:2150 -12595:2:2151 -12596:2:2155 -12597:2:2156 -12598:2:2150 -12599:2:2151 -12600:2:2152 -12601:2:2164 -12602:2:2169 -12603:2:2173 -12604:2:2174 -12605:2:2181 -12606:2:2182 -12607:2:2193 -12608:2:2194 -12609:2:2195 -12610:2:2193 -12611:2:2194 -12612:2:2195 -12613:2:2206 -12614:2:2211 -12615:2:2212 -12616:0:4365 -12617:2:2224 -12618:0:4365 -12619:3:3657 -12620:0:4365 -12621:2:2226 -12622:0:4365 -12623:3:3658 -12624:0:4365 -12625:2:2230 -12626:0:4365 -12627:3:3657 -12628:0:4365 -12629:2:2235 -12630:2:2239 -12631:2:2240 -12632:2:2248 -12633:2:2249 -12634:2:2253 -12635:2:2254 -12636:2:2248 -12637:2:2249 -12638:2:2250 -12639:2:2262 -12640:2:2267 -12641:2:2271 -12642:2:2272 -12643:2:2279 -12644:2:2280 -12645:2:2291 -12646:2:2292 -12647:2:2293 -12648:2:2291 -12649:2:2292 -12650:2:2293 -12651:2:2304 -12652:2:2309 -12653:2:2310 -12654:0:4365 -12655:3:3658 -12656:0:4365 -12657:2:2322 -12658:0:4365 -12659:2:1169 -12660:0:4365 -12661:3:3657 -12662:0:4365 -12663:2:1170 -12664:0:4365 -12665:3:3658 -12666:0:4365 -12667:3:3659 -12668:0:4365 -12669:3:3665 -12670:0:4365 -12671:3:3666 -12672:0:4365 -12673:3:3667 -12674:0:4365 -12675:3:3668 -12676:0:4365 -12677:3:3669 -12678:3:3673 -12679:3:3674 -12680:3:3682 -12681:3:3683 -12682:3:3687 -12683:3:3688 -12684:3:3682 -12685:3:3683 -12686:3:3687 -12687:3:3688 -12688:3:3696 -12689:3:3701 -12690:3:3705 -12691:3:3706 -12692:3:3713 -12693:3:3714 -12694:3:3725 -12695:3:3726 -12696:3:3727 -12697:3:3725 -12698:3:3726 -12699:3:3727 -12700:3:3738 -12701:3:3743 -12702:3:3744 -12703:0:4365 -12704:3:3756 -12705:0:4365 -12706:3:3757 -12707:0:4365 -12708:2:1173 -12709:0:4365 -12710:3:3758 -12711:0:4365 -12712:2:1179 -12713:0:4365 -12714:2:1180 -12715:0:4365 -12716:3:3757 -12717:0:4365 -12718:2:1181 -12719:2:1185 -12720:2:1186 -12721:2:1194 -12722:2:1195 -12723:2:1199 -12724:2:1200 -12725:2:1194 -12726:2:1195 -12727:2:1199 -12728:2:1200 -12729:2:1208 -12730:2:1213 -12731:2:1217 -12732:2:1218 -12733:2:1225 -12734:2:1226 -12735:2:1237 -12736:2:1238 -12737:2:1239 -12738:2:1237 -12739:2:1238 -12740:2:1239 -12741:2:1250 -12742:2:1255 -12743:2:1256 -12744:0:4365 -12745:3:3758 -12746:0:4365 -12747:2:1268 -12748:0:4365 -12749:3:3757 -12750:0:4365 -12751:2:1270 -12752:0:4365 -12753:3:3758 -12754:0:4365 -12755:2:1271 -12756:2:1275 -12757:2:1276 -12758:2:1284 -12759:2:1285 -12760:2:1289 -12761:2:1290 -12762:2:1284 -12763:2:1285 -12764:2:1289 -12765:2:1290 -12766:2:1298 -12767:2:1303 -12768:2:1307 -12769:2:1308 -12770:2:1315 -12771:2:1316 -12772:2:1327 -12773:2:1328 -12774:2:1329 -12775:2:1327 -12776:2:1328 -12777:2:1329 -12778:2:1340 -12779:2:1345 -12780:2:1346 -12781:0:4365 -12782:2:1358 -12783:0:4365 -12784:2:1360 -12785:0:4365 -12786:3:3757 -12787:0:4365 -12788:2:1361 -12789:0:4365 -12790:3:3758 -12791:0:4365 -12792:2:1362 -12793:2:1366 -12794:2:1367 -12795:2:1375 -12796:2:1376 -12797:2:1380 -12798:2:1381 -12799:2:1375 -12800:2:1376 -12801:2:1380 -12802:2:1381 -12803:2:1389 -12804:2:1394 -12805:2:1398 -12806:2:1399 -12807:2:1406 -12808:2:1407 -12809:2:1418 -12810:2:1419 -12811:2:1420 -12812:2:1418 -12813:2:1419 -12814:2:1420 -12815:2:1431 -12816:2:1436 -12817:2:1437 -12818:0:4365 -12819:2:1449 -12820:0:4365 -12821:3:3757 -12822:0:4365 -12823:2:1451 -12824:0:4365 -12825:3:3758 -12826:0:4365 -12827:2:1652 -12828:0:4365 -12829:2:1653 -12830:0:4365 -12831:2:1657 -12832:0:4365 -12833:2:1180 -12834:0:4365 -12835:3:3757 -12836:0:4365 -12837:2:1181 -12838:2:1185 -12839:2:1186 -12840:2:1194 -12841:2:1195 -12842:2:1199 -12843:2:1200 -12844:2:1194 -12845:2:1195 -12846:2:1196 -12847:2:1208 -12848:2:1213 -12849:2:1217 -12850:2:1218 -12851:2:1225 -12852:2:1226 -12853:2:1237 -12854:2:1238 -12855:2:1239 -12856:2:1237 -12857:2:1238 -12858:2:1239 -12859:2:1250 -12860:2:1255 -12861:2:1256 -12862:0:4365 -12863:3:3758 -12864:0:4365 -12865:2:1268 -12866:0:4365 -12867:3:3757 -12868:0:4365 -12869:2:1270 -12870:0:4365 -12871:3:3758 -12872:0:4365 -12873:2:1271 -12874:2:1275 -12875:2:1276 -12876:2:1284 -12877:2:1285 -12878:2:1289 -12879:2:1290 -12880:2:1284 -12881:2:1285 -12882:2:1289 -12883:2:1290 -12884:2:1298 -12885:2:1303 -12886:2:1307 -12887:2:1308 -12888:2:1315 -12889:2:1316 -12890:2:1327 -12891:2:1328 -12892:2:1329 -12893:2:1327 -12894:2:1328 -12895:2:1329 -12896:2:1340 -12897:2:1345 -12898:2:1346 -12899:0:4365 -12900:2:1358 -12901:0:4365 -12902:2:1454 -12903:0:4365 -12904:3:3757 -12905:0:4365 -12906:2:1455 -12907:0:4365 -12908:3:3758 -12909:0:4365 -12910:2:1652 -12911:0:4365 -12912:2:1653 -12913:0:4365 -12914:2:1657 -12915:0:4365 -12916:2:1660 -12917:0:4365 -12918:3:3757 -12919:0:4365 -12920:2:1665 -12921:2:1669 -12922:2:1670 -12923:2:1678 -12924:2:1679 -12925:2:1683 -12926:2:1684 -12927:2:1678 -12928:2:1679 -12929:2:1680 -12930:2:1692 -12931:2:1697 -12932:2:1701 -12933:2:1702 -12934:2:1709 -12935:2:1710 -12936:2:1721 -12937:2:1722 -12938:2:1723 -12939:2:1721 -12940:2:1722 -12941:2:1723 -12942:2:1734 -12943:2:1739 -12944:2:1740 -12945:0:4365 -12946:3:3758 -12947:0:4365 -12948:2:1752 -12949:0:4365 -12950:3:3757 -12951:0:4365 -12952:2:1754 -12953:0:4365 -12954:3:3758 -12955:0:4365 -12956:2:1755 -12957:2:1759 -12958:2:1760 -12959:2:1768 -12960:2:1769 -12961:2:1773 -12962:2:1774 -12963:2:1768 -12964:2:1769 -12965:2:1773 -12966:2:1774 -12967:2:1782 -12968:2:1787 -12969:2:1791 -12970:2:1792 -12971:2:1799 -12972:2:1800 -12973:2:1811 -12974:2:1812 -12975:2:1813 -12976:2:1811 -12977:2:1812 -12978:2:1813 -12979:2:1824 -12980:2:1829 -12981:2:1830 -12982:0:4365 -12983:2:1842 -12984:0:4365 -12985:3:3757 -12986:0:4365 -12987:2:1844 -12988:0:4365 -12989:3:3758 -12990:0:4365 -12991:2:1845 -12992:2:1849 -12993:2:1850 -12994:2:1858 -12995:2:1859 -12996:2:1863 -12997:2:1864 -12998:2:1858 -12999:2:1859 -13000:2:1863 -13001:2:1864 -13002:2:1872 -13003:2:1877 -13004:2:1881 -13005:2:1882 -13006:2:1889 -13007:2:1890 -13008:2:1901 -13009:2:1902 -13010:2:1903 -13011:2:1901 -13012:2:1902 -13013:2:1903 -13014:2:1914 -13015:2:1919 -13016:2:1920 -13017:0:4365 -13018:2:1932 -13019:0:4365 -13020:3:3757 -13021:0:4365 -13022:2:1934 -13023:0:4365 -13024:3:3758 -13025:0:4365 -13026:2:1935 -13027:0:4365 -13028:2:1936 -13029:0:4365 -13030:2:2129 -13031:0:4365 -13032:2:2130 -13033:0:4365 -13034:2:2134 -13035:0:4365 -13036:3:3757 -13037:0:4365 -13038:2:2136 -13039:0:4365 -13040:3:3758 -13041:0:4365 -13042:2:2137 -13043:2:2141 -13044:2:2142 -13045:2:2150 -13046:2:2151 -13047:2:2155 -13048:2:2156 -13049:2:2150 -13050:2:2151 -13051:2:2155 -13052:2:2156 -13053:2:2164 -13054:2:2169 -13055:2:2173 -13056:2:2174 -13057:2:2181 -13058:2:2182 -13059:2:2193 -13060:2:2194 -13061:2:2195 -13062:2:2193 -13063:2:2194 -13064:2:2195 -13065:2:2206 -13066:2:2211 -13067:2:2212 -13068:0:4365 -13069:2:2224 -13070:0:4365 -13071:3:3757 -13072:0:4365 -13073:2:2226 -13074:0:4365 -13075:3:3758 -13076:0:4365 -13077:2:1936 -13078:0:4365 -13079:2:2129 -13080:0:4365 -13081:2:2130 -13082:0:4365 -13083:2:2134 -13084:0:4365 -13085:3:3757 -13086:0:4365 -13087:2:2136 -13088:0:4365 -13089:3:3758 -13090:0:4365 -13091:2:2137 -13092:2:2141 -13093:2:2142 -13094:2:2150 -13095:2:2151 -13096:2:2155 -13097:2:2156 -13098:2:2150 -13099:2:2151 -13100:2:2152 -13101:2:2164 -13102:2:2169 -13103:2:2173 -13104:2:2174 -13105:2:2181 -13106:2:2182 -13107:2:2193 -13108:2:2194 -13109:2:2195 -13110:2:2193 -13111:2:2194 -13112:2:2195 -13113:2:2206 -13114:2:2211 -13115:2:2212 -13116:0:4365 -13117:2:2224 -13118:0:4365 -13119:3:3757 -13120:0:4365 -13121:2:2226 -13122:0:4365 -13123:3:3758 -13124:0:4365 -13125:2:2230 -13126:0:4365 -13127:3:3757 -13128:0:4365 -13129:2:2235 -13130:2:2239 -13131:2:2240 -13132:2:2248 -13133:2:2249 -13134:2:2253 -13135:2:2254 -13136:2:2248 -13137:2:2249 -13138:2:2250 -13139:2:2262 -13140:2:2267 -13141:2:2271 -13142:2:2272 -13143:2:2279 -13144:2:2280 -13145:2:2291 -13146:2:2292 -13147:2:2293 -13148:2:2291 -13149:2:2292 -13150:2:2293 -13151:2:2304 -13152:2:2309 -13153:2:2310 -13154:0:4365 -13155:3:3758 -13156:0:4365 -13157:2:2322 -13158:0:4365 -13159:2:1169 -13160:0:4365 -13161:3:3757 -13162:0:4365 -13163:2:1170 -13164:0:4365 -13165:3:3758 -13166:0:4365 -13167:3:3759 -13168:0:4365 -13169:3:3972 -13170:0:4365 -13171:3:3980 -13172:0:4365 -13173:3:3981 -13174:3:3985 -13175:3:3986 -13176:3:3994 -13177:3:3995 -13178:3:3999 -13179:3:4000 -13180:3:3994 -13181:3:3995 -13182:3:3999 -13183:3:4000 -13184:3:4008 -13185:3:4013 -13186:3:4017 -13187:3:4018 -13188:3:4025 -13189:3:4026 -13190:3:4037 -13191:3:4038 -13192:3:4039 -13193:3:4037 -13194:3:4038 -13195:3:4039 -13196:3:4050 -13197:3:4055 -13198:3:4056 -13199:0:4365 -13200:3:4068 -13201:0:4365 -13202:3:4069 -13203:0:4365 -13204:2:1173 -13205:0:4365 -13206:3:4070 -13207:0:4365 -13208:2:1179 -13209:0:4365 -13210:2:1180 -13211:0:4365 -13212:3:4069 -13213:0:4365 -13214:2:1181 -13215:2:1185 -13216:2:1186 -13217:2:1194 -13218:2:1195 -13219:2:1199 -13220:2:1200 -13221:2:1194 -13222:2:1195 -13223:2:1199 -13224:2:1200 -13225:2:1208 -13226:2:1213 -13227:2:1217 -13228:2:1218 -13229:2:1225 -13230:2:1226 -13231:2:1237 -13232:2:1238 -13233:2:1239 -13234:2:1237 -13235:2:1238 -13236:2:1239 -13237:2:1250 -13238:2:1255 -13239:2:1256 -13240:0:4365 -13241:3:4070 -13242:0:4365 -13243:2:1268 -13244:0:4365 -13245:3:4069 -13246:0:4365 -13247:2:1270 -13248:0:4365 -13249:3:4070 -13250:0:4365 -13251:2:1271 -13252:2:1275 -13253:2:1276 -13254:2:1284 -13255:2:1285 -13256:2:1289 -13257:2:1290 -13258:2:1284 -13259:2:1285 -13260:2:1289 -13261:2:1290 -13262:2:1298 -13263:2:1303 -13264:2:1307 -13265:2:1308 -13266:2:1315 -13267:2:1316 -13268:2:1327 -13269:2:1328 -13270:2:1329 -13271:2:1327 -13272:2:1328 -13273:2:1329 -13274:2:1340 -13275:2:1345 -13276:2:1346 -13277:0:4365 -13278:2:1358 -13279:0:4365 -13280:2:1360 -13281:0:4365 -13282:3:4069 -13283:0:4365 -13284:2:1361 -13285:0:4365 -13286:3:4070 -13287:0:4365 -13288:2:1362 -13289:2:1366 -13290:2:1367 -13291:2:1375 -13292:2:1376 -13293:2:1380 -13294:2:1381 -13295:2:1375 -13296:2:1376 -13297:2:1380 -13298:2:1381 -13299:2:1389 -13300:2:1394 -13301:2:1398 -13302:2:1399 -13303:2:1406 -13304:2:1407 -13305:2:1418 -13306:2:1419 -13307:2:1420 -13308:2:1418 -13309:2:1419 -13310:2:1420 -13311:2:1431 -13312:2:1436 -13313:2:1437 -13314:0:4365 -13315:2:1449 -13316:0:4365 -13317:3:4069 -13318:0:4365 -13319:2:1451 -13320:0:4365 -13321:3:4070 -13322:0:4365 -13323:2:1652 -13324:0:4365 -13325:2:1653 -13326:0:4365 -13327:2:1657 -13328:0:4365 -13329:2:1180 -13330:0:4365 -13331:3:4069 -13332:0:4365 -13333:2:1181 -13334:2:1185 -13335:2:1186 -13336:2:1194 -13337:2:1195 -13338:2:1199 -13339:2:1200 -13340:2:1194 -13341:2:1195 -13342:2:1196 -13343:2:1208 -13344:2:1213 -13345:2:1217 -13346:2:1218 -13347:2:1225 -13348:2:1226 -13349:2:1237 -13350:2:1238 -13351:2:1239 -13352:2:1237 -13353:2:1238 -13354:2:1239 -13355:2:1250 -13356:2:1255 -13357:2:1256 -13358:0:4365 -13359:3:4070 -13360:0:4365 -13361:2:1268 -13362:0:4365 -13363:3:4069 -13364:0:4365 -13365:2:1270 -13366:0:4365 -13367:3:4070 -13368:0:4365 -13369:2:1271 -13370:2:1275 -13371:2:1276 -13372:2:1284 -13373:2:1285 -13374:2:1289 -13375:2:1290 -13376:2:1284 -13377:2:1285 -13378:2:1289 -13379:2:1290 -13380:2:1298 -13381:2:1303 -13382:2:1307 -13383:2:1308 -13384:2:1315 -13385:2:1316 -13386:2:1327 -13387:2:1328 -13388:2:1329 -13389:2:1327 -13390:2:1328 -13391:2:1329 -13392:2:1340 -13393:2:1345 -13394:2:1346 -13395:0:4365 -13396:2:1358 -13397:0:4365 -13398:2:1454 -13399:0:4365 -13400:3:4069 -13401:0:4365 -13402:2:1455 -13403:0:4365 -13404:3:4070 -13405:0:4365 -13406:2:1652 -13407:0:4365 -13408:2:1653 -13409:0:4365 -13410:2:1657 -13411:0:4365 -13412:2:1660 -13413:0:4365 -13414:3:4069 -13415:0:4365 -13416:2:1665 -13417:2:1669 -13418:2:1670 -13419:2:1678 -13420:2:1679 -13421:2:1683 -13422:2:1684 -13423:2:1678 -13424:2:1679 -13425:2:1680 -13426:2:1692 -13427:2:1697 -13428:2:1701 -13429:2:1702 -13430:2:1709 -13431:2:1710 -13432:2:1721 -13433:2:1722 -13434:2:1723 -13435:2:1721 -13436:2:1722 -13437:2:1723 -13438:2:1734 -13439:2:1739 -13440:2:1740 -13441:0:4365 -13442:3:4070 -13443:0:4365 -13444:2:1752 -13445:0:4365 -13446:3:4069 -13447:0:4365 -13448:2:1754 -13449:0:4365 -13450:3:4070 -13451:0:4365 -13452:2:1755 -13453:2:1759 -13454:2:1760 -13455:2:1768 -13456:2:1769 -13457:2:1773 -13458:2:1774 -13459:2:1768 -13460:2:1769 -13461:2:1773 -13462:2:1774 -13463:2:1782 -13464:2:1787 -13465:2:1791 -13466:2:1792 -13467:2:1799 -13468:2:1800 -13469:2:1811 -13470:2:1812 -13471:2:1813 -13472:2:1811 -13473:2:1812 -13474:2:1813 -13475:2:1824 -13476:2:1829 -13477:2:1830 -13478:0:4365 -13479:2:1842 -13480:0:4365 -13481:3:4069 -13482:0:4365 -13483:2:1844 -13484:0:4365 -13485:3:4070 -13486:0:4365 -13487:2:1845 -13488:2:1849 -13489:2:1850 -13490:2:1858 -13491:2:1859 -13492:2:1863 -13493:2:1864 -13494:2:1858 -13495:2:1859 -13496:2:1863 -13497:2:1864 -13498:2:1872 -13499:2:1877 -13500:2:1881 -13501:2:1882 -13502:2:1889 -13503:2:1890 -13504:2:1901 -13505:2:1902 -13506:2:1903 -13507:2:1901 -13508:2:1902 -13509:2:1903 -13510:2:1914 -13511:2:1919 -13512:2:1920 -13513:0:4365 -13514:2:1932 -13515:0:4365 -13516:3:4069 -13517:0:4365 -13518:2:1934 -13519:0:4365 -13520:3:4070 -13521:0:4365 -13522:2:1935 -13523:0:4365 -13524:2:1936 -13525:0:4365 -13526:2:2129 -13527:0:4365 -13528:2:2130 -13529:0:4365 -13530:2:2134 -13531:0:4365 -13532:3:4069 -13533:0:4365 -13534:2:2136 -13535:0:4365 -13536:3:4070 -13537:0:4365 -13538:2:2137 -13539:2:2141 -13540:2:2142 -13541:2:2150 -13542:2:2151 -13543:2:2155 -13544:2:2156 -13545:2:2150 -13546:2:2151 -13547:2:2155 -13548:2:2156 -13549:2:2164 -13550:2:2169 -13551:2:2173 -13552:2:2174 -13553:2:2181 -13554:2:2182 -13555:2:2193 -13556:2:2194 -13557:2:2195 -13558:2:2193 -13559:2:2194 -13560:2:2195 -13561:2:2206 -13562:2:2211 -13563:2:2212 -13564:0:4365 -13565:2:2224 -13566:0:4365 -13567:3:4069 -13568:0:4365 -13569:2:2226 -13570:0:4365 -13571:3:4070 -13572:0:4365 -13573:2:1936 -13574:0:4365 -13575:2:2129 -13576:0:4365 -13577:2:2130 -13578:0:4365 -13579:2:2134 -13580:0:4365 -13581:3:4069 -13582:0:4365 -13583:2:2136 -13584:0:4365 -13585:3:4070 -13586:0:4365 -13587:2:2137 -13588:2:2141 -13589:2:2142 -13590:2:2150 -13591:2:2151 -13592:2:2155 -13593:2:2156 -13594:2:2150 -13595:2:2151 -13596:2:2152 -13597:2:2164 -13598:2:2169 -13599:2:2173 -13600:2:2174 -13601:2:2181 -13602:2:2182 -13603:2:2193 -13604:2:2194 -13605:2:2195 -13606:2:2193 -13607:2:2194 -13608:2:2195 -13609:2:2206 -13610:2:2211 -13611:2:2212 -13612:0:4365 -13613:2:2224 -13614:0:4365 -13615:3:4069 -13616:0:4365 -13617:2:2226 -13618:0:4365 -13619:3:4070 -13620:0:4365 -13621:2:2230 -13622:0:4365 -13623:3:4069 -13624:0:4365 -13625:2:2235 -13626:2:2239 -13627:2:2240 -13628:2:2248 -13629:2:2249 -13630:2:2253 -13631:2:2254 -13632:2:2248 -13633:2:2249 -13634:2:2250 -13635:2:2262 -13636:2:2267 -13637:2:2271 -13638:2:2272 -13639:2:2279 -13640:2:2280 -13641:2:2291 -13642:2:2292 -13643:2:2293 -13644:2:2291 -13645:2:2292 -13646:2:2293 -13647:2:2304 -13648:2:2309 -13649:2:2310 -13650:0:4365 -13651:3:4070 -13652:0:4365 -13653:2:2322 -13654:0:4365 -13655:2:1169 -13656:0:4365 -13657:3:4069 -13658:0:4365 -13659:2:1170 -13660:0:4365 -13661:3:4070 -13662:0:4365 -13663:3:4071 -13664:0:4365 -13665:3:4081 -13666:0:4365 -13667:3:3666 -13668:0:4365 -13669:3:3667 -13670:0:4365 -13671:3:3668 -13672:0:4365 -13673:3:3669 -13674:3:3673 -13675:3:3674 -13676:3:3682 -13677:3:3683 -13678:3:3687 -13679:3:3688 -13680:3:3682 -13681:3:3683 -13682:3:3687 -13683:3:3688 -13684:3:3696 -13685:3:3701 -13686:3:3705 -13687:3:3706 -13688:3:3713 -13689:3:3714 -13690:3:3725 -13691:3:3726 -13692:3:3727 -13693:3:3725 -13694:3:3726 -13695:3:3727 -13696:3:3738 -13697:3:3743 -13698:3:3744 -13699:0:4365 -13700:3:3756 -13701:0:4365 -13702:3:3757 -13703:0:4365 -13704:2:1173 -13705:0:4365 -13706:3:3758 -13707:0:4365 -13708:2:1179 -13709:0:4365 -13710:2:1180 -13711:0:4365 -13712:3:3757 -13713:0:4365 -13714:2:1181 -13715:2:1185 -13716:2:1186 -13717:2:1194 -13718:2:1195 -13719:2:1199 -13720:2:1200 -13721:2:1194 -13722:2:1195 -13723:2:1199 -13724:2:1200 -13725:2:1208 -13726:2:1213 -13727:2:1217 -13728:2:1218 -13729:2:1225 -13730:2:1226 -13731:2:1237 -13732:2:1238 -13733:2:1239 -13734:2:1237 -13735:2:1238 -13736:2:1239 -13737:2:1250 -13738:2:1255 -13739:2:1256 -13740:0:4365 -13741:3:3758 -13742:0:4365 -13743:2:1268 -13744:0:4365 -13745:3:3757 -13746:0:4365 -13747:2:1270 -13748:0:4365 -13749:3:3758 -13750:0:4365 -13751:2:1271 -13752:2:1275 -13753:2:1276 -13754:2:1284 -13755:2:1285 -13756:2:1289 -13757:2:1290 -13758:2:1284 -13759:2:1285 -13760:2:1289 -13761:2:1290 -13762:2:1298 -13763:2:1303 -13764:2:1307 -13765:2:1308 -13766:2:1315 -13767:2:1316 -13768:2:1327 -13769:2:1328 -13770:2:1329 -13771:2:1327 -13772:2:1328 -13773:2:1329 -13774:2:1340 -13775:2:1345 -13776:2:1346 -13777:0:4365 -13778:2:1358 -13779:0:4365 -13780:2:1360 -13781:0:4365 -13782:3:3757 -13783:0:4365 -13784:2:1361 -13785:0:4365 -13786:3:3758 -13787:0:4365 -13788:2:1362 -13789:2:1366 -13790:2:1367 -13791:2:1375 -13792:2:1376 -13793:2:1380 -13794:2:1381 -13795:2:1375 -13796:2:1376 -13797:2:1380 -13798:2:1381 -13799:2:1389 -13800:2:1394 -13801:2:1398 -13802:2:1399 -13803:2:1406 -13804:2:1407 -13805:2:1418 -13806:2:1419 -13807:2:1420 -13808:2:1418 -13809:2:1419 -13810:2:1420 -13811:2:1431 -13812:2:1436 -13813:2:1437 -13814:0:4365 -13815:2:1449 -13816:0:4365 -13817:3:3757 -13818:0:4365 -13819:2:1451 -13820:0:4365 -13821:3:3758 -13822:0:4365 -13823:2:1652 -13824:0:4365 -13825:2:1653 -13826:0:4365 -13827:2:1657 -13828:0:4365 -13829:2:1180 -13830:0:4365 -13831:3:3757 -13832:0:4365 -13833:2:1181 -13834:2:1185 -13835:2:1186 -13836:2:1194 -13837:2:1195 -13838:2:1199 -13839:2:1200 -13840:2:1194 -13841:2:1195 -13842:2:1196 -13843:2:1208 -13844:2:1213 -13845:2:1217 -13846:2:1218 -13847:2:1225 -13848:2:1226 -13849:2:1237 -13850:2:1238 -13851:2:1239 -13852:2:1237 -13853:2:1238 -13854:2:1239 -13855:2:1250 -13856:2:1255 -13857:2:1256 -13858:0:4365 -13859:3:3758 -13860:0:4365 -13861:2:1268 -13862:0:4365 -13863:3:3757 -13864:0:4365 -13865:2:1270 -13866:0:4365 -13867:3:3758 -13868:0:4365 -13869:2:1271 -13870:2:1275 -13871:2:1276 -13872:2:1284 -13873:2:1285 -13874:2:1289 -13875:2:1290 -13876:2:1284 -13877:2:1285 -13878:2:1289 -13879:2:1290 -13880:2:1298 -13881:2:1303 -13882:2:1307 -13883:2:1308 -13884:2:1315 -13885:2:1316 -13886:2:1327 -13887:2:1328 -13888:2:1329 -13889:2:1327 -13890:2:1328 -13891:2:1329 -13892:2:1340 -13893:2:1345 -13894:2:1346 -13895:0:4365 -13896:2:1358 -13897:0:4365 -13898:2:1454 -13899:0:4365 -13900:3:3757 -13901:0:4365 -13902:2:1455 -13903:0:4365 -13904:3:3758 -13905:0:4365 -13906:2:1652 -13907:0:4365 -13908:2:1653 -13909:0:4365 -13910:2:1657 -13911:0:4365 -13912:2:1660 -13913:0:4365 -13914:3:3757 -13915:0:4365 -13916:2:1665 -13917:2:1669 -13918:2:1670 -13919:2:1678 -13920:2:1679 -13921:2:1683 -13922:2:1684 -13923:2:1678 -13924:2:1679 -13925:2:1680 -13926:2:1692 -13927:2:1697 -13928:2:1701 -13929:2:1702 -13930:2:1709 -13931:2:1710 -13932:2:1721 -13933:2:1722 -13934:2:1723 -13935:2:1721 -13936:2:1722 -13937:2:1723 -13938:2:1734 -13939:2:1739 -13940:2:1740 -13941:0:4365 -13942:3:3758 -13943:0:4365 -13944:2:1752 -13945:0:4365 -13946:3:3757 -13947:0:4365 -13948:2:1754 -13949:0:4365 -13950:3:3758 -13951:0:4365 -13952:2:1755 -13953:2:1759 -13954:2:1760 -13955:2:1768 -13956:2:1769 -13957:2:1773 -13958:2:1774 -13959:2:1768 -13960:2:1769 -13961:2:1773 -13962:2:1774 -13963:2:1782 -13964:2:1787 -13965:2:1791 -13966:2:1792 -13967:2:1799 -13968:2:1800 -13969:2:1811 -13970:2:1812 -13971:2:1813 -13972:2:1811 -13973:2:1812 -13974:2:1813 -13975:2:1824 -13976:2:1829 -13977:2:1830 -13978:0:4365 -13979:2:1842 -13980:0:4365 -13981:3:3757 -13982:0:4365 -13983:2:1844 -13984:0:4365 -13985:3:3758 -13986:0:4365 -13987:2:1845 -13988:2:1849 -13989:2:1850 -13990:2:1858 -13991:2:1859 -13992:2:1863 -13993:2:1864 -13994:2:1858 -13995:2:1859 -13996:2:1863 -13997:2:1864 -13998:2:1872 -13999:2:1877 -14000:2:1881 -14001:2:1882 -14002:2:1889 -14003:2:1890 -14004:2:1901 -14005:2:1902 -14006:2:1903 -14007:2:1901 -14008:2:1902 -14009:2:1903 -14010:2:1914 -14011:2:1919 -14012:2:1920 -14013:0:4365 -14014:2:1932 -14015:0:4365 -14016:3:3757 -14017:0:4365 -14018:2:1934 -14019:0:4365 -14020:3:3758 -14021:0:4365 -14022:2:1935 -14023:0:4365 -14024:2:1936 -14025:0:4365 -14026:2:2129 -14027:0:4365 -14028:2:2130 -14029:0:4365 -14030:2:2134 -14031:0:4365 -14032:3:3757 -14033:0:4365 -14034:2:2136 -14035:0:4365 -14036:3:3758 -14037:0:4365 -14038:2:2137 -14039:2:2141 -14040:2:2142 -14041:2:2150 -14042:2:2151 -14043:2:2155 -14044:2:2156 -14045:2:2150 -14046:2:2151 -14047:2:2155 -14048:2:2156 -14049:2:2164 -14050:2:2169 -14051:2:2173 -14052:2:2174 -14053:2:2181 -14054:2:2182 -14055:2:2193 -14056:2:2194 -14057:2:2195 -14058:2:2193 -14059:2:2194 -14060:2:2195 -14061:2:2206 -14062:2:2211 -14063:2:2212 -14064:0:4365 -14065:2:2224 -14066:0:4365 -14067:3:3757 -14068:0:4365 -14069:2:2226 -14070:0:4365 -14071:3:3758 -14072:0:4365 -14073:2:1936 -14074:0:4365 -14075:2:2129 -14076:0:4365 -14077:2:2130 -14078:0:4365 -14079:2:2134 -14080:0:4365 -14081:3:3757 -14082:0:4365 -14083:2:2136 -14084:0:4365 -14085:3:3758 -14086:0:4365 -14087:2:2137 -14088:2:2141 -14089:2:2142 -14090:2:2150 -14091:2:2151 -14092:2:2155 -14093:2:2156 -14094:2:2150 -14095:2:2151 -14096:2:2152 -14097:2:2164 -14098:2:2169 -14099:2:2173 -14100:2:2174 -14101:2:2181 -14102:2:2182 -14103:2:2193 -14104:2:2194 -14105:2:2195 -14106:2:2193 -14107:2:2194 -14108:2:2195 -14109:2:2206 -14110:2:2211 -14111:2:2212 -14112:0:4365 -14113:2:2224 -14114:0:4365 -14115:3:3757 -14116:0:4365 -14117:2:2226 -14118:0:4365 -14119:3:3758 -14120:0:4365 -14121:2:2230 -14122:0:4365 -14123:3:3757 -14124:0:4365 -14125:2:2235 -14126:2:2239 -14127:2:2240 -14128:2:2248 -14129:2:2249 -14130:2:2253 -14131:2:2254 -14132:2:2248 -14133:2:2249 -14134:2:2250 -14135:2:2262 -14136:2:2267 -14137:2:2271 -14138:2:2272 -14139:2:2279 -14140:2:2280 -14141:2:2291 -14142:2:2292 -14143:2:2293 -14144:2:2291 -14145:2:2292 -14146:2:2293 -14147:2:2304 -14148:2:2309 -14149:2:2310 -14150:0:4365 -14151:3:3758 -14152:0:4365 -14153:2:2322 -14154:0:4365 -14155:2:1169 -14156:0:4365 -14157:3:3757 -14158:0:4365 -14159:2:1170 -14160:0:4365 -14161:3:3758 -14162:0:4365 -14163:3:3759 -14164:0:4365 -14165:3:3972 -14166:0:4365 -14167:3:4077 -14168:0:4365 -14169:3:4078 -14170:0:4365 -14171:3:4082 -14172:0:4365 -14173:3:4088 -14174:0:4365 -14175:3:4092 -14176:3:4093 -14177:3:4097 -14178:3:4101 -14179:3:4102 -14180:3:4097 -14181:3:4101 -14182:3:4102 -14183:3:4106 -14184:3:4114 -14185:3:4115 -14186:3:4120 -14187:3:4127 -14188:3:4128 -14189:3:4127 -14190:3:4128 -14191:3:4135 -14192:3:4140 -14193:0:4365 -14194:3:4151 -14195:0:4365 -14196:3:4155 -14197:3:4156 -14198:3:4160 -14199:3:4164 -14200:3:4165 -14201:3:4160 -14202:3:4164 -14203:3:4165 -14204:3:4169 -14205:3:4177 -14206:3:4178 -14207:3:4183 -14208:3:4190 -14209:3:4191 -14210:3:4190 -14211:3:4191 -14212:3:4198 -14213:3:4203 -14214:0:4365 -14215:3:4151 -14216:0:4365 -14217:3:4155 -14218:3:4156 -14219:3:4160 -14220:3:4164 -14221:3:4165 -14222:3:4160 -14223:3:4164 -14224:3:4165 -14225:3:4169 -14226:3:4177 -14227:3:4178 -14228:3:4183 -14229:3:4190 -14230:3:4191 -14231:3:4190 -14232:3:4191 -14233:3:4198 -14234:3:4203 -14235:0:4365 -14236:3:4214 -14237:0:4365 -14238:3:4222 -14239:3:4223 -14240:3:4227 -14241:3:4231 -14242:3:4232 -14243:3:4227 -14244:3:4231 -14245:3:4232 -14246:3:4236 -14247:3:4244 -14248:3:4245 -14249:3:4250 -14250:3:4257 -14251:3:4258 -14252:3:4257 -14253:3:4258 -14254:3:4265 -14255:3:4270 -14256:0:4365 -14257:3:4285 -14258:0:4365 -14259:3:4286 -14260:0:4365 -14261:2:1173 -14262:0:4365 -14263:3:4287 -14264:0:4365 -14265:2:1179 -14266:0:4365 -14267:2:1180 -14268:0:4365 -14269:3:4286 -14270:0:4365 -14271:2:1181 -14272:2:1185 -14273:2:1186 -14274:2:1194 -14275:2:1195 -14276:2:1199 -14277:2:1200 -14278:2:1194 -14279:2:1195 -14280:2:1199 -14281:2:1200 -14282:2:1208 -14283:2:1213 -14284:2:1217 -14285:2:1218 -14286:2:1225 -14287:2:1226 -14288:2:1237 -14289:2:1238 -14290:2:1239 -14291:2:1237 -14292:2:1238 -14293:2:1239 -14294:2:1250 -14295:2:1255 -14296:2:1256 -14297:0:4365 -14298:3:4287 -14299:0:4365 -14300:2:1268 -14301:0:4365 -14302:3:4286 -14303:0:4365 -14304:2:1270 -14305:0:4365 -14306:3:4287 -14307:0:4365 -14308:2:1271 -14309:2:1275 -14310:2:1276 -14311:2:1284 -14312:2:1285 -14313:2:1289 -14314:2:1290 -14315:2:1284 -14316:2:1285 -14317:2:1289 -14318:2:1290 -14319:2:1298 -14320:2:1303 -14321:2:1307 -14322:2:1308 -14323:2:1315 -14324:2:1316 -14325:2:1327 -14326:2:1328 -14327:2:1329 -14328:2:1327 -14329:2:1328 -14330:2:1329 -14331:2:1340 -14332:2:1345 -14333:2:1346 -14334:0:4365 -14335:2:1358 -14336:0:4365 -14337:2:1360 -14338:0:4365 -14339:3:4286 -14340:0:4365 -14341:2:1361 -14342:0:4365 -14343:3:4287 -14344:0:4365 -14345:2:1362 -14346:2:1366 -14347:2:1367 -14348:2:1375 -14349:2:1376 -14350:2:1380 -14351:2:1381 -14352:2:1375 -14353:2:1376 -14354:2:1380 -14355:2:1381 -14356:2:1389 -14357:2:1394 -14358:2:1398 -14359:2:1399 -14360:2:1406 -14361:2:1407 -14362:2:1418 -14363:2:1419 -14364:2:1420 -14365:2:1418 -14366:2:1419 -14367:2:1420 -14368:2:1431 -14369:2:1436 -14370:2:1437 -14371:0:4365 -14372:2:1449 -14373:0:4365 -14374:3:4286 -14375:0:4365 -14376:2:1451 -14377:0:4365 -14378:3:4287 -14379:0:4365 -14380:2:1652 -14381:0:4365 -14382:2:1653 -14383:0:4365 -14384:2:1657 -14385:0:4365 -14386:2:1180 -14387:0:4365 -14388:3:4286 -14389:0:4365 -14390:2:1181 -14391:2:1185 -14392:2:1186 -14393:2:1194 -14394:2:1195 -14395:2:1199 -14396:2:1200 -14397:2:1194 -14398:2:1195 -14399:2:1196 -14400:2:1208 -14401:2:1213 -14402:2:1217 -14403:2:1218 -14404:2:1225 -14405:2:1226 -14406:2:1237 -14407:2:1238 -14408:2:1239 -14409:2:1237 -14410:2:1238 -14411:2:1239 -14412:2:1250 -14413:2:1255 -14414:2:1256 -14415:0:4365 -14416:3:4287 -14417:0:4365 -14418:2:1268 -14419:0:4365 -14420:3:4286 -14421:0:4365 -14422:2:1270 -14423:0:4365 -14424:3:4287 -14425:0:4365 -14426:2:1271 -14427:2:1275 -14428:2:1276 -14429:2:1284 -14430:2:1285 -14431:2:1289 -14432:2:1290 -14433:2:1284 -14434:2:1285 -14435:2:1289 -14436:2:1290 -14437:2:1298 -14438:2:1303 -14439:2:1307 -14440:2:1308 -14441:2:1315 -14442:2:1316 -14443:2:1327 -14444:2:1328 -14445:2:1329 -14446:2:1327 -14447:2:1328 -14448:2:1329 -14449:2:1340 -14450:2:1345 -14451:2:1346 -14452:0:4365 -14453:2:1358 -14454:0:4365 -14455:2:1454 -14456:0:4365 -14457:3:4286 -14458:0:4365 -14459:2:1455 -14460:0:4365 -14461:3:4287 -14462:0:4365 -14463:2:1652 -14464:0:4365 -14465:2:1653 -14466:0:4365 -14467:2:1657 -14468:0:4365 -14469:2:1660 -14470:0:4365 -14471:3:4286 -14472:0:4365 -14473:2:1665 -14474:2:1669 -14475:2:1670 -14476:2:1678 -14477:2:1679 -14478:2:1683 -14479:2:1684 -14480:2:1678 -14481:2:1679 -14482:2:1680 -14483:2:1692 -14484:2:1697 -14485:2:1701 -14486:2:1702 -14487:2:1709 -14488:2:1710 -14489:2:1721 -14490:2:1722 -14491:2:1723 -14492:2:1721 -14493:2:1722 -14494:2:1723 -14495:2:1734 -14496:2:1739 -14497:2:1740 -14498:0:4365 -14499:3:4287 -14500:0:4365 -14501:2:1752 -14502:0:4365 -14503:3:4286 -14504:0:4365 -14505:2:1754 -14506:0:4365 -14507:3:4287 -14508:0:4365 -14509:2:1755 -14510:2:1759 -14511:2:1760 -14512:2:1768 -14513:2:1769 -14514:2:1773 -14515:2:1774 -14516:2:1768 -14517:2:1769 -14518:2:1773 -14519:2:1774 -14520:2:1782 -14521:2:1787 -14522:2:1791 -14523:2:1792 -14524:2:1799 -14525:2:1800 -14526:2:1811 -14527:2:1812 -14528:2:1813 -14529:2:1811 -14530:2:1812 -14531:2:1813 -14532:2:1824 -14533:2:1829 -14534:2:1830 -14535:0:4365 -14536:2:1842 -14537:0:4365 -14538:3:4286 -14539:0:4365 -14540:2:1844 -14541:0:4365 -14542:3:4287 -14543:0:4365 -14544:2:1845 -14545:2:1849 -14546:2:1850 -14547:2:1858 -14548:2:1859 -14549:2:1863 -14550:2:1864 -14551:2:1858 -14552:2:1859 -14553:2:1863 -14554:2:1864 -14555:2:1872 -14556:2:1877 -14557:2:1881 -14558:2:1882 -14559:2:1889 -14560:2:1890 -14561:2:1901 -14562:2:1902 -14563:2:1903 -14564:2:1901 -14565:2:1902 -14566:2:1903 -14567:2:1914 -14568:2:1919 -14569:2:1920 -14570:0:4365 -14571:2:1932 -14572:0:4365 -14573:3:4286 -14574:0:4365 -14575:2:1934 -14576:0:4365 -14577:3:4287 -14578:0:4365 -14579:2:1935 -14580:0:4365 -14581:2:1936 -14582:0:4365 -14583:2:2129 -14584:0:4365 -14585:2:2130 -14586:0:4365 -14587:2:2134 -14588:0:4365 -14589:3:4286 -14590:0:4365 -14591:2:2136 -14592:0:4365 -14593:3:4287 -14594:0:4365 -14595:2:2137 -14596:2:2141 -14597:2:2142 -14598:2:2150 -14599:2:2151 -14600:2:2155 -14601:2:2156 -14602:2:2150 -14603:2:2151 -14604:2:2155 -14605:2:2156 -14606:2:2164 -14607:2:2169 -14608:2:2173 -14609:2:2174 -14610:2:2181 -14611:2:2182 -14612:2:2193 -14613:2:2194 -14614:2:2195 -14615:2:2193 -14616:2:2194 -14617:2:2195 -14618:2:2206 -14619:2:2211 -14620:2:2212 -14621:0:4365 -14622:2:2224 -14623:0:4365 -14624:3:4286 -14625:0:4365 -14626:2:2226 -14627:0:4365 -14628:3:4287 -14629:0:4365 -14630:2:1936 -14631:0:4365 -14632:2:2129 -14633:0:4365 -14634:2:2130 -14635:0:4365 -14636:2:2134 -14637:0:4365 -14638:3:4286 -14639:0:4365 -14640:2:2136 -14641:0:4365 -14642:3:4287 -14643:0:4365 -14644:2:2137 -14645:2:2141 -14646:2:2142 -14647:2:2150 -14648:2:2151 -14649:2:2155 -14650:2:2156 -14651:2:2150 -14652:2:2151 -14653:2:2152 -14654:2:2164 -14655:2:2169 -14656:2:2173 -14657:2:2174 -14658:2:2181 -14659:2:2182 -14660:2:2193 -14661:2:2194 -14662:2:2195 -14663:2:2193 -14664:2:2194 -14665:2:2195 -14666:2:2206 -14667:2:2211 -14668:2:2212 -14669:0:4365 -14670:2:2224 -14671:0:4365 -14672:3:4286 -14673:0:4365 -14674:2:2226 -14675:0:4365 -14676:3:4287 -14677:0:4365 -14678:2:2230 -14679:0:4365 -14680:3:4286 -14681:0:4365 -14682:2:2235 -14683:2:2239 -14684:2:2240 -14685:2:2248 -14686:2:2249 -14687:2:2253 -14688:2:2254 -14689:2:2248 -14690:2:2249 -14691:2:2250 -14692:2:2262 -14693:2:2267 -14694:2:2271 -14695:2:2272 -14696:2:2279 -14697:2:2280 -14698:2:2291 -14699:2:2292 -14700:2:2293 -14701:2:2291 -14702:2:2292 -14703:2:2293 -14704:2:2304 -14705:2:2309 -14706:2:2310 -14707:0:4365 -14708:3:4287 -14709:0:4365 -14710:2:2322 -14711:0:4365 -14712:2:1169 -14713:0:4365 -14714:3:4286 -14715:0:4365 -14716:2:1170 -14717:0:4365 -14718:3:4287 -14719:0:4365 -14720:3:4288 -14721:0:4365 -14722:3:4294 -14723:0:4365 -14724:3:4295 -14725:0:4365 -14726:3:2338 -14727:0:4365 -14728:3:2339 -14729:3:2343 -14730:3:2344 -14731:3:2352 -14732:3:2353 -14733:3:2357 -14734:3:2358 -14735:3:2352 -14736:3:2353 -14737:3:2357 -14738:3:2358 -14739:3:2366 -14740:3:2371 -14741:3:2375 -14742:3:2376 -14743:3:2383 -14744:3:2384 -14745:3:2395 -14746:3:2396 -14747:3:2397 -14748:3:2395 -14749:3:2396 -14750:3:2397 -14751:3:2408 -14752:3:2413 -14753:3:2414 -14754:0:4365 -14755:3:2426 -14756:0:4365 -14757:3:2427 -14758:0:4365 -14759:2:1173 -14760:0:4365 -14761:3:2428 -14762:0:4365 -14763:2:1179 -14764:0:4365 -14765:2:1180 -14766:0:4365 -14767:3:2427 -14768:0:4365 -14769:2:1181 -14770:2:1185 -14771:2:1186 -14772:2:1194 -14773:2:1195 -14774:2:1199 -14775:2:1200 -14776:2:1194 -14777:2:1195 -14778:2:1199 -14779:2:1200 -14780:2:1208 -14781:2:1213 -14782:2:1217 -14783:2:1218 -14784:2:1225 -14785:2:1226 -14786:2:1237 -14787:2:1238 -14788:2:1239 -14789:2:1237 -14790:2:1238 -14791:2:1239 -14792:2:1250 -14793:2:1255 -14794:2:1256 -14795:0:4365 -14796:3:2428 -14797:0:4365 -14798:2:1268 -14799:0:4365 -14800:3:2427 -14801:0:4365 -14802:2:1270 -14803:0:4365 -14804:3:2428 -14805:0:4365 -14806:2:1271 -14807:2:1275 -14808:2:1276 -14809:2:1284 -14810:2:1285 -14811:2:1289 -14812:2:1290 -14813:2:1284 -14814:2:1285 -14815:2:1289 -14816:2:1290 -14817:2:1298 -14818:2:1303 -14819:2:1307 -14820:2:1308 -14821:2:1315 -14822:2:1316 -14823:2:1327 -14824:2:1328 -14825:2:1329 -14826:2:1327 -14827:2:1328 -14828:2:1329 -14829:2:1340 -14830:2:1345 -14831:2:1346 -14832:0:4365 -14833:2:1358 -14834:0:4365 -14835:2:1360 -14836:0:4365 -14837:3:2427 -14838:0:4365 -14839:2:1361 -14840:0:4365 -14841:3:2428 -14842:0:4365 -14843:2:1362 -14844:2:1366 -14845:2:1367 -14846:2:1375 -14847:2:1376 -14848:2:1380 -14849:2:1381 -14850:2:1375 -14851:2:1376 -14852:2:1380 -14853:2:1381 -14854:2:1389 -14855:2:1394 -14856:2:1398 -14857:2:1399 -14858:2:1406 -14859:2:1407 -14860:2:1418 -14861:2:1419 -14862:2:1420 -14863:2:1418 -14864:2:1419 -14865:2:1420 -14866:2:1431 -14867:2:1436 -14868:2:1437 -14869:0:4365 -14870:2:1449 -14871:0:4365 -14872:3:2427 -14873:0:4365 -14874:2:1451 -14875:0:4365 -14876:3:2428 -14877:0:4365 -14878:2:1652 -14879:0:4365 -14880:2:1653 -14881:0:4365 -14882:2:1657 -14883:0:4365 -14884:2:1180 -14885:0:4365 -14886:3:2427 -14887:0:4365 -14888:2:1181 -14889:2:1185 -14890:2:1186 -14891:2:1194 -14892:2:1195 -14893:2:1199 -14894:2:1200 -14895:2:1194 -14896:2:1195 -14897:2:1196 -14898:2:1208 -14899:2:1213 -14900:2:1217 -14901:2:1218 -14902:2:1225 -14903:2:1226 -14904:2:1237 -14905:2:1238 -14906:2:1239 -14907:2:1237 -14908:2:1238 -14909:2:1239 -14910:2:1250 -14911:2:1255 -14912:2:1256 -14913:0:4365 -14914:3:2428 -14915:0:4365 -14916:2:1268 -14917:0:4365 -14918:3:2427 -14919:0:4365 -14920:2:1270 -14921:0:4365 -14922:3:2428 -14923:0:4365 -14924:2:1271 -14925:2:1275 -14926:2:1276 -14927:2:1284 -14928:2:1285 -14929:2:1289 -14930:2:1290 -14931:2:1284 -14932:2:1285 -14933:2:1289 -14934:2:1290 -14935:2:1298 -14936:2:1303 -14937:2:1307 -14938:2:1308 -14939:2:1315 -14940:2:1316 -14941:2:1327 -14942:2:1328 -14943:2:1329 -14944:2:1327 -14945:2:1328 -14946:2:1329 -14947:2:1340 -14948:2:1345 -14949:2:1346 -14950:0:4365 -14951:2:1358 -14952:0:4365 -14953:2:1454 -14954:0:4365 -14955:3:2427 -14956:0:4365 -14957:2:1455 -14958:0:4365 -14959:3:2428 -14960:0:4365 -14961:2:1652 -14962:0:4365 -14963:2:1653 -14964:0:4365 -14965:2:1657 -14966:0:4365 -14967:2:1660 -14968:0:4365 -14969:3:2427 -14970:0:4365 -14971:2:1665 -14972:2:1669 -14973:2:1670 -14974:2:1678 -14975:2:1679 -14976:2:1683 -14977:2:1684 -14978:2:1678 -14979:2:1679 -14980:2:1680 -14981:2:1692 -14982:2:1697 -14983:2:1701 -14984:2:1702 -14985:2:1709 -14986:2:1710 -14987:2:1721 -14988:2:1722 -14989:2:1723 -14990:2:1721 -14991:2:1722 -14992:2:1723 -14993:2:1734 -14994:2:1739 -14995:2:1740 -14996:0:4365 -14997:3:2428 -14998:0:4365 -14999:2:1752 -15000:0:4365 -15001:3:2427 -15002:0:4365 -15003:2:1754 -15004:0:4365 -15005:3:2428 -15006:0:4365 -15007:2:1755 -15008:2:1759 -15009:2:1760 -15010:2:1768 -15011:2:1769 -15012:2:1773 -15013:2:1774 -15014:2:1768 -15015:2:1769 -15016:2:1773 -15017:2:1774 -15018:2:1782 -15019:2:1787 -15020:2:1791 -15021:2:1792 -15022:2:1799 -15023:2:1800 -15024:2:1811 -15025:2:1812 -15026:2:1813 -15027:2:1811 -15028:2:1812 -15029:2:1813 -15030:2:1824 -15031:2:1829 -15032:2:1830 -15033:0:4365 -15034:2:1842 -15035:0:4365 -15036:3:2427 -15037:0:4365 -15038:2:1844 -15039:0:4363 -15040:3:2428 -15041:0:4369 diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_nested.define b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_nested.define deleted file mode 100644 index 0fb59bd..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_nested.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_NEST_LEVEL 2 diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_nested.log b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_nested.log deleted file mode 100644 index d503334..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_nested.log +++ /dev/null @@ -1,20 +0,0 @@ -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_nested.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 742) -Depth= 3880 States= 1e+06 Transitions= 1.18e+07 Memory= 527.190 t= 9.48 R= 1e+05 -Depth= 3880 States= 2e+06 Transitions= 2.39e+07 Memory= 588.225 t= 19.6 R= 1e+05 -Depth= 3880 States= 3e+06 Transitions= 3.61e+07 Memory= 649.260 t= 30.3 R= 1e+05 diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_nested.spin.input b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_nested.spin.input deleted file mode 100644 index c94928c..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_nested.spin.input +++ /dev/null @@ -1,696 +0,0 @@ -#define READER_NEST_LEVEL 1 - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE -#define get_pid() ((_pid < 1) -> 0 : 1) -#elif defined(TEST_SIGNAL_ON_READ) -#define get_pid() ((_pid < 2) -> 0 : 1) -#else -#define get_pid() (_pid) -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - dispatch_sighand_read_exec(); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - dispatch_sighand_read_exec(); - data_access[get_readerid()] = 1; - ooo_mem(i); - dispatch_sighand_read_exec(); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - if - :: get_readerid() == 0 -> -progress_reader: - skip; - fi; -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - if - :: get_readerid() == 0 -> -progress_reader: - skip; - fi; -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_nested.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_nested.spin.input.trail deleted file mode 100644 index 6f29ad2..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_nested.spin.input.trail +++ /dev/null @@ -1,11161 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4365 -2:4:4317 -3:4:4320 -4:4:4320 -5:4:4320 -6:4:4323 -7:4:4331 -8:4:4331 -9:4:4331 -10:4:4334 -11:4:4340 -12:4:4344 -13:4:4344 -14:4:4344 -15:4:4347 -16:4:4340 -17:4:4344 -18:4:4344 -19:4:4344 -20:4:4347 -21:4:4355 -22:4:4359 -23:4:4360 -24:0:4365 -25:4:4362 -26:0:4365 -27:3:2331 -28:0:4365 -29:3:2337 -30:0:4365 -31:3:2338 -32:0:4365 -33:3:2339 -34:3:2343 -35:3:2344 -36:3:2352 -37:3:2353 -38:3:2357 -39:3:2358 -40:3:2352 -41:3:2353 -42:3:2357 -43:3:2358 -44:3:2366 -45:3:2371 -46:3:2375 -47:3:2376 -48:3:2383 -49:3:2384 -50:3:2395 -51:3:2396 -52:3:2397 -53:3:2395 -54:3:2396 -55:3:2397 -56:3:2408 -57:3:2413 -58:3:2414 -59:0:4365 -60:3:2426 -61:0:4365 -62:3:2427 -63:0:4365 -64:2:1162 -65:0:4365 -66:3:2428 -67:0:4365 -68:2:1168 -69:0:4365 -70:2:1169 -71:0:4365 -72:3:2427 -73:0:4365 -74:2:1170 -75:0:4365 -76:3:2428 -77:0:4365 -78:3:2429 -79:0:4365 -80:3:2435 -81:3:2436 -82:0:4365 -83:3:2440 -84:3:2444 -85:3:2445 -86:3:2453 -87:3:2454 -88:3:2458 -89:3:2459 -90:3:2453 -91:3:2454 -92:3:2458 -93:3:2459 -94:3:2467 -95:3:2472 -96:3:2473 -97:3:2484 -98:3:2485 -99:3:2496 -100:3:2497 -101:3:2498 -102:3:2496 -103:3:2497 -104:3:2498 -105:3:2509 -106:3:2514 -107:3:2515 -108:0:4365 -109:3:2527 -110:0:4365 -111:3:2528 -112:0:4365 -113:2:1173 -114:0:4365 -115:3:2529 -116:0:4365 -117:2:1179 -118:0:4365 -119:2:1180 -120:0:4365 -121:3:2528 -122:0:4365 -123:2:1181 -124:2:1185 -125:2:1186 -126:2:1194 -127:2:1195 -128:2:1199 -129:2:1200 -130:2:1194 -131:2:1195 -132:2:1199 -133:2:1200 -134:2:1208 -135:2:1213 -136:2:1217 -137:2:1218 -138:2:1225 -139:2:1226 -140:2:1237 -141:2:1238 -142:2:1239 -143:2:1237 -144:2:1238 -145:2:1239 -146:2:1250 -147:2:1255 -148:2:1256 -149:0:4365 -150:3:2529 -151:0:4365 -152:2:1268 -153:0:4365 -154:3:2528 -155:0:4365 -156:2:1270 -157:0:4365 -158:3:2529 -159:0:4365 -160:2:1271 -161:2:1275 -162:2:1276 -163:2:1284 -164:2:1285 -165:2:1289 -166:2:1290 -167:2:1284 -168:2:1285 -169:2:1289 -170:2:1290 -171:2:1298 -172:2:1303 -173:2:1307 -174:2:1308 -175:2:1315 -176:2:1316 -177:2:1327 -178:2:1328 -179:2:1329 -180:2:1327 -181:2:1328 -182:2:1329 -183:2:1340 -184:2:1345 -185:2:1346 -186:0:4365 -187:2:1358 -188:0:4365 -189:2:1360 -190:0:4365 -191:3:2528 -192:0:4365 -193:2:1361 -194:0:4365 -195:3:2529 -196:0:4365 -197:2:1362 -198:2:1366 -199:2:1367 -200:2:1375 -201:2:1376 -202:2:1380 -203:2:1381 -204:2:1375 -205:2:1376 -206:2:1380 -207:2:1381 -208:2:1389 -209:2:1394 -210:2:1398 -211:2:1399 -212:2:1406 -213:2:1407 -214:2:1418 -215:2:1419 -216:2:1420 -217:2:1418 -218:2:1419 -219:2:1420 -220:2:1431 -221:2:1436 -222:2:1437 -223:0:4365 -224:2:1449 -225:0:4365 -226:3:2528 -227:0:4365 -228:2:1451 -229:0:4365 -230:3:2529 -231:0:4365 -232:2:1652 -233:0:4365 -234:2:1653 -235:0:4365 -236:2:1657 -237:0:4365 -238:2:1660 -239:0:4365 -240:3:2528 -241:0:4365 -242:2:1665 -243:2:1669 -244:2:1670 -245:2:1678 -246:2:1679 -247:2:1683 -248:2:1684 -249:2:1678 -250:2:1679 -251:2:1680 -252:2:1692 -253:2:1697 -254:2:1701 -255:2:1702 -256:2:1709 -257:2:1710 -258:2:1721 -259:2:1722 -260:2:1723 -261:2:1721 -262:2:1722 -263:2:1723 -264:2:1734 -265:2:1739 -266:2:1740 -267:0:4365 -268:3:2529 -269:0:4365 -270:2:1752 -271:0:4365 -272:3:2528 -273:0:4365 -274:2:1754 -275:0:4365 -276:3:2529 -277:0:4365 -278:2:1755 -279:2:1759 -280:2:1760 -281:2:1768 -282:2:1769 -283:2:1773 -284:2:1774 -285:2:1768 -286:2:1769 -287:2:1773 -288:2:1774 -289:2:1782 -290:2:1787 -291:2:1791 -292:2:1792 -293:2:1799 -294:2:1800 -295:2:1811 -296:2:1812 -297:2:1813 -298:2:1811 -299:2:1812 -300:2:1813 -301:2:1824 -302:2:1829 -303:2:1830 -304:0:4365 -305:2:1842 -306:0:4365 -307:3:2528 -308:0:4365 -309:2:1844 -310:0:4365 -311:3:2529 -312:0:4365 -313:2:1845 -314:2:1849 -315:2:1850 -316:2:1858 -317:2:1859 -318:2:1863 -319:2:1864 -320:2:1858 -321:2:1859 -322:2:1863 -323:2:1864 -324:2:1872 -325:2:1877 -326:2:1881 -327:2:1882 -328:2:1889 -329:2:1890 -330:2:1901 -331:2:1902 -332:2:1903 -333:2:1901 -334:2:1902 -335:2:1903 -336:2:1914 -337:2:1919 -338:2:1920 -339:0:4365 -340:2:1932 -341:0:4365 -342:3:2528 -343:0:4365 -344:2:1934 -345:0:4365 -346:3:2529 -347:0:4365 -348:2:1935 -349:0:4365 -350:2:1936 -351:0:4365 -352:2:2129 -353:0:4365 -354:2:2130 -355:0:4365 -356:2:2134 -357:0:4365 -358:3:2528 -359:0:4365 -360:2:2136 -361:0:4365 -362:3:2529 -363:0:4365 -364:2:2137 -365:2:2141 -366:2:2142 -367:2:2150 -368:2:2151 -369:2:2155 -370:2:2156 -371:2:2150 -372:2:2151 -373:2:2155 -374:2:2156 -375:2:2164 -376:2:2169 -377:2:2173 -378:2:2174 -379:2:2181 -380:2:2182 -381:2:2193 -382:2:2194 -383:2:2195 -384:2:2193 -385:2:2194 -386:2:2195 -387:2:2206 -388:2:2211 -389:2:2212 -390:0:4365 -391:2:2224 -392:0:4365 -393:3:2528 -394:0:4365 -395:2:2226 -396:0:4365 -397:3:2529 -398:0:4365 -399:2:2230 -400:0:4365 -401:3:2528 -402:0:4365 -403:2:2235 -404:2:2239 -405:2:2240 -406:2:2248 -407:2:2249 -408:2:2253 -409:2:2254 -410:2:2248 -411:2:2249 -412:2:2250 -413:2:2262 -414:2:2267 -415:2:2271 -416:2:2272 -417:2:2279 -418:2:2280 -419:2:2291 -420:2:2292 -421:2:2293 -422:2:2291 -423:2:2292 -424:2:2293 -425:2:2304 -426:2:2309 -427:2:2310 -428:0:4365 -429:3:2529 -430:0:4365 -431:2:2322 -432:0:4365 -433:2:1169 -434:0:4365 -435:3:2528 -436:0:4365 -437:2:1170 -438:0:4365 -439:3:2529 -440:0:4365 -441:3:2530 -442:0:4365 -443:3:2536 -444:0:4365 -445:3:2537 -446:0:4365 -447:3:2547 -448:0:4365 -449:3:2548 -450:0:4365 -451:3:2552 -452:3:2553 -453:3:2557 -454:3:2561 -455:3:2562 -456:3:2557 -457:3:2561 -458:3:2562 -459:3:2566 -460:3:2574 -461:3:2575 -462:3:2580 -463:3:2587 -464:3:2588 -465:3:2587 -466:3:2588 -467:3:2595 -468:3:2600 -469:0:4365 -470:3:2611 -471:0:4365 -472:3:2615 -473:3:2616 -474:3:2620 -475:3:2624 -476:3:2625 -477:3:2620 -478:3:2624 -479:3:2625 -480:3:2629 -481:3:2637 -482:3:2638 -483:3:2643 -484:3:2650 -485:3:2651 -486:3:2650 -487:3:2651 -488:3:2658 -489:3:2663 -490:0:4365 -491:3:2611 -492:0:4365 -493:3:2615 -494:3:2616 -495:3:2620 -496:3:2624 -497:3:2625 -498:3:2620 -499:3:2624 -500:3:2625 -501:3:2629 -502:3:2637 -503:3:2638 -504:3:2643 -505:3:2650 -506:3:2651 -507:3:2650 -508:3:2651 -509:3:2658 -510:3:2663 -511:0:4365 -512:3:2674 -513:0:4365 -514:3:2682 -515:3:2683 -516:3:2687 -517:3:2691 -518:3:2692 -519:3:2687 -520:3:2691 -521:3:2692 -522:3:2696 -523:3:2704 -524:3:2705 -525:3:2710 -526:3:2717 -527:3:2718 -528:3:2717 -529:3:2718 -530:3:2725 -531:3:2730 -532:0:4365 -533:3:2745 -534:0:4365 -535:3:2746 -536:0:4365 -537:2:1173 -538:0:4365 -539:3:2747 -540:0:4365 -541:2:1179 -542:0:4365 -543:2:1180 -544:0:4365 -545:3:2746 -546:0:4365 -547:2:1181 -548:2:1185 -549:2:1186 -550:2:1194 -551:2:1195 -552:2:1199 -553:2:1200 -554:2:1194 -555:2:1195 -556:2:1199 -557:2:1200 -558:2:1208 -559:2:1213 -560:2:1217 -561:2:1218 -562:2:1225 -563:2:1226 -564:2:1237 -565:2:1238 -566:2:1239 -567:2:1237 -568:2:1238 -569:2:1239 -570:2:1250 -571:2:1255 -572:2:1256 -573:0:4365 -574:3:2747 -575:0:4365 -576:2:1268 -577:0:4365 -578:3:2746 -579:0:4365 -580:2:1270 -581:0:4365 -582:3:2747 -583:0:4365 -584:2:1271 -585:2:1275 -586:2:1276 -587:2:1284 -588:2:1285 -589:2:1289 -590:2:1290 -591:2:1284 -592:2:1285 -593:2:1289 -594:2:1290 -595:2:1298 -596:2:1303 -597:2:1307 -598:2:1308 -599:2:1315 -600:2:1316 -601:2:1327 -602:2:1328 -603:2:1329 -604:2:1327 -605:2:1328 -606:2:1329 -607:2:1340 -608:2:1345 -609:2:1346 -610:0:4365 -611:2:1358 -612:0:4365 -613:2:1360 -614:0:4365 -615:3:2746 -616:0:4365 -617:2:1361 -618:0:4365 -619:3:2747 -620:0:4365 -621:2:1362 -622:2:1366 -623:2:1367 -624:2:1375 -625:2:1376 -626:2:1380 -627:2:1381 -628:2:1375 -629:2:1376 -630:2:1380 -631:2:1381 -632:2:1389 -633:2:1394 -634:2:1398 -635:2:1399 -636:2:1406 -637:2:1407 -638:2:1418 -639:2:1419 -640:2:1420 -641:2:1418 -642:2:1419 -643:2:1420 -644:2:1431 -645:2:1436 -646:2:1437 -647:0:4365 -648:2:1449 -649:0:4365 -650:3:2746 -651:0:4365 -652:2:1451 -653:0:4365 -654:3:2747 -655:0:4365 -656:2:1652 -657:0:4365 -658:2:1653 -659:0:4365 -660:2:1657 -661:0:4365 -662:2:1660 -663:0:4365 -664:3:2746 -665:0:4365 -666:2:1665 -667:2:1669 -668:2:1670 -669:2:1678 -670:2:1679 -671:2:1683 -672:2:1684 -673:2:1678 -674:2:1679 -675:2:1680 -676:2:1692 -677:2:1697 -678:2:1701 -679:2:1702 -680:2:1709 -681:2:1710 -682:2:1721 -683:2:1722 -684:2:1723 -685:2:1721 -686:2:1722 -687:2:1723 -688:2:1734 -689:2:1739 -690:2:1740 -691:0:4365 -692:3:2747 -693:0:4365 -694:2:1752 -695:0:4365 -696:3:2746 -697:0:4365 -698:2:1754 -699:0:4365 -700:3:2747 -701:0:4365 -702:2:1755 -703:2:1759 -704:2:1760 -705:2:1768 -706:2:1769 -707:2:1773 -708:2:1774 -709:2:1768 -710:2:1769 -711:2:1773 -712:2:1774 -713:2:1782 -714:2:1787 -715:2:1791 -716:2:1792 -717:2:1799 -718:2:1800 -719:2:1811 -720:2:1812 -721:2:1813 -722:2:1811 -723:2:1812 -724:2:1813 -725:2:1824 -726:2:1829 -727:2:1830 -728:0:4365 -729:2:1842 -730:0:4365 -731:3:2746 -732:0:4365 -733:2:1844 -734:0:4365 -735:3:2747 -736:0:4365 -737:2:1845 -738:2:1849 -739:2:1850 -740:2:1858 -741:2:1859 -742:2:1863 -743:2:1864 -744:2:1858 -745:2:1859 -746:2:1863 -747:2:1864 -748:2:1872 -749:2:1877 -750:2:1881 -751:2:1882 -752:2:1889 -753:2:1890 -754:2:1901 -755:2:1902 -756:2:1903 -757:2:1901 -758:2:1902 -759:2:1903 -760:2:1914 -761:2:1919 -762:2:1920 -763:0:4365 -764:2:1932 -765:0:4365 -766:3:2746 -767:0:4365 -768:2:1934 -769:0:4365 -770:3:2747 -771:0:4365 -772:2:1935 -773:0:4365 -774:2:1936 -775:0:4365 -776:2:2129 -777:0:4365 -778:2:2130 -779:0:4365 -780:2:2134 -781:0:4365 -782:3:2746 -783:0:4365 -784:2:2136 -785:0:4365 -786:3:2747 -787:0:4365 -788:2:2137 -789:2:2141 -790:2:2142 -791:2:2150 -792:2:2151 -793:2:2155 -794:2:2156 -795:2:2150 -796:2:2151 -797:2:2155 -798:2:2156 -799:2:2164 -800:2:2169 -801:2:2173 -802:2:2174 -803:2:2181 -804:2:2182 -805:2:2193 -806:2:2194 -807:2:2195 -808:2:2193 -809:2:2194 -810:2:2195 -811:2:2206 -812:2:2211 -813:2:2212 -814:0:4365 -815:2:2224 -816:0:4365 -817:3:2746 -818:0:4365 -819:2:2226 -820:0:4365 -821:3:2747 -822:0:4365 -823:2:2230 -824:0:4365 -825:3:2746 -826:0:4365 -827:2:2235 -828:2:2239 -829:2:2240 -830:2:2248 -831:2:2249 -832:2:2253 -833:2:2254 -834:2:2248 -835:2:2249 -836:2:2250 -837:2:2262 -838:2:2267 -839:2:2271 -840:2:2272 -841:2:2279 -842:2:2280 -843:2:2291 -844:2:2292 -845:2:2293 -846:2:2291 -847:2:2292 -848:2:2293 -849:2:2304 -850:2:2309 -851:2:2310 -852:0:4365 -853:3:2747 -854:0:4365 -855:2:2322 -856:0:4365 -857:2:1169 -858:0:4365 -859:3:2746 -860:0:4365 -861:2:1170 -862:0:4365 -863:3:2747 -864:0:4365 -865:3:2748 -866:0:4365 -867:3:2754 -868:0:4365 -869:3:2755 -870:3:2759 -871:3:2760 -872:3:2768 -873:3:2769 -874:3:2773 -875:3:2774 -876:3:2768 -877:3:2769 -878:3:2773 -879:3:2774 -880:3:2782 -881:3:2787 -882:3:2791 -883:3:2792 -884:3:2799 -885:3:2800 -886:3:2811 -887:3:2812 -888:3:2813 -889:3:2811 -890:3:2812 -891:3:2813 -892:3:2824 -893:3:2829 -894:3:2830 -895:0:4365 -896:3:2842 -897:0:4365 -898:3:2843 -899:0:4365 -900:2:1173 -901:0:4365 -902:3:2844 -903:0:4365 -904:2:1179 -905:0:4365 -906:2:1180 -907:0:4365 -908:3:2843 -909:0:4365 -910:2:1181 -911:2:1185 -912:2:1186 -913:2:1194 -914:2:1195 -915:2:1199 -916:2:1200 -917:2:1194 -918:2:1195 -919:2:1199 -920:2:1200 -921:2:1208 -922:2:1213 -923:2:1217 -924:2:1218 -925:2:1225 -926:2:1226 -927:2:1237 -928:2:1238 -929:2:1239 -930:2:1237 -931:2:1238 -932:2:1239 -933:2:1250 -934:2:1255 -935:2:1256 -936:0:4365 -937:3:2844 -938:0:4365 -939:2:1268 -940:0:4365 -941:3:2843 -942:0:4365 -943:2:1270 -944:0:4365 -945:3:2844 -946:0:4365 -947:2:1271 -948:2:1275 -949:2:1276 -950:2:1284 -951:2:1285 -952:2:1289 -953:2:1290 -954:2:1284 -955:2:1285 -956:2:1289 -957:2:1290 -958:2:1298 -959:2:1303 -960:2:1307 -961:2:1308 -962:2:1315 -963:2:1316 -964:2:1327 -965:2:1328 -966:2:1329 -967:2:1327 -968:2:1328 -969:2:1329 -970:2:1340 -971:2:1345 -972:2:1346 -973:0:4365 -974:2:1358 -975:0:4365 -976:2:1360 -977:0:4365 -978:3:2843 -979:0:4365 -980:2:1361 -981:0:4365 -982:3:2844 -983:0:4365 -984:2:1362 -985:2:1366 -986:2:1367 -987:2:1375 -988:2:1376 -989:2:1380 -990:2:1381 -991:2:1375 -992:2:1376 -993:2:1380 -994:2:1381 -995:2:1389 -996:2:1394 -997:2:1398 -998:2:1399 -999:2:1406 -1000:2:1407 -1001:2:1418 -1002:2:1419 -1003:2:1420 -1004:2:1418 -1005:2:1419 -1006:2:1420 -1007:2:1431 -1008:2:1436 -1009:2:1437 -1010:0:4365 -1011:2:1449 -1012:0:4365 -1013:3:2843 -1014:0:4365 -1015:2:1451 -1016:0:4365 -1017:3:2844 -1018:0:4365 -1019:2:1652 -1020:0:4365 -1021:2:1653 -1022:0:4365 -1023:2:1657 -1024:0:4365 -1025:2:1660 -1026:0:4365 -1027:3:2843 -1028:0:4365 -1029:2:1665 -1030:2:1669 -1031:2:1670 -1032:2:1678 -1033:2:1679 -1034:2:1683 -1035:2:1684 -1036:2:1678 -1037:2:1679 -1038:2:1680 -1039:2:1692 -1040:2:1697 -1041:2:1701 -1042:2:1702 -1043:2:1709 -1044:2:1710 -1045:2:1721 -1046:2:1722 -1047:2:1723 -1048:2:1721 -1049:2:1722 -1050:2:1723 -1051:2:1734 -1052:2:1739 -1053:2:1740 -1054:0:4365 -1055:3:2844 -1056:0:4365 -1057:2:1752 -1058:0:4365 -1059:3:2843 -1060:0:4365 -1061:2:1754 -1062:0:4365 -1063:3:2844 -1064:0:4365 -1065:2:1755 -1066:2:1759 -1067:2:1760 -1068:2:1768 -1069:2:1769 -1070:2:1773 -1071:2:1774 -1072:2:1768 -1073:2:1769 -1074:2:1773 -1075:2:1774 -1076:2:1782 -1077:2:1787 -1078:2:1791 -1079:2:1792 -1080:2:1799 -1081:2:1800 -1082:2:1811 -1083:2:1812 -1084:2:1813 -1085:2:1811 -1086:2:1812 -1087:2:1813 -1088:2:1824 -1089:2:1829 -1090:2:1830 -1091:0:4365 -1092:2:1842 -1093:0:4365 -1094:3:2843 -1095:0:4365 -1096:2:1844 -1097:0:4365 -1098:3:2844 -1099:0:4365 -1100:2:1845 -1101:2:1849 -1102:2:1850 -1103:2:1858 -1104:2:1859 -1105:2:1863 -1106:2:1864 -1107:2:1858 -1108:2:1859 -1109:2:1863 -1110:2:1864 -1111:2:1872 -1112:2:1877 -1113:2:1881 -1114:2:1882 -1115:2:1889 -1116:2:1890 -1117:2:1901 -1118:2:1902 -1119:2:1903 -1120:2:1901 -1121:2:1902 -1122:2:1903 -1123:2:1914 -1124:2:1919 -1125:2:1920 -1126:0:4365 -1127:2:1932 -1128:0:4365 -1129:3:2843 -1130:0:4365 -1131:2:1934 -1132:0:4365 -1133:3:2844 -1134:0:4365 -1135:2:1935 -1136:0:4365 -1137:2:1936 -1138:0:4365 -1139:2:2129 -1140:0:4365 -1141:2:2130 -1142:0:4365 -1143:2:2134 -1144:0:4365 -1145:3:2843 -1146:0:4365 -1147:2:2136 -1148:0:4365 -1149:3:2844 -1150:0:4365 -1151:2:2137 -1152:2:2141 -1153:2:2142 -1154:2:2150 -1155:2:2151 -1156:2:2155 -1157:2:2156 -1158:2:2150 -1159:2:2151 -1160:2:2155 -1161:2:2156 -1162:2:2164 -1163:2:2169 -1164:2:2173 -1165:2:2174 -1166:2:2181 -1167:2:2182 -1168:2:2193 -1169:2:2194 -1170:2:2195 -1171:2:2193 -1172:2:2194 -1173:2:2195 -1174:2:2206 -1175:2:2211 -1176:2:2212 -1177:0:4365 -1178:2:2224 -1179:0:4365 -1180:3:2843 -1181:0:4365 -1182:2:2226 -1183:0:4365 -1184:3:2844 -1185:0:4365 -1186:2:2230 -1187:0:4365 -1188:3:2843 -1189:0:4365 -1190:2:2235 -1191:2:2239 -1192:2:2240 -1193:2:2248 -1194:2:2249 -1195:2:2253 -1196:2:2254 -1197:2:2248 -1198:2:2249 -1199:2:2250 -1200:2:2262 -1201:2:2267 -1202:2:2271 -1203:2:2272 -1204:2:2279 -1205:2:2280 -1206:2:2291 -1207:2:2292 -1208:2:2293 -1209:2:2291 -1210:2:2292 -1211:2:2293 -1212:2:2304 -1213:2:2309 -1214:2:2310 -1215:0:4365 -1216:3:2844 -1217:0:4365 -1218:2:2322 -1219:0:4365 -1220:2:1169 -1221:0:4365 -1222:3:2843 -1223:0:4365 -1224:2:1170 -1225:0:4365 -1226:3:2844 -1227:0:4365 -1228:3:2845 -1229:0:4365 -1230:3:2851 -1231:0:4365 -1232:3:2854 -1233:3:2855 -1234:3:2867 -1235:3:2868 -1236:3:2872 -1237:3:2873 -1238:3:2867 -1239:3:2868 -1240:3:2872 -1241:3:2873 -1242:3:2881 -1243:3:2886 -1244:3:2890 -1245:3:2891 -1246:3:2898 -1247:3:2899 -1248:3:2910 -1249:3:2911 -1250:3:2912 -1251:3:2910 -1252:3:2911 -1253:3:2912 -1254:3:2923 -1255:3:2928 -1256:3:2929 -1257:0:4365 -1258:3:2941 -1259:0:4365 -1260:3:2942 -1261:0:4365 -1262:2:1173 -1263:0:4365 -1264:3:2943 -1265:0:4365 -1266:2:1179 -1267:0:4365 -1268:2:1180 -1269:0:4365 -1270:3:2942 -1271:0:4365 -1272:2:1181 -1273:2:1185 -1274:2:1186 -1275:2:1194 -1276:2:1195 -1277:2:1199 -1278:2:1200 -1279:2:1194 -1280:2:1195 -1281:2:1199 -1282:2:1200 -1283:2:1208 -1284:2:1213 -1285:2:1217 -1286:2:1218 -1287:2:1225 -1288:2:1226 -1289:2:1237 -1290:2:1238 -1291:2:1239 -1292:2:1237 -1293:2:1238 -1294:2:1239 -1295:2:1250 -1296:2:1255 -1297:2:1256 -1298:0:4365 -1299:3:2943 -1300:0:4365 -1301:2:1268 -1302:0:4365 -1303:3:2942 -1304:0:4365 -1305:2:1270 -1306:0:4365 -1307:3:2943 -1308:0:4365 -1309:2:1271 -1310:2:1275 -1311:2:1276 -1312:2:1284 -1313:2:1285 -1314:2:1289 -1315:2:1290 -1316:2:1284 -1317:2:1285 -1318:2:1289 -1319:2:1290 -1320:2:1298 -1321:2:1303 -1322:2:1307 -1323:2:1308 -1324:2:1315 -1325:2:1316 -1326:2:1327 -1327:2:1328 -1328:2:1329 -1329:2:1327 -1330:2:1328 -1331:2:1329 -1332:2:1340 -1333:2:1345 -1334:2:1346 -1335:0:4365 -1336:2:1358 -1337:0:4365 -1338:2:1360 -1339:0:4365 -1340:3:2942 -1341:0:4365 -1342:2:1361 -1343:0:4365 -1344:3:2943 -1345:0:4365 -1346:2:1362 -1347:2:1366 -1348:2:1367 -1349:2:1375 -1350:2:1376 -1351:2:1380 -1352:2:1381 -1353:2:1375 -1354:2:1376 -1355:2:1380 -1356:2:1381 -1357:2:1389 -1358:2:1394 -1359:2:1398 -1360:2:1399 -1361:2:1406 -1362:2:1407 -1363:2:1418 -1364:2:1419 -1365:2:1420 -1366:2:1418 -1367:2:1419 -1368:2:1420 -1369:2:1431 -1370:2:1436 -1371:2:1437 -1372:0:4365 -1373:2:1449 -1374:0:4365 -1375:3:2942 -1376:0:4365 -1377:2:1451 -1378:0:4365 -1379:3:2943 -1380:0:4365 -1381:2:1652 -1382:0:4365 -1383:2:1653 -1384:0:4365 -1385:2:1657 -1386:0:4365 -1387:2:1660 -1388:0:4365 -1389:3:2942 -1390:0:4365 -1391:2:1665 -1392:2:1669 -1393:2:1670 -1394:2:1678 -1395:2:1679 -1396:2:1683 -1397:2:1684 -1398:2:1678 -1399:2:1679 -1400:2:1680 -1401:2:1692 -1402:2:1697 -1403:2:1701 -1404:2:1702 -1405:2:1709 -1406:2:1710 -1407:2:1721 -1408:2:1722 -1409:2:1723 -1410:2:1721 -1411:2:1722 -1412:2:1723 -1413:2:1734 -1414:2:1739 -1415:2:1740 -1416:0:4365 -1417:3:2943 -1418:0:4365 -1419:2:1752 -1420:0:4365 -1421:3:2942 -1422:0:4365 -1423:2:1754 -1424:0:4365 -1425:3:2943 -1426:0:4365 -1427:2:1755 -1428:2:1759 -1429:2:1760 -1430:2:1768 -1431:2:1769 -1432:2:1773 -1433:2:1774 -1434:2:1768 -1435:2:1769 -1436:2:1773 -1437:2:1774 -1438:2:1782 -1439:2:1787 -1440:2:1791 -1441:2:1792 -1442:2:1799 -1443:2:1800 -1444:2:1811 -1445:2:1812 -1446:2:1813 -1447:2:1811 -1448:2:1812 -1449:2:1813 -1450:2:1824 -1451:2:1829 -1452:2:1830 -1453:0:4365 -1454:2:1842 -1455:0:4365 -1456:3:2942 -1457:0:4365 -1458:2:1844 -1459:0:4365 -1460:3:2943 -1461:0:4365 -1462:2:1845 -1463:2:1849 -1464:2:1850 -1465:2:1858 -1466:2:1859 -1467:2:1863 -1468:2:1864 -1469:2:1858 -1470:2:1859 -1471:2:1863 -1472:2:1864 -1473:2:1872 -1474:2:1877 -1475:2:1881 -1476:2:1882 -1477:2:1889 -1478:2:1890 -1479:2:1901 -1480:2:1902 -1481:2:1903 -1482:2:1901 -1483:2:1902 -1484:2:1903 -1485:2:1914 -1486:2:1919 -1487:2:1920 -1488:0:4365 -1489:2:1932 -1490:0:4365 -1491:3:2942 -1492:0:4365 -1493:2:1934 -1494:0:4365 -1495:3:2943 -1496:0:4365 -1497:2:1935 -1498:0:4365 -1499:2:1936 -1500:0:4365 -1501:2:2129 -1502:0:4365 -1503:2:2130 -1504:0:4365 -1505:2:2134 -1506:0:4365 -1507:3:2942 -1508:0:4365 -1509:2:2136 -1510:0:4365 -1511:3:2943 -1512:0:4365 -1513:2:2137 -1514:2:2141 -1515:2:2142 -1516:2:2150 -1517:2:2151 -1518:2:2155 -1519:2:2156 -1520:2:2150 -1521:2:2151 -1522:2:2155 -1523:2:2156 -1524:2:2164 -1525:2:2169 -1526:2:2173 -1527:2:2174 -1528:2:2181 -1529:2:2182 -1530:2:2193 -1531:2:2194 -1532:2:2195 -1533:2:2193 -1534:2:2194 -1535:2:2195 -1536:2:2206 -1537:2:2211 -1538:2:2212 -1539:0:4365 -1540:2:2224 -1541:0:4365 -1542:3:2942 -1543:0:4365 -1544:2:2226 -1545:0:4365 -1546:3:2943 -1547:0:4365 -1548:2:2230 -1549:0:4365 -1550:3:2942 -1551:0:4365 -1552:2:2235 -1553:2:2239 -1554:2:2240 -1555:2:2248 -1556:2:2249 -1557:2:2253 -1558:2:2254 -1559:2:2248 -1560:2:2249 -1561:2:2250 -1562:2:2262 -1563:2:2267 -1564:2:2271 -1565:2:2272 -1566:2:2279 -1567:2:2280 -1568:2:2291 -1569:2:2292 -1570:2:2293 -1571:2:2291 -1572:2:2292 -1573:2:2293 -1574:2:2304 -1575:2:2309 -1576:2:2310 -1577:0:4365 -1578:3:2943 -1579:0:4365 -1580:2:2322 -1581:0:4365 -1582:2:1169 -1583:0:4365 -1584:3:2942 -1585:0:4365 -1586:2:1170 -1587:0:4365 -1588:3:2943 -1589:0:4365 -1590:3:2944 -1591:0:4365 -1592:3:2950 -1593:0:4365 -1594:3:2951 -1595:0:4365 -1596:3:2952 -1597:0:4365 -1598:3:2953 -1599:0:4365 -1600:3:2954 -1601:3:2958 -1602:3:2959 -1603:3:2967 -1604:3:2968 -1605:3:2972 -1606:3:2973 -1607:3:2967 -1608:3:2968 -1609:3:2972 -1610:3:2973 -1611:3:2981 -1612:3:2986 -1613:3:2990 -1614:3:2991 -1615:3:2998 -1616:3:2999 -1617:3:3010 -1618:3:3011 -1619:3:3012 -1620:3:3010 -1621:3:3011 -1622:3:3012 -1623:3:3023 -1624:3:3028 -1625:3:3029 -1626:0:4365 -1627:3:3041 -1628:0:4365 -1629:3:3042 -1630:0:4365 -1631:2:1173 -1632:0:4365 -1633:3:3043 -1634:0:4365 -1635:2:1179 -1636:0:4365 -1637:2:1180 -1638:0:4365 -1639:3:3042 -1640:0:4365 -1641:2:1181 -1642:2:1185 -1643:2:1186 -1644:2:1194 -1645:2:1195 -1646:2:1199 -1647:2:1200 -1648:2:1194 -1649:2:1195 -1650:2:1199 -1651:2:1200 -1652:2:1208 -1653:2:1213 -1654:2:1217 -1655:2:1218 -1656:2:1225 -1657:2:1226 -1658:2:1237 -1659:2:1238 -1660:2:1239 -1661:2:1237 -1662:2:1238 -1663:2:1239 -1664:2:1250 -1665:2:1255 -1666:2:1256 -1667:0:4365 -1668:3:3043 -1669:0:4365 -1670:2:1268 -1671:0:4365 -1672:3:3042 -1673:0:4365 -1674:2:1270 -1675:0:4365 -1676:3:3043 -1677:0:4365 -1678:2:1271 -1679:2:1275 -1680:2:1276 -1681:2:1284 -1682:2:1285 -1683:2:1289 -1684:2:1290 -1685:2:1284 -1686:2:1285 -1687:2:1289 -1688:2:1290 -1689:2:1298 -1690:2:1303 -1691:2:1307 -1692:2:1308 -1693:2:1315 -1694:2:1316 -1695:2:1327 -1696:2:1328 -1697:2:1329 -1698:2:1327 -1699:2:1328 -1700:2:1329 -1701:2:1340 -1702:2:1345 -1703:2:1346 -1704:0:4365 -1705:2:1358 -1706:0:4365 -1707:2:1360 -1708:0:4365 -1709:3:3042 -1710:0:4365 -1711:2:1361 -1712:0:4365 -1713:3:3043 -1714:0:4365 -1715:2:1362 -1716:2:1366 -1717:2:1367 -1718:2:1375 -1719:2:1376 -1720:2:1380 -1721:2:1381 -1722:2:1375 -1723:2:1376 -1724:2:1380 -1725:2:1381 -1726:2:1389 -1727:2:1394 -1728:2:1398 -1729:2:1399 -1730:2:1406 -1731:2:1407 -1732:2:1418 -1733:2:1419 -1734:2:1420 -1735:2:1418 -1736:2:1419 -1737:2:1420 -1738:2:1431 -1739:2:1436 -1740:2:1437 -1741:0:4365 -1742:2:1449 -1743:0:4365 -1744:3:3042 -1745:0:4365 -1746:2:1451 -1747:0:4365 -1748:3:3043 -1749:0:4365 -1750:2:1652 -1751:0:4365 -1752:2:1653 -1753:0:4365 -1754:2:1657 -1755:0:4365 -1756:2:1660 -1757:0:4365 -1758:3:3042 -1759:0:4365 -1760:2:1665 -1761:2:1669 -1762:2:1670 -1763:2:1678 -1764:2:1679 -1765:2:1683 -1766:2:1684 -1767:2:1678 -1768:2:1679 -1769:2:1680 -1770:2:1692 -1771:2:1697 -1772:2:1701 -1773:2:1702 -1774:2:1709 -1775:2:1710 -1776:2:1721 -1777:2:1722 -1778:2:1723 -1779:2:1721 -1780:2:1722 -1781:2:1723 -1782:2:1734 -1783:2:1739 -1784:2:1740 -1785:0:4365 -1786:3:3043 -1787:0:4365 -1788:2:1752 -1789:0:4365 -1790:3:3042 -1791:0:4365 -1792:2:1754 -1793:0:4365 -1794:3:3043 -1795:0:4365 -1796:2:1755 -1797:2:1759 -1798:2:1760 -1799:2:1768 -1800:2:1769 -1801:2:1773 -1802:2:1774 -1803:2:1768 -1804:2:1769 -1805:2:1773 -1806:2:1774 -1807:2:1782 -1808:2:1787 -1809:2:1791 -1810:2:1792 -1811:2:1799 -1812:2:1800 -1813:2:1811 -1814:2:1812 -1815:2:1813 -1816:2:1811 -1817:2:1812 -1818:2:1813 -1819:2:1824 -1820:2:1829 -1821:2:1830 -1822:0:4365 -1823:2:1842 -1824:0:4365 -1825:3:3042 -1826:0:4365 -1827:2:1844 -1828:0:4365 -1829:3:3043 -1830:0:4365 -1831:2:1845 -1832:2:1849 -1833:2:1850 -1834:2:1858 -1835:2:1859 -1836:2:1863 -1837:2:1864 -1838:2:1858 -1839:2:1859 -1840:2:1863 -1841:2:1864 -1842:2:1872 -1843:2:1877 -1844:2:1881 -1845:2:1882 -1846:2:1889 -1847:2:1890 -1848:2:1901 -1849:2:1902 -1850:2:1903 -1851:2:1901 -1852:2:1902 -1853:2:1903 -1854:2:1914 -1855:2:1919 -1856:2:1920 -1857:0:4365 -1858:2:1932 -1859:0:4365 -1860:3:3042 -1861:0:4365 -1862:2:1934 -1863:0:4365 -1864:3:3043 -1865:0:4365 -1866:2:1935 -1867:0:4365 -1868:2:1936 -1869:0:4365 -1870:2:2129 -1871:0:4365 -1872:2:2130 -1873:0:4365 -1874:2:2134 -1875:0:4365 -1876:3:3042 -1877:0:4365 -1878:2:2136 -1879:0:4365 -1880:3:3043 -1881:0:4365 -1882:2:2137 -1883:2:2141 -1884:2:2142 -1885:2:2150 -1886:2:2151 -1887:2:2155 -1888:2:2156 -1889:2:2150 -1890:2:2151 -1891:2:2155 -1892:2:2156 -1893:2:2164 -1894:2:2169 -1895:2:2173 -1896:2:2174 -1897:2:2181 -1898:2:2182 -1899:2:2193 -1900:2:2194 -1901:2:2195 -1902:2:2193 -1903:2:2194 -1904:2:2195 -1905:2:2206 -1906:2:2211 -1907:2:2212 -1908:0:4365 -1909:2:2224 -1910:0:4365 -1911:3:3042 -1912:0:4365 -1913:2:2226 -1914:0:4365 -1915:3:3043 -1916:0:4365 -1917:2:2230 -1918:0:4365 -1919:3:3042 -1920:0:4365 -1921:2:2235 -1922:2:2239 -1923:2:2240 -1924:2:2248 -1925:2:2249 -1926:2:2253 -1927:2:2254 -1928:2:2248 -1929:2:2249 -1930:2:2250 -1931:2:2262 -1932:2:2267 -1933:2:2271 -1934:2:2272 -1935:2:2279 -1936:2:2280 -1937:2:2291 -1938:2:2292 -1939:2:2293 -1940:2:2291 -1941:2:2292 -1942:2:2293 -1943:2:2304 -1944:2:2309 -1945:2:2310 -1946:0:4365 -1947:3:3043 -1948:0:4365 -1949:2:2322 -1950:0:4365 -1951:2:1169 -1952:0:4365 -1953:3:3042 -1954:0:4365 -1955:2:1170 -1956:0:4365 -1957:3:3043 -1958:0:4365 -1959:3:3044 -1960:0:4365 -1961:3:3257 -1962:0:4365 -1963:3:3265 -1964:0:4365 -1965:3:3266 -1966:3:3270 -1967:3:3271 -1968:3:3279 -1969:3:3280 -1970:3:3284 -1971:3:3285 -1972:3:3279 -1973:3:3280 -1974:3:3284 -1975:3:3285 -1976:3:3293 -1977:3:3298 -1978:3:3302 -1979:3:3303 -1980:3:3310 -1981:3:3311 -1982:3:3322 -1983:3:3323 -1984:3:3324 -1985:3:3322 -1986:3:3323 -1987:3:3324 -1988:3:3335 -1989:3:3340 -1990:3:3341 -1991:0:4365 -1992:3:3353 -1993:0:4365 -1994:3:3354 -1995:0:4365 -1996:2:1173 -1997:0:4365 -1998:3:3355 -1999:0:4365 -2000:2:1179 -2001:0:4365 -2002:2:1180 -2003:0:4365 -2004:3:3354 -2005:0:4365 -2006:2:1181 -2007:2:1185 -2008:2:1186 -2009:2:1194 -2010:2:1195 -2011:2:1199 -2012:2:1200 -2013:2:1194 -2014:2:1195 -2015:2:1199 -2016:2:1200 -2017:2:1208 -2018:2:1213 -2019:2:1217 -2020:2:1218 -2021:2:1225 -2022:2:1226 -2023:2:1237 -2024:2:1238 -2025:2:1239 -2026:2:1237 -2027:2:1238 -2028:2:1239 -2029:2:1250 -2030:2:1255 -2031:2:1256 -2032:0:4365 -2033:3:3355 -2034:0:4365 -2035:2:1268 -2036:0:4365 -2037:3:3354 -2038:0:4365 -2039:2:1270 -2040:0:4365 -2041:3:3355 -2042:0:4365 -2043:2:1271 -2044:2:1275 -2045:2:1276 -2046:2:1284 -2047:2:1285 -2048:2:1289 -2049:2:1290 -2050:2:1284 -2051:2:1285 -2052:2:1289 -2053:2:1290 -2054:2:1298 -2055:2:1303 -2056:2:1307 -2057:2:1308 -2058:2:1315 -2059:2:1316 -2060:2:1327 -2061:2:1328 -2062:2:1329 -2063:2:1327 -2064:2:1328 -2065:2:1329 -2066:2:1340 -2067:2:1345 -2068:2:1346 -2069:0:4365 -2070:2:1358 -2071:0:4365 -2072:2:1360 -2073:0:4365 -2074:3:3354 -2075:0:4365 -2076:2:1361 -2077:0:4365 -2078:3:3355 -2079:0:4365 -2080:2:1362 -2081:2:1366 -2082:2:1367 -2083:2:1375 -2084:2:1376 -2085:2:1380 -2086:2:1381 -2087:2:1375 -2088:2:1376 -2089:2:1380 -2090:2:1381 -2091:2:1389 -2092:2:1394 -2093:2:1398 -2094:2:1399 -2095:2:1406 -2096:2:1407 -2097:2:1418 -2098:2:1419 -2099:2:1420 -2100:2:1418 -2101:2:1419 -2102:2:1420 -2103:2:1431 -2104:2:1436 -2105:2:1437 -2106:0:4365 -2107:2:1449 -2108:0:4365 -2109:3:3354 -2110:0:4365 -2111:2:1451 -2112:0:4365 -2113:3:3355 -2114:0:4365 -2115:2:1652 -2116:0:4365 -2117:2:1653 -2118:0:4365 -2119:2:1657 -2120:0:4365 -2121:2:1660 -2122:0:4365 -2123:3:3354 -2124:0:4365 -2125:2:1665 -2126:2:1669 -2127:2:1670 -2128:2:1678 -2129:2:1679 -2130:2:1683 -2131:2:1684 -2132:2:1678 -2133:2:1679 -2134:2:1680 -2135:2:1692 -2136:2:1697 -2137:2:1701 -2138:2:1702 -2139:2:1709 -2140:2:1710 -2141:2:1721 -2142:2:1722 -2143:2:1723 -2144:2:1721 -2145:2:1722 -2146:2:1723 -2147:2:1734 -2148:2:1739 -2149:2:1740 -2150:0:4365 -2151:3:3355 -2152:0:4365 -2153:2:1752 -2154:0:4365 -2155:3:3354 -2156:0:4365 -2157:2:1754 -2158:0:4365 -2159:3:3355 -2160:0:4365 -2161:2:1755 -2162:2:1759 -2163:2:1760 -2164:2:1768 -2165:2:1769 -2166:2:1773 -2167:2:1774 -2168:2:1768 -2169:2:1769 -2170:2:1773 -2171:2:1774 -2172:2:1782 -2173:2:1787 -2174:2:1791 -2175:2:1792 -2176:2:1799 -2177:2:1800 -2178:2:1811 -2179:2:1812 -2180:2:1813 -2181:2:1811 -2182:2:1812 -2183:2:1813 -2184:2:1824 -2185:2:1829 -2186:2:1830 -2187:0:4365 -2188:2:1842 -2189:0:4365 -2190:3:3354 -2191:0:4365 -2192:2:1844 -2193:0:4365 -2194:3:3355 -2195:0:4365 -2196:2:1845 -2197:2:1849 -2198:2:1850 -2199:2:1858 -2200:2:1859 -2201:2:1863 -2202:2:1864 -2203:2:1858 -2204:2:1859 -2205:2:1863 -2206:2:1864 -2207:2:1872 -2208:2:1877 -2209:2:1881 -2210:2:1882 -2211:2:1889 -2212:2:1890 -2213:2:1901 -2214:2:1902 -2215:2:1903 -2216:2:1901 -2217:2:1902 -2218:2:1903 -2219:2:1914 -2220:2:1919 -2221:2:1920 -2222:0:4365 -2223:2:1932 -2224:0:4365 -2225:3:3354 -2226:0:4365 -2227:2:1934 -2228:0:4365 -2229:3:3355 -2230:0:4365 -2231:2:1935 -2232:0:4365 -2233:2:1936 -2234:0:4365 -2235:2:2129 -2236:0:4365 -2237:2:2130 -2238:0:4365 -2239:2:2134 -2240:0:4365 -2241:3:3354 -2242:0:4365 -2243:2:2136 -2244:0:4365 -2245:3:3355 -2246:0:4365 -2247:2:2137 -2248:2:2141 -2249:2:2142 -2250:2:2150 -2251:2:2151 -2252:2:2155 -2253:2:2156 -2254:2:2150 -2255:2:2151 -2256:2:2155 -2257:2:2156 -2258:2:2164 -2259:2:2169 -2260:2:2173 -2261:2:2174 -2262:2:2181 -2263:2:2182 -2264:2:2193 -2265:2:2194 -2266:2:2195 -2267:2:2193 -2268:2:2194 -2269:2:2195 -2270:2:2206 -2271:2:2211 -2272:2:2212 -2273:0:4365 -2274:2:2224 -2275:0:4365 -2276:3:3354 -2277:0:4365 -2278:2:2226 -2279:0:4365 -2280:3:3355 -2281:0:4365 -2282:2:2230 -2283:0:4365 -2284:3:3354 -2285:0:4365 -2286:2:2235 -2287:2:2239 -2288:2:2240 -2289:2:2248 -2290:2:2249 -2291:2:2253 -2292:2:2254 -2293:2:2248 -2294:2:2249 -2295:2:2250 -2296:2:2262 -2297:2:2267 -2298:2:2271 -2299:2:2272 -2300:2:2279 -2301:2:2280 -2302:2:2291 -2303:2:2292 -2304:2:2293 -2305:2:2291 -2306:2:2292 -2307:2:2293 -2308:2:2304 -2309:2:2309 -2310:2:2310 -2311:0:4365 -2312:3:3355 -2313:0:4365 -2314:2:2322 -2315:0:4365 -2316:2:1169 -2317:0:4365 -2318:3:3354 -2319:0:4365 -2320:2:1170 -2321:0:4365 -2322:3:3355 -2323:0:4365 -2324:3:3356 -2325:0:4365 -2326:3:3366 -2327:0:4365 -2328:3:2951 -2329:0:4365 -2330:3:2952 -2331:0:4365 -2332:3:2953 -2333:0:4365 -2334:3:2954 -2335:3:2958 -2336:3:2959 -2337:3:2967 -2338:3:2968 -2339:3:2972 -2340:3:2973 -2341:3:2967 -2342:3:2968 -2343:3:2972 -2344:3:2973 -2345:3:2981 -2346:3:2986 -2347:3:2990 -2348:3:2991 -2349:3:2998 -2350:3:2999 -2351:3:3010 -2352:3:3011 -2353:3:3012 -2354:3:3010 -2355:3:3011 -2356:3:3012 -2357:3:3023 -2358:3:3028 -2359:3:3029 -2360:0:4365 -2361:3:3041 -2362:0:4365 -2363:3:3042 -2364:0:4365 -2365:2:1173 -2366:0:4365 -2367:3:3043 -2368:0:4365 -2369:2:1179 -2370:0:4365 -2371:2:1180 -2372:0:4365 -2373:3:3042 -2374:0:4365 -2375:2:1181 -2376:2:1185 -2377:2:1186 -2378:2:1194 -2379:2:1195 -2380:2:1199 -2381:2:1200 -2382:2:1194 -2383:2:1195 -2384:2:1199 -2385:2:1200 -2386:2:1208 -2387:2:1213 -2388:2:1217 -2389:2:1218 -2390:2:1225 -2391:2:1226 -2392:2:1237 -2393:2:1238 -2394:2:1239 -2395:2:1237 -2396:2:1238 -2397:2:1239 -2398:2:1250 -2399:2:1255 -2400:2:1256 -2401:0:4365 -2402:3:3043 -2403:0:4365 -2404:2:1268 -2405:0:4365 -2406:3:3042 -2407:0:4365 -2408:2:1270 -2409:0:4365 -2410:3:3043 -2411:0:4365 -2412:2:1271 -2413:2:1275 -2414:2:1276 -2415:2:1284 -2416:2:1285 -2417:2:1289 -2418:2:1290 -2419:2:1284 -2420:2:1285 -2421:2:1289 -2422:2:1290 -2423:2:1298 -2424:2:1303 -2425:2:1307 -2426:2:1308 -2427:2:1315 -2428:2:1316 -2429:2:1327 -2430:2:1328 -2431:2:1329 -2432:2:1327 -2433:2:1328 -2434:2:1329 -2435:2:1340 -2436:2:1345 -2437:2:1346 -2438:0:4365 -2439:2:1358 -2440:0:4365 -2441:2:1360 -2442:0:4365 -2443:3:3042 -2444:0:4365 -2445:2:1361 -2446:0:4365 -2447:3:3043 -2448:0:4365 -2449:2:1362 -2450:2:1366 -2451:2:1367 -2452:2:1375 -2453:2:1376 -2454:2:1380 -2455:2:1381 -2456:2:1375 -2457:2:1376 -2458:2:1380 -2459:2:1381 -2460:2:1389 -2461:2:1394 -2462:2:1398 -2463:2:1399 -2464:2:1406 -2465:2:1407 -2466:2:1418 -2467:2:1419 -2468:2:1420 -2469:2:1418 -2470:2:1419 -2471:2:1420 -2472:2:1431 -2473:2:1436 -2474:2:1437 -2475:0:4365 -2476:2:1449 -2477:0:4365 -2478:3:3042 -2479:0:4365 -2480:2:1451 -2481:0:4365 -2482:3:3043 -2483:0:4365 -2484:2:1652 -2485:0:4365 -2486:2:1653 -2487:0:4365 -2488:2:1657 -2489:0:4365 -2490:2:1660 -2491:0:4365 -2492:3:3042 -2493:0:4365 -2494:2:1665 -2495:2:1669 -2496:2:1670 -2497:2:1678 -2498:2:1679 -2499:2:1683 -2500:2:1684 -2501:2:1678 -2502:2:1679 -2503:2:1680 -2504:2:1692 -2505:2:1697 -2506:2:1701 -2507:2:1702 -2508:2:1709 -2509:2:1710 -2510:2:1721 -2511:2:1722 -2512:2:1723 -2513:2:1721 -2514:2:1722 -2515:2:1723 -2516:2:1734 -2517:2:1739 -2518:2:1740 -2519:0:4365 -2520:3:3043 -2521:0:4365 -2522:2:1752 -2523:0:4365 -2524:3:3042 -2525:0:4365 -2526:2:1754 -2527:0:4365 -2528:3:3043 -2529:0:4365 -2530:2:1755 -2531:2:1759 -2532:2:1760 -2533:2:1768 -2534:2:1769 -2535:2:1773 -2536:2:1774 -2537:2:1768 -2538:2:1769 -2539:2:1773 -2540:2:1774 -2541:2:1782 -2542:2:1787 -2543:2:1791 -2544:2:1792 -2545:2:1799 -2546:2:1800 -2547:2:1811 -2548:2:1812 -2549:2:1813 -2550:2:1811 -2551:2:1812 -2552:2:1813 -2553:2:1824 -2554:2:1829 -2555:2:1830 -2556:0:4365 -2557:2:1842 -2558:0:4365 -2559:3:3042 -2560:0:4365 -2561:2:1844 -2562:0:4365 -2563:3:3043 -2564:0:4365 -2565:2:1845 -2566:2:1849 -2567:2:1850 -2568:2:1858 -2569:2:1859 -2570:2:1863 -2571:2:1864 -2572:2:1858 -2573:2:1859 -2574:2:1863 -2575:2:1864 -2576:2:1872 -2577:2:1877 -2578:2:1881 -2579:2:1882 -2580:2:1889 -2581:2:1890 -2582:2:1901 -2583:2:1902 -2584:2:1903 -2585:2:1901 -2586:2:1902 -2587:2:1903 -2588:2:1914 -2589:2:1919 -2590:2:1920 -2591:0:4365 -2592:2:1932 -2593:0:4365 -2594:3:3042 -2595:0:4365 -2596:2:1934 -2597:0:4365 -2598:3:3043 -2599:0:4365 -2600:2:1935 -2601:0:4365 -2602:2:1936 -2603:0:4365 -2604:2:2129 -2605:0:4365 -2606:2:2130 -2607:0:4365 -2608:2:2134 -2609:0:4365 -2610:3:3042 -2611:0:4365 -2612:2:2136 -2613:0:4365 -2614:3:3043 -2615:0:4365 -2616:2:2137 -2617:2:2141 -2618:2:2142 -2619:2:2150 -2620:2:2151 -2621:2:2155 -2622:2:2156 -2623:2:2150 -2624:2:2151 -2625:2:2155 -2626:2:2156 -2627:2:2164 -2628:2:2169 -2629:2:2173 -2630:2:2174 -2631:2:2181 -2632:2:2182 -2633:2:2193 -2634:2:2194 -2635:2:2195 -2636:2:2193 -2637:2:2194 -2638:2:2195 -2639:2:2206 -2640:2:2211 -2641:2:2212 -2642:0:4365 -2643:2:2224 -2644:0:4365 -2645:3:3042 -2646:0:4365 -2647:2:2226 -2648:0:4365 -2649:3:3043 -2650:0:4365 -2651:2:2230 -2652:0:4365 -2653:3:3042 -2654:0:4365 -2655:2:2235 -2656:2:2239 -2657:2:2240 -2658:2:2248 -2659:2:2249 -2660:2:2253 -2661:2:2254 -2662:2:2248 -2663:2:2249 -2664:2:2250 -2665:2:2262 -2666:2:2267 -2667:2:2271 -2668:2:2272 -2669:2:2279 -2670:2:2280 -2671:2:2291 -2672:2:2292 -2673:2:2293 -2674:2:2291 -2675:2:2292 -2676:2:2293 -2677:2:2304 -2678:2:2309 -2679:2:2310 -2680:0:4365 -2681:3:3043 -2682:0:4365 -2683:2:2322 -2684:0:4365 -2685:2:1169 -2686:0:4365 -2687:3:3042 -2688:0:4365 -2689:2:1170 -2690:0:4365 -2691:3:3043 -2692:0:4365 -2693:3:3044 -2694:0:4365 -2695:3:3257 -2696:0:4365 -2697:3:3362 -2698:0:4365 -2699:3:3363 -2700:0:4365 -2701:3:3367 -2702:0:4365 -2703:3:3373 -2704:3:3377 -2705:3:3378 -2706:3:3386 -2707:3:3387 -2708:3:3391 -2709:3:3392 -2710:3:3386 -2711:3:3387 -2712:3:3391 -2713:3:3392 -2714:3:3400 -2715:3:3405 -2716:3:3409 -2717:3:3410 -2718:3:3417 -2719:3:3418 -2720:3:3429 -2721:3:3430 -2722:3:3431 -2723:3:3429 -2724:3:3430 -2725:3:3431 -2726:3:3442 -2727:3:3447 -2728:3:3448 -2729:0:4365 -2730:3:3460 -2731:0:4365 -2732:3:3461 -2733:0:4365 -2734:2:1173 -2735:0:4365 -2736:3:3462 -2737:0:4365 -2738:2:1179 -2739:0:4365 -2740:2:1180 -2741:0:4365 -2742:3:3461 -2743:0:4365 -2744:2:1181 -2745:2:1185 -2746:2:1186 -2747:2:1194 -2748:2:1195 -2749:2:1199 -2750:2:1200 -2751:2:1194 -2752:2:1195 -2753:2:1199 -2754:2:1200 -2755:2:1208 -2756:2:1213 -2757:2:1217 -2758:2:1218 -2759:2:1225 -2760:2:1226 -2761:2:1237 -2762:2:1238 -2763:2:1239 -2764:2:1237 -2765:2:1238 -2766:2:1239 -2767:2:1250 -2768:2:1255 -2769:2:1256 -2770:0:4365 -2771:3:3462 -2772:0:4365 -2773:2:1268 -2774:0:4365 -2775:3:3461 -2776:0:4365 -2777:2:1270 -2778:0:4365 -2779:3:3462 -2780:0:4365 -2781:2:1271 -2782:2:1275 -2783:2:1276 -2784:2:1284 -2785:2:1285 -2786:2:1289 -2787:2:1290 -2788:2:1284 -2789:2:1285 -2790:2:1289 -2791:2:1290 -2792:2:1298 -2793:2:1303 -2794:2:1307 -2795:2:1308 -2796:2:1315 -2797:2:1316 -2798:2:1327 -2799:2:1328 -2800:2:1329 -2801:2:1327 -2802:2:1328 -2803:2:1329 -2804:2:1340 -2805:2:1345 -2806:2:1346 -2807:0:4365 -2808:2:1358 -2809:0:4365 -2810:2:1360 -2811:0:4365 -2812:3:3461 -2813:0:4365 -2814:2:1361 -2815:0:4365 -2816:3:3462 -2817:0:4365 -2818:2:1362 -2819:2:1366 -2820:2:1367 -2821:2:1375 -2822:2:1376 -2823:2:1380 -2824:2:1381 -2825:2:1375 -2826:2:1376 -2827:2:1380 -2828:2:1381 -2829:2:1389 -2830:2:1394 -2831:2:1398 -2832:2:1399 -2833:2:1406 -2834:2:1407 -2835:2:1418 -2836:2:1419 -2837:2:1420 -2838:2:1418 -2839:2:1419 -2840:2:1420 -2841:2:1431 -2842:2:1436 -2843:2:1437 -2844:0:4365 -2845:2:1449 -2846:0:4365 -2847:3:3461 -2848:0:4365 -2849:2:1451 -2850:0:4365 -2851:3:3462 -2852:0:4365 -2853:2:1652 -2854:0:4365 -2855:2:1653 -2856:0:4365 -2857:2:1657 -2858:0:4365 -2859:2:1660 -2860:0:4365 -2861:3:3461 -2862:0:4365 -2863:2:1665 -2864:2:1669 -2865:2:1670 -2866:2:1678 -2867:2:1679 -2868:2:1683 -2869:2:1684 -2870:2:1678 -2871:2:1679 -2872:2:1680 -2873:2:1692 -2874:2:1697 -2875:2:1701 -2876:2:1702 -2877:2:1709 -2878:2:1710 -2879:2:1721 -2880:2:1722 -2881:2:1723 -2882:2:1721 -2883:2:1722 -2884:2:1723 -2885:2:1734 -2886:2:1739 -2887:2:1740 -2888:0:4365 -2889:3:3462 -2890:0:4365 -2891:2:1752 -2892:0:4365 -2893:3:3461 -2894:0:4365 -2895:2:1754 -2896:0:4365 -2897:3:3462 -2898:0:4365 -2899:2:1755 -2900:2:1759 -2901:2:1760 -2902:2:1768 -2903:2:1769 -2904:2:1773 -2905:2:1774 -2906:2:1768 -2907:2:1769 -2908:2:1773 -2909:2:1774 -2910:2:1782 -2911:2:1787 -2912:2:1791 -2913:2:1792 -2914:2:1799 -2915:2:1800 -2916:2:1811 -2917:2:1812 -2918:2:1813 -2919:2:1811 -2920:2:1812 -2921:2:1813 -2922:2:1824 -2923:2:1829 -2924:2:1830 -2925:0:4365 -2926:2:1842 -2927:0:4365 -2928:3:3461 -2929:0:4365 -2930:2:1844 -2931:0:4365 -2932:3:3462 -2933:0:4365 -2934:2:1845 -2935:2:1849 -2936:2:1850 -2937:2:1858 -2938:2:1859 -2939:2:1863 -2940:2:1864 -2941:2:1858 -2942:2:1859 -2943:2:1863 -2944:2:1864 -2945:2:1872 -2946:2:1877 -2947:2:1881 -2948:2:1882 -2949:2:1889 -2950:2:1890 -2951:2:1901 -2952:2:1902 -2953:2:1903 -2954:2:1901 -2955:2:1902 -2956:2:1903 -2957:2:1914 -2958:2:1919 -2959:2:1920 -2960:0:4365 -2961:2:1932 -2962:0:4365 -2963:3:3461 -2964:0:4365 -2965:2:1934 -2966:0:4365 -2967:3:3462 -2968:0:4365 -2969:2:1935 -2970:0:4365 -2971:2:1936 -2972:0:4365 -2973:2:2129 -2974:0:4365 -2975:2:2130 -2976:0:4365 -2977:2:2134 -2978:0:4365 -2979:3:3461 -2980:0:4365 -2981:2:2136 -2982:0:4365 -2983:3:3462 -2984:0:4365 -2985:2:2137 -2986:2:2141 -2987:2:2142 -2988:2:2150 -2989:2:2151 -2990:2:2155 -2991:2:2156 -2992:2:2150 -2993:2:2151 -2994:2:2155 -2995:2:2156 -2996:2:2164 -2997:2:2169 -2998:2:2173 -2999:2:2174 -3000:2:2181 -3001:2:2182 -3002:2:2193 -3003:2:2194 -3004:2:2195 -3005:2:2193 -3006:2:2194 -3007:2:2195 -3008:2:2206 -3009:2:2211 -3010:2:2212 -3011:0:4365 -3012:2:2224 -3013:0:4365 -3014:3:3461 -3015:0:4365 -3016:2:2226 -3017:0:4365 -3018:3:3462 -3019:0:4365 -3020:2:2230 -3021:0:4365 -3022:3:3461 -3023:0:4365 -3024:2:2235 -3025:2:2239 -3026:2:2240 -3027:2:2248 -3028:2:2249 -3029:2:2253 -3030:2:2254 -3031:2:2248 -3032:2:2249 -3033:2:2250 -3034:2:2262 -3035:2:2267 -3036:2:2271 -3037:2:2272 -3038:2:2279 -3039:2:2280 -3040:2:2291 -3041:2:2292 -3042:2:2293 -3043:2:2291 -3044:2:2292 -3045:2:2293 -3046:2:2304 -3047:2:2309 -3048:2:2310 -3049:0:4365 -3050:3:3462 -3051:0:4365 -3052:2:2322 -3053:0:4365 -3054:2:1169 -3055:0:4365 -3056:3:3461 -3057:0:4365 -3058:2:1170 -3059:0:4365 -3060:3:3462 -3061:0:4365 -3062:3:3463 -3063:0:4365 -3064:3:3469 -3065:0:4365 -3066:3:3470 -3067:3:3474 -3068:3:3475 -3069:3:3483 -3070:3:3484 -3071:3:3488 -3072:3:3489 -3073:3:3483 -3074:3:3484 -3075:3:3488 -3076:3:3489 -3077:3:3497 -3078:3:3502 -3079:3:3506 -3080:3:3507 -3081:3:3514 -3082:3:3515 -3083:3:3526 -3084:3:3527 -3085:3:3528 -3086:3:3526 -3087:3:3527 -3088:3:3528 -3089:3:3539 -3090:3:3544 -3091:3:3545 -3092:0:4365 -3093:3:3557 -3094:0:4365 -3095:3:3558 -3096:0:4365 -3097:2:1173 -3098:0:4365 -3099:3:3559 -3100:0:4365 -3101:2:1179 -3102:0:4365 -3103:2:1180 -3104:0:4365 -3105:3:3558 -3106:0:4365 -3107:2:1181 -3108:2:1185 -3109:2:1186 -3110:2:1194 -3111:2:1195 -3112:2:1199 -3113:2:1200 -3114:2:1194 -3115:2:1195 -3116:2:1199 -3117:2:1200 -3118:2:1208 -3119:2:1213 -3120:2:1217 -3121:2:1218 -3122:2:1225 -3123:2:1226 -3124:2:1237 -3125:2:1238 -3126:2:1239 -3127:2:1237 -3128:2:1238 -3129:2:1239 -3130:2:1250 -3131:2:1255 -3132:2:1256 -3133:0:4365 -3134:3:3559 -3135:0:4365 -3136:2:1268 -3137:0:4365 -3138:3:3558 -3139:0:4365 -3140:2:1270 -3141:0:4365 -3142:3:3559 -3143:0:4365 -3144:2:1271 -3145:2:1275 -3146:2:1276 -3147:2:1284 -3148:2:1285 -3149:2:1289 -3150:2:1290 -3151:2:1284 -3152:2:1285 -3153:2:1289 -3154:2:1290 -3155:2:1298 -3156:2:1303 -3157:2:1307 -3158:2:1308 -3159:2:1315 -3160:2:1316 -3161:2:1327 -3162:2:1328 -3163:2:1329 -3164:2:1327 -3165:2:1328 -3166:2:1329 -3167:2:1340 -3168:2:1345 -3169:2:1346 -3170:0:4365 -3171:2:1358 -3172:0:4365 -3173:2:1360 -3174:0:4365 -3175:3:3558 -3176:0:4365 -3177:2:1361 -3178:0:4365 -3179:3:3559 -3180:0:4365 -3181:2:1362 -3182:2:1366 -3183:2:1367 -3184:2:1375 -3185:2:1376 -3186:2:1380 -3187:2:1381 -3188:2:1375 -3189:2:1376 -3190:2:1380 -3191:2:1381 -3192:2:1389 -3193:2:1394 -3194:2:1398 -3195:2:1399 -3196:2:1406 -3197:2:1407 -3198:2:1418 -3199:2:1419 -3200:2:1420 -3201:2:1418 -3202:2:1419 -3203:2:1420 -3204:2:1431 -3205:2:1436 -3206:2:1437 -3207:0:4365 -3208:2:1449 -3209:0:4365 -3210:3:3558 -3211:0:4365 -3212:2:1451 -3213:0:4365 -3214:3:3559 -3215:0:4365 -3216:2:1652 -3217:0:4365 -3218:2:1653 -3219:0:4365 -3220:2:1657 -3221:0:4365 -3222:2:1660 -3223:0:4365 -3224:3:3558 -3225:0:4365 -3226:2:1665 -3227:2:1669 -3228:2:1670 -3229:2:1678 -3230:2:1679 -3231:2:1683 -3232:2:1684 -3233:2:1678 -3234:2:1679 -3235:2:1680 -3236:2:1692 -3237:2:1697 -3238:2:1701 -3239:2:1702 -3240:2:1709 -3241:2:1710 -3242:2:1721 -3243:2:1722 -3244:2:1723 -3245:2:1721 -3246:2:1722 -3247:2:1723 -3248:2:1734 -3249:2:1739 -3250:2:1740 -3251:0:4365 -3252:3:3559 -3253:0:4365 -3254:2:1752 -3255:0:4365 -3256:3:3558 -3257:0:4365 -3258:2:1754 -3259:0:4365 -3260:3:3559 -3261:0:4365 -3262:2:1755 -3263:2:1759 -3264:2:1760 -3265:2:1768 -3266:2:1769 -3267:2:1773 -3268:2:1774 -3269:2:1768 -3270:2:1769 -3271:2:1773 -3272:2:1774 -3273:2:1782 -3274:2:1787 -3275:2:1791 -3276:2:1792 -3277:2:1799 -3278:2:1800 -3279:2:1811 -3280:2:1812 -3281:2:1813 -3282:2:1811 -3283:2:1812 -3284:2:1813 -3285:2:1824 -3286:2:1829 -3287:2:1830 -3288:0:4365 -3289:2:1842 -3290:0:4365 -3291:3:3558 -3292:0:4365 -3293:2:1844 -3294:0:4365 -3295:3:3559 -3296:0:4365 -3297:2:1845 -3298:2:1849 -3299:2:1850 -3300:2:1858 -3301:2:1859 -3302:2:1863 -3303:2:1864 -3304:2:1858 -3305:2:1859 -3306:2:1863 -3307:2:1864 -3308:2:1872 -3309:2:1877 -3310:2:1881 -3311:2:1882 -3312:2:1889 -3313:2:1890 -3314:2:1901 -3315:2:1902 -3316:2:1903 -3317:2:1901 -3318:2:1902 -3319:2:1903 -3320:2:1914 -3321:2:1919 -3322:2:1920 -3323:0:4365 -3324:2:1932 -3325:0:4365 -3326:3:3558 -3327:0:4365 -3328:2:1934 -3329:0:4365 -3330:3:3559 -3331:0:4365 -3332:2:1935 -3333:0:4365 -3334:2:1936 -3335:0:4365 -3336:2:2129 -3337:0:4365 -3338:2:2130 -3339:0:4365 -3340:2:2134 -3341:0:4365 -3342:3:3558 -3343:0:4365 -3344:2:2136 -3345:0:4365 -3346:3:3559 -3347:0:4365 -3348:2:2137 -3349:2:2141 -3350:2:2142 -3351:2:2150 -3352:2:2151 -3353:2:2155 -3354:2:2156 -3355:2:2150 -3356:2:2151 -3357:2:2155 -3358:2:2156 -3359:2:2164 -3360:2:2169 -3361:2:2173 -3362:2:2174 -3363:2:2181 -3364:2:2182 -3365:2:2193 -3366:2:2194 -3367:2:2195 -3368:2:2193 -3369:2:2194 -3370:2:2195 -3371:2:2206 -3372:2:2211 -3373:2:2212 -3374:0:4365 -3375:2:2224 -3376:0:4365 -3377:3:3558 -3378:0:4365 -3379:2:2226 -3380:0:4365 -3381:3:3559 -3382:0:4365 -3383:2:2230 -3384:0:4365 -3385:3:3558 -3386:0:4365 -3387:2:2235 -3388:2:2239 -3389:2:2240 -3390:2:2248 -3391:2:2249 -3392:2:2253 -3393:2:2254 -3394:2:2248 -3395:2:2249 -3396:2:2250 -3397:2:2262 -3398:2:2267 -3399:2:2271 -3400:2:2272 -3401:2:2279 -3402:2:2280 -3403:2:2291 -3404:2:2292 -3405:2:2293 -3406:2:2291 -3407:2:2292 -3408:2:2293 -3409:2:2304 -3410:2:2309 -3411:2:2310 -3412:0:4365 -3413:3:3559 -3414:0:4365 -3415:2:2322 -3416:0:4365 -3417:2:1169 -3418:0:4365 -3419:3:3558 -3420:0:4365 -3421:2:1170 -3422:0:4365 -3423:3:3559 -3424:0:4365 -3425:3:3560 -3426:0:4365 -3427:3:3566 -3428:0:4365 -3429:3:3569 -3430:3:3570 -3431:3:3582 -3432:3:3583 -3433:3:3587 -3434:3:3588 -3435:3:3582 -3436:3:3583 -3437:3:3587 -3438:3:3588 -3439:3:3596 -3440:3:3601 -3441:3:3605 -3442:3:3606 -3443:3:3613 -3444:3:3614 -3445:3:3625 -3446:3:3626 -3447:3:3627 -3448:3:3625 -3449:3:3626 -3450:3:3627 -3451:3:3638 -3452:3:3643 -3453:3:3644 -3454:0:4365 -3455:3:3656 -3456:0:4365 -3457:3:3657 -3458:0:4365 -3459:2:1173 -3460:0:4365 -3461:3:3658 -3462:0:4365 -3463:2:1179 -3464:0:4365 -3465:2:1180 -3466:0:4365 -3467:3:3657 -3468:0:4365 -3469:2:1181 -3470:2:1185 -3471:2:1186 -3472:2:1194 -3473:2:1195 -3474:2:1199 -3475:2:1200 -3476:2:1194 -3477:2:1195 -3478:2:1199 -3479:2:1200 -3480:2:1208 -3481:2:1213 -3482:2:1217 -3483:2:1218 -3484:2:1225 -3485:2:1226 -3486:2:1237 -3487:2:1238 -3488:2:1239 -3489:2:1237 -3490:2:1238 -3491:2:1239 -3492:2:1250 -3493:2:1255 -3494:2:1256 -3495:0:4365 -3496:3:3658 -3497:0:4365 -3498:2:1268 -3499:0:4365 -3500:3:3657 -3501:0:4365 -3502:2:1270 -3503:0:4365 -3504:3:3658 -3505:0:4365 -3506:2:1271 -3507:2:1275 -3508:2:1276 -3509:2:1284 -3510:2:1285 -3511:2:1289 -3512:2:1290 -3513:2:1284 -3514:2:1285 -3515:2:1289 -3516:2:1290 -3517:2:1298 -3518:2:1303 -3519:2:1307 -3520:2:1308 -3521:2:1315 -3522:2:1316 -3523:2:1327 -3524:2:1328 -3525:2:1329 -3526:2:1327 -3527:2:1328 -3528:2:1329 -3529:2:1340 -3530:2:1345 -3531:2:1346 -3532:0:4365 -3533:2:1358 -3534:0:4365 -3535:2:1360 -3536:0:4365 -3537:3:3657 -3538:0:4365 -3539:2:1361 -3540:0:4365 -3541:3:3658 -3542:0:4365 -3543:2:1362 -3544:2:1366 -3545:2:1367 -3546:2:1375 -3547:2:1376 -3548:2:1380 -3549:2:1381 -3550:2:1375 -3551:2:1376 -3552:2:1380 -3553:2:1381 -3554:2:1389 -3555:2:1394 -3556:2:1398 -3557:2:1399 -3558:2:1406 -3559:2:1407 -3560:2:1418 -3561:2:1419 -3562:2:1420 -3563:2:1418 -3564:2:1419 -3565:2:1420 -3566:2:1431 -3567:2:1436 -3568:2:1437 -3569:0:4365 -3570:2:1449 -3571:0:4365 -3572:3:3657 -3573:0:4365 -3574:2:1451 -3575:0:4365 -3576:3:3658 -3577:0:4365 -3578:2:1652 -3579:0:4365 -3580:2:1653 -3581:0:4365 -3582:2:1657 -3583:0:4365 -3584:2:1660 -3585:0:4365 -3586:3:3657 -3587:0:4365 -3588:2:1665 -3589:2:1669 -3590:2:1670 -3591:2:1678 -3592:2:1679 -3593:2:1683 -3594:2:1684 -3595:2:1678 -3596:2:1679 -3597:2:1680 -3598:2:1692 -3599:2:1697 -3600:2:1701 -3601:2:1702 -3602:2:1709 -3603:2:1710 -3604:2:1721 -3605:2:1722 -3606:2:1723 -3607:2:1721 -3608:2:1722 -3609:2:1723 -3610:2:1734 -3611:2:1739 -3612:2:1740 -3613:0:4365 -3614:3:3658 -3615:0:4365 -3616:2:1752 -3617:0:4365 -3618:3:3657 -3619:0:4365 -3620:2:1754 -3621:0:4365 -3622:3:3658 -3623:0:4365 -3624:2:1755 -3625:2:1759 -3626:2:1760 -3627:2:1768 -3628:2:1769 -3629:2:1773 -3630:2:1774 -3631:2:1768 -3632:2:1769 -3633:2:1773 -3634:2:1774 -3635:2:1782 -3636:2:1787 -3637:2:1791 -3638:2:1792 -3639:2:1799 -3640:2:1800 -3641:2:1811 -3642:2:1812 -3643:2:1813 -3644:2:1811 -3645:2:1812 -3646:2:1813 -3647:2:1824 -3648:2:1829 -3649:2:1830 -3650:0:4365 -3651:2:1842 -3652:0:4365 -3653:3:3657 -3654:0:4365 -3655:2:1844 -3656:0:4365 -3657:3:3658 -3658:0:4365 -3659:2:1845 -3660:2:1849 -3661:2:1850 -3662:2:1858 -3663:2:1859 -3664:2:1863 -3665:2:1864 -3666:2:1858 -3667:2:1859 -3668:2:1863 -3669:2:1864 -3670:2:1872 -3671:2:1877 -3672:2:1881 -3673:2:1882 -3674:2:1889 -3675:2:1890 -3676:2:1901 -3677:2:1902 -3678:2:1903 -3679:2:1901 -3680:2:1902 -3681:2:1903 -3682:2:1914 -3683:2:1919 -3684:2:1920 -3685:0:4365 -3686:2:1932 -3687:0:4365 -3688:3:3657 -3689:0:4365 -3690:2:1934 -3691:0:4365 -3692:3:3658 -3693:0:4365 -3694:2:1935 -3695:0:4365 -3696:2:1936 -3697:0:4365 -3698:2:2129 -3699:0:4365 -3700:2:2130 -3701:0:4365 -3702:2:2134 -3703:0:4365 -3704:3:3657 -3705:0:4365 -3706:2:2136 -3707:0:4365 -3708:3:3658 -3709:0:4365 -3710:2:2137 -3711:2:2141 -3712:2:2142 -3713:2:2150 -3714:2:2151 -3715:2:2155 -3716:2:2156 -3717:2:2150 -3718:2:2151 -3719:2:2155 -3720:2:2156 -3721:2:2164 -3722:2:2169 -3723:2:2173 -3724:2:2174 -3725:2:2181 -3726:2:2182 -3727:2:2193 -3728:2:2194 -3729:2:2195 -3730:2:2193 -3731:2:2194 -3732:2:2195 -3733:2:2206 -3734:2:2211 -3735:2:2212 -3736:0:4365 -3737:2:2224 -3738:0:4365 -3739:3:3657 -3740:0:4365 -3741:2:2226 -3742:0:4365 -3743:3:3658 -3744:0:4365 -3745:2:2230 -3746:0:4365 -3747:3:3657 -3748:0:4365 -3749:2:2235 -3750:2:2239 -3751:2:2240 -3752:2:2248 -3753:2:2249 -3754:2:2253 -3755:2:2254 -3756:2:2248 -3757:2:2249 -3758:2:2250 -3759:2:2262 -3760:2:2267 -3761:2:2271 -3762:2:2272 -3763:2:2279 -3764:2:2280 -3765:2:2291 -3766:2:2292 -3767:2:2293 -3768:2:2291 -3769:2:2292 -3770:2:2293 -3771:2:2304 -3772:2:2309 -3773:2:2310 -3774:0:4365 -3775:3:3658 -3776:0:4365 -3777:2:2322 -3778:0:4365 -3779:2:1169 -3780:0:4365 -3781:3:3657 -3782:0:4365 -3783:2:1170 -3784:0:4365 -3785:3:3658 -3786:0:4365 -3787:3:3659 -3788:0:4365 -3789:3:3665 -3790:0:4365 -3791:3:3666 -3792:0:4365 -3793:3:3667 -3794:0:4365 -3795:3:3668 -3796:0:4365 -3797:3:3669 -3798:3:3673 -3799:3:3674 -3800:3:3682 -3801:3:3683 -3802:3:3687 -3803:3:3688 -3804:3:3682 -3805:3:3683 -3806:3:3687 -3807:3:3688 -3808:3:3696 -3809:3:3701 -3810:3:3705 -3811:3:3706 -3812:3:3713 -3813:3:3714 -3814:3:3725 -3815:3:3726 -3816:3:3727 -3817:3:3725 -3818:3:3726 -3819:3:3727 -3820:3:3738 -3821:3:3743 -3822:3:3744 -3823:0:4365 -3824:3:3756 -3825:0:4365 -3826:3:3757 -3827:0:4365 -3828:2:1173 -3829:0:4365 -3830:3:3758 -3831:0:4365 -3832:2:1179 -3833:0:4365 -3834:2:1180 -3835:0:4365 -3836:3:3757 -3837:0:4365 -3838:2:1181 -3839:2:1185 -3840:2:1186 -3841:2:1194 -3842:2:1195 -3843:2:1199 -3844:2:1200 -3845:2:1194 -3846:2:1195 -3847:2:1199 -3848:2:1200 -3849:2:1208 -3850:2:1213 -3851:2:1217 -3852:2:1218 -3853:2:1225 -3854:2:1226 -3855:2:1237 -3856:2:1238 -3857:2:1239 -3858:2:1237 -3859:2:1238 -3860:2:1239 -3861:2:1250 -3862:2:1255 -3863:2:1256 -3864:0:4365 -3865:3:3758 -3866:0:4365 -3867:2:1268 -3868:0:4365 -3869:3:3757 -3870:0:4365 -3871:2:1270 -3872:0:4365 -3873:3:3758 -3874:0:4365 -3875:2:1271 -3876:2:1275 -3877:2:1276 -3878:2:1284 -3879:2:1285 -3880:2:1289 -3881:2:1290 -3882:2:1284 -3883:2:1285 -3884:2:1289 -3885:2:1290 -3886:2:1298 -3887:2:1303 -3888:2:1307 -3889:2:1308 -3890:2:1315 -3891:2:1316 -3892:2:1327 -3893:2:1328 -3894:2:1329 -3895:2:1327 -3896:2:1328 -3897:2:1329 -3898:2:1340 -3899:2:1345 -3900:2:1346 -3901:0:4365 -3902:2:1358 -3903:0:4365 -3904:2:1360 -3905:0:4365 -3906:3:3757 -3907:0:4365 -3908:2:1361 -3909:0:4365 -3910:3:3758 -3911:0:4365 -3912:2:1362 -3913:2:1366 -3914:2:1367 -3915:2:1375 -3916:2:1376 -3917:2:1380 -3918:2:1381 -3919:2:1375 -3920:2:1376 -3921:2:1380 -3922:2:1381 -3923:2:1389 -3924:2:1394 -3925:2:1398 -3926:2:1399 -3927:2:1406 -3928:2:1407 -3929:2:1418 -3930:2:1419 -3931:2:1420 -3932:2:1418 -3933:2:1419 -3934:2:1420 -3935:2:1431 -3936:2:1436 -3937:2:1437 -3938:0:4365 -3939:2:1449 -3940:0:4365 -3941:3:3757 -3942:0:4365 -3943:2:1451 -3944:0:4365 -3945:3:3758 -3946:0:4365 -3947:2:1652 -3948:0:4365 -3949:2:1653 -3950:0:4365 -3951:2:1657 -3952:0:4365 -3953:2:1660 -3954:0:4365 -3955:3:3757 -3956:0:4365 -3957:2:1665 -3958:2:1669 -3959:2:1670 -3960:2:1678 -3961:2:1679 -3962:2:1683 -3963:2:1684 -3964:2:1678 -3965:2:1679 -3966:2:1680 -3967:2:1692 -3968:2:1697 -3969:2:1701 -3970:2:1702 -3971:2:1709 -3972:2:1710 -3973:2:1721 -3974:2:1722 -3975:2:1723 -3976:2:1721 -3977:2:1722 -3978:2:1723 -3979:2:1734 -3980:2:1739 -3981:2:1740 -3982:0:4365 -3983:3:3758 -3984:0:4365 -3985:2:1752 -3986:0:4365 -3987:3:3757 -3988:0:4365 -3989:2:1754 -3990:0:4365 -3991:3:3758 -3992:0:4365 -3993:2:1755 -3994:2:1759 -3995:2:1760 -3996:2:1768 -3997:2:1769 -3998:2:1773 -3999:2:1774 -4000:2:1768 -4001:2:1769 -4002:2:1773 -4003:2:1774 -4004:2:1782 -4005:2:1787 -4006:2:1791 -4007:2:1792 -4008:2:1799 -4009:2:1800 -4010:2:1811 -4011:2:1812 -4012:2:1813 -4013:2:1811 -4014:2:1812 -4015:2:1813 -4016:2:1824 -4017:2:1829 -4018:2:1830 -4019:0:4365 -4020:2:1842 -4021:0:4365 -4022:3:3757 -4023:0:4365 -4024:2:1844 -4025:0:4365 -4026:3:3758 -4027:0:4365 -4028:2:1845 -4029:2:1849 -4030:2:1850 -4031:2:1858 -4032:2:1859 -4033:2:1863 -4034:2:1864 -4035:2:1858 -4036:2:1859 -4037:2:1863 -4038:2:1864 -4039:2:1872 -4040:2:1877 -4041:2:1881 -4042:2:1882 -4043:2:1889 -4044:2:1890 -4045:2:1901 -4046:2:1902 -4047:2:1903 -4048:2:1901 -4049:2:1902 -4050:2:1903 -4051:2:1914 -4052:2:1919 -4053:2:1920 -4054:0:4365 -4055:2:1932 -4056:0:4365 -4057:3:3757 -4058:0:4365 -4059:2:1934 -4060:0:4365 -4061:3:3758 -4062:0:4365 -4063:2:1935 -4064:0:4365 -4065:2:1936 -4066:0:4365 -4067:2:2129 -4068:0:4365 -4069:2:2130 -4070:0:4365 -4071:2:2134 -4072:0:4365 -4073:3:3757 -4074:0:4365 -4075:2:2136 -4076:0:4365 -4077:3:3758 -4078:0:4365 -4079:2:2137 -4080:2:2141 -4081:2:2142 -4082:2:2150 -4083:2:2151 -4084:2:2155 -4085:2:2156 -4086:2:2150 -4087:2:2151 -4088:2:2155 -4089:2:2156 -4090:2:2164 -4091:2:2169 -4092:2:2173 -4093:2:2174 -4094:2:2181 -4095:2:2182 -4096:2:2193 -4097:2:2194 -4098:2:2195 -4099:2:2193 -4100:2:2194 -4101:2:2195 -4102:2:2206 -4103:2:2211 -4104:2:2212 -4105:0:4365 -4106:2:2224 -4107:0:4365 -4108:3:3757 -4109:0:4365 -4110:2:2226 -4111:0:4365 -4112:3:3758 -4113:0:4365 -4114:2:2230 -4115:0:4365 -4116:3:3757 -4117:0:4365 -4118:2:2235 -4119:2:2239 -4120:2:2240 -4121:2:2248 -4122:2:2249 -4123:2:2253 -4124:2:2254 -4125:2:2248 -4126:2:2249 -4127:2:2250 -4128:2:2262 -4129:2:2267 -4130:2:2271 -4131:2:2272 -4132:2:2279 -4133:2:2280 -4134:2:2291 -4135:2:2292 -4136:2:2293 -4137:2:2291 -4138:2:2292 -4139:2:2293 -4140:2:2304 -4141:2:2309 -4142:2:2310 -4143:0:4365 -4144:3:3758 -4145:0:4365 -4146:2:2322 -4147:0:4365 -4148:2:1169 -4149:0:4365 -4150:3:3757 -4151:0:4365 -4152:2:1170 -4153:0:4365 -4154:3:3758 -4155:0:4365 -4156:3:3759 -4157:0:4365 -4158:3:3972 -4159:0:4365 -4160:3:3980 -4161:0:4365 -4162:3:3981 -4163:3:3985 -4164:3:3986 -4165:3:3994 -4166:3:3995 -4167:3:3999 -4168:3:4000 -4169:3:3994 -4170:3:3995 -4171:3:3999 -4172:3:4000 -4173:3:4008 -4174:3:4013 -4175:3:4017 -4176:3:4018 -4177:3:4025 -4178:3:4026 -4179:3:4037 -4180:3:4038 -4181:3:4039 -4182:3:4037 -4183:3:4038 -4184:3:4039 -4185:3:4050 -4186:3:4055 -4187:3:4056 -4188:0:4365 -4189:3:4068 -4190:0:4365 -4191:3:4069 -4192:0:4365 -4193:2:1173 -4194:0:4365 -4195:3:4070 -4196:0:4365 -4197:2:1179 -4198:0:4365 -4199:2:1180 -4200:0:4365 -4201:3:4069 -4202:0:4365 -4203:2:1181 -4204:2:1185 -4205:2:1186 -4206:2:1194 -4207:2:1195 -4208:2:1199 -4209:2:1200 -4210:2:1194 -4211:2:1195 -4212:2:1199 -4213:2:1200 -4214:2:1208 -4215:2:1213 -4216:2:1217 -4217:2:1218 -4218:2:1225 -4219:2:1226 -4220:2:1237 -4221:2:1238 -4222:2:1239 -4223:2:1237 -4224:2:1238 -4225:2:1239 -4226:2:1250 -4227:2:1255 -4228:2:1256 -4229:0:4365 -4230:3:4070 -4231:0:4365 -4232:2:1268 -4233:0:4365 -4234:3:4069 -4235:0:4365 -4236:2:1270 -4237:0:4365 -4238:3:4070 -4239:0:4365 -4240:2:1271 -4241:2:1275 -4242:2:1276 -4243:2:1284 -4244:2:1285 -4245:2:1289 -4246:2:1290 -4247:2:1284 -4248:2:1285 -4249:2:1289 -4250:2:1290 -4251:2:1298 -4252:2:1303 -4253:2:1307 -4254:2:1308 -4255:2:1315 -4256:2:1316 -4257:2:1327 -4258:2:1328 -4259:2:1329 -4260:2:1327 -4261:2:1328 -4262:2:1329 -4263:2:1340 -4264:2:1345 -4265:2:1346 -4266:0:4365 -4267:2:1358 -4268:0:4365 -4269:2:1360 -4270:0:4365 -4271:3:4069 -4272:0:4365 -4273:2:1361 -4274:0:4365 -4275:3:4070 -4276:0:4365 -4277:2:1362 -4278:2:1366 -4279:2:1367 -4280:2:1375 -4281:2:1376 -4282:2:1380 -4283:2:1381 -4284:2:1375 -4285:2:1376 -4286:2:1380 -4287:2:1381 -4288:2:1389 -4289:2:1394 -4290:2:1398 -4291:2:1399 -4292:2:1406 -4293:2:1407 -4294:2:1418 -4295:2:1419 -4296:2:1420 -4297:2:1418 -4298:2:1419 -4299:2:1420 -4300:2:1431 -4301:2:1436 -4302:2:1437 -4303:0:4365 -4304:2:1449 -4305:0:4365 -4306:3:4069 -4307:0:4365 -4308:2:1451 -4309:0:4365 -4310:3:4070 -4311:0:4365 -4312:2:1652 -4313:0:4365 -4314:2:1653 -4315:0:4365 -4316:2:1657 -4317:0:4365 -4318:2:1660 -4319:0:4365 -4320:3:4069 -4321:0:4365 -4322:2:1665 -4323:2:1669 -4324:2:1670 -4325:2:1678 -4326:2:1679 -4327:2:1683 -4328:2:1684 -4329:2:1678 -4330:2:1679 -4331:2:1680 -4332:2:1692 -4333:2:1697 -4334:2:1701 -4335:2:1702 -4336:2:1709 -4337:2:1710 -4338:2:1721 -4339:2:1722 -4340:2:1723 -4341:2:1721 -4342:2:1722 -4343:2:1723 -4344:2:1734 -4345:2:1739 -4346:2:1740 -4347:0:4365 -4348:3:4070 -4349:0:4365 -4350:2:1752 -4351:0:4365 -4352:3:4069 -4353:0:4365 -4354:2:1754 -4355:0:4365 -4356:3:4070 -4357:0:4365 -4358:2:1755 -4359:2:1759 -4360:2:1760 -4361:2:1768 -4362:2:1769 -4363:2:1773 -4364:2:1774 -4365:2:1768 -4366:2:1769 -4367:2:1773 -4368:2:1774 -4369:2:1782 -4370:2:1787 -4371:2:1791 -4372:2:1792 -4373:2:1799 -4374:2:1800 -4375:2:1811 -4376:2:1812 -4377:2:1813 -4378:2:1811 -4379:2:1812 -4380:2:1813 -4381:2:1824 -4382:2:1829 -4383:2:1830 -4384:0:4365 -4385:2:1842 -4386:0:4365 -4387:3:4069 -4388:0:4365 -4389:2:1844 -4390:0:4365 -4391:3:4070 -4392:0:4365 -4393:2:1845 -4394:2:1849 -4395:2:1850 -4396:2:1858 -4397:2:1859 -4398:2:1863 -4399:2:1864 -4400:2:1858 -4401:2:1859 -4402:2:1863 -4403:2:1864 -4404:2:1872 -4405:2:1877 -4406:2:1881 -4407:2:1882 -4408:2:1889 -4409:2:1890 -4410:2:1901 -4411:2:1902 -4412:2:1903 -4413:2:1901 -4414:2:1902 -4415:2:1903 -4416:2:1914 -4417:2:1919 -4418:2:1920 -4419:0:4365 -4420:2:1932 -4421:0:4365 -4422:3:4069 -4423:0:4365 -4424:2:1934 -4425:0:4365 -4426:3:4070 -4427:0:4365 -4428:2:1935 -4429:0:4365 -4430:2:1936 -4431:0:4365 -4432:2:2129 -4433:0:4365 -4434:2:2130 -4435:0:4365 -4436:2:2134 -4437:0:4365 -4438:3:4069 -4439:0:4365 -4440:2:2136 -4441:0:4365 -4442:3:4070 -4443:0:4365 -4444:2:2137 -4445:2:2141 -4446:2:2142 -4447:2:2150 -4448:2:2151 -4449:2:2155 -4450:2:2156 -4451:2:2150 -4452:2:2151 -4453:2:2155 -4454:2:2156 -4455:2:2164 -4456:2:2169 -4457:2:2173 -4458:2:2174 -4459:2:2181 -4460:2:2182 -4461:2:2193 -4462:2:2194 -4463:2:2195 -4464:2:2193 -4465:2:2194 -4466:2:2195 -4467:2:2206 -4468:2:2211 -4469:2:2212 -4470:0:4365 -4471:2:2224 -4472:0:4365 -4473:3:4069 -4474:0:4365 -4475:2:2226 -4476:0:4365 -4477:3:4070 -4478:0:4365 -4479:2:2230 -4480:0:4365 -4481:3:4069 -4482:0:4365 -4483:2:2235 -4484:2:2239 -4485:2:2240 -4486:2:2248 -4487:2:2249 -4488:2:2253 -4489:2:2254 -4490:2:2248 -4491:2:2249 -4492:2:2250 -4493:2:2262 -4494:2:2267 -4495:2:2271 -4496:2:2272 -4497:2:2279 -4498:2:2280 -4499:2:2291 -4500:2:2292 -4501:2:2293 -4502:2:2291 -4503:2:2292 -4504:2:2293 -4505:2:2304 -4506:2:2309 -4507:2:2310 -4508:0:4365 -4509:3:4070 -4510:0:4365 -4511:2:2322 -4512:0:4365 -4513:2:1169 -4514:0:4365 -4515:3:4069 -4516:0:4365 -4517:2:1170 -4518:0:4365 -4519:3:4070 -4520:0:4365 -4521:3:4071 -4522:0:4365 -4523:3:4081 -4524:0:4365 -4525:3:3666 -4526:0:4365 -4527:3:3667 -4528:0:4365 -4529:3:3668 -4530:0:4365 -4531:3:3669 -4532:3:3673 -4533:3:3674 -4534:3:3682 -4535:3:3683 -4536:3:3687 -4537:3:3688 -4538:3:3682 -4539:3:3683 -4540:3:3687 -4541:3:3688 -4542:3:3696 -4543:3:3701 -4544:3:3705 -4545:3:3706 -4546:3:3713 -4547:3:3714 -4548:3:3725 -4549:3:3726 -4550:3:3727 -4551:3:3725 -4552:3:3726 -4553:3:3727 -4554:3:3738 -4555:3:3743 -4556:3:3744 -4557:0:4365 -4558:3:3756 -4559:0:4365 -4560:3:3757 -4561:0:4365 -4562:2:1173 -4563:0:4365 -4564:3:3758 -4565:0:4365 -4566:2:1179 -4567:0:4365 -4568:2:1180 -4569:0:4365 -4570:3:3757 -4571:0:4365 -4572:2:1181 -4573:2:1185 -4574:2:1186 -4575:2:1194 -4576:2:1195 -4577:2:1199 -4578:2:1200 -4579:2:1194 -4580:2:1195 -4581:2:1199 -4582:2:1200 -4583:2:1208 -4584:2:1213 -4585:2:1217 -4586:2:1218 -4587:2:1225 -4588:2:1226 -4589:2:1237 -4590:2:1238 -4591:2:1239 -4592:2:1237 -4593:2:1238 -4594:2:1239 -4595:2:1250 -4596:2:1255 -4597:2:1256 -4598:0:4365 -4599:3:3758 -4600:0:4365 -4601:2:1268 -4602:0:4365 -4603:3:3757 -4604:0:4365 -4605:2:1270 -4606:0:4365 -4607:3:3758 -4608:0:4365 -4609:2:1271 -4610:2:1275 -4611:2:1276 -4612:2:1284 -4613:2:1285 -4614:2:1289 -4615:2:1290 -4616:2:1284 -4617:2:1285 -4618:2:1289 -4619:2:1290 -4620:2:1298 -4621:2:1303 -4622:2:1307 -4623:2:1308 -4624:2:1315 -4625:2:1316 -4626:2:1327 -4627:2:1328 -4628:2:1329 -4629:2:1327 -4630:2:1328 -4631:2:1329 -4632:2:1340 -4633:2:1345 -4634:2:1346 -4635:0:4365 -4636:2:1358 -4637:0:4365 -4638:2:1360 -4639:0:4365 -4640:3:3757 -4641:0:4365 -4642:2:1361 -4643:0:4365 -4644:3:3758 -4645:0:4365 -4646:2:1362 -4647:2:1366 -4648:2:1367 -4649:2:1375 -4650:2:1376 -4651:2:1380 -4652:2:1381 -4653:2:1375 -4654:2:1376 -4655:2:1380 -4656:2:1381 -4657:2:1389 -4658:2:1394 -4659:2:1398 -4660:2:1399 -4661:2:1406 -4662:2:1407 -4663:2:1418 -4664:2:1419 -4665:2:1420 -4666:2:1418 -4667:2:1419 -4668:2:1420 -4669:2:1431 -4670:2:1436 -4671:2:1437 -4672:0:4365 -4673:2:1449 -4674:0:4365 -4675:3:3757 -4676:0:4365 -4677:2:1451 -4678:0:4365 -4679:3:3758 -4680:0:4365 -4681:2:1652 -4682:0:4365 -4683:2:1653 -4684:0:4365 -4685:2:1657 -4686:0:4365 -4687:2:1660 -4688:0:4365 -4689:3:3757 -4690:0:4365 -4691:2:1665 -4692:2:1669 -4693:2:1670 -4694:2:1678 -4695:2:1679 -4696:2:1683 -4697:2:1684 -4698:2:1678 -4699:2:1679 -4700:2:1680 -4701:2:1692 -4702:2:1697 -4703:2:1701 -4704:2:1702 -4705:2:1709 -4706:2:1710 -4707:2:1721 -4708:2:1722 -4709:2:1723 -4710:2:1721 -4711:2:1722 -4712:2:1723 -4713:2:1734 -4714:2:1739 -4715:2:1740 -4716:0:4365 -4717:3:3758 -4718:0:4365 -4719:2:1752 -4720:0:4365 -4721:3:3757 -4722:0:4365 -4723:2:1754 -4724:0:4365 -4725:3:3758 -4726:0:4365 -4727:2:1755 -4728:2:1759 -4729:2:1760 -4730:2:1768 -4731:2:1769 -4732:2:1773 -4733:2:1774 -4734:2:1768 -4735:2:1769 -4736:2:1773 -4737:2:1774 -4738:2:1782 -4739:2:1787 -4740:2:1791 -4741:2:1792 -4742:2:1799 -4743:2:1800 -4744:2:1811 -4745:2:1812 -4746:2:1813 -4747:2:1811 -4748:2:1812 -4749:2:1813 -4750:2:1824 -4751:2:1829 -4752:2:1830 -4753:0:4365 -4754:2:1842 -4755:0:4365 -4756:3:3757 -4757:0:4365 -4758:2:1844 -4759:0:4365 -4760:3:3758 -4761:0:4365 -4762:2:1845 -4763:2:1849 -4764:2:1850 -4765:2:1858 -4766:2:1859 -4767:2:1863 -4768:2:1864 -4769:2:1858 -4770:2:1859 -4771:2:1863 -4772:2:1864 -4773:2:1872 -4774:2:1877 -4775:2:1881 -4776:2:1882 -4777:2:1889 -4778:2:1890 -4779:2:1901 -4780:2:1902 -4781:2:1903 -4782:2:1901 -4783:2:1902 -4784:2:1903 -4785:2:1914 -4786:2:1919 -4787:2:1920 -4788:0:4365 -4789:2:1932 -4790:0:4365 -4791:3:3757 -4792:0:4365 -4793:2:1934 -4794:0:4365 -4795:3:3758 -4796:0:4365 -4797:2:1935 -4798:0:4365 -4799:2:1936 -4800:0:4365 -4801:2:2129 -4802:0:4365 -4803:2:2130 -4804:0:4365 -4805:2:2134 -4806:0:4365 -4807:3:3757 -4808:0:4365 -4809:2:2136 -4810:0:4365 -4811:3:3758 -4812:0:4365 -4813:2:2137 -4814:2:2141 -4815:2:2142 -4816:2:2150 -4817:2:2151 -4818:2:2155 -4819:2:2156 -4820:2:2150 -4821:2:2151 -4822:2:2155 -4823:2:2156 -4824:2:2164 -4825:2:2169 -4826:2:2173 -4827:2:2174 -4828:2:2181 -4829:2:2182 -4830:2:2193 -4831:2:2194 -4832:2:2195 -4833:2:2193 -4834:2:2194 -4835:2:2195 -4836:2:2206 -4837:2:2211 -4838:2:2212 -4839:0:4365 -4840:2:2224 -4841:0:4365 -4842:3:3757 -4843:0:4365 -4844:2:2226 -4845:0:4365 -4846:3:3758 -4847:0:4365 -4848:2:2230 -4849:0:4365 -4850:3:3757 -4851:0:4365 -4852:2:2235 -4853:2:2239 -4854:2:2240 -4855:2:2248 -4856:2:2249 -4857:2:2253 -4858:2:2254 -4859:2:2248 -4860:2:2249 -4861:2:2250 -4862:2:2262 -4863:2:2267 -4864:2:2271 -4865:2:2272 -4866:2:2279 -4867:2:2280 -4868:2:2291 -4869:2:2292 -4870:2:2293 -4871:2:2291 -4872:2:2292 -4873:2:2293 -4874:2:2304 -4875:2:2309 -4876:2:2310 -4877:0:4365 -4878:3:3758 -4879:0:4365 -4880:2:2322 -4881:0:4365 -4882:2:1169 -4883:0:4365 -4884:3:3757 -4885:0:4365 -4886:2:1170 -4887:0:4365 -4888:3:3758 -4889:0:4365 -4890:3:3759 -4891:0:4365 -4892:3:3972 -4893:0:4365 -4894:3:4077 -4895:0:4365 -4896:3:4078 -4897:0:4365 -4898:3:4082 -4899:0:4365 -4900:3:4088 -4901:0:4365 -4902:3:4092 -4903:3:4093 -4904:3:4097 -4905:3:4101 -4906:3:4102 -4907:3:4097 -4908:3:4101 -4909:3:4102 -4910:3:4106 -4911:3:4114 -4912:3:4115 -4913:3:4120 -4914:3:4127 -4915:3:4128 -4916:3:4127 -4917:3:4128 -4918:3:4135 -4919:3:4140 -4920:0:4365 -4921:3:4151 -4922:0:4365 -4923:3:4155 -4924:3:4156 -4925:3:4160 -4926:3:4164 -4927:3:4165 -4928:3:4160 -4929:3:4164 -4930:3:4165 -4931:3:4169 -4932:3:4177 -4933:3:4178 -4934:3:4183 -4935:3:4190 -4936:3:4191 -4937:3:4190 -4938:3:4191 -4939:3:4198 -4940:3:4203 -4941:0:4365 -4942:3:4151 -4943:0:4365 -4944:3:4155 -4945:3:4156 -4946:3:4160 -4947:3:4164 -4948:3:4165 -4949:3:4160 -4950:3:4164 -4951:3:4165 -4952:3:4169 -4953:3:4177 -4954:3:4178 -4955:3:4183 -4956:3:4190 -4957:3:4191 -4958:3:4190 -4959:3:4191 -4960:3:4198 -4961:3:4203 -4962:0:4365 -4963:3:4214 -4964:0:4365 -4965:3:4222 -4966:3:4223 -4967:3:4227 -4968:3:4231 -4969:3:4232 -4970:3:4227 -4971:3:4231 -4972:3:4232 -4973:3:4236 -4974:3:4244 -4975:3:4245 -4976:3:4250 -4977:3:4257 -4978:3:4258 -4979:3:4257 -4980:3:4258 -4981:3:4265 -4982:3:4270 -4983:0:4365 -4984:3:4285 -4985:0:4365 -4986:3:4286 -4987:0:4365 -4988:2:1173 -4989:0:4365 -4990:3:4287 -4991:0:4365 -4992:2:1179 -4993:0:4365 -4994:2:1180 -4995:0:4365 -4996:3:4286 -4997:0:4365 -4998:2:1181 -4999:2:1185 -5000:2:1186 -5001:2:1194 -5002:2:1195 -5003:2:1199 -5004:2:1200 -5005:2:1194 -5006:2:1195 -5007:2:1199 -5008:2:1200 -5009:2:1208 -5010:2:1213 -5011:2:1217 -5012:2:1218 -5013:2:1225 -5014:2:1226 -5015:2:1237 -5016:2:1238 -5017:2:1239 -5018:2:1237 -5019:2:1238 -5020:2:1239 -5021:2:1250 -5022:2:1255 -5023:2:1256 -5024:0:4365 -5025:3:4287 -5026:0:4365 -5027:2:1268 -5028:0:4365 -5029:3:4286 -5030:0:4365 -5031:2:1270 -5032:0:4365 -5033:3:4287 -5034:0:4365 -5035:2:1271 -5036:2:1275 -5037:2:1276 -5038:2:1284 -5039:2:1285 -5040:2:1289 -5041:2:1290 -5042:2:1284 -5043:2:1285 -5044:2:1289 -5045:2:1290 -5046:2:1298 -5047:2:1303 -5048:2:1307 -5049:2:1308 -5050:2:1315 -5051:2:1316 -5052:2:1327 -5053:2:1328 -5054:2:1329 -5055:2:1327 -5056:2:1328 -5057:2:1329 -5058:2:1340 -5059:2:1345 -5060:2:1346 -5061:0:4365 -5062:2:1358 -5063:0:4365 -5064:2:1360 -5065:0:4365 -5066:3:4286 -5067:0:4365 -5068:2:1361 -5069:0:4365 -5070:3:4287 -5071:0:4365 -5072:2:1362 -5073:2:1366 -5074:2:1367 -5075:2:1375 -5076:2:1376 -5077:2:1380 -5078:2:1381 -5079:2:1375 -5080:2:1376 -5081:2:1380 -5082:2:1381 -5083:2:1389 -5084:2:1394 -5085:2:1398 -5086:2:1399 -5087:2:1406 -5088:2:1407 -5089:2:1418 -5090:2:1419 -5091:2:1420 -5092:2:1418 -5093:2:1419 -5094:2:1420 -5095:2:1431 -5096:2:1436 -5097:2:1437 -5098:0:4365 -5099:2:1449 -5100:0:4365 -5101:3:4286 -5102:0:4365 -5103:2:1451 -5104:0:4365 -5105:3:4287 -5106:0:4365 -5107:2:1652 -5108:0:4365 -5109:2:1653 -5110:0:4365 -5111:2:1657 -5112:0:4365 -5113:2:1660 -5114:0:4365 -5115:3:4286 -5116:0:4365 -5117:2:1665 -5118:2:1669 -5119:2:1670 -5120:2:1678 -5121:2:1679 -5122:2:1683 -5123:2:1684 -5124:2:1678 -5125:2:1679 -5126:2:1680 -5127:2:1692 -5128:2:1697 -5129:2:1701 -5130:2:1702 -5131:2:1709 -5132:2:1710 -5133:2:1721 -5134:2:1722 -5135:2:1723 -5136:2:1721 -5137:2:1722 -5138:2:1723 -5139:2:1734 -5140:2:1739 -5141:2:1740 -5142:0:4365 -5143:3:4287 -5144:0:4365 -5145:2:1752 -5146:0:4365 -5147:3:4286 -5148:0:4365 -5149:2:1754 -5150:0:4365 -5151:3:4287 -5152:0:4365 -5153:2:1755 -5154:2:1759 -5155:2:1760 -5156:2:1768 -5157:2:1769 -5158:2:1773 -5159:2:1774 -5160:2:1768 -5161:2:1769 -5162:2:1773 -5163:2:1774 -5164:2:1782 -5165:2:1787 -5166:2:1791 -5167:2:1792 -5168:2:1799 -5169:2:1800 -5170:2:1811 -5171:2:1812 -5172:2:1813 -5173:2:1811 -5174:2:1812 -5175:2:1813 -5176:2:1824 -5177:2:1829 -5178:2:1830 -5179:0:4365 -5180:2:1842 -5181:0:4365 -5182:3:4286 -5183:0:4365 -5184:2:1844 -5185:0:4365 -5186:3:4287 -5187:0:4365 -5188:2:1845 -5189:2:1849 -5190:2:1850 -5191:2:1858 -5192:2:1859 -5193:2:1863 -5194:2:1864 -5195:2:1858 -5196:2:1859 -5197:2:1863 -5198:2:1864 -5199:2:1872 -5200:2:1877 -5201:2:1881 -5202:2:1882 -5203:2:1889 -5204:2:1890 -5205:2:1901 -5206:2:1902 -5207:2:1903 -5208:2:1901 -5209:2:1902 -5210:2:1903 -5211:2:1914 -5212:2:1919 -5213:2:1920 -5214:0:4365 -5215:2:1932 -5216:0:4365 -5217:3:4286 -5218:0:4365 -5219:2:1934 -5220:0:4365 -5221:3:4287 -5222:0:4365 -5223:2:1935 -5224:0:4365 -5225:2:1936 -5226:0:4365 -5227:2:2129 -5228:0:4365 -5229:2:2130 -5230:0:4365 -5231:2:2134 -5232:0:4365 -5233:3:4286 -5234:0:4365 -5235:2:2136 -5236:0:4365 -5237:3:4287 -5238:0:4365 -5239:2:2137 -5240:2:2141 -5241:2:2142 -5242:2:2150 -5243:2:2151 -5244:2:2155 -5245:2:2156 -5246:2:2150 -5247:2:2151 -5248:2:2155 -5249:2:2156 -5250:2:2164 -5251:2:2169 -5252:2:2173 -5253:2:2174 -5254:2:2181 -5255:2:2182 -5256:2:2193 -5257:2:2194 -5258:2:2195 -5259:2:2193 -5260:2:2194 -5261:2:2195 -5262:2:2206 -5263:2:2211 -5264:2:2212 -5265:0:4365 -5266:2:2224 -5267:0:4365 -5268:3:4286 -5269:0:4365 -5270:2:2226 -5271:0:4365 -5272:3:4287 -5273:0:4365 -5274:2:2230 -5275:0:4365 -5276:3:4286 -5277:0:4365 -5278:2:2235 -5279:2:2239 -5280:2:2240 -5281:2:2248 -5282:2:2249 -5283:2:2253 -5284:2:2254 -5285:2:2248 -5286:2:2249 -5287:2:2250 -5288:2:2262 -5289:2:2267 -5290:2:2271 -5291:2:2272 -5292:2:2279 -5293:2:2280 -5294:2:2291 -5295:2:2292 -5296:2:2293 -5297:2:2291 -5298:2:2292 -5299:2:2293 -5300:2:2304 -5301:2:2309 -5302:2:2310 -5303:0:4365 -5304:3:4287 -5305:0:4365 -5306:2:2322 -5307:0:4365 -5308:2:1169 -5309:0:4365 -5310:3:4286 -5311:0:4365 -5312:2:1170 -5313:0:4365 -5314:3:4287 -5315:0:4365 -5316:3:4288 -5317:0:4365 -5318:3:4294 -5319:0:4365 -5320:3:4295 -5321:0:4365 -5322:3:2338 -5323:0:4365 -5324:3:2339 -5325:3:2343 -5326:3:2344 -5327:3:2352 -5328:3:2353 -5329:3:2357 -5330:3:2358 -5331:3:2352 -5332:3:2353 -5333:3:2357 -5334:3:2358 -5335:3:2366 -5336:3:2371 -5337:3:2375 -5338:3:2376 -5339:3:2383 -5340:3:2384 -5341:3:2395 -5342:3:2396 -5343:3:2397 -5344:3:2395 -5345:3:2396 -5346:3:2397 -5347:3:2408 -5348:3:2413 -5349:3:2414 -5350:0:4365 -5351:3:2426 -5352:0:4365 -5353:3:2427 -5354:0:4365 -5355:2:1173 -5356:0:4365 -5357:3:2428 -5358:0:4365 -5359:2:1179 -5360:0:4365 -5361:2:1180 -5362:0:4365 -5363:3:2427 -5364:0:4365 -5365:2:1181 -5366:2:1185 -5367:2:1186 -5368:2:1194 -5369:2:1195 -5370:2:1199 -5371:2:1200 -5372:2:1194 -5373:2:1195 -5374:2:1199 -5375:2:1200 -5376:2:1208 -5377:2:1213 -5378:2:1217 -5379:2:1218 -5380:2:1225 -5381:2:1226 -5382:2:1237 -5383:2:1238 -5384:2:1239 -5385:2:1237 -5386:2:1238 -5387:2:1239 -5388:2:1250 -5389:2:1255 -5390:2:1256 -5391:0:4365 -5392:3:2428 -5393:0:4365 -5394:2:1268 -5395:0:4365 -5396:3:2427 -5397:0:4365 -5398:2:1270 -5399:0:4365 -5400:3:2428 -5401:0:4365 -5402:2:1271 -5403:2:1275 -5404:2:1276 -5405:2:1284 -5406:2:1285 -5407:2:1289 -5408:2:1290 -5409:2:1284 -5410:2:1285 -5411:2:1289 -5412:2:1290 -5413:2:1298 -5414:2:1303 -5415:2:1307 -5416:2:1308 -5417:2:1315 -5418:2:1316 -5419:2:1327 -5420:2:1328 -5421:2:1329 -5422:2:1327 -5423:2:1328 -5424:2:1329 -5425:2:1340 -5426:2:1345 -5427:2:1346 -5428:0:4365 -5429:2:1358 -5430:0:4365 -5431:2:1360 -5432:0:4365 -5433:3:2427 -5434:0:4365 -5435:2:1361 -5436:0:4365 -5437:3:2428 -5438:0:4365 -5439:2:1362 -5440:2:1366 -5441:2:1367 -5442:2:1375 -5443:2:1376 -5444:2:1380 -5445:2:1381 -5446:2:1375 -5447:2:1376 -5448:2:1380 -5449:2:1381 -5450:2:1389 -5451:2:1394 -5452:2:1398 -5453:2:1399 -5454:2:1406 -5455:2:1407 -5456:2:1418 -5457:2:1419 -5458:2:1420 -5459:2:1418 -5460:2:1419 -5461:2:1420 -5462:2:1431 -5463:2:1436 -5464:2:1437 -5465:0:4365 -5466:2:1449 -5467:0:4365 -5468:3:2427 -5469:0:4365 -5470:2:1451 -5471:0:4365 -5472:3:2428 -5473:0:4365 -5474:2:1652 -5475:0:4365 -5476:2:1653 -5477:0:4365 -5478:2:1657 -5479:0:4365 -5480:2:1660 -5481:0:4365 -5482:3:2427 -5483:0:4365 -5484:2:1665 -5485:2:1669 -5486:2:1670 -5487:2:1678 -5488:2:1679 -5489:2:1683 -5490:2:1684 -5491:2:1678 -5492:2:1679 -5493:2:1680 -5494:2:1692 -5495:2:1697 -5496:2:1701 -5497:2:1702 -5498:2:1709 -5499:2:1710 -5500:2:1721 -5501:2:1722 -5502:2:1723 -5503:2:1721 -5504:2:1722 -5505:2:1723 -5506:2:1734 -5507:2:1739 -5508:2:1740 -5509:0:4365 -5510:3:2428 -5511:0:4365 -5512:2:1752 -5513:0:4365 -5514:3:2427 -5515:0:4365 -5516:2:1754 -5517:0:4365 -5518:3:2428 -5519:0:4365 -5520:2:1755 -5521:2:1759 -5522:2:1760 -5523:2:1768 -5524:2:1769 -5525:2:1773 -5526:2:1774 -5527:2:1768 -5528:2:1769 -5529:2:1773 -5530:2:1774 -5531:2:1782 -5532:2:1787 -5533:2:1791 -5534:2:1792 -5535:2:1799 -5536:2:1800 -5537:2:1811 -5538:2:1812 -5539:2:1813 -5540:2:1811 -5541:2:1812 -5542:2:1813 -5543:2:1824 -5544:2:1829 -5545:2:1830 -5546:0:4365 -5547:2:1842 -5548:0:4365 -5549:3:2427 -5550:0:4365 -5551:2:1844 -5552:0:4365 -5553:3:2428 -5554:0:4365 -5555:2:1845 -5556:2:1849 -5557:2:1850 -5558:2:1858 -5559:2:1859 -5560:2:1863 -5561:2:1864 -5562:2:1858 -5563:2:1859 -5564:2:1863 -5565:2:1864 -5566:2:1872 -5567:2:1877 -5568:2:1881 -5569:2:1882 -5570:2:1889 -5571:2:1890 -5572:2:1901 -5573:2:1902 -5574:2:1903 -5575:2:1901 -5576:2:1902 -5577:2:1903 -5578:2:1914 -5579:2:1919 -5580:2:1920 -5581:0:4365 -5582:2:1932 -5583:0:4365 -5584:3:2427 -5585:0:4365 -5586:2:1934 -5587:0:4365 -5588:3:2428 -5589:0:4365 -5590:2:1935 -5591:0:4365 -5592:2:1936 -5593:0:4365 -5594:2:2129 -5595:0:4365 -5596:2:2130 -5597:0:4365 -5598:2:2134 -5599:0:4365 -5600:3:2427 -5601:0:4365 -5602:2:2136 -5603:0:4365 -5604:3:2428 -5605:0:4365 -5606:2:2137 -5607:2:2141 -5608:2:2142 -5609:2:2150 -5610:2:2151 -5611:2:2155 -5612:2:2156 -5613:2:2150 -5614:2:2151 -5615:2:2155 -5616:2:2156 -5617:2:2164 -5618:2:2169 -5619:2:2173 -5620:2:2174 -5621:2:2181 -5622:2:2182 -5623:2:2193 -5624:2:2194 -5625:2:2195 -5626:2:2193 -5627:2:2194 -5628:2:2195 -5629:2:2206 -5630:2:2211 -5631:2:2212 -5632:0:4365 -5633:2:2224 -5634:0:4365 -5635:3:2427 -5636:0:4365 -5637:2:2226 -5638:0:4365 -5639:3:2428 -5640:0:4365 -5641:2:2230 -5642:0:4365 -5643:3:2427 -5644:0:4365 -5645:2:2235 -5646:2:2239 -5647:2:2240 -5648:2:2248 -5649:2:2249 -5650:2:2253 -5651:2:2254 -5652:2:2248 -5653:2:2249 -5654:2:2250 -5655:2:2262 -5656:2:2267 -5657:2:2271 -5658:2:2272 -5659:2:2279 -5660:2:2280 -5661:2:2291 -5662:2:2292 -5663:2:2293 -5664:2:2291 -5665:2:2292 -5666:2:2293 -5667:2:2304 -5668:2:2309 -5669:2:2310 -5670:0:4365 -5671:3:2428 -5672:0:4365 -5673:2:2322 -5674:0:4365 -5675:2:1169 -5676:0:4365 -5677:3:2427 -5678:0:4365 -5679:2:1170 -5680:0:4365 -5681:3:2428 -5682:0:4365 -5683:3:2429 -5684:0:4365 -5685:3:2435 -5686:3:2436 -5687:0:4365 -5688:3:2440 -5689:3:2444 -5690:3:2445 -5691:3:2453 -5692:3:2454 -5693:3:2458 -5694:3:2459 -5695:3:2453 -5696:3:2454 -5697:3:2458 -5698:3:2459 -5699:3:2467 -5700:3:2472 -5701:3:2473 -5702:3:2484 -5703:3:2485 -5704:3:2496 -5705:3:2497 -5706:3:2498 -5707:3:2496 -5708:3:2497 -5709:3:2498 -5710:3:2509 -5711:3:2514 -5712:3:2515 -5713:0:4365 -5714:3:2527 -5715:0:4365 -5716:3:2528 -5717:0:4365 -5718:2:1173 -5719:0:4365 -5720:3:2529 -5721:0:4365 -5722:2:1179 -5723:0:4365 -5724:2:1180 -5725:0:4365 -5726:3:2528 -5727:0:4365 -5728:2:1181 -5729:2:1185 -5730:2:1186 -5731:2:1194 -5732:2:1195 -5733:2:1199 -5734:2:1200 -5735:2:1194 -5736:2:1195 -5737:2:1199 -5738:2:1200 -5739:2:1208 -5740:2:1213 -5741:2:1217 -5742:2:1218 -5743:2:1225 -5744:2:1226 -5745:2:1237 -5746:2:1238 -5747:2:1239 -5748:2:1237 -5749:2:1238 -5750:2:1239 -5751:2:1250 -5752:2:1255 -5753:2:1256 -5754:0:4365 -5755:3:2529 -5756:0:4365 -5757:2:1268 -5758:0:4365 -5759:3:2528 -5760:0:4365 -5761:2:1270 -5762:0:4365 -5763:3:2529 -5764:0:4365 -5765:2:1271 -5766:2:1275 -5767:2:1276 -5768:2:1284 -5769:2:1285 -5770:2:1289 -5771:2:1290 -5772:2:1284 -5773:2:1285 -5774:2:1289 -5775:2:1290 -5776:2:1298 -5777:2:1303 -5778:2:1307 -5779:2:1308 -5780:2:1315 -5781:2:1316 -5782:2:1327 -5783:2:1328 -5784:2:1329 -5785:2:1327 -5786:2:1328 -5787:2:1329 -5788:2:1340 -5789:2:1345 -5790:2:1346 -5791:0:4365 -5792:2:1358 -5793:0:4365 -5794:2:1360 -5795:0:4365 -5796:3:2528 -5797:0:4365 -5798:2:1361 -5799:0:4365 -5800:3:2529 -5801:0:4365 -5802:2:1362 -5803:2:1366 -5804:2:1367 -5805:2:1375 -5806:2:1376 -5807:2:1380 -5808:2:1381 -5809:2:1375 -5810:2:1376 -5811:2:1380 -5812:2:1381 -5813:2:1389 -5814:2:1394 -5815:2:1398 -5816:2:1399 -5817:2:1406 -5818:2:1407 -5819:2:1418 -5820:2:1419 -5821:2:1420 -5822:2:1418 -5823:2:1419 -5824:2:1420 -5825:2:1431 -5826:2:1436 -5827:2:1437 -5828:0:4365 -5829:2:1449 -5830:0:4365 -5831:3:2528 -5832:0:4365 -5833:2:1451 -5834:0:4365 -5835:3:2529 -5836:0:4365 -5837:2:1652 -5838:0:4365 -5839:2:1653 -5840:0:4365 -5841:2:1657 -5842:0:4365 -5843:2:1660 -5844:0:4365 -5845:3:2528 -5846:0:4365 -5847:2:1665 -5848:2:1669 -5849:2:1670 -5850:2:1678 -5851:2:1679 -5852:2:1683 -5853:2:1684 -5854:2:1678 -5855:2:1679 -5856:2:1680 -5857:2:1692 -5858:2:1697 -5859:2:1701 -5860:2:1702 -5861:2:1709 -5862:2:1710 -5863:2:1721 -5864:2:1722 -5865:2:1723 -5866:2:1721 -5867:2:1722 -5868:2:1723 -5869:2:1734 -5870:2:1739 -5871:2:1740 -5872:0:4365 -5873:3:2529 -5874:0:4365 -5875:2:1752 -5876:0:4365 -5877:3:2528 -5878:0:4365 -5879:2:1754 -5880:0:4365 -5881:3:2529 -5882:0:4365 -5883:2:1755 -5884:2:1759 -5885:2:1760 -5886:2:1768 -5887:2:1769 -5888:2:1773 -5889:2:1774 -5890:2:1768 -5891:2:1769 -5892:2:1773 -5893:2:1774 -5894:2:1782 -5895:2:1787 -5896:2:1791 -5897:2:1792 -5898:2:1799 -5899:2:1800 -5900:2:1811 -5901:2:1812 -5902:2:1813 -5903:2:1811 -5904:2:1812 -5905:2:1813 -5906:2:1824 -5907:2:1829 -5908:2:1830 -5909:0:4365 -5910:2:1842 -5911:0:4365 -5912:3:2528 -5913:0:4365 -5914:2:1844 -5915:0:4365 -5916:3:2529 -5917:0:4365 -5918:2:1845 -5919:2:1849 -5920:2:1850 -5921:2:1858 -5922:2:1859 -5923:2:1863 -5924:2:1864 -5925:2:1858 -5926:2:1859 -5927:2:1863 -5928:2:1864 -5929:2:1872 -5930:2:1877 -5931:2:1881 -5932:2:1882 -5933:2:1889 -5934:2:1890 -5935:2:1901 -5936:2:1902 -5937:2:1903 -5938:2:1901 -5939:2:1902 -5940:2:1903 -5941:2:1914 -5942:2:1919 -5943:2:1920 -5944:0:4365 -5945:2:1932 -5946:0:4365 -5947:3:2528 -5948:0:4365 -5949:2:1934 -5950:0:4365 -5951:3:2529 -5952:0:4365 -5953:2:1935 -5954:0:4365 -5955:2:1936 -5956:0:4365 -5957:2:2129 -5958:0:4365 -5959:2:2130 -5960:0:4365 -5961:2:2134 -5962:0:4365 -5963:3:2528 -5964:0:4365 -5965:2:2136 -5966:0:4365 -5967:3:2529 -5968:0:4365 -5969:2:2137 -5970:2:2141 -5971:2:2142 -5972:2:2150 -5973:2:2151 -5974:2:2155 -5975:2:2156 -5976:2:2150 -5977:2:2151 -5978:2:2155 -5979:2:2156 -5980:2:2164 -5981:2:2169 -5982:2:2173 -5983:2:2174 -5984:2:2181 -5985:2:2182 -5986:2:2193 -5987:2:2194 -5988:2:2195 -5989:2:2193 -5990:2:2194 -5991:2:2195 -5992:2:2206 -5993:2:2211 -5994:2:2212 -5995:0:4365 -5996:2:2224 -5997:0:4365 -5998:3:2528 -5999:0:4365 -6000:2:2226 -6001:0:4365 -6002:3:2529 -6003:0:4365 -6004:2:2230 -6005:0:4365 -6006:3:2528 -6007:0:4365 -6008:2:2235 -6009:2:2239 -6010:2:2240 -6011:2:2248 -6012:2:2249 -6013:2:2253 -6014:2:2254 -6015:2:2248 -6016:2:2249 -6017:2:2250 -6018:2:2262 -6019:2:2267 -6020:2:2271 -6021:2:2272 -6022:2:2279 -6023:2:2280 -6024:2:2291 -6025:2:2292 -6026:2:2293 -6027:2:2291 -6028:2:2292 -6029:2:2293 -6030:2:2304 -6031:2:2309 -6032:2:2310 -6033:0:4365 -6034:3:2529 -6035:0:4365 -6036:2:2322 -6037:0:4365 -6038:2:1169 -6039:0:4365 -6040:3:2528 -6041:0:4365 -6042:2:1170 -6043:0:4365 -6044:3:2529 -6045:0:4365 -6046:3:2530 -6047:0:4365 -6048:3:2536 -6049:0:4365 -6050:3:2537 -6051:0:4365 -6052:3:2547 -6053:0:4365 -6054:3:2548 -6055:0:4365 -6056:3:2552 -6057:3:2553 -6058:3:2557 -6059:3:2561 -6060:3:2562 -6061:3:2557 -6062:3:2561 -6063:3:2562 -6064:3:2566 -6065:3:2574 -6066:3:2575 -6067:3:2580 -6068:3:2587 -6069:3:2588 -6070:3:2587 -6071:3:2588 -6072:3:2595 -6073:3:2600 -6074:0:4365 -6075:3:2611 -6076:0:4365 -6077:3:2615 -6078:3:2616 -6079:3:2620 -6080:3:2624 -6081:3:2625 -6082:3:2620 -6083:3:2624 -6084:3:2625 -6085:3:2629 -6086:3:2637 -6087:3:2638 -6088:3:2643 -6089:3:2650 -6090:3:2651 -6091:3:2650 -6092:3:2651 -6093:3:2658 -6094:3:2663 -6095:0:4365 -6096:3:2611 -6097:0:4365 -6098:3:2615 -6099:3:2616 -6100:3:2620 -6101:3:2624 -6102:3:2625 -6103:3:2620 -6104:3:2624 -6105:3:2625 -6106:3:2629 -6107:3:2637 -6108:3:2638 -6109:3:2643 -6110:3:2650 -6111:3:2651 -6112:3:2650 -6113:3:2651 -6114:3:2658 -6115:3:2663 -6116:0:4365 -6117:3:2674 -6118:0:4365 -6119:3:2682 -6120:3:2683 -6121:3:2687 -6122:3:2691 -6123:3:2692 -6124:3:2687 -6125:3:2691 -6126:3:2692 -6127:3:2696 -6128:3:2704 -6129:3:2705 -6130:3:2710 -6131:3:2717 -6132:3:2718 -6133:3:2717 -6134:3:2718 -6135:3:2725 -6136:3:2730 -6137:0:4365 -6138:3:2745 -6139:0:4365 -6140:3:2746 -6141:0:4365 -6142:2:1173 -6143:0:4365 -6144:3:2747 -6145:0:4365 -6146:2:1179 -6147:0:4365 -6148:2:1180 -6149:0:4365 -6150:3:2746 -6151:0:4365 -6152:2:1181 -6153:2:1185 -6154:2:1186 -6155:2:1194 -6156:2:1195 -6157:2:1199 -6158:2:1200 -6159:2:1194 -6160:2:1195 -6161:2:1199 -6162:2:1200 -6163:2:1208 -6164:2:1213 -6165:2:1217 -6166:2:1218 -6167:2:1225 -6168:2:1226 -6169:2:1237 -6170:2:1238 -6171:2:1239 -6172:2:1237 -6173:2:1238 -6174:2:1239 -6175:2:1250 -6176:2:1255 -6177:2:1256 -6178:0:4365 -6179:3:2747 -6180:0:4365 -6181:2:1268 -6182:0:4365 -6183:3:2746 -6184:0:4365 -6185:2:1270 -6186:0:4365 -6187:3:2747 -6188:0:4365 -6189:2:1271 -6190:2:1275 -6191:2:1276 -6192:2:1284 -6193:2:1285 -6194:2:1289 -6195:2:1290 -6196:2:1284 -6197:2:1285 -6198:2:1289 -6199:2:1290 -6200:2:1298 -6201:2:1303 -6202:2:1307 -6203:2:1308 -6204:2:1315 -6205:2:1316 -6206:2:1327 -6207:2:1328 -6208:2:1329 -6209:2:1327 -6210:2:1328 -6211:2:1329 -6212:2:1340 -6213:2:1345 -6214:2:1346 -6215:0:4365 -6216:2:1358 -6217:0:4365 -6218:2:1360 -6219:0:4365 -6220:3:2746 -6221:0:4365 -6222:2:1361 -6223:0:4365 -6224:3:2747 -6225:0:4365 -6226:2:1362 -6227:2:1366 -6228:2:1367 -6229:2:1375 -6230:2:1376 -6231:2:1380 -6232:2:1381 -6233:2:1375 -6234:2:1376 -6235:2:1380 -6236:2:1381 -6237:2:1389 -6238:2:1394 -6239:2:1398 -6240:2:1399 -6241:2:1406 -6242:2:1407 -6243:2:1418 -6244:2:1419 -6245:2:1420 -6246:2:1418 -6247:2:1419 -6248:2:1420 -6249:2:1431 -6250:2:1436 -6251:2:1437 -6252:0:4365 -6253:2:1449 -6254:0:4365 -6255:3:2746 -6256:0:4365 -6257:2:1451 -6258:0:4365 -6259:3:2747 -6260:0:4365 -6261:2:1652 -6262:0:4365 -6263:2:1653 -6264:0:4365 -6265:2:1657 -6266:0:4365 -6267:2:1660 -6268:0:4365 -6269:3:2746 -6270:0:4365 -6271:2:1665 -6272:2:1669 -6273:2:1670 -6274:2:1678 -6275:2:1679 -6276:2:1683 -6277:2:1684 -6278:2:1678 -6279:2:1679 -6280:2:1680 -6281:2:1692 -6282:2:1697 -6283:2:1701 -6284:2:1702 -6285:2:1709 -6286:2:1710 -6287:2:1721 -6288:2:1722 -6289:2:1723 -6290:2:1721 -6291:2:1722 -6292:2:1723 -6293:2:1734 -6294:2:1739 -6295:2:1740 -6296:0:4365 -6297:3:2747 -6298:0:4365 -6299:2:1752 -6300:0:4365 -6301:3:2746 -6302:0:4365 -6303:2:1754 -6304:0:4365 -6305:3:2747 -6306:0:4365 -6307:2:1755 -6308:2:1759 -6309:2:1760 -6310:2:1768 -6311:2:1769 -6312:2:1773 -6313:2:1774 -6314:2:1768 -6315:2:1769 -6316:2:1773 -6317:2:1774 -6318:2:1782 -6319:2:1787 -6320:2:1791 -6321:2:1792 -6322:2:1799 -6323:2:1800 -6324:2:1811 -6325:2:1812 -6326:2:1813 -6327:2:1811 -6328:2:1812 -6329:2:1813 -6330:2:1824 -6331:2:1829 -6332:2:1830 -6333:0:4365 -6334:2:1842 -6335:0:4365 -6336:3:2746 -6337:0:4365 -6338:2:1844 -6339:0:4365 -6340:3:2747 -6341:0:4365 -6342:2:1845 -6343:2:1849 -6344:2:1850 -6345:2:1858 -6346:2:1859 -6347:2:1863 -6348:2:1864 -6349:2:1858 -6350:2:1859 -6351:2:1863 -6352:2:1864 -6353:2:1872 -6354:2:1877 -6355:2:1881 -6356:2:1882 -6357:2:1889 -6358:2:1890 -6359:2:1901 -6360:2:1902 -6361:2:1903 -6362:2:1901 -6363:2:1902 -6364:2:1903 -6365:2:1914 -6366:2:1919 -6367:2:1920 -6368:0:4365 -6369:2:1932 -6370:0:4365 -6371:3:2746 -6372:0:4365 -6373:2:1934 -6374:0:4365 -6375:3:2747 -6376:0:4365 -6377:2:1935 -6378:0:4365 -6379:2:1936 -6380:0:4365 -6381:2:2129 -6382:0:4365 -6383:2:2130 -6384:0:4365 -6385:2:2134 -6386:0:4365 -6387:3:2746 -6388:0:4365 -6389:2:2136 -6390:0:4365 -6391:3:2747 -6392:0:4365 -6393:2:2137 -6394:2:2141 -6395:2:2142 -6396:2:2150 -6397:2:2151 -6398:2:2155 -6399:2:2156 -6400:2:2150 -6401:2:2151 -6402:2:2155 -6403:2:2156 -6404:2:2164 -6405:2:2169 -6406:2:2173 -6407:2:2174 -6408:2:2181 -6409:2:2182 -6410:2:2193 -6411:2:2194 -6412:2:2195 -6413:2:2193 -6414:2:2194 -6415:2:2195 -6416:2:2206 -6417:2:2211 -6418:2:2212 -6419:0:4365 -6420:2:2224 -6421:0:4365 -6422:3:2746 -6423:0:4365 -6424:2:2226 -6425:0:4365 -6426:3:2747 -6427:0:4365 -6428:2:2230 -6429:0:4365 -6430:3:2746 -6431:0:4365 -6432:2:2235 -6433:2:2239 -6434:2:2240 -6435:2:2248 -6436:2:2249 -6437:2:2253 -6438:2:2254 -6439:2:2248 -6440:2:2249 -6441:2:2250 -6442:2:2262 -6443:2:2267 -6444:2:2271 -6445:2:2272 -6446:2:2279 -6447:2:2280 -6448:2:2291 -6449:2:2292 -6450:2:2293 -6451:2:2291 -6452:2:2292 -6453:2:2293 -6454:2:2304 -6455:2:2309 -6456:2:2310 -6457:0:4365 -6458:3:2747 -6459:0:4365 -6460:2:2322 -6461:0:4365 -6462:2:1169 -6463:0:4365 -6464:3:2746 -6465:0:4365 -6466:2:1170 -6467:0:4365 -6468:3:2747 -6469:0:4365 -6470:3:2748 -6471:0:4365 -6472:3:2754 -6473:0:4365 -6474:3:2755 -6475:3:2759 -6476:3:2760 -6477:3:2768 -6478:3:2769 -6479:3:2773 -6480:3:2774 -6481:3:2768 -6482:3:2769 -6483:3:2773 -6484:3:2774 -6485:3:2782 -6486:3:2787 -6487:3:2791 -6488:3:2792 -6489:3:2799 -6490:3:2800 -6491:3:2811 -6492:3:2812 -6493:3:2813 -6494:3:2811 -6495:3:2812 -6496:3:2813 -6497:3:2824 -6498:3:2829 -6499:3:2830 -6500:0:4365 -6501:3:2842 -6502:0:4365 -6503:3:2843 -6504:0:4365 -6505:2:1173 -6506:0:4365 -6507:3:2844 -6508:0:4365 -6509:2:1179 -6510:0:4365 -6511:2:1180 -6512:0:4365 -6513:3:2843 -6514:0:4365 -6515:2:1181 -6516:2:1185 -6517:2:1186 -6518:2:1194 -6519:2:1195 -6520:2:1199 -6521:2:1200 -6522:2:1194 -6523:2:1195 -6524:2:1199 -6525:2:1200 -6526:2:1208 -6527:2:1213 -6528:2:1217 -6529:2:1218 -6530:2:1225 -6531:2:1226 -6532:2:1237 -6533:2:1238 -6534:2:1239 -6535:2:1237 -6536:2:1238 -6537:2:1239 -6538:2:1250 -6539:2:1255 -6540:2:1256 -6541:0:4365 -6542:3:2844 -6543:0:4365 -6544:2:1268 -6545:0:4365 -6546:3:2843 -6547:0:4365 -6548:2:1270 -6549:0:4365 -6550:3:2844 -6551:0:4365 -6552:2:1271 -6553:2:1275 -6554:2:1276 -6555:2:1284 -6556:2:1285 -6557:2:1289 -6558:2:1290 -6559:2:1284 -6560:2:1285 -6561:2:1289 -6562:2:1290 -6563:2:1298 -6564:2:1303 -6565:2:1307 -6566:2:1308 -6567:2:1315 -6568:2:1316 -6569:2:1327 -6570:2:1328 -6571:2:1329 -6572:2:1327 -6573:2:1328 -6574:2:1329 -6575:2:1340 -6576:2:1345 -6577:2:1346 -6578:0:4365 -6579:2:1358 -6580:0:4365 -6581:2:1360 -6582:0:4365 -6583:3:2843 -6584:0:4365 -6585:2:1361 -6586:0:4365 -6587:3:2844 -6588:0:4365 -6589:2:1362 -6590:2:1366 -6591:2:1367 -6592:2:1375 -6593:2:1376 -6594:2:1380 -6595:2:1381 -6596:2:1375 -6597:2:1376 -6598:2:1380 -6599:2:1381 -6600:2:1389 -6601:2:1394 -6602:2:1398 -6603:2:1399 -6604:2:1406 -6605:2:1407 -6606:2:1418 -6607:2:1419 -6608:2:1420 -6609:2:1418 -6610:2:1419 -6611:2:1420 -6612:2:1431 -6613:2:1436 -6614:2:1437 -6615:0:4365 -6616:2:1449 -6617:0:4365 -6618:3:2843 -6619:0:4365 -6620:2:1451 -6621:0:4365 -6622:3:2844 -6623:0:4365 -6624:2:1652 -6625:0:4365 -6626:2:1653 -6627:0:4365 -6628:2:1657 -6629:0:4365 -6630:2:1660 -6631:0:4365 -6632:3:2843 -6633:0:4365 -6634:2:1665 -6635:2:1669 -6636:2:1670 -6637:2:1678 -6638:2:1679 -6639:2:1683 -6640:2:1684 -6641:2:1678 -6642:2:1679 -6643:2:1680 -6644:2:1692 -6645:2:1697 -6646:2:1701 -6647:2:1702 -6648:2:1709 -6649:2:1710 -6650:2:1721 -6651:2:1722 -6652:2:1723 -6653:2:1721 -6654:2:1722 -6655:2:1723 -6656:2:1734 -6657:2:1739 -6658:2:1740 -6659:0:4365 -6660:3:2844 -6661:0:4365 -6662:2:1752 -6663:0:4365 -6664:3:2843 -6665:0:4365 -6666:2:1754 -6667:0:4365 -6668:3:2844 -6669:0:4365 -6670:2:1755 -6671:2:1759 -6672:2:1760 -6673:2:1768 -6674:2:1769 -6675:2:1773 -6676:2:1774 -6677:2:1768 -6678:2:1769 -6679:2:1773 -6680:2:1774 -6681:2:1782 -6682:2:1787 -6683:2:1791 -6684:2:1792 -6685:2:1799 -6686:2:1800 -6687:2:1811 -6688:2:1812 -6689:2:1813 -6690:2:1811 -6691:2:1812 -6692:2:1813 -6693:2:1824 -6694:2:1829 -6695:2:1830 -6696:0:4365 -6697:2:1842 -6698:0:4365 -6699:3:2843 -6700:0:4365 -6701:2:1844 -6702:0:4365 -6703:3:2844 -6704:0:4365 -6705:2:1845 -6706:2:1849 -6707:2:1850 -6708:2:1858 -6709:2:1859 -6710:2:1863 -6711:2:1864 -6712:2:1858 -6713:2:1859 -6714:2:1863 -6715:2:1864 -6716:2:1872 -6717:2:1877 -6718:2:1881 -6719:2:1882 -6720:2:1889 -6721:2:1890 -6722:2:1901 -6723:2:1902 -6724:2:1903 -6725:2:1901 -6726:2:1902 -6727:2:1903 -6728:2:1914 -6729:2:1919 -6730:2:1920 -6731:0:4365 -6732:2:1932 -6733:0:4365 -6734:3:2843 -6735:0:4365 -6736:2:1934 -6737:0:4365 -6738:3:2844 -6739:0:4365 -6740:2:1935 -6741:0:4365 -6742:2:1936 -6743:0:4365 -6744:2:2129 -6745:0:4365 -6746:2:2130 -6747:0:4365 -6748:2:2134 -6749:0:4365 -6750:3:2843 -6751:0:4365 -6752:2:2136 -6753:0:4365 -6754:3:2844 -6755:0:4365 -6756:2:2137 -6757:2:2141 -6758:2:2142 -6759:2:2150 -6760:2:2151 -6761:2:2155 -6762:2:2156 -6763:2:2150 -6764:2:2151 -6765:2:2155 -6766:2:2156 -6767:2:2164 -6768:2:2169 -6769:2:2173 -6770:2:2174 -6771:2:2181 -6772:2:2182 -6773:2:2193 -6774:2:2194 -6775:2:2195 -6776:2:2193 -6777:2:2194 -6778:2:2195 -6779:2:2206 -6780:2:2211 -6781:2:2212 -6782:0:4365 -6783:2:2224 -6784:0:4365 -6785:3:2843 -6786:0:4365 -6787:2:2226 -6788:0:4365 -6789:3:2844 -6790:0:4365 -6791:2:2230 -6792:0:4365 -6793:3:2843 -6794:0:4365 -6795:2:2235 -6796:2:2239 -6797:2:2240 -6798:2:2248 -6799:2:2249 -6800:2:2253 -6801:2:2254 -6802:2:2248 -6803:2:2249 -6804:2:2250 -6805:2:2262 -6806:2:2267 -6807:2:2271 -6808:2:2272 -6809:2:2279 -6810:2:2280 -6811:2:2291 -6812:2:2292 -6813:2:2293 -6814:2:2291 -6815:2:2292 -6816:2:2293 -6817:2:2304 -6818:2:2309 -6819:2:2310 -6820:0:4365 -6821:3:2844 -6822:0:4365 -6823:2:2322 -6824:0:4365 -6825:2:1169 -6826:0:4365 -6827:3:2843 -6828:0:4365 -6829:2:1170 -6830:0:4365 -6831:3:2844 -6832:0:4365 -6833:3:2845 -6834:0:4365 -6835:3:2851 -6836:0:4365 -6837:3:2854 -6838:3:2855 -6839:3:2867 -6840:3:2868 -6841:3:2872 -6842:3:2873 -6843:3:2867 -6844:3:2868 -6845:3:2872 -6846:3:2873 -6847:3:2881 -6848:3:2886 -6849:3:2890 -6850:3:2891 -6851:3:2898 -6852:3:2899 -6853:3:2910 -6854:3:2911 -6855:3:2912 -6856:3:2910 -6857:3:2911 -6858:3:2912 -6859:3:2923 -6860:3:2928 -6861:3:2929 -6862:0:4365 -6863:3:2941 -6864:0:4365 -6865:3:2942 -6866:0:4365 -6867:2:1173 -6868:0:4365 -6869:3:2943 -6870:0:4365 -6871:2:1179 -6872:0:4365 -6873:2:1180 -6874:0:4365 -6875:3:2942 -6876:0:4365 -6877:2:1181 -6878:2:1185 -6879:2:1186 -6880:2:1194 -6881:2:1195 -6882:2:1199 -6883:2:1200 -6884:2:1194 -6885:2:1195 -6886:2:1199 -6887:2:1200 -6888:2:1208 -6889:2:1213 -6890:2:1217 -6891:2:1218 -6892:2:1225 -6893:2:1226 -6894:2:1237 -6895:2:1238 -6896:2:1239 -6897:2:1237 -6898:2:1238 -6899:2:1239 -6900:2:1250 -6901:2:1255 -6902:2:1256 -6903:0:4365 -6904:3:2943 -6905:0:4365 -6906:2:1268 -6907:0:4365 -6908:3:2942 -6909:0:4365 -6910:2:1270 -6911:0:4365 -6912:3:2943 -6913:0:4365 -6914:2:1271 -6915:2:1275 -6916:2:1276 -6917:2:1284 -6918:2:1285 -6919:2:1289 -6920:2:1290 -6921:2:1284 -6922:2:1285 -6923:2:1289 -6924:2:1290 -6925:2:1298 -6926:2:1303 -6927:2:1307 -6928:2:1308 -6929:2:1315 -6930:2:1316 -6931:2:1327 -6932:2:1328 -6933:2:1329 -6934:2:1327 -6935:2:1328 -6936:2:1329 -6937:2:1340 -6938:2:1345 -6939:2:1346 -6940:0:4365 -6941:2:1358 -6942:0:4365 -6943:2:1360 -6944:0:4365 -6945:3:2942 -6946:0:4365 -6947:2:1361 -6948:0:4365 -6949:3:2943 -6950:0:4365 -6951:2:1362 -6952:2:1366 -6953:2:1367 -6954:2:1375 -6955:2:1376 -6956:2:1380 -6957:2:1381 -6958:2:1375 -6959:2:1376 -6960:2:1380 -6961:2:1381 -6962:2:1389 -6963:2:1394 -6964:2:1398 -6965:2:1399 -6966:2:1406 -6967:2:1407 -6968:2:1418 -6969:2:1419 -6970:2:1420 -6971:2:1418 -6972:2:1419 -6973:2:1420 -6974:2:1431 -6975:2:1436 -6976:2:1437 -6977:0:4365 -6978:2:1449 -6979:0:4365 -6980:3:2942 -6981:0:4365 -6982:2:1451 -6983:0:4365 -6984:3:2943 -6985:0:4365 -6986:2:1652 -6987:0:4365 -6988:2:1653 -6989:0:4365 -6990:2:1657 -6991:0:4365 -6992:2:1660 -6993:0:4365 -6994:3:2942 -6995:0:4365 -6996:2:1665 -6997:2:1669 -6998:2:1670 -6999:2:1678 -7000:2:1679 -7001:2:1683 -7002:2:1684 -7003:2:1678 -7004:2:1679 -7005:2:1680 -7006:2:1692 -7007:2:1697 -7008:2:1701 -7009:2:1702 -7010:2:1709 -7011:2:1710 -7012:2:1721 -7013:2:1722 -7014:2:1723 -7015:2:1721 -7016:2:1722 -7017:2:1723 -7018:2:1734 -7019:2:1739 -7020:2:1740 -7021:0:4365 -7022:3:2943 -7023:0:4365 -7024:2:1752 -7025:0:4365 -7026:3:2942 -7027:0:4365 -7028:2:1754 -7029:0:4365 -7030:3:2943 -7031:0:4365 -7032:2:1755 -7033:2:1759 -7034:2:1760 -7035:2:1768 -7036:2:1769 -7037:2:1773 -7038:2:1774 -7039:2:1768 -7040:2:1769 -7041:2:1773 -7042:2:1774 -7043:2:1782 -7044:2:1787 -7045:2:1791 -7046:2:1792 -7047:2:1799 -7048:2:1800 -7049:2:1811 -7050:2:1812 -7051:2:1813 -7052:2:1811 -7053:2:1812 -7054:2:1813 -7055:2:1824 -7056:2:1829 -7057:2:1830 -7058:0:4365 -7059:2:1842 -7060:0:4365 -7061:3:2942 -7062:0:4365 -7063:2:1844 -7064:0:4365 -7065:3:2943 -7066:0:4365 -7067:2:1845 -7068:2:1849 -7069:2:1850 -7070:2:1858 -7071:2:1859 -7072:2:1863 -7073:2:1864 -7074:2:1858 -7075:2:1859 -7076:2:1863 -7077:2:1864 -7078:2:1872 -7079:2:1877 -7080:2:1881 -7081:2:1882 -7082:2:1889 -7083:2:1890 -7084:2:1901 -7085:2:1902 -7086:2:1903 -7087:2:1901 -7088:2:1902 -7089:2:1903 -7090:2:1914 -7091:2:1919 -7092:2:1920 -7093:0:4365 -7094:2:1932 -7095:0:4365 -7096:3:2942 -7097:0:4365 -7098:2:1934 -7099:0:4365 -7100:3:2943 -7101:0:4365 -7102:2:1935 -7103:0:4365 -7104:2:1936 -7105:0:4365 -7106:2:2129 -7107:0:4365 -7108:2:2130 -7109:0:4365 -7110:2:2134 -7111:0:4365 -7112:3:2942 -7113:0:4365 -7114:2:2136 -7115:0:4365 -7116:3:2943 -7117:0:4365 -7118:2:2137 -7119:2:2141 -7120:2:2142 -7121:2:2150 -7122:2:2151 -7123:2:2155 -7124:2:2156 -7125:2:2150 -7126:2:2151 -7127:2:2155 -7128:2:2156 -7129:2:2164 -7130:2:2169 -7131:2:2173 -7132:2:2174 -7133:2:2181 -7134:2:2182 -7135:2:2193 -7136:2:2194 -7137:2:2195 -7138:2:2193 -7139:2:2194 -7140:2:2195 -7141:2:2206 -7142:2:2211 -7143:2:2212 -7144:0:4365 -7145:2:2224 -7146:0:4365 -7147:3:2942 -7148:0:4365 -7149:2:2226 -7150:0:4365 -7151:3:2943 -7152:0:4365 -7153:2:2230 -7154:0:4365 -7155:3:2942 -7156:0:4365 -7157:2:2235 -7158:2:2239 -7159:2:2240 -7160:2:2248 -7161:2:2249 -7162:2:2253 -7163:2:2254 -7164:2:2248 -7165:2:2249 -7166:2:2250 -7167:2:2262 -7168:2:2267 -7169:2:2271 -7170:2:2272 -7171:2:2279 -7172:2:2280 -7173:2:2291 -7174:2:2292 -7175:2:2293 -7176:2:2291 -7177:2:2292 -7178:2:2293 -7179:2:2304 -7180:2:2309 -7181:2:2310 -7182:0:4365 -7183:3:2943 -7184:0:4365 -7185:2:2322 -7186:0:4365 -7187:2:1169 -7188:0:4365 -7189:3:2942 -7190:0:4365 -7191:2:1170 -7192:0:4365 -7193:3:2943 -7194:0:4365 -7195:3:2944 -7196:0:4365 -7197:3:2950 -7198:0:4365 -7199:3:2951 -7200:0:4365 -7201:3:2952 -7202:0:4365 -7203:3:2953 -7204:0:4365 -7205:3:2954 -7206:3:2958 -7207:3:2959 -7208:3:2967 -7209:3:2968 -7210:3:2972 -7211:3:2973 -7212:3:2967 -7213:3:2968 -7214:3:2972 -7215:3:2973 -7216:3:2981 -7217:3:2986 -7218:3:2990 -7219:3:2991 -7220:3:2998 -7221:3:2999 -7222:3:3010 -7223:3:3011 -7224:3:3012 -7225:3:3010 -7226:3:3011 -7227:3:3012 -7228:3:3023 -7229:3:3028 -7230:3:3029 -7231:0:4365 -7232:3:3041 -7233:0:4365 -7234:3:3042 -7235:0:4365 -7236:2:1173 -7237:0:4365 -7238:3:3043 -7239:0:4365 -7240:2:1179 -7241:0:4365 -7242:2:1180 -7243:0:4365 -7244:3:3042 -7245:0:4365 -7246:2:1181 -7247:2:1185 -7248:2:1186 -7249:2:1194 -7250:2:1195 -7251:2:1199 -7252:2:1200 -7253:2:1194 -7254:2:1195 -7255:2:1199 -7256:2:1200 -7257:2:1208 -7258:2:1213 -7259:2:1217 -7260:2:1218 -7261:2:1225 -7262:2:1226 -7263:2:1237 -7264:2:1238 -7265:2:1239 -7266:2:1237 -7267:2:1238 -7268:2:1239 -7269:2:1250 -7270:2:1255 -7271:2:1256 -7272:0:4365 -7273:3:3043 -7274:0:4365 -7275:2:1268 -7276:0:4365 -7277:3:3042 -7278:0:4365 -7279:2:1270 -7280:0:4365 -7281:3:3043 -7282:0:4365 -7283:2:1271 -7284:2:1275 -7285:2:1276 -7286:2:1284 -7287:2:1285 -7288:2:1289 -7289:2:1290 -7290:2:1284 -7291:2:1285 -7292:2:1289 -7293:2:1290 -7294:2:1298 -7295:2:1303 -7296:2:1307 -7297:2:1308 -7298:2:1315 -7299:2:1316 -7300:2:1327 -7301:2:1328 -7302:2:1329 -7303:2:1327 -7304:2:1328 -7305:2:1329 -7306:2:1340 -7307:2:1345 -7308:2:1346 -7309:0:4365 -7310:2:1358 -7311:0:4365 -7312:2:1360 -7313:0:4365 -7314:3:3042 -7315:0:4365 -7316:2:1361 -7317:0:4365 -7318:3:3043 -7319:0:4365 -7320:2:1362 -7321:2:1366 -7322:2:1367 -7323:2:1375 -7324:2:1376 -7325:2:1380 -7326:2:1381 -7327:2:1375 -7328:2:1376 -7329:2:1380 -7330:2:1381 -7331:2:1389 -7332:2:1394 -7333:2:1398 -7334:2:1399 -7335:2:1406 -7336:2:1407 -7337:2:1418 -7338:2:1419 -7339:2:1420 -7340:2:1418 -7341:2:1419 -7342:2:1420 -7343:2:1431 -7344:2:1436 -7345:2:1437 -7346:0:4365 -7347:2:1449 -7348:0:4365 -7349:3:3042 -7350:0:4365 -7351:2:1451 -7352:0:4365 -7353:3:3043 -7354:0:4365 -7355:2:1652 -7356:0:4365 -7357:2:1653 -7358:0:4365 -7359:2:1657 -7360:0:4365 -7361:2:1660 -7362:0:4365 -7363:3:3042 -7364:0:4365 -7365:2:1665 -7366:2:1669 -7367:2:1670 -7368:2:1678 -7369:2:1679 -7370:2:1683 -7371:2:1684 -7372:2:1678 -7373:2:1679 -7374:2:1680 -7375:2:1692 -7376:2:1697 -7377:2:1701 -7378:2:1702 -7379:2:1709 -7380:2:1710 -7381:2:1721 -7382:2:1722 -7383:2:1723 -7384:2:1721 -7385:2:1722 -7386:2:1723 -7387:2:1734 -7388:2:1739 -7389:2:1740 -7390:0:4365 -7391:3:3043 -7392:0:4365 -7393:2:1752 -7394:0:4365 -7395:3:3042 -7396:0:4365 -7397:2:1754 -7398:0:4365 -7399:3:3043 -7400:0:4365 -7401:2:1755 -7402:2:1759 -7403:2:1760 -7404:2:1768 -7405:2:1769 -7406:2:1773 -7407:2:1774 -7408:2:1768 -7409:2:1769 -7410:2:1773 -7411:2:1774 -7412:2:1782 -7413:2:1787 -7414:2:1791 -7415:2:1792 -7416:2:1799 -7417:2:1800 -7418:2:1811 -7419:2:1812 -7420:2:1813 -7421:2:1811 -7422:2:1812 -7423:2:1813 -7424:2:1824 -7425:2:1829 -7426:2:1830 -7427:0:4365 -7428:2:1842 -7429:0:4365 -7430:3:3042 -7431:0:4365 -7432:2:1844 -7433:0:4365 -7434:3:3043 -7435:0:4365 -7436:2:1845 -7437:2:1849 -7438:2:1850 -7439:2:1858 -7440:2:1859 -7441:2:1863 -7442:2:1864 -7443:2:1858 -7444:2:1859 -7445:2:1863 -7446:2:1864 -7447:2:1872 -7448:2:1877 -7449:2:1881 -7450:2:1882 -7451:2:1889 -7452:2:1890 -7453:2:1901 -7454:2:1902 -7455:2:1903 -7456:2:1901 -7457:2:1902 -7458:2:1903 -7459:2:1914 -7460:2:1919 -7461:2:1920 -7462:0:4365 -7463:2:1932 -7464:0:4365 -7465:3:3042 -7466:0:4365 -7467:2:1934 -7468:0:4365 -7469:3:3043 -7470:0:4365 -7471:2:1935 -7472:0:4365 -7473:2:1936 -7474:0:4365 -7475:2:2129 -7476:0:4365 -7477:2:2130 -7478:0:4365 -7479:2:2134 -7480:0:4365 -7481:3:3042 -7482:0:4365 -7483:2:2136 -7484:0:4365 -7485:3:3043 -7486:0:4365 -7487:2:2137 -7488:2:2141 -7489:2:2142 -7490:2:2150 -7491:2:2151 -7492:2:2155 -7493:2:2156 -7494:2:2150 -7495:2:2151 -7496:2:2155 -7497:2:2156 -7498:2:2164 -7499:2:2169 -7500:2:2173 -7501:2:2174 -7502:2:2181 -7503:2:2182 -7504:2:2193 -7505:2:2194 -7506:2:2195 -7507:2:2193 -7508:2:2194 -7509:2:2195 -7510:2:2206 -7511:2:2211 -7512:2:2212 -7513:0:4365 -7514:2:2224 -7515:0:4365 -7516:3:3042 -7517:0:4365 -7518:2:2226 -7519:0:4365 -7520:3:3043 -7521:0:4365 -7522:2:2230 -7523:0:4365 -7524:3:3042 -7525:0:4365 -7526:2:2235 -7527:2:2239 -7528:2:2240 -7529:2:2248 -7530:2:2249 -7531:2:2253 -7532:2:2254 -7533:2:2248 -7534:2:2249 -7535:2:2250 -7536:2:2262 -7537:2:2267 -7538:2:2271 -7539:2:2272 -7540:2:2279 -7541:2:2280 -7542:2:2291 -7543:2:2292 -7544:2:2293 -7545:2:2291 -7546:2:2292 -7547:2:2293 -7548:2:2304 -7549:2:2309 -7550:2:2310 -7551:0:4365 -7552:3:3043 -7553:0:4365 -7554:2:2322 -7555:0:4365 -7556:2:1169 -7557:0:4365 -7558:3:3042 -7559:0:4365 -7560:2:1170 -7561:0:4365 -7562:3:3043 -7563:0:4365 -7564:3:3044 -7565:0:4365 -7566:3:3257 -7567:0:4365 -7568:3:3265 -7569:0:4365 -7570:3:3266 -7571:3:3270 -7572:3:3271 -7573:3:3279 -7574:3:3280 -7575:3:3284 -7576:3:3285 -7577:3:3279 -7578:3:3280 -7579:3:3284 -7580:3:3285 -7581:3:3293 -7582:3:3298 -7583:3:3302 -7584:3:3303 -7585:3:3310 -7586:3:3311 -7587:3:3322 -7588:3:3323 -7589:3:3324 -7590:3:3322 -7591:3:3323 -7592:3:3324 -7593:3:3335 -7594:3:3340 -7595:3:3341 -7596:0:4365 -7597:3:3353 -7598:0:4365 -7599:3:3354 -7600:0:4365 -7601:2:1173 -7602:0:4365 -7603:3:3355 -7604:0:4365 -7605:2:1179 -7606:0:4365 -7607:2:1180 -7608:0:4365 -7609:3:3354 -7610:0:4365 -7611:2:1181 -7612:2:1185 -7613:2:1186 -7614:2:1194 -7615:2:1195 -7616:2:1199 -7617:2:1200 -7618:2:1194 -7619:2:1195 -7620:2:1199 -7621:2:1200 -7622:2:1208 -7623:2:1213 -7624:2:1217 -7625:2:1218 -7626:2:1225 -7627:2:1226 -7628:2:1237 -7629:2:1238 -7630:2:1239 -7631:2:1237 -7632:2:1238 -7633:2:1239 -7634:2:1250 -7635:2:1255 -7636:2:1256 -7637:0:4365 -7638:3:3355 -7639:0:4365 -7640:2:1268 -7641:0:4365 -7642:3:3354 -7643:0:4365 -7644:2:1270 -7645:0:4365 -7646:3:3355 -7647:0:4365 -7648:2:1271 -7649:2:1275 -7650:2:1276 -7651:2:1284 -7652:2:1285 -7653:2:1289 -7654:2:1290 -7655:2:1284 -7656:2:1285 -7657:2:1289 -7658:2:1290 -7659:2:1298 -7660:2:1303 -7661:2:1307 -7662:2:1308 -7663:2:1315 -7664:2:1316 -7665:2:1327 -7666:2:1328 -7667:2:1329 -7668:2:1327 -7669:2:1328 -7670:2:1329 -7671:2:1340 -7672:2:1345 -7673:2:1346 -7674:0:4365 -7675:2:1358 -7676:0:4365 -7677:2:1360 -7678:0:4365 -7679:3:3354 -7680:0:4365 -7681:2:1361 -7682:0:4365 -7683:3:3355 -7684:0:4365 -7685:2:1362 -7686:2:1366 -7687:2:1367 -7688:2:1375 -7689:2:1376 -7690:2:1380 -7691:2:1381 -7692:2:1375 -7693:2:1376 -7694:2:1380 -7695:2:1381 -7696:2:1389 -7697:2:1394 -7698:2:1398 -7699:2:1399 -7700:2:1406 -7701:2:1407 -7702:2:1418 -7703:2:1419 -7704:2:1420 -7705:2:1418 -7706:2:1419 -7707:2:1420 -7708:2:1431 -7709:2:1436 -7710:2:1437 -7711:0:4365 -7712:2:1449 -7713:0:4365 -7714:3:3354 -7715:0:4365 -7716:2:1451 -7717:0:4365 -7718:3:3355 -7719:0:4365 -7720:2:1652 -7721:0:4365 -7722:2:1653 -7723:0:4365 -7724:2:1657 -7725:0:4365 -7726:2:1660 -7727:0:4365 -7728:3:3354 -7729:0:4365 -7730:2:1665 -7731:2:1669 -7732:2:1670 -7733:2:1678 -7734:2:1679 -7735:2:1683 -7736:2:1684 -7737:2:1678 -7738:2:1679 -7739:2:1680 -7740:2:1692 -7741:2:1697 -7742:2:1701 -7743:2:1702 -7744:2:1709 -7745:2:1710 -7746:2:1721 -7747:2:1722 -7748:2:1723 -7749:2:1721 -7750:2:1722 -7751:2:1723 -7752:2:1734 -7753:2:1739 -7754:2:1740 -7755:0:4365 -7756:3:3355 -7757:0:4365 -7758:2:1752 -7759:0:4365 -7760:3:3354 -7761:0:4365 -7762:2:1754 -7763:0:4365 -7764:3:3355 -7765:0:4365 -7766:2:1755 -7767:2:1759 -7768:2:1760 -7769:2:1768 -7770:2:1769 -7771:2:1773 -7772:2:1774 -7773:2:1768 -7774:2:1769 -7775:2:1773 -7776:2:1774 -7777:2:1782 -7778:2:1787 -7779:2:1791 -7780:2:1792 -7781:2:1799 -7782:2:1800 -7783:2:1811 -7784:2:1812 -7785:2:1813 -7786:2:1811 -7787:2:1812 -7788:2:1813 -7789:2:1824 -7790:2:1829 -7791:2:1830 -7792:0:4365 -7793:2:1842 -7794:0:4365 -7795:3:3354 -7796:0:4365 -7797:2:1844 -7798:0:4365 -7799:3:3355 -7800:0:4365 -7801:2:1845 -7802:2:1849 -7803:2:1850 -7804:2:1858 -7805:2:1859 -7806:2:1863 -7807:2:1864 -7808:2:1858 -7809:2:1859 -7810:2:1863 -7811:2:1864 -7812:2:1872 -7813:2:1877 -7814:2:1881 -7815:2:1882 -7816:2:1889 -7817:2:1890 -7818:2:1901 -7819:2:1902 -7820:2:1903 -7821:2:1901 -7822:2:1902 -7823:2:1903 -7824:2:1914 -7825:2:1919 -7826:2:1920 -7827:0:4365 -7828:2:1932 -7829:0:4365 -7830:3:3354 -7831:0:4365 -7832:2:1934 -7833:0:4365 -7834:3:3355 -7835:0:4365 -7836:2:1935 -7837:0:4365 -7838:2:1936 -7839:0:4365 -7840:2:2129 -7841:0:4365 -7842:2:2130 -7843:0:4365 -7844:2:2134 -7845:0:4365 -7846:3:3354 -7847:0:4365 -7848:2:2136 -7849:0:4365 -7850:3:3355 -7851:0:4365 -7852:2:2137 -7853:2:2141 -7854:2:2142 -7855:2:2150 -7856:2:2151 -7857:2:2155 -7858:2:2156 -7859:2:2150 -7860:2:2151 -7861:2:2155 -7862:2:2156 -7863:2:2164 -7864:2:2169 -7865:2:2173 -7866:2:2174 -7867:2:2181 -7868:2:2182 -7869:2:2193 -7870:2:2194 -7871:2:2195 -7872:2:2193 -7873:2:2194 -7874:2:2195 -7875:2:2206 -7876:2:2211 -7877:2:2212 -7878:0:4365 -7879:2:2224 -7880:0:4365 -7881:3:3354 -7882:0:4365 -7883:2:2226 -7884:0:4365 -7885:3:3355 -7886:0:4365 -7887:2:2230 -7888:0:4365 -7889:3:3354 -7890:0:4365 -7891:2:2235 -7892:2:2239 -7893:2:2240 -7894:2:2248 -7895:2:2249 -7896:2:2253 -7897:2:2254 -7898:2:2248 -7899:2:2249 -7900:2:2250 -7901:2:2262 -7902:2:2267 -7903:2:2271 -7904:2:2272 -7905:2:2279 -7906:2:2280 -7907:2:2291 -7908:2:2292 -7909:2:2293 -7910:2:2291 -7911:2:2292 -7912:2:2293 -7913:2:2304 -7914:2:2309 -7915:2:2310 -7916:0:4365 -7917:3:3355 -7918:0:4365 -7919:2:2322 -7920:0:4365 -7921:2:1169 -7922:0:4365 -7923:3:3354 -7924:0:4365 -7925:2:1170 -7926:0:4365 -7927:3:3355 -7928:0:4365 -7929:3:3356 -7930:0:4365 -7931:3:3366 -7932:0:4365 -7933:3:2951 -7934:0:4365 -7935:3:2952 -7936:0:4365 -7937:3:2953 -7938:0:4365 -7939:3:2954 -7940:3:2958 -7941:3:2959 -7942:3:2967 -7943:3:2968 -7944:3:2972 -7945:3:2973 -7946:3:2967 -7947:3:2968 -7948:3:2972 -7949:3:2973 -7950:3:2981 -7951:3:2986 -7952:3:2990 -7953:3:2991 -7954:3:2998 -7955:3:2999 -7956:3:3010 -7957:3:3011 -7958:3:3012 -7959:3:3010 -7960:3:3011 -7961:3:3012 -7962:3:3023 -7963:3:3028 -7964:3:3029 -7965:0:4365 -7966:3:3041 -7967:0:4365 -7968:3:3042 -7969:0:4365 -7970:2:1173 -7971:0:4365 -7972:3:3043 -7973:0:4365 -7974:2:1179 -7975:0:4365 -7976:2:1180 -7977:0:4365 -7978:3:3042 -7979:0:4365 -7980:2:1181 -7981:2:1185 -7982:2:1186 -7983:2:1194 -7984:2:1195 -7985:2:1199 -7986:2:1200 -7987:2:1194 -7988:2:1195 -7989:2:1199 -7990:2:1200 -7991:2:1208 -7992:2:1213 -7993:2:1217 -7994:2:1218 -7995:2:1225 -7996:2:1226 -7997:2:1237 -7998:2:1238 -7999:2:1239 -8000:2:1237 -8001:2:1238 -8002:2:1239 -8003:2:1250 -8004:2:1255 -8005:2:1256 -8006:0:4365 -8007:3:3043 -8008:0:4365 -8009:2:1268 -8010:0:4365 -8011:3:3042 -8012:0:4365 -8013:2:1270 -8014:0:4365 -8015:3:3043 -8016:0:4365 -8017:2:1271 -8018:2:1275 -8019:2:1276 -8020:2:1284 -8021:2:1285 -8022:2:1289 -8023:2:1290 -8024:2:1284 -8025:2:1285 -8026:2:1289 -8027:2:1290 -8028:2:1298 -8029:2:1303 -8030:2:1307 -8031:2:1308 -8032:2:1315 -8033:2:1316 -8034:2:1327 -8035:2:1328 -8036:2:1329 -8037:2:1327 -8038:2:1328 -8039:2:1329 -8040:2:1340 -8041:2:1345 -8042:2:1346 -8043:0:4365 -8044:2:1358 -8045:0:4365 -8046:2:1360 -8047:0:4365 -8048:3:3042 -8049:0:4365 -8050:2:1361 -8051:0:4365 -8052:3:3043 -8053:0:4365 -8054:2:1362 -8055:2:1366 -8056:2:1367 -8057:2:1375 -8058:2:1376 -8059:2:1380 -8060:2:1381 -8061:2:1375 -8062:2:1376 -8063:2:1380 -8064:2:1381 -8065:2:1389 -8066:2:1394 -8067:2:1398 -8068:2:1399 -8069:2:1406 -8070:2:1407 -8071:2:1418 -8072:2:1419 -8073:2:1420 -8074:2:1418 -8075:2:1419 -8076:2:1420 -8077:2:1431 -8078:2:1436 -8079:2:1437 -8080:0:4365 -8081:2:1449 -8082:0:4365 -8083:3:3042 -8084:0:4365 -8085:2:1451 -8086:0:4365 -8087:3:3043 -8088:0:4365 -8089:2:1652 -8090:0:4365 -8091:2:1653 -8092:0:4365 -8093:2:1657 -8094:0:4365 -8095:2:1660 -8096:0:4365 -8097:3:3042 -8098:0:4365 -8099:2:1665 -8100:2:1669 -8101:2:1670 -8102:2:1678 -8103:2:1679 -8104:2:1683 -8105:2:1684 -8106:2:1678 -8107:2:1679 -8108:2:1680 -8109:2:1692 -8110:2:1697 -8111:2:1701 -8112:2:1702 -8113:2:1709 -8114:2:1710 -8115:2:1721 -8116:2:1722 -8117:2:1723 -8118:2:1721 -8119:2:1722 -8120:2:1723 -8121:2:1734 -8122:2:1739 -8123:2:1740 -8124:0:4365 -8125:3:3043 -8126:0:4365 -8127:2:1752 -8128:0:4365 -8129:3:3042 -8130:0:4365 -8131:2:1754 -8132:0:4365 -8133:3:3043 -8134:0:4365 -8135:2:1755 -8136:2:1759 -8137:2:1760 -8138:2:1768 -8139:2:1769 -8140:2:1773 -8141:2:1774 -8142:2:1768 -8143:2:1769 -8144:2:1773 -8145:2:1774 -8146:2:1782 -8147:2:1787 -8148:2:1791 -8149:2:1792 -8150:2:1799 -8151:2:1800 -8152:2:1811 -8153:2:1812 -8154:2:1813 -8155:2:1811 -8156:2:1812 -8157:2:1813 -8158:2:1824 -8159:2:1829 -8160:2:1830 -8161:0:4365 -8162:2:1842 -8163:0:4365 -8164:3:3042 -8165:0:4365 -8166:2:1844 -8167:0:4365 -8168:3:3043 -8169:0:4365 -8170:2:1845 -8171:2:1849 -8172:2:1850 -8173:2:1858 -8174:2:1859 -8175:2:1863 -8176:2:1864 -8177:2:1858 -8178:2:1859 -8179:2:1863 -8180:2:1864 -8181:2:1872 -8182:2:1877 -8183:2:1881 -8184:2:1882 -8185:2:1889 -8186:2:1890 -8187:2:1901 -8188:2:1902 -8189:2:1903 -8190:2:1901 -8191:2:1902 -8192:2:1903 -8193:2:1914 -8194:2:1919 -8195:2:1920 -8196:0:4365 -8197:2:1932 -8198:0:4365 -8199:3:3042 -8200:0:4365 -8201:2:1934 -8202:0:4365 -8203:3:3043 -8204:0:4365 -8205:2:1935 -8206:0:4365 -8207:2:1936 -8208:0:4365 -8209:2:2129 -8210:0:4365 -8211:2:2130 -8212:0:4365 -8213:2:2134 -8214:0:4365 -8215:3:3042 -8216:0:4365 -8217:2:2136 -8218:0:4365 -8219:3:3043 -8220:0:4365 -8221:2:2137 -8222:2:2141 -8223:2:2142 -8224:2:2150 -8225:2:2151 -8226:2:2155 -8227:2:2156 -8228:2:2150 -8229:2:2151 -8230:2:2155 -8231:2:2156 -8232:2:2164 -8233:2:2169 -8234:2:2173 -8235:2:2174 -8236:2:2181 -8237:2:2182 -8238:2:2193 -8239:2:2194 -8240:2:2195 -8241:2:2193 -8242:2:2194 -8243:2:2195 -8244:2:2206 -8245:2:2211 -8246:2:2212 -8247:0:4365 -8248:2:2224 -8249:0:4365 -8250:3:3042 -8251:0:4365 -8252:2:2226 -8253:0:4365 -8254:3:3043 -8255:0:4365 -8256:2:2230 -8257:0:4365 -8258:3:3042 -8259:0:4365 -8260:2:2235 -8261:2:2239 -8262:2:2240 -8263:2:2248 -8264:2:2249 -8265:2:2253 -8266:2:2254 -8267:2:2248 -8268:2:2249 -8269:2:2250 -8270:2:2262 -8271:2:2267 -8272:2:2271 -8273:2:2272 -8274:2:2279 -8275:2:2280 -8276:2:2291 -8277:2:2292 -8278:2:2293 -8279:2:2291 -8280:2:2292 -8281:2:2293 -8282:2:2304 -8283:2:2309 -8284:2:2310 -8285:0:4365 -8286:3:3043 -8287:0:4365 -8288:2:2322 -8289:0:4365 -8290:2:1169 -8291:0:4365 -8292:3:3042 -8293:0:4365 -8294:2:1170 -8295:0:4365 -8296:3:3043 -8297:0:4365 -8298:3:3044 -8299:0:4365 -8300:3:3257 -8301:0:4365 -8302:3:3362 -8303:0:4365 -8304:3:3363 -8305:0:4365 -8306:3:3367 -8307:0:4365 -8308:3:3373 -8309:3:3377 -8310:3:3378 -8311:3:3386 -8312:3:3387 -8313:3:3391 -8314:3:3392 -8315:3:3386 -8316:3:3387 -8317:3:3391 -8318:3:3392 -8319:3:3400 -8320:3:3405 -8321:3:3409 -8322:3:3410 -8323:3:3417 -8324:3:3418 -8325:3:3429 -8326:3:3430 -8327:3:3431 -8328:3:3429 -8329:3:3430 -8330:3:3431 -8331:3:3442 -8332:3:3447 -8333:3:3448 -8334:0:4365 -8335:3:3460 -8336:0:4365 -8337:3:3461 -8338:0:4365 -8339:2:1173 -8340:0:4365 -8341:3:3462 -8342:0:4365 -8343:2:1179 -8344:0:4365 -8345:2:1180 -8346:0:4365 -8347:3:3461 -8348:0:4365 -8349:2:1181 -8350:2:1185 -8351:2:1186 -8352:2:1194 -8353:2:1195 -8354:2:1199 -8355:2:1200 -8356:2:1194 -8357:2:1195 -8358:2:1199 -8359:2:1200 -8360:2:1208 -8361:2:1213 -8362:2:1217 -8363:2:1218 -8364:2:1225 -8365:2:1226 -8366:2:1237 -8367:2:1238 -8368:2:1239 -8369:2:1237 -8370:2:1238 -8371:2:1239 -8372:2:1250 -8373:2:1255 -8374:2:1256 -8375:0:4365 -8376:3:3462 -8377:0:4365 -8378:2:1268 -8379:0:4365 -8380:3:3461 -8381:0:4365 -8382:2:1270 -8383:0:4365 -8384:3:3462 -8385:0:4365 -8386:2:1271 -8387:2:1275 -8388:2:1276 -8389:2:1284 -8390:2:1285 -8391:2:1289 -8392:2:1290 -8393:2:1284 -8394:2:1285 -8395:2:1289 -8396:2:1290 -8397:2:1298 -8398:2:1303 -8399:2:1307 -8400:2:1308 -8401:2:1315 -8402:2:1316 -8403:2:1327 -8404:2:1328 -8405:2:1329 -8406:2:1327 -8407:2:1328 -8408:2:1329 -8409:2:1340 -8410:2:1345 -8411:2:1346 -8412:0:4365 -8413:2:1358 -8414:0:4365 -8415:2:1360 -8416:0:4365 -8417:3:3461 -8418:0:4365 -8419:2:1361 -8420:0:4365 -8421:3:3462 -8422:0:4365 -8423:2:1362 -8424:2:1366 -8425:2:1367 -8426:2:1375 -8427:2:1376 -8428:2:1380 -8429:2:1381 -8430:2:1375 -8431:2:1376 -8432:2:1380 -8433:2:1381 -8434:2:1389 -8435:2:1394 -8436:2:1398 -8437:2:1399 -8438:2:1406 -8439:2:1407 -8440:2:1418 -8441:2:1419 -8442:2:1420 -8443:2:1418 -8444:2:1419 -8445:2:1420 -8446:2:1431 -8447:2:1436 -8448:2:1437 -8449:0:4365 -8450:2:1449 -8451:0:4365 -8452:3:3461 -8453:0:4365 -8454:2:1451 -8455:0:4365 -8456:3:3462 -8457:0:4365 -8458:2:1652 -8459:0:4365 -8460:2:1653 -8461:0:4365 -8462:2:1657 -8463:0:4365 -8464:2:1660 -8465:0:4365 -8466:3:3461 -8467:0:4365 -8468:2:1665 -8469:2:1669 -8470:2:1670 -8471:2:1678 -8472:2:1679 -8473:2:1683 -8474:2:1684 -8475:2:1678 -8476:2:1679 -8477:2:1680 -8478:2:1692 -8479:2:1697 -8480:2:1701 -8481:2:1702 -8482:2:1709 -8483:2:1710 -8484:2:1721 -8485:2:1722 -8486:2:1723 -8487:2:1721 -8488:2:1722 -8489:2:1723 -8490:2:1734 -8491:2:1739 -8492:2:1740 -8493:0:4365 -8494:3:3462 -8495:0:4365 -8496:2:1752 -8497:0:4365 -8498:3:3461 -8499:0:4365 -8500:2:1754 -8501:0:4365 -8502:3:3462 -8503:0:4365 -8504:2:1755 -8505:2:1759 -8506:2:1760 -8507:2:1768 -8508:2:1769 -8509:2:1773 -8510:2:1774 -8511:2:1768 -8512:2:1769 -8513:2:1773 -8514:2:1774 -8515:2:1782 -8516:2:1787 -8517:2:1791 -8518:2:1792 -8519:2:1799 -8520:2:1800 -8521:2:1811 -8522:2:1812 -8523:2:1813 -8524:2:1811 -8525:2:1812 -8526:2:1813 -8527:2:1824 -8528:2:1829 -8529:2:1830 -8530:0:4365 -8531:2:1842 -8532:0:4365 -8533:3:3461 -8534:0:4365 -8535:2:1844 -8536:0:4365 -8537:3:3462 -8538:0:4365 -8539:2:1845 -8540:2:1849 -8541:2:1850 -8542:2:1858 -8543:2:1859 -8544:2:1863 -8545:2:1864 -8546:2:1858 -8547:2:1859 -8548:2:1863 -8549:2:1864 -8550:2:1872 -8551:2:1877 -8552:2:1881 -8553:2:1882 -8554:2:1889 -8555:2:1890 -8556:2:1901 -8557:2:1902 -8558:2:1903 -8559:2:1901 -8560:2:1902 -8561:2:1903 -8562:2:1914 -8563:2:1919 -8564:2:1920 -8565:0:4365 -8566:2:1932 -8567:0:4365 -8568:3:3461 -8569:0:4365 -8570:2:1934 -8571:0:4365 -8572:3:3462 -8573:0:4365 -8574:2:1935 -8575:0:4365 -8576:2:1936 -8577:0:4365 -8578:2:2129 -8579:0:4365 -8580:2:2130 -8581:0:4365 -8582:2:2134 -8583:0:4365 -8584:3:3461 -8585:0:4365 -8586:2:2136 -8587:0:4365 -8588:3:3462 -8589:0:4365 -8590:2:2137 -8591:2:2141 -8592:2:2142 -8593:2:2150 -8594:2:2151 -8595:2:2155 -8596:2:2156 -8597:2:2150 -8598:2:2151 -8599:2:2155 -8600:2:2156 -8601:2:2164 -8602:2:2169 -8603:2:2173 -8604:2:2174 -8605:2:2181 -8606:2:2182 -8607:2:2193 -8608:2:2194 -8609:2:2195 -8610:2:2193 -8611:2:2194 -8612:2:2195 -8613:2:2206 -8614:2:2211 -8615:2:2212 -8616:0:4365 -8617:2:2224 -8618:0:4365 -8619:3:3461 -8620:0:4365 -8621:2:2226 -8622:0:4365 -8623:3:3462 -8624:0:4365 -8625:2:2230 -8626:0:4365 -8627:3:3461 -8628:0:4365 -8629:2:2235 -8630:2:2239 -8631:2:2240 -8632:2:2248 -8633:2:2249 -8634:2:2253 -8635:2:2254 -8636:2:2248 -8637:2:2249 -8638:2:2250 -8639:2:2262 -8640:2:2267 -8641:2:2271 -8642:2:2272 -8643:2:2279 -8644:2:2280 -8645:2:2291 -8646:2:2292 -8647:2:2293 -8648:2:2291 -8649:2:2292 -8650:2:2293 -8651:2:2304 -8652:2:2309 -8653:2:2310 -8654:0:4365 -8655:3:3462 -8656:0:4365 -8657:2:2322 -8658:0:4365 -8659:2:1169 -8660:0:4365 -8661:3:3461 -8662:0:4365 -8663:2:1170 -8664:0:4365 -8665:3:3462 -8666:0:4365 -8667:3:3463 -8668:0:4365 -8669:3:3469 -8670:0:4365 -8671:3:3470 -8672:3:3474 -8673:3:3475 -8674:3:3483 -8675:3:3484 -8676:3:3488 -8677:3:3489 -8678:3:3483 -8679:3:3484 -8680:3:3488 -8681:3:3489 -8682:3:3497 -8683:3:3502 -8684:3:3506 -8685:3:3507 -8686:3:3514 -8687:3:3515 -8688:3:3526 -8689:3:3527 -8690:3:3528 -8691:3:3526 -8692:3:3527 -8693:3:3528 -8694:3:3539 -8695:3:3544 -8696:3:3545 -8697:0:4365 -8698:3:3557 -8699:0:4365 -8700:3:3558 -8701:0:4365 -8702:2:1173 -8703:0:4365 -8704:3:3559 -8705:0:4365 -8706:2:1179 -8707:0:4365 -8708:2:1180 -8709:0:4365 -8710:3:3558 -8711:0:4365 -8712:2:1181 -8713:2:1185 -8714:2:1186 -8715:2:1194 -8716:2:1195 -8717:2:1199 -8718:2:1200 -8719:2:1194 -8720:2:1195 -8721:2:1199 -8722:2:1200 -8723:2:1208 -8724:2:1213 -8725:2:1217 -8726:2:1218 -8727:2:1225 -8728:2:1226 -8729:2:1237 -8730:2:1238 -8731:2:1239 -8732:2:1237 -8733:2:1238 -8734:2:1239 -8735:2:1250 -8736:2:1255 -8737:2:1256 -8738:0:4365 -8739:3:3559 -8740:0:4365 -8741:2:1268 -8742:0:4365 -8743:3:3558 -8744:0:4365 -8745:2:1270 -8746:0:4365 -8747:3:3559 -8748:0:4365 -8749:2:1271 -8750:2:1275 -8751:2:1276 -8752:2:1284 -8753:2:1285 -8754:2:1289 -8755:2:1290 -8756:2:1284 -8757:2:1285 -8758:2:1289 -8759:2:1290 -8760:2:1298 -8761:2:1303 -8762:2:1307 -8763:2:1308 -8764:2:1315 -8765:2:1316 -8766:2:1327 -8767:2:1328 -8768:2:1329 -8769:2:1327 -8770:2:1328 -8771:2:1329 -8772:2:1340 -8773:2:1345 -8774:2:1346 -8775:0:4365 -8776:2:1358 -8777:0:4365 -8778:2:1360 -8779:0:4365 -8780:3:3558 -8781:0:4365 -8782:2:1361 -8783:0:4365 -8784:3:3559 -8785:0:4365 -8786:2:1362 -8787:2:1366 -8788:2:1367 -8789:2:1375 -8790:2:1376 -8791:2:1380 -8792:2:1381 -8793:2:1375 -8794:2:1376 -8795:2:1380 -8796:2:1381 -8797:2:1389 -8798:2:1394 -8799:2:1398 -8800:2:1399 -8801:2:1406 -8802:2:1407 -8803:2:1418 -8804:2:1419 -8805:2:1420 -8806:2:1418 -8807:2:1419 -8808:2:1420 -8809:2:1431 -8810:2:1436 -8811:2:1437 -8812:0:4365 -8813:2:1449 -8814:0:4365 -8815:3:3558 -8816:0:4365 -8817:2:1451 -8818:0:4365 -8819:3:3559 -8820:0:4365 -8821:2:1652 -8822:0:4365 -8823:2:1653 -8824:0:4365 -8825:2:1657 -8826:0:4365 -8827:2:1660 -8828:0:4365 -8829:3:3558 -8830:0:4365 -8831:2:1665 -8832:2:1669 -8833:2:1670 -8834:2:1678 -8835:2:1679 -8836:2:1683 -8837:2:1684 -8838:2:1678 -8839:2:1679 -8840:2:1680 -8841:2:1692 -8842:2:1697 -8843:2:1701 -8844:2:1702 -8845:2:1709 -8846:2:1710 -8847:2:1721 -8848:2:1722 -8849:2:1723 -8850:2:1721 -8851:2:1722 -8852:2:1723 -8853:2:1734 -8854:2:1739 -8855:2:1740 -8856:0:4365 -8857:3:3559 -8858:0:4365 -8859:2:1752 -8860:0:4365 -8861:3:3558 -8862:0:4365 -8863:2:1754 -8864:0:4365 -8865:3:3559 -8866:0:4365 -8867:2:1755 -8868:2:1759 -8869:2:1760 -8870:2:1768 -8871:2:1769 -8872:2:1773 -8873:2:1774 -8874:2:1768 -8875:2:1769 -8876:2:1773 -8877:2:1774 -8878:2:1782 -8879:2:1787 -8880:2:1791 -8881:2:1792 -8882:2:1799 -8883:2:1800 -8884:2:1811 -8885:2:1812 -8886:2:1813 -8887:2:1811 -8888:2:1812 -8889:2:1813 -8890:2:1824 -8891:2:1829 -8892:2:1830 -8893:0:4365 -8894:2:1842 -8895:0:4365 -8896:3:3558 -8897:0:4365 -8898:2:1844 -8899:0:4365 -8900:3:3559 -8901:0:4365 -8902:2:1845 -8903:2:1849 -8904:2:1850 -8905:2:1858 -8906:2:1859 -8907:2:1863 -8908:2:1864 -8909:2:1858 -8910:2:1859 -8911:2:1863 -8912:2:1864 -8913:2:1872 -8914:2:1877 -8915:2:1881 -8916:2:1882 -8917:2:1889 -8918:2:1890 -8919:2:1901 -8920:2:1902 -8921:2:1903 -8922:2:1901 -8923:2:1902 -8924:2:1903 -8925:2:1914 -8926:2:1919 -8927:2:1920 -8928:0:4365 -8929:2:1932 -8930:0:4365 -8931:3:3558 -8932:0:4365 -8933:2:1934 -8934:0:4365 -8935:3:3559 -8936:0:4365 -8937:2:1935 -8938:0:4365 -8939:2:1936 -8940:0:4365 -8941:2:2129 -8942:0:4365 -8943:2:2130 -8944:0:4365 -8945:2:2134 -8946:0:4365 -8947:3:3558 -8948:0:4365 -8949:2:2136 -8950:0:4365 -8951:3:3559 -8952:0:4365 -8953:2:2137 -8954:2:2141 -8955:2:2142 -8956:2:2150 -8957:2:2151 -8958:2:2155 -8959:2:2156 -8960:2:2150 -8961:2:2151 -8962:2:2155 -8963:2:2156 -8964:2:2164 -8965:2:2169 -8966:2:2173 -8967:2:2174 -8968:2:2181 -8969:2:2182 -8970:2:2193 -8971:2:2194 -8972:2:2195 -8973:2:2193 -8974:2:2194 -8975:2:2195 -8976:2:2206 -8977:2:2211 -8978:2:2212 -8979:0:4365 -8980:2:2224 -8981:0:4365 -8982:3:3558 -8983:0:4365 -8984:2:2226 -8985:0:4365 -8986:3:3559 -8987:0:4365 -8988:2:2230 -8989:0:4365 -8990:3:3558 -8991:0:4365 -8992:2:2235 -8993:2:2239 -8994:2:2240 -8995:2:2248 -8996:2:2249 -8997:2:2253 -8998:2:2254 -8999:2:2248 -9000:2:2249 -9001:2:2250 -9002:2:2262 -9003:2:2267 -9004:2:2271 -9005:2:2272 -9006:2:2279 -9007:2:2280 -9008:2:2291 -9009:2:2292 -9010:2:2293 -9011:2:2291 -9012:2:2292 -9013:2:2293 -9014:2:2304 -9015:2:2309 -9016:2:2310 -9017:0:4365 -9018:3:3559 -9019:0:4365 -9020:2:2322 -9021:0:4365 -9022:2:1169 -9023:0:4365 -9024:3:3558 -9025:0:4365 -9026:2:1170 -9027:0:4365 -9028:3:3559 -9029:0:4365 -9030:3:3560 -9031:0:4365 -9032:3:3566 -9033:0:4365 -9034:3:3569 -9035:3:3570 -9036:3:3582 -9037:3:3583 -9038:3:3587 -9039:3:3588 -9040:3:3582 -9041:3:3583 -9042:3:3587 -9043:3:3588 -9044:3:3596 -9045:3:3601 -9046:3:3605 -9047:3:3606 -9048:3:3613 -9049:3:3614 -9050:3:3625 -9051:3:3626 -9052:3:3627 -9053:3:3625 -9054:3:3626 -9055:3:3627 -9056:3:3638 -9057:3:3643 -9058:3:3644 -9059:0:4365 -9060:3:3656 -9061:0:4365 -9062:3:3657 -9063:0:4365 -9064:2:1173 -9065:0:4365 -9066:3:3658 -9067:0:4365 -9068:2:1179 -9069:0:4365 -9070:2:1180 -9071:0:4365 -9072:3:3657 -9073:0:4365 -9074:2:1181 -9075:2:1185 -9076:2:1186 -9077:2:1194 -9078:2:1195 -9079:2:1199 -9080:2:1200 -9081:2:1194 -9082:2:1195 -9083:2:1199 -9084:2:1200 -9085:2:1208 -9086:2:1213 -9087:2:1217 -9088:2:1218 -9089:2:1225 -9090:2:1226 -9091:2:1237 -9092:2:1238 -9093:2:1239 -9094:2:1237 -9095:2:1238 -9096:2:1239 -9097:2:1250 -9098:2:1255 -9099:2:1256 -9100:0:4365 -9101:3:3658 -9102:0:4365 -9103:2:1268 -9104:0:4365 -9105:3:3657 -9106:0:4365 -9107:2:1270 -9108:0:4365 -9109:3:3658 -9110:0:4365 -9111:2:1271 -9112:2:1275 -9113:2:1276 -9114:2:1284 -9115:2:1285 -9116:2:1289 -9117:2:1290 -9118:2:1284 -9119:2:1285 -9120:2:1289 -9121:2:1290 -9122:2:1298 -9123:2:1303 -9124:2:1307 -9125:2:1308 -9126:2:1315 -9127:2:1316 -9128:2:1327 -9129:2:1328 -9130:2:1329 -9131:2:1327 -9132:2:1328 -9133:2:1329 -9134:2:1340 -9135:2:1345 -9136:2:1346 -9137:0:4365 -9138:2:1358 -9139:0:4365 -9140:2:1360 -9141:0:4365 -9142:3:3657 -9143:0:4365 -9144:2:1361 -9145:0:4365 -9146:3:3658 -9147:0:4365 -9148:2:1362 -9149:2:1366 -9150:2:1367 -9151:2:1375 -9152:2:1376 -9153:2:1380 -9154:2:1381 -9155:2:1375 -9156:2:1376 -9157:2:1380 -9158:2:1381 -9159:2:1389 -9160:2:1394 -9161:2:1398 -9162:2:1399 -9163:2:1406 -9164:2:1407 -9165:2:1418 -9166:2:1419 -9167:2:1420 -9168:2:1418 -9169:2:1419 -9170:2:1420 -9171:2:1431 -9172:2:1436 -9173:2:1437 -9174:0:4365 -9175:2:1449 -9176:0:4365 -9177:3:3657 -9178:0:4365 -9179:2:1451 -9180:0:4365 -9181:3:3658 -9182:0:4365 -9183:2:1652 -9184:0:4365 -9185:2:1653 -9186:0:4365 -9187:2:1657 -9188:0:4365 -9189:2:1660 -9190:0:4365 -9191:3:3657 -9192:0:4365 -9193:2:1665 -9194:2:1669 -9195:2:1670 -9196:2:1678 -9197:2:1679 -9198:2:1683 -9199:2:1684 -9200:2:1678 -9201:2:1679 -9202:2:1680 -9203:2:1692 -9204:2:1697 -9205:2:1701 -9206:2:1702 -9207:2:1709 -9208:2:1710 -9209:2:1721 -9210:2:1722 -9211:2:1723 -9212:2:1721 -9213:2:1722 -9214:2:1723 -9215:2:1734 -9216:2:1739 -9217:2:1740 -9218:0:4365 -9219:3:3658 -9220:0:4365 -9221:2:1752 -9222:0:4365 -9223:3:3657 -9224:0:4365 -9225:2:1754 -9226:0:4365 -9227:3:3658 -9228:0:4365 -9229:2:1755 -9230:2:1759 -9231:2:1760 -9232:2:1768 -9233:2:1769 -9234:2:1773 -9235:2:1774 -9236:2:1768 -9237:2:1769 -9238:2:1773 -9239:2:1774 -9240:2:1782 -9241:2:1787 -9242:2:1791 -9243:2:1792 -9244:2:1799 -9245:2:1800 -9246:2:1811 -9247:2:1812 -9248:2:1813 -9249:2:1811 -9250:2:1812 -9251:2:1813 -9252:2:1824 -9253:2:1829 -9254:2:1830 -9255:0:4365 -9256:2:1842 -9257:0:4365 -9258:3:3657 -9259:0:4365 -9260:2:1844 -9261:0:4365 -9262:3:3658 -9263:0:4365 -9264:2:1845 -9265:2:1849 -9266:2:1850 -9267:2:1858 -9268:2:1859 -9269:2:1863 -9270:2:1864 -9271:2:1858 -9272:2:1859 -9273:2:1863 -9274:2:1864 -9275:2:1872 -9276:2:1877 -9277:2:1881 -9278:2:1882 -9279:2:1889 -9280:2:1890 -9281:2:1901 -9282:2:1902 -9283:2:1903 -9284:2:1901 -9285:2:1902 -9286:2:1903 -9287:2:1914 -9288:2:1919 -9289:2:1920 -9290:0:4365 -9291:2:1932 -9292:0:4365 -9293:3:3657 -9294:0:4365 -9295:2:1934 -9296:0:4365 -9297:3:3658 -9298:0:4365 -9299:2:1935 -9300:0:4365 -9301:2:1936 -9302:0:4365 -9303:2:2129 -9304:0:4365 -9305:2:2130 -9306:0:4365 -9307:2:2134 -9308:0:4365 -9309:3:3657 -9310:0:4365 -9311:2:2136 -9312:0:4365 -9313:3:3658 -9314:0:4365 -9315:2:2137 -9316:2:2141 -9317:2:2142 -9318:2:2150 -9319:2:2151 -9320:2:2155 -9321:2:2156 -9322:2:2150 -9323:2:2151 -9324:2:2155 -9325:2:2156 -9326:2:2164 -9327:2:2169 -9328:2:2173 -9329:2:2174 -9330:2:2181 -9331:2:2182 -9332:2:2193 -9333:2:2194 -9334:2:2195 -9335:2:2193 -9336:2:2194 -9337:2:2195 -9338:2:2206 -9339:2:2211 -9340:2:2212 -9341:0:4365 -9342:2:2224 -9343:0:4365 -9344:3:3657 -9345:0:4365 -9346:2:2226 -9347:0:4365 -9348:3:3658 -9349:0:4365 -9350:2:2230 -9351:0:4365 -9352:3:3657 -9353:0:4365 -9354:2:2235 -9355:2:2239 -9356:2:2240 -9357:2:2248 -9358:2:2249 -9359:2:2253 -9360:2:2254 -9361:2:2248 -9362:2:2249 -9363:2:2250 -9364:2:2262 -9365:2:2267 -9366:2:2271 -9367:2:2272 -9368:2:2279 -9369:2:2280 -9370:2:2291 -9371:2:2292 -9372:2:2293 -9373:2:2291 -9374:2:2292 -9375:2:2293 -9376:2:2304 -9377:2:2309 -9378:2:2310 -9379:0:4365 -9380:3:3658 -9381:0:4365 -9382:2:2322 -9383:0:4365 -9384:2:1169 -9385:0:4365 -9386:3:3657 -9387:0:4365 -9388:2:1170 -9389:0:4365 -9390:3:3658 -9391:0:4365 -9392:3:3659 -9393:0:4365 -9394:3:3665 -9395:0:4365 -9396:3:3666 -9397:0:4365 -9398:3:3667 -9399:0:4365 -9400:3:3668 -9401:0:4365 -9402:3:3669 -9403:3:3673 -9404:3:3674 -9405:3:3682 -9406:3:3683 -9407:3:3687 -9408:3:3688 -9409:3:3682 -9410:3:3683 -9411:3:3687 -9412:3:3688 -9413:3:3696 -9414:3:3701 -9415:3:3705 -9416:3:3706 -9417:3:3713 -9418:3:3714 -9419:3:3725 -9420:3:3726 -9421:3:3727 -9422:3:3725 -9423:3:3726 -9424:3:3727 -9425:3:3738 -9426:3:3743 -9427:3:3744 -9428:0:4365 -9429:3:3756 -9430:0:4365 -9431:3:3757 -9432:0:4365 -9433:2:1173 -9434:0:4365 -9435:3:3758 -9436:0:4365 -9437:2:1179 -9438:0:4365 -9439:2:1180 -9440:0:4365 -9441:3:3757 -9442:0:4365 -9443:2:1181 -9444:2:1185 -9445:2:1186 -9446:2:1194 -9447:2:1195 -9448:2:1199 -9449:2:1200 -9450:2:1194 -9451:2:1195 -9452:2:1199 -9453:2:1200 -9454:2:1208 -9455:2:1213 -9456:2:1217 -9457:2:1218 -9458:2:1225 -9459:2:1226 -9460:2:1237 -9461:2:1238 -9462:2:1239 -9463:2:1237 -9464:2:1238 -9465:2:1239 -9466:2:1250 -9467:2:1255 -9468:2:1256 -9469:0:4365 -9470:3:3758 -9471:0:4365 -9472:2:1268 -9473:0:4365 -9474:3:3757 -9475:0:4365 -9476:2:1270 -9477:0:4365 -9478:3:3758 -9479:0:4365 -9480:2:1271 -9481:2:1275 -9482:2:1276 -9483:2:1284 -9484:2:1285 -9485:2:1289 -9486:2:1290 -9487:2:1284 -9488:2:1285 -9489:2:1289 -9490:2:1290 -9491:2:1298 -9492:2:1303 -9493:2:1307 -9494:2:1308 -9495:2:1315 -9496:2:1316 -9497:2:1327 -9498:2:1328 -9499:2:1329 -9500:2:1327 -9501:2:1328 -9502:2:1329 -9503:2:1340 -9504:2:1345 -9505:2:1346 -9506:0:4365 -9507:2:1358 -9508:0:4365 -9509:2:1360 -9510:0:4365 -9511:3:3757 -9512:0:4365 -9513:2:1361 -9514:0:4365 -9515:3:3758 -9516:0:4365 -9517:2:1362 -9518:2:1366 -9519:2:1367 -9520:2:1375 -9521:2:1376 -9522:2:1380 -9523:2:1381 -9524:2:1375 -9525:2:1376 -9526:2:1380 -9527:2:1381 -9528:2:1389 -9529:2:1394 -9530:2:1398 -9531:2:1399 -9532:2:1406 -9533:2:1407 -9534:2:1418 -9535:2:1419 -9536:2:1420 -9537:2:1418 -9538:2:1419 -9539:2:1420 -9540:2:1431 -9541:2:1436 -9542:2:1437 -9543:0:4365 -9544:2:1449 -9545:0:4365 -9546:3:3757 -9547:0:4365 -9548:2:1451 -9549:0:4365 -9550:3:3758 -9551:0:4365 -9552:2:1652 -9553:0:4365 -9554:2:1653 -9555:0:4365 -9556:2:1657 -9557:0:4365 -9558:2:1660 -9559:0:4365 -9560:3:3757 -9561:0:4365 -9562:2:1665 -9563:2:1669 -9564:2:1670 -9565:2:1678 -9566:2:1679 -9567:2:1683 -9568:2:1684 -9569:2:1678 -9570:2:1679 -9571:2:1680 -9572:2:1692 -9573:2:1697 -9574:2:1701 -9575:2:1702 -9576:2:1709 -9577:2:1710 -9578:2:1721 -9579:2:1722 -9580:2:1723 -9581:2:1721 -9582:2:1722 -9583:2:1723 -9584:2:1734 -9585:2:1739 -9586:2:1740 -9587:0:4365 -9588:3:3758 -9589:0:4365 -9590:2:1752 -9591:0:4365 -9592:3:3757 -9593:0:4365 -9594:2:1754 -9595:0:4365 -9596:3:3758 -9597:0:4365 -9598:2:1755 -9599:2:1759 -9600:2:1760 -9601:2:1768 -9602:2:1769 -9603:2:1773 -9604:2:1774 -9605:2:1768 -9606:2:1769 -9607:2:1773 -9608:2:1774 -9609:2:1782 -9610:2:1787 -9611:2:1791 -9612:2:1792 -9613:2:1799 -9614:2:1800 -9615:2:1811 -9616:2:1812 -9617:2:1813 -9618:2:1811 -9619:2:1812 -9620:2:1813 -9621:2:1824 -9622:2:1829 -9623:2:1830 -9624:0:4365 -9625:2:1842 -9626:0:4365 -9627:3:3757 -9628:0:4365 -9629:2:1844 -9630:0:4365 -9631:3:3758 -9632:0:4365 -9633:2:1845 -9634:2:1849 -9635:2:1850 -9636:2:1858 -9637:2:1859 -9638:2:1863 -9639:2:1864 -9640:2:1858 -9641:2:1859 -9642:2:1863 -9643:2:1864 -9644:2:1872 -9645:2:1877 -9646:2:1881 -9647:2:1882 -9648:2:1889 -9649:2:1890 -9650:2:1901 -9651:2:1902 -9652:2:1903 -9653:2:1901 -9654:2:1902 -9655:2:1903 -9656:2:1914 -9657:2:1919 -9658:2:1920 -9659:0:4365 -9660:2:1932 -9661:0:4365 -9662:3:3757 -9663:0:4365 -9664:2:1934 -9665:0:4365 -9666:3:3758 -9667:0:4365 -9668:2:1935 -9669:0:4365 -9670:2:1936 -9671:0:4365 -9672:2:2129 -9673:0:4365 -9674:2:2130 -9675:0:4365 -9676:2:2134 -9677:0:4365 -9678:3:3757 -9679:0:4365 -9680:2:2136 -9681:0:4365 -9682:3:3758 -9683:0:4365 -9684:2:2137 -9685:2:2141 -9686:2:2142 -9687:2:2150 -9688:2:2151 -9689:2:2155 -9690:2:2156 -9691:2:2150 -9692:2:2151 -9693:2:2155 -9694:2:2156 -9695:2:2164 -9696:2:2169 -9697:2:2173 -9698:2:2174 -9699:2:2181 -9700:2:2182 -9701:2:2193 -9702:2:2194 -9703:2:2195 -9704:2:2193 -9705:2:2194 -9706:2:2195 -9707:2:2206 -9708:2:2211 -9709:2:2212 -9710:0:4365 -9711:2:2224 -9712:0:4365 -9713:3:3757 -9714:0:4365 -9715:2:2226 -9716:0:4365 -9717:3:3758 -9718:0:4365 -9719:2:2230 -9720:0:4365 -9721:3:3757 -9722:0:4365 -9723:2:2235 -9724:2:2239 -9725:2:2240 -9726:2:2248 -9727:2:2249 -9728:2:2253 -9729:2:2254 -9730:2:2248 -9731:2:2249 -9732:2:2250 -9733:2:2262 -9734:2:2267 -9735:2:2271 -9736:2:2272 -9737:2:2279 -9738:2:2280 -9739:2:2291 -9740:2:2292 -9741:2:2293 -9742:2:2291 -9743:2:2292 -9744:2:2293 -9745:2:2304 -9746:2:2309 -9747:2:2310 -9748:0:4365 -9749:3:3758 -9750:0:4365 -9751:2:2322 -9752:0:4365 -9753:2:1169 -9754:0:4365 -9755:3:3757 -9756:0:4365 -9757:2:1170 -9758:0:4365 -9759:3:3758 -9760:0:4365 -9761:3:3759 -9762:0:4365 -9763:3:3972 -9764:0:4365 -9765:3:3980 -9766:0:4365 -9767:3:3981 -9768:3:3985 -9769:3:3986 -9770:3:3994 -9771:3:3995 -9772:3:3999 -9773:3:4000 -9774:3:3994 -9775:3:3995 -9776:3:3999 -9777:3:4000 -9778:3:4008 -9779:3:4013 -9780:3:4017 -9781:3:4018 -9782:3:4025 -9783:3:4026 -9784:3:4037 -9785:3:4038 -9786:3:4039 -9787:3:4037 -9788:3:4038 -9789:3:4039 -9790:3:4050 -9791:3:4055 -9792:3:4056 -9793:0:4365 -9794:3:4068 -9795:0:4365 -9796:3:4069 -9797:0:4365 -9798:2:1173 -9799:0:4365 -9800:3:4070 -9801:0:4365 -9802:2:1179 -9803:0:4365 -9804:2:1180 -9805:0:4365 -9806:3:4069 -9807:0:4365 -9808:2:1181 -9809:2:1185 -9810:2:1186 -9811:2:1194 -9812:2:1195 -9813:2:1199 -9814:2:1200 -9815:2:1194 -9816:2:1195 -9817:2:1199 -9818:2:1200 -9819:2:1208 -9820:2:1213 -9821:2:1217 -9822:2:1218 -9823:2:1225 -9824:2:1226 -9825:2:1237 -9826:2:1238 -9827:2:1239 -9828:2:1237 -9829:2:1238 -9830:2:1239 -9831:2:1250 -9832:2:1255 -9833:2:1256 -9834:0:4365 -9835:3:4070 -9836:0:4365 -9837:2:1268 -9838:0:4365 -9839:3:4069 -9840:0:4365 -9841:2:1270 -9842:0:4365 -9843:3:4070 -9844:0:4365 -9845:2:1271 -9846:2:1275 -9847:2:1276 -9848:2:1284 -9849:2:1285 -9850:2:1289 -9851:2:1290 -9852:2:1284 -9853:2:1285 -9854:2:1289 -9855:2:1290 -9856:2:1298 -9857:2:1303 -9858:2:1307 -9859:2:1308 -9860:2:1315 -9861:2:1316 -9862:2:1327 -9863:2:1328 -9864:2:1329 -9865:2:1327 -9866:2:1328 -9867:2:1329 -9868:2:1340 -9869:2:1345 -9870:2:1346 -9871:0:4365 -9872:2:1358 -9873:0:4365 -9874:2:1360 -9875:0:4365 -9876:3:4069 -9877:0:4365 -9878:2:1361 -9879:0:4365 -9880:3:4070 -9881:0:4365 -9882:2:1362 -9883:2:1366 -9884:2:1367 -9885:2:1375 -9886:2:1376 -9887:2:1380 -9888:2:1381 -9889:2:1375 -9890:2:1376 -9891:2:1380 -9892:2:1381 -9893:2:1389 -9894:2:1394 -9895:2:1398 -9896:2:1399 -9897:2:1406 -9898:2:1407 -9899:2:1418 -9900:2:1419 -9901:2:1420 -9902:2:1418 -9903:2:1419 -9904:2:1420 -9905:2:1431 -9906:2:1436 -9907:2:1437 -9908:0:4365 -9909:2:1449 -9910:0:4365 -9911:3:4069 -9912:0:4365 -9913:2:1451 -9914:0:4365 -9915:3:4070 -9916:0:4365 -9917:2:1652 -9918:0:4365 -9919:2:1653 -9920:0:4365 -9921:2:1657 -9922:0:4365 -9923:2:1660 -9924:0:4365 -9925:3:4069 -9926:0:4365 -9927:2:1665 -9928:2:1669 -9929:2:1670 -9930:2:1678 -9931:2:1679 -9932:2:1683 -9933:2:1684 -9934:2:1678 -9935:2:1679 -9936:2:1680 -9937:2:1692 -9938:2:1697 -9939:2:1701 -9940:2:1702 -9941:2:1709 -9942:2:1710 -9943:2:1721 -9944:2:1722 -9945:2:1723 -9946:2:1721 -9947:2:1722 -9948:2:1723 -9949:2:1734 -9950:2:1739 -9951:2:1740 -9952:0:4365 -9953:3:4070 -9954:0:4365 -9955:2:1752 -9956:0:4365 -9957:3:4069 -9958:0:4365 -9959:2:1754 -9960:0:4365 -9961:3:4070 -9962:0:4365 -9963:2:1755 -9964:2:1759 -9965:2:1760 -9966:2:1768 -9967:2:1769 -9968:2:1773 -9969:2:1774 -9970:2:1768 -9971:2:1769 -9972:2:1773 -9973:2:1774 -9974:2:1782 -9975:2:1787 -9976:2:1791 -9977:2:1792 -9978:2:1799 -9979:2:1800 -9980:2:1811 -9981:2:1812 -9982:2:1813 -9983:2:1811 -9984:2:1812 -9985:2:1813 -9986:2:1824 -9987:2:1829 -9988:2:1830 -9989:0:4365 -9990:2:1842 -9991:0:4365 -9992:3:4069 -9993:0:4365 -9994:2:1844 -9995:0:4365 -9996:3:4070 -9997:0:4365 -9998:2:1845 -9999:2:1849 -10000:2:1850 -10001:2:1858 -10002:2:1859 -10003:2:1863 -10004:2:1864 -10005:2:1858 -10006:2:1859 -10007:2:1863 -10008:2:1864 -10009:2:1872 -10010:2:1877 -10011:2:1881 -10012:2:1882 -10013:2:1889 -10014:2:1890 -10015:2:1901 -10016:2:1902 -10017:2:1903 -10018:2:1901 -10019:2:1902 -10020:2:1903 -10021:2:1914 -10022:2:1919 -10023:2:1920 -10024:0:4365 -10025:2:1932 -10026:0:4365 -10027:3:4069 -10028:0:4365 -10029:2:1934 -10030:0:4365 -10031:3:4070 -10032:0:4365 -10033:2:1935 -10034:0:4365 -10035:2:1936 -10036:0:4365 -10037:2:2129 -10038:0:4365 -10039:2:2130 -10040:0:4365 -10041:2:2134 -10042:0:4365 -10043:3:4069 -10044:0:4365 -10045:2:2136 -10046:0:4365 -10047:3:4070 -10048:0:4365 -10049:2:2137 -10050:2:2141 -10051:2:2142 -10052:2:2150 -10053:2:2151 -10054:2:2155 -10055:2:2156 -10056:2:2150 -10057:2:2151 -10058:2:2155 -10059:2:2156 -10060:2:2164 -10061:2:2169 -10062:2:2173 -10063:2:2174 -10064:2:2181 -10065:2:2182 -10066:2:2193 -10067:2:2194 -10068:2:2195 -10069:2:2193 -10070:2:2194 -10071:2:2195 -10072:2:2206 -10073:2:2211 -10074:2:2212 -10075:0:4365 -10076:2:2224 -10077:0:4365 -10078:3:4069 -10079:0:4365 -10080:2:2226 -10081:0:4365 -10082:3:4070 -10083:0:4365 -10084:2:2230 -10085:0:4365 -10086:3:4069 -10087:0:4365 -10088:2:2235 -10089:2:2239 -10090:2:2240 -10091:2:2248 -10092:2:2249 -10093:2:2253 -10094:2:2254 -10095:2:2248 -10096:2:2249 -10097:2:2250 -10098:2:2262 -10099:2:2267 -10100:2:2271 -10101:2:2272 -10102:2:2279 -10103:2:2280 -10104:2:2291 -10105:2:2292 -10106:2:2293 -10107:2:2291 -10108:2:2292 -10109:2:2293 -10110:2:2304 -10111:2:2309 -10112:2:2310 -10113:0:4365 -10114:3:4070 -10115:0:4365 -10116:2:2322 -10117:0:4365 -10118:2:1169 -10119:0:4365 -10120:3:4069 -10121:0:4365 -10122:2:1170 -10123:0:4365 -10124:3:4070 -10125:0:4365 -10126:3:4071 -10127:0:4365 -10128:3:4081 -10129:0:4365 -10130:3:3666 -10131:0:4365 -10132:3:3667 -10133:0:4365 -10134:3:3668 -10135:0:4365 -10136:3:3669 -10137:3:3673 -10138:3:3674 -10139:3:3682 -10140:3:3683 -10141:3:3687 -10142:3:3688 -10143:3:3682 -10144:3:3683 -10145:3:3687 -10146:3:3688 -10147:3:3696 -10148:3:3701 -10149:3:3705 -10150:3:3706 -10151:3:3713 -10152:3:3714 -10153:3:3725 -10154:3:3726 -10155:3:3727 -10156:3:3725 -10157:3:3726 -10158:3:3727 -10159:3:3738 -10160:3:3743 -10161:3:3744 -10162:0:4365 -10163:3:3756 -10164:0:4365 -10165:3:3757 -10166:0:4365 -10167:2:1173 -10168:0:4365 -10169:3:3758 -10170:0:4365 -10171:2:1179 -10172:0:4365 -10173:2:1180 -10174:0:4365 -10175:3:3757 -10176:0:4365 -10177:2:1181 -10178:2:1185 -10179:2:1186 -10180:2:1194 -10181:2:1195 -10182:2:1199 -10183:2:1200 -10184:2:1194 -10185:2:1195 -10186:2:1199 -10187:2:1200 -10188:2:1208 -10189:2:1213 -10190:2:1217 -10191:2:1218 -10192:2:1225 -10193:2:1226 -10194:2:1237 -10195:2:1238 -10196:2:1239 -10197:2:1237 -10198:2:1238 -10199:2:1239 -10200:2:1250 -10201:2:1255 -10202:2:1256 -10203:0:4365 -10204:3:3758 -10205:0:4365 -10206:2:1268 -10207:0:4365 -10208:3:3757 -10209:0:4365 -10210:2:1270 -10211:0:4365 -10212:3:3758 -10213:0:4365 -10214:2:1271 -10215:2:1275 -10216:2:1276 -10217:2:1284 -10218:2:1285 -10219:2:1289 -10220:2:1290 -10221:2:1284 -10222:2:1285 -10223:2:1289 -10224:2:1290 -10225:2:1298 -10226:2:1303 -10227:2:1307 -10228:2:1308 -10229:2:1315 -10230:2:1316 -10231:2:1327 -10232:2:1328 -10233:2:1329 -10234:2:1327 -10235:2:1328 -10236:2:1329 -10237:2:1340 -10238:2:1345 -10239:2:1346 -10240:0:4365 -10241:2:1358 -10242:0:4365 -10243:2:1360 -10244:0:4365 -10245:3:3757 -10246:0:4365 -10247:2:1361 -10248:0:4365 -10249:3:3758 -10250:0:4365 -10251:2:1362 -10252:2:1366 -10253:2:1367 -10254:2:1375 -10255:2:1376 -10256:2:1380 -10257:2:1381 -10258:2:1375 -10259:2:1376 -10260:2:1380 -10261:2:1381 -10262:2:1389 -10263:2:1394 -10264:2:1398 -10265:2:1399 -10266:2:1406 -10267:2:1407 -10268:2:1418 -10269:2:1419 -10270:2:1420 -10271:2:1418 -10272:2:1419 -10273:2:1420 -10274:2:1431 -10275:2:1436 -10276:2:1437 -10277:0:4365 -10278:2:1449 -10279:0:4365 -10280:3:3757 -10281:0:4365 -10282:2:1451 -10283:0:4365 -10284:3:3758 -10285:0:4365 -10286:2:1652 -10287:0:4365 -10288:2:1653 -10289:0:4365 -10290:2:1657 -10291:0:4365 -10292:2:1660 -10293:0:4365 -10294:3:3757 -10295:0:4365 -10296:2:1665 -10297:2:1669 -10298:2:1670 -10299:2:1678 -10300:2:1679 -10301:2:1683 -10302:2:1684 -10303:2:1678 -10304:2:1679 -10305:2:1680 -10306:2:1692 -10307:2:1697 -10308:2:1701 -10309:2:1702 -10310:2:1709 -10311:2:1710 -10312:2:1721 -10313:2:1722 -10314:2:1723 -10315:2:1721 -10316:2:1722 -10317:2:1723 -10318:2:1734 -10319:2:1739 -10320:2:1740 -10321:0:4365 -10322:3:3758 -10323:0:4365 -10324:2:1752 -10325:0:4365 -10326:3:3757 -10327:0:4365 -10328:2:1754 -10329:0:4365 -10330:3:3758 -10331:0:4365 -10332:2:1755 -10333:2:1759 -10334:2:1760 -10335:2:1768 -10336:2:1769 -10337:2:1773 -10338:2:1774 -10339:2:1768 -10340:2:1769 -10341:2:1773 -10342:2:1774 -10343:2:1782 -10344:2:1787 -10345:2:1791 -10346:2:1792 -10347:2:1799 -10348:2:1800 -10349:2:1811 -10350:2:1812 -10351:2:1813 -10352:2:1811 -10353:2:1812 -10354:2:1813 -10355:2:1824 -10356:2:1829 -10357:2:1830 -10358:0:4365 -10359:2:1842 -10360:0:4365 -10361:3:3757 -10362:0:4365 -10363:2:1844 -10364:0:4365 -10365:3:3758 -10366:0:4365 -10367:2:1845 -10368:2:1849 -10369:2:1850 -10370:2:1858 -10371:2:1859 -10372:2:1863 -10373:2:1864 -10374:2:1858 -10375:2:1859 -10376:2:1863 -10377:2:1864 -10378:2:1872 -10379:2:1877 -10380:2:1881 -10381:2:1882 -10382:2:1889 -10383:2:1890 -10384:2:1901 -10385:2:1902 -10386:2:1903 -10387:2:1901 -10388:2:1902 -10389:2:1903 -10390:2:1914 -10391:2:1919 -10392:2:1920 -10393:0:4365 -10394:2:1932 -10395:0:4365 -10396:3:3757 -10397:0:4365 -10398:2:1934 -10399:0:4365 -10400:3:3758 -10401:0:4365 -10402:2:1935 -10403:0:4365 -10404:2:1936 -10405:0:4365 -10406:2:2129 -10407:0:4365 -10408:2:2130 -10409:0:4365 -10410:2:2134 -10411:0:4365 -10412:3:3757 -10413:0:4365 -10414:2:2136 -10415:0:4365 -10416:3:3758 -10417:0:4365 -10418:2:2137 -10419:2:2141 -10420:2:2142 -10421:2:2150 -10422:2:2151 -10423:2:2155 -10424:2:2156 -10425:2:2150 -10426:2:2151 -10427:2:2155 -10428:2:2156 -10429:2:2164 -10430:2:2169 -10431:2:2173 -10432:2:2174 -10433:2:2181 -10434:2:2182 -10435:2:2193 -10436:2:2194 -10437:2:2195 -10438:2:2193 -10439:2:2194 -10440:2:2195 -10441:2:2206 -10442:2:2211 -10443:2:2212 -10444:0:4365 -10445:2:2224 -10446:0:4365 -10447:3:3757 -10448:0:4365 -10449:2:2226 -10450:0:4365 -10451:3:3758 -10452:0:4365 -10453:2:2230 -10454:0:4365 -10455:3:3757 -10456:0:4365 -10457:2:2235 -10458:2:2239 -10459:2:2240 -10460:2:2248 -10461:2:2249 -10462:2:2253 -10463:2:2254 -10464:2:2248 -10465:2:2249 -10466:2:2250 -10467:2:2262 -10468:2:2267 -10469:2:2271 -10470:2:2272 -10471:2:2279 -10472:2:2280 -10473:2:2291 -10474:2:2292 -10475:2:2293 -10476:2:2291 -10477:2:2292 -10478:2:2293 -10479:2:2304 -10480:2:2309 -10481:2:2310 -10482:0:4365 -10483:3:3758 -10484:0:4365 -10485:2:2322 -10486:0:4365 -10487:2:1169 -10488:0:4365 -10489:3:3757 -10490:0:4365 -10491:2:1170 -10492:0:4365 -10493:3:3758 -10494:0:4365 -10495:3:3759 -10496:0:4365 -10497:3:3972 -10498:0:4365 -10499:3:4077 -10500:0:4365 -10501:3:4078 -10502:0:4365 -10503:3:4082 -10504:0:4365 -10505:3:4088 -10506:0:4365 -10507:3:4092 -10508:3:4093 -10509:3:4097 -10510:3:4101 -10511:3:4102 -10512:3:4097 -10513:3:4101 -10514:3:4102 -10515:3:4106 -10516:3:4114 -10517:3:4115 -10518:3:4120 -10519:3:4127 -10520:3:4128 -10521:3:4127 -10522:3:4128 -10523:3:4135 -10524:3:4140 -10525:0:4365 -10526:3:4151 -10527:0:4365 -10528:3:4155 -10529:3:4156 -10530:3:4160 -10531:3:4164 -10532:3:4165 -10533:3:4160 -10534:3:4164 -10535:3:4165 -10536:3:4169 -10537:3:4177 -10538:3:4178 -10539:3:4183 -10540:3:4190 -10541:3:4191 -10542:3:4190 -10543:3:4191 -10544:3:4198 -10545:3:4203 -10546:0:4365 -10547:3:4151 -10548:0:4365 -10549:3:4155 -10550:3:4156 -10551:3:4160 -10552:3:4164 -10553:3:4165 -10554:3:4160 -10555:3:4164 -10556:3:4165 -10557:3:4169 -10558:3:4177 -10559:3:4178 -10560:3:4183 -10561:3:4190 -10562:3:4191 -10563:3:4190 -10564:3:4191 -10565:3:4198 -10566:3:4203 -10567:0:4365 -10568:3:4214 -10569:0:4365 -10570:3:4222 -10571:3:4223 -10572:3:4227 -10573:3:4231 -10574:3:4232 -10575:3:4227 -10576:3:4231 -10577:3:4232 -10578:3:4236 -10579:3:4244 -10580:3:4245 -10581:3:4250 -10582:3:4257 -10583:3:4258 -10584:3:4257 -10585:3:4258 -10586:3:4265 -10587:3:4270 -10588:0:4365 -10589:3:4285 -10590:0:4365 -10591:3:4286 -10592:0:4365 -10593:2:1173 -10594:0:4365 -10595:3:4287 -10596:0:4365 -10597:2:1179 -10598:0:4365 -10599:2:1180 -10600:0:4365 -10601:3:4286 -10602:0:4365 -10603:2:1181 -10604:2:1185 -10605:2:1186 -10606:2:1194 -10607:2:1195 -10608:2:1199 -10609:2:1200 -10610:2:1194 -10611:2:1195 -10612:2:1199 -10613:2:1200 -10614:2:1208 -10615:2:1213 -10616:2:1217 -10617:2:1218 -10618:2:1225 -10619:2:1226 -10620:2:1237 -10621:2:1238 -10622:2:1239 -10623:2:1237 -10624:2:1238 -10625:2:1239 -10626:2:1250 -10627:2:1255 -10628:2:1256 -10629:0:4365 -10630:3:4287 -10631:0:4365 -10632:2:1268 -10633:0:4365 -10634:3:4286 -10635:0:4365 -10636:2:1270 -10637:0:4365 -10638:3:4287 -10639:0:4365 -10640:2:1271 -10641:2:1275 -10642:2:1276 -10643:2:1284 -10644:2:1285 -10645:2:1289 -10646:2:1290 -10647:2:1284 -10648:2:1285 -10649:2:1289 -10650:2:1290 -10651:2:1298 -10652:2:1303 -10653:2:1307 -10654:2:1308 -10655:2:1315 -10656:2:1316 -10657:2:1327 -10658:2:1328 -10659:2:1329 -10660:2:1327 -10661:2:1328 -10662:2:1329 -10663:2:1340 -10664:2:1345 -10665:2:1346 -10666:0:4365 -10667:2:1358 -10668:0:4365 -10669:2:1360 -10670:0:4365 -10671:3:4286 -10672:0:4365 -10673:2:1361 -10674:0:4365 -10675:3:4287 -10676:0:4365 -10677:2:1362 -10678:2:1366 -10679:2:1367 -10680:2:1375 -10681:2:1376 -10682:2:1380 -10683:2:1381 -10684:2:1375 -10685:2:1376 -10686:2:1380 -10687:2:1381 -10688:2:1389 -10689:2:1394 -10690:2:1398 -10691:2:1399 -10692:2:1406 -10693:2:1407 -10694:2:1418 -10695:2:1419 -10696:2:1420 -10697:2:1418 -10698:2:1419 -10699:2:1420 -10700:2:1431 -10701:2:1436 -10702:2:1437 -10703:0:4365 -10704:2:1449 -10705:0:4365 -10706:3:4286 -10707:0:4365 -10708:2:1451 -10709:0:4365 -10710:3:4287 -10711:0:4365 -10712:2:1652 -10713:0:4365 -10714:2:1653 -10715:0:4365 -10716:2:1657 -10717:0:4365 -10718:2:1660 -10719:0:4365 -10720:3:4286 -10721:0:4365 -10722:2:1665 -10723:2:1669 -10724:2:1670 -10725:2:1678 -10726:2:1679 -10727:2:1683 -10728:2:1684 -10729:2:1678 -10730:2:1679 -10731:2:1680 -10732:2:1692 -10733:2:1697 -10734:2:1701 -10735:2:1702 -10736:2:1709 -10737:2:1710 -10738:2:1721 -10739:2:1722 -10740:2:1723 -10741:2:1721 -10742:2:1722 -10743:2:1723 -10744:2:1734 -10745:2:1739 -10746:2:1740 -10747:0:4365 -10748:3:4287 -10749:0:4365 -10750:2:1752 -10751:0:4365 -10752:3:4286 -10753:0:4365 -10754:2:1754 -10755:0:4365 -10756:3:4287 -10757:0:4365 -10758:2:1755 -10759:2:1759 -10760:2:1760 -10761:2:1768 -10762:2:1769 -10763:2:1773 -10764:2:1774 -10765:2:1768 -10766:2:1769 -10767:2:1773 -10768:2:1774 -10769:2:1782 -10770:2:1787 -10771:2:1791 -10772:2:1792 -10773:2:1799 -10774:2:1800 -10775:2:1811 -10776:2:1812 -10777:2:1813 -10778:2:1811 -10779:2:1812 -10780:2:1813 -10781:2:1824 -10782:2:1829 -10783:2:1830 -10784:0:4365 -10785:2:1842 -10786:0:4365 -10787:3:4286 -10788:0:4365 -10789:2:1844 -10790:0:4365 -10791:3:4287 -10792:0:4365 -10793:2:1845 -10794:2:1849 -10795:2:1850 -10796:2:1858 -10797:2:1859 -10798:2:1863 -10799:2:1864 -10800:2:1858 -10801:2:1859 -10802:2:1863 -10803:2:1864 -10804:2:1872 -10805:2:1877 -10806:2:1881 -10807:2:1882 -10808:2:1889 -10809:2:1890 -10810:2:1901 -10811:2:1902 -10812:2:1903 -10813:2:1901 -10814:2:1902 -10815:2:1903 -10816:2:1914 -10817:2:1919 -10818:2:1920 -10819:0:4365 -10820:2:1932 -10821:0:4365 -10822:3:4286 -10823:0:4365 -10824:2:1934 -10825:0:4365 -10826:3:4287 -10827:0:4365 -10828:2:1935 -10829:0:4365 -10830:2:1936 -10831:0:4365 -10832:2:2129 -10833:0:4365 -10834:2:2130 -10835:0:4365 -10836:2:2134 -10837:0:4365 -10838:3:4286 -10839:0:4365 -10840:2:2136 -10841:0:4365 -10842:3:4287 -10843:0:4365 -10844:2:2137 -10845:2:2141 -10846:2:2142 -10847:2:2150 -10848:2:2151 -10849:2:2155 -10850:2:2156 -10851:2:2150 -10852:2:2151 -10853:2:2155 -10854:2:2156 -10855:2:2164 -10856:2:2169 -10857:2:2173 -10858:2:2174 -10859:2:2181 -10860:2:2182 -10861:2:2193 -10862:2:2194 -10863:2:2195 -10864:2:2193 -10865:2:2194 -10866:2:2195 -10867:2:2206 -10868:2:2211 -10869:2:2212 -10870:0:4365 -10871:2:2224 -10872:0:4365 -10873:3:4286 -10874:0:4365 -10875:2:2226 -10876:0:4365 -10877:3:4287 -10878:0:4365 -10879:2:2230 -10880:0:4365 -10881:3:4286 -10882:0:4365 -10883:2:2235 -10884:2:2239 -10885:2:2240 -10886:2:2248 -10887:2:2249 -10888:2:2253 -10889:2:2254 -10890:2:2248 -10891:2:2249 -10892:2:2250 -10893:2:2262 -10894:2:2267 -10895:2:2271 -10896:2:2272 -10897:2:2279 -10898:2:2280 -10899:2:2291 -10900:2:2292 -10901:2:2293 -10902:2:2291 -10903:2:2292 -10904:2:2293 -10905:2:2304 -10906:2:2309 -10907:2:2310 -10908:0:4365 -10909:3:4287 -10910:0:4365 -10911:2:2322 -10912:0:4365 -10913:2:1169 -10914:0:4365 -10915:3:4286 -10916:0:4365 -10917:2:1170 -10918:0:4365 -10919:3:4287 -10920:0:4365 -10921:3:4288 -10922:0:4365 -10923:3:4294 -10924:0:4365 -10925:3:4295 -10926:0:4365 -10927:3:2338 -10928:0:4365 -10929:3:2339 -10930:3:2343 -10931:3:2344 -10932:3:2352 -10933:3:2353 -10934:3:2357 -10935:3:2358 -10936:3:2352 -10937:3:2353 -10938:3:2357 -10939:3:2358 -10940:3:2366 -10941:3:2371 -10942:3:2375 -10943:3:2376 -10944:3:2383 -10945:3:2384 -10946:3:2395 -10947:3:2396 -10948:3:2397 -10949:3:2395 -10950:3:2396 -10951:3:2397 -10952:3:2408 -10953:3:2413 -10954:3:2414 -10955:0:4365 -10956:3:2426 -10957:0:4365 -10958:3:2427 -10959:0:4365 -10960:2:1173 -10961:0:4365 -10962:3:2428 -10963:0:4365 -10964:2:1179 -10965:0:4365 -10966:2:1180 -10967:0:4365 -10968:3:2427 -10969:0:4365 -10970:2:1181 -10971:2:1185 -10972:2:1186 -10973:2:1194 -10974:2:1195 -10975:2:1199 -10976:2:1200 -10977:2:1194 -10978:2:1195 -10979:2:1199 -10980:2:1200 -10981:2:1208 -10982:2:1213 -10983:2:1217 -10984:2:1218 -10985:2:1225 -10986:2:1226 -10987:2:1237 -10988:2:1238 -10989:2:1239 -10990:2:1237 -10991:2:1238 -10992:2:1239 -10993:2:1250 -10994:2:1255 -10995:2:1256 -10996:0:4365 -10997:3:2428 -10998:0:4365 -10999:2:1268 -11000:0:4365 -11001:3:2427 -11002:0:4365 -11003:2:1270 -11004:0:4365 -11005:3:2428 -11006:0:4365 -11007:2:1271 -11008:2:1275 -11009:2:1276 -11010:2:1284 -11011:2:1285 -11012:2:1289 -11013:2:1290 -11014:2:1284 -11015:2:1285 -11016:2:1289 -11017:2:1290 -11018:2:1298 -11019:2:1303 -11020:2:1307 -11021:2:1308 -11022:2:1315 -11023:2:1316 -11024:2:1327 -11025:2:1328 -11026:2:1329 -11027:2:1327 -11028:2:1328 -11029:2:1329 -11030:2:1340 -11031:2:1345 -11032:2:1346 -11033:0:4365 -11034:2:1358 -11035:0:4365 -11036:2:1360 -11037:0:4365 -11038:3:2427 -11039:0:4365 -11040:2:1361 -11041:0:4365 -11042:3:2428 -11043:0:4365 -11044:2:1362 -11045:2:1366 -11046:2:1367 -11047:2:1375 -11048:2:1376 -11049:2:1380 -11050:2:1381 -11051:2:1375 -11052:2:1376 -11053:2:1380 -11054:2:1381 -11055:2:1389 -11056:2:1394 -11057:2:1398 -11058:2:1399 -11059:2:1406 -11060:2:1407 -11061:2:1418 -11062:2:1419 -11063:2:1420 -11064:2:1418 -11065:2:1419 -11066:2:1420 -11067:2:1431 -11068:2:1436 -11069:2:1437 -11070:0:4365 -11071:2:1449 -11072:0:4365 -11073:3:2427 -11074:0:4365 -11075:2:1451 -11076:0:4365 -11077:3:2428 -11078:0:4365 -11079:2:1652 -11080:0:4365 -11081:2:1653 -11082:0:4365 -11083:2:1657 -11084:0:4365 -11085:2:1660 -11086:0:4365 -11087:3:2427 -11088:0:4365 -11089:2:1665 -11090:2:1669 -11091:2:1670 -11092:2:1678 -11093:2:1679 -11094:2:1683 -11095:2:1684 -11096:2:1678 -11097:2:1679 -11098:2:1680 -11099:2:1692 -11100:2:1697 -11101:2:1701 -11102:2:1702 -11103:2:1709 -11104:2:1710 -11105:2:1721 -11106:2:1722 -11107:2:1723 -11108:2:1721 -11109:2:1722 -11110:2:1723 -11111:2:1734 -11112:2:1739 -11113:2:1740 -11114:0:4365 -11115:3:2428 -11116:0:4365 -11117:2:1752 -11118:0:4365 -11119:3:2427 -11120:0:4365 -11121:2:1754 -11122:0:4365 -11123:3:2428 -11124:0:4365 -11125:2:1755 -11126:2:1759 -11127:2:1760 -11128:2:1768 -11129:2:1769 -11130:2:1773 -11131:2:1774 -11132:2:1768 -11133:2:1769 -11134:2:1773 -11135:2:1774 -11136:2:1782 -11137:2:1787 -11138:2:1791 -11139:2:1792 -11140:2:1799 -11141:2:1800 -11142:2:1811 -11143:2:1812 -11144:2:1813 -11145:2:1811 -11146:2:1812 -11147:2:1813 -11148:2:1824 -11149:2:1829 -11150:2:1830 -11151:0:4365 -11152:2:1842 -11153:0:4365 -11154:3:2427 -11155:0:4365 -11156:2:1844 -11157:0:4363 -11158:3:2428 -11159:0:4369 diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_mb.define b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_mb.define deleted file mode 100644 index 136ef67..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_mb.define +++ /dev/null @@ -1,2 +0,0 @@ -#define NO_RMB -#define NO_WMB diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_mb.log b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_mb.log deleted file mode 100644 index 3afaead..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_mb.log +++ /dev/null @@ -1,303 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_mb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 745) -Depth= 6009 States= 1e+06 Transitions= 1.08e+07 Memory= 534.904 t= 9.22 R= 1e+05 -Depth= 6009 States= 2e+06 Transitions= 3.4e+07 Memory= 603.557 t= 31.1 R= 6e+04 -Depth= 7527 States= 3e+06 Transitions= 4.91e+07 Memory= 672.209 t= 45.6 R= 7e+04 -pan: resizing hashtable to -w22.. done -Depth= 68651 States= 4e+06 Transitions= 6.74e+07 Memory= 772.080 t= 62.9 R= 6e+04 -Depth= 68651 States= 5e+06 Transitions= 8.62e+07 Memory= 840.733 t= 80.2 R= 6e+04 -Depth= 68651 States= 6e+06 Transitions= 1.03e+08 Memory= 909.385 t= 95.7 R= 6e+04 -Depth= 68651 States= 7e+06 Transitions= 1.21e+08 Memory= 978.037 t= 112 R= 6e+04 -Depth= 68651 States= 8e+06 Transitions= 1.37e+08 Memory= 1046.690 t= 128 R= 6e+04 -Depth= 68651 States= 9e+06 Transitions= 1.52e+08 Memory= 1115.440 t= 143 R= 6e+04 -pan: resizing hashtable to -w24.. done -Depth= 68651 States= 1e+07 Transitions= 1.72e+08 Memory= 1308.186 t= 163 R= 6e+04 -Depth= 68651 States= 1.1e+07 Transitions= 1.89e+08 Memory= 1376.838 t= 178 R= 6e+04 -Depth= 68651 States= 1.2e+07 Transitions= 2.05e+08 Memory= 1445.490 t= 193 R= 6e+04 -Depth= 68651 States= 1.3e+07 Transitions= 2.22e+08 Memory= 1514.143 t= 208 R= 6e+04 -Depth= 68651 States= 1.4e+07 Transitions= 2.39e+08 Memory= 1582.893 t= 224 R= 6e+04 -pan: claim violated! (at depth 2141) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 68651, errors: 1 - 14155711 states, stored -2.2815817e+08 states, matched -2.4231388e+08 transitions (= stored+matched) -8.5461256e+08 atomic steps -hash conflicts: 1.1483359e+08 (resolved) - -Stats on memory usage (in Megabytes): - 1565.993 equivalent memory usage for states (stored*(State-vector + overhead)) - 1008.042 actual memory usage for states (compression: 64.37%) - state-vector as stored = 47 byte + 28 byte overhead - 128.000 memory used for hash table (-w24) - 457.764 memory used for DFS stack (-m10000000) - 1593.537 total actual memory usage - -unreached in proctype urcu_reader - line 400, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 61, "(1)" - line 419, "pan.___", state 91, "(1)" - line 400, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 158, "(1)" - line 419, "pan.___", state 188, "(1)" - line 400, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 227, "(1)" - line 409, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 256, "(1)" - line 419, "pan.___", state 286, "(1)" - line 400, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 366, "(1)" - line 409, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 395, "(1)" - line 419, "pan.___", state 425, "(1)" - line 541, "pan.___", state 456, "-end-" - (19 of 456 states) -unreached in proctype urcu_reader_sig - line 400, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 70, "(1)" - line 419, "pan.___", state 100, "(1)" - line 400, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 158, "(1)" - line 419, "pan.___", state 188, "(1)" - line 400, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 247, "(1)" - line 419, "pan.___", state 277, "(1)" - line 400, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 330, "(1)" - line 409, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 359, "(1)" - line 419, "pan.___", state 389, "(1)" - line 615, "pan.___", state 411, "-end-" - (18 of 411 states) -unreached in proctype urcu_writer - line 400, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 20, "(1)" - line 404, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 34, "(1)" - line 404, "pan.___", state 35, "(1)" - line 404, "pan.___", state 35, "(1)" - line 402, "pan.___", state 40, "((i<1))" - line 402, "pan.___", state 40, "((i>=1))" - line 409, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 59, "(1)" - line 410, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 60, "else" - line 410, "pan.___", state 63, "(1)" - line 410, "pan.___", state 64, "(1)" - line 410, "pan.___", state 64, "(1)" - line 414, "pan.___", state 72, "(1)" - line 414, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 73, "else" - line 414, "pan.___", state 76, "(1)" - line 414, "pan.___", state 77, "(1)" - line 414, "pan.___", state 77, "(1)" - line 412, "pan.___", state 82, "((i<1))" - line 412, "pan.___", state 82, "((i>=1))" - line 419, "pan.___", state 89, "(1)" - line 419, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 90, "else" - line 419, "pan.___", state 93, "(1)" - line 419, "pan.___", state 94, "(1)" - line 419, "pan.___", state 94, "(1)" - line 421, "pan.___", state 97, "(1)" - line 421, "pan.___", state 97, "(1)" - line 370, "pan.___", state 99, "(1)" - line 640, "pan.___", state 103, "cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )] = (old_gen+1)" - line 638, "pan.___", state 104, "old_gen = cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )]" - line 400, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 114, "(1)" - line 404, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 128, "(1)" - line 404, "pan.___", state 129, "(1)" - line 404, "pan.___", state 129, "(1)" - line 410, "pan.___", state 153, "(1)" - line 414, "pan.___", state 166, "(1)" - line 421, "pan.___", state 191, "(1)" - line 421, "pan.___", state 191, "(1)" - line 653, "pan.___", state 199, "(1)" - line 400, "pan.___", state 209, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 223, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 254, "(1)" - line 414, "pan.___", state 267, "(1)" - line 400, "pan.___", state 300, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 314, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 345, "(1)" - line 414, "pan.___", state 358, "(1)" - line 400, "pan.___", state 395, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 409, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 440, "(1)" - line 414, "pan.___", state 453, "(1)" - line 400, "pan.___", state 488, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 502, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 533, "(1)" - line 414, "pan.___", state 546, "(1)" - line 400, "pan.___", state 582, "(1)" - line 404, "pan.___", state 594, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 638, "(1)" - line 404, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 731, "(1)" - line 404, "pan.___", state 777, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 795, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 821, "(1)" - line 419, "pan.___", state 838, "(1)" - line 404, "pan.___", state 868, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 886, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 912, "(1)" - line 419, "pan.___", state 929, "(1)" - line 404, "pan.___", state 963, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 981, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1007, "(1)" - line 419, "pan.___", state 1024, "(1)" - line 400, "pan.___", state 1050, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 1052, "(1)" - line 400, "pan.___", state 1053, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 1053, "else" - line 400, "pan.___", state 1056, "(1)" - line 404, "pan.___", state 1064, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 1066, "(1)" - line 404, "pan.___", state 1067, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 1067, "else" - line 404, "pan.___", state 1070, "(1)" - line 404, "pan.___", state 1071, "(1)" - line 404, "pan.___", state 1071, "(1)" - line 402, "pan.___", state 1076, "((i<1))" - line 402, "pan.___", state 1076, "((i>=1))" - line 409, "pan.___", state 1082, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 1095, "(1)" - line 410, "pan.___", state 1096, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 1096, "else" - line 410, "pan.___", state 1099, "(1)" - line 410, "pan.___", state 1100, "(1)" - line 410, "pan.___", state 1100, "(1)" - line 414, "pan.___", state 1108, "(1)" - line 414, "pan.___", state 1109, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 1109, "else" - line 414, "pan.___", state 1112, "(1)" - line 414, "pan.___", state 1113, "(1)" - line 414, "pan.___", state 1113, "(1)" - line 412, "pan.___", state 1118, "((i<1))" - line 412, "pan.___", state 1118, "((i>=1))" - line 419, "pan.___", state 1125, "(1)" - line 419, "pan.___", state 1126, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 1126, "else" - line 419, "pan.___", state 1129, "(1)" - line 419, "pan.___", state 1130, "(1)" - line 419, "pan.___", state 1130, "(1)" - line 421, "pan.___", state 1133, "(1)" - line 421, "pan.___", state 1133, "(1)" - line 404, "pan.___", state 1164, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1208, "(1)" - line 404, "pan.___", state 1254, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1298, "(1)" - line 400, "pan.___", state 1334, "(1)" - line 404, "pan.___", state 1346, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1390, "(1)" - line 404, "pan.___", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1483, "(1)" - line 404, "pan.___", state 1529, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1547, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1573, "(1)" - line 419, "pan.___", state 1590, "(1)" - line 404, "pan.___", state 1620, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1638, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1664, "(1)" - line 419, "pan.___", state 1681, "(1)" - line 404, "pan.___", state 1715, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1733, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1759, "(1)" - line 419, "pan.___", state 1776, "(1)" - line 400, "pan.___", state 1802, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 1804, "(1)" - line 400, "pan.___", state 1805, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 1805, "else" - line 400, "pan.___", state 1808, "(1)" - line 404, "pan.___", state 1816, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 1818, "(1)" - line 404, "pan.___", state 1819, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 1819, "else" - line 404, "pan.___", state 1822, "(1)" - line 404, "pan.___", state 1823, "(1)" - line 404, "pan.___", state 1823, "(1)" - line 402, "pan.___", state 1828, "((i<1))" - line 402, "pan.___", state 1828, "((i>=1))" - line 409, "pan.___", state 1834, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 1847, "(1)" - line 410, "pan.___", state 1848, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 1848, "else" - line 410, "pan.___", state 1851, "(1)" - line 410, "pan.___", state 1852, "(1)" - line 410, "pan.___", state 1852, "(1)" - line 414, "pan.___", state 1860, "(1)" - line 414, "pan.___", state 1861, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 1861, "else" - line 414, "pan.___", state 1864, "(1)" - line 414, "pan.___", state 1865, "(1)" - line 414, "pan.___", state 1865, "(1)" - line 412, "pan.___", state 1870, "((i<1))" - line 412, "pan.___", state 1870, "((i>=1))" - line 419, "pan.___", state 1877, "(1)" - line 419, "pan.___", state 1878, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 1878, "else" - line 419, "pan.___", state 1881, "(1)" - line 419, "pan.___", state 1882, "(1)" - line 419, "pan.___", state 1882, "(1)" - line 421, "pan.___", state 1885, "(1)" - line 421, "pan.___", state 1885, "(1)" - line 404, "pan.___", state 1916, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1960, "(1)" - line 404, "pan.___", state 2007, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 2051, "(1)" - line 404, "pan.___", state 2102, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 2146, "(1)" - line 703, "pan.___", state 2192, "-end-" - (144 of 2192 states) -unreached in proctype :init: - line 710, "pan.___", state 9, "((j<2))" - line 710, "pan.___", state 9, "((j>=2))" - line 711, "pan.___", state 20, "((j<2))" - line 711, "pan.___", state 20, "((j>=2))" - line 716, "pan.___", state 33, "((j<2))" - line 716, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 750, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 227 seconds -pan: rate 62472.797 states/second -pan: avg transition delay 9.3511e-07 usec -cp .input.spin urcu_free_no_mb.spin.input -cp .input.spin.trail urcu_free_no_mb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_mb.spin.input b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_mb.spin.input deleted file mode 100644 index 5de16b8..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_mb.spin.input +++ /dev/null @@ -1,724 +0,0 @@ -#define NO_RMB -#define NO_WMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_mb.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_mb.spin.input.trail deleted file mode 100644 index d437aad..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_mb.spin.input.trail +++ /dev/null @@ -1,2144 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:3107 -2:4:3059 -3:4:3062 -4:4:3062 -5:4:3065 -6:4:3073 -7:4:3073 -8:4:3076 -9:4:3082 -10:4:3086 -11:4:3086 -12:4:3089 -13:4:3097 -14:4:3101 -15:4:3102 -16:0:3107 -17:4:3104 -18:0:3107 -19:3:869 -20:0:3107 -21:3:875 -22:0:3107 -23:3:876 -24:0:3107 -25:3:877 -26:3:881 -27:3:882 -28:3:890 -29:3:891 -30:3:895 -31:3:896 -32:3:904 -33:3:909 -34:3:913 -35:3:914 -36:3:921 -37:3:922 -38:3:933 -39:3:934 -40:3:935 -41:3:946 -42:3:951 -43:3:952 -44:0:3107 -45:3:964 -46:0:3107 -47:3:966 -48:3:967 -49:0:3107 -50:3:971 -51:3:975 -52:3:976 -53:3:984 -54:3:985 -55:3:989 -56:3:990 -57:3:998 -58:3:1003 -59:3:1004 -60:3:1015 -61:3:1016 -62:3:1027 -63:3:1028 -64:3:1029 -65:3:1040 -66:3:1045 -67:3:1046 -68:0:3107 -69:3:1058 -70:0:3107 -71:3:1060 -72:0:3107 -73:3:1061 -74:0:3107 -75:3:1071 -76:0:3107 -77:3:1072 -78:3:1076 -79:3:1077 -80:3:1085 -81:3:1086 -82:3:1090 -83:3:1091 -84:3:1099 -85:3:1104 -86:3:1108 -87:3:1109 -88:3:1116 -89:3:1117 -90:3:1128 -91:3:1129 -92:3:1130 -93:3:1141 -94:3:1146 -95:3:1147 -96:0:3107 -97:3:1162 -98:0:3107 -99:3:1163 -100:3:1167 -101:3:1168 -102:3:1176 -103:3:1177 -104:3:1181 -105:3:1182 -106:3:1190 -107:3:1195 -108:3:1199 -109:3:1200 -110:3:1207 -111:3:1208 -112:3:1219 -113:3:1220 -114:3:1221 -115:3:1232 -116:3:1237 -117:3:1238 -118:0:3107 -119:3:1253 -120:0:3107 -121:3:1258 -122:3:1262 -123:3:1263 -124:3:1271 -125:3:1272 -126:3:1276 -127:3:1277 -128:3:1285 -129:3:1290 -130:3:1294 -131:3:1295 -132:3:1302 -133:3:1303 -134:3:1314 -135:3:1315 -136:3:1316 -137:3:1327 -138:3:1332 -139:3:1333 -140:0:3107 -141:3:1348 -142:0:3107 -143:3:1350 -144:0:3107 -145:3:1351 -146:3:1355 -147:3:1356 -148:3:1364 -149:3:1365 -150:3:1369 -151:3:1370 -152:3:1378 -153:3:1383 -154:3:1387 -155:3:1388 -156:3:1395 -157:3:1396 -158:3:1407 -159:3:1408 -160:3:1409 -161:3:1420 -162:3:1425 -163:3:1426 -164:0:3107 -165:3:1438 -166:0:3107 -167:3:1440 -168:0:3107 -169:3:1443 -170:3:1444 -171:3:1456 -172:3:1457 -173:3:1461 -174:3:1462 -175:3:1470 -176:3:1475 -177:3:1479 -178:3:1480 -179:3:1487 -180:3:1488 -181:3:1499 -182:3:1500 -183:3:1501 -184:3:1512 -185:3:1517 -186:3:1518 -187:0:3107 -188:3:1530 -189:0:3107 -190:3:1532 -191:0:3107 -192:3:1533 -193:0:3107 -194:3:1534 -195:0:3107 -196:3:1535 -197:0:3107 -198:3:1536 -199:3:1540 -200:3:1541 -201:3:1549 -202:3:1550 -203:3:1554 -204:3:1555 -205:3:1563 -206:3:1568 -207:3:1572 -208:3:1573 -209:3:1580 -210:3:1581 -211:3:1592 -212:3:1593 -213:3:1594 -214:3:1605 -215:3:1610 -216:3:1611 -217:0:3107 -218:3:1623 -219:0:3107 -220:3:1904 -221:0:3107 -222:3:2002 -223:0:3107 -224:3:2003 -225:0:3107 -226:3:2007 -227:0:3107 -228:3:2013 -229:3:2017 -230:3:2018 -231:3:2026 -232:3:2027 -233:3:2031 -234:3:2032 -235:3:2040 -236:3:2045 -237:3:2049 -238:3:2050 -239:3:2057 -240:3:2058 -241:3:2069 -242:3:2070 -243:3:2071 -244:3:2082 -245:3:2087 -246:3:2088 -247:0:3107 -248:3:2100 -249:0:3107 -250:3:2102 -251:0:3107 -252:3:2103 -253:3:2107 -254:3:2108 -255:3:2116 -256:3:2117 -257:3:2121 -258:3:2122 -259:3:2130 -260:3:2135 -261:3:2139 -262:3:2140 -263:3:2147 -264:3:2148 -265:3:2159 -266:3:2160 -267:3:2161 -268:3:2172 -269:3:2177 -270:3:2178 -271:0:3107 -272:3:2190 -273:0:3107 -274:3:2192 -275:0:3107 -276:3:2195 -277:3:2196 -278:3:2208 -279:3:2209 -280:3:2213 -281:3:2214 -282:3:2222 -283:3:2227 -284:3:2231 -285:3:2232 -286:3:2239 -287:3:2240 -288:3:2251 -289:3:2252 -290:3:2253 -291:3:2264 -292:3:2269 -293:3:2270 -294:0:3107 -295:3:2282 -296:0:3107 -297:3:2284 -298:0:3107 -299:3:2285 -300:0:3107 -301:3:2286 -302:0:3107 -303:3:2287 -304:0:3107 -305:3:2288 -306:3:2292 -307:3:2293 -308:3:2301 -309:3:2302 -310:3:2306 -311:3:2307 -312:3:2315 -313:3:2320 -314:3:2324 -315:3:2325 -316:3:2332 -317:3:2333 -318:3:2344 -319:3:2345 -320:3:2346 -321:3:2357 -322:3:2362 -323:3:2363 -324:0:3107 -325:3:2375 -326:0:3107 -327:3:2656 -328:0:3107 -329:3:2754 -330:0:3107 -331:3:2755 -332:0:3107 -333:3:2759 -334:0:3107 -335:3:2765 -336:3:2769 -337:3:2770 -338:3:2778 -339:3:2779 -340:3:2783 -341:3:2784 -342:3:2792 -343:3:2797 -344:3:2801 -345:3:2802 -346:3:2809 -347:3:2810 -348:3:2821 -349:3:2822 -350:3:2823 -351:3:2834 -352:3:2839 -353:3:2840 -354:0:3107 -355:3:2855 -356:0:3107 -357:3:2856 -358:3:2860 -359:3:2861 -360:3:2869 -361:3:2870 -362:3:2874 -363:3:2875 -364:3:2883 -365:3:2888 -366:3:2892 -367:3:2893 -368:3:2900 -369:3:2901 -370:3:2912 -371:3:2913 -372:3:2914 -373:3:2925 -374:3:2930 -375:3:2931 -376:0:3107 -377:3:2946 -378:0:3107 -379:3:2951 -380:3:2955 -381:3:2956 -382:3:2964 -383:3:2965 -384:3:2969 -385:3:2970 -386:3:2978 -387:3:2983 -388:3:2987 -389:3:2988 -390:3:2995 -391:3:2996 -392:3:3007 -393:3:3008 -394:3:3009 -395:3:3020 -396:3:3025 -397:3:3026 -398:0:3107 -399:3:3041 -400:0:3107 -401:3:3043 -402:0:3107 -403:3:3044 -404:0:3107 -405:3:876 -406:0:3107 -407:3:877 -408:3:881 -409:3:882 -410:3:890 -411:3:891 -412:3:895 -413:3:896 -414:3:904 -415:3:909 -416:3:913 -417:3:914 -418:3:921 -419:3:922 -420:3:933 -421:3:934 -422:3:935 -423:3:946 -424:3:951 -425:3:952 -426:0:3107 -427:3:964 -428:0:3107 -429:3:966 -430:3:967 -431:0:3107 -432:3:971 -433:3:975 -434:3:976 -435:3:984 -436:3:985 -437:3:989 -438:3:990 -439:3:998 -440:3:1003 -441:3:1004 -442:3:1015 -443:3:1016 -444:3:1027 -445:3:1028 -446:3:1029 -447:3:1040 -448:3:1045 -449:3:1046 -450:0:3107 -451:3:1058 -452:0:3107 -453:3:1060 -454:0:3107 -455:3:1061 -456:0:3107 -457:3:1071 -458:0:3107 -459:3:1072 -460:3:1076 -461:3:1077 -462:3:1085 -463:3:1086 -464:3:1090 -465:3:1091 -466:3:1099 -467:3:1104 -468:3:1108 -469:3:1109 -470:3:1116 -471:3:1117 -472:3:1128 -473:3:1129 -474:3:1130 -475:3:1141 -476:3:1146 -477:3:1147 -478:0:3107 -479:3:1162 -480:0:3107 -481:3:1163 -482:3:1167 -483:3:1168 -484:3:1176 -485:3:1177 -486:3:1181 -487:3:1182 -488:3:1190 -489:3:1195 -490:3:1199 -491:3:1200 -492:3:1207 -493:3:1208 -494:3:1219 -495:3:1220 -496:3:1221 -497:3:1232 -498:3:1237 -499:3:1238 -500:0:3107 -501:3:1253 -502:0:3107 -503:3:1258 -504:3:1262 -505:3:1263 -506:3:1271 -507:3:1272 -508:3:1276 -509:3:1277 -510:3:1285 -511:3:1290 -512:3:1294 -513:3:1295 -514:3:1302 -515:3:1303 -516:3:1314 -517:3:1315 -518:3:1316 -519:3:1327 -520:3:1332 -521:3:1333 -522:0:3107 -523:3:1348 -524:0:3107 -525:3:1350 -526:0:3107 -527:3:1351 -528:3:1355 -529:3:1356 -530:3:1364 -531:3:1365 -532:3:1369 -533:3:1370 -534:3:1378 -535:3:1383 -536:3:1387 -537:3:1388 -538:3:1395 -539:3:1396 -540:3:1407 -541:3:1408 -542:3:1409 -543:3:1420 -544:3:1425 -545:3:1426 -546:0:3107 -547:3:1438 -548:0:3107 -549:3:1440 -550:0:3107 -551:3:1443 -552:3:1444 -553:3:1456 -554:3:1457 -555:3:1461 -556:3:1462 -557:3:1470 -558:3:1475 -559:3:1479 -560:3:1480 -561:3:1487 -562:3:1488 -563:3:1499 -564:3:1500 -565:3:1501 -566:3:1512 -567:3:1517 -568:3:1518 -569:0:3107 -570:3:1530 -571:0:3107 -572:3:1532 -573:0:3107 -574:3:1533 -575:0:3107 -576:3:1534 -577:0:3107 -578:3:1535 -579:0:3107 -580:3:1536 -581:3:1540 -582:3:1541 -583:3:1549 -584:3:1550 -585:3:1554 -586:3:1555 -587:3:1563 -588:3:1568 -589:3:1572 -590:3:1573 -591:3:1580 -592:3:1581 -593:3:1592 -594:3:1593 -595:3:1594 -596:3:1605 -597:3:1610 -598:3:1611 -599:0:3107 -600:3:1623 -601:0:3107 -602:3:1904 -603:0:3107 -604:3:2002 -605:0:3107 -606:3:2003 -607:0:3107 -608:3:2007 -609:0:3107 -610:3:2013 -611:3:2017 -612:3:2018 -613:3:2026 -614:3:2027 -615:3:2031 -616:3:2032 -617:3:2040 -618:3:2045 -619:3:2049 -620:3:2050 -621:3:2057 -622:3:2058 -623:3:2069 -624:3:2070 -625:3:2071 -626:3:2082 -627:3:2087 -628:3:2088 -629:0:3107 -630:3:2100 -631:0:3107 -632:3:2102 -633:0:3107 -634:3:2103 -635:3:2107 -636:3:2108 -637:3:2116 -638:3:2117 -639:3:2121 -640:3:2122 -641:3:2130 -642:3:2135 -643:3:2139 -644:3:2140 -645:3:2147 -646:3:2148 -647:3:2159 -648:3:2160 -649:3:2161 -650:3:2172 -651:3:2177 -652:3:2178 -653:0:3107 -654:3:2190 -655:0:3107 -656:3:2192 -657:0:3107 -658:3:2195 -659:3:2196 -660:3:2208 -661:3:2209 -662:3:2213 -663:3:2214 -664:3:2222 -665:3:2227 -666:3:2231 -667:3:2232 -668:3:2239 -669:3:2240 -670:3:2251 -671:3:2252 -672:3:2253 -673:3:2264 -674:3:2269 -675:3:2270 -676:0:3107 -677:3:2282 -678:0:3107 -679:3:2284 -680:0:3107 -681:3:2285 -682:0:3107 -683:3:2286 -684:0:3107 -685:3:2287 -686:0:3107 -687:3:2288 -688:3:2292 -689:3:2293 -690:3:2301 -691:3:2302 -692:3:2306 -693:3:2307 -694:3:2315 -695:3:2320 -696:3:2324 -697:3:2325 -698:3:2332 -699:3:2333 -700:3:2344 -701:3:2345 -702:3:2346 -703:3:2357 -704:3:2362 -705:3:2363 -706:0:3107 -707:3:2375 -708:0:3107 -709:3:2656 -710:0:3107 -711:3:2754 -712:0:3107 -713:3:2755 -714:0:3107 -715:3:2759 -716:0:3107 -717:3:2765 -718:3:2769 -719:3:2770 -720:3:2778 -721:3:2779 -722:3:2783 -723:3:2784 -724:3:2792 -725:3:2797 -726:3:2801 -727:3:2802 -728:3:2809 -729:3:2810 -730:3:2821 -731:3:2822 -732:3:2823 -733:3:2834 -734:3:2839 -735:3:2840 -736:0:3107 -737:3:2855 -738:0:3107 -739:3:2856 -740:3:2860 -741:3:2861 -742:3:2869 -743:3:2870 -744:3:2874 -745:3:2875 -746:3:2883 -747:3:2888 -748:3:2892 -749:3:2893 -750:3:2900 -751:3:2901 -752:3:2912 -753:3:2913 -754:3:2914 -755:3:2925 -756:3:2930 -757:3:2931 -758:0:3107 -759:3:2946 -760:0:3107 -761:3:2951 -762:3:2955 -763:3:2956 -764:3:2964 -765:3:2965 -766:3:2969 -767:3:2970 -768:3:2978 -769:3:2983 -770:3:2987 -771:3:2988 -772:3:2995 -773:3:2996 -774:3:3007 -775:3:3008 -776:3:3009 -777:3:3020 -778:3:3025 -779:3:3026 -780:0:3107 -781:3:3041 -782:0:3107 -783:3:3043 -784:0:3107 -785:3:3044 -786:0:3107 -787:3:876 -788:0:3107 -789:3:877 -790:3:881 -791:3:882 -792:3:890 -793:3:891 -794:3:895 -795:3:896 -796:3:904 -797:3:909 -798:3:913 -799:3:914 -800:3:921 -801:3:922 -802:3:933 -803:3:934 -804:3:935 -805:3:946 -806:3:951 -807:3:952 -808:0:3107 -809:3:964 -810:0:3107 -811:3:966 -812:3:967 -813:0:3107 -814:3:971 -815:3:975 -816:3:976 -817:3:984 -818:3:985 -819:3:989 -820:3:990 -821:3:998 -822:3:1003 -823:3:1004 -824:3:1015 -825:3:1016 -826:3:1027 -827:3:1028 -828:3:1029 -829:3:1040 -830:3:1045 -831:3:1046 -832:0:3107 -833:3:1058 -834:0:3107 -835:3:1060 -836:0:3107 -837:3:1061 -838:0:3107 -839:3:1071 -840:0:3107 -841:3:1072 -842:3:1076 -843:3:1077 -844:3:1085 -845:3:1086 -846:3:1090 -847:3:1091 -848:3:1099 -849:3:1104 -850:3:1108 -851:3:1109 -852:3:1116 -853:3:1117 -854:3:1128 -855:3:1129 -856:3:1130 -857:3:1141 -858:3:1146 -859:3:1147 -860:0:3107 -861:3:1162 -862:0:3107 -863:3:1163 -864:3:1167 -865:3:1168 -866:3:1176 -867:3:1177 -868:3:1181 -869:3:1182 -870:3:1190 -871:3:1195 -872:3:1199 -873:3:1200 -874:3:1207 -875:3:1208 -876:3:1219 -877:3:1220 -878:3:1221 -879:3:1232 -880:3:1237 -881:3:1238 -882:0:3107 -883:3:1253 -884:0:3107 -885:3:1258 -886:3:1262 -887:3:1263 -888:3:1271 -889:3:1272 -890:3:1276 -891:3:1277 -892:3:1285 -893:3:1290 -894:3:1294 -895:3:1295 -896:3:1302 -897:3:1303 -898:3:1314 -899:3:1315 -900:3:1316 -901:3:1327 -902:3:1332 -903:3:1333 -904:0:3107 -905:3:1348 -906:0:3107 -907:3:1350 -908:0:3107 -909:3:1351 -910:3:1355 -911:3:1356 -912:3:1364 -913:3:1365 -914:3:1369 -915:3:1370 -916:3:1378 -917:3:1383 -918:3:1387 -919:3:1388 -920:3:1395 -921:3:1396 -922:3:1407 -923:3:1408 -924:3:1409 -925:3:1420 -926:3:1425 -927:3:1426 -928:0:3107 -929:3:1438 -930:0:3107 -931:3:1440 -932:0:3107 -933:3:1443 -934:3:1444 -935:3:1456 -936:3:1457 -937:3:1461 -938:3:1462 -939:3:1470 -940:3:1475 -941:3:1479 -942:3:1480 -943:3:1487 -944:3:1488 -945:3:1499 -946:3:1500 -947:3:1501 -948:3:1512 -949:3:1517 -950:3:1518 -951:0:3107 -952:3:1530 -953:0:3107 -954:3:1532 -955:0:3107 -956:3:1533 -957:0:3107 -958:3:1534 -959:0:3107 -960:3:1535 -961:0:3107 -962:3:1536 -963:3:1540 -964:3:1541 -965:3:1549 -966:3:1550 -967:3:1554 -968:3:1555 -969:3:1563 -970:3:1568 -971:3:1572 -972:3:1573 -973:3:1580 -974:3:1581 -975:3:1592 -976:3:1593 -977:3:1594 -978:3:1605 -979:3:1610 -980:3:1611 -981:0:3107 -982:3:1623 -983:0:3107 -984:3:1904 -985:0:3107 -986:3:2002 -987:0:3107 -988:3:2003 -989:0:3107 -990:3:2007 -991:0:3107 -992:3:2013 -993:3:2017 -994:3:2018 -995:3:2026 -996:3:2027 -997:3:2031 -998:3:2032 -999:3:2040 -1000:3:2045 -1001:3:2049 -1002:3:2050 -1003:3:2057 -1004:3:2058 -1005:3:2069 -1006:3:2070 -1007:3:2071 -1008:3:2082 -1009:3:2087 -1010:3:2088 -1011:0:3107 -1012:3:2100 -1013:0:3107 -1014:3:2102 -1015:0:3107 -1016:3:2103 -1017:3:2107 -1018:3:2108 -1019:3:2116 -1020:3:2117 -1021:3:2121 -1022:3:2122 -1023:3:2130 -1024:3:2135 -1025:3:2139 -1026:3:2140 -1027:3:2147 -1028:3:2148 -1029:3:2159 -1030:3:2160 -1031:3:2161 -1032:3:2172 -1033:3:2177 -1034:3:2178 -1035:0:3107 -1036:3:2190 -1037:0:3107 -1038:3:2192 -1039:0:3107 -1040:3:2195 -1041:3:2196 -1042:3:2208 -1043:3:2209 -1044:3:2213 -1045:3:2214 -1046:3:2222 -1047:3:2227 -1048:3:2231 -1049:3:2232 -1050:3:2239 -1051:3:2240 -1052:3:2251 -1053:3:2252 -1054:3:2253 -1055:3:2264 -1056:3:2269 -1057:3:2270 -1058:0:3107 -1059:3:2282 -1060:0:3107 -1061:3:2284 -1062:0:3107 -1063:3:2285 -1064:0:3107 -1065:3:2286 -1066:0:3107 -1067:3:2287 -1068:0:3107 -1069:3:2288 -1070:3:2292 -1071:3:2293 -1072:3:2301 -1073:3:2302 -1074:3:2306 -1075:3:2307 -1076:3:2315 -1077:3:2320 -1078:3:2324 -1079:3:2325 -1080:3:2332 -1081:3:2333 -1082:3:2344 -1083:3:2345 -1084:3:2346 -1085:3:2357 -1086:3:2362 -1087:3:2363 -1088:0:3107 -1089:3:2375 -1090:0:3107 -1091:3:2656 -1092:0:3107 -1093:3:2754 -1094:0:3107 -1095:3:2755 -1096:0:3107 -1097:3:2759 -1098:0:3107 -1099:3:2765 -1100:3:2769 -1101:3:2770 -1102:3:2778 -1103:3:2779 -1104:3:2783 -1105:3:2784 -1106:3:2792 -1107:3:2797 -1108:3:2801 -1109:3:2802 -1110:3:2809 -1111:3:2810 -1112:3:2821 -1113:3:2822 -1114:3:2823 -1115:3:2834 -1116:3:2839 -1117:3:2840 -1118:0:3107 -1119:3:2855 -1120:0:3107 -1121:3:2856 -1122:3:2860 -1123:3:2861 -1124:3:2869 -1125:3:2870 -1126:3:2874 -1127:3:2875 -1128:3:2883 -1129:3:2888 -1130:3:2892 -1131:3:2893 -1132:3:2900 -1133:3:2901 -1134:3:2912 -1135:3:2913 -1136:3:2914 -1137:3:2925 -1138:3:2930 -1139:3:2931 -1140:0:3107 -1141:3:2946 -1142:0:3107 -1143:3:2951 -1144:3:2955 -1145:3:2956 -1146:3:2964 -1147:3:2965 -1148:3:2969 -1149:3:2970 -1150:3:2978 -1151:3:2983 -1152:3:2987 -1153:3:2988 -1154:3:2995 -1155:3:2996 -1156:3:3007 -1157:3:3008 -1158:3:3009 -1159:3:3020 -1160:3:3025 -1161:3:3026 -1162:0:3107 -1163:3:3041 -1164:0:3107 -1165:3:3043 -1166:0:3107 -1167:3:3044 -1168:0:3107 -1169:3:876 -1170:0:3107 -1171:3:877 -1172:3:881 -1173:3:882 -1174:3:890 -1175:3:891 -1176:3:895 -1177:3:896 -1178:3:904 -1179:3:909 -1180:3:913 -1181:3:914 -1182:3:921 -1183:3:922 -1184:3:933 -1185:3:934 -1186:3:935 -1187:3:946 -1188:3:951 -1189:3:952 -1190:0:3107 -1191:3:964 -1192:0:3107 -1193:3:966 -1194:3:967 -1195:0:3107 -1196:3:971 -1197:3:975 -1198:3:976 -1199:3:984 -1200:3:985 -1201:3:989 -1202:3:990 -1203:3:998 -1204:3:1003 -1205:3:1004 -1206:3:1015 -1207:3:1016 -1208:3:1027 -1209:3:1028 -1210:3:1029 -1211:3:1040 -1212:3:1045 -1213:3:1046 -1214:0:3107 -1215:3:1058 -1216:0:3107 -1217:3:1060 -1218:0:3107 -1219:3:1061 -1220:0:3107 -1221:3:1071 -1222:0:3107 -1223:3:1072 -1224:3:1076 -1225:3:1077 -1226:3:1085 -1227:3:1086 -1228:3:1090 -1229:3:1091 -1230:3:1099 -1231:3:1104 -1232:3:1108 -1233:3:1109 -1234:3:1116 -1235:3:1117 -1236:3:1128 -1237:3:1129 -1238:3:1130 -1239:3:1141 -1240:3:1146 -1241:3:1147 -1242:0:3107 -1243:3:1162 -1244:0:3107 -1245:3:1163 -1246:3:1167 -1247:3:1168 -1248:3:1176 -1249:3:1177 -1250:3:1181 -1251:3:1182 -1252:3:1190 -1253:3:1195 -1254:3:1199 -1255:3:1200 -1256:3:1207 -1257:3:1208 -1258:3:1219 -1259:3:1220 -1260:3:1221 -1261:3:1232 -1262:3:1237 -1263:3:1238 -1264:0:3107 -1265:3:1253 -1266:0:3107 -1267:3:1258 -1268:3:1262 -1269:3:1263 -1270:3:1271 -1271:3:1272 -1272:3:1276 -1273:3:1277 -1274:3:1285 -1275:3:1290 -1276:3:1294 -1277:3:1295 -1278:3:1302 -1279:3:1303 -1280:3:1314 -1281:3:1315 -1282:3:1316 -1283:3:1327 -1284:3:1332 -1285:3:1333 -1286:0:3107 -1287:3:1348 -1288:0:3107 -1289:3:1350 -1290:0:3107 -1291:3:1351 -1292:3:1355 -1293:3:1356 -1294:3:1364 -1295:3:1365 -1296:3:1369 -1297:3:1370 -1298:3:1378 -1299:3:1383 -1300:3:1387 -1301:3:1388 -1302:3:1395 -1303:3:1396 -1304:3:1407 -1305:3:1408 -1306:3:1409 -1307:3:1420 -1308:3:1425 -1309:3:1426 -1310:0:3107 -1311:3:1438 -1312:0:3107 -1313:3:1440 -1314:0:3107 -1315:3:1443 -1316:3:1444 -1317:3:1456 -1318:3:1457 -1319:3:1461 -1320:3:1462 -1321:3:1470 -1322:3:1475 -1323:3:1479 -1324:3:1480 -1325:3:1487 -1326:3:1488 -1327:3:1499 -1328:3:1500 -1329:3:1501 -1330:3:1512 -1331:3:1517 -1332:3:1518 -1333:0:3107 -1334:3:1530 -1335:0:3107 -1336:3:1532 -1337:0:3107 -1338:3:1533 -1339:0:3107 -1340:3:1534 -1341:0:3107 -1342:3:1535 -1343:0:3107 -1344:3:1536 -1345:3:1540 -1346:3:1541 -1347:3:1549 -1348:3:1550 -1349:3:1554 -1350:3:1555 -1351:3:1563 -1352:3:1568 -1353:3:1572 -1354:3:1573 -1355:3:1580 -1356:3:1581 -1357:3:1592 -1358:3:1593 -1359:3:1594 -1360:3:1605 -1361:3:1610 -1362:3:1611 -1363:0:3107 -1364:3:1623 -1365:0:3107 -1366:3:1904 -1367:0:3107 -1368:3:2002 -1369:0:3107 -1370:3:2003 -1371:0:3107 -1372:3:2007 -1373:0:3107 -1374:3:2013 -1375:3:2017 -1376:3:2018 -1377:3:2026 -1378:3:2027 -1379:3:2031 -1380:3:2032 -1381:3:2040 -1382:3:2045 -1383:3:2049 -1384:3:2050 -1385:3:2057 -1386:3:2058 -1387:3:2069 -1388:3:2070 -1389:3:2071 -1390:3:2082 -1391:3:2087 -1392:3:2088 -1393:0:3107 -1394:3:2100 -1395:0:3107 -1396:3:2102 -1397:0:3107 -1398:3:2103 -1399:3:2107 -1400:3:2108 -1401:3:2116 -1402:3:2117 -1403:3:2121 -1404:3:2122 -1405:3:2130 -1406:3:2135 -1407:3:2139 -1408:3:2140 -1409:3:2147 -1410:3:2148 -1411:3:2159 -1412:3:2160 -1413:3:2161 -1414:3:2172 -1415:3:2177 -1416:3:2178 -1417:0:3107 -1418:3:2190 -1419:0:3107 -1420:3:2192 -1421:0:3107 -1422:3:2195 -1423:3:2196 -1424:3:2208 -1425:3:2209 -1426:3:2213 -1427:3:2214 -1428:3:2222 -1429:3:2227 -1430:3:2231 -1431:3:2232 -1432:3:2239 -1433:3:2240 -1434:3:2251 -1435:3:2252 -1436:3:2253 -1437:3:2264 -1438:3:2269 -1439:3:2270 -1440:0:3107 -1441:3:2282 -1442:0:3107 -1443:3:2284 -1444:0:3107 -1445:3:2285 -1446:0:3107 -1447:3:2286 -1448:0:3107 -1449:3:2287 -1450:0:3107 -1451:3:2288 -1452:3:2292 -1453:3:2293 -1454:3:2301 -1455:3:2302 -1456:3:2306 -1457:3:2307 -1458:3:2315 -1459:3:2320 -1460:3:2324 -1461:3:2325 -1462:3:2332 -1463:3:2333 -1464:3:2344 -1465:3:2345 -1466:3:2346 -1467:3:2357 -1468:3:2362 -1469:3:2363 -1470:0:3107 -1471:3:2375 -1472:0:3107 -1473:3:2656 -1474:0:3107 -1475:3:2754 -1476:0:3107 -1477:3:2755 -1478:0:3107 -1479:3:2759 -1480:0:3107 -1481:3:2765 -1482:3:2769 -1483:3:2770 -1484:3:2778 -1485:3:2779 -1486:3:2783 -1487:3:2784 -1488:3:2792 -1489:3:2797 -1490:3:2801 -1491:3:2802 -1492:3:2809 -1493:3:2810 -1494:3:2821 -1495:3:2822 -1496:3:2823 -1497:3:2834 -1498:3:2839 -1499:3:2840 -1500:0:3107 -1501:3:2855 -1502:0:3107 -1503:3:2856 -1504:3:2860 -1505:3:2861 -1506:3:2869 -1507:3:2870 -1508:3:2874 -1509:3:2875 -1510:3:2883 -1511:3:2888 -1512:3:2892 -1513:3:2893 -1514:3:2900 -1515:3:2901 -1516:3:2912 -1517:3:2913 -1518:3:2914 -1519:3:2925 -1520:3:2930 -1521:3:2931 -1522:0:3107 -1523:3:2946 -1524:0:3107 -1525:3:2951 -1526:3:2955 -1527:3:2956 -1528:3:2964 -1529:3:2965 -1530:3:2969 -1531:3:2970 -1532:3:2978 -1533:3:2983 -1534:3:2987 -1535:3:2988 -1536:3:2995 -1537:3:2996 -1538:3:3007 -1539:3:3008 -1540:3:3009 -1541:3:3020 -1542:3:3025 -1543:3:3026 -1544:0:3107 -1545:3:3041 -1546:0:3107 -1547:3:3043 -1548:0:3107 -1549:3:3044 -1550:0:3107 -1551:3:876 -1552:0:3107 -1553:3:877 -1554:3:881 -1555:3:882 -1556:3:890 -1557:3:891 -1558:3:895 -1559:3:896 -1560:3:904 -1561:3:909 -1562:3:913 -1563:3:914 -1564:3:921 -1565:3:922 -1566:3:933 -1567:3:934 -1568:3:935 -1569:3:946 -1570:3:951 -1571:3:952 -1572:0:3107 -1573:3:964 -1574:0:3107 -1575:3:966 -1576:3:967 -1577:0:3107 -1578:3:971 -1579:3:975 -1580:3:976 -1581:3:984 -1582:3:985 -1583:3:989 -1584:3:990 -1585:3:998 -1586:3:1011 -1587:3:1012 -1588:3:1015 -1589:3:1016 -1590:3:1027 -1591:3:1028 -1592:3:1029 -1593:3:1040 -1594:3:1045 -1595:3:1048 -1596:3:1049 -1597:0:3107 -1598:3:1058 -1599:0:3107 -1600:3:1060 -1601:0:3107 -1602:3:1061 -1603:0:3107 -1604:3:1071 -1605:0:3107 -1606:3:1072 -1607:3:1076 -1608:3:1077 -1609:3:1085 -1610:3:1086 -1611:3:1090 -1612:3:1091 -1613:3:1099 -1614:3:1112 -1615:3:1113 -1616:3:1116 -1617:3:1117 -1618:3:1128 -1619:3:1129 -1620:3:1130 -1621:3:1141 -1622:3:1146 -1623:3:1149 -1624:3:1150 -1625:0:3107 -1626:3:1162 -1627:0:3107 -1628:3:1163 -1629:3:1167 -1630:3:1168 -1631:3:1176 -1632:3:1177 -1633:3:1181 -1634:3:1182 -1635:3:1190 -1636:3:1203 -1637:3:1204 -1638:3:1207 -1639:3:1208 -1640:3:1219 -1641:3:1220 -1642:3:1221 -1643:3:1232 -1644:3:1237 -1645:3:1240 -1646:3:1241 -1647:0:3107 -1648:3:1253 -1649:0:3107 -1650:3:1258 -1651:3:1262 -1652:3:1263 -1653:3:1271 -1654:3:1272 -1655:3:1276 -1656:3:1277 -1657:3:1285 -1658:3:1298 -1659:3:1299 -1660:3:1302 -1661:3:1303 -1662:3:1314 -1663:3:1315 -1664:3:1316 -1665:3:1327 -1666:3:1332 -1667:3:1335 -1668:3:1336 -1669:0:3107 -1670:3:1348 -1671:0:3107 -1672:3:1350 -1673:0:3107 -1674:3:1351 -1675:3:1355 -1676:3:1356 -1677:3:1364 -1678:3:1365 -1679:3:1369 -1680:3:1370 -1681:3:1378 -1682:3:1391 -1683:3:1392 -1684:3:1395 -1685:3:1396 -1686:3:1407 -1687:3:1408 -1688:3:1409 -1689:3:1420 -1690:3:1425 -1691:3:1428 -1692:3:1429 -1693:0:3107 -1694:3:1438 -1695:0:3107 -1696:3:1440 -1697:0:3107 -1698:3:1443 -1699:3:1444 -1700:3:1456 -1701:3:1457 -1702:3:1461 -1703:3:1462 -1704:3:1470 -1705:3:1483 -1706:3:1484 -1707:3:1487 -1708:3:1488 -1709:3:1499 -1710:3:1500 -1711:3:1501 -1712:3:1512 -1713:3:1517 -1714:3:1520 -1715:3:1521 -1716:0:3107 -1717:3:1530 -1718:0:3107 -1719:3:1532 -1720:0:3107 -1721:3:1533 -1722:0:3107 -1723:3:1534 -1724:0:3107 -1725:3:1535 -1726:0:3107 -1727:3:1536 -1728:3:1540 -1729:3:1541 -1730:3:1549 -1731:3:1550 -1732:3:1554 -1733:3:1555 -1734:3:1563 -1735:3:1576 -1736:3:1577 -1737:3:1580 -1738:3:1581 -1739:3:1592 -1740:3:1593 -1741:3:1594 -1742:3:1605 -1743:3:1610 -1744:3:1613 -1745:3:1614 -1746:0:3107 -1747:3:1623 -1748:0:3107 -1749:3:1904 -1750:0:3107 -1751:3:2002 -1752:0:3107 -1753:3:2003 -1754:0:3107 -1755:3:2007 -1756:0:3107 -1757:3:2013 -1758:3:2017 -1759:3:2018 -1760:3:2026 -1761:3:2027 -1762:3:2031 -1763:3:2032 -1764:3:2040 -1765:3:2053 -1766:3:2054 -1767:3:2057 -1768:3:2058 -1769:3:2069 -1770:3:2070 -1771:3:2071 -1772:3:2082 -1773:3:2087 -1774:3:2090 -1775:3:2091 -1776:0:3107 -1777:3:2100 -1778:0:3107 -1779:3:2102 -1780:0:3107 -1781:3:2103 -1782:3:2107 -1783:3:2108 -1784:3:2116 -1785:3:2117 -1786:3:2121 -1787:3:2122 -1788:3:2130 -1789:3:2143 -1790:3:2144 -1791:3:2147 -1792:3:2148 -1793:3:2159 -1794:3:2160 -1795:3:2161 -1796:3:2172 -1797:3:2177 -1798:3:2180 -1799:3:2181 -1800:0:3107 -1801:3:2190 -1802:0:3107 -1803:3:2192 -1804:0:3107 -1805:3:2195 -1806:3:2196 -1807:3:2208 -1808:3:2209 -1809:3:2213 -1810:3:2214 -1811:3:2222 -1812:3:2235 -1813:3:2236 -1814:3:2239 -1815:3:2240 -1816:3:2251 -1817:3:2252 -1818:3:2253 -1819:3:2264 -1820:3:2269 -1821:3:2272 -1822:3:2273 -1823:0:3107 -1824:3:2282 -1825:0:3107 -1826:3:2284 -1827:0:3107 -1828:3:2285 -1829:0:3107 -1830:3:2286 -1831:0:3107 -1832:3:2287 -1833:0:3107 -1834:3:2288 -1835:3:2292 -1836:3:2293 -1837:3:2301 -1838:3:2302 -1839:3:2306 -1840:3:2307 -1841:3:2315 -1842:3:2328 -1843:3:2329 -1844:3:2332 -1845:3:2333 -1846:3:2344 -1847:3:2345 -1848:3:2346 -1849:3:2357 -1850:3:2362 -1851:3:2365 -1852:3:2366 -1853:0:3107 -1854:3:2375 -1855:0:3107 -1856:3:2656 -1857:0:3107 -1858:3:2754 -1859:0:3107 -1860:3:2755 -1861:0:3107 -1862:3:2759 -1863:0:3107 -1864:3:2765 -1865:3:2769 -1866:3:2770 -1867:3:2778 -1868:3:2779 -1869:3:2783 -1870:3:2784 -1871:3:2792 -1872:3:2805 -1873:3:2806 -1874:3:2809 -1875:3:2810 -1876:3:2821 -1877:3:2822 -1878:3:2823 -1879:3:2834 -1880:3:2839 -1881:3:2842 -1882:3:2843 -1883:0:3107 -1884:3:2855 -1885:0:3107 -1886:3:2856 -1887:3:2860 -1888:3:2861 -1889:3:2869 -1890:3:2870 -1891:3:2874 -1892:3:2875 -1893:3:2883 -1894:3:2896 -1895:3:2897 -1896:3:2900 -1897:3:2901 -1898:3:2912 -1899:3:2913 -1900:3:2914 -1901:3:2925 -1902:3:2930 -1903:3:2933 -1904:3:2934 -1905:0:3107 -1906:3:2946 -1907:0:3107 -1908:3:2951 -1909:3:2955 -1910:3:2956 -1911:3:2964 -1912:3:2965 -1913:3:2969 -1914:3:2970 -1915:3:2978 -1916:3:2991 -1917:3:2992 -1918:3:2995 -1919:3:2996 -1920:3:3007 -1921:3:3008 -1922:3:3009 -1923:3:3020 -1924:3:3025 -1925:3:3028 -1926:3:3029 -1927:0:3107 -1928:3:3041 -1929:0:3107 -1930:3:3043 -1931:0:3107 -1932:3:3044 -1933:0:3107 -1934:3:3047 -1935:0:3107 -1936:3:3052 -1937:0:3107 -1938:2:458 -1939:0:3107 -1940:3:3053 -1941:0:3107 -1942:2:464 -1943:0:3107 -1944:3:3052 -1945:0:3107 -1946:2:465 -1947:0:3107 -1948:3:3053 -1949:0:3107 -1950:2:466 -1951:0:3107 -1952:3:3052 -1953:0:3107 -1954:2:467 -1955:0:3107 -1956:3:3053 -1957:0:3107 -1958:1:2 -1959:0:3107 -1960:3:3052 -1961:0:3107 -1962:2:468 -1963:0:3107 -1964:3:3053 -1965:0:3107 -1966:1:8 -1967:0:3107 -1968:3:3052 -1969:0:3107 -1970:2:467 -1971:0:3107 -1972:3:3053 -1973:0:3107 -1974:1:9 -1975:0:3107 -1976:3:3052 -1977:0:3107 -1978:2:468 -1979:0:3107 -1980:3:3053 -1981:0:3107 -1982:1:10 -1983:0:3107 -1984:3:3052 -1985:0:3107 -1986:2:467 -1987:0:3107 -1988:3:3053 -1989:0:3107 -1990:1:11 -1991:0:3107 -1992:3:3052 -1993:0:3107 -1994:2:468 -1995:0:3107 -1996:3:3053 -1997:0:3107 -1998:1:12 -1999:1:16 -2000:1:17 -2001:1:25 -2002:1:26 -2003:1:30 -2004:1:31 -2005:1:39 -2006:1:44 -2007:1:48 -2008:1:49 -2009:1:56 -2010:1:57 -2011:1:68 -2012:1:69 -2013:1:70 -2014:1:81 -2015:1:86 -2016:1:87 -2017:0:3107 -2018:3:3052 -2019:0:3107 -2020:2:467 -2021:0:3107 -2022:3:3053 -2023:0:3107 -2024:1:99 -2025:0:3107 -2026:3:3052 -2027:0:3107 -2028:2:468 -2029:0:3107 -2030:3:3053 -2031:0:3107 -2032:2:469 -2033:0:3107 -2034:3:3052 -2035:0:3107 -2036:2:475 -2037:0:3107 -2038:3:3053 -2039:0:3107 -2040:2:476 -2041:0:3107 -2042:3:3052 -2043:0:3107 -2044:2:477 -2045:2:481 -2046:2:482 -2047:2:490 -2048:2:491 -2049:2:495 -2050:2:496 -2051:2:504 -2052:2:509 -2053:2:513 -2054:2:514 -2055:2:521 -2056:2:522 -2057:2:533 -2058:2:534 -2059:2:535 -2060:2:546 -2061:2:551 -2062:2:552 -2063:0:3107 -2064:3:3053 -2065:0:3107 -2066:2:564 -2067:0:3107 -2068:3:3052 -2069:0:3107 -2070:2:565 -2071:2:569 -2072:2:570 -2073:2:578 -2074:2:579 -2075:2:583 -2076:2:584 -2077:2:592 -2078:2:597 -2079:2:601 -2080:2:602 -2081:2:609 -2082:2:610 -2083:2:621 -2084:2:622 -2085:2:623 -2086:2:634 -2087:2:639 -2088:2:640 -2089:0:3107 -2090:3:3053 -2091:0:3107 -2092:2:652 -2093:0:3107 -2094:3:3052 -2095:0:3107 -2096:2:653 -2097:0:3107 -2098:3:3053 -2099:0:3107 -2100:2:654 -2101:2:658 -2102:2:659 -2103:2:667 -2104:2:668 -2105:2:672 -2106:2:673 -2107:2:681 -2108:2:686 -2109:2:690 -2110:2:691 -2111:2:698 -2112:2:699 -2113:2:710 -2114:2:711 -2115:2:712 -2116:2:723 -2117:2:728 -2118:2:729 -2119:0:3107 -2120:3:3052 -2121:0:3107 -2122:2:741 -2123:0:3107 -2124:3:3053 -2125:0:3107 -2126:2:750 -2127:0:3107 -2128:3:3052 -2129:0:3107 -2130:2:753 -2131:0:3107 -2132:3:3053 -2133:0:3107 -2134:2:758 -2135:0:3107 -2136:3:3052 -2137:0:3107 -2138:2:759 -2139:0:3105 -2140:3:3053 -2141:0:3111 -2142:2:647 diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_rmb.define b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_rmb.log b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_rmb.log deleted file mode 100644 index 5bcef22..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_rmb.log +++ /dev/null @@ -1,300 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_rmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -Depth= 5678 States= 1e+06 Transitions= 8.21e+06 Memory= 534.904 t= 6.72 R= 1e+05 -Depth= 5678 States= 2e+06 Transitions= 1.6e+07 Memory= 603.557 t= 13.4 R= 1e+05 -Depth= 16003 States= 3e+06 Transitions= 2.49e+07 Memory= 672.209 t= 21.5 R= 1e+05 -pan: resizing hashtable to -w22.. done -Depth= 31043 States= 4e+06 Transitions= 3.44e+07 Memory= 771.983 t= 30.1 R= 1e+05 -Depth= 31043 States= 5e+06 Transitions= 4.41e+07 Memory= 840.635 t= 38.4 R= 1e+05 -Depth= 31043 States= 6e+06 Transitions= 5.25e+07 Memory= 909.287 t= 45.7 R= 1e+05 -Depth= 31043 States= 7e+06 Transitions= 6.12e+07 Memory= 977.940 t= 53.4 R= 1e+05 -Depth= 31043 States= 8e+06 Transitions= 6.95e+07 Memory= 1046.690 t= 60.8 R= 1e+05 -Depth= 31043 States= 9e+06 Transitions= 7.78e+07 Memory= 1115.342 t= 68.5 R= 1e+05 -pan: resizing hashtable to -w24.. done -Depth= 31043 States= 1e+07 Transitions= 8.68e+07 Memory= 1308.088 t= 77.9 R= 1e+05 -Depth= 31043 States= 1.1e+07 Transitions= 1.01e+08 Memory= 1376.740 t= 90.1 R= 1e+05 -Depth= 31043 States= 1.2e+07 Transitions= 1.13e+08 Memory= 1445.393 t= 101 R= 1e+05 -Depth= 31043 States= 1.3e+07 Transitions= 1.25e+08 Memory= 1514.045 t= 111 R= 1e+05 -Depth= 31043 States= 1.4e+07 Transitions= 1.38e+08 Memory= 1582.795 t= 122 R= 1e+05 -pan: claim violated! (at depth 1774) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 64 byte, depth reached 31043, errors: 1 - 14288659 states, stored -1.2755714e+08 states, matched -1.418458e+08 transitions (= stored+matched) -4.6616273e+08 atomic steps -hash conflicts: 65726574 (resolved) - -Stats on memory usage (in Megabytes): - 1253.659 equivalent memory usage for states (stored*(State-vector + overhead)) - 1017.191 actual memory usage for states (compression: 81.14%) - state-vector as stored = 47 byte + 28 byte overhead - 128.000 memory used for hash table (-w24) - 457.764 memory used for DFS stack (-m10000000) - 1602.619 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 256, "(1)" - line 418, "pan.___", state 286, "(1)" - line 399, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 395, "(1)" - line 418, "pan.___", state 425, "(1)" - line 540, "pan.___", state 456, "-end-" - (17 of 456 states) -unreached in proctype urcu_reader_sig - line 399, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 70, "(1)" - line 418, "pan.___", state 100, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 247, "(1)" - line 418, "pan.___", state 277, "(1)" - line 399, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 359, "(1)" - line 418, "pan.___", state 389, "(1)" - line 614, "pan.___", state 411, "-end-" - (17 of 411 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 20, "(1)" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 34, "(1)" - line 403, "pan.___", state 35, "(1)" - line 403, "pan.___", state 35, "(1)" - line 401, "pan.___", state 40, "((i<1))" - line 401, "pan.___", state 40, "((i>=1))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 59, "(1)" - line 409, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 60, "else" - line 409, "pan.___", state 63, "(1)" - line 409, "pan.___", state 64, "(1)" - line 409, "pan.___", state 64, "(1)" - line 413, "pan.___", state 72, "(1)" - line 413, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 73, "else" - line 413, "pan.___", state 76, "(1)" - line 413, "pan.___", state 77, "(1)" - line 413, "pan.___", state 77, "(1)" - line 411, "pan.___", state 82, "((i<1))" - line 411, "pan.___", state 82, "((i>=1))" - line 418, "pan.___", state 89, "(1)" - line 418, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 90, "else" - line 418, "pan.___", state 93, "(1)" - line 418, "pan.___", state 94, "(1)" - line 418, "pan.___", state 94, "(1)" - line 420, "pan.___", state 97, "(1)" - line 420, "pan.___", state 97, "(1)" - line 369, "pan.___", state 99, "(1)" - line 639, "pan.___", state 103, "cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )] = (old_gen+1)" - line 637, "pan.___", state 104, "old_gen = cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )]" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 114, "(1)" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 128, "(1)" - line 403, "pan.___", state 129, "(1)" - line 403, "pan.___", state 129, "(1)" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 420, "pan.___", state 191, "(1)" - line 420, "pan.___", state 191, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 175, "pan.___", state 243, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 291, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 304, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 320, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 334, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 352, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 365, "(1)" - line 413, "pan.___", state 378, "(1)" - line 418, "pan.___", state 395, "(1)" - line 399, "pan.___", state 414, "(1)" - line 403, "pan.___", state 426, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 444, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 470, "(1)" - line 418, "pan.___", state 487, "(1)" - line 403, "pan.___", state 519, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 537, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 563, "(1)" - line 418, "pan.___", state 580, "(1)" - line 179, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 616, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 175, "pan.___", state 629, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 677, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 690, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 714, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 716, "(1)" - line 399, "pan.___", state 717, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 717, "else" - line 399, "pan.___", state 720, "(1)" - line 403, "pan.___", state 728, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 730, "(1)" - line 403, "pan.___", state 731, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 731, "else" - line 403, "pan.___", state 734, "(1)" - line 403, "pan.___", state 735, "(1)" - line 403, "pan.___", state 735, "(1)" - line 401, "pan.___", state 740, "((i<1))" - line 401, "pan.___", state 740, "((i>=1))" - line 408, "pan.___", state 746, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 759, "(1)" - line 409, "pan.___", state 760, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 760, "else" - line 409, "pan.___", state 763, "(1)" - line 409, "pan.___", state 764, "(1)" - line 409, "pan.___", state 764, "(1)" - line 413, "pan.___", state 772, "(1)" - line 413, "pan.___", state 773, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 773, "else" - line 413, "pan.___", state 776, "(1)" - line 413, "pan.___", state 777, "(1)" - line 413, "pan.___", state 777, "(1)" - line 411, "pan.___", state 782, "((i<1))" - line 411, "pan.___", state 782, "((i>=1))" - line 418, "pan.___", state 789, "(1)" - line 418, "pan.___", state 790, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 790, "else" - line 418, "pan.___", state 793, "(1)" - line 418, "pan.___", state 794, "(1)" - line 418, "pan.___", state 794, "(1)" - line 420, "pan.___", state 797, "(1)" - line 420, "pan.___", state 797, "(1)" - line 403, "pan.___", state 828, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 846, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 872, "(1)" - line 418, "pan.___", state 889, "(1)" - line 403, "pan.___", state 918, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 936, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 962, "(1)" - line 418, "pan.___", state 979, "(1)" - line 399, "pan.___", state 998, "(1)" - line 403, "pan.___", state 1010, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1028, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1054, "(1)" - line 418, "pan.___", state 1071, "(1)" - line 403, "pan.___", state 1103, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1121, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1147, "(1)" - line 418, "pan.___", state 1164, "(1)" - line 179, "pan.___", state 1187, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1200, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 175, "pan.___", state 1213, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 1261, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1274, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1298, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1300, "(1)" - line 399, "pan.___", state 1301, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1301, "else" - line 399, "pan.___", state 1304, "(1)" - line 403, "pan.___", state 1312, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 1314, "(1)" - line 403, "pan.___", state 1315, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 1315, "else" - line 403, "pan.___", state 1318, "(1)" - line 403, "pan.___", state 1319, "(1)" - line 403, "pan.___", state 1319, "(1)" - line 401, "pan.___", state 1324, "((i<1))" - line 401, "pan.___", state 1324, "((i>=1))" - line 408, "pan.___", state 1330, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1343, "(1)" - line 409, "pan.___", state 1344, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 1344, "else" - line 409, "pan.___", state 1347, "(1)" - line 409, "pan.___", state 1348, "(1)" - line 409, "pan.___", state 1348, "(1)" - line 413, "pan.___", state 1356, "(1)" - line 413, "pan.___", state 1357, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 1357, "else" - line 413, "pan.___", state 1360, "(1)" - line 413, "pan.___", state 1361, "(1)" - line 413, "pan.___", state 1361, "(1)" - line 411, "pan.___", state 1366, "((i<1))" - line 411, "pan.___", state 1366, "((i>=1))" - line 418, "pan.___", state 1373, "(1)" - line 418, "pan.___", state 1374, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 1374, "else" - line 418, "pan.___", state 1377, "(1)" - line 418, "pan.___", state 1378, "(1)" - line 418, "pan.___", state 1378, "(1)" - line 420, "pan.___", state 1381, "(1)" - line 420, "pan.___", state 1381, "(1)" - line 179, "pan.___", state 1406, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1419, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 175, "pan.___", state 1432, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 1480, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1493, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 702, "pan.___", state 1520, "-end-" - (144 of 1520 states) -unreached in proctype :init: - line 709, "pan.___", state 9, "((j<2))" - line 709, "pan.___", state 9, "((j>=2))" - line 710, "pan.___", state 20, "((j<2))" - line 710, "pan.___", state 20, "((j>=2))" - line 715, "pan.___", state 33, "((j<2))" - line 715, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 749, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 125 seconds -pan: rate 114108.44 states/second -pan: avg transition delay 8.8279e-07 usec -cp .input.spin urcu_free_no_rmb.spin.input -cp .input.spin.trail urcu_free_no_rmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_rmb.spin.input b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_rmb.spin.input deleted file mode 100644 index ccf5f5c..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_rmb.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define NO_RMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_rmb.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_rmb.spin.input.trail deleted file mode 100644 index 1e5e132..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_rmb.spin.input.trail +++ /dev/null @@ -1,1777 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:2435 -2:4:2387 -3:4:2390 -4:4:2390 -5:4:2393 -6:4:2401 -7:4:2401 -8:4:2404 -9:4:2410 -10:4:2414 -11:4:2414 -12:4:2417 -13:4:2425 -14:4:2429 -15:4:2430 -16:0:2435 -17:4:2432 -18:0:2435 -19:3:869 -20:0:2435 -21:3:875 -22:0:2435 -23:3:876 -24:0:2435 -25:3:877 -26:3:881 -27:3:882 -28:3:890 -29:3:891 -30:3:895 -31:3:896 -32:3:904 -33:3:909 -34:3:913 -35:3:914 -36:3:921 -37:3:922 -38:3:933 -39:3:934 -40:3:935 -41:3:946 -42:3:951 -43:3:952 -44:0:2435 -45:3:964 -46:0:2435 -47:3:966 -48:3:967 -49:0:2435 -50:3:971 -51:3:975 -52:3:976 -53:3:984 -54:3:985 -55:3:989 -56:3:990 -57:3:998 -58:3:1003 -59:3:1004 -60:3:1015 -61:3:1016 -62:3:1027 -63:3:1028 -64:3:1029 -65:3:1040 -66:3:1045 -67:3:1046 -68:0:2435 -69:3:1058 -70:0:2435 -71:3:1060 -72:0:2435 -73:3:1061 -74:0:2435 -75:3:1071 -76:0:2435 -77:3:1075 -78:3:1076 -79:3:1080 -80:3:1084 -81:3:1085 -82:3:1089 -83:3:1097 -84:3:1098 -85:0:2435 -86:3:1106 -87:0:2435 -88:3:1110 -89:3:1111 -90:3:1115 -91:3:1119 -92:3:1120 -93:3:1124 -94:3:1132 -95:3:1133 -96:0:2435 -97:3:1141 -98:0:2435 -99:3:1149 -100:3:1150 -101:3:1154 -102:3:1158 -103:3:1159 -104:3:1163 -105:3:1171 -106:3:1172 -107:0:2435 -108:3:1180 -109:0:2435 -110:3:1182 -111:0:2435 -112:3:1183 -113:3:1187 -114:3:1188 -115:3:1196 -116:3:1197 -117:3:1201 -118:3:1202 -119:3:1210 -120:3:1215 -121:3:1219 -122:3:1220 -123:3:1227 -124:3:1228 -125:3:1239 -126:3:1240 -127:3:1241 -128:3:1252 -129:3:1257 -130:3:1258 -131:0:2435 -132:3:1270 -133:0:2435 -134:3:1272 -135:0:2435 -136:3:1275 -137:3:1276 -138:3:1288 -139:3:1289 -140:3:1293 -141:3:1294 -142:3:1302 -143:3:1307 -144:3:1311 -145:3:1312 -146:3:1319 -147:3:1320 -148:3:1331 -149:3:1332 -150:3:1333 -151:3:1344 -152:3:1349 -153:3:1350 -154:0:2435 -155:3:1362 -156:0:2435 -157:3:1364 -158:0:2435 -159:3:1365 -160:0:2435 -161:3:1366 -162:0:2435 -163:3:1367 -164:0:2435 -165:3:1368 -166:3:1372 -167:3:1373 -168:3:1381 -169:3:1382 -170:3:1386 -171:3:1387 -172:3:1395 -173:3:1400 -174:3:1404 -175:3:1405 -176:3:1412 -177:3:1413 -178:3:1424 -179:3:1425 -180:3:1426 -181:3:1437 -182:3:1442 -183:3:1443 -184:0:2435 -185:3:1455 -186:0:2435 -187:3:1568 -188:0:2435 -189:3:1666 -190:0:2435 -191:3:1667 -192:0:2435 -193:3:1671 -194:0:2435 -195:3:1677 -196:3:1681 -197:3:1682 -198:3:1690 -199:3:1691 -200:3:1695 -201:3:1696 -202:3:1704 -203:3:1709 -204:3:1713 -205:3:1714 -206:3:1721 -207:3:1722 -208:3:1733 -209:3:1734 -210:3:1735 -211:3:1746 -212:3:1751 -213:3:1752 -214:0:2435 -215:3:1764 -216:0:2435 -217:3:1766 -218:0:2435 -219:3:1767 -220:3:1771 -221:3:1772 -222:3:1780 -223:3:1781 -224:3:1785 -225:3:1786 -226:3:1794 -227:3:1799 -228:3:1803 -229:3:1804 -230:3:1811 -231:3:1812 -232:3:1823 -233:3:1824 -234:3:1825 -235:3:1836 -236:3:1841 -237:3:1842 -238:0:2435 -239:3:1854 -240:0:2435 -241:3:1856 -242:0:2435 -243:3:1859 -244:3:1860 -245:3:1872 -246:3:1873 -247:3:1877 -248:3:1878 -249:3:1886 -250:3:1891 -251:3:1895 -252:3:1896 -253:3:1903 -254:3:1904 -255:3:1915 -256:3:1916 -257:3:1917 -258:3:1928 -259:3:1933 -260:3:1934 -261:0:2435 -262:3:1946 -263:0:2435 -264:3:1948 -265:0:2435 -266:3:1949 -267:0:2435 -268:3:1950 -269:0:2435 -270:3:1951 -271:0:2435 -272:3:1952 -273:3:1956 -274:3:1957 -275:3:1965 -276:3:1966 -277:3:1970 -278:3:1971 -279:3:1979 -280:3:1984 -281:3:1988 -282:3:1989 -283:3:1996 -284:3:1997 -285:3:2008 -286:3:2009 -287:3:2010 -288:3:2021 -289:3:2026 -290:3:2027 -291:0:2435 -292:3:2039 -293:0:2435 -294:3:2152 -295:0:2435 -296:3:2250 -297:0:2435 -298:3:2251 -299:0:2435 -300:3:2255 -301:0:2435 -302:3:2264 -303:3:2265 -304:3:2269 -305:3:2273 -306:3:2274 -307:3:2278 -308:3:2286 -309:3:2287 -310:0:2435 -311:3:2295 -312:0:2435 -313:3:2299 -314:3:2300 -315:3:2304 -316:3:2308 -317:3:2309 -318:3:2313 -319:3:2321 -320:3:2322 -321:0:2435 -322:3:2330 -323:0:2435 -324:3:2338 -325:3:2339 -326:3:2343 -327:3:2347 -328:3:2348 -329:3:2352 -330:3:2360 -331:3:2361 -332:0:2435 -333:3:2369 -334:0:2435 -335:3:2371 -336:0:2435 -337:3:2372 -338:0:2435 -339:3:876 -340:0:2435 -341:3:877 -342:3:881 -343:3:882 -344:3:890 -345:3:891 -346:3:895 -347:3:896 -348:3:904 -349:3:909 -350:3:913 -351:3:914 -352:3:921 -353:3:922 -354:3:933 -355:3:934 -356:3:935 -357:3:946 -358:3:951 -359:3:952 -360:0:2435 -361:3:964 -362:0:2435 -363:3:966 -364:3:967 -365:0:2435 -366:3:971 -367:3:975 -368:3:976 -369:3:984 -370:3:985 -371:3:989 -372:3:990 -373:3:998 -374:3:1003 -375:3:1004 -376:3:1015 -377:3:1016 -378:3:1027 -379:3:1028 -380:3:1029 -381:3:1040 -382:3:1045 -383:3:1046 -384:0:2435 -385:3:1058 -386:0:2435 -387:3:1060 -388:0:2435 -389:3:1061 -390:0:2435 -391:3:1071 -392:0:2435 -393:3:1075 -394:3:1076 -395:3:1080 -396:3:1084 -397:3:1085 -398:3:1089 -399:3:1097 -400:3:1098 -401:0:2435 -402:3:1106 -403:0:2435 -404:3:1110 -405:3:1111 -406:3:1115 -407:3:1119 -408:3:1120 -409:3:1124 -410:3:1132 -411:3:1133 -412:0:2435 -413:3:1141 -414:0:2435 -415:3:1149 -416:3:1150 -417:3:1154 -418:3:1158 -419:3:1159 -420:3:1163 -421:3:1171 -422:3:1172 -423:0:2435 -424:3:1180 -425:0:2435 -426:3:1182 -427:0:2435 -428:3:1183 -429:3:1187 -430:3:1188 -431:3:1196 -432:3:1197 -433:3:1201 -434:3:1202 -435:3:1210 -436:3:1215 -437:3:1219 -438:3:1220 -439:3:1227 -440:3:1228 -441:3:1239 -442:3:1240 -443:3:1241 -444:3:1252 -445:3:1257 -446:3:1258 -447:0:2435 -448:3:1270 -449:0:2435 -450:3:1272 -451:0:2435 -452:3:1275 -453:3:1276 -454:3:1288 -455:3:1289 -456:3:1293 -457:3:1294 -458:3:1302 -459:3:1307 -460:3:1311 -461:3:1312 -462:3:1319 -463:3:1320 -464:3:1331 -465:3:1332 -466:3:1333 -467:3:1344 -468:3:1349 -469:3:1350 -470:0:2435 -471:3:1362 -472:0:2435 -473:3:1364 -474:0:2435 -475:3:1365 -476:0:2435 -477:3:1366 -478:0:2435 -479:3:1367 -480:0:2435 -481:3:1368 -482:3:1372 -483:3:1373 -484:3:1381 -485:3:1382 -486:3:1386 -487:3:1387 -488:3:1395 -489:3:1400 -490:3:1404 -491:3:1405 -492:3:1412 -493:3:1413 -494:3:1424 -495:3:1425 -496:3:1426 -497:3:1437 -498:3:1442 -499:3:1443 -500:0:2435 -501:3:1455 -502:0:2435 -503:3:1568 -504:0:2435 -505:3:1666 -506:0:2435 -507:3:1667 -508:0:2435 -509:3:1671 -510:0:2435 -511:3:1677 -512:3:1681 -513:3:1682 -514:3:1690 -515:3:1691 -516:3:1695 -517:3:1696 -518:3:1704 -519:3:1709 -520:3:1713 -521:3:1714 -522:3:1721 -523:3:1722 -524:3:1733 -525:3:1734 -526:3:1735 -527:3:1746 -528:3:1751 -529:3:1752 -530:0:2435 -531:3:1764 -532:0:2435 -533:3:1766 -534:0:2435 -535:3:1767 -536:3:1771 -537:3:1772 -538:3:1780 -539:3:1781 -540:3:1785 -541:3:1786 -542:3:1794 -543:3:1799 -544:3:1803 -545:3:1804 -546:3:1811 -547:3:1812 -548:3:1823 -549:3:1824 -550:3:1825 -551:3:1836 -552:3:1841 -553:3:1842 -554:0:2435 -555:3:1854 -556:0:2435 -557:3:1856 -558:0:2435 -559:3:1859 -560:3:1860 -561:3:1872 -562:3:1873 -563:3:1877 -564:3:1878 -565:3:1886 -566:3:1891 -567:3:1895 -568:3:1896 -569:3:1903 -570:3:1904 -571:3:1915 -572:3:1916 -573:3:1917 -574:3:1928 -575:3:1933 -576:3:1934 -577:0:2435 -578:3:1946 -579:0:2435 -580:3:1948 -581:0:2435 -582:3:1949 -583:0:2435 -584:3:1950 -585:0:2435 -586:3:1951 -587:0:2435 -588:3:1952 -589:3:1956 -590:3:1957 -591:3:1965 -592:3:1966 -593:3:1970 -594:3:1971 -595:3:1979 -596:3:1984 -597:3:1988 -598:3:1989 -599:3:1996 -600:3:1997 -601:3:2008 -602:3:2009 -603:3:2010 -604:3:2021 -605:3:2026 -606:3:2027 -607:0:2435 -608:3:2039 -609:0:2435 -610:3:2152 -611:0:2435 -612:3:2250 -613:0:2435 -614:3:2251 -615:0:2435 -616:3:2255 -617:0:2435 -618:3:2264 -619:3:2265 -620:3:2269 -621:3:2273 -622:3:2274 -623:3:2278 -624:3:2286 -625:3:2287 -626:0:2435 -627:3:2295 -628:0:2435 -629:3:2299 -630:3:2300 -631:3:2304 -632:3:2308 -633:3:2309 -634:3:2313 -635:3:2321 -636:3:2322 -637:0:2435 -638:3:2330 -639:0:2435 -640:3:2338 -641:3:2339 -642:3:2343 -643:3:2347 -644:3:2348 -645:3:2352 -646:3:2360 -647:3:2361 -648:0:2435 -649:3:2369 -650:0:2435 -651:3:2371 -652:0:2435 -653:3:2372 -654:0:2435 -655:3:876 -656:0:2435 -657:3:877 -658:3:881 -659:3:882 -660:3:890 -661:3:891 -662:3:895 -663:3:896 -664:3:904 -665:3:909 -666:3:913 -667:3:914 -668:3:921 -669:3:922 -670:3:933 -671:3:934 -672:3:935 -673:3:946 -674:3:951 -675:3:952 -676:0:2435 -677:3:964 -678:0:2435 -679:3:966 -680:3:967 -681:0:2435 -682:3:971 -683:3:975 -684:3:976 -685:3:984 -686:3:985 -687:3:989 -688:3:990 -689:3:998 -690:3:1003 -691:3:1004 -692:3:1015 -693:3:1016 -694:3:1027 -695:3:1028 -696:3:1029 -697:3:1040 -698:3:1045 -699:3:1046 -700:0:2435 -701:3:1058 -702:0:2435 -703:3:1060 -704:0:2435 -705:3:1061 -706:0:2435 -707:3:1071 -708:0:2435 -709:3:1075 -710:3:1076 -711:3:1080 -712:3:1084 -713:3:1085 -714:3:1089 -715:3:1097 -716:3:1098 -717:0:2435 -718:3:1106 -719:0:2435 -720:3:1110 -721:3:1111 -722:3:1115 -723:3:1119 -724:3:1120 -725:3:1124 -726:3:1132 -727:3:1133 -728:0:2435 -729:3:1141 -730:0:2435 -731:3:1149 -732:3:1150 -733:3:1154 -734:3:1158 -735:3:1159 -736:3:1163 -737:3:1171 -738:3:1172 -739:0:2435 -740:3:1180 -741:0:2435 -742:3:1182 -743:0:2435 -744:3:1183 -745:3:1187 -746:3:1188 -747:3:1196 -748:3:1197 -749:3:1201 -750:3:1202 -751:3:1210 -752:3:1215 -753:3:1219 -754:3:1220 -755:3:1227 -756:3:1228 -757:3:1239 -758:3:1240 -759:3:1241 -760:3:1252 -761:3:1257 -762:3:1258 -763:0:2435 -764:3:1270 -765:0:2435 -766:3:1272 -767:0:2435 -768:3:1275 -769:3:1276 -770:3:1288 -771:3:1289 -772:3:1293 -773:3:1294 -774:3:1302 -775:3:1307 -776:3:1311 -777:3:1312 -778:3:1319 -779:3:1320 -780:3:1331 -781:3:1332 -782:3:1333 -783:3:1344 -784:3:1349 -785:3:1350 -786:0:2435 -787:3:1362 -788:0:2435 -789:3:1364 -790:0:2435 -791:3:1365 -792:0:2435 -793:3:1366 -794:0:2435 -795:3:1367 -796:0:2435 -797:3:1368 -798:3:1372 -799:3:1373 -800:3:1381 -801:3:1382 -802:3:1386 -803:3:1387 -804:3:1395 -805:3:1400 -806:3:1404 -807:3:1405 -808:3:1412 -809:3:1413 -810:3:1424 -811:3:1425 -812:3:1426 -813:3:1437 -814:3:1442 -815:3:1443 -816:0:2435 -817:3:1455 -818:0:2435 -819:3:1568 -820:0:2435 -821:3:1666 -822:0:2435 -823:3:1667 -824:0:2435 -825:3:1671 -826:0:2435 -827:3:1677 -828:3:1681 -829:3:1682 -830:3:1690 -831:3:1691 -832:3:1695 -833:3:1696 -834:3:1704 -835:3:1709 -836:3:1713 -837:3:1714 -838:3:1721 -839:3:1722 -840:3:1733 -841:3:1734 -842:3:1735 -843:3:1746 -844:3:1751 -845:3:1752 -846:0:2435 -847:3:1764 -848:0:2435 -849:3:1766 -850:0:2435 -851:3:1767 -852:3:1771 -853:3:1772 -854:3:1780 -855:3:1781 -856:3:1785 -857:3:1786 -858:3:1794 -859:3:1799 -860:3:1803 -861:3:1804 -862:3:1811 -863:3:1812 -864:3:1823 -865:3:1824 -866:3:1825 -867:3:1836 -868:3:1841 -869:3:1842 -870:0:2435 -871:3:1854 -872:0:2435 -873:3:1856 -874:0:2435 -875:3:1859 -876:3:1860 -877:3:1872 -878:3:1873 -879:3:1877 -880:3:1878 -881:3:1886 -882:3:1891 -883:3:1895 -884:3:1896 -885:3:1903 -886:3:1904 -887:3:1915 -888:3:1916 -889:3:1917 -890:3:1928 -891:3:1933 -892:3:1934 -893:0:2435 -894:3:1946 -895:0:2435 -896:3:1948 -897:0:2435 -898:3:1949 -899:0:2435 -900:3:1950 -901:0:2435 -902:3:1951 -903:0:2435 -904:3:1952 -905:3:1956 -906:3:1957 -907:3:1965 -908:3:1966 -909:3:1970 -910:3:1971 -911:3:1979 -912:3:1984 -913:3:1988 -914:3:1989 -915:3:1996 -916:3:1997 -917:3:2008 -918:3:2009 -919:3:2010 -920:3:2021 -921:3:2026 -922:3:2027 -923:0:2435 -924:3:2039 -925:0:2435 -926:3:2152 -927:0:2435 -928:3:2250 -929:0:2435 -930:3:2251 -931:0:2435 -932:3:2255 -933:0:2435 -934:3:2264 -935:3:2265 -936:3:2269 -937:3:2273 -938:3:2274 -939:3:2278 -940:3:2286 -941:3:2287 -942:0:2435 -943:3:2295 -944:0:2435 -945:3:2299 -946:3:2300 -947:3:2304 -948:3:2308 -949:3:2309 -950:3:2313 -951:3:2321 -952:3:2322 -953:0:2435 -954:3:2330 -955:0:2435 -956:3:2338 -957:3:2339 -958:3:2343 -959:3:2347 -960:3:2348 -961:3:2352 -962:3:2360 -963:3:2361 -964:0:2435 -965:3:2369 -966:0:2435 -967:3:2371 -968:0:2435 -969:3:2372 -970:0:2435 -971:3:876 -972:0:2435 -973:3:877 -974:3:881 -975:3:882 -976:3:890 -977:3:891 -978:3:895 -979:3:896 -980:3:904 -981:3:909 -982:3:913 -983:3:914 -984:3:921 -985:3:922 -986:3:933 -987:3:934 -988:3:935 -989:3:946 -990:3:951 -991:3:952 -992:0:2435 -993:3:964 -994:0:2435 -995:3:966 -996:3:967 -997:0:2435 -998:3:971 -999:3:975 -1000:3:976 -1001:3:984 -1002:3:985 -1003:3:989 -1004:3:990 -1005:3:998 -1006:3:1003 -1007:3:1004 -1008:3:1015 -1009:3:1016 -1010:3:1027 -1011:3:1028 -1012:3:1029 -1013:3:1040 -1014:3:1045 -1015:3:1046 -1016:0:2435 -1017:3:1058 -1018:0:2435 -1019:3:1060 -1020:0:2435 -1021:3:1061 -1022:0:2435 -1023:3:1071 -1024:0:2435 -1025:3:1075 -1026:3:1076 -1027:3:1080 -1028:3:1084 -1029:3:1085 -1030:3:1089 -1031:3:1097 -1032:3:1098 -1033:0:2435 -1034:3:1106 -1035:0:2435 -1036:3:1110 -1037:3:1111 -1038:3:1115 -1039:3:1119 -1040:3:1120 -1041:3:1124 -1042:3:1132 -1043:3:1133 -1044:0:2435 -1045:3:1141 -1046:0:2435 -1047:3:1149 -1048:3:1150 -1049:3:1154 -1050:3:1158 -1051:3:1159 -1052:3:1163 -1053:3:1171 -1054:3:1172 -1055:0:2435 -1056:3:1180 -1057:0:2435 -1058:3:1182 -1059:0:2435 -1060:3:1183 -1061:3:1187 -1062:3:1188 -1063:3:1196 -1064:3:1197 -1065:3:1201 -1066:3:1202 -1067:3:1210 -1068:3:1215 -1069:3:1219 -1070:3:1220 -1071:3:1227 -1072:3:1228 -1073:3:1239 -1074:3:1240 -1075:3:1241 -1076:3:1252 -1077:3:1257 -1078:3:1258 -1079:0:2435 -1080:3:1270 -1081:0:2435 -1082:3:1272 -1083:0:2435 -1084:3:1275 -1085:3:1276 -1086:3:1288 -1087:3:1289 -1088:3:1293 -1089:3:1294 -1090:3:1302 -1091:3:1307 -1092:3:1311 -1093:3:1312 -1094:3:1319 -1095:3:1320 -1096:3:1331 -1097:3:1332 -1098:3:1333 -1099:3:1344 -1100:3:1349 -1101:3:1350 -1102:0:2435 -1103:3:1362 -1104:0:2435 -1105:3:1364 -1106:0:2435 -1107:3:1365 -1108:0:2435 -1109:3:1366 -1110:0:2435 -1111:3:1367 -1112:0:2435 -1113:3:1368 -1114:3:1372 -1115:3:1373 -1116:3:1381 -1117:3:1382 -1118:3:1386 -1119:3:1387 -1120:3:1395 -1121:3:1400 -1122:3:1404 -1123:3:1405 -1124:3:1412 -1125:3:1413 -1126:3:1424 -1127:3:1425 -1128:3:1426 -1129:3:1437 -1130:3:1442 -1131:3:1443 -1132:0:2435 -1133:3:1455 -1134:0:2435 -1135:3:1568 -1136:0:2435 -1137:3:1666 -1138:0:2435 -1139:3:1667 -1140:0:2435 -1141:3:1671 -1142:0:2435 -1143:3:1677 -1144:3:1681 -1145:3:1682 -1146:3:1690 -1147:3:1691 -1148:3:1695 -1149:3:1696 -1150:3:1704 -1151:3:1709 -1152:3:1713 -1153:3:1714 -1154:3:1721 -1155:3:1722 -1156:3:1733 -1157:3:1734 -1158:3:1735 -1159:3:1746 -1160:3:1751 -1161:3:1752 -1162:0:2435 -1163:3:1764 -1164:0:2435 -1165:3:1766 -1166:0:2435 -1167:3:1767 -1168:3:1771 -1169:3:1772 -1170:3:1780 -1171:3:1781 -1172:3:1785 -1173:3:1786 -1174:3:1794 -1175:3:1799 -1176:3:1803 -1177:3:1804 -1178:3:1811 -1179:3:1812 -1180:3:1823 -1181:3:1824 -1182:3:1825 -1183:3:1836 -1184:3:1841 -1185:3:1842 -1186:0:2435 -1187:3:1854 -1188:0:2435 -1189:3:1856 -1190:0:2435 -1191:3:1859 -1192:3:1860 -1193:3:1872 -1194:3:1873 -1195:3:1877 -1196:3:1878 -1197:3:1886 -1198:3:1891 -1199:3:1895 -1200:3:1896 -1201:3:1903 -1202:3:1904 -1203:3:1915 -1204:3:1916 -1205:3:1917 -1206:3:1928 -1207:3:1933 -1208:3:1934 -1209:0:2435 -1210:3:1946 -1211:0:2435 -1212:3:1948 -1213:0:2435 -1214:3:1949 -1215:0:2435 -1216:3:1950 -1217:0:2435 -1218:3:1951 -1219:0:2435 -1220:3:1952 -1221:3:1956 -1222:3:1957 -1223:3:1965 -1224:3:1966 -1225:3:1970 -1226:3:1971 -1227:3:1979 -1228:3:1984 -1229:3:1988 -1230:3:1989 -1231:3:1996 -1232:3:1997 -1233:3:2008 -1234:3:2009 -1235:3:2010 -1236:3:2021 -1237:3:2026 -1238:3:2027 -1239:0:2435 -1240:3:2039 -1241:0:2435 -1242:3:2152 -1243:0:2435 -1244:3:2250 -1245:0:2435 -1246:3:2251 -1247:0:2435 -1248:3:2255 -1249:0:2435 -1250:3:2264 -1251:3:2265 -1252:3:2269 -1253:3:2273 -1254:3:2274 -1255:3:2278 -1256:3:2286 -1257:3:2287 -1258:0:2435 -1259:3:2295 -1260:0:2435 -1261:3:2299 -1262:3:2300 -1263:3:2304 -1264:3:2308 -1265:3:2309 -1266:3:2313 -1267:3:2321 -1268:3:2322 -1269:0:2435 -1270:3:2330 -1271:0:2435 -1272:3:2338 -1273:3:2339 -1274:3:2343 -1275:3:2347 -1276:3:2348 -1277:3:2352 -1278:3:2360 -1279:3:2361 -1280:0:2435 -1281:3:2369 -1282:0:2435 -1283:3:2371 -1284:0:2435 -1285:3:2372 -1286:0:2435 -1287:3:876 -1288:0:2435 -1289:3:877 -1290:3:881 -1291:3:882 -1292:3:890 -1293:3:891 -1294:3:895 -1295:3:896 -1296:3:904 -1297:3:909 -1298:3:913 -1299:3:914 -1300:3:921 -1301:3:922 -1302:3:933 -1303:3:934 -1304:3:935 -1305:3:946 -1306:3:951 -1307:3:952 -1308:0:2435 -1309:3:964 -1310:0:2435 -1311:3:966 -1312:3:967 -1313:0:2435 -1314:3:971 -1315:3:975 -1316:3:976 -1317:3:984 -1318:3:985 -1319:3:989 -1320:3:990 -1321:3:998 -1322:3:1011 -1323:3:1012 -1324:3:1015 -1325:3:1016 -1326:3:1027 -1327:3:1028 -1328:3:1029 -1329:3:1040 -1330:3:1045 -1331:3:1048 -1332:3:1049 -1333:0:2435 -1334:3:1058 -1335:0:2435 -1336:3:1060 -1337:0:2435 -1338:3:1061 -1339:0:2435 -1340:3:1071 -1341:0:2435 -1342:2:458 -1343:0:2435 -1344:2:464 -1345:0:2435 -1346:2:465 -1347:0:2435 -1348:2:466 -1349:0:2435 -1350:2:467 -1351:0:2435 -1352:1:2 -1353:0:2435 -1354:2:468 -1355:0:2435 -1356:1:8 -1357:0:2435 -1358:1:9 -1359:0:2435 -1360:1:10 -1361:0:2435 -1362:1:11 -1363:0:2435 -1364:2:467 -1365:0:2435 -1366:1:12 -1367:1:16 -1368:1:17 -1369:1:25 -1370:1:26 -1371:1:30 -1372:1:31 -1373:1:39 -1374:1:44 -1375:1:48 -1376:1:49 -1377:1:56 -1378:1:57 -1379:1:68 -1380:1:69 -1381:1:70 -1382:1:81 -1383:1:86 -1384:1:87 -1385:0:2435 -1386:2:468 -1387:0:2435 -1388:3:1075 -1389:3:1076 -1390:3:1080 -1391:3:1084 -1392:3:1085 -1393:3:1089 -1394:3:1094 -1395:0:2435 -1396:3:1106 -1397:0:2435 -1398:3:1110 -1399:3:1111 -1400:3:1115 -1401:3:1119 -1402:3:1120 -1403:3:1124 -1404:3:1132 -1405:3:1133 -1406:0:2435 -1407:3:1141 -1408:0:2435 -1409:3:1149 -1410:3:1150 -1411:3:1154 -1412:3:1158 -1413:3:1159 -1414:3:1163 -1415:3:1171 -1416:3:1172 -1417:0:2435 -1418:3:1180 -1419:0:2435 -1420:3:1182 -1421:0:2435 -1422:3:1183 -1423:3:1187 -1424:3:1188 -1425:3:1196 -1426:3:1197 -1427:3:1201 -1428:3:1202 -1429:3:1210 -1430:3:1215 -1431:3:1219 -1432:3:1220 -1433:3:1227 -1434:3:1228 -1435:3:1239 -1436:3:1240 -1437:3:1241 -1438:3:1252 -1439:3:1257 -1440:3:1258 -1441:0:2435 -1442:3:1270 -1443:0:2435 -1444:3:1272 -1445:0:2435 -1446:3:1275 -1447:3:1276 -1448:3:1288 -1449:3:1289 -1450:3:1293 -1451:3:1294 -1452:3:1302 -1453:3:1307 -1454:3:1311 -1455:3:1312 -1456:3:1319 -1457:3:1320 -1458:3:1331 -1459:3:1332 -1460:3:1333 -1461:3:1344 -1462:3:1349 -1463:3:1350 -1464:0:2435 -1465:3:1362 -1466:0:2435 -1467:3:1364 -1468:0:2435 -1469:3:1365 -1470:0:2435 -1471:3:1366 -1472:0:2435 -1473:3:1367 -1474:0:2435 -1475:3:1368 -1476:3:1372 -1477:3:1373 -1478:3:1381 -1479:3:1382 -1480:3:1386 -1481:3:1387 -1482:3:1395 -1483:3:1400 -1484:3:1404 -1485:3:1405 -1486:3:1412 -1487:3:1413 -1488:3:1424 -1489:3:1425 -1490:3:1426 -1491:3:1437 -1492:3:1442 -1493:3:1443 -1494:0:2435 -1495:3:1455 -1496:0:2435 -1497:3:1568 -1498:0:2435 -1499:3:1666 -1500:0:2435 -1501:3:1667 -1502:0:2435 -1503:3:1671 -1504:0:2435 -1505:3:1677 -1506:3:1681 -1507:3:1682 -1508:3:1690 -1509:3:1691 -1510:3:1695 -1511:3:1696 -1512:3:1704 -1513:3:1709 -1514:3:1713 -1515:3:1714 -1516:3:1721 -1517:3:1722 -1518:3:1733 -1519:3:1734 -1520:3:1735 -1521:3:1746 -1522:3:1751 -1523:3:1752 -1524:0:2435 -1525:3:1764 -1526:0:2435 -1527:3:1766 -1528:0:2435 -1529:3:1767 -1530:3:1771 -1531:3:1772 -1532:3:1780 -1533:3:1781 -1534:3:1785 -1535:3:1786 -1536:3:1794 -1537:3:1799 -1538:3:1803 -1539:3:1804 -1540:3:1811 -1541:3:1812 -1542:3:1823 -1543:3:1824 -1544:3:1825 -1545:3:1836 -1546:3:1841 -1547:3:1842 -1548:0:2435 -1549:3:1854 -1550:0:2435 -1551:3:1856 -1552:0:2435 -1553:3:1859 -1554:3:1860 -1555:3:1872 -1556:3:1873 -1557:3:1877 -1558:3:1878 -1559:3:1886 -1560:3:1891 -1561:3:1895 -1562:3:1896 -1563:3:1903 -1564:3:1904 -1565:3:1915 -1566:3:1916 -1567:3:1917 -1568:3:1928 -1569:3:1933 -1570:3:1934 -1571:0:2435 -1572:3:1946 -1573:0:2435 -1574:3:1948 -1575:0:2435 -1576:3:1949 -1577:0:2435 -1578:3:1950 -1579:0:2435 -1580:3:1951 -1581:0:2435 -1582:3:1952 -1583:3:1956 -1584:3:1957 -1585:3:1965 -1586:3:1966 -1587:3:1970 -1588:3:1971 -1589:3:1979 -1590:3:1984 -1591:3:1988 -1592:3:1989 -1593:3:1996 -1594:3:1997 -1595:3:2008 -1596:3:2009 -1597:3:2010 -1598:3:2021 -1599:3:2026 -1600:3:2027 -1601:0:2435 -1602:3:2039 -1603:0:2435 -1604:3:2152 -1605:0:2435 -1606:3:2250 -1607:0:2435 -1608:3:2251 -1609:0:2435 -1610:3:2255 -1611:0:2435 -1612:3:2264 -1613:3:2265 -1614:3:2269 -1615:3:2273 -1616:3:2274 -1617:3:2278 -1618:3:2286 -1619:3:2287 -1620:0:2435 -1621:3:2295 -1622:0:2435 -1623:3:2299 -1624:3:2300 -1625:3:2304 -1626:3:2308 -1627:3:2309 -1628:3:2313 -1629:3:2321 -1630:3:2322 -1631:0:2435 -1632:3:2330 -1633:0:2435 -1634:3:2338 -1635:3:2339 -1636:3:2343 -1637:3:2347 -1638:3:2348 -1639:3:2352 -1640:3:2360 -1641:3:2361 -1642:0:2435 -1643:3:2369 -1644:0:2435 -1645:3:2371 -1646:0:2435 -1647:3:2372 -1648:0:2435 -1649:3:2375 -1650:0:2435 -1651:3:2380 -1652:0:2435 -1653:2:467 -1654:0:2435 -1655:3:2381 -1656:0:2435 -1657:1:99 -1658:0:2435 -1659:3:2380 -1660:0:2435 -1661:2:468 -1662:0:2435 -1663:3:2381 -1664:0:2435 -1665:2:469 -1666:0:2435 -1667:3:2380 -1668:0:2435 -1669:2:475 -1670:0:2435 -1671:3:2381 -1672:0:2435 -1673:2:476 -1674:0:2435 -1675:3:2380 -1676:0:2435 -1677:2:477 -1678:2:481 -1679:2:482 -1680:2:490 -1681:2:491 -1682:2:495 -1683:2:496 -1684:2:504 -1685:2:509 -1686:2:513 -1687:2:514 -1688:2:521 -1689:2:522 -1690:2:533 -1691:2:534 -1692:2:535 -1693:2:546 -1694:2:558 -1695:2:559 -1696:0:2435 -1697:3:2381 -1698:0:2435 -1699:2:564 -1700:0:2435 -1701:3:2380 -1702:0:2435 -1703:2:565 -1704:2:569 -1705:2:570 -1706:2:578 -1707:2:579 -1708:2:583 -1709:2:584 -1710:2:592 -1711:2:597 -1712:2:601 -1713:2:602 -1714:2:609 -1715:2:610 -1716:2:621 -1717:2:622 -1718:2:623 -1719:2:634 -1720:2:646 -1721:2:647 -1722:0:2435 -1723:3:2381 -1724:0:2435 -1725:2:652 -1726:0:2435 -1727:3:2380 -1728:0:2435 -1729:2:653 -1730:0:2435 -1731:3:2381 -1732:0:2435 -1733:2:654 -1734:2:658 -1735:2:659 -1736:2:667 -1737:2:668 -1738:2:672 -1739:2:673 -1740:2:681 -1741:2:686 -1742:2:690 -1743:2:691 -1744:2:698 -1745:2:699 -1746:2:710 -1747:2:711 -1748:2:712 -1749:2:723 -1750:2:735 -1751:2:736 -1752:0:2435 -1753:3:2380 -1754:0:2435 -1755:2:741 -1756:0:2435 -1757:3:2381 -1758:0:2435 -1759:2:750 -1760:0:2435 -1761:3:2380 -1762:0:2435 -1763:2:753 -1764:0:2435 -1765:3:2381 -1766:0:2435 -1767:2:758 -1768:0:2435 -1769:3:2380 -1770:0:2435 -1771:2:759 -1772:0:2433 -1773:3:2381 -1774:0:2439 -1775:0:2435 diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_wmb.define b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_wmb.log b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_wmb.log deleted file mode 100644 index 0423ec5..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_wmb.log +++ /dev/null @@ -1,320 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_wmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -Depth= 10656 States= 1e+06 Transitions= 8.86e+06 Memory= 534.807 t= 7.38 R= 1e+05 -Depth= 35214 States= 2e+06 Transitions= 1.82e+07 Memory= 603.557 t= 15.5 R= 1e+05 -Depth= 35214 States= 3e+06 Transitions= 2.73e+07 Memory= 672.209 t= 23.8 R= 1e+05 -pan: resizing hashtable to -w22.. done -Depth= 35214 States= 4e+06 Transitions= 4.08e+07 Memory= 771.885 t= 35.9 R= 1e+05 -pan: claim violated! (at depth 1650) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 64 byte, depth reached 35214, errors: 1 - 4154272 states, stored - 38595853 states, matched - 42750125 transitions (= stored+matched) -1.4058824e+08 atomic steps -hash conflicts: 21492325 (resolved) - -Stats on memory usage (in Megabytes): - 364.488 equivalent memory usage for states (stored*(State-vector + overhead)) - 292.863 actual memory usage for states (compression: 80.35%) - state-vector as stored = 46 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 782.529 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 227, "(1)" - line 408, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 256, "(1)" - line 418, "pan.___", state 286, "(1)" - line 399, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 366, "(1)" - line 408, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 395, "(1)" - line 418, "pan.___", state 425, "(1)" - line 540, "pan.___", state 456, "-end-" - (19 of 456 states) -unreached in proctype urcu_reader_sig - line 399, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 70, "(1)" - line 418, "pan.___", state 100, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 247, "(1)" - line 418, "pan.___", state 277, "(1)" - line 399, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 330, "(1)" - line 408, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 359, "(1)" - line 418, "pan.___", state 389, "(1)" - line 614, "pan.___", state 411, "-end-" - (18 of 411 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 20, "(1)" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 34, "(1)" - line 403, "pan.___", state 35, "(1)" - line 403, "pan.___", state 35, "(1)" - line 401, "pan.___", state 40, "((i<1))" - line 401, "pan.___", state 40, "((i>=1))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 59, "(1)" - line 409, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 60, "else" - line 409, "pan.___", state 63, "(1)" - line 409, "pan.___", state 64, "(1)" - line 409, "pan.___", state 64, "(1)" - line 413, "pan.___", state 72, "(1)" - line 413, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 73, "else" - line 413, "pan.___", state 76, "(1)" - line 413, "pan.___", state 77, "(1)" - line 413, "pan.___", state 77, "(1)" - line 411, "pan.___", state 82, "((i<1))" - line 411, "pan.___", state 82, "((i>=1))" - line 418, "pan.___", state 89, "(1)" - line 418, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 90, "else" - line 418, "pan.___", state 93, "(1)" - line 418, "pan.___", state 94, "(1)" - line 418, "pan.___", state 94, "(1)" - line 420, "pan.___", state 97, "(1)" - line 420, "pan.___", state 97, "(1)" - line 369, "pan.___", state 99, "(1)" - line 639, "pan.___", state 103, "cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )] = (old_gen+1)" - line 637, "pan.___", state 104, "old_gen = cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )]" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 114, "(1)" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 128, "(1)" - line 403, "pan.___", state 129, "(1)" - line 403, "pan.___", state 129, "(1)" - line 401, "pan.___", state 134, "((i<1))" - line 401, "pan.___", state 134, "((i>=1))" - line 409, "pan.___", state 153, "(1)" - line 409, "pan.___", state 154, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 154, "else" - line 409, "pan.___", state 157, "(1)" - line 409, "pan.___", state 158, "(1)" - line 409, "pan.___", state 158, "(1)" - line 413, "pan.___", state 166, "(1)" - line 413, "pan.___", state 167, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 167, "else" - line 413, "pan.___", state 170, "(1)" - line 413, "pan.___", state 171, "(1)" - line 413, "pan.___", state 171, "(1)" - line 411, "pan.___", state 176, "((i<1))" - line 411, "pan.___", state 176, "((i>=1))" - line 418, "pan.___", state 183, "(1)" - line 418, "pan.___", state 184, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 184, "else" - line 418, "pan.___", state 187, "(1)" - line 418, "pan.___", state 188, "(1)" - line 418, "pan.___", state 188, "(1)" - line 420, "pan.___", state 191, "(1)" - line 420, "pan.___", state 191, "(1)" - line 369, "pan.___", state 193, "(1)" - line 652, "pan.___", state 199, "(1)" - line 646, "pan.___", state 202, "((write_lock==0))" - line 646, "pan.___", state 202, "else" - line 644, "pan.___", state 203, "(1)" - line 160, "pan.___", state 209, "(1)" - line 164, "pan.___", state 217, "(1)" - line 164, "pan.___", state 218, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 164, "pan.___", state 218, "else" - line 162, "pan.___", state 223, "((j<1))" - line 162, "pan.___", state 223, "((j>=1))" - line 168, "pan.___", state 229, "(1)" - line 168, "pan.___", state 230, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 168, "pan.___", state 230, "else" - line 160, "pan.___", state 241, "(1)" - line 168, "pan.___", state 261, "(1)" - line 160, "pan.___", state 277, "(1)" - line 164, "pan.___", state 285, "(1)" - line 168, "pan.___", state 297, "(1)" - line 399, "pan.___", state 311, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 325, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 343, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 356, "(1)" - line 413, "pan.___", state 369, "(1)" - line 418, "pan.___", state 386, "(1)" - line 399, "pan.___", state 405, "(1)" - line 403, "pan.___", state 417, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 435, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 461, "(1)" - line 418, "pan.___", state 478, "(1)" - line 403, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 554, "(1)" - line 418, "pan.___", state 571, "(1)" - line 164, "pan.___", state 594, "(1)" - line 168, "pan.___", state 606, "(1)" - line 160, "pan.___", state 618, "(1)" - line 168, "pan.___", state 638, "(1)" - line 164, "pan.___", state 662, "(1)" - line 168, "pan.___", state 674, "(1)" - line 399, "pan.___", state 696, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 698, "(1)" - line 399, "pan.___", state 699, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 699, "else" - line 399, "pan.___", state 702, "(1)" - line 403, "pan.___", state 710, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 712, "(1)" - line 403, "pan.___", state 713, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 713, "else" - line 403, "pan.___", state 716, "(1)" - line 403, "pan.___", state 717, "(1)" - line 403, "pan.___", state 717, "(1)" - line 401, "pan.___", state 722, "((i<1))" - line 401, "pan.___", state 722, "((i>=1))" - line 408, "pan.___", state 728, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 741, "(1)" - line 409, "pan.___", state 742, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 742, "else" - line 409, "pan.___", state 745, "(1)" - line 409, "pan.___", state 746, "(1)" - line 409, "pan.___", state 746, "(1)" - line 413, "pan.___", state 754, "(1)" - line 413, "pan.___", state 755, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 755, "else" - line 413, "pan.___", state 758, "(1)" - line 413, "pan.___", state 759, "(1)" - line 413, "pan.___", state 759, "(1)" - line 411, "pan.___", state 764, "((i<1))" - line 411, "pan.___", state 764, "((i>=1))" - line 418, "pan.___", state 771, "(1)" - line 418, "pan.___", state 772, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 772, "else" - line 418, "pan.___", state 775, "(1)" - line 418, "pan.___", state 776, "(1)" - line 418, "pan.___", state 776, "(1)" - line 420, "pan.___", state 779, "(1)" - line 420, "pan.___", state 779, "(1)" - line 403, "pan.___", state 810, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 828, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 854, "(1)" - line 418, "pan.___", state 871, "(1)" - line 403, "pan.___", state 900, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 918, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 944, "(1)" - line 418, "pan.___", state 961, "(1)" - line 399, "pan.___", state 980, "(1)" - line 403, "pan.___", state 992, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1010, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1036, "(1)" - line 418, "pan.___", state 1053, "(1)" - line 403, "pan.___", state 1085, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1103, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1129, "(1)" - line 418, "pan.___", state 1146, "(1)" - line 164, "pan.___", state 1169, "(1)" - line 168, "pan.___", state 1181, "(1)" - line 160, "pan.___", state 1193, "(1)" - line 168, "pan.___", state 1213, "(1)" - line 164, "pan.___", state 1237, "(1)" - line 168, "pan.___", state 1249, "(1)" - line 399, "pan.___", state 1271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1273, "(1)" - line 399, "pan.___", state 1274, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1274, "else" - line 399, "pan.___", state 1277, "(1)" - line 403, "pan.___", state 1285, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 1287, "(1)" - line 403, "pan.___", state 1288, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 1288, "else" - line 403, "pan.___", state 1291, "(1)" - line 403, "pan.___", state 1292, "(1)" - line 403, "pan.___", state 1292, "(1)" - line 401, "pan.___", state 1297, "((i<1))" - line 401, "pan.___", state 1297, "((i>=1))" - line 408, "pan.___", state 1303, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1316, "(1)" - line 409, "pan.___", state 1317, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 1317, "else" - line 409, "pan.___", state 1320, "(1)" - line 409, "pan.___", state 1321, "(1)" - line 409, "pan.___", state 1321, "(1)" - line 413, "pan.___", state 1329, "(1)" - line 413, "pan.___", state 1330, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 1330, "else" - line 413, "pan.___", state 1333, "(1)" - line 413, "pan.___", state 1334, "(1)" - line 413, "pan.___", state 1334, "(1)" - line 411, "pan.___", state 1339, "((i<1))" - line 411, "pan.___", state 1339, "((i>=1))" - line 418, "pan.___", state 1346, "(1)" - line 418, "pan.___", state 1347, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 1347, "else" - line 418, "pan.___", state 1350, "(1)" - line 418, "pan.___", state 1351, "(1)" - line 418, "pan.___", state 1351, "(1)" - line 420, "pan.___", state 1354, "(1)" - line 420, "pan.___", state 1354, "(1)" - line 164, "pan.___", state 1379, "(1)" - line 168, "pan.___", state 1391, "(1)" - line 160, "pan.___", state 1403, "(1)" - line 168, "pan.___", state 1423, "(1)" - line 164, "pan.___", state 1447, "(1)" - line 168, "pan.___", state 1459, "(1)" - line 702, "pan.___", state 1484, "-end-" - (160 of 1484 states) -unreached in proctype :init: - line 709, "pan.___", state 9, "((j<2))" - line 709, "pan.___", state 9, "((j>=2))" - line 710, "pan.___", state 20, "((j<2))" - line 710, "pan.___", state 20, "((j>=2))" - line 715, "pan.___", state 33, "((j<2))" - line 715, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 749, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 37.6 seconds -pan: rate 110515.35 states/second -pan: avg transition delay 8.793e-07 usec -cp .input.spin urcu_free_no_wmb.spin.input -cp .input.spin.trail urcu_free_no_wmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_wmb.spin.input b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_wmb.spin.input deleted file mode 100644 index d5d174d..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_wmb.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define NO_WMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_wmb.spin.input.trail deleted file mode 100644 index f2ce974..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_no_wmb.spin.input.trail +++ /dev/null @@ -1,1653 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:2399 -2:4:2351 -3:4:2354 -4:4:2354 -5:4:2357 -6:4:2365 -7:4:2365 -8:4:2368 -9:4:2374 -10:4:2378 -11:4:2378 -12:4:2381 -13:4:2389 -14:4:2393 -15:4:2394 -16:0:2399 -17:4:2396 -18:0:2399 -19:3:869 -20:0:2399 -21:3:875 -22:0:2399 -23:3:876 -24:0:2399 -25:3:877 -26:3:881 -27:3:882 -28:3:890 -29:3:891 -30:3:895 -31:3:896 -32:3:904 -33:3:909 -34:3:913 -35:3:914 -36:3:921 -37:3:922 -38:3:933 -39:3:934 -40:3:935 -41:3:946 -42:3:951 -43:3:952 -44:0:2399 -45:3:964 -46:0:2399 -47:3:966 -48:3:967 -49:0:2399 -50:3:971 -51:3:975 -52:3:976 -53:3:984 -54:3:985 -55:3:989 -56:3:990 -57:3:998 -58:3:1003 -59:3:1004 -60:3:1015 -61:3:1016 -62:3:1027 -63:3:1028 -64:3:1029 -65:3:1040 -66:3:1045 -67:3:1046 -68:0:2399 -69:3:1058 -70:0:2399 -71:3:1060 -72:0:2399 -73:3:1061 -74:0:2399 -75:3:1071 -76:0:2399 -77:3:1072 -78:3:1079 -79:3:1080 -80:3:1087 -81:3:1092 -82:0:2399 -83:3:1103 -84:0:2399 -85:3:1104 -86:3:1111 -87:3:1112 -88:3:1119 -89:3:1124 -90:0:2399 -91:3:1135 -92:0:2399 -93:3:1140 -94:3:1147 -95:3:1148 -96:3:1155 -97:3:1160 -98:0:2399 -99:3:1171 -100:0:2399 -101:3:1173 -102:0:2399 -103:3:1174 -104:3:1178 -105:3:1179 -106:3:1187 -107:3:1188 -108:3:1192 -109:3:1193 -110:3:1201 -111:3:1206 -112:3:1210 -113:3:1211 -114:3:1218 -115:3:1219 -116:3:1230 -117:3:1231 -118:3:1232 -119:3:1243 -120:3:1248 -121:3:1249 -122:0:2399 -123:3:1261 -124:0:2399 -125:3:1263 -126:0:2399 -127:3:1266 -128:3:1267 -129:3:1279 -130:3:1280 -131:3:1284 -132:3:1285 -133:3:1293 -134:3:1298 -135:3:1302 -136:3:1303 -137:3:1310 -138:3:1311 -139:3:1322 -140:3:1323 -141:3:1324 -142:3:1335 -143:3:1340 -144:3:1341 -145:0:2399 -146:3:1353 -147:0:2399 -148:3:1355 -149:0:2399 -150:3:1356 -151:0:2399 -152:3:1357 -153:0:2399 -154:3:1358 -155:0:2399 -156:3:1359 -157:3:1363 -158:3:1364 -159:3:1372 -160:3:1373 -161:3:1377 -162:3:1378 -163:3:1386 -164:3:1391 -165:3:1395 -166:3:1396 -167:3:1403 -168:3:1404 -169:3:1415 -170:3:1416 -171:3:1417 -172:3:1428 -173:3:1433 -174:3:1434 -175:0:2399 -176:3:1446 -177:0:2399 -178:3:1550 -179:0:2399 -180:3:1648 -181:0:2399 -182:3:1649 -183:0:2399 -184:3:1653 -185:0:2399 -186:3:1659 -187:3:1663 -188:3:1664 -189:3:1672 -190:3:1673 -191:3:1677 -192:3:1678 -193:3:1686 -194:3:1691 -195:3:1695 -196:3:1696 -197:3:1703 -198:3:1704 -199:3:1715 -200:3:1716 -201:3:1717 -202:3:1728 -203:3:1733 -204:3:1734 -205:0:2399 -206:3:1746 -207:0:2399 -208:3:1748 -209:0:2399 -210:3:1749 -211:3:1753 -212:3:1754 -213:3:1762 -214:3:1763 -215:3:1767 -216:3:1768 -217:3:1776 -218:3:1781 -219:3:1785 -220:3:1786 -221:3:1793 -222:3:1794 -223:3:1805 -224:3:1806 -225:3:1807 -226:3:1818 -227:3:1823 -228:3:1824 -229:0:2399 -230:3:1836 -231:0:2399 -232:3:1838 -233:0:2399 -234:3:1841 -235:3:1842 -236:3:1854 -237:3:1855 -238:3:1859 -239:3:1860 -240:3:1868 -241:3:1873 -242:3:1877 -243:3:1878 -244:3:1885 -245:3:1886 -246:3:1897 -247:3:1898 -248:3:1899 -249:3:1910 -250:3:1915 -251:3:1916 -252:0:2399 -253:3:1928 -254:0:2399 -255:3:1930 -256:0:2399 -257:3:1931 -258:0:2399 -259:3:1932 -260:0:2399 -261:3:1933 -262:0:2399 -263:3:1934 -264:3:1938 -265:3:1939 -266:3:1947 -267:3:1948 -268:3:1952 -269:3:1953 -270:3:1961 -271:3:1966 -272:3:1970 -273:3:1971 -274:3:1978 -275:3:1979 -276:3:1990 -277:3:1991 -278:3:1992 -279:3:2003 -280:3:2008 -281:3:2009 -282:0:2399 -283:3:2021 -284:0:2399 -285:3:2125 -286:0:2399 -287:3:2223 -288:0:2399 -289:3:2224 -290:0:2399 -291:3:2228 -292:0:2399 -293:3:2234 -294:3:2241 -295:3:2242 -296:3:2249 -297:3:2254 -298:0:2399 -299:3:2265 -300:0:2399 -301:3:2266 -302:3:2273 -303:3:2274 -304:3:2281 -305:3:2286 -306:0:2399 -307:3:2297 -308:0:2399 -309:3:2302 -310:3:2309 -311:3:2310 -312:3:2317 -313:3:2322 -314:0:2399 -315:3:2333 -316:0:2399 -317:3:2335 -318:0:2399 -319:3:2336 -320:0:2399 -321:3:876 -322:0:2399 -323:3:877 -324:3:881 -325:3:882 -326:3:890 -327:3:891 -328:3:895 -329:3:896 -330:3:904 -331:3:909 -332:3:913 -333:3:914 -334:3:921 -335:3:922 -336:3:933 -337:3:934 -338:3:935 -339:3:946 -340:3:951 -341:3:952 -342:0:2399 -343:3:964 -344:0:2399 -345:3:966 -346:3:967 -347:0:2399 -348:3:971 -349:3:975 -350:3:976 -351:3:984 -352:3:985 -353:3:989 -354:3:990 -355:3:998 -356:3:1003 -357:3:1004 -358:3:1015 -359:3:1016 -360:3:1027 -361:3:1028 -362:3:1029 -363:3:1040 -364:3:1045 -365:3:1046 -366:0:2399 -367:3:1058 -368:0:2399 -369:3:1060 -370:0:2399 -371:3:1061 -372:0:2399 -373:3:1071 -374:0:2399 -375:3:1072 -376:3:1079 -377:3:1080 -378:3:1087 -379:3:1092 -380:0:2399 -381:3:1103 -382:0:2399 -383:3:1104 -384:3:1111 -385:3:1112 -386:3:1119 -387:3:1124 -388:0:2399 -389:3:1135 -390:0:2399 -391:3:1140 -392:3:1147 -393:3:1148 -394:3:1155 -395:3:1160 -396:0:2399 -397:3:1171 -398:0:2399 -399:3:1173 -400:0:2399 -401:3:1174 -402:3:1178 -403:3:1179 -404:3:1187 -405:3:1188 -406:3:1192 -407:3:1193 -408:3:1201 -409:3:1206 -410:3:1210 -411:3:1211 -412:3:1218 -413:3:1219 -414:3:1230 -415:3:1231 -416:3:1232 -417:3:1243 -418:3:1248 -419:3:1249 -420:0:2399 -421:3:1261 -422:0:2399 -423:3:1263 -424:0:2399 -425:3:1266 -426:3:1267 -427:3:1279 -428:3:1280 -429:3:1284 -430:3:1285 -431:3:1293 -432:3:1298 -433:3:1302 -434:3:1303 -435:3:1310 -436:3:1311 -437:3:1322 -438:3:1323 -439:3:1324 -440:3:1335 -441:3:1340 -442:3:1341 -443:0:2399 -444:3:1353 -445:0:2399 -446:3:1355 -447:0:2399 -448:3:1356 -449:0:2399 -450:3:1357 -451:0:2399 -452:3:1358 -453:0:2399 -454:3:1359 -455:3:1363 -456:3:1364 -457:3:1372 -458:3:1373 -459:3:1377 -460:3:1378 -461:3:1386 -462:3:1391 -463:3:1395 -464:3:1396 -465:3:1403 -466:3:1404 -467:3:1415 -468:3:1416 -469:3:1417 -470:3:1428 -471:3:1433 -472:3:1434 -473:0:2399 -474:3:1446 -475:0:2399 -476:3:1550 -477:0:2399 -478:3:1648 -479:0:2399 -480:3:1649 -481:0:2399 -482:3:1653 -483:0:2399 -484:3:1659 -485:3:1663 -486:3:1664 -487:3:1672 -488:3:1673 -489:3:1677 -490:3:1678 -491:3:1686 -492:3:1691 -493:3:1695 -494:3:1696 -495:3:1703 -496:3:1704 -497:3:1715 -498:3:1716 -499:3:1717 -500:3:1728 -501:3:1733 -502:3:1734 -503:0:2399 -504:3:1746 -505:0:2399 -506:3:1748 -507:0:2399 -508:3:1749 -509:3:1753 -510:3:1754 -511:3:1762 -512:3:1763 -513:3:1767 -514:3:1768 -515:3:1776 -516:3:1781 -517:3:1785 -518:3:1786 -519:3:1793 -520:3:1794 -521:3:1805 -522:3:1806 -523:3:1807 -524:3:1818 -525:3:1823 -526:3:1824 -527:0:2399 -528:3:1836 -529:0:2399 -530:3:1838 -531:0:2399 -532:3:1841 -533:3:1842 -534:3:1854 -535:3:1855 -536:3:1859 -537:3:1860 -538:3:1868 -539:3:1873 -540:3:1877 -541:3:1878 -542:3:1885 -543:3:1886 -544:3:1897 -545:3:1898 -546:3:1899 -547:3:1910 -548:3:1915 -549:3:1916 -550:0:2399 -551:3:1928 -552:0:2399 -553:3:1930 -554:0:2399 -555:3:1931 -556:0:2399 -557:3:1932 -558:0:2399 -559:3:1933 -560:0:2399 -561:3:1934 -562:3:1938 -563:3:1939 -564:3:1947 -565:3:1948 -566:3:1952 -567:3:1953 -568:3:1961 -569:3:1966 -570:3:1970 -571:3:1971 -572:3:1978 -573:3:1979 -574:3:1990 -575:3:1991 -576:3:1992 -577:3:2003 -578:3:2008 -579:3:2009 -580:0:2399 -581:3:2021 -582:0:2399 -583:3:2125 -584:0:2399 -585:3:2223 -586:0:2399 -587:3:2224 -588:0:2399 -589:3:2228 -590:0:2399 -591:3:2234 -592:3:2241 -593:3:2242 -594:3:2249 -595:3:2254 -596:0:2399 -597:3:2265 -598:0:2399 -599:3:2266 -600:3:2273 -601:3:2274 -602:3:2281 -603:3:2286 -604:0:2399 -605:3:2297 -606:0:2399 -607:3:2302 -608:3:2309 -609:3:2310 -610:3:2317 -611:3:2322 -612:0:2399 -613:3:2333 -614:0:2399 -615:3:2335 -616:0:2399 -617:3:2336 -618:0:2399 -619:3:876 -620:0:2399 -621:3:877 -622:3:881 -623:3:882 -624:3:890 -625:3:891 -626:3:895 -627:3:896 -628:3:904 -629:3:909 -630:3:913 -631:3:914 -632:3:921 -633:3:922 -634:3:933 -635:3:934 -636:3:935 -637:3:946 -638:3:951 -639:3:952 -640:0:2399 -641:3:964 -642:0:2399 -643:3:966 -644:3:967 -645:0:2399 -646:3:971 -647:3:975 -648:3:976 -649:3:984 -650:3:985 -651:3:989 -652:3:990 -653:3:998 -654:3:1003 -655:3:1004 -656:3:1015 -657:3:1016 -658:3:1027 -659:3:1028 -660:3:1029 -661:3:1040 -662:3:1045 -663:3:1046 -664:0:2399 -665:3:1058 -666:0:2399 -667:3:1060 -668:0:2399 -669:3:1061 -670:0:2399 -671:3:1071 -672:0:2399 -673:3:1072 -674:3:1079 -675:3:1080 -676:3:1087 -677:3:1092 -678:0:2399 -679:3:1103 -680:0:2399 -681:3:1104 -682:3:1111 -683:3:1112 -684:3:1119 -685:3:1124 -686:0:2399 -687:3:1135 -688:0:2399 -689:3:1140 -690:3:1147 -691:3:1148 -692:3:1155 -693:3:1160 -694:0:2399 -695:3:1171 -696:0:2399 -697:3:1173 -698:0:2399 -699:3:1174 -700:3:1178 -701:3:1179 -702:3:1187 -703:3:1188 -704:3:1192 -705:3:1193 -706:3:1201 -707:3:1206 -708:3:1210 -709:3:1211 -710:3:1218 -711:3:1219 -712:3:1230 -713:3:1231 -714:3:1232 -715:3:1243 -716:3:1248 -717:3:1249 -718:0:2399 -719:3:1261 -720:0:2399 -721:3:1263 -722:0:2399 -723:3:1266 -724:3:1267 -725:3:1279 -726:3:1280 -727:3:1284 -728:3:1285 -729:3:1293 -730:3:1298 -731:3:1302 -732:3:1303 -733:3:1310 -734:3:1311 -735:3:1322 -736:3:1323 -737:3:1324 -738:3:1335 -739:3:1340 -740:3:1341 -741:0:2399 -742:3:1353 -743:0:2399 -744:3:1355 -745:0:2399 -746:3:1356 -747:0:2399 -748:3:1357 -749:0:2399 -750:3:1358 -751:0:2399 -752:3:1359 -753:3:1363 -754:3:1364 -755:3:1372 -756:3:1373 -757:3:1377 -758:3:1378 -759:3:1386 -760:3:1391 -761:3:1395 -762:3:1396 -763:3:1403 -764:3:1404 -765:3:1415 -766:3:1416 -767:3:1417 -768:3:1428 -769:3:1433 -770:3:1434 -771:0:2399 -772:3:1446 -773:0:2399 -774:3:1550 -775:0:2399 -776:3:1648 -777:0:2399 -778:3:1649 -779:0:2399 -780:3:1653 -781:0:2399 -782:3:1659 -783:3:1663 -784:3:1664 -785:3:1672 -786:3:1673 -787:3:1677 -788:3:1678 -789:3:1686 -790:3:1691 -791:3:1695 -792:3:1696 -793:3:1703 -794:3:1704 -795:3:1715 -796:3:1716 -797:3:1717 -798:3:1728 -799:3:1733 -800:3:1734 -801:0:2399 -802:3:1746 -803:0:2399 -804:3:1748 -805:0:2399 -806:3:1749 -807:3:1753 -808:3:1754 -809:3:1762 -810:3:1763 -811:3:1767 -812:3:1768 -813:3:1776 -814:3:1781 -815:3:1785 -816:3:1786 -817:3:1793 -818:3:1794 -819:3:1805 -820:3:1806 -821:3:1807 -822:3:1818 -823:3:1823 -824:3:1824 -825:0:2399 -826:3:1836 -827:0:2399 -828:3:1838 -829:0:2399 -830:3:1841 -831:3:1842 -832:3:1854 -833:3:1855 -834:3:1859 -835:3:1860 -836:3:1868 -837:3:1873 -838:3:1877 -839:3:1878 -840:3:1885 -841:3:1886 -842:3:1897 -843:3:1898 -844:3:1899 -845:3:1910 -846:3:1915 -847:3:1916 -848:0:2399 -849:3:1928 -850:0:2399 -851:3:1930 -852:0:2399 -853:3:1931 -854:0:2399 -855:3:1932 -856:0:2399 -857:3:1933 -858:0:2399 -859:3:1934 -860:3:1938 -861:3:1939 -862:3:1947 -863:3:1948 -864:3:1952 -865:3:1953 -866:3:1961 -867:3:1966 -868:3:1970 -869:3:1971 -870:3:1978 -871:3:1979 -872:3:1990 -873:3:1991 -874:3:1992 -875:3:2003 -876:3:2008 -877:3:2009 -878:0:2399 -879:3:2021 -880:0:2399 -881:3:2125 -882:0:2399 -883:3:2223 -884:0:2399 -885:3:2224 -886:0:2399 -887:3:2228 -888:0:2399 -889:3:2234 -890:3:2241 -891:3:2242 -892:3:2249 -893:3:2254 -894:0:2399 -895:3:2265 -896:0:2399 -897:3:2266 -898:3:2273 -899:3:2274 -900:3:2281 -901:3:2286 -902:0:2399 -903:3:2297 -904:0:2399 -905:3:2302 -906:3:2309 -907:3:2310 -908:3:2317 -909:3:2322 -910:0:2399 -911:3:2333 -912:0:2399 -913:3:2335 -914:0:2399 -915:3:2336 -916:0:2399 -917:3:876 -918:0:2399 -919:3:877 -920:3:881 -921:3:882 -922:3:890 -923:3:891 -924:3:895 -925:3:896 -926:3:904 -927:3:909 -928:3:913 -929:3:914 -930:3:921 -931:3:922 -932:3:933 -933:3:934 -934:3:935 -935:3:946 -936:3:951 -937:3:952 -938:0:2399 -939:3:964 -940:0:2399 -941:3:966 -942:3:967 -943:0:2399 -944:3:971 -945:3:975 -946:3:976 -947:3:984 -948:3:985 -949:3:989 -950:3:990 -951:3:998 -952:3:1003 -953:3:1004 -954:3:1015 -955:3:1016 -956:3:1027 -957:3:1028 -958:3:1029 -959:3:1040 -960:3:1045 -961:3:1046 -962:0:2399 -963:3:1058 -964:0:2399 -965:3:1060 -966:0:2399 -967:3:1061 -968:0:2399 -969:3:1071 -970:0:2399 -971:3:1072 -972:3:1079 -973:3:1080 -974:3:1087 -975:3:1092 -976:0:2399 -977:3:1103 -978:0:2399 -979:3:1104 -980:3:1111 -981:3:1112 -982:3:1119 -983:3:1124 -984:0:2399 -985:3:1135 -986:0:2399 -987:3:1140 -988:3:1147 -989:3:1148 -990:3:1155 -991:3:1160 -992:0:2399 -993:3:1171 -994:0:2399 -995:3:1173 -996:0:2399 -997:3:1174 -998:3:1178 -999:3:1179 -1000:3:1187 -1001:3:1188 -1002:3:1192 -1003:3:1193 -1004:3:1201 -1005:3:1206 -1006:3:1210 -1007:3:1211 -1008:3:1218 -1009:3:1219 -1010:3:1230 -1011:3:1231 -1012:3:1232 -1013:3:1243 -1014:3:1248 -1015:3:1249 -1016:0:2399 -1017:3:1261 -1018:0:2399 -1019:3:1263 -1020:0:2399 -1021:3:1266 -1022:3:1267 -1023:3:1279 -1024:3:1280 -1025:3:1284 -1026:3:1285 -1027:3:1293 -1028:3:1298 -1029:3:1302 -1030:3:1303 -1031:3:1310 -1032:3:1311 -1033:3:1322 -1034:3:1323 -1035:3:1324 -1036:3:1335 -1037:3:1340 -1038:3:1341 -1039:0:2399 -1040:3:1353 -1041:0:2399 -1042:3:1355 -1043:0:2399 -1044:3:1356 -1045:0:2399 -1046:3:1357 -1047:0:2399 -1048:3:1358 -1049:0:2399 -1050:3:1359 -1051:3:1363 -1052:3:1364 -1053:3:1372 -1054:3:1373 -1055:3:1377 -1056:3:1378 -1057:3:1386 -1058:3:1391 -1059:3:1395 -1060:3:1396 -1061:3:1403 -1062:3:1404 -1063:3:1415 -1064:3:1416 -1065:3:1417 -1066:3:1428 -1067:3:1433 -1068:3:1434 -1069:0:2399 -1070:3:1446 -1071:0:2399 -1072:3:1550 -1073:0:2399 -1074:3:1648 -1075:0:2399 -1076:3:1649 -1077:0:2399 -1078:3:1653 -1079:0:2399 -1080:3:1659 -1081:3:1663 -1082:3:1664 -1083:3:1672 -1084:3:1673 -1085:3:1677 -1086:3:1678 -1087:3:1686 -1088:3:1691 -1089:3:1695 -1090:3:1696 -1091:3:1703 -1092:3:1704 -1093:3:1715 -1094:3:1716 -1095:3:1717 -1096:3:1728 -1097:3:1733 -1098:3:1734 -1099:0:2399 -1100:3:1746 -1101:0:2399 -1102:3:1748 -1103:0:2399 -1104:3:1749 -1105:3:1753 -1106:3:1754 -1107:3:1762 -1108:3:1763 -1109:3:1767 -1110:3:1768 -1111:3:1776 -1112:3:1781 -1113:3:1785 -1114:3:1786 -1115:3:1793 -1116:3:1794 -1117:3:1805 -1118:3:1806 -1119:3:1807 -1120:3:1818 -1121:3:1823 -1122:3:1824 -1123:0:2399 -1124:3:1836 -1125:0:2399 -1126:3:1838 -1127:0:2399 -1128:3:1841 -1129:3:1842 -1130:3:1854 -1131:3:1855 -1132:3:1859 -1133:3:1860 -1134:3:1868 -1135:3:1873 -1136:3:1877 -1137:3:1878 -1138:3:1885 -1139:3:1886 -1140:3:1897 -1141:3:1898 -1142:3:1899 -1143:3:1910 -1144:3:1915 -1145:3:1916 -1146:0:2399 -1147:3:1928 -1148:0:2399 -1149:3:1930 -1150:0:2399 -1151:3:1931 -1152:0:2399 -1153:3:1932 -1154:0:2399 -1155:3:1933 -1156:0:2399 -1157:3:1934 -1158:3:1938 -1159:3:1939 -1160:3:1947 -1161:3:1948 -1162:3:1952 -1163:3:1953 -1164:3:1961 -1165:3:1966 -1166:3:1970 -1167:3:1971 -1168:3:1978 -1169:3:1979 -1170:3:1990 -1171:3:1991 -1172:3:1992 -1173:3:2003 -1174:3:2008 -1175:3:2009 -1176:0:2399 -1177:3:2021 -1178:0:2399 -1179:3:2125 -1180:0:2399 -1181:3:2223 -1182:0:2399 -1183:3:2224 -1184:0:2399 -1185:3:2228 -1186:0:2399 -1187:3:2234 -1188:3:2241 -1189:3:2242 -1190:3:2249 -1191:3:2254 -1192:0:2399 -1193:3:2265 -1194:0:2399 -1195:3:2266 -1196:3:2273 -1197:3:2274 -1198:3:2281 -1199:3:2286 -1200:0:2399 -1201:3:2297 -1202:0:2399 -1203:3:2302 -1204:3:2309 -1205:3:2310 -1206:3:2317 -1207:3:2322 -1208:0:2399 -1209:3:2333 -1210:0:2399 -1211:3:2335 -1212:0:2399 -1213:3:2336 -1214:0:2399 -1215:3:876 -1216:0:2399 -1217:3:877 -1218:3:881 -1219:3:882 -1220:3:890 -1221:3:891 -1222:3:895 -1223:3:896 -1224:3:904 -1225:3:909 -1226:3:913 -1227:3:914 -1228:3:921 -1229:3:922 -1230:3:933 -1231:3:934 -1232:3:935 -1233:3:946 -1234:3:951 -1235:3:952 -1236:0:2399 -1237:3:964 -1238:0:2399 -1239:3:966 -1240:3:967 -1241:0:2399 -1242:3:971 -1243:3:975 -1244:3:976 -1245:3:984 -1246:3:985 -1247:3:989 -1248:3:990 -1249:3:998 -1250:3:1003 -1251:3:1004 -1252:3:1015 -1253:3:1016 -1254:3:1027 -1255:3:1028 -1256:3:1029 -1257:3:1040 -1258:3:1045 -1259:3:1046 -1260:0:2399 -1261:3:1058 -1262:0:2399 -1263:3:1060 -1264:0:2399 -1265:3:1061 -1266:0:2399 -1267:3:1071 -1268:0:2399 -1269:3:1072 -1270:3:1079 -1271:3:1080 -1272:3:1087 -1273:3:1092 -1274:0:2399 -1275:3:1103 -1276:0:2399 -1277:2:458 -1278:0:2399 -1279:2:464 -1280:0:2399 -1281:2:465 -1282:0:2399 -1283:2:466 -1284:0:2399 -1285:2:467 -1286:0:2399 -1287:1:2 -1288:0:2399 -1289:2:468 -1290:0:2399 -1291:1:8 -1292:0:2399 -1293:1:9 -1294:0:2399 -1295:1:10 -1296:0:2399 -1297:1:11 -1298:0:2399 -1299:2:467 -1300:0:2399 -1301:1:12 -1302:1:16 -1303:1:17 -1304:1:25 -1305:1:26 -1306:1:30 -1307:1:31 -1308:1:39 -1309:1:44 -1310:1:48 -1311:1:49 -1312:1:56 -1313:1:57 -1314:1:68 -1315:1:69 -1316:1:70 -1317:1:81 -1318:1:93 -1319:1:94 -1320:0:2399 -1321:2:468 -1322:0:2399 -1323:1:99 -1324:0:2399 -1325:2:469 -1326:0:2399 -1327:2:475 -1328:0:2399 -1329:2:476 -1330:0:2399 -1331:2:477 -1332:2:481 -1333:2:482 -1334:2:490 -1335:2:491 -1336:2:495 -1337:2:496 -1338:2:504 -1339:2:509 -1340:2:513 -1341:2:514 -1342:2:521 -1343:2:522 -1344:2:533 -1345:2:534 -1346:2:535 -1347:2:546 -1348:2:558 -1349:2:559 -1350:0:2399 -1351:2:564 -1352:0:2399 -1353:2:565 -1354:2:569 -1355:2:570 -1356:2:578 -1357:2:579 -1358:2:583 -1359:2:584 -1360:2:592 -1361:2:597 -1362:2:601 -1363:2:602 -1364:2:609 -1365:2:610 -1366:2:621 -1367:2:622 -1368:2:623 -1369:2:634 -1370:2:646 -1371:2:647 -1372:0:2399 -1373:2:652 -1374:0:2399 -1375:2:653 -1376:0:2399 -1377:2:654 -1378:2:658 -1379:2:659 -1380:2:667 -1381:2:668 -1382:2:672 -1383:2:673 -1384:2:681 -1385:2:686 -1386:2:690 -1387:2:691 -1388:2:698 -1389:2:699 -1390:2:710 -1391:2:711 -1392:2:712 -1393:2:723 -1394:2:735 -1395:2:736 -1396:0:2399 -1397:2:741 -1398:0:2399 -1399:2:750 -1400:0:2399 -1401:2:753 -1402:0:2399 -1403:2:758 -1404:0:2399 -1405:3:1104 -1406:3:1111 -1407:3:1114 -1408:3:1115 -1409:3:1119 -1410:3:1124 -1411:0:2399 -1412:3:1135 -1413:0:2399 -1414:3:1140 -1415:3:1147 -1416:3:1148 -1417:3:1155 -1418:3:1160 -1419:0:2399 -1420:3:1171 -1421:0:2399 -1422:3:1173 -1423:0:2399 -1424:3:1174 -1425:3:1178 -1426:3:1179 -1427:3:1187 -1428:3:1188 -1429:3:1192 -1430:3:1193 -1431:3:1201 -1432:3:1206 -1433:3:1210 -1434:3:1211 -1435:3:1218 -1436:3:1219 -1437:3:1230 -1438:3:1231 -1439:3:1232 -1440:3:1243 -1441:3:1248 -1442:3:1249 -1443:0:2399 -1444:3:1261 -1445:0:2399 -1446:3:1263 -1447:0:2399 -1448:3:1266 -1449:3:1267 -1450:3:1279 -1451:3:1280 -1452:3:1284 -1453:3:1285 -1454:3:1293 -1455:3:1298 -1456:3:1302 -1457:3:1303 -1458:3:1310 -1459:3:1311 -1460:3:1322 -1461:3:1323 -1462:3:1324 -1463:3:1335 -1464:3:1340 -1465:3:1341 -1466:0:2399 -1467:3:1353 -1468:0:2399 -1469:3:1355 -1470:0:2399 -1471:3:1356 -1472:0:2399 -1473:3:1357 -1474:0:2399 -1475:3:1358 -1476:0:2399 -1477:3:1359 -1478:3:1363 -1479:3:1364 -1480:3:1372 -1481:3:1373 -1482:3:1377 -1483:3:1378 -1484:3:1386 -1485:3:1391 -1486:3:1395 -1487:3:1396 -1488:3:1403 -1489:3:1404 -1490:3:1415 -1491:3:1416 -1492:3:1417 -1493:3:1428 -1494:3:1433 -1495:3:1434 -1496:0:2399 -1497:3:1446 -1498:0:2399 -1499:3:1550 -1500:0:2399 -1501:3:1648 -1502:0:2399 -1503:3:1649 -1504:0:2399 -1505:3:1653 -1506:0:2399 -1507:3:1659 -1508:3:1663 -1509:3:1664 -1510:3:1672 -1511:3:1673 -1512:3:1677 -1513:3:1678 -1514:3:1686 -1515:3:1691 -1516:3:1695 -1517:3:1696 -1518:3:1703 -1519:3:1704 -1520:3:1715 -1521:3:1716 -1522:3:1717 -1523:3:1728 -1524:3:1733 -1525:3:1734 -1526:0:2399 -1527:3:1746 -1528:0:2399 -1529:3:1748 -1530:0:2399 -1531:3:1749 -1532:3:1753 -1533:3:1754 -1534:3:1762 -1535:3:1763 -1536:3:1767 -1537:3:1768 -1538:3:1776 -1539:3:1781 -1540:3:1785 -1541:3:1786 -1542:3:1793 -1543:3:1794 -1544:3:1805 -1545:3:1806 -1546:3:1807 -1547:3:1818 -1548:3:1823 -1549:3:1824 -1550:0:2399 -1551:3:1836 -1552:0:2399 -1553:3:1838 -1554:0:2399 -1555:3:1841 -1556:3:1842 -1557:3:1854 -1558:3:1855 -1559:3:1859 -1560:3:1860 -1561:3:1868 -1562:3:1873 -1563:3:1877 -1564:3:1878 -1565:3:1885 -1566:3:1886 -1567:3:1897 -1568:3:1898 -1569:3:1899 -1570:3:1910 -1571:3:1915 -1572:3:1916 -1573:0:2399 -1574:3:1928 -1575:0:2399 -1576:3:1930 -1577:0:2399 -1578:3:1931 -1579:0:2399 -1580:3:1932 -1581:0:2399 -1582:3:1933 -1583:0:2399 -1584:3:1934 -1585:3:1938 -1586:3:1939 -1587:3:1947 -1588:3:1948 -1589:3:1952 -1590:3:1953 -1591:3:1961 -1592:3:1966 -1593:3:1970 -1594:3:1971 -1595:3:1978 -1596:3:1979 -1597:3:1990 -1598:3:1991 -1599:3:1992 -1600:3:2003 -1601:3:2008 -1602:3:2009 -1603:0:2399 -1604:3:2021 -1605:0:2399 -1606:3:2125 -1607:0:2399 -1608:3:2223 -1609:0:2399 -1610:3:2224 -1611:0:2399 -1612:3:2228 -1613:0:2399 -1614:3:2234 -1615:3:2241 -1616:3:2242 -1617:3:2249 -1618:3:2254 -1619:0:2399 -1620:3:2265 -1621:0:2399 -1622:3:2266 -1623:3:2273 -1624:3:2276 -1625:3:2277 -1626:3:2281 -1627:3:2286 -1628:0:2399 -1629:3:2297 -1630:0:2399 -1631:3:2302 -1632:3:2309 -1633:3:2310 -1634:3:2317 -1635:3:2322 -1636:0:2399 -1637:3:2333 -1638:0:2399 -1639:3:2335 -1640:0:2399 -1641:3:2336 -1642:0:2399 -1643:3:2339 -1644:0:2399 -1645:3:2344 -1646:0:2399 -1647:2:759 -1648:0:2397 -1649:3:2345 -1650:0:2403 -1651:2:518 diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_single_flip.define b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_single_flip.log b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_single_flip.log deleted file mode 100644 index 5d7d35c..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_single_flip.log +++ /dev/null @@ -1,217 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_single_flip.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -Depth= 8352 States= 1e+06 Transitions= 1.05e+07 Memory= 534.807 t= 8.93 R= 1e+05 -pan: claim violated! (at depth 1352) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 64 byte, depth reached 8352, errors: 1 - 1456373 states, stored - 13442538 states, matched - 14898911 transitions (= stored+matched) - 50580660 atomic steps -hash conflicts: 5166006 (resolved) - -Stats on memory usage (in Megabytes): - 127.779 equivalent memory usage for states (stored*(State-vector + overhead)) - 100.443 actual memory usage for states (compression: 78.61%) - state-vector as stored = 44 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 566.154 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 256, "(1)" - line 418, "pan.___", state 286, "(1)" - line 399, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 395, "(1)" - line 418, "pan.___", state 425, "(1)" - line 540, "pan.___", state 456, "-end-" - (17 of 456 states) -unreached in proctype urcu_reader_sig - line 399, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 70, "(1)" - line 418, "pan.___", state 100, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 247, "(1)" - line 418, "pan.___", state 277, "(1)" - line 399, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 359, "(1)" - line 418, "pan.___", state 389, "(1)" - line 614, "pan.___", state 411, "-end-" - (17 of 411 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 59, "(1)" - line 413, "pan.___", state 72, "(1)" - line 418, "pan.___", state 89, "(1)" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 240, "(1)" - line 164, "pan.___", state 248, "(1)" - line 168, "pan.___", state 260, "(1)" - line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 370, "(1)" - line 164, "pan.___", state 378, "(1)" - line 168, "pan.___", state 390, "(1)" - line 399, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 449, "(1)" - line 413, "pan.___", state 462, "(1)" - line 418, "pan.___", state 479, "(1)" - line 399, "pan.___", state 498, "(1)" - line 403, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 554, "(1)" - line 418, "pan.___", state 571, "(1)" - line 403, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 647, "(1)" - line 418, "pan.___", state 664, "(1)" - line 179, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 710, "(1)" - line 164, "pan.___", state 718, "(1)" - line 168, "pan.___", state 730, "(1)" - line 175, "pan.___", state 741, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 817, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 830, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 840, "(1)" - line 164, "pan.___", state 848, "(1)" - line 168, "pan.___", state 860, "(1)" - line 399, "pan.___", state 882, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 884, "(1)" - line 399, "pan.___", state 885, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 885, "else" - line 399, "pan.___", state 888, "(1)" - line 403, "pan.___", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 898, "(1)" - line 403, "pan.___", state 899, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 899, "else" - line 403, "pan.___", state 902, "(1)" - line 403, "pan.___", state 903, "(1)" - line 403, "pan.___", state 903, "(1)" - line 401, "pan.___", state 908, "((i<1))" - line 401, "pan.___", state 908, "((i>=1))" - line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 927, "(1)" - line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 928, "else" - line 409, "pan.___", state 931, "(1)" - line 409, "pan.___", state 932, "(1)" - line 409, "pan.___", state 932, "(1)" - line 413, "pan.___", state 940, "(1)" - line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 941, "else" - line 413, "pan.___", state 944, "(1)" - line 413, "pan.___", state 945, "(1)" - line 413, "pan.___", state 945, "(1)" - line 411, "pan.___", state 950, "((i<1))" - line 411, "pan.___", state 950, "((i>=1))" - line 418, "pan.___", state 957, "(1)" - line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 958, "else" - line 418, "pan.___", state 961, "(1)" - line 418, "pan.___", state 962, "(1)" - line 418, "pan.___", state 962, "(1)" - line 420, "pan.___", state 965, "(1)" - line 420, "pan.___", state 965, "(1)" - line 179, "pan.___", state 990, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1003, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1013, "(1)" - line 164, "pan.___", state 1021, "(1)" - line 168, "pan.___", state 1033, "(1)" - line 175, "pan.___", state 1044, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 1120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1133, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1143, "(1)" - line 164, "pan.___", state 1151, "(1)" - line 168, "pan.___", state 1163, "(1)" - line 702, "pan.___", state 1188, "-end-" - (100 of 1188 states) -unreached in proctype :init: - line 709, "pan.___", state 9, "((j<2))" - line 709, "pan.___", state 9, "((j>=2))" - line 710, "pan.___", state 20, "((j<2))" - line 710, "pan.___", state 20, "((j>=2))" - line 715, "pan.___", state 33, "((j<2))" - line 715, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 749, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 12.8 seconds -pan: rate 113424.69 states/second -pan: avg transition delay 8.6181e-07 usec -cp .input.spin urcu_free_single_flip.spin.input -cp .input.spin.trail urcu_free_single_flip.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_single_flip.spin.input b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_single_flip.spin.input deleted file mode 100644 index 103464e..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_single_flip.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define SINGLE_FLIP - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_single_flip.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_single_flip.spin.input.trail deleted file mode 100644 index e81c46c..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_free_single_flip.spin.input.trail +++ /dev/null @@ -1,1355 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:2103 -2:4:2055 -3:4:2058 -4:4:2058 -5:4:2061 -6:4:2069 -7:4:2069 -8:4:2072 -9:4:2078 -10:4:2082 -11:4:2082 -12:4:2085 -13:4:2093 -14:4:2097 -15:4:2098 -16:0:2103 -17:4:2100 -18:0:2103 -19:3:869 -20:0:2103 -21:3:875 -22:0:2103 -23:3:876 -24:0:2103 -25:3:877 -26:3:881 -27:3:882 -28:3:890 -29:3:891 -30:3:895 -31:3:896 -32:3:904 -33:3:909 -34:3:913 -35:3:914 -36:3:921 -37:3:922 -38:3:933 -39:3:934 -40:3:935 -41:3:946 -42:3:951 -43:3:952 -44:0:2103 -45:3:964 -46:0:2103 -47:3:966 -48:3:967 -49:0:2103 -50:3:971 -51:3:975 -52:3:976 -53:3:984 -54:3:985 -55:3:989 -56:3:990 -57:3:998 -58:3:1003 -59:3:1004 -60:3:1015 -61:3:1016 -62:3:1027 -63:3:1028 -64:3:1029 -65:3:1040 -66:3:1045 -67:3:1046 -68:0:2103 -69:3:1058 -70:0:2103 -71:3:1060 -72:0:2103 -73:3:1061 -74:0:2103 -75:3:1071 -76:0:2103 -77:3:1075 -78:3:1076 -79:3:1080 -80:3:1084 -81:3:1085 -82:3:1089 -83:3:1097 -84:3:1098 -85:3:1103 -86:3:1110 -87:3:1111 -88:3:1118 -89:3:1123 -90:0:2103 -91:3:1134 -92:0:2103 -93:3:1138 -94:3:1139 -95:3:1143 -96:3:1147 -97:3:1148 -98:3:1152 -99:3:1160 -100:3:1161 -101:3:1166 -102:3:1173 -103:3:1174 -104:3:1181 -105:3:1186 -106:0:2103 -107:3:1197 -108:0:2103 -109:3:1205 -110:3:1206 -111:3:1210 -112:3:1214 -113:3:1215 -114:3:1219 -115:3:1227 -116:3:1228 -117:3:1233 -118:3:1240 -119:3:1241 -120:3:1248 -121:3:1253 -122:0:2103 -123:3:1264 -124:0:2103 -125:3:1266 -126:0:2103 -127:3:1267 -128:3:1271 -129:3:1272 -130:3:1280 -131:3:1281 -132:3:1285 -133:3:1286 -134:3:1294 -135:3:1299 -136:3:1303 -137:3:1304 -138:3:1311 -139:3:1312 -140:3:1323 -141:3:1324 -142:3:1325 -143:3:1336 -144:3:1341 -145:3:1342 -146:0:2103 -147:3:1354 -148:0:2103 -149:3:1356 -150:0:2103 -151:3:1359 -152:3:1360 -153:3:1372 -154:3:1373 -155:3:1377 -156:3:1378 -157:3:1386 -158:3:1391 -159:3:1395 -160:3:1396 -161:3:1403 -162:3:1404 -163:3:1415 -164:3:1416 -165:3:1417 -166:3:1428 -167:3:1433 -168:3:1434 -169:0:2103 -170:3:1446 -171:0:2103 -172:3:1448 -173:0:2103 -174:3:1449 -175:0:2103 -176:3:1450 -177:0:2103 -178:3:1451 -179:0:2103 -180:3:1452 -181:3:1456 -182:3:1457 -183:3:1465 -184:3:1466 -185:3:1470 -186:3:1471 -187:3:1479 -188:3:1484 -189:3:1488 -190:3:1489 -191:3:1496 -192:3:1497 -193:3:1508 -194:3:1509 -195:3:1510 -196:3:1521 -197:3:1526 -198:3:1527 -199:0:2103 -200:3:1539 -201:0:2103 -202:3:1736 -203:0:2103 -204:3:1834 -205:0:2103 -206:3:1835 -207:0:2103 -208:3:1839 -209:0:2103 -210:3:1848 -211:3:1849 -212:3:1853 -213:3:1857 -214:3:1858 -215:3:1862 -216:3:1870 -217:3:1871 -218:3:1876 -219:3:1883 -220:3:1884 -221:3:1891 -222:3:1896 -223:0:2103 -224:3:1907 -225:0:2103 -226:3:1911 -227:3:1912 -228:3:1916 -229:3:1920 -230:3:1921 -231:3:1925 -232:3:1933 -233:3:1934 -234:3:1939 -235:3:1946 -236:3:1947 -237:3:1954 -238:3:1959 -239:0:2103 -240:3:1970 -241:0:2103 -242:3:1978 -243:3:1979 -244:3:1983 -245:3:1987 -246:3:1988 -247:3:1992 -248:3:2000 -249:3:2001 -250:3:2006 -251:3:2013 -252:3:2014 -253:3:2021 -254:3:2026 -255:0:2103 -256:3:2037 -257:0:2103 -258:3:2039 -259:0:2103 -260:3:2040 -261:0:2103 -262:3:876 -263:0:2103 -264:3:877 -265:3:881 -266:3:882 -267:3:890 -268:3:891 -269:3:895 -270:3:896 -271:3:904 -272:3:909 -273:3:913 -274:3:914 -275:3:921 -276:3:922 -277:3:933 -278:3:934 -279:3:935 -280:3:946 -281:3:951 -282:3:952 -283:0:2103 -284:3:964 -285:0:2103 -286:3:966 -287:3:967 -288:0:2103 -289:3:971 -290:3:975 -291:3:976 -292:3:984 -293:3:985 -294:3:989 -295:3:990 -296:3:998 -297:3:1003 -298:3:1004 -299:3:1015 -300:3:1016 -301:3:1027 -302:3:1028 -303:3:1029 -304:3:1040 -305:3:1045 -306:3:1046 -307:0:2103 -308:3:1058 -309:0:2103 -310:3:1060 -311:0:2103 -312:3:1061 -313:0:2103 -314:3:1071 -315:0:2103 -316:3:1075 -317:3:1076 -318:3:1080 -319:3:1084 -320:3:1085 -321:3:1089 -322:3:1097 -323:3:1098 -324:3:1103 -325:3:1110 -326:3:1111 -327:3:1118 -328:3:1123 -329:0:2103 -330:3:1134 -331:0:2103 -332:3:1138 -333:3:1139 -334:3:1143 -335:3:1147 -336:3:1148 -337:3:1152 -338:3:1160 -339:3:1161 -340:3:1166 -341:3:1173 -342:3:1174 -343:3:1181 -344:3:1186 -345:0:2103 -346:3:1197 -347:0:2103 -348:3:1205 -349:3:1206 -350:3:1210 -351:3:1214 -352:3:1215 -353:3:1219 -354:3:1227 -355:3:1228 -356:3:1233 -357:3:1240 -358:3:1241 -359:3:1248 -360:3:1253 -361:0:2103 -362:3:1264 -363:0:2103 -364:3:1266 -365:0:2103 -366:3:1267 -367:3:1271 -368:3:1272 -369:3:1280 -370:3:1281 -371:3:1285 -372:3:1286 -373:3:1294 -374:3:1299 -375:3:1303 -376:3:1304 -377:3:1311 -378:3:1312 -379:3:1323 -380:3:1324 -381:3:1325 -382:3:1336 -383:3:1341 -384:3:1342 -385:0:2103 -386:3:1354 -387:0:2103 -388:3:1356 -389:0:2103 -390:3:1359 -391:3:1360 -392:3:1372 -393:3:1373 -394:3:1377 -395:3:1378 -396:3:1386 -397:3:1391 -398:3:1395 -399:3:1396 -400:3:1403 -401:3:1404 -402:3:1415 -403:3:1416 -404:3:1417 -405:3:1428 -406:3:1433 -407:3:1434 -408:0:2103 -409:3:1446 -410:0:2103 -411:3:1448 -412:0:2103 -413:3:1449 -414:0:2103 -415:3:1450 -416:0:2103 -417:3:1451 -418:0:2103 -419:3:1452 -420:3:1456 -421:3:1457 -422:3:1465 -423:3:1466 -424:3:1470 -425:3:1471 -426:3:1479 -427:3:1484 -428:3:1488 -429:3:1489 -430:3:1496 -431:3:1497 -432:3:1508 -433:3:1509 -434:3:1510 -435:3:1521 -436:3:1526 -437:3:1527 -438:0:2103 -439:3:1539 -440:0:2103 -441:3:1736 -442:0:2103 -443:3:1834 -444:0:2103 -445:3:1835 -446:0:2103 -447:3:1839 -448:0:2103 -449:3:1848 -450:3:1849 -451:3:1853 -452:3:1857 -453:3:1858 -454:3:1862 -455:3:1870 -456:3:1871 -457:3:1876 -458:3:1883 -459:3:1884 -460:3:1891 -461:3:1896 -462:0:2103 -463:3:1907 -464:0:2103 -465:3:1911 -466:3:1912 -467:3:1916 -468:3:1920 -469:3:1921 -470:3:1925 -471:3:1933 -472:3:1934 -473:3:1939 -474:3:1946 -475:3:1947 -476:3:1954 -477:3:1959 -478:0:2103 -479:3:1970 -480:0:2103 -481:3:1978 -482:3:1979 -483:3:1983 -484:3:1987 -485:3:1988 -486:3:1992 -487:3:2000 -488:3:2001 -489:3:2006 -490:3:2013 -491:3:2014 -492:3:2021 -493:3:2026 -494:0:2103 -495:3:2037 -496:0:2103 -497:3:2039 -498:0:2103 -499:3:2040 -500:0:2103 -501:3:876 -502:0:2103 -503:3:877 -504:3:881 -505:3:882 -506:3:890 -507:3:891 -508:3:895 -509:3:896 -510:3:904 -511:3:909 -512:3:913 -513:3:914 -514:3:921 -515:3:922 -516:3:933 -517:3:934 -518:3:935 -519:3:946 -520:3:951 -521:3:952 -522:0:2103 -523:3:964 -524:0:2103 -525:3:966 -526:3:967 -527:0:2103 -528:3:971 -529:3:975 -530:3:976 -531:3:984 -532:3:985 -533:3:989 -534:3:990 -535:3:998 -536:3:1003 -537:3:1004 -538:3:1015 -539:3:1016 -540:3:1027 -541:3:1028 -542:3:1029 -543:3:1040 -544:3:1045 -545:3:1046 -546:0:2103 -547:3:1058 -548:0:2103 -549:3:1060 -550:0:2103 -551:3:1061 -552:0:2103 -553:3:1071 -554:0:2103 -555:3:1075 -556:3:1076 -557:3:1080 -558:3:1084 -559:3:1085 -560:3:1089 -561:3:1097 -562:3:1098 -563:3:1103 -564:3:1110 -565:3:1111 -566:3:1118 -567:3:1123 -568:0:2103 -569:3:1134 -570:0:2103 -571:3:1138 -572:3:1139 -573:3:1143 -574:3:1147 -575:3:1148 -576:3:1152 -577:3:1160 -578:3:1161 -579:3:1166 -580:3:1173 -581:3:1174 -582:3:1181 -583:3:1186 -584:0:2103 -585:3:1197 -586:0:2103 -587:3:1205 -588:3:1206 -589:3:1210 -590:3:1214 -591:3:1215 -592:3:1219 -593:3:1227 -594:3:1228 -595:3:1233 -596:3:1240 -597:3:1241 -598:3:1248 -599:3:1253 -600:0:2103 -601:3:1264 -602:0:2103 -603:3:1266 -604:0:2103 -605:3:1267 -606:3:1271 -607:3:1272 -608:3:1280 -609:3:1281 -610:3:1285 -611:3:1286 -612:3:1294 -613:3:1299 -614:3:1303 -615:3:1304 -616:3:1311 -617:3:1312 -618:3:1323 -619:3:1324 -620:3:1325 -621:3:1336 -622:3:1341 -623:3:1342 -624:0:2103 -625:3:1354 -626:0:2103 -627:3:1356 -628:0:2103 -629:3:1359 -630:3:1360 -631:3:1372 -632:3:1373 -633:3:1377 -634:3:1378 -635:3:1386 -636:3:1391 -637:3:1395 -638:3:1396 -639:3:1403 -640:3:1404 -641:3:1415 -642:3:1416 -643:3:1417 -644:3:1428 -645:3:1433 -646:3:1434 -647:0:2103 -648:3:1446 -649:0:2103 -650:3:1448 -651:0:2103 -652:3:1449 -653:0:2103 -654:3:1450 -655:0:2103 -656:3:1451 -657:0:2103 -658:3:1452 -659:3:1456 -660:3:1457 -661:3:1465 -662:3:1466 -663:3:1470 -664:3:1471 -665:3:1479 -666:3:1484 -667:3:1488 -668:3:1489 -669:3:1496 -670:3:1497 -671:3:1508 -672:3:1509 -673:3:1510 -674:3:1521 -675:3:1526 -676:3:1527 -677:0:2103 -678:3:1539 -679:0:2103 -680:3:1736 -681:0:2103 -682:3:1834 -683:0:2103 -684:3:1835 -685:0:2103 -686:3:1839 -687:0:2103 -688:3:1848 -689:3:1849 -690:3:1853 -691:3:1857 -692:3:1858 -693:3:1862 -694:3:1870 -695:3:1871 -696:3:1876 -697:3:1883 -698:3:1884 -699:3:1891 -700:3:1896 -701:0:2103 -702:3:1907 -703:0:2103 -704:3:1911 -705:3:1912 -706:3:1916 -707:3:1920 -708:3:1921 -709:3:1925 -710:3:1933 -711:3:1934 -712:3:1939 -713:3:1946 -714:3:1947 -715:3:1954 -716:3:1959 -717:0:2103 -718:3:1970 -719:0:2103 -720:3:1978 -721:3:1979 -722:3:1983 -723:3:1987 -724:3:1988 -725:3:1992 -726:3:2000 -727:3:2001 -728:3:2006 -729:3:2013 -730:3:2014 -731:3:2021 -732:3:2026 -733:0:2103 -734:3:2037 -735:0:2103 -736:3:2039 -737:0:2103 -738:3:2040 -739:0:2103 -740:3:876 -741:0:2103 -742:3:877 -743:3:881 -744:3:882 -745:3:890 -746:3:891 -747:3:895 -748:3:896 -749:3:904 -750:3:909 -751:3:913 -752:3:914 -753:3:921 -754:3:922 -755:3:933 -756:3:934 -757:3:935 -758:3:946 -759:3:951 -760:3:952 -761:0:2103 -762:3:964 -763:0:2103 -764:3:966 -765:3:967 -766:0:2103 -767:3:971 -768:3:975 -769:3:976 -770:3:984 -771:3:985 -772:3:989 -773:3:990 -774:3:998 -775:3:1003 -776:3:1004 -777:3:1015 -778:3:1016 -779:3:1027 -780:3:1028 -781:3:1029 -782:3:1040 -783:3:1045 -784:3:1046 -785:0:2103 -786:3:1058 -787:0:2103 -788:3:1060 -789:0:2103 -790:3:1061 -791:0:2103 -792:3:1071 -793:0:2103 -794:3:1075 -795:3:1076 -796:3:1080 -797:3:1084 -798:3:1085 -799:3:1089 -800:3:1097 -801:3:1098 -802:3:1103 -803:3:1110 -804:3:1111 -805:3:1118 -806:3:1123 -807:0:2103 -808:3:1134 -809:0:2103 -810:3:1138 -811:3:1139 -812:3:1143 -813:3:1147 -814:3:1148 -815:3:1152 -816:3:1160 -817:3:1161 -818:3:1166 -819:3:1173 -820:3:1174 -821:3:1181 -822:3:1186 -823:0:2103 -824:3:1197 -825:0:2103 -826:3:1205 -827:3:1206 -828:3:1210 -829:3:1214 -830:3:1215 -831:3:1219 -832:3:1227 -833:3:1228 -834:3:1233 -835:3:1240 -836:3:1241 -837:3:1248 -838:3:1253 -839:0:2103 -840:3:1264 -841:0:2103 -842:3:1266 -843:0:2103 -844:3:1267 -845:3:1271 -846:3:1272 -847:3:1280 -848:3:1281 -849:3:1285 -850:3:1286 -851:3:1294 -852:3:1299 -853:3:1303 -854:3:1304 -855:3:1311 -856:3:1312 -857:3:1323 -858:3:1324 -859:3:1325 -860:3:1336 -861:3:1341 -862:3:1342 -863:0:2103 -864:3:1354 -865:0:2103 -866:3:1356 -867:0:2103 -868:3:1359 -869:3:1360 -870:3:1372 -871:3:1373 -872:3:1377 -873:3:1378 -874:3:1386 -875:3:1391 -876:3:1395 -877:3:1396 -878:3:1403 -879:3:1404 -880:3:1415 -881:3:1416 -882:3:1417 -883:3:1428 -884:3:1433 -885:3:1434 -886:0:2103 -887:3:1446 -888:0:2103 -889:3:1448 -890:0:2103 -891:3:1449 -892:0:2103 -893:3:1450 -894:0:2103 -895:3:1451 -896:0:2103 -897:3:1452 -898:3:1456 -899:3:1457 -900:3:1465 -901:3:1466 -902:3:1470 -903:3:1471 -904:3:1479 -905:3:1484 -906:3:1488 -907:3:1489 -908:3:1496 -909:3:1497 -910:3:1508 -911:3:1509 -912:3:1510 -913:3:1521 -914:3:1526 -915:3:1527 -916:0:2103 -917:3:1539 -918:0:2103 -919:3:1736 -920:0:2103 -921:3:1834 -922:0:2103 -923:3:1835 -924:0:2103 -925:3:1839 -926:0:2103 -927:3:1848 -928:3:1849 -929:3:1853 -930:3:1857 -931:3:1858 -932:3:1862 -933:3:1870 -934:3:1871 -935:3:1876 -936:3:1883 -937:3:1884 -938:3:1891 -939:3:1896 -940:0:2103 -941:3:1907 -942:0:2103 -943:2:458 -944:0:2103 -945:2:464 -946:0:2103 -947:2:465 -948:0:2103 -949:2:466 -950:0:2103 -951:2:467 -952:0:2103 -953:1:2 -954:0:2103 -955:2:468 -956:0:2103 -957:1:8 -958:0:2103 -959:1:9 -960:0:2103 -961:1:10 -962:0:2103 -963:1:11 -964:0:2103 -965:2:467 -966:0:2103 -967:1:12 -968:1:16 -969:1:17 -970:1:25 -971:1:26 -972:1:30 -973:1:31 -974:1:39 -975:1:44 -976:1:48 -977:1:49 -978:1:63 -979:1:64 -980:1:68 -981:1:69 -982:1:70 -983:1:81 -984:1:86 -985:1:87 -986:0:2103 -987:2:468 -988:0:2103 -989:1:99 -990:0:2103 -991:2:469 -992:0:2103 -993:2:475 -994:0:2103 -995:2:476 -996:0:2103 -997:2:477 -998:2:481 -999:2:482 -1000:2:490 -1001:2:491 -1002:2:495 -1003:2:496 -1004:2:504 -1005:2:509 -1006:2:513 -1007:2:514 -1008:2:528 -1009:2:529 -1010:2:533 -1011:2:534 -1012:2:535 -1013:2:546 -1014:2:551 -1015:2:552 -1016:0:2103 -1017:2:564 -1018:0:2103 -1019:2:565 -1020:2:569 -1021:2:570 -1022:2:578 -1023:2:579 -1024:2:583 -1025:2:584 -1026:2:592 -1027:2:597 -1028:2:601 -1029:2:602 -1030:2:616 -1031:2:617 -1032:2:621 -1033:2:622 -1034:2:623 -1035:2:634 -1036:2:639 -1037:2:640 -1038:0:2103 -1039:2:652 -1040:0:2103 -1041:2:653 -1042:0:2103 -1043:3:1911 -1044:3:1912 -1045:3:1916 -1046:3:1920 -1047:3:1921 -1048:3:1925 -1049:3:1933 -1050:3:1934 -1051:3:1939 -1052:3:1946 -1053:3:1947 -1054:3:1954 -1055:3:1959 -1056:0:2103 -1057:3:1970 -1058:0:2103 -1059:3:1978 -1060:3:1979 -1061:3:1983 -1062:3:1987 -1063:3:1988 -1064:3:1992 -1065:3:2000 -1066:3:2001 -1067:3:2006 -1068:3:2013 -1069:3:2014 -1070:3:2021 -1071:3:2026 -1072:0:2103 -1073:3:2037 -1074:0:2103 -1075:3:2039 -1076:0:2103 -1077:3:2040 -1078:0:2103 -1079:3:876 -1080:0:2103 -1081:3:877 -1082:3:881 -1083:3:882 -1084:3:890 -1085:3:891 -1086:3:895 -1087:3:896 -1088:3:904 -1089:3:909 -1090:3:913 -1091:3:914 -1092:3:921 -1093:3:922 -1094:3:933 -1095:3:934 -1096:3:935 -1097:3:946 -1098:3:951 -1099:3:952 -1100:0:2103 -1101:3:964 -1102:0:2103 -1103:3:966 -1104:3:967 -1105:0:2103 -1106:3:971 -1107:3:975 -1108:3:976 -1109:3:984 -1110:3:985 -1111:3:989 -1112:3:990 -1113:3:998 -1114:3:1003 -1115:3:1004 -1116:3:1015 -1117:3:1016 -1118:3:1027 -1119:3:1028 -1120:3:1029 -1121:3:1040 -1122:3:1045 -1123:3:1046 -1124:0:2103 -1125:3:1058 -1126:0:2103 -1127:3:1060 -1128:0:2103 -1129:3:1061 -1130:0:2103 -1131:3:1071 -1132:0:2103 -1133:3:1075 -1134:3:1076 -1135:3:1080 -1136:3:1084 -1137:3:1085 -1138:3:1089 -1139:3:1097 -1140:3:1098 -1141:3:1103 -1142:3:1110 -1143:3:1111 -1144:3:1118 -1145:3:1123 -1146:0:2103 -1147:3:1134 -1148:0:2103 -1149:2:654 -1150:2:658 -1151:2:659 -1152:2:667 -1153:2:668 -1154:2:672 -1155:2:673 -1156:2:681 -1157:2:686 -1158:2:690 -1159:2:691 -1160:2:698 -1161:2:699 -1162:2:710 -1163:2:711 -1164:2:712 -1165:2:723 -1166:2:735 -1167:2:736 -1168:0:2103 -1169:2:741 -1170:0:2103 -1171:2:750 -1172:0:2103 -1173:2:753 -1174:0:2103 -1175:2:758 -1176:0:2103 -1177:3:1138 -1178:3:1139 -1179:3:1143 -1180:3:1144 -1181:3:1152 -1182:3:1160 -1183:3:1161 -1184:3:1166 -1185:3:1173 -1186:3:1174 -1187:3:1181 -1188:3:1186 -1189:0:2103 -1190:3:1197 -1191:0:2103 -1192:3:1205 -1193:3:1206 -1194:3:1210 -1195:3:1214 -1196:3:1215 -1197:3:1219 -1198:3:1227 -1199:3:1228 -1200:3:1233 -1201:3:1240 -1202:3:1241 -1203:3:1248 -1204:3:1253 -1205:0:2103 -1206:3:1264 -1207:0:2103 -1208:3:1266 -1209:0:2103 -1210:3:1267 -1211:3:1271 -1212:3:1272 -1213:3:1280 -1214:3:1281 -1215:3:1285 -1216:3:1286 -1217:3:1294 -1218:3:1299 -1219:3:1303 -1220:3:1304 -1221:3:1311 -1222:3:1312 -1223:3:1323 -1224:3:1324 -1225:3:1325 -1226:3:1336 -1227:3:1341 -1228:3:1342 -1229:0:2103 -1230:3:1354 -1231:0:2103 -1232:3:1356 -1233:0:2103 -1234:3:1359 -1235:3:1360 -1236:3:1372 -1237:3:1373 -1238:3:1377 -1239:3:1378 -1240:3:1386 -1241:3:1391 -1242:3:1395 -1243:3:1396 -1244:3:1403 -1245:3:1404 -1246:3:1415 -1247:3:1416 -1248:3:1417 -1249:3:1428 -1250:3:1433 -1251:3:1434 -1252:0:2103 -1253:3:1446 -1254:0:2103 -1255:3:1448 -1256:0:2103 -1257:3:1449 -1258:0:2103 -1259:3:1450 -1260:0:2103 -1261:3:1451 -1262:0:2103 -1263:3:1452 -1264:3:1456 -1265:3:1457 -1266:3:1465 -1267:3:1466 -1268:3:1470 -1269:3:1471 -1270:3:1479 -1271:3:1484 -1272:3:1488 -1273:3:1489 -1274:3:1496 -1275:3:1497 -1276:3:1508 -1277:3:1509 -1278:3:1510 -1279:3:1521 -1280:3:1526 -1281:3:1527 -1282:0:2103 -1283:3:1539 -1284:0:2103 -1285:3:1736 -1286:0:2103 -1287:3:1834 -1288:0:2103 -1289:3:1835 -1290:0:2103 -1291:3:1839 -1292:0:2103 -1293:3:1848 -1294:3:1849 -1295:3:1853 -1296:3:1857 -1297:3:1858 -1298:3:1862 -1299:3:1870 -1300:3:1871 -1301:3:1876 -1302:3:1883 -1303:3:1884 -1304:3:1891 -1305:3:1896 -1306:0:2103 -1307:3:1907 -1308:0:2103 -1309:3:1911 -1310:3:1912 -1311:3:1916 -1312:3:1920 -1313:3:1921 -1314:3:1925 -1315:3:1933 -1316:3:1934 -1317:3:1939 -1318:3:1946 -1319:3:1947 -1320:3:1954 -1321:3:1959 -1322:0:2103 -1323:3:1970 -1324:0:2103 -1325:3:1978 -1326:3:1979 -1327:3:1983 -1328:3:1987 -1329:3:1988 -1330:3:1992 -1331:3:2000 -1332:3:2001 -1333:3:2006 -1334:3:2013 -1335:3:2014 -1336:3:2021 -1337:3:2026 -1338:0:2103 -1339:3:2037 -1340:0:2103 -1341:3:2039 -1342:0:2103 -1343:3:2040 -1344:0:2103 -1345:3:2043 -1346:0:2103 -1347:3:2048 -1348:0:2103 -1349:2:759 -1350:0:2101 -1351:3:2049 -1352:0:2107 -1353:3:1181 diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress.ltl b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_reader.define b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_reader.log b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_reader.log deleted file mode 100644 index e3ec127..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_reader.log +++ /dev/null @@ -1,506 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_reader.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -depth 15: Claim reached state 9 (line 749) -depth 1803: Claim reached state 9 (line 748) -Depth= 5838 States= 1e+06 Transitions= 1.06e+07 Memory= 494.865 t= 9.24 R= 1e+05 -Depth= 5838 States= 2e+06 Transitions= 1.97e+07 Memory= 532.658 t= 17.7 R= 1e+05 -Depth= 5838 States= 3e+06 Transitions= 3.15e+07 Memory= 555.315 t= 28.4 R= 1e+05 -pan: resizing hashtable to -w22.. done -Depth= 6855 States= 4e+06 Transitions= 4.32e+07 Memory= 613.096 t= 39.1 R= 1e+05 -Depth= 9059 States= 5e+06 Transitions= 5.48e+07 Memory= 642.295 t= 49.5 R= 1e+05 -Depth= 9059 States= 6e+06 Transitions= 6.91e+07 Memory= 672.178 t= 62.5 R= 1e+05 -Depth= 9059 States= 7e+06 Transitions= 7.99e+07 Memory= 706.455 t= 72.5 R= 1e+05 -Depth= 9059 States= 8e+06 Transitions= 9.23e+07 Memory= 735.752 t= 84 R= 1e+05 -Depth= 9059 States= 9e+06 Transitions= 1.04e+08 Memory= 766.318 t= 94.5 R= 1e+05 -pan: resizing hashtable to -w24.. done -Depth= 9059 States= 1e+07 Transitions= 1.16e+08 Memory= 920.002 t= 106 R= 9e+04 -Depth= 9059 States= 1.1e+07 Transitions= 1.3e+08 Memory= 945.002 t= 119 R= 9e+04 -Depth= 9059 States= 1.2e+07 Transitions= 1.54e+08 Memory= 967.756 t= 140 R= 9e+04 -Depth= 9059 States= 1.3e+07 Transitions= 1.72e+08 Memory= 995.002 t= 157 R= 8e+04 -Depth= 9059 States= 1.4e+07 Transitions= 1.92e+08 Memory= 1022.736 t= 175 R= 8e+04 -Depth= 9059 States= 1.5e+07 Transitions= 2.1e+08 Memory= 1050.080 t= 191 R= 8e+04 -Depth= 9059 States= 1.6e+07 Transitions= 2.22e+08 Memory= 1082.502 t= 203 R= 8e+04 -Depth= 9059 States= 1.7e+07 Transitions= 2.41e+08 Memory= 1108.479 t= 219 R= 8e+04 -Depth= 9059 States= 1.8e+07 Transitions= 2.58e+08 Memory= 1134.455 t= 235 R= 8e+04 -Depth= 9059 States= 1.9e+07 Transitions= 2.7e+08 Memory= 1164.533 t= 246 R= 8e+04 -Depth= 9059 States= 2e+07 Transitions= 2.83e+08 Memory= 1193.830 t= 258 R= 8e+04 -Depth= 9059 States= 2.1e+07 Transitions= 3.03e+08 Memory= 1219.026 t= 276 R= 8e+04 -Depth= 9059 States= 2.2e+07 Transitions= 3.19e+08 Memory= 1248.420 t= 291 R= 8e+04 -Depth= 9059 States= 2.3e+07 Transitions= 3.42e+08 Memory= 1271.858 t= 312 R= 7e+04 -Depth= 9059 States= 2.4e+07 Transitions= 3.6e+08 Memory= 1298.908 t= 328 R= 7e+04 -Depth= 9059 States= 2.5e+07 Transitions= 3.84e+08 Memory= 1323.127 t= 350 R= 7e+04 -Depth= 9059 States= 2.6e+07 Transitions= 4e+08 Memory= 1348.518 t= 365 R= 7e+04 -Depth= 9059 States= 2.7e+07 Transitions= 4.16e+08 Memory= 1379.865 t= 380 R= 7e+04 -Depth= 9059 States= 2.8e+07 Transitions= 4.26e+08 Memory= 1411.115 t= 389 R= 7e+04 -Depth= 9059 States= 2.9e+07 Transitions= 4.42e+08 Memory= 1439.631 t= 404 R= 7e+04 -Depth= 9059 States= 3e+07 Transitions= 4.64e+08 Memory= 1462.385 t= 423 R= 7e+04 -Depth= 9059 States= 3.1e+07 Transitions= 4.82e+08 Memory= 1490.998 t= 439 R= 7e+04 -Depth= 9059 States= 3.2e+07 Transitions= 4.99e+08 Memory= 1519.514 t= 456 R= 7e+04 -Depth= 9059 States= 3.3e+07 Transitions= 5.18e+08 Memory= 1545.393 t= 473 R= 7e+04 -Depth= 9059 States= 3.4e+07 Transitions= 5.33e+08 Memory= 1578.108 t= 486 R= 7e+04 -pan: resizing hashtable to -w26.. done -Depth= 9059 States= 3.5e+07 Transitions= 5.49e+08 Memory= 2098.994 t= 504 R= 7e+04 -Depth= 9059 States= 3.6e+07 Transitions= 5.74e+08 Memory= 2121.651 t= 528 R= 7e+04 -Depth= 9059 States= 3.7e+07 Transitions= 5.96e+08 Memory= 2147.334 t= 547 R= 7e+04 -Depth= 9059 States= 3.8e+07 Transitions= 6.17e+08 Memory= 2170.186 t= 567 R= 7e+04 -Depth= 9059 States= 3.9e+07 Transitions= 6.3e+08 Memory= 2199.776 t= 578 R= 7e+04 -Depth= 9059 States= 4e+07 Transitions= 6.53e+08 Memory= 2225.459 t= 599 R= 7e+04 -Depth= 9059 States= 4.1e+07 Transitions= 6.69e+08 Memory= 2250.361 t= 614 R= 7e+04 -Depth= 9059 States= 4.2e+07 Transitions= 6.85e+08 Memory= 2279.268 t= 628 R= 7e+04 -Depth= 9059 States= 4.3e+07 Transitions= 7.03e+08 Memory= 2304.463 t= 644 R= 7e+04 -Depth= 9059 States= 4.4e+07 Transitions= 7.13e+08 Memory= 2338.252 t= 654 R= 7e+04 -Depth= 9059 States= 4.5e+07 Transitions= 7.25e+08 Memory= 2366.768 t= 665 R= 7e+04 -Depth= 9059 States= 4.6e+07 Transitions= 7.41e+08 Memory= 2393.330 t= 679 R= 7e+04 -Depth= 9059 States= 4.7e+07 Transitions= 7.57e+08 Memory= 2420.381 t= 694 R= 7e+04 -Depth= 9059 States= 4.8e+07 Transitions= 7.72e+08 Memory= 2447.041 t= 708 R= 7e+04 -Depth= 9059 States= 4.9e+07 Transitions= 7.88e+08 Memory= 2476.143 t= 722 R= 7e+04 -Depth= 9059 States= 5e+07 Transitions= 8.04e+08 Memory= 2501.045 t= 737 R= 7e+04 -Depth= 9059 States= 5.1e+07 Transitions= 8.2e+08 Memory= 2530.440 t= 752 R= 7e+04 -Depth= 9059 States= 5.2e+07 Transitions= 8.37e+08 Memory= 2554.854 t= 766 R= 7e+04 -Depth= 9059 States= 5.3e+07 Transitions= 8.5e+08 Memory= 2583.467 t= 779 R= 7e+04 -Depth= 9059 States= 5.4e+07 Transitions= 8.66e+08 Memory= 2611.299 t= 794 R= 7e+04 -Depth= 9059 States= 5.5e+07 Transitions= 8.79e+08 Memory= 2640.791 t= 805 R= 7e+04 -Depth= 9059 States= 5.6e+07 Transitions= 8.9e+08 Memory= 2672.139 t= 815 R= 7e+04 -Depth= 9059 States= 5.7e+07 Transitions= 9.05e+08 Memory= 2702.705 t= 829 R= 7e+04 -Depth= 9059 States= 5.8e+07 Transitions= 9.22e+08 Memory= 2727.998 t= 845 R= 7e+04 -Depth= 9059 States= 5.9e+07 Transitions= 9.38e+08 Memory= 2754.463 t= 859 R= 7e+04 -Depth= 9059 States= 6e+07 Transitions= 9.49e+08 Memory= 2789.717 t= 870 R= 7e+04 -Depth= 9059 States= 6.1e+07 Transitions= 9.62e+08 Memory= 2817.744 t= 881 R= 7e+04 -Depth= 9059 States= 6.2e+07 Transitions= 9.79e+08 Memory= 2838.447 t= 896 R= 7e+04 -Depth= 9059 States= 6.3e+07 Transitions= 1e+09 Memory= 2863.154 t= 919 R= 7e+04 -Depth= 9059 States= 6.4e+07 Transitions= 1.02e+09 Memory= 2889.131 t= 936 R= 7e+04 -Depth= 9059 States= 6.5e+07 Transitions= 1.04e+09 Memory= 2919.502 t= 952 R= 7e+04 -Depth= 9059 States= 6.6e+07 Transitions= 1.06e+09 Memory= 2943.916 t= 968 R= 7e+04 -Depth= 9059 States= 6.7e+07 Transitions= 1.07e+09 Memory= 2978.975 t= 979 R= 7e+04 -Depth= 9059 States= 6.8e+07 Transitions= 1.09e+09 Memory= 3003.877 t= 996 R= 7e+04 -Depth= 9059 States= 6.9e+07 Transitions= 1.11e+09 Memory= 3028.584 t= 1.01e+03 R= 7e+04 -Depth= 9059 States= 7e+07 Transitions= 1.12e+09 Memory= 3058.174 t= 1.02e+03 R= 7e+04 -Depth= 9059 States= 7.1e+07 Transitions= 1.13e+09 Memory= 3088.350 t= 1.04e+03 R= 7e+04 -Depth= 9059 States= 7.2e+07 Transitions= 1.15e+09 Memory= 3113.350 t= 1.05e+03 R= 7e+04 -Depth= 9059 States= 7.3e+07 Transitions= 1.17e+09 Memory= 3142.158 t= 1.07e+03 R= 7e+04 -Depth= 9059 States= 7.4e+07 Transitions= 1.19e+09 Memory= 3166.279 t= 1.09e+03 R= 7e+04 -Depth= 9059 States= 7.5e+07 Transitions= 1.21e+09 Memory= 3192.744 t= 1.11e+03 R= 7e+04 -Depth= 9059 States= 7.6e+07 Transitions= 1.23e+09 Memory= 3217.256 t= 1.13e+03 R= 7e+04 -Depth= 9059 States= 7.7e+07 Transitions= 1.25e+09 Memory= 3242.549 t= 1.14e+03 R= 7e+04 -Depth= 9059 States= 7.8e+07 Transitions= 1.26e+09 Memory= 3273.115 t= 1.16e+03 R= 7e+04 -Depth= 9059 States= 7.9e+07 Transitions= 1.27e+09 Memory= 3303.975 t= 1.17e+03 R= 7e+04 -Depth= 9059 States= 8e+07 Transitions= 1.29e+09 Memory= 3334.541 t= 1.18e+03 R= 7e+04 -Depth= 9059 States= 8.1e+07 Transitions= 1.31e+09 Memory= 3356.221 t= 1.2e+03 R= 7e+04 -Depth= 9059 States= 8.2e+07 Transitions= 1.33e+09 Memory= 3385.127 t= 1.22e+03 R= 7e+04 -Depth= 9059 States= 8.3e+07 Transitions= 1.35e+09 Memory= 3412.959 t= 1.23e+03 R= 7e+04 -Depth= 9059 States= 8.4e+07 Transitions= 1.37e+09 Memory= 3438.936 t= 1.25e+03 R= 7e+04 -Depth= 9059 States= 8.5e+07 Transitions= 1.38e+09 Memory= 3471.455 t= 1.26e+03 R= 7e+04 -Depth= 9059 States= 8.6e+07 Transitions= 1.4e+09 Memory= 3498.115 t= 1.28e+03 R= 7e+04 -Depth= 9059 States= 8.7e+07 Transitions= 1.42e+09 Memory= 3519.014 t= 1.3e+03 R= 7e+04 -Depth= 9059 States= 8.8e+07 Transitions= 1.44e+09 Memory= 3546.162 t= 1.32e+03 R= 7e+04 -Depth= 9059 States= 8.9e+07 Transitions= 1.46e+09 Memory= 3567.842 t= 1.34e+03 R= 7e+04 -Depth= 9059 States= 9e+07 Transitions= 1.48e+09 Memory= 3598.799 t= 1.35e+03 R= 7e+04 -Depth= 9059 States= 9.1e+07 Transitions= 1.5e+09 Memory= 3622.920 t= 1.37e+03 R= 7e+04 -Depth= 9059 States= 9.2e+07 Transitions= 1.52e+09 Memory= 3648.701 t= 1.39e+03 R= 7e+04 -Depth= 9059 States= 9.3e+07 Transitions= 1.53e+09 Memory= 3676.045 t= 1.4e+03 R= 7e+04 -Depth= 9059 States= 9.4e+07 Transitions= 1.55e+09 Memory= 3702.412 t= 1.42e+03 R= 7e+04 -Depth= 9059 States= 9.5e+07 Transitions= 1.56e+09 Memory= 3735.713 t= 1.43e+03 R= 7e+04 -Depth= 9059 States= 9.6e+07 Transitions= 1.57e+09 Memory= 3764.522 t= 1.44e+03 R= 7e+04 -Depth= 9059 States= 9.7e+07 Transitions= 1.59e+09 Memory= 3790.693 t= 1.45e+03 R= 7e+04 -Depth= 9059 States= 9.8e+07 Transitions= 1.61e+09 Memory= 3817.940 t= 1.47e+03 R= 7e+04 -Depth= 9059 States= 9.9e+07 Transitions= 1.62e+09 Memory= 3845.283 t= 1.48e+03 R= 7e+04 -Depth= 9059 States= 1e+08 Transitions= 1.64e+09 Memory= 3873.213 t= 1.5e+03 R= 7e+04 -Depth= 9059 States= 1.01e+08 Transitions= 1.65e+09 Memory= 3897.920 t= 1.51e+03 R= 7e+04 -Depth= 9059 States= 1.02e+08 Transitions= 1.67e+09 Memory= 3926.631 t= 1.53e+03 R= 7e+04 -Depth= 9059 States= 1.03e+08 Transitions= 1.68e+09 Memory= 3952.315 t= 1.54e+03 R= 7e+04 -Depth= 9059 States= 1.04e+08 Transitions= 1.7e+09 Memory= 3981.026 t= 1.56e+03 R= 7e+04 -Depth= 9059 States= 1.05e+08 Transitions= 1.71e+09 Memory= 4010.029 t= 1.57e+03 R= 7e+04 -Depth= 9059 States= 1.06e+08 Transitions= 1.73e+09 Memory= 4038.838 t= 1.58e+03 R= 7e+04 -Depth= 9059 States= 1.07e+08 Transitions= 1.74e+09 Memory= 4070.381 t= 1.59e+03 R= 7e+04 -Depth= 9059 States= 1.08e+08 Transitions= 1.75e+09 Memory= 4099.385 t= 1.61e+03 R= 7e+04 -Depth= 9059 States= 1.09e+08 Transitions= 1.77e+09 Memory= 4126.338 t= 1.62e+03 R= 7e+04 -Depth= 9059 States= 1.1e+08 Transitions= 1.79e+09 Memory= 4151.924 t= 1.64e+03 R= 7e+04 -Depth= 9059 States= 1.11e+08 Transitions= 1.8e+09 Memory= 4187.276 t= 1.65e+03 R= 7e+04 -Depth= 9059 States= 1.12e+08 Transitions= 1.81e+09 Memory= 4214.326 t= 1.66e+03 R= 7e+04 -Depth= 9059 States= 1.13e+08 Transitions= 1.83e+09 Memory= 4237.471 t= 1.67e+03 R= 7e+04 -Depth= 9059 States= 1.14e+08 Transitions= 1.85e+09 Memory= 4261.104 t= 1.7e+03 R= 7e+04 -Depth= 9059 States= 1.15e+08 Transitions= 1.87e+09 Memory= 4286.690 t= 1.71e+03 R= 7e+04 -Depth= 9059 States= 1.16e+08 Transitions= 1.89e+09 Memory= 4314.619 t= 1.73e+03 R= 7e+04 -Depth= 9059 States= 1.17e+08 Transitions= 1.91e+09 Memory= 4341.768 t= 1.75e+03 R= 7e+04 -Depth= 9059 States= 1.18e+08 Transitions= 1.92e+09 Memory= 4375.166 t= 1.76e+03 R= 7e+04 -Depth= 9059 States= 1.19e+08 Transitions= 1.94e+09 Memory= 4401.338 t= 1.78e+03 R= 7e+04 -Depth= 9059 States= 1.2e+08 Transitions= 1.95e+09 Memory= 4426.436 t= 1.79e+03 R= 7e+04 -Depth= 9059 States= 1.21e+08 Transitions= 1.97e+09 Memory= 4456.807 t= 1.8e+03 R= 7e+04 -Depth= 9059 States= 1.22e+08 Transitions= 1.98e+09 Memory= 4486.592 t= 1.82e+03 R= 7e+04 -Depth= 9059 States= 1.23e+08 Transitions= 2e+09 Memory= 4511.787 t= 1.83e+03 R= 7e+04 -Depth= 9059 States= 1.24e+08 Transitions= 2.02e+09 Memory= 4540.108 t= 1.85e+03 R= 7e+04 -Depth= 9059 States= 1.25e+08 Transitions= 2.04e+09 Memory= 4564.033 t= 1.87e+03 R= 7e+04 -Depth= 9059 States= 1.26e+08 Transitions= 2.06e+09 Memory= 4591.865 t= 1.89e+03 R= 7e+04 -Depth= 9059 States= 1.27e+08 Transitions= 2.08e+09 Memory= 4615.889 t= 1.91e+03 R= 7e+04 -Depth= 9059 States= 1.28e+08 Transitions= 2.1e+09 Memory= 4640.303 t= 1.92e+03 R= 7e+04 -Depth= 9059 States= 1.29e+08 Transitions= 2.11e+09 Memory= 4670.479 t= 1.94e+03 R= 7e+04 -Depth= 9059 States= 1.3e+08 Transitions= 2.12e+09 Memory= 4702.998 t= 1.95e+03 R= 7e+04 -Depth= 9059 States= 1.31e+08 Transitions= 2.14e+09 Memory= 4732.393 t= 1.96e+03 R= 7e+04 -Depth= 9059 States= 1.32e+08 Transitions= 2.16e+09 Memory= 4754.756 t= 1.98e+03 R= 7e+04 -Depth= 9059 States= 1.33e+08 Transitions= 2.18e+09 Memory= 4783.174 t= 2e+03 R= 7e+04 -Depth= 9059 States= 1.34e+08 Transitions= 2.19e+09 Memory= 4810.518 t= 2.01e+03 R= 7e+04 -Depth= 9059 States= 1.35e+08 Transitions= 2.21e+09 Memory= 4837.568 t= 2.03e+03 R= 7e+04 -pan: resizing hashtable to -w28.. done -Depth= 9059 States= 1.36e+08 Transitions= 2.23e+09 Memory= 6885.568 t= 2.06e+03 R= 7e+04 -Depth= 9059 States= 1.37e+08 Transitions= 2.24e+09 Memory= 6885.568 t= 2.08e+03 R= 7e+04 -Depth= 9059 States= 1.38e+08 Transitions= 2.27e+09 Memory= 6900.412 t= 2.1e+03 R= 7e+04 -Depth= 9059 States= 1.39e+08 Transitions= 2.29e+09 Memory= 6927.658 t= 2.12e+03 R= 7e+04 -Depth= 9059 States= 1.4e+08 Transitions= 2.31e+09 Memory= 6950.315 t= 2.14e+03 R= 7e+04 -Depth= 9059 States= 1.41e+08 Transitions= 2.33e+09 Memory= 6981.858 t= 2.15e+03 R= 7e+04 -Depth= 9059 States= 1.42e+08 Transitions= 2.35e+09 Memory= 7005.295 t= 2.17e+03 R= 7e+04 -Depth= 9059 States= 1.43e+08 Transitions= 2.36e+09 Memory= 7031.076 t= 2.18e+03 R= 7e+04 -Depth= 9059 States= 1.44e+08 Transitions= 2.38e+09 Memory= 7056.955 t= 2.2e+03 R= 7e+04 -Depth= 9059 States= 1.45e+08 Transitions= 2.4e+09 Memory= 7084.494 t= 2.22e+03 R= 7e+04 -Depth= 9059 States= 1.46e+08 Transitions= 2.41e+09 Memory= 7115.744 t= 2.23e+03 R= 7e+04 -Depth= 9059 States= 1.47e+08 Transitions= 2.42e+09 Memory= 7146.604 t= 2.24e+03 R= 7e+04 -Depth= 9059 States= 1.48e+08 Transitions= 2.44e+09 Memory= 7172.287 t= 2.25e+03 R= 7e+04 -Depth= 9059 States= 1.49e+08 Transitions= 2.45e+09 Memory= 7200.315 t= 2.26e+03 R= 7e+04 -Depth= 9059 States= 1.5e+08 Transitions= 2.47e+09 Memory= 7226.389 t= 2.28e+03 R= 7e+04 -Depth= 9059 States= 1.51e+08 Transitions= 2.48e+09 Memory= 7253.733 t= 2.29e+03 R= 7e+04 -Depth= 9059 States= 1.52e+08 Transitions= 2.5e+09 Memory= 7279.709 t= 2.31e+03 R= 7e+04 -Depth= 9059 States= 1.53e+08 Transitions= 2.52e+09 Memory= 7309.104 t= 2.32e+03 R= 7e+04 -Depth= 9059 States= 1.54e+08 Transitions= 2.53e+09 Memory= 7334.592 t= 2.34e+03 R= 7e+04 -Depth= 9059 States= 1.55e+08 Transitions= 2.55e+09 Memory= 7362.229 t= 2.35e+03 R= 7e+04 -Depth= 9059 States= 1.56e+08 Transitions= 2.56e+09 Memory= 7391.135 t= 2.36e+03 R= 7e+04 -Depth= 9059 States= 1.57e+08 Transitions= 2.57e+09 Memory= 7420.822 t= 2.38e+03 R= 7e+04 -Depth= 9059 States= 1.58e+08 Transitions= 2.59e+09 Memory= 7452.854 t= 2.39e+03 R= 7e+04 -Depth= 9059 States= 1.59e+08 Transitions= 2.6e+09 Memory= 7481.760 t= 2.4e+03 R= 7e+04 -Depth= 9059 States= 1.6e+08 Transitions= 2.62e+09 Memory= 7509.299 t= 2.41e+03 R= 7e+04 -Depth= 9059 States= 1.61e+08 Transitions= 2.63e+09 Memory= 7534.201 t= 2.43e+03 R= 7e+04 -Depth= 9059 States= 1.62e+08 Transitions= 2.65e+09 Memory= 7567.600 t= 2.44e+03 R= 7e+04 -Depth= 9059 States= 1.63e+08 Transitions= 2.66e+09 Memory= 7594.846 t= 2.45e+03 R= 7e+04 -Depth= 9059 States= 1.64e+08 Transitions= 2.67e+09 Memory= 7619.455 t= 2.47e+03 R= 7e+04 -Depth= 9059 States= 1.65e+08 Transitions= 2.7e+09 Memory= 7642.502 t= 2.49e+03 R= 7e+04 -Depth= 9059 States= 1.66e+08 Transitions= 2.72e+09 Memory= 7669.260 t= 2.51e+03 R= 7e+04 -Depth= 9059 States= 1.67e+08 Transitions= 2.73e+09 Memory= 7696.799 t= 2.52e+03 R= 7e+04 -Depth= 9059 States= 1.68e+08 Transitions= 2.75e+09 Memory= 7723.850 t= 2.54e+03 R= 7e+04 -Depth= 9059 States= 1.69e+08 Transitions= 2.77e+09 Memory= 7757.053 t= 2.55e+03 R= 7e+04 -Depth= 9059 States= 1.7e+08 Transitions= 2.78e+09 Memory= 7782.346 t= 2.57e+03 R= 7e+04 -Depth= 9059 States= 1.71e+08 Transitions= 2.8e+09 Memory= 7808.908 t= 2.58e+03 R= 7e+04 -Depth= 9059 States= 1.72e+08 Transitions= 2.81e+09 Memory= 7838.791 t= 2.59e+03 R= 7e+04 -Depth= 9059 States= 1.73e+08 Transitions= 2.83e+09 Memory= 7867.893 t= 2.61e+03 R= 7e+04 -Depth= 9059 States= 1.74e+08 Transitions= 2.85e+09 Memory= 7892.990 t= 2.62e+03 R= 7e+04 -Depth= 9059 States= 1.75e+08 Transitions= 2.86e+09 Memory= 7922.190 t= 2.64e+03 R= 7e+04 -Depth= 9059 States= 1.76e+08 Transitions= 2.89e+09 Memory= 7945.627 t= 2.66e+03 R= 7e+04 -Depth= 9059 States= 1.77e+08 Transitions= 2.9e+09 Memory= 7973.947 t= 2.68e+03 R= 7e+04 -Depth= 9059 States= 1.78e+08 Transitions= 2.93e+09 Memory= 7997.483 t= 2.7e+03 R= 7e+04 -Depth= 9059 States= 1.79e+08 Transitions= 2.94e+09 Memory= 8020.920 t= 2.71e+03 R= 7e+04 -Depth= 9059 States= 1.8e+08 Transitions= 2.96e+09 Memory= 8050.412 t= 2.73e+03 R= 7e+04 -Depth= 9059 States= 1.81e+08 Transitions= 2.97e+09 Memory= 8085.666 t= 2.74e+03 R= 7e+04 -Depth= 9059 States= 1.82e+08 Transitions= 2.98e+09 Memory= 8114.279 t= 2.75e+03 R= 7e+04 -Depth= 9059 States= 1.83e+08 Transitions= 3e+09 Memory= 8137.131 t= 2.77e+03 R= 7e+04 -Depth= 9059 States= 1.84e+08 Transitions= 3.02e+09 Memory= 8165.451 t= 2.79e+03 R= 7e+04 -Depth= 9059 States= 1.85e+08 Transitions= 3.04e+09 Memory= 8193.186 t= 2.8e+03 R= 7e+04 -Depth= 9059 States= 1.86e+08 Transitions= 3.06e+09 Memory= 8218.674 t= 2.82e+03 R= 7e+04 -Depth= 9059 States= 1.87e+08 Transitions= 3.08e+09 Memory= 8255.100 t= 2.83e+03 R= 7e+04 -Depth= 9059 States= 1.88e+08 Transitions= 3.09e+09 Memory= 8279.221 t= 2.85e+03 R= 7e+04 -Depth= 9059 States= 1.89e+08 Transitions= 3.12e+09 Memory= 8298.264 t= 2.87e+03 R= 7e+04 -Depth= 9059 States= 1.9e+08 Transitions= 3.14e+09 Memory= 8325.998 t= 2.89e+03 R= 7e+04 -Depth= 9059 States= 1.91e+08 Transitions= 3.16e+09 Memory= 8349.338 t= 2.91e+03 R= 7e+04 -Depth= 9059 States= 1.92e+08 Transitions= 3.17e+09 Memory= 8379.221 t= 2.92e+03 R= 7e+04 -Depth= 9059 States= 1.93e+08 Transitions= 3.19e+09 Memory= 8403.440 t= 2.94e+03 R= 7e+04 -Depth= 9059 States= 1.94e+08 Transitions= 3.21e+09 Memory= 8430.100 t= 2.96e+03 R= 7e+04 -Depth= 9059 States= 1.95e+08 Transitions= 3.23e+09 Memory= 8455.295 t= 2.97e+03 R= 7e+04 -Depth= 9059 States= 1.96e+08 Transitions= 3.25e+09 Memory= 8482.932 t= 2.99e+03 R= 7e+04 -Depth= 9059 States= 1.97e+08 Transitions= 3.26e+09 Memory= 8515.256 t= 3e+03 R= 7e+04 -Depth= 9059 States= 1.98e+08 Transitions= 3.27e+09 Memory= 8542.502 t= 3.01e+03 R= 7e+04 -Depth= 9059 States= 1.99e+08 Transitions= 3.29e+09 Memory= 8569.260 t= 3.02e+03 R= 7e+04 -Depth= 9059 States= 2e+08 Transitions= 3.3e+09 Memory= 8598.459 t= 3.04e+03 R= 7e+04 -Depth= 9059 States= 2.01e+08 Transitions= 3.32e+09 Memory= 8624.631 t= 3.05e+03 R= 7e+04 -Depth= 9059 States= 2.02e+08 Transitions= 3.33e+09 Memory= 8652.365 t= 3.07e+03 R= 7e+04 -Depth= 9059 States= 2.03e+08 Transitions= 3.35e+09 Memory= 8678.440 t= 3.08e+03 R= 7e+04 -Depth= 9059 States= 2.04e+08 Transitions= 3.36e+09 Memory= 8706.369 t= 3.1e+03 R= 7e+04 -Depth= 9059 States= 2.05e+08 Transitions= 3.38e+09 Memory= 8732.932 t= 3.11e+03 R= 7e+04 -Depth= 9059 States= 2.06e+08 Transitions= 3.39e+09 Memory= 8760.276 t= 3.12e+03 R= 7e+04 -Depth= 9059 States= 2.07e+08 Transitions= 3.41e+09 Memory= 8789.475 t= 3.14e+03 R= 7e+04 -Depth= 9059 States= 2.08e+08 Transitions= 3.42e+09 Memory= 8819.455 t= 3.15e+03 R= 7e+04 -Depth= 9059 States= 2.09e+08 Transitions= 3.43e+09 Memory= 8851.779 t= 3.16e+03 R= 7e+04 -Depth= 9059 States= 2.1e+08 Transitions= 3.45e+09 Memory= 8880.100 t= 3.17e+03 R= 7e+04 -Depth= 9059 States= 2.11e+08 Transitions= 3.46e+09 Memory= 8907.053 t= 3.19e+03 R= 7e+04 -Depth= 9059 States= 2.12e+08 Transitions= 3.48e+09 Memory= 8932.639 t= 3.2e+03 R= 7e+04 -Depth= 9059 States= 2.13e+08 Transitions= 3.49e+09 Memory= 8964.572 t= 3.22e+03 R= 7e+04 -Depth= 9059 States= 2.14e+08 Transitions= 3.51e+09 Memory= 8991.526 t= 3.23e+03 R= 7e+04 -Depth= 9059 States= 2.15e+08 Transitions= 3.52e+09 Memory= 9018.088 t= 3.24e+03 R= 7e+04 -Depth= 9059 States= 2.16e+08 Transitions= 3.54e+09 Memory= 9039.865 t= 3.26e+03 R= 7e+04 -Depth= 9059 States= 2.17e+08 Transitions= 3.56e+09 Memory= 9067.600 t= 3.28e+03 R= 7e+04 -Depth= 9059 States= 2.18e+08 Transitions= 3.58e+09 Memory= 9094.260 t= 3.3e+03 R= 7e+04 -Depth= 9059 States= 2.19e+08 Transitions= 3.6e+09 Memory= 9122.483 t= 3.31e+03 R= 7e+04 -Depth= 9059 States= 2.2e+08 Transitions= 3.61e+09 Memory= 9153.635 t= 3.32e+03 R= 7e+04 -Depth= 9059 States= 2.21e+08 Transitions= 3.63e+09 Memory= 9181.272 t= 3.34e+03 R= 7e+04 -Depth= 9059 States= 2.22e+08 Transitions= 3.65e+09 Memory= 9207.639 t= 3.36e+03 R= 7e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 64 byte, depth reached 9059, errors: 0 - 88961904 states, stored (2.22145e+08 visited) -3.4291111e+09 states, matched -3.6512561e+09 transitions (= visited+matched) -1.2885947e+10 atomic steps -hash conflicts: 7.2188776e+08 (resolved) - -Stats on memory usage (in Megabytes): - 7805.343 equivalent memory usage for states (stored*(State-vector + overhead)) - 6706.219 actual memory usage for states (compression: 85.92%) - state-vector as stored = 51 byte + 28 byte overhead - 2048.000 memory used for hash table (-w28) - 457.764 memory used for DFS stack (-m10000000) - 1.122 memory lost to fragmentation - 9210.861 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 256, "(1)" - line 418, "pan.___", state 286, "(1)" - line 399, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 395, "(1)" - line 418, "pan.___", state 425, "(1)" - line 540, "pan.___", state 456, "-end-" - (17 of 456 states) -unreached in proctype urcu_reader_sig - line 399, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 70, "(1)" - line 418, "pan.___", state 100, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 247, "(1)" - line 418, "pan.___", state 277, "(1)" - line 399, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 359, "(1)" - line 418, "pan.___", state 389, "(1)" - line 614, "pan.___", state 411, "-end-" - (17 of 411 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 59, "(1)" - line 413, "pan.___", state 72, "(1)" - line 418, "pan.___", state 89, "(1)" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 240, "(1)" - line 164, "pan.___", state 248, "(1)" - line 168, "pan.___", state 260, "(1)" - line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 370, "(1)" - line 164, "pan.___", state 378, "(1)" - line 168, "pan.___", state 390, "(1)" - line 399, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 449, "(1)" - line 413, "pan.___", state 462, "(1)" - line 418, "pan.___", state 479, "(1)" - line 399, "pan.___", state 498, "(1)" - line 403, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 554, "(1)" - line 418, "pan.___", state 571, "(1)" - line 403, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 647, "(1)" - line 418, "pan.___", state 664, "(1)" - line 179, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 710, "(1)" - line 164, "pan.___", state 718, "(1)" - line 168, "pan.___", state 730, "(1)" - line 175, "pan.___", state 741, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 817, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 830, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 840, "(1)" - line 164, "pan.___", state 848, "(1)" - line 168, "pan.___", state 860, "(1)" - line 399, "pan.___", state 882, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 884, "(1)" - line 399, "pan.___", state 885, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 885, "else" - line 399, "pan.___", state 888, "(1)" - line 403, "pan.___", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 898, "(1)" - line 403, "pan.___", state 899, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 899, "else" - line 403, "pan.___", state 902, "(1)" - line 403, "pan.___", state 903, "(1)" - line 403, "pan.___", state 903, "(1)" - line 401, "pan.___", state 908, "((i<1))" - line 401, "pan.___", state 908, "((i>=1))" - line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 927, "(1)" - line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 928, "else" - line 409, "pan.___", state 931, "(1)" - line 409, "pan.___", state 932, "(1)" - line 409, "pan.___", state 932, "(1)" - line 413, "pan.___", state 940, "(1)" - line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 941, "else" - line 413, "pan.___", state 944, "(1)" - line 413, "pan.___", state 945, "(1)" - line 413, "pan.___", state 945, "(1)" - line 411, "pan.___", state 950, "((i<1))" - line 411, "pan.___", state 950, "((i>=1))" - line 418, "pan.___", state 957, "(1)" - line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 958, "else" - line 418, "pan.___", state 961, "(1)" - line 418, "pan.___", state 962, "(1)" - line 418, "pan.___", state 962, "(1)" - line 420, "pan.___", state 965, "(1)" - line 420, "pan.___", state 965, "(1)" - line 403, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1040, "(1)" - line 418, "pan.___", state 1057, "(1)" - line 403, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1130, "(1)" - line 418, "pan.___", state 1147, "(1)" - line 399, "pan.___", state 1166, "(1)" - line 403, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1222, "(1)" - line 418, "pan.___", state 1239, "(1)" - line 403, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1315, "(1)" - line 418, "pan.___", state 1332, "(1)" - line 179, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1378, "(1)" - line 164, "pan.___", state 1386, "(1)" - line 168, "pan.___", state 1398, "(1)" - line 175, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 1485, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1498, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1508, "(1)" - line 164, "pan.___", state 1516, "(1)" - line 168, "pan.___", state 1528, "(1)" - line 399, "pan.___", state 1550, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1552, "(1)" - line 399, "pan.___", state 1553, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1553, "else" - line 399, "pan.___", state 1556, "(1)" - line 403, "pan.___", state 1564, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 1566, "(1)" - line 403, "pan.___", state 1567, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 1567, "else" - line 403, "pan.___", state 1570, "(1)" - line 403, "pan.___", state 1571, "(1)" - line 403, "pan.___", state 1571, "(1)" - line 401, "pan.___", state 1576, "((i<1))" - line 401, "pan.___", state 1576, "((i>=1))" - line 408, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1595, "(1)" - line 409, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 1596, "else" - line 409, "pan.___", state 1599, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 413, "pan.___", state 1608, "(1)" - line 413, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 1609, "else" - line 413, "pan.___", state 1612, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 411, "pan.___", state 1618, "((i<1))" - line 411, "pan.___", state 1618, "((i>=1))" - line 418, "pan.___", state 1625, "(1)" - line 418, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 1626, "else" - line 418, "pan.___", state 1629, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 179, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1681, "(1)" - line 164, "pan.___", state 1689, "(1)" - line 168, "pan.___", state 1701, "(1)" - line 175, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 1788, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1801, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1811, "(1)" - line 164, "pan.___", state 1819, "(1)" - line 168, "pan.___", state 1831, "(1)" - line 702, "pan.___", state 1856, "-end-" - (158 of 1856 states) -unreached in proctype :init: - (0 of 46 states) -unreached in proctype :never: - line 751, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 3.36e+03 seconds -pan: rate 66138.803 states/second -pan: avg transition delay 9.1989e-07 usec -cp .input.spin urcu_progress_reader.spin.input -cp .input.spin.trail urcu_progress_reader.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_reader.spin.input b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_reader.spin.input deleted file mode 100644 index 91b1126..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_reader.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define READER_PROGRESS - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_reader.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_reader.spin.input.trail deleted file mode 100644 index 7c42af1..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_reader.spin.input.trail +++ /dev/null @@ -1,1270 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4401 -2:4:4353 -3:4:4356 -4:4:4356 -5:4:4359 -6:4:4367 -7:4:4367 -8:4:4370 -9:4:4376 -10:4:4380 -11:4:4380 -12:4:4383 -13:4:4391 -14:4:4395 -15:4:4396 -16:0:4401 -17:4:4398 -18:0:4401 -19:3:2479 -20:0:4401 -21:3:2485 -22:0:4401 -23:3:2486 -24:0:4401 -25:3:2487 -26:3:2491 -27:3:2492 -28:3:2500 -29:3:2501 -30:3:2505 -31:3:2506 -32:3:2514 -33:3:2519 -34:3:2523 -35:3:2524 -36:3:2531 -37:3:2532 -38:3:2543 -39:3:2544 -40:3:2545 -41:3:2556 -42:3:2561 -43:3:2562 -44:0:4401 -45:3:2574 -46:0:4401 -47:3:2576 -48:3:2577 -49:0:4401 -50:3:2581 -51:3:2585 -52:3:2586 -53:3:2594 -54:3:2595 -55:3:2599 -56:3:2600 -57:3:2608 -58:3:2613 -59:3:2614 -60:3:2625 -61:3:2626 -62:3:2637 -63:3:2638 -64:3:2639 -65:3:2650 -66:3:2655 -67:3:2656 -68:0:4401 -69:3:2668 -70:0:4401 -71:3:2670 -72:0:4401 -73:3:2671 -74:0:4401 -75:3:2681 -76:0:4401 -77:3:2682 -78:0:4401 -79:3:2686 -80:3:2687 -81:3:2691 -82:3:2695 -83:3:2696 -84:3:2700 -85:3:2708 -86:3:2709 -87:3:2714 -88:3:2721 -89:3:2722 -90:3:2729 -91:3:2734 -92:0:4401 -93:3:2745 -94:0:4401 -95:3:2749 -96:3:2750 -97:3:2754 -98:3:2758 -99:3:2759 -100:3:2763 -101:3:2771 -102:3:2772 -103:3:2777 -104:3:2784 -105:3:2785 -106:3:2792 -107:3:2797 -108:0:4401 -109:3:2808 -110:0:4401 -111:3:2816 -112:3:2817 -113:3:2821 -114:3:2825 -115:3:2826 -116:3:2830 -117:3:2838 -118:3:2839 -119:3:2844 -120:3:2851 -121:3:2852 -122:3:2859 -123:3:2864 -124:0:4401 -125:3:2879 -126:0:4401 -127:3:2881 -128:0:4401 -129:3:2882 -130:3:2886 -131:3:2887 -132:3:2895 -133:3:2896 -134:3:2900 -135:3:2901 -136:3:2909 -137:3:2914 -138:3:2918 -139:3:2919 -140:3:2926 -141:3:2927 -142:3:2938 -143:3:2939 -144:3:2940 -145:3:2951 -146:3:2956 -147:3:2957 -148:0:4401 -149:3:2969 -150:0:4401 -151:3:2971 -152:0:4401 -153:3:2974 -154:3:2975 -155:3:2987 -156:3:2988 -157:3:2992 -158:3:2993 -159:3:3001 -160:3:3006 -161:3:3010 -162:3:3011 -163:3:3018 -164:3:3019 -165:3:3030 -166:3:3031 -167:3:3032 -168:3:3043 -169:3:3048 -170:3:3049 -171:0:4401 -172:3:3061 -173:0:4401 -174:3:3063 -175:0:4401 -176:3:3064 -177:0:4401 -178:3:3065 -179:0:4401 -180:3:3066 -181:0:4401 -182:3:3067 -183:3:3071 -184:3:3072 -185:3:3080 -186:3:3081 -187:3:3085 -188:3:3086 -189:3:3094 -190:3:3099 -191:3:3103 -192:3:3104 -193:3:3111 -194:3:3112 -195:3:3123 -196:3:3124 -197:3:3125 -198:3:3136 -199:3:3141 -200:3:3142 -201:0:4401 -202:3:3154 -203:0:4401 -204:3:3356 -205:0:4401 -206:3:3454 -207:0:4401 -208:3:3455 -209:0:4401 -210:3:3459 -211:0:4401 -212:3:3465 -213:3:3469 -214:3:3470 -215:3:3478 -216:3:3479 -217:3:3483 -218:3:3484 -219:3:3492 -220:3:3497 -221:3:3501 -222:3:3502 -223:3:3509 -224:3:3510 -225:3:3521 -226:3:3522 -227:3:3523 -228:3:3534 -229:3:3539 -230:3:3540 -231:0:4401 -232:3:3552 -233:0:4401 -234:3:3554 -235:0:4401 -236:3:3555 -237:3:3559 -238:3:3560 -239:3:3568 -240:3:3569 -241:3:3573 -242:3:3574 -243:3:3582 -244:3:3587 -245:3:3591 -246:3:3592 -247:3:3599 -248:3:3600 -249:3:3611 -250:3:3612 -251:3:3613 -252:3:3624 -253:3:3629 -254:3:3630 -255:0:4401 -256:3:3642 -257:0:4401 -258:3:3644 -259:0:4401 -260:3:3647 -261:3:3648 -262:3:3660 -263:3:3661 -264:3:3665 -265:3:3666 -266:3:3674 -267:3:3679 -268:3:3683 -269:3:3684 -270:3:3691 -271:3:3692 -272:3:3703 -273:3:3704 -274:3:3705 -275:3:3716 -276:3:3721 -277:3:3722 -278:0:4401 -279:3:3734 -280:0:4401 -281:3:3736 -282:0:4401 -283:3:3737 -284:0:4401 -285:3:3738 -286:0:4401 -287:3:3739 -288:0:4401 -289:3:3740 -290:3:3744 -291:3:3745 -292:3:3753 -293:3:3754 -294:3:3758 -295:3:3759 -296:3:3767 -297:3:3772 -298:3:3776 -299:3:3777 -300:3:3784 -301:3:3785 -302:3:3796 -303:3:3797 -304:3:3798 -305:3:3809 -306:3:3814 -307:3:3815 -308:0:4401 -309:3:3827 -310:0:4401 -311:3:4029 -312:0:4401 -313:3:4127 -314:0:4401 -315:3:4128 -316:0:4401 -317:3:4132 -318:0:4401 -319:3:4138 -320:0:4401 -321:3:4142 -322:3:4143 -323:3:4147 -324:3:4151 -325:3:4152 -326:3:4156 -327:3:4164 -328:3:4165 -329:3:4170 -330:3:4177 -331:3:4178 -332:3:4185 -333:3:4190 -334:0:4401 -335:3:4201 -336:0:4401 -337:3:4205 -338:3:4206 -339:3:4210 -340:3:4214 -341:3:4215 -342:3:4219 -343:3:4227 -344:3:4228 -345:3:4233 -346:3:4240 -347:3:4241 -348:3:4248 -349:3:4253 -350:0:4401 -351:3:4264 -352:0:4401 -353:3:4272 -354:3:4273 -355:3:4277 -356:3:4281 -357:3:4282 -358:3:4286 -359:3:4294 -360:3:4295 -361:3:4300 -362:3:4307 -363:3:4308 -364:3:4315 -365:3:4320 -366:0:4401 -367:3:4335 -368:0:4401 -369:3:4337 -370:0:4401 -371:3:4338 -372:0:4401 -373:3:2486 -374:0:4401 -375:3:2487 -376:3:2491 -377:3:2492 -378:3:2500 -379:3:2501 -380:3:2505 -381:3:2506 -382:3:2514 -383:3:2519 -384:3:2523 -385:3:2524 -386:3:2531 -387:3:2532 -388:3:2543 -389:3:2544 -390:3:2545 -391:3:2556 -392:3:2561 -393:3:2562 -394:0:4401 -395:3:2574 -396:0:4401 -397:3:2576 -398:3:2577 -399:0:4401 -400:3:2581 -401:3:2585 -402:3:2586 -403:3:2594 -404:3:2595 -405:3:2599 -406:3:2600 -407:3:2608 -408:3:2613 -409:3:2614 -410:3:2625 -411:3:2626 -412:3:2637 -413:3:2638 -414:3:2639 -415:3:2650 -416:3:2655 -417:3:2656 -418:0:4401 -419:3:2668 -420:0:4401 -421:3:2670 -422:0:4401 -423:3:2671 -424:0:4401 -425:3:2681 -426:0:4401 -427:3:2682 -428:0:4401 -429:3:2686 -430:3:2687 -431:3:2691 -432:3:2695 -433:3:2696 -434:3:2700 -435:3:2708 -436:3:2709 -437:3:2714 -438:3:2721 -439:3:2722 -440:3:2729 -441:3:2734 -442:0:4401 -443:3:2745 -444:0:4401 -445:3:2749 -446:3:2750 -447:3:2754 -448:3:2758 -449:3:2759 -450:3:2763 -451:3:2771 -452:3:2772 -453:3:2777 -454:3:2784 -455:3:2785 -456:3:2792 -457:3:2797 -458:0:4401 -459:3:2808 -460:0:4401 -461:3:2816 -462:3:2817 -463:3:2821 -464:3:2825 -465:3:2826 -466:3:2830 -467:3:2838 -468:3:2839 -469:3:2844 -470:3:2851 -471:3:2852 -472:3:2859 -473:3:2864 -474:0:4401 -475:3:2879 -476:0:4401 -477:3:2881 -478:0:4401 -479:3:2882 -480:3:2886 -481:3:2887 -482:3:2895 -483:3:2896 -484:3:2900 -485:3:2901 -486:3:2909 -487:3:2914 -488:3:2918 -489:3:2919 -490:3:2926 -491:3:2927 -492:3:2938 -493:3:2939 -494:3:2940 -495:3:2951 -496:3:2956 -497:3:2957 -498:0:4401 -499:3:2969 -500:0:4401 -501:3:2971 -502:0:4401 -503:3:2974 -504:3:2975 -505:3:2987 -506:3:2988 -507:3:2992 -508:3:2993 -509:3:3001 -510:3:3006 -511:3:3010 -512:3:3011 -513:3:3018 -514:3:3019 -515:3:3030 -516:3:3031 -517:3:3032 -518:3:3043 -519:3:3048 -520:3:3049 -521:0:4401 -522:3:3061 -523:0:4401 -524:3:3063 -525:0:4401 -526:3:3064 -527:0:4401 -528:3:3065 -529:0:4401 -530:3:3066 -531:0:4401 -532:3:3067 -533:3:3071 -534:3:3072 -535:3:3080 -536:3:3081 -537:3:3085 -538:3:3086 -539:3:3094 -540:3:3099 -541:3:3103 -542:3:3104 -543:3:3111 -544:3:3112 -545:3:3123 -546:3:3124 -547:3:3125 -548:3:3136 -549:3:3141 -550:3:3142 -551:0:4401 -552:3:3154 -553:0:4401 -554:3:3356 -555:0:4401 -556:3:3454 -557:0:4401 -558:3:3455 -559:0:4401 -560:3:3459 -561:0:4401 -562:3:3465 -563:3:3469 -564:3:3470 -565:3:3478 -566:3:3479 -567:3:3483 -568:3:3484 -569:3:3492 -570:3:3497 -571:3:3501 -572:3:3502 -573:3:3509 -574:3:3510 -575:3:3521 -576:3:3522 -577:3:3523 -578:3:3534 -579:3:3539 -580:3:3540 -581:0:4401 -582:3:3552 -583:0:4401 -584:3:3554 -585:0:4401 -586:3:3555 -587:3:3559 -588:3:3560 -589:3:3568 -590:3:3569 -591:3:3573 -592:3:3574 -593:3:3582 -594:3:3587 -595:3:3591 -596:3:3592 -597:3:3599 -598:3:3600 -599:3:3611 -600:3:3612 -601:3:3613 -602:3:3624 -603:3:3629 -604:3:3630 -605:0:4401 -606:3:3642 -607:0:4401 -608:3:3644 -609:0:4401 -610:3:3647 -611:3:3648 -612:3:3660 -613:3:3661 -614:3:3665 -615:3:3666 -616:3:3674 -617:3:3679 -618:3:3683 -619:3:3684 -620:3:3691 -621:3:3692 -622:3:3703 -623:3:3704 -624:3:3705 -625:3:3716 -626:3:3721 -627:3:3722 -628:0:4401 -629:3:3734 -630:0:4401 -631:3:3736 -632:0:4401 -633:3:3737 -634:0:4401 -635:3:3738 -636:0:4401 -637:3:3739 -638:0:4401 -639:3:3740 -640:3:3744 -641:3:3745 -642:3:3753 -643:3:3754 -644:3:3758 -645:3:3759 -646:3:3767 -647:3:3772 -648:3:3776 -649:3:3777 -650:3:3784 -651:3:3785 -652:3:3796 -653:3:3797 -654:3:3798 -655:3:3809 -656:3:3814 -657:3:3815 -658:0:4401 -659:3:3827 -660:0:4401 -661:3:4029 -662:0:4401 -663:3:4127 -664:0:4401 -665:3:4128 -666:0:4401 -667:3:4132 -668:0:4401 -669:3:4138 -670:0:4401 -671:3:4142 -672:3:4143 -673:3:4147 -674:3:4151 -675:3:4152 -676:3:4156 -677:3:4164 -678:3:4165 -679:3:4170 -680:3:4177 -681:3:4178 -682:3:4185 -683:3:4190 -684:0:4401 -685:3:4201 -686:0:4401 -687:3:4205 -688:3:4206 -689:3:4210 -690:3:4214 -691:3:4215 -692:3:4219 -693:3:4227 -694:3:4228 -695:3:4233 -696:3:4240 -697:3:4241 -698:3:4248 -699:3:4253 -700:0:4401 -701:3:4264 -702:0:4401 -703:3:4272 -704:3:4273 -705:3:4277 -706:3:4281 -707:3:4282 -708:3:4286 -709:3:4294 -710:3:4295 -711:3:4300 -712:3:4307 -713:3:4308 -714:3:4315 -715:3:4320 -716:0:4401 -717:3:4335 -718:0:4401 -719:3:4337 -720:0:4401 -721:3:4338 -722:0:4401 -723:3:2486 -724:0:4401 -725:3:2487 -726:3:2491 -727:3:2492 -728:3:2500 -729:3:2501 -730:3:2505 -731:3:2506 -732:3:2514 -733:3:2519 -734:3:2523 -735:3:2524 -736:3:2531 -737:3:2532 -738:3:2543 -739:3:2544 -740:3:2545 -741:3:2556 -742:3:2561 -743:3:2562 -744:0:4401 -745:3:2574 -746:0:4401 -747:3:2576 -748:3:2577 -749:0:4401 -750:3:2581 -751:3:2585 -752:3:2586 -753:3:2594 -754:3:2595 -755:3:2599 -756:3:2600 -757:3:2608 -758:3:2613 -759:3:2614 -760:3:2625 -761:3:2626 -762:3:2637 -763:3:2638 -764:3:2639 -765:3:2650 -766:3:2655 -767:3:2656 -768:0:4401 -769:3:2668 -770:0:4401 -771:3:2670 -772:0:4401 -773:3:2671 -774:0:4401 -775:3:2681 -776:0:4401 -777:3:2682 -778:0:4401 -779:3:2686 -780:3:2687 -781:3:2691 -782:3:2695 -783:3:2696 -784:3:2700 -785:3:2708 -786:3:2709 -787:3:2714 -788:3:2721 -789:3:2722 -790:3:2729 -791:3:2734 -792:0:4401 -793:3:2745 -794:0:4401 -795:3:2749 -796:3:2750 -797:3:2754 -798:3:2758 -799:3:2759 -800:3:2763 -801:3:2771 -802:3:2772 -803:3:2777 -804:3:2784 -805:3:2785 -806:3:2792 -807:3:2797 -808:0:4401 -809:3:2808 -810:0:4401 -811:3:2816 -812:3:2817 -813:3:2821 -814:3:2825 -815:3:2826 -816:3:2830 -817:3:2838 -818:3:2839 -819:3:2844 -820:3:2851 -821:3:2852 -822:3:2859 -823:3:2864 -824:0:4401 -825:3:2879 -826:0:4401 -827:3:2881 -828:0:4401 -829:3:2882 -830:3:2886 -831:3:2887 -832:3:2895 -833:3:2896 -834:3:2900 -835:3:2901 -836:3:2909 -837:3:2914 -838:3:2918 -839:3:2919 -840:3:2926 -841:3:2927 -842:3:2938 -843:3:2939 -844:3:2940 -845:3:2951 -846:3:2956 -847:3:2957 -848:0:4401 -849:3:2969 -850:0:4401 -851:3:2971 -852:0:4401 -853:3:2974 -854:3:2975 -855:3:2987 -856:3:2988 -857:3:2992 -858:3:2993 -859:3:3001 -860:3:3006 -861:3:3010 -862:3:3011 -863:3:3018 -864:3:3019 -865:3:3030 -866:3:3031 -867:3:3032 -868:3:3043 -869:3:3048 -870:3:3049 -871:0:4401 -872:3:3061 -873:0:4401 -874:3:3063 -875:0:4401 -876:3:3064 -877:0:4401 -878:3:3065 -879:0:4401 -880:3:3066 -881:0:4401 -882:3:3067 -883:3:3071 -884:3:3072 -885:3:3080 -886:3:3081 -887:3:3085 -888:3:3086 -889:3:3094 -890:3:3099 -891:3:3103 -892:3:3104 -893:3:3111 -894:3:3112 -895:3:3123 -896:3:3124 -897:3:3125 -898:3:3136 -899:3:3141 -900:3:3142 -901:0:4401 -902:3:3154 -903:0:4401 -904:3:3356 -905:0:4401 -906:3:3454 -907:0:4401 -908:3:3455 -909:0:4401 -910:3:3459 -911:0:4401 -912:3:3465 -913:3:3469 -914:3:3470 -915:3:3478 -916:3:3479 -917:3:3483 -918:3:3484 -919:3:3492 -920:3:3497 -921:3:3501 -922:3:3502 -923:3:3509 -924:3:3510 -925:3:3521 -926:3:3522 -927:3:3523 -928:3:3534 -929:3:3539 -930:3:3540 -931:0:4401 -932:3:3552 -933:0:4401 -934:3:3554 -935:0:4401 -936:3:3555 -937:3:3559 -938:3:3560 -939:3:3568 -940:3:3569 -941:3:3573 -942:3:3574 -943:3:3582 -944:3:3587 -945:3:3591 -946:3:3592 -947:3:3599 -948:3:3600 -949:3:3611 -950:3:3612 -951:3:3613 -952:3:3624 -953:3:3629 -954:3:3630 -955:0:4401 -956:3:3642 -957:0:4401 -958:3:3644 -959:0:4401 -960:3:3647 -961:3:3648 -962:3:3660 -963:3:3661 -964:3:3665 -965:3:3666 -966:3:3674 -967:3:3679 -968:3:3683 -969:3:3684 -970:3:3691 -971:3:3692 -972:3:3703 -973:3:3704 -974:3:3705 -975:3:3716 -976:3:3721 -977:3:3722 -978:0:4401 -979:3:3734 -980:0:4401 -981:3:3736 -982:0:4401 -983:3:3737 -984:0:4401 -985:3:3738 -986:0:4401 -987:3:3739 -988:0:4401 -989:3:3740 -990:3:3744 -991:3:3745 -992:3:3753 -993:3:3754 -994:3:3758 -995:3:3759 -996:3:3767 -997:3:3772 -998:3:3776 -999:3:3777 -1000:3:3784 -1001:3:3785 -1002:3:3796 -1003:3:3797 -1004:3:3798 -1005:3:3809 -1006:3:3814 -1007:3:3815 -1008:0:4401 -1009:3:3827 -1010:0:4401 -1011:3:4029 -1012:0:4401 -1013:3:4127 -1014:0:4401 -1015:3:4128 -1016:0:4401 -1017:3:4132 -1018:0:4401 -1019:3:4138 -1020:0:4401 -1021:3:4142 -1022:3:4143 -1023:3:4147 -1024:3:4151 -1025:3:4152 -1026:3:4156 -1027:3:4164 -1028:3:4165 -1029:3:4170 -1030:3:4177 -1031:3:4178 -1032:3:4185 -1033:3:4190 -1034:0:4401 -1035:3:4201 -1036:0:4401 -1037:3:4205 -1038:3:4206 -1039:3:4210 -1040:3:4214 -1041:3:4215 -1042:3:4219 -1043:3:4227 -1044:3:4228 -1045:3:4233 -1046:3:4240 -1047:3:4241 -1048:3:4248 -1049:3:4253 -1050:0:4401 -1051:3:4264 -1052:0:4401 -1053:3:4272 -1054:3:4273 -1055:3:4277 -1056:3:4281 -1057:3:4282 -1058:3:4286 -1059:3:4294 -1060:3:4295 -1061:3:4300 -1062:3:4307 -1063:3:4308 -1064:3:4315 -1065:3:4320 -1066:0:4401 -1067:3:4335 -1068:0:4401 -1069:3:4337 -1070:0:4401 -1071:3:4338 -1072:0:4401 -1073:3:4341 -1074:0:4401 -1075:3:4346 -1076:0:4401 -1077:2:1236 -1078:0:4401 -1079:3:4347 -1080:0:4401 -1081:2:1242 -1082:0:4401 -1083:3:4346 -1084:0:4401 -1085:2:1243 -1086:0:4401 -1087:3:4347 -1088:0:4401 -1089:2:1244 -1090:0:4401 -1091:3:4346 -1092:0:4401 -1093:2:1245 -1094:0:4401 -1095:3:4347 -1096:0:4401 -1097:1:2 -1098:0:4401 -1099:3:4346 -1100:0:4401 -1101:2:1246 -1102:0:4401 -1103:3:4347 -1104:0:4401 -1105:1:8 -1106:0:4401 -1107:3:4346 -1108:0:4401 -1109:2:1245 -1110:0:4401 -1111:3:4347 -1112:0:4401 -1113:1:9 -1114:0:4401 -1115:3:4346 -1116:0:4401 -1117:2:1246 -1118:0:4401 -1119:3:4347 -1120:0:4401 -1121:1:10 -1122:0:4401 -1123:3:4346 -1124:0:4401 -1125:2:1245 -1126:0:4401 -1127:3:4347 -1128:0:4401 -1129:1:11 -1130:0:4401 -1131:3:4346 -1132:0:4401 -1133:2:1246 -1134:0:4401 -1135:3:4347 -1136:0:4401 -1137:1:14 -1138:0:4401 -1139:3:4346 -1140:0:4401 -1141:2:1245 -1142:0:4401 -1143:3:4347 -1144:0:4401 -1145:1:15 -1146:0:4401 -1147:3:4346 -1148:0:4401 -1149:2:1246 -1150:0:4401 -1151:3:4347 -1152:0:4401 -1153:1:16 -1154:1:20 -1155:1:21 -1156:1:29 -1157:1:30 -1158:1:34 -1159:1:35 -1160:1:43 -1161:1:48 -1162:1:52 -1163:1:53 -1164:1:60 -1165:1:61 -1166:1:72 -1167:1:73 -1168:1:74 -1169:1:85 -1170:1:90 -1171:1:91 -1172:0:4401 -1173:3:4346 -1174:0:4401 -1175:2:1245 -1176:0:4401 -1177:3:4347 -1178:0:4401 -1179:1:103 -1180:0:4401 -1181:3:4346 -1182:0:4401 -1183:2:1246 -1184:0:4401 -1185:3:4347 -1186:0:4401 -1187:2:1247 -1188:0:4401 -1189:3:4346 -1190:0:4401 -1191:2:1253 -1192:0:4401 -1193:3:4347 -1194:0:4401 -1195:2:1254 -1196:0:4399 -1197:3:4346 -1198:0:4405 -1199:3:4347 -1200:0:4405 -1201:2:1257 -1202:0:4405 -1203:3:4346 -1204:0:4405 -1205:2:1258 -1206:0:4405 -1207:3:4347 -1208:0:4405 -1209:2:1259 -1210:2:1263 -1211:2:1264 -1212:2:1272 -1213:2:1273 -1214:2:1277 -1215:2:1278 -1216:2:1286 -1217:2:1291 -1218:2:1295 -1219:2:1296 -1220:2:1303 -1221:2:1304 -1222:2:1315 -1223:2:1316 -1224:2:1317 -1225:2:1328 -1226:2:1333 -1227:2:1334 -1228:0:4405 -1229:3:4346 -1230:0:4405 -1231:2:1346 -1232:0:4405 -1233:3:4347 -1234:0:4405 -1235:2:1347 -1236:0:4405 -1237:3:4346 -1238:0:4405 -1239:1:104 --1:-1:-1 -1240:0:4405 -1241:3:4347 -1242:0:4405 -1243:3:4346 -1244:0:4405 -1245:2:1348 -1246:0:4405 -1247:3:4347 -1248:0:4405 -1249:2:1347 -1250:0:4405 -1251:3:4346 -1252:0:4405 -1253:1:105 -1254:0:4405 -1255:3:4347 -1256:0:4405 -1257:3:4346 -1258:0:4405 -1259:2:1348 -1260:0:4405 -1261:3:4347 -1262:0:4405 -1263:2:1347 -1264:0:4405 -1265:3:4346 -1266:0:4405 -1267:1:104 diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer.define b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer.log b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer.log deleted file mode 100644 index fc83245..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer.log +++ /dev/null @@ -1,524 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -depth 15: Claim reached state 9 (line 749) -depth 1194: Claim reached state 9 (line 748) -Depth= 3253 States= 1e+06 Transitions= 1.06e+07 Memory= 484.416 t= 9.64 R= 1e+05 -Depth= 3253 States= 2e+06 Transitions= 2.04e+07 Memory= 501.311 t= 18.6 R= 1e+05 -Depth= 3253 States= 3e+06 Transitions= 3.44e+07 Memory= 516.252 t= 31.6 R= 9e+04 -pan: resizing hashtable to -w22.. done -Depth= 7995 States= 4e+06 Transitions= 4.66e+07 Memory= 563.486 t= 42.8 R= 9e+04 -Depth= 7995 States= 5e+06 Transitions= 6.05e+07 Memory= 580.674 t= 55.6 R= 9e+04 -Depth= 7995 States= 6e+06 Transitions= 7.12e+07 Memory= 599.229 t= 65.5 R= 9e+04 -Depth= 7995 States= 7e+06 Transitions= 8.58e+07 Memory= 613.975 t= 78.9 R= 9e+04 -Depth= 7995 States= 8e+06 Transitions= 9.62e+07 Memory= 631.846 t= 88.7 R= 9e+04 -Depth= 7995 States= 9e+06 Transitions= 1.1e+08 Memory= 646.592 t= 101 R= 9e+04 -pan: resizing hashtable to -w24.. done -Depth= 7995 States= 1e+07 Transitions= 1.32e+08 Memory= 783.869 t= 122 R= 8e+04 -Depth= 7995 States= 1.1e+07 Transitions= 1.52e+08 Memory= 799.104 t= 140 R= 8e+04 -Depth= 7995 States= 1.2e+07 Transitions= 1.71e+08 Memory= 814.533 t= 157 R= 8e+04 -Depth= 7995 States= 1.3e+07 Transitions= 1.9e+08 Memory= 829.670 t= 174 R= 7e+04 -Depth= 7995 States= 1.4e+07 Transitions= 2.01e+08 Memory= 848.029 t= 185 R= 8e+04 -Depth= 7995 States= 1.5e+07 Transitions= 2.21e+08 Memory= 862.287 t= 203 R= 7e+04 -Depth= 7995 States= 1.6e+07 Transitions= 2.35e+08 Memory= 877.815 t= 215 R= 7e+04 -Depth= 7995 States= 1.7e+07 Transitions= 2.44e+08 Memory= 897.736 t= 223 R= 8e+04 -Depth= 7995 States= 1.8e+07 Transitions= 2.57e+08 Memory= 911.115 t= 235 R= 8e+04 -Depth= 7995 States= 1.9e+07 Transitions= 2.69e+08 Memory= 927.033 t= 246 R= 8e+04 -Depth= 8341 States= 2e+07 Transitions= 2.83e+08 Memory= 943.440 t= 259 R= 8e+04 -Depth= 8341 States= 2.1e+07 Transitions= 2.96e+08 Memory= 961.604 t= 271 R= 8e+04 -Depth= 8341 States= 2.2e+07 Transitions= 3.07e+08 Memory= 978.791 t= 281 R= 8e+04 -Depth= 8341 States= 2.3e+07 Transitions= 3.2e+08 Memory= 996.369 t= 293 R= 8e+04 -Depth= 8341 States= 2.4e+07 Transitions= 3.32e+08 Memory= 1013.264 t= 304 R= 8e+04 -Depth= 8341 States= 2.5e+07 Transitions= 3.48e+08 Memory= 1024.885 t= 319 R= 8e+04 -Depth= 8341 States= 2.6e+07 Transitions= 3.72e+08 Memory= 1038.947 t= 341 R= 8e+04 -Depth= 8341 States= 2.7e+07 Transitions= 3.91e+08 Memory= 1055.158 t= 358 R= 8e+04 -Depth= 8341 States= 2.8e+07 Transitions= 4.09e+08 Memory= 1069.904 t= 374 R= 7e+04 -Depth= 8341 States= 2.9e+07 Transitions= 4.25e+08 Memory= 1086.701 t= 389 R= 7e+04 -Depth= 8341 States= 3e+07 Transitions= 4.43e+08 Memory= 1102.131 t= 405 R= 7e+04 -Depth= 8341 States= 3.1e+07 Transitions= 4.58e+08 Memory= 1117.268 t= 419 R= 7e+04 -Depth= 8341 States= 3.2e+07 Transitions= 4.68e+08 Memory= 1136.213 t= 429 R= 7e+04 -Depth= 8341 States= 3.3e+07 Transitions= 4.8e+08 Memory= 1151.154 t= 440 R= 8e+04 -Depth= 8341 States= 3.4e+07 Transitions= 4.92e+08 Memory= 1166.779 t= 451 R= 8e+04 -pan: resizing hashtable to -w26.. done -Depth= 8687 States= 3.5e+07 Transitions= 5.05e+08 Memory= 1679.658 t= 464 R= 8e+04 -Depth= 8687 States= 3.6e+07 Transitions= 5.18e+08 Memory= 1697.432 t= 477 R= 8e+04 -Depth= 8687 States= 3.7e+07 Transitions= 5.29e+08 Memory= 1714.326 t= 487 R= 8e+04 -Depth= 8687 States= 3.8e+07 Transitions= 5.44e+08 Memory= 1730.244 t= 500 R= 8e+04 -Depth= 8687 States= 3.9e+07 Transitions= 5.55e+08 Memory= 1747.920 t= 511 R= 8e+04 -Depth= 8687 States= 4e+07 Transitions= 5.69e+08 Memory= 1761.885 t= 523 R= 8e+04 -Depth= 8687 States= 4.1e+07 Transitions= 5.92e+08 Memory= 1775.850 t= 544 R= 8e+04 -Depth= 8687 States= 4.2e+07 Transitions= 6.12e+08 Memory= 1790.498 t= 562 R= 7e+04 -Depth= 8687 States= 4.3e+07 Transitions= 6.29e+08 Memory= 1807.783 t= 578 R= 7e+04 -Depth= 8687 States= 4.4e+07 Transitions= 6.48e+08 Memory= 1822.432 t= 595 R= 7e+04 -Depth= 8687 States= 4.5e+07 Transitions= 6.61e+08 Memory= 1838.838 t= 606 R= 7e+04 -Depth= 8687 States= 4.6e+07 Transitions= 6.81e+08 Memory= 1853.291 t= 625 R= 7e+04 -Depth= 8687 States= 4.7e+07 Transitions= 6.93e+08 Memory= 1870.772 t= 635 R= 7e+04 -Depth= 8687 States= 4.8e+07 Transitions= 7.02e+08 Memory= 1889.912 t= 644 R= 7e+04 -Depth= 8687 States= 4.9e+07 Transitions= 7.15e+08 Memory= 1902.998 t= 656 R= 7e+04 -Depth= 8687 States= 5e+07 Transitions= 7.27e+08 Memory= 1919.600 t= 667 R= 7e+04 -Depth= 9033 States= 5.1e+07 Transitions= 7.42e+08 Memory= 1935.518 t= 681 R= 7e+04 -Depth= 9033 States= 5.2e+07 Transitions= 7.53e+08 Memory= 1954.170 t= 691 R= 8e+04 -Depth= 9033 States= 5.3e+07 Transitions= 7.66e+08 Memory= 1969.990 t= 703 R= 8e+04 -Depth= 9033 States= 5.4e+07 Transitions= 7.77e+08 Memory= 1988.545 t= 713 R= 8e+04 -Depth= 9033 States= 5.5e+07 Transitions= 7.9e+08 Memory= 2004.756 t= 725 R= 8e+04 -Depth= 9033 States= 5.6e+07 Transitions= 8.1e+08 Memory= 2016.084 t= 743 R= 8e+04 -Depth= 9033 States= 5.7e+07 Transitions= 8.32e+08 Memory= 2030.440 t= 763 R= 7e+04 -Depth= 9033 States= 5.8e+07 Transitions= 8.51e+08 Memory= 2046.260 t= 781 R= 7e+04 -Depth= 9033 States= 5.9e+07 Transitions= 8.7e+08 Memory= 2061.592 t= 797 R= 7e+04 -Depth= 9033 States= 6e+07 Transitions= 8.83e+08 Memory= 2078.779 t= 809 R= 7e+04 -Depth= 9033 States= 6.1e+07 Transitions= 9.01e+08 Memory= 2094.014 t= 826 R= 7e+04 -Depth= 9033 States= 6.2e+07 Transitions= 9.16e+08 Memory= 2108.467 t= 840 R= 7e+04 -Depth= 9033 States= 6.3e+07 Transitions= 9.26e+08 Memory= 2126.924 t= 849 R= 7e+04 -Depth= 9033 States= 6.4e+07 Transitions= 9.38e+08 Memory= 2142.158 t= 860 R= 7e+04 -Depth= 9033 States= 6.5e+07 Transitions= 9.51e+08 Memory= 2157.295 t= 871 R= 7e+04 -Depth= 9379 States= 6.6e+07 Transitions= 9.63e+08 Memory= 2173.115 t= 883 R= 7e+04 -Depth= 9379 States= 6.7e+07 Transitions= 9.77e+08 Memory= 2190.401 t= 895 R= 7e+04 -Depth= 9379 States= 6.8e+07 Transitions= 9.88e+08 Memory= 2208.955 t= 905 R= 8e+04 -Depth= 9379 States= 6.9e+07 Transitions= 1e+09 Memory= 2223.311 t= 919 R= 8e+04 -Depth= 9379 States= 7e+07 Transitions= 1.01e+09 Memory= 2242.256 t= 928 R= 8e+04 -Depth= 9379 States= 7.1e+07 Transitions= 1.03e+09 Memory= 2257.295 t= 940 R= 8e+04 -Depth= 9379 States= 7.2e+07 Transitions= 1.05e+09 Memory= 2269.307 t= 960 R= 8e+04 -Depth= 9379 States= 7.3e+07 Transitions= 1.07e+09 Memory= 2283.760 t= 979 R= 7e+04 -Depth= 9379 States= 7.4e+07 Transitions= 1.09e+09 Memory= 2299.385 t= 996 R= 7e+04 -Depth= 9379 States= 7.5e+07 Transitions= 1.11e+09 Memory= 2314.619 t= 1.01e+03 R= 7e+04 -Depth= 9379 States= 7.6e+07 Transitions= 1.12e+09 Memory= 2333.369 t= 1.02e+03 R= 7e+04 -Depth= 9379 States= 7.7e+07 Transitions= 1.14e+09 Memory= 2347.139 t= 1.04e+03 R= 7e+04 -Depth= 9379 States= 7.8e+07 Transitions= 1.15e+09 Memory= 2385.029 t= 1.06e+03 R= 7e+04 -Depth= 9379 States= 7.9e+07 Transitions= 1.17e+09 Memory= 2453.682 t= 1.07e+03 R= 7e+04 -Depth= 9379 States= 8e+07 Transitions= 1.18e+09 Memory= 2522.236 t= 1.08e+03 R= 7e+04 -Depth= 9379 States= 8.1e+07 Transitions= 1.2e+09 Memory= 2590.889 t= 1.1e+03 R= 7e+04 -Depth= 9379 States= 8.2e+07 Transitions= 1.22e+09 Memory= 2624.287 t= 1.12e+03 R= 7e+04 -Depth= 9379 States= 8.3e+07 Transitions= 1.23e+09 Memory= 2640.303 t= 1.13e+03 R= 7e+04 -Depth= 9379 States= 8.4e+07 Transitions= 1.25e+09 Memory= 2654.170 t= 1.15e+03 R= 7e+04 -Depth= 9379 States= 8.5e+07 Transitions= 1.27e+09 Memory= 2669.111 t= 1.16e+03 R= 7e+04 -Depth= 9379 States= 8.6e+07 Transitions= 1.29e+09 Memory= 2684.053 t= 1.18e+03 R= 7e+04 -Depth= 9379 States= 8.7e+07 Transitions= 1.31e+09 Memory= 2698.604 t= 1.2e+03 R= 7e+04 -Depth= 9379 States= 8.8e+07 Transitions= 1.33e+09 Memory= 2719.697 t= 1.22e+03 R= 7e+04 -Depth= 9379 States= 8.9e+07 Transitions= 1.35e+09 Memory= 2788.350 t= 1.24e+03 R= 7e+04 -Depth= 9379 States= 9e+07 Transitions= 1.37e+09 Memory= 2819.990 t= 1.26e+03 R= 7e+04 -Depth= 9379 States= 9.1e+07 Transitions= 1.39e+09 Memory= 2846.553 t= 1.27e+03 R= 7e+04 -Depth= 9379 States= 9.2e+07 Transitions= 1.4e+09 Memory= 2864.912 t= 1.28e+03 R= 7e+04 -Depth= 9379 States= 9.3e+07 Transitions= 1.41e+09 Memory= 2877.901 t= 1.3e+03 R= 7e+04 -Depth= 9379 States= 9.4e+07 Transitions= 1.44e+09 Memory= 2892.842 t= 1.31e+03 R= 7e+04 -Depth= 9379 States= 9.5e+07 Transitions= 1.45e+09 Memory= 2908.076 t= 1.33e+03 R= 7e+04 -Depth= 9379 States= 9.6e+07 Transitions= 1.47e+09 Memory= 2922.627 t= 1.35e+03 R= 7e+04 -Depth= 9379 States= 9.7e+07 Transitions= 1.49e+09 Memory= 2940.693 t= 1.36e+03 R= 7e+04 -Depth= 9379 States= 9.8e+07 Transitions= 1.51e+09 Memory= 2953.291 t= 1.38e+03 R= 7e+04 -Depth= 9379 States= 9.9e+07 Transitions= 1.53e+09 Memory= 2968.526 t= 1.4e+03 R= 7e+04 -Depth= 9379 States= 1e+08 Transitions= 1.56e+09 Memory= 2981.709 t= 1.42e+03 R= 7e+04 -Depth= 9379 States= 1.01e+08 Transitions= 1.57e+09 Memory= 2997.236 t= 1.44e+03 R= 7e+04 -Depth= 9379 States= 1.02e+08 Transitions= 1.59e+09 Memory= 3011.592 t= 1.46e+03 R= 7e+04 -Depth= 9379 States= 1.03e+08 Transitions= 1.61e+09 Memory= 3037.861 t= 1.47e+03 R= 7e+04 -Depth= 9379 States= 1.04e+08 Transitions= 1.63e+09 Memory= 3106.514 t= 1.49e+03 R= 7e+04 -Depth= 9379 States= 1.05e+08 Transitions= 1.65e+09 Memory= 3175.166 t= 1.51e+03 R= 7e+04 -Depth= 9379 States= 1.06e+08 Transitions= 1.67e+09 Memory= 3223.897 t= 1.52e+03 R= 7e+04 -Depth= 9379 States= 1.07e+08 Transitions= 1.68e+09 Memory= 3246.846 t= 1.54e+03 R= 7e+04 -Depth= 9379 States= 1.08e+08 Transitions= 1.7e+09 Memory= 3283.467 t= 1.56e+03 R= 7e+04 -Depth= 9379 States= 1.09e+08 Transitions= 1.72e+09 Memory= 3316.670 t= 1.57e+03 R= 7e+04 -Depth= 9379 States= 1.1e+08 Transitions= 1.73e+09 Memory= 3344.209 t= 1.59e+03 R= 7e+04 -Depth= 9379 States= 1.11e+08 Transitions= 1.75e+09 Memory= 3376.338 t= 1.6e+03 R= 7e+04 -Depth= 9379 States= 1.12e+08 Transitions= 1.76e+09 Memory= 3396.943 t= 1.62e+03 R= 7e+04 -Depth= 9379 States= 1.13e+08 Transitions= 1.78e+09 Memory= 3426.143 t= 1.63e+03 R= 7e+04 -Depth= 9379 States= 1.14e+08 Transitions= 1.8e+09 Memory= 3452.705 t= 1.65e+03 R= 7e+04 -Depth= 9379 States= 1.15e+08 Transitions= 1.81e+09 Memory= 3493.818 t= 1.66e+03 R= 7e+04 -Depth= 9379 States= 1.16e+08 Transitions= 1.83e+09 Memory= 3533.369 t= 1.67e+03 R= 7e+04 -Depth= 9379 States= 1.17e+08 Transitions= 1.84e+09 Memory= 3566.182 t= 1.69e+03 R= 7e+04 -Depth= 9379 States= 1.18e+08 Transitions= 1.86e+09 Memory= 3582.881 t= 1.7e+03 R= 7e+04 -Depth= 9379 States= 1.19e+08 Transitions= 1.88e+09 Memory= 3630.830 t= 1.72e+03 R= 7e+04 -Depth= 9379 States= 1.2e+08 Transitions= 1.89e+09 Memory= 3692.744 t= 1.74e+03 R= 7e+04 -Depth= 9379 States= 1.21e+08 Transitions= 1.91e+09 Memory= 3750.361 t= 1.75e+03 R= 7e+04 -Depth= 9379 States= 1.22e+08 Transitions= 1.92e+09 Memory= 3767.354 t= 1.76e+03 R= 7e+04 -Depth= 9379 States= 1.23e+08 Transitions= 1.94e+09 Memory= 3781.904 t= 1.78e+03 R= 7e+04 -Depth= 9379 States= 1.24e+08 Transitions= 1.96e+09 Memory= 3797.529 t= 1.8e+03 R= 7e+04 -Depth= 9379 States= 1.25e+08 Transitions= 1.98e+09 Memory= 3810.908 t= 1.82e+03 R= 7e+04 -Depth= 9379 States= 1.26e+08 Transitions= 2e+09 Memory= 3826.143 t= 1.83e+03 R= 7e+04 -Depth= 9379 States= 1.27e+08 Transitions= 2.02e+09 Memory= 3839.717 t= 1.86e+03 R= 7e+04 -Depth= 9379 States= 1.28e+08 Transitions= 2.04e+09 Memory= 3881.709 t= 1.87e+03 R= 7e+04 -Depth= 9379 States= 1.29e+08 Transitions= 2.06e+09 Memory= 3946.553 t= 1.89e+03 R= 7e+04 -Depth= 9379 States= 1.3e+08 Transitions= 2.08e+09 Memory= 3970.479 t= 1.91e+03 R= 7e+04 -Depth= 9379 States= 1.31e+08 Transitions= 2.09e+09 Memory= 3991.768 t= 1.92e+03 R= 7e+04 -Depth= 9379 States= 1.32e+08 Transitions= 2.1e+09 Memory= 4007.490 t= 1.93e+03 R= 7e+04 -Depth= 9379 States= 1.33e+08 Transitions= 2.13e+09 Memory= 4020.772 t= 1.95e+03 R= 7e+04 -Depth= 9379 States= 1.34e+08 Transitions= 2.14e+09 Memory= 4036.201 t= 1.97e+03 R= 7e+04 -Depth= 9379 States= 1.35e+08 Transitions= 2.16e+09 Memory= 4051.924 t= 1.98e+03 R= 7e+04 -pan: resizing hashtable to -w28.. done -Depth= 9379 States= 1.36e+08 Transitions= 2.18e+09 Memory= 6099.924 t= 2.02e+03 R= 7e+04 -Depth= 9379 States= 1.37e+08 Transitions= 2.2e+09 Memory= 6099.924 t= 2.03e+03 R= 7e+04 -Depth= 9379 States= 1.38e+08 Transitions= 2.22e+09 Memory= 6099.924 t= 2.05e+03 R= 7e+04 -Depth= 9379 States= 1.39e+08 Transitions= 2.24e+09 Memory= 6099.924 t= 2.07e+03 R= 7e+04 -Depth= 9379 States= 1.4e+08 Transitions= 2.26e+09 Memory= 6108.518 t= 2.09e+03 R= 7e+04 -Depth= 9379 States= 1.41e+08 Transitions= 2.28e+09 Memory= 6124.729 t= 2.1e+03 R= 7e+04 -Depth= 9379 States= 1.42e+08 Transitions= 2.3e+09 Memory= 6138.889 t= 2.12e+03 R= 7e+04 -Depth= 9379 States= 1.43e+08 Transitions= 2.31e+09 Memory= 6178.928 t= 2.13e+03 R= 7e+04 -Depth= 9379 States= 1.44e+08 Transitions= 2.33e+09 Memory= 6247.483 t= 2.15e+03 R= 7e+04 -Depth= 9379 States= 1.45e+08 Transitions= 2.35e+09 Memory= 6316.135 t= 2.17e+03 R= 7e+04 -Depth= 9379 States= 1.46e+08 Transitions= 2.37e+09 Memory= 6353.440 t= 2.19e+03 R= 7e+04 -Depth= 9379 States= 1.47e+08 Transitions= 2.39e+09 Memory= 6381.662 t= 2.21e+03 R= 7e+04 -Depth= 9379 States= 1.48e+08 Transitions= 2.41e+09 Memory= 6422.190 t= 2.22e+03 R= 7e+04 -Depth= 9379 States= 1.49e+08 Transitions= 2.42e+09 Memory= 6449.143 t= 2.23e+03 R= 7e+04 -Depth= 9379 States= 1.5e+08 Transitions= 2.44e+09 Memory= 6472.580 t= 2.25e+03 R= 7e+04 -Depth= 9379 States= 1.51e+08 Transitions= 2.45e+09 Memory= 6503.733 t= 2.26e+03 R= 7e+04 -Depth= 9379 States= 1.52e+08 Transitions= 2.47e+09 Memory= 6531.369 t= 2.28e+03 R= 7e+04 -Depth= 9379 States= 1.53e+08 Transitions= 2.49e+09 Memory= 6554.123 t= 2.29e+03 R= 7e+04 -Depth= 9379 States= 1.54e+08 Transitions= 2.5e+09 Memory= 6585.373 t= 2.31e+03 R= 7e+04 -Depth= 9379 States= 1.55e+08 Transitions= 2.52e+09 Memory= 6622.776 t= 2.32e+03 R= 7e+04 -Depth= 9379 States= 1.56e+08 Transitions= 2.54e+09 Memory= 6671.213 t= 2.34e+03 R= 7e+04 -Depth= 9379 States= 1.57e+08 Transitions= 2.55e+09 Memory= 6696.115 t= 2.35e+03 R= 7e+04 -Depth= 9379 States= 1.58e+08 Transitions= 2.57e+09 Memory= 6722.776 t= 2.37e+03 R= 7e+04 -Depth= 9379 States= 1.59e+08 Transitions= 2.58e+09 Memory= 6764.572 t= 2.38e+03 R= 7e+04 -Depth= 9379 States= 1.6e+08 Transitions= 2.6e+09 Memory= 6830.490 t= 2.4e+03 R= 7e+04 -Depth= 9379 States= 1.61e+08 Transitions= 2.62e+09 Memory= 6879.026 t= 2.41e+03 R= 7e+04 -Depth= 9379 States= 1.62e+08 Transitions= 2.63e+09 Memory= 6895.432 t= 2.42e+03 R= 7e+04 -Depth= 9379 States= 1.63e+08 Transitions= 2.65e+09 Memory= 6909.787 t= 2.44e+03 R= 7e+04 -Depth= 9379 States= 1.64e+08 Transitions= 2.67e+09 Memory= 6925.217 t= 2.46e+03 R= 7e+04 -Depth= 9379 States= 1.65e+08 Transitions= 2.69e+09 Memory= 6938.986 t= 2.48e+03 R= 7e+04 -Depth= 9379 States= 1.66e+08 Transitions= 2.71e+09 Memory= 6953.537 t= 2.5e+03 R= 7e+04 -Depth= 9379 States= 1.67e+08 Transitions= 2.73e+09 Memory= 6967.893 t= 2.52e+03 R= 7e+04 -Depth= 9379 States= 1.68e+08 Transitions= 2.75e+09 Memory= 7022.190 t= 2.53e+03 R= 7e+04 -Depth= 9379 States= 1.69e+08 Transitions= 2.77e+09 Memory= 7076.779 t= 2.55e+03 R= 7e+04 -Depth= 9379 States= 1.7e+08 Transitions= 2.79e+09 Memory= 7102.365 t= 2.57e+03 R= 7e+04 -Depth= 9379 States= 1.71e+08 Transitions= 2.8e+09 Memory= 7119.162 t= 2.58e+03 R= 7e+04 -Depth= 9379 States= 1.72e+08 Transitions= 2.81e+09 Memory= 7135.178 t= 2.59e+03 R= 7e+04 -Depth= 9379 States= 1.73e+08 Transitions= 2.84e+09 Memory= 7150.022 t= 2.61e+03 R= 7e+04 -Depth= 9379 States= 1.74e+08 Transitions= 2.85e+09 Memory= 7164.475 t= 2.63e+03 R= 7e+04 -Depth= 9379 States= 1.75e+08 Transitions= 2.87e+09 Memory= 7180.295 t= 2.64e+03 R= 7e+04 -Depth= 9379 States= 1.76e+08 Transitions= 2.89e+09 Memory= 7198.264 t= 2.66e+03 R= 7e+04 -Depth= 9379 States= 1.77e+08 Transitions= 2.9e+09 Memory= 7211.447 t= 2.67e+03 R= 7e+04 -Depth= 9379 States= 1.78e+08 Transitions= 2.93e+09 Memory= 7224.338 t= 2.7e+03 R= 7e+04 -Depth= 9379 States= 1.79e+08 Transitions= 2.95e+09 Memory= 7239.084 t= 2.72e+03 R= 7e+04 -Depth= 9379 States= 1.8e+08 Transitions= 2.97e+09 Memory= 7253.342 t= 2.74e+03 R= 7e+04 -Depth= 9379 States= 1.81e+08 Transitions= 2.99e+09 Memory= 7268.283 t= 2.75e+03 R= 7e+04 -Depth= 9379 States= 1.82e+08 Transitions= 3.01e+09 Memory= 7283.615 t= 2.77e+03 R= 7e+04 -Depth= 9379 States= 1.83e+08 Transitions= 3.02e+09 Memory= 7335.276 t= 2.78e+03 R= 7e+04 -Depth= 9379 States= 1.84e+08 Transitions= 3.04e+09 Memory= 7403.928 t= 2.8e+03 R= 7e+04 -Depth= 9379 States= 1.85e+08 Transitions= 3.06e+09 Memory= 7472.580 t= 2.82e+03 R= 7e+04 -Depth= 9379 States= 1.86e+08 Transitions= 3.08e+09 Memory= 7501.877 t= 2.84e+03 R= 7e+04 -Depth= 9379 States= 1.87e+08 Transitions= 3.1e+09 Memory= 7528.147 t= 2.85e+03 R= 7e+04 -Depth= 9379 States= 1.88e+08 Transitions= 3.11e+09 Memory= 7566.135 t= 2.87e+03 R= 7e+04 -Depth= 9379 States= 1.89e+08 Transitions= 3.13e+09 Memory= 7593.479 t= 2.88e+03 R= 7e+04 -Depth= 9379 States= 1.9e+08 Transitions= 3.15e+09 Memory= 7625.119 t= 2.9e+03 R= 7e+04 -Depth= 9379 States= 1.91e+08 Transitions= 3.16e+09 Memory= 7647.483 t= 2.91e+03 R= 7e+04 -Depth= 9379 States= 1.92e+08 Transitions= 3.18e+09 Memory= 7677.951 t= 2.93e+03 R= 7e+04 -Depth= 9379 States= 1.93e+08 Transitions= 3.2e+09 Memory= 7698.947 t= 2.94e+03 R= 7e+04 -Depth= 9379 States= 1.94e+08 Transitions= 3.21e+09 Memory= 7732.443 t= 2.96e+03 R= 7e+04 -Depth= 9379 States= 1.95e+08 Transitions= 3.23e+09 Memory= 7772.092 t= 2.97e+03 R= 7e+04 -Depth= 9379 States= 1.96e+08 Transitions= 3.24e+09 Memory= 7815.451 t= 2.98e+03 R= 7e+04 -Depth= 9379 States= 1.97e+08 Transitions= 3.26e+09 Memory= 7839.865 t= 3e+03 R= 7e+04 -Depth= 9379 States= 1.98e+08 Transitions= 3.28e+09 Memory= 7869.651 t= 3.01e+03 R= 7e+04 -Depth= 9379 States= 1.99e+08 Transitions= 3.29e+09 Memory= 7921.018 t= 3.03e+03 R= 7e+04 -Depth= 9379 States= 2e+08 Transitions= 3.31e+09 Memory= 7986.740 t= 3.05e+03 R= 7e+04 -Depth= 9379 States= 2.01e+08 Transitions= 3.33e+09 Memory= 8023.752 t= 3.06e+03 R= 7e+04 -Depth= 9379 States= 2.02e+08 Transitions= 3.34e+09 Memory= 8039.768 t= 3.07e+03 R= 7e+04 -Depth= 9379 States= 2.03e+08 Transitions= 3.36e+09 Memory= 8053.830 t= 3.09e+03 R= 7e+04 -Depth= 9379 States= 2.04e+08 Transitions= 3.38e+09 Memory= 8068.772 t= 3.11e+03 R= 7e+04 -Depth= 9379 States= 2.05e+08 Transitions= 3.4e+09 Memory= 8083.127 t= 3.13e+03 R= 7e+04 -Depth= 9379 States= 2.06e+08 Transitions= 3.42e+09 Memory= 8098.068 t= 3.15e+03 R= 7e+04 -Depth= 9379 States= 2.07e+08 Transitions= 3.44e+09 Memory= 8115.744 t= 3.16e+03 R= 7e+04 -Depth= 9379 States= 2.08e+08 Transitions= 3.46e+09 Memory= 8178.537 t= 3.18e+03 R= 7e+04 -Depth= 9379 States= 2.09e+08 Transitions= 3.48e+09 Memory= 8220.627 t= 3.2e+03 R= 7e+04 -Depth= 9379 States= 2.1e+08 Transitions= 3.49e+09 Memory= 8246.799 t= 3.21e+03 R= 7e+04 -Depth= 9379 States= 2.11e+08 Transitions= 3.5e+09 Memory= 8263.791 t= 3.22e+03 R= 7e+04 -Depth= 9379 States= 2.12e+08 Transitions= 3.52e+09 Memory= 8279.514 t= 3.24e+03 R= 7e+04 -Depth= 9379 States= 2.13e+08 Transitions= 3.54e+09 Memory= 8293.772 t= 3.26e+03 R= 7e+04 -Depth= 9379 States= 2.14e+08 Transitions= 3.56e+09 Memory= 8309.201 t= 3.28e+03 R= 7e+04 -Depth= 9379 States= 2.15e+08 Transitions= 3.58e+09 Memory= 8323.752 t= 3.29e+03 R= 7e+04 -Depth= 9379 States= 2.16e+08 Transitions= 3.6e+09 Memory= 8342.990 t= 3.31e+03 R= 7e+04 -Depth= 9379 States= 2.17e+08 Transitions= 3.61e+09 Memory= 8355.197 t= 3.32e+03 R= 7e+04 -Depth= 9379 States= 2.18e+08 Transitions= 3.64e+09 Memory= 8368.674 t= 3.35e+03 R= 7e+04 -Depth= 9379 States= 2.19e+08 Transitions= 3.66e+09 Memory= 8382.932 t= 3.37e+03 R= 7e+04 -Depth= 9379 States= 2.2e+08 Transitions= 3.68e+09 Memory= 8398.459 t= 3.38e+03 R= 7e+04 -Depth= 9379 States= 2.21e+08 Transitions= 3.7e+09 Memory= 8412.912 t= 3.4e+03 R= 6e+04 -Depth= 9379 States= 2.22e+08 Transitions= 3.71e+09 Memory= 8428.244 t= 3.42e+03 R= 6e+04 -Depth= 9379 States= 2.23e+08 Transitions= 3.73e+09 Memory= 8491.721 t= 3.43e+03 R= 6e+04 -Depth= 9379 States= 2.24e+08 Transitions= 3.75e+09 Memory= 8560.373 t= 3.45e+03 R= 6e+04 -Depth= 9379 States= 2.25e+08 Transitions= 3.77e+09 Memory= 8621.604 t= 3.47e+03 R= 6e+04 -Depth= 9379 States= 2.26e+08 Transitions= 3.79e+09 Memory= 8648.850 t= 3.48e+03 R= 6e+04 -Depth= 9379 States= 2.27e+08 Transitions= 3.81e+09 Memory= 8671.994 t= 3.5e+03 R= 6e+04 -Depth= 9379 States= 2.28e+08 Transitions= 3.82e+09 Memory= 8710.861 t= 3.51e+03 R= 6e+04 -Depth= 9379 States= 2.29e+08 Transitions= 3.84e+09 Memory= 8742.893 t= 3.53e+03 R= 6e+04 -Depth= 9379 States= 2.3e+08 Transitions= 3.85e+09 Memory= 8771.799 t= 3.54e+03 R= 6e+04 -Depth= 9379 States= 2.31e+08 Transitions= 3.87e+09 Memory= 8792.600 t= 3.56e+03 R= 6e+04 -Depth= 9379 States= 2.32e+08 Transitions= 3.89e+09 Memory= 8828.733 t= 3.57e+03 R= 6e+04 -Depth= 9379 States= 2.33e+08 Transitions= 3.9e+09 Memory= 8843.869 t= 3.59e+03 R= 6e+04 -Depth= 9379 States= 2.34e+08 Transitions= 3.92e+09 Memory= 8884.787 t= 3.6e+03 R= 6e+04 -Depth= 9379 States= 2.35e+08 Transitions= 3.93e+09 Memory= 8924.240 t= 3.62e+03 R= 6e+04 -Depth= 9379 States= 2.36e+08 Transitions= 3.95e+09 Memory= 8960.276 t= 3.63e+03 R= 6e+04 -Depth= 9379 States= 2.37e+08 Transitions= 3.97e+09 Memory= 8984.494 t= 3.65e+03 R= 6e+04 -Depth= 9379 States= 2.38e+08 Transitions= 3.98e+09 Memory= 9016.428 t= 3.66e+03 R= 6e+04 -Depth= 9379 States= 2.39e+08 Transitions= 4e+09 Memory= 9077.365 t= 3.68e+03 R= 6e+04 -Depth= 9379 States= 2.4e+08 Transitions= 4.02e+09 Memory= 9143.088 t= 3.7e+03 R= 6e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 64 byte, depth reached 9379, errors: 0 - 88114592 states, stored (2.40192e+08 visited) -3.782223e+09 states, matched -4.0224152e+09 transitions (= visited+matched) -1.4282782e+10 atomic steps -hash conflicts: 5.384059e+08 (resolved) - -Stats on memory usage (in Megabytes): - 7731.001 equivalent memory usage for states (stored*(State-vector + overhead)) - 6648.180 actual memory usage for states (compression: 85.99%) - state-vector as stored = 51 byte + 28 byte overhead - 2048.000 memory used for hash table (-w28) - 457.764 memory used for DFS stack (-m10000000) - 1.188 memory lost to fragmentation - 9152.756 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 256, "(1)" - line 418, "pan.___", state 286, "(1)" - line 399, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 395, "(1)" - line 418, "pan.___", state 425, "(1)" - line 540, "pan.___", state 456, "-end-" - (17 of 456 states) -unreached in proctype urcu_reader_sig - line 399, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 70, "(1)" - line 418, "pan.___", state 100, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 247, "(1)" - line 418, "pan.___", state 277, "(1)" - line 399, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 359, "(1)" - line 418, "pan.___", state 389, "(1)" - line 614, "pan.___", state 411, "-end-" - (17 of 411 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 59, "(1)" - line 413, "pan.___", state 72, "(1)" - line 418, "pan.___", state 89, "(1)" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 240, "(1)" - line 164, "pan.___", state 248, "(1)" - line 168, "pan.___", state 260, "(1)" - line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 370, "(1)" - line 164, "pan.___", state 378, "(1)" - line 168, "pan.___", state 390, "(1)" - line 399, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 449, "(1)" - line 413, "pan.___", state 462, "(1)" - line 418, "pan.___", state 479, "(1)" - line 399, "pan.___", state 498, "(1)" - line 403, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 554, "(1)" - line 418, "pan.___", state 571, "(1)" - line 403, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 647, "(1)" - line 418, "pan.___", state 664, "(1)" - line 179, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 710, "(1)" - line 164, "pan.___", state 718, "(1)" - line 168, "pan.___", state 730, "(1)" - line 175, "pan.___", state 741, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 817, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 830, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 840, "(1)" - line 164, "pan.___", state 848, "(1)" - line 168, "pan.___", state 860, "(1)" - line 399, "pan.___", state 882, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 884, "(1)" - line 399, "pan.___", state 885, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 885, "else" - line 399, "pan.___", state 888, "(1)" - line 403, "pan.___", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 898, "(1)" - line 403, "pan.___", state 899, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 899, "else" - line 403, "pan.___", state 902, "(1)" - line 403, "pan.___", state 903, "(1)" - line 403, "pan.___", state 903, "(1)" - line 401, "pan.___", state 908, "((i<1))" - line 401, "pan.___", state 908, "((i>=1))" - line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 927, "(1)" - line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 928, "else" - line 409, "pan.___", state 931, "(1)" - line 409, "pan.___", state 932, "(1)" - line 409, "pan.___", state 932, "(1)" - line 413, "pan.___", state 940, "(1)" - line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 941, "else" - line 413, "pan.___", state 944, "(1)" - line 413, "pan.___", state 945, "(1)" - line 413, "pan.___", state 945, "(1)" - line 411, "pan.___", state 950, "((i<1))" - line 411, "pan.___", state 950, "((i>=1))" - line 418, "pan.___", state 957, "(1)" - line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 958, "else" - line 418, "pan.___", state 961, "(1)" - line 418, "pan.___", state 962, "(1)" - line 418, "pan.___", state 962, "(1)" - line 420, "pan.___", state 965, "(1)" - line 420, "pan.___", state 965, "(1)" - line 403, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1040, "(1)" - line 418, "pan.___", state 1057, "(1)" - line 403, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1130, "(1)" - line 418, "pan.___", state 1147, "(1)" - line 399, "pan.___", state 1166, "(1)" - line 403, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1222, "(1)" - line 418, "pan.___", state 1239, "(1)" - line 403, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1315, "(1)" - line 418, "pan.___", state 1332, "(1)" - line 179, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1378, "(1)" - line 164, "pan.___", state 1386, "(1)" - line 168, "pan.___", state 1398, "(1)" - line 175, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 1485, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1498, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1508, "(1)" - line 164, "pan.___", state 1516, "(1)" - line 168, "pan.___", state 1528, "(1)" - line 399, "pan.___", state 1550, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1552, "(1)" - line 399, "pan.___", state 1553, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1553, "else" - line 399, "pan.___", state 1556, "(1)" - line 403, "pan.___", state 1564, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 1566, "(1)" - line 403, "pan.___", state 1567, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 1567, "else" - line 403, "pan.___", state 1570, "(1)" - line 403, "pan.___", state 1571, "(1)" - line 403, "pan.___", state 1571, "(1)" - line 401, "pan.___", state 1576, "((i<1))" - line 401, "pan.___", state 1576, "((i>=1))" - line 408, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1595, "(1)" - line 409, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 1596, "else" - line 409, "pan.___", state 1599, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 413, "pan.___", state 1608, "(1)" - line 413, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 1609, "else" - line 413, "pan.___", state 1612, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 411, "pan.___", state 1618, "((i<1))" - line 411, "pan.___", state 1618, "((i>=1))" - line 418, "pan.___", state 1625, "(1)" - line 418, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 1626, "else" - line 418, "pan.___", state 1629, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 179, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1681, "(1)" - line 164, "pan.___", state 1689, "(1)" - line 168, "pan.___", state 1701, "(1)" - line 175, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 1788, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1801, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1811, "(1)" - line 164, "pan.___", state 1819, "(1)" - line 168, "pan.___", state 1831, "(1)" - line 702, "pan.___", state 1856, "-end-" - (158 of 1856 states) -unreached in proctype :init: - (0 of 46 states) -unreached in proctype :never: - line 751, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 3.7e+03 seconds -pan: rate 64918.749 states/second -pan: avg transition delay 9.1982e-07 usec -cp .input.spin urcu_progress_writer.spin.input -cp .input.spin.trail urcu_progress_writer.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer.spin.input b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer.spin.input deleted file mode 100644 index 43221e7..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define WRITER_PROGRESS - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer.spin.input.trail deleted file mode 100644 index e65d663..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer.spin.input.trail +++ /dev/null @@ -1,9 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2679 -2:1:2673 -3:1:2674 -4:1:2675 -5:1:2676 -6:0:2685 -7:5:1129 diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer_error.define b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer_error.log b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer_error.log deleted file mode 100644 index f870a6e..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer_error.log +++ /dev/null @@ -1,535 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer_error.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 745) -depth 15: Claim reached state 9 (line 750) -depth 1194: Claim reached state 9 (line 749) -Depth= 3253 States= 1e+06 Transitions= 1.06e+07 Memory= 484.416 t= 9.57 R= 1e+05 -Depth= 3253 States= 2e+06 Transitions= 2.04e+07 Memory= 501.311 t= 18.5 R= 1e+05 -pan: acceptance cycle (at depth 1938) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 64 byte, depth reached 23684, errors: 1 - 682672 states, stored (2.81536e+06 visited) - 30226122 states, matched - 33041487 transitions (= visited+matched) -1.1631626e+08 atomic steps -hash conflicts: 6056013 (resolved) - -Stats on memory usage (in Megabytes): - 59.896 equivalent memory usage for states (stored*(State-vector + overhead)) - 47.456 actual memory usage for states (compression: 79.23%) - state-vector as stored = 45 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 513.127 total actual memory usage - -unreached in proctype urcu_reader - line 400, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 61, "(1)" - line 419, "pan.___", state 91, "(1)" - line 400, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 158, "(1)" - line 419, "pan.___", state 188, "(1)" - line 400, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 256, "(1)" - line 419, "pan.___", state 286, "(1)" - line 400, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 395, "(1)" - line 419, "pan.___", state 425, "(1)" - line 541, "pan.___", state 456, "-end-" - (17 of 456 states) -unreached in proctype urcu_reader_sig - line 400, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 70, "(1)" - line 419, "pan.___", state 100, "(1)" - line 400, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 158, "(1)" - line 419, "pan.___", state 188, "(1)" - line 400, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 247, "(1)" - line 419, "pan.___", state 277, "(1)" - line 400, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 359, "(1)" - line 419, "pan.___", state 389, "(1)" - line 615, "pan.___", state 411, "-end-" - (17 of 411 states) -unreached in proctype urcu_writer - line 400, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 20, "(1)" - line 404, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 34, "(1)" - line 404, "pan.___", state 35, "(1)" - line 404, "pan.___", state 35, "(1)" - line 402, "pan.___", state 40, "((i<1))" - line 402, "pan.___", state 40, "((i>=1))" - line 409, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 59, "(1)" - line 410, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 60, "else" - line 410, "pan.___", state 63, "(1)" - line 410, "pan.___", state 64, "(1)" - line 410, "pan.___", state 64, "(1)" - line 414, "pan.___", state 72, "(1)" - line 414, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 73, "else" - line 414, "pan.___", state 76, "(1)" - line 414, "pan.___", state 77, "(1)" - line 414, "pan.___", state 77, "(1)" - line 412, "pan.___", state 82, "((i<1))" - line 412, "pan.___", state 82, "((i>=1))" - line 419, "pan.___", state 89, "(1)" - line 419, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 90, "else" - line 419, "pan.___", state 93, "(1)" - line 419, "pan.___", state 94, "(1)" - line 419, "pan.___", state 94, "(1)" - line 370, "pan.___", state 99, "(1)" - line 640, "pan.___", state 103, "cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )] = (old_gen+1)" - line 638, "pan.___", state 104, "old_gen = cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )]" - line 400, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 114, "(1)" - line 404, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 128, "(1)" - line 404, "pan.___", state 129, "(1)" - line 404, "pan.___", state 129, "(1)" - line 402, "pan.___", state 134, "((i<1))" - line 402, "pan.___", state 134, "((i>=1))" - line 410, "pan.___", state 153, "(1)" - line 410, "pan.___", state 154, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 154, "else" - line 410, "pan.___", state 157, "(1)" - line 410, "pan.___", state 158, "(1)" - line 410, "pan.___", state 158, "(1)" - line 414, "pan.___", state 166, "(1)" - line 414, "pan.___", state 167, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 167, "else" - line 414, "pan.___", state 170, "(1)" - line 414, "pan.___", state 171, "(1)" - line 414, "pan.___", state 171, "(1)" - line 412, "pan.___", state 176, "((i<1))" - line 412, "pan.___", state 176, "((i>=1))" - line 419, "pan.___", state 183, "(1)" - line 419, "pan.___", state 184, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 184, "else" - line 419, "pan.___", state 187, "(1)" - line 419, "pan.___", state 188, "(1)" - line 419, "pan.___", state 188, "(1)" - line 421, "pan.___", state 191, "(1)" - line 421, "pan.___", state 191, "(1)" - line 370, "pan.___", state 193, "(1)" - line 653, "pan.___", state 199, "(1)" - line 647, "pan.___", state 202, "((write_lock==0))" - line 647, "pan.___", state 202, "else" - line 645, "pan.___", state 203, "(1)" - line 176, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 180, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 178, "pan.___", state 225, "((j<1))" - line 178, "pan.___", state 225, "((j>=1))" - line 184, "pan.___", state 230, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 161, "pan.___", state 240, "(1)" - line 165, "pan.___", state 248, "(1)" - line 165, "pan.___", state 249, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 165, "pan.___", state 249, "else" - line 163, "pan.___", state 254, "((j<1))" - line 163, "pan.___", state 254, "((j>=1))" - line 169, "pan.___", state 260, "(1)" - line 169, "pan.___", state 261, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 169, "pan.___", state 261, "else" - line 171, "pan.___", state 264, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 171, "pan.___", state 264, "else" - line 176, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 184, "pan.___", state 293, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 169, "pan.___", state 323, "(1)" - line 169, "pan.___", state 324, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 176, "pan.___", state 338, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 180, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 178, "pan.___", state 355, "((j<1))" - line 178, "pan.___", state 355, "((j>=1))" - line 184, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 161, "pan.___", state 370, "(1)" - line 165, "pan.___", state 378, "(1)" - line 165, "pan.___", state 379, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 165, "pan.___", state 379, "else" - line 163, "pan.___", state 384, "((j<1))" - line 163, "pan.___", state 384, "((j>=1))" - line 169, "pan.___", state 390, "(1)" - line 169, "pan.___", state 391, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 169, "pan.___", state 391, "else" - line 171, "pan.___", state 394, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 171, "pan.___", state 394, "else" - line 400, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 410, "(1)" - line 404, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 424, "(1)" - line 404, "pan.___", state 425, "(1)" - line 404, "pan.___", state 425, "(1)" - line 402, "pan.___", state 430, "((i<1))" - line 402, "pan.___", state 430, "((i>=1))" - line 409, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 449, "(1)" - line 410, "pan.___", state 450, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 450, "else" - line 410, "pan.___", state 453, "(1)" - line 410, "pan.___", state 454, "(1)" - line 410, "pan.___", state 454, "(1)" - line 414, "pan.___", state 462, "(1)" - line 414, "pan.___", state 463, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 463, "else" - line 414, "pan.___", state 466, "(1)" - line 414, "pan.___", state 467, "(1)" - line 414, "pan.___", state 467, "(1)" - line 412, "pan.___", state 472, "((i<1))" - line 412, "pan.___", state 472, "((i>=1))" - line 419, "pan.___", state 479, "(1)" - line 419, "pan.___", state 480, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 480, "else" - line 419, "pan.___", state 483, "(1)" - line 419, "pan.___", state 484, "(1)" - line 419, "pan.___", state 484, "(1)" - line 421, "pan.___", state 487, "(1)" - line 421, "pan.___", state 487, "(1)" - line 370, "pan.___", state 489, "(1)" - line 662, "pan.___", state 492, "cached_urcu_gp_ctr.val[( ((_pid<2)) ? (0) : (1) )] = (tmp^(1<<7))" - line 400, "pan.___", state 498, "(1)" - line 400, "pan.___", state 499, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 499, "else" - line 400, "pan.___", state 502, "(1)" - line 404, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 516, "(1)" - line 404, "pan.___", state 517, "(1)" - line 404, "pan.___", state 517, "(1)" - line 402, "pan.___", state 522, "((i<1))" - line 402, "pan.___", state 522, "((i>=1))" - line 409, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 541, "(1)" - line 410, "pan.___", state 542, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 542, "else" - line 410, "pan.___", state 545, "(1)" - line 410, "pan.___", state 546, "(1)" - line 410, "pan.___", state 546, "(1)" - line 414, "pan.___", state 554, "(1)" - line 414, "pan.___", state 555, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 555, "else" - line 414, "pan.___", state 558, "(1)" - line 414, "pan.___", state 559, "(1)" - line 414, "pan.___", state 559, "(1)" - line 412, "pan.___", state 564, "((i<1))" - line 412, "pan.___", state 564, "((i>=1))" - line 419, "pan.___", state 571, "(1)" - line 419, "pan.___", state 572, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 572, "else" - line 419, "pan.___", state 575, "(1)" - line 419, "pan.___", state 576, "(1)" - line 419, "pan.___", state 576, "(1)" - line 421, "pan.___", state 579, "(1)" - line 421, "pan.___", state 579, "(1)" - line 370, "pan.___", state 581, "(1)" - line 400, "pan.___", state 589, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 595, "(1)" - line 404, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 609, "(1)" - line 404, "pan.___", state 610, "(1)" - line 404, "pan.___", state 610, "(1)" - line 402, "pan.___", state 615, "((i<1))" - line 402, "pan.___", state 615, "((i>=1))" - line 409, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 634, "(1)" - line 410, "pan.___", state 635, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 635, "else" - line 410, "pan.___", state 638, "(1)" - line 410, "pan.___", state 639, "(1)" - line 410, "pan.___", state 639, "(1)" - line 414, "pan.___", state 647, "(1)" - line 414, "pan.___", state 648, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 648, "else" - line 414, "pan.___", state 651, "(1)" - line 414, "pan.___", state 652, "(1)" - line 414, "pan.___", state 652, "(1)" - line 412, "pan.___", state 657, "((i<1))" - line 412, "pan.___", state 657, "((i>=1))" - line 419, "pan.___", state 664, "(1)" - line 419, "pan.___", state 665, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 665, "else" - line 419, "pan.___", state 668, "(1)" - line 419, "pan.___", state 669, "(1)" - line 419, "pan.___", state 669, "(1)" - line 421, "pan.___", state 672, "(1)" - line 421, "pan.___", state 672, "(1)" - line 370, "pan.___", state 674, "(1)" - line 400, "pan.___", state 679, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 681, "(1)" - line 400, "pan.___", state 682, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 682, "else" - line 400, "pan.___", state 685, "(1)" - line 404, "pan.___", state 693, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 695, "(1)" - line 404, "pan.___", state 696, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 696, "else" - line 404, "pan.___", state 699, "(1)" - line 404, "pan.___", state 700, "(1)" - line 404, "pan.___", state 700, "(1)" - line 402, "pan.___", state 705, "((i<1))" - line 402, "pan.___", state 705, "((i>=1))" - line 409, "pan.___", state 711, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 724, "(1)" - line 410, "pan.___", state 725, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 725, "else" - line 410, "pan.___", state 728, "(1)" - line 410, "pan.___", state 729, "(1)" - line 410, "pan.___", state 729, "(1)" - line 414, "pan.___", state 737, "(1)" - line 414, "pan.___", state 738, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 738, "else" - line 414, "pan.___", state 741, "(1)" - line 414, "pan.___", state 742, "(1)" - line 414, "pan.___", state 742, "(1)" - line 412, "pan.___", state 747, "((i<1))" - line 412, "pan.___", state 747, "((i>=1))" - line 419, "pan.___", state 754, "(1)" - line 419, "pan.___", state 755, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 755, "else" - line 419, "pan.___", state 758, "(1)" - line 419, "pan.___", state 759, "(1)" - line 419, "pan.___", state 759, "(1)" - line 421, "pan.___", state 762, "(1)" - line 421, "pan.___", state 762, "(1)" - line 370, "pan.___", state 764, "(1)" - line 430, "pan.___", state 767, "(((tmp2&((1<<7)-1))&&((tmp2^cached_urcu_gp_ctr.val[( ((_pid<2)) ? (0) : (1) )])&(1<<7))))" - line 430, "pan.___", state 767, "else" - line 400, "pan.___", state 777, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 779, "(1)" - line 400, "pan.___", state 780, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 780, "else" - line 400, "pan.___", state 783, "(1)" - line 404, "pan.___", state 791, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 793, "(1)" - line 404, "pan.___", state 794, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 794, "else" - line 404, "pan.___", state 797, "(1)" - line 404, "pan.___", state 798, "(1)" - line 404, "pan.___", state 798, "(1)" - line 402, "pan.___", state 803, "((i<1))" - line 402, "pan.___", state 803, "((i>=1))" - line 409, "pan.___", state 809, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 822, "(1)" - line 410, "pan.___", state 823, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 823, "else" - line 410, "pan.___", state 826, "(1)" - line 410, "pan.___", state 827, "(1)" - line 410, "pan.___", state 827, "(1)" - line 414, "pan.___", state 835, "(1)" - line 414, "pan.___", state 836, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 836, "else" - line 414, "pan.___", state 839, "(1)" - line 414, "pan.___", state 840, "(1)" - line 414, "pan.___", state 840, "(1)" - line 412, "pan.___", state 845, "((i<1))" - line 412, "pan.___", state 845, "((i>=1))" - line 419, "pan.___", state 852, "(1)" - line 419, "pan.___", state 853, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 853, "else" - line 419, "pan.___", state 856, "(1)" - line 419, "pan.___", state 857, "(1)" - line 419, "pan.___", state 857, "(1)" - line 421, "pan.___", state 860, "(1)" - line 421, "pan.___", state 860, "(1)" - line 370, "pan.___", state 862, "(1)" - line 449, "pan.___", state 870, "((tmp<1))" - line 449, "pan.___", state 870, "((tmp>=1))" - line 462, "pan.___", state 873, "tmp = 0" - line 400, "pan.___", state 877, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 883, "(1)" - line 404, "pan.___", state 891, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 897, "(1)" - line 404, "pan.___", state 898, "(1)" - line 404, "pan.___", state 898, "(1)" - line 402, "pan.___", state 903, "((i<1))" - line 402, "pan.___", state 903, "((i>=1))" - line 409, "pan.___", state 909, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 922, "(1)" - line 410, "pan.___", state 923, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 923, "else" - line 410, "pan.___", state 926, "(1)" - line 410, "pan.___", state 927, "(1)" - line 410, "pan.___", state 927, "(1)" - line 414, "pan.___", state 935, "(1)" - line 414, "pan.___", state 936, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 936, "else" - line 414, "pan.___", state 939, "(1)" - line 414, "pan.___", state 940, "(1)" - line 414, "pan.___", state 940, "(1)" - line 412, "pan.___", state 945, "((i<1))" - line 412, "pan.___", state 945, "((i>=1))" - line 419, "pan.___", state 952, "(1)" - line 419, "pan.___", state 953, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 953, "else" - line 419, "pan.___", state 956, "(1)" - line 419, "pan.___", state 957, "(1)" - line 419, "pan.___", state 957, "(1)" - line 421, "pan.___", state 960, "(1)" - line 421, "pan.___", state 960, "(1)" - line 370, "pan.___", state 962, "(1)" - line 671, "pan.___", state 963, "tmp = cached_urcu_gp_ctr.val[( ((_pid<2)) ? (0) : (1) )]" - line 400, "pan.___", state 967, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 973, "(1)" - line 404, "pan.___", state 981, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 987, "(1)" - line 404, "pan.___", state 988, "(1)" - line 404, "pan.___", state 988, "(1)" - line 402, "pan.___", state 993, "((i<1))" - line 402, "pan.___", state 993, "((i>=1))" - line 409, "pan.___", state 999, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 1012, "(1)" - line 410, "pan.___", state 1013, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 1013, "else" - line 410, "pan.___", state 1016, "(1)" - line 410, "pan.___", state 1017, "(1)" - line 410, "pan.___", state 1017, "(1)" - line 414, "pan.___", state 1025, "(1)" - line 414, "pan.___", state 1026, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 1026, "else" - line 414, "pan.___", state 1029, "(1)" - line 414, "pan.___", state 1030, "(1)" - line 414, "pan.___", state 1030, "(1)" - line 412, "pan.___", state 1035, "((i<1))" - line 412, "pan.___", state 1035, "((i>=1))" - line 419, "pan.___", state 1042, "(1)" - line 419, "pan.___", state 1043, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 1043, "else" - line 419, "pan.___", state 1046, "(1)" - line 419, "pan.___", state 1047, "(1)" - line 419, "pan.___", state 1047, "(1)" - line 421, "pan.___", state 1050, "(1)" - line 421, "pan.___", state 1050, "(1)" - line 370, "pan.___", state 1052, "(1)" - line 400, "pan.___", state 1061, "(1)" - line 404, "pan.___", state 1073, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1091, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1117, "(1)" - line 419, "pan.___", state 1134, "(1)" - line 404, "pan.___", state 1166, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1184, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1210, "(1)" - line 419, "pan.___", state 1227, "(1)" - line 400, "pan.___", state 1242, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 1256, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1274, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 1287, "(1)" - line 414, "pan.___", state 1300, "(1)" - line 419, "pan.___", state 1317, "(1)" - line 400, "pan.___", state 1340, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 1342, "(1)" - line 400, "pan.___", state 1343, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 1343, "else" - line 400, "pan.___", state 1346, "(1)" - line 404, "pan.___", state 1354, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 1356, "(1)" - line 404, "pan.___", state 1357, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 1357, "else" - line 404, "pan.___", state 1360, "(1)" - line 404, "pan.___", state 1361, "(1)" - line 404, "pan.___", state 1361, "(1)" - line 402, "pan.___", state 1366, "((i<1))" - line 402, "pan.___", state 1366, "((i>=1))" - line 409, "pan.___", state 1372, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 1385, "(1)" - line 410, "pan.___", state 1386, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 1386, "else" - line 410, "pan.___", state 1389, "(1)" - line 410, "pan.___", state 1390, "(1)" - line 410, "pan.___", state 1390, "(1)" - line 414, "pan.___", state 1398, "(1)" - line 414, "pan.___", state 1399, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 1399, "else" - line 414, "pan.___", state 1402, "(1)" - line 414, "pan.___", state 1403, "(1)" - line 414, "pan.___", state 1403, "(1)" - line 412, "pan.___", state 1408, "((i<1))" - line 412, "pan.___", state 1408, "((i>=1))" - line 419, "pan.___", state 1415, "(1)" - line 419, "pan.___", state 1416, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 1416, "else" - line 419, "pan.___", state 1419, "(1)" - line 419, "pan.___", state 1420, "(1)" - line 419, "pan.___", state 1420, "(1)" - line 421, "pan.___", state 1423, "(1)" - line 421, "pan.___", state 1423, "(1)" - line 180, "pan.___", state 1448, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 184, "pan.___", state 1461, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 161, "pan.___", state 1471, "(1)" - line 165, "pan.___", state 1479, "(1)" - line 169, "pan.___", state 1491, "(1)" - line 176, "pan.___", state 1502, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 180, "pan.___", state 1578, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 184, "pan.___", state 1591, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 161, "pan.___", state 1601, "(1)" - line 165, "pan.___", state 1609, "(1)" - line 169, "pan.___", state 1621, "(1)" - line 370, "pan.___", state 1642, "(1)" - line 696, "pan.___", state 1643, "(1)" - line 703, "pan.___", state 1646, "-end-" - (308 of 1646 states) -unreached in proctype :init: - (0 of 46 states) -unreached in proctype :never: - line 752, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 30.2 seconds -pan: rate 93347.646 states/second -pan: avg transition delay 9.1279e-07 usec -cp .input.spin urcu_progress_writer_error.spin.input -cp .input.spin.trail urcu_progress_writer_error.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer_error.spin.input b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer_error.spin.input deleted file mode 100644 index eb1d4e6..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer_error.spin.input +++ /dev/null @@ -1,724 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer_error.spin.input.trail deleted file mode 100644 index c5a6fbf..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-reader/urcu_progress_writer_error.spin.input.trail +++ /dev/null @@ -1,23572 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:2561 -2:4:2513 -3:4:2516 -4:4:2516 -5:4:2519 -6:4:2527 -7:4:2527 -8:4:2530 -9:4:2536 -10:4:2540 -11:4:2540 -12:4:2543 -13:4:2551 -14:4:2555 -15:4:2556 -16:0:2561 -17:4:2558 -18:0:2561 -19:3:869 -20:0:2561 -21:3:875 -22:0:2561 -23:3:876 -24:0:2561 -25:3:877 -26:3:881 -27:3:882 -28:3:890 -29:3:891 -30:3:895 -31:3:896 -32:3:904 -33:3:909 -34:3:913 -35:3:914 -36:3:921 -37:3:922 -38:3:933 -39:3:934 -40:3:935 -41:3:946 -42:3:951 -43:3:952 -44:0:2559 -45:3:964 -46:0:2565 -47:3:966 -48:3:967 -49:0:2565 -50:3:971 -51:3:975 -52:3:976 -53:3:984 -54:3:985 -55:3:989 -56:3:990 -57:3:998 -58:3:1003 -59:3:1004 -60:3:1015 -61:3:1016 -62:3:1027 -63:3:1028 -64:3:1029 -65:3:1040 -66:3:1045 -67:3:1046 -68:0:2565 -69:3:1058 -70:0:2565 -71:3:1060 -72:0:2565 -73:3:1061 -74:0:2565 -75:3:1071 -76:0:2565 -77:3:1075 -78:3:1076 -79:3:1080 -80:3:1084 -81:3:1085 -82:3:1089 -83:3:1097 -84:3:1098 -85:3:1103 -86:3:1110 -87:3:1111 -88:3:1118 -89:3:1123 -90:0:2565 -91:3:1134 -92:0:2565 -93:3:1138 -94:3:1139 -95:3:1143 -96:3:1147 -97:3:1148 -98:3:1152 -99:3:1160 -100:3:1161 -101:3:1166 -102:3:1173 -103:3:1174 -104:3:1181 -105:3:1186 -106:0:2565 -107:3:1197 -108:0:2565 -109:3:1205 -110:3:1206 -111:3:1210 -112:3:1214 -113:3:1215 -114:3:1219 -115:3:1227 -116:3:1228 -117:3:1233 -118:3:1240 -119:3:1241 -120:3:1248 -121:3:1253 -122:0:2565 -123:3:1264 -124:0:2565 -125:3:1266 -126:0:2565 -127:3:1267 -128:3:1271 -129:3:1272 -130:3:1280 -131:3:1281 -132:3:1285 -133:3:1286 -134:3:1294 -135:3:1299 -136:3:1303 -137:3:1304 -138:3:1311 -139:3:1312 -140:3:1323 -141:3:1324 -142:3:1325 -143:3:1336 -144:3:1341 -145:3:1342 -146:0:2565 -147:3:1354 -148:0:2565 -149:3:1356 -150:0:2565 -151:3:1359 -152:3:1360 -153:3:1372 -154:3:1373 -155:3:1377 -156:3:1378 -157:3:1386 -158:3:1391 -159:3:1395 -160:3:1396 -161:3:1403 -162:3:1404 -163:3:1415 -164:3:1416 -165:3:1417 -166:3:1428 -167:3:1433 -168:3:1434 -169:0:2565 -170:3:1446 -171:0:2565 -172:3:1448 -173:0:2565 -174:3:1449 -175:0:2565 -176:3:1450 -177:0:2565 -178:3:1451 -179:0:2565 -180:3:1452 -181:3:1456 -182:3:1457 -183:3:1465 -184:3:1466 -185:3:1470 -186:3:1471 -187:3:1479 -188:3:1484 -189:3:1488 -190:3:1489 -191:3:1496 -192:3:1497 -193:3:1508 -194:3:1509 -195:3:1510 -196:3:1521 -197:3:1526 -198:3:1527 -199:0:2565 -200:3:1539 -201:0:2565 -202:3:1631 -203:0:2565 -204:3:1729 -205:0:2565 -206:3:1730 -207:0:2565 -208:3:1734 -209:0:2565 -210:3:1740 -211:3:1744 -212:3:1745 -213:3:1753 -214:3:1754 -215:3:1758 -216:3:1759 -217:3:1767 -218:3:1772 -219:3:1776 -220:3:1777 -221:3:1784 -222:3:1785 -223:3:1796 -224:3:1797 -225:3:1798 -226:3:1809 -227:3:1814 -228:3:1815 -229:0:2565 -230:3:1827 -231:0:2565 -232:3:1829 -233:0:2565 -234:3:1830 -235:3:1834 -236:3:1835 -237:3:1843 -238:3:1844 -239:3:1848 -240:3:1849 -241:3:1857 -242:3:1862 -243:3:1866 -244:3:1867 -245:3:1874 -246:3:1875 -247:3:1886 -248:3:1887 -249:3:1888 -250:3:1899 -251:3:1904 -252:3:1905 -253:0:2565 -254:3:1917 -255:0:2565 -256:3:1919 -257:0:2565 -258:2:458 -259:0:2565 -260:2:464 -261:0:2565 -262:2:465 -263:0:2565 -264:2:466 -265:0:2565 -266:2:467 -267:0:2565 -268:1:2 -269:0:2565 -270:2:468 -271:0:2565 -272:1:8 -273:0:2565 -274:1:9 -275:0:2565 -276:1:10 -277:0:2565 -278:1:11 -279:0:2565 -280:2:467 -281:0:2565 -282:1:12 -283:1:16 -284:1:17 -285:1:25 -286:1:26 -287:1:30 -288:1:31 -289:1:39 -290:1:44 -291:1:48 -292:1:49 -293:1:56 -294:1:57 -295:1:68 -296:1:69 -297:1:70 -298:1:81 -299:1:86 -300:1:87 -301:0:2565 -302:2:468 -303:0:2565 -304:1:99 -305:0:2565 -306:2:469 -307:0:2565 -308:2:475 -309:0:2565 -310:2:476 -311:0:2565 -312:2:477 -313:2:481 -314:2:482 -315:2:490 -316:2:491 -317:2:495 -318:2:496 -319:2:504 -320:2:509 -321:2:513 -322:2:514 -323:2:521 -324:2:522 -325:2:533 -326:2:534 -327:2:535 -328:2:546 -329:2:551 -330:2:552 -331:0:2565 -332:2:564 -333:0:2565 -334:2:565 -335:2:569 -336:2:570 -337:2:578 -338:2:579 -339:2:583 -340:2:584 -341:2:592 -342:2:597 -343:2:601 -344:2:602 -345:2:609 -346:2:610 -347:2:621 -348:2:622 -349:2:623 -350:2:634 -351:2:639 -352:2:640 -353:0:2565 -354:2:652 -355:0:2565 -356:2:653 -357:0:2565 -358:2:654 -359:2:658 -360:2:659 -361:2:667 -362:2:668 -363:2:672 -364:2:673 -365:2:681 -366:2:686 -367:2:690 -368:2:691 -369:2:698 -370:2:699 -371:2:710 -372:2:711 -373:2:712 -374:2:723 -375:2:728 -376:2:729 -377:0:2565 -378:2:741 -379:0:2565 -380:2:750 -381:0:2565 -382:2:753 -383:0:2565 -384:2:758 -385:0:2565 -386:2:759 -387:0:2565 -388:2:760 -389:0:2565 -390:2:761 -391:0:2565 -392:2:762 -393:0:2565 -394:2:763 -395:0:2565 -396:2:765 -397:0:2565 -398:2:766 -399:2:770 -400:2:771 -401:2:779 -402:2:780 -403:2:781 -404:2:793 -405:2:798 -406:2:802 -407:2:803 -408:2:810 -409:2:811 -410:2:822 -411:2:823 -412:2:824 -413:2:835 -414:2:840 -415:2:841 -416:0:2565 -417:3:1922 -418:3:1923 -419:3:1935 -420:3:1936 -421:3:1940 -422:3:1941 -423:3:1949 -424:3:1954 -425:3:1958 -426:3:1959 -427:3:1966 -428:3:1967 -429:3:1978 -430:3:1979 -431:3:1980 -432:3:1991 -433:3:1996 -434:3:1997 -435:0:2565 -436:3:2009 -437:0:2565 -438:3:2011 -439:0:2565 -440:3:2012 -441:0:2565 -442:3:2013 -443:0:2565 -444:3:2014 -445:0:2565 -446:3:2015 -447:3:2019 -448:3:2020 -449:3:2028 -450:3:2029 -451:3:2033 -452:3:2034 -453:3:2042 -454:3:2047 -455:3:2051 -456:3:2052 -457:3:2059 -458:3:2060 -459:3:2071 -460:3:2072 -461:3:2073 -462:3:2084 -463:3:2089 -464:3:2090 -465:0:2565 -466:3:2102 -467:0:2565 -468:3:2104 -469:0:2565 -470:3:2105 -471:3:2109 -472:3:2110 -473:3:2118 -474:3:2119 -475:3:2123 -476:3:2124 -477:3:2132 -478:3:2137 -479:3:2141 -480:3:2142 -481:3:2149 -482:3:2150 -483:3:2161 -484:3:2162 -485:3:2163 -486:3:2174 -487:3:2179 -488:3:2180 -489:0:2565 -490:3:2192 -491:0:2565 -492:2:853 -493:0:2565 -494:3:2013 -495:0:2565 -496:2:857 -497:0:2565 -498:2:465 -499:0:2565 -500:3:2014 -501:0:2565 -502:3:2015 -503:3:2019 -504:3:2020 -505:3:2028 -506:3:2029 -507:3:2033 -508:3:2034 -509:3:2042 -510:3:2047 -511:3:2051 -512:3:2052 -513:3:2059 -514:3:2060 -515:3:2071 -516:3:2072 -517:3:2073 -518:3:2084 -519:3:2089 -520:3:2090 -521:0:2565 -522:3:2102 -523:0:2565 -524:3:2104 -525:0:2565 -526:3:2105 -527:3:2109 -528:3:2110 -529:3:2118 -530:3:2119 -531:3:2123 -532:3:2124 -533:3:2132 -534:3:2137 -535:3:2141 -536:3:2142 -537:3:2149 -538:3:2150 -539:3:2161 -540:3:2162 -541:3:2163 -542:3:2174 -543:3:2179 -544:3:2180 -545:0:2565 -546:3:2192 -547:0:2565 -548:2:466 -549:0:2565 -550:3:2013 -551:0:2565 -552:3:2014 -553:0:2565 -554:3:2015 -555:3:2019 -556:3:2020 -557:3:2028 -558:3:2029 -559:3:2033 -560:3:2034 -561:3:2042 -562:3:2047 -563:3:2051 -564:3:2052 -565:3:2059 -566:3:2060 -567:3:2071 -568:3:2072 -569:3:2073 -570:3:2084 -571:3:2089 -572:3:2090 -573:0:2565 -574:3:2102 -575:0:2565 -576:3:2104 -577:0:2565 -578:3:2105 -579:3:2109 -580:3:2110 -581:3:2118 -582:3:2119 -583:3:2123 -584:3:2124 -585:3:2132 -586:3:2137 -587:3:2141 -588:3:2142 -589:3:2149 -590:3:2150 -591:3:2161 -592:3:2162 -593:3:2163 -594:3:2174 -595:3:2179 -596:3:2180 -597:0:2565 -598:2:467 -599:0:2565 -600:3:2192 -601:0:2565 -602:3:2013 -603:0:2565 -604:3:2014 -605:0:2565 -606:3:2015 -607:3:2019 -608:3:2020 -609:3:2028 -610:3:2029 -611:3:2033 -612:3:2034 -613:3:2042 -614:3:2047 -615:3:2051 -616:3:2052 -617:3:2059 -618:3:2060 -619:3:2071 -620:3:2072 -621:3:2073 -622:3:2084 -623:3:2089 -624:3:2090 -625:0:2565 -626:3:2102 -627:0:2565 -628:3:2104 -629:0:2565 -630:1:102 -631:0:2565 -632:2:468 -633:0:2565 -634:3:2105 -635:3:2109 -636:3:2110 -637:3:2118 -638:3:2119 -639:3:2123 -640:3:2124 -641:3:2132 -642:3:2137 -643:3:2141 -644:3:2142 -645:3:2149 -646:3:2150 -647:3:2161 -648:3:2162 -649:3:2163 -650:3:2174 -651:3:2179 -652:3:2180 -653:0:2565 -654:3:2192 -655:0:2565 -656:3:2013 -657:0:2565 -658:3:2014 -659:0:2565 -660:3:2015 -661:3:2019 -662:3:2020 -663:3:2028 -664:3:2029 -665:3:2033 -666:3:2034 -667:3:2042 -668:3:2047 -669:3:2051 -670:3:2052 -671:3:2059 -672:3:2060 -673:3:2071 -674:3:2072 -675:3:2073 -676:3:2084 -677:3:2089 -678:3:2090 -679:0:2565 -680:3:2102 -681:0:2565 -682:3:2104 -683:0:2565 -684:2:467 -685:0:2565 -686:2:468 -687:0:2565 -688:3:2105 -689:3:2109 -690:3:2110 -691:3:2118 -692:3:2119 -693:3:2123 -694:3:2124 -695:3:2132 -696:3:2137 -697:3:2141 -698:3:2142 -699:3:2149 -700:3:2150 -701:3:2161 -702:3:2162 -703:3:2163 -704:3:2174 -705:3:2179 -706:3:2180 -707:0:2565 -708:3:2192 -709:0:2565 -710:3:2013 -711:0:2565 -712:3:2014 -713:0:2565 -714:3:2015 -715:3:2019 -716:3:2020 -717:3:2028 -718:3:2029 -719:3:2033 -720:3:2034 -721:3:2042 -722:3:2047 -723:3:2051 -724:3:2052 -725:3:2059 -726:3:2060 -727:3:2071 -728:3:2072 -729:3:2073 -730:3:2084 -731:3:2089 -732:3:2090 -733:0:2565 -734:3:2102 -735:0:2565 -736:2:467 -737:0:2565 -738:1:108 -739:0:2565 -740:2:468 -741:0:2565 -742:3:2104 -743:0:2565 -744:3:2105 -745:3:2109 -746:3:2110 -747:3:2118 -748:3:2119 -749:3:2123 -750:3:2124 -751:3:2132 -752:3:2137 -753:3:2141 -754:3:2142 -755:3:2149 -756:3:2150 -757:3:2161 -758:3:2162 -759:3:2163 -760:3:2174 -761:3:2179 -762:3:2180 -763:0:2565 -764:3:2192 -765:0:2565 -766:3:2013 -767:0:2565 -768:3:2014 -769:0:2565 -770:3:2015 -771:3:2019 -772:3:2020 -773:3:2028 -774:3:2029 -775:3:2033 -776:3:2034 -777:3:2042 -778:3:2047 -779:3:2051 -780:3:2052 -781:3:2059 -782:3:2060 -783:3:2071 -784:3:2072 -785:3:2073 -786:3:2084 -787:3:2089 -788:3:2090 -789:0:2565 -790:3:2102 -791:0:2565 -792:2:467 -793:0:2565 -794:2:468 -795:0:2565 -796:3:2104 -797:0:2565 -798:3:2105 -799:3:2109 -800:3:2110 -801:3:2118 -802:3:2119 -803:3:2123 -804:3:2124 -805:3:2132 -806:3:2137 -807:3:2141 -808:3:2142 -809:3:2149 -810:3:2150 -811:3:2161 -812:3:2162 -813:3:2163 -814:3:2174 -815:3:2179 -816:3:2180 -817:0:2565 -818:3:2192 -819:0:2565 -820:3:2013 -821:0:2565 -822:3:2014 -823:0:2565 -824:3:2015 -825:3:2019 -826:3:2020 -827:3:2028 -828:3:2029 -829:3:2033 -830:3:2034 -831:3:2042 -832:3:2047 -833:3:2051 -834:3:2052 -835:3:2059 -836:3:2060 -837:3:2071 -838:3:2072 -839:3:2073 -840:3:2084 -841:3:2089 -842:3:2090 -843:0:2565 -844:2:467 -845:0:2565 -846:1:109 -847:1:113 -848:1:114 -849:1:122 -850:1:123 -851:1:124 -852:1:136 -853:1:141 -854:1:145 -855:1:146 -856:1:153 -857:1:154 -858:1:165 -859:1:166 -860:1:167 -861:1:178 -862:1:183 -863:1:184 -864:0:2565 -865:3:2102 -866:0:2565 -867:2:468 -868:0:2565 -869:3:2104 -870:0:2565 -871:3:2105 -872:3:2109 -873:3:2110 -874:3:2118 -875:3:2119 -876:3:2123 -877:3:2124 -878:3:2132 -879:3:2137 -880:3:2141 -881:3:2142 -882:3:2149 -883:3:2150 -884:3:2161 -885:3:2169 -886:3:2170 -887:3:2174 -888:3:2179 -889:3:2180 -890:0:2565 -891:3:2192 -892:0:2565 -893:3:2013 -894:0:2565 -895:3:2014 -896:0:2565 -897:3:2015 -898:3:2019 -899:3:2020 -900:3:2028 -901:3:2029 -902:3:2033 -903:3:2034 -904:3:2042 -905:3:2047 -906:3:2051 -907:3:2052 -908:3:2059 -909:3:2060 -910:3:2071 -911:3:2079 -912:3:2080 -913:3:2084 -914:3:2089 -915:3:2090 -916:0:2565 -917:2:467 -918:0:2565 -919:3:2102 -920:0:2565 -921:3:2104 -922:0:2565 -923:3:2105 -924:3:2109 -925:3:2110 -926:3:2118 -927:3:2119 -928:3:2123 -929:3:2124 -930:3:2132 -931:3:2137 -932:3:2141 -933:3:2142 -934:3:2149 -935:3:2150 -936:3:2161 -937:3:2169 -938:3:2170 -939:3:2174 -940:3:2179 -941:3:2180 -942:0:2565 -943:3:2192 -944:0:2565 -945:3:2013 -946:0:2565 -947:3:2014 -948:0:2565 -949:1:196 -950:0:2565 -951:2:468 -952:0:2565 -953:3:2015 -954:3:2019 -955:3:2020 -956:3:2028 -957:3:2029 -958:3:2033 -959:3:2034 -960:3:2042 -961:3:2047 -962:3:2051 -963:3:2052 -964:3:2059 -965:3:2060 -966:3:2071 -967:3:2079 -968:3:2080 -969:3:2084 -970:3:2089 -971:3:2090 -972:0:2565 -973:3:2102 -974:0:2565 -975:3:2104 -976:0:2565 -977:3:2105 -978:3:2109 -979:3:2110 -980:3:2118 -981:3:2119 -982:3:2123 -983:3:2124 -984:3:2132 -985:3:2137 -986:3:2141 -987:3:2142 -988:3:2149 -989:3:2150 -990:3:2161 -991:3:2169 -992:3:2170 -993:3:2174 -994:3:2179 -995:3:2180 -996:0:2565 -997:3:2192 -998:0:2565 -999:3:2013 -1000:0:2565 -1001:3:2014 -1002:0:2565 -1003:2:469 -1004:0:2565 -1005:2:475 -1006:0:2565 -1007:2:476 -1008:0:2565 -1009:3:2015 -1010:3:2019 -1011:3:2020 -1012:3:2028 -1013:3:2029 -1014:3:2033 -1015:3:2034 -1016:3:2042 -1017:3:2047 -1018:3:2051 -1019:3:2052 -1020:3:2059 -1021:3:2060 -1022:3:2071 -1023:3:2079 -1024:3:2080 -1025:3:2084 -1026:3:2089 -1027:3:2090 -1028:0:2565 -1029:3:2102 -1030:0:2565 -1031:3:2104 -1032:0:2565 -1033:3:2105 -1034:3:2109 -1035:3:2110 -1036:3:2118 -1037:3:2119 -1038:3:2123 -1039:3:2124 -1040:3:2132 -1041:3:2137 -1042:3:2141 -1043:3:2142 -1044:3:2149 -1045:3:2150 -1046:3:2161 -1047:3:2169 -1048:3:2170 -1049:3:2174 -1050:3:2179 -1051:3:2180 -1052:0:2565 -1053:3:2192 -1054:0:2565 -1055:3:2013 -1056:0:2565 -1057:2:477 -1058:2:481 -1059:2:482 -1060:2:490 -1061:2:491 -1062:2:495 -1063:2:496 -1064:2:504 -1065:2:509 -1066:2:513 -1067:2:514 -1068:2:521 -1069:2:522 -1070:2:533 -1071:2:534 -1072:2:535 -1073:2:546 -1074:2:551 -1075:2:552 -1076:0:2565 -1077:3:2014 -1078:0:2565 -1079:3:2015 -1080:3:2019 -1081:3:2020 -1082:3:2028 -1083:3:2029 -1084:3:2033 -1085:3:2034 -1086:3:2042 -1087:3:2047 -1088:3:2051 -1089:3:2052 -1090:3:2059 -1091:3:2060 -1092:3:2071 -1093:3:2079 -1094:3:2080 -1095:3:2084 -1096:3:2089 -1097:3:2090 -1098:0:2565 -1099:3:2102 -1100:0:2565 -1101:3:2104 -1102:0:2565 -1103:3:2105 -1104:3:2109 -1105:3:2110 -1106:3:2118 -1107:3:2119 -1108:3:2123 -1109:3:2124 -1110:3:2132 -1111:3:2137 -1112:3:2141 -1113:3:2142 -1114:3:2149 -1115:3:2150 -1116:3:2161 -1117:3:2169 -1118:3:2170 -1119:3:2174 -1120:3:2179 -1121:3:2180 -1122:0:2565 -1123:3:2192 -1124:0:2565 -1125:2:564 -1126:0:2565 -1127:3:2013 -1128:0:2565 -1129:3:2014 -1130:0:2565 -1131:3:2015 -1132:3:2019 -1133:3:2020 -1134:3:2028 -1135:3:2029 -1136:3:2033 -1137:3:2034 -1138:3:2042 -1139:3:2047 -1140:3:2051 -1141:3:2052 -1142:3:2059 -1143:3:2060 -1144:3:2071 -1145:3:2079 -1146:3:2080 -1147:3:2084 -1148:3:2089 -1149:3:2090 -1150:0:2565 -1151:3:2102 -1152:0:2565 -1153:3:2104 -1154:0:2565 -1155:3:2105 -1156:3:2109 -1157:3:2110 -1158:3:2118 -1159:3:2119 -1160:3:2123 -1161:3:2124 -1162:3:2132 -1163:3:2137 -1164:3:2141 -1165:3:2142 -1166:3:2149 -1167:3:2150 -1168:3:2161 -1169:3:2169 -1170:3:2170 -1171:3:2174 -1172:3:2179 -1173:3:2180 -1174:0:2565 -1175:2:565 -1176:2:569 -1177:2:570 -1178:2:578 -1179:2:579 -1180:2:583 -1181:2:584 -1182:2:592 -1183:2:597 -1184:2:601 -1185:2:602 -1186:2:609 -1187:2:610 -1188:2:621 -1189:2:622 -1190:2:623 -1191:2:634 -1192:2:639 -1193:2:640 -1194:0:2565 -1195:3:2192 -1196:0:2565 -1197:3:2013 -1198:0:2565 -1199:2:652 -1200:0:2565 -1201:3:2014 -1202:0:2565 -1203:3:2015 -1204:3:2019 -1205:3:2020 -1206:3:2028 -1207:3:2029 -1208:3:2033 -1209:3:2034 -1210:3:2042 -1211:3:2047 -1212:3:2051 -1213:3:2052 -1214:3:2059 -1215:3:2060 -1216:3:2071 -1217:3:2079 -1218:3:2080 -1219:3:2084 -1220:3:2089 -1221:3:2090 -1222:0:2565 -1223:3:2102 -1224:0:2565 -1225:3:2104 -1226:0:2565 -1227:3:2105 -1228:3:2109 -1229:3:2110 -1230:3:2118 -1231:3:2119 -1232:3:2123 -1233:3:2124 -1234:3:2132 -1235:3:2137 -1236:3:2141 -1237:3:2142 -1238:3:2149 -1239:3:2150 -1240:3:2161 -1241:3:2169 -1242:3:2170 -1243:3:2174 -1244:3:2179 -1245:3:2180 -1246:0:2565 -1247:3:2192 -1248:0:2565 -1249:2:653 -1250:0:2565 -1251:3:2013 -1252:0:2565 -1253:3:2014 -1254:0:2565 -1255:3:2015 -1256:3:2019 -1257:3:2020 -1258:3:2028 -1259:3:2029 -1260:3:2033 -1261:3:2034 -1262:3:2042 -1263:3:2047 -1264:3:2051 -1265:3:2052 -1266:3:2059 -1267:3:2060 -1268:3:2071 -1269:3:2079 -1270:3:2080 -1271:3:2084 -1272:3:2089 -1273:3:2090 -1274:0:2565 -1275:3:2102 -1276:0:2565 -1277:3:2104 -1278:0:2565 -1279:3:2105 -1280:3:2109 -1281:3:2110 -1282:3:2118 -1283:3:2119 -1284:3:2123 -1285:3:2124 -1286:3:2132 -1287:3:2137 -1288:3:2141 -1289:3:2142 -1290:3:2149 -1291:3:2150 -1292:3:2161 -1293:3:2169 -1294:3:2170 -1295:3:2174 -1296:3:2179 -1297:3:2180 -1298:0:2565 -1299:2:654 -1300:2:658 -1301:2:659 -1302:2:667 -1303:2:668 -1304:2:672 -1305:2:673 -1306:2:681 -1307:2:686 -1308:2:690 -1309:2:691 -1310:2:698 -1311:2:699 -1312:2:710 -1313:2:711 -1314:2:712 -1315:2:723 -1316:2:728 -1317:2:729 -1318:0:2565 -1319:3:2192 -1320:0:2565 -1321:3:2013 -1322:0:2565 -1323:3:2014 -1324:0:2565 -1325:3:2015 -1326:3:2019 -1327:3:2020 -1328:3:2028 -1329:3:2029 -1330:3:2033 -1331:3:2034 -1332:3:2042 -1333:3:2047 -1334:3:2051 -1335:3:2052 -1336:3:2059 -1337:3:2060 -1338:3:2071 -1339:3:2079 -1340:3:2080 -1341:3:2084 -1342:3:2089 -1343:3:2090 -1344:0:2565 -1345:3:2102 -1346:0:2565 -1347:3:2104 -1348:0:2565 -1349:2:741 -1350:0:2565 -1351:2:750 -1352:0:2565 -1353:2:753 -1354:0:2565 -1355:3:2105 -1356:3:2109 -1357:3:2110 -1358:3:2118 -1359:3:2119 -1360:3:2123 -1361:3:2124 -1362:3:2132 -1363:3:2137 -1364:3:2141 -1365:3:2142 -1366:3:2149 -1367:3:2150 -1368:3:2161 -1369:3:2169 -1370:3:2170 -1371:3:2174 -1372:3:2179 -1373:3:2180 -1374:0:2565 -1375:3:2192 -1376:0:2565 -1377:3:2013 -1378:0:2565 -1379:3:2014 -1380:0:2565 -1381:3:2015 -1382:3:2019 -1383:3:2020 -1384:3:2028 -1385:3:2029 -1386:3:2033 -1387:3:2034 -1388:3:2042 -1389:3:2047 -1390:3:2051 -1391:3:2052 -1392:3:2059 -1393:3:2060 -1394:3:2071 -1395:3:2079 -1396:3:2080 -1397:3:2084 -1398:3:2089 -1399:3:2090 -1400:0:2565 -1401:3:2102 -1402:0:2565 -1403:2:758 -1404:0:2565 -1405:3:2104 -1406:0:2565 -1407:3:2105 -1408:3:2109 -1409:3:2110 -1410:3:2118 -1411:3:2119 -1412:3:2123 -1413:3:2124 -1414:3:2132 -1415:3:2137 -1416:3:2141 -1417:3:2142 -1418:3:2149 -1419:3:2150 -1420:3:2161 -1421:3:2169 -1422:3:2170 -1423:3:2174 -1424:3:2179 -1425:3:2180 -1426:0:2565 -1427:3:2192 -1428:0:2565 -1429:3:2013 -1430:0:2565 -1431:3:2014 -1432:0:2565 -1433:3:2015 -1434:3:2019 -1435:3:2020 -1436:3:2028 -1437:3:2029 -1438:3:2033 -1439:3:2034 -1440:3:2042 -1441:3:2047 -1442:3:2051 -1443:3:2052 -1444:3:2059 -1445:3:2060 -1446:3:2071 -1447:3:2079 -1448:3:2080 -1449:3:2084 -1450:3:2089 -1451:3:2090 -1452:0:2565 -1453:2:759 -1454:0:2565 -1455:3:2102 -1456:0:2565 -1457:3:2104 -1458:0:2565 -1459:3:2105 -1460:3:2109 -1461:3:2110 -1462:3:2118 -1463:3:2119 -1464:3:2123 -1465:3:2124 -1466:3:2132 -1467:3:2137 -1468:3:2141 -1469:3:2142 -1470:3:2149 -1471:3:2150 -1472:3:2161 -1473:3:2169 -1474:3:2170 -1475:3:2174 -1476:3:2179 -1477:3:2180 -1478:0:2565 -1479:3:2192 -1480:0:2565 -1481:3:2013 -1482:0:2565 -1483:3:2014 -1484:0:2565 -1485:2:760 -1486:0:2565 -1487:2:761 -1488:0:2565 -1489:2:762 -1490:0:2565 -1491:2:763 -1492:0:2565 -1493:3:2015 -1494:3:2019 -1495:3:2020 -1496:3:2028 -1497:3:2029 -1498:3:2033 -1499:3:2034 -1500:3:2042 -1501:3:2047 -1502:3:2051 -1503:3:2052 -1504:3:2059 -1505:3:2060 -1506:3:2071 -1507:3:2079 -1508:3:2080 -1509:3:2084 -1510:3:2089 -1511:3:2090 -1512:0:2565 -1513:3:2102 -1514:0:2565 -1515:3:2104 -1516:0:2565 -1517:3:2105 -1518:3:2109 -1519:3:2110 -1520:3:2118 -1521:3:2119 -1522:3:2123 -1523:3:2124 -1524:3:2132 -1525:3:2137 -1526:3:2141 -1527:3:2142 -1528:3:2149 -1529:3:2150 -1530:3:2161 -1531:3:2169 -1532:3:2170 -1533:3:2174 -1534:3:2179 -1535:3:2180 -1536:0:2565 -1537:3:2192 -1538:0:2565 -1539:3:2013 -1540:0:2565 -1541:2:765 -1542:0:2565 -1543:3:2014 -1544:0:2565 -1545:3:2015 -1546:3:2019 -1547:3:2020 -1548:3:2028 -1549:3:2029 -1550:3:2033 -1551:3:2034 -1552:3:2042 -1553:3:2047 -1554:3:2051 -1555:3:2052 -1556:3:2059 -1557:3:2060 -1558:3:2071 -1559:3:2079 -1560:3:2080 -1561:3:2084 -1562:3:2089 -1563:3:2090 -1564:0:2565 -1565:3:2102 -1566:0:2565 -1567:3:2104 -1568:0:2565 -1569:3:2105 -1570:3:2109 -1571:3:2110 -1572:3:2118 -1573:3:2119 -1574:3:2123 -1575:3:2124 -1576:3:2132 -1577:3:2137 -1578:3:2141 -1579:3:2142 -1580:3:2149 -1581:3:2150 -1582:3:2161 -1583:3:2169 -1584:3:2170 -1585:3:2174 -1586:3:2179 -1587:3:2180 -1588:0:2565 -1589:3:2192 -1590:0:2565 -1591:2:766 -1592:2:770 -1593:2:771 -1594:2:779 -1595:2:780 -1596:2:781 -1597:2:793 -1598:2:798 -1599:2:802 -1600:2:803 -1601:2:810 -1602:2:811 -1603:2:822 -1604:2:823 -1605:2:824 -1606:2:835 -1607:2:840 -1608:2:841 -1609:0:2565 -1610:3:2013 -1611:0:2565 -1612:3:2014 -1613:0:2565 -1614:3:2015 -1615:3:2019 -1616:3:2020 -1617:3:2028 -1618:3:2029 -1619:3:2033 -1620:3:2034 -1621:3:2042 -1622:3:2047 -1623:3:2051 -1624:3:2052 -1625:3:2059 -1626:3:2060 -1627:3:2071 -1628:3:2079 -1629:3:2080 -1630:3:2084 -1631:3:2089 -1632:3:2090 -1633:0:2565 -1634:3:2102 -1635:0:2565 -1636:3:2104 -1637:0:2565 -1638:3:2105 -1639:3:2109 -1640:3:2110 -1641:3:2118 -1642:3:2119 -1643:3:2123 -1644:3:2124 -1645:3:2132 -1646:3:2137 -1647:3:2141 -1648:3:2142 -1649:3:2149 -1650:3:2150 -1651:3:2161 -1652:3:2169 -1653:3:2170 -1654:3:2174 -1655:3:2179 -1656:3:2180 -1657:0:2565 -1658:2:853 -1659:0:2565 -1660:3:2192 -1661:0:2565 -1662:3:2013 -1663:0:2565 -1664:2:857 -1665:0:2565 -1666:2:465 -1667:0:2565 -1668:3:2014 -1669:0:2565 -1670:3:2015 -1671:3:2019 -1672:3:2020 -1673:3:2028 -1674:3:2029 -1675:3:2033 -1676:3:2034 -1677:3:2042 -1678:3:2047 -1679:3:2051 -1680:3:2052 -1681:3:2059 -1682:3:2060 -1683:3:2071 -1684:3:2079 -1685:3:2080 -1686:3:2084 -1687:3:2089 -1688:3:2090 -1689:0:2565 -1690:3:2102 -1691:0:2565 -1692:3:2104 -1693:0:2565 -1694:3:2105 -1695:3:2109 -1696:3:2110 -1697:3:2118 -1698:3:2119 -1699:3:2123 -1700:3:2124 -1701:3:2132 -1702:3:2137 -1703:3:2141 -1704:3:2142 -1705:3:2149 -1706:3:2150 -1707:3:2161 -1708:3:2169 -1709:3:2170 -1710:3:2174 -1711:3:2179 -1712:3:2180 -1713:0:2565 -1714:3:2192 -1715:0:2565 -1716:2:466 -1717:0:2565 -1718:3:2013 -1719:0:2565 -1720:3:2014 -1721:0:2565 -1722:3:2015 -1723:3:2019 -1724:3:2020 -1725:3:2028 -1726:3:2029 -1727:3:2033 -1728:3:2034 -1729:3:2042 -1730:3:2047 -1731:3:2051 -1732:3:2052 -1733:3:2059 -1734:3:2060 -1735:3:2071 -1736:3:2079 -1737:3:2080 -1738:3:2084 -1739:3:2089 -1740:3:2090 -1741:0:2565 -1742:3:2102 -1743:0:2565 -1744:3:2104 -1745:0:2565 -1746:3:2105 -1747:3:2109 -1748:3:2110 -1749:3:2118 -1750:3:2119 -1751:3:2123 -1752:3:2124 -1753:3:2132 -1754:3:2137 -1755:3:2141 -1756:3:2142 -1757:3:2149 -1758:3:2150 -1759:3:2161 -1760:3:2169 -1761:3:2170 -1762:3:2174 -1763:3:2179 -1764:3:2180 -1765:0:2565 -1766:2:467 -1767:0:2565 -1768:3:2192 -1769:0:2565 -1770:3:2013 -1771:0:2565 -1772:3:2014 -1773:0:2565 -1774:3:2015 -1775:3:2019 -1776:3:2020 -1777:3:2028 -1778:3:2029 -1779:3:2033 -1780:3:2034 -1781:3:2042 -1782:3:2047 -1783:3:2051 -1784:3:2052 -1785:3:2059 -1786:3:2060 -1787:3:2071 -1788:3:2079 -1789:3:2080 -1790:3:2084 -1791:3:2089 -1792:3:2090 -1793:0:2565 -1794:3:2102 -1795:0:2565 -1796:3:2104 -1797:0:2565 -1798:1:199 -1799:0:2565 -1800:2:468 -1801:0:2565 -1802:1:205 -1803:0:2565 -1804:3:2105 -1805:3:2109 -1806:3:2110 -1807:3:2118 -1808:3:2119 -1809:3:2123 -1810:3:2124 -1811:3:2132 -1812:3:2137 -1813:3:2141 -1814:3:2142 -1815:3:2149 -1816:3:2150 -1817:3:2161 -1818:3:2169 -1819:3:2170 -1820:3:2174 -1821:3:2179 -1822:3:2180 -1823:0:2565 -1824:3:2192 -1825:0:2565 -1826:3:2013 -1827:0:2565 -1828:3:2014 -1829:0:2565 -1830:3:2015 -1831:3:2019 -1832:3:2020 -1833:3:2028 -1834:3:2029 -1835:3:2033 -1836:3:2034 -1837:3:2042 -1838:3:2047 -1839:3:2051 -1840:3:2052 -1841:3:2059 -1842:3:2060 -1843:3:2071 -1844:3:2079 -1845:3:2080 -1846:3:2084 -1847:3:2089 -1848:3:2090 -1849:0:2565 -1850:3:2102 -1851:0:2565 -1852:3:2104 -1853:0:2565 -1854:2:467 -1855:0:2565 -1856:2:468 -1857:0:2565 -1858:3:2105 -1859:3:2109 -1860:3:2110 -1861:3:2118 -1862:3:2119 -1863:3:2123 -1864:3:2124 -1865:3:2132 -1866:3:2137 -1867:3:2141 -1868:3:2142 -1869:3:2149 -1870:3:2150 -1871:3:2161 -1872:3:2169 -1873:3:2170 -1874:3:2174 -1875:3:2179 -1876:3:2180 -1877:0:2565 -1878:3:2192 -1879:0:2565 -1880:3:2013 -1881:0:2565 -1882:3:2014 -1883:0:2565 -1884:3:2015 -1885:3:2019 -1886:3:2020 -1887:3:2028 -1888:3:2029 -1889:3:2033 -1890:3:2034 -1891:3:2042 -1892:3:2047 -1893:3:2051 -1894:3:2052 -1895:3:2059 -1896:3:2060 -1897:3:2071 -1898:3:2079 -1899:3:2080 -1900:3:2084 -1901:3:2089 -1902:3:2090 -1903:0:2565 -1904:3:2102 -1905:0:2565 -1906:2:467 -1907:0:2565 -1908:1:206 -1909:0:2565 -1910:2:468 -1911:0:2565 -1912:3:2104 -1913:0:2565 -1914:3:2105 -1915:3:2109 -1916:3:2110 -1917:3:2118 -1918:3:2119 -1919:3:2123 -1920:3:2124 -1921:3:2132 -1922:3:2137 -1923:3:2141 -1924:3:2142 -1925:3:2149 -1926:3:2150 -1927:3:2161 -1928:3:2169 -1929:3:2170 -1930:3:2174 -1931:3:2179 -1932:3:2180 -1933:0:2565 -1934:3:2192 -1935:0:2565 -1936:3:2013 -1937:0:2565 -1938:3:2014 --1:-1:-1 -1939:0:2565 -1940:3:2015 -1941:3:2019 -1942:3:2020 -1943:3:2028 -1944:3:2029 -1945:3:2033 -1946:3:2034 -1947:3:2042 -1948:3:2047 -1949:3:2051 -1950:3:2052 -1951:3:2059 -1952:3:2060 -1953:3:2071 -1954:3:2079 -1955:3:2080 -1956:3:2084 -1957:3:2089 -1958:3:2090 -1959:0:2565 -1960:3:2102 -1961:0:2565 -1962:2:467 -1963:0:2565 -1964:2:468 -1965:0:2565 -1966:3:2104 -1967:0:2565 -1968:3:2105 -1969:3:2109 -1970:3:2110 -1971:3:2118 -1972:3:2119 -1973:3:2123 -1974:3:2124 -1975:3:2132 -1976:3:2137 -1977:3:2141 -1978:3:2142 -1979:3:2149 -1980:3:2150 -1981:3:2161 -1982:3:2169 -1983:3:2170 -1984:3:2174 -1985:3:2179 -1986:3:2180 -1987:0:2565 -1988:3:2192 -1989:0:2565 -1990:3:2013 -1991:0:2565 -1992:3:2014 -1993:0:2565 -1994:3:2015 -1995:3:2019 -1996:3:2020 -1997:3:2028 -1998:3:2029 -1999:3:2033 -2000:3:2034 -2001:3:2042 -2002:3:2047 -2003:3:2051 -2004:3:2052 -2005:3:2059 -2006:3:2060 -2007:3:2071 -2008:3:2079 -2009:3:2080 -2010:3:2084 -2011:3:2089 -2012:3:2090 -2013:0:2565 -2014:2:467 -2015:0:2565 -2016:1:207 -2017:1:211 -2018:1:212 -2019:1:220 -2020:1:221 -2021:1:222 -2022:1:234 -2023:1:239 -2024:1:243 -2025:1:244 -2026:1:251 -2027:1:252 -2028:1:263 -2029:1:264 -2030:1:265 -2031:1:276 -2032:1:281 -2033:1:282 -2034:0:2565 -2035:3:2102 -2036:0:2565 -2037:2:468 -2038:0:2565 -2039:3:2104 -2040:0:2565 -2041:3:2105 -2042:3:2109 -2043:3:2110 -2044:3:2118 -2045:3:2119 -2046:3:2123 -2047:3:2124 -2048:3:2132 -2049:3:2137 -2050:3:2141 -2051:3:2142 -2052:3:2149 -2053:3:2150 -2054:3:2161 -2055:3:2169 -2056:3:2170 -2057:3:2174 -2058:3:2179 -2059:3:2180 -2060:0:2565 -2061:3:2192 -2062:0:2565 -2063:3:2013 -2064:0:2565 -2065:3:2014 -2066:0:2565 -2067:3:2015 -2068:3:2019 -2069:3:2020 -2070:3:2028 -2071:3:2029 -2072:3:2033 -2073:3:2034 -2074:3:2042 -2075:3:2047 -2076:3:2051 -2077:3:2052 -2078:3:2059 -2079:3:2060 -2080:3:2071 -2081:3:2079 -2082:3:2080 -2083:3:2084 -2084:3:2089 -2085:3:2090 -2086:0:2565 -2087:2:467 -2088:0:2565 -2089:3:2102 -2090:0:2565 -2091:3:2104 -2092:0:2565 -2093:3:2105 -2094:3:2109 -2095:3:2110 -2096:3:2118 -2097:3:2119 -2098:3:2123 -2099:3:2124 -2100:3:2132 -2101:3:2137 -2102:3:2141 -2103:3:2142 -2104:3:2149 -2105:3:2150 -2106:3:2161 -2107:3:2169 -2108:3:2170 -2109:3:2174 -2110:3:2179 -2111:3:2180 -2112:0:2565 -2113:3:2192 -2114:0:2565 -2115:3:2013 -2116:0:2565 -2117:3:2014 -2118:0:2565 -2119:1:294 -2120:0:2565 -2121:2:468 -2122:0:2565 -2123:3:2015 -2124:3:2019 -2125:3:2020 -2126:3:2028 -2127:3:2029 -2128:3:2033 -2129:3:2034 -2130:3:2042 -2131:3:2047 -2132:3:2051 -2133:3:2052 -2134:3:2059 -2135:3:2060 -2136:3:2071 -2137:3:2079 -2138:3:2080 -2139:3:2084 -2140:3:2089 -2141:3:2090 -2142:0:2565 -2143:3:2102 -2144:0:2565 -2145:3:2104 -2146:0:2565 -2147:3:2105 -2148:3:2109 -2149:3:2110 -2150:3:2118 -2151:3:2119 -2152:3:2123 -2153:3:2124 -2154:3:2132 -2155:3:2137 -2156:3:2141 -2157:3:2142 -2158:3:2149 -2159:3:2150 -2160:3:2161 -2161:3:2169 -2162:3:2170 -2163:3:2174 -2164:3:2179 -2165:3:2180 -2166:0:2565 -2167:3:2192 -2168:0:2565 -2169:3:2013 -2170:0:2565 -2171:3:2014 -2172:0:2565 -2173:2:469 -2174:0:2565 -2175:2:475 -2176:0:2565 -2177:2:476 -2178:0:2565 -2179:3:2015 -2180:3:2019 -2181:3:2020 -2182:3:2028 -2183:3:2029 -2184:3:2033 -2185:3:2034 -2186:3:2042 -2187:3:2047 -2188:3:2051 -2189:3:2052 -2190:3:2059 -2191:3:2060 -2192:3:2071 -2193:3:2079 -2194:3:2080 -2195:3:2084 -2196:3:2089 -2197:3:2090 -2198:0:2565 -2199:3:2102 -2200:0:2565 -2201:3:2104 -2202:0:2565 -2203:3:2105 -2204:3:2109 -2205:3:2110 -2206:3:2118 -2207:3:2119 -2208:3:2123 -2209:3:2124 -2210:3:2132 -2211:3:2137 -2212:3:2141 -2213:3:2142 -2214:3:2149 -2215:3:2150 -2216:3:2161 -2217:3:2169 -2218:3:2170 -2219:3:2174 -2220:3:2179 -2221:3:2180 -2222:0:2565 -2223:3:2192 -2224:0:2565 -2225:3:2013 -2226:0:2565 -2227:2:477 -2228:2:481 -2229:2:482 -2230:2:490 -2231:2:491 -2232:2:495 -2233:2:496 -2234:2:504 -2235:2:509 -2236:2:513 -2237:2:514 -2238:2:521 -2239:2:522 -2240:2:533 -2241:2:534 -2242:2:535 -2243:2:546 -2244:2:551 -2245:2:552 -2246:0:2565 -2247:3:2014 -2248:0:2565 -2249:3:2015 -2250:3:2019 -2251:3:2020 -2252:3:2028 -2253:3:2029 -2254:3:2033 -2255:3:2034 -2256:3:2042 -2257:3:2047 -2258:3:2051 -2259:3:2052 -2260:3:2059 -2261:3:2060 -2262:3:2071 -2263:3:2079 -2264:3:2080 -2265:3:2084 -2266:3:2089 -2267:3:2090 -2268:0:2565 -2269:3:2102 -2270:0:2565 -2271:3:2104 -2272:0:2565 -2273:3:2105 -2274:3:2109 -2275:3:2110 -2276:3:2118 -2277:3:2119 -2278:3:2123 -2279:3:2124 -2280:3:2132 -2281:3:2137 -2282:3:2141 -2283:3:2142 -2284:3:2149 -2285:3:2150 -2286:3:2161 -2287:3:2169 -2288:3:2170 -2289:3:2174 -2290:3:2179 -2291:3:2180 -2292:0:2565 -2293:3:2192 -2294:0:2565 -2295:2:564 -2296:0:2565 -2297:3:2013 -2298:0:2565 -2299:3:2014 -2300:0:2565 -2301:3:2015 -2302:3:2019 -2303:3:2020 -2304:3:2028 -2305:3:2029 -2306:3:2033 -2307:3:2034 -2308:3:2042 -2309:3:2047 -2310:3:2051 -2311:3:2052 -2312:3:2059 -2313:3:2060 -2314:3:2071 -2315:3:2079 -2316:3:2080 -2317:3:2084 -2318:3:2089 -2319:3:2090 -2320:0:2565 -2321:3:2102 -2322:0:2565 -2323:3:2104 -2324:0:2565 -2325:3:2105 -2326:3:2109 -2327:3:2110 -2328:3:2118 -2329:3:2119 -2330:3:2123 -2331:3:2124 -2332:3:2132 -2333:3:2137 -2334:3:2141 -2335:3:2142 -2336:3:2149 -2337:3:2150 -2338:3:2161 -2339:3:2169 -2340:3:2170 -2341:3:2174 -2342:3:2179 -2343:3:2180 -2344:0:2565 -2345:2:565 -2346:2:569 -2347:2:570 -2348:2:578 -2349:2:579 -2350:2:583 -2351:2:584 -2352:2:592 -2353:2:597 -2354:2:601 -2355:2:602 -2356:2:609 -2357:2:610 -2358:2:621 -2359:2:622 -2360:2:623 -2361:2:634 -2362:2:639 -2363:2:640 -2364:0:2565 -2365:3:2192 -2366:0:2565 -2367:3:2013 -2368:0:2565 -2369:2:652 -2370:0:2565 -2371:3:2014 -2372:0:2565 -2373:3:2015 -2374:3:2019 -2375:3:2020 -2376:3:2028 -2377:3:2029 -2378:3:2033 -2379:3:2034 -2380:3:2042 -2381:3:2047 -2382:3:2051 -2383:3:2052 -2384:3:2059 -2385:3:2060 -2386:3:2071 -2387:3:2079 -2388:3:2080 -2389:3:2084 -2390:3:2089 -2391:3:2090 -2392:0:2565 -2393:3:2102 -2394:0:2565 -2395:3:2104 -2396:0:2565 -2397:3:2105 -2398:3:2109 -2399:3:2110 -2400:3:2118 -2401:3:2119 -2402:3:2123 -2403:3:2124 -2404:3:2132 -2405:3:2137 -2406:3:2141 -2407:3:2142 -2408:3:2149 -2409:3:2150 -2410:3:2161 -2411:3:2169 -2412:3:2170 -2413:3:2174 -2414:3:2179 -2415:3:2180 -2416:0:2565 -2417:3:2192 -2418:0:2565 -2419:2:653 -2420:0:2565 -2421:3:2013 -2422:0:2565 -2423:3:2014 -2424:0:2565 -2425:3:2015 -2426:3:2019 -2427:3:2020 -2428:3:2028 -2429:3:2029 -2430:3:2033 -2431:3:2034 -2432:3:2042 -2433:3:2047 -2434:3:2051 -2435:3:2052 -2436:3:2059 -2437:3:2060 -2438:3:2071 -2439:3:2079 -2440:3:2080 -2441:3:2084 -2442:3:2089 -2443:3:2090 -2444:0:2565 -2445:3:2102 -2446:0:2565 -2447:3:2104 -2448:0:2565 -2449:3:2105 -2450:3:2109 -2451:3:2110 -2452:3:2118 -2453:3:2119 -2454:3:2123 -2455:3:2124 -2456:3:2132 -2457:3:2137 -2458:3:2141 -2459:3:2142 -2460:3:2149 -2461:3:2150 -2462:3:2161 -2463:3:2169 -2464:3:2170 -2465:3:2174 -2466:3:2179 -2467:3:2180 -2468:0:2565 -2469:2:654 -2470:2:658 -2471:2:659 -2472:2:667 -2473:2:668 -2474:2:672 -2475:2:673 -2476:2:681 -2477:2:686 -2478:2:690 -2479:2:691 -2480:2:698 -2481:2:699 -2482:2:710 -2483:2:711 -2484:2:712 -2485:2:723 -2486:2:728 -2487:2:729 -2488:0:2565 -2489:3:2192 -2490:0:2565 -2491:3:2013 -2492:0:2565 -2493:3:2014 -2494:0:2565 -2495:3:2015 -2496:3:2019 -2497:3:2020 -2498:3:2028 -2499:3:2029 -2500:3:2033 -2501:3:2034 -2502:3:2042 -2503:3:2047 -2504:3:2051 -2505:3:2052 -2506:3:2059 -2507:3:2060 -2508:3:2071 -2509:3:2079 -2510:3:2080 -2511:3:2084 -2512:3:2089 -2513:3:2090 -2514:0:2565 -2515:3:2102 -2516:0:2565 -2517:3:2104 -2518:0:2565 -2519:2:741 -2520:0:2565 -2521:2:750 -2522:0:2565 -2523:2:753 -2524:0:2565 -2525:3:2105 -2526:3:2109 -2527:3:2110 -2528:3:2118 -2529:3:2119 -2530:3:2123 -2531:3:2124 -2532:3:2132 -2533:3:2137 -2534:3:2141 -2535:3:2142 -2536:3:2149 -2537:3:2150 -2538:3:2161 -2539:3:2169 -2540:3:2170 -2541:3:2174 -2542:3:2179 -2543:3:2180 -2544:0:2565 -2545:3:2192 -2546:0:2565 -2547:3:2013 -2548:0:2565 -2549:3:2014 -2550:0:2565 -2551:3:2015 -2552:3:2019 -2553:3:2020 -2554:3:2028 -2555:3:2029 -2556:3:2033 -2557:3:2034 -2558:3:2042 -2559:3:2047 -2560:3:2051 -2561:3:2052 -2562:3:2059 -2563:3:2060 -2564:3:2071 -2565:3:2079 -2566:3:2080 -2567:3:2084 -2568:3:2089 -2569:3:2090 -2570:0:2565 -2571:3:2102 -2572:0:2565 -2573:2:758 -2574:0:2565 -2575:3:2104 -2576:0:2565 -2577:3:2105 -2578:3:2109 -2579:3:2110 -2580:3:2118 -2581:3:2119 -2582:3:2123 -2583:3:2124 -2584:3:2132 -2585:3:2137 -2586:3:2141 -2587:3:2142 -2588:3:2149 -2589:3:2150 -2590:3:2161 -2591:3:2169 -2592:3:2170 -2593:3:2174 -2594:3:2179 -2595:3:2180 -2596:0:2565 -2597:3:2192 -2598:0:2565 -2599:3:2013 -2600:0:2565 -2601:3:2014 -2602:0:2565 -2603:3:2015 -2604:3:2019 -2605:3:2020 -2606:3:2028 -2607:3:2029 -2608:3:2033 -2609:3:2034 -2610:3:2042 -2611:3:2047 -2612:3:2051 -2613:3:2052 -2614:3:2059 -2615:3:2060 -2616:3:2071 -2617:3:2079 -2618:3:2080 -2619:3:2084 -2620:3:2089 -2621:3:2090 -2622:0:2565 -2623:2:759 -2624:0:2565 -2625:3:2102 -2626:0:2565 -2627:3:2104 -2628:0:2565 -2629:3:2105 -2630:3:2109 -2631:3:2110 -2632:3:2118 -2633:3:2119 -2634:3:2123 -2635:3:2124 -2636:3:2132 -2637:3:2137 -2638:3:2141 -2639:3:2142 -2640:3:2149 -2641:3:2150 -2642:3:2161 -2643:3:2169 -2644:3:2170 -2645:3:2174 -2646:3:2179 -2647:3:2180 -2648:0:2565 -2649:3:2192 -2650:0:2565 -2651:3:2013 -2652:0:2565 -2653:3:2014 -2654:0:2565 -2655:2:760 -2656:0:2565 -2657:2:761 -2658:0:2565 -2659:2:762 -2660:0:2565 -2661:2:763 -2662:0:2565 -2663:3:2015 -2664:3:2019 -2665:3:2020 -2666:3:2028 -2667:3:2029 -2668:3:2033 -2669:3:2034 -2670:3:2042 -2671:3:2047 -2672:3:2051 -2673:3:2052 -2674:3:2059 -2675:3:2060 -2676:3:2071 -2677:3:2079 -2678:3:2080 -2679:3:2084 -2680:3:2089 -2681:3:2090 -2682:0:2565 -2683:3:2102 -2684:0:2565 -2685:3:2104 -2686:0:2565 -2687:3:2105 -2688:3:2109 -2689:3:2110 -2690:3:2118 -2691:3:2119 -2692:3:2123 -2693:3:2124 -2694:3:2132 -2695:3:2137 -2696:3:2141 -2697:3:2142 -2698:3:2149 -2699:3:2150 -2700:3:2161 -2701:3:2169 -2702:3:2170 -2703:3:2174 -2704:3:2179 -2705:3:2180 -2706:0:2565 -2707:3:2192 -2708:0:2565 -2709:3:2013 -2710:0:2565 -2711:2:765 -2712:0:2565 -2713:3:2014 -2714:0:2565 -2715:3:2015 -2716:3:2019 -2717:3:2020 -2718:3:2028 -2719:3:2029 -2720:3:2033 -2721:3:2034 -2722:3:2042 -2723:3:2047 -2724:3:2051 -2725:3:2052 -2726:3:2059 -2727:3:2060 -2728:3:2071 -2729:3:2079 -2730:3:2080 -2731:3:2084 -2732:3:2089 -2733:3:2090 -2734:0:2565 -2735:3:2102 -2736:0:2565 -2737:3:2104 -2738:0:2565 -2739:3:2105 -2740:3:2109 -2741:3:2110 -2742:3:2118 -2743:3:2119 -2744:3:2123 -2745:3:2124 -2746:3:2132 -2747:3:2137 -2748:3:2141 -2749:3:2142 -2750:3:2149 -2751:3:2150 -2752:3:2161 -2753:3:2169 -2754:3:2170 -2755:3:2174 -2756:3:2179 -2757:3:2180 -2758:0:2565 -2759:3:2192 -2760:0:2565 -2761:2:766 -2762:2:770 -2763:2:771 -2764:2:779 -2765:2:780 -2766:2:781 -2767:2:793 -2768:2:798 -2769:2:802 -2770:2:803 -2771:2:810 -2772:2:811 -2773:2:822 -2774:2:823 -2775:2:824 -2776:2:835 -2777:2:840 -2778:2:841 -2779:0:2565 -2780:3:2013 -2781:0:2565 -2782:3:2014 -2783:0:2565 -2784:3:2015 -2785:3:2019 -2786:3:2020 -2787:3:2028 -2788:3:2029 -2789:3:2033 -2790:3:2034 -2791:3:2042 -2792:3:2047 -2793:3:2051 -2794:3:2052 -2795:3:2059 -2796:3:2060 -2797:3:2071 -2798:3:2079 -2799:3:2080 -2800:3:2084 -2801:3:2089 -2802:3:2090 -2803:0:2565 -2804:3:2102 -2805:0:2565 -2806:3:2104 -2807:0:2565 -2808:3:2105 -2809:3:2109 -2810:3:2110 -2811:3:2118 -2812:3:2119 -2813:3:2123 -2814:3:2124 -2815:3:2132 -2816:3:2137 -2817:3:2141 -2818:3:2142 -2819:3:2149 -2820:3:2150 -2821:3:2161 -2822:3:2169 -2823:3:2170 -2824:3:2174 -2825:3:2179 -2826:3:2180 -2827:0:2565 -2828:2:853 -2829:0:2565 -2830:3:2192 -2831:0:2565 -2832:3:2013 -2833:0:2565 -2834:2:857 -2835:0:2565 -2836:2:465 -2837:0:2565 -2838:3:2014 -2839:0:2565 -2840:3:2015 -2841:3:2019 -2842:3:2020 -2843:3:2028 -2844:3:2029 -2845:3:2033 -2846:3:2034 -2847:3:2042 -2848:3:2047 -2849:3:2051 -2850:3:2052 -2851:3:2059 -2852:3:2060 -2853:3:2071 -2854:3:2079 -2855:3:2080 -2856:3:2084 -2857:3:2089 -2858:3:2090 -2859:0:2565 -2860:3:2102 -2861:0:2565 -2862:3:2104 -2863:0:2565 -2864:3:2105 -2865:3:2109 -2866:3:2110 -2867:3:2118 -2868:3:2119 -2869:3:2123 -2870:3:2124 -2871:3:2132 -2872:3:2137 -2873:3:2141 -2874:3:2142 -2875:3:2149 -2876:3:2150 -2877:3:2161 -2878:3:2169 -2879:3:2170 -2880:3:2174 -2881:3:2179 -2882:3:2180 -2883:0:2565 -2884:3:2192 -2885:0:2565 -2886:2:466 -2887:0:2565 -2888:3:2013 -2889:0:2565 -2890:3:2014 -2891:0:2565 -2892:3:2015 -2893:3:2019 -2894:3:2020 -2895:3:2028 -2896:3:2029 -2897:3:2033 -2898:3:2034 -2899:3:2042 -2900:3:2047 -2901:3:2051 -2902:3:2052 -2903:3:2059 -2904:3:2060 -2905:3:2071 -2906:3:2079 -2907:3:2080 -2908:3:2084 -2909:3:2089 -2910:3:2090 -2911:0:2565 -2912:3:2102 -2913:0:2565 -2914:3:2104 -2915:0:2565 -2916:3:2105 -2917:3:2109 -2918:3:2110 -2919:3:2118 -2920:3:2119 -2921:3:2123 -2922:3:2124 -2923:3:2132 -2924:3:2137 -2925:3:2141 -2926:3:2142 -2927:3:2149 -2928:3:2150 -2929:3:2161 -2930:3:2169 -2931:3:2170 -2932:3:2174 -2933:3:2179 -2934:3:2180 -2935:0:2565 -2936:2:467 -2937:0:2565 -2938:3:2192 -2939:0:2565 -2940:3:2013 -2941:0:2565 -2942:3:2014 -2943:0:2565 -2944:3:2015 -2945:3:2019 -2946:3:2020 -2947:3:2028 -2948:3:2029 -2949:3:2033 -2950:3:2034 -2951:3:2042 -2952:3:2047 -2953:3:2051 -2954:3:2052 -2955:3:2059 -2956:3:2060 -2957:3:2071 -2958:3:2079 -2959:3:2080 -2960:3:2084 -2961:3:2089 -2962:3:2090 -2963:0:2565 -2964:3:2102 -2965:0:2565 -2966:3:2104 -2967:0:2565 -2968:1:297 -2969:0:2565 -2970:2:468 -2971:0:2565 -2972:3:2105 -2973:3:2109 -2974:3:2110 -2975:3:2118 -2976:3:2119 -2977:3:2123 -2978:3:2124 -2979:3:2132 -2980:3:2137 -2981:3:2141 -2982:3:2142 -2983:3:2149 -2984:3:2150 -2985:3:2161 -2986:3:2169 -2987:3:2170 -2988:3:2174 -2989:3:2179 -2990:3:2180 -2991:0:2565 -2992:3:2192 -2993:0:2565 -2994:3:2013 -2995:0:2565 -2996:3:2014 -2997:0:2565 -2998:3:2015 -2999:3:2019 -3000:3:2020 -3001:3:2028 -3002:3:2029 -3003:3:2033 -3004:3:2034 -3005:3:2042 -3006:3:2047 -3007:3:2051 -3008:3:2052 -3009:3:2059 -3010:3:2060 -3011:3:2071 -3012:3:2079 -3013:3:2080 -3014:3:2084 -3015:3:2089 -3016:3:2090 -3017:0:2565 -3018:3:2102 -3019:0:2565 -3020:3:2104 -3021:0:2565 -3022:2:467 -3023:0:2565 -3024:2:468 -3025:0:2565 -3026:3:2105 -3027:3:2109 -3028:3:2110 -3029:3:2118 -3030:3:2119 -3031:3:2123 -3032:3:2124 -3033:3:2132 -3034:3:2137 -3035:3:2141 -3036:3:2142 -3037:3:2149 -3038:3:2150 -3039:3:2161 -3040:3:2169 -3041:3:2170 -3042:3:2174 -3043:3:2179 -3044:3:2180 -3045:0:2565 -3046:3:2192 -3047:0:2565 -3048:3:2013 -3049:0:2565 -3050:3:2014 -3051:0:2565 -3052:3:2015 -3053:3:2019 -3054:3:2020 -3055:3:2028 -3056:3:2029 -3057:3:2033 -3058:3:2034 -3059:3:2042 -3060:3:2047 -3061:3:2051 -3062:3:2052 -3063:3:2059 -3064:3:2060 -3065:3:2071 -3066:3:2079 -3067:3:2080 -3068:3:2084 -3069:3:2089 -3070:3:2090 -3071:0:2565 -3072:3:2102 -3073:0:2565 -3074:2:467 -3075:0:2565 -3076:1:303 -3077:0:2565 -3078:2:468 -3079:0:2565 -3080:1:312 -3081:0:2565 -3082:3:2104 -3083:0:2565 -3084:3:2105 -3085:3:2109 -3086:3:2110 -3087:3:2118 -3088:3:2119 -3089:3:2123 -3090:3:2124 -3091:3:2132 -3092:3:2137 -3093:3:2141 -3094:3:2142 -3095:3:2149 -3096:3:2150 -3097:3:2161 -3098:3:2169 -3099:3:2170 -3100:3:2174 -3101:3:2179 -3102:3:2180 -3103:0:2565 -3104:3:2192 -3105:0:2565 -3106:3:2013 -3107:0:2565 -3108:3:2014 -3109:0:2565 -3110:3:2015 -3111:3:2019 -3112:3:2020 -3113:3:2028 -3114:3:2029 -3115:3:2033 -3116:3:2034 -3117:3:2042 -3118:3:2047 -3119:3:2051 -3120:3:2052 -3121:3:2059 -3122:3:2060 -3123:3:2071 -3124:3:2079 -3125:3:2080 -3126:3:2084 -3127:3:2089 -3128:3:2090 -3129:0:2565 -3130:3:2102 -3131:0:2565 -3132:2:467 -3133:0:2565 -3134:2:468 -3135:0:2565 -3136:3:2104 -3137:0:2565 -3138:3:2105 -3139:3:2109 -3140:3:2110 -3141:3:2118 -3142:3:2119 -3143:3:2123 -3144:3:2124 -3145:3:2132 -3146:3:2137 -3147:3:2141 -3148:3:2142 -3149:3:2149 -3150:3:2150 -3151:3:2161 -3152:3:2169 -3153:3:2170 -3154:3:2174 -3155:3:2179 -3156:3:2180 -3157:0:2565 -3158:3:2192 -3159:0:2565 -3160:3:2013 -3161:0:2565 -3162:3:2014 -3163:0:2565 -3164:3:2015 -3165:3:2019 -3166:3:2020 -3167:3:2028 -3168:3:2029 -3169:3:2033 -3170:3:2034 -3171:3:2042 -3172:3:2047 -3173:3:2051 -3174:3:2052 -3175:3:2059 -3176:3:2060 -3177:3:2071 -3178:3:2079 -3179:3:2080 -3180:3:2084 -3181:3:2089 -3182:3:2090 -3183:0:2565 -3184:2:467 -3185:0:2565 -3186:1:314 -3187:0:2565 -3188:3:2102 -3189:0:2565 -3190:2:468 -3191:0:2565 -3192:3:2104 -3193:0:2565 -3194:3:2105 -3195:3:2109 -3196:3:2110 -3197:3:2118 -3198:3:2119 -3199:3:2123 -3200:3:2124 -3201:3:2132 -3202:3:2137 -3203:3:2141 -3204:3:2142 -3205:3:2149 -3206:3:2150 -3207:3:2161 -3208:3:2169 -3209:3:2170 -3210:3:2174 -3211:3:2179 -3212:3:2180 -3213:0:2565 -3214:3:2192 -3215:0:2565 -3216:3:2013 -3217:0:2565 -3218:3:2014 -3219:0:2565 -3220:3:2015 -3221:3:2019 -3222:3:2020 -3223:3:2028 -3224:3:2029 -3225:3:2033 -3226:3:2034 -3227:3:2042 -3228:3:2047 -3229:3:2051 -3230:3:2052 -3231:3:2059 -3232:3:2060 -3233:3:2071 -3234:3:2079 -3235:3:2080 -3236:3:2084 -3237:3:2089 -3238:3:2090 -3239:0:2565 -3240:2:469 -3241:0:2565 -3242:3:2102 -3243:0:2565 -3244:2:475 -3245:0:2565 -3246:2:476 -3247:0:2565 -3248:3:2104 -3249:0:2565 -3250:3:2105 -3251:3:2109 -3252:3:2110 -3253:3:2118 -3254:3:2119 -3255:3:2123 -3256:3:2124 -3257:3:2132 -3258:3:2137 -3259:3:2141 -3260:3:2142 -3261:3:2149 -3262:3:2150 -3263:3:2161 -3264:3:2169 -3265:3:2170 -3266:3:2174 -3267:3:2179 -3268:3:2180 -3269:0:2565 -3270:3:2192 -3271:0:2565 -3272:3:2013 -3273:0:2565 -3274:3:2014 -3275:0:2565 -3276:3:2015 -3277:3:2019 -3278:3:2020 -3279:3:2028 -3280:3:2029 -3281:3:2033 -3282:3:2034 -3283:3:2042 -3284:3:2047 -3285:3:2051 -3286:3:2052 -3287:3:2059 -3288:3:2060 -3289:3:2071 -3290:3:2079 -3291:3:2080 -3292:3:2084 -3293:3:2089 -3294:3:2090 -3295:0:2565 -3296:2:477 -3297:2:481 -3298:2:482 -3299:2:490 -3300:2:491 -3301:2:492 -3302:2:504 -3303:2:509 -3304:2:513 -3305:2:514 -3306:2:521 -3307:2:522 -3308:2:533 -3309:2:534 -3310:2:535 -3311:2:546 -3312:2:551 -3313:2:552 -3314:0:2565 -3315:3:2102 -3316:0:2565 -3317:3:2104 -3318:0:2565 -3319:3:2105 -3320:3:2109 -3321:3:2110 -3322:3:2118 -3323:3:2119 -3324:3:2123 -3325:3:2124 -3326:3:2132 -3327:3:2137 -3328:3:2141 -3329:3:2142 -3330:3:2149 -3331:3:2150 -3332:3:2161 -3333:3:2169 -3334:3:2170 -3335:3:2174 -3336:3:2179 -3337:3:2180 -3338:0:2565 -3339:3:2192 -3340:0:2565 -3341:3:2013 -3342:0:2565 -3343:3:2014 -3344:0:2565 -3345:2:564 -3346:0:2565 -3347:3:2015 -3348:3:2019 -3349:3:2020 -3350:3:2028 -3351:3:2029 -3352:3:2033 -3353:3:2034 -3354:3:2042 -3355:3:2047 -3356:3:2051 -3357:3:2052 -3358:3:2059 -3359:3:2060 -3360:3:2071 -3361:3:2079 -3362:3:2080 -3363:3:2084 -3364:3:2089 -3365:3:2090 -3366:0:2565 -3367:3:2102 -3368:0:2565 -3369:3:2104 -3370:0:2565 -3371:3:2105 -3372:3:2109 -3373:3:2110 -3374:3:2118 -3375:3:2119 -3376:3:2123 -3377:3:2124 -3378:3:2132 -3379:3:2137 -3380:3:2141 -3381:3:2142 -3382:3:2149 -3383:3:2150 -3384:3:2161 -3385:3:2169 -3386:3:2170 -3387:3:2174 -3388:3:2179 -3389:3:2180 -3390:0:2565 -3391:3:2192 -3392:0:2565 -3393:3:2013 -3394:0:2565 -3395:2:565 -3396:2:569 -3397:2:570 -3398:2:578 -3399:2:579 -3400:2:583 -3401:2:584 -3402:2:592 -3403:2:597 -3404:2:601 -3405:2:602 -3406:2:609 -3407:2:610 -3408:2:621 -3409:2:622 -3410:2:623 -3411:2:634 -3412:2:639 -3413:2:640 -3414:0:2565 -3415:2:744 -3416:0:2565 -3417:3:2014 -3418:0:2565 -3419:3:2015 -3420:3:2019 -3421:3:2020 -3422:3:2028 -3423:3:2029 -3424:3:2033 -3425:3:2034 -3426:3:2042 -3427:3:2047 -3428:3:2051 -3429:3:2052 -3430:3:2059 -3431:3:2060 -3432:3:2071 -3433:3:2079 -3434:3:2080 -3435:3:2084 -3436:3:2089 -3437:3:2090 -3438:0:2565 -3439:3:2102 -3440:0:2565 -3441:3:2104 -3442:0:2565 -3443:3:2105 -3444:3:2109 -3445:3:2110 -3446:3:2118 -3447:3:2119 -3448:3:2123 -3449:3:2124 -3450:3:2132 -3451:3:2137 -3452:3:2141 -3453:3:2142 -3454:3:2149 -3455:3:2150 -3456:3:2161 -3457:3:2169 -3458:3:2170 -3459:3:2174 -3460:3:2179 -3461:3:2180 -3462:0:2565 -3463:3:2192 -3464:0:2565 -3465:2:745 -3466:0:2565 -3467:3:2013 -3468:0:2565 -3469:2:750 -3470:0:2565 -3471:2:753 -3472:0:2565 -3473:3:2014 -3474:0:2565 -3475:3:2015 -3476:3:2019 -3477:3:2020 -3478:3:2028 -3479:3:2029 -3480:3:2033 -3481:3:2034 -3482:3:2042 -3483:3:2047 -3484:3:2051 -3485:3:2052 -3486:3:2059 -3487:3:2060 -3488:3:2071 -3489:3:2079 -3490:3:2080 -3491:3:2084 -3492:3:2089 -3493:3:2090 -3494:0:2565 -3495:3:2102 -3496:0:2565 -3497:3:2104 -3498:0:2565 -3499:3:2105 -3500:3:2109 -3501:3:2110 -3502:3:2118 -3503:3:2119 -3504:3:2123 -3505:3:2124 -3506:3:2132 -3507:3:2137 -3508:3:2141 -3509:3:2142 -3510:3:2149 -3511:3:2150 -3512:3:2161 -3513:3:2169 -3514:3:2170 -3515:3:2174 -3516:3:2179 -3517:3:2180 -3518:0:2565 -3519:3:2192 -3520:0:2565 -3521:2:758 -3522:0:2565 -3523:3:2013 -3524:0:2565 -3525:3:2014 -3526:0:2565 -3527:3:2015 -3528:3:2019 -3529:3:2020 -3530:3:2028 -3531:3:2029 -3532:3:2033 -3533:3:2034 -3534:3:2042 -3535:3:2047 -3536:3:2051 -3537:3:2052 -3538:3:2059 -3539:3:2060 -3540:3:2071 -3541:3:2079 -3542:3:2080 -3543:3:2084 -3544:3:2089 -3545:3:2090 -3546:0:2565 -3547:3:2102 -3548:0:2565 -3549:3:2104 -3550:0:2565 -3551:3:2105 -3552:3:2109 -3553:3:2110 -3554:3:2118 -3555:3:2119 -3556:3:2123 -3557:3:2124 -3558:3:2132 -3559:3:2137 -3560:3:2141 -3561:3:2142 -3562:3:2149 -3563:3:2150 -3564:3:2161 -3565:3:2169 -3566:3:2170 -3567:3:2174 -3568:3:2179 -3569:3:2180 -3570:0:2565 -3571:2:759 -3572:0:2565 -3573:3:2192 -3574:0:2565 -3575:3:2013 -3576:0:2565 -3577:3:2014 -3578:0:2565 -3579:3:2015 -3580:3:2019 -3581:3:2020 -3582:3:2028 -3583:3:2029 -3584:3:2033 -3585:3:2034 -3586:3:2042 -3587:3:2047 -3588:3:2051 -3589:3:2052 -3590:3:2059 -3591:3:2060 -3592:3:2071 -3593:3:2079 -3594:3:2080 -3595:3:2084 -3596:3:2089 -3597:3:2090 -3598:0:2565 -3599:3:2102 -3600:0:2565 -3601:3:2104 -3602:0:2565 -3603:2:760 -3604:0:2565 -3605:2:761 -3606:0:2565 -3607:2:762 -3608:0:2565 -3609:2:763 -3610:0:2565 -3611:3:2105 -3612:3:2109 -3613:3:2110 -3614:3:2118 -3615:3:2119 -3616:3:2123 -3617:3:2124 -3618:3:2132 -3619:3:2137 -3620:3:2141 -3621:3:2142 -3622:3:2149 -3623:3:2150 -3624:3:2161 -3625:3:2169 -3626:3:2170 -3627:3:2174 -3628:3:2179 -3629:3:2180 -3630:0:2565 -3631:3:2192 -3632:0:2565 -3633:3:2013 -3634:0:2565 -3635:3:2014 -3636:0:2565 -3637:3:2015 -3638:3:2019 -3639:3:2020 -3640:3:2028 -3641:3:2029 -3642:3:2033 -3643:3:2034 -3644:3:2042 -3645:3:2047 -3646:3:2051 -3647:3:2052 -3648:3:2059 -3649:3:2060 -3650:3:2071 -3651:3:2079 -3652:3:2080 -3653:3:2084 -3654:3:2089 -3655:3:2090 -3656:0:2565 -3657:3:2102 -3658:0:2565 -3659:2:765 -3660:0:2565 -3661:3:2104 -3662:0:2565 -3663:3:2105 -3664:3:2109 -3665:3:2110 -3666:3:2118 -3667:3:2119 -3668:3:2123 -3669:3:2124 -3670:3:2132 -3671:3:2137 -3672:3:2141 -3673:3:2142 -3674:3:2149 -3675:3:2150 -3676:3:2161 -3677:3:2169 -3678:3:2170 -3679:3:2174 -3680:3:2179 -3681:3:2180 -3682:0:2565 -3683:3:2192 -3684:0:2565 -3685:3:2013 -3686:0:2565 -3687:3:2014 -3688:0:2565 -3689:3:2015 -3690:3:2019 -3691:3:2020 -3692:3:2028 -3693:3:2029 -3694:3:2033 -3695:3:2034 -3696:3:2042 -3697:3:2047 -3698:3:2051 -3699:3:2052 -3700:3:2059 -3701:3:2060 -3702:3:2071 -3703:3:2079 -3704:3:2080 -3705:3:2084 -3706:3:2089 -3707:3:2090 -3708:0:2565 -3709:2:766 -3710:2:770 -3711:2:771 -3712:2:779 -3713:2:780 -3714:2:781 -3715:2:793 -3716:2:798 -3717:2:802 -3718:2:803 -3719:2:810 -3720:2:811 -3721:2:822 -3722:2:823 -3723:2:824 -3724:2:835 -3725:2:840 -3726:2:841 -3727:0:2565 -3728:3:2102 -3729:0:2565 -3730:3:2104 -3731:0:2565 -3732:3:2105 -3733:3:2109 -3734:3:2110 -3735:3:2118 -3736:3:2119 -3737:3:2123 -3738:3:2124 -3739:3:2132 -3740:3:2137 -3741:3:2141 -3742:3:2142 -3743:3:2149 -3744:3:2150 -3745:3:2161 -3746:3:2169 -3747:3:2170 -3748:3:2174 -3749:3:2179 -3750:3:2180 -3751:0:2565 -3752:3:2192 -3753:0:2565 -3754:3:2013 -3755:0:2565 -3756:3:2014 -3757:0:2565 -3758:2:853 -3759:0:2565 -3760:2:857 -3761:0:2565 -3762:2:465 -3763:0:2565 -3764:3:2015 -3765:3:2019 -3766:3:2020 -3767:3:2028 -3768:3:2029 -3769:3:2033 -3770:3:2034 -3771:3:2042 -3772:3:2047 -3773:3:2051 -3774:3:2052 -3775:3:2059 -3776:3:2060 -3777:3:2071 -3778:3:2079 -3779:3:2080 -3780:3:2084 -3781:3:2089 -3782:3:2090 -3783:0:2565 -3784:3:2102 -3785:0:2565 -3786:3:2104 -3787:0:2565 -3788:3:2105 -3789:3:2109 -3790:3:2110 -3791:3:2118 -3792:3:2119 -3793:3:2123 -3794:3:2124 -3795:3:2132 -3796:3:2137 -3797:3:2141 -3798:3:2142 -3799:3:2149 -3800:3:2150 -3801:3:2161 -3802:3:2169 -3803:3:2170 -3804:3:2174 -3805:3:2179 -3806:3:2180 -3807:0:2565 -3808:3:2192 -3809:0:2565 -3810:3:2013 -3811:0:2565 -3812:2:466 -3813:0:2565 -3814:3:2014 -3815:0:2565 -3816:3:2015 -3817:3:2019 -3818:3:2020 -3819:3:2028 -3820:3:2029 -3821:3:2033 -3822:3:2034 -3823:3:2042 -3824:3:2047 -3825:3:2051 -3826:3:2052 -3827:3:2059 -3828:3:2060 -3829:3:2071 -3830:3:2079 -3831:3:2080 -3832:3:2084 -3833:3:2089 -3834:3:2090 -3835:0:2565 -3836:3:2102 -3837:0:2565 -3838:3:2104 -3839:0:2565 -3840:3:2105 -3841:3:2109 -3842:3:2110 -3843:3:2118 -3844:3:2119 -3845:3:2123 -3846:3:2124 -3847:3:2132 -3848:3:2137 -3849:3:2141 -3850:3:2142 -3851:3:2149 -3852:3:2150 -3853:3:2161 -3854:3:2169 -3855:3:2170 -3856:3:2174 -3857:3:2179 -3858:3:2180 -3859:0:2565 -3860:3:2192 -3861:0:2565 -3862:2:467 -3863:0:2565 -3864:3:2013 -3865:0:2565 -3866:3:2014 -3867:0:2565 -3868:3:2015 -3869:3:2019 -3870:3:2020 -3871:3:2028 -3872:3:2029 -3873:3:2033 -3874:3:2034 -3875:3:2042 -3876:3:2047 -3877:3:2051 -3878:3:2052 -3879:3:2059 -3880:3:2060 -3881:3:2071 -3882:3:2079 -3883:3:2080 -3884:3:2084 -3885:3:2089 -3886:3:2090 -3887:0:2565 -3888:3:2102 -3889:0:2565 -3890:3:2104 -3891:0:2565 -3892:3:2105 -3893:3:2109 -3894:3:2110 -3895:3:2118 -3896:3:2119 -3897:3:2123 -3898:3:2124 -3899:3:2132 -3900:3:2137 -3901:3:2141 -3902:3:2142 -3903:3:2149 -3904:3:2150 -3905:3:2161 -3906:3:2169 -3907:3:2170 -3908:3:2174 -3909:3:2179 -3910:3:2180 -3911:0:2565 -3912:1:317 -3913:0:2565 -3914:3:2192 -3915:0:2565 -3916:3:2013 -3917:0:2565 -3918:2:468 -3919:0:2565 -3920:1:323 -3921:0:2565 -3922:1:324 -3923:0:2565 -3924:3:2014 -3925:0:2565 -3926:3:2015 -3927:3:2019 -3928:3:2020 -3929:3:2028 -3930:3:2029 -3931:3:2033 -3932:3:2034 -3933:3:2042 -3934:3:2047 -3935:3:2051 -3936:3:2052 -3937:3:2059 -3938:3:2060 -3939:3:2071 -3940:3:2079 -3941:3:2080 -3942:3:2084 -3943:3:2089 -3944:3:2090 -3945:0:2565 -3946:3:2102 -3947:0:2565 -3948:3:2104 -3949:0:2565 -3950:3:2105 -3951:3:2109 -3952:3:2110 -3953:3:2118 -3954:3:2119 -3955:3:2123 -3956:3:2124 -3957:3:2132 -3958:3:2137 -3959:3:2141 -3960:3:2142 -3961:3:2149 -3962:3:2150 -3963:3:2161 -3964:3:2169 -3965:3:2170 -3966:3:2174 -3967:3:2179 -3968:3:2180 -3969:0:2565 -3970:3:2192 -3971:0:2565 -3972:3:2013 -3973:0:2565 -3974:2:467 -3975:0:2565 -3976:2:468 -3977:0:2565 -3978:3:2014 -3979:0:2565 -3980:3:2015 -3981:3:2019 -3982:3:2020 -3983:3:2028 -3984:3:2029 -3985:3:2033 -3986:3:2034 -3987:3:2042 -3988:3:2047 -3989:3:2051 -3990:3:2052 -3991:3:2059 -3992:3:2060 -3993:3:2071 -3994:3:2079 -3995:3:2080 -3996:3:2084 -3997:3:2089 -3998:3:2090 -3999:0:2565 -4000:3:2102 -4001:0:2565 -4002:3:2104 -4003:0:2565 -4004:3:2105 -4005:3:2109 -4006:3:2110 -4007:3:2118 -4008:3:2119 -4009:3:2123 -4010:3:2124 -4011:3:2132 -4012:3:2137 -4013:3:2141 -4014:3:2142 -4015:3:2149 -4016:3:2150 -4017:3:2161 -4018:3:2169 -4019:3:2170 -4020:3:2174 -4021:3:2179 -4022:3:2180 -4023:0:2565 -4024:3:2192 -4025:0:2565 -4026:2:467 -4027:0:2565 -4028:1:329 -4029:0:2565 -4030:3:2013 -4031:0:2565 -4032:2:468 -4033:0:2565 -4034:3:2014 -4035:0:2565 -4036:3:2015 -4037:3:2019 -4038:3:2020 -4039:3:2028 -4040:3:2029 -4041:3:2033 -4042:3:2034 -4043:3:2042 -4044:3:2047 -4045:3:2051 -4046:3:2052 -4047:3:2059 -4048:3:2060 -4049:3:2071 -4050:3:2079 -4051:3:2080 -4052:3:2084 -4053:3:2089 -4054:3:2090 -4055:0:2565 -4056:3:2102 -4057:0:2565 -4058:3:2104 -4059:0:2565 -4060:3:2105 -4061:3:2109 -4062:3:2110 -4063:3:2118 -4064:3:2119 -4065:3:2123 -4066:3:2124 -4067:3:2132 -4068:3:2137 -4069:3:2141 -4070:3:2142 -4071:3:2149 -4072:3:2150 -4073:3:2161 -4074:3:2169 -4075:3:2170 -4076:3:2174 -4077:3:2179 -4078:3:2180 -4079:0:2565 -4080:3:2192 -4081:0:2565 -4082:2:467 -4083:0:2565 -4084:3:2013 -4085:0:2565 -4086:3:2014 -4087:0:2565 -4088:3:2015 -4089:3:2019 -4090:3:2020 -4091:3:2028 -4092:3:2029 -4093:3:2033 -4094:3:2034 -4095:3:2042 -4096:3:2047 -4097:3:2051 -4098:3:2052 -4099:3:2059 -4100:3:2060 -4101:3:2071 -4102:3:2079 -4103:3:2080 -4104:3:2084 -4105:3:2089 -4106:3:2090 -4107:0:2565 -4108:3:2102 -4109:0:2565 -4110:3:2104 -4111:0:2565 -4112:3:2105 -4113:3:2109 -4114:3:2110 -4115:3:2118 -4116:3:2119 -4117:3:2123 -4118:3:2124 -4119:3:2132 -4120:3:2137 -4121:3:2141 -4122:3:2142 -4123:3:2149 -4124:3:2150 -4125:3:2161 -4126:3:2169 -4127:3:2170 -4128:3:2174 -4129:3:2179 -4130:3:2180 -4131:0:2565 -4132:1:330 -4133:0:2565 -4134:3:2192 -4135:0:2565 -4136:3:2013 -4137:0:2565 -4138:2:468 -4139:0:2565 -4140:3:2014 -4141:0:2565 -4142:3:2015 -4143:3:2019 -4144:3:2020 -4145:3:2028 -4146:3:2029 -4147:3:2033 -4148:3:2034 -4149:3:2042 -4150:3:2047 -4151:3:2051 -4152:3:2052 -4153:3:2059 -4154:3:2060 -4155:3:2071 -4156:3:2079 -4157:3:2080 -4158:3:2084 -4159:3:2089 -4160:3:2090 -4161:0:2565 -4162:3:2102 -4163:0:2565 -4164:3:2104 -4165:0:2565 -4166:3:2105 -4167:3:2109 -4168:3:2110 -4169:3:2118 -4170:3:2119 -4171:3:2123 -4172:3:2124 -4173:3:2132 -4174:3:2137 -4175:3:2141 -4176:3:2142 -4177:3:2149 -4178:3:2150 -4179:3:2161 -4180:3:2169 -4181:3:2170 -4182:3:2174 -4183:3:2179 -4184:3:2180 -4185:0:2565 -4186:3:2192 -4187:0:2565 -4188:2:467 -4189:0:2565 -4190:3:2013 -4191:0:2565 -4192:3:2014 -4193:0:2565 -4194:3:2015 -4195:3:2019 -4196:3:2020 -4197:3:2028 -4198:3:2029 -4199:3:2033 -4200:3:2034 -4201:3:2042 -4202:3:2047 -4203:3:2051 -4204:3:2052 -4205:3:2059 -4206:3:2060 -4207:3:2071 -4208:3:2079 -4209:3:2080 -4210:3:2084 -4211:3:2089 -4212:3:2090 -4213:0:2565 -4214:3:2102 -4215:0:2565 -4216:3:2104 -4217:0:2565 -4218:3:2105 -4219:3:2109 -4220:3:2110 -4221:3:2118 -4222:3:2119 -4223:3:2123 -4224:3:2124 -4225:3:2132 -4226:3:2137 -4227:3:2141 -4228:3:2142 -4229:3:2149 -4230:3:2150 -4231:3:2161 -4232:3:2169 -4233:3:2170 -4234:3:2174 -4235:3:2179 -4236:3:2180 -4237:0:2565 -4238:1:331 -4239:0:2565 -4240:3:2192 -4241:0:2565 -4242:3:2013 -4243:0:2565 -4244:2:468 -4245:0:2565 -4246:1:332 -4247:0:2565 -4248:1:333 -4249:0:2565 -4250:1:334 -4251:0:2565 -4252:3:2014 -4253:0:2565 -4254:3:2015 -4255:3:2019 -4256:3:2020 -4257:3:2028 -4258:3:2029 -4259:3:2033 -4260:3:2034 -4261:3:2042 -4262:3:2047 -4263:3:2051 -4264:3:2052 -4265:3:2059 -4266:3:2060 -4267:3:2071 -4268:3:2079 -4269:3:2080 -4270:3:2084 -4271:3:2089 -4272:3:2090 -4273:0:2565 -4274:3:2102 -4275:0:2565 -4276:3:2104 -4277:0:2565 -4278:3:2105 -4279:3:2109 -4280:3:2110 -4281:3:2118 -4282:3:2119 -4283:3:2123 -4284:3:2124 -4285:3:2132 -4286:3:2137 -4287:3:2141 -4288:3:2142 -4289:3:2149 -4290:3:2150 -4291:3:2161 -4292:3:2169 -4293:3:2170 -4294:3:2174 -4295:3:2179 -4296:3:2180 -4297:0:2565 -4298:3:2192 -4299:0:2565 -4300:3:2013 -4301:0:2565 -4302:2:467 -4303:0:2565 -4304:2:468 -4305:0:2565 -4306:3:2014 -4307:0:2565 -4308:3:2015 -4309:3:2019 -4310:3:2020 -4311:3:2028 -4312:3:2029 -4313:3:2033 -4314:3:2034 -4315:3:2042 -4316:3:2047 -4317:3:2051 -4318:3:2052 -4319:3:2059 -4320:3:2060 -4321:3:2071 -4322:3:2079 -4323:3:2080 -4324:3:2084 -4325:3:2089 -4326:3:2090 -4327:0:2565 -4328:3:2102 -4329:0:2565 -4330:3:2104 -4331:0:2565 -4332:3:2105 -4333:3:2109 -4334:3:2110 -4335:3:2118 -4336:3:2119 -4337:3:2123 -4338:3:2124 -4339:3:2132 -4340:3:2137 -4341:3:2141 -4342:3:2142 -4343:3:2149 -4344:3:2150 -4345:3:2161 -4346:3:2169 -4347:3:2170 -4348:3:2174 -4349:3:2179 -4350:3:2180 -4351:0:2565 -4352:3:2192 -4353:0:2565 -4354:2:467 -4355:0:2565 -4356:1:336 -4357:0:2565 -4358:3:2013 -4359:0:2565 -4360:2:468 -4361:0:2565 -4362:3:2014 -4363:0:2565 -4364:3:2015 -4365:3:2019 -4366:3:2020 -4367:3:2028 -4368:3:2029 -4369:3:2033 -4370:3:2034 -4371:3:2042 -4372:3:2047 -4373:3:2051 -4374:3:2052 -4375:3:2059 -4376:3:2060 -4377:3:2071 -4378:3:2079 -4379:3:2080 -4380:3:2084 -4381:3:2089 -4382:3:2090 -4383:0:2565 -4384:3:2102 -4385:0:2565 -4386:3:2104 -4387:0:2565 -4388:3:2105 -4389:3:2109 -4390:3:2110 -4391:3:2118 -4392:3:2119 -4393:3:2123 -4394:3:2124 -4395:3:2132 -4396:3:2137 -4397:3:2141 -4398:3:2142 -4399:3:2149 -4400:3:2150 -4401:3:2161 -4402:3:2169 -4403:3:2170 -4404:3:2174 -4405:3:2179 -4406:3:2180 -4407:0:2565 -4408:3:2192 -4409:0:2565 -4410:2:469 -4411:0:2565 -4412:3:2013 -4413:0:2565 -4414:2:475 -4415:0:2565 -4416:2:476 -4417:0:2565 -4418:3:2014 -4419:0:2565 -4420:3:2015 -4421:3:2019 -4422:3:2020 -4423:3:2028 -4424:3:2029 -4425:3:2033 -4426:3:2034 -4427:3:2042 -4428:3:2047 -4429:3:2051 -4430:3:2052 -4431:3:2059 -4432:3:2060 -4433:3:2071 -4434:3:2079 -4435:3:2080 -4436:3:2084 -4437:3:2089 -4438:3:2090 -4439:0:2565 -4440:3:2102 -4441:0:2565 -4442:3:2104 -4443:0:2565 -4444:3:2105 -4445:3:2109 -4446:3:2110 -4447:3:2118 -4448:3:2119 -4449:3:2123 -4450:3:2124 -4451:3:2132 -4452:3:2137 -4453:3:2141 -4454:3:2142 -4455:3:2149 -4456:3:2150 -4457:3:2161 -4458:3:2169 -4459:3:2170 -4460:3:2174 -4461:3:2179 -4462:3:2180 -4463:0:2565 -4464:3:2192 -4465:0:2565 -4466:2:477 -4467:2:481 -4468:2:482 -4469:2:490 -4470:2:491 -4471:2:492 -4472:2:504 -4473:2:509 -4474:2:513 -4475:2:514 -4476:2:521 -4477:2:522 -4478:2:533 -4479:2:534 -4480:2:535 -4481:2:546 -4482:2:551 -4483:2:552 -4484:0:2565 -4485:3:2013 -4486:0:2565 -4487:3:2014 -4488:0:2565 -4489:3:2015 -4490:3:2019 -4491:3:2020 -4492:3:2028 -4493:3:2029 -4494:3:2033 -4495:3:2034 -4496:3:2042 -4497:3:2047 -4498:3:2051 -4499:3:2052 -4500:3:2059 -4501:3:2060 -4502:3:2071 -4503:3:2079 -4504:3:2080 -4505:3:2084 -4506:3:2089 -4507:3:2090 -4508:0:2565 -4509:3:2102 -4510:0:2565 -4511:3:2104 -4512:0:2565 -4513:3:2105 -4514:3:2109 -4515:3:2110 -4516:3:2118 -4517:3:2119 -4518:3:2123 -4519:3:2124 -4520:3:2132 -4521:3:2137 -4522:3:2141 -4523:3:2142 -4524:3:2149 -4525:3:2150 -4526:3:2161 -4527:3:2169 -4528:3:2170 -4529:3:2174 -4530:3:2179 -4531:3:2180 -4532:0:2565 -4533:2:564 -4534:0:2565 -4535:3:2192 -4536:0:2565 -4537:3:2013 -4538:0:2565 -4539:3:2014 -4540:0:2565 -4541:3:2015 -4542:3:2019 -4543:3:2020 -4544:3:2028 -4545:3:2029 -4546:3:2033 -4547:3:2034 -4548:3:2042 -4549:3:2047 -4550:3:2051 -4551:3:2052 -4552:3:2059 -4553:3:2060 -4554:3:2071 -4555:3:2079 -4556:3:2080 -4557:3:2084 -4558:3:2089 -4559:3:2090 -4560:0:2565 -4561:3:2102 -4562:0:2565 -4563:3:2104 -4564:0:2565 -4565:2:565 -4566:2:569 -4567:2:570 -4568:2:578 -4569:2:579 -4570:2:583 -4571:2:584 -4572:2:592 -4573:2:597 -4574:2:601 -4575:2:602 -4576:2:609 -4577:2:610 -4578:2:621 -4579:2:622 -4580:2:623 -4581:2:634 -4582:2:639 -4583:2:640 -4584:0:2565 -4585:2:744 -4586:0:2565 -4587:3:2105 -4588:3:2109 -4589:3:2110 -4590:3:2118 -4591:3:2119 -4592:3:2123 -4593:3:2124 -4594:3:2132 -4595:3:2137 -4596:3:2141 -4597:3:2142 -4598:3:2149 -4599:3:2150 -4600:3:2161 -4601:3:2169 -4602:3:2170 -4603:3:2174 -4604:3:2179 -4605:3:2180 -4606:0:2565 -4607:3:2192 -4608:0:2565 -4609:3:2013 -4610:0:2565 -4611:3:2014 -4612:0:2565 -4613:3:2015 -4614:3:2019 -4615:3:2020 -4616:3:2028 -4617:3:2029 -4618:3:2033 -4619:3:2034 -4620:3:2042 -4621:3:2047 -4622:3:2051 -4623:3:2052 -4624:3:2059 -4625:3:2060 -4626:3:2071 -4627:3:2079 -4628:3:2080 -4629:3:2084 -4630:3:2089 -4631:3:2090 -4632:0:2565 -4633:3:2102 -4634:0:2565 -4635:2:745 -4636:0:2565 -4637:2:750 -4638:0:2565 -4639:2:753 -4640:0:2565 -4641:3:2104 -4642:0:2565 -4643:3:2105 -4644:3:2109 -4645:3:2110 -4646:3:2118 -4647:3:2119 -4648:3:2123 -4649:3:2124 -4650:3:2132 -4651:3:2137 -4652:3:2141 -4653:3:2142 -4654:3:2149 -4655:3:2150 -4656:3:2161 -4657:3:2169 -4658:3:2170 -4659:3:2174 -4660:3:2179 -4661:3:2180 -4662:0:2565 -4663:3:2192 -4664:0:2565 -4665:3:2013 -4666:0:2565 -4667:3:2014 -4668:0:2565 -4669:3:2015 -4670:3:2019 -4671:3:2020 -4672:3:2028 -4673:3:2029 -4674:3:2033 -4675:3:2034 -4676:3:2042 -4677:3:2047 -4678:3:2051 -4679:3:2052 -4680:3:2059 -4681:3:2060 -4682:3:2071 -4683:3:2079 -4684:3:2080 -4685:3:2084 -4686:3:2089 -4687:3:2090 -4688:0:2565 -4689:2:758 -4690:0:2565 -4691:3:2102 -4692:0:2565 -4693:3:2104 -4694:0:2565 -4695:3:2105 -4696:3:2109 -4697:3:2110 -4698:3:2118 -4699:3:2119 -4700:3:2123 -4701:3:2124 -4702:3:2132 -4703:3:2137 -4704:3:2141 -4705:3:2142 -4706:3:2149 -4707:3:2150 -4708:3:2161 -4709:3:2169 -4710:3:2170 -4711:3:2174 -4712:3:2179 -4713:3:2180 -4714:0:2565 -4715:3:2192 -4716:0:2565 -4717:3:2013 -4718:0:2565 -4719:3:2014 -4720:0:2565 -4721:2:759 -4722:0:2565 -4723:3:2015 -4724:3:2019 -4725:3:2020 -4726:3:2028 -4727:3:2029 -4728:3:2033 -4729:3:2034 -4730:3:2042 -4731:3:2047 -4732:3:2051 -4733:3:2052 -4734:3:2059 -4735:3:2060 -4736:3:2071 -4737:3:2079 -4738:3:2080 -4739:3:2084 -4740:3:2089 -4741:3:2090 -4742:0:2565 -4743:3:2102 -4744:0:2565 -4745:3:2104 -4746:0:2565 -4747:3:2105 -4748:3:2109 -4749:3:2110 -4750:3:2118 -4751:3:2119 -4752:3:2123 -4753:3:2124 -4754:3:2132 -4755:3:2137 -4756:3:2141 -4757:3:2142 -4758:3:2149 -4759:3:2150 -4760:3:2161 -4761:3:2169 -4762:3:2170 -4763:3:2174 -4764:3:2179 -4765:3:2180 -4766:0:2565 -4767:3:2192 -4768:0:2565 -4769:3:2013 -4770:0:2565 -4771:2:760 -4772:0:2565 -4773:2:761 -4774:0:2565 -4775:2:762 -4776:0:2565 -4777:2:763 -4778:0:2565 -4779:3:2014 -4780:0:2565 -4781:3:2015 -4782:3:2019 -4783:3:2020 -4784:3:2028 -4785:3:2029 -4786:3:2033 -4787:3:2034 -4788:3:2042 -4789:3:2047 -4790:3:2051 -4791:3:2052 -4792:3:2059 -4793:3:2060 -4794:3:2071 -4795:3:2079 -4796:3:2080 -4797:3:2084 -4798:3:2089 -4799:3:2090 -4800:0:2565 -4801:3:2102 -4802:0:2565 -4803:3:2104 -4804:0:2565 -4805:3:2105 -4806:3:2109 -4807:3:2110 -4808:3:2118 -4809:3:2119 -4810:3:2123 -4811:3:2124 -4812:3:2132 -4813:3:2137 -4814:3:2141 -4815:3:2142 -4816:3:2149 -4817:3:2150 -4818:3:2161 -4819:3:2169 -4820:3:2170 -4821:3:2174 -4822:3:2179 -4823:3:2180 -4824:0:2565 -4825:3:2192 -4826:0:2565 -4827:2:765 -4828:0:2565 -4829:3:2013 -4830:0:2565 -4831:3:2014 -4832:0:2565 -4833:3:2015 -4834:3:2019 -4835:3:2020 -4836:3:2028 -4837:3:2029 -4838:3:2033 -4839:3:2034 -4840:3:2042 -4841:3:2047 -4842:3:2051 -4843:3:2052 -4844:3:2059 -4845:3:2060 -4846:3:2071 -4847:3:2079 -4848:3:2080 -4849:3:2084 -4850:3:2089 -4851:3:2090 -4852:0:2565 -4853:3:2102 -4854:0:2565 -4855:3:2104 -4856:0:2565 -4857:3:2105 -4858:3:2109 -4859:3:2110 -4860:3:2118 -4861:3:2119 -4862:3:2123 -4863:3:2124 -4864:3:2132 -4865:3:2137 -4866:3:2141 -4867:3:2142 -4868:3:2149 -4869:3:2150 -4870:3:2161 -4871:3:2169 -4872:3:2170 -4873:3:2174 -4874:3:2179 -4875:3:2180 -4876:0:2565 -4877:2:766 -4878:2:770 -4879:2:771 -4880:2:779 -4881:2:780 -4882:2:781 -4883:2:793 -4884:2:798 -4885:2:802 -4886:2:803 -4887:2:810 -4888:2:811 -4889:2:822 -4890:2:823 -4891:2:824 -4892:2:835 -4893:2:840 -4894:2:841 -4895:0:2565 -4896:3:2192 -4897:0:2565 -4898:3:2013 -4899:0:2565 -4900:3:2014 -4901:0:2565 -4902:3:2015 -4903:3:2019 -4904:3:2020 -4905:3:2028 -4906:3:2029 -4907:3:2033 -4908:3:2034 -4909:3:2042 -4910:3:2047 -4911:3:2051 -4912:3:2052 -4913:3:2059 -4914:3:2060 -4915:3:2071 -4916:3:2079 -4917:3:2080 -4918:3:2084 -4919:3:2089 -4920:3:2090 -4921:0:2565 -4922:3:2102 -4923:0:2565 -4924:3:2104 -4925:0:2565 -4926:2:853 -4927:0:2565 -4928:2:857 -4929:0:2565 -4930:2:465 -4931:0:2565 -4932:3:2105 -4933:3:2109 -4934:3:2110 -4935:3:2118 -4936:3:2119 -4937:3:2123 -4938:3:2124 -4939:3:2132 -4940:3:2137 -4941:3:2141 -4942:3:2142 -4943:3:2149 -4944:3:2150 -4945:3:2161 -4946:3:2169 -4947:3:2170 -4948:3:2174 -4949:3:2179 -4950:3:2180 -4951:0:2565 -4952:3:2192 -4953:0:2565 -4954:3:2013 -4955:0:2565 -4956:3:2014 -4957:0:2565 -4958:3:2015 -4959:3:2019 -4960:3:2020 -4961:3:2028 -4962:3:2029 -4963:3:2033 -4964:3:2034 -4965:3:2042 -4966:3:2047 -4967:3:2051 -4968:3:2052 -4969:3:2059 -4970:3:2060 -4971:3:2071 -4972:3:2079 -4973:3:2080 -4974:3:2084 -4975:3:2089 -4976:3:2090 -4977:0:2565 -4978:3:2102 -4979:0:2565 -4980:2:466 -4981:0:2565 -4982:3:2104 -4983:0:2565 -4984:3:2105 -4985:3:2109 -4986:3:2110 -4987:3:2118 -4988:3:2119 -4989:3:2123 -4990:3:2124 -4991:3:2132 -4992:3:2137 -4993:3:2141 -4994:3:2142 -4995:3:2149 -4996:3:2150 -4997:3:2161 -4998:3:2169 -4999:3:2170 -5000:3:2174 -5001:3:2179 -5002:3:2180 -5003:0:2565 -5004:3:2192 -5005:0:2565 -5006:3:2013 -5007:0:2565 -5008:3:2014 -5009:0:2565 -5010:3:2015 -5011:3:2019 -5012:3:2020 -5013:3:2028 -5014:3:2029 -5015:3:2033 -5016:3:2034 -5017:3:2042 -5018:3:2047 -5019:3:2051 -5020:3:2052 -5021:3:2059 -5022:3:2060 -5023:3:2071 -5024:3:2079 -5025:3:2080 -5026:3:2084 -5027:3:2089 -5028:3:2090 -5029:0:2565 -5030:2:467 -5031:0:2565 -5032:3:2102 -5033:0:2565 -5034:3:2104 -5035:0:2565 -5036:3:2105 -5037:3:2109 -5038:3:2110 -5039:3:2118 -5040:3:2119 -5041:3:2123 -5042:3:2124 -5043:3:2132 -5044:3:2137 -5045:3:2141 -5046:3:2142 -5047:3:2149 -5048:3:2150 -5049:3:2161 -5050:3:2169 -5051:3:2170 -5052:3:2174 -5053:3:2179 -5054:3:2180 -5055:0:2565 -5056:3:2192 -5057:0:2565 -5058:3:2013 -5059:0:2565 -5060:3:2014 -5061:0:2565 -5062:1:339 -5063:0:2565 -5064:2:468 -5065:0:2565 -5066:3:2015 -5067:3:2019 -5068:3:2020 -5069:3:2028 -5070:3:2029 -5071:3:2033 -5072:3:2034 -5073:3:2042 -5074:3:2047 -5075:3:2051 -5076:3:2052 -5077:3:2059 -5078:3:2060 -5079:3:2071 -5080:3:2079 -5081:3:2080 -5082:3:2084 -5083:3:2089 -5084:3:2090 -5085:0:2565 -5086:3:2102 -5087:0:2565 -5088:3:2104 -5089:0:2565 -5090:3:2105 -5091:3:2109 -5092:3:2110 -5093:3:2118 -5094:3:2119 -5095:3:2123 -5096:3:2124 -5097:3:2132 -5098:3:2137 -5099:3:2141 -5100:3:2142 -5101:3:2149 -5102:3:2150 -5103:3:2161 -5104:3:2169 -5105:3:2170 -5106:3:2174 -5107:3:2179 -5108:3:2180 -5109:0:2565 -5110:3:2192 -5111:0:2565 -5112:3:2013 -5113:0:2565 -5114:3:2014 -5115:0:2565 -5116:2:467 -5117:0:2565 -5118:2:468 -5119:0:2565 -5120:3:2015 -5121:3:2019 -5122:3:2020 -5123:3:2028 -5124:3:2029 -5125:3:2033 -5126:3:2034 -5127:3:2042 -5128:3:2047 -5129:3:2051 -5130:3:2052 -5131:3:2059 -5132:3:2060 -5133:3:2071 -5134:3:2079 -5135:3:2080 -5136:3:2084 -5137:3:2089 -5138:3:2090 -5139:0:2565 -5140:3:2102 -5141:0:2565 -5142:3:2104 -5143:0:2565 -5144:3:2105 -5145:3:2109 -5146:3:2110 -5147:3:2118 -5148:3:2119 -5149:3:2123 -5150:3:2124 -5151:3:2132 -5152:3:2137 -5153:3:2141 -5154:3:2142 -5155:3:2149 -5156:3:2150 -5157:3:2161 -5158:3:2169 -5159:3:2170 -5160:3:2174 -5161:3:2179 -5162:3:2180 -5163:0:2565 -5164:3:2192 -5165:0:2565 -5166:3:2013 -5167:0:2565 -5168:2:467 -5169:0:2565 -5170:1:345 -5171:0:2565 -5172:2:468 -5173:0:2565 -5174:3:2014 -5175:0:2565 -5176:3:2015 -5177:3:2019 -5178:3:2020 -5179:3:2028 -5180:3:2029 -5181:3:2033 -5182:3:2034 -5183:3:2042 -5184:3:2047 -5185:3:2051 -5186:3:2052 -5187:3:2059 -5188:3:2060 -5189:3:2071 -5190:3:2079 -5191:3:2080 -5192:3:2084 -5193:3:2089 -5194:3:2090 -5195:0:2565 -5196:3:2102 -5197:0:2565 -5198:3:2104 -5199:0:2565 -5200:3:2105 -5201:3:2109 -5202:3:2110 -5203:3:2118 -5204:3:2119 -5205:3:2123 -5206:3:2124 -5207:3:2132 -5208:3:2137 -5209:3:2141 -5210:3:2142 -5211:3:2149 -5212:3:2150 -5213:3:2161 -5214:3:2169 -5215:3:2170 -5216:3:2174 -5217:3:2179 -5218:3:2180 -5219:0:2565 -5220:3:2192 -5221:0:2565 -5222:3:2013 -5223:0:2565 -5224:2:467 -5225:0:2565 -5226:2:468 -5227:0:2565 -5228:3:2014 -5229:0:2565 -5230:3:2015 -5231:3:2019 -5232:3:2020 -5233:3:2028 -5234:3:2029 -5235:3:2033 -5236:3:2034 -5237:3:2042 -5238:3:2047 -5239:3:2051 -5240:3:2052 -5241:3:2059 -5242:3:2060 -5243:3:2071 -5244:3:2079 -5245:3:2080 -5246:3:2084 -5247:3:2089 -5248:3:2090 -5249:0:2565 -5250:3:2102 -5251:0:2565 -5252:3:2104 -5253:0:2565 -5254:3:2105 -5255:3:2109 -5256:3:2110 -5257:3:2118 -5258:3:2119 -5259:3:2123 -5260:3:2124 -5261:3:2132 -5262:3:2137 -5263:3:2141 -5264:3:2142 -5265:3:2149 -5266:3:2150 -5267:3:2161 -5268:3:2169 -5269:3:2170 -5270:3:2174 -5271:3:2179 -5272:3:2180 -5273:0:2565 -5274:3:2192 -5275:0:2565 -5276:2:467 -5277:0:2565 -5278:1:346 -5279:1:350 -5280:1:351 -5281:1:359 -5282:1:360 -5283:1:361 -5284:1:373 -5285:1:378 -5286:1:382 -5287:1:383 -5288:1:390 -5289:1:391 -5290:1:402 -5291:1:403 -5292:1:404 -5293:1:415 -5294:1:420 -5295:1:421 -5296:0:2565 -5297:3:2013 -5298:0:2565 -5299:2:468 -5300:0:2565 -5301:3:2014 -5302:0:2565 -5303:3:2015 -5304:3:2019 -5305:3:2020 -5306:3:2028 -5307:3:2029 -5308:3:2033 -5309:3:2034 -5310:3:2042 -5311:3:2047 -5312:3:2051 -5313:3:2052 -5314:3:2059 -5315:3:2060 -5316:3:2071 -5317:3:2079 -5318:3:2080 -5319:3:2084 -5320:3:2089 -5321:3:2090 -5322:0:2565 -5323:3:2102 -5324:0:2565 -5325:3:2104 -5326:0:2565 -5327:3:2105 -5328:3:2109 -5329:3:2110 -5330:3:2118 -5331:3:2119 -5332:3:2123 -5333:3:2124 -5334:3:2132 -5335:3:2137 -5336:3:2141 -5337:3:2142 -5338:3:2149 -5339:3:2150 -5340:3:2161 -5341:3:2169 -5342:3:2170 -5343:3:2174 -5344:3:2179 -5345:3:2180 -5346:0:2565 -5347:3:2192 -5348:0:2565 -5349:2:467 -5350:0:2565 -5351:3:2013 -5352:0:2565 -5353:3:2014 -5354:0:2565 -5355:3:2015 -5356:3:2019 -5357:3:2020 -5358:3:2028 -5359:3:2029 -5360:3:2033 -5361:3:2034 -5362:3:2042 -5363:3:2047 -5364:3:2051 -5365:3:2052 -5366:3:2059 -5367:3:2060 -5368:3:2071 -5369:3:2079 -5370:3:2080 -5371:3:2084 -5372:3:2089 -5373:3:2090 -5374:0:2565 -5375:3:2102 -5376:0:2565 -5377:3:2104 -5378:0:2565 -5379:3:2105 -5380:3:2109 -5381:3:2110 -5382:3:2118 -5383:3:2119 -5384:3:2123 -5385:3:2124 -5386:3:2132 -5387:3:2137 -5388:3:2141 -5389:3:2142 -5390:3:2149 -5391:3:2150 -5392:3:2161 -5393:3:2169 -5394:3:2170 -5395:3:2174 -5396:3:2179 -5397:3:2180 -5398:0:2565 -5399:1:433 -5400:0:2565 -5401:3:2192 -5402:0:2565 -5403:3:2013 -5404:0:2565 -5405:2:468 -5406:0:2565 -5407:3:2014 -5408:0:2565 -5409:3:2015 -5410:3:2019 -5411:3:2020 -5412:3:2028 -5413:3:2029 -5414:3:2033 -5415:3:2034 -5416:3:2042 -5417:3:2047 -5418:3:2051 -5419:3:2052 -5420:3:2059 -5421:3:2060 -5422:3:2071 -5423:3:2079 -5424:3:2080 -5425:3:2084 -5426:3:2089 -5427:3:2090 -5428:0:2565 -5429:3:2102 -5430:0:2565 -5431:3:2104 -5432:0:2565 -5433:3:2105 -5434:3:2109 -5435:3:2110 -5436:3:2118 -5437:3:2119 -5438:3:2123 -5439:3:2124 -5440:3:2132 -5441:3:2137 -5442:3:2141 -5443:3:2142 -5444:3:2149 -5445:3:2150 -5446:3:2161 -5447:3:2169 -5448:3:2170 -5449:3:2174 -5450:3:2179 -5451:3:2180 -5452:0:2565 -5453:3:2192 -5454:0:2565 -5455:2:469 -5456:0:2565 -5457:3:2013 -5458:0:2565 -5459:2:475 -5460:0:2565 -5461:2:476 -5462:0:2565 -5463:3:2014 -5464:0:2565 -5465:3:2015 -5466:3:2019 -5467:3:2020 -5468:3:2028 -5469:3:2029 -5470:3:2033 -5471:3:2034 -5472:3:2042 -5473:3:2047 -5474:3:2051 -5475:3:2052 -5476:3:2059 -5477:3:2060 -5478:3:2071 -5479:3:2079 -5480:3:2080 -5481:3:2084 -5482:3:2089 -5483:3:2090 -5484:0:2565 -5485:3:2102 -5486:0:2565 -5487:3:2104 -5488:0:2565 -5489:3:2105 -5490:3:2109 -5491:3:2110 -5492:3:2118 -5493:3:2119 -5494:3:2123 -5495:3:2124 -5496:3:2132 -5497:3:2137 -5498:3:2141 -5499:3:2142 -5500:3:2149 -5501:3:2150 -5502:3:2161 -5503:3:2169 -5504:3:2170 -5505:3:2174 -5506:3:2179 -5507:3:2180 -5508:0:2565 -5509:3:2192 -5510:0:2565 -5511:2:477 -5512:2:481 -5513:2:482 -5514:2:490 -5515:2:491 -5516:2:495 -5517:2:496 -5518:2:504 -5519:2:509 -5520:2:513 -5521:2:514 -5522:2:521 -5523:2:522 -5524:2:533 -5525:2:534 -5526:2:535 -5527:2:546 -5528:2:551 -5529:2:552 -5530:0:2565 -5531:3:2013 -5532:0:2565 -5533:3:2014 -5534:0:2565 -5535:3:2015 -5536:3:2019 -5537:3:2020 -5538:3:2028 -5539:3:2029 -5540:3:2033 -5541:3:2034 -5542:3:2042 -5543:3:2047 -5544:3:2051 -5545:3:2052 -5546:3:2059 -5547:3:2060 -5548:3:2071 -5549:3:2079 -5550:3:2080 -5551:3:2084 -5552:3:2089 -5553:3:2090 -5554:0:2565 -5555:3:2102 -5556:0:2565 -5557:3:2104 -5558:0:2565 -5559:3:2105 -5560:3:2109 -5561:3:2110 -5562:3:2118 -5563:3:2119 -5564:3:2123 -5565:3:2124 -5566:3:2132 -5567:3:2137 -5568:3:2141 -5569:3:2142 -5570:3:2149 -5571:3:2150 -5572:3:2161 -5573:3:2169 -5574:3:2170 -5575:3:2174 -5576:3:2179 -5577:3:2180 -5578:0:2565 -5579:2:564 -5580:0:2565 -5581:3:2192 -5582:0:2565 -5583:3:2013 -5584:0:2565 -5585:3:2014 -5586:0:2565 -5587:3:2015 -5588:3:2019 -5589:3:2020 -5590:3:2028 -5591:3:2029 -5592:3:2033 -5593:3:2034 -5594:3:2042 -5595:3:2047 -5596:3:2051 -5597:3:2052 -5598:3:2059 -5599:3:2060 -5600:3:2071 -5601:3:2079 -5602:3:2080 -5603:3:2084 -5604:3:2089 -5605:3:2090 -5606:0:2565 -5607:3:2102 -5608:0:2565 -5609:3:2104 -5610:0:2565 -5611:2:565 -5612:2:569 -5613:2:570 -5614:2:578 -5615:2:579 -5616:2:583 -5617:2:584 -5618:2:592 -5619:2:597 -5620:2:601 -5621:2:602 -5622:2:609 -5623:2:610 -5624:2:621 -5625:2:622 -5626:2:623 -5627:2:634 -5628:2:639 -5629:2:640 -5630:0:2565 -5631:2:744 -5632:0:2565 -5633:3:2105 -5634:3:2109 -5635:3:2110 -5636:3:2118 -5637:3:2119 -5638:3:2123 -5639:3:2124 -5640:3:2132 -5641:3:2137 -5642:3:2141 -5643:3:2142 -5644:3:2149 -5645:3:2150 -5646:3:2161 -5647:3:2169 -5648:3:2170 -5649:3:2174 -5650:3:2179 -5651:3:2180 -5652:0:2565 -5653:3:2192 -5654:0:2565 -5655:3:2013 -5656:0:2565 -5657:3:2014 -5658:0:2565 -5659:3:2015 -5660:3:2019 -5661:3:2020 -5662:3:2028 -5663:3:2029 -5664:3:2033 -5665:3:2034 -5666:3:2042 -5667:3:2047 -5668:3:2051 -5669:3:2052 -5670:3:2059 -5671:3:2060 -5672:3:2071 -5673:3:2079 -5674:3:2080 -5675:3:2084 -5676:3:2089 -5677:3:2090 -5678:0:2565 -5679:3:2102 -5680:0:2565 -5681:2:745 -5682:0:2565 -5683:2:750 -5684:0:2565 -5685:2:753 -5686:0:2565 -5687:3:2104 -5688:0:2565 -5689:3:2105 -5690:3:2109 -5691:3:2110 -5692:3:2118 -5693:3:2119 -5694:3:2123 -5695:3:2124 -5696:3:2132 -5697:3:2137 -5698:3:2141 -5699:3:2142 -5700:3:2149 -5701:3:2150 -5702:3:2161 -5703:3:2169 -5704:3:2170 -5705:3:2174 -5706:3:2179 -5707:3:2180 -5708:0:2565 -5709:3:2192 -5710:0:2565 -5711:3:2013 -5712:0:2565 -5713:3:2014 -5714:0:2565 -5715:3:2015 -5716:3:2019 -5717:3:2020 -5718:3:2028 -5719:3:2029 -5720:3:2033 -5721:3:2034 -5722:3:2042 -5723:3:2047 -5724:3:2051 -5725:3:2052 -5726:3:2059 -5727:3:2060 -5728:3:2071 -5729:3:2079 -5730:3:2080 -5731:3:2084 -5732:3:2089 -5733:3:2090 -5734:0:2565 -5735:2:758 -5736:0:2565 -5737:3:2102 -5738:0:2565 -5739:3:2104 -5740:0:2565 -5741:3:2105 -5742:3:2109 -5743:3:2110 -5744:3:2118 -5745:3:2119 -5746:3:2123 -5747:3:2124 -5748:3:2132 -5749:3:2137 -5750:3:2141 -5751:3:2142 -5752:3:2149 -5753:3:2150 -5754:3:2161 -5755:3:2169 -5756:3:2170 -5757:3:2174 -5758:3:2179 -5759:3:2180 -5760:0:2565 -5761:3:2192 -5762:0:2565 -5763:3:2013 -5764:0:2565 -5765:3:2014 -5766:0:2565 -5767:2:759 -5768:0:2565 -5769:3:2015 -5770:3:2019 -5771:3:2020 -5772:3:2028 -5773:3:2029 -5774:3:2033 -5775:3:2034 -5776:3:2042 -5777:3:2047 -5778:3:2051 -5779:3:2052 -5780:3:2059 -5781:3:2060 -5782:3:2071 -5783:3:2079 -5784:3:2080 -5785:3:2084 -5786:3:2089 -5787:3:2090 -5788:0:2565 -5789:3:2102 -5790:0:2565 -5791:3:2104 -5792:0:2565 -5793:3:2105 -5794:3:2109 -5795:3:2110 -5796:3:2118 -5797:3:2119 -5798:3:2123 -5799:3:2124 -5800:3:2132 -5801:3:2137 -5802:3:2141 -5803:3:2142 -5804:3:2149 -5805:3:2150 -5806:3:2161 -5807:3:2169 -5808:3:2170 -5809:3:2174 -5810:3:2179 -5811:3:2180 -5812:0:2565 -5813:3:2192 -5814:0:2565 -5815:3:2013 -5816:0:2565 -5817:2:760 -5818:0:2565 -5819:2:761 -5820:0:2565 -5821:2:762 -5822:0:2565 -5823:2:763 -5824:0:2565 -5825:3:2014 -5826:0:2565 -5827:3:2015 -5828:3:2019 -5829:3:2020 -5830:3:2028 -5831:3:2029 -5832:3:2033 -5833:3:2034 -5834:3:2042 -5835:3:2047 -5836:3:2051 -5837:3:2052 -5838:3:2059 -5839:3:2060 -5840:3:2071 -5841:3:2079 -5842:3:2080 -5843:3:2084 -5844:3:2089 -5845:3:2090 -5846:0:2565 -5847:3:2102 -5848:0:2565 -5849:3:2104 -5850:0:2565 -5851:3:2105 -5852:3:2109 -5853:3:2110 -5854:3:2118 -5855:3:2119 -5856:3:2123 -5857:3:2124 -5858:3:2132 -5859:3:2137 -5860:3:2141 -5861:3:2142 -5862:3:2149 -5863:3:2150 -5864:3:2161 -5865:3:2169 -5866:3:2170 -5867:3:2174 -5868:3:2179 -5869:3:2180 -5870:0:2565 -5871:3:2192 -5872:0:2565 -5873:2:765 -5874:0:2565 -5875:3:2013 -5876:0:2565 -5877:3:2014 -5878:0:2565 -5879:3:2015 -5880:3:2019 -5881:3:2020 -5882:3:2028 -5883:3:2029 -5884:3:2033 -5885:3:2034 -5886:3:2042 -5887:3:2047 -5888:3:2051 -5889:3:2052 -5890:3:2059 -5891:3:2060 -5892:3:2071 -5893:3:2079 -5894:3:2080 -5895:3:2084 -5896:3:2089 -5897:3:2090 -5898:0:2565 -5899:3:2102 -5900:0:2565 -5901:3:2104 -5902:0:2565 -5903:3:2105 -5904:3:2109 -5905:3:2110 -5906:3:2118 -5907:3:2119 -5908:3:2123 -5909:3:2124 -5910:3:2132 -5911:3:2137 -5912:3:2141 -5913:3:2142 -5914:3:2149 -5915:3:2150 -5916:3:2161 -5917:3:2169 -5918:3:2170 -5919:3:2174 -5920:3:2179 -5921:3:2180 -5922:0:2565 -5923:2:766 -5924:2:770 -5925:2:771 -5926:2:779 -5927:2:780 -5928:2:781 -5929:2:793 -5930:2:798 -5931:2:802 -5932:2:803 -5933:2:810 -5934:2:811 -5935:2:822 -5936:2:823 -5937:2:824 -5938:2:835 -5939:2:840 -5940:2:841 -5941:0:2565 -5942:3:2192 -5943:0:2565 -5944:3:2013 -5945:0:2565 -5946:3:2014 -5947:0:2565 -5948:3:2015 -5949:3:2019 -5950:3:2020 -5951:3:2028 -5952:3:2029 -5953:3:2033 -5954:3:2034 -5955:3:2042 -5956:3:2047 -5957:3:2051 -5958:3:2052 -5959:3:2059 -5960:3:2060 -5961:3:2071 -5962:3:2079 -5963:3:2080 -5964:3:2084 -5965:3:2089 -5966:3:2090 -5967:0:2565 -5968:3:2102 -5969:0:2565 -5970:3:2104 -5971:0:2565 -5972:2:853 -5973:0:2565 -5974:2:857 -5975:0:2565 -5976:2:465 -5977:0:2565 -5978:3:2105 -5979:3:2109 -5980:3:2110 -5981:3:2118 -5982:3:2119 -5983:3:2123 -5984:3:2124 -5985:3:2132 -5986:3:2137 -5987:3:2141 -5988:3:2142 -5989:3:2149 -5990:3:2150 -5991:3:2161 -5992:3:2169 -5993:3:2170 -5994:3:2174 -5995:3:2179 -5996:3:2180 -5997:0:2565 -5998:3:2192 -5999:0:2565 -6000:3:2013 -6001:0:2565 -6002:3:2014 -6003:0:2565 -6004:3:2015 -6005:3:2019 -6006:3:2020 -6007:3:2028 -6008:3:2029 -6009:3:2033 -6010:3:2034 -6011:3:2042 -6012:3:2047 -6013:3:2051 -6014:3:2052 -6015:3:2059 -6016:3:2060 -6017:3:2071 -6018:3:2079 -6019:3:2080 -6020:3:2084 -6021:3:2089 -6022:3:2090 -6023:0:2565 -6024:3:2102 -6025:0:2565 -6026:2:466 -6027:0:2565 -6028:3:2104 -6029:0:2565 -6030:3:2105 -6031:3:2109 -6032:3:2110 -6033:3:2118 -6034:3:2119 -6035:3:2123 -6036:3:2124 -6037:3:2132 -6038:3:2137 -6039:3:2141 -6040:3:2142 -6041:3:2149 -6042:3:2150 -6043:3:2161 -6044:3:2169 -6045:3:2170 -6046:3:2174 -6047:3:2179 -6048:3:2180 -6049:0:2565 -6050:3:2192 -6051:0:2565 -6052:3:2013 -6053:0:2565 -6054:3:2014 -6055:0:2565 -6056:3:2015 -6057:3:2019 -6058:3:2020 -6059:3:2028 -6060:3:2029 -6061:3:2033 -6062:3:2034 -6063:3:2042 -6064:3:2047 -6065:3:2051 -6066:3:2052 -6067:3:2059 -6068:3:2060 -6069:3:2071 -6070:3:2079 -6071:3:2080 -6072:3:2084 -6073:3:2089 -6074:3:2090 -6075:0:2565 -6076:2:467 -6077:0:2565 -6078:3:2102 -6079:0:2565 -6080:3:2104 -6081:0:2565 -6082:3:2105 -6083:3:2109 -6084:3:2110 -6085:3:2118 -6086:3:2119 -6087:3:2123 -6088:3:2124 -6089:3:2132 -6090:3:2137 -6091:3:2141 -6092:3:2142 -6093:3:2149 -6094:3:2150 -6095:3:2161 -6096:3:2169 -6097:3:2170 -6098:3:2174 -6099:3:2179 -6100:3:2180 -6101:0:2565 -6102:3:2192 -6103:0:2565 -6104:3:2013 -6105:0:2565 -6106:3:2014 -6107:0:2565 -6108:1:436 -6109:0:2565 -6110:2:468 -6111:0:2565 -6112:3:2015 -6113:3:2019 -6114:3:2020 -6115:3:2028 -6116:3:2029 -6117:3:2033 -6118:3:2034 -6119:3:2042 -6120:3:2047 -6121:3:2051 -6122:3:2052 -6123:3:2059 -6124:3:2060 -6125:3:2071 -6126:3:2079 -6127:3:2080 -6128:3:2084 -6129:3:2089 -6130:3:2090 -6131:0:2565 -6132:3:2102 -6133:0:2565 -6134:3:2104 -6135:0:2565 -6136:3:2105 -6137:3:2109 -6138:3:2110 -6139:3:2118 -6140:3:2119 -6141:3:2123 -6142:3:2124 -6143:3:2132 -6144:3:2137 -6145:3:2141 -6146:3:2142 -6147:3:2149 -6148:3:2150 -6149:3:2161 -6150:3:2169 -6151:3:2170 -6152:3:2174 -6153:3:2179 -6154:3:2180 -6155:0:2565 -6156:3:2192 -6157:0:2565 -6158:3:2013 -6159:0:2565 -6160:3:2014 -6161:0:2565 -6162:2:467 -6163:0:2565 -6164:2:468 -6165:0:2565 -6166:3:2015 -6167:3:2019 -6168:3:2020 -6169:3:2028 -6170:3:2029 -6171:3:2033 -6172:3:2034 -6173:3:2042 -6174:3:2047 -6175:3:2051 -6176:3:2052 -6177:3:2059 -6178:3:2060 -6179:3:2071 -6180:3:2079 -6181:3:2080 -6182:3:2084 -6183:3:2089 -6184:3:2090 -6185:0:2565 -6186:3:2102 -6187:0:2565 -6188:3:2104 -6189:0:2565 -6190:3:2105 -6191:3:2109 -6192:3:2110 -6193:3:2118 -6194:3:2119 -6195:3:2123 -6196:3:2124 -6197:3:2132 -6198:3:2137 -6199:3:2141 -6200:3:2142 -6201:3:2149 -6202:3:2150 -6203:3:2161 -6204:3:2169 -6205:3:2170 -6206:3:2174 -6207:3:2179 -6208:3:2180 -6209:0:2565 -6210:3:2192 -6211:0:2565 -6212:3:2013 -6213:0:2565 -6214:2:467 -6215:0:2565 -6216:1:442 -6217:0:2565 -6218:2:468 -6219:0:2565 -6220:1:446 -6221:0:2565 -6222:1:9 -6223:0:2565 -6224:1:10 -6225:0:2565 -6226:1:11 -6227:0:2565 -6228:3:2014 -6229:0:2565 -6230:3:2015 -6231:3:2019 -6232:3:2020 -6233:3:2028 -6234:3:2029 -6235:3:2033 -6236:3:2034 -6237:3:2042 -6238:3:2047 -6239:3:2051 -6240:3:2052 -6241:3:2059 -6242:3:2060 -6243:3:2071 -6244:3:2079 -6245:3:2080 -6246:3:2084 -6247:3:2089 -6248:3:2090 -6249:0:2565 -6250:3:2102 -6251:0:2565 -6252:3:2104 -6253:0:2565 -6254:3:2105 -6255:3:2109 -6256:3:2110 -6257:3:2118 -6258:3:2119 -6259:3:2123 -6260:3:2124 -6261:3:2132 -6262:3:2137 -6263:3:2141 -6264:3:2142 -6265:3:2149 -6266:3:2150 -6267:3:2161 -6268:3:2169 -6269:3:2170 -6270:3:2174 -6271:3:2179 -6272:3:2180 -6273:0:2565 -6274:3:2192 -6275:0:2565 -6276:3:2013 -6277:0:2565 -6278:2:467 -6279:0:2565 -6280:2:468 -6281:0:2565 -6282:3:2014 -6283:0:2565 -6284:3:2015 -6285:3:2019 -6286:3:2020 -6287:3:2028 -6288:3:2029 -6289:3:2033 -6290:3:2034 -6291:3:2042 -6292:3:2047 -6293:3:2051 -6294:3:2052 -6295:3:2059 -6296:3:2060 -6297:3:2071 -6298:3:2079 -6299:3:2080 -6300:3:2084 -6301:3:2089 -6302:3:2090 -6303:0:2565 -6304:3:2102 -6305:0:2565 -6306:3:2104 -6307:0:2565 -6308:3:2105 -6309:3:2109 -6310:3:2110 -6311:3:2118 -6312:3:2119 -6313:3:2123 -6314:3:2124 -6315:3:2132 -6316:3:2137 -6317:3:2141 -6318:3:2142 -6319:3:2149 -6320:3:2150 -6321:3:2161 -6322:3:2169 -6323:3:2170 -6324:3:2174 -6325:3:2179 -6326:3:2180 -6327:0:2565 -6328:3:2192 -6329:0:2565 -6330:2:467 -6331:0:2565 -6332:1:12 -6333:1:16 -6334:1:17 -6335:1:25 -6336:1:26 -6337:1:27 -6338:1:39 -6339:1:44 -6340:1:48 -6341:1:49 -6342:1:56 -6343:1:57 -6344:1:68 -6345:1:69 -6346:1:70 -6347:1:81 -6348:1:86 -6349:1:87 -6350:0:2565 -6351:3:2013 -6352:0:2565 -6353:2:468 -6354:0:2565 -6355:3:2014 -6356:0:2565 -6357:3:2015 -6358:3:2019 -6359:3:2020 -6360:3:2028 -6361:3:2029 -6362:3:2033 -6363:3:2034 -6364:3:2042 -6365:3:2047 -6366:3:2051 -6367:3:2052 -6368:3:2059 -6369:3:2060 -6370:3:2071 -6371:3:2079 -6372:3:2080 -6373:3:2084 -6374:3:2089 -6375:3:2090 -6376:0:2565 -6377:3:2102 -6378:0:2565 -6379:3:2104 -6380:0:2565 -6381:3:2105 -6382:3:2109 -6383:3:2110 -6384:3:2118 -6385:3:2119 -6386:3:2123 -6387:3:2124 -6388:3:2132 -6389:3:2137 -6390:3:2141 -6391:3:2142 -6392:3:2149 -6393:3:2150 -6394:3:2161 -6395:3:2169 -6396:3:2170 -6397:3:2174 -6398:3:2179 -6399:3:2180 -6400:0:2565 -6401:3:2192 -6402:0:2565 -6403:2:467 -6404:0:2565 -6405:3:2013 -6406:0:2565 -6407:3:2014 -6408:0:2565 -6409:3:2015 -6410:3:2019 -6411:3:2020 -6412:3:2028 -6413:3:2029 -6414:3:2033 -6415:3:2034 -6416:3:2042 -6417:3:2047 -6418:3:2051 -6419:3:2052 -6420:3:2059 -6421:3:2060 -6422:3:2071 -6423:3:2079 -6424:3:2080 -6425:3:2084 -6426:3:2089 -6427:3:2090 -6428:0:2565 -6429:3:2102 -6430:0:2565 -6431:3:2104 -6432:0:2565 -6433:3:2105 -6434:3:2109 -6435:3:2110 -6436:3:2118 -6437:3:2119 -6438:3:2123 -6439:3:2124 -6440:3:2132 -6441:3:2137 -6442:3:2141 -6443:3:2142 -6444:3:2149 -6445:3:2150 -6446:3:2161 -6447:3:2169 -6448:3:2170 -6449:3:2174 -6450:3:2179 -6451:3:2180 -6452:0:2565 -6453:1:99 -6454:0:2565 -6455:3:2192 -6456:0:2565 -6457:3:2013 -6458:0:2565 -6459:2:468 -6460:0:2565 -6461:3:2014 -6462:0:2565 -6463:3:2015 -6464:3:2019 -6465:3:2020 -6466:3:2028 -6467:3:2029 -6468:3:2033 -6469:3:2034 -6470:3:2042 -6471:3:2047 -6472:3:2051 -6473:3:2052 -6474:3:2059 -6475:3:2060 -6476:3:2071 -6477:3:2079 -6478:3:2080 -6479:3:2084 -6480:3:2089 -6481:3:2090 -6482:0:2565 -6483:3:2102 -6484:0:2565 -6485:3:2104 -6486:0:2565 -6487:3:2105 -6488:3:2109 -6489:3:2110 -6490:3:2118 -6491:3:2119 -6492:3:2123 -6493:3:2124 -6494:3:2132 -6495:3:2137 -6496:3:2141 -6497:3:2142 -6498:3:2149 -6499:3:2150 -6500:3:2161 -6501:3:2169 -6502:3:2170 -6503:3:2174 -6504:3:2179 -6505:3:2180 -6506:0:2565 -6507:3:2192 -6508:0:2565 -6509:2:469 -6510:0:2565 -6511:3:2013 -6512:0:2565 -6513:2:475 -6514:0:2565 -6515:2:476 -6516:0:2565 -6517:3:2014 -6518:0:2565 -6519:3:2015 -6520:3:2019 -6521:3:2020 -6522:3:2028 -6523:3:2029 -6524:3:2033 -6525:3:2034 -6526:3:2042 -6527:3:2047 -6528:3:2051 -6529:3:2052 -6530:3:2059 -6531:3:2060 -6532:3:2071 -6533:3:2079 -6534:3:2080 -6535:3:2084 -6536:3:2089 -6537:3:2090 -6538:0:2565 -6539:3:2102 -6540:0:2565 -6541:3:2104 -6542:0:2565 -6543:3:2105 -6544:3:2109 -6545:3:2110 -6546:3:2118 -6547:3:2119 -6548:3:2123 -6549:3:2124 -6550:3:2132 -6551:3:2137 -6552:3:2141 -6553:3:2142 -6554:3:2149 -6555:3:2150 -6556:3:2161 -6557:3:2169 -6558:3:2170 -6559:3:2174 -6560:3:2179 -6561:3:2180 -6562:0:2565 -6563:3:2192 -6564:0:2565 -6565:2:477 -6566:2:481 -6567:2:482 -6568:2:490 -6569:2:491 -6570:2:495 -6571:2:496 -6572:2:504 -6573:2:509 -6574:2:513 -6575:2:514 -6576:2:521 -6577:2:522 -6578:2:533 -6579:2:534 -6580:2:535 -6581:2:546 -6582:2:551 -6583:2:552 -6584:0:2565 -6585:3:2013 -6586:0:2565 -6587:3:2014 -6588:0:2565 -6589:3:2015 -6590:3:2019 -6591:3:2020 -6592:3:2028 -6593:3:2029 -6594:3:2033 -6595:3:2034 -6596:3:2042 -6597:3:2047 -6598:3:2051 -6599:3:2052 -6600:3:2059 -6601:3:2060 -6602:3:2071 -6603:3:2079 -6604:3:2080 -6605:3:2084 -6606:3:2089 -6607:3:2090 -6608:0:2565 -6609:3:2102 -6610:0:2565 -6611:3:2104 -6612:0:2565 -6613:3:2105 -6614:3:2109 -6615:3:2110 -6616:3:2118 -6617:3:2119 -6618:3:2123 -6619:3:2124 -6620:3:2132 -6621:3:2137 -6622:3:2141 -6623:3:2142 -6624:3:2149 -6625:3:2150 -6626:3:2161 -6627:3:2169 -6628:3:2170 -6629:3:2174 -6630:3:2179 -6631:3:2180 -6632:0:2565 -6633:2:564 -6634:0:2565 -6635:3:2192 -6636:0:2565 -6637:3:2013 -6638:0:2565 -6639:3:2014 -6640:0:2565 -6641:3:2015 -6642:3:2019 -6643:3:2020 -6644:3:2028 -6645:3:2029 -6646:3:2033 -6647:3:2034 -6648:3:2042 -6649:3:2047 -6650:3:2051 -6651:3:2052 -6652:3:2059 -6653:3:2060 -6654:3:2071 -6655:3:2079 -6656:3:2080 -6657:3:2084 -6658:3:2089 -6659:3:2090 -6660:0:2565 -6661:3:2102 -6662:0:2565 -6663:3:2104 -6664:0:2565 -6665:2:565 -6666:2:569 -6667:2:570 -6668:2:578 -6669:2:579 -6670:2:583 -6671:2:584 -6672:2:592 -6673:2:597 -6674:2:601 -6675:2:602 -6676:2:609 -6677:2:610 -6678:2:621 -6679:2:622 -6680:2:623 -6681:2:634 -6682:2:639 -6683:2:640 -6684:0:2565 -6685:2:652 -6686:0:2565 -6687:3:2105 -6688:3:2109 -6689:3:2110 -6690:3:2118 -6691:3:2119 -6692:3:2123 -6693:3:2124 -6694:3:2132 -6695:3:2137 -6696:3:2141 -6697:3:2142 -6698:3:2149 -6699:3:2150 -6700:3:2161 -6701:3:2169 -6702:3:2170 -6703:3:2174 -6704:3:2179 -6705:3:2180 -6706:0:2565 -6707:3:2192 -6708:0:2565 -6709:3:2013 -6710:0:2565 -6711:3:2014 -6712:0:2565 -6713:3:2015 -6714:3:2019 -6715:3:2020 -6716:3:2028 -6717:3:2029 -6718:3:2033 -6719:3:2034 -6720:3:2042 -6721:3:2047 -6722:3:2051 -6723:3:2052 -6724:3:2059 -6725:3:2060 -6726:3:2071 -6727:3:2079 -6728:3:2080 -6729:3:2084 -6730:3:2089 -6731:3:2090 -6732:0:2565 -6733:3:2102 -6734:0:2565 -6735:2:653 -6736:0:2565 -6737:3:2104 -6738:0:2565 -6739:3:2105 -6740:3:2109 -6741:3:2110 -6742:3:2118 -6743:3:2119 -6744:3:2123 -6745:3:2124 -6746:3:2132 -6747:3:2137 -6748:3:2141 -6749:3:2142 -6750:3:2149 -6751:3:2150 -6752:3:2161 -6753:3:2169 -6754:3:2170 -6755:3:2174 -6756:3:2179 -6757:3:2180 -6758:0:2565 -6759:3:2192 -6760:0:2565 -6761:3:2013 -6762:0:2565 -6763:3:2014 -6764:0:2565 -6765:3:2015 -6766:3:2019 -6767:3:2020 -6768:3:2028 -6769:3:2029 -6770:3:2033 -6771:3:2034 -6772:3:2042 -6773:3:2047 -6774:3:2051 -6775:3:2052 -6776:3:2059 -6777:3:2060 -6778:3:2071 -6779:3:2079 -6780:3:2080 -6781:3:2084 -6782:3:2089 -6783:3:2090 -6784:0:2565 -6785:2:654 -6786:2:658 -6787:2:659 -6788:2:667 -6789:2:668 -6790:2:672 -6791:2:673 -6792:2:681 -6793:2:686 -6794:2:690 -6795:2:691 -6796:2:698 -6797:2:699 -6798:2:710 -6799:2:711 -6800:2:712 -6801:2:723 -6802:2:728 -6803:2:729 -6804:0:2565 -6805:3:2102 -6806:0:2565 -6807:3:2104 -6808:0:2565 -6809:3:2105 -6810:3:2109 -6811:3:2110 -6812:3:2118 -6813:3:2119 -6814:3:2123 -6815:3:2124 -6816:3:2132 -6817:3:2137 -6818:3:2141 -6819:3:2142 -6820:3:2149 -6821:3:2150 -6822:3:2161 -6823:3:2169 -6824:3:2170 -6825:3:2174 -6826:3:2179 -6827:3:2180 -6828:0:2565 -6829:3:2192 -6830:0:2565 -6831:3:2013 -6832:0:2565 -6833:3:2014 -6834:0:2565 -6835:2:741 -6836:0:2565 -6837:2:750 -6838:0:2565 -6839:2:753 -6840:0:2565 -6841:3:2015 -6842:3:2019 -6843:3:2020 -6844:3:2028 -6845:3:2029 -6846:3:2033 -6847:3:2034 -6848:3:2042 -6849:3:2047 -6850:3:2051 -6851:3:2052 -6852:3:2059 -6853:3:2060 -6854:3:2071 -6855:3:2079 -6856:3:2080 -6857:3:2084 -6858:3:2089 -6859:3:2090 -6860:0:2565 -6861:3:2102 -6862:0:2565 -6863:3:2104 -6864:0:2565 -6865:3:2105 -6866:3:2109 -6867:3:2110 -6868:3:2118 -6869:3:2119 -6870:3:2123 -6871:3:2124 -6872:3:2132 -6873:3:2137 -6874:3:2141 -6875:3:2142 -6876:3:2149 -6877:3:2150 -6878:3:2161 -6879:3:2169 -6880:3:2170 -6881:3:2174 -6882:3:2179 -6883:3:2180 -6884:0:2565 -6885:3:2192 -6886:0:2565 -6887:3:2013 -6888:0:2565 -6889:2:758 -6890:0:2565 -6891:3:2014 -6892:0:2565 -6893:3:2015 -6894:3:2019 -6895:3:2020 -6896:3:2028 -6897:3:2029 -6898:3:2033 -6899:3:2034 -6900:3:2042 -6901:3:2047 -6902:3:2051 -6903:3:2052 -6904:3:2059 -6905:3:2060 -6906:3:2071 -6907:3:2079 -6908:3:2080 -6909:3:2084 -6910:3:2089 -6911:3:2090 -6912:0:2565 -6913:3:2102 -6914:0:2565 -6915:3:2104 -6916:0:2565 -6917:3:2105 -6918:3:2109 -6919:3:2110 -6920:3:2118 -6921:3:2119 -6922:3:2123 -6923:3:2124 -6924:3:2132 -6925:3:2137 -6926:3:2141 -6927:3:2142 -6928:3:2149 -6929:3:2150 -6930:3:2161 -6931:3:2169 -6932:3:2170 -6933:3:2174 -6934:3:2179 -6935:3:2180 -6936:0:2565 -6937:3:2192 -6938:0:2565 -6939:2:759 -6940:0:2565 -6941:3:2013 -6942:0:2565 -6943:3:2014 -6944:0:2565 -6945:3:2015 -6946:3:2019 -6947:3:2020 -6948:3:2028 -6949:3:2029 -6950:3:2033 -6951:3:2034 -6952:3:2042 -6953:3:2047 -6954:3:2051 -6955:3:2052 -6956:3:2059 -6957:3:2060 -6958:3:2071 -6959:3:2079 -6960:3:2080 -6961:3:2084 -6962:3:2089 -6963:3:2090 -6964:0:2565 -6965:3:2102 -6966:0:2565 -6967:3:2104 -6968:0:2565 -6969:3:2105 -6970:3:2109 -6971:3:2110 -6972:3:2118 -6973:3:2119 -6974:3:2123 -6975:3:2124 -6976:3:2132 -6977:3:2137 -6978:3:2141 -6979:3:2142 -6980:3:2149 -6981:3:2150 -6982:3:2161 -6983:3:2169 -6984:3:2170 -6985:3:2174 -6986:3:2179 -6987:3:2180 -6988:0:2565 -6989:2:760 -6990:0:2565 -6991:3:2192 -6992:0:2565 -6993:3:2013 -6994:0:2565 -6995:2:761 -6996:0:2565 -6997:2:762 -6998:0:2565 -6999:2:763 -7000:0:2565 -7001:3:2014 -7002:0:2565 -7003:3:2015 -7004:3:2019 -7005:3:2020 -7006:3:2028 -7007:3:2029 -7008:3:2033 -7009:3:2034 -7010:3:2042 -7011:3:2047 -7012:3:2051 -7013:3:2052 -7014:3:2059 -7015:3:2060 -7016:3:2071 -7017:3:2079 -7018:3:2080 -7019:3:2084 -7020:3:2089 -7021:3:2090 -7022:0:2565 -7023:3:2102 -7024:0:2565 -7025:3:2104 -7026:0:2565 -7027:3:2105 -7028:3:2109 -7029:3:2110 -7030:3:2118 -7031:3:2119 -7032:3:2123 -7033:3:2124 -7034:3:2132 -7035:3:2137 -7036:3:2141 -7037:3:2142 -7038:3:2149 -7039:3:2150 -7040:3:2161 -7041:3:2169 -7042:3:2170 -7043:3:2174 -7044:3:2179 -7045:3:2180 -7046:0:2565 -7047:3:2192 -7048:0:2565 -7049:2:765 -7050:0:2565 -7051:3:2013 -7052:0:2565 -7053:3:2014 -7054:0:2565 -7055:3:2015 -7056:3:2019 -7057:3:2020 -7058:3:2028 -7059:3:2029 -7060:3:2033 -7061:3:2034 -7062:3:2042 -7063:3:2047 -7064:3:2051 -7065:3:2052 -7066:3:2059 -7067:3:2060 -7068:3:2071 -7069:3:2079 -7070:3:2080 -7071:3:2084 -7072:3:2089 -7073:3:2090 -7074:0:2565 -7075:3:2102 -7076:0:2565 -7077:3:2104 -7078:0:2565 -7079:3:2105 -7080:3:2109 -7081:3:2110 -7082:3:2118 -7083:3:2119 -7084:3:2123 -7085:3:2124 -7086:3:2132 -7087:3:2137 -7088:3:2141 -7089:3:2142 -7090:3:2149 -7091:3:2150 -7092:3:2161 -7093:3:2169 -7094:3:2170 -7095:3:2174 -7096:3:2179 -7097:3:2180 -7098:0:2565 -7099:2:766 -7100:2:770 -7101:2:771 -7102:2:779 -7103:2:780 -7104:2:781 -7105:2:793 -7106:2:798 -7107:2:802 -7108:2:803 -7109:2:810 -7110:2:811 -7111:2:822 -7112:2:823 -7113:2:824 -7114:2:835 -7115:2:840 -7116:2:841 -7117:0:2565 -7118:3:2192 -7119:0:2565 -7120:3:2013 -7121:0:2565 -7122:3:2014 -7123:0:2565 -7124:3:2015 -7125:3:2019 -7126:3:2020 -7127:3:2028 -7128:3:2029 -7129:3:2033 -7130:3:2034 -7131:3:2042 -7132:3:2047 -7133:3:2051 -7134:3:2052 -7135:3:2059 -7136:3:2060 -7137:3:2071 -7138:3:2079 -7139:3:2080 -7140:3:2084 -7141:3:2089 -7142:3:2090 -7143:0:2565 -7144:3:2102 -7145:0:2565 -7146:3:2104 -7147:0:2565 -7148:2:853 -7149:0:2565 -7150:2:857 -7151:0:2565 -7152:2:465 -7153:0:2565 -7154:3:2105 -7155:3:2109 -7156:3:2110 -7157:3:2118 -7158:3:2119 -7159:3:2123 -7160:3:2124 -7161:3:2132 -7162:3:2137 -7163:3:2141 -7164:3:2142 -7165:3:2149 -7166:3:2150 -7167:3:2161 -7168:3:2169 -7169:3:2170 -7170:3:2174 -7171:3:2179 -7172:3:2180 -7173:0:2565 -7174:3:2192 -7175:0:2565 -7176:3:2013 -7177:0:2565 -7178:3:2014 -7179:0:2565 -7180:3:2015 -7181:3:2019 -7182:3:2020 -7183:3:2028 -7184:3:2029 -7185:3:2033 -7186:3:2034 -7187:3:2042 -7188:3:2047 -7189:3:2051 -7190:3:2052 -7191:3:2059 -7192:3:2060 -7193:3:2071 -7194:3:2079 -7195:3:2080 -7196:3:2084 -7197:3:2089 -7198:3:2090 -7199:0:2565 -7200:3:2102 -7201:0:2565 -7202:2:466 -7203:0:2565 -7204:3:2104 -7205:0:2565 -7206:3:2105 -7207:3:2109 -7208:3:2110 -7209:3:2118 -7210:3:2119 -7211:3:2123 -7212:3:2124 -7213:3:2132 -7214:3:2137 -7215:3:2141 -7216:3:2142 -7217:3:2149 -7218:3:2150 -7219:3:2161 -7220:3:2169 -7221:3:2170 -7222:3:2174 -7223:3:2179 -7224:3:2180 -7225:0:2565 -7226:3:2192 -7227:0:2565 -7228:3:2013 -7229:0:2565 -7230:3:2014 -7231:0:2565 -7232:3:2015 -7233:3:2019 -7234:3:2020 -7235:3:2028 -7236:3:2029 -7237:3:2033 -7238:3:2034 -7239:3:2042 -7240:3:2047 -7241:3:2051 -7242:3:2052 -7243:3:2059 -7244:3:2060 -7245:3:2071 -7246:3:2079 -7247:3:2080 -7248:3:2084 -7249:3:2089 -7250:3:2090 -7251:0:2565 -7252:2:467 -7253:0:2565 -7254:3:2102 -7255:0:2565 -7256:3:2104 -7257:0:2565 -7258:3:2105 -7259:3:2109 -7260:3:2110 -7261:3:2118 -7262:3:2119 -7263:3:2123 -7264:3:2124 -7265:3:2132 -7266:3:2137 -7267:3:2141 -7268:3:2142 -7269:3:2149 -7270:3:2150 -7271:3:2161 -7272:3:2169 -7273:3:2170 -7274:3:2174 -7275:3:2179 -7276:3:2180 -7277:0:2565 -7278:3:2192 -7279:0:2565 -7280:3:2013 -7281:0:2565 -7282:3:2014 -7283:0:2565 -7284:1:102 -7285:0:2565 -7286:2:468 -7287:0:2565 -7288:3:2015 -7289:3:2019 -7290:3:2020 -7291:3:2028 -7292:3:2029 -7293:3:2033 -7294:3:2034 -7295:3:2042 -7296:3:2047 -7297:3:2051 -7298:3:2052 -7299:3:2059 -7300:3:2060 -7301:3:2071 -7302:3:2079 -7303:3:2080 -7304:3:2084 -7305:3:2089 -7306:3:2090 -7307:0:2565 -7308:3:2102 -7309:0:2565 -7310:3:2104 -7311:0:2565 -7312:3:2105 -7313:3:2109 -7314:3:2110 -7315:3:2118 -7316:3:2119 -7317:3:2123 -7318:3:2124 -7319:3:2132 -7320:3:2137 -7321:3:2141 -7322:3:2142 -7323:3:2149 -7324:3:2150 -7325:3:2161 -7326:3:2169 -7327:3:2170 -7328:3:2174 -7329:3:2179 -7330:3:2180 -7331:0:2565 -7332:3:2192 -7333:0:2565 -7334:3:2013 -7335:0:2565 -7336:3:2014 -7337:0:2565 -7338:2:467 -7339:0:2565 -7340:2:468 -7341:0:2565 -7342:3:2015 -7343:3:2019 -7344:3:2020 -7345:3:2028 -7346:3:2029 -7347:3:2033 -7348:3:2034 -7349:3:2042 -7350:3:2047 -7351:3:2051 -7352:3:2052 -7353:3:2059 -7354:3:2060 -7355:3:2071 -7356:3:2079 -7357:3:2080 -7358:3:2084 -7359:3:2089 -7360:3:2090 -7361:0:2565 -7362:3:2102 -7363:0:2565 -7364:3:2104 -7365:0:2565 -7366:3:2105 -7367:3:2109 -7368:3:2110 -7369:3:2118 -7370:3:2119 -7371:3:2123 -7372:3:2124 -7373:3:2132 -7374:3:2137 -7375:3:2141 -7376:3:2142 -7377:3:2149 -7378:3:2150 -7379:3:2161 -7380:3:2169 -7381:3:2170 -7382:3:2174 -7383:3:2179 -7384:3:2180 -7385:0:2565 -7386:3:2192 -7387:0:2565 -7388:3:2013 -7389:0:2565 -7390:2:467 -7391:0:2565 -7392:1:108 -7393:0:2565 -7394:2:468 -7395:0:2565 -7396:3:2014 -7397:0:2565 -7398:3:2015 -7399:3:2019 -7400:3:2020 -7401:3:2028 -7402:3:2029 -7403:3:2033 -7404:3:2034 -7405:3:2042 -7406:3:2047 -7407:3:2051 -7408:3:2052 -7409:3:2059 -7410:3:2060 -7411:3:2071 -7412:3:2079 -7413:3:2080 -7414:3:2084 -7415:3:2089 -7416:3:2090 -7417:0:2565 -7418:3:2102 -7419:0:2565 -7420:3:2104 -7421:0:2565 -7422:3:2105 -7423:3:2109 -7424:3:2110 -7425:3:2118 -7426:3:2119 -7427:3:2123 -7428:3:2124 -7429:3:2132 -7430:3:2137 -7431:3:2141 -7432:3:2142 -7433:3:2149 -7434:3:2150 -7435:3:2161 -7436:3:2169 -7437:3:2170 -7438:3:2174 -7439:3:2179 -7440:3:2180 -7441:0:2565 -7442:3:2192 -7443:0:2565 -7444:3:2013 -7445:0:2565 -7446:2:467 -7447:0:2565 -7448:2:468 -7449:0:2565 -7450:3:2014 -7451:0:2565 -7452:3:2015 -7453:3:2019 -7454:3:2020 -7455:3:2028 -7456:3:2029 -7457:3:2033 -7458:3:2034 -7459:3:2042 -7460:3:2047 -7461:3:2051 -7462:3:2052 -7463:3:2059 -7464:3:2060 -7465:3:2071 -7466:3:2079 -7467:3:2080 -7468:3:2084 -7469:3:2089 -7470:3:2090 -7471:0:2565 -7472:3:2102 -7473:0:2565 -7474:3:2104 -7475:0:2565 -7476:3:2105 -7477:3:2109 -7478:3:2110 -7479:3:2118 -7480:3:2119 -7481:3:2123 -7482:3:2124 -7483:3:2132 -7484:3:2137 -7485:3:2141 -7486:3:2142 -7487:3:2149 -7488:3:2150 -7489:3:2161 -7490:3:2169 -7491:3:2170 -7492:3:2174 -7493:3:2179 -7494:3:2180 -7495:0:2565 -7496:3:2192 -7497:0:2565 -7498:2:467 -7499:0:2565 -7500:1:109 -7501:1:113 -7502:1:114 -7503:1:122 -7504:1:123 -7505:1:124 -7506:1:136 -7507:1:141 -7508:1:145 -7509:1:146 -7510:1:153 -7511:1:154 -7512:1:165 -7513:1:166 -7514:1:167 -7515:1:178 -7516:1:183 -7517:1:184 -7518:0:2565 -7519:3:2013 -7520:0:2565 -7521:2:468 -7522:0:2565 -7523:3:2014 -7524:0:2565 -7525:3:2015 -7526:3:2019 -7527:3:2020 -7528:3:2028 -7529:3:2029 -7530:3:2033 -7531:3:2034 -7532:3:2042 -7533:3:2047 -7534:3:2051 -7535:3:2052 -7536:3:2059 -7537:3:2060 -7538:3:2071 -7539:3:2079 -7540:3:2080 -7541:3:2084 -7542:3:2089 -7543:3:2090 -7544:0:2565 -7545:3:2102 -7546:0:2565 -7547:3:2104 -7548:0:2565 -7549:3:2105 -7550:3:2109 -7551:3:2110 -7552:3:2118 -7553:3:2119 -7554:3:2123 -7555:3:2124 -7556:3:2132 -7557:3:2137 -7558:3:2141 -7559:3:2142 -7560:3:2149 -7561:3:2150 -7562:3:2161 -7563:3:2169 -7564:3:2170 -7565:3:2174 -7566:3:2179 -7567:3:2180 -7568:0:2565 -7569:3:2192 -7570:0:2565 -7571:2:467 -7572:0:2565 -7573:3:2013 -7574:0:2565 -7575:3:2014 -7576:0:2565 -7577:3:2015 -7578:3:2019 -7579:3:2020 -7580:3:2028 -7581:3:2029 -7582:3:2033 -7583:3:2034 -7584:3:2042 -7585:3:2047 -7586:3:2051 -7587:3:2052 -7588:3:2059 -7589:3:2060 -7590:3:2071 -7591:3:2079 -7592:3:2080 -7593:3:2084 -7594:3:2089 -7595:3:2090 -7596:0:2565 -7597:3:2102 -7598:0:2565 -7599:3:2104 -7600:0:2565 -7601:3:2105 -7602:3:2109 -7603:3:2110 -7604:3:2118 -7605:3:2119 -7606:3:2123 -7607:3:2124 -7608:3:2132 -7609:3:2137 -7610:3:2141 -7611:3:2142 -7612:3:2149 -7613:3:2150 -7614:3:2161 -7615:3:2169 -7616:3:2170 -7617:3:2174 -7618:3:2179 -7619:3:2180 -7620:0:2565 -7621:1:196 -7622:0:2565 -7623:3:2192 -7624:0:2565 -7625:3:2013 -7626:0:2565 -7627:2:468 -7628:0:2565 -7629:3:2014 -7630:0:2565 -7631:3:2015 -7632:3:2019 -7633:3:2020 -7634:3:2028 -7635:3:2029 -7636:3:2033 -7637:3:2034 -7638:3:2042 -7639:3:2047 -7640:3:2051 -7641:3:2052 -7642:3:2059 -7643:3:2060 -7644:3:2071 -7645:3:2079 -7646:3:2080 -7647:3:2084 -7648:3:2089 -7649:3:2090 -7650:0:2565 -7651:3:2102 -7652:0:2565 -7653:3:2104 -7654:0:2565 -7655:3:2105 -7656:3:2109 -7657:3:2110 -7658:3:2118 -7659:3:2119 -7660:3:2123 -7661:3:2124 -7662:3:2132 -7663:3:2137 -7664:3:2141 -7665:3:2142 -7666:3:2149 -7667:3:2150 -7668:3:2161 -7669:3:2169 -7670:3:2170 -7671:3:2174 -7672:3:2179 -7673:3:2180 -7674:0:2565 -7675:3:2192 -7676:0:2565 -7677:2:469 -7678:0:2565 -7679:3:2013 -7680:0:2565 -7681:2:475 -7682:0:2565 -7683:2:476 -7684:0:2565 -7685:3:2014 -7686:0:2565 -7687:3:2015 -7688:3:2019 -7689:3:2020 -7690:3:2028 -7691:3:2029 -7692:3:2033 -7693:3:2034 -7694:3:2042 -7695:3:2047 -7696:3:2051 -7697:3:2052 -7698:3:2059 -7699:3:2060 -7700:3:2071 -7701:3:2079 -7702:3:2080 -7703:3:2084 -7704:3:2089 -7705:3:2090 -7706:0:2565 -7707:3:2102 -7708:0:2565 -7709:3:2104 -7710:0:2565 -7711:3:2105 -7712:3:2109 -7713:3:2110 -7714:3:2118 -7715:3:2119 -7716:3:2123 -7717:3:2124 -7718:3:2132 -7719:3:2137 -7720:3:2141 -7721:3:2142 -7722:3:2149 -7723:3:2150 -7724:3:2161 -7725:3:2169 -7726:3:2170 -7727:3:2174 -7728:3:2179 -7729:3:2180 -7730:0:2565 -7731:3:2192 -7732:0:2565 -7733:2:477 -7734:2:481 -7735:2:482 -7736:2:490 -7737:2:491 -7738:2:495 -7739:2:496 -7740:2:504 -7741:2:509 -7742:2:513 -7743:2:514 -7744:2:521 -7745:2:522 -7746:2:533 -7747:2:534 -7748:2:535 -7749:2:546 -7750:2:551 -7751:2:552 -7752:0:2565 -7753:3:2013 -7754:0:2565 -7755:3:2014 -7756:0:2565 -7757:3:2015 -7758:3:2019 -7759:3:2020 -7760:3:2028 -7761:3:2029 -7762:3:2033 -7763:3:2034 -7764:3:2042 -7765:3:2047 -7766:3:2051 -7767:3:2052 -7768:3:2059 -7769:3:2060 -7770:3:2071 -7771:3:2079 -7772:3:2080 -7773:3:2084 -7774:3:2089 -7775:3:2090 -7776:0:2565 -7777:3:2102 -7778:0:2565 -7779:3:2104 -7780:0:2565 -7781:3:2105 -7782:3:2109 -7783:3:2110 -7784:3:2118 -7785:3:2119 -7786:3:2123 -7787:3:2124 -7788:3:2132 -7789:3:2137 -7790:3:2141 -7791:3:2142 -7792:3:2149 -7793:3:2150 -7794:3:2161 -7795:3:2169 -7796:3:2170 -7797:3:2174 -7798:3:2179 -7799:3:2180 -7800:0:2565 -7801:2:564 -7802:0:2565 -7803:3:2192 -7804:0:2565 -7805:3:2013 -7806:0:2565 -7807:3:2014 -7808:0:2565 -7809:3:2015 -7810:3:2019 -7811:3:2020 -7812:3:2028 -7813:3:2029 -7814:3:2033 -7815:3:2034 -7816:3:2042 -7817:3:2047 -7818:3:2051 -7819:3:2052 -7820:3:2059 -7821:3:2060 -7822:3:2071 -7823:3:2079 -7824:3:2080 -7825:3:2084 -7826:3:2089 -7827:3:2090 -7828:0:2565 -7829:3:2102 -7830:0:2565 -7831:3:2104 -7832:0:2565 -7833:2:565 -7834:2:569 -7835:2:570 -7836:2:578 -7837:2:579 -7838:2:583 -7839:2:584 -7840:2:592 -7841:2:597 -7842:2:601 -7843:2:602 -7844:2:609 -7845:2:610 -7846:2:621 -7847:2:622 -7848:2:623 -7849:2:634 -7850:2:639 -7851:2:640 -7852:0:2565 -7853:2:652 -7854:0:2565 -7855:3:2105 -7856:3:2109 -7857:3:2110 -7858:3:2118 -7859:3:2119 -7860:3:2123 -7861:3:2124 -7862:3:2132 -7863:3:2137 -7864:3:2141 -7865:3:2142 -7866:3:2149 -7867:3:2150 -7868:3:2161 -7869:3:2169 -7870:3:2170 -7871:3:2174 -7872:3:2179 -7873:3:2180 -7874:0:2565 -7875:3:2192 -7876:0:2565 -7877:3:2013 -7878:0:2565 -7879:3:2014 -7880:0:2565 -7881:3:2015 -7882:3:2019 -7883:3:2020 -7884:3:2028 -7885:3:2029 -7886:3:2033 -7887:3:2034 -7888:3:2042 -7889:3:2047 -7890:3:2051 -7891:3:2052 -7892:3:2059 -7893:3:2060 -7894:3:2071 -7895:3:2079 -7896:3:2080 -7897:3:2084 -7898:3:2089 -7899:3:2090 -7900:0:2565 -7901:3:2102 -7902:0:2565 -7903:2:653 -7904:0:2565 -7905:3:2104 -7906:0:2565 -7907:3:2105 -7908:3:2109 -7909:3:2110 -7910:3:2118 -7911:3:2119 -7912:3:2123 -7913:3:2124 -7914:3:2132 -7915:3:2137 -7916:3:2141 -7917:3:2142 -7918:3:2149 -7919:3:2150 -7920:3:2161 -7921:3:2169 -7922:3:2170 -7923:3:2174 -7924:3:2179 -7925:3:2180 -7926:0:2565 -7927:3:2192 -7928:0:2565 -7929:3:2013 -7930:0:2565 -7931:3:2014 -7932:0:2565 -7933:3:2015 -7934:3:2019 -7935:3:2020 -7936:3:2028 -7937:3:2029 -7938:3:2033 -7939:3:2034 -7940:3:2042 -7941:3:2047 -7942:3:2051 -7943:3:2052 -7944:3:2059 -7945:3:2060 -7946:3:2071 -7947:3:2079 -7948:3:2080 -7949:3:2084 -7950:3:2089 -7951:3:2090 -7952:0:2565 -7953:2:654 -7954:2:658 -7955:2:659 -7956:2:667 -7957:2:668 -7958:2:672 -7959:2:673 -7960:2:681 -7961:2:686 -7962:2:690 -7963:2:691 -7964:2:698 -7965:2:699 -7966:2:710 -7967:2:711 -7968:2:712 -7969:2:723 -7970:2:728 -7971:2:729 -7972:0:2565 -7973:3:2102 -7974:0:2565 -7975:3:2104 -7976:0:2565 -7977:3:2105 -7978:3:2109 -7979:3:2110 -7980:3:2118 -7981:3:2119 -7982:3:2123 -7983:3:2124 -7984:3:2132 -7985:3:2137 -7986:3:2141 -7987:3:2142 -7988:3:2149 -7989:3:2150 -7990:3:2161 -7991:3:2169 -7992:3:2170 -7993:3:2174 -7994:3:2179 -7995:3:2180 -7996:0:2565 -7997:3:2192 -7998:0:2565 -7999:3:2013 -8000:0:2565 -8001:3:2014 -8002:0:2565 -8003:2:741 -8004:0:2565 -8005:2:750 -8006:0:2565 -8007:2:753 -8008:0:2565 -8009:3:2015 -8010:3:2019 -8011:3:2020 -8012:3:2028 -8013:3:2029 -8014:3:2033 -8015:3:2034 -8016:3:2042 -8017:3:2047 -8018:3:2051 -8019:3:2052 -8020:3:2059 -8021:3:2060 -8022:3:2071 -8023:3:2079 -8024:3:2080 -8025:3:2084 -8026:3:2089 -8027:3:2090 -8028:0:2565 -8029:3:2102 -8030:0:2565 -8031:3:2104 -8032:0:2565 -8033:3:2105 -8034:3:2109 -8035:3:2110 -8036:3:2118 -8037:3:2119 -8038:3:2123 -8039:3:2124 -8040:3:2132 -8041:3:2137 -8042:3:2141 -8043:3:2142 -8044:3:2149 -8045:3:2150 -8046:3:2161 -8047:3:2169 -8048:3:2170 -8049:3:2174 -8050:3:2179 -8051:3:2180 -8052:0:2565 -8053:3:2192 -8054:0:2565 -8055:3:2013 -8056:0:2565 -8057:2:758 -8058:0:2565 -8059:3:2014 -8060:0:2565 -8061:3:2015 -8062:3:2019 -8063:3:2020 -8064:3:2028 -8065:3:2029 -8066:3:2033 -8067:3:2034 -8068:3:2042 -8069:3:2047 -8070:3:2051 -8071:3:2052 -8072:3:2059 -8073:3:2060 -8074:3:2071 -8075:3:2079 -8076:3:2080 -8077:3:2084 -8078:3:2089 -8079:3:2090 -8080:0:2565 -8081:3:2102 -8082:0:2565 -8083:3:2104 -8084:0:2565 -8085:3:2105 -8086:3:2109 -8087:3:2110 -8088:3:2118 -8089:3:2119 -8090:3:2123 -8091:3:2124 -8092:3:2132 -8093:3:2137 -8094:3:2141 -8095:3:2142 -8096:3:2149 -8097:3:2150 -8098:3:2161 -8099:3:2169 -8100:3:2170 -8101:3:2174 -8102:3:2179 -8103:3:2180 -8104:0:2565 -8105:3:2192 -8106:0:2565 -8107:2:759 -8108:0:2565 -8109:3:2013 -8110:0:2565 -8111:3:2014 -8112:0:2565 -8113:3:2015 -8114:3:2019 -8115:3:2020 -8116:3:2028 -8117:3:2029 -8118:3:2033 -8119:3:2034 -8120:3:2042 -8121:3:2047 -8122:3:2051 -8123:3:2052 -8124:3:2059 -8125:3:2060 -8126:3:2071 -8127:3:2079 -8128:3:2080 -8129:3:2084 -8130:3:2089 -8131:3:2090 -8132:0:2565 -8133:3:2102 -8134:0:2565 -8135:3:2104 -8136:0:2565 -8137:3:2105 -8138:3:2109 -8139:3:2110 -8140:3:2118 -8141:3:2119 -8142:3:2123 -8143:3:2124 -8144:3:2132 -8145:3:2137 -8146:3:2141 -8147:3:2142 -8148:3:2149 -8149:3:2150 -8150:3:2161 -8151:3:2169 -8152:3:2170 -8153:3:2174 -8154:3:2179 -8155:3:2180 -8156:0:2565 -8157:2:760 -8158:0:2565 -8159:3:2192 -8160:0:2565 -8161:3:2013 -8162:0:2565 -8163:2:761 -8164:0:2565 -8165:2:762 -8166:0:2565 -8167:2:763 -8168:0:2565 -8169:3:2014 -8170:0:2565 -8171:3:2015 -8172:3:2019 -8173:3:2020 -8174:3:2028 -8175:3:2029 -8176:3:2033 -8177:3:2034 -8178:3:2042 -8179:3:2047 -8180:3:2051 -8181:3:2052 -8182:3:2059 -8183:3:2060 -8184:3:2071 -8185:3:2079 -8186:3:2080 -8187:3:2084 -8188:3:2089 -8189:3:2090 -8190:0:2565 -8191:3:2102 -8192:0:2565 -8193:3:2104 -8194:0:2565 -8195:3:2105 -8196:3:2109 -8197:3:2110 -8198:3:2118 -8199:3:2119 -8200:3:2123 -8201:3:2124 -8202:3:2132 -8203:3:2137 -8204:3:2141 -8205:3:2142 -8206:3:2149 -8207:3:2150 -8208:3:2161 -8209:3:2169 -8210:3:2170 -8211:3:2174 -8212:3:2179 -8213:3:2180 -8214:0:2565 -8215:3:2192 -8216:0:2565 -8217:2:765 -8218:0:2565 -8219:3:2013 -8220:0:2565 -8221:3:2014 -8222:0:2565 -8223:3:2015 -8224:3:2019 -8225:3:2020 -8226:3:2028 -8227:3:2029 -8228:3:2033 -8229:3:2034 -8230:3:2042 -8231:3:2047 -8232:3:2051 -8233:3:2052 -8234:3:2059 -8235:3:2060 -8236:3:2071 -8237:3:2079 -8238:3:2080 -8239:3:2084 -8240:3:2089 -8241:3:2090 -8242:0:2565 -8243:3:2102 -8244:0:2565 -8245:3:2104 -8246:0:2565 -8247:3:2105 -8248:3:2109 -8249:3:2110 -8250:3:2118 -8251:3:2119 -8252:3:2123 -8253:3:2124 -8254:3:2132 -8255:3:2137 -8256:3:2141 -8257:3:2142 -8258:3:2149 -8259:3:2150 -8260:3:2161 -8261:3:2169 -8262:3:2170 -8263:3:2174 -8264:3:2179 -8265:3:2180 -8266:0:2565 -8267:2:766 -8268:2:770 -8269:2:771 -8270:2:779 -8271:2:780 -8272:2:781 -8273:2:793 -8274:2:798 -8275:2:802 -8276:2:803 -8277:2:810 -8278:2:811 -8279:2:822 -8280:2:823 -8281:2:824 -8282:2:835 -8283:2:840 -8284:2:841 -8285:0:2565 -8286:3:2192 -8287:0:2565 -8288:3:2013 -8289:0:2565 -8290:3:2014 -8291:0:2565 -8292:3:2015 -8293:3:2019 -8294:3:2020 -8295:3:2028 -8296:3:2029 -8297:3:2033 -8298:3:2034 -8299:3:2042 -8300:3:2047 -8301:3:2051 -8302:3:2052 -8303:3:2059 -8304:3:2060 -8305:3:2071 -8306:3:2079 -8307:3:2080 -8308:3:2084 -8309:3:2089 -8310:3:2090 -8311:0:2565 -8312:3:2102 -8313:0:2565 -8314:3:2104 -8315:0:2565 -8316:2:853 -8317:0:2565 -8318:2:857 -8319:0:2565 -8320:2:465 -8321:0:2565 -8322:3:2105 -8323:3:2109 -8324:3:2110 -8325:3:2118 -8326:3:2119 -8327:3:2123 -8328:3:2124 -8329:3:2132 -8330:3:2137 -8331:3:2141 -8332:3:2142 -8333:3:2149 -8334:3:2150 -8335:3:2161 -8336:3:2169 -8337:3:2170 -8338:3:2174 -8339:3:2179 -8340:3:2180 -8341:0:2565 -8342:3:2192 -8343:0:2565 -8344:3:2013 -8345:0:2565 -8346:3:2014 -8347:0:2565 -8348:3:2015 -8349:3:2019 -8350:3:2020 -8351:3:2028 -8352:3:2029 -8353:3:2033 -8354:3:2034 -8355:3:2042 -8356:3:2047 -8357:3:2051 -8358:3:2052 -8359:3:2059 -8360:3:2060 -8361:3:2071 -8362:3:2079 -8363:3:2080 -8364:3:2084 -8365:3:2089 -8366:3:2090 -8367:0:2565 -8368:3:2102 -8369:0:2565 -8370:2:466 -8371:0:2565 -8372:3:2104 -8373:0:2565 -8374:3:2105 -8375:3:2109 -8376:3:2110 -8377:3:2118 -8378:3:2119 -8379:3:2123 -8380:3:2124 -8381:3:2132 -8382:3:2137 -8383:3:2141 -8384:3:2142 -8385:3:2149 -8386:3:2150 -8387:3:2161 -8388:3:2169 -8389:3:2170 -8390:3:2174 -8391:3:2179 -8392:3:2180 -8393:0:2565 -8394:3:2192 -8395:0:2565 -8396:3:2013 -8397:0:2565 -8398:3:2014 -8399:0:2565 -8400:3:2015 -8401:3:2019 -8402:3:2020 -8403:3:2028 -8404:3:2029 -8405:3:2033 -8406:3:2034 -8407:3:2042 -8408:3:2047 -8409:3:2051 -8410:3:2052 -8411:3:2059 -8412:3:2060 -8413:3:2071 -8414:3:2079 -8415:3:2080 -8416:3:2084 -8417:3:2089 -8418:3:2090 -8419:0:2565 -8420:2:467 -8421:0:2565 -8422:3:2102 -8423:0:2565 -8424:3:2104 -8425:0:2565 -8426:3:2105 -8427:3:2109 -8428:3:2110 -8429:3:2118 -8430:3:2119 -8431:3:2123 -8432:3:2124 -8433:3:2132 -8434:3:2137 -8435:3:2141 -8436:3:2142 -8437:3:2149 -8438:3:2150 -8439:3:2161 -8440:3:2169 -8441:3:2170 -8442:3:2174 -8443:3:2179 -8444:3:2180 -8445:0:2565 -8446:3:2192 -8447:0:2565 -8448:3:2013 -8449:0:2565 -8450:3:2014 -8451:0:2565 -8452:1:199 -8453:0:2565 -8454:2:468 -8455:0:2565 -8456:1:205 -8457:0:2565 -8458:3:2015 -8459:3:2019 -8460:3:2020 -8461:3:2028 -8462:3:2029 -8463:3:2033 -8464:3:2034 -8465:3:2042 -8466:3:2047 -8467:3:2051 -8468:3:2052 -8469:3:2059 -8470:3:2060 -8471:3:2071 -8472:3:2079 -8473:3:2080 -8474:3:2084 -8475:3:2089 -8476:3:2090 -8477:0:2565 -8478:3:2102 -8479:0:2565 -8480:3:2104 -8481:0:2565 -8482:3:2105 -8483:3:2109 -8484:3:2110 -8485:3:2118 -8486:3:2119 -8487:3:2123 -8488:3:2124 -8489:3:2132 -8490:3:2137 -8491:3:2141 -8492:3:2142 -8493:3:2149 -8494:3:2150 -8495:3:2161 -8496:3:2169 -8497:3:2170 -8498:3:2174 -8499:3:2179 -8500:3:2180 -8501:0:2565 -8502:3:2192 -8503:0:2565 -8504:3:2013 -8505:0:2565 -8506:3:2014 -8507:0:2565 -8508:2:467 -8509:0:2565 -8510:2:468 -8511:0:2565 -8512:3:2015 -8513:3:2019 -8514:3:2020 -8515:3:2028 -8516:3:2029 -8517:3:2033 -8518:3:2034 -8519:3:2042 -8520:3:2047 -8521:3:2051 -8522:3:2052 -8523:3:2059 -8524:3:2060 -8525:3:2071 -8526:3:2079 -8527:3:2080 -8528:3:2084 -8529:3:2089 -8530:3:2090 -8531:0:2565 -8532:3:2102 -8533:0:2565 -8534:3:2104 -8535:0:2565 -8536:3:2105 -8537:3:2109 -8538:3:2110 -8539:3:2118 -8540:3:2119 -8541:3:2123 -8542:3:2124 -8543:3:2132 -8544:3:2137 -8545:3:2141 -8546:3:2142 -8547:3:2149 -8548:3:2150 -8549:3:2161 -8550:3:2169 -8551:3:2170 -8552:3:2174 -8553:3:2179 -8554:3:2180 -8555:0:2565 -8556:3:2192 -8557:0:2565 -8558:3:2013 -8559:0:2565 -8560:2:467 -8561:0:2565 -8562:1:206 -8563:0:2565 -8564:2:468 -8565:0:2565 -8566:2:467 -8567:0:2565 -8568:3:2014 -8569:0:2565 -8570:3:2015 -8571:3:2019 -8572:3:2020 -8573:3:2028 -8574:3:2029 -8575:3:2033 -8576:3:2034 -8577:3:2042 -8578:3:2047 -8579:3:2051 -8580:3:2052 -8581:3:2059 -8582:3:2060 -8583:3:2071 -8584:3:2079 -8585:3:2080 -8586:3:2084 -8587:3:2089 -8588:3:2090 -8589:0:2565 -8590:3:2102 -8591:0:2565 -8592:3:2104 -8593:0:2565 -8594:3:2105 -8595:3:2109 -8596:3:2110 -8597:3:2118 -8598:3:2119 -8599:3:2123 -8600:3:2124 -8601:3:2132 -8602:3:2137 -8603:3:2141 -8604:3:2142 -8605:3:2149 -8606:3:2150 -8607:3:2161 -8608:3:2169 -8609:3:2170 -8610:3:2174 -8611:3:2179 -8612:3:2180 -8613:0:2565 -8614:3:2192 -8615:0:2565 -8616:3:2013 -8617:0:2565 -8618:1:207 -8619:1:211 -8620:1:212 -8621:1:220 -8622:1:221 -8623:1:222 -8624:1:234 -8625:1:239 -8626:1:243 -8627:1:244 -8628:1:251 -8629:1:252 -8630:1:263 -8631:1:264 -8632:1:265 -8633:1:276 -8634:1:281 -8635:1:282 -8636:0:2565 -8637:3:2014 -8638:0:2565 -8639:3:2015 -8640:3:2019 -8641:3:2020 -8642:3:2028 -8643:3:2029 -8644:3:2033 -8645:3:2034 -8646:3:2042 -8647:3:2047 -8648:3:2051 -8649:3:2052 -8650:3:2059 -8651:3:2060 -8652:3:2071 -8653:3:2079 -8654:3:2080 -8655:3:2084 -8656:3:2089 -8657:3:2090 -8658:0:2565 -8659:1:294 -8660:0:2565 -8661:3:2102 -8662:0:2565 -8663:2:468 -8664:0:2565 -8665:3:2104 -8666:0:2565 -8667:3:2105 -8668:3:2109 -8669:3:2110 -8670:3:2118 -8671:3:2119 -8672:3:2123 -8673:3:2124 -8674:3:2132 -8675:3:2137 -8676:3:2141 -8677:3:2142 -8678:3:2149 -8679:3:2150 -8680:3:2161 -8681:3:2169 -8682:3:2170 -8683:3:2174 -8684:3:2179 -8685:3:2180 -8686:0:2565 -8687:3:2192 -8688:0:2565 -8689:3:2013 -8690:0:2565 -8691:3:2014 -8692:0:2565 -8693:3:2015 -8694:3:2019 -8695:3:2020 -8696:3:2028 -8697:3:2029 -8698:3:2033 -8699:3:2034 -8700:3:2042 -8701:3:2047 -8702:3:2051 -8703:3:2052 -8704:3:2059 -8705:3:2060 -8706:3:2071 -8707:3:2079 -8708:3:2080 -8709:3:2084 -8710:3:2089 -8711:3:2090 -8712:0:2565 -8713:2:469 -8714:0:2565 -8715:3:2102 -8716:0:2565 -8717:2:475 -8718:0:2565 -8719:3:2104 -8720:0:2565 -8721:3:2105 -8722:3:2109 -8723:3:2110 -8724:3:2118 -8725:3:2119 -8726:3:2123 -8727:3:2124 -8728:3:2132 -8729:3:2137 -8730:3:2141 -8731:3:2142 -8732:3:2149 -8733:3:2150 -8734:3:2161 -8735:3:2169 -8736:3:2170 -8737:3:2174 -8738:3:2179 -8739:3:2180 -8740:0:2565 -8741:3:2192 -8742:0:2565 -8743:3:2013 -8744:0:2565 -8745:1:295 -8746:0:2565 -8747:2:476 -8748:0:2565 -8749:1:296 -8750:0:2565 -8751:3:2014 -8752:0:2565 -8753:3:2015 -8754:3:2019 -8755:3:2020 -8756:3:2028 -8757:3:2029 -8758:3:2033 -8759:3:2034 -8760:3:2042 -8761:3:2047 -8762:3:2051 -8763:3:2052 -8764:3:2059 -8765:3:2060 -8766:3:2071 -8767:3:2079 -8768:3:2080 -8769:3:2084 -8770:3:2089 -8771:3:2090 -8772:0:2565 -8773:3:2102 -8774:0:2565 -8775:3:2104 -8776:0:2565 -8777:3:2105 -8778:3:2109 -8779:3:2110 -8780:3:2118 -8781:3:2119 -8782:3:2123 -8783:3:2124 -8784:3:2132 -8785:3:2137 -8786:3:2141 -8787:3:2142 -8788:3:2149 -8789:3:2150 -8790:3:2161 -8791:3:2169 -8792:3:2170 -8793:3:2174 -8794:3:2179 -8795:3:2180 -8796:0:2565 -8797:3:2192 -8798:0:2565 -8799:3:2013 -8800:0:2565 -8801:1:295 -8802:0:2565 -8803:3:2014 -8804:0:2565 -8805:3:2015 -8806:3:2019 -8807:3:2020 -8808:3:2028 -8809:3:2029 -8810:3:2033 -8811:3:2034 -8812:3:2042 -8813:3:2047 -8814:3:2051 -8815:3:2052 -8816:3:2059 -8817:3:2060 -8818:3:2071 -8819:3:2079 -8820:3:2080 -8821:3:2084 -8822:3:2089 -8823:3:2090 -8824:0:2565 -8825:3:2102 -8826:0:2565 -8827:3:2104 -8828:0:2565 -8829:3:2105 -8830:3:2109 -8831:3:2110 -8832:3:2118 -8833:3:2119 -8834:3:2123 -8835:3:2124 -8836:3:2132 -8837:3:2137 -8838:3:2141 -8839:3:2142 -8840:3:2149 -8841:3:2150 -8842:3:2161 -8843:3:2169 -8844:3:2170 -8845:3:2174 -8846:3:2179 -8847:3:2180 -8848:0:2565 -8849:3:2192 -8850:0:2565 -8851:2:477 -8852:2:481 -8853:2:482 -8854:2:490 -8855:2:491 -8856:2:495 -8857:2:496 -8858:2:504 -8859:2:509 -8860:2:513 -8861:2:514 -8862:2:521 -8863:2:522 -8864:2:533 -8865:2:534 -8866:2:535 -8867:2:546 -8868:2:551 -8869:2:552 -8870:0:2565 -8871:3:2013 -8872:0:2565 -8873:1:296 -8874:0:2565 -8875:3:2014 -8876:0:2565 -8877:3:2015 -8878:3:2019 -8879:3:2020 -8880:3:2028 -8881:3:2029 -8882:3:2033 -8883:3:2034 -8884:3:2042 -8885:3:2047 -8886:3:2051 -8887:3:2052 -8888:3:2059 -8889:3:2060 -8890:3:2071 -8891:3:2079 -8892:3:2080 -8893:3:2084 -8894:3:2089 -8895:3:2090 -8896:0:2565 -8897:3:2102 -8898:0:2565 -8899:3:2104 -8900:0:2565 -8901:3:2105 -8902:3:2109 -8903:3:2110 -8904:3:2118 -8905:3:2119 -8906:3:2123 -8907:3:2124 -8908:3:2132 -8909:3:2137 -8910:3:2141 -8911:3:2142 -8912:3:2149 -8913:3:2150 -8914:3:2161 -8915:3:2169 -8916:3:2170 -8917:3:2174 -8918:3:2179 -8919:3:2180 -8920:0:2565 -8921:3:2192 -8922:0:2565 -8923:3:2013 -8924:0:2565 -8925:1:295 -8926:0:2565 -8927:3:2014 -8928:0:2565 -8929:3:2015 -8930:3:2019 -8931:3:2020 -8932:3:2028 -8933:3:2029 -8934:3:2033 -8935:3:2034 -8936:3:2042 -8937:3:2047 -8938:3:2051 -8939:3:2052 -8940:3:2059 -8941:3:2060 -8942:3:2071 -8943:3:2079 -8944:3:2080 -8945:3:2084 -8946:3:2089 -8947:3:2090 -8948:0:2565 -8949:3:2102 -8950:0:2565 -8951:3:2104 -8952:0:2565 -8953:3:2105 -8954:3:2109 -8955:3:2110 -8956:3:2118 -8957:3:2119 -8958:3:2123 -8959:3:2124 -8960:3:2132 -8961:3:2137 -8962:3:2141 -8963:3:2142 -8964:3:2149 -8965:3:2150 -8966:3:2161 -8967:3:2169 -8968:3:2170 -8969:3:2174 -8970:3:2179 -8971:3:2180 -8972:0:2565 -8973:3:2192 -8974:0:2565 -8975:2:564 -8976:0:2565 -8977:3:2013 -8978:0:2565 -8979:1:296 -8980:0:2565 -8981:3:2014 -8982:0:2565 -8983:3:2015 -8984:3:2019 -8985:3:2020 -8986:3:2028 -8987:3:2029 -8988:3:2033 -8989:3:2034 -8990:3:2042 -8991:3:2047 -8992:3:2051 -8993:3:2052 -8994:3:2059 -8995:3:2060 -8996:3:2071 -8997:3:2079 -8998:3:2080 -8999:3:2084 -9000:3:2089 -9001:3:2090 -9002:0:2565 -9003:3:2102 -9004:0:2565 -9005:3:2104 -9006:0:2565 -9007:3:2105 -9008:3:2109 -9009:3:2110 -9010:3:2118 -9011:3:2119 -9012:3:2123 -9013:3:2124 -9014:3:2132 -9015:3:2137 -9016:3:2141 -9017:3:2142 -9018:3:2149 -9019:3:2150 -9020:3:2161 -9021:3:2169 -9022:3:2170 -9023:3:2174 -9024:3:2179 -9025:3:2180 -9026:0:2565 -9027:3:2192 -9028:0:2565 -9029:3:2013 -9030:0:2565 -9031:1:295 -9032:0:2565 -9033:3:2014 -9034:0:2565 -9035:3:2015 -9036:3:2019 -9037:3:2020 -9038:3:2028 -9039:3:2029 -9040:3:2033 -9041:3:2034 -9042:3:2042 -9043:3:2047 -9044:3:2051 -9045:3:2052 -9046:3:2059 -9047:3:2060 -9048:3:2071 -9049:3:2079 -9050:3:2080 -9051:3:2084 -9052:3:2089 -9053:3:2090 -9054:0:2565 -9055:3:2102 -9056:0:2565 -9057:3:2104 -9058:0:2565 -9059:3:2105 -9060:3:2109 -9061:3:2110 -9062:3:2118 -9063:3:2119 -9064:3:2123 -9065:3:2124 -9066:3:2132 -9067:3:2137 -9068:3:2141 -9069:3:2142 -9070:3:2149 -9071:3:2150 -9072:3:2161 -9073:3:2169 -9074:3:2170 -9075:3:2174 -9076:3:2179 -9077:3:2180 -9078:0:2565 -9079:3:2192 -9080:0:2565 -9081:2:565 -9082:2:569 -9083:2:570 -9084:2:578 -9085:2:579 -9086:2:583 -9087:2:584 -9088:2:592 -9089:2:597 -9090:2:601 -9091:2:602 -9092:2:609 -9093:2:610 -9094:2:621 -9095:2:622 -9096:2:623 -9097:2:634 -9098:2:639 -9099:2:640 -9100:0:2565 -9101:3:2013 -9102:0:2565 -9103:2:652 -9104:0:2565 -9105:1:296 -9106:0:2565 -9107:3:2014 -9108:0:2565 -9109:3:2015 -9110:3:2019 -9111:3:2020 -9112:3:2028 -9113:3:2029 -9114:3:2033 -9115:3:2034 -9116:3:2042 -9117:3:2047 -9118:3:2051 -9119:3:2052 -9120:3:2059 -9121:3:2060 -9122:3:2071 -9123:3:2079 -9124:3:2080 -9125:3:2084 -9126:3:2089 -9127:3:2090 -9128:0:2565 -9129:3:2102 -9130:0:2565 -9131:3:2104 -9132:0:2565 -9133:3:2105 -9134:3:2109 -9135:3:2110 -9136:3:2118 -9137:3:2119 -9138:3:2123 -9139:3:2124 -9140:3:2132 -9141:3:2137 -9142:3:2141 -9143:3:2142 -9144:3:2149 -9145:3:2150 -9146:3:2161 -9147:3:2169 -9148:3:2170 -9149:3:2174 -9150:3:2179 -9151:3:2180 -9152:0:2565 -9153:3:2192 -9154:0:2565 -9155:3:2013 -9156:0:2565 -9157:1:295 -9158:0:2565 -9159:3:2014 -9160:0:2565 -9161:3:2015 -9162:3:2019 -9163:3:2020 -9164:3:2028 -9165:3:2029 -9166:3:2033 -9167:3:2034 -9168:3:2042 -9169:3:2047 -9170:3:2051 -9171:3:2052 -9172:3:2059 -9173:3:2060 -9174:3:2071 -9175:3:2079 -9176:3:2080 -9177:3:2084 -9178:3:2089 -9179:3:2090 -9180:0:2565 -9181:3:2102 -9182:0:2565 -9183:3:2104 -9184:0:2565 -9185:3:2105 -9186:3:2109 -9187:3:2110 -9188:3:2118 -9189:3:2119 -9190:3:2123 -9191:3:2124 -9192:3:2132 -9193:3:2137 -9194:3:2141 -9195:3:2142 -9196:3:2149 -9197:3:2150 -9198:3:2161 -9199:3:2169 -9200:3:2170 -9201:3:2174 -9202:3:2179 -9203:3:2180 -9204:0:2565 -9205:3:2192 -9206:0:2565 -9207:2:653 -9208:0:2565 -9209:3:2013 -9210:0:2565 -9211:1:296 -9212:0:2565 -9213:3:2014 -9214:0:2565 -9215:3:2015 -9216:3:2019 -9217:3:2020 -9218:3:2028 -9219:3:2029 -9220:3:2033 -9221:3:2034 -9222:3:2042 -9223:3:2047 -9224:3:2051 -9225:3:2052 -9226:3:2059 -9227:3:2060 -9228:3:2071 -9229:3:2079 -9230:3:2080 -9231:3:2084 -9232:3:2089 -9233:3:2090 -9234:0:2565 -9235:3:2102 -9236:0:2565 -9237:3:2104 -9238:0:2565 -9239:3:2105 -9240:3:2109 -9241:3:2110 -9242:3:2118 -9243:3:2119 -9244:3:2123 -9245:3:2124 -9246:3:2132 -9247:3:2137 -9248:3:2141 -9249:3:2142 -9250:3:2149 -9251:3:2150 -9252:3:2161 -9253:3:2169 -9254:3:2170 -9255:3:2174 -9256:3:2179 -9257:3:2180 -9258:0:2565 -9259:3:2192 -9260:0:2565 -9261:3:2013 -9262:0:2565 -9263:1:295 -9264:0:2565 -9265:3:2014 -9266:0:2565 -9267:3:2015 -9268:3:2019 -9269:3:2020 -9270:3:2028 -9271:3:2029 -9272:3:2033 -9273:3:2034 -9274:3:2042 -9275:3:2047 -9276:3:2051 -9277:3:2052 -9278:3:2059 -9279:3:2060 -9280:3:2071 -9281:3:2079 -9282:3:2080 -9283:3:2084 -9284:3:2089 -9285:3:2090 -9286:0:2565 -9287:3:2102 -9288:0:2565 -9289:3:2104 -9290:0:2565 -9291:3:2105 -9292:3:2109 -9293:3:2110 -9294:3:2118 -9295:3:2119 -9296:3:2123 -9297:3:2124 -9298:3:2132 -9299:3:2137 -9300:3:2141 -9301:3:2142 -9302:3:2149 -9303:3:2150 -9304:3:2161 -9305:3:2169 -9306:3:2170 -9307:3:2174 -9308:3:2179 -9309:3:2180 -9310:0:2565 -9311:3:2192 -9312:0:2565 -9313:2:654 -9314:2:658 -9315:2:659 -9316:2:667 -9317:2:668 -9318:2:672 -9319:2:673 -9320:2:681 -9321:2:686 -9322:2:690 -9323:2:691 -9324:2:698 -9325:2:699 -9326:2:710 -9327:2:711 -9328:2:712 -9329:2:723 -9330:2:728 -9331:2:729 -9332:0:2565 -9333:3:2013 -9334:0:2565 -9335:1:296 -9336:0:2565 -9337:3:2014 -9338:0:2565 -9339:3:2015 -9340:3:2019 -9341:3:2020 -9342:3:2028 -9343:3:2029 -9344:3:2033 -9345:3:2034 -9346:3:2042 -9347:3:2047 -9348:3:2051 -9349:3:2052 -9350:3:2059 -9351:3:2060 -9352:3:2071 -9353:3:2079 -9354:3:2080 -9355:3:2084 -9356:3:2089 -9357:3:2090 -9358:0:2565 -9359:3:2102 -9360:0:2565 -9361:3:2104 -9362:0:2565 -9363:3:2105 -9364:3:2109 -9365:3:2110 -9366:3:2118 -9367:3:2119 -9368:3:2123 -9369:3:2124 -9370:3:2132 -9371:3:2137 -9372:3:2141 -9373:3:2142 -9374:3:2149 -9375:3:2150 -9376:3:2161 -9377:3:2169 -9378:3:2170 -9379:3:2174 -9380:3:2179 -9381:3:2180 -9382:0:2565 -9383:3:2192 -9384:0:2565 -9385:3:2013 -9386:0:2565 -9387:2:741 -9388:0:2565 -9389:2:750 -9390:0:2565 -9391:3:2014 -9392:0:2565 -9393:3:2015 -9394:3:2019 -9395:3:2020 -9396:3:2028 -9397:3:2029 -9398:3:2033 -9399:3:2034 -9400:3:2042 -9401:3:2047 -9402:3:2051 -9403:3:2052 -9404:3:2059 -9405:3:2060 -9406:3:2071 -9407:3:2079 -9408:3:2080 -9409:3:2084 -9410:3:2089 -9411:3:2090 -9412:0:2565 -9413:3:2102 -9414:0:2565 -9415:1:295 -9416:0:2565 -9417:2:753 -9418:0:2565 -9419:1:296 -9420:0:2565 -9421:3:2104 -9422:0:2565 -9423:3:2105 -9424:3:2109 -9425:3:2110 -9426:3:2118 -9427:3:2119 -9428:3:2123 -9429:3:2124 -9430:3:2132 -9431:3:2137 -9432:3:2141 -9433:3:2142 -9434:3:2149 -9435:3:2150 -9436:3:2161 -9437:3:2169 -9438:3:2170 -9439:3:2174 -9440:3:2179 -9441:3:2180 -9442:0:2565 -9443:3:2192 -9444:0:2565 -9445:3:2013 -9446:0:2565 -9447:3:2014 -9448:0:2565 -9449:3:2015 -9450:3:2019 -9451:3:2020 -9452:3:2028 -9453:3:2029 -9454:3:2033 -9455:3:2034 -9456:3:2042 -9457:3:2047 -9458:3:2051 -9459:3:2052 -9460:3:2059 -9461:3:2060 -9462:3:2071 -9463:3:2079 -9464:3:2080 -9465:3:2084 -9466:3:2089 -9467:3:2090 -9468:0:2565 -9469:3:2102 -9470:0:2565 -9471:1:295 -9472:0:2565 -9473:3:2104 -9474:0:2565 -9475:3:2105 -9476:3:2109 -9477:3:2110 -9478:3:2118 -9479:3:2119 -9480:3:2123 -9481:3:2124 -9482:3:2132 -9483:3:2137 -9484:3:2141 -9485:3:2142 -9486:3:2149 -9487:3:2150 -9488:3:2161 -9489:3:2169 -9490:3:2170 -9491:3:2174 -9492:3:2179 -9493:3:2180 -9494:0:2565 -9495:3:2192 -9496:0:2565 -9497:3:2013 -9498:0:2565 -9499:3:2014 -9500:0:2565 -9501:3:2015 -9502:3:2019 -9503:3:2020 -9504:3:2028 -9505:3:2029 -9506:3:2033 -9507:3:2034 -9508:3:2042 -9509:3:2047 -9510:3:2051 -9511:3:2052 -9512:3:2059 -9513:3:2060 -9514:3:2071 -9515:3:2079 -9516:3:2080 -9517:3:2084 -9518:3:2089 -9519:3:2090 -9520:0:2565 -9521:2:758 -9522:0:2565 -9523:3:2102 -9524:0:2565 -9525:1:296 -9526:0:2565 -9527:3:2104 -9528:0:2565 -9529:3:2105 -9530:3:2109 -9531:3:2110 -9532:3:2118 -9533:3:2119 -9534:3:2123 -9535:3:2124 -9536:3:2132 -9537:3:2137 -9538:3:2141 -9539:3:2142 -9540:3:2149 -9541:3:2150 -9542:3:2161 -9543:3:2169 -9544:3:2170 -9545:3:2174 -9546:3:2179 -9547:3:2180 -9548:0:2565 -9549:3:2192 -9550:0:2565 -9551:3:2013 -9552:0:2565 -9553:3:2014 -9554:0:2565 -9555:3:2015 -9556:3:2019 -9557:3:2020 -9558:3:2028 -9559:3:2029 -9560:3:2033 -9561:3:2034 -9562:3:2042 -9563:3:2047 -9564:3:2051 -9565:3:2052 -9566:3:2059 -9567:3:2060 -9568:3:2071 -9569:3:2079 -9570:3:2080 -9571:3:2084 -9572:3:2089 -9573:3:2090 -9574:0:2565 -9575:3:2102 -9576:0:2565 -9577:1:295 -9578:0:2565 -9579:3:2104 -9580:0:2565 -9581:3:2105 -9582:3:2109 -9583:3:2110 -9584:3:2118 -9585:3:2119 -9586:3:2123 -9587:3:2124 -9588:3:2132 -9589:3:2137 -9590:3:2141 -9591:3:2142 -9592:3:2149 -9593:3:2150 -9594:3:2161 -9595:3:2169 -9596:3:2170 -9597:3:2174 -9598:3:2179 -9599:3:2180 -9600:0:2565 -9601:3:2192 -9602:0:2565 -9603:3:2013 -9604:0:2565 -9605:3:2014 -9606:0:2565 -9607:3:2015 -9608:3:2019 -9609:3:2020 -9610:3:2028 -9611:3:2029 -9612:3:2033 -9613:3:2034 -9614:3:2042 -9615:3:2047 -9616:3:2051 -9617:3:2052 -9618:3:2059 -9619:3:2060 -9620:3:2071 -9621:3:2079 -9622:3:2080 -9623:3:2084 -9624:3:2089 -9625:3:2090 -9626:0:2565 -9627:2:759 -9628:0:2565 -9629:3:2102 -9630:0:2565 -9631:1:296 -9632:0:2565 -9633:3:2104 -9634:0:2565 -9635:3:2105 -9636:3:2109 -9637:3:2110 -9638:3:2118 -9639:3:2119 -9640:3:2123 -9641:3:2124 -9642:3:2132 -9643:3:2137 -9644:3:2141 -9645:3:2142 -9646:3:2149 -9647:3:2150 -9648:3:2161 -9649:3:2169 -9650:3:2170 -9651:3:2174 -9652:3:2179 -9653:3:2180 -9654:0:2565 -9655:3:2192 -9656:0:2565 -9657:3:2013 -9658:0:2565 -9659:3:2014 -9660:0:2565 -9661:3:2015 -9662:3:2019 -9663:3:2020 -9664:3:2028 -9665:3:2029 -9666:3:2033 -9667:3:2034 -9668:3:2042 -9669:3:2047 -9670:3:2051 -9671:3:2052 -9672:3:2059 -9673:3:2060 -9674:3:2071 -9675:3:2079 -9676:3:2080 -9677:3:2084 -9678:3:2089 -9679:3:2090 -9680:0:2565 -9681:3:2102 -9682:0:2565 -9683:2:760 -9684:0:2565 -9685:2:761 -9686:0:2565 -9687:2:762 -9688:0:2565 -9689:3:2104 -9690:0:2565 -9691:3:2105 -9692:3:2109 -9693:3:2110 -9694:3:2118 -9695:3:2119 -9696:3:2123 -9697:3:2124 -9698:3:2132 -9699:3:2137 -9700:3:2141 -9701:3:2142 -9702:3:2149 -9703:3:2150 -9704:3:2161 -9705:3:2169 -9706:3:2170 -9707:3:2174 -9708:3:2179 -9709:3:2180 -9710:0:2565 -9711:3:2192 -9712:0:2565 -9713:3:2013 -9714:0:2565 -9715:1:295 -9716:0:2565 -9717:2:763 -9718:0:2565 -9719:1:296 -9720:0:2565 -9721:3:2014 -9722:0:2565 -9723:3:2015 -9724:3:2019 -9725:3:2020 -9726:3:2028 -9727:3:2029 -9728:3:2033 -9729:3:2034 -9730:3:2042 -9731:3:2047 -9732:3:2051 -9733:3:2052 -9734:3:2059 -9735:3:2060 -9736:3:2071 -9737:3:2079 -9738:3:2080 -9739:3:2084 -9740:3:2089 -9741:3:2090 -9742:0:2565 -9743:3:2102 -9744:0:2565 -9745:3:2104 -9746:0:2565 -9747:3:2105 -9748:3:2109 -9749:3:2110 -9750:3:2118 -9751:3:2119 -9752:3:2123 -9753:3:2124 -9754:3:2132 -9755:3:2137 -9756:3:2141 -9757:3:2142 -9758:3:2149 -9759:3:2150 -9760:3:2161 -9761:3:2169 -9762:3:2170 -9763:3:2174 -9764:3:2179 -9765:3:2180 -9766:0:2565 -9767:3:2192 -9768:0:2565 -9769:3:2013 -9770:0:2565 -9771:1:295 -9772:0:2565 -9773:3:2014 -9774:0:2565 -9775:3:2015 -9776:3:2019 -9777:3:2020 -9778:3:2028 -9779:3:2029 -9780:3:2033 -9781:3:2034 -9782:3:2042 -9783:3:2047 -9784:3:2051 -9785:3:2052 -9786:3:2059 -9787:3:2060 -9788:3:2071 -9789:3:2079 -9790:3:2080 -9791:3:2084 -9792:3:2089 -9793:3:2090 -9794:0:2565 -9795:3:2102 -9796:0:2565 -9797:3:2104 -9798:0:2565 -9799:3:2105 -9800:3:2109 -9801:3:2110 -9802:3:2118 -9803:3:2119 -9804:3:2123 -9805:3:2124 -9806:3:2132 -9807:3:2137 -9808:3:2141 -9809:3:2142 -9810:3:2149 -9811:3:2150 -9812:3:2161 -9813:3:2169 -9814:3:2170 -9815:3:2174 -9816:3:2179 -9817:3:2180 -9818:0:2565 -9819:3:2192 -9820:0:2565 -9821:2:765 -9822:0:2565 -9823:3:2013 -9824:0:2565 -9825:1:296 -9826:0:2565 -9827:3:2014 -9828:0:2565 -9829:3:2015 -9830:3:2019 -9831:3:2020 -9832:3:2028 -9833:3:2029 -9834:3:2033 -9835:3:2034 -9836:3:2042 -9837:3:2047 -9838:3:2051 -9839:3:2052 -9840:3:2059 -9841:3:2060 -9842:3:2071 -9843:3:2079 -9844:3:2080 -9845:3:2084 -9846:3:2089 -9847:3:2090 -9848:0:2565 -9849:3:2102 -9850:0:2565 -9851:3:2104 -9852:0:2565 -9853:3:2105 -9854:3:2109 -9855:3:2110 -9856:3:2118 -9857:3:2119 -9858:3:2123 -9859:3:2124 -9860:3:2132 -9861:3:2137 -9862:3:2141 -9863:3:2142 -9864:3:2149 -9865:3:2150 -9866:3:2161 -9867:3:2169 -9868:3:2170 -9869:3:2174 -9870:3:2179 -9871:3:2180 -9872:0:2565 -9873:3:2192 -9874:0:2565 -9875:3:2013 -9876:0:2565 -9877:2:766 -9878:2:770 -9879:2:771 -9880:2:779 -9881:2:788 -9882:2:789 -9883:2:793 -9884:2:798 -9885:2:802 -9886:2:803 -9887:2:810 -9888:2:811 -9889:2:822 -9890:2:823 -9891:2:826 -9892:2:827 -9893:2:835 -9894:2:840 -9895:2:841 -9896:0:2565 -9897:3:2014 -9898:0:2565 -9899:3:2015 -9900:3:2019 -9901:3:2020 -9902:3:2028 -9903:3:2029 -9904:3:2033 -9905:3:2034 -9906:3:2042 -9907:3:2047 -9908:3:2051 -9909:3:2052 -9910:3:2059 -9911:3:2060 -9912:3:2071 -9913:3:2079 -9914:3:2080 -9915:3:2084 -9916:3:2089 -9917:3:2090 -9918:0:2565 -9919:3:2102 -9920:0:2565 -9921:3:2104 -9922:0:2565 -9923:3:2105 -9924:3:2109 -9925:3:2110 -9926:3:2118 -9927:3:2119 -9928:3:2123 -9929:3:2124 -9930:3:2132 -9931:3:2137 -9932:3:2141 -9933:3:2142 -9934:3:2149 -9935:3:2150 -9936:3:2161 -9937:3:2169 -9938:3:2170 -9939:3:2174 -9940:3:2179 -9941:3:2180 -9942:0:2565 -9943:3:2192 -9944:0:2565 -9945:2:853 -9946:0:2565 -9947:3:2013 -9948:0:2565 -9949:2:857 -9950:0:2565 -9951:2:465 -9952:0:2565 -9953:3:2014 -9954:0:2565 -9955:3:2015 -9956:3:2019 -9957:3:2020 -9958:3:2028 -9959:3:2029 -9960:3:2033 -9961:3:2034 -9962:3:2042 -9963:3:2047 -9964:3:2051 -9965:3:2052 -9966:3:2059 -9967:3:2060 -9968:3:2071 -9969:3:2079 -9970:3:2080 -9971:3:2084 -9972:3:2089 -9973:3:2090 -9974:0:2565 -9975:3:2102 -9976:0:2565 -9977:3:2104 -9978:0:2565 -9979:3:2105 -9980:3:2109 -9981:3:2110 -9982:3:2118 -9983:3:2119 -9984:3:2123 -9985:3:2124 -9986:3:2132 -9987:3:2137 -9988:3:2141 -9989:3:2142 -9990:3:2149 -9991:3:2150 -9992:3:2161 -9993:3:2169 -9994:3:2170 -9995:3:2174 -9996:3:2179 -9997:3:2180 -9998:0:2565 -9999:3:2192 -10000:0:2565 -10001:2:466 -10002:0:2565 -10003:3:2013 -10004:0:2565 -10005:3:2014 -10006:0:2565 -10007:3:2015 -10008:3:2019 -10009:3:2020 -10010:3:2028 -10011:3:2029 -10012:3:2033 -10013:3:2034 -10014:3:2042 -10015:3:2047 -10016:3:2051 -10017:3:2052 -10018:3:2059 -10019:3:2060 -10020:3:2071 -10021:3:2079 -10022:3:2080 -10023:3:2084 -10024:3:2089 -10025:3:2090 -10026:0:2565 -10027:3:2102 -10028:0:2565 -10029:3:2104 -10030:0:2565 -10031:3:2105 -10032:3:2109 -10033:3:2110 -10034:3:2118 -10035:3:2119 -10036:3:2123 -10037:3:2124 -10038:3:2132 -10039:3:2137 -10040:3:2141 -10041:3:2142 -10042:3:2149 -10043:3:2150 -10044:3:2161 -10045:3:2169 -10046:3:2170 -10047:3:2174 -10048:3:2179 -10049:3:2180 -10050:0:2565 -10051:2:467 -10052:0:2565 -10053:3:2192 -10054:0:2565 -10055:3:2013 -10056:0:2565 -10057:3:2014 -10058:0:2565 -10059:3:2015 -10060:3:2019 -10061:3:2020 -10062:3:2028 -10063:3:2029 -10064:3:2033 -10065:3:2034 -10066:3:2042 -10067:3:2047 -10068:3:2051 -10069:3:2052 -10070:3:2059 -10071:3:2060 -10072:3:2071 -10073:3:2079 -10074:3:2080 -10075:3:2084 -10076:3:2089 -10077:3:2090 -10078:0:2565 -10079:3:2102 -10080:0:2565 -10081:3:2104 -10082:0:2565 -10083:1:297 -10084:0:2565 -10085:2:468 -10086:0:2565 -10087:3:2105 -10088:3:2109 -10089:3:2110 -10090:3:2118 -10091:3:2119 -10092:3:2123 -10093:3:2124 -10094:3:2132 -10095:3:2137 -10096:3:2141 -10097:3:2142 -10098:3:2149 -10099:3:2150 -10100:3:2161 -10101:3:2169 -10102:3:2170 -10103:3:2174 -10104:3:2179 -10105:3:2180 -10106:0:2565 -10107:3:2192 -10108:0:2565 -10109:3:2013 -10110:0:2565 -10111:3:2014 -10112:0:2565 -10113:3:2015 -10114:3:2019 -10115:3:2020 -10116:3:2028 -10117:3:2029 -10118:3:2033 -10119:3:2034 -10120:3:2042 -10121:3:2047 -10122:3:2051 -10123:3:2052 -10124:3:2059 -10125:3:2060 -10126:3:2071 -10127:3:2079 -10128:3:2080 -10129:3:2084 -10130:3:2089 -10131:3:2090 -10132:0:2565 -10133:3:2102 -10134:0:2565 -10135:3:2104 -10136:0:2565 -10137:2:467 -10138:0:2565 -10139:2:468 -10140:0:2565 -10141:3:2105 -10142:3:2109 -10143:3:2110 -10144:3:2118 -10145:3:2119 -10146:3:2123 -10147:3:2124 -10148:3:2132 -10149:3:2137 -10150:3:2141 -10151:3:2142 -10152:3:2149 -10153:3:2150 -10154:3:2161 -10155:3:2169 -10156:3:2170 -10157:3:2174 -10158:3:2179 -10159:3:2180 -10160:0:2565 -10161:3:2192 -10162:0:2565 -10163:3:2013 -10164:0:2565 -10165:3:2014 -10166:0:2565 -10167:3:2015 -10168:3:2019 -10169:3:2020 -10170:3:2028 -10171:3:2029 -10172:3:2033 -10173:3:2034 -10174:3:2042 -10175:3:2047 -10176:3:2051 -10177:3:2052 -10178:3:2059 -10179:3:2060 -10180:3:2071 -10181:3:2079 -10182:3:2080 -10183:3:2084 -10184:3:2089 -10185:3:2090 -10186:0:2565 -10187:3:2102 -10188:0:2565 -10189:2:467 -10190:0:2565 -10191:1:303 -10192:0:2565 -10193:2:468 -10194:0:2565 -10195:1:312 -10196:0:2565 -10197:3:2104 -10198:0:2565 -10199:3:2105 -10200:3:2109 -10201:3:2110 -10202:3:2118 -10203:3:2119 -10204:3:2123 -10205:3:2124 -10206:3:2132 -10207:3:2137 -10208:3:2141 -10209:3:2142 -10210:3:2149 -10211:3:2150 -10212:3:2161 -10213:3:2169 -10214:3:2170 -10215:3:2174 -10216:3:2179 -10217:3:2180 -10218:0:2565 -10219:3:2192 -10220:0:2565 -10221:3:2013 -10222:0:2565 -10223:3:2014 -10224:0:2565 -10225:3:2015 -10226:3:2019 -10227:3:2020 -10228:3:2028 -10229:3:2029 -10230:3:2033 -10231:3:2034 -10232:3:2042 -10233:3:2047 -10234:3:2051 -10235:3:2052 -10236:3:2059 -10237:3:2060 -10238:3:2071 -10239:3:2079 -10240:3:2080 -10241:3:2084 -10242:3:2089 -10243:3:2090 -10244:0:2565 -10245:3:2102 -10246:0:2565 -10247:2:467 -10248:0:2565 -10249:2:468 -10250:0:2565 -10251:3:2104 -10252:0:2565 -10253:3:2105 -10254:3:2109 -10255:3:2110 -10256:3:2118 -10257:3:2119 -10258:3:2123 -10259:3:2124 -10260:3:2132 -10261:3:2137 -10262:3:2141 -10263:3:2142 -10264:3:2149 -10265:3:2150 -10266:3:2161 -10267:3:2169 -10268:3:2170 -10269:3:2174 -10270:3:2179 -10271:3:2180 -10272:0:2565 -10273:3:2192 -10274:0:2565 -10275:3:2013 -10276:0:2565 -10277:3:2014 -10278:0:2565 -10279:3:2015 -10280:3:2019 -10281:3:2020 -10282:3:2028 -10283:3:2029 -10284:3:2033 -10285:3:2034 -10286:3:2042 -10287:3:2047 -10288:3:2051 -10289:3:2052 -10290:3:2059 -10291:3:2060 -10292:3:2071 -10293:3:2079 -10294:3:2080 -10295:3:2084 -10296:3:2089 -10297:3:2090 -10298:0:2565 -10299:2:467 -10300:0:2565 -10301:1:314 -10302:0:2565 -10303:3:2102 -10304:0:2565 -10305:2:468 -10306:0:2565 -10307:3:2104 -10308:0:2565 -10309:3:2105 -10310:3:2109 -10311:3:2110 -10312:3:2118 -10313:3:2119 -10314:3:2123 -10315:3:2124 -10316:3:2132 -10317:3:2137 -10318:3:2141 -10319:3:2142 -10320:3:2149 -10321:3:2150 -10322:3:2161 -10323:3:2169 -10324:3:2170 -10325:3:2174 -10326:3:2179 -10327:3:2180 -10328:0:2565 -10329:3:2192 -10330:0:2565 -10331:3:2013 -10332:0:2565 -10333:3:2014 -10334:0:2565 -10335:3:2015 -10336:3:2019 -10337:3:2020 -10338:3:2028 -10339:3:2029 -10340:3:2033 -10341:3:2034 -10342:3:2042 -10343:3:2047 -10344:3:2051 -10345:3:2052 -10346:3:2059 -10347:3:2060 -10348:3:2071 -10349:3:2079 -10350:3:2080 -10351:3:2084 -10352:3:2089 -10353:3:2090 -10354:0:2565 -10355:2:469 -10356:0:2565 -10357:3:2102 -10358:0:2565 -10359:2:475 -10360:0:2565 -10361:2:476 -10362:0:2565 -10363:3:2104 -10364:0:2565 -10365:3:2105 -10366:3:2109 -10367:3:2110 -10368:3:2118 -10369:3:2119 -10370:3:2123 -10371:3:2124 -10372:3:2132 -10373:3:2137 -10374:3:2141 -10375:3:2142 -10376:3:2149 -10377:3:2150 -10378:3:2161 -10379:3:2169 -10380:3:2170 -10381:3:2174 -10382:3:2179 -10383:3:2180 -10384:0:2565 -10385:3:2192 -10386:0:2565 -10387:3:2013 -10388:0:2565 -10389:3:2014 -10390:0:2565 -10391:3:2015 -10392:3:2019 -10393:3:2020 -10394:3:2028 -10395:3:2029 -10396:3:2033 -10397:3:2034 -10398:3:2042 -10399:3:2047 -10400:3:2051 -10401:3:2052 -10402:3:2059 -10403:3:2060 -10404:3:2071 -10405:3:2079 -10406:3:2080 -10407:3:2084 -10408:3:2089 -10409:3:2090 -10410:0:2565 -10411:2:477 -10412:2:481 -10413:2:482 -10414:2:490 -10415:2:499 -10416:2:500 -10417:2:504 -10418:2:509 -10419:2:513 -10420:2:514 -10421:2:521 -10422:2:522 -10423:2:533 -10424:2:534 -10425:2:537 -10426:2:538 -10427:2:546 -10428:2:551 -10429:2:552 -10430:0:2565 -10431:3:2102 -10432:0:2565 -10433:3:2104 -10434:0:2565 -10435:3:2105 -10436:3:2109 -10437:3:2110 -10438:3:2118 -10439:3:2119 -10440:3:2123 -10441:3:2124 -10442:3:2132 -10443:3:2137 -10444:3:2141 -10445:3:2142 -10446:3:2149 -10447:3:2150 -10448:3:2161 -10449:3:2169 -10450:3:2170 -10451:3:2174 -10452:3:2179 -10453:3:2180 -10454:0:2565 -10455:3:2192 -10456:0:2565 -10457:3:2013 -10458:0:2565 -10459:3:2014 -10460:0:2565 -10461:2:564 -10462:0:2565 -10463:3:2015 -10464:3:2019 -10465:3:2020 -10466:3:2028 -10467:3:2029 -10468:3:2033 -10469:3:2034 -10470:3:2042 -10471:3:2047 -10472:3:2051 -10473:3:2052 -10474:3:2059 -10475:3:2060 -10476:3:2071 -10477:3:2079 -10478:3:2080 -10479:3:2084 -10480:3:2089 -10481:3:2090 -10482:0:2565 -10483:3:2102 -10484:0:2565 -10485:3:2104 -10486:0:2565 -10487:3:2105 -10488:3:2109 -10489:3:2110 -10490:3:2118 -10491:3:2119 -10492:3:2123 -10493:3:2124 -10494:3:2132 -10495:3:2137 -10496:3:2141 -10497:3:2142 -10498:3:2149 -10499:3:2150 -10500:3:2161 -10501:3:2169 -10502:3:2170 -10503:3:2174 -10504:3:2179 -10505:3:2180 -10506:0:2565 -10507:3:2192 -10508:0:2565 -10509:3:2013 -10510:0:2565 -10511:2:565 -10512:2:569 -10513:2:570 -10514:2:578 -10515:2:587 -10516:2:588 -10517:2:592 -10518:2:597 -10519:2:601 -10520:2:602 -10521:2:609 -10522:2:610 -10523:2:621 -10524:2:622 -10525:2:625 -10526:2:626 -10527:2:634 -10528:2:639 -10529:2:640 -10530:0:2565 -10531:2:744 -10532:0:2565 -10533:3:2014 -10534:0:2565 -10535:3:2015 -10536:3:2019 -10537:3:2020 -10538:3:2028 -10539:3:2029 -10540:3:2033 -10541:3:2034 -10542:3:2042 -10543:3:2047 -10544:3:2051 -10545:3:2052 -10546:3:2059 -10547:3:2060 -10548:3:2071 -10549:3:2079 -10550:3:2080 -10551:3:2084 -10552:3:2089 -10553:3:2090 -10554:0:2565 -10555:3:2102 -10556:0:2565 -10557:3:2104 -10558:0:2565 -10559:3:2105 -10560:3:2109 -10561:3:2110 -10562:3:2118 -10563:3:2119 -10564:3:2123 -10565:3:2124 -10566:3:2132 -10567:3:2137 -10568:3:2141 -10569:3:2142 -10570:3:2149 -10571:3:2150 -10572:3:2161 -10573:3:2169 -10574:3:2170 -10575:3:2174 -10576:3:2179 -10577:3:2180 -10578:0:2565 -10579:3:2192 -10580:0:2565 -10581:2:745 -10582:0:2565 -10583:3:2013 -10584:0:2565 -10585:2:750 -10586:0:2565 -10587:2:753 -10588:0:2565 -10589:3:2014 -10590:0:2565 -10591:3:2015 -10592:3:2019 -10593:3:2020 -10594:3:2028 -10595:3:2029 -10596:3:2033 -10597:3:2034 -10598:3:2042 -10599:3:2047 -10600:3:2051 -10601:3:2052 -10602:3:2059 -10603:3:2060 -10604:3:2071 -10605:3:2079 -10606:3:2080 -10607:3:2084 -10608:3:2089 -10609:3:2090 -10610:0:2565 -10611:3:2102 -10612:0:2565 -10613:3:2104 -10614:0:2565 -10615:3:2105 -10616:3:2109 -10617:3:2110 -10618:3:2118 -10619:3:2119 -10620:3:2123 -10621:3:2124 -10622:3:2132 -10623:3:2137 -10624:3:2141 -10625:3:2142 -10626:3:2149 -10627:3:2150 -10628:3:2161 -10629:3:2169 -10630:3:2170 -10631:3:2174 -10632:3:2179 -10633:3:2180 -10634:0:2565 -10635:3:2192 -10636:0:2565 -10637:2:758 -10638:0:2565 -10639:3:2013 -10640:0:2565 -10641:3:2014 -10642:0:2565 -10643:3:2015 -10644:3:2019 -10645:3:2020 -10646:3:2028 -10647:3:2029 -10648:3:2033 -10649:3:2034 -10650:3:2042 -10651:3:2047 -10652:3:2051 -10653:3:2052 -10654:3:2059 -10655:3:2060 -10656:3:2071 -10657:3:2079 -10658:3:2080 -10659:3:2084 -10660:3:2089 -10661:3:2090 -10662:0:2565 -10663:3:2102 -10664:0:2565 -10665:3:2104 -10666:0:2565 -10667:3:2105 -10668:3:2109 -10669:3:2110 -10670:3:2118 -10671:3:2119 -10672:3:2123 -10673:3:2124 -10674:3:2132 -10675:3:2137 -10676:3:2141 -10677:3:2142 -10678:3:2149 -10679:3:2150 -10680:3:2161 -10681:3:2169 -10682:3:2170 -10683:3:2174 -10684:3:2179 -10685:3:2180 -10686:0:2565 -10687:2:759 -10688:0:2565 -10689:3:2192 -10690:0:2565 -10691:3:2013 -10692:0:2565 -10693:3:2014 -10694:0:2565 -10695:3:2015 -10696:3:2019 -10697:3:2020 -10698:3:2028 -10699:3:2029 -10700:3:2033 -10701:3:2034 -10702:3:2042 -10703:3:2047 -10704:3:2051 -10705:3:2052 -10706:3:2059 -10707:3:2060 -10708:3:2071 -10709:3:2079 -10710:3:2080 -10711:3:2084 -10712:3:2089 -10713:3:2090 -10714:0:2565 -10715:3:2102 -10716:0:2565 -10717:3:2104 -10718:0:2565 -10719:2:760 -10720:0:2565 -10721:2:761 -10722:0:2565 -10723:2:762 -10724:0:2565 -10725:2:763 -10726:0:2565 -10727:3:2105 -10728:3:2109 -10729:3:2110 -10730:3:2118 -10731:3:2119 -10732:3:2123 -10733:3:2124 -10734:3:2132 -10735:3:2137 -10736:3:2141 -10737:3:2142 -10738:3:2149 -10739:3:2150 -10740:3:2161 -10741:3:2169 -10742:3:2170 -10743:3:2174 -10744:3:2179 -10745:3:2180 -10746:0:2565 -10747:3:2192 -10748:0:2565 -10749:3:2013 -10750:0:2565 -10751:3:2014 -10752:0:2565 -10753:3:2015 -10754:3:2019 -10755:3:2020 -10756:3:2028 -10757:3:2029 -10758:3:2033 -10759:3:2034 -10760:3:2042 -10761:3:2047 -10762:3:2051 -10763:3:2052 -10764:3:2059 -10765:3:2060 -10766:3:2071 -10767:3:2079 -10768:3:2080 -10769:3:2084 -10770:3:2089 -10771:3:2090 -10772:0:2565 -10773:3:2102 -10774:0:2565 -10775:2:765 -10776:0:2565 -10777:3:2104 -10778:0:2565 -10779:3:2105 -10780:3:2109 -10781:3:2110 -10782:3:2118 -10783:3:2119 -10784:3:2123 -10785:3:2124 -10786:3:2132 -10787:3:2137 -10788:3:2141 -10789:3:2142 -10790:3:2149 -10791:3:2150 -10792:3:2161 -10793:3:2169 -10794:3:2170 -10795:3:2174 -10796:3:2179 -10797:3:2180 -10798:0:2565 -10799:3:2192 -10800:0:2565 -10801:3:2013 -10802:0:2565 -10803:3:2014 -10804:0:2565 -10805:3:2015 -10806:3:2019 -10807:3:2020 -10808:3:2028 -10809:3:2029 -10810:3:2033 -10811:3:2034 -10812:3:2042 -10813:3:2047 -10814:3:2051 -10815:3:2052 -10816:3:2059 -10817:3:2060 -10818:3:2071 -10819:3:2079 -10820:3:2080 -10821:3:2084 -10822:3:2089 -10823:3:2090 -10824:0:2565 -10825:2:766 -10826:2:770 -10827:2:771 -10828:2:779 -10829:2:788 -10830:2:789 -10831:2:793 -10832:2:798 -10833:2:802 -10834:2:803 -10835:2:810 -10836:2:811 -10837:2:822 -10838:2:823 -10839:2:826 -10840:2:827 -10841:2:835 -10842:2:840 -10843:2:841 -10844:0:2565 -10845:3:2102 -10846:0:2565 -10847:3:2104 -10848:0:2565 -10849:3:2105 -10850:3:2109 -10851:3:2110 -10852:3:2118 -10853:3:2119 -10854:3:2123 -10855:3:2124 -10856:3:2132 -10857:3:2137 -10858:3:2141 -10859:3:2142 -10860:3:2149 -10861:3:2150 -10862:3:2161 -10863:3:2169 -10864:3:2170 -10865:3:2174 -10866:3:2179 -10867:3:2180 -10868:0:2565 -10869:3:2192 -10870:0:2565 -10871:3:2013 -10872:0:2565 -10873:3:2014 -10874:0:2565 -10875:2:853 -10876:0:2565 -10877:2:857 -10878:0:2565 -10879:2:465 -10880:0:2565 -10881:3:2015 -10882:3:2019 -10883:3:2020 -10884:3:2028 -10885:3:2029 -10886:3:2033 -10887:3:2034 -10888:3:2042 -10889:3:2047 -10890:3:2051 -10891:3:2052 -10892:3:2059 -10893:3:2060 -10894:3:2071 -10895:3:2079 -10896:3:2080 -10897:3:2084 -10898:3:2089 -10899:3:2090 -10900:0:2565 -10901:3:2102 -10902:0:2565 -10903:3:2104 -10904:0:2565 -10905:3:2105 -10906:3:2109 -10907:3:2110 -10908:3:2118 -10909:3:2119 -10910:3:2123 -10911:3:2124 -10912:3:2132 -10913:3:2137 -10914:3:2141 -10915:3:2142 -10916:3:2149 -10917:3:2150 -10918:3:2161 -10919:3:2169 -10920:3:2170 -10921:3:2174 -10922:3:2179 -10923:3:2180 -10924:0:2565 -10925:3:2192 -10926:0:2565 -10927:3:2013 -10928:0:2565 -10929:2:466 -10930:0:2565 -10931:3:2014 -10932:0:2565 -10933:3:2015 -10934:3:2019 -10935:3:2020 -10936:3:2028 -10937:3:2029 -10938:3:2033 -10939:3:2034 -10940:3:2042 -10941:3:2047 -10942:3:2051 -10943:3:2052 -10944:3:2059 -10945:3:2060 -10946:3:2071 -10947:3:2079 -10948:3:2080 -10949:3:2084 -10950:3:2089 -10951:3:2090 -10952:0:2565 -10953:3:2102 -10954:0:2565 -10955:3:2104 -10956:0:2565 -10957:3:2105 -10958:3:2109 -10959:3:2110 -10960:3:2118 -10961:3:2119 -10962:3:2123 -10963:3:2124 -10964:3:2132 -10965:3:2137 -10966:3:2141 -10967:3:2142 -10968:3:2149 -10969:3:2150 -10970:3:2161 -10971:3:2169 -10972:3:2170 -10973:3:2174 -10974:3:2179 -10975:3:2180 -10976:0:2565 -10977:3:2192 -10978:0:2565 -10979:2:467 -10980:0:2565 -10981:3:2013 -10982:0:2565 -10983:3:2014 -10984:0:2565 -10985:3:2015 -10986:3:2019 -10987:3:2020 -10988:3:2028 -10989:3:2029 -10990:3:2033 -10991:3:2034 -10992:3:2042 -10993:3:2047 -10994:3:2051 -10995:3:2052 -10996:3:2059 -10997:3:2060 -10998:3:2071 -10999:3:2079 -11000:3:2080 -11001:3:2084 -11002:3:2089 -11003:3:2090 -11004:0:2565 -11005:3:2102 -11006:0:2565 -11007:3:2104 -11008:0:2565 -11009:3:2105 -11010:3:2109 -11011:3:2110 -11012:3:2118 -11013:3:2119 -11014:3:2123 -11015:3:2124 -11016:3:2132 -11017:3:2137 -11018:3:2141 -11019:3:2142 -11020:3:2149 -11021:3:2150 -11022:3:2161 -11023:3:2169 -11024:3:2170 -11025:3:2174 -11026:3:2179 -11027:3:2180 -11028:0:2565 -11029:1:317 -11030:0:2565 -11031:3:2192 -11032:0:2565 -11033:3:2013 -11034:0:2565 -11035:2:468 -11036:0:2565 -11037:1:323 -11038:0:2565 -11039:1:324 -11040:0:2565 -11041:3:2014 -11042:0:2565 -11043:3:2015 -11044:3:2019 -11045:3:2020 -11046:3:2028 -11047:3:2029 -11048:3:2033 -11049:3:2034 -11050:3:2042 -11051:3:2047 -11052:3:2051 -11053:3:2052 -11054:3:2059 -11055:3:2060 -11056:3:2071 -11057:3:2079 -11058:3:2080 -11059:3:2084 -11060:3:2089 -11061:3:2090 -11062:0:2565 -11063:3:2102 -11064:0:2565 -11065:3:2104 -11066:0:2565 -11067:3:2105 -11068:3:2109 -11069:3:2110 -11070:3:2118 -11071:3:2119 -11072:3:2123 -11073:3:2124 -11074:3:2132 -11075:3:2137 -11076:3:2141 -11077:3:2142 -11078:3:2149 -11079:3:2150 -11080:3:2161 -11081:3:2169 -11082:3:2170 -11083:3:2174 -11084:3:2179 -11085:3:2180 -11086:0:2565 -11087:3:2192 -11088:0:2565 -11089:3:2013 -11090:0:2565 -11091:2:467 -11092:0:2565 -11093:2:468 -11094:0:2565 -11095:3:2014 -11096:0:2565 -11097:3:2015 -11098:3:2019 -11099:3:2020 -11100:3:2028 -11101:3:2029 -11102:3:2033 -11103:3:2034 -11104:3:2042 -11105:3:2047 -11106:3:2051 -11107:3:2052 -11108:3:2059 -11109:3:2060 -11110:3:2071 -11111:3:2079 -11112:3:2080 -11113:3:2084 -11114:3:2089 -11115:3:2090 -11116:0:2565 -11117:3:2102 -11118:0:2565 -11119:3:2104 -11120:0:2565 -11121:3:2105 -11122:3:2109 -11123:3:2110 -11124:3:2118 -11125:3:2119 -11126:3:2123 -11127:3:2124 -11128:3:2132 -11129:3:2137 -11130:3:2141 -11131:3:2142 -11132:3:2149 -11133:3:2150 -11134:3:2161 -11135:3:2169 -11136:3:2170 -11137:3:2174 -11138:3:2179 -11139:3:2180 -11140:0:2565 -11141:3:2192 -11142:0:2565 -11143:2:467 -11144:0:2565 -11145:1:329 -11146:0:2565 -11147:3:2013 -11148:0:2565 -11149:2:468 -11150:0:2565 -11151:3:2014 -11152:0:2565 -11153:3:2015 -11154:3:2019 -11155:3:2020 -11156:3:2028 -11157:3:2029 -11158:3:2033 -11159:3:2034 -11160:3:2042 -11161:3:2047 -11162:3:2051 -11163:3:2052 -11164:3:2059 -11165:3:2060 -11166:3:2071 -11167:3:2079 -11168:3:2080 -11169:3:2084 -11170:3:2089 -11171:3:2090 -11172:0:2565 -11173:3:2102 -11174:0:2565 -11175:3:2104 -11176:0:2565 -11177:3:2105 -11178:3:2109 -11179:3:2110 -11180:3:2118 -11181:3:2119 -11182:3:2123 -11183:3:2124 -11184:3:2132 -11185:3:2137 -11186:3:2141 -11187:3:2142 -11188:3:2149 -11189:3:2150 -11190:3:2161 -11191:3:2169 -11192:3:2170 -11193:3:2174 -11194:3:2179 -11195:3:2180 -11196:0:2565 -11197:3:2192 -11198:0:2565 -11199:2:467 -11200:0:2565 -11201:3:2013 -11202:0:2565 -11203:3:2014 -11204:0:2565 -11205:3:2015 -11206:3:2019 -11207:3:2020 -11208:3:2028 -11209:3:2029 -11210:3:2033 -11211:3:2034 -11212:3:2042 -11213:3:2047 -11214:3:2051 -11215:3:2052 -11216:3:2059 -11217:3:2060 -11218:3:2071 -11219:3:2079 -11220:3:2080 -11221:3:2084 -11222:3:2089 -11223:3:2090 -11224:0:2565 -11225:3:2102 -11226:0:2565 -11227:3:2104 -11228:0:2565 -11229:3:2105 -11230:3:2109 -11231:3:2110 -11232:3:2118 -11233:3:2119 -11234:3:2123 -11235:3:2124 -11236:3:2132 -11237:3:2137 -11238:3:2141 -11239:3:2142 -11240:3:2149 -11241:3:2150 -11242:3:2161 -11243:3:2169 -11244:3:2170 -11245:3:2174 -11246:3:2179 -11247:3:2180 -11248:0:2565 -11249:1:330 -11250:0:2565 -11251:3:2192 -11252:0:2565 -11253:3:2013 -11254:0:2565 -11255:2:468 -11256:0:2565 -11257:3:2014 -11258:0:2565 -11259:3:2015 -11260:3:2019 -11261:3:2020 -11262:3:2028 -11263:3:2029 -11264:3:2033 -11265:3:2034 -11266:3:2042 -11267:3:2047 -11268:3:2051 -11269:3:2052 -11270:3:2059 -11271:3:2060 -11272:3:2071 -11273:3:2079 -11274:3:2080 -11275:3:2084 -11276:3:2089 -11277:3:2090 -11278:0:2565 -11279:3:2102 -11280:0:2565 -11281:3:2104 -11282:0:2565 -11283:3:2105 -11284:3:2109 -11285:3:2110 -11286:3:2118 -11287:3:2119 -11288:3:2123 -11289:3:2124 -11290:3:2132 -11291:3:2137 -11292:3:2141 -11293:3:2142 -11294:3:2149 -11295:3:2150 -11296:3:2161 -11297:3:2169 -11298:3:2170 -11299:3:2174 -11300:3:2179 -11301:3:2180 -11302:0:2565 -11303:3:2192 -11304:0:2565 -11305:2:467 -11306:0:2565 -11307:3:2013 -11308:0:2565 -11309:3:2014 -11310:0:2565 -11311:3:2015 -11312:3:2019 -11313:3:2020 -11314:3:2028 -11315:3:2029 -11316:3:2033 -11317:3:2034 -11318:3:2042 -11319:3:2047 -11320:3:2051 -11321:3:2052 -11322:3:2059 -11323:3:2060 -11324:3:2071 -11325:3:2079 -11326:3:2080 -11327:3:2084 -11328:3:2089 -11329:3:2090 -11330:0:2565 -11331:3:2102 -11332:0:2565 -11333:3:2104 -11334:0:2565 -11335:3:2105 -11336:3:2109 -11337:3:2110 -11338:3:2118 -11339:3:2119 -11340:3:2123 -11341:3:2124 -11342:3:2132 -11343:3:2137 -11344:3:2141 -11345:3:2142 -11346:3:2149 -11347:3:2150 -11348:3:2161 -11349:3:2169 -11350:3:2170 -11351:3:2174 -11352:3:2179 -11353:3:2180 -11354:0:2565 -11355:1:331 -11356:0:2565 -11357:3:2192 -11358:0:2565 -11359:3:2013 -11360:0:2565 -11361:2:468 -11362:0:2565 -11363:1:332 -11364:0:2565 -11365:1:333 -11366:0:2565 -11367:1:334 -11368:0:2565 -11369:3:2014 -11370:0:2565 -11371:3:2015 -11372:3:2019 -11373:3:2020 -11374:3:2028 -11375:3:2029 -11376:3:2033 -11377:3:2034 -11378:3:2042 -11379:3:2047 -11380:3:2051 -11381:3:2052 -11382:3:2059 -11383:3:2060 -11384:3:2071 -11385:3:2079 -11386:3:2080 -11387:3:2084 -11388:3:2089 -11389:3:2090 -11390:0:2565 -11391:3:2102 -11392:0:2565 -11393:3:2104 -11394:0:2565 -11395:3:2105 -11396:3:2109 -11397:3:2110 -11398:3:2118 -11399:3:2119 -11400:3:2123 -11401:3:2124 -11402:3:2132 -11403:3:2137 -11404:3:2141 -11405:3:2142 -11406:3:2149 -11407:3:2150 -11408:3:2161 -11409:3:2169 -11410:3:2170 -11411:3:2174 -11412:3:2179 -11413:3:2180 -11414:0:2565 -11415:3:2192 -11416:0:2565 -11417:3:2013 -11418:0:2565 -11419:2:467 -11420:0:2565 -11421:2:468 -11422:0:2565 -11423:3:2014 -11424:0:2565 -11425:3:2015 -11426:3:2019 -11427:3:2020 -11428:3:2028 -11429:3:2029 -11430:3:2033 -11431:3:2034 -11432:3:2042 -11433:3:2047 -11434:3:2051 -11435:3:2052 -11436:3:2059 -11437:3:2060 -11438:3:2071 -11439:3:2079 -11440:3:2080 -11441:3:2084 -11442:3:2089 -11443:3:2090 -11444:0:2565 -11445:3:2102 -11446:0:2565 -11447:3:2104 -11448:0:2565 -11449:3:2105 -11450:3:2109 -11451:3:2110 -11452:3:2118 -11453:3:2119 -11454:3:2123 -11455:3:2124 -11456:3:2132 -11457:3:2137 -11458:3:2141 -11459:3:2142 -11460:3:2149 -11461:3:2150 -11462:3:2161 -11463:3:2169 -11464:3:2170 -11465:3:2174 -11466:3:2179 -11467:3:2180 -11468:0:2565 -11469:3:2192 -11470:0:2565 -11471:2:467 -11472:0:2565 -11473:1:336 -11474:0:2565 -11475:3:2013 -11476:0:2565 -11477:2:468 -11478:0:2565 -11479:3:2014 -11480:0:2565 -11481:3:2015 -11482:3:2019 -11483:3:2020 -11484:3:2028 -11485:3:2029 -11486:3:2033 -11487:3:2034 -11488:3:2042 -11489:3:2047 -11490:3:2051 -11491:3:2052 -11492:3:2059 -11493:3:2060 -11494:3:2071 -11495:3:2079 -11496:3:2080 -11497:3:2084 -11498:3:2089 -11499:3:2090 -11500:0:2565 -11501:3:2102 -11502:0:2565 -11503:3:2104 -11504:0:2565 -11505:3:2105 -11506:3:2109 -11507:3:2110 -11508:3:2118 -11509:3:2119 -11510:3:2123 -11511:3:2124 -11512:3:2132 -11513:3:2137 -11514:3:2141 -11515:3:2142 -11516:3:2149 -11517:3:2150 -11518:3:2161 -11519:3:2169 -11520:3:2170 -11521:3:2174 -11522:3:2179 -11523:3:2180 -11524:0:2565 -11525:3:2192 -11526:0:2565 -11527:2:469 -11528:0:2565 -11529:3:2013 -11530:0:2565 -11531:2:475 -11532:0:2565 -11533:2:476 -11534:0:2565 -11535:3:2014 -11536:0:2565 -11537:3:2015 -11538:3:2019 -11539:3:2020 -11540:3:2028 -11541:3:2029 -11542:3:2033 -11543:3:2034 -11544:3:2042 -11545:3:2047 -11546:3:2051 -11547:3:2052 -11548:3:2059 -11549:3:2060 -11550:3:2071 -11551:3:2079 -11552:3:2080 -11553:3:2084 -11554:3:2089 -11555:3:2090 -11556:0:2565 -11557:3:2102 -11558:0:2565 -11559:3:2104 -11560:0:2565 -11561:3:2105 -11562:3:2109 -11563:3:2110 -11564:3:2118 -11565:3:2119 -11566:3:2123 -11567:3:2124 -11568:3:2132 -11569:3:2137 -11570:3:2141 -11571:3:2142 -11572:3:2149 -11573:3:2150 -11574:3:2161 -11575:3:2169 -11576:3:2170 -11577:3:2174 -11578:3:2179 -11579:3:2180 -11580:0:2565 -11581:3:2192 -11582:0:2565 -11583:2:477 -11584:2:481 -11585:2:482 -11586:2:490 -11587:2:499 -11588:2:500 -11589:2:504 -11590:2:509 -11591:2:513 -11592:2:514 -11593:2:521 -11594:2:522 -11595:2:533 -11596:2:534 -11597:2:537 -11598:2:538 -11599:2:546 -11600:2:551 -11601:2:552 -11602:0:2565 -11603:3:2013 -11604:0:2565 -11605:3:2014 -11606:0:2565 -11607:3:2015 -11608:3:2019 -11609:3:2020 -11610:3:2028 -11611:3:2029 -11612:3:2033 -11613:3:2034 -11614:3:2042 -11615:3:2047 -11616:3:2051 -11617:3:2052 -11618:3:2059 -11619:3:2060 -11620:3:2071 -11621:3:2079 -11622:3:2080 -11623:3:2084 -11624:3:2089 -11625:3:2090 -11626:0:2565 -11627:3:2102 -11628:0:2565 -11629:3:2104 -11630:0:2565 -11631:3:2105 -11632:3:2109 -11633:3:2110 -11634:3:2118 -11635:3:2119 -11636:3:2123 -11637:3:2124 -11638:3:2132 -11639:3:2137 -11640:3:2141 -11641:3:2142 -11642:3:2149 -11643:3:2150 -11644:3:2161 -11645:3:2169 -11646:3:2170 -11647:3:2174 -11648:3:2179 -11649:3:2180 -11650:0:2565 -11651:2:564 -11652:0:2565 -11653:3:2192 -11654:0:2565 -11655:3:2013 -11656:0:2565 -11657:3:2014 -11658:0:2565 -11659:3:2015 -11660:3:2019 -11661:3:2020 -11662:3:2028 -11663:3:2029 -11664:3:2033 -11665:3:2034 -11666:3:2042 -11667:3:2047 -11668:3:2051 -11669:3:2052 -11670:3:2059 -11671:3:2060 -11672:3:2071 -11673:3:2079 -11674:3:2080 -11675:3:2084 -11676:3:2089 -11677:3:2090 -11678:0:2565 -11679:3:2102 -11680:0:2565 -11681:3:2104 -11682:0:2565 -11683:2:565 -11684:2:569 -11685:2:570 -11686:2:578 -11687:2:587 -11688:2:588 -11689:2:592 -11690:2:597 -11691:2:601 -11692:2:602 -11693:2:609 -11694:2:610 -11695:2:621 -11696:2:622 -11697:2:625 -11698:2:626 -11699:2:634 -11700:2:639 -11701:2:640 -11702:0:2565 -11703:2:744 -11704:0:2565 -11705:3:2105 -11706:3:2109 -11707:3:2110 -11708:3:2118 -11709:3:2119 -11710:3:2123 -11711:3:2124 -11712:3:2132 -11713:3:2137 -11714:3:2141 -11715:3:2142 -11716:3:2149 -11717:3:2150 -11718:3:2161 -11719:3:2169 -11720:3:2170 -11721:3:2174 -11722:3:2179 -11723:3:2180 -11724:0:2565 -11725:3:2192 -11726:0:2565 -11727:3:2013 -11728:0:2565 -11729:3:2014 -11730:0:2565 -11731:3:2015 -11732:3:2019 -11733:3:2020 -11734:3:2028 -11735:3:2029 -11736:3:2033 -11737:3:2034 -11738:3:2042 -11739:3:2047 -11740:3:2051 -11741:3:2052 -11742:3:2059 -11743:3:2060 -11744:3:2071 -11745:3:2079 -11746:3:2080 -11747:3:2084 -11748:3:2089 -11749:3:2090 -11750:0:2565 -11751:3:2102 -11752:0:2565 -11753:2:745 -11754:0:2565 -11755:2:750 -11756:0:2565 -11757:2:753 -11758:0:2565 -11759:3:2104 -11760:0:2565 -11761:3:2105 -11762:3:2109 -11763:3:2110 -11764:3:2118 -11765:3:2119 -11766:3:2123 -11767:3:2124 -11768:3:2132 -11769:3:2137 -11770:3:2141 -11771:3:2142 -11772:3:2149 -11773:3:2150 -11774:3:2161 -11775:3:2169 -11776:3:2170 -11777:3:2174 -11778:3:2179 -11779:3:2180 -11780:0:2565 -11781:3:2192 -11782:0:2565 -11783:3:2013 -11784:0:2565 -11785:3:2014 -11786:0:2565 -11787:3:2015 -11788:3:2019 -11789:3:2020 -11790:3:2028 -11791:3:2029 -11792:3:2033 -11793:3:2034 -11794:3:2042 -11795:3:2047 -11796:3:2051 -11797:3:2052 -11798:3:2059 -11799:3:2060 -11800:3:2071 -11801:3:2079 -11802:3:2080 -11803:3:2084 -11804:3:2089 -11805:3:2090 -11806:0:2565 -11807:2:758 -11808:0:2565 -11809:3:2102 -11810:0:2565 -11811:3:2104 -11812:0:2565 -11813:3:2105 -11814:3:2109 -11815:3:2110 -11816:3:2118 -11817:3:2119 -11818:3:2123 -11819:3:2124 -11820:3:2132 -11821:3:2137 -11822:3:2141 -11823:3:2142 -11824:3:2149 -11825:3:2150 -11826:3:2161 -11827:3:2169 -11828:3:2170 -11829:3:2174 -11830:3:2179 -11831:3:2180 -11832:0:2565 -11833:3:2192 -11834:0:2565 -11835:3:2013 -11836:0:2565 -11837:3:2014 -11838:0:2565 -11839:2:759 -11840:0:2565 -11841:3:2015 -11842:3:2019 -11843:3:2020 -11844:3:2028 -11845:3:2029 -11846:3:2033 -11847:3:2034 -11848:3:2042 -11849:3:2047 -11850:3:2051 -11851:3:2052 -11852:3:2059 -11853:3:2060 -11854:3:2071 -11855:3:2079 -11856:3:2080 -11857:3:2084 -11858:3:2089 -11859:3:2090 -11860:0:2565 -11861:3:2102 -11862:0:2565 -11863:3:2104 -11864:0:2565 -11865:3:2105 -11866:3:2109 -11867:3:2110 -11868:3:2118 -11869:3:2119 -11870:3:2123 -11871:3:2124 -11872:3:2132 -11873:3:2137 -11874:3:2141 -11875:3:2142 -11876:3:2149 -11877:3:2150 -11878:3:2161 -11879:3:2169 -11880:3:2170 -11881:3:2174 -11882:3:2179 -11883:3:2180 -11884:0:2565 -11885:3:2192 -11886:0:2565 -11887:3:2013 -11888:0:2565 -11889:2:760 -11890:0:2565 -11891:2:761 -11892:0:2565 -11893:2:762 -11894:0:2565 -11895:2:763 -11896:0:2565 -11897:3:2014 -11898:0:2565 -11899:3:2015 -11900:3:2019 -11901:3:2020 -11902:3:2028 -11903:3:2029 -11904:3:2033 -11905:3:2034 -11906:3:2042 -11907:3:2047 -11908:3:2051 -11909:3:2052 -11910:3:2059 -11911:3:2060 -11912:3:2071 -11913:3:2079 -11914:3:2080 -11915:3:2084 -11916:3:2089 -11917:3:2090 -11918:0:2565 -11919:3:2102 -11920:0:2565 -11921:3:2104 -11922:0:2565 -11923:3:2105 -11924:3:2109 -11925:3:2110 -11926:3:2118 -11927:3:2119 -11928:3:2123 -11929:3:2124 -11930:3:2132 -11931:3:2137 -11932:3:2141 -11933:3:2142 -11934:3:2149 -11935:3:2150 -11936:3:2161 -11937:3:2169 -11938:3:2170 -11939:3:2174 -11940:3:2179 -11941:3:2180 -11942:0:2565 -11943:3:2192 -11944:0:2565 -11945:2:765 -11946:0:2565 -11947:3:2013 -11948:0:2565 -11949:3:2014 -11950:0:2565 -11951:3:2015 -11952:3:2019 -11953:3:2020 -11954:3:2028 -11955:3:2029 -11956:3:2033 -11957:3:2034 -11958:3:2042 -11959:3:2047 -11960:3:2051 -11961:3:2052 -11962:3:2059 -11963:3:2060 -11964:3:2071 -11965:3:2079 -11966:3:2080 -11967:3:2084 -11968:3:2089 -11969:3:2090 -11970:0:2565 -11971:3:2102 -11972:0:2565 -11973:3:2104 -11974:0:2565 -11975:3:2105 -11976:3:2109 -11977:3:2110 -11978:3:2118 -11979:3:2119 -11980:3:2123 -11981:3:2124 -11982:3:2132 -11983:3:2137 -11984:3:2141 -11985:3:2142 -11986:3:2149 -11987:3:2150 -11988:3:2161 -11989:3:2169 -11990:3:2170 -11991:3:2174 -11992:3:2179 -11993:3:2180 -11994:0:2565 -11995:2:766 -11996:2:770 -11997:2:771 -11998:2:779 -11999:2:788 -12000:2:789 -12001:2:793 -12002:2:798 -12003:2:802 -12004:2:803 -12005:2:810 -12006:2:811 -12007:2:822 -12008:2:823 -12009:2:826 -12010:2:827 -12011:2:835 -12012:2:840 -12013:2:841 -12014:0:2565 -12015:3:2192 -12016:0:2565 -12017:3:2013 -12018:0:2565 -12019:3:2014 -12020:0:2565 -12021:3:2015 -12022:3:2019 -12023:3:2020 -12024:3:2028 -12025:3:2029 -12026:3:2033 -12027:3:2034 -12028:3:2042 -12029:3:2047 -12030:3:2051 -12031:3:2052 -12032:3:2059 -12033:3:2060 -12034:3:2071 -12035:3:2079 -12036:3:2080 -12037:3:2084 -12038:3:2089 -12039:3:2090 -12040:0:2565 -12041:3:2102 -12042:0:2565 -12043:3:2104 -12044:0:2565 -12045:2:853 -12046:0:2565 -12047:2:857 -12048:0:2565 -12049:2:465 -12050:0:2565 -12051:3:2105 -12052:3:2109 -12053:3:2110 -12054:3:2118 -12055:3:2119 -12056:3:2123 -12057:3:2124 -12058:3:2132 -12059:3:2137 -12060:3:2141 -12061:3:2142 -12062:3:2149 -12063:3:2150 -12064:3:2161 -12065:3:2169 -12066:3:2170 -12067:3:2174 -12068:3:2179 -12069:3:2180 -12070:0:2565 -12071:3:2192 -12072:0:2565 -12073:3:2013 -12074:0:2565 -12075:3:2014 -12076:0:2565 -12077:3:2015 -12078:3:2019 -12079:3:2020 -12080:3:2028 -12081:3:2029 -12082:3:2033 -12083:3:2034 -12084:3:2042 -12085:3:2047 -12086:3:2051 -12087:3:2052 -12088:3:2059 -12089:3:2060 -12090:3:2071 -12091:3:2079 -12092:3:2080 -12093:3:2084 -12094:3:2089 -12095:3:2090 -12096:0:2565 -12097:3:2102 -12098:0:2565 -12099:2:466 -12100:0:2565 -12101:3:2104 -12102:0:2565 -12103:3:2105 -12104:3:2109 -12105:3:2110 -12106:3:2118 -12107:3:2119 -12108:3:2123 -12109:3:2124 -12110:3:2132 -12111:3:2137 -12112:3:2141 -12113:3:2142 -12114:3:2149 -12115:3:2150 -12116:3:2161 -12117:3:2169 -12118:3:2170 -12119:3:2174 -12120:3:2179 -12121:3:2180 -12122:0:2565 -12123:3:2192 -12124:0:2565 -12125:3:2013 -12126:0:2565 -12127:3:2014 -12128:0:2565 -12129:3:2015 -12130:3:2019 -12131:3:2020 -12132:3:2028 -12133:3:2029 -12134:3:2033 -12135:3:2034 -12136:3:2042 -12137:3:2047 -12138:3:2051 -12139:3:2052 -12140:3:2059 -12141:3:2060 -12142:3:2071 -12143:3:2079 -12144:3:2080 -12145:3:2084 -12146:3:2089 -12147:3:2090 -12148:0:2565 -12149:2:467 -12150:0:2565 -12151:3:2102 -12152:0:2565 -12153:3:2104 -12154:0:2565 -12155:3:2105 -12156:3:2109 -12157:3:2110 -12158:3:2118 -12159:3:2119 -12160:3:2123 -12161:3:2124 -12162:3:2132 -12163:3:2137 -12164:3:2141 -12165:3:2142 -12166:3:2149 -12167:3:2150 -12168:3:2161 -12169:3:2169 -12170:3:2170 -12171:3:2174 -12172:3:2179 -12173:3:2180 -12174:0:2565 -12175:3:2192 -12176:0:2565 -12177:3:2013 -12178:0:2565 -12179:3:2014 -12180:0:2565 -12181:1:339 -12182:0:2565 -12183:2:468 -12184:0:2565 -12185:3:2015 -12186:3:2019 -12187:3:2020 -12188:3:2028 -12189:3:2029 -12190:3:2033 -12191:3:2034 -12192:3:2042 -12193:3:2047 -12194:3:2051 -12195:3:2052 -12196:3:2059 -12197:3:2060 -12198:3:2071 -12199:3:2079 -12200:3:2080 -12201:3:2084 -12202:3:2089 -12203:3:2090 -12204:0:2565 -12205:3:2102 -12206:0:2565 -12207:3:2104 -12208:0:2565 -12209:3:2105 -12210:3:2109 -12211:3:2110 -12212:3:2118 -12213:3:2119 -12214:3:2123 -12215:3:2124 -12216:3:2132 -12217:3:2137 -12218:3:2141 -12219:3:2142 -12220:3:2149 -12221:3:2150 -12222:3:2161 -12223:3:2169 -12224:3:2170 -12225:3:2174 -12226:3:2179 -12227:3:2180 -12228:0:2565 -12229:3:2192 -12230:0:2565 -12231:3:2013 -12232:0:2565 -12233:3:2014 -12234:0:2565 -12235:2:467 -12236:0:2565 -12237:2:468 -12238:0:2565 -12239:3:2015 -12240:3:2019 -12241:3:2020 -12242:3:2028 -12243:3:2029 -12244:3:2033 -12245:3:2034 -12246:3:2042 -12247:3:2047 -12248:3:2051 -12249:3:2052 -12250:3:2059 -12251:3:2060 -12252:3:2071 -12253:3:2079 -12254:3:2080 -12255:3:2084 -12256:3:2089 -12257:3:2090 -12258:0:2565 -12259:3:2102 -12260:0:2565 -12261:3:2104 -12262:0:2565 -12263:3:2105 -12264:3:2109 -12265:3:2110 -12266:3:2118 -12267:3:2119 -12268:3:2123 -12269:3:2124 -12270:3:2132 -12271:3:2137 -12272:3:2141 -12273:3:2142 -12274:3:2149 -12275:3:2150 -12276:3:2161 -12277:3:2169 -12278:3:2170 -12279:3:2174 -12280:3:2179 -12281:3:2180 -12282:0:2565 -12283:3:2192 -12284:0:2565 -12285:3:2013 -12286:0:2565 -12287:2:467 -12288:0:2565 -12289:1:345 -12290:0:2565 -12291:2:468 -12292:0:2565 -12293:3:2014 -12294:0:2565 -12295:3:2015 -12296:3:2019 -12297:3:2020 -12298:3:2028 -12299:3:2029 -12300:3:2033 -12301:3:2034 -12302:3:2042 -12303:3:2047 -12304:3:2051 -12305:3:2052 -12306:3:2059 -12307:3:2060 -12308:3:2071 -12309:3:2079 -12310:3:2080 -12311:3:2084 -12312:3:2089 -12313:3:2090 -12314:0:2565 -12315:3:2102 -12316:0:2565 -12317:3:2104 -12318:0:2565 -12319:3:2105 -12320:3:2109 -12321:3:2110 -12322:3:2118 -12323:3:2119 -12324:3:2123 -12325:3:2124 -12326:3:2132 -12327:3:2137 -12328:3:2141 -12329:3:2142 -12330:3:2149 -12331:3:2150 -12332:3:2161 -12333:3:2169 -12334:3:2170 -12335:3:2174 -12336:3:2179 -12337:3:2180 -12338:0:2565 -12339:3:2192 -12340:0:2565 -12341:3:2013 -12342:0:2565 -12343:2:467 -12344:0:2565 -12345:2:468 -12346:0:2565 -12347:3:2014 -12348:0:2565 -12349:3:2015 -12350:3:2019 -12351:3:2020 -12352:3:2028 -12353:3:2029 -12354:3:2033 -12355:3:2034 -12356:3:2042 -12357:3:2047 -12358:3:2051 -12359:3:2052 -12360:3:2059 -12361:3:2060 -12362:3:2071 -12363:3:2079 -12364:3:2080 -12365:3:2084 -12366:3:2089 -12367:3:2090 -12368:0:2565 -12369:3:2102 -12370:0:2565 -12371:3:2104 -12372:0:2565 -12373:3:2105 -12374:3:2109 -12375:3:2110 -12376:3:2118 -12377:3:2119 -12378:3:2123 -12379:3:2124 -12380:3:2132 -12381:3:2137 -12382:3:2141 -12383:3:2142 -12384:3:2149 -12385:3:2150 -12386:3:2161 -12387:3:2169 -12388:3:2170 -12389:3:2174 -12390:3:2179 -12391:3:2180 -12392:0:2565 -12393:3:2192 -12394:0:2565 -12395:2:467 -12396:0:2565 -12397:1:346 -12398:1:350 -12399:1:351 -12400:1:359 -12401:1:368 -12402:1:369 -12403:1:373 -12404:1:378 -12405:1:382 -12406:1:383 -12407:1:390 -12408:1:391 -12409:1:402 -12410:1:403 -12411:1:406 -12412:1:407 -12413:1:415 -12414:1:420 -12415:1:421 -12416:0:2565 -12417:3:2013 -12418:0:2565 -12419:2:468 -12420:0:2565 -12421:3:2014 -12422:0:2565 -12423:3:2015 -12424:3:2019 -12425:3:2020 -12426:3:2028 -12427:3:2029 -12428:3:2033 -12429:3:2034 -12430:3:2042 -12431:3:2047 -12432:3:2051 -12433:3:2052 -12434:3:2059 -12435:3:2060 -12436:3:2071 -12437:3:2079 -12438:3:2080 -12439:3:2084 -12440:3:2089 -12441:3:2090 -12442:0:2565 -12443:3:2102 -12444:0:2565 -12445:3:2104 -12446:0:2565 -12447:3:2105 -12448:3:2109 -12449:3:2110 -12450:3:2118 -12451:3:2119 -12452:3:2123 -12453:3:2124 -12454:3:2132 -12455:3:2137 -12456:3:2141 -12457:3:2142 -12458:3:2149 -12459:3:2150 -12460:3:2161 -12461:3:2169 -12462:3:2170 -12463:3:2174 -12464:3:2179 -12465:3:2180 -12466:0:2565 -12467:3:2192 -12468:0:2565 -12469:2:467 -12470:0:2565 -12471:3:2013 -12472:0:2565 -12473:3:2014 -12474:0:2565 -12475:3:2015 -12476:3:2019 -12477:3:2020 -12478:3:2028 -12479:3:2029 -12480:3:2033 -12481:3:2034 -12482:3:2042 -12483:3:2047 -12484:3:2051 -12485:3:2052 -12486:3:2059 -12487:3:2060 -12488:3:2071 -12489:3:2079 -12490:3:2080 -12491:3:2084 -12492:3:2089 -12493:3:2090 -12494:0:2565 -12495:3:2102 -12496:0:2565 -12497:3:2104 -12498:0:2565 -12499:3:2105 -12500:3:2109 -12501:3:2110 -12502:3:2118 -12503:3:2119 -12504:3:2123 -12505:3:2124 -12506:3:2132 -12507:3:2137 -12508:3:2141 -12509:3:2142 -12510:3:2149 -12511:3:2150 -12512:3:2161 -12513:3:2169 -12514:3:2170 -12515:3:2174 -12516:3:2179 -12517:3:2180 -12518:0:2565 -12519:1:433 -12520:0:2565 -12521:3:2192 -12522:0:2565 -12523:3:2013 -12524:0:2565 -12525:2:468 -12526:0:2565 -12527:3:2014 -12528:0:2565 -12529:3:2015 -12530:3:2019 -12531:3:2020 -12532:3:2028 -12533:3:2029 -12534:3:2033 -12535:3:2034 -12536:3:2042 -12537:3:2047 -12538:3:2051 -12539:3:2052 -12540:3:2059 -12541:3:2060 -12542:3:2071 -12543:3:2079 -12544:3:2080 -12545:3:2084 -12546:3:2089 -12547:3:2090 -12548:0:2565 -12549:3:2102 -12550:0:2565 -12551:3:2104 -12552:0:2565 -12553:3:2105 -12554:3:2109 -12555:3:2110 -12556:3:2118 -12557:3:2119 -12558:3:2123 -12559:3:2124 -12560:3:2132 -12561:3:2137 -12562:3:2141 -12563:3:2142 -12564:3:2149 -12565:3:2150 -12566:3:2161 -12567:3:2169 -12568:3:2170 -12569:3:2174 -12570:3:2179 -12571:3:2180 -12572:0:2565 -12573:3:2192 -12574:0:2565 -12575:2:469 -12576:0:2565 -12577:3:2013 -12578:0:2565 -12579:2:475 -12580:0:2565 -12581:2:476 -12582:0:2565 -12583:3:2014 -12584:0:2565 -12585:3:2015 -12586:3:2019 -12587:3:2020 -12588:3:2028 -12589:3:2029 -12590:3:2033 -12591:3:2034 -12592:3:2042 -12593:3:2047 -12594:3:2051 -12595:3:2052 -12596:3:2059 -12597:3:2060 -12598:3:2071 -12599:3:2079 -12600:3:2080 -12601:3:2084 -12602:3:2089 -12603:3:2090 -12604:0:2565 -12605:3:2102 -12606:0:2565 -12607:3:2104 -12608:0:2565 -12609:3:2105 -12610:3:2109 -12611:3:2110 -12612:3:2118 -12613:3:2119 -12614:3:2123 -12615:3:2124 -12616:3:2132 -12617:3:2137 -12618:3:2141 -12619:3:2142 -12620:3:2149 -12621:3:2150 -12622:3:2161 -12623:3:2169 -12624:3:2170 -12625:3:2174 -12626:3:2179 -12627:3:2180 -12628:0:2565 -12629:3:2192 -12630:0:2565 -12631:2:477 -12632:2:481 -12633:2:482 -12634:2:490 -12635:2:499 -12636:2:500 -12637:2:504 -12638:2:509 -12639:2:513 -12640:2:514 -12641:2:521 -12642:2:522 -12643:2:533 -12644:2:534 -12645:2:537 -12646:2:538 -12647:2:546 -12648:2:551 -12649:2:552 -12650:0:2565 -12651:3:2013 -12652:0:2565 -12653:3:2014 -12654:0:2565 -12655:3:2015 -12656:3:2019 -12657:3:2020 -12658:3:2028 -12659:3:2029 -12660:3:2033 -12661:3:2034 -12662:3:2042 -12663:3:2047 -12664:3:2051 -12665:3:2052 -12666:3:2059 -12667:3:2060 -12668:3:2071 -12669:3:2079 -12670:3:2080 -12671:3:2084 -12672:3:2089 -12673:3:2090 -12674:0:2565 -12675:3:2102 -12676:0:2565 -12677:3:2104 -12678:0:2565 -12679:3:2105 -12680:3:2109 -12681:3:2110 -12682:3:2118 -12683:3:2119 -12684:3:2123 -12685:3:2124 -12686:3:2132 -12687:3:2137 -12688:3:2141 -12689:3:2142 -12690:3:2149 -12691:3:2150 -12692:3:2161 -12693:3:2169 -12694:3:2170 -12695:3:2174 -12696:3:2179 -12697:3:2180 -12698:0:2565 -12699:2:564 -12700:0:2565 -12701:3:2192 -12702:0:2565 -12703:3:2013 -12704:0:2565 -12705:3:2014 -12706:0:2565 -12707:3:2015 -12708:3:2019 -12709:3:2020 -12710:3:2028 -12711:3:2029 -12712:3:2033 -12713:3:2034 -12714:3:2042 -12715:3:2047 -12716:3:2051 -12717:3:2052 -12718:3:2059 -12719:3:2060 -12720:3:2071 -12721:3:2079 -12722:3:2080 -12723:3:2084 -12724:3:2089 -12725:3:2090 -12726:0:2565 -12727:3:2102 -12728:0:2565 -12729:3:2104 -12730:0:2565 -12731:2:565 -12732:2:569 -12733:2:570 -12734:2:578 -12735:2:587 -12736:2:588 -12737:2:592 -12738:2:597 -12739:2:601 -12740:2:602 -12741:2:609 -12742:2:610 -12743:2:621 -12744:2:622 -12745:2:625 -12746:2:626 -12747:2:634 -12748:2:639 -12749:2:640 -12750:0:2565 -12751:2:744 -12752:0:2565 -12753:3:2105 -12754:3:2109 -12755:3:2110 -12756:3:2118 -12757:3:2119 -12758:3:2123 -12759:3:2124 -12760:3:2132 -12761:3:2137 -12762:3:2141 -12763:3:2142 -12764:3:2149 -12765:3:2150 -12766:3:2161 -12767:3:2169 -12768:3:2170 -12769:3:2174 -12770:3:2179 -12771:3:2180 -12772:0:2565 -12773:3:2192 -12774:0:2565 -12775:3:2013 -12776:0:2565 -12777:3:2014 -12778:0:2565 -12779:3:2015 -12780:3:2019 -12781:3:2020 -12782:3:2028 -12783:3:2029 -12784:3:2033 -12785:3:2034 -12786:3:2042 -12787:3:2047 -12788:3:2051 -12789:3:2052 -12790:3:2059 -12791:3:2060 -12792:3:2071 -12793:3:2079 -12794:3:2080 -12795:3:2084 -12796:3:2089 -12797:3:2090 -12798:0:2565 -12799:3:2102 -12800:0:2565 -12801:2:745 -12802:0:2565 -12803:2:750 -12804:0:2565 -12805:2:753 -12806:0:2565 -12807:3:2104 -12808:0:2565 -12809:3:2105 -12810:3:2109 -12811:3:2110 -12812:3:2118 -12813:3:2119 -12814:3:2123 -12815:3:2124 -12816:3:2132 -12817:3:2137 -12818:3:2141 -12819:3:2142 -12820:3:2149 -12821:3:2150 -12822:3:2161 -12823:3:2169 -12824:3:2170 -12825:3:2174 -12826:3:2179 -12827:3:2180 -12828:0:2565 -12829:3:2192 -12830:0:2565 -12831:3:2013 -12832:0:2565 -12833:3:2014 -12834:0:2565 -12835:3:2015 -12836:3:2019 -12837:3:2020 -12838:3:2028 -12839:3:2029 -12840:3:2033 -12841:3:2034 -12842:3:2042 -12843:3:2047 -12844:3:2051 -12845:3:2052 -12846:3:2059 -12847:3:2060 -12848:3:2071 -12849:3:2079 -12850:3:2080 -12851:3:2084 -12852:3:2089 -12853:3:2090 -12854:0:2565 -12855:2:758 -12856:0:2565 -12857:3:2102 -12858:0:2565 -12859:3:2104 -12860:0:2565 -12861:3:2105 -12862:3:2109 -12863:3:2110 -12864:3:2118 -12865:3:2119 -12866:3:2123 -12867:3:2124 -12868:3:2132 -12869:3:2137 -12870:3:2141 -12871:3:2142 -12872:3:2149 -12873:3:2150 -12874:3:2161 -12875:3:2169 -12876:3:2170 -12877:3:2174 -12878:3:2179 -12879:3:2180 -12880:0:2565 -12881:3:2192 -12882:0:2565 -12883:3:2013 -12884:0:2565 -12885:3:2014 -12886:0:2565 -12887:2:759 -12888:0:2565 -12889:3:2015 -12890:3:2019 -12891:3:2020 -12892:3:2028 -12893:3:2029 -12894:3:2033 -12895:3:2034 -12896:3:2042 -12897:3:2047 -12898:3:2051 -12899:3:2052 -12900:3:2059 -12901:3:2060 -12902:3:2071 -12903:3:2079 -12904:3:2080 -12905:3:2084 -12906:3:2089 -12907:3:2090 -12908:0:2565 -12909:3:2102 -12910:0:2565 -12911:3:2104 -12912:0:2565 -12913:3:2105 -12914:3:2109 -12915:3:2110 -12916:3:2118 -12917:3:2119 -12918:3:2123 -12919:3:2124 -12920:3:2132 -12921:3:2137 -12922:3:2141 -12923:3:2142 -12924:3:2149 -12925:3:2150 -12926:3:2161 -12927:3:2169 -12928:3:2170 -12929:3:2174 -12930:3:2179 -12931:3:2180 -12932:0:2565 -12933:3:2192 -12934:0:2565 -12935:3:2013 -12936:0:2565 -12937:2:760 -12938:0:2565 -12939:2:761 -12940:0:2565 -12941:2:762 -12942:0:2565 -12943:2:763 -12944:0:2565 -12945:3:2014 -12946:0:2565 -12947:3:2015 -12948:3:2019 -12949:3:2020 -12950:3:2028 -12951:3:2029 -12952:3:2033 -12953:3:2034 -12954:3:2042 -12955:3:2047 -12956:3:2051 -12957:3:2052 -12958:3:2059 -12959:3:2060 -12960:3:2071 -12961:3:2079 -12962:3:2080 -12963:3:2084 -12964:3:2089 -12965:3:2090 -12966:0:2565 -12967:3:2102 -12968:0:2565 -12969:3:2104 -12970:0:2565 -12971:3:2105 -12972:3:2109 -12973:3:2110 -12974:3:2118 -12975:3:2119 -12976:3:2123 -12977:3:2124 -12978:3:2132 -12979:3:2137 -12980:3:2141 -12981:3:2142 -12982:3:2149 -12983:3:2150 -12984:3:2161 -12985:3:2169 -12986:3:2170 -12987:3:2174 -12988:3:2179 -12989:3:2180 -12990:0:2565 -12991:3:2192 -12992:0:2565 -12993:2:765 -12994:0:2565 -12995:3:2013 -12996:0:2565 -12997:3:2014 -12998:0:2565 -12999:3:2015 -13000:3:2019 -13001:3:2020 -13002:3:2028 -13003:3:2029 -13004:3:2033 -13005:3:2034 -13006:3:2042 -13007:3:2047 -13008:3:2051 -13009:3:2052 -13010:3:2059 -13011:3:2060 -13012:3:2071 -13013:3:2079 -13014:3:2080 -13015:3:2084 -13016:3:2089 -13017:3:2090 -13018:0:2565 -13019:3:2102 -13020:0:2565 -13021:3:2104 -13022:0:2565 -13023:3:2105 -13024:3:2109 -13025:3:2110 -13026:3:2118 -13027:3:2119 -13028:3:2123 -13029:3:2124 -13030:3:2132 -13031:3:2137 -13032:3:2141 -13033:3:2142 -13034:3:2149 -13035:3:2150 -13036:3:2161 -13037:3:2169 -13038:3:2170 -13039:3:2174 -13040:3:2179 -13041:3:2180 -13042:0:2565 -13043:2:766 -13044:2:770 -13045:2:771 -13046:2:779 -13047:2:788 -13048:2:789 -13049:2:793 -13050:2:798 -13051:2:802 -13052:2:803 -13053:2:810 -13054:2:811 -13055:2:822 -13056:2:823 -13057:2:826 -13058:2:827 -13059:2:835 -13060:2:840 -13061:2:841 -13062:0:2565 -13063:3:2192 -13064:0:2565 -13065:3:2013 -13066:0:2565 -13067:3:2014 -13068:0:2565 -13069:3:2015 -13070:3:2019 -13071:3:2020 -13072:3:2028 -13073:3:2029 -13074:3:2033 -13075:3:2034 -13076:3:2042 -13077:3:2047 -13078:3:2051 -13079:3:2052 -13080:3:2059 -13081:3:2060 -13082:3:2071 -13083:3:2079 -13084:3:2080 -13085:3:2084 -13086:3:2089 -13087:3:2090 -13088:0:2565 -13089:3:2102 -13090:0:2565 -13091:3:2104 -13092:0:2565 -13093:2:853 -13094:0:2565 -13095:2:857 -13096:0:2565 -13097:2:465 -13098:0:2565 -13099:3:2105 -13100:3:2109 -13101:3:2110 -13102:3:2118 -13103:3:2119 -13104:3:2123 -13105:3:2124 -13106:3:2132 -13107:3:2137 -13108:3:2141 -13109:3:2142 -13110:3:2149 -13111:3:2150 -13112:3:2161 -13113:3:2169 -13114:3:2170 -13115:3:2174 -13116:3:2179 -13117:3:2180 -13118:0:2565 -13119:3:2192 -13120:0:2565 -13121:3:2013 -13122:0:2565 -13123:3:2014 -13124:0:2565 -13125:3:2015 -13126:3:2019 -13127:3:2020 -13128:3:2028 -13129:3:2029 -13130:3:2033 -13131:3:2034 -13132:3:2042 -13133:3:2047 -13134:3:2051 -13135:3:2052 -13136:3:2059 -13137:3:2060 -13138:3:2071 -13139:3:2079 -13140:3:2080 -13141:3:2084 -13142:3:2089 -13143:3:2090 -13144:0:2565 -13145:3:2102 -13146:0:2565 -13147:2:466 -13148:0:2565 -13149:3:2104 -13150:0:2565 -13151:3:2105 -13152:3:2109 -13153:3:2110 -13154:3:2118 -13155:3:2119 -13156:3:2123 -13157:3:2124 -13158:3:2132 -13159:3:2137 -13160:3:2141 -13161:3:2142 -13162:3:2149 -13163:3:2150 -13164:3:2161 -13165:3:2169 -13166:3:2170 -13167:3:2174 -13168:3:2179 -13169:3:2180 -13170:0:2565 -13171:3:2192 -13172:0:2565 -13173:3:2013 -13174:0:2565 -13175:3:2014 -13176:0:2565 -13177:3:2015 -13178:3:2019 -13179:3:2020 -13180:3:2028 -13181:3:2029 -13182:3:2033 -13183:3:2034 -13184:3:2042 -13185:3:2047 -13186:3:2051 -13187:3:2052 -13188:3:2059 -13189:3:2060 -13190:3:2071 -13191:3:2079 -13192:3:2080 -13193:3:2084 -13194:3:2089 -13195:3:2090 -13196:0:2565 -13197:2:467 -13198:0:2565 -13199:3:2102 -13200:0:2565 -13201:3:2104 -13202:0:2565 -13203:3:2105 -13204:3:2109 -13205:3:2110 -13206:3:2118 -13207:3:2119 -13208:3:2123 -13209:3:2124 -13210:3:2132 -13211:3:2137 -13212:3:2141 -13213:3:2142 -13214:3:2149 -13215:3:2150 -13216:3:2161 -13217:3:2169 -13218:3:2170 -13219:3:2174 -13220:3:2179 -13221:3:2180 -13222:0:2565 -13223:3:2192 -13224:0:2565 -13225:3:2013 -13226:0:2565 -13227:3:2014 -13228:0:2565 -13229:1:436 -13230:0:2565 -13231:2:468 -13232:0:2565 -13233:3:2015 -13234:3:2019 -13235:3:2020 -13236:3:2028 -13237:3:2029 -13238:3:2033 -13239:3:2034 -13240:3:2042 -13241:3:2047 -13242:3:2051 -13243:3:2052 -13244:3:2059 -13245:3:2060 -13246:3:2071 -13247:3:2079 -13248:3:2080 -13249:3:2084 -13250:3:2089 -13251:3:2090 -13252:0:2565 -13253:3:2102 -13254:0:2565 -13255:3:2104 -13256:0:2565 -13257:3:2105 -13258:3:2109 -13259:3:2110 -13260:3:2118 -13261:3:2119 -13262:3:2123 -13263:3:2124 -13264:3:2132 -13265:3:2137 -13266:3:2141 -13267:3:2142 -13268:3:2149 -13269:3:2150 -13270:3:2161 -13271:3:2169 -13272:3:2170 -13273:3:2174 -13274:3:2179 -13275:3:2180 -13276:0:2565 -13277:3:2192 -13278:0:2565 -13279:3:2013 -13280:0:2565 -13281:3:2014 -13282:0:2565 -13283:2:467 -13284:0:2565 -13285:2:468 -13286:0:2565 -13287:3:2015 -13288:3:2019 -13289:3:2020 -13290:3:2028 -13291:3:2029 -13292:3:2033 -13293:3:2034 -13294:3:2042 -13295:3:2047 -13296:3:2051 -13297:3:2052 -13298:3:2059 -13299:3:2060 -13300:3:2071 -13301:3:2079 -13302:3:2080 -13303:3:2084 -13304:3:2089 -13305:3:2090 -13306:0:2565 -13307:3:2102 -13308:0:2565 -13309:3:2104 -13310:0:2565 -13311:3:2105 -13312:3:2109 -13313:3:2110 -13314:3:2118 -13315:3:2119 -13316:3:2123 -13317:3:2124 -13318:3:2132 -13319:3:2137 -13320:3:2141 -13321:3:2142 -13322:3:2149 -13323:3:2150 -13324:3:2161 -13325:3:2169 -13326:3:2170 -13327:3:2174 -13328:3:2179 -13329:3:2180 -13330:0:2565 -13331:3:2192 -13332:0:2565 -13333:3:2013 -13334:0:2565 -13335:2:467 -13336:0:2565 -13337:1:442 -13338:0:2565 -13339:2:468 -13340:0:2565 -13341:1:446 -13342:0:2565 -13343:1:9 -13344:0:2565 -13345:1:10 -13346:0:2565 -13347:1:11 -13348:0:2565 -13349:3:2014 -13350:0:2565 -13351:3:2015 -13352:3:2019 -13353:3:2020 -13354:3:2028 -13355:3:2029 -13356:3:2033 -13357:3:2034 -13358:3:2042 -13359:3:2047 -13360:3:2051 -13361:3:2052 -13362:3:2059 -13363:3:2060 -13364:3:2071 -13365:3:2079 -13366:3:2080 -13367:3:2084 -13368:3:2089 -13369:3:2090 -13370:0:2565 -13371:3:2102 -13372:0:2565 -13373:3:2104 -13374:0:2565 -13375:3:2105 -13376:3:2109 -13377:3:2110 -13378:3:2118 -13379:3:2119 -13380:3:2123 -13381:3:2124 -13382:3:2132 -13383:3:2137 -13384:3:2141 -13385:3:2142 -13386:3:2149 -13387:3:2150 -13388:3:2161 -13389:3:2169 -13390:3:2170 -13391:3:2174 -13392:3:2179 -13393:3:2180 -13394:0:2565 -13395:3:2192 -13396:0:2565 -13397:3:2013 -13398:0:2565 -13399:2:467 -13400:0:2565 -13401:2:468 -13402:0:2565 -13403:3:2014 -13404:0:2565 -13405:3:2015 -13406:3:2019 -13407:3:2020 -13408:3:2028 -13409:3:2029 -13410:3:2033 -13411:3:2034 -13412:3:2042 -13413:3:2047 -13414:3:2051 -13415:3:2052 -13416:3:2059 -13417:3:2060 -13418:3:2071 -13419:3:2079 -13420:3:2080 -13421:3:2084 -13422:3:2089 -13423:3:2090 -13424:0:2565 -13425:3:2102 -13426:0:2565 -13427:3:2104 -13428:0:2565 -13429:3:2105 -13430:3:2109 -13431:3:2110 -13432:3:2118 -13433:3:2119 -13434:3:2123 -13435:3:2124 -13436:3:2132 -13437:3:2137 -13438:3:2141 -13439:3:2142 -13440:3:2149 -13441:3:2150 -13442:3:2161 -13443:3:2169 -13444:3:2170 -13445:3:2174 -13446:3:2179 -13447:3:2180 -13448:0:2565 -13449:3:2192 -13450:0:2565 -13451:2:467 -13452:0:2565 -13453:1:12 -13454:1:16 -13455:1:17 -13456:1:25 -13457:1:34 -13458:1:35 -13459:1:39 -13460:1:44 -13461:1:48 -13462:1:49 -13463:1:56 -13464:1:57 -13465:1:68 -13466:1:69 -13467:1:72 -13468:1:73 -13469:1:81 -13470:1:86 -13471:1:87 -13472:0:2565 -13473:3:2013 -13474:0:2565 -13475:2:468 -13476:0:2565 -13477:3:2014 -13478:0:2565 -13479:3:2015 -13480:3:2019 -13481:3:2020 -13482:3:2028 -13483:3:2029 -13484:3:2033 -13485:3:2034 -13486:3:2042 -13487:3:2047 -13488:3:2051 -13489:3:2052 -13490:3:2059 -13491:3:2060 -13492:3:2071 -13493:3:2079 -13494:3:2080 -13495:3:2084 -13496:3:2089 -13497:3:2090 -13498:0:2565 -13499:3:2102 -13500:0:2565 -13501:3:2104 -13502:0:2565 -13503:3:2105 -13504:3:2109 -13505:3:2110 -13506:3:2118 -13507:3:2119 -13508:3:2123 -13509:3:2124 -13510:3:2132 -13511:3:2137 -13512:3:2141 -13513:3:2142 -13514:3:2149 -13515:3:2150 -13516:3:2161 -13517:3:2169 -13518:3:2170 -13519:3:2174 -13520:3:2179 -13521:3:2180 -13522:0:2565 -13523:3:2192 -13524:0:2565 -13525:2:467 -13526:0:2565 -13527:3:2013 -13528:0:2565 -13529:3:2014 -13530:0:2565 -13531:3:2015 -13532:3:2019 -13533:3:2020 -13534:3:2028 -13535:3:2029 -13536:3:2033 -13537:3:2034 -13538:3:2042 -13539:3:2047 -13540:3:2051 -13541:3:2052 -13542:3:2059 -13543:3:2060 -13544:3:2071 -13545:3:2079 -13546:3:2080 -13547:3:2084 -13548:3:2089 -13549:3:2090 -13550:0:2565 -13551:3:2102 -13552:0:2565 -13553:3:2104 -13554:0:2565 -13555:3:2105 -13556:3:2109 -13557:3:2110 -13558:3:2118 -13559:3:2119 -13560:3:2123 -13561:3:2124 -13562:3:2132 -13563:3:2137 -13564:3:2141 -13565:3:2142 -13566:3:2149 -13567:3:2150 -13568:3:2161 -13569:3:2169 -13570:3:2170 -13571:3:2174 -13572:3:2179 -13573:3:2180 -13574:0:2565 -13575:1:99 -13576:0:2565 -13577:3:2192 -13578:0:2565 -13579:3:2013 -13580:0:2565 -13581:2:468 -13582:0:2565 -13583:3:2014 -13584:0:2565 -13585:3:2015 -13586:3:2019 -13587:3:2020 -13588:3:2028 -13589:3:2029 -13590:3:2033 -13591:3:2034 -13592:3:2042 -13593:3:2047 -13594:3:2051 -13595:3:2052 -13596:3:2059 -13597:3:2060 -13598:3:2071 -13599:3:2079 -13600:3:2080 -13601:3:2084 -13602:3:2089 -13603:3:2090 -13604:0:2565 -13605:3:2102 -13606:0:2565 -13607:3:2104 -13608:0:2565 -13609:3:2105 -13610:3:2109 -13611:3:2110 -13612:3:2118 -13613:3:2119 -13614:3:2123 -13615:3:2124 -13616:3:2132 -13617:3:2137 -13618:3:2141 -13619:3:2142 -13620:3:2149 -13621:3:2150 -13622:3:2161 -13623:3:2169 -13624:3:2170 -13625:3:2174 -13626:3:2179 -13627:3:2180 -13628:0:2565 -13629:3:2192 -13630:0:2565 -13631:2:469 -13632:0:2565 -13633:3:2013 -13634:0:2565 -13635:2:475 -13636:0:2565 -13637:2:476 -13638:0:2565 -13639:3:2014 -13640:0:2565 -13641:3:2015 -13642:3:2019 -13643:3:2020 -13644:3:2028 -13645:3:2029 -13646:3:2033 -13647:3:2034 -13648:3:2042 -13649:3:2047 -13650:3:2051 -13651:3:2052 -13652:3:2059 -13653:3:2060 -13654:3:2071 -13655:3:2079 -13656:3:2080 -13657:3:2084 -13658:3:2089 -13659:3:2090 -13660:0:2565 -13661:3:2102 -13662:0:2565 -13663:3:2104 -13664:0:2565 -13665:3:2105 -13666:3:2109 -13667:3:2110 -13668:3:2118 -13669:3:2119 -13670:3:2123 -13671:3:2124 -13672:3:2132 -13673:3:2137 -13674:3:2141 -13675:3:2142 -13676:3:2149 -13677:3:2150 -13678:3:2161 -13679:3:2169 -13680:3:2170 -13681:3:2174 -13682:3:2179 -13683:3:2180 -13684:0:2565 -13685:3:2192 -13686:0:2565 -13687:2:477 -13688:2:481 -13689:2:482 -13690:2:490 -13691:2:499 -13692:2:500 -13693:2:504 -13694:2:509 -13695:2:513 -13696:2:514 -13697:2:521 -13698:2:522 -13699:2:533 -13700:2:534 -13701:2:537 -13702:2:538 -13703:2:546 -13704:2:551 -13705:2:552 -13706:0:2565 -13707:3:2013 -13708:0:2565 -13709:3:2014 -13710:0:2565 -13711:3:2015 -13712:3:2019 -13713:3:2020 -13714:3:2028 -13715:3:2029 -13716:3:2033 -13717:3:2034 -13718:3:2042 -13719:3:2047 -13720:3:2051 -13721:3:2052 -13722:3:2059 -13723:3:2060 -13724:3:2071 -13725:3:2079 -13726:3:2080 -13727:3:2084 -13728:3:2089 -13729:3:2090 -13730:0:2565 -13731:3:2102 -13732:0:2565 -13733:3:2104 -13734:0:2565 -13735:3:2105 -13736:3:2109 -13737:3:2110 -13738:3:2118 -13739:3:2119 -13740:3:2123 -13741:3:2124 -13742:3:2132 -13743:3:2137 -13744:3:2141 -13745:3:2142 -13746:3:2149 -13747:3:2150 -13748:3:2161 -13749:3:2169 -13750:3:2170 -13751:3:2174 -13752:3:2179 -13753:3:2180 -13754:0:2565 -13755:2:564 -13756:0:2565 -13757:3:2192 -13758:0:2565 -13759:3:2013 -13760:0:2565 -13761:3:2014 -13762:0:2565 -13763:3:2015 -13764:3:2019 -13765:3:2020 -13766:3:2028 -13767:3:2029 -13768:3:2033 -13769:3:2034 -13770:3:2042 -13771:3:2047 -13772:3:2051 -13773:3:2052 -13774:3:2059 -13775:3:2060 -13776:3:2071 -13777:3:2079 -13778:3:2080 -13779:3:2084 -13780:3:2089 -13781:3:2090 -13782:0:2565 -13783:3:2102 -13784:0:2565 -13785:3:2104 -13786:0:2565 -13787:2:565 -13788:2:569 -13789:2:570 -13790:2:578 -13791:2:587 -13792:2:588 -13793:2:592 -13794:2:597 -13795:2:601 -13796:2:602 -13797:2:609 -13798:2:610 -13799:2:621 -13800:2:622 -13801:2:625 -13802:2:626 -13803:2:634 -13804:2:639 -13805:2:640 -13806:0:2565 -13807:2:652 -13808:0:2565 -13809:3:2105 -13810:3:2109 -13811:3:2110 -13812:3:2118 -13813:3:2119 -13814:3:2123 -13815:3:2124 -13816:3:2132 -13817:3:2137 -13818:3:2141 -13819:3:2142 -13820:3:2149 -13821:3:2150 -13822:3:2161 -13823:3:2169 -13824:3:2170 -13825:3:2174 -13826:3:2179 -13827:3:2180 -13828:0:2565 -13829:3:2192 -13830:0:2565 -13831:3:2013 -13832:0:2565 -13833:3:2014 -13834:0:2565 -13835:3:2015 -13836:3:2019 -13837:3:2020 -13838:3:2028 -13839:3:2029 -13840:3:2033 -13841:3:2034 -13842:3:2042 -13843:3:2047 -13844:3:2051 -13845:3:2052 -13846:3:2059 -13847:3:2060 -13848:3:2071 -13849:3:2079 -13850:3:2080 -13851:3:2084 -13852:3:2089 -13853:3:2090 -13854:0:2565 -13855:3:2102 -13856:0:2565 -13857:2:653 -13858:0:2565 -13859:3:2104 -13860:0:2565 -13861:3:2105 -13862:3:2109 -13863:3:2110 -13864:3:2118 -13865:3:2119 -13866:3:2123 -13867:3:2124 -13868:3:2132 -13869:3:2137 -13870:3:2141 -13871:3:2142 -13872:3:2149 -13873:3:2150 -13874:3:2161 -13875:3:2169 -13876:3:2170 -13877:3:2174 -13878:3:2179 -13879:3:2180 -13880:0:2565 -13881:3:2192 -13882:0:2565 -13883:3:2013 -13884:0:2565 -13885:3:2014 -13886:0:2565 -13887:3:2015 -13888:3:2019 -13889:3:2020 -13890:3:2028 -13891:3:2029 -13892:3:2033 -13893:3:2034 -13894:3:2042 -13895:3:2047 -13896:3:2051 -13897:3:2052 -13898:3:2059 -13899:3:2060 -13900:3:2071 -13901:3:2079 -13902:3:2080 -13903:3:2084 -13904:3:2089 -13905:3:2090 -13906:0:2565 -13907:2:654 -13908:2:658 -13909:2:659 -13910:2:667 -13911:2:676 -13912:2:677 -13913:2:681 -13914:2:686 -13915:2:690 -13916:2:691 -13917:2:698 -13918:2:699 -13919:2:710 -13920:2:711 -13921:2:714 -13922:2:715 -13923:2:723 -13924:2:728 -13925:2:729 -13926:0:2565 -13927:3:2102 -13928:0:2565 -13929:3:2104 -13930:0:2565 -13931:3:2105 -13932:3:2109 -13933:3:2110 -13934:3:2118 -13935:3:2119 -13936:3:2123 -13937:3:2124 -13938:3:2132 -13939:3:2137 -13940:3:2141 -13941:3:2142 -13942:3:2149 -13943:3:2150 -13944:3:2161 -13945:3:2169 -13946:3:2170 -13947:3:2174 -13948:3:2179 -13949:3:2180 -13950:0:2565 -13951:3:2192 -13952:0:2565 -13953:3:2013 -13954:0:2565 -13955:3:2014 -13956:0:2565 -13957:1:100 -13958:0:2565 -13959:1:101 -13960:0:2565 -13961:3:2015 -13962:3:2019 -13963:3:2020 -13964:3:2028 -13965:3:2029 -13966:3:2033 -13967:3:2034 -13968:3:2042 -13969:3:2047 -13970:3:2051 -13971:3:2052 -13972:3:2059 -13973:3:2060 -13974:3:2071 -13975:3:2079 -13976:3:2080 -13977:3:2084 -13978:3:2089 -13979:3:2090 -13980:0:2565 -13981:3:2102 -13982:0:2565 -13983:3:2104 -13984:0:2565 -13985:3:2105 -13986:3:2109 -13987:3:2110 -13988:3:2118 -13989:3:2119 -13990:3:2123 -13991:3:2124 -13992:3:2132 -13993:3:2137 -13994:3:2141 -13995:3:2142 -13996:3:2149 -13997:3:2150 -13998:3:2161 -13999:3:2169 -14000:3:2170 -14001:3:2174 -14002:3:2179 -14003:3:2180 -14004:0:2565 -14005:3:2192 -14006:0:2565 -14007:3:2013 -14008:0:2565 -14009:3:2014 -14010:0:2565 -14011:1:100 -14012:0:2565 -14013:3:2015 -14014:3:2019 -14015:3:2020 -14016:3:2028 -14017:3:2029 -14018:3:2033 -14019:3:2034 -14020:3:2042 -14021:3:2047 -14022:3:2051 -14023:3:2052 -14024:3:2059 -14025:3:2060 -14026:3:2071 -14027:3:2079 -14028:3:2080 -14029:3:2084 -14030:3:2089 -14031:3:2090 -14032:0:2565 -14033:3:2102 -14034:0:2565 -14035:3:2104 -14036:0:2565 -14037:3:2105 -14038:3:2109 -14039:3:2110 -14040:3:2118 -14041:3:2119 -14042:3:2123 -14043:3:2124 -14044:3:2132 -14045:3:2137 -14046:3:2141 -14047:3:2142 -14048:3:2149 -14049:3:2150 -14050:3:2161 -14051:3:2169 -14052:3:2170 -14053:3:2174 -14054:3:2179 -14055:3:2180 -14056:0:2565 -14057:3:2192 -14058:0:2565 -14059:3:2013 -14060:0:2565 -14061:2:741 -14062:0:2565 -14063:2:750 -14064:0:2565 -14065:2:753 -14066:0:2565 -14067:1:101 -14068:0:2565 -14069:3:2014 -14070:0:2565 -14071:3:2015 -14072:3:2019 -14073:3:2020 -14074:3:2028 -14075:3:2029 -14076:3:2033 -14077:3:2034 -14078:3:2042 -14079:3:2047 -14080:3:2051 -14081:3:2052 -14082:3:2059 -14083:3:2060 -14084:3:2071 -14085:3:2079 -14086:3:2080 -14087:3:2084 -14088:3:2089 -14089:3:2090 -14090:0:2565 -14091:3:2102 -14092:0:2565 -14093:3:2104 -14094:0:2565 -14095:3:2105 -14096:3:2109 -14097:3:2110 -14098:3:2118 -14099:3:2119 -14100:3:2123 -14101:3:2124 -14102:3:2132 -14103:3:2137 -14104:3:2141 -14105:3:2142 -14106:3:2149 -14107:3:2150 -14108:3:2161 -14109:3:2169 -14110:3:2170 -14111:3:2174 -14112:3:2179 -14113:3:2180 -14114:0:2565 -14115:3:2192 -14116:0:2565 -14117:3:2013 -14118:0:2565 -14119:1:100 -14120:0:2565 -14121:3:2014 -14122:0:2565 -14123:3:2015 -14124:3:2019 -14125:3:2020 -14126:3:2028 -14127:3:2029 -14128:3:2033 -14129:3:2034 -14130:3:2042 -14131:3:2047 -14132:3:2051 -14133:3:2052 -14134:3:2059 -14135:3:2060 -14136:3:2071 -14137:3:2079 -14138:3:2080 -14139:3:2084 -14140:3:2089 -14141:3:2090 -14142:0:2565 -14143:3:2102 -14144:0:2565 -14145:3:2104 -14146:0:2565 -14147:3:2105 -14148:3:2109 -14149:3:2110 -14150:3:2118 -14151:3:2119 -14152:3:2123 -14153:3:2124 -14154:3:2132 -14155:3:2137 -14156:3:2141 -14157:3:2142 -14158:3:2149 -14159:3:2150 -14160:3:2161 -14161:3:2169 -14162:3:2170 -14163:3:2174 -14164:3:2179 -14165:3:2180 -14166:0:2565 -14167:3:2192 -14168:0:2565 -14169:2:758 -14170:0:2565 -14171:3:2013 -14172:0:2565 -14173:1:101 -14174:0:2565 -14175:3:2014 -14176:0:2565 -14177:3:2015 -14178:3:2019 -14179:3:2020 -14180:3:2028 -14181:3:2029 -14182:3:2033 -14183:3:2034 -14184:3:2042 -14185:3:2047 -14186:3:2051 -14187:3:2052 -14188:3:2059 -14189:3:2060 -14190:3:2071 -14191:3:2079 -14192:3:2080 -14193:3:2084 -14194:3:2089 -14195:3:2090 -14196:0:2565 -14197:3:2102 -14198:0:2565 -14199:3:2104 -14200:0:2565 -14201:3:2105 -14202:3:2109 -14203:3:2110 -14204:3:2118 -14205:3:2119 -14206:3:2123 -14207:3:2124 -14208:3:2132 -14209:3:2137 -14210:3:2141 -14211:3:2142 -14212:3:2149 -14213:3:2150 -14214:3:2161 -14215:3:2169 -14216:3:2170 -14217:3:2174 -14218:3:2179 -14219:3:2180 -14220:0:2565 -14221:3:2192 -14222:0:2565 -14223:3:2013 -14224:0:2565 -14225:1:100 -14226:0:2565 -14227:3:2014 -14228:0:2565 -14229:3:2015 -14230:3:2019 -14231:3:2020 -14232:3:2028 -14233:3:2029 -14234:3:2033 -14235:3:2034 -14236:3:2042 -14237:3:2047 -14238:3:2051 -14239:3:2052 -14240:3:2059 -14241:3:2060 -14242:3:2071 -14243:3:2079 -14244:3:2080 -14245:3:2084 -14246:3:2089 -14247:3:2090 -14248:0:2565 -14249:3:2102 -14250:0:2565 -14251:3:2104 -14252:0:2565 -14253:3:2105 -14254:3:2109 -14255:3:2110 -14256:3:2118 -14257:3:2119 -14258:3:2123 -14259:3:2124 -14260:3:2132 -14261:3:2137 -14262:3:2141 -14263:3:2142 -14264:3:2149 -14265:3:2150 -14266:3:2161 -14267:3:2169 -14268:3:2170 -14269:3:2174 -14270:3:2179 -14271:3:2180 -14272:0:2565 -14273:3:2192 -14274:0:2565 -14275:2:759 -14276:0:2565 -14277:3:2013 -14278:0:2565 -14279:1:101 -14280:0:2565 -14281:3:2014 -14282:0:2565 -14283:3:2015 -14284:3:2019 -14285:3:2020 -14286:3:2028 -14287:3:2029 -14288:3:2033 -14289:3:2034 -14290:3:2042 -14291:3:2047 -14292:3:2051 -14293:3:2052 -14294:3:2059 -14295:3:2060 -14296:3:2071 -14297:3:2079 -14298:3:2080 -14299:3:2084 -14300:3:2089 -14301:3:2090 -14302:0:2565 -14303:3:2102 -14304:0:2565 -14305:3:2104 -14306:0:2565 -14307:3:2105 -14308:3:2109 -14309:3:2110 -14310:3:2118 -14311:3:2119 -14312:3:2123 -14313:3:2124 -14314:3:2132 -14315:3:2137 -14316:3:2141 -14317:3:2142 -14318:3:2149 -14319:3:2150 -14320:3:2161 -14321:3:2169 -14322:3:2170 -14323:3:2174 -14324:3:2179 -14325:3:2180 -14326:0:2565 -14327:3:2192 -14328:0:2565 -14329:3:2013 -14330:0:2565 -14331:1:100 -14332:0:2565 -14333:3:2014 -14334:0:2565 -14335:3:2015 -14336:3:2019 -14337:3:2020 -14338:3:2028 -14339:3:2029 -14340:3:2033 -14341:3:2034 -14342:3:2042 -14343:3:2047 -14344:3:2051 -14345:3:2052 -14346:3:2059 -14347:3:2060 -14348:3:2071 -14349:3:2079 -14350:3:2080 -14351:3:2084 -14352:3:2089 -14353:3:2090 -14354:0:2565 -14355:3:2102 -14356:0:2565 -14357:3:2104 -14358:0:2565 -14359:3:2105 -14360:3:2109 -14361:3:2110 -14362:3:2118 -14363:3:2119 -14364:3:2123 -14365:3:2124 -14366:3:2132 -14367:3:2137 -14368:3:2141 -14369:3:2142 -14370:3:2149 -14371:3:2150 -14372:3:2161 -14373:3:2169 -14374:3:2170 -14375:3:2174 -14376:3:2179 -14377:3:2180 -14378:0:2565 -14379:3:2192 -14380:0:2565 -14381:2:760 -14382:0:2565 -14383:3:2013 -14384:0:2565 -14385:2:761 -14386:0:2565 -14387:2:762 -14388:0:2565 -14389:2:763 -14390:0:2565 -14391:1:101 -14392:0:2565 -14393:3:2014 -14394:0:2565 -14395:3:2015 -14396:3:2019 -14397:3:2020 -14398:3:2028 -14399:3:2029 -14400:3:2033 -14401:3:2034 -14402:3:2042 -14403:3:2047 -14404:3:2051 -14405:3:2052 -14406:3:2059 -14407:3:2060 -14408:3:2071 -14409:3:2079 -14410:3:2080 -14411:3:2084 -14412:3:2089 -14413:3:2090 -14414:0:2565 -14415:3:2102 -14416:0:2565 -14417:3:2104 -14418:0:2565 -14419:3:2105 -14420:3:2109 -14421:3:2110 -14422:3:2118 -14423:3:2119 -14424:3:2123 -14425:3:2124 -14426:3:2132 -14427:3:2137 -14428:3:2141 -14429:3:2142 -14430:3:2149 -14431:3:2150 -14432:3:2161 -14433:3:2169 -14434:3:2170 -14435:3:2174 -14436:3:2179 -14437:3:2180 -14438:0:2565 -14439:3:2192 -14440:0:2565 -14441:3:2013 -14442:0:2565 -14443:1:100 -14444:0:2565 -14445:3:2014 -14446:0:2565 -14447:3:2015 -14448:3:2019 -14449:3:2020 -14450:3:2028 -14451:3:2029 -14452:3:2033 -14453:3:2034 -14454:3:2042 -14455:3:2047 -14456:3:2051 -14457:3:2052 -14458:3:2059 -14459:3:2060 -14460:3:2071 -14461:3:2079 -14462:3:2080 -14463:3:2084 -14464:3:2089 -14465:3:2090 -14466:0:2565 -14467:3:2102 -14468:0:2565 -14469:3:2104 -14470:0:2565 -14471:3:2105 -14472:3:2109 -14473:3:2110 -14474:3:2118 -14475:3:2119 -14476:3:2123 -14477:3:2124 -14478:3:2132 -14479:3:2137 -14480:3:2141 -14481:3:2142 -14482:3:2149 -14483:3:2150 -14484:3:2161 -14485:3:2169 -14486:3:2170 -14487:3:2174 -14488:3:2179 -14489:3:2180 -14490:0:2565 -14491:3:2192 -14492:0:2565 -14493:2:765 -14494:0:2565 -14495:3:2013 -14496:0:2565 -14497:1:101 -14498:0:2565 -14499:3:2014 -14500:0:2565 -14501:3:2015 -14502:3:2019 -14503:3:2020 -14504:3:2028 -14505:3:2029 -14506:3:2033 -14507:3:2034 -14508:3:2042 -14509:3:2047 -14510:3:2051 -14511:3:2052 -14512:3:2059 -14513:3:2060 -14514:3:2071 -14515:3:2079 -14516:3:2080 -14517:3:2084 -14518:3:2089 -14519:3:2090 -14520:0:2565 -14521:3:2102 -14522:0:2565 -14523:3:2104 -14524:0:2565 -14525:3:2105 -14526:3:2109 -14527:3:2110 -14528:3:2118 -14529:3:2119 -14530:3:2123 -14531:3:2124 -14532:3:2132 -14533:3:2137 -14534:3:2141 -14535:3:2142 -14536:3:2149 -14537:3:2150 -14538:3:2161 -14539:3:2169 -14540:3:2170 -14541:3:2174 -14542:3:2179 -14543:3:2180 -14544:0:2565 -14545:3:2192 -14546:0:2565 -14547:3:2013 -14548:0:2565 -14549:2:766 -14550:2:770 -14551:2:771 -14552:2:779 -14553:2:788 -14554:2:789 -14555:2:793 -14556:2:798 -14557:2:802 -14558:2:803 -14559:2:810 -14560:2:811 -14561:2:822 -14562:2:823 -14563:2:826 -14564:2:827 -14565:2:835 -14566:2:840 -14567:2:841 -14568:0:2565 -14569:3:2014 -14570:0:2565 -14571:3:2015 -14572:3:2019 -14573:3:2020 -14574:3:2028 -14575:3:2029 -14576:3:2033 -14577:3:2034 -14578:3:2042 -14579:3:2047 -14580:3:2051 -14581:3:2052 -14582:3:2059 -14583:3:2060 -14584:3:2071 -14585:3:2079 -14586:3:2080 -14587:3:2084 -14588:3:2089 -14589:3:2090 -14590:0:2565 -14591:3:2102 -14592:0:2565 -14593:3:2104 -14594:0:2565 -14595:3:2105 -14596:3:2109 -14597:3:2110 -14598:3:2118 -14599:3:2119 -14600:3:2123 -14601:3:2124 -14602:3:2132 -14603:3:2137 -14604:3:2141 -14605:3:2142 -14606:3:2149 -14607:3:2150 -14608:3:2161 -14609:3:2169 -14610:3:2170 -14611:3:2174 -14612:3:2179 -14613:3:2180 -14614:0:2565 -14615:3:2192 -14616:0:2565 -14617:2:853 -14618:0:2565 -14619:3:2013 -14620:0:2565 -14621:2:857 -14622:0:2565 -14623:2:465 -14624:0:2565 -14625:3:2014 -14626:0:2565 -14627:3:2015 -14628:3:2019 -14629:3:2020 -14630:3:2028 -14631:3:2029 -14632:3:2033 -14633:3:2034 -14634:3:2042 -14635:3:2047 -14636:3:2051 -14637:3:2052 -14638:3:2059 -14639:3:2060 -14640:3:2071 -14641:3:2079 -14642:3:2080 -14643:3:2084 -14644:3:2089 -14645:3:2090 -14646:0:2565 -14647:3:2102 -14648:0:2565 -14649:3:2104 -14650:0:2565 -14651:3:2105 -14652:3:2109 -14653:3:2110 -14654:3:2118 -14655:3:2119 -14656:3:2123 -14657:3:2124 -14658:3:2132 -14659:3:2137 -14660:3:2141 -14661:3:2142 -14662:3:2149 -14663:3:2150 -14664:3:2161 -14665:3:2169 -14666:3:2170 -14667:3:2174 -14668:3:2179 -14669:3:2180 -14670:0:2565 -14671:3:2192 -14672:0:2565 -14673:2:466 -14674:0:2565 -14675:3:2013 -14676:0:2565 -14677:3:2014 -14678:0:2565 -14679:3:2015 -14680:3:2019 -14681:3:2020 -14682:3:2028 -14683:3:2029 -14684:3:2033 -14685:3:2034 -14686:3:2042 -14687:3:2047 -14688:3:2051 -14689:3:2052 -14690:3:2059 -14691:3:2060 -14692:3:2071 -14693:3:2079 -14694:3:2080 -14695:3:2084 -14696:3:2089 -14697:3:2090 -14698:0:2565 -14699:3:2102 -14700:0:2565 -14701:3:2104 -14702:0:2565 -14703:3:2105 -14704:3:2109 -14705:3:2110 -14706:3:2118 -14707:3:2119 -14708:3:2123 -14709:3:2124 -14710:3:2132 -14711:3:2137 -14712:3:2141 -14713:3:2142 -14714:3:2149 -14715:3:2150 -14716:3:2161 -14717:3:2169 -14718:3:2170 -14719:3:2174 -14720:3:2179 -14721:3:2180 -14722:0:2565 -14723:2:467 -14724:0:2565 -14725:3:2192 -14726:0:2565 -14727:3:2013 -14728:0:2565 -14729:3:2014 -14730:0:2565 -14731:3:2015 -14732:3:2019 -14733:3:2020 -14734:3:2028 -14735:3:2029 -14736:3:2033 -14737:3:2034 -14738:3:2042 -14739:3:2047 -14740:3:2051 -14741:3:2052 -14742:3:2059 -14743:3:2060 -14744:3:2071 -14745:3:2079 -14746:3:2080 -14747:3:2084 -14748:3:2089 -14749:3:2090 -14750:0:2565 -14751:3:2102 -14752:0:2565 -14753:3:2104 -14754:0:2565 -14755:1:102 -14756:0:2565 -14757:2:468 -14758:0:2565 -14759:3:2105 -14760:3:2109 -14761:3:2110 -14762:3:2118 -14763:3:2119 -14764:3:2123 -14765:3:2124 -14766:3:2132 -14767:3:2137 -14768:3:2141 -14769:3:2142 -14770:3:2149 -14771:3:2150 -14772:3:2161 -14773:3:2169 -14774:3:2170 -14775:3:2174 -14776:3:2179 -14777:3:2180 -14778:0:2565 -14779:3:2192 -14780:0:2565 -14781:3:2013 -14782:0:2565 -14783:3:2014 -14784:0:2565 -14785:3:2015 -14786:3:2019 -14787:3:2020 -14788:3:2028 -14789:3:2029 -14790:3:2033 -14791:3:2034 -14792:3:2042 -14793:3:2047 -14794:3:2051 -14795:3:2052 -14796:3:2059 -14797:3:2060 -14798:3:2071 -14799:3:2079 -14800:3:2080 -14801:3:2084 -14802:3:2089 -14803:3:2090 -14804:0:2565 -14805:3:2102 -14806:0:2565 -14807:3:2104 -14808:0:2565 -14809:2:467 -14810:0:2565 -14811:2:468 -14812:0:2565 -14813:3:2105 -14814:3:2109 -14815:3:2110 -14816:3:2118 -14817:3:2119 -14818:3:2123 -14819:3:2124 -14820:3:2132 -14821:3:2137 -14822:3:2141 -14823:3:2142 -14824:3:2149 -14825:3:2150 -14826:3:2161 -14827:3:2169 -14828:3:2170 -14829:3:2174 -14830:3:2179 -14831:3:2180 -14832:0:2565 -14833:3:2192 -14834:0:2565 -14835:3:2013 -14836:0:2565 -14837:3:2014 -14838:0:2565 -14839:3:2015 -14840:3:2019 -14841:3:2020 -14842:3:2028 -14843:3:2029 -14844:3:2033 -14845:3:2034 -14846:3:2042 -14847:3:2047 -14848:3:2051 -14849:3:2052 -14850:3:2059 -14851:3:2060 -14852:3:2071 -14853:3:2079 -14854:3:2080 -14855:3:2084 -14856:3:2089 -14857:3:2090 -14858:0:2565 -14859:3:2102 -14860:0:2565 -14861:2:467 -14862:0:2565 -14863:1:108 -14864:0:2565 -14865:2:468 -14866:0:2565 -14867:3:2104 -14868:0:2565 -14869:3:2105 -14870:3:2109 -14871:3:2110 -14872:3:2118 -14873:3:2119 -14874:3:2123 -14875:3:2124 -14876:3:2132 -14877:3:2137 -14878:3:2141 -14879:3:2142 -14880:3:2149 -14881:3:2150 -14882:3:2161 -14883:3:2169 -14884:3:2170 -14885:3:2174 -14886:3:2179 -14887:3:2180 -14888:0:2565 -14889:3:2192 -14890:0:2565 -14891:3:2013 -14892:0:2565 -14893:3:2014 -14894:0:2565 -14895:3:2015 -14896:3:2019 -14897:3:2020 -14898:3:2028 -14899:3:2029 -14900:3:2033 -14901:3:2034 -14902:3:2042 -14903:3:2047 -14904:3:2051 -14905:3:2052 -14906:3:2059 -14907:3:2060 -14908:3:2071 -14909:3:2079 -14910:3:2080 -14911:3:2084 -14912:3:2089 -14913:3:2090 -14914:0:2565 -14915:3:2102 -14916:0:2565 -14917:2:467 -14918:0:2565 -14919:2:468 -14920:0:2565 -14921:3:2104 -14922:0:2565 -14923:3:2105 -14924:3:2109 -14925:3:2110 -14926:3:2118 -14927:3:2119 -14928:3:2123 -14929:3:2124 -14930:3:2132 -14931:3:2137 -14932:3:2141 -14933:3:2142 -14934:3:2149 -14935:3:2150 -14936:3:2161 -14937:3:2169 -14938:3:2170 -14939:3:2174 -14940:3:2179 -14941:3:2180 -14942:0:2565 -14943:3:2192 -14944:0:2565 -14945:3:2013 -14946:0:2565 -14947:3:2014 -14948:0:2565 -14949:3:2015 -14950:3:2019 -14951:3:2020 -14952:3:2028 -14953:3:2029 -14954:3:2033 -14955:3:2034 -14956:3:2042 -14957:3:2047 -14958:3:2051 -14959:3:2052 -14960:3:2059 -14961:3:2060 -14962:3:2071 -14963:3:2079 -14964:3:2080 -14965:3:2084 -14966:3:2089 -14967:3:2090 -14968:0:2565 -14969:2:467 -14970:0:2565 -14971:1:109 -14972:1:113 -14973:1:114 -14974:1:122 -14975:1:123 -14976:1:124 -14977:1:136 -14978:1:141 -14979:1:145 -14980:1:146 -14981:1:153 -14982:1:154 -14983:1:165 -14984:1:166 -14985:1:167 -14986:1:178 -14987:1:183 -14988:1:184 -14989:0:2565 -14990:3:2102 -14991:0:2565 -14992:3:2104 -14993:0:2565 -14994:1:196 -14995:0:2565 -14996:3:2105 -14997:3:2109 -14998:3:2110 -14999:3:2118 -15000:3:2119 -15001:3:2123 -15002:3:2124 -15003:3:2132 -15004:3:2137 -15005:3:2141 -15006:3:2142 -15007:3:2149 -15008:3:2150 -15009:3:2161 -15010:3:2169 -15011:3:2170 -15012:3:2174 -15013:3:2179 -15014:3:2180 -15015:0:2565 -15016:1:197 -15017:0:2565 -15018:3:2192 -15019:0:2565 -15020:3:2013 -15021:0:2565 -15022:2:468 -15023:0:2565 -15024:1:198 -15025:0:2565 -15026:3:2014 -15027:0:2565 -15028:3:2015 -15029:3:2019 -15030:3:2020 -15031:3:2028 -15032:3:2029 -15033:3:2033 -15034:3:2034 -15035:3:2042 -15036:3:2047 -15037:3:2051 -15038:3:2052 -15039:3:2059 -15040:3:2060 -15041:3:2071 -15042:3:2079 -15043:3:2080 -15044:3:2084 -15045:3:2089 -15046:3:2090 -15047:0:2565 -15048:3:2102 -15049:0:2565 -15050:3:2104 -15051:0:2565 -15052:3:2105 -15053:3:2109 -15054:3:2110 -15055:3:2118 -15056:3:2119 -15057:3:2123 -15058:3:2124 -15059:3:2132 -15060:3:2137 -15061:3:2141 -15062:3:2142 -15063:3:2149 -15064:3:2150 -15065:3:2161 -15066:3:2169 -15067:3:2170 -15068:3:2174 -15069:3:2179 -15070:3:2180 -15071:0:2565 -15072:3:2192 -15073:0:2565 -15074:3:2013 -15075:0:2565 -15076:1:197 -15077:0:2565 -15078:3:2014 -15079:0:2565 -15080:3:2015 -15081:3:2019 -15082:3:2020 -15083:3:2028 -15084:3:2029 -15085:3:2033 -15086:3:2034 -15087:3:2042 -15088:3:2047 -15089:3:2051 -15090:3:2052 -15091:3:2059 -15092:3:2060 -15093:3:2071 -15094:3:2079 -15095:3:2080 -15096:3:2084 -15097:3:2089 -15098:3:2090 -15099:0:2565 -15100:3:2102 -15101:0:2565 -15102:3:2104 -15103:0:2565 -15104:3:2105 -15105:3:2109 -15106:3:2110 -15107:3:2118 -15108:3:2119 -15109:3:2123 -15110:3:2124 -15111:3:2132 -15112:3:2137 -15113:3:2141 -15114:3:2142 -15115:3:2149 -15116:3:2150 -15117:3:2161 -15118:3:2169 -15119:3:2170 -15120:3:2174 -15121:3:2179 -15122:3:2180 -15123:0:2565 -15124:3:2192 -15125:0:2565 -15126:2:469 -15127:0:2565 -15128:3:2013 -15129:0:2565 -15130:2:475 -15131:0:2565 -15132:2:476 -15133:0:2565 -15134:1:198 -15135:0:2565 -15136:3:2014 -15137:0:2565 -15138:3:2015 -15139:3:2019 -15140:3:2020 -15141:3:2028 -15142:3:2029 -15143:3:2033 -15144:3:2034 -15145:3:2042 -15146:3:2047 -15147:3:2051 -15148:3:2052 -15149:3:2059 -15150:3:2060 -15151:3:2071 -15152:3:2079 -15153:3:2080 -15154:3:2084 -15155:3:2089 -15156:3:2090 -15157:0:2565 -15158:3:2102 -15159:0:2565 -15160:3:2104 -15161:0:2565 -15162:3:2105 -15163:3:2109 -15164:3:2110 -15165:3:2118 -15166:3:2119 -15167:3:2123 -15168:3:2124 -15169:3:2132 -15170:3:2137 -15171:3:2141 -15172:3:2142 -15173:3:2149 -15174:3:2150 -15175:3:2161 -15176:3:2169 -15177:3:2170 -15178:3:2174 -15179:3:2179 -15180:3:2180 -15181:0:2565 -15182:3:2192 -15183:0:2565 -15184:3:2013 -15185:0:2565 -15186:1:197 -15187:0:2565 -15188:3:2014 -15189:0:2565 -15190:3:2015 -15191:3:2019 -15192:3:2020 -15193:3:2028 -15194:3:2029 -15195:3:2033 -15196:3:2034 -15197:3:2042 -15198:3:2047 -15199:3:2051 -15200:3:2052 -15201:3:2059 -15202:3:2060 -15203:3:2071 -15204:3:2079 -15205:3:2080 -15206:3:2084 -15207:3:2089 -15208:3:2090 -15209:0:2565 -15210:3:2102 -15211:0:2565 -15212:3:2104 -15213:0:2565 -15214:3:2105 -15215:3:2109 -15216:3:2110 -15217:3:2118 -15218:3:2119 -15219:3:2123 -15220:3:2124 -15221:3:2132 -15222:3:2137 -15223:3:2141 -15224:3:2142 -15225:3:2149 -15226:3:2150 -15227:3:2161 -15228:3:2169 -15229:3:2170 -15230:3:2174 -15231:3:2179 -15232:3:2180 -15233:0:2565 -15234:3:2192 -15235:0:2565 -15236:2:477 -15237:2:481 -15238:2:482 -15239:2:490 -15240:2:491 -15241:2:495 -15242:2:496 -15243:2:504 -15244:2:509 -15245:2:513 -15246:2:514 -15247:2:521 -15248:2:522 -15249:2:533 -15250:2:534 -15251:2:535 -15252:2:546 -15253:2:551 -15254:2:552 -15255:0:2565 -15256:3:2013 -15257:0:2565 -15258:1:198 -15259:0:2565 -15260:3:2014 -15261:0:2565 -15262:3:2015 -15263:3:2019 -15264:3:2020 -15265:3:2028 -15266:3:2029 -15267:3:2033 -15268:3:2034 -15269:3:2042 -15270:3:2047 -15271:3:2051 -15272:3:2052 -15273:3:2059 -15274:3:2060 -15275:3:2071 -15276:3:2079 -15277:3:2080 -15278:3:2084 -15279:3:2089 -15280:3:2090 -15281:0:2565 -15282:3:2102 -15283:0:2565 -15284:3:2104 -15285:0:2565 -15286:3:2105 -15287:3:2109 -15288:3:2110 -15289:3:2118 -15290:3:2119 -15291:3:2123 -15292:3:2124 -15293:3:2132 -15294:3:2137 -15295:3:2141 -15296:3:2142 -15297:3:2149 -15298:3:2150 -15299:3:2161 -15300:3:2169 -15301:3:2170 -15302:3:2174 -15303:3:2179 -15304:3:2180 -15305:0:2565 -15306:3:2192 -15307:0:2565 -15308:3:2013 -15309:0:2565 -15310:1:197 -15311:0:2565 -15312:3:2014 -15313:0:2565 -15314:3:2015 -15315:3:2019 -15316:3:2020 -15317:3:2028 -15318:3:2029 -15319:3:2033 -15320:3:2034 -15321:3:2042 -15322:3:2047 -15323:3:2051 -15324:3:2052 -15325:3:2059 -15326:3:2060 -15327:3:2071 -15328:3:2079 -15329:3:2080 -15330:3:2084 -15331:3:2089 -15332:3:2090 -15333:0:2565 -15334:3:2102 -15335:0:2565 -15336:3:2104 -15337:0:2565 -15338:3:2105 -15339:3:2109 -15340:3:2110 -15341:3:2118 -15342:3:2119 -15343:3:2123 -15344:3:2124 -15345:3:2132 -15346:3:2137 -15347:3:2141 -15348:3:2142 -15349:3:2149 -15350:3:2150 -15351:3:2161 -15352:3:2169 -15353:3:2170 -15354:3:2174 -15355:3:2179 -15356:3:2180 -15357:0:2565 -15358:3:2192 -15359:0:2565 -15360:2:564 -15361:0:2565 -15362:3:2013 -15363:0:2565 -15364:1:198 -15365:0:2565 -15366:3:2014 -15367:0:2565 -15368:3:2015 -15369:3:2019 -15370:3:2020 -15371:3:2028 -15372:3:2029 -15373:3:2033 -15374:3:2034 -15375:3:2042 -15376:3:2047 -15377:3:2051 -15378:3:2052 -15379:3:2059 -15380:3:2060 -15381:3:2071 -15382:3:2079 -15383:3:2080 -15384:3:2084 -15385:3:2089 -15386:3:2090 -15387:0:2565 -15388:3:2102 -15389:0:2565 -15390:3:2104 -15391:0:2565 -15392:3:2105 -15393:3:2109 -15394:3:2110 -15395:3:2118 -15396:3:2119 -15397:3:2123 -15398:3:2124 -15399:3:2132 -15400:3:2137 -15401:3:2141 -15402:3:2142 -15403:3:2149 -15404:3:2150 -15405:3:2161 -15406:3:2169 -15407:3:2170 -15408:3:2174 -15409:3:2179 -15410:3:2180 -15411:0:2565 -15412:3:2192 -15413:0:2565 -15414:3:2013 -15415:0:2565 -15416:2:565 -15417:2:569 -15418:2:570 -15419:2:578 -15420:2:579 -15421:2:583 -15422:2:584 -15423:2:592 -15424:2:597 -15425:2:601 -15426:2:602 -15427:2:609 -15428:2:610 -15429:2:621 -15430:2:622 -15431:2:623 -15432:2:634 -15433:2:639 -15434:2:640 -15435:0:2565 -15436:3:2014 -15437:0:2565 -15438:3:2015 -15439:3:2019 -15440:3:2020 -15441:3:2028 -15442:3:2029 -15443:3:2033 -15444:3:2034 -15445:3:2042 -15446:3:2047 -15447:3:2051 -15448:3:2052 -15449:3:2059 -15450:3:2060 -15451:3:2071 -15452:3:2079 -15453:3:2080 -15454:3:2084 -15455:3:2089 -15456:3:2090 -15457:0:2565 -15458:3:2102 -15459:0:2565 -15460:1:197 -15461:0:2565 -15462:2:652 -15463:0:2565 -15464:1:198 -15465:0:2565 -15466:3:2104 -15467:0:2565 -15468:3:2105 -15469:3:2109 -15470:3:2110 -15471:3:2118 -15472:3:2119 -15473:3:2123 -15474:3:2124 -15475:3:2132 -15476:3:2137 -15477:3:2141 -15478:3:2142 -15479:3:2149 -15480:3:2150 -15481:3:2161 -15482:3:2169 -15483:3:2170 -15484:3:2174 -15485:3:2179 -15486:3:2180 -15487:0:2565 -15488:3:2192 -15489:0:2565 -15490:3:2013 -15491:0:2565 -15492:3:2014 -15493:0:2565 -15494:3:2015 -15495:3:2019 -15496:3:2020 -15497:3:2028 -15498:3:2029 -15499:3:2033 -15500:3:2034 -15501:3:2042 -15502:3:2047 -15503:3:2051 -15504:3:2052 -15505:3:2059 -15506:3:2060 -15507:3:2071 -15508:3:2079 -15509:3:2080 -15510:3:2084 -15511:3:2089 -15512:3:2090 -15513:0:2565 -15514:3:2102 -15515:0:2565 -15516:1:197 -15517:0:2565 -15518:3:2104 -15519:0:2565 -15520:3:2105 -15521:3:2109 -15522:3:2110 -15523:3:2118 -15524:3:2119 -15525:3:2123 -15526:3:2124 -15527:3:2132 -15528:3:2137 -15529:3:2141 -15530:3:2142 -15531:3:2149 -15532:3:2150 -15533:3:2161 -15534:3:2169 -15535:3:2170 -15536:3:2174 -15537:3:2179 -15538:3:2180 -15539:0:2565 -15540:3:2192 -15541:0:2565 -15542:3:2013 -15543:0:2565 -15544:3:2014 -15545:0:2565 -15546:3:2015 -15547:3:2019 -15548:3:2020 -15549:3:2028 -15550:3:2029 -15551:3:2033 -15552:3:2034 -15553:3:2042 -15554:3:2047 -15555:3:2051 -15556:3:2052 -15557:3:2059 -15558:3:2060 -15559:3:2071 -15560:3:2079 -15561:3:2080 -15562:3:2084 -15563:3:2089 -15564:3:2090 -15565:0:2565 -15566:2:653 -15567:0:2565 -15568:3:2102 -15569:0:2565 -15570:1:198 -15571:0:2565 -15572:3:2104 -15573:0:2565 -15574:3:2105 -15575:3:2109 -15576:3:2110 -15577:3:2118 -15578:3:2119 -15579:3:2123 -15580:3:2124 -15581:3:2132 -15582:3:2137 -15583:3:2141 -15584:3:2142 -15585:3:2149 -15586:3:2150 -15587:3:2161 -15588:3:2169 -15589:3:2170 -15590:3:2174 -15591:3:2179 -15592:3:2180 -15593:0:2565 -15594:3:2192 -15595:0:2565 -15596:3:2013 -15597:0:2565 -15598:3:2014 -15599:0:2565 -15600:3:2015 -15601:3:2019 -15602:3:2020 -15603:3:2028 -15604:3:2029 -15605:3:2033 -15606:3:2034 -15607:3:2042 -15608:3:2047 -15609:3:2051 -15610:3:2052 -15611:3:2059 -15612:3:2060 -15613:3:2071 -15614:3:2079 -15615:3:2080 -15616:3:2084 -15617:3:2089 -15618:3:2090 -15619:0:2565 -15620:3:2102 -15621:0:2565 -15622:1:197 -15623:0:2565 -15624:3:2104 -15625:0:2565 -15626:3:2105 -15627:3:2109 -15628:3:2110 -15629:3:2118 -15630:3:2119 -15631:3:2123 -15632:3:2124 -15633:3:2132 -15634:3:2137 -15635:3:2141 -15636:3:2142 -15637:3:2149 -15638:3:2150 -15639:3:2161 -15640:3:2169 -15641:3:2170 -15642:3:2174 -15643:3:2179 -15644:3:2180 -15645:0:2565 -15646:3:2192 -15647:0:2565 -15648:3:2013 -15649:0:2565 -15650:3:2014 -15651:0:2565 -15652:3:2015 -15653:3:2019 -15654:3:2020 -15655:3:2028 -15656:3:2029 -15657:3:2033 -15658:3:2034 -15659:3:2042 -15660:3:2047 -15661:3:2051 -15662:3:2052 -15663:3:2059 -15664:3:2060 -15665:3:2071 -15666:3:2079 -15667:3:2080 -15668:3:2084 -15669:3:2089 -15670:3:2090 -15671:0:2565 -15672:2:654 -15673:2:658 -15674:2:659 -15675:2:667 -15676:2:668 -15677:2:672 -15678:2:673 -15679:2:681 -15680:2:686 -15681:2:690 -15682:2:691 -15683:2:698 -15684:2:699 -15685:2:710 -15686:2:711 -15687:2:712 -15688:2:723 -15689:2:728 -15690:2:729 -15691:0:2565 -15692:3:2102 -15693:0:2565 -15694:1:198 -15695:0:2565 -15696:3:2104 -15697:0:2565 -15698:3:2105 -15699:3:2109 -15700:3:2110 -15701:3:2118 -15702:3:2119 -15703:3:2123 -15704:3:2124 -15705:3:2132 -15706:3:2137 -15707:3:2141 -15708:3:2142 -15709:3:2149 -15710:3:2150 -15711:3:2161 -15712:3:2169 -15713:3:2170 -15714:3:2174 -15715:3:2179 -15716:3:2180 -15717:0:2565 -15718:3:2192 -15719:0:2565 -15720:3:2013 -15721:0:2565 -15722:3:2014 -15723:0:2565 -15724:3:2015 -15725:3:2019 -15726:3:2020 -15727:3:2028 -15728:3:2029 -15729:3:2033 -15730:3:2034 -15731:3:2042 -15732:3:2047 -15733:3:2051 -15734:3:2052 -15735:3:2059 -15736:3:2060 -15737:3:2071 -15738:3:2079 -15739:3:2080 -15740:3:2084 -15741:3:2089 -15742:3:2090 -15743:0:2565 -15744:3:2102 -15745:0:2565 -15746:2:741 -15747:0:2565 -15748:2:750 -15749:0:2565 -15750:3:2104 -15751:0:2565 -15752:3:2105 -15753:3:2109 -15754:3:2110 -15755:3:2118 -15756:3:2119 -15757:3:2123 -15758:3:2124 -15759:3:2132 -15760:3:2137 -15761:3:2141 -15762:3:2142 -15763:3:2149 -15764:3:2150 -15765:3:2161 -15766:3:2169 -15767:3:2170 -15768:3:2174 -15769:3:2179 -15770:3:2180 -15771:0:2565 -15772:3:2192 -15773:0:2565 -15774:3:2013 -15775:0:2565 -15776:1:197 -15777:0:2565 -15778:2:753 -15779:0:2565 -15780:1:198 -15781:0:2565 -15782:3:2014 -15783:0:2565 -15784:3:2015 -15785:3:2019 -15786:3:2020 -15787:3:2028 -15788:3:2029 -15789:3:2033 -15790:3:2034 -15791:3:2042 -15792:3:2047 -15793:3:2051 -15794:3:2052 -15795:3:2059 -15796:3:2060 -15797:3:2071 -15798:3:2079 -15799:3:2080 -15800:3:2084 -15801:3:2089 -15802:3:2090 -15803:0:2565 -15804:3:2102 -15805:0:2565 -15806:3:2104 -15807:0:2565 -15808:3:2105 -15809:3:2109 -15810:3:2110 -15811:3:2118 -15812:3:2119 -15813:3:2123 -15814:3:2124 -15815:3:2132 -15816:3:2137 -15817:3:2141 -15818:3:2142 -15819:3:2149 -15820:3:2150 -15821:3:2161 -15822:3:2169 -15823:3:2170 -15824:3:2174 -15825:3:2179 -15826:3:2180 -15827:0:2565 -15828:3:2192 -15829:0:2565 -15830:3:2013 -15831:0:2565 -15832:1:197 -15833:0:2565 -15834:3:2014 -15835:0:2565 -15836:3:2015 -15837:3:2019 -15838:3:2020 -15839:3:2028 -15840:3:2029 -15841:3:2033 -15842:3:2034 -15843:3:2042 -15844:3:2047 -15845:3:2051 -15846:3:2052 -15847:3:2059 -15848:3:2060 -15849:3:2071 -15850:3:2079 -15851:3:2080 -15852:3:2084 -15853:3:2089 -15854:3:2090 -15855:0:2565 -15856:3:2102 -15857:0:2565 -15858:3:2104 -15859:0:2565 -15860:3:2105 -15861:3:2109 -15862:3:2110 -15863:3:2118 -15864:3:2119 -15865:3:2123 -15866:3:2124 -15867:3:2132 -15868:3:2137 -15869:3:2141 -15870:3:2142 -15871:3:2149 -15872:3:2150 -15873:3:2161 -15874:3:2169 -15875:3:2170 -15876:3:2174 -15877:3:2179 -15878:3:2180 -15879:0:2565 -15880:3:2192 -15881:0:2565 -15882:2:758 -15883:0:2565 -15884:3:2013 -15885:0:2565 -15886:1:198 -15887:0:2565 -15888:3:2014 -15889:0:2565 -15890:3:2015 -15891:3:2019 -15892:3:2020 -15893:3:2028 -15894:3:2029 -15895:3:2033 -15896:3:2034 -15897:3:2042 -15898:3:2047 -15899:3:2051 -15900:3:2052 -15901:3:2059 -15902:3:2060 -15903:3:2071 -15904:3:2079 -15905:3:2080 -15906:3:2084 -15907:3:2089 -15908:3:2090 -15909:0:2565 -15910:3:2102 -15911:0:2565 -15912:3:2104 -15913:0:2565 -15914:3:2105 -15915:3:2109 -15916:3:2110 -15917:3:2118 -15918:3:2119 -15919:3:2123 -15920:3:2124 -15921:3:2132 -15922:3:2137 -15923:3:2141 -15924:3:2142 -15925:3:2149 -15926:3:2150 -15927:3:2161 -15928:3:2169 -15929:3:2170 -15930:3:2174 -15931:3:2179 -15932:3:2180 -15933:0:2565 -15934:3:2192 -15935:0:2565 -15936:3:2013 -15937:0:2565 -15938:1:197 -15939:0:2565 -15940:3:2014 -15941:0:2565 -15942:3:2015 -15943:3:2019 -15944:3:2020 -15945:3:2028 -15946:3:2029 -15947:3:2033 -15948:3:2034 -15949:3:2042 -15950:3:2047 -15951:3:2051 -15952:3:2052 -15953:3:2059 -15954:3:2060 -15955:3:2071 -15956:3:2079 -15957:3:2080 -15958:3:2084 -15959:3:2089 -15960:3:2090 -15961:0:2565 -15962:3:2102 -15963:0:2565 -15964:3:2104 -15965:0:2565 -15966:3:2105 -15967:3:2109 -15968:3:2110 -15969:3:2118 -15970:3:2119 -15971:3:2123 -15972:3:2124 -15973:3:2132 -15974:3:2137 -15975:3:2141 -15976:3:2142 -15977:3:2149 -15978:3:2150 -15979:3:2161 -15980:3:2169 -15981:3:2170 -15982:3:2174 -15983:3:2179 -15984:3:2180 -15985:0:2565 -15986:3:2192 -15987:0:2565 -15988:2:759 -15989:0:2565 -15990:3:2013 -15991:0:2565 -15992:1:198 -15993:0:2565 -15994:3:2014 -15995:0:2565 -15996:3:2015 -15997:3:2019 -15998:3:2020 -15999:3:2028 -16000:3:2029 -16001:3:2033 -16002:3:2034 -16003:3:2042 -16004:3:2047 -16005:3:2051 -16006:3:2052 -16007:3:2059 -16008:3:2060 -16009:3:2071 -16010:3:2079 -16011:3:2080 -16012:3:2084 -16013:3:2089 -16014:3:2090 -16015:0:2565 -16016:3:2102 -16017:0:2565 -16018:3:2104 -16019:0:2565 -16020:3:2105 -16021:3:2109 -16022:3:2110 -16023:3:2118 -16024:3:2119 -16025:3:2123 -16026:3:2124 -16027:3:2132 -16028:3:2137 -16029:3:2141 -16030:3:2142 -16031:3:2149 -16032:3:2150 -16033:3:2161 -16034:3:2169 -16035:3:2170 -16036:3:2174 -16037:3:2179 -16038:3:2180 -16039:0:2565 -16040:3:2192 -16041:0:2565 -16042:3:2013 -16043:0:2565 -16044:1:197 -16045:0:2565 -16046:3:2014 -16047:0:2565 -16048:3:2015 -16049:3:2019 -16050:3:2020 -16051:3:2028 -16052:3:2029 -16053:3:2033 -16054:3:2034 -16055:3:2042 -16056:3:2047 -16057:3:2051 -16058:3:2052 -16059:3:2059 -16060:3:2060 -16061:3:2071 -16062:3:2079 -16063:3:2080 -16064:3:2084 -16065:3:2089 -16066:3:2090 -16067:0:2565 -16068:3:2102 -16069:0:2565 -16070:3:2104 -16071:0:2565 -16072:3:2105 -16073:3:2109 -16074:3:2110 -16075:3:2118 -16076:3:2119 -16077:3:2123 -16078:3:2124 -16079:3:2132 -16080:3:2137 -16081:3:2141 -16082:3:2142 -16083:3:2149 -16084:3:2150 -16085:3:2161 -16086:3:2169 -16087:3:2170 -16088:3:2174 -16089:3:2179 -16090:3:2180 -16091:0:2565 -16092:3:2192 -16093:0:2565 -16094:2:760 -16095:0:2565 -16096:3:2013 -16097:0:2565 -16098:2:761 -16099:0:2565 -16100:2:762 -16101:0:2565 -16102:2:763 -16103:0:2565 -16104:1:198 -16105:0:2565 -16106:3:2014 -16107:0:2565 -16108:3:2015 -16109:3:2019 -16110:3:2020 -16111:3:2028 -16112:3:2029 -16113:3:2033 -16114:3:2034 -16115:3:2042 -16116:3:2047 -16117:3:2051 -16118:3:2052 -16119:3:2059 -16120:3:2060 -16121:3:2071 -16122:3:2079 -16123:3:2080 -16124:3:2084 -16125:3:2089 -16126:3:2090 -16127:0:2565 -16128:3:2102 -16129:0:2565 -16130:3:2104 -16131:0:2565 -16132:3:2105 -16133:3:2109 -16134:3:2110 -16135:3:2118 -16136:3:2119 -16137:3:2123 -16138:3:2124 -16139:3:2132 -16140:3:2137 -16141:3:2141 -16142:3:2142 -16143:3:2149 -16144:3:2150 -16145:3:2161 -16146:3:2169 -16147:3:2170 -16148:3:2174 -16149:3:2179 -16150:3:2180 -16151:0:2565 -16152:3:2192 -16153:0:2565 -16154:3:2013 -16155:0:2565 -16156:1:197 -16157:0:2565 -16158:3:2014 -16159:0:2565 -16160:3:2015 -16161:3:2019 -16162:3:2020 -16163:3:2028 -16164:3:2029 -16165:3:2033 -16166:3:2034 -16167:3:2042 -16168:3:2047 -16169:3:2051 -16170:3:2052 -16171:3:2059 -16172:3:2060 -16173:3:2071 -16174:3:2079 -16175:3:2080 -16176:3:2084 -16177:3:2089 -16178:3:2090 -16179:0:2565 -16180:3:2102 -16181:0:2565 -16182:3:2104 -16183:0:2565 -16184:3:2105 -16185:3:2109 -16186:3:2110 -16187:3:2118 -16188:3:2119 -16189:3:2123 -16190:3:2124 -16191:3:2132 -16192:3:2137 -16193:3:2141 -16194:3:2142 -16195:3:2149 -16196:3:2150 -16197:3:2161 -16198:3:2169 -16199:3:2170 -16200:3:2174 -16201:3:2179 -16202:3:2180 -16203:0:2565 -16204:3:2192 -16205:0:2565 -16206:2:765 -16207:0:2565 -16208:3:2013 -16209:0:2565 -16210:1:198 -16211:0:2565 -16212:3:2014 -16213:0:2565 -16214:3:2015 -16215:3:2019 -16216:3:2020 -16217:3:2028 -16218:3:2029 -16219:3:2033 -16220:3:2034 -16221:3:2042 -16222:3:2047 -16223:3:2051 -16224:3:2052 -16225:3:2059 -16226:3:2060 -16227:3:2071 -16228:3:2079 -16229:3:2080 -16230:3:2084 -16231:3:2089 -16232:3:2090 -16233:0:2565 -16234:3:2102 -16235:0:2565 -16236:3:2104 -16237:0:2565 -16238:3:2105 -16239:3:2109 -16240:3:2110 -16241:3:2118 -16242:3:2119 -16243:3:2123 -16244:3:2124 -16245:3:2132 -16246:3:2137 -16247:3:2141 -16248:3:2142 -16249:3:2149 -16250:3:2150 -16251:3:2161 -16252:3:2169 -16253:3:2170 -16254:3:2174 -16255:3:2179 -16256:3:2180 -16257:0:2565 -16258:3:2192 -16259:0:2565 -16260:3:2013 -16261:0:2565 -16262:2:766 -16263:2:770 -16264:2:771 -16265:2:779 -16266:2:788 -16267:2:789 -16268:2:793 -16269:2:798 -16270:2:802 -16271:2:803 -16272:2:810 -16273:2:811 -16274:2:822 -16275:2:823 -16276:2:826 -16277:2:827 -16278:2:835 -16279:2:840 -16280:2:841 -16281:0:2565 -16282:3:2014 -16283:0:2565 -16284:3:2015 -16285:3:2019 -16286:3:2020 -16287:3:2028 -16288:3:2029 -16289:3:2033 -16290:3:2034 -16291:3:2042 -16292:3:2047 -16293:3:2051 -16294:3:2052 -16295:3:2059 -16296:3:2060 -16297:3:2071 -16298:3:2079 -16299:3:2080 -16300:3:2084 -16301:3:2089 -16302:3:2090 -16303:0:2565 -16304:3:2102 -16305:0:2565 -16306:3:2104 -16307:0:2565 -16308:3:2105 -16309:3:2109 -16310:3:2110 -16311:3:2118 -16312:3:2119 -16313:3:2123 -16314:3:2124 -16315:3:2132 -16316:3:2137 -16317:3:2141 -16318:3:2142 -16319:3:2149 -16320:3:2150 -16321:3:2161 -16322:3:2169 -16323:3:2170 -16324:3:2174 -16325:3:2179 -16326:3:2180 -16327:0:2565 -16328:3:2192 -16329:0:2565 -16330:2:853 -16331:0:2565 -16332:3:2013 -16333:0:2565 -16334:2:857 -16335:0:2565 -16336:2:465 -16337:0:2565 -16338:3:2014 -16339:0:2565 -16340:3:2015 -16341:3:2019 -16342:3:2020 -16343:3:2028 -16344:3:2029 -16345:3:2033 -16346:3:2034 -16347:3:2042 -16348:3:2047 -16349:3:2051 -16350:3:2052 -16351:3:2059 -16352:3:2060 -16353:3:2071 -16354:3:2079 -16355:3:2080 -16356:3:2084 -16357:3:2089 -16358:3:2090 -16359:0:2565 -16360:3:2102 -16361:0:2565 -16362:3:2104 -16363:0:2565 -16364:3:2105 -16365:3:2109 -16366:3:2110 -16367:3:2118 -16368:3:2119 -16369:3:2123 -16370:3:2124 -16371:3:2132 -16372:3:2137 -16373:3:2141 -16374:3:2142 -16375:3:2149 -16376:3:2150 -16377:3:2161 -16378:3:2169 -16379:3:2170 -16380:3:2174 -16381:3:2179 -16382:3:2180 -16383:0:2565 -16384:3:2192 -16385:0:2565 -16386:2:466 -16387:0:2565 -16388:3:2013 -16389:0:2565 -16390:3:2014 -16391:0:2565 -16392:3:2015 -16393:3:2019 -16394:3:2020 -16395:3:2028 -16396:3:2029 -16397:3:2033 -16398:3:2034 -16399:3:2042 -16400:3:2047 -16401:3:2051 -16402:3:2052 -16403:3:2059 -16404:3:2060 -16405:3:2071 -16406:3:2079 -16407:3:2080 -16408:3:2084 -16409:3:2089 -16410:3:2090 -16411:0:2565 -16412:3:2102 -16413:0:2565 -16414:3:2104 -16415:0:2565 -16416:3:2105 -16417:3:2109 -16418:3:2110 -16419:3:2118 -16420:3:2119 -16421:3:2123 -16422:3:2124 -16423:3:2132 -16424:3:2137 -16425:3:2141 -16426:3:2142 -16427:3:2149 -16428:3:2150 -16429:3:2161 -16430:3:2169 -16431:3:2170 -16432:3:2174 -16433:3:2179 -16434:3:2180 -16435:0:2565 -16436:2:467 -16437:0:2565 -16438:3:2192 -16439:0:2565 -16440:3:2013 -16441:0:2565 -16442:3:2014 -16443:0:2565 -16444:3:2015 -16445:3:2019 -16446:3:2020 -16447:3:2028 -16448:3:2029 -16449:3:2033 -16450:3:2034 -16451:3:2042 -16452:3:2047 -16453:3:2051 -16454:3:2052 -16455:3:2059 -16456:3:2060 -16457:3:2071 -16458:3:2079 -16459:3:2080 -16460:3:2084 -16461:3:2089 -16462:3:2090 -16463:0:2565 -16464:3:2102 -16465:0:2565 -16466:3:2104 -16467:0:2565 -16468:1:199 -16469:0:2565 -16470:2:468 -16471:0:2565 -16472:1:205 -16473:0:2565 -16474:3:2105 -16475:3:2109 -16476:3:2110 -16477:3:2118 -16478:3:2119 -16479:3:2123 -16480:3:2124 -16481:3:2132 -16482:3:2137 -16483:3:2141 -16484:3:2142 -16485:3:2149 -16486:3:2150 -16487:3:2161 -16488:3:2169 -16489:3:2170 -16490:3:2174 -16491:3:2179 -16492:3:2180 -16493:0:2565 -16494:3:2192 -16495:0:2565 -16496:3:2013 -16497:0:2565 -16498:3:2014 -16499:0:2565 -16500:3:2015 -16501:3:2019 -16502:3:2020 -16503:3:2028 -16504:3:2029 -16505:3:2033 -16506:3:2034 -16507:3:2042 -16508:3:2047 -16509:3:2051 -16510:3:2052 -16511:3:2059 -16512:3:2060 -16513:3:2071 -16514:3:2079 -16515:3:2080 -16516:3:2084 -16517:3:2089 -16518:3:2090 -16519:0:2565 -16520:3:2102 -16521:0:2565 -16522:3:2104 -16523:0:2565 -16524:2:467 -16525:0:2565 -16526:2:468 -16527:0:2565 -16528:3:2105 -16529:3:2109 -16530:3:2110 -16531:3:2118 -16532:3:2119 -16533:3:2123 -16534:3:2124 -16535:3:2132 -16536:3:2137 -16537:3:2141 -16538:3:2142 -16539:3:2149 -16540:3:2150 -16541:3:2161 -16542:3:2169 -16543:3:2170 -16544:3:2174 -16545:3:2179 -16546:3:2180 -16547:0:2565 -16548:3:2192 -16549:0:2565 -16550:3:2013 -16551:0:2565 -16552:3:2014 -16553:0:2565 -16554:3:2015 -16555:3:2019 -16556:3:2020 -16557:3:2028 -16558:3:2029 -16559:3:2033 -16560:3:2034 -16561:3:2042 -16562:3:2047 -16563:3:2051 -16564:3:2052 -16565:3:2059 -16566:3:2060 -16567:3:2071 -16568:3:2079 -16569:3:2080 -16570:3:2084 -16571:3:2089 -16572:3:2090 -16573:0:2565 -16574:3:2102 -16575:0:2565 -16576:2:467 -16577:0:2565 -16578:1:206 -16579:0:2565 -16580:2:468 -16581:0:2565 -16582:3:2104 -16583:0:2565 -16584:3:2105 -16585:3:2109 -16586:3:2110 -16587:3:2118 -16588:3:2119 -16589:3:2123 -16590:3:2124 -16591:3:2132 -16592:3:2137 -16593:3:2141 -16594:3:2142 -16595:3:2149 -16596:3:2150 -16597:3:2161 -16598:3:2169 -16599:3:2170 -16600:3:2174 -16601:3:2179 -16602:3:2180 -16603:0:2565 -16604:3:2192 -16605:0:2565 -16606:3:2013 -16607:0:2565 -16608:3:2014 -16609:0:2565 -16610:3:2015 -16611:3:2019 -16612:3:2020 -16613:3:2028 -16614:3:2029 -16615:3:2033 -16616:3:2034 -16617:3:2042 -16618:3:2047 -16619:3:2051 -16620:3:2052 -16621:3:2059 -16622:3:2060 -16623:3:2071 -16624:3:2079 -16625:3:2080 -16626:3:2084 -16627:3:2089 -16628:3:2090 -16629:0:2565 -16630:3:2102 -16631:0:2565 -16632:2:467 -16633:0:2565 -16634:2:468 -16635:0:2565 -16636:3:2104 -16637:0:2565 -16638:3:2105 -16639:3:2109 -16640:3:2110 -16641:3:2118 -16642:3:2119 -16643:3:2123 -16644:3:2124 -16645:3:2132 -16646:3:2137 -16647:3:2141 -16648:3:2142 -16649:3:2149 -16650:3:2150 -16651:3:2161 -16652:3:2169 -16653:3:2170 -16654:3:2174 -16655:3:2179 -16656:3:2180 -16657:0:2565 -16658:3:2192 -16659:0:2565 -16660:3:2013 -16661:0:2565 -16662:3:2014 -16663:0:2565 -16664:3:2015 -16665:3:2019 -16666:3:2020 -16667:3:2028 -16668:3:2029 -16669:3:2033 -16670:3:2034 -16671:3:2042 -16672:3:2047 -16673:3:2051 -16674:3:2052 -16675:3:2059 -16676:3:2060 -16677:3:2071 -16678:3:2079 -16679:3:2080 -16680:3:2084 -16681:3:2089 -16682:3:2090 -16683:0:2565 -16684:2:467 -16685:0:2565 -16686:1:207 -16687:1:211 -16688:1:212 -16689:1:220 -16690:1:229 -16691:1:230 -16692:1:234 -16693:1:239 -16694:1:243 -16695:1:244 -16696:1:251 -16697:1:252 -16698:1:263 -16699:1:264 -16700:1:267 -16701:1:268 -16702:1:276 -16703:1:281 -16704:1:282 -16705:0:2565 -16706:3:2102 -16707:0:2565 -16708:2:468 -16709:0:2565 -16710:3:2104 -16711:0:2565 -16712:3:2105 -16713:3:2109 -16714:3:2110 -16715:3:2118 -16716:3:2119 -16717:3:2123 -16718:3:2124 -16719:3:2132 -16720:3:2137 -16721:3:2141 -16722:3:2142 -16723:3:2149 -16724:3:2150 -16725:3:2161 -16726:3:2169 -16727:3:2170 -16728:3:2174 -16729:3:2179 -16730:3:2180 -16731:0:2565 -16732:3:2192 -16733:0:2565 -16734:3:2013 -16735:0:2565 -16736:3:2014 -16737:0:2565 -16738:3:2015 -16739:3:2019 -16740:3:2020 -16741:3:2028 -16742:3:2029 -16743:3:2033 -16744:3:2034 -16745:3:2042 -16746:3:2047 -16747:3:2051 -16748:3:2052 -16749:3:2059 -16750:3:2060 -16751:3:2071 -16752:3:2079 -16753:3:2080 -16754:3:2084 -16755:3:2089 -16756:3:2090 -16757:0:2565 -16758:2:467 -16759:0:2565 -16760:3:2102 -16761:0:2565 -16762:3:2104 -16763:0:2565 -16764:3:2105 -16765:3:2109 -16766:3:2110 -16767:3:2118 -16768:3:2119 -16769:3:2123 -16770:3:2124 -16771:3:2132 -16772:3:2137 -16773:3:2141 -16774:3:2142 -16775:3:2149 -16776:3:2150 -16777:3:2161 -16778:3:2169 -16779:3:2170 -16780:3:2174 -16781:3:2179 -16782:3:2180 -16783:0:2565 -16784:3:2192 -16785:0:2565 -16786:3:2013 -16787:0:2565 -16788:3:2014 -16789:0:2565 -16790:1:294 -16791:0:2565 -16792:2:468 -16793:0:2565 -16794:3:2015 -16795:3:2019 -16796:3:2020 -16797:3:2028 -16798:3:2029 -16799:3:2033 -16800:3:2034 -16801:3:2042 -16802:3:2047 -16803:3:2051 -16804:3:2052 -16805:3:2059 -16806:3:2060 -16807:3:2071 -16808:3:2079 -16809:3:2080 -16810:3:2084 -16811:3:2089 -16812:3:2090 -16813:0:2565 -16814:3:2102 -16815:0:2565 -16816:3:2104 -16817:0:2565 -16818:3:2105 -16819:3:2109 -16820:3:2110 -16821:3:2118 -16822:3:2119 -16823:3:2123 -16824:3:2124 -16825:3:2132 -16826:3:2137 -16827:3:2141 -16828:3:2142 -16829:3:2149 -16830:3:2150 -16831:3:2161 -16832:3:2169 -16833:3:2170 -16834:3:2174 -16835:3:2179 -16836:3:2180 -16837:0:2565 -16838:3:2192 -16839:0:2565 -16840:3:2013 -16841:0:2565 -16842:3:2014 -16843:0:2565 -16844:2:469 -16845:0:2565 -16846:2:475 -16847:0:2565 -16848:2:476 -16849:0:2565 -16850:3:2015 -16851:3:2019 -16852:3:2020 -16853:3:2028 -16854:3:2029 -16855:3:2033 -16856:3:2034 -16857:3:2042 -16858:3:2047 -16859:3:2051 -16860:3:2052 -16861:3:2059 -16862:3:2060 -16863:3:2071 -16864:3:2079 -16865:3:2080 -16866:3:2084 -16867:3:2089 -16868:3:2090 -16869:0:2565 -16870:3:2102 -16871:0:2565 -16872:3:2104 -16873:0:2565 -16874:3:2105 -16875:3:2109 -16876:3:2110 -16877:3:2118 -16878:3:2119 -16879:3:2123 -16880:3:2124 -16881:3:2132 -16882:3:2137 -16883:3:2141 -16884:3:2142 -16885:3:2149 -16886:3:2150 -16887:3:2161 -16888:3:2169 -16889:3:2170 -16890:3:2174 -16891:3:2179 -16892:3:2180 -16893:0:2565 -16894:3:2192 -16895:0:2565 -16896:3:2013 -16897:0:2565 -16898:2:477 -16899:2:481 -16900:2:482 -16901:2:490 -16902:2:499 -16903:2:500 -16904:2:504 -16905:2:509 -16906:2:513 -16907:2:514 -16908:2:521 -16909:2:522 -16910:2:533 -16911:2:534 -16912:2:537 -16913:2:538 -16914:2:546 -16915:2:551 -16916:2:552 -16917:0:2565 -16918:3:2014 -16919:0:2565 -16920:3:2015 -16921:3:2019 -16922:3:2020 -16923:3:2028 -16924:3:2029 -16925:3:2033 -16926:3:2034 -16927:3:2042 -16928:3:2047 -16929:3:2051 -16930:3:2052 -16931:3:2059 -16932:3:2060 -16933:3:2071 -16934:3:2079 -16935:3:2080 -16936:3:2084 -16937:3:2089 -16938:3:2090 -16939:0:2565 -16940:3:2102 -16941:0:2565 -16942:3:2104 -16943:0:2565 -16944:3:2105 -16945:3:2109 -16946:3:2110 -16947:3:2118 -16948:3:2119 -16949:3:2123 -16950:3:2124 -16951:3:2132 -16952:3:2137 -16953:3:2141 -16954:3:2142 -16955:3:2149 -16956:3:2150 -16957:3:2161 -16958:3:2169 -16959:3:2170 -16960:3:2174 -16961:3:2179 -16962:3:2180 -16963:0:2565 -16964:3:2192 -16965:0:2565 -16966:2:564 -16967:0:2565 -16968:3:2013 -16969:0:2565 -16970:3:2014 -16971:0:2565 -16972:3:2015 -16973:3:2019 -16974:3:2020 -16975:3:2028 -16976:3:2029 -16977:3:2033 -16978:3:2034 -16979:3:2042 -16980:3:2047 -16981:3:2051 -16982:3:2052 -16983:3:2059 -16984:3:2060 -16985:3:2071 -16986:3:2079 -16987:3:2080 -16988:3:2084 -16989:3:2089 -16990:3:2090 -16991:0:2565 -16992:3:2102 -16993:0:2565 -16994:3:2104 -16995:0:2565 -16996:3:2105 -16997:3:2109 -16998:3:2110 -16999:3:2118 -17000:3:2119 -17001:3:2123 -17002:3:2124 -17003:3:2132 -17004:3:2137 -17005:3:2141 -17006:3:2142 -17007:3:2149 -17008:3:2150 -17009:3:2161 -17010:3:2169 -17011:3:2170 -17012:3:2174 -17013:3:2179 -17014:3:2180 -17015:0:2565 -17016:2:565 -17017:2:569 -17018:2:570 -17019:2:578 -17020:2:587 -17021:2:588 -17022:2:592 -17023:2:597 -17024:2:601 -17025:2:602 -17026:2:609 -17027:2:610 -17028:2:621 -17029:2:622 -17030:2:625 -17031:2:626 -17032:2:634 -17033:2:639 -17034:2:640 -17035:0:2565 -17036:3:2192 -17037:0:2565 -17038:3:2013 -17039:0:2565 -17040:2:652 -17041:0:2565 -17042:3:2014 -17043:0:2565 -17044:3:2015 -17045:3:2019 -17046:3:2020 -17047:3:2028 -17048:3:2029 -17049:3:2033 -17050:3:2034 -17051:3:2042 -17052:3:2047 -17053:3:2051 -17054:3:2052 -17055:3:2059 -17056:3:2060 -17057:3:2071 -17058:3:2079 -17059:3:2080 -17060:3:2084 -17061:3:2089 -17062:3:2090 -17063:0:2565 -17064:3:2102 -17065:0:2565 -17066:3:2104 -17067:0:2565 -17068:3:2105 -17069:3:2109 -17070:3:2110 -17071:3:2118 -17072:3:2119 -17073:3:2123 -17074:3:2124 -17075:3:2132 -17076:3:2137 -17077:3:2141 -17078:3:2142 -17079:3:2149 -17080:3:2150 -17081:3:2161 -17082:3:2169 -17083:3:2170 -17084:3:2174 -17085:3:2179 -17086:3:2180 -17087:0:2565 -17088:3:2192 -17089:0:2565 -17090:2:653 -17091:0:2565 -17092:3:2013 -17093:0:2565 -17094:3:2014 -17095:0:2565 -17096:3:2015 -17097:3:2019 -17098:3:2020 -17099:3:2028 -17100:3:2029 -17101:3:2033 -17102:3:2034 -17103:3:2042 -17104:3:2047 -17105:3:2051 -17106:3:2052 -17107:3:2059 -17108:3:2060 -17109:3:2071 -17110:3:2079 -17111:3:2080 -17112:3:2084 -17113:3:2089 -17114:3:2090 -17115:0:2565 -17116:3:2102 -17117:0:2565 -17118:3:2104 -17119:0:2565 -17120:3:2105 -17121:3:2109 -17122:3:2110 -17123:3:2118 -17124:3:2119 -17125:3:2123 -17126:3:2124 -17127:3:2132 -17128:3:2137 -17129:3:2141 -17130:3:2142 -17131:3:2149 -17132:3:2150 -17133:3:2161 -17134:3:2169 -17135:3:2170 -17136:3:2174 -17137:3:2179 -17138:3:2180 -17139:0:2565 -17140:2:654 -17141:2:658 -17142:2:659 -17143:2:667 -17144:2:676 -17145:2:677 -17146:2:681 -17147:2:686 -17148:2:690 -17149:2:691 -17150:2:698 -17151:2:699 -17152:2:710 -17153:2:711 -17154:2:714 -17155:2:715 -17156:2:723 -17157:2:728 -17158:2:729 -17159:0:2565 -17160:3:2192 -17161:0:2565 -17162:3:2013 -17163:0:2565 -17164:3:2014 -17165:0:2565 -17166:3:2015 -17167:3:2019 -17168:3:2020 -17169:3:2028 -17170:3:2029 -17171:3:2033 -17172:3:2034 -17173:3:2042 -17174:3:2047 -17175:3:2051 -17176:3:2052 -17177:3:2059 -17178:3:2060 -17179:3:2071 -17180:3:2079 -17181:3:2080 -17182:3:2084 -17183:3:2089 -17184:3:2090 -17185:0:2565 -17186:3:2102 -17187:0:2565 -17188:3:2104 -17189:0:2565 -17190:1:295 -17191:0:2565 -17192:1:296 -17193:0:2565 -17194:3:2105 -17195:3:2109 -17196:3:2110 -17197:3:2118 -17198:3:2119 -17199:3:2123 -17200:3:2124 -17201:3:2132 -17202:3:2137 -17203:3:2141 -17204:3:2142 -17205:3:2149 -17206:3:2150 -17207:3:2161 -17208:3:2169 -17209:3:2170 -17210:3:2174 -17211:3:2179 -17212:3:2180 -17213:0:2565 -17214:3:2192 -17215:0:2565 -17216:3:2013 -17217:0:2565 -17218:3:2014 -17219:0:2565 -17220:3:2015 -17221:3:2019 -17222:3:2020 -17223:3:2028 -17224:3:2029 -17225:3:2033 -17226:3:2034 -17227:3:2042 -17228:3:2047 -17229:3:2051 -17230:3:2052 -17231:3:2059 -17232:3:2060 -17233:3:2071 -17234:3:2079 -17235:3:2080 -17236:3:2084 -17237:3:2089 -17238:3:2090 -17239:0:2565 -17240:3:2102 -17241:0:2565 -17242:3:2104 -17243:0:2565 -17244:1:295 -17245:0:2565 -17246:3:2105 -17247:3:2109 -17248:3:2110 -17249:3:2118 -17250:3:2119 -17251:3:2123 -17252:3:2124 -17253:3:2132 -17254:3:2137 -17255:3:2141 -17256:3:2142 -17257:3:2149 -17258:3:2150 -17259:3:2161 -17260:3:2169 -17261:3:2170 -17262:3:2174 -17263:3:2179 -17264:3:2180 -17265:0:2565 -17266:3:2192 -17267:0:2565 -17268:3:2013 -17269:0:2565 -17270:3:2014 -17271:0:2565 -17272:3:2015 -17273:3:2019 -17274:3:2020 -17275:3:2028 -17276:3:2029 -17277:3:2033 -17278:3:2034 -17279:3:2042 -17280:3:2047 -17281:3:2051 -17282:3:2052 -17283:3:2059 -17284:3:2060 -17285:3:2071 -17286:3:2079 -17287:3:2080 -17288:3:2084 -17289:3:2089 -17290:3:2090 -17291:0:2565 -17292:3:2102 -17293:0:2565 -17294:2:741 -17295:0:2565 -17296:2:750 -17297:0:2565 -17298:2:753 -17299:0:2565 -17300:1:296 -17301:0:2565 -17302:2:758 -17303:0:2565 -17304:2:759 -17305:0:2565 -17306:2:760 -17307:0:2565 -17308:2:761 -17309:0:2565 -17310:2:762 -17311:0:2565 -17312:2:763 -17313:0:2565 -17314:2:765 -17315:0:2565 -17316:2:766 -17317:2:770 -17318:2:771 -17319:2:779 -17320:2:780 -17321:2:781 -17322:2:793 -17323:2:798 -17324:2:802 -17325:2:803 -17326:2:810 -17327:2:811 -17328:2:822 -17329:2:823 -17330:2:824 -17331:2:835 -17332:2:840 -17333:2:841 -17334:0:2565 -17335:3:2104 -17336:0:2565 -17337:3:2105 -17338:3:2109 -17339:3:2110 -17340:3:2118 -17341:3:2119 -17342:3:2123 -17343:3:2124 -17344:3:2132 -17345:3:2137 -17346:3:2141 -17347:3:2142 -17348:3:2149 -17349:3:2150 -17350:3:2161 -17351:3:2169 -17352:3:2170 -17353:3:2174 -17354:3:2179 -17355:3:2180 -17356:0:2565 -17357:3:2192 -17358:0:2565 -17359:3:2013 -17360:0:2565 -17361:3:2014 -17362:0:2565 -17363:3:2015 -17364:3:2019 -17365:3:2020 -17366:3:2028 -17367:3:2029 -17368:3:2033 -17369:3:2034 -17370:3:2042 -17371:3:2047 -17372:3:2051 -17373:3:2052 -17374:3:2059 -17375:3:2060 -17376:3:2071 -17377:3:2079 -17378:3:2080 -17379:3:2084 -17380:3:2089 -17381:3:2090 -17382:0:2565 -17383:3:2102 -17384:0:2565 -17385:2:853 -17386:0:2565 -17387:2:857 -17388:0:2565 -17389:3:2104 -17390:0:2565 -17391:3:2105 -17392:3:2109 -17393:3:2110 -17394:3:2118 -17395:3:2119 -17396:3:2123 -17397:3:2124 -17398:3:2132 -17399:3:2137 -17400:3:2141 -17401:3:2142 -17402:3:2149 -17403:3:2150 -17404:3:2161 -17405:3:2169 -17406:3:2170 -17407:3:2174 -17408:3:2179 -17409:3:2180 -17410:0:2565 -17411:3:2192 -17412:0:2565 -17413:1:295 -17414:0:2565 -17415:3:2013 -17416:0:2565 -17417:2:465 -17418:0:2565 -17419:1:296 -17420:0:2565 -17421:3:2014 -17422:0:2565 -17423:3:2015 -17424:3:2019 -17425:3:2020 -17426:3:2028 -17427:3:2029 -17428:3:2033 -17429:3:2034 -17430:3:2042 -17431:3:2047 -17432:3:2051 -17433:3:2052 -17434:3:2059 -17435:3:2060 -17436:3:2071 -17437:3:2079 -17438:3:2080 -17439:3:2084 -17440:3:2089 -17441:3:2090 -17442:0:2565 -17443:3:2102 -17444:0:2565 -17445:3:2104 -17446:0:2565 -17447:3:2105 -17448:3:2109 -17449:3:2110 -17450:3:2118 -17451:3:2119 -17452:3:2123 -17453:3:2124 -17454:3:2132 -17455:3:2137 -17456:3:2141 -17457:3:2142 -17458:3:2149 -17459:3:2150 -17460:3:2161 -17461:3:2169 -17462:3:2170 -17463:3:2174 -17464:3:2179 -17465:3:2180 -17466:0:2565 -17467:3:2192 -17468:0:2565 -17469:3:2013 -17470:0:2565 -17471:1:295 -17472:0:2565 -17473:3:2014 -17474:0:2565 -17475:3:2015 -17476:3:2019 -17477:3:2020 -17478:3:2028 -17479:3:2029 -17480:3:2033 -17481:3:2034 -17482:3:2042 -17483:3:2047 -17484:3:2051 -17485:3:2052 -17486:3:2059 -17487:3:2060 -17488:3:2071 -17489:3:2079 -17490:3:2080 -17491:3:2084 -17492:3:2089 -17493:3:2090 -17494:0:2565 -17495:3:2102 -17496:0:2565 -17497:3:2104 -17498:0:2565 -17499:3:2105 -17500:3:2109 -17501:3:2110 -17502:3:2118 -17503:3:2119 -17504:3:2123 -17505:3:2124 -17506:3:2132 -17507:3:2137 -17508:3:2141 -17509:3:2142 -17510:3:2149 -17511:3:2150 -17512:3:2161 -17513:3:2169 -17514:3:2170 -17515:3:2174 -17516:3:2179 -17517:3:2180 -17518:0:2565 -17519:3:2192 -17520:0:2565 -17521:2:466 -17522:0:2565 -17523:3:2013 -17524:0:2565 -17525:1:296 -17526:0:2565 -17527:2:467 -17528:0:2565 -17529:2:468 -17530:0:2565 -17531:1:297 -17532:0:2565 -17533:2:467 -17534:0:2565 -17535:3:2014 -17536:0:2565 -17537:3:2015 -17538:3:2019 -17539:3:2020 -17540:3:2028 -17541:3:2029 -17542:3:2033 -17543:3:2034 -17544:3:2042 -17545:3:2047 -17546:3:2051 -17547:3:2052 -17548:3:2059 -17549:3:2060 -17550:3:2071 -17551:3:2079 -17552:3:2080 -17553:3:2084 -17554:3:2089 -17555:3:2090 -17556:0:2565 -17557:3:2102 -17558:0:2565 -17559:3:2104 -17560:0:2565 -17561:3:2105 -17562:3:2109 -17563:3:2110 -17564:3:2118 -17565:3:2119 -17566:3:2123 -17567:3:2124 -17568:3:2132 -17569:3:2137 -17570:3:2141 -17571:3:2142 -17572:3:2149 -17573:3:2150 -17574:3:2161 -17575:3:2169 -17576:3:2170 -17577:3:2174 -17578:3:2179 -17579:3:2180 -17580:0:2565 -17581:3:2192 -17582:0:2565 -17583:3:2013 -17584:0:2565 -17585:1:303 -17586:0:2565 -17587:2:468 -17588:0:2565 -17589:1:312 -17590:0:2565 -17591:2:467 -17592:0:2565 -17593:2:468 -17594:0:2565 -17595:1:314 -17596:0:2565 -17597:3:2014 -17598:0:2565 -17599:3:2015 -17600:3:2019 -17601:3:2020 -17602:3:2028 -17603:3:2029 -17604:3:2033 -17605:3:2034 -17606:3:2042 -17607:3:2047 -17608:3:2051 -17609:3:2052 -17610:3:2059 -17611:3:2060 -17612:3:2071 -17613:3:2079 -17614:3:2080 -17615:3:2084 -17616:3:2089 -17617:3:2090 -17618:0:2565 -17619:3:2102 -17620:0:2565 -17621:3:2104 -17622:0:2565 -17623:3:2105 -17624:3:2109 -17625:3:2110 -17626:3:2118 -17627:3:2119 -17628:3:2123 -17629:3:2124 -17630:3:2132 -17631:3:2137 -17632:3:2141 -17633:3:2142 -17634:3:2149 -17635:3:2150 -17636:3:2161 -17637:3:2169 -17638:3:2170 -17639:3:2174 -17640:3:2179 -17641:3:2180 -17642:0:2565 -17643:3:2192 -17644:0:2565 -17645:3:2013 -17646:0:2565 -17647:2:469 -17648:0:2565 -17649:2:475 -17650:0:2565 -17651:3:2014 -17652:0:2565 -17653:3:2015 -17654:3:2019 -17655:3:2020 -17656:3:2028 -17657:3:2029 -17658:3:2033 -17659:3:2034 -17660:3:2042 -17661:3:2047 -17662:3:2051 -17663:3:2052 -17664:3:2059 -17665:3:2060 -17666:3:2071 -17667:3:2079 -17668:3:2080 -17669:3:2084 -17670:3:2089 -17671:3:2090 -17672:0:2565 -17673:1:315 -17674:0:2565 -17675:3:2102 -17676:0:2565 -17677:2:476 -17678:0:2565 -17679:1:316 -17680:0:2565 -17681:3:2104 -17682:0:2565 -17683:3:2105 -17684:3:2109 -17685:3:2110 -17686:3:2118 -17687:3:2119 -17688:3:2123 -17689:3:2124 -17690:3:2132 -17691:3:2137 -17692:3:2141 -17693:3:2142 -17694:3:2149 -17695:3:2150 -17696:3:2161 -17697:3:2169 -17698:3:2170 -17699:3:2174 -17700:3:2179 -17701:3:2180 -17702:0:2565 -17703:3:2192 -17704:0:2565 -17705:3:2013 -17706:0:2565 -17707:3:2014 -17708:0:2565 -17709:3:2015 -17710:3:2019 -17711:3:2020 -17712:3:2028 -17713:3:2029 -17714:3:2033 -17715:3:2034 -17716:3:2042 -17717:3:2047 -17718:3:2051 -17719:3:2052 -17720:3:2059 -17721:3:2060 -17722:3:2071 -17723:3:2079 -17724:3:2080 -17725:3:2084 -17726:3:2089 -17727:3:2090 -17728:0:2565 -17729:3:2102 -17730:0:2565 -17731:2:477 -17732:2:481 -17733:2:482 -17734:2:490 -17735:2:499 -17736:2:500 -17737:2:504 -17738:2:509 -17739:2:513 -17740:2:514 -17741:2:521 -17742:2:522 -17743:2:533 -17744:2:534 -17745:2:537 -17746:2:538 -17747:2:546 -17748:2:551 -17749:2:552 -17750:0:2565 -17751:3:2104 -17752:0:2565 -17753:3:2105 -17754:3:2109 -17755:3:2110 -17756:3:2118 -17757:3:2119 -17758:3:2123 -17759:3:2124 -17760:3:2132 -17761:3:2137 -17762:3:2141 -17763:3:2142 -17764:3:2149 -17765:3:2150 -17766:3:2161 -17767:3:2169 -17768:3:2170 -17769:3:2174 -17770:3:2179 -17771:3:2180 -17772:0:2565 -17773:3:2192 -17774:0:2565 -17775:3:2013 -17776:0:2565 -17777:3:2014 -17778:0:2565 -17779:3:2015 -17780:3:2019 -17781:3:2020 -17782:3:2028 -17783:3:2029 -17784:3:2033 -17785:3:2034 -17786:3:2042 -17787:3:2047 -17788:3:2051 -17789:3:2052 -17790:3:2059 -17791:3:2060 -17792:3:2071 -17793:3:2079 -17794:3:2080 -17795:3:2084 -17796:3:2089 -17797:3:2090 -17798:0:2565 -17799:2:564 -17800:0:2565 -17801:3:2102 -17802:0:2565 -17803:3:2104 -17804:0:2565 -17805:3:2105 -17806:3:2109 -17807:3:2110 -17808:3:2118 -17809:3:2119 -17810:3:2123 -17811:3:2124 -17812:3:2132 -17813:3:2137 -17814:3:2141 -17815:3:2142 -17816:3:2149 -17817:3:2150 -17818:3:2161 -17819:3:2169 -17820:3:2170 -17821:3:2174 -17822:3:2179 -17823:3:2180 -17824:0:2565 -17825:3:2192 -17826:0:2565 -17827:3:2013 -17828:0:2565 -17829:3:2014 -17830:0:2565 -17831:2:565 -17832:2:569 -17833:2:570 -17834:2:578 -17835:2:579 -17836:2:580 -17837:2:592 -17838:2:597 -17839:2:601 -17840:2:602 -17841:2:609 -17842:2:610 -17843:2:621 -17844:2:622 -17845:2:623 -17846:2:634 -17847:2:639 -17848:2:640 -17849:0:2565 -17850:3:2015 -17851:3:2019 -17852:3:2020 -17853:3:2028 -17854:3:2029 -17855:3:2033 -17856:3:2034 -17857:3:2042 -17858:3:2047 -17859:3:2051 -17860:3:2052 -17861:3:2059 -17862:3:2060 -17863:3:2071 -17864:3:2079 -17865:3:2080 -17866:3:2084 -17867:3:2089 -17868:3:2090 -17869:0:2565 -17870:3:2102 -17871:0:2565 -17872:3:2104 -17873:0:2565 -17874:3:2105 -17875:3:2109 -17876:3:2110 -17877:3:2118 -17878:3:2119 -17879:3:2123 -17880:3:2124 -17881:3:2132 -17882:3:2137 -17883:3:2141 -17884:3:2142 -17885:3:2149 -17886:3:2150 -17887:3:2161 -17888:3:2169 -17889:3:2170 -17890:3:2174 -17891:3:2179 -17892:3:2180 -17893:0:2565 -17894:3:2192 -17895:0:2565 -17896:1:315 -17897:0:2565 -17898:3:2013 -17899:0:2565 -17900:2:744 -17901:0:2565 -17902:1:316 -17903:0:2565 -17904:3:2014 -17905:0:2565 -17906:3:2015 -17907:3:2019 -17908:3:2020 -17909:3:2028 -17910:3:2029 -17911:3:2033 -17912:3:2034 -17913:3:2042 -17914:3:2047 -17915:3:2051 -17916:3:2052 -17917:3:2059 -17918:3:2060 -17919:3:2071 -17920:3:2079 -17921:3:2080 -17922:3:2084 -17923:3:2089 -17924:3:2090 -17925:0:2565 -17926:3:2102 -17927:0:2565 -17928:3:2104 -17929:0:2565 -17930:3:2105 -17931:3:2109 -17932:3:2110 -17933:3:2118 -17934:3:2119 -17935:3:2123 -17936:3:2124 -17937:3:2132 -17938:3:2137 -17939:3:2141 -17940:3:2142 -17941:3:2149 -17942:3:2150 -17943:3:2161 -17944:3:2169 -17945:3:2170 -17946:3:2174 -17947:3:2179 -17948:3:2180 -17949:0:2565 -17950:3:2192 -17951:0:2565 -17952:3:2013 -17953:0:2565 -17954:1:315 -17955:0:2565 -17956:3:2014 -17957:0:2565 -17958:3:2015 -17959:3:2019 -17960:3:2020 -17961:3:2028 -17962:3:2029 -17963:3:2033 -17964:3:2034 -17965:3:2042 -17966:3:2047 -17967:3:2051 -17968:3:2052 -17969:3:2059 -17970:3:2060 -17971:3:2071 -17972:3:2079 -17973:3:2080 -17974:3:2084 -17975:3:2089 -17976:3:2090 -17977:0:2565 -17978:3:2102 -17979:0:2565 -17980:3:2104 -17981:0:2565 -17982:3:2105 -17983:3:2109 -17984:3:2110 -17985:3:2118 -17986:3:2119 -17987:3:2123 -17988:3:2124 -17989:3:2132 -17990:3:2137 -17991:3:2141 -17992:3:2142 -17993:3:2149 -17994:3:2150 -17995:3:2161 -17996:3:2169 -17997:3:2170 -17998:3:2174 -17999:3:2179 -18000:3:2180 -18001:0:2565 -18002:3:2192 -18003:0:2565 -18004:2:745 -18005:0:2565 -18006:3:2013 -18007:0:2565 -18008:2:750 -18009:0:2565 -18010:2:753 -18011:0:2565 -18012:1:316 -18013:0:2565 -18014:3:2014 -18015:0:2565 -18016:3:2015 -18017:3:2019 -18018:3:2020 -18019:3:2028 -18020:3:2029 -18021:3:2033 -18022:3:2034 -18023:3:2042 -18024:3:2047 -18025:3:2051 -18026:3:2052 -18027:3:2059 -18028:3:2060 -18029:3:2071 -18030:3:2079 -18031:3:2080 -18032:3:2084 -18033:3:2089 -18034:3:2090 -18035:0:2565 -18036:3:2102 -18037:0:2565 -18038:3:2104 -18039:0:2565 -18040:3:2105 -18041:3:2109 -18042:3:2110 -18043:3:2118 -18044:3:2119 -18045:3:2123 -18046:3:2124 -18047:3:2132 -18048:3:2137 -18049:3:2141 -18050:3:2142 -18051:3:2149 -18052:3:2150 -18053:3:2161 -18054:3:2169 -18055:3:2170 -18056:3:2174 -18057:3:2179 -18058:3:2180 -18059:0:2565 -18060:3:2192 -18061:0:2565 -18062:3:2013 -18063:0:2565 -18064:1:315 -18065:0:2565 -18066:3:2014 -18067:0:2565 -18068:3:2015 -18069:3:2019 -18070:3:2020 -18071:3:2028 -18072:3:2029 -18073:3:2033 -18074:3:2034 -18075:3:2042 -18076:3:2047 -18077:3:2051 -18078:3:2052 -18079:3:2059 -18080:3:2060 -18081:3:2071 -18082:3:2079 -18083:3:2080 -18084:3:2084 -18085:3:2089 -18086:3:2090 -18087:0:2565 -18088:3:2102 -18089:0:2565 -18090:3:2104 -18091:0:2565 -18092:3:2105 -18093:3:2109 -18094:3:2110 -18095:3:2118 -18096:3:2119 -18097:3:2123 -18098:3:2124 -18099:3:2132 -18100:3:2137 -18101:3:2141 -18102:3:2142 -18103:3:2149 -18104:3:2150 -18105:3:2161 -18106:3:2169 -18107:3:2170 -18108:3:2174 -18109:3:2179 -18110:3:2180 -18111:0:2565 -18112:3:2192 -18113:0:2565 -18114:2:758 -18115:0:2565 -18116:3:2013 -18117:0:2565 -18118:1:316 -18119:0:2565 -18120:3:2014 -18121:0:2565 -18122:3:2015 -18123:3:2019 -18124:3:2020 -18125:3:2028 -18126:3:2029 -18127:3:2033 -18128:3:2034 -18129:3:2042 -18130:3:2047 -18131:3:2051 -18132:3:2052 -18133:3:2059 -18134:3:2060 -18135:3:2071 -18136:3:2079 -18137:3:2080 -18138:3:2084 -18139:3:2089 -18140:3:2090 -18141:0:2565 -18142:3:2102 -18143:0:2565 -18144:3:2104 -18145:0:2565 -18146:3:2105 -18147:3:2109 -18148:3:2110 -18149:3:2118 -18150:3:2119 -18151:3:2123 -18152:3:2124 -18153:3:2132 -18154:3:2137 -18155:3:2141 -18156:3:2142 -18157:3:2149 -18158:3:2150 -18159:3:2161 -18160:3:2169 -18161:3:2170 -18162:3:2174 -18163:3:2179 -18164:3:2180 -18165:0:2565 -18166:3:2192 -18167:0:2565 -18168:3:2013 -18169:0:2565 -18170:1:315 -18171:0:2565 -18172:3:2014 -18173:0:2565 -18174:3:2015 -18175:3:2019 -18176:3:2020 -18177:3:2028 -18178:3:2029 -18179:3:2033 -18180:3:2034 -18181:3:2042 -18182:3:2047 -18183:3:2051 -18184:3:2052 -18185:3:2059 -18186:3:2060 -18187:3:2071 -18188:3:2079 -18189:3:2080 -18190:3:2084 -18191:3:2089 -18192:3:2090 -18193:0:2565 -18194:3:2102 -18195:0:2565 -18196:3:2104 -18197:0:2565 -18198:3:2105 -18199:3:2109 -18200:3:2110 -18201:3:2118 -18202:3:2119 -18203:3:2123 -18204:3:2124 -18205:3:2132 -18206:3:2137 -18207:3:2141 -18208:3:2142 -18209:3:2149 -18210:3:2150 -18211:3:2161 -18212:3:2169 -18213:3:2170 -18214:3:2174 -18215:3:2179 -18216:3:2180 -18217:0:2565 -18218:3:2192 -18219:0:2565 -18220:2:759 -18221:0:2565 -18222:3:2013 -18223:0:2565 -18224:1:316 -18225:0:2565 -18226:3:2014 -18227:0:2565 -18228:3:2015 -18229:3:2019 -18230:3:2020 -18231:3:2028 -18232:3:2029 -18233:3:2033 -18234:3:2034 -18235:3:2042 -18236:3:2047 -18237:3:2051 -18238:3:2052 -18239:3:2059 -18240:3:2060 -18241:3:2071 -18242:3:2079 -18243:3:2080 -18244:3:2084 -18245:3:2089 -18246:3:2090 -18247:0:2565 -18248:3:2102 -18249:0:2565 -18250:3:2104 -18251:0:2565 -18252:3:2105 -18253:3:2109 -18254:3:2110 -18255:3:2118 -18256:3:2119 -18257:3:2123 -18258:3:2124 -18259:3:2132 -18260:3:2137 -18261:3:2141 -18262:3:2142 -18263:3:2149 -18264:3:2150 -18265:3:2161 -18266:3:2169 -18267:3:2170 -18268:3:2174 -18269:3:2179 -18270:3:2180 -18271:0:2565 -18272:3:2192 -18273:0:2565 -18274:3:2013 -18275:0:2565 -18276:2:760 -18277:0:2565 -18278:2:761 -18279:0:2565 -18280:2:762 -18281:0:2565 -18282:3:2014 -18283:0:2565 -18284:3:2015 -18285:3:2019 -18286:3:2020 -18287:3:2028 -18288:3:2029 -18289:3:2033 -18290:3:2034 -18291:3:2042 -18292:3:2047 -18293:3:2051 -18294:3:2052 -18295:3:2059 -18296:3:2060 -18297:3:2071 -18298:3:2079 -18299:3:2080 -18300:3:2084 -18301:3:2089 -18302:3:2090 -18303:0:2565 -18304:3:2102 -18305:0:2565 -18306:1:315 -18307:0:2565 -18308:2:763 -18309:0:2565 -18310:1:316 -18311:0:2565 -18312:3:2104 -18313:0:2565 -18314:3:2105 -18315:3:2109 -18316:3:2110 -18317:3:2118 -18318:3:2119 -18319:3:2123 -18320:3:2124 -18321:3:2132 -18322:3:2137 -18323:3:2141 -18324:3:2142 -18325:3:2149 -18326:3:2150 -18327:3:2161 -18328:3:2169 -18329:3:2170 -18330:3:2174 -18331:3:2179 -18332:3:2180 -18333:0:2565 -18334:3:2192 -18335:0:2565 -18336:3:2013 -18337:0:2565 -18338:3:2014 -18339:0:2565 -18340:3:2015 -18341:3:2019 -18342:3:2020 -18343:3:2028 -18344:3:2029 -18345:3:2033 -18346:3:2034 -18347:3:2042 -18348:3:2047 -18349:3:2051 -18350:3:2052 -18351:3:2059 -18352:3:2060 -18353:3:2071 -18354:3:2079 -18355:3:2080 -18356:3:2084 -18357:3:2089 -18358:3:2090 -18359:0:2565 -18360:3:2102 -18361:0:2565 -18362:1:315 -18363:0:2565 -18364:3:2104 -18365:0:2565 -18366:3:2105 -18367:3:2109 -18368:3:2110 -18369:3:2118 -18370:3:2119 -18371:3:2123 -18372:3:2124 -18373:3:2132 -18374:3:2137 -18375:3:2141 -18376:3:2142 -18377:3:2149 -18378:3:2150 -18379:3:2161 -18380:3:2169 -18381:3:2170 -18382:3:2174 -18383:3:2179 -18384:3:2180 -18385:0:2565 -18386:3:2192 -18387:0:2565 -18388:3:2013 -18389:0:2565 -18390:3:2014 -18391:0:2565 -18392:3:2015 -18393:3:2019 -18394:3:2020 -18395:3:2028 -18396:3:2029 -18397:3:2033 -18398:3:2034 -18399:3:2042 -18400:3:2047 -18401:3:2051 -18402:3:2052 -18403:3:2059 -18404:3:2060 -18405:3:2071 -18406:3:2079 -18407:3:2080 -18408:3:2084 -18409:3:2089 -18410:3:2090 -18411:0:2565 -18412:2:765 -18413:0:2565 -18414:3:2102 -18415:0:2565 -18416:1:316 -18417:0:2565 -18418:3:2104 -18419:0:2565 -18420:3:2105 -18421:3:2109 -18422:3:2110 -18423:3:2118 -18424:3:2119 -18425:3:2123 -18426:3:2124 -18427:3:2132 -18428:3:2137 -18429:3:2141 -18430:3:2142 -18431:3:2149 -18432:3:2150 -18433:3:2161 -18434:3:2169 -18435:3:2170 -18436:3:2174 -18437:3:2179 -18438:3:2180 -18439:0:2565 -18440:3:2192 -18441:0:2565 -18442:3:2013 -18443:0:2565 -18444:3:2014 -18445:0:2565 -18446:3:2015 -18447:3:2019 -18448:3:2020 -18449:3:2028 -18450:3:2029 -18451:3:2033 -18452:3:2034 -18453:3:2042 -18454:3:2047 -18455:3:2051 -18456:3:2052 -18457:3:2059 -18458:3:2060 -18459:3:2071 -18460:3:2079 -18461:3:2080 -18462:3:2084 -18463:3:2089 -18464:3:2090 -18465:0:2565 -18466:3:2102 -18467:0:2565 -18468:2:766 -18469:2:770 -18470:2:771 -18471:2:779 -18472:2:788 -18473:2:789 -18474:2:793 -18475:2:798 -18476:2:802 -18477:2:803 -18478:2:810 -18479:2:811 -18480:2:822 -18481:2:823 -18482:2:826 -18483:2:827 -18484:2:835 -18485:2:840 -18486:2:841 -18487:0:2565 -18488:3:2104 -18489:0:2565 -18490:3:2105 -18491:3:2109 -18492:3:2110 -18493:3:2118 -18494:3:2119 -18495:3:2123 -18496:3:2124 -18497:3:2132 -18498:3:2137 -18499:3:2141 -18500:3:2142 -18501:3:2149 -18502:3:2150 -18503:3:2161 -18504:3:2169 -18505:3:2170 -18506:3:2174 -18507:3:2179 -18508:3:2180 -18509:0:2565 -18510:3:2192 -18511:0:2565 -18512:3:2013 -18513:0:2565 -18514:3:2014 -18515:0:2565 -18516:3:2015 -18517:3:2019 -18518:3:2020 -18519:3:2028 -18520:3:2029 -18521:3:2033 -18522:3:2034 -18523:3:2042 -18524:3:2047 -18525:3:2051 -18526:3:2052 -18527:3:2059 -18528:3:2060 -18529:3:2071 -18530:3:2079 -18531:3:2080 -18532:3:2084 -18533:3:2089 -18534:3:2090 -18535:0:2565 -18536:2:853 -18537:0:2565 -18538:3:2102 -18539:0:2565 -18540:2:857 -18541:0:2565 -18542:2:465 -18543:0:2565 -18544:3:2104 -18545:0:2565 -18546:3:2105 -18547:3:2109 -18548:3:2110 -18549:3:2118 -18550:3:2119 -18551:3:2123 -18552:3:2124 -18553:3:2132 -18554:3:2137 -18555:3:2141 -18556:3:2142 -18557:3:2149 -18558:3:2150 -18559:3:2161 -18560:3:2169 -18561:3:2170 -18562:3:2174 -18563:3:2179 -18564:3:2180 -18565:0:2565 -18566:3:2192 -18567:0:2565 -18568:3:2013 -18569:0:2565 -18570:3:2014 -18571:0:2565 -18572:3:2015 -18573:3:2019 -18574:3:2020 -18575:3:2028 -18576:3:2029 -18577:3:2033 -18578:3:2034 -18579:3:2042 -18580:3:2047 -18581:3:2051 -18582:3:2052 -18583:3:2059 -18584:3:2060 -18585:3:2071 -18586:3:2079 -18587:3:2080 -18588:3:2084 -18589:3:2089 -18590:3:2090 -18591:0:2565 -18592:2:466 -18593:0:2565 -18594:3:2102 -18595:0:2565 -18596:3:2104 -18597:0:2565 -18598:3:2105 -18599:3:2109 -18600:3:2110 -18601:3:2118 -18602:3:2119 -18603:3:2123 -18604:3:2124 -18605:3:2132 -18606:3:2137 -18607:3:2141 -18608:3:2142 -18609:3:2149 -18610:3:2150 -18611:3:2161 -18612:3:2169 -18613:3:2170 -18614:3:2174 -18615:3:2179 -18616:3:2180 -18617:0:2565 -18618:3:2192 -18619:0:2565 -18620:3:2013 -18621:0:2565 -18622:3:2014 -18623:0:2565 -18624:2:467 -18625:0:2565 -18626:3:2015 -18627:3:2019 -18628:3:2020 -18629:3:2028 -18630:3:2029 -18631:3:2033 -18632:3:2034 -18633:3:2042 -18634:3:2047 -18635:3:2051 -18636:3:2052 -18637:3:2059 -18638:3:2060 -18639:3:2071 -18640:3:2079 -18641:3:2080 -18642:3:2084 -18643:3:2089 -18644:3:2090 -18645:0:2565 -18646:3:2102 -18647:0:2565 -18648:3:2104 -18649:0:2565 -18650:3:2105 -18651:3:2109 -18652:3:2110 -18653:3:2118 -18654:3:2119 -18655:3:2123 -18656:3:2124 -18657:3:2132 -18658:3:2137 -18659:3:2141 -18660:3:2142 -18661:3:2149 -18662:3:2150 -18663:3:2161 -18664:3:2169 -18665:3:2170 -18666:3:2174 -18667:3:2179 -18668:3:2180 -18669:0:2565 -18670:3:2192 -18671:0:2565 -18672:3:2013 -18673:0:2565 -18674:1:317 -18675:0:2565 -18676:2:468 -18677:0:2565 -18678:1:323 -18679:0:2565 -18680:1:324 -18681:0:2565 -18682:3:2014 -18683:0:2565 -18684:3:2015 -18685:3:2019 -18686:3:2020 -18687:3:2028 -18688:3:2029 -18689:3:2033 -18690:3:2034 -18691:3:2042 -18692:3:2047 -18693:3:2051 -18694:3:2052 -18695:3:2059 -18696:3:2060 -18697:3:2071 -18698:3:2079 -18699:3:2080 -18700:3:2084 -18701:3:2089 -18702:3:2090 -18703:0:2565 -18704:3:2102 -18705:0:2565 -18706:3:2104 -18707:0:2565 -18708:3:2105 -18709:3:2109 -18710:3:2110 -18711:3:2118 -18712:3:2119 -18713:3:2123 -18714:3:2124 -18715:3:2132 -18716:3:2137 -18717:3:2141 -18718:3:2142 -18719:3:2149 -18720:3:2150 -18721:3:2161 -18722:3:2169 -18723:3:2170 -18724:3:2174 -18725:3:2179 -18726:3:2180 -18727:0:2565 -18728:3:2192 -18729:0:2565 -18730:3:2013 -18731:0:2565 -18732:2:467 -18733:0:2565 -18734:2:468 -18735:0:2565 -18736:3:2014 -18737:0:2565 -18738:3:2015 -18739:3:2019 -18740:3:2020 -18741:3:2028 -18742:3:2029 -18743:3:2033 -18744:3:2034 -18745:3:2042 -18746:3:2047 -18747:3:2051 -18748:3:2052 -18749:3:2059 -18750:3:2060 -18751:3:2071 -18752:3:2079 -18753:3:2080 -18754:3:2084 -18755:3:2089 -18756:3:2090 -18757:0:2565 -18758:3:2102 -18759:0:2565 -18760:3:2104 -18761:0:2565 -18762:3:2105 -18763:3:2109 -18764:3:2110 -18765:3:2118 -18766:3:2119 -18767:3:2123 -18768:3:2124 -18769:3:2132 -18770:3:2137 -18771:3:2141 -18772:3:2142 -18773:3:2149 -18774:3:2150 -18775:3:2161 -18776:3:2169 -18777:3:2170 -18778:3:2174 -18779:3:2179 -18780:3:2180 -18781:0:2565 -18782:3:2192 -18783:0:2565 -18784:2:467 -18785:0:2565 -18786:1:329 -18787:0:2565 -18788:3:2013 -18789:0:2565 -18790:2:468 -18791:0:2565 -18792:3:2014 -18793:0:2565 -18794:3:2015 -18795:3:2019 -18796:3:2020 -18797:3:2028 -18798:3:2029 -18799:3:2033 -18800:3:2034 -18801:3:2042 -18802:3:2047 -18803:3:2051 -18804:3:2052 -18805:3:2059 -18806:3:2060 -18807:3:2071 -18808:3:2079 -18809:3:2080 -18810:3:2084 -18811:3:2089 -18812:3:2090 -18813:0:2565 -18814:3:2102 -18815:0:2565 -18816:3:2104 -18817:0:2565 -18818:3:2105 -18819:3:2109 -18820:3:2110 -18821:3:2118 -18822:3:2119 -18823:3:2123 -18824:3:2124 -18825:3:2132 -18826:3:2137 -18827:3:2141 -18828:3:2142 -18829:3:2149 -18830:3:2150 -18831:3:2161 -18832:3:2169 -18833:3:2170 -18834:3:2174 -18835:3:2179 -18836:3:2180 -18837:0:2565 -18838:3:2192 -18839:0:2565 -18840:2:467 -18841:0:2565 -18842:3:2013 -18843:0:2565 -18844:3:2014 -18845:0:2565 -18846:3:2015 -18847:3:2019 -18848:3:2020 -18849:3:2028 -18850:3:2029 -18851:3:2033 -18852:3:2034 -18853:3:2042 -18854:3:2047 -18855:3:2051 -18856:3:2052 -18857:3:2059 -18858:3:2060 -18859:3:2071 -18860:3:2079 -18861:3:2080 -18862:3:2084 -18863:3:2089 -18864:3:2090 -18865:0:2565 -18866:3:2102 -18867:0:2565 -18868:3:2104 -18869:0:2565 -18870:3:2105 -18871:3:2109 -18872:3:2110 -18873:3:2118 -18874:3:2119 -18875:3:2123 -18876:3:2124 -18877:3:2132 -18878:3:2137 -18879:3:2141 -18880:3:2142 -18881:3:2149 -18882:3:2150 -18883:3:2161 -18884:3:2169 -18885:3:2170 -18886:3:2174 -18887:3:2179 -18888:3:2180 -18889:0:2565 -18890:1:330 -18891:0:2565 -18892:3:2192 -18893:0:2565 -18894:3:2013 -18895:0:2565 -18896:2:468 -18897:0:2565 -18898:3:2014 -18899:0:2565 -18900:3:2015 -18901:3:2019 -18902:3:2020 -18903:3:2028 -18904:3:2029 -18905:3:2033 -18906:3:2034 -18907:3:2042 -18908:3:2047 -18909:3:2051 -18910:3:2052 -18911:3:2059 -18912:3:2060 -18913:3:2071 -18914:3:2079 -18915:3:2080 -18916:3:2084 -18917:3:2089 -18918:3:2090 -18919:0:2565 -18920:3:2102 -18921:0:2565 -18922:3:2104 -18923:0:2565 -18924:3:2105 -18925:3:2109 -18926:3:2110 -18927:3:2118 -18928:3:2119 -18929:3:2123 -18930:3:2124 -18931:3:2132 -18932:3:2137 -18933:3:2141 -18934:3:2142 -18935:3:2149 -18936:3:2150 -18937:3:2161 -18938:3:2169 -18939:3:2170 -18940:3:2174 -18941:3:2179 -18942:3:2180 -18943:0:2565 -18944:3:2192 -18945:0:2565 -18946:2:467 -18947:0:2565 -18948:3:2013 -18949:0:2565 -18950:3:2014 -18951:0:2565 -18952:3:2015 -18953:3:2019 -18954:3:2020 -18955:3:2028 -18956:3:2029 -18957:3:2033 -18958:3:2034 -18959:3:2042 -18960:3:2047 -18961:3:2051 -18962:3:2052 -18963:3:2059 -18964:3:2060 -18965:3:2071 -18966:3:2079 -18967:3:2080 -18968:3:2084 -18969:3:2089 -18970:3:2090 -18971:0:2565 -18972:3:2102 -18973:0:2565 -18974:3:2104 -18975:0:2565 -18976:3:2105 -18977:3:2109 -18978:3:2110 -18979:3:2118 -18980:3:2119 -18981:3:2123 -18982:3:2124 -18983:3:2132 -18984:3:2137 -18985:3:2141 -18986:3:2142 -18987:3:2149 -18988:3:2150 -18989:3:2161 -18990:3:2169 -18991:3:2170 -18992:3:2174 -18993:3:2179 -18994:3:2180 -18995:0:2565 -18996:1:331 -18997:0:2565 -18998:3:2192 -18999:0:2565 -19000:3:2013 -19001:0:2565 -19002:2:468 -19003:0:2565 -19004:1:332 -19005:0:2565 -19006:1:333 -19007:0:2565 -19008:1:334 -19009:0:2565 -19010:3:2014 -19011:0:2565 -19012:3:2015 -19013:3:2019 -19014:3:2020 -19015:3:2028 -19016:3:2029 -19017:3:2033 -19018:3:2034 -19019:3:2042 -19020:3:2047 -19021:3:2051 -19022:3:2052 -19023:3:2059 -19024:3:2060 -19025:3:2071 -19026:3:2079 -19027:3:2080 -19028:3:2084 -19029:3:2089 -19030:3:2090 -19031:0:2565 -19032:3:2102 -19033:0:2565 -19034:3:2104 -19035:0:2565 -19036:3:2105 -19037:3:2109 -19038:3:2110 -19039:3:2118 -19040:3:2119 -19041:3:2123 -19042:3:2124 -19043:3:2132 -19044:3:2137 -19045:3:2141 -19046:3:2142 -19047:3:2149 -19048:3:2150 -19049:3:2161 -19050:3:2169 -19051:3:2170 -19052:3:2174 -19053:3:2179 -19054:3:2180 -19055:0:2565 -19056:3:2192 -19057:0:2565 -19058:3:2013 -19059:0:2565 -19060:2:467 -19061:0:2565 -19062:2:468 -19063:0:2565 -19064:3:2014 -19065:0:2565 -19066:3:2015 -19067:3:2019 -19068:3:2020 -19069:3:2028 -19070:3:2029 -19071:3:2033 -19072:3:2034 -19073:3:2042 -19074:3:2047 -19075:3:2051 -19076:3:2052 -19077:3:2059 -19078:3:2060 -19079:3:2071 -19080:3:2079 -19081:3:2080 -19082:3:2084 -19083:3:2089 -19084:3:2090 -19085:0:2565 -19086:3:2102 -19087:0:2565 -19088:3:2104 -19089:0:2565 -19090:3:2105 -19091:3:2109 -19092:3:2110 -19093:3:2118 -19094:3:2119 -19095:3:2123 -19096:3:2124 -19097:3:2132 -19098:3:2137 -19099:3:2141 -19100:3:2142 -19101:3:2149 -19102:3:2150 -19103:3:2161 -19104:3:2169 -19105:3:2170 -19106:3:2174 -19107:3:2179 -19108:3:2180 -19109:0:2565 -19110:3:2192 -19111:0:2565 -19112:2:467 -19113:0:2565 -19114:1:336 -19115:0:2565 -19116:3:2013 -19117:0:2565 -19118:2:468 -19119:0:2565 -19120:3:2014 -19121:0:2565 -19122:3:2015 -19123:3:2019 -19124:3:2020 -19125:3:2028 -19126:3:2029 -19127:3:2033 -19128:3:2034 -19129:3:2042 -19130:3:2047 -19131:3:2051 -19132:3:2052 -19133:3:2059 -19134:3:2060 -19135:3:2071 -19136:3:2079 -19137:3:2080 -19138:3:2084 -19139:3:2089 -19140:3:2090 -19141:0:2565 -19142:3:2102 -19143:0:2565 -19144:3:2104 -19145:0:2565 -19146:3:2105 -19147:3:2109 -19148:3:2110 -19149:3:2118 -19150:3:2119 -19151:3:2123 -19152:3:2124 -19153:3:2132 -19154:3:2137 -19155:3:2141 -19156:3:2142 -19157:3:2149 -19158:3:2150 -19159:3:2161 -19160:3:2169 -19161:3:2170 -19162:3:2174 -19163:3:2179 -19164:3:2180 -19165:0:2565 -19166:3:2192 -19167:0:2565 -19168:2:469 -19169:0:2565 -19170:3:2013 -19171:0:2565 -19172:2:475 -19173:0:2565 -19174:2:476 -19175:0:2565 -19176:3:2014 -19177:0:2565 -19178:3:2015 -19179:3:2019 -19180:3:2020 -19181:3:2028 -19182:3:2029 -19183:3:2033 -19184:3:2034 -19185:3:2042 -19186:3:2047 -19187:3:2051 -19188:3:2052 -19189:3:2059 -19190:3:2060 -19191:3:2071 -19192:3:2079 -19193:3:2080 -19194:3:2084 -19195:3:2089 -19196:3:2090 -19197:0:2565 -19198:3:2102 -19199:0:2565 -19200:3:2104 -19201:0:2565 -19202:3:2105 -19203:3:2109 -19204:3:2110 -19205:3:2118 -19206:3:2119 -19207:3:2123 -19208:3:2124 -19209:3:2132 -19210:3:2137 -19211:3:2141 -19212:3:2142 -19213:3:2149 -19214:3:2150 -19215:3:2161 -19216:3:2169 -19217:3:2170 -19218:3:2174 -19219:3:2179 -19220:3:2180 -19221:0:2565 -19222:3:2192 -19223:0:2565 -19224:2:477 -19225:2:481 -19226:2:482 -19227:2:490 -19228:2:499 -19229:2:500 -19230:2:504 -19231:2:509 -19232:2:513 -19233:2:514 -19234:2:521 -19235:2:522 -19236:2:533 -19237:2:534 -19238:2:537 -19239:2:538 -19240:2:546 -19241:2:551 -19242:2:552 -19243:0:2565 -19244:3:2013 -19245:0:2565 -19246:3:2014 -19247:0:2565 -19248:3:2015 -19249:3:2019 -19250:3:2020 -19251:3:2028 -19252:3:2029 -19253:3:2033 -19254:3:2034 -19255:3:2042 -19256:3:2047 -19257:3:2051 -19258:3:2052 -19259:3:2059 -19260:3:2060 -19261:3:2071 -19262:3:2079 -19263:3:2080 -19264:3:2084 -19265:3:2089 -19266:3:2090 -19267:0:2565 -19268:3:2102 -19269:0:2565 -19270:3:2104 -19271:0:2565 -19272:3:2105 -19273:3:2109 -19274:3:2110 -19275:3:2118 -19276:3:2119 -19277:3:2123 -19278:3:2124 -19279:3:2132 -19280:3:2137 -19281:3:2141 -19282:3:2142 -19283:3:2149 -19284:3:2150 -19285:3:2161 -19286:3:2169 -19287:3:2170 -19288:3:2174 -19289:3:2179 -19290:3:2180 -19291:0:2565 -19292:2:564 -19293:0:2565 -19294:3:2192 -19295:0:2565 -19296:3:2013 -19297:0:2565 -19298:3:2014 -19299:0:2565 -19300:3:2015 -19301:3:2019 -19302:3:2020 -19303:3:2028 -19304:3:2029 -19305:3:2033 -19306:3:2034 -19307:3:2042 -19308:3:2047 -19309:3:2051 -19310:3:2052 -19311:3:2059 -19312:3:2060 -19313:3:2071 -19314:3:2079 -19315:3:2080 -19316:3:2084 -19317:3:2089 -19318:3:2090 -19319:0:2565 -19320:3:2102 -19321:0:2565 -19322:3:2104 -19323:0:2565 -19324:2:565 -19325:2:569 -19326:2:570 -19327:2:578 -19328:2:587 -19329:2:588 -19330:2:592 -19331:2:597 -19332:2:601 -19333:2:602 -19334:2:609 -19335:2:610 -19336:2:621 -19337:2:622 -19338:2:625 -19339:2:626 -19340:2:634 -19341:2:639 -19342:2:640 -19343:0:2565 -19344:2:744 -19345:0:2565 -19346:3:2105 -19347:3:2109 -19348:3:2110 -19349:3:2118 -19350:3:2119 -19351:3:2123 -19352:3:2124 -19353:3:2132 -19354:3:2137 -19355:3:2141 -19356:3:2142 -19357:3:2149 -19358:3:2150 -19359:3:2161 -19360:3:2169 -19361:3:2170 -19362:3:2174 -19363:3:2179 -19364:3:2180 -19365:0:2565 -19366:3:2192 -19367:0:2565 -19368:3:2013 -19369:0:2565 -19370:3:2014 -19371:0:2565 -19372:3:2015 -19373:3:2019 -19374:3:2020 -19375:3:2028 -19376:3:2029 -19377:3:2033 -19378:3:2034 -19379:3:2042 -19380:3:2047 -19381:3:2051 -19382:3:2052 -19383:3:2059 -19384:3:2060 -19385:3:2071 -19386:3:2079 -19387:3:2080 -19388:3:2084 -19389:3:2089 -19390:3:2090 -19391:0:2565 -19392:3:2102 -19393:0:2565 -19394:1:337 -19395:0:2565 -19396:1:338 -19397:0:2565 -19398:3:2104 -19399:0:2565 -19400:3:2105 -19401:3:2109 -19402:3:2110 -19403:3:2118 -19404:3:2119 -19405:3:2123 -19406:3:2124 -19407:3:2132 -19408:3:2137 -19409:3:2141 -19410:3:2142 -19411:3:2149 -19412:3:2150 -19413:3:2161 -19414:3:2169 -19415:3:2170 -19416:3:2174 -19417:3:2179 -19418:3:2180 -19419:0:2565 -19420:3:2192 -19421:0:2565 -19422:3:2013 -19423:0:2565 -19424:3:2014 -19425:0:2565 -19426:3:2015 -19427:3:2019 -19428:3:2020 -19429:3:2028 -19430:3:2029 -19431:3:2033 -19432:3:2034 -19433:3:2042 -19434:3:2047 -19435:3:2051 -19436:3:2052 -19437:3:2059 -19438:3:2060 -19439:3:2071 -19440:3:2079 -19441:3:2080 -19442:3:2084 -19443:3:2089 -19444:3:2090 -19445:0:2565 -19446:3:2102 -19447:0:2565 -19448:1:337 -19449:0:2565 -19450:3:2104 -19451:0:2565 -19452:3:2105 -19453:3:2109 -19454:3:2110 -19455:3:2118 -19456:3:2119 -19457:3:2123 -19458:3:2124 -19459:3:2132 -19460:3:2137 -19461:3:2141 -19462:3:2142 -19463:3:2149 -19464:3:2150 -19465:3:2161 -19466:3:2169 -19467:3:2170 -19468:3:2174 -19469:3:2179 -19470:3:2180 -19471:0:2565 -19472:3:2192 -19473:0:2565 -19474:3:2013 -19475:0:2565 -19476:3:2014 -19477:0:2565 -19478:3:2015 -19479:3:2019 -19480:3:2020 -19481:3:2028 -19482:3:2029 -19483:3:2033 -19484:3:2034 -19485:3:2042 -19486:3:2047 -19487:3:2051 -19488:3:2052 -19489:3:2059 -19490:3:2060 -19491:3:2071 -19492:3:2079 -19493:3:2080 -19494:3:2084 -19495:3:2089 -19496:3:2090 -19497:0:2565 -19498:2:745 -19499:0:2565 -19500:3:2102 -19501:0:2565 -19502:2:750 -19503:0:2565 -19504:2:753 -19505:0:2565 -19506:1:338 -19507:0:2565 -19508:3:2104 -19509:0:2565 -19510:3:2105 -19511:3:2109 -19512:3:2110 -19513:3:2118 -19514:3:2119 -19515:3:2123 -19516:3:2124 -19517:3:2132 -19518:3:2137 -19519:3:2141 -19520:3:2142 -19521:3:2149 -19522:3:2150 -19523:3:2161 -19524:3:2169 -19525:3:2170 -19526:3:2174 -19527:3:2179 -19528:3:2180 -19529:0:2565 -19530:3:2192 -19531:0:2565 -19532:3:2013 -19533:0:2565 -19534:3:2014 -19535:0:2565 -19536:3:2015 -19537:3:2019 -19538:3:2020 -19539:3:2028 -19540:3:2029 -19541:3:2033 -19542:3:2034 -19543:3:2042 -19544:3:2047 -19545:3:2051 -19546:3:2052 -19547:3:2059 -19548:3:2060 -19549:3:2071 -19550:3:2079 -19551:3:2080 -19552:3:2084 -19553:3:2089 -19554:3:2090 -19555:0:2565 -19556:3:2102 -19557:0:2565 -19558:1:337 -19559:0:2565 -19560:3:2104 -19561:0:2565 -19562:3:2105 -19563:3:2109 -19564:3:2110 -19565:3:2118 -19566:3:2119 -19567:3:2123 -19568:3:2124 -19569:3:2132 -19570:3:2137 -19571:3:2141 -19572:3:2142 -19573:3:2149 -19574:3:2150 -19575:3:2161 -19576:3:2169 -19577:3:2170 -19578:3:2174 -19579:3:2179 -19580:3:2180 -19581:0:2565 -19582:3:2192 -19583:0:2565 -19584:3:2013 -19585:0:2565 -19586:3:2014 -19587:0:2565 -19588:3:2015 -19589:3:2019 -19590:3:2020 -19591:3:2028 -19592:3:2029 -19593:3:2033 -19594:3:2034 -19595:3:2042 -19596:3:2047 -19597:3:2051 -19598:3:2052 -19599:3:2059 -19600:3:2060 -19601:3:2071 -19602:3:2079 -19603:3:2080 -19604:3:2084 -19605:3:2089 -19606:3:2090 -19607:0:2565 -19608:2:758 -19609:0:2565 -19610:3:2102 -19611:0:2565 -19612:1:338 -19613:0:2565 -19614:3:2104 -19615:0:2565 -19616:3:2105 -19617:3:2109 -19618:3:2110 -19619:3:2118 -19620:3:2119 -19621:3:2123 -19622:3:2124 -19623:3:2132 -19624:3:2137 -19625:3:2141 -19626:3:2142 -19627:3:2149 -19628:3:2150 -19629:3:2161 -19630:3:2169 -19631:3:2170 -19632:3:2174 -19633:3:2179 -19634:3:2180 -19635:0:2565 -19636:3:2192 -19637:0:2565 -19638:3:2013 -19639:0:2565 -19640:3:2014 -19641:0:2565 -19642:3:2015 -19643:3:2019 -19644:3:2020 -19645:3:2028 -19646:3:2029 -19647:3:2033 -19648:3:2034 -19649:3:2042 -19650:3:2047 -19651:3:2051 -19652:3:2052 -19653:3:2059 -19654:3:2060 -19655:3:2071 -19656:3:2079 -19657:3:2080 -19658:3:2084 -19659:3:2089 -19660:3:2090 -19661:0:2565 -19662:3:2102 -19663:0:2565 -19664:1:337 -19665:0:2565 -19666:3:2104 -19667:0:2565 -19668:3:2105 -19669:3:2109 -19670:3:2110 -19671:3:2118 -19672:3:2119 -19673:3:2123 -19674:3:2124 -19675:3:2132 -19676:3:2137 -19677:3:2141 -19678:3:2142 -19679:3:2149 -19680:3:2150 -19681:3:2161 -19682:3:2169 -19683:3:2170 -19684:3:2174 -19685:3:2179 -19686:3:2180 -19687:0:2565 -19688:3:2192 -19689:0:2565 -19690:3:2013 -19691:0:2565 -19692:3:2014 -19693:0:2565 -19694:3:2015 -19695:3:2019 -19696:3:2020 -19697:3:2028 -19698:3:2029 -19699:3:2033 -19700:3:2034 -19701:3:2042 -19702:3:2047 -19703:3:2051 -19704:3:2052 -19705:3:2059 -19706:3:2060 -19707:3:2071 -19708:3:2079 -19709:3:2080 -19710:3:2084 -19711:3:2089 -19712:3:2090 -19713:0:2565 -19714:2:759 -19715:0:2565 -19716:3:2102 -19717:0:2565 -19718:1:338 -19719:0:2565 -19720:3:2104 -19721:0:2565 -19722:3:2105 -19723:3:2109 -19724:3:2110 -19725:3:2118 -19726:3:2119 -19727:3:2123 -19728:3:2124 -19729:3:2132 -19730:3:2137 -19731:3:2141 -19732:3:2142 -19733:3:2149 -19734:3:2150 -19735:3:2161 -19736:3:2169 -19737:3:2170 -19738:3:2174 -19739:3:2179 -19740:3:2180 -19741:0:2565 -19742:3:2192 -19743:0:2565 -19744:3:2013 -19745:0:2565 -19746:3:2014 -19747:0:2565 -19748:3:2015 -19749:3:2019 -19750:3:2020 -19751:3:2028 -19752:3:2029 -19753:3:2033 -19754:3:2034 -19755:3:2042 -19756:3:2047 -19757:3:2051 -19758:3:2052 -19759:3:2059 -19760:3:2060 -19761:3:2071 -19762:3:2079 -19763:3:2080 -19764:3:2084 -19765:3:2089 -19766:3:2090 -19767:0:2565 -19768:3:2102 -19769:0:2565 -19770:2:760 -19771:0:2565 -19772:2:761 -19773:0:2565 -19774:2:762 -19775:0:2565 -19776:3:2104 -19777:0:2565 -19778:3:2105 -19779:3:2109 -19780:3:2110 -19781:3:2118 -19782:3:2119 -19783:3:2123 -19784:3:2124 -19785:3:2132 -19786:3:2137 -19787:3:2141 -19788:3:2142 -19789:3:2149 -19790:3:2150 -19791:3:2161 -19792:3:2169 -19793:3:2170 -19794:3:2174 -19795:3:2179 -19796:3:2180 -19797:0:2565 -19798:3:2192 -19799:0:2565 -19800:1:337 -19801:0:2565 -19802:3:2013 -19803:0:2565 -19804:2:763 -19805:0:2565 -19806:1:338 -19807:0:2565 -19808:3:2014 -19809:0:2565 -19810:3:2015 -19811:3:2019 -19812:3:2020 -19813:3:2028 -19814:3:2029 -19815:3:2033 -19816:3:2034 -19817:3:2042 -19818:3:2047 -19819:3:2051 -19820:3:2052 -19821:3:2059 -19822:3:2060 -19823:3:2071 -19824:3:2079 -19825:3:2080 -19826:3:2084 -19827:3:2089 -19828:3:2090 -19829:0:2565 -19830:3:2102 -19831:0:2565 -19832:3:2104 -19833:0:2565 -19834:3:2105 -19835:3:2109 -19836:3:2110 -19837:3:2118 -19838:3:2119 -19839:3:2123 -19840:3:2124 -19841:3:2132 -19842:3:2137 -19843:3:2141 -19844:3:2142 -19845:3:2149 -19846:3:2150 -19847:3:2161 -19848:3:2169 -19849:3:2170 -19850:3:2174 -19851:3:2179 -19852:3:2180 -19853:0:2565 -19854:3:2192 -19855:0:2565 -19856:3:2013 -19857:0:2565 -19858:1:337 -19859:0:2565 -19860:3:2014 -19861:0:2565 -19862:3:2015 -19863:3:2019 -19864:3:2020 -19865:3:2028 -19866:3:2029 -19867:3:2033 -19868:3:2034 -19869:3:2042 -19870:3:2047 -19871:3:2051 -19872:3:2052 -19873:3:2059 -19874:3:2060 -19875:3:2071 -19876:3:2079 -19877:3:2080 -19878:3:2084 -19879:3:2089 -19880:3:2090 -19881:0:2565 -19882:3:2102 -19883:0:2565 -19884:3:2104 -19885:0:2565 -19886:3:2105 -19887:3:2109 -19888:3:2110 -19889:3:2118 -19890:3:2119 -19891:3:2123 -19892:3:2124 -19893:3:2132 -19894:3:2137 -19895:3:2141 -19896:3:2142 -19897:3:2149 -19898:3:2150 -19899:3:2161 -19900:3:2169 -19901:3:2170 -19902:3:2174 -19903:3:2179 -19904:3:2180 -19905:0:2565 -19906:3:2192 -19907:0:2565 -19908:2:765 -19909:0:2565 -19910:3:2013 -19911:0:2565 -19912:1:338 -19913:0:2565 -19914:3:2014 -19915:0:2565 -19916:3:2015 -19917:3:2019 -19918:3:2020 -19919:3:2028 -19920:3:2029 -19921:3:2033 -19922:3:2034 -19923:3:2042 -19924:3:2047 -19925:3:2051 -19926:3:2052 -19927:3:2059 -19928:3:2060 -19929:3:2071 -19930:3:2079 -19931:3:2080 -19932:3:2084 -19933:3:2089 -19934:3:2090 -19935:0:2565 -19936:3:2102 -19937:0:2565 -19938:3:2104 -19939:0:2565 -19940:3:2105 -19941:3:2109 -19942:3:2110 -19943:3:2118 -19944:3:2119 -19945:3:2123 -19946:3:2124 -19947:3:2132 -19948:3:2137 -19949:3:2141 -19950:3:2142 -19951:3:2149 -19952:3:2150 -19953:3:2161 -19954:3:2169 -19955:3:2170 -19956:3:2174 -19957:3:2179 -19958:3:2180 -19959:0:2565 -19960:3:2192 -19961:0:2565 -19962:3:2013 -19963:0:2565 -19964:2:766 -19965:2:770 -19966:2:771 -19967:2:779 -19968:2:788 -19969:2:789 -19970:2:793 -19971:2:798 -19972:2:802 -19973:2:803 -19974:2:810 -19975:2:811 -19976:2:822 -19977:2:823 -19978:2:826 -19979:2:827 -19980:2:835 -19981:2:840 -19982:2:841 -19983:0:2565 -19984:3:2014 -19985:0:2565 -19986:3:2015 -19987:3:2019 -19988:3:2020 -19989:3:2028 -19990:3:2029 -19991:3:2033 -19992:3:2034 -19993:3:2042 -19994:3:2047 -19995:3:2051 -19996:3:2052 -19997:3:2059 -19998:3:2060 -19999:3:2071 -20000:3:2079 -20001:3:2080 -20002:3:2084 -20003:3:2089 -20004:3:2090 -20005:0:2565 -20006:3:2102 -20007:0:2565 -20008:3:2104 -20009:0:2565 -20010:3:2105 -20011:3:2109 -20012:3:2110 -20013:3:2118 -20014:3:2119 -20015:3:2123 -20016:3:2124 -20017:3:2132 -20018:3:2137 -20019:3:2141 -20020:3:2142 -20021:3:2149 -20022:3:2150 -20023:3:2161 -20024:3:2169 -20025:3:2170 -20026:3:2174 -20027:3:2179 -20028:3:2180 -20029:0:2565 -20030:3:2192 -20031:0:2565 -20032:2:853 -20033:0:2565 -20034:3:2013 -20035:0:2565 -20036:2:857 -20037:0:2565 -20038:2:465 -20039:0:2565 -20040:3:2014 -20041:0:2565 -20042:3:2015 -20043:3:2019 -20044:3:2020 -20045:3:2028 -20046:3:2029 -20047:3:2033 -20048:3:2034 -20049:3:2042 -20050:3:2047 -20051:3:2051 -20052:3:2052 -20053:3:2059 -20054:3:2060 -20055:3:2071 -20056:3:2079 -20057:3:2080 -20058:3:2084 -20059:3:2089 -20060:3:2090 -20061:0:2565 -20062:3:2102 -20063:0:2565 -20064:3:2104 -20065:0:2565 -20066:3:2105 -20067:3:2109 -20068:3:2110 -20069:3:2118 -20070:3:2119 -20071:3:2123 -20072:3:2124 -20073:3:2132 -20074:3:2137 -20075:3:2141 -20076:3:2142 -20077:3:2149 -20078:3:2150 -20079:3:2161 -20080:3:2169 -20081:3:2170 -20082:3:2174 -20083:3:2179 -20084:3:2180 -20085:0:2565 -20086:3:2192 -20087:0:2565 -20088:2:466 -20089:0:2565 -20090:3:2013 -20091:0:2565 -20092:3:2014 -20093:0:2565 -20094:3:2015 -20095:3:2019 -20096:3:2020 -20097:3:2028 -20098:3:2029 -20099:3:2033 -20100:3:2034 -20101:3:2042 -20102:3:2047 -20103:3:2051 -20104:3:2052 -20105:3:2059 -20106:3:2060 -20107:3:2071 -20108:3:2079 -20109:3:2080 -20110:3:2084 -20111:3:2089 -20112:3:2090 -20113:0:2565 -20114:3:2102 -20115:0:2565 -20116:3:2104 -20117:0:2565 -20118:3:2105 -20119:3:2109 -20120:3:2110 -20121:3:2118 -20122:3:2119 -20123:3:2123 -20124:3:2124 -20125:3:2132 -20126:3:2137 -20127:3:2141 -20128:3:2142 -20129:3:2149 -20130:3:2150 -20131:3:2161 -20132:3:2169 -20133:3:2170 -20134:3:2174 -20135:3:2179 -20136:3:2180 -20137:0:2565 -20138:2:467 -20139:0:2565 -20140:3:2192 -20141:0:2565 -20142:3:2013 -20143:0:2565 -20144:3:2014 -20145:0:2565 -20146:3:2015 -20147:3:2019 -20148:3:2020 -20149:3:2028 -20150:3:2029 -20151:3:2033 -20152:3:2034 -20153:3:2042 -20154:3:2047 -20155:3:2051 -20156:3:2052 -20157:3:2059 -20158:3:2060 -20159:3:2071 -20160:3:2079 -20161:3:2080 -20162:3:2084 -20163:3:2089 -20164:3:2090 -20165:0:2565 -20166:3:2102 -20167:0:2565 -20168:3:2104 -20169:0:2565 -20170:1:339 -20171:0:2565 -20172:2:468 -20173:0:2565 -20174:3:2105 -20175:3:2109 -20176:3:2110 -20177:3:2118 -20178:3:2119 -20179:3:2123 -20180:3:2124 -20181:3:2132 -20182:3:2137 -20183:3:2141 -20184:3:2142 -20185:3:2149 -20186:3:2150 -20187:3:2161 -20188:3:2169 -20189:3:2170 -20190:3:2174 -20191:3:2179 -20192:3:2180 -20193:0:2565 -20194:3:2192 -20195:0:2565 -20196:3:2013 -20197:0:2565 -20198:3:2014 -20199:0:2565 -20200:3:2015 -20201:3:2019 -20202:3:2020 -20203:3:2028 -20204:3:2029 -20205:3:2033 -20206:3:2034 -20207:3:2042 -20208:3:2047 -20209:3:2051 -20210:3:2052 -20211:3:2059 -20212:3:2060 -20213:3:2071 -20214:3:2079 -20215:3:2080 -20216:3:2084 -20217:3:2089 -20218:3:2090 -20219:0:2565 -20220:3:2102 -20221:0:2565 -20222:3:2104 -20223:0:2565 -20224:2:467 -20225:0:2565 -20226:2:468 -20227:0:2565 -20228:3:2105 -20229:3:2109 -20230:3:2110 -20231:3:2118 -20232:3:2119 -20233:3:2123 -20234:3:2124 -20235:3:2132 -20236:3:2137 -20237:3:2141 -20238:3:2142 -20239:3:2149 -20240:3:2150 -20241:3:2161 -20242:3:2169 -20243:3:2170 -20244:3:2174 -20245:3:2179 -20246:3:2180 -20247:0:2565 -20248:3:2192 -20249:0:2565 -20250:3:2013 -20251:0:2565 -20252:3:2014 -20253:0:2565 -20254:3:2015 -20255:3:2019 -20256:3:2020 -20257:3:2028 -20258:3:2029 -20259:3:2033 -20260:3:2034 -20261:3:2042 -20262:3:2047 -20263:3:2051 -20264:3:2052 -20265:3:2059 -20266:3:2060 -20267:3:2071 -20268:3:2079 -20269:3:2080 -20270:3:2084 -20271:3:2089 -20272:3:2090 -20273:0:2565 -20274:3:2102 -20275:0:2565 -20276:2:467 -20277:0:2565 -20278:1:345 -20279:0:2565 -20280:2:468 -20281:0:2565 -20282:3:2104 -20283:0:2565 -20284:3:2105 -20285:3:2109 -20286:3:2110 -20287:3:2118 -20288:3:2119 -20289:3:2123 -20290:3:2124 -20291:3:2132 -20292:3:2137 -20293:3:2141 -20294:3:2142 -20295:3:2149 -20296:3:2150 -20297:3:2161 -20298:3:2169 -20299:3:2170 -20300:3:2174 -20301:3:2179 -20302:3:2180 -20303:0:2565 -20304:3:2192 -20305:0:2565 -20306:3:2013 -20307:0:2565 -20308:3:2014 -20309:0:2565 -20310:3:2015 -20311:3:2019 -20312:3:2020 -20313:3:2028 -20314:3:2029 -20315:3:2033 -20316:3:2034 -20317:3:2042 -20318:3:2047 -20319:3:2051 -20320:3:2052 -20321:3:2059 -20322:3:2060 -20323:3:2071 -20324:3:2079 -20325:3:2080 -20326:3:2084 -20327:3:2089 -20328:3:2090 -20329:0:2565 -20330:3:2102 -20331:0:2565 -20332:2:467 -20333:0:2565 -20334:2:468 -20335:0:2565 -20336:3:2104 -20337:0:2565 -20338:3:2105 -20339:3:2109 -20340:3:2110 -20341:3:2118 -20342:3:2119 -20343:3:2123 -20344:3:2124 -20345:3:2132 -20346:3:2137 -20347:3:2141 -20348:3:2142 -20349:3:2149 -20350:3:2150 -20351:3:2161 -20352:3:2169 -20353:3:2170 -20354:3:2174 -20355:3:2179 -20356:3:2180 -20357:0:2565 -20358:3:2192 -20359:0:2565 -20360:3:2013 -20361:0:2565 -20362:3:2014 -20363:0:2565 -20364:3:2015 -20365:3:2019 -20366:3:2020 -20367:3:2028 -20368:3:2029 -20369:3:2033 -20370:3:2034 -20371:3:2042 -20372:3:2047 -20373:3:2051 -20374:3:2052 -20375:3:2059 -20376:3:2060 -20377:3:2071 -20378:3:2079 -20379:3:2080 -20380:3:2084 -20381:3:2089 -20382:3:2090 -20383:0:2565 -20384:2:467 -20385:0:2565 -20386:1:346 -20387:1:350 -20388:1:351 -20389:1:359 -20390:1:360 -20391:1:361 -20392:1:373 -20393:1:378 -20394:1:382 -20395:1:383 -20396:1:390 -20397:1:391 -20398:1:402 -20399:1:403 -20400:1:404 -20401:1:415 -20402:1:420 -20403:1:421 -20404:0:2565 -20405:3:2102 -20406:0:2565 -20407:3:2104 -20408:0:2565 -20409:1:433 -20410:0:2565 -20411:3:2105 -20412:3:2109 -20413:3:2110 -20414:3:2118 -20415:3:2119 -20416:3:2123 -20417:3:2124 -20418:3:2132 -20419:3:2137 -20420:3:2141 -20421:3:2142 -20422:3:2149 -20423:3:2150 -20424:3:2161 -20425:3:2169 -20426:3:2170 -20427:3:2174 -20428:3:2179 -20429:3:2180 -20430:0:2565 -20431:1:434 -20432:0:2565 -20433:3:2192 -20434:0:2565 -20435:3:2013 -20436:0:2565 -20437:2:468 -20438:0:2565 -20439:1:435 -20440:0:2565 -20441:3:2014 -20442:0:2565 -20443:3:2015 -20444:3:2019 -20445:3:2020 -20446:3:2028 -20447:3:2029 -20448:3:2033 -20449:3:2034 -20450:3:2042 -20451:3:2047 -20452:3:2051 -20453:3:2052 -20454:3:2059 -20455:3:2060 -20456:3:2071 -20457:3:2079 -20458:3:2080 -20459:3:2084 -20460:3:2089 -20461:3:2090 -20462:0:2565 -20463:3:2102 -20464:0:2565 -20465:3:2104 -20466:0:2565 -20467:3:2105 -20468:3:2109 -20469:3:2110 -20470:3:2118 -20471:3:2119 -20472:3:2123 -20473:3:2124 -20474:3:2132 -20475:3:2137 -20476:3:2141 -20477:3:2142 -20478:3:2149 -20479:3:2150 -20480:3:2161 -20481:3:2169 -20482:3:2170 -20483:3:2174 -20484:3:2179 -20485:3:2180 -20486:0:2565 -20487:3:2192 -20488:0:2565 -20489:3:2013 -20490:0:2565 -20491:1:434 -20492:0:2565 -20493:3:2014 -20494:0:2565 -20495:3:2015 -20496:3:2019 -20497:3:2020 -20498:3:2028 -20499:3:2029 -20500:3:2033 -20501:3:2034 -20502:3:2042 -20503:3:2047 -20504:3:2051 -20505:3:2052 -20506:3:2059 -20507:3:2060 -20508:3:2071 -20509:3:2079 -20510:3:2080 -20511:3:2084 -20512:3:2089 -20513:3:2090 -20514:0:2565 -20515:3:2102 -20516:0:2565 -20517:3:2104 -20518:0:2565 -20519:3:2105 -20520:3:2109 -20521:3:2110 -20522:3:2118 -20523:3:2119 -20524:3:2123 -20525:3:2124 -20526:3:2132 -20527:3:2137 -20528:3:2141 -20529:3:2142 -20530:3:2149 -20531:3:2150 -20532:3:2161 -20533:3:2169 -20534:3:2170 -20535:3:2174 -20536:3:2179 -20537:3:2180 -20538:0:2565 -20539:3:2192 -20540:0:2565 -20541:2:469 -20542:0:2565 -20543:3:2013 -20544:0:2565 -20545:2:475 -20546:0:2565 -20547:2:476 -20548:0:2565 -20549:1:435 -20550:0:2565 -20551:3:2014 -20552:0:2565 -20553:3:2015 -20554:3:2019 -20555:3:2020 -20556:3:2028 -20557:3:2029 -20558:3:2033 -20559:3:2034 -20560:3:2042 -20561:3:2047 -20562:3:2051 -20563:3:2052 -20564:3:2059 -20565:3:2060 -20566:3:2071 -20567:3:2079 -20568:3:2080 -20569:3:2084 -20570:3:2089 -20571:3:2090 -20572:0:2565 -20573:3:2102 -20574:0:2565 -20575:3:2104 -20576:0:2565 -20577:3:2105 -20578:3:2109 -20579:3:2110 -20580:3:2118 -20581:3:2119 -20582:3:2123 -20583:3:2124 -20584:3:2132 -20585:3:2137 -20586:3:2141 -20587:3:2142 -20588:3:2149 -20589:3:2150 -20590:3:2161 -20591:3:2169 -20592:3:2170 -20593:3:2174 -20594:3:2179 -20595:3:2180 -20596:0:2565 -20597:3:2192 -20598:0:2565 -20599:3:2013 -20600:0:2565 -20601:1:434 -20602:0:2565 -20603:3:2014 -20604:0:2565 -20605:3:2015 -20606:3:2019 -20607:3:2020 -20608:3:2028 -20609:3:2029 -20610:3:2033 -20611:3:2034 -20612:3:2042 -20613:3:2047 -20614:3:2051 -20615:3:2052 -20616:3:2059 -20617:3:2060 -20618:3:2071 -20619:3:2079 -20620:3:2080 -20621:3:2084 -20622:3:2089 -20623:3:2090 -20624:0:2565 -20625:3:2102 -20626:0:2565 -20627:3:2104 -20628:0:2565 -20629:3:2105 -20630:3:2109 -20631:3:2110 -20632:3:2118 -20633:3:2119 -20634:3:2123 -20635:3:2124 -20636:3:2132 -20637:3:2137 -20638:3:2141 -20639:3:2142 -20640:3:2149 -20641:3:2150 -20642:3:2161 -20643:3:2169 -20644:3:2170 -20645:3:2174 -20646:3:2179 -20647:3:2180 -20648:0:2565 -20649:3:2192 -20650:0:2565 -20651:2:477 -20652:2:481 -20653:2:482 -20654:2:490 -20655:2:491 -20656:2:495 -20657:2:496 -20658:2:504 -20659:2:509 -20660:2:513 -20661:2:514 -20662:2:521 -20663:2:522 -20664:2:533 -20665:2:534 -20666:2:535 -20667:2:546 -20668:2:551 -20669:2:552 -20670:0:2565 -20671:3:2013 -20672:0:2565 -20673:1:435 -20674:0:2565 -20675:3:2014 -20676:0:2565 -20677:3:2015 -20678:3:2019 -20679:3:2020 -20680:3:2028 -20681:3:2029 -20682:3:2033 -20683:3:2034 -20684:3:2042 -20685:3:2047 -20686:3:2051 -20687:3:2052 -20688:3:2059 -20689:3:2060 -20690:3:2071 -20691:3:2079 -20692:3:2080 -20693:3:2084 -20694:3:2089 -20695:3:2090 -20696:0:2565 -20697:3:2102 -20698:0:2565 -20699:3:2104 -20700:0:2565 -20701:3:2105 -20702:3:2109 -20703:3:2110 -20704:3:2118 -20705:3:2119 -20706:3:2123 -20707:3:2124 -20708:3:2132 -20709:3:2137 -20710:3:2141 -20711:3:2142 -20712:3:2149 -20713:3:2150 -20714:3:2161 -20715:3:2169 -20716:3:2170 -20717:3:2174 -20718:3:2179 -20719:3:2180 -20720:0:2565 -20721:3:2192 -20722:0:2565 -20723:3:2013 -20724:0:2565 -20725:1:434 -20726:0:2565 -20727:3:2014 -20728:0:2565 -20729:3:2015 -20730:3:2019 -20731:3:2020 -20732:3:2028 -20733:3:2029 -20734:3:2033 -20735:3:2034 -20736:3:2042 -20737:3:2047 -20738:3:2051 -20739:3:2052 -20740:3:2059 -20741:3:2060 -20742:3:2071 -20743:3:2079 -20744:3:2080 -20745:3:2084 -20746:3:2089 -20747:3:2090 -20748:0:2565 -20749:3:2102 -20750:0:2565 -20751:3:2104 -20752:0:2565 -20753:3:2105 -20754:3:2109 -20755:3:2110 -20756:3:2118 -20757:3:2119 -20758:3:2123 -20759:3:2124 -20760:3:2132 -20761:3:2137 -20762:3:2141 -20763:3:2142 -20764:3:2149 -20765:3:2150 -20766:3:2161 -20767:3:2169 -20768:3:2170 -20769:3:2174 -20770:3:2179 -20771:3:2180 -20772:0:2565 -20773:3:2192 -20774:0:2565 -20775:2:564 -20776:0:2565 -20777:3:2013 -20778:0:2565 -20779:1:435 -20780:0:2565 -20781:3:2014 -20782:0:2565 -20783:3:2015 -20784:3:2019 -20785:3:2020 -20786:3:2028 -20787:3:2029 -20788:3:2033 -20789:3:2034 -20790:3:2042 -20791:3:2047 -20792:3:2051 -20793:3:2052 -20794:3:2059 -20795:3:2060 -20796:3:2071 -20797:3:2079 -20798:3:2080 -20799:3:2084 -20800:3:2089 -20801:3:2090 -20802:0:2565 -20803:3:2102 -20804:0:2565 -20805:3:2104 -20806:0:2565 -20807:3:2105 -20808:3:2109 -20809:3:2110 -20810:3:2118 -20811:3:2119 -20812:3:2123 -20813:3:2124 -20814:3:2132 -20815:3:2137 -20816:3:2141 -20817:3:2142 -20818:3:2149 -20819:3:2150 -20820:3:2161 -20821:3:2169 -20822:3:2170 -20823:3:2174 -20824:3:2179 -20825:3:2180 -20826:0:2565 -20827:3:2192 -20828:0:2565 -20829:3:2013 -20830:0:2565 -20831:2:565 -20832:2:569 -20833:2:570 -20834:2:578 -20835:2:579 -20836:2:583 -20837:2:584 -20838:2:592 -20839:2:597 -20840:2:601 -20841:2:602 -20842:2:609 -20843:2:610 -20844:2:621 -20845:2:622 -20846:2:623 -20847:2:634 -20848:2:639 -20849:2:640 -20850:0:2565 -20851:3:2014 -20852:0:2565 -20853:3:2015 -20854:3:2019 -20855:3:2020 -20856:3:2028 -20857:3:2029 -20858:3:2033 -20859:3:2034 -20860:3:2042 -20861:3:2047 -20862:3:2051 -20863:3:2052 -20864:3:2059 -20865:3:2060 -20866:3:2071 -20867:3:2079 -20868:3:2080 -20869:3:2084 -20870:3:2089 -20871:3:2090 -20872:0:2565 -20873:3:2102 -20874:0:2565 -20875:1:434 -20876:0:2565 -20877:2:744 -20878:0:2565 -20879:1:435 -20880:0:2565 -20881:3:2104 -20882:0:2565 -20883:3:2105 -20884:3:2109 -20885:3:2110 -20886:3:2118 -20887:3:2119 -20888:3:2123 -20889:3:2124 -20890:3:2132 -20891:3:2137 -20892:3:2141 -20893:3:2142 -20894:3:2149 -20895:3:2150 -20896:3:2161 -20897:3:2169 -20898:3:2170 -20899:3:2174 -20900:3:2179 -20901:3:2180 -20902:0:2565 -20903:3:2192 -20904:0:2565 -20905:3:2013 -20906:0:2565 -20907:3:2014 -20908:0:2565 -20909:3:2015 -20910:3:2019 -20911:3:2020 -20912:3:2028 -20913:3:2029 -20914:3:2033 -20915:3:2034 -20916:3:2042 -20917:3:2047 -20918:3:2051 -20919:3:2052 -20920:3:2059 -20921:3:2060 -20922:3:2071 -20923:3:2079 -20924:3:2080 -20925:3:2084 -20926:3:2089 -20927:3:2090 -20928:0:2565 -20929:3:2102 -20930:0:2565 -20931:1:434 -20932:0:2565 -20933:3:2104 -20934:0:2565 -20935:3:2105 -20936:3:2109 -20937:3:2110 -20938:3:2118 -20939:3:2119 -20940:3:2123 -20941:3:2124 -20942:3:2132 -20943:3:2137 -20944:3:2141 -20945:3:2142 -20946:3:2149 -20947:3:2150 -20948:3:2161 -20949:3:2169 -20950:3:2170 -20951:3:2174 -20952:3:2179 -20953:3:2180 -20954:0:2565 -20955:3:2192 -20956:0:2565 -20957:3:2013 -20958:0:2565 -20959:3:2014 -20960:0:2565 -20961:3:2015 -20962:3:2019 -20963:3:2020 -20964:3:2028 -20965:3:2029 -20966:3:2033 -20967:3:2034 -20968:3:2042 -20969:3:2047 -20970:3:2051 -20971:3:2052 -20972:3:2059 -20973:3:2060 -20974:3:2071 -20975:3:2079 -20976:3:2080 -20977:3:2084 -20978:3:2089 -20979:3:2090 -20980:0:2565 -20981:2:745 -20982:0:2565 -20983:3:2102 -20984:0:2565 -20985:2:750 -20986:0:2565 -20987:2:753 -20988:0:2565 -20989:1:435 -20990:0:2565 -20991:3:2104 -20992:0:2565 -20993:3:2105 -20994:3:2109 -20995:3:2110 -20996:3:2118 -20997:3:2119 -20998:3:2123 -20999:3:2124 -21000:3:2132 -21001:3:2137 -21002:3:2141 -21003:3:2142 -21004:3:2149 -21005:3:2150 -21006:3:2161 -21007:3:2169 -21008:3:2170 -21009:3:2174 -21010:3:2179 -21011:3:2180 -21012:0:2565 -21013:3:2192 -21014:0:2565 -21015:3:2013 -21016:0:2565 -21017:3:2014 -21018:0:2565 -21019:3:2015 -21020:3:2019 -21021:3:2020 -21022:3:2028 -21023:3:2029 -21024:3:2033 -21025:3:2034 -21026:3:2042 -21027:3:2047 -21028:3:2051 -21029:3:2052 -21030:3:2059 -21031:3:2060 -21032:3:2071 -21033:3:2079 -21034:3:2080 -21035:3:2084 -21036:3:2089 -21037:3:2090 -21038:0:2565 -21039:3:2102 -21040:0:2565 -21041:1:434 -21042:0:2565 -21043:3:2104 -21044:0:2565 -21045:3:2105 -21046:3:2109 -21047:3:2110 -21048:3:2118 -21049:3:2119 -21050:3:2123 -21051:3:2124 -21052:3:2132 -21053:3:2137 -21054:3:2141 -21055:3:2142 -21056:3:2149 -21057:3:2150 -21058:3:2161 -21059:3:2169 -21060:3:2170 -21061:3:2174 -21062:3:2179 -21063:3:2180 -21064:0:2565 -21065:3:2192 -21066:0:2565 -21067:3:2013 -21068:0:2565 -21069:3:2014 -21070:0:2565 -21071:3:2015 -21072:3:2019 -21073:3:2020 -21074:3:2028 -21075:3:2029 -21076:3:2033 -21077:3:2034 -21078:3:2042 -21079:3:2047 -21080:3:2051 -21081:3:2052 -21082:3:2059 -21083:3:2060 -21084:3:2071 -21085:3:2079 -21086:3:2080 -21087:3:2084 -21088:3:2089 -21089:3:2090 -21090:0:2565 -21091:2:758 -21092:0:2565 -21093:3:2102 -21094:0:2565 -21095:1:435 -21096:0:2565 -21097:3:2104 -21098:0:2565 -21099:3:2105 -21100:3:2109 -21101:3:2110 -21102:3:2118 -21103:3:2119 -21104:3:2123 -21105:3:2124 -21106:3:2132 -21107:3:2137 -21108:3:2141 -21109:3:2142 -21110:3:2149 -21111:3:2150 -21112:3:2161 -21113:3:2169 -21114:3:2170 -21115:3:2174 -21116:3:2179 -21117:3:2180 -21118:0:2565 -21119:3:2192 -21120:0:2565 -21121:3:2013 -21122:0:2565 -21123:3:2014 -21124:0:2565 -21125:3:2015 -21126:3:2019 -21127:3:2020 -21128:3:2028 -21129:3:2029 -21130:3:2033 -21131:3:2034 -21132:3:2042 -21133:3:2047 -21134:3:2051 -21135:3:2052 -21136:3:2059 -21137:3:2060 -21138:3:2071 -21139:3:2079 -21140:3:2080 -21141:3:2084 -21142:3:2089 -21143:3:2090 -21144:0:2565 -21145:3:2102 -21146:0:2565 -21147:1:434 -21148:0:2565 -21149:3:2104 -21150:0:2565 -21151:3:2105 -21152:3:2109 -21153:3:2110 -21154:3:2118 -21155:3:2119 -21156:3:2123 -21157:3:2124 -21158:3:2132 -21159:3:2137 -21160:3:2141 -21161:3:2142 -21162:3:2149 -21163:3:2150 -21164:3:2161 -21165:3:2169 -21166:3:2170 -21167:3:2174 -21168:3:2179 -21169:3:2180 -21170:0:2565 -21171:3:2192 -21172:0:2565 -21173:3:2013 -21174:0:2565 -21175:3:2014 -21176:0:2565 -21177:3:2015 -21178:3:2019 -21179:3:2020 -21180:3:2028 -21181:3:2029 -21182:3:2033 -21183:3:2034 -21184:3:2042 -21185:3:2047 -21186:3:2051 -21187:3:2052 -21188:3:2059 -21189:3:2060 -21190:3:2071 -21191:3:2079 -21192:3:2080 -21193:3:2084 -21194:3:2089 -21195:3:2090 -21196:0:2565 -21197:2:759 -21198:0:2565 -21199:3:2102 -21200:0:2565 -21201:1:435 -21202:0:2565 -21203:3:2104 -21204:0:2565 -21205:3:2105 -21206:3:2109 -21207:3:2110 -21208:3:2118 -21209:3:2119 -21210:3:2123 -21211:3:2124 -21212:3:2132 -21213:3:2137 -21214:3:2141 -21215:3:2142 -21216:3:2149 -21217:3:2150 -21218:3:2161 -21219:3:2169 -21220:3:2170 -21221:3:2174 -21222:3:2179 -21223:3:2180 -21224:0:2565 -21225:3:2192 -21226:0:2565 -21227:3:2013 -21228:0:2565 -21229:3:2014 -21230:0:2565 -21231:3:2015 -21232:3:2019 -21233:3:2020 -21234:3:2028 -21235:3:2029 -21236:3:2033 -21237:3:2034 -21238:3:2042 -21239:3:2047 -21240:3:2051 -21241:3:2052 -21242:3:2059 -21243:3:2060 -21244:3:2071 -21245:3:2079 -21246:3:2080 -21247:3:2084 -21248:3:2089 -21249:3:2090 -21250:0:2565 -21251:3:2102 -21252:0:2565 -21253:2:760 -21254:0:2565 -21255:2:761 -21256:0:2565 -21257:2:762 -21258:0:2565 -21259:3:2104 -21260:0:2565 -21261:3:2105 -21262:3:2109 -21263:3:2110 -21264:3:2118 -21265:3:2119 -21266:3:2123 -21267:3:2124 -21268:3:2132 -21269:3:2137 -21270:3:2141 -21271:3:2142 -21272:3:2149 -21273:3:2150 -21274:3:2161 -21275:3:2169 -21276:3:2170 -21277:3:2174 -21278:3:2179 -21279:3:2180 -21280:0:2565 -21281:3:2192 -21282:0:2565 -21283:1:434 -21284:0:2565 -21285:3:2013 -21286:0:2565 -21287:2:763 -21288:0:2565 -21289:1:435 -21290:0:2565 -21291:3:2014 -21292:0:2565 -21293:3:2015 -21294:3:2019 -21295:3:2020 -21296:3:2028 -21297:3:2029 -21298:3:2033 -21299:3:2034 -21300:3:2042 -21301:3:2047 -21302:3:2051 -21303:3:2052 -21304:3:2059 -21305:3:2060 -21306:3:2071 -21307:3:2079 -21308:3:2080 -21309:3:2084 -21310:3:2089 -21311:3:2090 -21312:0:2565 -21313:3:2102 -21314:0:2565 -21315:3:2104 -21316:0:2565 -21317:3:2105 -21318:3:2109 -21319:3:2110 -21320:3:2118 -21321:3:2119 -21322:3:2123 -21323:3:2124 -21324:3:2132 -21325:3:2137 -21326:3:2141 -21327:3:2142 -21328:3:2149 -21329:3:2150 -21330:3:2161 -21331:3:2169 -21332:3:2170 -21333:3:2174 -21334:3:2179 -21335:3:2180 -21336:0:2565 -21337:3:2192 -21338:0:2565 -21339:3:2013 -21340:0:2565 -21341:1:434 -21342:0:2565 -21343:3:2014 -21344:0:2565 -21345:3:2015 -21346:3:2019 -21347:3:2020 -21348:3:2028 -21349:3:2029 -21350:3:2033 -21351:3:2034 -21352:3:2042 -21353:3:2047 -21354:3:2051 -21355:3:2052 -21356:3:2059 -21357:3:2060 -21358:3:2071 -21359:3:2079 -21360:3:2080 -21361:3:2084 -21362:3:2089 -21363:3:2090 -21364:0:2565 -21365:3:2102 -21366:0:2565 -21367:3:2104 -21368:0:2565 -21369:3:2105 -21370:3:2109 -21371:3:2110 -21372:3:2118 -21373:3:2119 -21374:3:2123 -21375:3:2124 -21376:3:2132 -21377:3:2137 -21378:3:2141 -21379:3:2142 -21380:3:2149 -21381:3:2150 -21382:3:2161 -21383:3:2169 -21384:3:2170 -21385:3:2174 -21386:3:2179 -21387:3:2180 -21388:0:2565 -21389:3:2192 -21390:0:2565 -21391:2:765 -21392:0:2565 -21393:3:2013 -21394:0:2565 -21395:1:435 -21396:0:2565 -21397:3:2014 -21398:0:2565 -21399:3:2015 -21400:3:2019 -21401:3:2020 -21402:3:2028 -21403:3:2029 -21404:3:2033 -21405:3:2034 -21406:3:2042 -21407:3:2047 -21408:3:2051 -21409:3:2052 -21410:3:2059 -21411:3:2060 -21412:3:2071 -21413:3:2079 -21414:3:2080 -21415:3:2084 -21416:3:2089 -21417:3:2090 -21418:0:2565 -21419:3:2102 -21420:0:2565 -21421:3:2104 -21422:0:2565 -21423:3:2105 -21424:3:2109 -21425:3:2110 -21426:3:2118 -21427:3:2119 -21428:3:2123 -21429:3:2124 -21430:3:2132 -21431:3:2137 -21432:3:2141 -21433:3:2142 -21434:3:2149 -21435:3:2150 -21436:3:2161 -21437:3:2169 -21438:3:2170 -21439:3:2174 -21440:3:2179 -21441:3:2180 -21442:0:2565 -21443:3:2192 -21444:0:2565 -21445:3:2013 -21446:0:2565 -21447:2:766 -21448:2:770 -21449:2:771 -21450:2:779 -21451:2:788 -21452:2:789 -21453:2:793 -21454:2:798 -21455:2:802 -21456:2:803 -21457:2:810 -21458:2:811 -21459:2:822 -21460:2:823 -21461:2:826 -21462:2:827 -21463:2:835 -21464:2:840 -21465:2:841 -21466:0:2565 -21467:3:2014 -21468:0:2565 -21469:3:2015 -21470:3:2019 -21471:3:2020 -21472:3:2028 -21473:3:2029 -21474:3:2033 -21475:3:2034 -21476:3:2042 -21477:3:2047 -21478:3:2051 -21479:3:2052 -21480:3:2059 -21481:3:2060 -21482:3:2071 -21483:3:2079 -21484:3:2080 -21485:3:2084 -21486:3:2089 -21487:3:2090 -21488:0:2565 -21489:3:2102 -21490:0:2565 -21491:3:2104 -21492:0:2565 -21493:3:2105 -21494:3:2109 -21495:3:2110 -21496:3:2118 -21497:3:2119 -21498:3:2123 -21499:3:2124 -21500:3:2132 -21501:3:2137 -21502:3:2141 -21503:3:2142 -21504:3:2149 -21505:3:2150 -21506:3:2161 -21507:3:2169 -21508:3:2170 -21509:3:2174 -21510:3:2179 -21511:3:2180 -21512:0:2565 -21513:3:2192 -21514:0:2565 -21515:2:853 -21516:0:2565 -21517:3:2013 -21518:0:2565 -21519:2:857 -21520:0:2565 -21521:2:465 -21522:0:2565 -21523:3:2014 -21524:0:2565 -21525:3:2015 -21526:3:2019 -21527:3:2020 -21528:3:2028 -21529:3:2029 -21530:3:2033 -21531:3:2034 -21532:3:2042 -21533:3:2047 -21534:3:2051 -21535:3:2052 -21536:3:2059 -21537:3:2060 -21538:3:2071 -21539:3:2079 -21540:3:2080 -21541:3:2084 -21542:3:2089 -21543:3:2090 -21544:0:2565 -21545:3:2102 -21546:0:2565 -21547:3:2104 -21548:0:2565 -21549:3:2105 -21550:3:2109 -21551:3:2110 -21552:3:2118 -21553:3:2119 -21554:3:2123 -21555:3:2124 -21556:3:2132 -21557:3:2137 -21558:3:2141 -21559:3:2142 -21560:3:2149 -21561:3:2150 -21562:3:2161 -21563:3:2169 -21564:3:2170 -21565:3:2174 -21566:3:2179 -21567:3:2180 -21568:0:2565 -21569:3:2192 -21570:0:2565 -21571:2:466 -21572:0:2565 -21573:3:2013 -21574:0:2565 -21575:3:2014 -21576:0:2565 -21577:3:2015 -21578:3:2019 -21579:3:2020 -21580:3:2028 -21581:3:2029 -21582:3:2033 -21583:3:2034 -21584:3:2042 -21585:3:2047 -21586:3:2051 -21587:3:2052 -21588:3:2059 -21589:3:2060 -21590:3:2071 -21591:3:2079 -21592:3:2080 -21593:3:2084 -21594:3:2089 -21595:3:2090 -21596:0:2565 -21597:3:2102 -21598:0:2565 -21599:3:2104 -21600:0:2565 -21601:3:2105 -21602:3:2109 -21603:3:2110 -21604:3:2118 -21605:3:2119 -21606:3:2123 -21607:3:2124 -21608:3:2132 -21609:3:2137 -21610:3:2141 -21611:3:2142 -21612:3:2149 -21613:3:2150 -21614:3:2161 -21615:3:2169 -21616:3:2170 -21617:3:2174 -21618:3:2179 -21619:3:2180 -21620:0:2565 -21621:2:467 -21622:0:2565 -21623:3:2192 -21624:0:2565 -21625:3:2013 -21626:0:2565 -21627:3:2014 -21628:0:2565 -21629:3:2015 -21630:3:2019 -21631:3:2020 -21632:3:2028 -21633:3:2029 -21634:3:2033 -21635:3:2034 -21636:3:2042 -21637:3:2047 -21638:3:2051 -21639:3:2052 -21640:3:2059 -21641:3:2060 -21642:3:2071 -21643:3:2079 -21644:3:2080 -21645:3:2084 -21646:3:2089 -21647:3:2090 -21648:0:2565 -21649:3:2102 -21650:0:2565 -21651:3:2104 -21652:0:2565 -21653:1:436 -21654:0:2565 -21655:2:468 -21656:0:2565 -21657:3:2105 -21658:3:2109 -21659:3:2110 -21660:3:2118 -21661:3:2119 -21662:3:2123 -21663:3:2124 -21664:3:2132 -21665:3:2137 -21666:3:2141 -21667:3:2142 -21668:3:2149 -21669:3:2150 -21670:3:2161 -21671:3:2169 -21672:3:2170 -21673:3:2174 -21674:3:2179 -21675:3:2180 -21676:0:2565 -21677:3:2192 -21678:0:2565 -21679:3:2013 -21680:0:2565 -21681:3:2014 -21682:0:2565 -21683:3:2015 -21684:3:2019 -21685:3:2020 -21686:3:2028 -21687:3:2029 -21688:3:2033 -21689:3:2034 -21690:3:2042 -21691:3:2047 -21692:3:2051 -21693:3:2052 -21694:3:2059 -21695:3:2060 -21696:3:2071 -21697:3:2079 -21698:3:2080 -21699:3:2084 -21700:3:2089 -21701:3:2090 -21702:0:2565 -21703:3:2102 -21704:0:2565 -21705:3:2104 -21706:0:2565 -21707:2:467 -21708:0:2565 -21709:2:468 -21710:0:2565 -21711:3:2105 -21712:3:2109 -21713:3:2110 -21714:3:2118 -21715:3:2119 -21716:3:2123 -21717:3:2124 -21718:3:2132 -21719:3:2137 -21720:3:2141 -21721:3:2142 -21722:3:2149 -21723:3:2150 -21724:3:2161 -21725:3:2169 -21726:3:2170 -21727:3:2174 -21728:3:2179 -21729:3:2180 -21730:0:2565 -21731:3:2192 -21732:0:2565 -21733:3:2013 -21734:0:2565 -21735:3:2014 -21736:0:2565 -21737:3:2015 -21738:3:2019 -21739:3:2020 -21740:3:2028 -21741:3:2029 -21742:3:2033 -21743:3:2034 -21744:3:2042 -21745:3:2047 -21746:3:2051 -21747:3:2052 -21748:3:2059 -21749:3:2060 -21750:3:2071 -21751:3:2079 -21752:3:2080 -21753:3:2084 -21754:3:2089 -21755:3:2090 -21756:0:2565 -21757:3:2102 -21758:0:2565 -21759:2:467 -21760:0:2565 -21761:1:442 -21762:0:2565 -21763:2:468 -21764:0:2565 -21765:1:446 -21766:0:2565 -21767:1:9 -21768:0:2565 -21769:1:10 -21770:0:2565 -21771:1:11 -21772:0:2565 -21773:3:2104 -21774:0:2565 -21775:3:2105 -21776:3:2109 -21777:3:2110 -21778:3:2118 -21779:3:2119 -21780:3:2123 -21781:3:2124 -21782:3:2132 -21783:3:2137 -21784:3:2141 -21785:3:2142 -21786:3:2149 -21787:3:2150 -21788:3:2161 -21789:3:2169 -21790:3:2170 -21791:3:2174 -21792:3:2179 -21793:3:2180 -21794:0:2565 -21795:3:2192 -21796:0:2565 -21797:3:2013 -21798:0:2565 -21799:3:2014 -21800:0:2565 -21801:3:2015 -21802:3:2019 -21803:3:2020 -21804:3:2028 -21805:3:2029 -21806:3:2033 -21807:3:2034 -21808:3:2042 -21809:3:2047 -21810:3:2051 -21811:3:2052 -21812:3:2059 -21813:3:2060 -21814:3:2071 -21815:3:2079 -21816:3:2080 -21817:3:2084 -21818:3:2089 -21819:3:2090 -21820:0:2565 -21821:3:2102 -21822:0:2565 -21823:2:467 -21824:0:2565 -21825:2:468 -21826:0:2565 -21827:3:2104 -21828:0:2565 -21829:3:2105 -21830:3:2109 -21831:3:2110 -21832:3:2118 -21833:3:2119 -21834:3:2123 -21835:3:2124 -21836:3:2132 -21837:3:2137 -21838:3:2141 -21839:3:2142 -21840:3:2149 -21841:3:2150 -21842:3:2161 -21843:3:2169 -21844:3:2170 -21845:3:2174 -21846:3:2179 -21847:3:2180 -21848:0:2565 -21849:3:2192 -21850:0:2565 -21851:3:2013 -21852:0:2565 -21853:3:2014 -21854:0:2565 -21855:3:2015 -21856:3:2019 -21857:3:2020 -21858:3:2028 -21859:3:2029 -21860:3:2033 -21861:3:2034 -21862:3:2042 -21863:3:2047 -21864:3:2051 -21865:3:2052 -21866:3:2059 -21867:3:2060 -21868:3:2071 -21869:3:2079 -21870:3:2080 -21871:3:2084 -21872:3:2089 -21873:3:2090 -21874:0:2565 -21875:2:467 -21876:0:2565 -21877:1:12 -21878:1:16 -21879:1:17 -21880:1:25 -21881:1:26 -21882:1:27 -21883:1:39 -21884:1:44 -21885:1:48 -21886:1:49 -21887:1:56 -21888:1:57 -21889:1:68 -21890:1:69 -21891:1:70 -21892:1:81 -21893:1:86 -21894:1:87 -21895:0:2565 -21896:3:2102 -21897:0:2565 -21898:3:2104 -21899:0:2565 -21900:1:99 -21901:0:2565 -21902:3:2105 -21903:3:2109 -21904:3:2110 -21905:3:2118 -21906:3:2119 -21907:3:2123 -21908:3:2124 -21909:3:2132 -21910:3:2137 -21911:3:2141 -21912:3:2142 -21913:3:2149 -21914:3:2150 -21915:3:2161 -21916:3:2169 -21917:3:2170 -21918:3:2174 -21919:3:2179 -21920:3:2180 -21921:0:2565 -21922:1:100 -21923:0:2565 -21924:3:2192 -21925:0:2565 -21926:3:2013 -21927:0:2565 -21928:2:468 -21929:0:2565 -21930:1:101 -21931:0:2565 -21932:3:2014 -21933:0:2565 -21934:3:2015 -21935:3:2019 -21936:3:2020 -21937:3:2028 -21938:3:2029 -21939:3:2033 -21940:3:2034 -21941:3:2042 -21942:3:2047 -21943:3:2051 -21944:3:2052 -21945:3:2059 -21946:3:2060 -21947:3:2071 -21948:3:2079 -21949:3:2080 -21950:3:2084 -21951:3:2089 -21952:3:2090 -21953:0:2565 -21954:3:2102 -21955:0:2565 -21956:3:2104 -21957:0:2565 -21958:3:2105 -21959:3:2109 -21960:3:2110 -21961:3:2118 -21962:3:2119 -21963:3:2123 -21964:3:2124 -21965:3:2132 -21966:3:2137 -21967:3:2141 -21968:3:2142 -21969:3:2149 -21970:3:2150 -21971:3:2161 -21972:3:2169 -21973:3:2170 -21974:3:2174 -21975:3:2179 -21976:3:2180 -21977:0:2565 -21978:3:2192 -21979:0:2565 -21980:3:2013 -21981:0:2565 -21982:1:100 -21983:0:2565 -21984:3:2014 -21985:0:2565 -21986:3:2015 -21987:3:2019 -21988:3:2020 -21989:3:2028 -21990:3:2029 -21991:3:2033 -21992:3:2034 -21993:3:2042 -21994:3:2047 -21995:3:2051 -21996:3:2052 -21997:3:2059 -21998:3:2060 -21999:3:2071 -22000:3:2079 -22001:3:2080 -22002:3:2084 -22003:3:2089 -22004:3:2090 -22005:0:2565 -22006:3:2102 -22007:0:2565 -22008:3:2104 -22009:0:2565 -22010:3:2105 -22011:3:2109 -22012:3:2110 -22013:3:2118 -22014:3:2119 -22015:3:2123 -22016:3:2124 -22017:3:2132 -22018:3:2137 -22019:3:2141 -22020:3:2142 -22021:3:2149 -22022:3:2150 -22023:3:2161 -22024:3:2169 -22025:3:2170 -22026:3:2174 -22027:3:2179 -22028:3:2180 -22029:0:2565 -22030:3:2192 -22031:0:2565 -22032:2:469 -22033:0:2565 -22034:3:2013 -22035:0:2565 -22036:2:475 -22037:0:2565 -22038:2:476 -22039:0:2565 -22040:1:101 -22041:0:2565 -22042:3:2014 -22043:0:2565 -22044:3:2015 -22045:3:2019 -22046:3:2020 -22047:3:2028 -22048:3:2029 -22049:3:2033 -22050:3:2034 -22051:3:2042 -22052:3:2047 -22053:3:2051 -22054:3:2052 -22055:3:2059 -22056:3:2060 -22057:3:2071 -22058:3:2079 -22059:3:2080 -22060:3:2084 -22061:3:2089 -22062:3:2090 -22063:0:2565 -22064:3:2102 -22065:0:2565 -22066:3:2104 -22067:0:2565 -22068:3:2105 -22069:3:2109 -22070:3:2110 -22071:3:2118 -22072:3:2119 -22073:3:2123 -22074:3:2124 -22075:3:2132 -22076:3:2137 -22077:3:2141 -22078:3:2142 -22079:3:2149 -22080:3:2150 -22081:3:2161 -22082:3:2169 -22083:3:2170 -22084:3:2174 -22085:3:2179 -22086:3:2180 -22087:0:2565 -22088:3:2192 -22089:0:2565 -22090:3:2013 -22091:0:2565 -22092:1:100 -22093:0:2565 -22094:3:2014 -22095:0:2565 -22096:3:2015 -22097:3:2019 -22098:3:2020 -22099:3:2028 -22100:3:2029 -22101:3:2033 -22102:3:2034 -22103:3:2042 -22104:3:2047 -22105:3:2051 -22106:3:2052 -22107:3:2059 -22108:3:2060 -22109:3:2071 -22110:3:2079 -22111:3:2080 -22112:3:2084 -22113:3:2089 -22114:3:2090 -22115:0:2565 -22116:3:2102 -22117:0:2565 -22118:3:2104 -22119:0:2565 -22120:3:2105 -22121:3:2109 -22122:3:2110 -22123:3:2118 -22124:3:2119 -22125:3:2123 -22126:3:2124 -22127:3:2132 -22128:3:2137 -22129:3:2141 -22130:3:2142 -22131:3:2149 -22132:3:2150 -22133:3:2161 -22134:3:2169 -22135:3:2170 -22136:3:2174 -22137:3:2179 -22138:3:2180 -22139:0:2565 -22140:3:2192 -22141:0:2565 -22142:2:477 -22143:2:481 -22144:2:482 -22145:2:490 -22146:2:491 -22147:2:495 -22148:2:496 -22149:2:504 -22150:2:509 -22151:2:513 -22152:2:514 -22153:2:521 -22154:2:522 -22155:2:533 -22156:2:534 -22157:2:535 -22158:2:546 -22159:2:551 -22160:2:552 -22161:0:2565 -22162:3:2013 -22163:0:2565 -22164:1:101 -22165:0:2565 -22166:3:2014 -22167:0:2565 -22168:3:2015 -22169:3:2019 -22170:3:2020 -22171:3:2028 -22172:3:2029 -22173:3:2033 -22174:3:2034 -22175:3:2042 -22176:3:2047 -22177:3:2051 -22178:3:2052 -22179:3:2059 -22180:3:2060 -22181:3:2071 -22182:3:2079 -22183:3:2080 -22184:3:2084 -22185:3:2089 -22186:3:2090 -22187:0:2565 -22188:3:2102 -22189:0:2565 -22190:3:2104 -22191:0:2565 -22192:3:2105 -22193:3:2109 -22194:3:2110 -22195:3:2118 -22196:3:2119 -22197:3:2123 -22198:3:2124 -22199:3:2132 -22200:3:2137 -22201:3:2141 -22202:3:2142 -22203:3:2149 -22204:3:2150 -22205:3:2161 -22206:3:2169 -22207:3:2170 -22208:3:2174 -22209:3:2179 -22210:3:2180 -22211:0:2565 -22212:3:2192 -22213:0:2565 -22214:3:2013 -22215:0:2565 -22216:1:100 -22217:0:2565 -22218:3:2014 -22219:0:2565 -22220:3:2015 -22221:3:2019 -22222:3:2020 -22223:3:2028 -22224:3:2029 -22225:3:2033 -22226:3:2034 -22227:3:2042 -22228:3:2047 -22229:3:2051 -22230:3:2052 -22231:3:2059 -22232:3:2060 -22233:3:2071 -22234:3:2079 -22235:3:2080 -22236:3:2084 -22237:3:2089 -22238:3:2090 -22239:0:2565 -22240:3:2102 -22241:0:2565 -22242:3:2104 -22243:0:2565 -22244:3:2105 -22245:3:2109 -22246:3:2110 -22247:3:2118 -22248:3:2119 -22249:3:2123 -22250:3:2124 -22251:3:2132 -22252:3:2137 -22253:3:2141 -22254:3:2142 -22255:3:2149 -22256:3:2150 -22257:3:2161 -22258:3:2169 -22259:3:2170 -22260:3:2174 -22261:3:2179 -22262:3:2180 -22263:0:2565 -22264:3:2192 -22265:0:2565 -22266:2:564 -22267:0:2565 -22268:3:2013 -22269:0:2565 -22270:1:101 -22271:0:2565 -22272:3:2014 -22273:0:2565 -22274:3:2015 -22275:3:2019 -22276:3:2020 -22277:3:2028 -22278:3:2029 -22279:3:2033 -22280:3:2034 -22281:3:2042 -22282:3:2047 -22283:3:2051 -22284:3:2052 -22285:3:2059 -22286:3:2060 -22287:3:2071 -22288:3:2079 -22289:3:2080 -22290:3:2084 -22291:3:2089 -22292:3:2090 -22293:0:2565 -22294:3:2102 -22295:0:2565 -22296:3:2104 -22297:0:2565 -22298:3:2105 -22299:3:2109 -22300:3:2110 -22301:3:2118 -22302:3:2119 -22303:3:2123 -22304:3:2124 -22305:3:2132 -22306:3:2137 -22307:3:2141 -22308:3:2142 -22309:3:2149 -22310:3:2150 -22311:3:2161 -22312:3:2169 -22313:3:2170 -22314:3:2174 -22315:3:2179 -22316:3:2180 -22317:0:2565 -22318:3:2192 -22319:0:2565 -22320:3:2013 -22321:0:2565 -22322:2:565 -22323:2:569 -22324:2:570 -22325:2:578 -22326:2:579 -22327:2:583 -22328:2:584 -22329:2:592 -22330:2:597 -22331:2:601 -22332:2:602 -22333:2:609 -22334:2:610 -22335:2:621 -22336:2:622 -22337:2:623 -22338:2:634 -22339:2:639 -22340:2:640 -22341:0:2565 -22342:3:2014 -22343:0:2565 -22344:3:2015 -22345:3:2019 -22346:3:2020 -22347:3:2028 -22348:3:2029 -22349:3:2033 -22350:3:2034 -22351:3:2042 -22352:3:2047 -22353:3:2051 -22354:3:2052 -22355:3:2059 -22356:3:2060 -22357:3:2071 -22358:3:2079 -22359:3:2080 -22360:3:2084 -22361:3:2089 -22362:3:2090 -22363:0:2565 -22364:3:2102 -22365:0:2565 -22366:1:100 -22367:0:2565 -22368:2:652 -22369:0:2565 -22370:1:101 -22371:0:2565 -22372:3:2104 -22373:0:2565 -22374:3:2105 -22375:3:2109 -22376:3:2110 -22377:3:2118 -22378:3:2119 -22379:3:2123 -22380:3:2124 -22381:3:2132 -22382:3:2137 -22383:3:2141 -22384:3:2142 -22385:3:2149 -22386:3:2150 -22387:3:2161 -22388:3:2169 -22389:3:2170 -22390:3:2174 -22391:3:2179 -22392:3:2180 -22393:0:2565 -22394:3:2192 -22395:0:2565 -22396:3:2013 -22397:0:2565 -22398:3:2014 -22399:0:2565 -22400:3:2015 -22401:3:2019 -22402:3:2020 -22403:3:2028 -22404:3:2029 -22405:3:2033 -22406:3:2034 -22407:3:2042 -22408:3:2047 -22409:3:2051 -22410:3:2052 -22411:3:2059 -22412:3:2060 -22413:3:2071 -22414:3:2079 -22415:3:2080 -22416:3:2084 -22417:3:2089 -22418:3:2090 -22419:0:2565 -22420:3:2102 -22421:0:2565 -22422:1:100 -22423:0:2565 -22424:3:2104 -22425:0:2565 -22426:3:2105 -22427:3:2109 -22428:3:2110 -22429:3:2118 -22430:3:2119 -22431:3:2123 -22432:3:2124 -22433:3:2132 -22434:3:2137 -22435:3:2141 -22436:3:2142 -22437:3:2149 -22438:3:2150 -22439:3:2161 -22440:3:2169 -22441:3:2170 -22442:3:2174 -22443:3:2179 -22444:3:2180 -22445:0:2565 -22446:3:2192 -22447:0:2565 -22448:3:2013 -22449:0:2565 -22450:3:2014 -22451:0:2565 -22452:3:2015 -22453:3:2019 -22454:3:2020 -22455:3:2028 -22456:3:2029 -22457:3:2033 -22458:3:2034 -22459:3:2042 -22460:3:2047 -22461:3:2051 -22462:3:2052 -22463:3:2059 -22464:3:2060 -22465:3:2071 -22466:3:2079 -22467:3:2080 -22468:3:2084 -22469:3:2089 -22470:3:2090 -22471:0:2565 -22472:2:653 -22473:0:2565 -22474:3:2102 -22475:0:2565 -22476:1:101 -22477:0:2565 -22478:3:2104 -22479:0:2565 -22480:3:2105 -22481:3:2109 -22482:3:2110 -22483:3:2118 -22484:3:2119 -22485:3:2123 -22486:3:2124 -22487:3:2132 -22488:3:2137 -22489:3:2141 -22490:3:2142 -22491:3:2149 -22492:3:2150 -22493:3:2161 -22494:3:2169 -22495:3:2170 -22496:3:2174 -22497:3:2179 -22498:3:2180 -22499:0:2565 -22500:3:2192 -22501:0:2565 -22502:3:2013 -22503:0:2565 -22504:3:2014 -22505:0:2565 -22506:3:2015 -22507:3:2019 -22508:3:2020 -22509:3:2028 -22510:3:2029 -22511:3:2033 -22512:3:2034 -22513:3:2042 -22514:3:2047 -22515:3:2051 -22516:3:2052 -22517:3:2059 -22518:3:2060 -22519:3:2071 -22520:3:2079 -22521:3:2080 -22522:3:2084 -22523:3:2089 -22524:3:2090 -22525:0:2565 -22526:3:2102 -22527:0:2565 -22528:1:100 -22529:0:2565 -22530:3:2104 -22531:0:2565 -22532:3:2105 -22533:3:2109 -22534:3:2110 -22535:3:2118 -22536:3:2119 -22537:3:2123 -22538:3:2124 -22539:3:2132 -22540:3:2137 -22541:3:2141 -22542:3:2142 -22543:3:2149 -22544:3:2150 -22545:3:2161 -22546:3:2169 -22547:3:2170 -22548:3:2174 -22549:3:2179 -22550:3:2180 -22551:0:2565 -22552:3:2192 -22553:0:2565 -22554:3:2013 -22555:0:2565 -22556:3:2014 -22557:0:2565 -22558:3:2015 -22559:3:2019 -22560:3:2020 -22561:3:2028 -22562:3:2029 -22563:3:2033 -22564:3:2034 -22565:3:2042 -22566:3:2047 -22567:3:2051 -22568:3:2052 -22569:3:2059 -22570:3:2060 -22571:3:2071 -22572:3:2079 -22573:3:2080 -22574:3:2084 -22575:3:2089 -22576:3:2090 -22577:0:2565 -22578:2:654 -22579:2:658 -22580:2:659 -22581:2:667 -22582:2:668 -22583:2:672 -22584:2:673 -22585:2:681 -22586:2:686 -22587:2:690 -22588:2:691 -22589:2:698 -22590:2:699 -22591:2:710 -22592:2:711 -22593:2:712 -22594:2:723 -22595:2:728 -22596:2:729 -22597:0:2565 -22598:3:2102 -22599:0:2565 -22600:1:101 -22601:0:2565 -22602:3:2104 -22603:0:2565 -22604:3:2105 -22605:3:2109 -22606:3:2110 -22607:3:2118 -22608:3:2119 -22609:3:2123 -22610:3:2124 -22611:3:2132 -22612:3:2137 -22613:3:2141 -22614:3:2142 -22615:3:2149 -22616:3:2150 -22617:3:2161 -22618:3:2169 -22619:3:2170 -22620:3:2174 -22621:3:2179 -22622:3:2180 -22623:0:2565 -22624:3:2192 -22625:0:2565 -22626:3:2013 -22627:0:2565 -22628:3:2014 -22629:0:2565 -22630:3:2015 -22631:3:2019 -22632:3:2020 -22633:3:2028 -22634:3:2029 -22635:3:2033 -22636:3:2034 -22637:3:2042 -22638:3:2047 -22639:3:2051 -22640:3:2052 -22641:3:2059 -22642:3:2060 -22643:3:2071 -22644:3:2079 -22645:3:2080 -22646:3:2084 -22647:3:2089 -22648:3:2090 -22649:0:2565 -22650:3:2102 -22651:0:2565 -22652:2:741 -22653:0:2565 -22654:2:750 -22655:0:2565 -22656:3:2104 -22657:0:2565 -22658:3:2105 -22659:3:2109 -22660:3:2110 -22661:3:2118 -22662:3:2119 -22663:3:2123 -22664:3:2124 -22665:3:2132 -22666:3:2137 -22667:3:2141 -22668:3:2142 -22669:3:2149 -22670:3:2150 -22671:3:2161 -22672:3:2169 -22673:3:2170 -22674:3:2174 -22675:3:2179 -22676:3:2180 -22677:0:2565 -22678:3:2192 -22679:0:2565 -22680:3:2013 -22681:0:2565 -22682:1:100 -22683:0:2565 -22684:2:753 -22685:0:2565 -22686:1:101 -22687:0:2565 -22688:2:758 -22689:0:2565 -22690:2:759 -22691:0:2565 -22692:2:760 -22693:0:2565 -22694:2:761 -22695:0:2565 -22696:2:762 -22697:0:2565 -22698:2:763 -22699:0:2565 -22700:2:765 -22701:0:2565 -22702:2:766 -22703:2:770 -22704:2:771 -22705:2:779 -22706:2:780 -22707:2:781 -22708:2:793 -22709:2:798 -22710:2:802 -22711:2:803 -22712:2:810 -22713:2:811 -22714:2:822 -22715:2:823 -22716:2:824 -22717:2:835 -22718:2:840 -22719:2:841 -22720:0:2565 -22721:3:2014 -22722:0:2565 -22723:3:2015 -22724:3:2019 -22725:3:2020 -22726:3:2028 -22727:3:2029 -22728:3:2033 -22729:3:2034 -22730:3:2042 -22731:3:2047 -22732:3:2051 -22733:3:2052 -22734:3:2059 -22735:3:2060 -22736:3:2071 -22737:3:2079 -22738:3:2080 -22739:3:2084 -22740:3:2089 -22741:3:2090 -22742:0:2565 -22743:3:2102 -22744:0:2565 -22745:3:2104 -22746:0:2565 -22747:3:2105 -22748:3:2109 -22749:3:2110 -22750:3:2118 -22751:3:2119 -22752:3:2123 -22753:3:2124 -22754:3:2132 -22755:3:2137 -22756:3:2141 -22757:3:2142 -22758:3:2149 -22759:3:2150 -22760:3:2161 -22761:3:2169 -22762:3:2170 -22763:3:2174 -22764:3:2179 -22765:3:2180 -22766:0:2565 -22767:3:2192 -22768:0:2565 -22769:3:2013 -22770:0:2565 -22771:2:853 -22772:0:2565 -22773:2:857 -22774:0:2565 -22775:3:2014 -22776:0:2565 -22777:3:2015 -22778:3:2019 -22779:3:2020 -22780:3:2028 -22781:3:2029 -22782:3:2033 -22783:3:2034 -22784:3:2042 -22785:3:2047 -22786:3:2051 -22787:3:2052 -22788:3:2059 -22789:3:2060 -22790:3:2071 -22791:3:2079 -22792:3:2080 -22793:3:2084 -22794:3:2089 -22795:3:2090 -22796:0:2565 -22797:3:2102 -22798:0:2565 -22799:1:100 -22800:0:2565 -22801:2:465 -22802:0:2565 -22803:1:101 -22804:0:2565 -22805:3:2104 -22806:0:2565 -22807:3:2105 -22808:3:2109 -22809:3:2110 -22810:3:2118 -22811:3:2119 -22812:3:2123 -22813:3:2124 -22814:3:2132 -22815:3:2137 -22816:3:2141 -22817:3:2142 -22818:3:2149 -22819:3:2150 -22820:3:2161 -22821:3:2169 -22822:3:2170 -22823:3:2174 -22824:3:2179 -22825:3:2180 -22826:0:2565 -22827:3:2192 -22828:0:2565 -22829:3:2013 -22830:0:2565 -22831:3:2014 -22832:0:2565 -22833:3:2015 -22834:3:2019 -22835:3:2020 -22836:3:2028 -22837:3:2029 -22838:3:2033 -22839:3:2034 -22840:3:2042 -22841:3:2047 -22842:3:2051 -22843:3:2052 -22844:3:2059 -22845:3:2060 -22846:3:2071 -22847:3:2079 -22848:3:2080 -22849:3:2084 -22850:3:2089 -22851:3:2090 -22852:0:2565 -22853:3:2102 -22854:0:2565 -22855:1:100 -22856:0:2565 -22857:3:2104 -22858:0:2565 -22859:3:2105 -22860:3:2109 -22861:3:2110 -22862:3:2118 -22863:3:2119 -22864:3:2123 -22865:3:2124 -22866:3:2132 -22867:3:2137 -22868:3:2141 -22869:3:2142 -22870:3:2149 -22871:3:2150 -22872:3:2161 -22873:3:2169 -22874:3:2170 -22875:3:2174 -22876:3:2179 -22877:3:2180 -22878:0:2565 -22879:3:2192 -22880:0:2565 -22881:3:2013 -22882:0:2565 -22883:3:2014 -22884:0:2565 -22885:3:2015 -22886:3:2019 -22887:3:2020 -22888:3:2028 -22889:3:2029 -22890:3:2033 -22891:3:2034 -22892:3:2042 -22893:3:2047 -22894:3:2051 -22895:3:2052 -22896:3:2059 -22897:3:2060 -22898:3:2071 -22899:3:2079 -22900:3:2080 -22901:3:2084 -22902:3:2089 -22903:3:2090 -22904:0:2565 -22905:2:466 -22906:0:2565 -22907:3:2102 -22908:0:2565 -22909:1:101 -22910:0:2565 -22911:2:467 -22912:0:2565 -22913:2:468 -22914:0:2565 -22915:1:102 -22916:0:2565 -22917:2:467 -22918:0:2565 -22919:3:2104 -22920:0:2565 -22921:3:2105 -22922:3:2109 -22923:3:2110 -22924:3:2118 -22925:3:2119 -22926:3:2123 -22927:3:2124 -22928:3:2132 -22929:3:2137 -22930:3:2141 -22931:3:2142 -22932:3:2149 -22933:3:2150 -22934:3:2161 -22935:3:2169 -22936:3:2170 -22937:3:2174 -22938:3:2179 -22939:3:2180 -22940:0:2565 -22941:3:2192 -22942:0:2565 -22943:3:2013 -22944:0:2565 -22945:3:2014 -22946:0:2565 -22947:3:2015 -22948:3:2019 -22949:3:2020 -22950:3:2028 -22951:3:2029 -22952:3:2033 -22953:3:2034 -22954:3:2042 -22955:3:2047 -22956:3:2051 -22957:3:2052 -22958:3:2059 -22959:3:2060 -22960:3:2071 -22961:3:2079 -22962:3:2080 -22963:3:2084 -22964:3:2089 -22965:3:2090 -22966:0:2565 -22967:3:2102 -22968:0:2565 -22969:1:108 -22970:0:2565 -22971:3:2104 -22972:0:2565 -22973:3:2105 -22974:3:2109 -22975:3:2110 -22976:3:2118 -22977:3:2119 -22978:3:2123 -22979:3:2124 -22980:3:2132 -22981:3:2137 -22982:3:2141 -22983:3:2142 -22984:3:2149 -22985:3:2150 -22986:3:2161 -22987:3:2169 -22988:3:2170 -22989:3:2174 -22990:3:2179 -22991:3:2180 -22992:0:2565 -22993:3:2192 -22994:0:2565 -22995:3:2013 -22996:0:2565 -22997:3:2014 -22998:0:2565 -22999:3:2015 -23000:3:2019 -23001:3:2020 -23002:3:2028 -23003:3:2029 -23004:3:2033 -23005:3:2034 -23006:3:2042 -23007:3:2047 -23008:3:2051 -23009:3:2052 -23010:3:2059 -23011:3:2060 -23012:3:2071 -23013:3:2079 -23014:3:2080 -23015:3:2084 -23016:3:2089 -23017:3:2090 -23018:0:2565 -23019:1:109 -23020:1:113 -23021:1:114 -23022:1:122 -23023:1:123 -23024:1:124 -23025:1:136 -23026:1:141 -23027:1:145 -23028:1:146 -23029:1:153 -23030:1:154 -23031:1:165 -23032:1:166 -23033:1:167 -23034:1:178 -23035:1:183 -23036:1:184 -23037:0:2565 -23038:1:196 -23039:0:2565 -23040:3:2102 -23041:0:2565 -23042:1:197 -23043:0:2565 -23044:2:468 -23045:0:2565 -23046:1:198 -23047:0:2565 -23048:2:469 -23049:0:2565 -23050:2:475 -23051:0:2565 -23052:2:476 -23053:0:2565 -23054:2:477 -23055:2:481 -23056:2:482 -23057:2:490 -23058:2:491 -23059:2:495 -23060:2:496 -23061:2:504 -23062:2:509 -23063:2:513 -23064:2:514 -23065:2:521 -23066:2:522 -23067:2:533 -23068:2:534 -23069:2:535 -23070:2:546 -23071:2:551 -23072:2:552 -23073:0:2565 -23074:2:564 -23075:0:2565 -23076:2:565 -23077:2:569 -23078:2:570 -23079:2:578 -23080:2:579 -23081:2:583 -23082:2:584 -23083:2:592 -23084:2:597 -23085:2:601 -23086:2:602 -23087:2:609 -23088:2:610 -23089:2:621 -23090:2:622 -23091:2:623 -23092:2:634 -23093:2:639 -23094:2:640 -23095:0:2565 -23096:3:2104 -23097:0:2565 -23098:3:2105 -23099:3:2109 -23100:3:2110 -23101:3:2118 -23102:3:2119 -23103:3:2123 -23104:3:2124 -23105:3:2132 -23106:3:2137 -23107:3:2141 -23108:3:2142 -23109:3:2149 -23110:3:2150 -23111:3:2161 -23112:3:2169 -23113:3:2170 -23114:3:2174 -23115:3:2179 -23116:3:2180 -23117:0:2565 -23118:3:2192 -23119:0:2565 -23120:3:2013 -23121:0:2565 -23122:3:2014 -23123:0:2565 -23124:3:2015 -23125:3:2019 -23126:3:2020 -23127:3:2028 -23128:3:2029 -23129:3:2033 -23130:3:2034 -23131:3:2042 -23132:3:2047 -23133:3:2051 -23134:3:2052 -23135:3:2059 -23136:3:2060 -23137:3:2071 -23138:3:2079 -23139:3:2080 -23140:3:2084 -23141:3:2089 -23142:3:2090 -23143:0:2565 -23144:3:2102 -23145:0:2565 -23146:1:197 -23147:0:2565 -23148:2:652 -23149:0:2565 -23150:1:198 -23151:0:2565 -23152:2:653 -23153:0:2565 -23154:2:654 -23155:2:658 -23156:2:659 -23157:2:667 -23158:2:668 -23159:2:672 -23160:2:673 -23161:2:681 -23162:2:686 -23163:2:690 -23164:2:691 -23165:2:698 -23166:2:699 -23167:2:710 -23168:2:711 -23169:2:712 -23170:2:723 -23171:2:728 -23172:2:729 -23173:0:2565 -23174:2:741 -23175:0:2565 -23176:2:750 -23177:0:2565 -23178:2:753 -23179:0:2565 -23180:2:758 -23181:0:2565 -23182:2:759 -23183:0:2565 -23184:2:760 -23185:0:2565 -23186:2:761 -23187:0:2565 -23188:2:762 -23189:0:2565 -23190:2:763 -23191:0:2565 -23192:2:765 -23193:0:2565 -23194:2:766 -23195:2:770 -23196:2:771 -23197:2:779 -23198:2:780 -23199:2:781 -23200:2:793 -23201:2:798 -23202:2:802 -23203:2:803 -23204:2:810 -23205:2:811 -23206:2:822 -23207:2:823 -23208:2:824 -23209:2:835 -23210:2:840 -23211:2:841 -23212:0:2565 -23213:3:2104 -23214:0:2565 -23215:3:2105 -23216:3:2109 -23217:3:2110 -23218:3:2118 -23219:3:2119 -23220:3:2123 -23221:3:2124 -23222:3:2132 -23223:3:2137 -23224:3:2141 -23225:3:2142 -23226:3:2149 -23227:3:2150 -23228:3:2161 -23229:3:2169 -23230:3:2170 -23231:3:2174 -23232:3:2179 -23233:3:2180 -23234:0:2565 -23235:3:2192 -23236:0:2565 -23237:3:2013 -23238:0:2565 -23239:3:2014 -23240:0:2565 -23241:3:2015 -23242:3:2019 -23243:3:2020 -23244:3:2028 -23245:3:2029 -23246:3:2033 -23247:3:2034 -23248:3:2042 -23249:3:2047 -23250:3:2051 -23251:3:2052 -23252:3:2059 -23253:3:2060 -23254:3:2071 -23255:3:2079 -23256:3:2080 -23257:3:2084 -23258:3:2089 -23259:3:2090 -23260:0:2565 -23261:3:2102 -23262:0:2565 -23263:2:853 -23264:0:2565 -23265:2:857 -23266:0:2565 -23267:1:197 -23268:0:2565 -23269:2:465 -23270:0:2565 -23271:1:198 -23272:0:2565 -23273:3:2104 -23274:0:2565 -23275:3:2105 -23276:3:2109 -23277:3:2110 -23278:3:2118 -23279:3:2119 -23280:3:2123 -23281:3:2124 -23282:3:2132 -23283:3:2137 -23284:3:2141 -23285:3:2142 -23286:3:2149 -23287:3:2150 -23288:3:2161 -23289:3:2169 -23290:3:2170 -23291:3:2174 -23292:3:2179 -23293:3:2180 -23294:0:2565 -23295:3:2192 -23296:0:2565 -23297:3:2013 -23298:0:2565 -23299:3:2014 -23300:0:2565 -23301:3:2015 -23302:3:2019 -23303:3:2020 -23304:3:2028 -23305:3:2029 -23306:3:2033 -23307:3:2034 -23308:3:2042 -23309:3:2047 -23310:3:2051 -23311:3:2052 -23312:3:2059 -23313:3:2060 -23314:3:2071 -23315:3:2079 -23316:3:2080 -23317:3:2084 -23318:3:2089 -23319:3:2090 -23320:0:2565 -23321:3:2102 -23322:0:2565 -23323:1:197 -23324:0:2565 -23325:3:2104 -23326:0:2565 -23327:3:2105 -23328:3:2109 -23329:3:2110 -23330:3:2118 -23331:3:2119 -23332:3:2123 -23333:3:2124 -23334:3:2132 -23335:3:2137 -23336:3:2141 -23337:3:2142 -23338:3:2149 -23339:3:2150 -23340:3:2161 -23341:3:2169 -23342:3:2170 -23343:3:2174 -23344:3:2179 -23345:3:2180 -23346:0:2565 -23347:3:2192 -23348:0:2565 -23349:3:2013 -23350:0:2565 -23351:3:2014 -23352:0:2565 -23353:3:2015 -23354:3:2019 -23355:3:2020 -23356:3:2028 -23357:3:2029 -23358:3:2033 -23359:3:2034 -23360:3:2042 -23361:3:2047 -23362:3:2051 -23363:3:2052 -23364:3:2059 -23365:3:2060 -23366:3:2071 -23367:3:2079 -23368:3:2080 -23369:3:2084 -23370:3:2089 -23371:3:2090 -23372:0:2565 -23373:2:466 -23374:0:2565 -23375:3:2102 -23376:0:2565 -23377:1:198 -23378:0:2565 -23379:3:2104 -23380:0:2565 -23381:3:2105 -23382:3:2109 -23383:3:2110 -23384:3:2118 -23385:3:2119 -23386:3:2123 -23387:3:2124 -23388:3:2132 -23389:3:2137 -23390:3:2141 -23391:3:2142 -23392:3:2149 -23393:3:2150 -23394:3:2161 -23395:3:2169 -23396:3:2170 -23397:3:2174 -23398:3:2179 -23399:3:2180 -23400:0:2565 -23401:3:2192 -23402:0:2565 -23403:3:2013 -23404:0:2565 -23405:3:2014 -23406:0:2565 -23407:3:2015 -23408:3:2019 -23409:3:2020 -23410:3:2028 -23411:3:2029 -23412:3:2033 -23413:3:2034 -23414:3:2042 -23415:3:2047 -23416:3:2051 -23417:3:2052 -23418:3:2059 -23419:3:2060 -23420:3:2071 -23421:3:2079 -23422:3:2080 -23423:3:2084 -23424:3:2089 -23425:3:2090 -23426:0:2565 -23427:3:2102 -23428:0:2565 -23429:1:199 -23430:0:2565 -23431:3:2104 -23432:0:2565 -23433:3:2105 -23434:3:2109 -23435:3:2110 -23436:3:2118 -23437:3:2119 -23438:3:2123 -23439:3:2124 -23440:3:2132 -23441:3:2137 -23442:3:2141 -23443:3:2142 -23444:3:2149 -23445:3:2150 -23446:3:2161 -23447:3:2169 -23448:3:2170 -23449:3:2174 -23450:3:2179 -23451:3:2180 -23452:0:2565 -23453:3:2192 -23454:0:2565 -23455:3:2013 -23456:0:2565 -23457:3:2014 -23458:0:2565 -23459:3:2015 -23460:3:2019 -23461:3:2020 -23462:3:2028 -23463:3:2029 -23464:3:2033 -23465:3:2034 -23466:3:2042 -23467:3:2047 -23468:3:2051 -23469:3:2052 -23470:3:2059 -23471:3:2060 -23472:3:2071 -23473:3:2079 -23474:3:2080 -23475:3:2084 -23476:3:2089 -23477:3:2090 -23478:0:2565 -23479:2:467 -23480:0:2565 -23481:3:2102 -23482:0:2565 -23483:2:468 -23484:0:2565 -23485:1:205 -23486:0:2565 -23487:3:2104 -23488:0:2565 -23489:3:2105 -23490:3:2109 -23491:3:2110 -23492:3:2118 -23493:3:2119 -23494:3:2123 -23495:3:2124 -23496:3:2132 -23497:3:2137 -23498:3:2141 -23499:3:2142 -23500:3:2149 -23501:3:2150 -23502:3:2161 -23503:3:2169 -23504:3:2170 -23505:3:2174 -23506:3:2179 -23507:3:2180 -23508:0:2565 -23509:3:2192 -23510:0:2565 -23511:3:2013 -23512:0:2565 -23513:3:2014 -23514:0:2565 -23515:3:2015 -23516:3:2019 -23517:3:2020 -23518:3:2028 -23519:3:2029 -23520:3:2033 -23521:3:2034 -23522:3:2042 -23523:3:2047 -23524:3:2051 -23525:3:2052 -23526:3:2059 -23527:3:2060 -23528:3:2071 -23529:3:2079 -23530:3:2080 -23531:3:2084 -23532:3:2089 -23533:3:2090 -23534:0:2565 -23535:3:2102 -23536:0:2565 -23537:2:467 -23538:0:2565 -23539:2:468 -23540:0:2565 -23541:3:2104 -23542:0:2565 -23543:3:2105 -23544:3:2109 -23545:3:2110 -23546:3:2118 -23547:3:2119 -23548:3:2123 -23549:3:2124 -23550:3:2132 -23551:3:2137 -23552:3:2141 -23553:3:2142 -23554:3:2149 -23555:3:2150 -23556:3:2161 -23557:3:2169 -23558:3:2170 -23559:3:2174 -23560:3:2179 -23561:3:2180 -23562:0:2565 -23563:3:2192 -23564:0:2565 -23565:3:2013 -23566:0:2565 -23567:3:2014 -23568:0:2565 -23569:1:206 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/DEFINES b/formal-model/urcu-nosched-model/result-signal-over-writer/DEFINES deleted file mode 100644 index ec600f0..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/DEFINES +++ /dev/null @@ -1,16 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -#endif - -#define REMOTE_BARRIERS diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/Makefile b/formal-model/urcu-nosched-model/result-signal-over-writer/Makefile deleted file mode 100644 index 8af320d..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/Makefile +++ /dev/null @@ -1,172 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - #nested useless with signal test. - #make urcu_free_nested | tee urcu_free_nested.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/asserts.log b/formal-model/urcu-nosched-model/result-signal-over-writer/asserts.log deleted file mode 100644 index c102ffb..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/asserts.log +++ /dev/null @@ -1,334 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -cat DEFINES > .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w20 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim - (none specified) - assertion violations + - cycle checks - (disabled by -DSAFETY) - invalid end states + - -State-vector 40 byte, depth reached 7872, errors: 0 - 20128 states, stored - 191477 states, matched - 211605 transitions (= stored+matched) - 712166 atomic steps -hash conflicts: 942 (resolved) - -Stats on memory usage (in Megabytes): - 1.305 equivalent memory usage for states (stored*(State-vector + overhead)) - 1.467 actual memory usage for states (unsuccessful compression: 112.36%) - state-vector as stored = 48 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 467.229 total actual memory usage - -unreached in proctype urcu_reader_sig - line 401, ".input.spin", state 330, "(1)" - line 612, ".input.spin", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 397, ".input.spin", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 406, ".input.spin", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, ".input.spin", state 59, "(1)" - line 416, ".input.spin", state 89, "(1)" - line 397, ".input.spin", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 407, ".input.spin", state 160, "(1)" - line 650, ".input.spin", state 213, "(1)" - line 173, ".input.spin", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 177, ".input.spin", state 233, "(1)" - line 158, ".input.spin", state 254, "(1)" - line 162, ".input.spin", state 262, "(1)" - line 166, ".input.spin", state 274, "(1)" - line 173, ".input.spin", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, ".input.spin", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 752, "(1)" - line 162, ".input.spin", state 760, "(1)" - line 162, ".input.spin", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, ".input.spin", state 761, "else" - line 160, ".input.spin", state 766, "((j<1))" - line 160, ".input.spin", state 766, "((j>=1))" - line 166, ".input.spin", state 772, "(1)" - line 166, ".input.spin", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, ".input.spin", state 773, "else" - line 168, ".input.spin", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, ".input.spin", state 776, "else" - line 173, ".input.spin", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, ".input.spin", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 166, ".input.spin", state 835, "(1)" - line 166, ".input.spin", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 173, ".input.spin", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, ".input.spin", state 852, "(1)" - line 177, ".input.spin", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, ".input.spin", state 861, "(1)" - line 177, ".input.spin", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, ".input.spin", state 862, "else" - line 175, ".input.spin", state 867, "((j<1))" - line 175, ".input.spin", state 867, "((j>=1))" - line 181, ".input.spin", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 882, "(1)" - line 162, ".input.spin", state 890, "(1)" - line 162, ".input.spin", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, ".input.spin", state 891, "else" - line 160, ".input.spin", state 896, "((j<1))" - line 160, ".input.spin", state 896, "((j>=1))" - line 166, ".input.spin", state 902, "(1)" - line 166, ".input.spin", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, ".input.spin", state 903, "else" - line 168, ".input.spin", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, ".input.spin", state 906, "else" - line 200, ".input.spin", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 200, ".input.spin", state 908, "else" - line 219, ".input.spin", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 219, ".input.spin", state 909, "else" - line 354, ".input.spin", state 915, "((sighand_exec==1))" - line 354, ".input.spin", state 915, "else" - line 360, ".input.spin", state 918, "sighand_exec = 1" - line 397, ".input.spin", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 397, ".input.spin", state 933, "(1)" - line 397, ".input.spin", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 397, ".input.spin", state 934, "else" - line 397, ".input.spin", state 937, "(1)" - line 401, ".input.spin", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 401, ".input.spin", state 947, "(1)" - line 401, ".input.spin", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 401, ".input.spin", state 948, "else" - line 401, ".input.spin", state 951, "(1)" - line 401, ".input.spin", state 952, "(1)" - line 401, ".input.spin", state 952, "(1)" - line 399, ".input.spin", state 957, "((i<1))" - line 399, ".input.spin", state 957, "((i>=1))" - line 406, ".input.spin", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, ".input.spin", state 976, "(1)" - line 407, ".input.spin", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 407, ".input.spin", state 977, "else" - line 407, ".input.spin", state 980, "(1)" - line 407, ".input.spin", state 981, "(1)" - line 407, ".input.spin", state 981, "(1)" - line 411, ".input.spin", state 989, "(1)" - line 411, ".input.spin", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 411, ".input.spin", state 990, "else" - line 411, ".input.spin", state 993, "(1)" - line 411, ".input.spin", state 994, "(1)" - line 411, ".input.spin", state 994, "(1)" - line 409, ".input.spin", state 999, "((i<1))" - line 409, ".input.spin", state 999, "((i>=1))" - line 416, ".input.spin", state 1006, "(1)" - line 416, ".input.spin", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 416, ".input.spin", state 1007, "else" - line 416, ".input.spin", state 1010, "(1)" - line 416, ".input.spin", state 1011, "(1)" - line 416, ".input.spin", state 1011, "(1)" - line 418, ".input.spin", state 1014, "(1)" - line 418, ".input.spin", state 1014, "(1)" - line 360, ".input.spin", state 1023, "sighand_exec = 1" - line 401, ".input.spin", state 1054, "(1)" - line 406, ".input.spin", state 1070, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, ".input.spin", state 1113, "(1)" - line 401, ".input.spin", state 1151, "(1)" - line 406, ".input.spin", state 1167, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, ".input.spin", state 1210, "(1)" - line 397, ".input.spin", state 1236, "(1)" - line 401, ".input.spin", state 1250, "(1)" - line 406, ".input.spin", state 1266, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, ".input.spin", state 1309, "(1)" - line 401, ".input.spin", state 1350, "(1)" - line 406, ".input.spin", state 1366, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, ".input.spin", state 1409, "(1)" - line 173, ".input.spin", state 1430, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, ".input.spin", state 1432, "(1)" - line 177, ".input.spin", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, ".input.spin", state 1441, "(1)" - line 177, ".input.spin", state 1442, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, ".input.spin", state 1442, "else" - line 175, ".input.spin", state 1447, "((j<1))" - line 175, ".input.spin", state 1447, "((j>=1))" - line 181, ".input.spin", state 1452, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 1462, "(1)" - line 162, ".input.spin", state 1470, "(1)" - line 162, ".input.spin", state 1471, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, ".input.spin", state 1471, "else" - line 160, ".input.spin", state 1476, "((j<1))" - line 160, ".input.spin", state 1476, "((j>=1))" - line 166, ".input.spin", state 1482, "(1)" - line 166, ".input.spin", state 1483, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, ".input.spin", state 1483, "else" - line 168, ".input.spin", state 1486, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, ".input.spin", state 1486, "else" - line 173, ".input.spin", state 1493, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, ".input.spin", state 1515, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 166, ".input.spin", state 1545, "(1)" - line 166, ".input.spin", state 1546, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 173, ".input.spin", state 1560, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, ".input.spin", state 1562, "(1)" - line 177, ".input.spin", state 1569, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, ".input.spin", state 1571, "(1)" - line 177, ".input.spin", state 1572, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, ".input.spin", state 1572, "else" - line 175, ".input.spin", state 1577, "((j<1))" - line 175, ".input.spin", state 1577, "((j>=1))" - line 181, ".input.spin", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 1592, "(1)" - line 162, ".input.spin", state 1600, "(1)" - line 162, ".input.spin", state 1601, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, ".input.spin", state 1601, "else" - line 160, ".input.spin", state 1606, "((j<1))" - line 160, ".input.spin", state 1606, "((j>=1))" - line 166, ".input.spin", state 1612, "(1)" - line 166, ".input.spin", state 1613, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, ".input.spin", state 1613, "else" - line 168, ".input.spin", state 1616, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, ".input.spin", state 1616, "else" - line 200, ".input.spin", state 1618, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 200, ".input.spin", state 1618, "else" - line 219, ".input.spin", state 1619, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 219, ".input.spin", state 1619, "else" - line 354, ".input.spin", state 1625, "((sighand_exec==1))" - line 354, ".input.spin", state 1625, "else" - line 360, ".input.spin", state 1628, "sighand_exec = 1" - line 397, ".input.spin", state 1641, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 397, ".input.spin", state 1643, "(1)" - line 397, ".input.spin", state 1644, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 397, ".input.spin", state 1644, "else" - line 397, ".input.spin", state 1647, "(1)" - line 401, ".input.spin", state 1655, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 401, ".input.spin", state 1657, "(1)" - line 401, ".input.spin", state 1658, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 401, ".input.spin", state 1658, "else" - line 401, ".input.spin", state 1661, "(1)" - line 401, ".input.spin", state 1662, "(1)" - line 401, ".input.spin", state 1662, "(1)" - line 399, ".input.spin", state 1667, "((i<1))" - line 399, ".input.spin", state 1667, "((i>=1))" - line 406, ".input.spin", state 1673, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, ".input.spin", state 1686, "(1)" - line 407, ".input.spin", state 1687, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 407, ".input.spin", state 1687, "else" - line 407, ".input.spin", state 1690, "(1)" - line 407, ".input.spin", state 1691, "(1)" - line 407, ".input.spin", state 1691, "(1)" - line 411, ".input.spin", state 1699, "(1)" - line 411, ".input.spin", state 1700, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 411, ".input.spin", state 1700, "else" - line 411, ".input.spin", state 1703, "(1)" - line 411, ".input.spin", state 1704, "(1)" - line 411, ".input.spin", state 1704, "(1)" - line 409, ".input.spin", state 1709, "((i<1))" - line 409, ".input.spin", state 1709, "((i>=1))" - line 416, ".input.spin", state 1716, "(1)" - line 416, ".input.spin", state 1717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 416, ".input.spin", state 1717, "else" - line 416, ".input.spin", state 1720, "(1)" - line 416, ".input.spin", state 1721, "(1)" - line 416, ".input.spin", state 1721, "(1)" - line 418, ".input.spin", state 1724, "(1)" - line 418, ".input.spin", state 1724, "(1)" - line 360, ".input.spin", state 1733, "sighand_exec = 1" - line 177, ".input.spin", state 1758, "(1)" - line 181, ".input.spin", state 1769, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 1779, "(1)" - line 162, ".input.spin", state 1787, "(1)" - line 166, ".input.spin", state 1799, "(1)" - line 173, ".input.spin", state 1810, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/asserts.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/asserts.spin.input.trail deleted file mode 100644 index 287e52a..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/asserts.spin.input.trail +++ /dev/null @@ -1,6 +0,0 @@ --4:-4:-4 -1:0:2673 -2:0:2674 -3:0:2675 -4:0:2676 -5:4:1129 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/references.txt b/formal-model/urcu-nosched-model/result-signal-over-writer/references.txt deleted file mode 100644 index 72c67a2..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/references.txt +++ /dev/null @@ -1,13 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html - -LTL vs CTL : - -http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 -http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf - (downloaded) diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/result-signal-over-writer/DEFINES b/formal-model/urcu-nosched-model/result-signal-over-writer/result-signal-over-writer/DEFINES deleted file mode 100644 index ec600f0..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/result-signal-over-writer/DEFINES +++ /dev/null @@ -1,16 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -#endif - -#define REMOTE_BARRIERS diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/result-signal-over-writer/Makefile b/formal-model/urcu-nosched-model/result-signal-over-writer/result-signal-over-writer/Makefile deleted file mode 100644 index 8af320d..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/result-signal-over-writer/Makefile +++ /dev/null @@ -1,172 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - #nested useless with signal test. - #make urcu_free_nested | tee urcu_free_nested.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/result-signal-over-writer/asserts.log b/formal-model/urcu-nosched-model/result-signal-over-writer/result-signal-over-writer/asserts.log deleted file mode 100644 index c102ffb..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/result-signal-over-writer/asserts.log +++ /dev/null @@ -1,334 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -cat DEFINES > .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w20 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim - (none specified) - assertion violations + - cycle checks - (disabled by -DSAFETY) - invalid end states + - -State-vector 40 byte, depth reached 7872, errors: 0 - 20128 states, stored - 191477 states, matched - 211605 transitions (= stored+matched) - 712166 atomic steps -hash conflicts: 942 (resolved) - -Stats on memory usage (in Megabytes): - 1.305 equivalent memory usage for states (stored*(State-vector + overhead)) - 1.467 actual memory usage for states (unsuccessful compression: 112.36%) - state-vector as stored = 48 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 467.229 total actual memory usage - -unreached in proctype urcu_reader_sig - line 401, ".input.spin", state 330, "(1)" - line 612, ".input.spin", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 397, ".input.spin", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 406, ".input.spin", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, ".input.spin", state 59, "(1)" - line 416, ".input.spin", state 89, "(1)" - line 397, ".input.spin", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 407, ".input.spin", state 160, "(1)" - line 650, ".input.spin", state 213, "(1)" - line 173, ".input.spin", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 177, ".input.spin", state 233, "(1)" - line 158, ".input.spin", state 254, "(1)" - line 162, ".input.spin", state 262, "(1)" - line 166, ".input.spin", state 274, "(1)" - line 173, ".input.spin", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, ".input.spin", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 752, "(1)" - line 162, ".input.spin", state 760, "(1)" - line 162, ".input.spin", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, ".input.spin", state 761, "else" - line 160, ".input.spin", state 766, "((j<1))" - line 160, ".input.spin", state 766, "((j>=1))" - line 166, ".input.spin", state 772, "(1)" - line 166, ".input.spin", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, ".input.spin", state 773, "else" - line 168, ".input.spin", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, ".input.spin", state 776, "else" - line 173, ".input.spin", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, ".input.spin", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 166, ".input.spin", state 835, "(1)" - line 166, ".input.spin", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 173, ".input.spin", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, ".input.spin", state 852, "(1)" - line 177, ".input.spin", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, ".input.spin", state 861, "(1)" - line 177, ".input.spin", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, ".input.spin", state 862, "else" - line 175, ".input.spin", state 867, "((j<1))" - line 175, ".input.spin", state 867, "((j>=1))" - line 181, ".input.spin", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 882, "(1)" - line 162, ".input.spin", state 890, "(1)" - line 162, ".input.spin", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, ".input.spin", state 891, "else" - line 160, ".input.spin", state 896, "((j<1))" - line 160, ".input.spin", state 896, "((j>=1))" - line 166, ".input.spin", state 902, "(1)" - line 166, ".input.spin", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, ".input.spin", state 903, "else" - line 168, ".input.spin", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, ".input.spin", state 906, "else" - line 200, ".input.spin", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 200, ".input.spin", state 908, "else" - line 219, ".input.spin", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 219, ".input.spin", state 909, "else" - line 354, ".input.spin", state 915, "((sighand_exec==1))" - line 354, ".input.spin", state 915, "else" - line 360, ".input.spin", state 918, "sighand_exec = 1" - line 397, ".input.spin", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 397, ".input.spin", state 933, "(1)" - line 397, ".input.spin", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 397, ".input.spin", state 934, "else" - line 397, ".input.spin", state 937, "(1)" - line 401, ".input.spin", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 401, ".input.spin", state 947, "(1)" - line 401, ".input.spin", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 401, ".input.spin", state 948, "else" - line 401, ".input.spin", state 951, "(1)" - line 401, ".input.spin", state 952, "(1)" - line 401, ".input.spin", state 952, "(1)" - line 399, ".input.spin", state 957, "((i<1))" - line 399, ".input.spin", state 957, "((i>=1))" - line 406, ".input.spin", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, ".input.spin", state 976, "(1)" - line 407, ".input.spin", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 407, ".input.spin", state 977, "else" - line 407, ".input.spin", state 980, "(1)" - line 407, ".input.spin", state 981, "(1)" - line 407, ".input.spin", state 981, "(1)" - line 411, ".input.spin", state 989, "(1)" - line 411, ".input.spin", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 411, ".input.spin", state 990, "else" - line 411, ".input.spin", state 993, "(1)" - line 411, ".input.spin", state 994, "(1)" - line 411, ".input.spin", state 994, "(1)" - line 409, ".input.spin", state 999, "((i<1))" - line 409, ".input.spin", state 999, "((i>=1))" - line 416, ".input.spin", state 1006, "(1)" - line 416, ".input.spin", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 416, ".input.spin", state 1007, "else" - line 416, ".input.spin", state 1010, "(1)" - line 416, ".input.spin", state 1011, "(1)" - line 416, ".input.spin", state 1011, "(1)" - line 418, ".input.spin", state 1014, "(1)" - line 418, ".input.spin", state 1014, "(1)" - line 360, ".input.spin", state 1023, "sighand_exec = 1" - line 401, ".input.spin", state 1054, "(1)" - line 406, ".input.spin", state 1070, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, ".input.spin", state 1113, "(1)" - line 401, ".input.spin", state 1151, "(1)" - line 406, ".input.spin", state 1167, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, ".input.spin", state 1210, "(1)" - line 397, ".input.spin", state 1236, "(1)" - line 401, ".input.spin", state 1250, "(1)" - line 406, ".input.spin", state 1266, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, ".input.spin", state 1309, "(1)" - line 401, ".input.spin", state 1350, "(1)" - line 406, ".input.spin", state 1366, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, ".input.spin", state 1409, "(1)" - line 173, ".input.spin", state 1430, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, ".input.spin", state 1432, "(1)" - line 177, ".input.spin", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, ".input.spin", state 1441, "(1)" - line 177, ".input.spin", state 1442, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, ".input.spin", state 1442, "else" - line 175, ".input.spin", state 1447, "((j<1))" - line 175, ".input.spin", state 1447, "((j>=1))" - line 181, ".input.spin", state 1452, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 1462, "(1)" - line 162, ".input.spin", state 1470, "(1)" - line 162, ".input.spin", state 1471, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, ".input.spin", state 1471, "else" - line 160, ".input.spin", state 1476, "((j<1))" - line 160, ".input.spin", state 1476, "((j>=1))" - line 166, ".input.spin", state 1482, "(1)" - line 166, ".input.spin", state 1483, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, ".input.spin", state 1483, "else" - line 168, ".input.spin", state 1486, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, ".input.spin", state 1486, "else" - line 173, ".input.spin", state 1493, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, ".input.spin", state 1515, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 166, ".input.spin", state 1545, "(1)" - line 166, ".input.spin", state 1546, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 173, ".input.spin", state 1560, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, ".input.spin", state 1562, "(1)" - line 177, ".input.spin", state 1569, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, ".input.spin", state 1571, "(1)" - line 177, ".input.spin", state 1572, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, ".input.spin", state 1572, "else" - line 175, ".input.spin", state 1577, "((j<1))" - line 175, ".input.spin", state 1577, "((j>=1))" - line 181, ".input.spin", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 1592, "(1)" - line 162, ".input.spin", state 1600, "(1)" - line 162, ".input.spin", state 1601, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, ".input.spin", state 1601, "else" - line 160, ".input.spin", state 1606, "((j<1))" - line 160, ".input.spin", state 1606, "((j>=1))" - line 166, ".input.spin", state 1612, "(1)" - line 166, ".input.spin", state 1613, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, ".input.spin", state 1613, "else" - line 168, ".input.spin", state 1616, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, ".input.spin", state 1616, "else" - line 200, ".input.spin", state 1618, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 200, ".input.spin", state 1618, "else" - line 219, ".input.spin", state 1619, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 219, ".input.spin", state 1619, "else" - line 354, ".input.spin", state 1625, "((sighand_exec==1))" - line 354, ".input.spin", state 1625, "else" - line 360, ".input.spin", state 1628, "sighand_exec = 1" - line 397, ".input.spin", state 1641, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 397, ".input.spin", state 1643, "(1)" - line 397, ".input.spin", state 1644, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 397, ".input.spin", state 1644, "else" - line 397, ".input.spin", state 1647, "(1)" - line 401, ".input.spin", state 1655, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 401, ".input.spin", state 1657, "(1)" - line 401, ".input.spin", state 1658, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 401, ".input.spin", state 1658, "else" - line 401, ".input.spin", state 1661, "(1)" - line 401, ".input.spin", state 1662, "(1)" - line 401, ".input.spin", state 1662, "(1)" - line 399, ".input.spin", state 1667, "((i<1))" - line 399, ".input.spin", state 1667, "((i>=1))" - line 406, ".input.spin", state 1673, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, ".input.spin", state 1686, "(1)" - line 407, ".input.spin", state 1687, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 407, ".input.spin", state 1687, "else" - line 407, ".input.spin", state 1690, "(1)" - line 407, ".input.spin", state 1691, "(1)" - line 407, ".input.spin", state 1691, "(1)" - line 411, ".input.spin", state 1699, "(1)" - line 411, ".input.spin", state 1700, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 411, ".input.spin", state 1700, "else" - line 411, ".input.spin", state 1703, "(1)" - line 411, ".input.spin", state 1704, "(1)" - line 411, ".input.spin", state 1704, "(1)" - line 409, ".input.spin", state 1709, "((i<1))" - line 409, ".input.spin", state 1709, "((i>=1))" - line 416, ".input.spin", state 1716, "(1)" - line 416, ".input.spin", state 1717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 416, ".input.spin", state 1717, "else" - line 416, ".input.spin", state 1720, "(1)" - line 416, ".input.spin", state 1721, "(1)" - line 416, ".input.spin", state 1721, "(1)" - line 418, ".input.spin", state 1724, "(1)" - line 418, ".input.spin", state 1724, "(1)" - line 360, ".input.spin", state 1733, "sighand_exec = 1" - line 177, ".input.spin", state 1758, "(1)" - line 181, ".input.spin", state 1769, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 1779, "(1)" - line 162, ".input.spin", state 1787, "(1)" - line 166, ".input.spin", state 1799, "(1)" - line 173, ".input.spin", state 1810, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/result-signal-over-writer/asserts.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/result-signal-over-writer/asserts.spin.input.trail deleted file mode 100644 index 287e52a..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/result-signal-over-writer/asserts.spin.input.trail +++ /dev/null @@ -1,6 +0,0 @@ --4:-4:-4 -1:0:2673 -2:0:2674 -3:0:2675 -4:0:2676 -5:4:1129 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/result-signal-over-writer/references.txt b/formal-model/urcu-nosched-model/result-signal-over-writer/result-signal-over-writer/references.txt deleted file mode 100644 index 72c67a2..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/result-signal-over-writer/references.txt +++ /dev/null @@ -1,13 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html - -LTL vs CTL : - -http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 -http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf - (downloaded) diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/.input.define b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/.input.define deleted file mode 100644 index e69de29..0000000 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/.input.spin b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/.input.spin deleted file mode 100644 index f2737c4..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/.input.spin +++ /dev/null @@ -1,531 +0,0 @@ - -#define NR_READERS 2 -#define NR_WRITERS 1 - -#define NR_PROCS 3 - - -#if (NR_READERS == 1) - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#elif (NR_READERS == 2) - -#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) -#define read_free (free_done && (data_access[0] || data_access[1])) - -#else - -#error "Too many readers" - -#endif - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - atomic { - if - :: get_readerid() == 0 -> -progress_reader: - skip; - :: else -> - skip; - fi; - } -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/DEFINES b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/DEFINES deleted file mode 100644 index 12c751b..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/DEFINES +++ /dev/null @@ -1,31 +0,0 @@ - -#define NR_READERS 2 -#define NR_WRITERS 1 - -#define NR_PROCS 3 - - -#if (NR_READERS == 1) - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#elif (NR_READERS == 2) - -#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) -#define read_free (free_done && (data_access[0] || data_access[1])) - -#else - -#error "Too many readers" - -#endif - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/Makefile b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/Makefile deleted file mode 100644 index ca932b7..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/Makefile +++ /dev/null @@ -1,165 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - make urcu_free_nested | tee urcu_free_nested.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/asserts.log b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/asserts.log deleted file mode 100644 index 75f2427..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/asserts.log +++ /dev/null @@ -1,10 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -cat DEFINES > .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X .input.spin -spin: line 295 replacement value: tmp -spin: line 295 ".input.spin", Error: formal par of wait_for_quiescent_state contains replacement value saw '-2'' near 'readerid' -spin: 1 error(s) - aborting -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/asserts.spin.input b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/asserts.spin.input deleted file mode 100644 index b06898a..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/asserts.spin.input +++ /dev/null @@ -1,409 +0,0 @@ -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#define read_free_race (read_generation == last_free_gen) -#define read_free (free_done && data_access) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces - * both. - */ - -#define DECLARE_CACHED_VAR(type, x, v) \ - type mem_##x = v; \ - type cached_##x[NR_PROCS] = v; \ - bit cache_dirty_##x[NR_PROCS] = 0 - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) - -#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x[get_pid()] = v; \ - cache_dirty_##x[get_pid()] = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x[id]; \ - cache_dirty_##x[id] = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - CACHE_READ_FROM_MEM(urcu_active_readers_one, i); - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i); -#endif -#ifndef NO_RMB - smp_rmb_pid(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid()); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid()); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i); -#endif -#ifndef NO_RMB - smp_rmb(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr, 0); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation = 1; -bit data_access = 0; - -bit write_lock = 0; - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, id, i) -{ - do - :: 1 -> - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (tmp & RCU_GP_CTR_NEST_MASK) - && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, i, j) -{ - i = 0; - do - :: i < NR_READERS -> - wait_for_reader(tmp, i, j); - if - :: (NR_READERS > 1) && (i < NR_READERS - 1) - -> ooo_mem(j); - :: else - -> skip; - fi; - i++ - :: i >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers_one, - tmp + 1); - fi; - smp_mb(i); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access = 1; - ooo_mem(i); - data_access = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i); - tmp2 = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, nest_i; - byte tmp, tmp2; - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active [NR_WRITERS] proctype urcu_writer() -{ - byte i, j; - byte tmp; - byte old_gen; - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, i, j); -#endif - smp_mb(i); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/asserts.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/asserts.spin.input.trail deleted file mode 100644 index 287e52a..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/asserts.spin.input.trail +++ /dev/null @@ -1,6 +0,0 @@ --4:-4:-4 -1:0:2673 -2:0:2674 -3:0:2675 -4:0:2676 -5:4:1129 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/references.txt b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/references.txt deleted file mode 100644 index 72c67a2..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/references.txt +++ /dev/null @@ -1,13 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html - -LTL vs CTL : - -http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 -http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf - (downloaded) diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu.sh b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu.spin b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu.spin deleted file mode 100644 index 61d9052..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu.spin +++ /dev/null @@ -1,500 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - atomic { - if - :: get_readerid() == 0 -> -progress_reader: - skip; - :: else -> - skip; - fi; - } -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu.spin.bkp2 b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu.spin.bkp2 deleted file mode 100644 index b1c8311..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu.spin.bkp2 +++ /dev/null @@ -1,395 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -#define NR_WRITERS 1 -#define NR_READERS 3 - -/* Number of reader and writer processes */ -#define NR_PROCS 5 - -/* Includes reader, writer and init process */ -#define MAX_NR_PROCS 5 - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces - * both. - */ - -#define DECLARE_CACHED_VAR(type, x, v) \ - type mem_##x = v; \ - type cached_##x[NR_PROCS] = v; \ - bit cache_dirty_##x[NR_PROCS] = 0 - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) - -#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x[get_pid()] = v; \ - cache_dirty_##x[get_pid()] = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x[id]; \ - cache_dirty_##x[id] = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - CACHE_READ_FROM_MEM(urcu_active_readers_one, i); - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i); -#endif -#ifndef NO_RMB - smp_rmb_pid(i); -#endif - skip; - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid()); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid()); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i); -#endif -#ifndef NO_RMB - smp_rmb(i); -#endif - skip; - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr, 0); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation = 1; -bit data_access = 0; - -bit write_lock = 0; - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_writerid() (get_pid()) -#define get_readerid() (get_writerrid() + NR_READERS) - -inline wait_for_reader(tmp, id, i) -{ - do - :: 1 -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (tmp & RCU_GP_CTR_NEST_MASK) - && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i); -#else - skip; -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, i, j) -{ - i = 0; - do - :: i < NR_READERS -> - wait_for_reader(tmp, i, j); - i++ - :: i >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, nest_i, tmp, tmp2, nest) -{ - nest_i = 0; - do - :: nest_i < nest -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers_one, - tmp + 1); - fi; - ooo_mem(i); - smp_mb(i); - nest_i++; - :: nest_i >= nest -> break; - od; - - ooo_mem(i); - read_generation = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access = 1; - ooo_mem(i); - data_access = 0; - - nest_i = 0; - do - :: nest_i < nest -> - ooo_mem(i); - smp_mb(i); - ooo_mem(i); - tmp2 = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); - nest_i++; - :: nest_i >= nest -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [2] proctype urcu_reader() -{ - byte i, nest_i; - byte tmp, tmp2; - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, nest_i, tmp, tmp2, 2); - od; -} - -/* Model the RCU update process. */ - -active [1] proctype urcu_writer() -{ - byte i, j; - byte tmp; - byte old_gen; - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i); - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, i, j); -#endif - ooo_mem(i); - smp_mb(i); - ooo_mem(i); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu.spin.bkp5 b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu.spin.bkp5 deleted file mode 100644 index 324ee39..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu.spin.bkp5 +++ /dev/null @@ -1,398 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -#define DECLARE_CACHED_VAR(type, x, v) \ - type mem_##x = v; \ - type cached_##x[NR_PROCS] = v; \ - bit cache_dirty_##x[NR_PROCS] = 0 - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) - -#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x[get_pid()] = v; \ - cache_dirty_##x[get_pid()] = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x[id]; \ - cache_dirty_##x[id] = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - CACHE_READ_FROM_MEM(urcu_active_readers_one, i); - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i); -#endif -#ifndef NO_RMB - smp_rmb_pid(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid()); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid()); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i); -#endif -#ifndef NO_RMB - smp_rmb(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr, 0); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation = 1; -bit data_access = 0; - -bit write_lock = 0; - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, id, i) -{ - do - :: 1 -> - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (tmp & RCU_GP_CTR_NEST_MASK) - && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, i, j) -{ - i = 0; - do - :: i < NR_READERS -> - wait_for_reader(tmp, i, j); - if - :: (NR_READERS > 1) && (i < NR_READERS - 1) - -> ooo_mem(j); - :: else - -> skip; - fi; - i++ - :: i >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers_one, - tmp + 1); - fi; - smp_mb(i); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access = 1; - ooo_mem(i); - data_access = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i); - tmp2 = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, nest_i; - byte tmp, tmp2; - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active [NR_WRITERS] proctype urcu_writer() -{ - byte i, j; - byte tmp; - byte old_gen; - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, i, j); -#endif - smp_mb(i); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free.log b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free.log deleted file mode 100644 index 6a04aba..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free.log +++ /dev/null @@ -1,414 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 566) -Depth= 4234 States= 1e+06 Transitions= 1.7e+07 Memory= 527.287 t= 31.3 R= 3e+04 -Depth= 4234 States= 2e+06 Transitions= 3.44e+07 Memory= 588.322 t= 63.9 R= 3e+04 -Depth= 4234 States= 3e+06 Transitions= 5.2e+07 Memory= 649.358 t= 97 R= 3e+04 -pan: resizing hashtable to -w22.. done -Depth= 4234 States= 4e+06 Transitions= 6.97e+07 Memory= 741.416 t= 130 R= 3e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 4234, errors: 0 - 4027146 states, stored - 66145121 states, matched - 70172267 transitions (= stored+matched) -2.6437688e+08 atomic steps -hash conflicts: 47318190 (resolved) - -Stats on memory usage (in Megabytes): - 322.609 equivalent memory usage for states (stored*(State-vector + overhead)) - 253.418 actual memory usage for states (compression: 78.55%) - state-vector as stored = 38 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 743.076 total actual memory usage - -unreached in proctype urcu_reader - line 288, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 61, "(1)" - line 307, "pan.___", state 91, "(1)" - line 288, "pan.___", state 104, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 136, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 149, "(1)" - line 307, "pan.___", state 179, "(1)" - line 288, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 225, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 238, "(1)" - line 307, "pan.___", state 268, "(1)" - line 158, "pan.___", state 289, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 158, "pan.___", state 291, "(1)" - line 162, "pan.___", state 298, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 300, "(1)" - line 162, "pan.___", state 301, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 162, "pan.___", state 301, "else" - line 160, "pan.___", state 306, "((j<1))" - line 160, "pan.___", state 306, "((j>=1))" - line 166, "pan.___", state 311, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 321, "(1)" - line 147, "pan.___", state 329, "(1)" - line 147, "pan.___", state 330, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 147, "pan.___", state 330, "else" - line 145, "pan.___", state 335, "((j<1))" - line 145, "pan.___", state 335, "((j>=1))" - line 151, "pan.___", state 341, "(1)" - line 151, "pan.___", state 342, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 151, "pan.___", state 342, "else" - line 153, "pan.___", state 345, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 153, "pan.___", state 345, "else" - line 185, "pan.___", state 347, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 185, "pan.___", state 347, "else" - line 158, "pan.___", state 352, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 166, "pan.___", state 374, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 151, "pan.___", state 404, "(1)" - line 151, "pan.___", state 405, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 158, "pan.___", state 419, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 158, "pan.___", state 421, "(1)" - line 162, "pan.___", state 428, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 430, "(1)" - line 162, "pan.___", state 431, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 162, "pan.___", state 431, "else" - line 160, "pan.___", state 436, "((j<1))" - line 160, "pan.___", state 436, "((j>=1))" - line 166, "pan.___", state 441, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 451, "(1)" - line 147, "pan.___", state 459, "(1)" - line 147, "pan.___", state 460, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 147, "pan.___", state 460, "else" - line 145, "pan.___", state 465, "((j<1))" - line 145, "pan.___", state 465, "((j>=1))" - line 151, "pan.___", state 471, "(1)" - line 151, "pan.___", state 472, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 151, "pan.___", state 472, "else" - line 153, "pan.___", state 475, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 153, "pan.___", state 475, "else" - line 185, "pan.___", state 477, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 185, "pan.___", state 477, "else" - line 288, "pan.___", state 492, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 524, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 537, "(1)" - line 307, "pan.___", state 567, "(1)" - line 288, "pan.___", state 580, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 612, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 625, "(1)" - line 307, "pan.___", state 655, "(1)" - line 288, "pan.___", state 668, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 713, "(1)" - line 307, "pan.___", state 743, "(1)" - line 158, "pan.___", state 758, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 158, "pan.___", state 760, "(1)" - line 162, "pan.___", state 767, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 769, "(1)" - line 162, "pan.___", state 770, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 162, "pan.___", state 770, "else" - line 160, "pan.___", state 775, "((j<1))" - line 160, "pan.___", state 775, "((j>=1))" - line 166, "pan.___", state 780, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 790, "(1)" - line 147, "pan.___", state 798, "(1)" - line 147, "pan.___", state 799, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 147, "pan.___", state 799, "else" - line 145, "pan.___", state 804, "((j<1))" - line 145, "pan.___", state 804, "((j>=1))" - line 151, "pan.___", state 810, "(1)" - line 151, "pan.___", state 811, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 151, "pan.___", state 811, "else" - line 153, "pan.___", state 814, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 153, "pan.___", state 814, "else" - line 185, "pan.___", state 816, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 185, "pan.___", state 816, "else" - line 158, "pan.___", state 821, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 166, "pan.___", state 843, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 151, "pan.___", state 873, "(1)" - line 151, "pan.___", state 874, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 158, "pan.___", state 888, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 158, "pan.___", state 890, "(1)" - line 162, "pan.___", state 897, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 899, "(1)" - line 162, "pan.___", state 900, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 162, "pan.___", state 900, "else" - line 160, "pan.___", state 905, "((j<1))" - line 160, "pan.___", state 905, "((j>=1))" - line 166, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 920, "(1)" - line 147, "pan.___", state 928, "(1)" - line 147, "pan.___", state 929, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 147, "pan.___", state 929, "else" - line 145, "pan.___", state 934, "((j<1))" - line 145, "pan.___", state 934, "((j>=1))" - line 151, "pan.___", state 940, "(1)" - line 151, "pan.___", state 941, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 151, "pan.___", state 941, "else" - line 153, "pan.___", state 944, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 153, "pan.___", state 944, "else" - line 185, "pan.___", state 946, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 185, "pan.___", state 946, "else" - line 288, "pan.___", state 956, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 988, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1001, "(1)" - line 307, "pan.___", state 1031, "(1)" - line 288, "pan.___", state 1052, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1084, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1097, "(1)" - line 307, "pan.___", state 1127, "(1)" - line 433, "pan.___", state 1140, "-end-" - (125 of 1140 states) -unreached in proctype urcu_writer - line 288, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 292, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 59, "(1)" - line 302, "pan.___", state 72, "(1)" - line 307, "pan.___", state 89, "(1)" - line 288, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 292, "pan.___", state 120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 151, "(1)" - line 302, "pan.___", state 164, "(1)" - line 467, "pan.___", state 195, "(1)" - line 158, "pan.___", state 205, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 214, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 237, "(1)" - line 147, "pan.___", state 245, "(1)" - line 151, "pan.___", state 257, "(1)" - line 158, "pan.___", state 268, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 297, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 923, "(1)" - line 298, "pan.___", state 924, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 298, "pan.___", state 924, "else" - line 298, "pan.___", state 927, "(1)" - line 298, "pan.___", state 928, "(1)" - line 298, "pan.___", state 928, "(1)" - line 302, "pan.___", state 936, "(1)" - line 302, "pan.___", state 937, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 302, "pan.___", state 937, "else" - line 302, "pan.___", state 940, "(1)" - line 302, "pan.___", state 941, "(1)" - line 302, "pan.___", state 941, "(1)" - line 300, "pan.___", state 946, "((i<1))" - line 300, "pan.___", state 946, "((i>=1))" - line 307, "pan.___", state 953, "(1)" - line 307, "pan.___", state 954, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 307, "pan.___", state 954, "else" - line 307, "pan.___", state 957, "(1)" - line 307, "pan.___", state 958, "(1)" - line 307, "pan.___", state 958, "(1)" - line 309, "pan.___", state 961, "(1)" - line 309, "pan.___", state 961, "(1)" - line 292, "pan.___", state 990, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1008, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 302, "pan.___", state 1034, "(1)" - line 307, "pan.___", state 1051, "(1)" - line 292, "pan.___", state 1078, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1096, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 302, "pan.___", state 1122, "(1)" - line 307, "pan.___", state 1139, "(1)" - line 288, "pan.___", state 1156, "(1)" - line 292, "pan.___", state 1168, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1186, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 302, "pan.___", state 1212, "(1)" - line 307, "pan.___", state 1229, "(1)" - line 292, "pan.___", state 1259, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1277, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 302, "pan.___", state 1303, "(1)" - line 307, "pan.___", state 1320, "(1)" - line 162, "pan.___", state 1342, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 166, "pan.___", state 1355, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 1365, "(1)" - line 147, "pan.___", state 1373, "(1)" - line 151, "pan.___", state 1385, "(1)" - line 158, "pan.___", state 1396, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 297, "pan.___", state 1571, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1584, "(1)" - line 298, "pan.___", state 1585, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 298, "pan.___", state 1585, "else" - line 298, "pan.___", state 1588, "(1)" - line 298, "pan.___", state 1589, "(1)" - line 298, "pan.___", state 1589, "(1)" - line 302, "pan.___", state 1597, "(1)" - line 302, "pan.___", state 1598, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 302, "pan.___", state 1598, "else" - line 302, "pan.___", state 1601, "(1)" - line 302, "pan.___", state 1602, "(1)" - line 302, "pan.___", state 1602, "(1)" - line 300, "pan.___", state 1607, "((i<1))" - line 300, "pan.___", state 1607, "((i>=1))" - line 307, "pan.___", state 1614, "(1)" - line 307, "pan.___", state 1615, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 307, "pan.___", state 1615, "else" - line 307, "pan.___", state 1618, "(1)" - line 307, "pan.___", state 1619, "(1)" - line 307, "pan.___", state 1619, "(1)" - line 309, "pan.___", state 1622, "(1)" - line 309, "pan.___", state 1622, "(1)" - line 162, "pan.___", state 1646, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 166, "pan.___", state 1659, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 1669, "(1)" - line 147, "pan.___", state 1677, "(1)" - line 151, "pan.___", state 1689, "(1)" - line 158, "pan.___", state 1700, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< !read_free_race) diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free.spin.input b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free.spin.input deleted file mode 100644 index 18f99c4..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free.spin.input +++ /dev/null @@ -1,531 +0,0 @@ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - - -#if (NR_READERS == 1) - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#elif (NR_READERS == 2) - -#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) -#define read_free (free_done && (data_access[0] || data_access[1])) - -#else - -#error "Too many readers" - -#endif - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - atomic { - if - :: get_readerid() == 0 -> -progress_reader: - skip; - :: else -> - skip; - fi; - } -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free.spin.input.trail deleted file mode 100644 index 0d22946..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free.spin.input.trail +++ /dev/null @@ -1,1902 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:3013 -2:2:1132 -3:0:3013 -4:1:0 -5:0:3013 -6:1:1 -7:0:3013 -8:1:2 -9:0:3013 -10:1:3 -11:0:3013 -12:3:2969 -13:0:3013 -14:3:2970 -15:0:3013 -16:3:2971 -17:0:3013 -18:3:2972 -19:0:3013 -20:3:2973 -21:0:3013 -22:3:2974 -23:0:3013 -24:3:2971 -25:0:3013 -26:3:2972 -27:0:3013 -28:3:2973 -29:0:3013 -30:3:2974 -31:0:3013 -32:3:2975 -33:0:3013 -34:3:2980 -35:0:3013 -36:3:2981 -37:0:3013 -38:3:2982 -39:0:3013 -40:3:2983 -41:0:3013 -42:3:2984 -43:0:3013 -44:3:2985 -45:0:3013 -46:3:2982 -47:0:3013 -48:3:2983 -49:0:3013 -50:3:2984 -51:0:3013 -52:3:2985 -53:0:3013 -54:3:2986 -55:0:3013 -56:3:2992 -57:0:3013 -58:3:2993 -59:0:3013 -60:3:2994 -61:0:3013 -62:3:2995 -63:0:3013 -64:3:2996 -65:0:3013 -66:3:2997 -67:0:3013 -68:3:2998 -69:0:3013 -70:3:2995 -71:0:3013 -72:2:1133 -73:0:3013 -74:2:1134 -75:2:1138 -76:2:1139 -77:2:1147 -78:2:1148 -79:2:1152 -80:2:1153 -81:2:1161 -82:2:1166 -83:2:1170 -84:2:1171 -85:2:1178 -86:2:1179 -87:2:1190 -88:2:1191 -89:2:1192 -90:2:1203 -91:2:1208 -92:2:1209 -93:0:3013 -94:2:1221 -95:2:1222 -96:0:3013 -97:2:1226 -98:2:1230 -99:2:1231 -100:2:1239 -101:2:1240 -102:2:1244 -103:2:1245 -104:2:1253 -105:2:1258 -106:2:1259 -107:2:1270 -108:2:1271 -109:2:1282 -110:2:1283 -111:2:1284 -112:2:1295 -113:2:1300 -114:2:1301 -115:0:3013 -116:2:1313 -117:0:3013 -118:2:1314 -119:0:3013 -120:2:1324 -121:0:3013 -122:2:1325 -123:0:3013 -124:2:1329 -125:2:1330 -126:2:1334 -127:2:1338 -128:2:1339 -129:2:1343 -130:2:1351 -131:2:1352 -132:2:1357 -133:2:1364 -134:2:1365 -135:2:1372 -136:2:1377 -137:0:3013 -138:2:1388 -139:0:3013 -140:2:1392 -141:2:1393 -142:2:1397 -143:2:1401 -144:2:1402 -145:2:1406 -146:2:1414 -147:2:1415 -148:2:1420 -149:2:1427 -150:2:1428 -151:2:1435 -152:2:1440 -153:0:3013 -154:2:1451 -155:0:3013 -156:2:1459 -157:2:1460 -158:2:1464 -159:2:1468 -160:2:1469 -161:2:1473 -162:2:1481 -163:2:1482 -164:2:1487 -165:2:1494 -166:2:1495 -167:2:1502 -168:2:1507 -169:0:3013 -170:2:1522 -171:0:3013 -172:2:1523 -173:2:1527 -174:2:1528 -175:2:1536 -176:2:1537 -177:2:1541 -178:2:1542 -179:2:1550 -180:2:1555 -181:2:1559 -182:2:1560 -183:2:1567 -184:2:1568 -185:2:1579 -186:2:1580 -187:2:1581 -188:2:1592 -189:2:1597 -190:2:1598 -191:0:3013 -192:2:1610 -193:0:3013 -194:2:1613 -195:2:1614 -196:2:1626 -197:2:1627 -198:2:1631 -199:2:1632 -200:2:1640 -201:2:1645 -202:2:1649 -203:2:1650 -204:2:1657 -205:2:1658 -206:2:1669 -207:2:1670 -208:2:1671 -209:2:1682 -210:2:1687 -211:2:1688 -212:0:3013 -213:2:1700 -214:0:3013 -215:2:1701 -216:0:3013 -217:2:1702 -218:0:3013 -219:2:1703 -220:0:3013 -221:2:1704 -222:2:1708 -223:2:1709 -224:2:1717 -225:2:1718 -226:2:1722 -227:2:1723 -228:2:1731 -229:2:1736 -230:2:1740 -231:2:1741 -232:2:1748 -233:2:1749 -234:2:1760 -235:2:1761 -236:2:1762 -237:2:1773 -238:2:1778 -239:2:1779 -240:0:3013 -241:2:1989 -242:0:3013 -243:2:2085 -244:0:3013 -245:2:2086 -246:0:3013 -247:2:2090 -248:0:3013 -249:2:2096 -250:2:2100 -251:2:2101 -252:2:2109 -253:2:2110 -254:2:2114 -255:2:2115 -256:2:2123 -257:2:2128 -258:2:2132 -259:2:2133 -260:2:2140 -261:2:2141 -262:2:2152 -263:2:2153 -264:2:2154 -265:2:2165 -266:2:2170 -267:2:2171 -268:0:3013 -269:2:2183 -270:0:3013 -271:2:2184 -272:2:2188 -273:2:2189 -274:2:2197 -275:2:2198 -276:2:2202 -277:2:2203 -278:2:2211 -279:2:2216 -280:2:2220 -281:2:2221 -282:2:2228 -283:2:2229 -284:2:2240 -285:2:2241 -286:2:2242 -287:2:2253 -288:2:2258 -289:2:2259 -290:0:3013 -291:2:2271 -292:0:3013 -293:2:2274 -294:2:2275 -295:2:2287 -296:2:2288 -297:2:2292 -298:2:2293 -299:2:2301 -300:2:2306 -301:2:2310 -302:2:2311 -303:2:2318 -304:2:2319 -305:2:2330 -306:2:2331 -307:2:2332 -308:2:2343 -309:2:2348 -310:2:2349 -311:0:3013 -312:2:2361 -313:0:3013 -314:2:2362 -315:0:3013 -316:2:2363 -317:0:3013 -318:2:2364 -319:0:3013 -320:2:2365 -321:2:2369 -322:2:2370 -323:2:2378 -324:2:2379 -325:2:2383 -326:2:2384 -327:2:2392 -328:2:2397 -329:2:2401 -330:2:2402 -331:2:2409 -332:2:2410 -333:2:2421 -334:2:2422 -335:2:2423 -336:2:2434 -337:2:2439 -338:2:2440 -339:0:3013 -340:2:2650 -341:0:3013 -342:2:2746 -343:0:3013 -344:2:2747 -345:0:3013 -346:2:2751 -347:0:3013 -348:2:2757 -349:0:3013 -350:2:2761 -351:2:2762 -352:2:2766 -353:2:2770 -354:2:2771 -355:2:2775 -356:2:2783 -357:2:2784 -358:2:2789 -359:2:2796 -360:2:2797 -361:2:2804 -362:2:2809 -363:0:3013 -364:2:2820 -365:0:3013 -366:2:2824 -367:2:2825 -368:2:2829 -369:2:2833 -370:2:2834 -371:2:2838 -372:2:2846 -373:2:2847 -374:2:2852 -375:2:2859 -376:2:2860 -377:2:2867 -378:2:2872 -379:0:3013 -380:2:2883 -381:0:3013 -382:2:2891 -383:2:2892 -384:2:2896 -385:2:2900 -386:2:2901 -387:2:2905 -388:2:2913 -389:2:2914 -390:2:2919 -391:2:2926 -392:2:2927 -393:2:2934 -394:2:2939 -395:0:3013 -396:2:2954 -397:0:3013 -398:2:2955 -399:0:3013 -400:2:1133 -401:0:3013 -402:2:1134 -403:2:1138 -404:2:1139 -405:2:1147 -406:2:1148 -407:2:1152 -408:2:1153 -409:2:1161 -410:2:1166 -411:2:1170 -412:2:1171 -413:2:1178 -414:2:1179 -415:2:1190 -416:2:1191 -417:2:1192 -418:2:1203 -419:2:1208 -420:2:1209 -421:0:3013 -422:2:1221 -423:2:1222 -424:0:3013 -425:2:1226 -426:2:1230 -427:2:1231 -428:2:1239 -429:2:1240 -430:2:1244 -431:2:1245 -432:2:1253 -433:2:1258 -434:2:1259 -435:2:1270 -436:2:1271 -437:2:1282 -438:2:1283 -439:2:1284 -440:2:1295 -441:2:1300 -442:2:1301 -443:0:3013 -444:2:1313 -445:0:3013 -446:2:1314 -447:0:3013 -448:2:1324 -449:0:3013 -450:2:1325 -451:0:3013 -452:2:1329 -453:2:1330 -454:2:1334 -455:2:1338 -456:2:1339 -457:2:1343 -458:2:1351 -459:2:1352 -460:2:1357 -461:2:1364 -462:2:1365 -463:2:1372 -464:2:1377 -465:0:3013 -466:2:1388 -467:0:3013 -468:2:1392 -469:2:1393 -470:2:1397 -471:2:1401 -472:2:1402 -473:2:1406 -474:2:1414 -475:2:1415 -476:2:1420 -477:2:1427 -478:2:1428 -479:2:1435 -480:2:1440 -481:0:3013 -482:2:1451 -483:0:3013 -484:2:1459 -485:2:1460 -486:2:1464 -487:2:1468 -488:2:1469 -489:2:1473 -490:2:1481 -491:2:1482 -492:2:1487 -493:2:1494 -494:2:1495 -495:2:1502 -496:2:1507 -497:0:3013 -498:2:1522 -499:0:3013 -500:2:1523 -501:2:1527 -502:2:1528 -503:2:1536 -504:2:1537 -505:2:1541 -506:2:1542 -507:2:1550 -508:2:1555 -509:2:1559 -510:2:1560 -511:2:1567 -512:2:1568 -513:2:1579 -514:2:1580 -515:2:1581 -516:2:1592 -517:2:1597 -518:2:1598 -519:0:3013 -520:2:1610 -521:0:3013 -522:2:1613 -523:2:1614 -524:2:1626 -525:2:1627 -526:2:1631 -527:2:1632 -528:2:1640 -529:2:1645 -530:2:1649 -531:2:1650 -532:2:1657 -533:2:1658 -534:2:1669 -535:2:1670 -536:2:1671 -537:2:1682 -538:2:1687 -539:2:1688 -540:0:3013 -541:2:1700 -542:0:3013 -543:2:1701 -544:0:3013 -545:2:1702 -546:0:3013 -547:2:1703 -548:0:3013 -549:2:1704 -550:2:1708 -551:2:1709 -552:2:1717 -553:2:1718 -554:2:1722 -555:2:1723 -556:2:1731 -557:2:1736 -558:2:1740 -559:2:1741 -560:2:1748 -561:2:1749 -562:2:1760 -563:2:1761 -564:2:1762 -565:2:1773 -566:2:1778 -567:2:1779 -568:0:3013 -569:2:1989 -570:0:3013 -571:2:2085 -572:0:3013 -573:2:2086 -574:0:3013 -575:2:2090 -576:0:3013 -577:2:2096 -578:2:2100 -579:2:2101 -580:2:2109 -581:2:2110 -582:2:2114 -583:2:2115 -584:2:2123 -585:2:2128 -586:2:2132 -587:2:2133 -588:2:2140 -589:2:2141 -590:2:2152 -591:2:2153 -592:2:2154 -593:2:2165 -594:2:2170 -595:2:2171 -596:0:3013 -597:2:2183 -598:0:3013 -599:2:2184 -600:2:2188 -601:2:2189 -602:2:2197 -603:2:2198 -604:2:2202 -605:2:2203 -606:2:2211 -607:2:2216 -608:2:2220 -609:2:2221 -610:2:2228 -611:2:2229 -612:2:2240 -613:2:2241 -614:2:2242 -615:2:2253 -616:2:2258 -617:2:2259 -618:0:3013 -619:2:2271 -620:0:3013 -621:2:2274 -622:2:2275 -623:2:2287 -624:2:2288 -625:2:2292 -626:2:2293 -627:2:2301 -628:2:2306 -629:2:2310 -630:2:2311 -631:2:2318 -632:2:2319 -633:2:2330 -634:2:2331 -635:2:2332 -636:2:2343 -637:2:2348 -638:2:2349 -639:0:3013 -640:2:2361 -641:0:3013 -642:2:2362 -643:0:3013 -644:2:2363 -645:0:3013 -646:2:2364 -647:0:3013 -648:2:2365 -649:2:2369 -650:2:2370 -651:2:2378 -652:2:2379 -653:2:2383 -654:2:2384 -655:2:2392 -656:2:2397 -657:2:2401 -658:2:2402 -659:2:2409 -660:2:2410 -661:2:2421 -662:2:2422 -663:2:2423 -664:2:2434 -665:2:2439 -666:2:2440 -667:0:3013 -668:2:2650 -669:0:3013 -670:2:2746 -671:0:3013 -672:2:2747 -673:0:3013 -674:2:2751 -675:0:3013 -676:2:2757 -677:0:3013 -678:2:2761 -679:2:2762 -680:2:2766 -681:2:2770 -682:2:2771 -683:2:2775 -684:2:2783 -685:2:2784 -686:2:2789 -687:2:2796 -688:2:2797 -689:2:2804 -690:2:2809 -691:0:3013 -692:2:2820 -693:0:3013 -694:2:2824 -695:2:2825 -696:2:2829 -697:2:2833 -698:2:2834 -699:2:2838 -700:2:2846 -701:2:2847 -702:2:2852 -703:2:2859 -704:2:2860 -705:2:2867 -706:2:2872 -707:0:3013 -708:2:2883 -709:0:3013 -710:2:2891 -711:2:2892 -712:2:2896 -713:2:2900 -714:2:2901 -715:2:2905 -716:2:2913 -717:2:2914 -718:2:2919 -719:2:2926 -720:2:2927 -721:2:2934 -722:2:2939 -723:0:3013 -724:2:2954 -725:0:3013 -726:2:2955 -727:0:3013 -728:2:1133 -729:0:3013 -730:2:1134 -731:2:1138 -732:2:1139 -733:2:1147 -734:2:1148 -735:2:1152 -736:2:1153 -737:2:1161 -738:2:1166 -739:2:1170 -740:2:1171 -741:2:1178 -742:2:1179 -743:2:1190 -744:2:1191 -745:2:1192 -746:2:1203 -747:2:1208 -748:2:1209 -749:0:3013 -750:2:1221 -751:2:1222 -752:0:3013 -753:2:1226 -754:2:1230 -755:2:1231 -756:2:1239 -757:2:1240 -758:2:1244 -759:2:1245 -760:2:1253 -761:2:1258 -762:2:1259 -763:2:1270 -764:2:1271 -765:2:1282 -766:2:1283 -767:2:1284 -768:2:1295 -769:2:1300 -770:2:1301 -771:0:3013 -772:2:1313 -773:0:3013 -774:2:1314 -775:0:3013 -776:2:1324 -777:0:3013 -778:2:1325 -779:0:3013 -780:2:1329 -781:2:1330 -782:2:1334 -783:2:1338 -784:2:1339 -785:2:1343 -786:2:1351 -787:2:1352 -788:2:1357 -789:2:1364 -790:2:1365 -791:2:1372 -792:2:1377 -793:0:3013 -794:2:1388 -795:0:3013 -796:2:1392 -797:2:1393 -798:2:1397 -799:2:1401 -800:2:1402 -801:2:1406 -802:2:1414 -803:2:1415 -804:2:1420 -805:2:1427 -806:2:1428 -807:2:1435 -808:2:1440 -809:0:3013 -810:2:1451 -811:0:3013 -812:2:1459 -813:2:1460 -814:2:1464 -815:2:1468 -816:2:1469 -817:2:1473 -818:2:1481 -819:2:1482 -820:2:1487 -821:2:1494 -822:2:1495 -823:2:1502 -824:2:1507 -825:0:3013 -826:2:1522 -827:0:3013 -828:2:1523 -829:2:1527 -830:2:1528 -831:2:1536 -832:2:1537 -833:2:1541 -834:2:1542 -835:2:1550 -836:2:1555 -837:2:1559 -838:2:1560 -839:2:1567 -840:2:1568 -841:2:1579 -842:2:1580 -843:2:1581 -844:2:1592 -845:2:1597 -846:2:1598 -847:0:3013 -848:2:1610 -849:0:3013 -850:2:1613 -851:2:1614 -852:2:1626 -853:2:1627 -854:2:1631 -855:2:1632 -856:2:1640 -857:2:1645 -858:2:1649 -859:2:1650 -860:2:1657 -861:2:1658 -862:2:1669 -863:2:1670 -864:2:1671 -865:2:1682 -866:2:1687 -867:2:1688 -868:0:3013 -869:2:1700 -870:0:3013 -871:2:1701 -872:0:3013 -873:2:1702 -874:0:3013 -875:2:1703 -876:0:3013 -877:2:1704 -878:2:1708 -879:2:1709 -880:2:1717 -881:2:1718 -882:2:1722 -883:2:1723 -884:2:1731 -885:2:1736 -886:2:1740 -887:2:1741 -888:2:1748 -889:2:1749 -890:2:1760 -891:2:1761 -892:2:1762 -893:2:1773 -894:2:1778 -895:2:1779 -896:0:3013 -897:2:1989 -898:0:3013 -899:2:2085 -900:0:3013 -901:2:2086 -902:0:3013 -903:2:2090 -904:0:3013 -905:2:2096 -906:2:2100 -907:2:2101 -908:2:2109 -909:2:2110 -910:2:2114 -911:2:2115 -912:2:2123 -913:2:2128 -914:2:2132 -915:2:2133 -916:2:2140 -917:2:2141 -918:2:2152 -919:2:2153 -920:2:2154 -921:2:2165 -922:2:2170 -923:2:2171 -924:0:3013 -925:2:2183 -926:0:3013 -927:2:2184 -928:2:2188 -929:2:2189 -930:2:2197 -931:2:2198 -932:2:2202 -933:2:2203 -934:2:2211 -935:2:2216 -936:2:2220 -937:2:2221 -938:2:2228 -939:2:2229 -940:2:2240 -941:2:2241 -942:2:2242 -943:2:2253 -944:2:2258 -945:2:2259 -946:0:3013 -947:2:2271 -948:0:3013 -949:2:2274 -950:2:2275 -951:2:2287 -952:2:2288 -953:2:2292 -954:2:2293 -955:2:2301 -956:2:2306 -957:2:2310 -958:2:2311 -959:2:2318 -960:2:2319 -961:2:2330 -962:2:2331 -963:2:2332 -964:2:2343 -965:2:2348 -966:2:2349 -967:0:3013 -968:2:2361 -969:0:3013 -970:2:2362 -971:0:3013 -972:2:2363 -973:0:3013 -974:2:2364 -975:0:3013 -976:2:2365 -977:2:2369 -978:2:2370 -979:2:2378 -980:2:2379 -981:2:2383 -982:2:2384 -983:2:2392 -984:2:2397 -985:2:2401 -986:2:2402 -987:2:2409 -988:2:2410 -989:2:2421 -990:2:2422 -991:2:2423 -992:2:2434 -993:2:2439 -994:2:2440 -995:0:3013 -996:2:2650 -997:0:3013 -998:2:2746 -999:0:3013 -1000:2:2747 -1001:0:3013 -1002:2:2751 -1003:0:3013 -1004:2:2757 -1005:0:3013 -1006:2:2761 -1007:2:2762 -1008:2:2766 -1009:2:2770 -1010:2:2771 -1011:2:2775 -1012:2:2783 -1013:2:2784 -1014:2:2789 -1015:2:2796 -1016:2:2797 -1017:2:2804 -1018:2:2809 -1019:0:3013 -1020:2:2820 -1021:0:3013 -1022:2:2824 -1023:2:2825 -1024:2:2829 -1025:2:2833 -1026:2:2834 -1027:2:2838 -1028:2:2846 -1029:2:2847 -1030:2:2852 -1031:2:2859 -1032:2:2860 -1033:2:2867 -1034:2:2872 -1035:0:3013 -1036:2:2883 -1037:0:3013 -1038:2:2891 -1039:2:2892 -1040:2:2896 -1041:2:2900 -1042:2:2901 -1043:2:2905 -1044:2:2913 -1045:2:2914 -1046:2:2919 -1047:2:2926 -1048:2:2927 -1049:2:2934 -1050:2:2939 -1051:0:3013 -1052:2:2954 -1053:0:3013 -1054:2:2955 -1055:0:3013 -1056:2:1133 -1057:0:3013 -1058:2:1134 -1059:2:1138 -1060:2:1139 -1061:2:1147 -1062:2:1148 -1063:2:1152 -1064:2:1153 -1065:2:1161 -1066:2:1166 -1067:2:1170 -1068:2:1171 -1069:2:1178 -1070:2:1179 -1071:2:1190 -1072:2:1191 -1073:2:1192 -1074:2:1203 -1075:2:1208 -1076:2:1209 -1077:0:3013 -1078:2:1221 -1079:2:1222 -1080:0:3013 -1081:2:1226 -1082:2:1230 -1083:2:1231 -1084:2:1239 -1085:2:1240 -1086:2:1244 -1087:2:1245 -1088:2:1253 -1089:2:1258 -1090:2:1259 -1091:2:1270 -1092:2:1271 -1093:2:1282 -1094:2:1283 -1095:2:1284 -1096:2:1295 -1097:2:1300 -1098:2:1301 -1099:0:3013 -1100:2:1313 -1101:0:3013 -1102:2:1314 -1103:0:3013 -1104:2:1324 -1105:0:3013 -1106:2:1325 -1107:0:3013 -1108:2:1329 -1109:2:1330 -1110:2:1334 -1111:2:1338 -1112:2:1339 -1113:2:1343 -1114:2:1351 -1115:2:1352 -1116:2:1357 -1117:2:1364 -1118:2:1365 -1119:2:1372 -1120:2:1377 -1121:0:3013 -1122:2:1388 -1123:0:3013 -1124:2:1392 -1125:2:1393 -1126:2:1397 -1127:2:1401 -1128:2:1402 -1129:2:1406 -1130:2:1414 -1131:2:1415 -1132:2:1420 -1133:2:1427 -1134:2:1428 -1135:2:1435 -1136:2:1440 -1137:0:3013 -1138:2:1451 -1139:0:3013 -1140:2:1459 -1141:2:1460 -1142:2:1464 -1143:2:1468 -1144:2:1469 -1145:2:1473 -1146:2:1481 -1147:2:1482 -1148:2:1487 -1149:2:1494 -1150:2:1495 -1151:2:1502 -1152:2:1507 -1153:0:3013 -1154:2:1522 -1155:0:3013 -1156:2:1523 -1157:2:1527 -1158:2:1528 -1159:2:1536 -1160:2:1537 -1161:2:1541 -1162:2:1542 -1163:2:1550 -1164:2:1555 -1165:2:1559 -1166:2:1560 -1167:2:1567 -1168:2:1568 -1169:2:1579 -1170:2:1580 -1171:2:1581 -1172:2:1592 -1173:2:1597 -1174:2:1598 -1175:0:3013 -1176:2:1610 -1177:0:3013 -1178:2:1613 -1179:2:1614 -1180:2:1626 -1181:2:1627 -1182:2:1631 -1183:2:1632 -1184:2:1640 -1185:2:1645 -1186:2:1649 -1187:2:1650 -1188:2:1657 -1189:2:1658 -1190:2:1669 -1191:2:1670 -1192:2:1671 -1193:2:1682 -1194:2:1687 -1195:2:1688 -1196:0:3013 -1197:2:1700 -1198:0:3013 -1199:2:1701 -1200:0:3013 -1201:2:1702 -1202:0:3013 -1203:2:1703 -1204:0:3013 -1205:2:1704 -1206:2:1708 -1207:2:1709 -1208:2:1717 -1209:2:1718 -1210:2:1722 -1211:2:1723 -1212:2:1731 -1213:2:1736 -1214:2:1740 -1215:2:1741 -1216:2:1748 -1217:2:1749 -1218:2:1760 -1219:2:1761 -1220:2:1762 -1221:2:1773 -1222:2:1778 -1223:2:1779 -1224:0:3013 -1225:2:1989 -1226:0:3013 -1227:2:2085 -1228:0:3013 -1229:2:2086 -1230:0:3013 -1231:2:2090 -1232:0:3013 -1233:2:2096 -1234:2:2100 -1235:2:2101 -1236:2:2109 -1237:2:2110 -1238:2:2114 -1239:2:2115 -1240:2:2123 -1241:2:2128 -1242:2:2132 -1243:2:2133 -1244:2:2140 -1245:2:2141 -1246:2:2152 -1247:2:2153 -1248:2:2154 -1249:2:2165 -1250:2:2170 -1251:2:2171 -1252:0:3013 -1253:2:2183 -1254:0:3013 -1255:2:2184 -1256:2:2188 -1257:2:2189 -1258:2:2197 -1259:2:2198 -1260:2:2202 -1261:2:2203 -1262:2:2211 -1263:2:2216 -1264:2:2220 -1265:2:2221 -1266:2:2228 -1267:2:2229 -1268:2:2240 -1269:2:2241 -1270:2:2242 -1271:2:2253 -1272:2:2258 -1273:2:2259 -1274:0:3013 -1275:2:2271 -1276:0:3013 -1277:2:2274 -1278:2:2275 -1279:2:2287 -1280:2:2288 -1281:2:2292 -1282:2:2293 -1283:2:2301 -1284:2:2306 -1285:2:2310 -1286:2:2311 -1287:2:2318 -1288:2:2319 -1289:2:2330 -1290:2:2331 -1291:2:2332 -1292:2:2343 -1293:2:2348 -1294:2:2349 -1295:0:3013 -1296:2:2361 -1297:0:3013 -1298:2:2362 -1299:0:3013 -1300:2:2363 -1301:0:3013 -1302:2:2364 -1303:0:3013 -1304:2:2365 -1305:2:2369 -1306:2:2370 -1307:2:2378 -1308:2:2379 -1309:2:2383 -1310:2:2384 -1311:2:2392 -1312:2:2397 -1313:2:2401 -1314:2:2402 -1315:2:2409 -1316:2:2410 -1317:2:2421 -1318:2:2422 -1319:2:2423 -1320:2:2434 -1321:2:2439 -1322:2:2440 -1323:0:3013 -1324:2:2650 -1325:0:3013 -1326:2:2746 -1327:0:3013 -1328:2:2747 -1329:0:3013 -1330:2:2751 -1331:0:3013 -1332:2:2757 -1333:0:3013 -1334:2:2761 -1335:2:2762 -1336:2:2766 -1337:2:2770 -1338:2:2771 -1339:2:2775 -1340:2:2783 -1341:2:2784 -1342:2:2789 -1343:2:2796 -1344:2:2797 -1345:2:2804 -1346:2:2809 -1347:0:3013 -1348:2:2820 -1349:0:3013 -1350:2:2824 -1351:2:2825 -1352:2:2829 -1353:2:2833 -1354:2:2834 -1355:2:2838 -1356:2:2846 -1357:2:2847 -1358:2:2852 -1359:2:2859 -1360:2:2860 -1361:2:2867 -1362:2:2872 -1363:0:3013 -1364:2:2883 -1365:0:3013 -1366:2:2891 -1367:2:2892 -1368:2:2896 -1369:2:2900 -1370:2:2901 -1371:2:2905 -1372:2:2913 -1373:2:2914 -1374:2:2919 -1375:2:2926 -1376:2:2927 -1377:2:2934 -1378:2:2939 -1379:0:3013 -1380:2:2954 -1381:0:3013 -1382:2:2955 -1383:0:3013 -1384:2:1133 -1385:0:3013 -1386:2:1134 -1387:2:1138 -1388:2:1139 -1389:2:1147 -1390:2:1148 -1391:2:1152 -1392:2:1153 -1393:2:1161 -1394:2:1166 -1395:2:1170 -1396:2:1171 -1397:2:1178 -1398:2:1179 -1399:2:1190 -1400:2:1191 -1401:2:1192 -1402:2:1203 -1403:2:1208 -1404:2:1209 -1405:0:3013 -1406:2:1221 -1407:2:1222 -1408:0:3013 -1409:2:1226 -1410:2:1230 -1411:2:1231 -1412:2:1239 -1413:2:1240 -1414:2:1244 -1415:2:1245 -1416:2:1253 -1417:2:1258 -1418:2:1259 -1419:2:1270 -1420:2:1271 -1421:2:1282 -1422:2:1283 -1423:2:1284 -1424:2:1295 -1425:2:1300 -1426:2:1301 -1427:0:3013 -1428:2:1313 -1429:0:3013 -1430:2:1314 -1431:0:3013 -1432:2:1324 -1433:0:3013 -1434:2:1325 -1435:0:3013 -1436:2:1329 -1437:2:1330 -1438:2:1334 -1439:2:1338 -1440:2:1339 -1441:2:1343 -1442:2:1351 -1443:2:1352 -1444:2:1357 -1445:2:1364 -1446:2:1365 -1447:2:1372 -1448:2:1377 -1449:0:3013 -1450:2:1388 -1451:0:3013 -1452:1:4 -1453:1:8 -1454:1:9 -1455:1:17 -1456:1:18 -1457:1:22 -1458:1:23 -1459:1:31 -1460:1:36 -1461:1:40 -1462:1:41 -1463:1:48 -1464:1:49 -1465:1:60 -1466:1:61 -1467:1:62 -1468:1:73 -1469:1:85 -1470:1:86 -1471:0:3013 -1472:1:91 -1473:0:3013 -1474:1:92 -1475:1:96 -1476:1:97 -1477:1:105 -1478:1:106 -1479:1:110 -1480:1:111 -1481:1:119 -1482:1:124 -1483:1:128 -1484:1:129 -1485:1:136 -1486:1:137 -1487:1:148 -1488:1:149 -1489:1:150 -1490:1:161 -1491:1:173 -1492:1:174 -1493:0:3013 -1494:1:179 -1495:0:3013 -1496:1:180 -1497:0:3013 -1498:1:181 -1499:1:185 -1500:1:186 -1501:1:194 -1502:1:195 -1503:1:199 -1504:1:200 -1505:1:208 -1506:1:213 -1507:1:217 -1508:1:218 -1509:1:225 -1510:1:226 -1511:1:237 -1512:1:238 -1513:1:239 -1514:1:250 -1515:1:262 -1516:1:263 -1517:0:3013 -1518:1:268 -1519:0:3013 -1520:1:469 -1521:0:3013 -1522:1:470 -1523:0:3013 -1524:1:3 -1525:0:3013 -1526:1:4 -1527:1:8 -1528:1:9 -1529:1:17 -1530:1:18 -1531:1:19 -1532:1:31 -1533:1:36 -1534:1:40 -1535:1:41 -1536:1:48 -1537:1:49 -1538:1:60 -1539:1:61 -1540:1:62 -1541:1:73 -1542:1:85 -1543:1:86 -1544:0:3013 -1545:1:91 -1546:0:3013 -1547:1:92 -1548:1:96 -1549:1:97 -1550:1:105 -1551:1:106 -1552:1:110 -1553:1:111 -1554:1:119 -1555:1:124 -1556:1:128 -1557:1:129 -1558:1:136 -1559:1:137 -1560:1:148 -1561:1:149 -1562:1:150 -1563:1:161 -1564:1:173 -1565:1:174 -1566:0:3013 -1567:1:271 -1568:0:3013 -1569:1:272 -1570:0:3013 -1571:1:469 -1572:0:3013 -1573:1:470 -1574:0:3013 -1575:1:475 -1576:0:3013 -1577:1:480 -1578:1:484 -1579:1:485 -1580:1:493 -1581:1:494 -1582:1:495 -1583:1:507 -1584:1:512 -1585:1:516 -1586:1:517 -1587:1:524 -1588:1:525 -1589:1:536 -1590:1:537 -1591:1:538 -1592:1:549 -1593:1:561 -1594:1:562 -1595:0:3013 -1596:1:567 -1597:0:3013 -1598:2:1392 -1599:2:1393 -1600:2:1397 -1601:2:1401 -1602:2:1402 -1603:2:1406 -1604:2:1414 -1605:2:1415 -1606:2:1420 -1607:2:1427 -1608:2:1428 -1609:2:1435 -1610:2:1440 -1611:0:3013 -1612:2:1451 -1613:0:3013 -1614:2:1459 -1615:2:1460 -1616:2:1464 -1617:2:1468 -1618:2:1469 -1619:2:1473 -1620:2:1481 -1621:2:1482 -1622:2:1487 -1623:2:1494 -1624:2:1495 -1625:2:1502 -1626:2:1507 -1627:0:3013 -1628:3:2996 -1629:0:3013 -1630:3:2997 -1631:0:3013 -1632:3:2998 -1633:0:3013 -1634:3:2999 -1635:0:3013 -1636:3:3005 -1637:0:3013 -1638:3:3010 -1639:0:3013 -1640:2:1522 -1641:0:3013 -1642:2:1523 -1643:2:1527 -1644:2:1528 -1645:2:1536 -1646:2:1537 -1647:2:1541 -1648:2:1542 -1649:2:1550 -1650:2:1555 -1651:2:1559 -1652:2:1560 -1653:2:1567 -1654:2:1568 -1655:2:1579 -1656:2:1587 -1657:2:1588 -1658:2:1592 -1659:2:1597 -1660:2:1598 -1661:0:3013 -1662:2:1610 -1663:0:3013 -1664:2:1613 -1665:2:1614 -1666:2:1626 -1667:2:1627 -1668:2:1631 -1669:2:1632 -1670:2:1640 -1671:2:1645 -1672:2:1649 -1673:2:1650 -1674:2:1657 -1675:2:1658 -1676:2:1669 -1677:2:1677 -1678:2:1678 -1679:2:1682 -1680:2:1687 -1681:2:1688 -1682:0:3013 -1683:2:1700 -1684:0:3013 -1685:2:1701 -1686:0:3013 -1687:2:1702 -1688:0:3013 -1689:2:1703 -1690:0:3013 -1691:2:1704 -1692:2:1708 -1693:2:1709 -1694:2:1717 -1695:2:1718 -1696:2:1722 -1697:2:1723 -1698:2:1731 -1699:2:1736 -1700:2:1740 -1701:2:1741 -1702:2:1748 -1703:2:1749 -1704:2:1760 -1705:2:1761 -1706:2:1762 -1707:2:1773 -1708:2:1778 -1709:2:1779 -1710:0:3013 -1711:2:1989 -1712:0:3013 -1713:2:2085 -1714:0:3013 -1715:2:2086 -1716:0:3013 -1717:2:2090 -1718:0:3013 -1719:2:2096 -1720:2:2100 -1721:2:2101 -1722:2:2109 -1723:2:2110 -1724:2:2114 -1725:2:2115 -1726:2:2123 -1727:2:2128 -1728:2:2132 -1729:2:2133 -1730:2:2140 -1731:2:2141 -1732:2:2152 -1733:2:2153 -1734:2:2154 -1735:2:2165 -1736:2:2170 -1737:2:2171 -1738:0:3013 -1739:2:2183 -1740:0:3013 -1741:2:2184 -1742:2:2188 -1743:2:2189 -1744:2:2197 -1745:2:2198 -1746:2:2202 -1747:2:2203 -1748:2:2211 -1749:2:2216 -1750:2:2220 -1751:2:2221 -1752:2:2228 -1753:2:2229 -1754:2:2240 -1755:2:2241 -1756:2:2242 -1757:2:2253 -1758:2:2258 -1759:2:2259 -1760:0:3013 -1761:2:2271 -1762:0:3013 -1763:2:2274 -1764:2:2275 -1765:2:2287 -1766:2:2288 -1767:2:2292 -1768:2:2293 -1769:2:2301 -1770:2:2306 -1771:2:2310 -1772:2:2311 -1773:2:2318 -1774:2:2319 -1775:2:2330 -1776:2:2331 -1777:2:2332 -1778:2:2343 -1779:2:2348 -1780:2:2349 -1781:0:3013 -1782:2:2361 -1783:0:3013 -1784:2:2362 -1785:0:3013 -1786:2:2363 -1787:0:3013 -1788:2:2364 -1789:0:3013 -1790:2:2365 -1791:2:2369 -1792:2:2370 -1793:2:2378 -1794:2:2379 -1795:2:2383 -1796:2:2384 -1797:2:2392 -1798:2:2397 -1799:2:2401 -1800:2:2402 -1801:2:2409 -1802:2:2410 -1803:2:2421 -1804:2:2422 -1805:2:2423 -1806:2:2434 -1807:2:2439 -1808:2:2440 -1809:0:3013 -1810:2:2650 -1811:0:3013 -1812:2:2746 -1813:0:3013 -1814:2:2747 -1815:0:3013 -1816:2:2751 -1817:0:3013 -1818:2:2757 -1819:0:3013 -1820:2:2761 -1821:2:2762 -1822:2:2766 -1823:2:2770 -1824:2:2771 -1825:2:2775 -1826:2:2783 -1827:2:2784 -1828:2:2789 -1829:2:2796 -1830:2:2797 -1831:2:2804 -1832:2:2809 -1833:0:3013 -1834:2:2820 -1835:0:3013 -1836:2:2824 -1837:2:2825 -1838:2:2829 -1839:2:2833 -1840:2:2834 -1841:2:2838 -1842:2:2846 -1843:2:2847 -1844:2:2852 -1845:2:2859 -1846:2:2860 -1847:2:2867 -1848:2:2872 -1849:0:3013 -1850:2:2883 -1851:0:3013 -1852:2:2891 -1853:2:2892 -1854:2:2896 -1855:2:2900 -1856:2:2901 -1857:2:2905 -1858:2:2913 -1859:2:2914 -1860:2:2919 -1861:2:2926 -1862:2:2927 -1863:2:2934 -1864:2:2939 -1865:0:3013 -1866:2:2954 -1867:0:3013 -1868:2:2955 -1869:0:3013 -1870:2:2958 -1871:0:3013 -1872:2:2963 -1873:0:3013 -1874:1:568 -1875:1:572 -1876:1:573 -1877:1:581 -1878:1:582 -1879:1:586 -1880:1:587 -1881:1:595 -1882:1:600 -1883:1:604 -1884:1:605 -1885:1:612 -1886:1:613 -1887:1:624 -1888:1:625 -1889:1:626 -1890:1:637 -1891:1:642 -1892:1:643 -1893:0:3013 -1894:2:2964 -1895:0:3013 -1896:1:655 -1897:0:3011 -1898:2:2963 -1899:0:3017 -1900:1:655 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_nested.define b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_nested.define deleted file mode 100644 index e69de29..0000000 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_nested.log b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_nested.log deleted file mode 100644 index 708dee2..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_nested.log +++ /dev/null @@ -1,415 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_nested.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 566) -Depth= 4234 States= 1e+06 Transitions= 1.7e+07 Memory= 527.287 t= 31.2 R= 3e+04 -Depth= 4234 States= 2e+06 Transitions= 3.44e+07 Memory= 588.322 t= 63.7 R= 3e+04 -Depth= 4234 States= 3e+06 Transitions= 5.2e+07 Memory= 649.358 t= 96.8 R= 3e+04 -pan: resizing hashtable to -w22.. done -Depth= 4234 States= 4e+06 Transitions= 6.97e+07 Memory= 741.416 t= 130 R= 3e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 4234, errors: 0 - 4027146 states, stored - 66145121 states, matched - 70172267 transitions (= stored+matched) -2.6437688e+08 atomic steps -hash conflicts: 47318190 (resolved) - -Stats on memory usage (in Megabytes): - 322.609 equivalent memory usage for states (stored*(State-vector + overhead)) - 253.418 actual memory usage for states (compression: 78.55%) - state-vector as stored = 38 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 743.076 total actual memory usage - -unreached in proctype urcu_reader - line 288, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 61, "(1)" - line 307, "pan.___", state 91, "(1)" - line 288, "pan.___", state 104, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 136, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 149, "(1)" - line 307, "pan.___", state 179, "(1)" - line 288, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 225, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 238, "(1)" - line 307, "pan.___", state 268, "(1)" - line 158, "pan.___", state 289, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 158, "pan.___", state 291, "(1)" - line 162, "pan.___", state 298, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 300, "(1)" - line 162, "pan.___", state 301, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 162, "pan.___", state 301, "else" - line 160, "pan.___", state 306, "((j<1))" - line 160, "pan.___", state 306, "((j>=1))" - line 166, "pan.___", state 311, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 321, "(1)" - line 147, "pan.___", state 329, "(1)" - line 147, "pan.___", state 330, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 147, "pan.___", state 330, "else" - line 145, "pan.___", state 335, "((j<1))" - line 145, "pan.___", state 335, "((j>=1))" - line 151, "pan.___", state 341, "(1)" - line 151, "pan.___", state 342, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 151, "pan.___", state 342, "else" - line 153, "pan.___", state 345, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 153, "pan.___", state 345, "else" - line 185, "pan.___", state 347, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 185, "pan.___", state 347, "else" - line 158, "pan.___", state 352, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 166, "pan.___", state 374, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 151, "pan.___", state 404, "(1)" - line 151, "pan.___", state 405, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 158, "pan.___", state 419, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 158, "pan.___", state 421, "(1)" - line 162, "pan.___", state 428, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 430, "(1)" - line 162, "pan.___", state 431, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 162, "pan.___", state 431, "else" - line 160, "pan.___", state 436, "((j<1))" - line 160, "pan.___", state 436, "((j>=1))" - line 166, "pan.___", state 441, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 451, "(1)" - line 147, "pan.___", state 459, "(1)" - line 147, "pan.___", state 460, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 147, "pan.___", state 460, "else" - line 145, "pan.___", state 465, "((j<1))" - line 145, "pan.___", state 465, "((j>=1))" - line 151, "pan.___", state 471, "(1)" - line 151, "pan.___", state 472, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 151, "pan.___", state 472, "else" - line 153, "pan.___", state 475, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 153, "pan.___", state 475, "else" - line 185, "pan.___", state 477, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 185, "pan.___", state 477, "else" - line 288, "pan.___", state 492, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 524, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 537, "(1)" - line 307, "pan.___", state 567, "(1)" - line 288, "pan.___", state 580, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 612, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 625, "(1)" - line 307, "pan.___", state 655, "(1)" - line 288, "pan.___", state 668, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 713, "(1)" - line 307, "pan.___", state 743, "(1)" - line 158, "pan.___", state 758, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 158, "pan.___", state 760, "(1)" - line 162, "pan.___", state 767, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 769, "(1)" - line 162, "pan.___", state 770, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 162, "pan.___", state 770, "else" - line 160, "pan.___", state 775, "((j<1))" - line 160, "pan.___", state 775, "((j>=1))" - line 166, "pan.___", state 780, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 790, "(1)" - line 147, "pan.___", state 798, "(1)" - line 147, "pan.___", state 799, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 147, "pan.___", state 799, "else" - line 145, "pan.___", state 804, "((j<1))" - line 145, "pan.___", state 804, "((j>=1))" - line 151, "pan.___", state 810, "(1)" - line 151, "pan.___", state 811, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 151, "pan.___", state 811, "else" - line 153, "pan.___", state 814, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 153, "pan.___", state 814, "else" - line 185, "pan.___", state 816, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 185, "pan.___", state 816, "else" - line 158, "pan.___", state 821, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 166, "pan.___", state 843, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 151, "pan.___", state 873, "(1)" - line 151, "pan.___", state 874, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 158, "pan.___", state 888, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 158, "pan.___", state 890, "(1)" - line 162, "pan.___", state 897, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 899, "(1)" - line 162, "pan.___", state 900, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 162, "pan.___", state 900, "else" - line 160, "pan.___", state 905, "((j<1))" - line 160, "pan.___", state 905, "((j>=1))" - line 166, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 920, "(1)" - line 147, "pan.___", state 928, "(1)" - line 147, "pan.___", state 929, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 147, "pan.___", state 929, "else" - line 145, "pan.___", state 934, "((j<1))" - line 145, "pan.___", state 934, "((j>=1))" - line 151, "pan.___", state 940, "(1)" - line 151, "pan.___", state 941, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 151, "pan.___", state 941, "else" - line 153, "pan.___", state 944, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 153, "pan.___", state 944, "else" - line 185, "pan.___", state 946, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 185, "pan.___", state 946, "else" - line 288, "pan.___", state 956, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 988, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1001, "(1)" - line 307, "pan.___", state 1031, "(1)" - line 288, "pan.___", state 1052, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1084, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1097, "(1)" - line 307, "pan.___", state 1127, "(1)" - line 433, "pan.___", state 1140, "-end-" - (125 of 1140 states) -unreached in proctype urcu_writer - line 288, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 292, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 59, "(1)" - line 302, "pan.___", state 72, "(1)" - line 307, "pan.___", state 89, "(1)" - line 288, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 292, "pan.___", state 120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 151, "(1)" - line 302, "pan.___", state 164, "(1)" - line 467, "pan.___", state 195, "(1)" - line 158, "pan.___", state 205, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 214, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 237, "(1)" - line 147, "pan.___", state 245, "(1)" - line 151, "pan.___", state 257, "(1)" - line 158, "pan.___", state 268, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 297, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 923, "(1)" - line 298, "pan.___", state 924, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 298, "pan.___", state 924, "else" - line 298, "pan.___", state 927, "(1)" - line 298, "pan.___", state 928, "(1)" - line 298, "pan.___", state 928, "(1)" - line 302, "pan.___", state 936, "(1)" - line 302, "pan.___", state 937, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 302, "pan.___", state 937, "else" - line 302, "pan.___", state 940, "(1)" - line 302, "pan.___", state 941, "(1)" - line 302, "pan.___", state 941, "(1)" - line 300, "pan.___", state 946, "((i<1))" - line 300, "pan.___", state 946, "((i>=1))" - line 307, "pan.___", state 953, "(1)" - line 307, "pan.___", state 954, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 307, "pan.___", state 954, "else" - line 307, "pan.___", state 957, "(1)" - line 307, "pan.___", state 958, "(1)" - line 307, "pan.___", state 958, "(1)" - line 309, "pan.___", state 961, "(1)" - line 309, "pan.___", state 961, "(1)" - line 292, "pan.___", state 990, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1008, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 302, "pan.___", state 1034, "(1)" - line 307, "pan.___", state 1051, "(1)" - line 292, "pan.___", state 1078, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1096, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 302, "pan.___", state 1122, "(1)" - line 307, "pan.___", state 1139, "(1)" - line 288, "pan.___", state 1156, "(1)" - line 292, "pan.___", state 1168, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1186, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 302, "pan.___", state 1212, "(1)" - line 307, "pan.___", state 1229, "(1)" - line 292, "pan.___", state 1259, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1277, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 302, "pan.___", state 1303, "(1)" - line 307, "pan.___", state 1320, "(1)" - line 162, "pan.___", state 1342, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 166, "pan.___", state 1355, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 1365, "(1)" - line 147, "pan.___", state 1373, "(1)" - line 151, "pan.___", state 1385, "(1)" - line 158, "pan.___", state 1396, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 297, "pan.___", state 1571, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1584, "(1)" - line 298, "pan.___", state 1585, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 298, "pan.___", state 1585, "else" - line 298, "pan.___", state 1588, "(1)" - line 298, "pan.___", state 1589, "(1)" - line 298, "pan.___", state 1589, "(1)" - line 302, "pan.___", state 1597, "(1)" - line 302, "pan.___", state 1598, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 302, "pan.___", state 1598, "else" - line 302, "pan.___", state 1601, "(1)" - line 302, "pan.___", state 1602, "(1)" - line 302, "pan.___", state 1602, "(1)" - line 300, "pan.___", state 1607, "((i<1))" - line 300, "pan.___", state 1607, "((i>=1))" - line 307, "pan.___", state 1614, "(1)" - line 307, "pan.___", state 1615, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 307, "pan.___", state 1615, "else" - line 307, "pan.___", state 1618, "(1)" - line 307, "pan.___", state 1619, "(1)" - line 307, "pan.___", state 1619, "(1)" - line 309, "pan.___", state 1622, "(1)" - line 309, "pan.___", state 1622, "(1)" - line 162, "pan.___", state 1646, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 166, "pan.___", state 1659, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 1669, "(1)" - line 147, "pan.___", state 1677, "(1)" - line 151, "pan.___", state 1689, "(1)" - line 158, "pan.___", state 1700, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - atomic { - if - :: get_readerid() == 0 -> -progress_reader: - skip; - :: else -> - skip; - fi; - } -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_nested.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_nested.spin.input.trail deleted file mode 100644 index 2cefe6b..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_nested.spin.input.trail +++ /dev/null @@ -1,7 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2679 -2:1:2673 -3:1:2674 -4:0:2679 -5:3:1129 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_mb.define b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_mb.define deleted file mode 100644 index 136ef67..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_mb.define +++ /dev/null @@ -1,2 +0,0 @@ -#define NO_RMB -#define NO_WMB diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_mb.log b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_mb.log deleted file mode 100644 index c722840..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_mb.log +++ /dev/null @@ -1,16 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_mb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -spin: line 291 "pan.___", Error: syntax error saw 'operator: =' -spin: line 291 "pan.___", Error: syntax error saw 'operator: =' -spin: 2 error(s) - aborting -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input deleted file mode 100644 index 1346c4e..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input +++ /dev/null @@ -1,533 +0,0 @@ -#define NO_RMB -#define NO_WMB - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - - -#if (NR_READERS == 1) - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#elif (NR_READERS == 2) - -#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) -#define read_free (free_done && (data_access[0] || data_access[1])) - -#else - -#error "Too many readers" - -#endif - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - atomic { - if - :: get_readerid() == 0 -> -progress_reader: - skip; - :: else -> - skip; - fi; - } -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input.trail deleted file mode 100644 index 3d2a95e..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input.trail +++ /dev/null @@ -1,2082 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:3537 -2:3:3489 -3:3:3492 -4:3:3492 -5:3:3495 -6:3:3503 -7:3:3503 -8:3:3506 -9:3:3512 -10:3:3516 -11:3:3516 -12:3:3519 -13:3:3527 -14:3:3531 -15:3:3532 -16:0:3537 -17:3:3534 -18:0:3537 -19:2:1310 -20:0:3537 -21:2:1316 -22:0:3537 -23:2:1317 -24:0:3537 -25:2:1318 -26:2:1322 -27:2:1323 -28:2:1331 -29:2:1332 -30:2:1336 -31:2:1337 -32:2:1345 -33:2:1350 -34:2:1354 -35:2:1355 -36:2:1362 -37:2:1363 -38:2:1374 -39:2:1375 -40:2:1376 -41:2:1387 -42:2:1392 -43:2:1393 -44:0:3537 -45:2:1405 -46:2:1406 -47:0:3537 -48:2:1410 -49:2:1414 -50:2:1415 -51:2:1423 -52:2:1424 -53:2:1428 -54:2:1429 -55:2:1437 -56:2:1442 -57:2:1443 -58:2:1454 -59:2:1455 -60:2:1466 -61:2:1467 -62:2:1468 -63:2:1479 -64:2:1484 -65:2:1485 -66:0:3537 -67:2:1497 -68:0:3537 -69:2:1498 -70:0:3537 -71:2:1508 -72:0:3537 -73:2:1509 -74:0:3537 -75:2:1510 -76:2:1514 -77:2:1515 -78:2:1523 -79:2:1524 -80:2:1528 -81:2:1529 -82:2:1537 -83:2:1542 -84:2:1546 -85:2:1547 -86:2:1554 -87:2:1555 -88:2:1566 -89:2:1567 -90:2:1568 -91:2:1579 -92:2:1584 -93:2:1585 -94:0:3537 -95:2:1600 -96:0:3537 -97:2:1601 -98:2:1605 -99:2:1606 -100:2:1614 -101:2:1615 -102:2:1619 -103:2:1620 -104:2:1628 -105:2:1633 -106:2:1637 -107:2:1638 -108:2:1645 -109:2:1646 -110:2:1657 -111:2:1658 -112:2:1659 -113:2:1670 -114:2:1675 -115:2:1676 -116:0:3537 -117:2:1691 -118:0:3537 -119:2:1696 -120:2:1700 -121:2:1701 -122:2:1709 -123:2:1710 -124:2:1714 -125:2:1715 -126:2:1723 -127:2:1728 -128:2:1732 -129:2:1733 -130:2:1740 -131:2:1741 -132:2:1752 -133:2:1753 -134:2:1754 -135:2:1765 -136:2:1770 -137:2:1771 -138:0:3537 -139:2:1790 -140:0:3537 -141:2:1791 -142:2:1795 -143:2:1796 -144:2:1804 -145:2:1805 -146:2:1809 -147:2:1810 -148:2:1818 -149:2:1823 -150:2:1827 -151:2:1828 -152:2:1835 -153:2:1836 -154:2:1847 -155:2:1848 -156:2:1849 -157:2:1860 -158:2:1865 -159:2:1866 -160:0:3537 -161:2:1878 -162:0:3537 -163:2:1881 -164:2:1882 -165:2:1894 -166:2:1895 -167:2:1899 -168:2:1900 -169:2:1908 -170:2:1913 -171:2:1917 -172:2:1918 -173:2:1925 -174:2:1926 -175:2:1937 -176:2:1938 -177:2:1939 -178:2:1950 -179:2:1955 -180:2:1956 -181:0:3537 -182:2:1968 -183:0:3537 -184:2:1969 -185:0:3537 -186:2:1970 -187:0:3537 -188:2:1971 -189:0:3537 -190:2:1972 -191:2:1976 -192:2:1977 -193:2:1985 -194:2:1986 -195:2:1990 -196:2:1991 -197:2:1999 -198:2:2004 -199:2:2008 -200:2:2009 -201:2:2016 -202:2:2017 -203:2:2028 -204:2:2029 -205:2:2030 -206:2:2041 -207:2:2046 -208:2:2047 -209:0:3537 -210:2:2341 -211:0:3537 -212:2:2437 -213:0:3537 -214:2:2438 -215:0:3537 -216:2:2442 -217:0:3537 -218:2:2448 -219:2:2452 -220:2:2453 -221:2:2461 -222:2:2462 -223:2:2466 -224:2:2467 -225:2:2475 -226:2:2480 -227:2:2484 -228:2:2485 -229:2:2492 -230:2:2493 -231:2:2504 -232:2:2505 -233:2:2506 -234:2:2517 -235:2:2522 -236:2:2523 -237:0:3537 -238:2:2535 -239:0:3537 -240:2:2536 -241:2:2540 -242:2:2541 -243:2:2549 -244:2:2550 -245:2:2554 -246:2:2555 -247:2:2563 -248:2:2568 -249:2:2572 -250:2:2573 -251:2:2580 -252:2:2581 -253:2:2592 -254:2:2593 -255:2:2594 -256:2:2605 -257:2:2610 -258:2:2611 -259:0:3537 -260:2:2623 -261:0:3537 -262:2:2626 -263:2:2627 -264:2:2639 -265:2:2640 -266:2:2644 -267:2:2645 -268:2:2653 -269:2:2658 -270:2:2662 -271:2:2663 -272:2:2670 -273:2:2671 -274:2:2682 -275:2:2683 -276:2:2684 -277:2:2695 -278:2:2700 -279:2:2701 -280:0:3537 -281:2:2713 -282:0:3537 -283:2:2714 -284:0:3537 -285:2:2715 -286:0:3537 -287:2:2716 -288:0:3537 -289:2:2717 -290:2:2721 -291:2:2722 -292:2:2730 -293:2:2731 -294:2:2735 -295:2:2736 -296:2:2744 -297:2:2749 -298:2:2753 -299:2:2754 -300:2:2761 -301:2:2762 -302:2:2773 -303:2:2774 -304:2:2775 -305:2:2786 -306:2:2791 -307:2:2792 -308:0:3537 -309:2:3086 -310:0:3537 -311:2:3182 -312:0:3537 -313:2:3183 -314:0:3537 -315:2:3187 -316:0:3537 -317:2:3193 -318:0:3537 -319:2:3194 -320:2:3198 -321:2:3199 -322:2:3207 -323:2:3208 -324:2:3212 -325:2:3213 -326:2:3221 -327:2:3226 -328:2:3230 -329:2:3231 -330:2:3238 -331:2:3239 -332:2:3250 -333:2:3251 -334:2:3252 -335:2:3263 -336:2:3268 -337:2:3269 -338:0:3537 -339:2:3284 -340:0:3537 -341:2:3285 -342:2:3289 -343:2:3290 -344:2:3298 -345:2:3299 -346:2:3303 -347:2:3304 -348:2:3312 -349:2:3317 -350:2:3321 -351:2:3322 -352:2:3329 -353:2:3330 -354:2:3341 -355:2:3342 -356:2:3343 -357:2:3354 -358:2:3359 -359:2:3360 -360:0:3537 -361:2:3375 -362:0:3537 -363:2:3380 -364:2:3384 -365:2:3385 -366:2:3393 -367:2:3394 -368:2:3398 -369:2:3399 -370:2:3407 -371:2:3412 -372:2:3416 -373:2:3417 -374:2:3424 -375:2:3425 -376:2:3436 -377:2:3437 -378:2:3438 -379:2:3449 -380:2:3454 -381:2:3455 -382:0:3537 -383:2:3474 -384:0:3537 -385:2:3475 -386:0:3537 -387:2:1317 -388:0:3537 -389:2:1318 -390:2:1322 -391:2:1323 -392:2:1331 -393:2:1332 -394:2:1336 -395:2:1337 -396:2:1345 -397:2:1350 -398:2:1354 -399:2:1355 -400:2:1362 -401:2:1363 -402:2:1374 -403:2:1375 -404:2:1376 -405:2:1387 -406:2:1392 -407:2:1393 -408:0:3537 -409:2:1405 -410:2:1406 -411:0:3537 -412:2:1410 -413:2:1414 -414:2:1415 -415:2:1423 -416:2:1424 -417:2:1428 -418:2:1429 -419:2:1437 -420:2:1442 -421:2:1443 -422:2:1454 -423:2:1455 -424:2:1466 -425:2:1467 -426:2:1468 -427:2:1479 -428:2:1484 -429:2:1485 -430:0:3537 -431:2:1497 -432:0:3537 -433:2:1498 -434:0:3537 -435:2:1508 -436:0:3537 -437:2:1509 -438:0:3537 -439:2:1510 -440:2:1514 -441:2:1515 -442:2:1523 -443:2:1524 -444:2:1528 -445:2:1529 -446:2:1537 -447:2:1542 -448:2:1546 -449:2:1547 -450:2:1554 -451:2:1555 -452:2:1566 -453:2:1567 -454:2:1568 -455:2:1579 -456:2:1584 -457:2:1585 -458:0:3537 -459:2:1600 -460:0:3537 -461:2:1601 -462:2:1605 -463:2:1606 -464:2:1614 -465:2:1615 -466:2:1619 -467:2:1620 -468:2:1628 -469:2:1633 -470:2:1637 -471:2:1638 -472:2:1645 -473:2:1646 -474:2:1657 -475:2:1658 -476:2:1659 -477:2:1670 -478:2:1675 -479:2:1676 -480:0:3537 -481:2:1691 -482:0:3537 -483:2:1696 -484:2:1700 -485:2:1701 -486:2:1709 -487:2:1710 -488:2:1714 -489:2:1715 -490:2:1723 -491:2:1728 -492:2:1732 -493:2:1733 -494:2:1740 -495:2:1741 -496:2:1752 -497:2:1753 -498:2:1754 -499:2:1765 -500:2:1770 -501:2:1771 -502:0:3537 -503:2:1790 -504:0:3537 -505:2:1791 -506:2:1795 -507:2:1796 -508:2:1804 -509:2:1805 -510:2:1809 -511:2:1810 -512:2:1818 -513:2:1823 -514:2:1827 -515:2:1828 -516:2:1835 -517:2:1836 -518:2:1847 -519:2:1848 -520:2:1849 -521:2:1860 -522:2:1865 -523:2:1866 -524:0:3537 -525:2:1878 -526:0:3537 -527:2:1881 -528:2:1882 -529:2:1894 -530:2:1895 -531:2:1899 -532:2:1900 -533:2:1908 -534:2:1913 -535:2:1917 -536:2:1918 -537:2:1925 -538:2:1926 -539:2:1937 -540:2:1938 -541:2:1939 -542:2:1950 -543:2:1955 -544:2:1956 -545:0:3537 -546:2:1968 -547:0:3537 -548:2:1969 -549:0:3537 -550:2:1970 -551:0:3537 -552:2:1971 -553:0:3537 -554:2:1972 -555:2:1976 -556:2:1977 -557:2:1985 -558:2:1986 -559:2:1990 -560:2:1991 -561:2:1999 -562:2:2004 -563:2:2008 -564:2:2009 -565:2:2016 -566:2:2017 -567:2:2028 -568:2:2029 -569:2:2030 -570:2:2041 -571:2:2046 -572:2:2047 -573:0:3537 -574:2:2341 -575:0:3537 -576:2:2437 -577:0:3537 -578:2:2438 -579:0:3537 -580:2:2442 -581:0:3537 -582:2:2448 -583:2:2452 -584:2:2453 -585:2:2461 -586:2:2462 -587:2:2466 -588:2:2467 -589:2:2475 -590:2:2480 -591:2:2484 -592:2:2485 -593:2:2492 -594:2:2493 -595:2:2504 -596:2:2505 -597:2:2506 -598:2:2517 -599:2:2522 -600:2:2523 -601:0:3537 -602:2:2535 -603:0:3537 -604:2:2536 -605:2:2540 -606:2:2541 -607:2:2549 -608:2:2550 -609:2:2554 -610:2:2555 -611:2:2563 -612:2:2568 -613:2:2572 -614:2:2573 -615:2:2580 -616:2:2581 -617:2:2592 -618:2:2593 -619:2:2594 -620:2:2605 -621:2:2610 -622:2:2611 -623:0:3537 -624:2:2623 -625:0:3537 -626:2:2626 -627:2:2627 -628:2:2639 -629:2:2640 -630:2:2644 -631:2:2645 -632:2:2653 -633:2:2658 -634:2:2662 -635:2:2663 -636:2:2670 -637:2:2671 -638:2:2682 -639:2:2683 -640:2:2684 -641:2:2695 -642:2:2700 -643:2:2701 -644:0:3537 -645:2:2713 -646:0:3537 -647:2:2714 -648:0:3537 -649:2:2715 -650:0:3537 -651:2:2716 -652:0:3537 -653:2:2717 -654:2:2721 -655:2:2722 -656:2:2730 -657:2:2731 -658:2:2735 -659:2:2736 -660:2:2744 -661:2:2749 -662:2:2753 -663:2:2754 -664:2:2761 -665:2:2762 -666:2:2773 -667:2:2774 -668:2:2775 -669:2:2786 -670:2:2791 -671:2:2792 -672:0:3537 -673:2:3086 -674:0:3537 -675:2:3182 -676:0:3537 -677:2:3183 -678:0:3537 -679:2:3187 -680:0:3537 -681:2:3193 -682:0:3537 -683:2:3194 -684:2:3198 -685:2:3199 -686:2:3207 -687:2:3208 -688:2:3212 -689:2:3213 -690:2:3221 -691:2:3226 -692:2:3230 -693:2:3231 -694:2:3238 -695:2:3239 -696:2:3250 -697:2:3251 -698:2:3252 -699:2:3263 -700:2:3268 -701:2:3269 -702:0:3537 -703:2:3284 -704:0:3537 -705:2:3285 -706:2:3289 -707:2:3290 -708:2:3298 -709:2:3299 -710:2:3303 -711:2:3304 -712:2:3312 -713:2:3317 -714:2:3321 -715:2:3322 -716:2:3329 -717:2:3330 -718:2:3341 -719:2:3342 -720:2:3343 -721:2:3354 -722:2:3359 -723:2:3360 -724:0:3537 -725:2:3375 -726:0:3537 -727:2:3380 -728:2:3384 -729:2:3385 -730:2:3393 -731:2:3394 -732:2:3398 -733:2:3399 -734:2:3407 -735:2:3412 -736:2:3416 -737:2:3417 -738:2:3424 -739:2:3425 -740:2:3436 -741:2:3437 -742:2:3438 -743:2:3449 -744:2:3454 -745:2:3455 -746:0:3537 -747:2:3474 -748:0:3537 -749:2:3475 -750:0:3537 -751:2:1317 -752:0:3537 -753:2:1318 -754:2:1322 -755:2:1323 -756:2:1331 -757:2:1332 -758:2:1336 -759:2:1337 -760:2:1345 -761:2:1350 -762:2:1354 -763:2:1355 -764:2:1362 -765:2:1363 -766:2:1374 -767:2:1375 -768:2:1376 -769:2:1387 -770:2:1392 -771:2:1393 -772:0:3537 -773:2:1405 -774:2:1406 -775:0:3537 -776:2:1410 -777:2:1414 -778:2:1415 -779:2:1423 -780:2:1424 -781:2:1428 -782:2:1429 -783:2:1437 -784:2:1442 -785:2:1443 -786:2:1454 -787:2:1455 -788:2:1466 -789:2:1467 -790:2:1468 -791:2:1479 -792:2:1484 -793:2:1485 -794:0:3537 -795:2:1497 -796:0:3537 -797:2:1498 -798:0:3537 -799:2:1508 -800:0:3537 -801:2:1509 -802:0:3537 -803:2:1510 -804:2:1514 -805:2:1515 -806:2:1523 -807:2:1524 -808:2:1528 -809:2:1529 -810:2:1537 -811:2:1542 -812:2:1546 -813:2:1547 -814:2:1554 -815:2:1555 -816:2:1566 -817:2:1567 -818:2:1568 -819:2:1579 -820:2:1584 -821:2:1585 -822:0:3537 -823:2:1600 -824:0:3537 -825:2:1601 -826:2:1605 -827:2:1606 -828:2:1614 -829:2:1615 -830:2:1619 -831:2:1620 -832:2:1628 -833:2:1633 -834:2:1637 -835:2:1638 -836:2:1645 -837:2:1646 -838:2:1657 -839:2:1658 -840:2:1659 -841:2:1670 -842:2:1675 -843:2:1676 -844:0:3537 -845:2:1691 -846:0:3537 -847:2:1696 -848:2:1700 -849:2:1701 -850:2:1709 -851:2:1710 -852:2:1714 -853:2:1715 -854:2:1723 -855:2:1728 -856:2:1732 -857:2:1733 -858:2:1740 -859:2:1741 -860:2:1752 -861:2:1753 -862:2:1754 -863:2:1765 -864:2:1770 -865:2:1771 -866:0:3537 -867:2:1790 -868:0:3537 -869:2:1791 -870:2:1795 -871:2:1796 -872:2:1804 -873:2:1805 -874:2:1809 -875:2:1810 -876:2:1818 -877:2:1823 -878:2:1827 -879:2:1828 -880:2:1835 -881:2:1836 -882:2:1847 -883:2:1848 -884:2:1849 -885:2:1860 -886:2:1865 -887:2:1866 -888:0:3537 -889:2:1878 -890:0:3537 -891:2:1881 -892:2:1882 -893:2:1894 -894:2:1895 -895:2:1899 -896:2:1900 -897:2:1908 -898:2:1913 -899:2:1917 -900:2:1918 -901:2:1925 -902:2:1926 -903:2:1937 -904:2:1938 -905:2:1939 -906:2:1950 -907:2:1955 -908:2:1956 -909:0:3537 -910:2:1968 -911:0:3537 -912:2:1969 -913:0:3537 -914:2:1970 -915:0:3537 -916:2:1971 -917:0:3537 -918:2:1972 -919:2:1976 -920:2:1977 -921:2:1985 -922:2:1986 -923:2:1990 -924:2:1991 -925:2:1999 -926:2:2004 -927:2:2008 -928:2:2009 -929:2:2016 -930:2:2017 -931:2:2028 -932:2:2029 -933:2:2030 -934:2:2041 -935:2:2046 -936:2:2047 -937:0:3537 -938:2:2341 -939:0:3537 -940:2:2437 -941:0:3537 -942:2:2438 -943:0:3537 -944:2:2442 -945:0:3537 -946:2:2448 -947:2:2452 -948:2:2453 -949:2:2461 -950:2:2462 -951:2:2466 -952:2:2467 -953:2:2475 -954:2:2480 -955:2:2484 -956:2:2485 -957:2:2492 -958:2:2493 -959:2:2504 -960:2:2505 -961:2:2506 -962:2:2517 -963:2:2522 -964:2:2523 -965:0:3537 -966:2:2535 -967:0:3537 -968:2:2536 -969:2:2540 -970:2:2541 -971:2:2549 -972:2:2550 -973:2:2554 -974:2:2555 -975:2:2563 -976:2:2568 -977:2:2572 -978:2:2573 -979:2:2580 -980:2:2581 -981:2:2592 -982:2:2593 -983:2:2594 -984:2:2605 -985:2:2610 -986:2:2611 -987:0:3537 -988:2:2623 -989:0:3537 -990:2:2626 -991:2:2627 -992:2:2639 -993:2:2640 -994:2:2644 -995:2:2645 -996:2:2653 -997:2:2658 -998:2:2662 -999:2:2663 -1000:2:2670 -1001:2:2671 -1002:2:2682 -1003:2:2683 -1004:2:2684 -1005:2:2695 -1006:2:2700 -1007:2:2701 -1008:0:3537 -1009:2:2713 -1010:0:3537 -1011:2:2714 -1012:0:3537 -1013:2:2715 -1014:0:3537 -1015:2:2716 -1016:0:3537 -1017:2:2717 -1018:2:2721 -1019:2:2722 -1020:2:2730 -1021:2:2731 -1022:2:2735 -1023:2:2736 -1024:2:2744 -1025:2:2749 -1026:2:2753 -1027:2:2754 -1028:2:2761 -1029:2:2762 -1030:2:2773 -1031:2:2774 -1032:2:2775 -1033:2:2786 -1034:2:2791 -1035:2:2792 -1036:0:3537 -1037:2:3086 -1038:0:3537 -1039:2:3182 -1040:0:3537 -1041:2:3183 -1042:0:3537 -1043:2:3187 -1044:0:3537 -1045:2:3193 -1046:0:3537 -1047:2:3194 -1048:2:3198 -1049:2:3199 -1050:2:3207 -1051:2:3208 -1052:2:3212 -1053:2:3213 -1054:2:3221 -1055:2:3226 -1056:2:3230 -1057:2:3231 -1058:2:3238 -1059:2:3239 -1060:2:3250 -1061:2:3251 -1062:2:3252 -1063:2:3263 -1064:2:3268 -1065:2:3269 -1066:0:3537 -1067:2:3284 -1068:0:3537 -1069:2:3285 -1070:2:3289 -1071:2:3290 -1072:2:3298 -1073:2:3299 -1074:2:3303 -1075:2:3304 -1076:2:3312 -1077:2:3317 -1078:2:3321 -1079:2:3322 -1080:2:3329 -1081:2:3330 -1082:2:3341 -1083:2:3342 -1084:2:3343 -1085:2:3354 -1086:2:3359 -1087:2:3360 -1088:0:3537 -1089:2:3375 -1090:0:3537 -1091:2:3380 -1092:2:3384 -1093:2:3385 -1094:2:3393 -1095:2:3394 -1096:2:3398 -1097:2:3399 -1098:2:3407 -1099:2:3412 -1100:2:3416 -1101:2:3417 -1102:2:3424 -1103:2:3425 -1104:2:3436 -1105:2:3437 -1106:2:3438 -1107:2:3449 -1108:2:3454 -1109:2:3455 -1110:0:3537 -1111:2:3474 -1112:0:3537 -1113:2:3475 -1114:0:3537 -1115:2:1317 -1116:0:3537 -1117:2:1318 -1118:2:1322 -1119:2:1323 -1120:2:1331 -1121:2:1332 -1122:2:1336 -1123:2:1337 -1124:2:1345 -1125:2:1350 -1126:2:1354 -1127:2:1355 -1128:2:1362 -1129:2:1363 -1130:2:1374 -1131:2:1375 -1132:2:1376 -1133:2:1387 -1134:2:1392 -1135:2:1393 -1136:0:3537 -1137:2:1405 -1138:2:1406 -1139:0:3537 -1140:2:1410 -1141:2:1414 -1142:2:1415 -1143:2:1423 -1144:2:1424 -1145:2:1428 -1146:2:1429 -1147:2:1437 -1148:2:1442 -1149:2:1443 -1150:2:1454 -1151:2:1455 -1152:2:1466 -1153:2:1467 -1154:2:1468 -1155:2:1479 -1156:2:1484 -1157:2:1485 -1158:0:3537 -1159:2:1497 -1160:0:3537 -1161:2:1498 -1162:0:3537 -1163:2:1508 -1164:0:3537 -1165:2:1509 -1166:0:3537 -1167:2:1510 -1168:2:1514 -1169:2:1515 -1170:2:1523 -1171:2:1524 -1172:2:1528 -1173:2:1529 -1174:2:1537 -1175:2:1542 -1176:2:1546 -1177:2:1547 -1178:2:1554 -1179:2:1555 -1180:2:1566 -1181:2:1567 -1182:2:1568 -1183:2:1579 -1184:2:1584 -1185:2:1585 -1186:0:3537 -1187:2:1600 -1188:0:3537 -1189:2:1601 -1190:2:1605 -1191:2:1606 -1192:2:1614 -1193:2:1615 -1194:2:1619 -1195:2:1620 -1196:2:1628 -1197:2:1633 -1198:2:1637 -1199:2:1638 -1200:2:1645 -1201:2:1646 -1202:2:1657 -1203:2:1658 -1204:2:1659 -1205:2:1670 -1206:2:1675 -1207:2:1676 -1208:0:3537 -1209:2:1691 -1210:0:3537 -1211:2:1696 -1212:2:1700 -1213:2:1701 -1214:2:1709 -1215:2:1710 -1216:2:1714 -1217:2:1715 -1218:2:1723 -1219:2:1728 -1220:2:1732 -1221:2:1733 -1222:2:1740 -1223:2:1741 -1224:2:1752 -1225:2:1753 -1226:2:1754 -1227:2:1765 -1228:2:1770 -1229:2:1771 -1230:0:3537 -1231:2:1790 -1232:0:3537 -1233:2:1791 -1234:2:1795 -1235:2:1796 -1236:2:1804 -1237:2:1805 -1238:2:1809 -1239:2:1810 -1240:2:1818 -1241:2:1823 -1242:2:1827 -1243:2:1828 -1244:2:1835 -1245:2:1836 -1246:2:1847 -1247:2:1848 -1248:2:1849 -1249:2:1860 -1250:2:1865 -1251:2:1866 -1252:0:3537 -1253:2:1878 -1254:0:3537 -1255:2:1881 -1256:2:1882 -1257:2:1894 -1258:2:1895 -1259:2:1899 -1260:2:1900 -1261:2:1908 -1262:2:1913 -1263:2:1917 -1264:2:1918 -1265:2:1925 -1266:2:1926 -1267:2:1937 -1268:2:1938 -1269:2:1939 -1270:2:1950 -1271:2:1955 -1272:2:1956 -1273:0:3537 -1274:2:1968 -1275:0:3537 -1276:2:1969 -1277:0:3537 -1278:2:1970 -1279:0:3537 -1280:2:1971 -1281:0:3537 -1282:2:1972 -1283:2:1976 -1284:2:1977 -1285:2:1985 -1286:2:1986 -1287:2:1990 -1288:2:1991 -1289:2:1999 -1290:2:2004 -1291:2:2008 -1292:2:2009 -1293:2:2016 -1294:2:2017 -1295:2:2028 -1296:2:2029 -1297:2:2030 -1298:2:2041 -1299:2:2046 -1300:2:2047 -1301:0:3537 -1302:2:2341 -1303:0:3537 -1304:2:2437 -1305:0:3537 -1306:2:2438 -1307:0:3537 -1308:2:2442 -1309:0:3537 -1310:2:2448 -1311:2:2452 -1312:2:2453 -1313:2:2461 -1314:2:2462 -1315:2:2466 -1316:2:2467 -1317:2:2475 -1318:2:2480 -1319:2:2484 -1320:2:2485 -1321:2:2492 -1322:2:2493 -1323:2:2504 -1324:2:2505 -1325:2:2506 -1326:2:2517 -1327:2:2522 -1328:2:2523 -1329:0:3537 -1330:2:2535 -1331:0:3537 -1332:2:2536 -1333:2:2540 -1334:2:2541 -1335:2:2549 -1336:2:2550 -1337:2:2554 -1338:2:2555 -1339:2:2563 -1340:2:2568 -1341:2:2572 -1342:2:2573 -1343:2:2580 -1344:2:2581 -1345:2:2592 -1346:2:2593 -1347:2:2594 -1348:2:2605 -1349:2:2610 -1350:2:2611 -1351:0:3537 -1352:2:2623 -1353:0:3537 -1354:2:2626 -1355:2:2627 -1356:2:2639 -1357:2:2640 -1358:2:2644 -1359:2:2645 -1360:2:2653 -1361:2:2658 -1362:2:2662 -1363:2:2663 -1364:2:2670 -1365:2:2671 -1366:2:2682 -1367:2:2683 -1368:2:2684 -1369:2:2695 -1370:2:2700 -1371:2:2701 -1372:0:3537 -1373:2:2713 -1374:0:3537 -1375:2:2714 -1376:0:3537 -1377:2:2715 -1378:0:3537 -1379:2:2716 -1380:0:3537 -1381:2:2717 -1382:2:2721 -1383:2:2722 -1384:2:2730 -1385:2:2731 -1386:2:2735 -1387:2:2736 -1388:2:2744 -1389:2:2749 -1390:2:2753 -1391:2:2754 -1392:2:2761 -1393:2:2762 -1394:2:2773 -1395:2:2774 -1396:2:2775 -1397:2:2786 -1398:2:2791 -1399:2:2792 -1400:0:3537 -1401:2:3086 -1402:0:3537 -1403:2:3182 -1404:0:3537 -1405:2:3183 -1406:0:3537 -1407:2:3187 -1408:0:3537 -1409:2:3193 -1410:0:3537 -1411:2:3194 -1412:2:3198 -1413:2:3199 -1414:2:3207 -1415:2:3208 -1416:2:3212 -1417:2:3213 -1418:2:3221 -1419:2:3226 -1420:2:3230 -1421:2:3231 -1422:2:3238 -1423:2:3239 -1424:2:3250 -1425:2:3251 -1426:2:3252 -1427:2:3263 -1428:2:3268 -1429:2:3269 -1430:0:3537 -1431:2:3284 -1432:0:3537 -1433:2:3285 -1434:2:3289 -1435:2:3290 -1436:2:3298 -1437:2:3299 -1438:2:3303 -1439:2:3304 -1440:2:3312 -1441:2:3317 -1442:2:3321 -1443:2:3322 -1444:2:3329 -1445:2:3330 -1446:2:3341 -1447:2:3342 -1448:2:3343 -1449:2:3354 -1450:2:3359 -1451:2:3360 -1452:0:3537 -1453:2:3375 -1454:0:3537 -1455:2:3380 -1456:2:3384 -1457:2:3385 -1458:2:3393 -1459:2:3394 -1460:2:3398 -1461:2:3399 -1462:2:3407 -1463:2:3412 -1464:2:3416 -1465:2:3417 -1466:2:3424 -1467:2:3425 -1468:2:3436 -1469:2:3437 -1470:2:3438 -1471:2:3449 -1472:2:3454 -1473:2:3455 -1474:0:3537 -1475:2:3474 -1476:0:3537 -1477:2:3475 -1478:0:3537 -1479:2:1317 -1480:0:3537 -1481:2:1318 -1482:2:1322 -1483:2:1323 -1484:2:1331 -1485:2:1332 -1486:2:1336 -1487:2:1337 -1488:2:1345 -1489:2:1350 -1490:2:1354 -1491:2:1355 -1492:2:1362 -1493:2:1363 -1494:2:1374 -1495:2:1375 -1496:2:1376 -1497:2:1387 -1498:2:1392 -1499:2:1393 -1500:0:3537 -1501:2:1405 -1502:2:1406 -1503:0:3537 -1504:2:1410 -1505:2:1414 -1506:2:1415 -1507:2:1423 -1508:2:1424 -1509:2:1428 -1510:2:1429 -1511:2:1437 -1512:2:1450 -1513:2:1451 -1514:2:1454 -1515:2:1455 -1516:2:1466 -1517:2:1467 -1518:2:1468 -1519:2:1479 -1520:2:1484 -1521:2:1487 -1522:2:1488 -1523:0:3537 -1524:2:1497 -1525:0:3537 -1526:2:1498 -1527:0:3537 -1528:2:1508 -1529:0:3537 -1530:2:1509 -1531:0:3537 -1532:2:1510 -1533:2:1514 -1534:2:1515 -1535:2:1523 -1536:2:1524 -1537:2:1528 -1538:2:1529 -1539:2:1537 -1540:2:1550 -1541:2:1551 -1542:2:1554 -1543:2:1555 -1544:2:1566 -1545:2:1567 -1546:2:1568 -1547:2:1579 -1548:2:1584 -1549:2:1587 -1550:2:1588 -1551:0:3537 -1552:2:1600 -1553:0:3537 -1554:2:1601 -1555:2:1605 -1556:2:1606 -1557:2:1614 -1558:2:1615 -1559:2:1619 -1560:2:1620 -1561:2:1628 -1562:2:1641 -1563:2:1642 -1564:2:1645 -1565:2:1646 -1566:2:1657 -1567:2:1658 -1568:2:1659 -1569:2:1670 -1570:2:1675 -1571:2:1678 -1572:2:1679 -1573:0:3537 -1574:2:1691 -1575:0:3537 -1576:2:1696 -1577:2:1700 -1578:2:1701 -1579:2:1709 -1580:2:1710 -1581:2:1714 -1582:2:1715 -1583:2:1723 -1584:2:1736 -1585:2:1737 -1586:2:1740 -1587:2:1741 -1588:2:1752 -1589:2:1753 -1590:2:1754 -1591:2:1765 -1592:2:1770 -1593:2:1773 -1594:2:1774 -1595:0:3537 -1596:2:1790 -1597:0:3537 -1598:2:1791 -1599:2:1795 -1600:2:1796 -1601:2:1804 -1602:2:1805 -1603:2:1809 -1604:2:1810 -1605:2:1818 -1606:2:1831 -1607:2:1832 -1608:2:1835 -1609:2:1836 -1610:2:1847 -1611:2:1848 -1612:2:1849 -1613:2:1860 -1614:2:1865 -1615:2:1868 -1616:2:1869 -1617:0:3537 -1618:2:1878 -1619:0:3537 -1620:2:1881 -1621:2:1882 -1622:2:1894 -1623:2:1895 -1624:2:1899 -1625:2:1900 -1626:2:1908 -1627:2:1921 -1628:2:1922 -1629:2:1925 -1630:2:1926 -1631:2:1937 -1632:2:1938 -1633:2:1939 -1634:2:1950 -1635:2:1955 -1636:2:1958 -1637:2:1959 -1638:0:3537 -1639:2:1968 -1640:0:3537 -1641:2:1969 -1642:0:3537 -1643:2:1970 -1644:0:3537 -1645:2:1971 -1646:0:3537 -1647:2:1972 -1648:2:1976 -1649:2:1977 -1650:2:1985 -1651:2:1986 -1652:2:1990 -1653:2:1991 -1654:2:1999 -1655:2:2012 -1656:2:2013 -1657:2:2016 -1658:2:2017 -1659:2:2028 -1660:2:2029 -1661:2:2030 -1662:2:2041 -1663:2:2046 -1664:2:2049 -1665:2:2050 -1666:0:3537 -1667:2:2341 -1668:0:3537 -1669:2:2437 -1670:0:3537 -1671:2:2438 -1672:0:3537 -1673:2:2442 -1674:0:3537 -1675:2:2448 -1676:2:2452 -1677:2:2453 -1678:2:2461 -1679:2:2462 -1680:2:2466 -1681:2:2467 -1682:2:2475 -1683:2:2488 -1684:2:2489 -1685:2:2492 -1686:2:2493 -1687:2:2504 -1688:2:2505 -1689:2:2506 -1690:2:2517 -1691:2:2522 -1692:2:2525 -1693:2:2526 -1694:0:3537 -1695:2:2535 -1696:0:3537 -1697:2:2536 -1698:2:2540 -1699:2:2541 -1700:2:2549 -1701:2:2550 -1702:2:2554 -1703:2:2555 -1704:2:2563 -1705:2:2576 -1706:2:2577 -1707:2:2580 -1708:2:2581 -1709:2:2592 -1710:2:2593 -1711:2:2594 -1712:2:2605 -1713:2:2610 -1714:2:2613 -1715:2:2614 -1716:0:3537 -1717:2:2623 -1718:0:3537 -1719:2:2626 -1720:2:2627 -1721:2:2639 -1722:2:2640 -1723:2:2644 -1724:2:2645 -1725:2:2653 -1726:2:2666 -1727:2:2667 -1728:2:2670 -1729:2:2671 -1730:2:2682 -1731:2:2683 -1732:2:2684 -1733:2:2695 -1734:2:2700 -1735:2:2703 -1736:2:2704 -1737:0:3537 -1738:2:2713 -1739:0:3537 -1740:2:2714 -1741:0:3537 -1742:2:2715 -1743:0:3537 -1744:2:2716 -1745:0:3537 -1746:2:2717 -1747:2:2721 -1748:2:2722 -1749:2:2730 -1750:2:2731 -1751:2:2735 -1752:2:2736 -1753:2:2744 -1754:2:2757 -1755:2:2758 -1756:2:2761 -1757:2:2762 -1758:2:2773 -1759:2:2774 -1760:2:2775 -1761:2:2786 -1762:2:2791 -1763:2:2794 -1764:2:2795 -1765:0:3537 -1766:2:3086 -1767:0:3537 -1768:2:3182 -1769:0:3537 -1770:2:3183 -1771:0:3537 -1772:2:3187 -1773:0:3537 -1774:2:3193 -1775:0:3537 -1776:2:3194 -1777:2:3198 -1778:2:3199 -1779:2:3207 -1780:2:3208 -1781:2:3212 -1782:2:3213 -1783:2:3221 -1784:2:3234 -1785:2:3235 -1786:2:3238 -1787:2:3239 -1788:2:3250 -1789:2:3251 -1790:2:3252 -1791:2:3263 -1792:2:3268 -1793:2:3271 -1794:2:3272 -1795:0:3537 -1796:2:3284 -1797:0:3537 -1798:2:3285 -1799:2:3289 -1800:2:3290 -1801:2:3298 -1802:2:3299 -1803:2:3303 -1804:2:3304 -1805:2:3312 -1806:2:3325 -1807:2:3326 -1808:2:3329 -1809:2:3330 -1810:2:3341 -1811:2:3342 -1812:2:3343 -1813:2:3354 -1814:2:3359 -1815:2:3362 -1816:2:3363 -1817:0:3537 -1818:2:3375 -1819:0:3537 -1820:2:3380 -1821:2:3384 -1822:2:3385 -1823:2:3393 -1824:2:3394 -1825:2:3398 -1826:2:3399 -1827:2:3407 -1828:2:3420 -1829:2:3421 -1830:2:3424 -1831:2:3425 -1832:2:3436 -1833:2:3437 -1834:2:3438 -1835:2:3449 -1836:2:3454 -1837:2:3457 -1838:2:3458 -1839:0:3537 -1840:2:3474 -1841:0:3537 -1842:2:3475 -1843:0:3537 -1844:2:3478 -1845:0:3537 -1846:2:3483 -1847:0:3537 -1848:1:2 -1849:0:3537 -1850:2:3484 -1851:0:3537 -1852:1:8 -1853:0:3537 -1854:2:3483 -1855:0:3537 -1856:1:9 -1857:0:3537 -1858:2:3484 -1859:0:3537 -1860:1:10 -1861:0:3537 -1862:2:3483 -1863:0:3537 -1864:1:11 -1865:0:3537 -1866:2:3484 -1867:0:3537 -1868:1:12 -1869:1:16 -1870:1:17 -1871:1:25 -1872:1:26 -1873:1:30 -1874:1:31 -1875:1:39 -1876:1:44 -1877:1:48 -1878:1:49 -1879:1:56 -1880:1:57 -1881:1:68 -1882:1:69 -1883:1:70 -1884:1:81 -1885:1:86 -1886:1:87 -1887:0:3537 -1888:2:3483 -1889:0:3537 -1890:1:99 -1891:0:3537 -1892:2:3484 -1893:0:3537 -1894:1:100 -1895:1:104 -1896:1:105 -1897:1:113 -1898:1:114 -1899:1:118 -1900:1:119 -1901:1:127 -1902:1:132 -1903:1:136 -1904:1:137 -1905:1:144 -1906:1:145 -1907:1:156 -1908:1:157 -1909:1:158 -1910:1:169 -1911:1:174 -1912:1:175 -1913:0:3537 -1914:2:3483 -1915:0:3537 -1916:1:187 -1917:0:3537 -1918:2:3484 -1919:0:3537 -1920:1:188 -1921:0:3537 -1922:2:3483 -1923:0:3537 -1924:1:189 -1925:1:193 -1926:1:194 -1927:1:202 -1928:1:203 -1929:1:207 -1930:1:208 -1931:1:216 -1932:1:221 -1933:1:225 -1934:1:226 -1935:1:233 -1936:1:234 -1937:1:245 -1938:1:246 -1939:1:247 -1940:1:258 -1941:1:263 -1942:1:264 -1943:0:3537 -1944:2:3484 -1945:0:3537 -1946:1:276 -1947:0:3537 -1948:2:3483 -1949:0:3537 -1950:1:561 -1951:0:3537 -1952:2:3484 -1953:0:3537 -1954:1:562 -1955:0:3537 -1956:2:3483 -1957:0:3537 -1958:1:11 -1959:0:3537 -1960:2:3484 -1961:0:3537 -1962:1:12 -1963:1:16 -1964:1:17 -1965:1:25 -1966:1:26 -1967:1:27 -1968:1:39 -1969:1:44 -1970:1:48 -1971:1:49 -1972:1:56 -1973:1:57 -1974:1:68 -1975:1:69 -1976:1:70 -1977:1:81 -1978:1:86 -1979:1:87 -1980:0:3537 -1981:2:3483 -1982:0:3537 -1983:1:99 -1984:0:3537 -1985:2:3484 -1986:0:3537 -1987:1:100 -1988:1:104 -1989:1:105 -1990:1:113 -1991:1:114 -1992:1:118 -1993:1:119 -1994:1:127 -1995:1:132 -1996:1:136 -1997:1:137 -1998:1:144 -1999:1:145 -2000:1:156 -2001:1:157 -2002:1:158 -2003:1:169 -2004:1:174 -2005:1:175 -2006:0:3537 -2007:2:3483 -2008:0:3537 -2009:1:279 -2010:0:3537 -2011:2:3484 -2012:0:3537 -2013:1:280 -2014:0:3537 -2015:2:3483 -2016:0:3537 -2017:1:561 -2018:0:3537 -2019:2:3484 -2020:0:3537 -2021:1:562 -2022:0:3537 -2023:2:3483 -2024:0:3537 -2025:1:567 -2026:0:3537 -2027:2:3484 -2028:0:3537 -2029:1:572 -2030:1:576 -2031:1:577 -2032:1:585 -2033:1:586 -2034:1:587 -2035:1:599 -2036:1:604 -2037:1:608 -2038:1:609 -2039:1:616 -2040:1:617 -2041:1:628 -2042:1:629 -2043:1:630 -2044:1:641 -2045:1:646 -2046:1:647 -2047:0:3537 -2048:2:3483 -2049:0:3537 -2050:1:659 -2051:0:3537 -2052:2:3484 -2053:0:3537 -2054:1:660 -2055:1:664 -2056:1:665 -2057:1:673 -2058:1:674 -2059:1:678 -2060:1:679 -2061:1:687 -2062:1:692 -2063:1:696 -2064:1:697 -2065:1:704 -2066:1:705 -2067:1:716 -2068:1:717 -2069:1:718 -2070:1:729 -2071:1:734 -2072:1:735 -2073:0:3537 -2074:2:3483 -2075:0:3537 -2076:1:747 -2077:0:3535 -2078:2:3484 -2079:0:3541 -2080:1:1280 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_rmb.define b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_rmb.log b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_rmb.log deleted file mode 100644 index 6a46f80..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_rmb.log +++ /dev/null @@ -1,369 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_rmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 567) -Depth= 5645 States= 1e+06 Transitions= 1.47e+07 Memory= 527.287 t= 27.1 R= 4e+04 -pan: claim violated! (at depth 1736) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 5645, errors: 1 - 1039881 states, stored - 14441478 states, matched - 15481359 transitions (= stored+matched) - 57000435 atomic steps -hash conflicts: 2892596 (resolved) - -Stats on memory usage (in Megabytes): - 83.303 equivalent memory usage for states (stored*(State-vector + overhead)) - 64.050 actual memory usage for states (compression: 76.89%) - state-vector as stored = 37 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 529.729 total actual memory usage - -unreached in proctype urcu_reader - line 289, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 61, "(1)" - line 308, "pan.___", state 91, "(1)" - line 289, "pan.___", state 104, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 136, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 149, "(1)" - line 308, "pan.___", state 179, "(1)" - line 289, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 225, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 238, "(1)" - line 308, "pan.___", state 268, "(1)" - line 159, "pan.___", state 289, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 291, "(1)" - line 163, "pan.___", state 298, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 300, "(1)" - line 163, "pan.___", state 301, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 163, "pan.___", state 301, "else" - line 161, "pan.___", state 306, "((j<1))" - line 161, "pan.___", state 306, "((j>=1))" - line 167, "pan.___", state 311, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 167, "pan.___", state 313, "(1)" - line 167, "pan.___", state 314, "((cache_dirty_generation_ptr.bitfield&(1<<_pid)))" - line 167, "pan.___", state 314, "else" - line 177, "pan.___", state 319, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 177, "pan.___", state 319, "else" - line 159, "pan.___", state 324, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 167, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 159, "pan.___", state 363, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 365, "(1)" - line 163, "pan.___", state 372, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 374, "(1)" - line 163, "pan.___", state 375, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 163, "pan.___", state 375, "else" - line 161, "pan.___", state 380, "((j<1))" - line 161, "pan.___", state 380, "((j>=1))" - line 167, "pan.___", state 385, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 167, "pan.___", state 387, "(1)" - line 167, "pan.___", state 388, "((cache_dirty_generation_ptr.bitfield&(1<<_pid)))" - line 167, "pan.___", state 388, "else" - line 177, "pan.___", state 393, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 177, "pan.___", state 393, "else" - line 289, "pan.___", state 408, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 440, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 453, "(1)" - line 308, "pan.___", state 483, "(1)" - line 289, "pan.___", state 496, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 541, "(1)" - line 308, "pan.___", state 571, "(1)" - line 289, "pan.___", state 584, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 616, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 629, "(1)" - line 308, "pan.___", state 659, "(1)" - line 159, "pan.___", state 674, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 676, "(1)" - line 163, "pan.___", state 683, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 685, "(1)" - line 163, "pan.___", state 686, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 163, "pan.___", state 686, "else" - line 161, "pan.___", state 691, "((j<1))" - line 161, "pan.___", state 691, "((j>=1))" - line 167, "pan.___", state 696, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 167, "pan.___", state 698, "(1)" - line 167, "pan.___", state 699, "((cache_dirty_generation_ptr.bitfield&(1<<_pid)))" - line 167, "pan.___", state 699, "else" - line 177, "pan.___", state 704, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 177, "pan.___", state 704, "else" - line 159, "pan.___", state 709, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 167, "pan.___", state 731, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 159, "pan.___", state 748, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 750, "(1)" - line 163, "pan.___", state 757, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 759, "(1)" - line 163, "pan.___", state 760, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 163, "pan.___", state 760, "else" - line 161, "pan.___", state 765, "((j<1))" - line 161, "pan.___", state 765, "((j>=1))" - line 167, "pan.___", state 770, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 167, "pan.___", state 772, "(1)" - line 167, "pan.___", state 773, "((cache_dirty_generation_ptr.bitfield&(1<<_pid)))" - line 167, "pan.___", state 773, "else" - line 177, "pan.___", state 778, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 177, "pan.___", state 778, "else" - line 289, "pan.___", state 788, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 820, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 833, "(1)" - line 308, "pan.___", state 863, "(1)" - line 289, "pan.___", state 884, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 916, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 929, "(1)" - line 308, "pan.___", state 959, "(1)" - line 434, "pan.___", state 972, "-end-" - (95 of 972 states) -unreached in proctype urcu_writer - line 289, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 289, "pan.___", state 20, "(1)" - line 293, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 34, "(1)" - line 293, "pan.___", state 35, "(1)" - line 293, "pan.___", state 35, "(1)" - line 291, "pan.___", state 40, "((i<1))" - line 291, "pan.___", state 40, "((i>=1))" - line 298, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 59, "(1)" - line 299, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 299, "pan.___", state 60, "else" - line 299, "pan.___", state 63, "(1)" - line 299, "pan.___", state 64, "(1)" - line 299, "pan.___", state 64, "(1)" - line 303, "pan.___", state 72, "(1)" - line 303, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 303, "pan.___", state 73, "else" - line 303, "pan.___", state 76, "(1)" - line 303, "pan.___", state 77, "(1)" - line 303, "pan.___", state 77, "(1)" - line 301, "pan.___", state 82, "((i<1))" - line 301, "pan.___", state 82, "((i>=1))" - line 308, "pan.___", state 89, "(1)" - line 308, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 308, "pan.___", state 90, "else" - line 308, "pan.___", state 93, "(1)" - line 308, "pan.___", state 94, "(1)" - line 308, "pan.___", state 94, "(1)" - line 310, "pan.___", state 97, "(1)" - line 310, "pan.___", state 97, "(1)" - line 456, "pan.___", state 101, "cached_generation_ptr.val[_pid] = (old_gen+1)" - line 454, "pan.___", state 102, "old_gen = cached_generation_ptr.val[_pid]" - line 289, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 289, "pan.___", state 112, "(1)" - line 293, "pan.___", state 120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 126, "(1)" - line 293, "pan.___", state 127, "(1)" - line 293, "pan.___", state 127, "(1)" - line 299, "pan.___", state 151, "(1)" - line 303, "pan.___", state 164, "(1)" - line 310, "pan.___", state 189, "(1)" - line 310, "pan.___", state 189, "(1)" - line 468, "pan.___", state 195, "(1)" - line 159, "pan.___", state 205, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 214, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 240, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 298, "pan.___", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 755, "(1)" - line 299, "pan.___", state 756, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 299, "pan.___", state 756, "else" - line 299, "pan.___", state 759, "(1)" - line 299, "pan.___", state 760, "(1)" - line 299, "pan.___", state 760, "(1)" - line 303, "pan.___", state 768, "(1)" - line 303, "pan.___", state 769, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 303, "pan.___", state 769, "else" - line 303, "pan.___", state 772, "(1)" - line 303, "pan.___", state 773, "(1)" - line 303, "pan.___", state 773, "(1)" - line 301, "pan.___", state 778, "((i<1))" - line 301, "pan.___", state 778, "((i>=1))" - line 308, "pan.___", state 785, "(1)" - line 308, "pan.___", state 786, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 308, "pan.___", state 786, "else" - line 308, "pan.___", state 789, "(1)" - line 308, "pan.___", state 790, "(1)" - line 308, "pan.___", state 790, "(1)" - line 310, "pan.___", state 793, "(1)" - line 310, "pan.___", state 793, "(1)" - line 293, "pan.___", state 822, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 840, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 866, "(1)" - line 308, "pan.___", state 883, "(1)" - line 293, "pan.___", state 910, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 928, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 954, "(1)" - line 308, "pan.___", state 971, "(1)" - line 289, "pan.___", state 988, "(1)" - line 293, "pan.___", state 1000, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1018, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 1044, "(1)" - line 308, "pan.___", state 1061, "(1)" - line 293, "pan.___", state 1091, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1109, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 1135, "(1)" - line 308, "pan.___", state 1152, "(1)" - line 163, "pan.___", state 1174, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 167, "pan.___", state 1187, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 1200, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 298, "pan.___", state 1319, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 1332, "(1)" - line 299, "pan.___", state 1333, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 299, "pan.___", state 1333, "else" - line 299, "pan.___", state 1336, "(1)" - line 299, "pan.___", state 1337, "(1)" - line 299, "pan.___", state 1337, "(1)" - line 303, "pan.___", state 1345, "(1)" - line 303, "pan.___", state 1346, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 303, "pan.___", state 1346, "else" - line 303, "pan.___", state 1349, "(1)" - line 303, "pan.___", state 1350, "(1)" - line 303, "pan.___", state 1350, "(1)" - line 301, "pan.___", state 1355, "((i<1))" - line 301, "pan.___", state 1355, "((i>=1))" - line 308, "pan.___", state 1362, "(1)" - line 308, "pan.___", state 1363, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 308, "pan.___", state 1363, "else" - line 308, "pan.___", state 1366, "(1)" - line 308, "pan.___", state 1367, "(1)" - line 308, "pan.___", state 1367, "(1)" - line 310, "pan.___", state 1370, "(1)" - line 310, "pan.___", state 1370, "(1)" - line 163, "pan.___", state 1394, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 167, "pan.___", state 1407, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 1420, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=2))" - line 519, "pan.___", state 20, "((j<2))" - line 519, "pan.___", state 20, "((j>=2))" - line 524, "pan.___", state 33, "((j<2))" - line 524, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 572, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 28.5 seconds -pan: rate 36487.053 states/second -pan: avg transition delay 1.8409e-06 usec -cp .input.spin urcu_free_no_rmb.spin.input -cp .input.spin.trail urcu_free_no_rmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input deleted file mode 100644 index 899fdb4..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input +++ /dev/null @@ -1,532 +0,0 @@ -#define NO_RMB - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - - -#if (NR_READERS == 1) - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#elif (NR_READERS == 2) - -#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) -#define read_free (free_done && (data_access[0] || data_access[1])) - -#else - -#error "Too many readers" - -#endif - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - atomic { - if - :: get_readerid() == 0 -> -progress_reader: - skip; - :: else -> - skip; - fi; - } -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input.trail deleted file mode 100644 index 0aacf1a..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input.trail +++ /dev/null @@ -1,1739 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2529 -2:3:2481 -3:3:2484 -4:3:2484 -5:3:2487 -6:3:2495 -7:3:2495 -8:3:2498 -9:3:2504 -10:3:2508 -11:3:2508 -12:3:2511 -13:3:2519 -14:3:2523 -15:3:2524 -16:0:2529 -17:3:2526 -18:0:2529 -19:2:974 -20:0:2529 -21:2:980 -22:0:2529 -23:2:981 -24:0:2529 -25:2:982 -26:2:986 -27:2:987 -28:2:995 -29:2:996 -30:2:1000 -31:2:1001 -32:2:1009 -33:2:1014 -34:2:1018 -35:2:1019 -36:2:1026 -37:2:1027 -38:2:1038 -39:2:1039 -40:2:1040 -41:2:1051 -42:2:1056 -43:2:1057 -44:0:2529 -45:2:1069 -46:2:1070 -47:0:2529 -48:2:1074 -49:2:1078 -50:2:1079 -51:2:1087 -52:2:1088 -53:2:1092 -54:2:1093 -55:2:1101 -56:2:1106 -57:2:1107 -58:2:1118 -59:2:1119 -60:2:1130 -61:2:1131 -62:2:1132 -63:2:1143 -64:2:1148 -65:2:1149 -66:0:2529 -67:2:1161 -68:0:2529 -69:2:1162 -70:0:2529 -71:2:1172 -72:0:2529 -73:2:1173 -74:0:2529 -75:2:1177 -76:2:1178 -77:2:1182 -78:2:1186 -79:2:1187 -80:2:1191 -81:2:1199 -82:2:1200 -83:0:2529 -84:2:1208 -85:0:2529 -86:2:1212 -87:2:1213 -88:2:1217 -89:2:1221 -90:2:1222 -91:2:1226 -92:2:1234 -93:2:1235 -94:0:2529 -95:2:1243 -96:0:2529 -97:2:1251 -98:2:1252 -99:2:1256 -100:2:1260 -101:2:1261 -102:2:1265 -103:2:1273 -104:2:1274 -105:0:2529 -106:2:1286 -107:0:2529 -108:2:1287 -109:2:1291 -110:2:1292 -111:2:1300 -112:2:1301 -113:2:1305 -114:2:1306 -115:2:1314 -116:2:1319 -117:2:1323 -118:2:1324 -119:2:1331 -120:2:1332 -121:2:1343 -122:2:1344 -123:2:1345 -124:2:1356 -125:2:1361 -126:2:1362 -127:0:2529 -128:2:1374 -129:0:2529 -130:2:1377 -131:2:1378 -132:2:1390 -133:2:1391 -134:2:1395 -135:2:1396 -136:2:1404 -137:2:1409 -138:2:1413 -139:2:1414 -140:2:1421 -141:2:1422 -142:2:1433 -143:2:1434 -144:2:1435 -145:2:1446 -146:2:1451 -147:2:1452 -148:0:2529 -149:2:1464 -150:0:2529 -151:2:1465 -152:0:2529 -153:2:1466 -154:0:2529 -155:2:1467 -156:0:2529 -157:2:1468 -158:2:1472 -159:2:1473 -160:2:1481 -161:2:1482 -162:2:1486 -163:2:1487 -164:2:1495 -165:2:1500 -166:2:1504 -167:2:1505 -168:2:1512 -169:2:1513 -170:2:1524 -171:2:1525 -172:2:1526 -173:2:1537 -174:2:1542 -175:2:1543 -176:0:2529 -177:2:1669 -178:0:2529 -179:2:1765 -180:0:2529 -181:2:1766 -182:0:2529 -183:2:1770 -184:0:2529 -185:2:1776 -186:2:1780 -187:2:1781 -188:2:1789 -189:2:1790 -190:2:1794 -191:2:1795 -192:2:1803 -193:2:1808 -194:2:1812 -195:2:1813 -196:2:1820 -197:2:1821 -198:2:1832 -199:2:1833 -200:2:1834 -201:2:1845 -202:2:1850 -203:2:1851 -204:0:2529 -205:2:1863 -206:0:2529 -207:2:1864 -208:2:1868 -209:2:1869 -210:2:1877 -211:2:1878 -212:2:1882 -213:2:1883 -214:2:1891 -215:2:1896 -216:2:1900 -217:2:1901 -218:2:1908 -219:2:1909 -220:2:1920 -221:2:1921 -222:2:1922 -223:2:1933 -224:2:1938 -225:2:1939 -226:0:2529 -227:2:1951 -228:0:2529 -229:2:1954 -230:2:1955 -231:2:1967 -232:2:1968 -233:2:1972 -234:2:1973 -235:2:1981 -236:2:1986 -237:2:1990 -238:2:1991 -239:2:1998 -240:2:1999 -241:2:2010 -242:2:2011 -243:2:2012 -244:2:2023 -245:2:2028 -246:2:2029 -247:0:2529 -248:2:2041 -249:0:2529 -250:2:2042 -251:0:2529 -252:2:2043 -253:0:2529 -254:2:2044 -255:0:2529 -256:2:2045 -257:2:2049 -258:2:2050 -259:2:2058 -260:2:2059 -261:2:2063 -262:2:2064 -263:2:2072 -264:2:2077 -265:2:2081 -266:2:2082 -267:2:2089 -268:2:2090 -269:2:2101 -270:2:2102 -271:2:2103 -272:2:2114 -273:2:2119 -274:2:2120 -275:0:2529 -276:2:2246 -277:0:2529 -278:2:2342 -279:0:2529 -280:2:2343 -281:0:2529 -282:2:2347 -283:0:2529 -284:2:2353 -285:0:2529 -286:2:2357 -287:2:2358 -288:2:2362 -289:2:2366 -290:2:2367 -291:2:2371 -292:2:2379 -293:2:2380 -294:0:2529 -295:2:2388 -296:0:2529 -297:2:2392 -298:2:2393 -299:2:2397 -300:2:2401 -301:2:2402 -302:2:2406 -303:2:2414 -304:2:2415 -305:0:2529 -306:2:2423 -307:0:2529 -308:2:2431 -309:2:2432 -310:2:2436 -311:2:2440 -312:2:2441 -313:2:2445 -314:2:2453 -315:2:2454 -316:0:2529 -317:2:2466 -318:0:2529 -319:2:2467 -320:0:2529 -321:2:981 -322:0:2529 -323:2:982 -324:2:986 -325:2:987 -326:2:995 -327:2:996 -328:2:1000 -329:2:1001 -330:2:1009 -331:2:1014 -332:2:1018 -333:2:1019 -334:2:1026 -335:2:1027 -336:2:1038 -337:2:1039 -338:2:1040 -339:2:1051 -340:2:1056 -341:2:1057 -342:0:2529 -343:2:1069 -344:2:1070 -345:0:2529 -346:2:1074 -347:2:1078 -348:2:1079 -349:2:1087 -350:2:1088 -351:2:1092 -352:2:1093 -353:2:1101 -354:2:1106 -355:2:1107 -356:2:1118 -357:2:1119 -358:2:1130 -359:2:1131 -360:2:1132 -361:2:1143 -362:2:1148 -363:2:1149 -364:0:2529 -365:2:1161 -366:0:2529 -367:2:1162 -368:0:2529 -369:2:1172 -370:0:2529 -371:2:1173 -372:0:2529 -373:2:1177 -374:2:1178 -375:2:1182 -376:2:1186 -377:2:1187 -378:2:1191 -379:2:1199 -380:2:1200 -381:0:2529 -382:2:1208 -383:0:2529 -384:2:1212 -385:2:1213 -386:2:1217 -387:2:1221 -388:2:1222 -389:2:1226 -390:2:1234 -391:2:1235 -392:0:2529 -393:2:1243 -394:0:2529 -395:2:1251 -396:2:1252 -397:2:1256 -398:2:1260 -399:2:1261 -400:2:1265 -401:2:1273 -402:2:1274 -403:0:2529 -404:2:1286 -405:0:2529 -406:2:1287 -407:2:1291 -408:2:1292 -409:2:1300 -410:2:1301 -411:2:1305 -412:2:1306 -413:2:1314 -414:2:1319 -415:2:1323 -416:2:1324 -417:2:1331 -418:2:1332 -419:2:1343 -420:2:1344 -421:2:1345 -422:2:1356 -423:2:1361 -424:2:1362 -425:0:2529 -426:2:1374 -427:0:2529 -428:2:1377 -429:2:1378 -430:2:1390 -431:2:1391 -432:2:1395 -433:2:1396 -434:2:1404 -435:2:1409 -436:2:1413 -437:2:1414 -438:2:1421 -439:2:1422 -440:2:1433 -441:2:1434 -442:2:1435 -443:2:1446 -444:2:1451 -445:2:1452 -446:0:2529 -447:2:1464 -448:0:2529 -449:2:1465 -450:0:2529 -451:2:1466 -452:0:2529 -453:2:1467 -454:0:2529 -455:2:1468 -456:2:1472 -457:2:1473 -458:2:1481 -459:2:1482 -460:2:1486 -461:2:1487 -462:2:1495 -463:2:1500 -464:2:1504 -465:2:1505 -466:2:1512 -467:2:1513 -468:2:1524 -469:2:1525 -470:2:1526 -471:2:1537 -472:2:1542 -473:2:1543 -474:0:2529 -475:2:1669 -476:0:2529 -477:2:1765 -478:0:2529 -479:2:1766 -480:0:2529 -481:2:1770 -482:0:2529 -483:2:1776 -484:2:1780 -485:2:1781 -486:2:1789 -487:2:1790 -488:2:1794 -489:2:1795 -490:2:1803 -491:2:1808 -492:2:1812 -493:2:1813 -494:2:1820 -495:2:1821 -496:2:1832 -497:2:1833 -498:2:1834 -499:2:1845 -500:2:1850 -501:2:1851 -502:0:2529 -503:2:1863 -504:0:2529 -505:2:1864 -506:2:1868 -507:2:1869 -508:2:1877 -509:2:1878 -510:2:1882 -511:2:1883 -512:2:1891 -513:2:1896 -514:2:1900 -515:2:1901 -516:2:1908 -517:2:1909 -518:2:1920 -519:2:1921 -520:2:1922 -521:2:1933 -522:2:1938 -523:2:1939 -524:0:2529 -525:2:1951 -526:0:2529 -527:2:1954 -528:2:1955 -529:2:1967 -530:2:1968 -531:2:1972 -532:2:1973 -533:2:1981 -534:2:1986 -535:2:1990 -536:2:1991 -537:2:1998 -538:2:1999 -539:2:2010 -540:2:2011 -541:2:2012 -542:2:2023 -543:2:2028 -544:2:2029 -545:0:2529 -546:2:2041 -547:0:2529 -548:2:2042 -549:0:2529 -550:2:2043 -551:0:2529 -552:2:2044 -553:0:2529 -554:2:2045 -555:2:2049 -556:2:2050 -557:2:2058 -558:2:2059 -559:2:2063 -560:2:2064 -561:2:2072 -562:2:2077 -563:2:2081 -564:2:2082 -565:2:2089 -566:2:2090 -567:2:2101 -568:2:2102 -569:2:2103 -570:2:2114 -571:2:2119 -572:2:2120 -573:0:2529 -574:2:2246 -575:0:2529 -576:2:2342 -577:0:2529 -578:2:2343 -579:0:2529 -580:2:2347 -581:0:2529 -582:2:2353 -583:0:2529 -584:2:2357 -585:2:2358 -586:2:2362 -587:2:2366 -588:2:2367 -589:2:2371 -590:2:2379 -591:2:2380 -592:0:2529 -593:2:2388 -594:0:2529 -595:2:2392 -596:2:2393 -597:2:2397 -598:2:2401 -599:2:2402 -600:2:2406 -601:2:2414 -602:2:2415 -603:0:2529 -604:2:2423 -605:0:2529 -606:2:2431 -607:2:2432 -608:2:2436 -609:2:2440 -610:2:2441 -611:2:2445 -612:2:2453 -613:2:2454 -614:0:2529 -615:2:2466 -616:0:2529 -617:2:2467 -618:0:2529 -619:2:981 -620:0:2529 -621:2:982 -622:2:986 -623:2:987 -624:2:995 -625:2:996 -626:2:1000 -627:2:1001 -628:2:1009 -629:2:1014 -630:2:1018 -631:2:1019 -632:2:1026 -633:2:1027 -634:2:1038 -635:2:1039 -636:2:1040 -637:2:1051 -638:2:1056 -639:2:1057 -640:0:2529 -641:2:1069 -642:2:1070 -643:0:2529 -644:2:1074 -645:2:1078 -646:2:1079 -647:2:1087 -648:2:1088 -649:2:1092 -650:2:1093 -651:2:1101 -652:2:1106 -653:2:1107 -654:2:1118 -655:2:1119 -656:2:1130 -657:2:1131 -658:2:1132 -659:2:1143 -660:2:1148 -661:2:1149 -662:0:2529 -663:2:1161 -664:0:2529 -665:2:1162 -666:0:2529 -667:2:1172 -668:0:2529 -669:2:1173 -670:0:2529 -671:2:1177 -672:2:1178 -673:2:1182 -674:2:1186 -675:2:1187 -676:2:1191 -677:2:1199 -678:2:1200 -679:0:2529 -680:2:1208 -681:0:2529 -682:2:1212 -683:2:1213 -684:2:1217 -685:2:1221 -686:2:1222 -687:2:1226 -688:2:1234 -689:2:1235 -690:0:2529 -691:2:1243 -692:0:2529 -693:2:1251 -694:2:1252 -695:2:1256 -696:2:1260 -697:2:1261 -698:2:1265 -699:2:1273 -700:2:1274 -701:0:2529 -702:2:1286 -703:0:2529 -704:2:1287 -705:2:1291 -706:2:1292 -707:2:1300 -708:2:1301 -709:2:1305 -710:2:1306 -711:2:1314 -712:2:1319 -713:2:1323 -714:2:1324 -715:2:1331 -716:2:1332 -717:2:1343 -718:2:1344 -719:2:1345 -720:2:1356 -721:2:1361 -722:2:1362 -723:0:2529 -724:2:1374 -725:0:2529 -726:2:1377 -727:2:1378 -728:2:1390 -729:2:1391 -730:2:1395 -731:2:1396 -732:2:1404 -733:2:1409 -734:2:1413 -735:2:1414 -736:2:1421 -737:2:1422 -738:2:1433 -739:2:1434 -740:2:1435 -741:2:1446 -742:2:1451 -743:2:1452 -744:0:2529 -745:2:1464 -746:0:2529 -747:2:1465 -748:0:2529 -749:2:1466 -750:0:2529 -751:2:1467 -752:0:2529 -753:2:1468 -754:2:1472 -755:2:1473 -756:2:1481 -757:2:1482 -758:2:1486 -759:2:1487 -760:2:1495 -761:2:1500 -762:2:1504 -763:2:1505 -764:2:1512 -765:2:1513 -766:2:1524 -767:2:1525 -768:2:1526 -769:2:1537 -770:2:1542 -771:2:1543 -772:0:2529 -773:2:1669 -774:0:2529 -775:2:1765 -776:0:2529 -777:2:1766 -778:0:2529 -779:2:1770 -780:0:2529 -781:2:1776 -782:2:1780 -783:2:1781 -784:2:1789 -785:2:1790 -786:2:1794 -787:2:1795 -788:2:1803 -789:2:1808 -790:2:1812 -791:2:1813 -792:2:1820 -793:2:1821 -794:2:1832 -795:2:1833 -796:2:1834 -797:2:1845 -798:2:1850 -799:2:1851 -800:0:2529 -801:2:1863 -802:0:2529 -803:2:1864 -804:2:1868 -805:2:1869 -806:2:1877 -807:2:1878 -808:2:1882 -809:2:1883 -810:2:1891 -811:2:1896 -812:2:1900 -813:2:1901 -814:2:1908 -815:2:1909 -816:2:1920 -817:2:1921 -818:2:1922 -819:2:1933 -820:2:1938 -821:2:1939 -822:0:2529 -823:2:1951 -824:0:2529 -825:2:1954 -826:2:1955 -827:2:1967 -828:2:1968 -829:2:1972 -830:2:1973 -831:2:1981 -832:2:1986 -833:2:1990 -834:2:1991 -835:2:1998 -836:2:1999 -837:2:2010 -838:2:2011 -839:2:2012 -840:2:2023 -841:2:2028 -842:2:2029 -843:0:2529 -844:2:2041 -845:0:2529 -846:2:2042 -847:0:2529 -848:2:2043 -849:0:2529 -850:2:2044 -851:0:2529 -852:2:2045 -853:2:2049 -854:2:2050 -855:2:2058 -856:2:2059 -857:2:2063 -858:2:2064 -859:2:2072 -860:2:2077 -861:2:2081 -862:2:2082 -863:2:2089 -864:2:2090 -865:2:2101 -866:2:2102 -867:2:2103 -868:2:2114 -869:2:2119 -870:2:2120 -871:0:2529 -872:2:2246 -873:0:2529 -874:2:2342 -875:0:2529 -876:2:2343 -877:0:2529 -878:2:2347 -879:0:2529 -880:2:2353 -881:0:2529 -882:2:2357 -883:2:2358 -884:2:2362 -885:2:2366 -886:2:2367 -887:2:2371 -888:2:2379 -889:2:2380 -890:0:2529 -891:2:2388 -892:0:2529 -893:2:2392 -894:2:2393 -895:2:2397 -896:2:2401 -897:2:2402 -898:2:2406 -899:2:2414 -900:2:2415 -901:0:2529 -902:2:2423 -903:0:2529 -904:2:2431 -905:2:2432 -906:2:2436 -907:2:2440 -908:2:2441 -909:2:2445 -910:2:2453 -911:2:2454 -912:0:2529 -913:2:2466 -914:0:2529 -915:2:2467 -916:0:2529 -917:2:981 -918:0:2529 -919:2:982 -920:2:986 -921:2:987 -922:2:995 -923:2:996 -924:2:1000 -925:2:1001 -926:2:1009 -927:2:1014 -928:2:1018 -929:2:1019 -930:2:1026 -931:2:1027 -932:2:1038 -933:2:1039 -934:2:1040 -935:2:1051 -936:2:1056 -937:2:1057 -938:0:2529 -939:2:1069 -940:2:1070 -941:0:2529 -942:2:1074 -943:2:1078 -944:2:1079 -945:2:1087 -946:2:1088 -947:2:1092 -948:2:1093 -949:2:1101 -950:2:1106 -951:2:1107 -952:2:1118 -953:2:1119 -954:2:1130 -955:2:1131 -956:2:1132 -957:2:1143 -958:2:1148 -959:2:1149 -960:0:2529 -961:2:1161 -962:0:2529 -963:2:1162 -964:0:2529 -965:2:1172 -966:0:2529 -967:2:1173 -968:0:2529 -969:2:1177 -970:2:1178 -971:2:1182 -972:2:1186 -973:2:1187 -974:2:1191 -975:2:1199 -976:2:1200 -977:0:2529 -978:2:1208 -979:0:2529 -980:2:1212 -981:2:1213 -982:2:1217 -983:2:1221 -984:2:1222 -985:2:1226 -986:2:1234 -987:2:1235 -988:0:2529 -989:2:1243 -990:0:2529 -991:2:1251 -992:2:1252 -993:2:1256 -994:2:1260 -995:2:1261 -996:2:1265 -997:2:1273 -998:2:1274 -999:0:2529 -1000:2:1286 -1001:0:2529 -1002:2:1287 -1003:2:1291 -1004:2:1292 -1005:2:1300 -1006:2:1301 -1007:2:1305 -1008:2:1306 -1009:2:1314 -1010:2:1319 -1011:2:1323 -1012:2:1324 -1013:2:1331 -1014:2:1332 -1015:2:1343 -1016:2:1344 -1017:2:1345 -1018:2:1356 -1019:2:1361 -1020:2:1362 -1021:0:2529 -1022:2:1374 -1023:0:2529 -1024:2:1377 -1025:2:1378 -1026:2:1390 -1027:2:1391 -1028:2:1395 -1029:2:1396 -1030:2:1404 -1031:2:1409 -1032:2:1413 -1033:2:1414 -1034:2:1421 -1035:2:1422 -1036:2:1433 -1037:2:1434 -1038:2:1435 -1039:2:1446 -1040:2:1451 -1041:2:1452 -1042:0:2529 -1043:2:1464 -1044:0:2529 -1045:2:1465 -1046:0:2529 -1047:2:1466 -1048:0:2529 -1049:2:1467 -1050:0:2529 -1051:2:1468 -1052:2:1472 -1053:2:1473 -1054:2:1481 -1055:2:1482 -1056:2:1486 -1057:2:1487 -1058:2:1495 -1059:2:1500 -1060:2:1504 -1061:2:1505 -1062:2:1512 -1063:2:1513 -1064:2:1524 -1065:2:1525 -1066:2:1526 -1067:2:1537 -1068:2:1542 -1069:2:1543 -1070:0:2529 -1071:2:1669 -1072:0:2529 -1073:2:1765 -1074:0:2529 -1075:2:1766 -1076:0:2529 -1077:2:1770 -1078:0:2529 -1079:2:1776 -1080:2:1780 -1081:2:1781 -1082:2:1789 -1083:2:1790 -1084:2:1794 -1085:2:1795 -1086:2:1803 -1087:2:1808 -1088:2:1812 -1089:2:1813 -1090:2:1820 -1091:2:1821 -1092:2:1832 -1093:2:1833 -1094:2:1834 -1095:2:1845 -1096:2:1850 -1097:2:1851 -1098:0:2529 -1099:2:1863 -1100:0:2529 -1101:2:1864 -1102:2:1868 -1103:2:1869 -1104:2:1877 -1105:2:1878 -1106:2:1882 -1107:2:1883 -1108:2:1891 -1109:2:1896 -1110:2:1900 -1111:2:1901 -1112:2:1908 -1113:2:1909 -1114:2:1920 -1115:2:1921 -1116:2:1922 -1117:2:1933 -1118:2:1938 -1119:2:1939 -1120:0:2529 -1121:2:1951 -1122:0:2529 -1123:2:1954 -1124:2:1955 -1125:2:1967 -1126:2:1968 -1127:2:1972 -1128:2:1973 -1129:2:1981 -1130:2:1986 -1131:2:1990 -1132:2:1991 -1133:2:1998 -1134:2:1999 -1135:2:2010 -1136:2:2011 -1137:2:2012 -1138:2:2023 -1139:2:2028 -1140:2:2029 -1141:0:2529 -1142:2:2041 -1143:0:2529 -1144:2:2042 -1145:0:2529 -1146:2:2043 -1147:0:2529 -1148:2:2044 -1149:0:2529 -1150:2:2045 -1151:2:2049 -1152:2:2050 -1153:2:2058 -1154:2:2059 -1155:2:2063 -1156:2:2064 -1157:2:2072 -1158:2:2077 -1159:2:2081 -1160:2:2082 -1161:2:2089 -1162:2:2090 -1163:2:2101 -1164:2:2102 -1165:2:2103 -1166:2:2114 -1167:2:2119 -1168:2:2120 -1169:0:2529 -1170:2:2246 -1171:0:2529 -1172:2:2342 -1173:0:2529 -1174:2:2343 -1175:0:2529 -1176:2:2347 -1177:0:2529 -1178:2:2353 -1179:0:2529 -1180:2:2357 -1181:2:2358 -1182:2:2362 -1183:2:2366 -1184:2:2367 -1185:2:2371 -1186:2:2379 -1187:2:2380 -1188:0:2529 -1189:2:2388 -1190:0:2529 -1191:2:2392 -1192:2:2393 -1193:2:2397 -1194:2:2401 -1195:2:2402 -1196:2:2406 -1197:2:2414 -1198:2:2415 -1199:0:2529 -1200:2:2423 -1201:0:2529 -1202:2:2431 -1203:2:2432 -1204:2:2436 -1205:2:2440 -1206:2:2441 -1207:2:2445 -1208:2:2453 -1209:2:2454 -1210:0:2529 -1211:2:2466 -1212:0:2529 -1213:2:2467 -1214:0:2529 -1215:2:981 -1216:0:2529 -1217:2:982 -1218:2:986 -1219:2:987 -1220:2:995 -1221:2:996 -1222:2:1000 -1223:2:1001 -1224:2:1009 -1225:2:1014 -1226:2:1018 -1227:2:1019 -1228:2:1026 -1229:2:1027 -1230:2:1038 -1231:2:1039 -1232:2:1040 -1233:2:1051 -1234:2:1056 -1235:2:1057 -1236:0:2529 -1237:2:1069 -1238:2:1070 -1239:0:2529 -1240:2:1074 -1241:2:1078 -1242:2:1079 -1243:2:1087 -1244:2:1088 -1245:2:1092 -1246:2:1093 -1247:2:1101 -1248:2:1114 -1249:2:1115 -1250:2:1118 -1251:2:1119 -1252:2:1130 -1253:2:1131 -1254:2:1132 -1255:2:1143 -1256:2:1148 -1257:2:1151 -1258:2:1152 -1259:0:2529 -1260:2:1161 -1261:0:2529 -1262:2:1162 -1263:0:2529 -1264:2:1172 -1265:0:2529 -1266:2:1173 -1267:0:2529 -1268:1:2 -1269:0:2529 -1270:1:8 -1271:0:2529 -1272:1:9 -1273:0:2529 -1274:1:10 -1275:0:2529 -1276:1:11 -1277:0:2529 -1278:1:12 -1279:1:16 -1280:1:17 -1281:1:25 -1282:1:26 -1283:1:30 -1284:1:31 -1285:1:39 -1286:1:44 -1287:1:48 -1288:1:49 -1289:1:56 -1290:1:57 -1291:1:68 -1292:1:69 -1293:1:70 -1294:1:81 -1295:1:86 -1296:1:87 -1297:0:2529 -1298:2:1177 -1299:2:1178 -1300:2:1182 -1301:2:1186 -1302:2:1187 -1303:2:1191 -1304:2:1196 -1305:0:2529 -1306:2:1208 -1307:0:2529 -1308:2:1212 -1309:2:1213 -1310:2:1217 -1311:2:1221 -1312:2:1222 -1313:2:1226 -1314:2:1234 -1315:2:1235 -1316:0:2529 -1317:2:1243 -1318:0:2529 -1319:2:1251 -1320:2:1252 -1321:2:1256 -1322:2:1260 -1323:2:1261 -1324:2:1265 -1325:2:1273 -1326:2:1274 -1327:0:2529 -1328:2:1286 -1329:0:2529 -1330:2:1287 -1331:2:1291 -1332:2:1292 -1333:2:1300 -1334:2:1301 -1335:2:1305 -1336:2:1306 -1337:2:1314 -1338:2:1319 -1339:2:1323 -1340:2:1324 -1341:2:1331 -1342:2:1332 -1343:2:1343 -1344:2:1344 -1345:2:1345 -1346:2:1356 -1347:2:1361 -1348:2:1362 -1349:0:2529 -1350:2:1374 -1351:0:2529 -1352:2:1377 -1353:2:1378 -1354:2:1390 -1355:2:1391 -1356:2:1395 -1357:2:1396 -1358:2:1404 -1359:2:1409 -1360:2:1413 -1361:2:1414 -1362:2:1421 -1363:2:1422 -1364:2:1433 -1365:2:1434 -1366:2:1435 -1367:2:1446 -1368:2:1451 -1369:2:1452 -1370:0:2529 -1371:2:1464 -1372:0:2529 -1373:2:1465 -1374:0:2529 -1375:2:1466 -1376:0:2529 -1377:2:1467 -1378:0:2529 -1379:2:1468 -1380:2:1472 -1381:2:1473 -1382:2:1481 -1383:2:1482 -1384:2:1486 -1385:2:1487 -1386:2:1495 -1387:2:1500 -1388:2:1504 -1389:2:1505 -1390:2:1512 -1391:2:1513 -1392:2:1524 -1393:2:1525 -1394:2:1526 -1395:2:1537 -1396:2:1542 -1397:2:1543 -1398:0:2529 -1399:2:1669 -1400:0:2529 -1401:2:1765 -1402:0:2529 -1403:2:1766 -1404:0:2529 -1405:2:1770 -1406:0:2529 -1407:2:1776 -1408:2:1780 -1409:2:1781 -1410:2:1789 -1411:2:1790 -1412:2:1794 -1413:2:1795 -1414:2:1803 -1415:2:1808 -1416:2:1812 -1417:2:1813 -1418:2:1820 -1419:2:1821 -1420:2:1832 -1421:2:1833 -1422:2:1834 -1423:2:1845 -1424:2:1850 -1425:2:1851 -1426:0:2529 -1427:2:1863 -1428:0:2529 -1429:2:1864 -1430:2:1868 -1431:2:1869 -1432:2:1877 -1433:2:1878 -1434:2:1882 -1435:2:1883 -1436:2:1891 -1437:2:1896 -1438:2:1900 -1439:2:1901 -1440:2:1908 -1441:2:1909 -1442:2:1920 -1443:2:1921 -1444:2:1922 -1445:2:1933 -1446:2:1938 -1447:2:1939 -1448:0:2529 -1449:2:1951 -1450:0:2529 -1451:2:1954 -1452:2:1955 -1453:2:1967 -1454:2:1968 -1455:2:1972 -1456:2:1973 -1457:2:1981 -1458:2:1986 -1459:2:1990 -1460:2:1991 -1461:2:1998 -1462:2:1999 -1463:2:2010 -1464:2:2011 -1465:2:2012 -1466:2:2023 -1467:2:2028 -1468:2:2029 -1469:0:2529 -1470:2:2041 -1471:0:2529 -1472:2:2042 -1473:0:2529 -1474:2:2043 -1475:0:2529 -1476:2:2044 -1477:0:2529 -1478:2:2045 -1479:2:2049 -1480:2:2050 -1481:2:2058 -1482:2:2059 -1483:2:2063 -1484:2:2064 -1485:2:2072 -1486:2:2077 -1487:2:2081 -1488:2:2082 -1489:2:2089 -1490:2:2090 -1491:2:2101 -1492:2:2102 -1493:2:2103 -1494:2:2114 -1495:2:2119 -1496:2:2120 -1497:0:2529 -1498:2:2246 -1499:0:2529 -1500:2:2342 -1501:0:2529 -1502:2:2343 -1503:0:2529 -1504:2:2347 -1505:0:2529 -1506:2:2353 -1507:0:2529 -1508:2:2357 -1509:2:2358 -1510:2:2362 -1511:2:2366 -1512:2:2367 -1513:2:2371 -1514:2:2379 -1515:2:2380 -1516:0:2529 -1517:2:2388 -1518:0:2529 -1519:2:2392 -1520:2:2393 -1521:2:2397 -1522:2:2401 -1523:2:2402 -1524:2:2406 -1525:2:2414 -1526:2:2415 -1527:0:2529 -1528:2:2423 -1529:0:2529 -1530:2:2431 -1531:2:2432 -1532:2:2436 -1533:2:2440 -1534:2:2441 -1535:2:2445 -1536:2:2453 -1537:2:2454 -1538:0:2529 -1539:2:2466 -1540:0:2529 -1541:2:2467 -1542:0:2529 -1543:2:2470 -1544:0:2529 -1545:2:2475 -1546:0:2529 -1547:1:99 -1548:0:2529 -1549:2:2476 -1550:0:2529 -1551:1:100 -1552:1:104 -1553:1:105 -1554:1:113 -1555:1:114 -1556:1:118 -1557:1:119 -1558:1:127 -1559:1:132 -1560:1:136 -1561:1:137 -1562:1:144 -1563:1:145 -1564:1:156 -1565:1:157 -1566:1:158 -1567:1:169 -1568:1:181 -1569:1:182 -1570:0:2529 -1571:2:2475 -1572:0:2529 -1573:1:187 -1574:0:2529 -1575:2:2476 -1576:0:2529 -1577:1:188 -1578:0:2529 -1579:2:2475 -1580:0:2529 -1581:1:189 -1582:1:193 -1583:1:194 -1584:1:202 -1585:1:203 -1586:1:207 -1587:1:208 -1588:1:216 -1589:1:221 -1590:1:225 -1591:1:226 -1592:1:233 -1593:1:234 -1594:1:245 -1595:1:246 -1596:1:247 -1597:1:258 -1598:1:270 -1599:1:271 -1600:0:2529 -1601:2:2476 -1602:0:2529 -1603:1:276 -1604:0:2529 -1605:2:2475 -1606:0:2529 -1607:1:393 -1608:0:2529 -1609:2:2476 -1610:0:2529 -1611:1:394 -1612:0:2529 -1613:2:2475 -1614:0:2529 -1615:1:11 -1616:0:2529 -1617:2:2476 -1618:0:2529 -1619:1:12 -1620:1:16 -1621:1:17 -1622:1:25 -1623:1:26 -1624:1:27 -1625:1:39 -1626:1:44 -1627:1:48 -1628:1:49 -1629:1:56 -1630:1:57 -1631:1:68 -1632:1:69 -1633:1:70 -1634:1:81 -1635:1:93 -1636:1:94 -1637:0:2529 -1638:2:2475 -1639:0:2529 -1640:1:99 -1641:0:2529 -1642:2:2476 -1643:0:2529 -1644:1:100 -1645:1:104 -1646:1:105 -1647:1:113 -1648:1:114 -1649:1:118 -1650:1:119 -1651:1:127 -1652:1:132 -1653:1:136 -1654:1:137 -1655:1:144 -1656:1:145 -1657:1:156 -1658:1:157 -1659:1:158 -1660:1:169 -1661:1:181 -1662:1:182 -1663:0:2529 -1664:2:2475 -1665:0:2529 -1666:1:279 -1667:0:2529 -1668:2:2476 -1669:0:2529 -1670:1:280 -1671:0:2529 -1672:2:2475 -1673:0:2529 -1674:1:393 -1675:0:2529 -1676:2:2476 -1677:0:2529 -1678:1:394 -1679:0:2529 -1680:2:2475 -1681:0:2529 -1682:1:399 -1683:0:2529 -1684:2:2476 -1685:0:2529 -1686:1:404 -1687:1:408 -1688:1:409 -1689:1:417 -1690:1:418 -1691:1:419 -1692:1:431 -1693:1:436 -1694:1:440 -1695:1:441 -1696:1:448 -1697:1:449 -1698:1:460 -1699:1:461 -1700:1:462 -1701:1:473 -1702:1:485 -1703:1:486 -1704:0:2529 -1705:2:2475 -1706:0:2529 -1707:1:491 -1708:0:2529 -1709:2:2476 -1710:0:2529 -1711:1:492 -1712:1:496 -1713:1:497 -1714:1:505 -1715:1:506 -1716:1:510 -1717:1:511 -1718:1:519 -1719:1:524 -1720:1:528 -1721:1:529 -1722:1:536 -1723:1:537 -1724:1:548 -1725:1:549 -1726:1:550 -1727:1:561 -1728:1:566 -1729:1:567 -1730:0:2529 -1731:2:2475 -1732:0:2529 -1733:1:579 -1734:0:2527 -1735:2:2476 -1736:0:2533 -1737:1:662 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_wmb.define b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_wmb.log b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_wmb.log deleted file mode 100644 index 477c85d..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_wmb.log +++ /dev/null @@ -1,381 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_wmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 567) -pan: claim violated! (at depth 1889) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 6646, errors: 1 - 377244 states, stored - 5291719 states, matched - 5668963 transitions (= stored+matched) - 20822372 atomic steps -hash conflicts: 405371 (resolved) - -Stats on memory usage (in Megabytes): - 30.221 equivalent memory usage for states (stored*(State-vector + overhead)) - 23.526 actual memory usage for states (compression: 77.85%) - state-vector as stored = 37 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 489.201 total actual memory usage - -unreached in proctype urcu_reader - line 289, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 61, "(1)" - line 308, "pan.___", state 91, "(1)" - line 289, "pan.___", state 104, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 136, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 149, "(1)" - line 308, "pan.___", state 179, "(1)" - line 289, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 225, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 238, "(1)" - line 308, "pan.___", state 268, "(1)" - line 144, "pan.___", state 290, "(1)" - line 148, "pan.___", state 298, "(1)" - line 148, "pan.___", state 299, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 299, "else" - line 146, "pan.___", state 304, "((j<1))" - line 146, "pan.___", state 304, "((j>=1))" - line 152, "pan.___", state 310, "(1)" - line 152, "pan.___", state 311, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 311, "else" - line 186, "pan.___", state 316, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 186, "pan.___", state 316, "else" - line 144, "pan.___", state 322, "(1)" - line 148, "pan.___", state 330, "(1)" - line 148, "pan.___", state 331, "(!((cache_dirty_urcu_active_readers.bitfield&(1<=1))" - line 152, "pan.___", state 342, "(1)" - line 152, "pan.___", state 343, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 144, "pan.___", state 358, "(1)" - line 148, "pan.___", state 366, "(1)" - line 148, "pan.___", state 367, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 367, "else" - line 146, "pan.___", state 372, "((j<1))" - line 146, "pan.___", state 372, "((j>=1))" - line 152, "pan.___", state 378, "(1)" - line 152, "pan.___", state 379, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 379, "else" - line 186, "pan.___", state 384, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 186, "pan.___", state 384, "else" - line 289, "pan.___", state 399, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 415, "(1)" - line 298, "pan.___", state 431, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 444, "(1)" - line 308, "pan.___", state 474, "(1)" - line 289, "pan.___", state 487, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 519, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 532, "(1)" - line 308, "pan.___", state 562, "(1)" - line 289, "pan.___", state 575, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 607, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 620, "(1)" - line 308, "pan.___", state 650, "(1)" - line 144, "pan.___", state 666, "(1)" - line 148, "pan.___", state 674, "(1)" - line 148, "pan.___", state 675, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 675, "else" - line 146, "pan.___", state 680, "((j<1))" - line 146, "pan.___", state 680, "((j>=1))" - line 152, "pan.___", state 686, "(1)" - line 152, "pan.___", state 687, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 687, "else" - line 186, "pan.___", state 692, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 186, "pan.___", state 692, "else" - line 144, "pan.___", state 698, "(1)" - line 148, "pan.___", state 706, "(1)" - line 148, "pan.___", state 707, "(!((cache_dirty_urcu_active_readers.bitfield&(1<=1))" - line 152, "pan.___", state 718, "(1)" - line 152, "pan.___", state 719, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 144, "pan.___", state 734, "(1)" - line 148, "pan.___", state 742, "(1)" - line 148, "pan.___", state 743, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 743, "else" - line 146, "pan.___", state 748, "((j<1))" - line 146, "pan.___", state 748, "((j>=1))" - line 152, "pan.___", state 754, "(1)" - line 152, "pan.___", state 755, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 755, "else" - line 186, "pan.___", state 760, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 186, "pan.___", state 760, "else" - line 289, "pan.___", state 770, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 802, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 815, "(1)" - line 308, "pan.___", state 845, "(1)" - line 289, "pan.___", state 866, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 882, "(1)" - line 298, "pan.___", state 898, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 911, "(1)" - line 308, "pan.___", state 941, "(1)" - line 434, "pan.___", state 954, "-end-" - (79 of 954 states) -unreached in proctype urcu_writer - line 289, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 289, "pan.___", state 20, "(1)" - line 293, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 34, "(1)" - line 293, "pan.___", state 35, "(1)" - line 293, "pan.___", state 35, "(1)" - line 291, "pan.___", state 40, "((i<1))" - line 291, "pan.___", state 40, "((i>=1))" - line 298, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 59, "(1)" - line 299, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 299, "pan.___", state 60, "else" - line 299, "pan.___", state 63, "(1)" - line 299, "pan.___", state 64, "(1)" - line 299, "pan.___", state 64, "(1)" - line 303, "pan.___", state 72, "(1)" - line 303, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 303, "pan.___", state 73, "else" - line 303, "pan.___", state 76, "(1)" - line 303, "pan.___", state 77, "(1)" - line 303, "pan.___", state 77, "(1)" - line 301, "pan.___", state 82, "((i<1))" - line 301, "pan.___", state 82, "((i>=1))" - line 308, "pan.___", state 89, "(1)" - line 308, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 308, "pan.___", state 90, "else" - line 308, "pan.___", state 93, "(1)" - line 308, "pan.___", state 94, "(1)" - line 308, "pan.___", state 94, "(1)" - line 310, "pan.___", state 97, "(1)" - line 310, "pan.___", state 97, "(1)" - line 456, "pan.___", state 101, "cached_generation_ptr.val[_pid] = (old_gen+1)" - line 454, "pan.___", state 102, "old_gen = cached_generation_ptr.val[_pid]" - line 289, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 289, "pan.___", state 112, "(1)" - line 293, "pan.___", state 120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 126, "(1)" - line 293, "pan.___", state 127, "(1)" - line 293, "pan.___", state 127, "(1)" - line 291, "pan.___", state 132, "((i<1))" - line 291, "pan.___", state 132, "((i>=1))" - line 299, "pan.___", state 151, "(1)" - line 299, "pan.___", state 152, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 299, "pan.___", state 152, "else" - line 299, "pan.___", state 155, "(1)" - line 299, "pan.___", state 156, "(1)" - line 299, "pan.___", state 156, "(1)" - line 303, "pan.___", state 164, "(1)" - line 303, "pan.___", state 165, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 303, "pan.___", state 165, "else" - line 303, "pan.___", state 168, "(1)" - line 303, "pan.___", state 169, "(1)" - line 303, "pan.___", state 169, "(1)" - line 301, "pan.___", state 174, "((i<1))" - line 301, "pan.___", state 174, "((i>=1))" - line 308, "pan.___", state 181, "(1)" - line 308, "pan.___", state 182, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 308, "pan.___", state 182, "else" - line 308, "pan.___", state 185, "(1)" - line 308, "pan.___", state 186, "(1)" - line 308, "pan.___", state 186, "(1)" - line 310, "pan.___", state 189, "(1)" - line 310, "pan.___", state 189, "(1)" - line 468, "pan.___", state 195, "(1)" - line 462, "pan.___", state 198, "((write_lock==0))" - line 462, "pan.___", state 198, "else" - line 460, "pan.___", state 199, "(1)" - line 144, "pan.___", state 206, "(1)" - line 148, "pan.___", state 214, "(1)" - line 148, "pan.___", state 215, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 215, "else" - line 146, "pan.___", state 220, "((j<1))" - line 146, "pan.___", state 220, "((j>=1))" - line 152, "pan.___", state 226, "(1)" - line 152, "pan.___", state 227, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 227, "else" - line 186, "pan.___", state 232, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 186, "pan.___", state 232, "else" - line 144, "pan.___", state 238, "(1)" - line 152, "pan.___", state 258, "(1)" - line 144, "pan.___", state 274, "(1)" - line 148, "pan.___", state 282, "(1)" - line 152, "pan.___", state 294, "(1)" - line 289, "pan.___", state 310, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 324, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 342, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 355, "(1)" - line 303, "pan.___", state 368, "(1)" - line 308, "pan.___", state 385, "(1)" - line 289, "pan.___", state 402, "(1)" - line 293, "pan.___", state 414, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 432, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 458, "(1)" - line 308, "pan.___", state 475, "(1)" - line 293, "pan.___", state 505, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 523, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 549, "(1)" - line 308, "pan.___", state 566, "(1)" - line 148, "pan.___", state 588, "(1)" - line 152, "pan.___", state 600, "(1)" - line 144, "pan.___", state 612, "(1)" - line 152, "pan.___", state 632, "(1)" - line 148, "pan.___", state 656, "(1)" - line 152, "pan.___", state 668, "(1)" - line 289, "pan.___", state 692, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 289, "pan.___", state 694, "(1)" - line 289, "pan.___", state 695, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 289, "pan.___", state 695, "else" - line 289, "pan.___", state 698, "(1)" - line 293, "pan.___", state 706, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 708, "(1)" - line 293, "pan.___", state 709, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 293, "pan.___", state 709, "else" - line 293, "pan.___", state 712, "(1)" - line 293, "pan.___", state 713, "(1)" - line 293, "pan.___", state 713, "(1)" - line 291, "pan.___", state 718, "((i<1))" - line 291, "pan.___", state 718, "((i>=1))" - line 298, "pan.___", state 724, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 737, "(1)" - line 299, "pan.___", state 738, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 299, "pan.___", state 738, "else" - line 299, "pan.___", state 741, "(1)" - line 299, "pan.___", state 742, "(1)" - line 299, "pan.___", state 742, "(1)" - line 303, "pan.___", state 750, "(1)" - line 303, "pan.___", state 751, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 303, "pan.___", state 751, "else" - line 303, "pan.___", state 754, "(1)" - line 303, "pan.___", state 755, "(1)" - line 303, "pan.___", state 755, "(1)" - line 301, "pan.___", state 760, "((i<1))" - line 301, "pan.___", state 760, "((i>=1))" - line 308, "pan.___", state 767, "(1)" - line 308, "pan.___", state 768, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 308, "pan.___", state 768, "else" - line 308, "pan.___", state 771, "(1)" - line 308, "pan.___", state 772, "(1)" - line 308, "pan.___", state 772, "(1)" - line 310, "pan.___", state 775, "(1)" - line 310, "pan.___", state 775, "(1)" - line 293, "pan.___", state 804, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 822, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 848, "(1)" - line 308, "pan.___", state 865, "(1)" - line 293, "pan.___", state 892, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 936, "(1)" - line 308, "pan.___", state 953, "(1)" - line 289, "pan.___", state 970, "(1)" - line 293, "pan.___", state 982, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1000, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 1026, "(1)" - line 308, "pan.___", state 1043, "(1)" - line 293, "pan.___", state 1073, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1091, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 1117, "(1)" - line 308, "pan.___", state 1134, "(1)" - line 148, "pan.___", state 1156, "(1)" - line 152, "pan.___", state 1168, "(1)" - line 144, "pan.___", state 1180, "(1)" - line 152, "pan.___", state 1200, "(1)" - line 148, "pan.___", state 1224, "(1)" - line 152, "pan.___", state 1236, "(1)" - line 289, "pan.___", state 1260, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 289, "pan.___", state 1262, "(1)" - line 289, "pan.___", state 1263, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 289, "pan.___", state 1263, "else" - line 289, "pan.___", state 1266, "(1)" - line 293, "pan.___", state 1274, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 1276, "(1)" - line 293, "pan.___", state 1277, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 293, "pan.___", state 1277, "else" - line 293, "pan.___", state 1280, "(1)" - line 293, "pan.___", state 1281, "(1)" - line 293, "pan.___", state 1281, "(1)" - line 291, "pan.___", state 1286, "((i<1))" - line 291, "pan.___", state 1286, "((i>=1))" - line 298, "pan.___", state 1292, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 1305, "(1)" - line 299, "pan.___", state 1306, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 299, "pan.___", state 1306, "else" - line 299, "pan.___", state 1309, "(1)" - line 299, "pan.___", state 1310, "(1)" - line 299, "pan.___", state 1310, "(1)" - line 303, "pan.___", state 1318, "(1)" - line 303, "pan.___", state 1319, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 303, "pan.___", state 1319, "else" - line 303, "pan.___", state 1322, "(1)" - line 303, "pan.___", state 1323, "(1)" - line 303, "pan.___", state 1323, "(1)" - line 301, "pan.___", state 1328, "((i<1))" - line 301, "pan.___", state 1328, "((i>=1))" - line 308, "pan.___", state 1335, "(1)" - line 308, "pan.___", state 1336, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 308, "pan.___", state 1336, "else" - line 308, "pan.___", state 1339, "(1)" - line 308, "pan.___", state 1340, "(1)" - line 308, "pan.___", state 1340, "(1)" - line 310, "pan.___", state 1343, "(1)" - line 310, "pan.___", state 1343, "(1)" - line 148, "pan.___", state 1367, "(1)" - line 152, "pan.___", state 1379, "(1)" - line 144, "pan.___", state 1391, "(1)" - line 152, "pan.___", state 1411, "(1)" - line 148, "pan.___", state 1435, "(1)" - line 152, "pan.___", state 1447, "(1)" - line 511, "pan.___", state 1473, "-end-" - (159 of 1473 states) -unreached in proctype :init: - line 518, "pan.___", state 9, "((j<2))" - line 518, "pan.___", state 9, "((j>=2))" - line 519, "pan.___", state 20, "((j<2))" - line 519, "pan.___", state 20, "((j>=2))" - line 524, "pan.___", state 33, "((j<2))" - line 524, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 572, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 10.4 seconds -pan: rate 36378.399 states/second -pan: avg transition delay 1.8293e-06 usec -cp .input.spin urcu_free_no_wmb.spin.input -cp .input.spin.trail urcu_free_no_wmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input deleted file mode 100644 index 12cde50..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input +++ /dev/null @@ -1,532 +0,0 @@ -#define NO_WMB - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - - -#if (NR_READERS == 1) - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#elif (NR_READERS == 2) - -#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) -#define read_free (free_done && (data_access[0] || data_access[1])) - -#else - -#error "Too many readers" - -#endif - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - atomic { - if - :: get_readerid() == 0 -> -progress_reader: - skip; - :: else -> - skip; - fi; - } -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input.trail deleted file mode 100644 index ec82525..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input.trail +++ /dev/null @@ -1,1892 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2475 -2:3:2427 -3:3:2430 -4:3:2430 -5:3:2433 -6:3:2441 -7:3:2441 -8:3:2444 -9:3:2450 -10:3:2454 -11:3:2454 -12:3:2457 -13:3:2465 -14:3:2469 -15:3:2470 -16:0:2475 -17:3:2472 -18:0:2475 -19:2:956 -20:0:2475 -21:2:962 -22:0:2475 -23:2:963 -24:0:2475 -25:2:964 -26:2:968 -27:2:969 -28:2:977 -29:2:978 -30:2:982 -31:2:983 -32:2:991 -33:2:996 -34:2:1000 -35:2:1001 -36:2:1008 -37:2:1009 -38:2:1020 -39:2:1021 -40:2:1022 -41:2:1033 -42:2:1038 -43:2:1039 -44:0:2475 -45:2:1051 -46:2:1052 -47:0:2475 -48:2:1056 -49:2:1060 -50:2:1061 -51:2:1069 -52:2:1070 -53:2:1074 -54:2:1075 -55:2:1083 -56:2:1088 -57:2:1089 -58:2:1100 -59:2:1101 -60:2:1112 -61:2:1113 -62:2:1114 -63:2:1125 -64:2:1130 -65:2:1131 -66:0:2475 -67:2:1143 -68:0:2475 -69:2:1144 -70:0:2475 -71:2:1154 -72:0:2475 -73:2:1155 -74:0:2475 -75:2:1156 -76:2:1163 -77:2:1164 -78:2:1171 -79:2:1176 -80:0:2475 -81:2:1187 -82:0:2475 -83:2:1188 -84:2:1195 -85:2:1196 -86:2:1203 -87:2:1208 -88:0:2475 -89:2:1219 -90:0:2475 -91:2:1224 -92:2:1231 -93:2:1232 -94:2:1239 -95:2:1244 -96:0:2475 -97:2:1259 -98:0:2475 -99:2:1260 -100:2:1264 -101:2:1265 -102:2:1273 -103:2:1274 -104:2:1278 -105:2:1279 -106:2:1287 -107:2:1292 -108:2:1296 -109:2:1297 -110:2:1304 -111:2:1305 -112:2:1316 -113:2:1317 -114:2:1318 -115:2:1329 -116:2:1334 -117:2:1335 -118:0:2475 -119:2:1347 -120:0:2475 -121:2:1350 -122:2:1351 -123:2:1363 -124:2:1364 -125:2:1368 -126:2:1369 -127:2:1377 -128:2:1382 -129:2:1386 -130:2:1387 -131:2:1394 -132:2:1395 -133:2:1406 -134:2:1407 -135:2:1408 -136:2:1419 -137:2:1424 -138:2:1425 -139:0:2475 -140:2:1437 -141:0:2475 -142:2:1438 -143:0:2475 -144:2:1439 -145:0:2475 -146:2:1440 -147:0:2475 -148:2:1441 -149:2:1445 -150:2:1446 -151:2:1454 -152:2:1455 -153:2:1459 -154:2:1460 -155:2:1468 -156:2:1473 -157:2:1477 -158:2:1478 -159:2:1485 -160:2:1486 -161:2:1497 -162:2:1498 -163:2:1499 -164:2:1510 -165:2:1515 -166:2:1516 -167:0:2475 -168:2:1633 -169:0:2475 -170:2:1729 -171:0:2475 -172:2:1730 -173:0:2475 -174:2:1734 -175:0:2475 -176:2:1740 -177:2:1744 -178:2:1745 -179:2:1753 -180:2:1754 -181:2:1758 -182:2:1759 -183:2:1767 -184:2:1772 -185:2:1776 -186:2:1777 -187:2:1784 -188:2:1785 -189:2:1796 -190:2:1797 -191:2:1798 -192:2:1809 -193:2:1814 -194:2:1815 -195:0:2475 -196:2:1827 -197:0:2475 -198:2:1828 -199:2:1832 -200:2:1833 -201:2:1841 -202:2:1842 -203:2:1846 -204:2:1847 -205:2:1855 -206:2:1860 -207:2:1864 -208:2:1865 -209:2:1872 -210:2:1873 -211:2:1884 -212:2:1885 -213:2:1886 -214:2:1897 -215:2:1902 -216:2:1903 -217:0:2475 -218:2:1915 -219:0:2475 -220:2:1918 -221:2:1919 -222:2:1931 -223:2:1932 -224:2:1936 -225:2:1937 -226:2:1945 -227:2:1950 -228:2:1954 -229:2:1955 -230:2:1962 -231:2:1963 -232:2:1974 -233:2:1975 -234:2:1976 -235:2:1987 -236:2:1992 -237:2:1993 -238:0:2475 -239:2:2005 -240:0:2475 -241:2:2006 -242:0:2475 -243:2:2007 -244:0:2475 -245:2:2008 -246:0:2475 -247:2:2009 -248:2:2013 -249:2:2014 -250:2:2022 -251:2:2023 -252:2:2027 -253:2:2028 -254:2:2036 -255:2:2041 -256:2:2045 -257:2:2046 -258:2:2053 -259:2:2054 -260:2:2065 -261:2:2066 -262:2:2067 -263:2:2078 -264:2:2083 -265:2:2084 -266:0:2475 -267:2:2201 -268:0:2475 -269:2:2297 -270:0:2475 -271:2:2298 -272:0:2475 -273:2:2302 -274:0:2475 -275:2:2308 -276:0:2475 -277:2:2309 -278:2:2316 -279:2:2317 -280:2:2324 -281:2:2329 -282:0:2475 -283:2:2340 -284:0:2475 -285:2:2341 -286:2:2348 -287:2:2349 -288:2:2356 -289:2:2361 -290:0:2475 -291:2:2372 -292:0:2475 -293:2:2377 -294:2:2384 -295:2:2385 -296:2:2392 -297:2:2397 -298:0:2475 -299:2:2412 -300:0:2475 -301:2:2413 -302:0:2475 -303:2:963 -304:0:2475 -305:2:964 -306:2:968 -307:2:969 -308:2:977 -309:2:978 -310:2:982 -311:2:983 -312:2:991 -313:2:996 -314:2:1000 -315:2:1001 -316:2:1008 -317:2:1009 -318:2:1020 -319:2:1021 -320:2:1022 -321:2:1033 -322:2:1038 -323:2:1039 -324:0:2475 -325:2:1051 -326:2:1052 -327:0:2475 -328:2:1056 -329:2:1060 -330:2:1061 -331:2:1069 -332:2:1070 -333:2:1074 -334:2:1075 -335:2:1083 -336:2:1088 -337:2:1089 -338:2:1100 -339:2:1101 -340:2:1112 -341:2:1113 -342:2:1114 -343:2:1125 -344:2:1130 -345:2:1131 -346:0:2475 -347:2:1143 -348:0:2475 -349:2:1144 -350:0:2475 -351:2:1154 -352:0:2475 -353:2:1155 -354:0:2475 -355:2:1156 -356:2:1163 -357:2:1164 -358:2:1171 -359:2:1176 -360:0:2475 -361:2:1187 -362:0:2475 -363:2:1188 -364:2:1195 -365:2:1196 -366:2:1203 -367:2:1208 -368:0:2475 -369:2:1219 -370:0:2475 -371:2:1224 -372:2:1231 -373:2:1232 -374:2:1239 -375:2:1244 -376:0:2475 -377:2:1259 -378:0:2475 -379:2:1260 -380:2:1264 -381:2:1265 -382:2:1273 -383:2:1274 -384:2:1278 -385:2:1279 -386:2:1287 -387:2:1292 -388:2:1296 -389:2:1297 -390:2:1304 -391:2:1305 -392:2:1316 -393:2:1317 -394:2:1318 -395:2:1329 -396:2:1334 -397:2:1335 -398:0:2475 -399:2:1347 -400:0:2475 -401:2:1350 -402:2:1351 -403:2:1363 -404:2:1364 -405:2:1368 -406:2:1369 -407:2:1377 -408:2:1382 -409:2:1386 -410:2:1387 -411:2:1394 -412:2:1395 -413:2:1406 -414:2:1407 -415:2:1408 -416:2:1419 -417:2:1424 -418:2:1425 -419:0:2475 -420:2:1437 -421:0:2475 -422:2:1438 -423:0:2475 -424:2:1439 -425:0:2475 -426:2:1440 -427:0:2475 -428:2:1441 -429:2:1445 -430:2:1446 -431:2:1454 -432:2:1455 -433:2:1459 -434:2:1460 -435:2:1468 -436:2:1473 -437:2:1477 -438:2:1478 -439:2:1485 -440:2:1486 -441:2:1497 -442:2:1498 -443:2:1499 -444:2:1510 -445:2:1515 -446:2:1516 -447:0:2475 -448:2:1633 -449:0:2475 -450:2:1729 -451:0:2475 -452:2:1730 -453:0:2475 -454:2:1734 -455:0:2475 -456:2:1740 -457:2:1744 -458:2:1745 -459:2:1753 -460:2:1754 -461:2:1758 -462:2:1759 -463:2:1767 -464:2:1772 -465:2:1776 -466:2:1777 -467:2:1784 -468:2:1785 -469:2:1796 -470:2:1797 -471:2:1798 -472:2:1809 -473:2:1814 -474:2:1815 -475:0:2475 -476:2:1827 -477:0:2475 -478:2:1828 -479:2:1832 -480:2:1833 -481:2:1841 -482:2:1842 -483:2:1846 -484:2:1847 -485:2:1855 -486:2:1860 -487:2:1864 -488:2:1865 -489:2:1872 -490:2:1873 -491:2:1884 -492:2:1885 -493:2:1886 -494:2:1897 -495:2:1902 -496:2:1903 -497:0:2475 -498:2:1915 -499:0:2475 -500:2:1918 -501:2:1919 -502:2:1931 -503:2:1932 -504:2:1936 -505:2:1937 -506:2:1945 -507:2:1950 -508:2:1954 -509:2:1955 -510:2:1962 -511:2:1963 -512:2:1974 -513:2:1975 -514:2:1976 -515:2:1987 -516:2:1992 -517:2:1993 -518:0:2475 -519:2:2005 -520:0:2475 -521:2:2006 -522:0:2475 -523:2:2007 -524:0:2475 -525:2:2008 -526:0:2475 -527:2:2009 -528:2:2013 -529:2:2014 -530:2:2022 -531:2:2023 -532:2:2027 -533:2:2028 -534:2:2036 -535:2:2041 -536:2:2045 -537:2:2046 -538:2:2053 -539:2:2054 -540:2:2065 -541:2:2066 -542:2:2067 -543:2:2078 -544:2:2083 -545:2:2084 -546:0:2475 -547:2:2201 -548:0:2475 -549:2:2297 -550:0:2475 -551:2:2298 -552:0:2475 -553:2:2302 -554:0:2475 -555:2:2308 -556:0:2475 -557:2:2309 -558:2:2316 -559:2:2317 -560:2:2324 -561:2:2329 -562:0:2475 -563:2:2340 -564:0:2475 -565:2:2341 -566:2:2348 -567:2:2349 -568:2:2356 -569:2:2361 -570:0:2475 -571:2:2372 -572:0:2475 -573:2:2377 -574:2:2384 -575:2:2385 -576:2:2392 -577:2:2397 -578:0:2475 -579:2:2412 -580:0:2475 -581:2:2413 -582:0:2475 -583:2:963 -584:0:2475 -585:2:964 -586:2:968 -587:2:969 -588:2:977 -589:2:978 -590:2:982 -591:2:983 -592:2:991 -593:2:996 -594:2:1000 -595:2:1001 -596:2:1008 -597:2:1009 -598:2:1020 -599:2:1021 -600:2:1022 -601:2:1033 -602:2:1038 -603:2:1039 -604:0:2475 -605:2:1051 -606:2:1052 -607:0:2475 -608:2:1056 -609:2:1060 -610:2:1061 -611:2:1069 -612:2:1070 -613:2:1074 -614:2:1075 -615:2:1083 -616:2:1088 -617:2:1089 -618:2:1100 -619:2:1101 -620:2:1112 -621:2:1113 -622:2:1114 -623:2:1125 -624:2:1130 -625:2:1131 -626:0:2475 -627:2:1143 -628:0:2475 -629:2:1144 -630:0:2475 -631:2:1154 -632:0:2475 -633:2:1155 -634:0:2475 -635:2:1156 -636:2:1163 -637:2:1164 -638:2:1171 -639:2:1176 -640:0:2475 -641:2:1187 -642:0:2475 -643:2:1188 -644:2:1195 -645:2:1196 -646:2:1203 -647:2:1208 -648:0:2475 -649:2:1219 -650:0:2475 -651:2:1224 -652:2:1231 -653:2:1232 -654:2:1239 -655:2:1244 -656:0:2475 -657:2:1259 -658:0:2475 -659:2:1260 -660:2:1264 -661:2:1265 -662:2:1273 -663:2:1274 -664:2:1278 -665:2:1279 -666:2:1287 -667:2:1292 -668:2:1296 -669:2:1297 -670:2:1304 -671:2:1305 -672:2:1316 -673:2:1317 -674:2:1318 -675:2:1329 -676:2:1334 -677:2:1335 -678:0:2475 -679:2:1347 -680:0:2475 -681:2:1350 -682:2:1351 -683:2:1363 -684:2:1364 -685:2:1368 -686:2:1369 -687:2:1377 -688:2:1382 -689:2:1386 -690:2:1387 -691:2:1394 -692:2:1395 -693:2:1406 -694:2:1407 -695:2:1408 -696:2:1419 -697:2:1424 -698:2:1425 -699:0:2475 -700:2:1437 -701:0:2475 -702:2:1438 -703:0:2475 -704:2:1439 -705:0:2475 -706:2:1440 -707:0:2475 -708:2:1441 -709:2:1445 -710:2:1446 -711:2:1454 -712:2:1455 -713:2:1459 -714:2:1460 -715:2:1468 -716:2:1473 -717:2:1477 -718:2:1478 -719:2:1485 -720:2:1486 -721:2:1497 -722:2:1498 -723:2:1499 -724:2:1510 -725:2:1515 -726:2:1516 -727:0:2475 -728:2:1633 -729:0:2475 -730:2:1729 -731:0:2475 -732:2:1730 -733:0:2475 -734:2:1734 -735:0:2475 -736:2:1740 -737:2:1744 -738:2:1745 -739:2:1753 -740:2:1754 -741:2:1758 -742:2:1759 -743:2:1767 -744:2:1772 -745:2:1776 -746:2:1777 -747:2:1784 -748:2:1785 -749:2:1796 -750:2:1797 -751:2:1798 -752:2:1809 -753:2:1814 -754:2:1815 -755:0:2475 -756:2:1827 -757:0:2475 -758:2:1828 -759:2:1832 -760:2:1833 -761:2:1841 -762:2:1842 -763:2:1846 -764:2:1847 -765:2:1855 -766:2:1860 -767:2:1864 -768:2:1865 -769:2:1872 -770:2:1873 -771:2:1884 -772:2:1885 -773:2:1886 -774:2:1897 -775:2:1902 -776:2:1903 -777:0:2475 -778:2:1915 -779:0:2475 -780:2:1918 -781:2:1919 -782:2:1931 -783:2:1932 -784:2:1936 -785:2:1937 -786:2:1945 -787:2:1950 -788:2:1954 -789:2:1955 -790:2:1962 -791:2:1963 -792:2:1974 -793:2:1975 -794:2:1976 -795:2:1987 -796:2:1992 -797:2:1993 -798:0:2475 -799:2:2005 -800:0:2475 -801:2:2006 -802:0:2475 -803:2:2007 -804:0:2475 -805:2:2008 -806:0:2475 -807:2:2009 -808:2:2013 -809:2:2014 -810:2:2022 -811:2:2023 -812:2:2027 -813:2:2028 -814:2:2036 -815:2:2041 -816:2:2045 -817:2:2046 -818:2:2053 -819:2:2054 -820:2:2065 -821:2:2066 -822:2:2067 -823:2:2078 -824:2:2083 -825:2:2084 -826:0:2475 -827:2:2201 -828:0:2475 -829:2:2297 -830:0:2475 -831:2:2298 -832:0:2475 -833:2:2302 -834:0:2475 -835:2:2308 -836:0:2475 -837:2:2309 -838:2:2316 -839:2:2317 -840:2:2324 -841:2:2329 -842:0:2475 -843:2:2340 -844:0:2475 -845:2:2341 -846:2:2348 -847:2:2349 -848:2:2356 -849:2:2361 -850:0:2475 -851:2:2372 -852:0:2475 -853:2:2377 -854:2:2384 -855:2:2385 -856:2:2392 -857:2:2397 -858:0:2475 -859:2:2412 -860:0:2475 -861:2:2413 -862:0:2475 -863:2:963 -864:0:2475 -865:2:964 -866:2:968 -867:2:969 -868:2:977 -869:2:978 -870:2:982 -871:2:983 -872:2:991 -873:2:996 -874:2:1000 -875:2:1001 -876:2:1008 -877:2:1009 -878:2:1020 -879:2:1021 -880:2:1022 -881:2:1033 -882:2:1038 -883:2:1039 -884:0:2475 -885:2:1051 -886:2:1052 -887:0:2475 -888:2:1056 -889:2:1060 -890:2:1061 -891:2:1069 -892:2:1070 -893:2:1074 -894:2:1075 -895:2:1083 -896:2:1088 -897:2:1089 -898:2:1100 -899:2:1101 -900:2:1112 -901:2:1113 -902:2:1114 -903:2:1125 -904:2:1130 -905:2:1131 -906:0:2475 -907:2:1143 -908:0:2475 -909:2:1144 -910:0:2475 -911:2:1154 -912:0:2475 -913:2:1155 -914:0:2475 -915:2:1156 -916:2:1163 -917:2:1164 -918:2:1171 -919:2:1176 -920:0:2475 -921:2:1187 -922:0:2475 -923:2:1188 -924:2:1195 -925:2:1196 -926:2:1203 -927:2:1208 -928:0:2475 -929:2:1219 -930:0:2475 -931:2:1224 -932:2:1231 -933:2:1232 -934:2:1239 -935:2:1244 -936:0:2475 -937:2:1259 -938:0:2475 -939:2:1260 -940:2:1264 -941:2:1265 -942:2:1273 -943:2:1274 -944:2:1278 -945:2:1279 -946:2:1287 -947:2:1292 -948:2:1296 -949:2:1297 -950:2:1304 -951:2:1305 -952:2:1316 -953:2:1317 -954:2:1318 -955:2:1329 -956:2:1334 -957:2:1335 -958:0:2475 -959:2:1347 -960:0:2475 -961:2:1350 -962:2:1351 -963:2:1363 -964:2:1364 -965:2:1368 -966:2:1369 -967:2:1377 -968:2:1382 -969:2:1386 -970:2:1387 -971:2:1394 -972:2:1395 -973:2:1406 -974:2:1407 -975:2:1408 -976:2:1419 -977:2:1424 -978:2:1425 -979:0:2475 -980:2:1437 -981:0:2475 -982:2:1438 -983:0:2475 -984:2:1439 -985:0:2475 -986:2:1440 -987:0:2475 -988:2:1441 -989:2:1445 -990:2:1446 -991:2:1454 -992:2:1455 -993:2:1459 -994:2:1460 -995:2:1468 -996:2:1473 -997:2:1477 -998:2:1478 -999:2:1485 -1000:2:1486 -1001:2:1497 -1002:2:1498 -1003:2:1499 -1004:2:1510 -1005:2:1515 -1006:2:1516 -1007:0:2475 -1008:2:1633 -1009:0:2475 -1010:2:1729 -1011:0:2475 -1012:2:1730 -1013:0:2475 -1014:2:1734 -1015:0:2475 -1016:2:1740 -1017:2:1744 -1018:2:1745 -1019:2:1753 -1020:2:1754 -1021:2:1758 -1022:2:1759 -1023:2:1767 -1024:2:1772 -1025:2:1776 -1026:2:1777 -1027:2:1784 -1028:2:1785 -1029:2:1796 -1030:2:1797 -1031:2:1798 -1032:2:1809 -1033:2:1814 -1034:2:1815 -1035:0:2475 -1036:2:1827 -1037:0:2475 -1038:2:1828 -1039:2:1832 -1040:2:1833 -1041:2:1841 -1042:2:1842 -1043:2:1846 -1044:2:1847 -1045:2:1855 -1046:2:1860 -1047:2:1864 -1048:2:1865 -1049:2:1872 -1050:2:1873 -1051:2:1884 -1052:2:1885 -1053:2:1886 -1054:2:1897 -1055:2:1902 -1056:2:1903 -1057:0:2475 -1058:2:1915 -1059:0:2475 -1060:2:1918 -1061:2:1919 -1062:2:1931 -1063:2:1932 -1064:2:1936 -1065:2:1937 -1066:2:1945 -1067:2:1950 -1068:2:1954 -1069:2:1955 -1070:2:1962 -1071:2:1963 -1072:2:1974 -1073:2:1975 -1074:2:1976 -1075:2:1987 -1076:2:1992 -1077:2:1993 -1078:0:2475 -1079:2:2005 -1080:0:2475 -1081:2:2006 -1082:0:2475 -1083:2:2007 -1084:0:2475 -1085:2:2008 -1086:0:2475 -1087:2:2009 -1088:2:2013 -1089:2:2014 -1090:2:2022 -1091:2:2023 -1092:2:2027 -1093:2:2028 -1094:2:2036 -1095:2:2041 -1096:2:2045 -1097:2:2046 -1098:2:2053 -1099:2:2054 -1100:2:2065 -1101:2:2066 -1102:2:2067 -1103:2:2078 -1104:2:2083 -1105:2:2084 -1106:0:2475 -1107:2:2201 -1108:0:2475 -1109:2:2297 -1110:0:2475 -1111:2:2298 -1112:0:2475 -1113:2:2302 -1114:0:2475 -1115:2:2308 -1116:0:2475 -1117:2:2309 -1118:2:2316 -1119:2:2317 -1120:2:2324 -1121:2:2329 -1122:0:2475 -1123:2:2340 -1124:0:2475 -1125:2:2341 -1126:2:2348 -1127:2:2349 -1128:2:2356 -1129:2:2361 -1130:0:2475 -1131:2:2372 -1132:0:2475 -1133:2:2377 -1134:2:2384 -1135:2:2385 -1136:2:2392 -1137:2:2397 -1138:0:2475 -1139:2:2412 -1140:0:2475 -1141:2:2413 -1142:0:2475 -1143:2:963 -1144:0:2475 -1145:2:964 -1146:2:968 -1147:2:969 -1148:2:977 -1149:2:978 -1150:2:982 -1151:2:983 -1152:2:991 -1153:2:996 -1154:2:1000 -1155:2:1001 -1156:2:1008 -1157:2:1009 -1158:2:1020 -1159:2:1021 -1160:2:1022 -1161:2:1033 -1162:2:1038 -1163:2:1039 -1164:0:2475 -1165:2:1051 -1166:2:1052 -1167:0:2475 -1168:2:1056 -1169:2:1060 -1170:2:1061 -1171:2:1069 -1172:2:1070 -1173:2:1074 -1174:2:1075 -1175:2:1083 -1176:2:1088 -1177:2:1089 -1178:2:1100 -1179:2:1101 -1180:2:1112 -1181:2:1113 -1182:2:1114 -1183:2:1125 -1184:2:1130 -1185:2:1131 -1186:0:2475 -1187:2:1143 -1188:0:2475 -1189:2:1144 -1190:0:2475 -1191:2:1154 -1192:0:2475 -1193:2:1155 -1194:0:2475 -1195:2:1156 -1196:2:1163 -1197:2:1164 -1198:2:1171 -1199:2:1176 -1200:0:2475 -1201:2:1187 -1202:0:2475 -1203:1:2 -1204:0:2475 -1205:1:8 -1206:0:2475 -1207:1:9 -1208:0:2475 -1209:1:10 -1210:0:2475 -1211:1:11 -1212:0:2475 -1213:1:12 -1214:1:16 -1215:1:17 -1216:1:25 -1217:1:26 -1218:1:30 -1219:1:31 -1220:1:39 -1221:1:44 -1222:1:48 -1223:1:49 -1224:1:56 -1225:1:57 -1226:1:68 -1227:1:69 -1228:1:70 -1229:1:81 -1230:1:93 -1231:1:94 -1232:0:2475 -1233:1:99 -1234:0:2475 -1235:1:100 -1236:1:104 -1237:1:105 -1238:1:113 -1239:1:114 -1240:1:118 -1241:1:119 -1242:1:127 -1243:1:132 -1244:1:136 -1245:1:137 -1246:1:144 -1247:1:145 -1248:1:156 -1249:1:157 -1250:1:158 -1251:1:169 -1252:1:181 -1253:1:182 -1254:0:2475 -1255:1:187 -1256:0:2475 -1257:1:188 -1258:0:2475 -1259:1:189 -1260:1:193 -1261:1:194 -1262:1:202 -1263:1:203 -1264:1:207 -1265:1:208 -1266:1:216 -1267:1:221 -1268:1:225 -1269:1:226 -1270:1:233 -1271:1:234 -1272:1:245 -1273:1:246 -1274:1:247 -1275:1:258 -1276:1:270 -1277:1:271 -1278:0:2475 -1279:1:276 -1280:0:2475 -1281:1:384 -1282:0:2475 -1283:1:385 -1284:0:2475 -1285:1:11 -1286:0:2475 -1287:1:12 -1288:1:16 -1289:1:17 -1290:1:25 -1291:1:26 -1292:1:27 -1293:1:39 -1294:1:44 -1295:1:48 -1296:1:49 -1297:1:56 -1298:1:57 -1299:1:68 -1300:1:69 -1301:1:70 -1302:1:81 -1303:1:93 -1304:1:94 -1305:0:2475 -1306:1:99 -1307:0:2475 -1308:1:100 -1309:1:104 -1310:1:105 -1311:1:113 -1312:1:114 -1313:1:118 -1314:1:119 -1315:1:127 -1316:1:132 -1317:1:136 -1318:1:137 -1319:1:144 -1320:1:145 -1321:1:156 -1322:1:157 -1323:1:158 -1324:1:169 -1325:1:181 -1326:1:182 -1327:0:2475 -1328:1:279 -1329:0:2475 -1330:1:280 -1331:0:2475 -1332:1:384 -1333:0:2475 -1334:1:385 -1335:0:2475 -1336:1:390 -1337:0:2475 -1338:1:395 -1339:1:399 -1340:1:400 -1341:1:408 -1342:1:409 -1343:1:410 -1344:1:422 -1345:1:427 -1346:1:431 -1347:1:432 -1348:1:439 -1349:1:440 -1350:1:451 -1351:1:452 -1352:1:453 -1353:1:464 -1354:1:476 -1355:1:477 -1356:0:2475 -1357:1:482 -1358:0:2475 -1359:1:483 -1360:1:487 -1361:1:488 -1362:1:496 -1363:1:497 -1364:1:501 -1365:1:502 -1366:1:510 -1367:1:515 -1368:1:519 -1369:1:520 -1370:1:527 -1371:1:528 -1372:1:539 -1373:1:540 -1374:1:541 -1375:1:552 -1376:1:564 -1377:1:565 -1378:0:2475 -1379:1:570 -1380:0:2475 -1381:1:571 -1382:1:575 -1383:1:576 -1384:1:584 -1385:1:585 -1386:1:589 -1387:1:590 -1388:1:598 -1389:1:603 -1390:1:607 -1391:1:608 -1392:1:615 -1393:1:616 -1394:1:627 -1395:1:628 -1396:1:629 -1397:1:640 -1398:1:652 -1399:1:653 -1400:0:2475 -1401:1:658 -1402:0:2475 -1403:1:659 -1404:0:2475 -1405:1:660 -1406:0:2475 -1407:1:760 -1408:0:2475 -1409:1:761 -1410:0:2475 -1411:1:765 -1412:0:2475 -1413:1:766 -1414:1:770 -1415:1:771 -1416:1:779 -1417:1:780 -1418:1:784 -1419:1:785 -1420:1:793 -1421:1:798 -1422:1:802 -1423:1:803 -1424:1:810 -1425:1:811 -1426:1:822 -1427:1:823 -1428:1:824 -1429:1:835 -1430:1:847 -1431:1:848 -1432:0:2475 -1433:1:853 -1434:0:2475 -1435:1:660 -1436:0:2475 -1437:1:760 -1438:0:2475 -1439:1:761 -1440:0:2475 -1441:1:765 -1442:0:2475 -1443:1:766 -1444:1:770 -1445:1:771 -1446:1:779 -1447:1:780 -1448:1:781 -1449:1:793 -1450:1:798 -1451:1:802 -1452:1:803 -1453:1:810 -1454:1:811 -1455:1:822 -1456:1:823 -1457:1:824 -1458:1:835 -1459:1:847 -1460:1:848 -1461:0:2475 -1462:1:853 -1463:0:2475 -1464:1:857 -1465:0:2475 -1466:1:862 -1467:1:866 -1468:1:867 -1469:1:875 -1470:1:876 -1471:1:877 -1472:1:889 -1473:1:894 -1474:1:898 -1475:1:899 -1476:1:906 -1477:1:907 -1478:1:918 -1479:1:919 -1480:1:920 -1481:1:931 -1482:1:943 -1483:1:944 -1484:0:2475 -1485:1:9 -1486:0:2475 -1487:1:10 -1488:0:2475 -1489:1:11 -1490:0:2475 -1491:1:12 -1492:1:16 -1493:1:17 -1494:1:25 -1495:1:26 -1496:1:30 -1497:1:31 -1498:1:39 -1499:1:44 -1500:1:48 -1501:1:49 -1502:1:56 -1503:1:57 -1504:1:68 -1505:1:69 -1506:1:70 -1507:1:81 -1508:1:93 -1509:1:94 -1510:0:2475 -1511:1:99 -1512:0:2475 -1513:1:100 -1514:1:104 -1515:1:105 -1516:1:113 -1517:1:114 -1518:1:118 -1519:1:119 -1520:1:127 -1521:1:132 -1522:1:136 -1523:1:137 -1524:1:144 -1525:1:145 -1526:1:156 -1527:1:157 -1528:1:158 -1529:1:169 -1530:1:181 -1531:1:182 -1532:0:2475 -1533:1:187 -1534:0:2475 -1535:1:188 -1536:0:2475 -1537:1:189 -1538:1:193 -1539:1:194 -1540:1:202 -1541:1:203 -1542:1:207 -1543:1:208 -1544:1:216 -1545:1:221 -1546:1:225 -1547:1:226 -1548:1:233 -1549:1:234 -1550:1:245 -1551:1:246 -1552:1:247 -1553:1:258 -1554:1:270 -1555:1:271 -1556:0:2475 -1557:1:276 -1558:0:2475 -1559:1:384 -1560:0:2475 -1561:1:385 -1562:0:2475 -1563:1:11 -1564:0:2475 -1565:1:12 -1566:1:16 -1567:1:17 -1568:1:25 -1569:1:34 -1570:1:35 -1571:1:39 -1572:1:44 -1573:1:48 -1574:1:49 -1575:1:56 -1576:1:57 -1577:1:68 -1578:1:69 -1579:1:72 -1580:1:73 -1581:1:81 -1582:1:93 -1583:1:94 -1584:0:2475 -1585:1:99 -1586:0:2475 -1587:1:100 -1588:1:104 -1589:1:105 -1590:1:113 -1591:1:122 -1592:1:123 -1593:1:127 -1594:1:132 -1595:1:136 -1596:1:137 -1597:1:144 -1598:1:145 -1599:1:156 -1600:1:157 -1601:1:160 -1602:1:161 -1603:1:169 -1604:1:181 -1605:1:182 -1606:0:2475 -1607:1:279 -1608:0:2475 -1609:1:280 -1610:0:2475 -1611:1:384 -1612:0:2475 -1613:1:385 -1614:0:2475 -1615:1:390 -1616:0:2475 -1617:1:395 -1618:1:399 -1619:1:400 -1620:1:408 -1621:1:417 -1622:1:418 -1623:1:422 -1624:1:427 -1625:1:431 -1626:1:432 -1627:1:439 -1628:1:440 -1629:1:451 -1630:1:452 -1631:1:455 -1632:1:456 -1633:1:464 -1634:1:476 -1635:1:477 -1636:0:2475 -1637:1:482 -1638:0:2475 -1639:2:1188 -1640:2:1195 -1641:2:1198 -1642:2:1199 -1643:2:1203 -1644:2:1208 -1645:0:2475 -1646:2:1219 -1647:0:2475 -1648:2:1224 -1649:2:1231 -1650:2:1232 -1651:2:1239 -1652:2:1244 -1653:0:2475 -1654:2:1259 -1655:0:2475 -1656:2:1260 -1657:2:1264 -1658:2:1265 -1659:2:1273 -1660:2:1274 -1661:2:1278 -1662:2:1279 -1663:2:1287 -1664:2:1292 -1665:2:1296 -1666:2:1297 -1667:2:1304 -1668:2:1305 -1669:2:1316 -1670:2:1317 -1671:2:1318 -1672:2:1329 -1673:2:1334 -1674:2:1335 -1675:0:2475 -1676:2:1347 -1677:0:2475 -1678:2:1350 -1679:2:1351 -1680:2:1363 -1681:2:1364 -1682:2:1368 -1683:2:1369 -1684:2:1377 -1685:2:1382 -1686:2:1386 -1687:2:1387 -1688:2:1394 -1689:2:1395 -1690:2:1406 -1691:2:1407 -1692:2:1408 -1693:2:1419 -1694:2:1424 -1695:2:1425 -1696:0:2475 -1697:2:1437 -1698:0:2475 -1699:2:1438 -1700:0:2475 -1701:2:1439 -1702:0:2475 -1703:2:1440 -1704:0:2475 -1705:2:1441 -1706:2:1445 -1707:2:1446 -1708:2:1454 -1709:2:1455 -1710:2:1459 -1711:2:1460 -1712:2:1468 -1713:2:1473 -1714:2:1477 -1715:2:1478 -1716:2:1485 -1717:2:1486 -1718:2:1497 -1719:2:1498 -1720:2:1499 -1721:2:1510 -1722:2:1515 -1723:2:1516 -1724:0:2475 -1725:2:1633 -1726:0:2475 -1727:2:1729 -1728:0:2475 -1729:2:1730 -1730:0:2475 -1731:2:1734 -1732:0:2475 -1733:2:1740 -1734:2:1744 -1735:2:1745 -1736:2:1753 -1737:2:1754 -1738:2:1758 -1739:2:1759 -1740:2:1767 -1741:2:1772 -1742:2:1776 -1743:2:1777 -1744:2:1784 -1745:2:1785 -1746:2:1796 -1747:2:1797 -1748:2:1798 -1749:2:1809 -1750:2:1814 -1751:2:1815 -1752:0:2475 -1753:2:1827 -1754:0:2475 -1755:2:1828 -1756:2:1832 -1757:2:1833 -1758:2:1841 -1759:2:1842 -1760:2:1846 -1761:2:1847 -1762:2:1855 -1763:2:1860 -1764:2:1864 -1765:2:1865 -1766:2:1872 -1767:2:1873 -1768:2:1884 -1769:2:1885 -1770:2:1886 -1771:2:1897 -1772:2:1902 -1773:2:1903 -1774:0:2475 -1775:2:1915 -1776:0:2475 -1777:2:1918 -1778:2:1919 -1779:2:1931 -1780:2:1932 -1781:2:1936 -1782:2:1937 -1783:2:1945 -1784:2:1950 -1785:2:1954 -1786:2:1955 -1787:2:1962 -1788:2:1963 -1789:2:1974 -1790:2:1975 -1791:2:1976 -1792:2:1987 -1793:2:1992 -1794:2:1993 -1795:0:2475 -1796:2:2005 -1797:0:2475 -1798:2:2006 -1799:0:2475 -1800:2:2007 -1801:0:2475 -1802:2:2008 -1803:0:2475 -1804:2:2009 -1805:2:2013 -1806:2:2014 -1807:2:2022 -1808:2:2023 -1809:2:2027 -1810:2:2028 -1811:2:2036 -1812:2:2041 -1813:2:2045 -1814:2:2046 -1815:2:2053 -1816:2:2054 -1817:2:2065 -1818:2:2066 -1819:2:2067 -1820:2:2078 -1821:2:2083 -1822:2:2084 -1823:0:2475 -1824:2:2201 -1825:0:2475 -1826:2:2297 -1827:0:2475 -1828:2:2298 -1829:0:2475 -1830:2:2302 -1831:0:2475 -1832:2:2308 -1833:0:2475 -1834:2:2309 -1835:2:2316 -1836:2:2317 -1837:2:2324 -1838:2:2329 -1839:0:2475 -1840:2:2340 -1841:0:2475 -1842:2:2341 -1843:2:2348 -1844:2:2351 -1845:2:2352 -1846:2:2356 -1847:2:2361 -1848:0:2475 -1849:2:2372 -1850:0:2475 -1851:2:2377 -1852:2:2384 -1853:2:2385 -1854:2:2392 -1855:2:2397 -1856:0:2475 -1857:2:2412 -1858:0:2475 -1859:2:2413 -1860:0:2475 -1861:2:2416 -1862:0:2475 -1863:2:2421 -1864:0:2475 -1865:1:483 -1866:1:487 -1867:1:488 -1868:1:496 -1869:1:497 -1870:1:498 -1871:1:510 -1872:1:515 -1873:1:519 -1874:1:520 -1875:1:527 -1876:1:528 -1877:1:539 -1878:1:540 -1879:1:541 -1880:1:552 -1881:1:557 -1882:1:558 -1883:0:2475 -1884:2:2422 -1885:0:2475 -1886:1:570 -1887:0:2473 -1888:2:2421 -1889:0:2479 -1890:1:151 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_single_flip.define b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_single_flip.log b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_single_flip.log deleted file mode 100644 index 6a9d040..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_single_flip.log +++ /dev/null @@ -1,349 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_single_flip.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 567) -pan: claim violated! (at depth 1353) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 3705, errors: 1 - 216253 states, stored - 2924019 states, matched - 3140272 transitions (= stored+matched) - 11791015 atomic steps -hash conflicts: 155585 (resolved) - -Stats on memory usage (in Megabytes): - 17.324 equivalent memory usage for states (stored*(State-vector + overhead)) - 13.576 actual memory usage for states (compression: 78.37%) - state-vector as stored = 38 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 479.338 total actual memory usage - -unreached in proctype urcu_reader - line 289, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 61, "(1)" - line 308, "pan.___", state 91, "(1)" - line 289, "pan.___", state 104, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 136, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 149, "(1)" - line 308, "pan.___", state 179, "(1)" - line 289, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 225, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 238, "(1)" - line 308, "pan.___", state 268, "(1)" - line 159, "pan.___", state 289, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 291, "(1)" - line 163, "pan.___", state 298, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 300, "(1)" - line 163, "pan.___", state 301, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 163, "pan.___", state 301, "else" - line 161, "pan.___", state 306, "((j<1))" - line 161, "pan.___", state 306, "((j>=1))" - line 167, "pan.___", state 311, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 144, "pan.___", state 321, "(1)" - line 148, "pan.___", state 329, "(1)" - line 148, "pan.___", state 330, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 330, "else" - line 146, "pan.___", state 335, "((j<1))" - line 146, "pan.___", state 335, "((j>=1))" - line 152, "pan.___", state 341, "(1)" - line 152, "pan.___", state 342, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 342, "else" - line 154, "pan.___", state 345, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 154, "pan.___", state 345, "else" - line 186, "pan.___", state 347, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 186, "pan.___", state 347, "else" - line 159, "pan.___", state 352, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 167, "pan.___", state 374, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 152, "pan.___", state 404, "(1)" - line 152, "pan.___", state 405, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 159, "pan.___", state 419, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 421, "(1)" - line 163, "pan.___", state 428, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 430, "(1)" - line 163, "pan.___", state 431, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 163, "pan.___", state 431, "else" - line 161, "pan.___", state 436, "((j<1))" - line 161, "pan.___", state 436, "((j>=1))" - line 167, "pan.___", state 441, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 144, "pan.___", state 451, "(1)" - line 148, "pan.___", state 459, "(1)" - line 148, "pan.___", state 460, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 460, "else" - line 146, "pan.___", state 465, "((j<1))" - line 146, "pan.___", state 465, "((j>=1))" - line 152, "pan.___", state 471, "(1)" - line 152, "pan.___", state 472, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 472, "else" - line 154, "pan.___", state 475, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 154, "pan.___", state 475, "else" - line 186, "pan.___", state 477, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 186, "pan.___", state 477, "else" - line 289, "pan.___", state 492, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 524, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 537, "(1)" - line 308, "pan.___", state 567, "(1)" - line 289, "pan.___", state 580, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 612, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 625, "(1)" - line 308, "pan.___", state 655, "(1)" - line 289, "pan.___", state 668, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 713, "(1)" - line 308, "pan.___", state 743, "(1)" - line 159, "pan.___", state 758, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 760, "(1)" - line 163, "pan.___", state 767, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 769, "(1)" - line 163, "pan.___", state 770, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 163, "pan.___", state 770, "else" - line 161, "pan.___", state 775, "((j<1))" - line 161, "pan.___", state 775, "((j>=1))" - line 167, "pan.___", state 780, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 144, "pan.___", state 790, "(1)" - line 148, "pan.___", state 798, "(1)" - line 148, "pan.___", state 799, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 799, "else" - line 146, "pan.___", state 804, "((j<1))" - line 146, "pan.___", state 804, "((j>=1))" - line 152, "pan.___", state 810, "(1)" - line 152, "pan.___", state 811, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 811, "else" - line 154, "pan.___", state 814, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 154, "pan.___", state 814, "else" - line 186, "pan.___", state 816, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 186, "pan.___", state 816, "else" - line 159, "pan.___", state 821, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 167, "pan.___", state 843, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 152, "pan.___", state 873, "(1)" - line 152, "pan.___", state 874, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 159, "pan.___", state 888, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 890, "(1)" - line 163, "pan.___", state 897, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 899, "(1)" - line 163, "pan.___", state 900, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 163, "pan.___", state 900, "else" - line 161, "pan.___", state 905, "((j<1))" - line 161, "pan.___", state 905, "((j>=1))" - line 167, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 144, "pan.___", state 920, "(1)" - line 148, "pan.___", state 928, "(1)" - line 148, "pan.___", state 929, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 929, "else" - line 146, "pan.___", state 934, "((j<1))" - line 146, "pan.___", state 934, "((j>=1))" - line 152, "pan.___", state 940, "(1)" - line 152, "pan.___", state 941, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 941, "else" - line 154, "pan.___", state 944, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 154, "pan.___", state 944, "else" - line 186, "pan.___", state 946, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 186, "pan.___", state 946, "else" - line 289, "pan.___", state 956, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 988, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 1001, "(1)" - line 308, "pan.___", state 1031, "(1)" - line 289, "pan.___", state 1052, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1084, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 1097, "(1)" - line 308, "pan.___", state 1127, "(1)" - line 434, "pan.___", state 1140, "-end-" - (125 of 1140 states) -unreached in proctype urcu_writer - line 289, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 59, "(1)" - line 303, "pan.___", state 72, "(1)" - line 308, "pan.___", state 89, "(1)" - line 289, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 151, "(1)" - line 303, "pan.___", state 164, "(1)" - line 468, "pan.___", state 195, "(1)" - line 159, "pan.___", state 205, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 214, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 144, "pan.___", state 237, "(1)" - line 148, "pan.___", state 245, "(1)" - line 152, "pan.___", state 257, "(1)" - line 159, "pan.___", state 268, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 298, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 923, "(1)" - line 299, "pan.___", state 924, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 299, "pan.___", state 924, "else" - line 299, "pan.___", state 927, "(1)" - line 299, "pan.___", state 928, "(1)" - line 299, "pan.___", state 928, "(1)" - line 303, "pan.___", state 936, "(1)" - line 303, "pan.___", state 937, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 303, "pan.___", state 937, "else" - line 303, "pan.___", state 940, "(1)" - line 303, "pan.___", state 941, "(1)" - line 303, "pan.___", state 941, "(1)" - line 301, "pan.___", state 946, "((i<1))" - line 301, "pan.___", state 946, "((i>=1))" - line 308, "pan.___", state 953, "(1)" - line 308, "pan.___", state 954, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 308, "pan.___", state 954, "else" - line 308, "pan.___", state 957, "(1)" - line 308, "pan.___", state 958, "(1)" - line 308, "pan.___", state 958, "(1)" - line 310, "pan.___", state 961, "(1)" - line 310, "pan.___", state 961, "(1)" - line 163, "pan.___", state 985, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 167, "pan.___", state 998, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 144, "pan.___", state 1008, "(1)" - line 148, "pan.___", state 1016, "(1)" - line 152, "pan.___", state 1028, "(1)" - line 159, "pan.___", state 1039, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=2))" - line 519, "pan.___", state 20, "((j<2))" - line 519, "pan.___", state 20, "((j>=2))" - line 524, "pan.___", state 33, "((j<2))" - line 524, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 572, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 5.58 seconds -pan: rate 38755.018 states/second -pan: avg transition delay 1.7769e-06 usec -cp .input.spin urcu_free_single_flip.spin.input -cp .input.spin.trail urcu_free_single_flip.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input deleted file mode 100644 index 244a7b2..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input +++ /dev/null @@ -1,532 +0,0 @@ -#define SINGLE_FLIP - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - - -#if (NR_READERS == 1) - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#elif (NR_READERS == 2) - -#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) -#define read_free (free_done && (data_access[0] || data_access[1])) - -#else - -#error "Too many readers" - -#endif - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - atomic { - if - :: get_readerid() == 0 -> -progress_reader: - skip; - :: else -> - skip; - fi; - } -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input.trail deleted file mode 100644 index 363553e..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input.trail +++ /dev/null @@ -1,1356 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2372 -2:3:2324 -3:3:2327 -4:3:2327 -5:3:2330 -6:3:2338 -7:3:2338 -8:3:2341 -9:3:2347 -10:3:2351 -11:3:2351 -12:3:2354 -13:3:2362 -14:3:2366 -15:3:2367 -16:0:2372 -17:3:2369 -18:0:2372 -19:2:1142 -20:0:2372 -21:2:1148 -22:0:2372 -23:2:1149 -24:0:2372 -25:2:1150 -26:2:1154 -27:2:1155 -28:2:1163 -29:2:1164 -30:2:1168 -31:2:1169 -32:2:1177 -33:2:1182 -34:2:1186 -35:2:1187 -36:2:1194 -37:2:1195 -38:2:1206 -39:2:1207 -40:2:1208 -41:2:1219 -42:2:1224 -43:2:1225 -44:0:2372 -45:2:1237 -46:2:1238 -47:0:2372 -48:2:1242 -49:2:1246 -50:2:1247 -51:2:1255 -52:2:1256 -53:2:1260 -54:2:1261 -55:2:1269 -56:2:1274 -57:2:1275 -58:2:1286 -59:2:1287 -60:2:1298 -61:2:1299 -62:2:1300 -63:2:1311 -64:2:1316 -65:2:1317 -66:0:2372 -67:2:1329 -68:0:2372 -69:2:1330 -70:0:2372 -71:2:1340 -72:0:2372 -73:2:1341 -74:0:2372 -75:2:1345 -76:2:1346 -77:2:1350 -78:2:1354 -79:2:1355 -80:2:1359 -81:2:1367 -82:2:1368 -83:2:1373 -84:2:1380 -85:2:1381 -86:2:1388 -87:2:1393 -88:0:2372 -89:2:1404 -90:0:2372 -91:2:1408 -92:2:1409 -93:2:1413 -94:2:1417 -95:2:1418 -96:2:1422 -97:2:1430 -98:2:1431 -99:2:1436 -100:2:1443 -101:2:1444 -102:2:1451 -103:2:1456 -104:0:2372 -105:2:1467 -106:0:2372 -107:2:1475 -108:2:1476 -109:2:1480 -110:2:1484 -111:2:1485 -112:2:1489 -113:2:1497 -114:2:1498 -115:2:1503 -116:2:1510 -117:2:1511 -118:2:1518 -119:2:1523 -120:0:2372 -121:2:1538 -122:0:2372 -123:2:1539 -124:2:1543 -125:2:1544 -126:2:1552 -127:2:1553 -128:2:1557 -129:2:1558 -130:2:1566 -131:2:1571 -132:2:1575 -133:2:1576 -134:2:1583 -135:2:1584 -136:2:1595 -137:2:1596 -138:2:1597 -139:2:1608 -140:2:1613 -141:2:1614 -142:0:2372 -143:2:1626 -144:0:2372 -145:2:1629 -146:2:1630 -147:2:1642 -148:2:1643 -149:2:1647 -150:2:1648 -151:2:1656 -152:2:1661 -153:2:1665 -154:2:1666 -155:2:1673 -156:2:1674 -157:2:1685 -158:2:1686 -159:2:1687 -160:2:1698 -161:2:1703 -162:2:1704 -163:0:2372 -164:2:1716 -165:0:2372 -166:2:1717 -167:0:2372 -168:2:1718 -169:0:2372 -170:2:1719 -171:0:2372 -172:2:1720 -173:2:1724 -174:2:1725 -175:2:1733 -176:2:1734 -177:2:1738 -178:2:1739 -179:2:1747 -180:2:1752 -181:2:1756 -182:2:1757 -183:2:1764 -184:2:1765 -185:2:1776 -186:2:1777 -187:2:1778 -188:2:1789 -189:2:1794 -190:2:1795 -191:0:2372 -192:2:2005 -193:0:2372 -194:2:2101 -195:0:2372 -196:2:2102 -197:0:2372 -198:2:2106 -199:0:2372 -200:2:2112 -201:0:2372 -202:2:2116 -203:2:2117 -204:2:2121 -205:2:2125 -206:2:2126 -207:2:2130 -208:2:2138 -209:2:2139 -210:2:2144 -211:2:2151 -212:2:2152 -213:2:2159 -214:2:2164 -215:0:2372 -216:2:2175 -217:0:2372 -218:2:2179 -219:2:2180 -220:2:2184 -221:2:2188 -222:2:2189 -223:2:2193 -224:2:2201 -225:2:2202 -226:2:2207 -227:2:2214 -228:2:2215 -229:2:2222 -230:2:2227 -231:0:2372 -232:2:2238 -233:0:2372 -234:2:2246 -235:2:2247 -236:2:2251 -237:2:2255 -238:2:2256 -239:2:2260 -240:2:2268 -241:2:2269 -242:2:2274 -243:2:2281 -244:2:2282 -245:2:2289 -246:2:2294 -247:0:2372 -248:2:2309 -249:0:2372 -250:2:2310 -251:0:2372 -252:2:1149 -253:0:2372 -254:2:1150 -255:2:1154 -256:2:1155 -257:2:1163 -258:2:1164 -259:2:1168 -260:2:1169 -261:2:1177 -262:2:1182 -263:2:1186 -264:2:1187 -265:2:1194 -266:2:1195 -267:2:1206 -268:2:1207 -269:2:1208 -270:2:1219 -271:2:1224 -272:2:1225 -273:0:2372 -274:2:1237 -275:2:1238 -276:0:2372 -277:2:1242 -278:2:1246 -279:2:1247 -280:2:1255 -281:2:1256 -282:2:1260 -283:2:1261 -284:2:1269 -285:2:1274 -286:2:1275 -287:2:1286 -288:2:1287 -289:2:1298 -290:2:1299 -291:2:1300 -292:2:1311 -293:2:1316 -294:2:1317 -295:0:2372 -296:2:1329 -297:0:2372 -298:2:1330 -299:0:2372 -300:2:1340 -301:0:2372 -302:2:1341 -303:0:2372 -304:2:1345 -305:2:1346 -306:2:1350 -307:2:1354 -308:2:1355 -309:2:1359 -310:2:1367 -311:2:1368 -312:2:1373 -313:2:1380 -314:2:1381 -315:2:1388 -316:2:1393 -317:0:2372 -318:2:1404 -319:0:2372 -320:2:1408 -321:2:1409 -322:2:1413 -323:2:1417 -324:2:1418 -325:2:1422 -326:2:1430 -327:2:1431 -328:2:1436 -329:2:1443 -330:2:1444 -331:2:1451 -332:2:1456 -333:0:2372 -334:2:1467 -335:0:2372 -336:2:1475 -337:2:1476 -338:2:1480 -339:2:1484 -340:2:1485 -341:2:1489 -342:2:1497 -343:2:1498 -344:2:1503 -345:2:1510 -346:2:1511 -347:2:1518 -348:2:1523 -349:0:2372 -350:2:1538 -351:0:2372 -352:2:1539 -353:2:1543 -354:2:1544 -355:2:1552 -356:2:1553 -357:2:1557 -358:2:1558 -359:2:1566 -360:2:1571 -361:2:1575 -362:2:1576 -363:2:1583 -364:2:1584 -365:2:1595 -366:2:1596 -367:2:1597 -368:2:1608 -369:2:1613 -370:2:1614 -371:0:2372 -372:2:1626 -373:0:2372 -374:2:1629 -375:2:1630 -376:2:1642 -377:2:1643 -378:2:1647 -379:2:1648 -380:2:1656 -381:2:1661 -382:2:1665 -383:2:1666 -384:2:1673 -385:2:1674 -386:2:1685 -387:2:1686 -388:2:1687 -389:2:1698 -390:2:1703 -391:2:1704 -392:0:2372 -393:2:1716 -394:0:2372 -395:2:1717 -396:0:2372 -397:2:1718 -398:0:2372 -399:2:1719 -400:0:2372 -401:2:1720 -402:2:1724 -403:2:1725 -404:2:1733 -405:2:1734 -406:2:1738 -407:2:1739 -408:2:1747 -409:2:1752 -410:2:1756 -411:2:1757 -412:2:1764 -413:2:1765 -414:2:1776 -415:2:1777 -416:2:1778 -417:2:1789 -418:2:1794 -419:2:1795 -420:0:2372 -421:2:2005 -422:0:2372 -423:2:2101 -424:0:2372 -425:2:2102 -426:0:2372 -427:2:2106 -428:0:2372 -429:2:2112 -430:0:2372 -431:2:2116 -432:2:2117 -433:2:2121 -434:2:2125 -435:2:2126 -436:2:2130 -437:2:2138 -438:2:2139 -439:2:2144 -440:2:2151 -441:2:2152 -442:2:2159 -443:2:2164 -444:0:2372 -445:2:2175 -446:0:2372 -447:2:2179 -448:2:2180 -449:2:2184 -450:2:2188 -451:2:2189 -452:2:2193 -453:2:2201 -454:2:2202 -455:2:2207 -456:2:2214 -457:2:2215 -458:2:2222 -459:2:2227 -460:0:2372 -461:2:2238 -462:0:2372 -463:2:2246 -464:2:2247 -465:2:2251 -466:2:2255 -467:2:2256 -468:2:2260 -469:2:2268 -470:2:2269 -471:2:2274 -472:2:2281 -473:2:2282 -474:2:2289 -475:2:2294 -476:0:2372 -477:2:2309 -478:0:2372 -479:2:2310 -480:0:2372 -481:2:1149 -482:0:2372 -483:2:1150 -484:2:1154 -485:2:1155 -486:2:1163 -487:2:1164 -488:2:1168 -489:2:1169 -490:2:1177 -491:2:1182 -492:2:1186 -493:2:1187 -494:2:1194 -495:2:1195 -496:2:1206 -497:2:1207 -498:2:1208 -499:2:1219 -500:2:1224 -501:2:1225 -502:0:2372 -503:2:1237 -504:2:1238 -505:0:2372 -506:2:1242 -507:2:1246 -508:2:1247 -509:2:1255 -510:2:1256 -511:2:1260 -512:2:1261 -513:2:1269 -514:2:1274 -515:2:1275 -516:2:1286 -517:2:1287 -518:2:1298 -519:2:1299 -520:2:1300 -521:2:1311 -522:2:1316 -523:2:1317 -524:0:2372 -525:2:1329 -526:0:2372 -527:2:1330 -528:0:2372 -529:2:1340 -530:0:2372 -531:2:1341 -532:0:2372 -533:2:1345 -534:2:1346 -535:2:1350 -536:2:1354 -537:2:1355 -538:2:1359 -539:2:1367 -540:2:1368 -541:2:1373 -542:2:1380 -543:2:1381 -544:2:1388 -545:2:1393 -546:0:2372 -547:2:1404 -548:0:2372 -549:2:1408 -550:2:1409 -551:2:1413 -552:2:1417 -553:2:1418 -554:2:1422 -555:2:1430 -556:2:1431 -557:2:1436 -558:2:1443 -559:2:1444 -560:2:1451 -561:2:1456 -562:0:2372 -563:2:1467 -564:0:2372 -565:2:1475 -566:2:1476 -567:2:1480 -568:2:1484 -569:2:1485 -570:2:1489 -571:2:1497 -572:2:1498 -573:2:1503 -574:2:1510 -575:2:1511 -576:2:1518 -577:2:1523 -578:0:2372 -579:2:1538 -580:0:2372 -581:2:1539 -582:2:1543 -583:2:1544 -584:2:1552 -585:2:1553 -586:2:1557 -587:2:1558 -588:2:1566 -589:2:1571 -590:2:1575 -591:2:1576 -592:2:1583 -593:2:1584 -594:2:1595 -595:2:1596 -596:2:1597 -597:2:1608 -598:2:1613 -599:2:1614 -600:0:2372 -601:2:1626 -602:0:2372 -603:2:1629 -604:2:1630 -605:2:1642 -606:2:1643 -607:2:1647 -608:2:1648 -609:2:1656 -610:2:1661 -611:2:1665 -612:2:1666 -613:2:1673 -614:2:1674 -615:2:1685 -616:2:1686 -617:2:1687 -618:2:1698 -619:2:1703 -620:2:1704 -621:0:2372 -622:2:1716 -623:0:2372 -624:2:1717 -625:0:2372 -626:2:1718 -627:0:2372 -628:2:1719 -629:0:2372 -630:2:1720 -631:2:1724 -632:2:1725 -633:2:1733 -634:2:1734 -635:2:1738 -636:2:1739 -637:2:1747 -638:2:1752 -639:2:1756 -640:2:1757 -641:2:1764 -642:2:1765 -643:2:1776 -644:2:1777 -645:2:1778 -646:2:1789 -647:2:1794 -648:2:1795 -649:0:2372 -650:2:2005 -651:0:2372 -652:2:2101 -653:0:2372 -654:2:2102 -655:0:2372 -656:2:2106 -657:0:2372 -658:2:2112 -659:0:2372 -660:2:2116 -661:2:2117 -662:2:2121 -663:2:2125 -664:2:2126 -665:2:2130 -666:2:2138 -667:2:2139 -668:2:2144 -669:2:2151 -670:2:2152 -671:2:2159 -672:2:2164 -673:0:2372 -674:2:2175 -675:0:2372 -676:2:2179 -677:2:2180 -678:2:2184 -679:2:2188 -680:2:2189 -681:2:2193 -682:2:2201 -683:2:2202 -684:2:2207 -685:2:2214 -686:2:2215 -687:2:2222 -688:2:2227 -689:0:2372 -690:2:2238 -691:0:2372 -692:2:2246 -693:2:2247 -694:2:2251 -695:2:2255 -696:2:2256 -697:2:2260 -698:2:2268 -699:2:2269 -700:2:2274 -701:2:2281 -702:2:2282 -703:2:2289 -704:2:2294 -705:0:2372 -706:2:2309 -707:0:2372 -708:2:2310 -709:0:2372 -710:2:1149 -711:0:2372 -712:2:1150 -713:2:1154 -714:2:1155 -715:2:1163 -716:2:1164 -717:2:1168 -718:2:1169 -719:2:1177 -720:2:1182 -721:2:1186 -722:2:1187 -723:2:1194 -724:2:1195 -725:2:1206 -726:2:1207 -727:2:1208 -728:2:1219 -729:2:1224 -730:2:1225 -731:0:2372 -732:2:1237 -733:2:1238 -734:0:2372 -735:2:1242 -736:2:1246 -737:2:1247 -738:2:1255 -739:2:1256 -740:2:1260 -741:2:1261 -742:2:1269 -743:2:1274 -744:2:1275 -745:2:1286 -746:2:1287 -747:2:1298 -748:2:1299 -749:2:1300 -750:2:1311 -751:2:1316 -752:2:1317 -753:0:2372 -754:2:1329 -755:0:2372 -756:2:1330 -757:0:2372 -758:2:1340 -759:0:2372 -760:2:1341 -761:0:2372 -762:2:1345 -763:2:1346 -764:2:1350 -765:2:1354 -766:2:1355 -767:2:1359 -768:2:1367 -769:2:1368 -770:2:1373 -771:2:1380 -772:2:1381 -773:2:1388 -774:2:1393 -775:0:2372 -776:2:1404 -777:0:2372 -778:2:1408 -779:2:1409 -780:2:1413 -781:2:1417 -782:2:1418 -783:2:1422 -784:2:1430 -785:2:1431 -786:2:1436 -787:2:1443 -788:2:1444 -789:2:1451 -790:2:1456 -791:0:2372 -792:2:1467 -793:0:2372 -794:2:1475 -795:2:1476 -796:2:1480 -797:2:1484 -798:2:1485 -799:2:1489 -800:2:1497 -801:2:1498 -802:2:1503 -803:2:1510 -804:2:1511 -805:2:1518 -806:2:1523 -807:0:2372 -808:2:1538 -809:0:2372 -810:2:1539 -811:2:1543 -812:2:1544 -813:2:1552 -814:2:1553 -815:2:1557 -816:2:1558 -817:2:1566 -818:2:1571 -819:2:1575 -820:2:1576 -821:2:1583 -822:2:1584 -823:2:1595 -824:2:1596 -825:2:1597 -826:2:1608 -827:2:1613 -828:2:1614 -829:0:2372 -830:2:1626 -831:0:2372 -832:2:1629 -833:2:1630 -834:2:1642 -835:2:1643 -836:2:1647 -837:2:1648 -838:2:1656 -839:2:1661 -840:2:1665 -841:2:1666 -842:2:1673 -843:2:1674 -844:2:1685 -845:2:1686 -846:2:1687 -847:2:1698 -848:2:1703 -849:2:1704 -850:0:2372 -851:2:1716 -852:0:2372 -853:2:1717 -854:0:2372 -855:2:1718 -856:0:2372 -857:2:1719 -858:0:2372 -859:2:1720 -860:2:1724 -861:2:1725 -862:2:1733 -863:2:1734 -864:2:1738 -865:2:1739 -866:2:1747 -867:2:1752 -868:2:1756 -869:2:1757 -870:2:1764 -871:2:1765 -872:2:1776 -873:2:1777 -874:2:1778 -875:2:1789 -876:2:1794 -877:2:1795 -878:0:2372 -879:2:2005 -880:0:2372 -881:2:2101 -882:0:2372 -883:2:2102 -884:0:2372 -885:2:2106 -886:0:2372 -887:2:2112 -888:0:2372 -889:2:2116 -890:2:2117 -891:2:2121 -892:2:2125 -893:2:2126 -894:2:2130 -895:2:2138 -896:2:2139 -897:2:2144 -898:2:2151 -899:2:2152 -900:2:2159 -901:2:2164 -902:0:2372 -903:2:2175 -904:0:2372 -905:1:2 -906:0:2372 -907:1:8 -908:0:2372 -909:1:9 -910:0:2372 -911:1:10 -912:0:2372 -913:1:11 -914:0:2372 -915:1:12 -916:1:16 -917:1:17 -918:1:25 -919:1:26 -920:1:30 -921:1:31 -922:1:39 -923:1:44 -924:1:48 -925:1:49 -926:1:63 -927:1:64 -928:1:68 -929:1:69 -930:1:70 -931:1:81 -932:1:86 -933:1:87 -934:0:2372 -935:1:99 -936:0:2372 -937:1:100 -938:1:104 -939:1:105 -940:1:113 -941:1:114 -942:1:118 -943:1:119 -944:1:127 -945:1:132 -946:1:136 -947:1:137 -948:1:151 -949:1:152 -950:1:156 -951:1:157 -952:1:158 -953:1:169 -954:1:174 -955:1:175 -956:0:2372 -957:1:187 -958:0:2372 -959:1:188 -960:0:2372 -961:2:2179 -962:2:2180 -963:2:2184 -964:2:2188 -965:2:2189 -966:2:2193 -967:2:2201 -968:2:2202 -969:2:2207 -970:2:2214 -971:2:2215 -972:2:2222 -973:2:2227 -974:0:2372 -975:2:2238 -976:0:2372 -977:2:2246 -978:2:2247 -979:2:2251 -980:2:2255 -981:2:2256 -982:2:2260 -983:2:2268 -984:2:2269 -985:2:2274 -986:2:2281 -987:2:2282 -988:2:2289 -989:2:2294 -990:0:2372 -991:2:2309 -992:0:2372 -993:2:2310 -994:0:2372 -995:2:1149 -996:0:2372 -997:2:1150 -998:2:1154 -999:2:1155 -1000:2:1163 -1001:2:1164 -1002:2:1168 -1003:2:1169 -1004:2:1177 -1005:2:1182 -1006:2:1186 -1007:2:1187 -1008:2:1194 -1009:2:1195 -1010:2:1206 -1011:2:1207 -1012:2:1208 -1013:2:1219 -1014:2:1224 -1015:2:1225 -1016:0:2372 -1017:2:1237 -1018:2:1238 -1019:0:2372 -1020:2:1242 -1021:2:1246 -1022:2:1247 -1023:2:1255 -1024:2:1256 -1025:2:1260 -1026:2:1261 -1027:2:1269 -1028:2:1274 -1029:2:1275 -1030:2:1286 -1031:2:1287 -1032:2:1298 -1033:2:1299 -1034:2:1300 -1035:2:1311 -1036:2:1316 -1037:2:1317 -1038:0:2372 -1039:2:1329 -1040:0:2372 -1041:2:1330 -1042:0:2372 -1043:2:1340 -1044:0:2372 -1045:2:1341 -1046:0:2372 -1047:2:1345 -1048:2:1346 -1049:2:1350 -1050:2:1354 -1051:2:1355 -1052:2:1359 -1053:2:1367 -1054:2:1368 -1055:2:1373 -1056:2:1380 -1057:2:1381 -1058:2:1388 -1059:2:1393 -1060:0:2372 -1061:2:1404 -1062:0:2372 -1063:1:189 -1064:1:193 -1065:1:194 -1066:1:202 -1067:1:203 -1068:1:207 -1069:1:208 -1070:1:216 -1071:1:221 -1072:1:225 -1073:1:226 -1074:1:233 -1075:1:234 -1076:1:245 -1077:1:246 -1078:1:247 -1079:1:258 -1080:1:270 -1081:1:271 -1082:0:2372 -1083:1:276 -1084:0:2372 -1085:1:477 -1086:0:2372 -1087:1:478 -1088:0:2372 -1089:1:11 -1090:0:2372 -1091:1:12 -1092:1:16 -1093:1:17 -1094:1:25 -1095:1:26 -1096:1:27 -1097:1:39 -1098:1:44 -1099:1:48 -1100:1:49 -1101:1:56 -1102:1:57 -1103:1:68 -1104:1:69 -1105:1:70 -1106:1:81 -1107:1:93 -1108:1:94 -1109:0:2372 -1110:1:99 -1111:0:2372 -1112:1:100 -1113:1:104 -1114:1:105 -1115:1:113 -1116:1:114 -1117:1:118 -1118:1:119 -1119:1:127 -1120:1:132 -1121:1:136 -1122:1:137 -1123:1:144 -1124:1:145 -1125:1:156 -1126:1:157 -1127:1:158 -1128:1:169 -1129:1:181 -1130:1:182 -1131:0:2372 -1132:1:279 -1133:0:2372 -1134:1:280 -1135:0:2372 -1136:1:477 -1137:0:2372 -1138:1:478 -1139:0:2372 -1140:1:483 -1141:0:2372 -1142:1:488 -1143:1:492 -1144:1:493 -1145:1:501 -1146:1:502 -1147:1:503 -1148:1:515 -1149:1:520 -1150:1:524 -1151:1:525 -1152:1:532 -1153:1:533 -1154:1:544 -1155:1:545 -1156:1:546 -1157:1:557 -1158:1:569 -1159:1:570 -1160:0:2372 -1161:1:575 -1162:0:2372 -1163:2:1408 -1164:2:1409 -1165:2:1413 -1166:2:1417 -1167:2:1418 -1168:2:1422 -1169:2:1430 -1170:2:1431 -1171:2:1436 -1172:2:1443 -1173:2:1444 -1174:2:1451 -1175:2:1456 -1176:0:2372 -1177:2:1467 -1178:0:2372 -1179:2:1475 -1180:2:1476 -1181:2:1480 -1182:2:1484 -1183:2:1485 -1184:2:1489 -1185:2:1497 -1186:2:1498 -1187:2:1503 -1188:2:1510 -1189:2:1511 -1190:2:1518 -1191:2:1523 -1192:0:2372 -1193:2:1538 -1194:0:2372 -1195:2:1539 -1196:2:1543 -1197:2:1544 -1198:2:1552 -1199:2:1553 -1200:2:1557 -1201:2:1558 -1202:2:1566 -1203:2:1571 -1204:2:1575 -1205:2:1576 -1206:2:1583 -1207:2:1584 -1208:2:1595 -1209:2:1596 -1210:2:1597 -1211:2:1608 -1212:2:1613 -1213:2:1614 -1214:0:2372 -1215:2:1626 -1216:0:2372 -1217:2:1629 -1218:2:1630 -1219:2:1642 -1220:2:1643 -1221:2:1647 -1222:2:1648 -1223:2:1656 -1224:2:1661 -1225:2:1665 -1226:2:1666 -1227:2:1673 -1228:2:1674 -1229:2:1685 -1230:2:1686 -1231:2:1687 -1232:2:1698 -1233:2:1703 -1234:2:1704 -1235:0:2372 -1236:2:1716 -1237:0:2372 -1238:2:1717 -1239:0:2372 -1240:2:1718 -1241:0:2372 -1242:2:1719 -1243:0:2372 -1244:2:1720 -1245:2:1724 -1246:2:1725 -1247:2:1733 -1248:2:1734 -1249:2:1738 -1250:2:1739 -1251:2:1747 -1252:2:1752 -1253:2:1756 -1254:2:1757 -1255:2:1764 -1256:2:1765 -1257:2:1776 -1258:2:1777 -1259:2:1778 -1260:2:1789 -1261:2:1794 -1262:2:1795 -1263:0:2372 -1264:2:2005 -1265:0:2372 -1266:2:2101 -1267:0:2372 -1268:2:2102 -1269:0:2372 -1270:2:2106 -1271:0:2372 -1272:2:2112 -1273:0:2372 -1274:2:2116 -1275:2:2117 -1276:2:2121 -1277:2:2125 -1278:2:2126 -1279:2:2130 -1280:2:2138 -1281:2:2139 -1282:2:2144 -1283:2:2151 -1284:2:2152 -1285:2:2159 -1286:2:2164 -1287:0:2372 -1288:2:2175 -1289:0:2372 -1290:2:2179 -1291:2:2180 -1292:2:2184 -1293:2:2188 -1294:2:2189 -1295:2:2193 -1296:2:2201 -1297:2:2202 -1298:2:2207 -1299:2:2214 -1300:2:2215 -1301:2:2222 -1302:2:2227 -1303:0:2372 -1304:2:2238 -1305:0:2372 -1306:2:2246 -1307:2:2247 -1308:2:2251 -1309:2:2255 -1310:2:2256 -1311:2:2260 -1312:2:2268 -1313:2:2269 -1314:2:2274 -1315:2:2281 -1316:2:2282 -1317:2:2289 -1318:2:2294 -1319:0:2372 -1320:2:2309 -1321:0:2372 -1322:2:2310 -1323:0:2372 -1324:2:2313 -1325:0:2372 -1326:2:2318 -1327:0:2372 -1328:1:576 -1329:1:580 -1330:1:581 -1331:1:589 -1332:1:590 -1333:1:594 -1334:1:595 -1335:1:603 -1336:1:608 -1337:1:612 -1338:1:613 -1339:1:620 -1340:1:621 -1341:1:632 -1342:1:633 -1343:1:634 -1344:1:645 -1345:1:650 -1346:1:651 -1347:0:2372 -1348:2:2319 -1349:0:2372 -1350:1:663 -1351:0:2370 -1352:2:2318 -1353:0:2376 -1354:1:241 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress.ltl b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_reader.define b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_reader.log b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_reader.log deleted file mode 100644 index ceb438f..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_reader.log +++ /dev/null @@ -1,16 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_reader.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -spin: line 296 replacement value: tmp -spin: line 296 "pan.___", Error: formal par of wait_for_quiescent_state contains replacement value saw '-2'' near 'readerid' -spin: 1 error(s) - aborting -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input deleted file mode 100644 index cc55960..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input +++ /dev/null @@ -1,410 +0,0 @@ -#define READER_PROGRESS -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#define read_free_race (read_generation == last_free_gen) -#define read_free (free_done && data_access) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces - * both. - */ - -#define DECLARE_CACHED_VAR(type, x, v) \ - type mem_##x = v; \ - type cached_##x[NR_PROCS] = v; \ - bit cache_dirty_##x[NR_PROCS] = 0 - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) - -#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x[get_pid()] = v; \ - cache_dirty_##x[get_pid()] = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x[id]; \ - cache_dirty_##x[id] = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - CACHE_READ_FROM_MEM(urcu_active_readers_one, i); - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i); -#endif -#ifndef NO_RMB - smp_rmb_pid(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid()); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid()); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i); -#endif -#ifndef NO_RMB - smp_rmb(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr, 0); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation = 1; -bit data_access = 0; - -bit write_lock = 0; - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, id, i) -{ - do - :: 1 -> - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (tmp & RCU_GP_CTR_NEST_MASK) - && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, i, j) -{ - i = 0; - do - :: i < NR_READERS -> - wait_for_reader(tmp, i, j); - if - :: (NR_READERS > 1) && (i < NR_READERS - 1) - -> ooo_mem(j); - :: else - -> skip; - fi; - i++ - :: i >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers_one, - tmp + 1); - fi; - smp_mb(i); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access = 1; - ooo_mem(i); - data_access = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i); - tmp2 = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, nest_i; - byte tmp, tmp2; - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active [NR_WRITERS] proctype urcu_writer() -{ - byte i, j; - byte tmp; - byte old_gen; - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, i, j); -#endif - smp_mb(i); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input.trail deleted file mode 100644 index e65d663..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input.trail +++ /dev/null @@ -1,9 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2679 -2:1:2673 -3:1:2674 -4:1:2675 -5:1:2676 -6:0:2685 -7:5:1129 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer.define b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer.log b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer.log deleted file mode 100644 index 985f839..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer.log +++ /dev/null @@ -1,14 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -w -DHASH64 -o pan pan.c diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input deleted file mode 100644 index 28f1299..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input +++ /dev/null @@ -1,410 +0,0 @@ -#define WRITER_PROGRESS -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#define read_free_race (read_generation == last_free_gen) -#define read_free (free_done && data_access) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces - * both. - */ - -#define DECLARE_CACHED_VAR(type, x, v) \ - type mem_##x = v; \ - type cached_##x[NR_PROCS] = v; \ - bit cache_dirty_##x[NR_PROCS] = 0 - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) - -#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x[get_pid()] = v; \ - cache_dirty_##x[get_pid()] = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x[id]; \ - cache_dirty_##x[id] = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - CACHE_READ_FROM_MEM(urcu_active_readers_one, i); - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i); -#endif -#ifndef NO_RMB - smp_rmb_pid(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid()); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid()); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i); -#endif -#ifndef NO_RMB - smp_rmb(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr, 0); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation = 1; -bit data_access = 0; - -bit write_lock = 0; - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, id, i) -{ - do - :: 1 -> - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (tmp & RCU_GP_CTR_NEST_MASK) - && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, i, j) -{ - i = 0; - do - :: i < NR_READERS -> - wait_for_reader(tmp, i, j); - if - :: (NR_READERS > 1) && (i < NR_READERS - 1) - -> ooo_mem(j); - :: else - -> skip; - fi; - i++ - :: i >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers_one, - tmp + 1); - fi; - smp_mb(i); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access = 1; - ooo_mem(i); - data_access = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i); - tmp2 = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, nest_i; - byte tmp, tmp2; - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active [NR_WRITERS] proctype urcu_writer() -{ - byte i, j; - byte tmp; - byte old_gen; - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, i, j); -#endif - smp_mb(i); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input.trail deleted file mode 100644 index e65d663..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input.trail +++ /dev/null @@ -1,9 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2679 -2:1:2673 -3:1:2674 -4:1:2675 -5:1:2676 -6:0:2685 -7:5:1129 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer_error.define b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer_error.log b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer_error.log deleted file mode 100644 index 26b6236..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer_error.log +++ /dev/null @@ -1,16 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer_error.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -spin: line 297 replacement value: tmp -spin: line 297 "pan.___", Error: formal par of wait_for_quiescent_state contains replacement value saw '-2'' near 'readerid' -spin: 1 error(s) - aborting -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input deleted file mode 100644 index 43e979c..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input +++ /dev/null @@ -1,411 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#define read_free_race (read_generation == last_free_gen) -#define read_free (free_done && data_access) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces - * both. - */ - -#define DECLARE_CACHED_VAR(type, x, v) \ - type mem_##x = v; \ - type cached_##x[NR_PROCS] = v; \ - bit cache_dirty_##x[NR_PROCS] = 0 - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) - -#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x[get_pid()] = v; \ - cache_dirty_##x[get_pid()] = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x[id]; \ - cache_dirty_##x[id] = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - CACHE_READ_FROM_MEM(urcu_active_readers_one, i); - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i); -#endif -#ifndef NO_RMB - smp_rmb_pid(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid()); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid()); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i); -#endif -#ifndef NO_RMB - smp_rmb(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr, 0); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation = 1; -bit data_access = 0; - -bit write_lock = 0; - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, id, i) -{ - do - :: 1 -> - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (tmp & RCU_GP_CTR_NEST_MASK) - && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, i, j) -{ - i = 0; - do - :: i < NR_READERS -> - wait_for_reader(tmp, i, j); - if - :: (NR_READERS > 1) && (i < NR_READERS - 1) - -> ooo_mem(j); - :: else - -> skip; - fi; - i++ - :: i >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers_one, - tmp + 1); - fi; - smp_mb(i); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access = 1; - ooo_mem(i); - data_access = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i); - tmp2 = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, nest_i; - byte tmp, tmp2; - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active [NR_WRITERS] proctype urcu_writer() -{ - byte i, j; - byte tmp; - byte old_gen; - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, i, j); -#endif - smp_mb(i); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input.trail deleted file mode 100644 index ff6f1c5..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input.trail +++ /dev/null @@ -1,4590 +0,0 @@ --2:2:-2 --4:-4:-4 -1:0:2223 -2:2:908 -3:0:2223 -4:1:0 -5:0:2223 -6:1:1 -7:0:2223 -8:1:2 -9:0:2223 -10:1:3 -11:0:2223 -12:2:909 -13:0:2223 -14:2:910 -15:2:914 -16:2:915 -17:2:922 -18:2:926 -19:2:927 -20:2:934 -21:2:938 -22:2:939 -23:2:946 -24:2:947 -25:2:957 -26:2:958 -27:2:968 -28:2:969 -29:0:2221 -30:2:981 -31:2:982 -32:0:2227 -33:2:986 -34:2:990 -35:2:991 -36:2:998 -37:2:1002 -38:2:1003 -39:2:1010 -40:2:1011 -41:2:1022 -42:2:1023 -43:2:1033 -44:2:1034 -45:2:1044 -46:2:1045 -47:0:2227 -48:2:1057 -49:0:2227 -50:2:1058 -51:0:2227 -52:2:1068 -53:0:2227 -54:2:1069 -55:0:2227 -56:2:1073 -57:2:1074 -58:2:1080 -59:2:1081 -60:2:1087 -61:2:1088 -62:2:1093 -63:2:1099 -64:2:1105 -65:0:2227 -66:2:1116 -67:0:2227 -68:2:1120 -69:2:1121 -70:2:1127 -71:2:1128 -72:2:1134 -73:2:1135 -74:2:1140 -75:2:1146 -76:2:1152 -77:0:2227 -78:2:1163 -79:0:2227 -80:2:1171 -81:2:1172 -82:2:1178 -83:2:1179 -84:2:1185 -85:2:1186 -86:2:1191 -87:2:1197 -88:2:1203 -89:0:2227 -90:2:1218 -91:0:2227 -92:2:1219 -93:2:1223 -94:2:1224 -95:2:1231 -96:2:1235 -97:2:1236 -98:2:1243 -99:2:1247 -100:2:1248 -101:2:1255 -102:2:1256 -103:2:1266 -104:2:1267 -105:2:1277 -106:2:1278 -107:0:2227 -108:2:1290 -109:0:2227 -110:2:1293 -111:2:1294 -112:2:1305 -113:2:1309 -114:2:1310 -115:2:1317 -116:2:1321 -117:2:1322 -118:2:1329 -119:2:1330 -120:2:1340 -121:2:1341 -122:2:1351 -123:2:1352 -124:0:2227 -125:2:1364 -126:0:2227 -127:2:1365 -128:0:2227 -129:2:1366 -130:0:2227 -131:2:1367 -132:0:2227 -133:2:1368 -134:2:1372 -135:2:1373 -136:2:1380 -137:2:1384 -138:2:1385 -139:2:1392 -140:2:1396 -141:2:1397 -142:2:1404 -143:2:1405 -144:2:1415 -145:2:1416 -146:2:1426 -147:2:1427 -148:0:2227 -149:2:1511 -150:0:2227 -151:2:1591 -152:0:2227 -153:2:1592 -154:0:2227 -155:2:1596 -156:0:2227 -157:2:1602 -158:2:1606 -159:2:1607 -160:2:1614 -161:2:1618 -162:2:1619 -163:2:1626 -164:2:1630 -165:2:1631 -166:2:1638 -167:2:1639 -168:2:1649 -169:2:1650 -170:2:1660 -171:2:1661 -172:0:2227 -173:2:1673 -174:0:2227 -175:2:1674 -176:2:1678 -177:2:1679 -178:2:1686 -179:2:1690 -180:2:1691 -181:2:1698 -182:2:1702 -183:2:1703 -184:2:1710 -185:2:1711 -186:2:1721 -187:2:1722 -188:2:1732 -189:2:1733 -190:0:2227 -191:2:1745 -192:0:2227 -193:1:4 -194:1:8 -195:1:9 -196:1:16 -197:1:20 -198:1:21 -199:1:28 -200:1:32 -201:1:33 -202:1:40 -203:1:41 -204:1:51 -205:1:52 -206:1:62 -207:1:63 -208:0:2227 -209:1:75 -210:0:2227 -211:1:76 -212:1:80 -213:1:81 -214:1:88 -215:1:92 -216:1:93 -217:1:100 -218:1:104 -219:1:105 -220:1:112 -221:1:113 -222:1:123 -223:1:124 -224:1:134 -225:1:135 -226:0:2227 -227:1:147 -228:0:2227 -229:1:148 -230:0:2227 -231:1:149 -232:1:153 -233:1:154 -234:1:161 -235:1:165 -236:1:166 -237:1:173 -238:1:177 -239:1:178 -240:1:185 -241:1:186 -242:1:196 -243:1:197 -244:1:207 -245:1:208 -246:0:2227 -247:1:220 -248:0:2227 -249:1:373 -250:0:2227 -251:1:374 -252:0:2227 -253:1:3 -254:0:2227 -255:1:4 -256:1:8 -257:1:9 -258:1:16 -259:1:17 -260:1:28 -261:1:32 -262:1:33 -263:1:40 -264:1:41 -265:1:51 -266:1:52 -267:1:62 -268:1:63 -269:0:2227 -270:2:1748 -271:2:1749 -272:2:1760 -273:2:1764 -274:2:1765 -275:2:1772 -276:2:1776 -277:2:1777 -278:2:1784 -279:2:1785 -280:2:1795 -281:2:1796 -282:2:1806 -283:2:1807 -284:0:2227 -285:2:1819 -286:0:2227 -287:2:1820 -288:0:2227 -289:2:1821 -290:0:2227 -291:2:1822 -292:0:2227 -293:2:1823 -294:2:1827 -295:2:1828 -296:2:1835 -297:2:1839 -298:2:1840 -299:2:1847 -300:2:1851 -301:2:1852 -302:2:1859 -303:2:1860 -304:2:1870 -305:2:1871 -306:2:1881 -307:2:1882 -308:0:2227 -309:2:1894 -310:0:2227 -311:2:1895 -312:2:1899 -313:2:1900 -314:2:1907 -315:2:1911 -316:2:1912 -317:2:1919 -318:2:1923 -319:2:1924 -320:2:1931 -321:2:1932 -322:2:1942 -323:2:1943 -324:2:1953 -325:2:1954 -326:0:2227 -327:2:1821 -328:0:2227 -329:1:75 -330:0:2227 -331:2:1822 -332:0:2227 -333:2:1823 -334:2:1827 -335:2:1828 -336:2:1835 -337:2:1839 -338:2:1840 -339:2:1847 -340:2:1851 -341:2:1852 -342:2:1859 -343:2:1860 -344:2:1870 -345:2:1871 -346:2:1881 -347:2:1882 -348:0:2227 -349:2:1894 -350:0:2227 -351:2:1895 -352:2:1899 -353:2:1900 -354:2:1907 -355:2:1911 -356:2:1912 -357:2:1919 -358:2:1923 -359:2:1924 -360:2:1931 -361:2:1932 -362:2:1942 -363:2:1943 -364:2:1953 -365:2:1954 -366:0:2227 -367:2:1821 -368:0:2227 -369:1:76 -370:1:80 -371:1:81 -372:1:88 -373:1:92 -374:1:93 -375:1:100 -376:1:104 -377:1:105 -378:1:112 -379:1:113 -380:1:123 -381:1:124 -382:1:134 -383:1:135 -384:0:2227 -385:1:223 -386:0:2227 -387:2:1822 -388:0:2227 -389:2:1823 -390:2:1827 -391:2:1828 -392:2:1835 -393:2:1839 -394:2:1840 -395:2:1847 -396:2:1851 -397:2:1852 -398:2:1859 -399:2:1860 -400:2:1870 -401:2:1871 -402:2:1881 -403:2:1882 -404:0:2227 -405:2:1894 -406:0:2227 -407:2:1895 -408:2:1899 -409:2:1900 -410:2:1907 -411:2:1911 -412:2:1912 -413:2:1919 -414:2:1923 -415:2:1924 -416:2:1931 -417:2:1932 -418:2:1942 -419:2:1943 -420:2:1953 -421:2:1954 -422:0:2227 -423:2:1821 -424:0:2227 -425:1:224 -426:0:2227 -427:1:373 -428:0:2227 -429:1:374 -430:0:2227 -431:1:379 -432:0:2227 -433:2:1822 -434:0:2227 -435:2:1823 -436:2:1827 -437:2:1828 -438:2:1835 -439:2:1839 -440:2:1840 -441:2:1847 -442:2:1851 -443:2:1852 -444:2:1859 -445:2:1860 -446:2:1870 -447:2:1871 -448:2:1881 -449:2:1882 -450:0:2227 -451:2:1894 -452:0:2227 -453:2:1895 -454:2:1899 -455:2:1900 -456:2:1907 -457:2:1911 -458:2:1912 -459:2:1919 -460:2:1923 -461:2:1924 -462:2:1931 -463:2:1932 -464:2:1942 -465:2:1943 -466:2:1953 -467:2:1954 -468:0:2227 -469:2:1821 -470:0:2227 -471:1:384 -472:1:388 -473:1:389 -474:1:396 -475:1:397 -476:1:408 -477:1:412 -478:1:413 -479:1:420 -480:1:421 -481:1:431 -482:1:432 -483:1:442 -484:1:443 -485:0:2227 -486:2:1822 -487:0:2227 -488:2:1823 -489:2:1827 -490:2:1828 -491:2:1835 -492:2:1839 -493:2:1840 -494:2:1847 -495:2:1851 -496:2:1852 -497:2:1859 -498:2:1860 -499:2:1870 -500:2:1871 -501:2:1881 -502:2:1882 -503:0:2227 -504:2:1894 -505:0:2227 -506:2:1895 -507:2:1899 -508:2:1900 -509:2:1907 -510:2:1911 -511:2:1912 -512:2:1919 -513:2:1923 -514:2:1924 -515:2:1931 -516:2:1932 -517:2:1942 -518:2:1943 -519:2:1953 -520:2:1954 -521:0:2227 -522:2:1821 -523:0:2227 -524:2:1822 -525:0:2227 -526:2:1823 -527:2:1827 -528:2:1828 -529:2:1835 -530:2:1839 -531:2:1840 -532:2:1847 -533:2:1851 -534:2:1852 -535:2:1859 -536:2:1860 -537:2:1870 -538:2:1871 -539:2:1881 -540:2:1882 -541:0:2227 -542:1:455 -543:0:2227 -544:2:1894 -545:0:2227 -546:2:1895 -547:2:1899 -548:2:1900 -549:2:1907 -550:2:1911 -551:2:1912 -552:2:1919 -553:2:1923 -554:2:1924 -555:2:1931 -556:2:1932 -557:2:1942 -558:2:1943 -559:2:1953 -560:2:1954 -561:0:2227 -562:2:1821 -563:0:2227 -564:2:1822 -565:0:2227 -566:2:1823 -567:2:1827 -568:2:1828 -569:2:1835 -570:2:1839 -571:2:1840 -572:2:1847 -573:2:1851 -574:2:1852 -575:2:1859 -576:2:1860 -577:2:1870 -578:2:1871 -579:2:1881 -580:2:1882 -581:0:2227 -582:1:456 -583:1:460 -584:1:461 -585:1:468 -586:1:472 -587:1:473 -588:1:480 -589:1:484 -590:1:485 -591:1:492 -592:1:493 -593:1:503 -594:1:504 -595:1:514 -596:1:515 -597:0:2227 -598:2:1894 -599:0:2227 -600:2:1895 -601:2:1899 -602:2:1900 -603:2:1907 -604:2:1911 -605:2:1912 -606:2:1919 -607:2:1923 -608:2:1924 -609:2:1931 -610:2:1932 -611:2:1942 -612:2:1943 -613:2:1953 -614:2:1954 -615:0:2227 -616:2:1821 -617:0:2227 -618:2:1822 -619:0:2227 -620:2:1823 -621:2:1827 -622:2:1828 -623:2:1835 -624:2:1839 -625:2:1840 -626:2:1847 -627:2:1851 -628:2:1852 -629:2:1859 -630:2:1860 -631:2:1870 -632:2:1871 -633:2:1881 -634:2:1882 -635:0:2227 -636:1:527 -637:0:2227 -638:2:1894 -639:0:2227 -640:2:1895 -641:2:1899 -642:2:1900 -643:2:1907 -644:2:1911 -645:2:1912 -646:2:1919 -647:2:1923 -648:2:1924 -649:2:1931 -650:2:1932 -651:2:1942 -652:2:1943 -653:2:1953 -654:2:1954 -655:0:2227 -656:2:1821 -657:0:2227 -658:2:1822 -659:0:2227 -660:2:1823 -661:2:1827 -662:2:1828 -663:2:1835 -664:2:1839 -665:2:1840 -666:2:1847 -667:2:1851 -668:2:1852 -669:2:1859 -670:2:1860 -671:2:1870 -672:2:1871 -673:2:1881 -674:2:1882 -675:0:2227 -676:1:528 -677:1:532 -678:1:533 -679:1:540 -680:1:544 -681:1:545 -682:1:552 -683:1:556 -684:1:557 -685:1:564 -686:1:565 -687:1:575 -688:1:576 -689:1:586 -690:1:587 -691:0:2227 -692:2:1894 -693:0:2227 -694:2:1895 -695:2:1899 -696:2:1900 -697:2:1907 -698:2:1911 -699:2:1912 -700:2:1919 -701:2:1923 -702:2:1924 -703:2:1931 -704:2:1932 -705:2:1942 -706:2:1943 -707:2:1953 -708:2:1954 -709:0:2227 -710:2:1821 -711:0:2227 -712:2:1822 -713:0:2227 -714:2:1823 -715:2:1827 -716:2:1828 -717:2:1835 -718:2:1839 -719:2:1840 -720:2:1847 -721:2:1851 -722:2:1852 -723:2:1859 -724:2:1860 -725:2:1870 -726:2:1871 -727:2:1881 -728:2:1882 -729:0:2227 -730:1:599 -731:0:2227 -732:1:600 -733:0:2227 -734:1:601 -735:0:2227 -736:1:746 -737:0:2227 -738:1:747 -739:0:2227 -740:2:1894 -741:0:2227 -742:2:1895 -743:2:1899 -744:2:1900 -745:2:1907 -746:2:1911 -747:2:1912 -748:2:1919 -749:2:1923 -750:2:1924 -751:2:1931 -752:2:1932 -753:2:1942 -754:2:1943 -755:2:1953 -756:2:1954 -757:0:2227 -758:2:1821 -759:0:2227 -760:2:1822 -761:0:2227 -762:2:1823 -763:2:1827 -764:2:1828 -765:2:1835 -766:2:1839 -767:2:1840 -768:2:1847 -769:2:1851 -770:2:1852 -771:2:1859 -772:2:1860 -773:2:1870 -774:2:1871 -775:2:1881 -776:2:1882 -777:0:2227 -778:1:751 -779:0:2227 -780:2:1894 -781:0:2227 -782:2:1895 -783:2:1899 -784:2:1900 -785:2:1907 -786:2:1911 -787:2:1912 -788:2:1919 -789:2:1923 -790:2:1924 -791:2:1931 -792:2:1932 -793:2:1942 -794:2:1943 -795:2:1953 -796:2:1954 -797:0:2227 -798:2:1821 -799:0:2227 -800:2:1822 -801:0:2227 -802:2:1823 -803:2:1827 -804:2:1828 -805:2:1835 -806:2:1839 -807:2:1840 -808:2:1847 -809:2:1851 -810:2:1852 -811:2:1859 -812:2:1860 -813:2:1870 -814:2:1871 -815:2:1881 -816:2:1882 -817:0:2227 -818:1:752 -819:1:756 -820:1:757 -821:1:764 -822:1:768 -823:1:769 -824:1:776 -825:1:780 -826:1:781 -827:1:788 -828:1:789 -829:1:799 -830:1:800 -831:1:810 -832:1:811 -833:0:2227 -834:2:1894 -835:0:2227 -836:2:1895 -837:2:1899 -838:2:1900 -839:2:1907 -840:2:1911 -841:2:1912 -842:2:1919 -843:2:1923 -844:2:1924 -845:2:1931 -846:2:1932 -847:2:1942 -848:2:1943 -849:2:1953 -850:2:1954 -851:0:2227 -852:2:1821 -853:0:2227 -854:2:1822 -855:0:2227 -856:2:1823 -857:2:1827 -858:2:1828 -859:2:1835 -860:2:1839 -861:2:1840 -862:2:1847 -863:2:1851 -864:2:1852 -865:2:1859 -866:2:1860 -867:2:1870 -868:2:1871 -869:2:1881 -870:2:1882 -871:0:2227 -872:1:823 -873:0:2227 -874:1:601 -875:0:2227 -876:1:746 -877:0:2227 -878:1:747 -879:0:2227 -880:2:1894 -881:0:2227 -882:2:1895 -883:2:1899 -884:2:1900 -885:2:1907 -886:2:1911 -887:2:1912 -888:2:1919 -889:2:1923 -890:2:1924 -891:2:1931 -892:2:1932 -893:2:1942 -894:2:1943 -895:2:1953 -896:2:1954 -897:0:2227 -898:2:1821 -899:0:2227 -900:2:1822 -901:0:2227 -902:2:1823 -903:2:1827 -904:2:1828 -905:2:1835 -906:2:1839 -907:2:1840 -908:2:1847 -909:2:1851 -910:2:1852 -911:2:1859 -912:2:1860 -913:2:1870 -914:2:1871 -915:2:1881 -916:2:1882 -917:0:2227 -918:1:751 -919:0:2227 -920:2:1894 -921:0:2227 -922:2:1895 -923:2:1899 -924:2:1900 -925:2:1907 -926:2:1911 -927:2:1912 -928:2:1919 -929:2:1923 -930:2:1924 -931:2:1931 -932:2:1932 -933:2:1942 -934:2:1943 -935:2:1953 -936:2:1954 -937:0:2227 -938:2:1821 -939:0:2227 -940:2:1822 -941:0:2227 -942:2:1823 -943:2:1827 -944:2:1828 -945:2:1835 -946:2:1839 -947:2:1840 -948:2:1847 -949:2:1851 -950:2:1852 -951:2:1859 -952:2:1860 -953:2:1870 -954:2:1871 -955:2:1881 -956:2:1882 -957:0:2227 -958:1:752 -959:1:756 -960:1:757 -961:1:764 -962:1:765 -963:1:776 -964:1:780 -965:1:781 -966:1:788 -967:1:789 -968:1:799 -969:1:800 -970:1:810 -971:1:811 -972:0:2227 -973:2:1894 -974:0:2227 -975:2:1895 -976:2:1899 -977:2:1900 -978:2:1907 -979:2:1911 -980:2:1912 -981:2:1919 -982:2:1923 -983:2:1924 -984:2:1931 -985:2:1932 -986:2:1942 -987:2:1943 -988:2:1953 -989:2:1954 -990:0:2227 -991:2:1821 -992:0:2227 -993:2:1822 -994:0:2227 -995:2:1823 -996:2:1827 -997:2:1828 -998:2:1835 -999:2:1839 -1000:2:1840 -1001:2:1847 -1002:2:1851 -1003:2:1852 -1004:2:1859 -1005:2:1860 -1006:2:1870 -1007:2:1871 -1008:2:1881 -1009:2:1882 -1010:0:2227 -1011:2:1894 -1012:0:2227 -1013:1:823 -1014:0:2227 -1015:1:827 -1016:0:2227 -1017:2:1895 -1018:2:1899 -1019:2:1900 -1020:2:1907 -1021:2:1911 -1022:2:1912 -1023:2:1919 -1024:2:1923 -1025:2:1924 -1026:2:1931 -1027:2:1932 -1028:2:1942 -1029:2:1943 -1030:2:1953 -1031:2:1954 -1032:0:2227 -1033:2:1821 -1034:0:2227 -1035:2:1822 -1036:0:2227 -1037:2:1823 -1038:2:1827 -1039:2:1828 -1040:2:1835 -1041:2:1839 -1042:2:1840 -1043:2:1847 -1044:2:1851 -1045:2:1852 -1046:2:1859 -1047:2:1860 -1048:2:1870 -1049:2:1871 -1050:2:1881 -1051:2:1882 -1052:0:2227 -1053:2:1894 -1054:0:2227 -1055:1:832 -1056:1:836 -1057:1:837 -1058:1:844 -1059:1:845 -1060:1:856 -1061:1:860 -1062:1:861 -1063:1:868 -1064:1:869 -1065:1:879 -1066:1:880 -1067:1:890 -1068:1:891 -1069:0:2227 -1070:1:1 -1071:0:2227 -1072:1:2 -1073:0:2227 -1074:1:3 -1075:0:2227 -1076:2:1895 -1077:2:1899 -1078:2:1900 -1079:2:1907 -1080:2:1911 -1081:2:1912 -1082:2:1919 -1083:2:1923 -1084:2:1924 -1085:2:1931 -1086:2:1932 -1087:2:1949 -1088:2:1950 -1089:2:1953 -1090:2:1954 -1091:0:2227 -1092:2:1821 -1093:0:2227 -1094:2:1822 -1095:0:2227 -1096:2:1823 -1097:2:1827 -1098:2:1828 -1099:2:1835 -1100:2:1839 -1101:2:1840 -1102:2:1847 -1103:2:1851 -1104:2:1852 -1105:2:1859 -1106:2:1860 -1107:2:1877 -1108:2:1878 -1109:2:1881 -1110:2:1882 -1111:0:2227 -1112:2:1894 -1113:0:2227 -1114:1:4 -1115:1:8 -1116:1:9 -1117:1:16 -1118:1:20 -1119:1:21 -1120:1:28 -1121:1:32 -1122:1:33 -1123:1:40 -1124:1:41 -1125:1:51 -1126:1:52 -1127:1:62 -1128:1:63 -1129:0:2227 -1130:2:1895 -1131:2:1899 -1132:2:1900 -1133:2:1907 -1134:2:1911 -1135:2:1912 -1136:2:1919 -1137:2:1923 -1138:2:1924 -1139:2:1931 -1140:2:1932 -1141:2:1949 -1142:2:1950 -1143:2:1953 -1144:2:1954 -1145:0:2227 -1146:2:1821 -1147:0:2227 -1148:2:1822 -1149:0:2227 -1150:2:1823 -1151:2:1827 -1152:2:1828 -1153:2:1835 -1154:2:1839 -1155:2:1840 -1156:2:1847 -1157:2:1851 -1158:2:1852 -1159:2:1859 -1160:2:1860 -1161:2:1877 -1162:2:1878 -1163:2:1881 -1164:2:1882 -1165:0:2227 -1166:2:1894 -1167:0:2227 -1168:1:75 -1169:0:2227 -1170:2:1895 -1171:2:1899 -1172:2:1900 -1173:2:1907 -1174:2:1911 -1175:2:1912 -1176:2:1919 -1177:2:1923 -1178:2:1924 -1179:2:1931 -1180:2:1932 -1181:2:1949 -1182:2:1950 -1183:2:1953 -1184:2:1954 -1185:0:2227 -1186:2:1821 -1187:0:2227 -1188:2:1822 -1189:0:2227 -1190:2:1823 -1191:2:1827 -1192:2:1828 -1193:2:1835 -1194:2:1839 -1195:2:1840 -1196:2:1847 -1197:2:1851 -1198:2:1852 -1199:2:1859 -1200:2:1860 -1201:2:1877 -1202:2:1878 -1203:2:1881 -1204:2:1882 -1205:0:2227 -1206:2:1894 -1207:0:2227 -1208:1:76 -1209:1:80 -1210:1:81 -1211:1:88 -1212:1:92 -1213:1:93 -1214:1:100 -1215:1:104 -1216:1:105 -1217:1:112 -1218:1:113 -1219:1:123 -1220:1:124 -1221:1:134 -1222:1:135 -1223:0:2227 -1224:1:147 -1225:0:2227 -1226:2:1895 -1227:2:1899 -1228:2:1900 -1229:2:1907 -1230:2:1911 -1231:2:1912 -1232:2:1919 -1233:2:1923 -1234:2:1924 -1235:2:1931 -1236:2:1932 -1237:2:1949 -1238:2:1950 -1239:2:1953 -1240:2:1954 -1241:0:2227 -1242:2:1821 -1243:0:2227 -1244:2:1822 -1245:0:2227 -1246:2:1823 -1247:2:1827 -1248:2:1828 -1249:2:1835 -1250:2:1839 -1251:2:1840 -1252:2:1847 -1253:2:1851 -1254:2:1852 -1255:2:1859 -1256:2:1860 -1257:2:1877 -1258:2:1878 -1259:2:1881 -1260:2:1882 -1261:0:2227 -1262:2:1894 -1263:0:2227 -1264:1:148 -1265:0:2227 -1266:2:1895 -1267:2:1899 -1268:2:1900 -1269:2:1907 -1270:2:1911 -1271:2:1912 -1272:2:1919 -1273:2:1923 -1274:2:1924 -1275:2:1931 -1276:2:1932 -1277:2:1949 -1278:2:1950 -1279:2:1953 -1280:2:1954 -1281:0:2227 -1282:2:1821 -1283:0:2227 -1284:2:1822 -1285:0:2227 -1286:2:1823 -1287:2:1827 -1288:2:1828 -1289:2:1835 -1290:2:1839 -1291:2:1840 -1292:2:1847 -1293:2:1851 -1294:2:1852 -1295:2:1859 -1296:2:1860 -1297:2:1877 -1298:2:1878 -1299:2:1881 -1300:2:1882 -1301:0:2227 -1302:2:1894 -1303:0:2227 -1304:1:149 -1305:1:153 -1306:1:154 -1307:1:161 -1308:1:165 -1309:1:166 -1310:1:173 -1311:1:177 -1312:1:178 -1313:1:185 -1314:1:186 -1315:1:196 -1316:1:197 -1317:1:207 -1318:1:208 -1319:0:2227 -1320:2:1895 -1321:2:1899 -1322:2:1900 -1323:2:1907 -1324:2:1911 -1325:2:1912 -1326:2:1919 -1327:2:1923 -1328:2:1924 -1329:2:1931 -1330:2:1932 -1331:2:1949 -1332:2:1950 -1333:2:1953 -1334:2:1954 -1335:0:2227 -1336:2:1821 -1337:0:2227 -1338:2:1822 -1339:0:2227 -1340:2:1823 -1341:2:1827 -1342:2:1828 -1343:2:1835 -1344:2:1839 -1345:2:1840 -1346:2:1847 -1347:2:1851 -1348:2:1852 -1349:2:1859 -1350:2:1860 -1351:2:1877 -1352:2:1878 -1353:2:1881 -1354:2:1882 -1355:0:2227 -1356:2:1894 -1357:0:2227 -1358:1:220 -1359:0:2227 -1360:1:373 -1361:0:2227 -1362:1:374 -1363:0:2227 -1364:1:3 -1365:0:2227 -1366:2:1895 -1367:2:1899 -1368:2:1900 -1369:2:1907 -1370:2:1911 -1371:2:1912 -1372:2:1919 -1373:2:1923 -1374:2:1924 -1375:2:1931 -1376:2:1932 -1377:2:1949 -1378:2:1950 -1379:2:1953 -1380:2:1954 -1381:0:2227 -1382:2:1821 -1383:0:2227 -1384:2:1822 -1385:0:2227 -1386:2:1823 -1387:2:1827 -1388:2:1828 -1389:2:1835 -1390:2:1839 -1391:2:1840 -1392:2:1847 -1393:2:1851 -1394:2:1852 -1395:2:1859 -1396:2:1860 -1397:2:1877 -1398:2:1878 -1399:2:1881 -1400:2:1882 -1401:0:2227 -1402:2:1894 -1403:0:2227 -1404:1:4 -1405:1:8 -1406:1:9 -1407:1:16 -1408:1:17 -1409:1:28 -1410:1:32 -1411:1:33 -1412:1:40 -1413:1:41 -1414:1:51 -1415:1:52 -1416:1:62 -1417:1:63 -1418:0:2227 -1419:2:1895 -1420:2:1899 -1421:2:1900 -1422:2:1907 -1423:2:1911 -1424:2:1912 -1425:2:1919 -1426:2:1923 -1427:2:1924 -1428:2:1931 -1429:2:1932 -1430:2:1949 -1431:2:1950 -1432:2:1953 -1433:2:1954 -1434:0:2227 -1435:2:1821 -1436:0:2227 -1437:2:1822 --1:-1:-1 -1438:0:2227 -1439:2:1823 -1440:2:1827 -1441:2:1828 -1442:2:1835 -1443:2:1839 -1444:2:1840 -1445:2:1847 -1446:2:1851 -1447:2:1852 -1448:2:1859 -1449:2:1860 -1450:2:1877 -1451:2:1878 -1452:2:1881 -1453:2:1882 -1454:0:2227 -1455:2:1894 -1456:0:2227 -1457:1:75 -1458:0:2227 -1459:2:1895 -1460:2:1899 -1461:2:1900 -1462:2:1907 -1463:2:1911 -1464:2:1912 -1465:2:1919 -1466:2:1923 -1467:2:1924 -1468:2:1931 -1469:2:1932 -1470:2:1949 -1471:2:1950 -1472:2:1953 -1473:2:1954 -1474:0:2227 -1475:2:1821 -1476:0:2227 -1477:2:1822 -1478:0:2227 -1479:2:1823 -1480:2:1827 -1481:2:1828 -1482:2:1835 -1483:2:1839 -1484:2:1840 -1485:2:1847 -1486:2:1851 -1487:2:1852 -1488:2:1859 -1489:2:1860 -1490:2:1877 -1491:2:1878 -1492:2:1881 -1493:2:1882 -1494:0:2227 -1495:2:1894 -1496:0:2227 -1497:1:76 -1498:1:80 -1499:1:81 -1500:1:88 -1501:1:92 -1502:1:93 -1503:1:100 -1504:1:104 -1505:1:105 -1506:1:112 -1507:1:113 -1508:1:123 -1509:1:124 -1510:1:134 -1511:1:135 -1512:0:2227 -1513:1:223 -1514:0:2227 -1515:2:1895 -1516:2:1899 -1517:2:1900 -1518:2:1907 -1519:2:1911 -1520:2:1912 -1521:2:1919 -1522:2:1923 -1523:2:1924 -1524:2:1931 -1525:2:1932 -1526:2:1949 -1527:2:1950 -1528:2:1953 -1529:2:1954 -1530:0:2227 -1531:2:1821 -1532:0:2227 -1533:2:1822 -1534:0:2227 -1535:2:1823 -1536:2:1827 -1537:2:1828 -1538:2:1835 -1539:2:1839 -1540:2:1840 -1541:2:1847 -1542:2:1851 -1543:2:1852 -1544:2:1859 -1545:2:1860 -1546:2:1877 -1547:2:1878 -1548:2:1881 -1549:2:1882 -1550:0:2227 -1551:2:1894 -1552:0:2227 -1553:1:224 -1554:0:2227 -1555:1:373 -1556:0:2227 -1557:1:374 -1558:0:2227 -1559:1:379 -1560:0:2227 -1561:2:1895 -1562:2:1899 -1563:2:1900 -1564:2:1907 -1565:2:1911 -1566:2:1912 -1567:2:1919 -1568:2:1923 -1569:2:1924 -1570:2:1931 -1571:2:1932 -1572:2:1949 -1573:2:1950 -1574:2:1953 -1575:2:1954 -1576:0:2227 -1577:2:1821 -1578:0:2227 -1579:2:1822 -1580:0:2227 -1581:2:1823 -1582:2:1827 -1583:2:1828 -1584:2:1835 -1585:2:1839 -1586:2:1840 -1587:2:1847 -1588:2:1851 -1589:2:1852 -1590:2:1859 -1591:2:1860 -1592:2:1877 -1593:2:1878 -1594:2:1881 -1595:2:1882 -1596:0:2227 -1597:2:1894 -1598:0:2227 -1599:1:384 -1600:1:388 -1601:1:389 -1602:1:396 -1603:1:397 -1604:1:408 -1605:1:412 -1606:1:413 -1607:1:420 -1608:1:421 -1609:1:431 -1610:1:432 -1611:1:442 -1612:1:443 -1613:0:2227 -1614:2:1895 -1615:2:1899 -1616:2:1900 -1617:2:1907 -1618:2:1911 -1619:2:1912 -1620:2:1919 -1621:2:1923 -1622:2:1924 -1623:2:1931 -1624:2:1932 -1625:2:1949 -1626:2:1950 -1627:2:1953 -1628:2:1954 -1629:0:2227 -1630:2:1821 -1631:0:2227 -1632:2:1822 -1633:0:2227 -1634:2:1823 -1635:2:1827 -1636:2:1828 -1637:2:1835 -1638:2:1839 -1639:2:1840 -1640:2:1847 -1641:2:1851 -1642:2:1852 -1643:2:1859 -1644:2:1860 -1645:2:1877 -1646:2:1878 -1647:2:1881 -1648:2:1882 -1649:0:2227 -1650:2:1894 -1651:0:2227 -1652:1:455 -1653:0:2227 -1654:2:1895 -1655:2:1899 -1656:2:1900 -1657:2:1907 -1658:2:1911 -1659:2:1912 -1660:2:1919 -1661:2:1923 -1662:2:1924 -1663:2:1931 -1664:2:1932 -1665:2:1949 -1666:2:1950 -1667:2:1953 -1668:2:1954 -1669:0:2227 -1670:2:1821 -1671:0:2227 -1672:2:1822 -1673:0:2227 -1674:2:1823 -1675:2:1827 -1676:2:1828 -1677:2:1835 -1678:2:1839 -1679:2:1840 -1680:2:1847 -1681:2:1851 -1682:2:1852 -1683:2:1859 -1684:2:1860 -1685:2:1877 -1686:2:1878 -1687:2:1881 -1688:2:1882 -1689:0:2227 -1690:2:1894 -1691:0:2227 -1692:1:456 -1693:1:460 -1694:1:461 -1695:1:468 -1696:1:472 -1697:1:473 -1698:1:480 -1699:1:484 -1700:1:485 -1701:1:492 -1702:1:493 -1703:1:503 -1704:1:504 -1705:1:514 -1706:1:515 -1707:0:2227 -1708:2:1895 -1709:2:1899 -1710:2:1900 -1711:2:1907 -1712:2:1911 -1713:2:1912 -1714:2:1919 -1715:2:1923 -1716:2:1924 -1717:2:1931 -1718:2:1932 -1719:2:1949 -1720:2:1950 -1721:2:1953 -1722:2:1954 -1723:0:2227 -1724:2:1821 -1725:0:2227 -1726:2:1822 -1727:0:2227 -1728:2:1823 -1729:2:1827 -1730:2:1828 -1731:2:1835 -1732:2:1839 -1733:2:1840 -1734:2:1847 -1735:2:1851 -1736:2:1852 -1737:2:1859 -1738:2:1860 -1739:2:1877 -1740:2:1878 -1741:2:1881 -1742:2:1882 -1743:0:2227 -1744:2:1894 -1745:0:2227 -1746:1:527 -1747:0:2227 -1748:2:1895 -1749:2:1899 -1750:2:1900 -1751:2:1907 -1752:2:1911 -1753:2:1912 -1754:2:1919 -1755:2:1923 -1756:2:1924 -1757:2:1931 -1758:2:1932 -1759:2:1949 -1760:2:1950 -1761:2:1953 -1762:2:1954 -1763:0:2227 -1764:2:1821 -1765:0:2227 -1766:2:1822 -1767:0:2227 -1768:2:1823 -1769:2:1827 -1770:2:1828 -1771:2:1835 -1772:2:1839 -1773:2:1840 -1774:2:1847 -1775:2:1851 -1776:2:1852 -1777:2:1859 -1778:2:1860 -1779:2:1877 -1780:2:1878 -1781:2:1881 -1782:2:1882 -1783:0:2227 -1784:2:1894 -1785:0:2227 -1786:1:528 -1787:1:532 -1788:1:533 -1789:1:540 -1790:1:544 -1791:1:545 -1792:1:552 -1793:1:556 -1794:1:557 -1795:1:564 -1796:1:565 -1797:1:575 -1798:1:576 -1799:1:586 -1800:1:587 -1801:0:2227 -1802:2:1895 -1803:2:1899 -1804:2:1900 -1805:2:1907 -1806:2:1911 -1807:2:1912 -1808:2:1919 -1809:2:1923 -1810:2:1924 -1811:2:1931 -1812:2:1932 -1813:2:1949 -1814:2:1950 -1815:2:1953 -1816:2:1954 -1817:0:2227 -1818:2:1821 -1819:0:2227 -1820:2:1822 -1821:0:2227 -1822:2:1823 -1823:2:1827 -1824:2:1828 -1825:2:1835 -1826:2:1839 -1827:2:1840 -1828:2:1847 -1829:2:1851 -1830:2:1852 -1831:2:1859 -1832:2:1860 -1833:2:1877 -1834:2:1878 -1835:2:1881 -1836:2:1882 -1837:0:2227 -1838:2:1894 -1839:0:2227 -1840:1:599 -1841:0:2227 -1842:1:600 -1843:0:2227 -1844:1:601 -1845:0:2227 -1846:1:746 -1847:0:2227 -1848:1:747 -1849:0:2227 -1850:2:1895 -1851:2:1899 -1852:2:1900 -1853:2:1907 -1854:2:1911 -1855:2:1912 -1856:2:1919 -1857:2:1923 -1858:2:1924 -1859:2:1931 -1860:2:1932 -1861:2:1949 -1862:2:1950 -1863:2:1953 -1864:2:1954 -1865:0:2227 -1866:2:1821 -1867:0:2227 -1868:2:1822 -1869:0:2227 -1870:2:1823 -1871:2:1827 -1872:2:1828 -1873:2:1835 -1874:2:1839 -1875:2:1840 -1876:2:1847 -1877:2:1851 -1878:2:1852 -1879:2:1859 -1880:2:1860 -1881:2:1877 -1882:2:1878 -1883:2:1881 -1884:2:1882 -1885:0:2227 -1886:2:1894 -1887:0:2227 -1888:1:751 -1889:0:2227 -1890:2:1895 -1891:2:1899 -1892:2:1900 -1893:2:1907 -1894:2:1911 -1895:2:1912 -1896:2:1919 -1897:2:1923 -1898:2:1924 -1899:2:1931 -1900:2:1932 -1901:2:1949 -1902:2:1950 -1903:2:1953 -1904:2:1954 -1905:0:2227 -1906:2:1821 -1907:0:2227 -1908:2:1822 -1909:0:2227 -1910:2:1823 -1911:2:1827 -1912:2:1828 -1913:2:1835 -1914:2:1839 -1915:2:1840 -1916:2:1847 -1917:2:1851 -1918:2:1852 -1919:2:1859 -1920:2:1860 -1921:2:1877 -1922:2:1878 -1923:2:1881 -1924:2:1882 -1925:0:2227 -1926:2:1894 -1927:0:2227 -1928:1:752 -1929:1:756 -1930:1:757 -1931:1:764 -1932:1:768 -1933:1:769 -1934:1:776 -1935:1:780 -1936:1:781 -1937:1:788 -1938:1:789 -1939:1:799 -1940:1:800 -1941:1:810 -1942:1:811 -1943:0:2227 -1944:2:1895 -1945:2:1899 -1946:2:1900 -1947:2:1907 -1948:2:1911 -1949:2:1912 -1950:2:1919 -1951:2:1923 -1952:2:1924 -1953:2:1931 -1954:2:1932 -1955:2:1949 -1956:2:1950 -1957:2:1953 -1958:2:1954 -1959:0:2227 -1960:2:1821 -1961:0:2227 -1962:2:1822 -1963:0:2227 -1964:2:1823 -1965:2:1827 -1966:2:1828 -1967:2:1835 -1968:2:1839 -1969:2:1840 -1970:2:1847 -1971:2:1851 -1972:2:1852 -1973:2:1859 -1974:2:1860 -1975:2:1877 -1976:2:1878 -1977:2:1881 -1978:2:1882 -1979:0:2227 -1980:2:1894 -1981:0:2227 -1982:1:823 -1983:0:2227 -1984:1:601 -1985:0:2227 -1986:1:746 -1987:0:2227 -1988:1:747 -1989:0:2227 -1990:2:1895 -1991:2:1899 -1992:2:1900 -1993:2:1907 -1994:2:1911 -1995:2:1912 -1996:2:1919 -1997:2:1923 -1998:2:1924 -1999:2:1931 -2000:2:1932 -2001:2:1949 -2002:2:1950 -2003:2:1953 -2004:2:1954 -2005:0:2227 -2006:2:1821 -2007:0:2227 -2008:2:1822 -2009:0:2227 -2010:2:1823 -2011:2:1827 -2012:2:1828 -2013:2:1835 -2014:2:1839 -2015:2:1840 -2016:2:1847 -2017:2:1851 -2018:2:1852 -2019:2:1859 -2020:2:1860 -2021:2:1877 -2022:2:1878 -2023:2:1881 -2024:2:1882 -2025:0:2227 -2026:2:1894 -2027:0:2227 -2028:1:751 -2029:0:2227 -2030:2:1895 -2031:2:1899 -2032:2:1900 -2033:2:1907 -2034:2:1911 -2035:2:1912 -2036:2:1919 -2037:2:1923 -2038:2:1924 -2039:2:1931 -2040:2:1932 -2041:2:1949 -2042:2:1950 -2043:2:1953 -2044:2:1954 -2045:0:2227 -2046:2:1821 -2047:0:2227 -2048:2:1822 -2049:0:2227 -2050:2:1823 -2051:2:1827 -2052:2:1828 -2053:2:1835 -2054:2:1839 -2055:2:1840 -2056:2:1847 -2057:2:1851 -2058:2:1852 -2059:2:1859 -2060:2:1860 -2061:2:1877 -2062:2:1878 -2063:2:1881 -2064:2:1882 -2065:0:2227 -2066:2:1894 -2067:0:2227 -2068:1:752 -2069:1:756 -2070:1:757 -2071:1:764 -2072:1:765 -2073:1:776 -2074:1:780 -2075:1:781 -2076:1:788 -2077:1:789 -2078:1:799 -2079:1:800 -2080:1:810 -2081:1:811 -2082:0:2227 -2083:2:1895 -2084:2:1899 -2085:2:1900 -2086:2:1907 -2087:2:1911 -2088:2:1912 -2089:2:1919 -2090:2:1923 -2091:2:1924 -2092:2:1931 -2093:2:1932 -2094:2:1949 -2095:2:1950 -2096:2:1953 -2097:2:1954 -2098:0:2227 -2099:2:1821 -2100:0:2227 -2101:2:1822 -2102:0:2227 -2103:2:1823 -2104:2:1827 -2105:2:1828 -2106:2:1835 -2107:2:1839 -2108:2:1840 -2109:2:1847 -2110:2:1851 -2111:2:1852 -2112:2:1859 -2113:2:1860 -2114:2:1877 -2115:2:1878 -2116:2:1881 -2117:2:1882 -2118:0:2227 -2119:2:1894 -2120:0:2227 -2121:1:823 -2122:0:2227 -2123:1:827 -2124:0:2227 -2125:2:1895 -2126:2:1899 -2127:2:1900 -2128:2:1907 -2129:2:1911 -2130:2:1912 -2131:2:1919 -2132:2:1923 -2133:2:1924 -2134:2:1931 -2135:2:1932 -2136:2:1949 -2137:2:1950 -2138:2:1953 -2139:2:1954 -2140:0:2227 -2141:2:1821 -2142:0:2227 -2143:2:1822 -2144:0:2227 -2145:2:1823 -2146:2:1827 -2147:2:1828 -2148:2:1835 -2149:2:1839 -2150:2:1840 -2151:2:1847 -2152:2:1851 -2153:2:1852 -2154:2:1859 -2155:2:1860 -2156:2:1877 -2157:2:1878 -2158:2:1881 -2159:2:1882 -2160:0:2227 -2161:2:1894 -2162:0:2227 -2163:1:832 -2164:1:836 -2165:1:837 -2166:1:844 -2167:1:845 -2168:1:856 -2169:1:860 -2170:1:861 -2171:1:868 -2172:1:869 -2173:1:879 -2174:1:880 -2175:1:890 -2176:1:891 -2177:0:2227 -2178:1:1 -2179:0:2227 -2180:1:2 -2181:0:2227 -2182:1:3 -2183:0:2227 -2184:2:1895 -2185:2:1899 -2186:2:1900 -2187:2:1907 -2188:2:1911 -2189:2:1912 -2190:2:1919 -2191:2:1923 -2192:2:1924 -2193:2:1931 -2194:2:1932 -2195:2:1949 -2196:2:1950 -2197:2:1953 -2198:2:1954 -2199:0:2227 -2200:2:1821 -2201:0:2227 -2202:2:1822 -2203:0:2227 -2204:2:1823 -2205:2:1827 -2206:2:1828 -2207:2:1835 -2208:2:1839 -2209:2:1840 -2210:2:1847 -2211:2:1851 -2212:2:1852 -2213:2:1859 -2214:2:1860 -2215:2:1877 -2216:2:1878 -2217:2:1881 -2218:2:1882 -2219:0:2227 -2220:2:1894 -2221:0:2227 -2222:1:4 -2223:1:8 -2224:1:9 -2225:1:16 -2226:1:20 -2227:1:21 -2228:1:28 -2229:1:32 -2230:1:33 -2231:1:40 -2232:1:41 -2233:1:51 -2234:1:52 -2235:1:62 -2236:1:63 -2237:0:2227 -2238:2:1895 -2239:2:1899 -2240:2:1900 -2241:2:1907 -2242:2:1911 -2243:2:1912 -2244:2:1919 -2245:2:1923 -2246:2:1924 -2247:2:1931 -2248:2:1932 -2249:2:1949 -2250:2:1950 -2251:2:1953 -2252:2:1954 -2253:0:2227 -2254:2:1821 -2255:0:2227 -2256:2:1822 -2257:0:2227 -2258:2:1823 -2259:2:1827 -2260:2:1828 -2261:2:1835 -2262:2:1839 -2263:2:1840 -2264:2:1847 -2265:2:1851 -2266:2:1852 -2267:2:1859 -2268:2:1860 -2269:2:1877 -2270:2:1878 -2271:2:1881 -2272:2:1882 -2273:0:2227 -2274:2:1894 -2275:0:2227 -2276:1:75 -2277:0:2227 -2278:2:1895 -2279:2:1899 -2280:2:1900 -2281:2:1907 -2282:2:1911 -2283:2:1912 -2284:2:1919 -2285:2:1923 -2286:2:1924 -2287:2:1931 -2288:2:1932 -2289:2:1949 -2290:2:1950 -2291:2:1953 -2292:2:1954 -2293:0:2227 -2294:2:1821 -2295:0:2227 -2296:2:1822 -2297:0:2227 -2298:2:1823 -2299:2:1827 -2300:2:1828 -2301:2:1835 -2302:2:1839 -2303:2:1840 -2304:2:1847 -2305:2:1851 -2306:2:1852 -2307:2:1859 -2308:2:1860 -2309:2:1877 -2310:2:1878 -2311:2:1881 -2312:2:1882 -2313:0:2227 -2314:2:1894 -2315:0:2227 -2316:1:76 -2317:1:80 -2318:1:81 -2319:1:88 -2320:1:92 -2321:1:93 -2322:1:100 -2323:1:104 -2324:1:105 -2325:1:112 -2326:1:113 -2327:1:123 -2328:1:124 -2329:1:134 -2330:1:135 -2331:0:2227 -2332:1:147 -2333:0:2227 -2334:2:1895 -2335:2:1899 -2336:2:1900 -2337:2:1907 -2338:2:1911 -2339:2:1912 -2340:2:1919 -2341:2:1923 -2342:2:1924 -2343:2:1931 -2344:2:1932 -2345:2:1949 -2346:2:1950 -2347:2:1953 -2348:2:1954 -2349:0:2227 -2350:2:1821 -2351:0:2227 -2352:2:1822 -2353:0:2227 -2354:2:1823 -2355:2:1827 -2356:2:1828 -2357:2:1835 -2358:2:1839 -2359:2:1840 -2360:2:1847 -2361:2:1851 -2362:2:1852 -2363:2:1859 -2364:2:1860 -2365:2:1877 -2366:2:1878 -2367:2:1881 -2368:2:1882 -2369:0:2227 -2370:2:1894 -2371:0:2227 -2372:1:148 -2373:0:2227 -2374:2:1895 -2375:2:1899 -2376:2:1900 -2377:2:1907 -2378:2:1911 -2379:2:1912 -2380:2:1919 -2381:2:1923 -2382:2:1924 -2383:2:1931 -2384:2:1932 -2385:2:1949 -2386:2:1950 -2387:2:1953 -2388:2:1954 -2389:0:2227 -2390:2:1821 -2391:0:2227 -2392:2:1822 -2393:0:2227 -2394:2:1823 -2395:2:1827 -2396:2:1828 -2397:2:1835 -2398:2:1839 -2399:2:1840 -2400:2:1847 -2401:2:1851 -2402:2:1852 -2403:2:1859 -2404:2:1860 -2405:2:1877 -2406:2:1878 -2407:2:1881 -2408:2:1882 -2409:0:2227 -2410:2:1894 -2411:0:2227 -2412:1:149 -2413:1:153 -2414:1:154 -2415:1:161 -2416:1:165 -2417:1:166 -2418:1:173 -2419:1:177 -2420:1:178 -2421:1:185 -2422:1:186 -2423:1:196 -2424:1:197 -2425:1:207 -2426:1:208 -2427:0:2227 -2428:2:1895 -2429:2:1899 -2430:2:1900 -2431:2:1907 -2432:2:1911 -2433:2:1912 -2434:2:1919 -2435:2:1923 -2436:2:1924 -2437:2:1931 -2438:2:1932 -2439:2:1949 -2440:2:1950 -2441:2:1953 -2442:2:1954 -2443:0:2227 -2444:2:1821 -2445:0:2227 -2446:2:1822 -2447:0:2227 -2448:2:1823 -2449:2:1827 -2450:2:1828 -2451:2:1835 -2452:2:1839 -2453:2:1840 -2454:2:1847 -2455:2:1851 -2456:2:1852 -2457:2:1859 -2458:2:1860 -2459:2:1877 -2460:2:1878 -2461:2:1881 -2462:2:1882 -2463:0:2227 -2464:2:1894 -2465:0:2227 -2466:1:220 -2467:0:2227 -2468:1:373 -2469:0:2227 -2470:1:374 -2471:0:2227 -2472:1:3 -2473:0:2227 -2474:2:1895 -2475:2:1899 -2476:2:1900 -2477:2:1907 -2478:2:1911 -2479:2:1912 -2480:2:1919 -2481:2:1923 -2482:2:1924 -2483:2:1931 -2484:2:1932 -2485:2:1949 -2486:2:1950 -2487:2:1953 -2488:2:1954 -2489:0:2227 -2490:2:1821 -2491:0:2227 -2492:2:1822 -2493:0:2227 -2494:2:1823 -2495:2:1827 -2496:2:1828 -2497:2:1835 -2498:2:1839 -2499:2:1840 -2500:2:1847 -2501:2:1851 -2502:2:1852 -2503:2:1859 -2504:2:1860 -2505:2:1877 -2506:2:1878 -2507:2:1881 -2508:2:1882 -2509:0:2227 -2510:2:1894 -2511:0:2227 -2512:1:4 -2513:1:8 -2514:1:9 -2515:1:24 -2516:1:25 -2517:1:28 -2518:1:32 -2519:1:33 -2520:1:40 -2521:1:41 -2522:1:51 -2523:1:54 -2524:1:55 -2525:1:62 -2526:1:63 -2527:0:2227 -2528:2:1895 -2529:2:1899 -2530:2:1900 -2531:2:1907 -2532:2:1911 -2533:2:1912 -2534:2:1919 -2535:2:1923 -2536:2:1924 -2537:2:1931 -2538:2:1932 -2539:2:1949 -2540:2:1950 -2541:2:1953 -2542:2:1954 -2543:0:2227 -2544:2:1821 -2545:0:2227 -2546:2:1822 -2547:0:2227 -2548:2:1823 -2549:2:1827 -2550:2:1828 -2551:2:1835 -2552:2:1839 -2553:2:1840 -2554:2:1847 -2555:2:1851 -2556:2:1852 -2557:2:1859 -2558:2:1860 -2559:2:1877 -2560:2:1878 -2561:2:1881 -2562:2:1882 -2563:0:2227 -2564:2:1894 -2565:0:2227 -2566:1:75 -2567:0:2227 -2568:2:1895 -2569:2:1899 -2570:2:1900 -2571:2:1907 -2572:2:1911 -2573:2:1912 -2574:2:1919 -2575:2:1923 -2576:2:1924 -2577:2:1931 -2578:2:1932 -2579:2:1949 -2580:2:1950 -2581:2:1953 -2582:2:1954 -2583:0:2227 -2584:2:1821 -2585:0:2227 -2586:2:1822 -2587:0:2227 -2588:2:1823 -2589:2:1827 -2590:2:1828 -2591:2:1835 -2592:2:1839 -2593:2:1840 -2594:2:1847 -2595:2:1851 -2596:2:1852 -2597:2:1859 -2598:2:1860 -2599:2:1877 -2600:2:1878 -2601:2:1881 -2602:2:1882 -2603:0:2227 -2604:2:1894 -2605:0:2227 -2606:1:76 -2607:1:80 -2608:1:81 -2609:1:96 -2610:1:97 -2611:1:100 -2612:1:104 -2613:1:105 -2614:1:112 -2615:1:113 -2616:1:123 -2617:1:126 -2618:1:127 -2619:1:134 -2620:1:135 -2621:0:2227 -2622:1:223 -2623:0:2227 -2624:2:1895 -2625:2:1899 -2626:2:1900 -2627:2:1907 -2628:2:1911 -2629:2:1912 -2630:2:1919 -2631:2:1923 -2632:2:1924 -2633:2:1931 -2634:2:1932 -2635:2:1949 -2636:2:1950 -2637:2:1953 -2638:2:1954 -2639:0:2227 -2640:2:1821 -2641:0:2227 -2642:2:1822 -2643:0:2227 -2644:2:1823 -2645:2:1827 -2646:2:1828 -2647:2:1835 -2648:2:1839 -2649:2:1840 -2650:2:1847 -2651:2:1851 -2652:2:1852 -2653:2:1859 -2654:2:1860 -2655:2:1877 -2656:2:1878 -2657:2:1881 -2658:2:1882 -2659:0:2227 -2660:2:1894 -2661:0:2227 -2662:1:224 -2663:0:2227 -2664:1:373 -2665:0:2227 -2666:1:374 -2667:0:2227 -2668:1:379 -2669:0:2227 -2670:2:1895 -2671:2:1899 -2672:2:1900 -2673:2:1907 -2674:2:1911 -2675:2:1912 -2676:2:1919 -2677:2:1923 -2678:2:1924 -2679:2:1931 -2680:2:1932 -2681:2:1949 -2682:2:1950 -2683:2:1953 -2684:2:1954 -2685:0:2227 -2686:2:1821 -2687:0:2227 -2688:2:1822 -2689:0:2227 -2690:2:1823 -2691:2:1827 -2692:2:1828 -2693:2:1835 -2694:2:1839 -2695:2:1840 -2696:2:1847 -2697:2:1851 -2698:2:1852 -2699:2:1859 -2700:2:1860 -2701:2:1877 -2702:2:1878 -2703:2:1881 -2704:2:1882 -2705:0:2227 -2706:2:1894 -2707:0:2227 -2708:1:384 -2709:1:388 -2710:1:389 -2711:1:404 -2712:1:405 -2713:1:408 -2714:1:412 -2715:1:413 -2716:1:420 -2717:1:421 -2718:1:431 -2719:1:434 -2720:1:435 -2721:1:442 -2722:1:443 -2723:0:2227 -2724:2:1895 -2725:2:1899 -2726:2:1900 -2727:2:1907 -2728:2:1911 -2729:2:1912 -2730:2:1919 -2731:2:1923 -2732:2:1924 -2733:2:1931 -2734:2:1932 -2735:2:1949 -2736:2:1950 -2737:2:1953 -2738:2:1954 -2739:0:2227 -2740:2:1821 -2741:0:2227 -2742:2:1822 -2743:0:2227 -2744:2:1823 -2745:2:1827 -2746:2:1828 -2747:2:1835 -2748:2:1839 -2749:2:1840 -2750:2:1847 -2751:2:1851 -2752:2:1852 -2753:2:1859 -2754:2:1860 -2755:2:1877 -2756:2:1878 -2757:2:1881 -2758:2:1882 -2759:0:2227 -2760:2:1894 -2761:0:2227 -2762:1:455 -2763:0:2227 -2764:2:1895 -2765:2:1899 -2766:2:1900 -2767:2:1907 -2768:2:1911 -2769:2:1912 -2770:2:1919 -2771:2:1923 -2772:2:1924 -2773:2:1931 -2774:2:1932 -2775:2:1949 -2776:2:1950 -2777:2:1953 -2778:2:1954 -2779:0:2227 -2780:2:1821 -2781:0:2227 -2782:2:1822 -2783:0:2227 -2784:2:1823 -2785:2:1827 -2786:2:1828 -2787:2:1835 -2788:2:1839 -2789:2:1840 -2790:2:1847 -2791:2:1851 -2792:2:1852 -2793:2:1859 -2794:2:1860 -2795:2:1877 -2796:2:1878 -2797:2:1881 -2798:2:1882 -2799:0:2227 -2800:2:1894 -2801:0:2227 -2802:1:456 -2803:1:460 -2804:1:461 -2805:1:476 -2806:1:477 -2807:1:480 -2808:1:484 -2809:1:485 -2810:1:492 -2811:1:493 -2812:1:503 -2813:1:506 -2814:1:507 -2815:1:514 -2816:1:515 -2817:0:2227 -2818:2:1895 -2819:2:1899 -2820:2:1900 -2821:2:1907 -2822:2:1911 -2823:2:1912 -2824:2:1919 -2825:2:1923 -2826:2:1924 -2827:2:1931 -2828:2:1932 -2829:2:1949 -2830:2:1950 -2831:2:1953 -2832:2:1954 -2833:0:2227 -2834:2:1821 -2835:0:2227 -2836:2:1822 -2837:0:2227 -2838:2:1823 -2839:2:1827 -2840:2:1828 -2841:2:1835 -2842:2:1839 -2843:2:1840 -2844:2:1847 -2845:2:1851 -2846:2:1852 -2847:2:1859 -2848:2:1860 -2849:2:1877 -2850:2:1878 -2851:2:1881 -2852:2:1882 -2853:0:2227 -2854:2:1894 -2855:0:2227 -2856:1:527 -2857:0:2227 -2858:2:1895 -2859:2:1899 -2860:2:1900 -2861:2:1907 -2862:2:1911 -2863:2:1912 -2864:2:1919 -2865:2:1923 -2866:2:1924 -2867:2:1931 -2868:2:1932 -2869:2:1949 -2870:2:1950 -2871:2:1953 -2872:2:1954 -2873:0:2227 -2874:2:1821 -2875:0:2227 -2876:2:1822 -2877:0:2227 -2878:2:1823 -2879:2:1827 -2880:2:1828 -2881:2:1835 -2882:2:1839 -2883:2:1840 -2884:2:1847 -2885:2:1851 -2886:2:1852 -2887:2:1859 -2888:2:1860 -2889:2:1877 -2890:2:1878 -2891:2:1881 -2892:2:1882 -2893:0:2227 -2894:2:1894 -2895:0:2227 -2896:1:528 -2897:1:532 -2898:1:533 -2899:1:548 -2900:1:549 -2901:1:552 -2902:1:556 -2903:1:557 -2904:1:564 -2905:1:565 -2906:1:575 -2907:1:578 -2908:1:579 -2909:1:586 -2910:1:587 -2911:0:2227 -2912:2:1895 -2913:2:1899 -2914:2:1900 -2915:2:1907 -2916:2:1911 -2917:2:1912 -2918:2:1919 -2919:2:1923 -2920:2:1924 -2921:2:1931 -2922:2:1932 -2923:2:1949 -2924:2:1950 -2925:2:1953 -2926:2:1954 -2927:0:2227 -2928:2:1821 -2929:0:2227 -2930:2:1822 -2931:0:2227 -2932:2:1823 -2933:2:1827 -2934:2:1828 -2935:2:1835 -2936:2:1839 -2937:2:1840 -2938:2:1847 -2939:2:1851 -2940:2:1852 -2941:2:1859 -2942:2:1860 -2943:2:1877 -2944:2:1878 -2945:2:1881 -2946:2:1882 -2947:0:2227 -2948:2:1894 -2949:0:2227 -2950:1:599 -2951:0:2227 -2952:1:600 -2953:0:2227 -2954:1:601 -2955:0:2227 -2956:1:746 -2957:0:2227 -2958:1:747 -2959:0:2227 -2960:2:1895 -2961:2:1899 -2962:2:1900 -2963:2:1907 -2964:2:1911 -2965:2:1912 -2966:2:1919 -2967:2:1923 -2968:2:1924 -2969:2:1931 -2970:2:1932 -2971:2:1949 -2972:2:1950 -2973:2:1953 -2974:2:1954 -2975:0:2227 -2976:2:1821 -2977:0:2227 -2978:2:1822 -2979:0:2227 -2980:2:1823 -2981:2:1827 -2982:2:1828 -2983:2:1835 -2984:2:1839 -2985:2:1840 -2986:2:1847 -2987:2:1851 -2988:2:1852 -2989:2:1859 -2990:2:1860 -2991:2:1877 -2992:2:1878 -2993:2:1881 -2994:2:1882 -2995:0:2227 -2996:2:1894 -2997:0:2227 -2998:1:751 -2999:0:2227 -3000:2:1895 -3001:2:1899 -3002:2:1900 -3003:2:1907 -3004:2:1911 -3005:2:1912 -3006:2:1919 -3007:2:1923 -3008:2:1924 -3009:2:1931 -3010:2:1932 -3011:2:1949 -3012:2:1950 -3013:2:1953 -3014:2:1954 -3015:0:2227 -3016:2:1821 -3017:0:2227 -3018:2:1822 -3019:0:2227 -3020:2:1823 -3021:2:1827 -3022:2:1828 -3023:2:1835 -3024:2:1839 -3025:2:1840 -3026:2:1847 -3027:2:1851 -3028:2:1852 -3029:2:1859 -3030:2:1860 -3031:2:1877 -3032:2:1878 -3033:2:1881 -3034:2:1882 -3035:0:2227 -3036:2:1894 -3037:0:2227 -3038:1:752 -3039:1:756 -3040:1:757 -3041:1:772 -3042:1:773 -3043:1:776 -3044:1:780 -3045:1:781 -3046:1:788 -3047:1:789 -3048:1:799 -3049:1:802 -3050:1:803 -3051:1:810 -3052:1:811 -3053:0:2227 -3054:2:1895 -3055:2:1899 -3056:2:1900 -3057:2:1907 -3058:2:1911 -3059:2:1912 -3060:2:1919 -3061:2:1923 -3062:2:1924 -3063:2:1931 -3064:2:1932 -3065:2:1949 -3066:2:1950 -3067:2:1953 -3068:2:1954 -3069:0:2227 -3070:2:1821 -3071:0:2227 -3072:2:1822 -3073:0:2227 -3074:2:1823 -3075:2:1827 -3076:2:1828 -3077:2:1835 -3078:2:1839 -3079:2:1840 -3080:2:1847 -3081:2:1851 -3082:2:1852 -3083:2:1859 -3084:2:1860 -3085:2:1877 -3086:2:1878 -3087:2:1881 -3088:2:1882 -3089:0:2227 -3090:2:1894 -3091:0:2227 -3092:1:823 -3093:0:2227 -3094:1:601 -3095:0:2227 -3096:1:746 -3097:0:2227 -3098:1:747 -3099:0:2227 -3100:2:1895 -3101:2:1899 -3102:2:1900 -3103:2:1907 -3104:2:1911 -3105:2:1912 -3106:2:1919 -3107:2:1923 -3108:2:1924 -3109:2:1931 -3110:2:1932 -3111:2:1949 -3112:2:1950 -3113:2:1953 -3114:2:1954 -3115:0:2227 -3116:2:1821 -3117:0:2227 -3118:2:1822 -3119:0:2227 -3120:2:1823 -3121:2:1827 -3122:2:1828 -3123:2:1835 -3124:2:1839 -3125:2:1840 -3126:2:1847 -3127:2:1851 -3128:2:1852 -3129:2:1859 -3130:2:1860 -3131:2:1877 -3132:2:1878 -3133:2:1881 -3134:2:1882 -3135:0:2227 -3136:2:1894 -3137:0:2227 -3138:1:751 -3139:0:2227 -3140:2:1895 -3141:2:1899 -3142:2:1900 -3143:2:1907 -3144:2:1911 -3145:2:1912 -3146:2:1919 -3147:2:1923 -3148:2:1924 -3149:2:1931 -3150:2:1932 -3151:2:1949 -3152:2:1950 -3153:2:1953 -3154:2:1954 -3155:0:2227 -3156:2:1821 -3157:0:2227 -3158:2:1822 -3159:0:2227 -3160:2:1823 -3161:2:1827 -3162:2:1828 -3163:2:1835 -3164:2:1839 -3165:2:1840 -3166:2:1847 -3167:2:1851 -3168:2:1852 -3169:2:1859 -3170:2:1860 -3171:2:1877 -3172:2:1878 -3173:2:1881 -3174:2:1882 -3175:0:2227 -3176:2:1894 -3177:0:2227 -3178:1:752 -3179:1:756 -3180:1:757 -3181:1:772 -3182:1:773 -3183:1:776 -3184:1:780 -3185:1:781 -3186:1:788 -3187:1:789 -3188:1:799 -3189:1:802 -3190:1:803 -3191:1:810 -3192:1:811 -3193:0:2227 -3194:2:1895 -3195:2:1899 -3196:2:1900 -3197:2:1907 -3198:2:1911 -3199:2:1912 -3200:2:1919 -3201:2:1923 -3202:2:1924 -3203:2:1931 -3204:2:1932 -3205:2:1949 -3206:2:1950 -3207:2:1953 -3208:2:1954 -3209:0:2227 -3210:2:1821 -3211:0:2227 -3212:2:1822 -3213:0:2227 -3214:2:1823 -3215:2:1827 -3216:2:1828 -3217:2:1835 -3218:2:1839 -3219:2:1840 -3220:2:1847 -3221:2:1851 -3222:2:1852 -3223:2:1859 -3224:2:1860 -3225:2:1877 -3226:2:1878 -3227:2:1881 -3228:2:1882 -3229:0:2227 -3230:2:1894 -3231:0:2227 -3232:1:823 -3233:0:2227 -3234:1:827 -3235:0:2227 -3236:2:1895 -3237:2:1899 -3238:2:1900 -3239:2:1907 -3240:2:1911 -3241:2:1912 -3242:2:1919 -3243:2:1923 -3244:2:1924 -3245:2:1931 -3246:2:1932 -3247:2:1949 -3248:2:1950 -3249:2:1953 -3250:2:1954 -3251:0:2227 -3252:2:1821 -3253:0:2227 -3254:2:1822 -3255:0:2227 -3256:2:1823 -3257:2:1827 -3258:2:1828 -3259:2:1835 -3260:2:1839 -3261:2:1840 -3262:2:1847 -3263:2:1851 -3264:2:1852 -3265:2:1859 -3266:2:1860 -3267:2:1877 -3268:2:1878 -3269:2:1881 -3270:2:1882 -3271:0:2227 -3272:2:1894 -3273:0:2227 -3274:1:832 -3275:1:836 -3276:1:837 -3277:1:852 -3278:1:853 -3279:1:856 -3280:1:860 -3281:1:861 -3282:1:868 -3283:1:869 -3284:1:879 -3285:1:882 -3286:1:883 -3287:1:890 -3288:1:891 -3289:0:2227 -3290:1:1 -3291:0:2227 -3292:1:2 -3293:0:2227 -3294:1:3 -3295:0:2227 -3296:2:1895 -3297:2:1899 -3298:2:1900 -3299:2:1907 -3300:2:1911 -3301:2:1912 -3302:2:1919 -3303:2:1923 -3304:2:1924 -3305:2:1931 -3306:2:1932 -3307:2:1949 -3308:2:1950 -3309:2:1953 -3310:2:1954 -3311:0:2227 -3312:2:1821 -3313:0:2227 -3314:2:1822 -3315:0:2227 -3316:2:1823 -3317:2:1827 -3318:2:1828 -3319:2:1835 -3320:2:1839 -3321:2:1840 -3322:2:1847 -3323:2:1851 -3324:2:1852 -3325:2:1859 -3326:2:1860 -3327:2:1877 -3328:2:1878 -3329:2:1881 -3330:2:1882 -3331:0:2227 -3332:2:1894 -3333:0:2227 -3334:1:4 -3335:1:8 -3336:1:9 -3337:1:24 -3338:1:25 -3339:1:28 -3340:1:32 -3341:1:33 -3342:1:40 -3343:1:41 -3344:1:51 -3345:1:54 -3346:1:55 -3347:1:62 -3348:1:63 -3349:0:2227 -3350:2:1895 -3351:2:1899 -3352:2:1900 -3353:2:1907 -3354:2:1911 -3355:2:1912 -3356:2:1919 -3357:2:1923 -3358:2:1924 -3359:2:1931 -3360:2:1932 -3361:2:1949 -3362:2:1950 -3363:2:1953 -3364:2:1954 -3365:0:2227 -3366:2:1821 -3367:0:2227 -3368:2:1822 -3369:0:2227 -3370:2:1823 -3371:2:1827 -3372:2:1828 -3373:2:1835 -3374:2:1839 -3375:2:1840 -3376:2:1847 -3377:2:1851 -3378:2:1852 -3379:2:1859 -3380:2:1860 -3381:2:1877 -3382:2:1878 -3383:2:1881 -3384:2:1882 -3385:0:2227 -3386:2:1894 -3387:0:2227 -3388:1:75 -3389:0:2227 -3390:2:1895 -3391:2:1899 -3392:2:1900 -3393:2:1907 -3394:2:1911 -3395:2:1912 -3396:2:1919 -3397:2:1923 -3398:2:1924 -3399:2:1931 -3400:2:1932 -3401:2:1949 -3402:2:1950 -3403:2:1953 -3404:2:1954 -3405:0:2227 -3406:2:1821 -3407:0:2227 -3408:2:1822 -3409:0:2227 -3410:2:1823 -3411:2:1827 -3412:2:1828 -3413:2:1835 -3414:2:1839 -3415:2:1840 -3416:2:1847 -3417:2:1851 -3418:2:1852 -3419:2:1859 -3420:2:1860 -3421:2:1877 -3422:2:1878 -3423:2:1881 -3424:2:1882 -3425:0:2227 -3426:2:1894 -3427:0:2227 -3428:1:76 -3429:1:80 -3430:1:81 -3431:1:96 -3432:1:97 -3433:1:100 -3434:1:104 -3435:1:105 -3436:1:112 -3437:1:113 -3438:1:123 -3439:1:126 -3440:1:127 -3441:1:134 -3442:1:135 -3443:0:2227 -3444:1:147 -3445:0:2227 -3446:2:1895 -3447:2:1899 -3448:2:1900 -3449:2:1907 -3450:2:1911 -3451:2:1912 -3452:2:1919 -3453:2:1923 -3454:2:1924 -3455:2:1931 -3456:2:1932 -3457:2:1949 -3458:2:1950 -3459:2:1953 -3460:2:1954 -3461:0:2227 -3462:2:1821 -3463:0:2227 -3464:2:1822 -3465:0:2227 -3466:2:1823 -3467:2:1827 -3468:2:1828 -3469:2:1835 -3470:2:1839 -3471:2:1840 -3472:2:1847 -3473:2:1851 -3474:2:1852 -3475:2:1859 -3476:2:1860 -3477:2:1877 -3478:2:1878 -3479:2:1881 -3480:2:1882 -3481:0:2227 -3482:2:1894 -3483:0:2227 -3484:1:148 -3485:0:2227 -3486:2:1895 -3487:2:1899 -3488:2:1900 -3489:2:1907 -3490:2:1911 -3491:2:1912 -3492:2:1919 -3493:2:1923 -3494:2:1924 -3495:2:1931 -3496:2:1932 -3497:2:1949 -3498:2:1950 -3499:2:1953 -3500:2:1954 -3501:0:2227 -3502:2:1821 -3503:0:2227 -3504:2:1822 -3505:0:2227 -3506:2:1823 -3507:2:1827 -3508:2:1828 -3509:2:1835 -3510:2:1839 -3511:2:1840 -3512:2:1847 -3513:2:1851 -3514:2:1852 -3515:2:1859 -3516:2:1860 -3517:2:1877 -3518:2:1878 -3519:2:1881 -3520:2:1882 -3521:0:2227 -3522:2:1894 -3523:0:2227 -3524:1:149 -3525:1:153 -3526:1:154 -3527:1:169 -3528:1:170 -3529:1:173 -3530:1:177 -3531:1:178 -3532:1:185 -3533:1:186 -3534:1:196 -3535:1:199 -3536:1:200 -3537:1:207 -3538:1:208 -3539:0:2227 -3540:2:1895 -3541:2:1899 -3542:2:1900 -3543:2:1907 -3544:2:1911 -3545:2:1912 -3546:2:1919 -3547:2:1923 -3548:2:1924 -3549:2:1931 -3550:2:1932 -3551:2:1949 -3552:2:1950 -3553:2:1953 -3554:2:1954 -3555:0:2227 -3556:2:1821 -3557:0:2227 -3558:2:1822 -3559:0:2227 -3560:2:1823 -3561:2:1827 -3562:2:1828 -3563:2:1835 -3564:2:1839 -3565:2:1840 -3566:2:1847 -3567:2:1851 -3568:2:1852 -3569:2:1859 -3570:2:1860 -3571:2:1877 -3572:2:1878 -3573:2:1881 -3574:2:1882 -3575:0:2227 -3576:1:220 -3577:0:2227 -3578:1:373 -3579:0:2227 -3580:1:374 -3581:0:2227 -3582:1:3 -3583:0:2227 -3584:1:4 -3585:1:8 -3586:1:9 -3587:1:16 -3588:1:17 -3589:1:28 -3590:1:32 -3591:1:33 -3592:1:40 -3593:1:41 -3594:1:51 -3595:1:52 -3596:1:62 -3597:1:63 -3598:0:2227 -3599:1:75 -3600:0:2227 -3601:1:76 -3602:1:80 -3603:1:81 -3604:1:88 -3605:1:92 -3606:1:93 -3607:1:100 -3608:1:104 -3609:1:105 -3610:1:112 -3611:1:113 -3612:1:123 -3613:1:124 -3614:1:134 -3615:1:135 -3616:0:2227 -3617:1:223 -3618:0:2227 -3619:1:224 -3620:0:2227 -3621:1:373 -3622:0:2227 -3623:1:374 -3624:0:2227 -3625:1:379 -3626:0:2227 -3627:1:384 -3628:1:388 -3629:1:389 -3630:1:396 -3631:1:397 -3632:1:408 -3633:1:412 -3634:1:413 -3635:1:420 -3636:1:421 -3637:1:431 -3638:1:432 -3639:1:442 -3640:1:443 -3641:0:2227 -3642:1:455 -3643:0:2227 -3644:1:456 -3645:1:460 -3646:1:461 -3647:1:468 -3648:1:472 -3649:1:473 -3650:1:480 -3651:1:484 -3652:1:485 -3653:1:492 -3654:1:493 -3655:1:503 -3656:1:504 -3657:1:514 -3658:1:515 -3659:0:2227 -3660:1:527 -3661:0:2227 -3662:1:528 -3663:1:532 -3664:1:533 -3665:1:540 -3666:1:544 -3667:1:545 -3668:1:552 -3669:1:556 -3670:1:557 -3671:1:564 -3672:1:565 -3673:1:575 -3674:1:576 -3675:1:586 -3676:1:587 -3677:0:2227 -3678:1:599 -3679:0:2227 -3680:1:600 -3681:0:2227 -3682:1:601 -3683:0:2227 -3684:1:746 -3685:0:2227 -3686:1:747 -3687:0:2227 -3688:1:751 -3689:0:2227 -3690:1:752 -3691:1:756 -3692:1:757 -3693:1:764 -3694:1:768 -3695:1:769 -3696:1:776 -3697:1:780 -3698:1:781 -3699:1:788 -3700:1:789 -3701:1:799 -3702:1:800 -3703:1:810 -3704:1:811 -3705:0:2227 -3706:1:823 -3707:0:2227 -3708:1:601 -3709:0:2227 -3710:1:746 -3711:0:2227 -3712:1:747 -3713:0:2227 -3714:1:751 -3715:0:2227 -3716:1:752 -3717:1:756 -3718:1:757 -3719:1:764 -3720:1:765 -3721:1:776 -3722:1:780 -3723:1:781 -3724:1:788 -3725:1:789 -3726:1:799 -3727:1:800 -3728:1:810 -3729:1:811 -3730:0:2227 -3731:1:823 -3732:0:2227 -3733:1:827 -3734:0:2227 -3735:1:832 -3736:1:836 -3737:1:837 -3738:1:844 -3739:1:845 -3740:1:856 -3741:1:860 -3742:1:861 -3743:1:868 -3744:1:869 -3745:1:879 -3746:1:880 -3747:1:890 -3748:1:891 -3749:0:2227 -3750:1:1 -3751:0:2227 -3752:1:2 -3753:0:2227 -3754:1:3 -3755:0:2227 -3756:1:4 -3757:1:8 -3758:1:9 -3759:1:16 -3760:1:20 -3761:1:21 -3762:1:28 -3763:1:32 -3764:1:33 -3765:1:40 -3766:1:41 -3767:1:51 -3768:1:52 -3769:1:62 -3770:1:63 -3771:0:2227 -3772:1:75 -3773:0:2227 -3774:1:76 -3775:1:80 -3776:1:81 -3777:1:88 -3778:1:92 -3779:1:93 -3780:1:100 -3781:1:104 -3782:1:105 -3783:1:112 -3784:1:113 -3785:1:123 -3786:1:124 -3787:1:134 -3788:1:135 -3789:0:2227 -3790:1:147 -3791:0:2227 -3792:1:148 -3793:0:2227 -3794:1:149 -3795:1:153 -3796:1:154 -3797:1:161 -3798:1:165 -3799:1:166 -3800:1:173 -3801:1:177 -3802:1:178 -3803:1:185 -3804:1:186 -3805:1:196 -3806:1:197 -3807:1:207 -3808:1:208 -3809:0:2227 -3810:1:220 -3811:0:2227 -3812:2:1894 -3813:0:2227 -3814:1:373 -3815:0:2227 -3816:2:1895 -3817:2:1899 -3818:2:1900 -3819:2:1907 -3820:2:1911 -3821:2:1912 -3822:2:1919 -3823:2:1923 -3824:2:1924 -3825:2:1931 -3826:2:1932 -3827:2:1949 -3828:2:1950 -3829:2:1953 -3830:2:1954 -3831:0:2227 -3832:2:1821 -3833:0:2227 -3834:1:374 -3835:0:2227 -3836:1:3 -3837:0:2227 -3838:1:4 -3839:1:8 -3840:1:9 -3841:1:16 -3842:1:17 -3843:1:28 -3844:1:32 -3845:1:33 -3846:1:40 -3847:1:41 -3848:1:51 -3849:1:52 -3850:1:62 -3851:1:63 -3852:0:2227 -3853:1:75 -3854:0:2227 -3855:1:76 -3856:1:80 -3857:1:81 -3858:1:88 -3859:1:92 -3860:1:93 -3861:1:100 -3862:1:104 -3863:1:105 -3864:1:112 -3865:1:113 -3866:1:123 -3867:1:124 -3868:1:134 -3869:1:135 -3870:0:2227 -3871:1:223 -3872:0:2227 -3873:1:224 -3874:0:2227 -3875:1:373 -3876:0:2227 -3877:1:374 -3878:0:2227 -3879:1:379 -3880:0:2227 -3881:1:384 -3882:1:388 -3883:1:389 -3884:1:396 -3885:1:397 -3886:1:408 -3887:1:412 -3888:1:413 -3889:1:420 -3890:1:421 -3891:1:431 -3892:1:432 -3893:1:442 -3894:1:443 -3895:0:2227 -3896:1:455 -3897:0:2227 -3898:1:456 -3899:1:460 -3900:1:461 -3901:1:468 -3902:1:472 -3903:1:473 -3904:1:480 -3905:1:484 -3906:1:485 -3907:1:492 -3908:1:493 -3909:1:503 -3910:1:504 -3911:1:514 -3912:1:515 -3913:0:2227 -3914:1:527 -3915:0:2227 -3916:1:528 -3917:1:532 -3918:1:533 -3919:1:540 -3920:1:544 -3921:1:545 -3922:1:552 -3923:1:556 -3924:1:557 -3925:1:564 -3926:1:565 -3927:1:575 -3928:1:576 -3929:1:586 -3930:1:587 -3931:0:2227 -3932:1:599 -3933:0:2227 -3934:1:600 -3935:0:2227 -3936:1:601 -3937:0:2227 -3938:1:746 -3939:0:2227 -3940:1:747 -3941:0:2227 -3942:1:751 -3943:0:2227 -3944:1:752 -3945:1:756 -3946:1:757 -3947:1:764 -3948:1:768 -3949:1:769 -3950:1:776 -3951:1:780 -3952:1:781 -3953:1:788 -3954:1:789 -3955:1:799 -3956:1:800 -3957:1:810 -3958:1:811 -3959:0:2227 -3960:1:823 -3961:0:2227 -3962:1:601 -3963:0:2227 -3964:1:746 -3965:0:2227 -3966:1:747 -3967:0:2227 -3968:1:751 -3969:0:2227 -3970:1:752 -3971:1:756 -3972:1:757 -3973:1:764 -3974:1:765 -3975:1:776 -3976:1:780 -3977:1:781 -3978:1:788 -3979:1:789 -3980:1:799 -3981:1:800 -3982:1:810 -3983:1:811 -3984:0:2227 -3985:1:823 -3986:0:2227 -3987:1:827 -3988:0:2227 -3989:1:832 -3990:1:836 -3991:1:837 -3992:1:844 -3993:1:845 -3994:1:856 -3995:1:860 -3996:1:861 -3997:1:868 -3998:1:869 -3999:1:879 -4000:1:880 -4001:1:890 -4002:1:891 -4003:0:2227 -4004:1:1 -4005:0:2227 -4006:1:2 -4007:0:2227 -4008:1:3 -4009:0:2227 -4010:1:4 -4011:1:8 -4012:1:9 -4013:1:16 -4014:1:20 -4015:1:21 -4016:1:28 -4017:1:32 -4018:1:33 -4019:1:40 -4020:1:41 -4021:1:51 -4022:1:52 -4023:1:62 -4024:1:63 -4025:0:2227 -4026:1:75 -4027:0:2227 -4028:1:76 -4029:1:80 -4030:1:81 -4031:1:88 -4032:1:92 -4033:1:93 -4034:1:100 -4035:1:104 -4036:1:105 -4037:1:112 -4038:1:113 -4039:1:123 -4040:1:124 -4041:1:134 -4042:1:135 -4043:0:2227 -4044:1:147 -4045:0:2227 -4046:1:148 -4047:0:2227 -4048:1:149 -4049:1:153 -4050:1:154 -4051:1:161 -4052:1:165 -4053:1:166 -4054:1:173 -4055:1:177 -4056:1:178 -4057:1:185 -4058:1:186 -4059:1:196 -4060:1:197 -4061:1:207 -4062:1:208 -4063:0:2227 -4064:1:220 -4065:0:2227 -4066:1:373 -4067:0:2227 -4068:1:374 -4069:0:2227 -4070:2:1822 -4071:0:2227 -4072:1:3 -4073:0:2227 -4074:1:4 -4075:1:8 -4076:1:9 -4077:1:16 -4078:1:17 -4079:1:28 -4080:1:32 -4081:1:33 -4082:1:40 -4083:1:41 -4084:1:51 -4085:1:52 -4086:1:62 -4087:1:63 -4088:0:2227 -4089:1:75 -4090:0:2227 -4091:1:76 -4092:1:80 -4093:1:81 -4094:1:88 -4095:1:92 -4096:1:93 -4097:1:100 -4098:1:104 -4099:1:105 -4100:1:112 -4101:1:113 -4102:1:123 -4103:1:124 -4104:1:134 -4105:1:135 -4106:0:2227 -4107:1:223 -4108:0:2227 -4109:1:224 -4110:0:2227 -4111:1:373 -4112:0:2227 -4113:1:374 -4114:0:2227 -4115:1:379 -4116:0:2227 -4117:1:384 -4118:1:388 -4119:1:389 -4120:1:396 -4121:1:397 -4122:1:408 -4123:1:412 -4124:1:413 -4125:1:420 -4126:1:421 -4127:1:431 -4128:1:432 -4129:1:442 -4130:1:443 -4131:0:2227 -4132:1:455 -4133:0:2227 -4134:1:456 -4135:1:460 -4136:1:461 -4137:1:468 -4138:1:472 -4139:1:473 -4140:1:480 -4141:1:484 -4142:1:485 -4143:1:492 -4144:1:493 -4145:1:503 -4146:1:504 -4147:1:514 -4148:1:515 -4149:0:2227 -4150:1:527 -4151:0:2227 -4152:1:528 -4153:1:532 -4154:1:533 -4155:1:540 -4156:1:544 -4157:1:545 -4158:1:552 -4159:1:556 -4160:1:557 -4161:1:564 -4162:1:565 -4163:1:575 -4164:1:576 -4165:1:586 -4166:1:587 -4167:0:2227 -4168:1:599 -4169:0:2227 -4170:1:600 -4171:0:2227 -4172:1:601 -4173:0:2227 -4174:1:746 -4175:0:2227 -4176:1:747 -4177:0:2227 -4178:1:751 -4179:0:2227 -4180:1:752 -4181:1:756 -4182:1:757 -4183:1:764 -4184:1:768 -4185:1:769 -4186:1:776 -4187:1:780 -4188:1:781 -4189:1:788 -4190:1:789 -4191:1:799 -4192:1:800 -4193:1:810 -4194:1:811 -4195:0:2227 -4196:1:823 -4197:0:2227 -4198:1:601 -4199:0:2227 -4200:1:746 -4201:0:2227 -4202:1:747 -4203:0:2227 -4204:1:751 -4205:0:2227 -4206:1:752 -4207:1:756 -4208:1:757 -4209:1:764 -4210:1:765 -4211:1:776 -4212:1:780 -4213:1:781 -4214:1:788 -4215:1:789 -4216:1:799 -4217:1:800 -4218:1:810 -4219:1:811 -4220:0:2227 -4221:1:823 -4222:0:2227 -4223:1:827 -4224:0:2227 -4225:1:832 -4226:1:836 -4227:1:837 -4228:1:852 -4229:1:853 -4230:1:856 -4231:1:860 -4232:1:861 -4233:1:868 -4234:1:869 -4235:1:879 -4236:1:882 -4237:1:883 -4238:1:890 -4239:1:891 -4240:0:2227 -4241:1:1 -4242:0:2227 -4243:1:2 -4244:0:2227 -4245:1:3 -4246:0:2227 -4247:2:1823 -4248:2:1827 -4249:2:1828 -4250:2:1835 -4251:2:1839 -4252:2:1840 -4253:2:1847 -4254:2:1851 -4255:2:1852 -4256:2:1859 -4257:2:1860 -4258:2:1877 -4259:2:1878 -4260:2:1881 -4261:2:1882 -4262:0:2227 -4263:2:1894 -4264:0:2227 -4265:2:1895 -4266:2:1899 -4267:2:1900 -4268:2:1907 -4269:2:1911 -4270:2:1912 -4271:2:1919 -4272:2:1923 -4273:2:1924 -4274:2:1931 -4275:2:1932 -4276:2:1949 -4277:2:1950 -4278:2:1953 -4279:2:1954 -4280:0:2227 -4281:2:1821 -4282:0:2227 -4283:2:1822 -4284:0:2227 -4285:1:4 -4286:1:8 -4287:1:9 -4288:1:16 -4289:1:17 -4290:1:28 -4291:1:32 -4292:1:33 -4293:1:40 -4294:1:41 -4295:1:51 -4296:1:52 -4297:1:62 -4298:1:63 -4299:0:2227 -4300:2:1823 -4301:2:1827 -4302:2:1828 -4303:2:1835 -4304:2:1839 -4305:2:1840 -4306:2:1847 -4307:2:1851 -4308:2:1852 -4309:2:1859 -4310:2:1860 -4311:2:1877 -4312:2:1878 -4313:2:1881 -4314:2:1882 -4315:0:2227 -4316:2:1894 -4317:0:2227 -4318:2:1895 -4319:2:1899 -4320:2:1900 -4321:2:1907 -4322:2:1911 -4323:2:1912 -4324:2:1919 -4325:2:1923 -4326:2:1924 -4327:2:1931 -4328:2:1932 -4329:2:1949 -4330:2:1950 -4331:2:1953 -4332:2:1954 -4333:0:2227 -4334:2:1821 -4335:0:2227 -4336:2:1822 -4337:0:2227 -4338:1:75 -4339:0:2227 -4340:2:1823 -4341:2:1827 -4342:2:1828 -4343:2:1835 -4344:2:1839 -4345:2:1840 -4346:2:1847 -4347:2:1851 -4348:2:1852 -4349:2:1859 -4350:2:1860 -4351:2:1877 -4352:2:1878 -4353:2:1881 -4354:2:1882 -4355:0:2227 -4356:2:1894 -4357:0:2227 -4358:2:1895 -4359:2:1899 -4360:2:1900 -4361:2:1907 -4362:2:1911 -4363:2:1912 -4364:2:1919 -4365:2:1923 -4366:2:1924 -4367:2:1931 -4368:2:1932 -4369:2:1949 -4370:2:1950 -4371:2:1953 -4372:2:1954 -4373:0:2227 -4374:2:1821 -4375:0:2227 -4376:2:1822 -4377:0:2227 -4378:1:76 -4379:1:80 -4380:1:81 -4381:1:88 -4382:1:92 -4383:1:93 -4384:1:100 -4385:1:104 -4386:1:105 -4387:1:112 -4388:1:113 -4389:1:123 -4390:1:124 -4391:1:134 -4392:1:135 -4393:0:2227 -4394:1:147 -4395:0:2227 -4396:2:1823 -4397:2:1827 -4398:2:1828 -4399:2:1835 -4400:2:1839 -4401:2:1840 -4402:2:1847 -4403:2:1851 -4404:2:1852 -4405:2:1859 -4406:2:1860 -4407:2:1877 -4408:2:1878 -4409:2:1881 -4410:2:1882 -4411:0:2227 -4412:2:1894 -4413:0:2227 -4414:2:1895 -4415:2:1899 -4416:2:1900 -4417:2:1907 -4418:2:1911 -4419:2:1912 -4420:2:1919 -4421:2:1923 -4422:2:1924 -4423:2:1931 -4424:2:1932 -4425:2:1949 -4426:2:1950 -4427:2:1953 -4428:2:1954 -4429:0:2227 -4430:2:1821 -4431:0:2227 -4432:2:1822 -4433:0:2227 -4434:1:148 -4435:0:2227 -4436:2:1823 -4437:2:1827 -4438:2:1828 -4439:2:1835 -4440:2:1839 -4441:2:1840 -4442:2:1847 -4443:2:1851 -4444:2:1852 -4445:2:1859 -4446:2:1860 -4447:2:1877 -4448:2:1878 -4449:2:1881 -4450:2:1882 -4451:0:2227 -4452:2:1894 -4453:0:2227 -4454:2:1895 -4455:2:1899 -4456:2:1900 -4457:2:1907 -4458:2:1911 -4459:2:1912 -4460:2:1919 -4461:2:1923 -4462:2:1924 -4463:2:1931 -4464:2:1932 -4465:2:1949 -4466:2:1950 -4467:2:1953 -4468:2:1954 -4469:0:2227 -4470:2:1821 -4471:0:2227 -4472:2:1822 -4473:0:2227 -4474:1:149 -4475:1:153 -4476:1:154 -4477:1:161 -4478:1:165 -4479:1:166 -4480:1:173 -4481:1:177 -4482:1:178 -4483:1:185 -4484:1:186 -4485:1:196 -4486:1:197 -4487:1:207 -4488:1:208 -4489:0:2227 -4490:2:1823 -4491:2:1827 -4492:2:1828 -4493:2:1835 -4494:2:1839 -4495:2:1840 -4496:2:1847 -4497:2:1851 -4498:2:1852 -4499:2:1859 -4500:2:1860 -4501:2:1877 -4502:2:1878 -4503:2:1881 -4504:2:1882 -4505:0:2227 -4506:2:1894 -4507:0:2227 -4508:2:1895 -4509:2:1899 -4510:2:1900 -4511:2:1907 -4512:2:1911 -4513:2:1912 -4514:2:1919 -4515:2:1923 -4516:2:1924 -4517:2:1931 -4518:2:1932 -4519:2:1949 -4520:2:1950 -4521:2:1953 -4522:2:1954 -4523:0:2227 -4524:2:1821 -4525:0:2227 -4526:2:1822 -4527:0:2227 -4528:1:220 -4529:0:2227 -4530:1:373 -4531:0:2227 -4532:1:374 -4533:0:2227 -4534:1:3 -4535:0:2227 -4536:2:1823 -4537:2:1827 -4538:2:1828 -4539:2:1835 -4540:2:1839 -4541:2:1840 -4542:2:1847 -4543:2:1851 -4544:2:1852 -4545:2:1859 -4546:2:1860 -4547:2:1877 -4548:2:1878 -4549:2:1881 -4550:2:1882 -4551:0:2227 -4552:2:1894 -4553:0:2227 -4554:2:1895 -4555:2:1899 -4556:2:1900 -4557:2:1907 -4558:2:1911 -4559:2:1912 -4560:2:1919 -4561:2:1923 -4562:2:1924 -4563:2:1931 -4564:2:1932 -4565:2:1949 -4566:2:1950 -4567:2:1953 -4568:2:1954 -4569:0:2227 -4570:2:1821 -4571:0:2227 -4572:2:1822 -4573:0:2227 -4574:1:4 -4575:1:8 -4576:1:9 -4577:1:16 -4578:1:17 -4579:1:28 -4580:1:32 -4581:1:33 -4582:1:40 -4583:1:41 -4584:1:51 -4585:1:52 -4586:1:62 -4587:1:63 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu.sh b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu.spin b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu.spin deleted file mode 100644 index 2cfcb70..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu.spin +++ /dev/null @@ -1,705 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free.log b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free.log deleted file mode 100644 index 9a22c47..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free.log +++ /dev/null @@ -1,345 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 741) - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 10669, errors: 0 - 20146 states, stored - 191615 states, matched - 211761 transitions (= stored+matched) - 712676 atomic steps -hash conflicts: 1523 (resolved) - -Stats on memory usage (in Megabytes): - 1.614 equivalent memory usage for states (stored*(State-vector + overhead)) - 1.661 actual memory usage for states (unsuccessful compression: 102.92%) - state-vector as stored = 58 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 467.326 total actual memory usage - -unreached in proctype urcu_reader_sig - line 401, "pan.___", state 330, "(1)" - line 612, "pan.___", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 397, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 406, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, "pan.___", state 59, "(1)" - line 416, "pan.___", state 89, "(1)" - line 397, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 407, "pan.___", state 160, "(1)" - line 650, "pan.___", state 213, "(1)" - line 173, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 177, "pan.___", state 233, "(1)" - line 158, "pan.___", state 254, "(1)" - line 162, "pan.___", state 262, "(1)" - line 166, "pan.___", state 274, "(1)" - line 173, "pan.___", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, "pan.___", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, "pan.___", state 752, "(1)" - line 162, "pan.___", state 760, "(1)" - line 162, "pan.___", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, "pan.___", state 761, "else" - line 160, "pan.___", state 766, "((j<1))" - line 160, "pan.___", state 766, "((j>=1))" - line 166, "pan.___", state 772, "(1)" - line 166, "pan.___", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, "pan.___", state 773, "else" - line 168, "pan.___", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, "pan.___", state 776, "else" - line 173, "pan.___", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, "pan.___", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 166, "pan.___", state 835, "(1)" - line 166, "pan.___", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 173, "pan.___", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, "pan.___", state 852, "(1)" - line 177, "pan.___", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, "pan.___", state 861, "(1)" - line 177, "pan.___", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, "pan.___", state 862, "else" - line 175, "pan.___", state 867, "((j<1))" - line 175, "pan.___", state 867, "((j>=1))" - line 181, "pan.___", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, "pan.___", state 882, "(1)" - line 162, "pan.___", state 890, "(1)" - line 162, "pan.___", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, "pan.___", state 891, "else" - line 160, "pan.___", state 896, "((j<1))" - line 160, "pan.___", state 896, "((j>=1))" - line 166, "pan.___", state 902, "(1)" - line 166, "pan.___", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, "pan.___", state 903, "else" - line 168, "pan.___", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, "pan.___", state 906, "else" - line 200, "pan.___", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 200, "pan.___", state 908, "else" - line 219, "pan.___", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 219, "pan.___", state 909, "else" - line 354, "pan.___", state 915, "((sighand_exec==1))" - line 354, "pan.___", state 915, "else" - line 360, "pan.___", state 918, "sighand_exec = 1" - line 397, "pan.___", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 397, "pan.___", state 933, "(1)" - line 397, "pan.___", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 397, "pan.___", state 934, "else" - line 397, "pan.___", state 937, "(1)" - line 401, "pan.___", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 401, "pan.___", state 947, "(1)" - line 401, "pan.___", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 401, "pan.___", state 948, "else" - line 401, "pan.___", state 951, "(1)" - line 401, "pan.___", state 952, "(1)" - line 401, "pan.___", state 952, "(1)" - line 399, "pan.___", state 957, "((i<1))" - line 399, "pan.___", state 957, "((i>=1))" - line 406, "pan.___", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, "pan.___", state 976, "(1)" - line 407, "pan.___", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 407, "pan.___", state 977, "else" - line 407, "pan.___", state 980, "(1)" - line 407, "pan.___", state 981, "(1)" - line 407, "pan.___", state 981, "(1)" - line 411, "pan.___", state 989, "(1)" - line 411, "pan.___", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 411, "pan.___", state 990, "else" - line 411, "pan.___", state 993, "(1)" - line 411, "pan.___", state 994, "(1)" - line 411, "pan.___", state 994, "(1)" - line 409, "pan.___", state 999, "((i<1))" - line 409, "pan.___", state 999, "((i>=1))" - line 416, "pan.___", state 1006, "(1)" - line 416, "pan.___", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 416, "pan.___", state 1007, "else" - line 416, "pan.___", state 1010, "(1)" - line 416, "pan.___", state 1011, "(1)" - line 416, "pan.___", state 1011, "(1)" - line 418, "pan.___", state 1014, "(1)" - line 418, "pan.___", state 1014, "(1)" - line 360, "pan.___", state 1023, "sighand_exec = 1" - line 401, "pan.___", state 1054, "(1)" - line 406, "pan.___", state 1070, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, "pan.___", state 1113, "(1)" - line 401, "pan.___", state 1151, "(1)" - line 406, "pan.___", state 1167, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, "pan.___", state 1210, "(1)" - line 397, "pan.___", state 1236, "(1)" - line 401, "pan.___", state 1250, "(1)" - line 406, "pan.___", state 1266, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, "pan.___", state 1309, "(1)" - line 401, "pan.___", state 1350, "(1)" - line 406, "pan.___", state 1366, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, "pan.___", state 1409, "(1)" - line 173, "pan.___", state 1430, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, "pan.___", state 1432, "(1)" - line 177, "pan.___", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, "pan.___", state 1441, "(1)" - line 177, "pan.___", state 1442, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, "pan.___", state 1442, "else" - line 175, "pan.___", state 1447, "((j<1))" - line 175, "pan.___", state 1447, "((j>=1))" - line 181, "pan.___", state 1452, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, "pan.___", state 1462, "(1)" - line 162, "pan.___", state 1470, "(1)" - line 162, "pan.___", state 1471, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, "pan.___", state 1471, "else" - line 160, "pan.___", state 1476, "((j<1))" - line 160, "pan.___", state 1476, "((j>=1))" - line 166, "pan.___", state 1482, "(1)" - line 166, "pan.___", state 1483, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, "pan.___", state 1483, "else" - line 168, "pan.___", state 1486, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, "pan.___", state 1486, "else" - line 173, "pan.___", state 1493, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, "pan.___", state 1515, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 166, "pan.___", state 1545, "(1)" - line 166, "pan.___", state 1546, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 173, "pan.___", state 1560, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, "pan.___", state 1562, "(1)" - line 177, "pan.___", state 1569, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, "pan.___", state 1571, "(1)" - line 177, "pan.___", state 1572, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, "pan.___", state 1572, "else" - line 175, "pan.___", state 1577, "((j<1))" - line 175, "pan.___", state 1577, "((j>=1))" - line 181, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, "pan.___", state 1592, "(1)" - line 162, "pan.___", state 1600, "(1)" - line 162, "pan.___", state 1601, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, "pan.___", state 1601, "else" - line 160, "pan.___", state 1606, "((j<1))" - line 160, "pan.___", state 1606, "((j>=1))" - line 166, "pan.___", state 1612, "(1)" - line 166, "pan.___", state 1613, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, "pan.___", state 1613, "else" - line 168, "pan.___", state 1616, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, "pan.___", state 1616, "else" - line 200, "pan.___", state 1618, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 200, "pan.___", state 1618, "else" - line 219, "pan.___", state 1619, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 219, "pan.___", state 1619, "else" - line 354, "pan.___", state 1625, "((sighand_exec==1))" - line 354, "pan.___", state 1625, "else" - line 360, "pan.___", state 1628, "sighand_exec = 1" - line 397, "pan.___", state 1641, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 397, "pan.___", state 1643, "(1)" - line 397, "pan.___", state 1644, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 397, "pan.___", state 1644, "else" - line 397, "pan.___", state 1647, "(1)" - line 401, "pan.___", state 1655, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 401, "pan.___", state 1657, "(1)" - line 401, "pan.___", state 1658, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 401, "pan.___", state 1658, "else" - line 401, "pan.___", state 1661, "(1)" - line 401, "pan.___", state 1662, "(1)" - line 401, "pan.___", state 1662, "(1)" - line 399, "pan.___", state 1667, "((i<1))" - line 399, "pan.___", state 1667, "((i>=1))" - line 406, "pan.___", state 1673, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, "pan.___", state 1686, "(1)" - line 407, "pan.___", state 1687, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 407, "pan.___", state 1687, "else" - line 407, "pan.___", state 1690, "(1)" - line 407, "pan.___", state 1691, "(1)" - line 407, "pan.___", state 1691, "(1)" - line 411, "pan.___", state 1699, "(1)" - line 411, "pan.___", state 1700, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 411, "pan.___", state 1700, "else" - line 411, "pan.___", state 1703, "(1)" - line 411, "pan.___", state 1704, "(1)" - line 411, "pan.___", state 1704, "(1)" - line 409, "pan.___", state 1709, "((i<1))" - line 409, "pan.___", state 1709, "((i>=1))" - line 416, "pan.___", state 1716, "(1)" - line 416, "pan.___", state 1717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 416, "pan.___", state 1717, "else" - line 416, "pan.___", state 1720, "(1)" - line 416, "pan.___", state 1721, "(1)" - line 416, "pan.___", state 1721, "(1)" - line 418, "pan.___", state 1724, "(1)" - line 418, "pan.___", state 1724, "(1)" - line 360, "pan.___", state 1733, "sighand_exec = 1" - line 177, "pan.___", state 1758, "(1)" - line 181, "pan.___", state 1769, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, "pan.___", state 1779, "(1)" - line 162, "pan.___", state 1787, "(1)" - line 166, "pan.___", state 1799, "(1)" - line 173, "pan.___", state 1810, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< !read_free_race) diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free.spin.input b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free.spin.input deleted file mode 100644 index 953115f..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free.spin.input +++ /dev/null @@ -1,721 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free.spin.input.trail deleted file mode 100644 index 837f3d9..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free.spin.input.trail +++ /dev/null @@ -1,15043 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4365 -2:4:4317 -3:4:4320 -4:4:4320 -5:4:4320 -6:4:4323 -7:4:4331 -8:4:4331 -9:4:4331 -10:4:4334 -11:4:4340 -12:4:4344 -13:4:4344 -14:4:4344 -15:4:4347 -16:4:4340 -17:4:4344 -18:4:4344 -19:4:4344 -20:4:4347 -21:4:4355 -22:4:4359 -23:4:4360 -24:0:4365 -25:4:4362 -26:0:4365 -27:3:2331 -28:0:4365 -29:3:2337 -30:0:4365 -31:3:2338 -32:0:4365 -33:3:2339 -34:3:2343 -35:3:2344 -36:3:2352 -37:3:2353 -38:3:2357 -39:3:2358 -40:3:2352 -41:3:2353 -42:3:2357 -43:3:2358 -44:3:2366 -45:3:2371 -46:3:2375 -47:3:2376 -48:3:2383 -49:3:2384 -50:3:2395 -51:3:2396 -52:3:2397 -53:3:2395 -54:3:2396 -55:3:2397 -56:3:2408 -57:3:2413 -58:3:2414 -59:0:4365 -60:3:2426 -61:0:4365 -62:3:2427 -63:0:4365 -64:2:1162 -65:0:4365 -66:3:2428 -67:0:4365 -68:2:1168 -69:0:4365 -70:2:1169 -71:0:4365 -72:3:2427 -73:0:4365 -74:2:1170 -75:0:4365 -76:3:2428 -77:0:4365 -78:3:2429 -79:0:4365 -80:3:2435 -81:3:2436 -82:0:4365 -83:3:2440 -84:3:2444 -85:3:2445 -86:3:2453 -87:3:2454 -88:3:2458 -89:3:2459 -90:3:2453 -91:3:2454 -92:3:2458 -93:3:2459 -94:3:2467 -95:3:2472 -96:3:2473 -97:3:2484 -98:3:2485 -99:3:2496 -100:3:2497 -101:3:2498 -102:3:2496 -103:3:2497 -104:3:2498 -105:3:2509 -106:3:2514 -107:3:2515 -108:0:4365 -109:3:2527 -110:0:4365 -111:3:2528 -112:0:4365 -113:2:1173 -114:0:4365 -115:3:2529 -116:0:4365 -117:2:1179 -118:0:4365 -119:2:1180 -120:0:4365 -121:3:2528 -122:0:4365 -123:2:1181 -124:2:1185 -125:2:1186 -126:2:1194 -127:2:1195 -128:2:1199 -129:2:1200 -130:2:1194 -131:2:1195 -132:2:1199 -133:2:1200 -134:2:1208 -135:2:1213 -136:2:1217 -137:2:1218 -138:2:1225 -139:2:1226 -140:2:1237 -141:2:1238 -142:2:1239 -143:2:1237 -144:2:1238 -145:2:1239 -146:2:1250 -147:2:1255 -148:2:1256 -149:0:4365 -150:3:2529 -151:0:4365 -152:2:1268 -153:0:4365 -154:3:2528 -155:0:4365 -156:2:1270 -157:0:4365 -158:3:2529 -159:0:4365 -160:2:1271 -161:2:1275 -162:2:1276 -163:2:1284 -164:2:1285 -165:2:1289 -166:2:1290 -167:2:1284 -168:2:1285 -169:2:1289 -170:2:1290 -171:2:1298 -172:2:1303 -173:2:1307 -174:2:1308 -175:2:1315 -176:2:1316 -177:2:1327 -178:2:1328 -179:2:1329 -180:2:1327 -181:2:1328 -182:2:1329 -183:2:1340 -184:2:1345 -185:2:1346 -186:0:4365 -187:2:1358 -188:0:4365 -189:2:1360 -190:0:4365 -191:3:2528 -192:0:4365 -193:2:1361 -194:0:4365 -195:3:2529 -196:0:4365 -197:2:1362 -198:2:1366 -199:2:1367 -200:2:1375 -201:2:1376 -202:2:1380 -203:2:1381 -204:2:1375 -205:2:1376 -206:2:1380 -207:2:1381 -208:2:1389 -209:2:1394 -210:2:1398 -211:2:1399 -212:2:1406 -213:2:1407 -214:2:1418 -215:2:1419 -216:2:1420 -217:2:1418 -218:2:1419 -219:2:1420 -220:2:1431 -221:2:1436 -222:2:1437 -223:0:4365 -224:2:1449 -225:0:4365 -226:3:2528 -227:0:4365 -228:2:1451 -229:0:4365 -230:3:2529 -231:0:4365 -232:2:1652 -233:0:4365 -234:2:1653 -235:0:4365 -236:2:1657 -237:0:4365 -238:2:1180 -239:0:4365 -240:3:2528 -241:0:4365 -242:2:1181 -243:2:1185 -244:2:1186 -245:2:1194 -246:2:1195 -247:2:1199 -248:2:1200 -249:2:1194 -250:2:1195 -251:2:1196 -252:2:1208 -253:2:1213 -254:2:1217 -255:2:1218 -256:2:1225 -257:2:1226 -258:2:1237 -259:2:1238 -260:2:1239 -261:2:1237 -262:2:1238 -263:2:1239 -264:2:1250 -265:2:1255 -266:2:1256 -267:0:4365 -268:3:2529 -269:0:4365 -270:2:1268 -271:0:4365 -272:3:2528 -273:0:4365 -274:2:1270 -275:0:4365 -276:3:2529 -277:0:4365 -278:2:1271 -279:2:1275 -280:2:1276 -281:2:1284 -282:2:1285 -283:2:1289 -284:2:1290 -285:2:1284 -286:2:1285 -287:2:1289 -288:2:1290 -289:2:1298 -290:2:1303 -291:2:1307 -292:2:1308 -293:2:1315 -294:2:1316 -295:2:1327 -296:2:1328 -297:2:1329 -298:2:1327 -299:2:1328 -300:2:1329 -301:2:1340 -302:2:1345 -303:2:1346 -304:0:4365 -305:2:1358 -306:0:4365 -307:2:1454 -308:0:4365 -309:3:2528 -310:0:4365 -311:2:1455 -312:0:4365 -313:3:2529 -314:0:4365 -315:2:1652 -316:0:4365 -317:2:1653 -318:0:4365 -319:2:1657 -320:0:4365 -321:2:1660 -322:0:4365 -323:3:2528 -324:0:4365 -325:2:1665 -326:2:1669 -327:2:1670 -328:2:1678 -329:2:1679 -330:2:1683 -331:2:1684 -332:2:1678 -333:2:1679 -334:2:1680 -335:2:1692 -336:2:1697 -337:2:1701 -338:2:1702 -339:2:1709 -340:2:1710 -341:2:1721 -342:2:1722 -343:2:1723 -344:2:1721 -345:2:1722 -346:2:1723 -347:2:1734 -348:2:1739 -349:2:1740 -350:0:4365 -351:3:2529 -352:0:4365 -353:2:1752 -354:0:4365 -355:3:2528 -356:0:4365 -357:2:1754 -358:0:4365 -359:3:2529 -360:0:4365 -361:2:1755 -362:2:1759 -363:2:1760 -364:2:1768 -365:2:1769 -366:2:1773 -367:2:1774 -368:2:1768 -369:2:1769 -370:2:1773 -371:2:1774 -372:2:1782 -373:2:1787 -374:2:1791 -375:2:1792 -376:2:1799 -377:2:1800 -378:2:1811 -379:2:1812 -380:2:1813 -381:2:1811 -382:2:1812 -383:2:1813 -384:2:1824 -385:2:1829 -386:2:1830 -387:0:4365 -388:2:1842 -389:0:4365 -390:3:2528 -391:0:4365 -392:2:1844 -393:0:4365 -394:3:2529 -395:0:4365 -396:2:1845 -397:2:1849 -398:2:1850 -399:2:1858 -400:2:1859 -401:2:1863 -402:2:1864 -403:2:1858 -404:2:1859 -405:2:1863 -406:2:1864 -407:2:1872 -408:2:1877 -409:2:1881 -410:2:1882 -411:2:1889 -412:2:1890 -413:2:1901 -414:2:1902 -415:2:1903 -416:2:1901 -417:2:1902 -418:2:1903 -419:2:1914 -420:2:1919 -421:2:1920 -422:0:4365 -423:2:1932 -424:0:4365 -425:3:2528 -426:0:4365 -427:2:1934 -428:0:4365 -429:3:2529 -430:0:4365 -431:2:1935 -432:0:4365 -433:2:1936 -434:0:4365 -435:2:2129 -436:0:4365 -437:2:2130 -438:0:4365 -439:2:2134 -440:0:4365 -441:3:2528 -442:0:4365 -443:2:2136 -444:0:4365 -445:3:2529 -446:0:4365 -447:2:2137 -448:2:2141 -449:2:2142 -450:2:2150 -451:2:2151 -452:2:2155 -453:2:2156 -454:2:2150 -455:2:2151 -456:2:2155 -457:2:2156 -458:2:2164 -459:2:2169 -460:2:2173 -461:2:2174 -462:2:2181 -463:2:2182 -464:2:2193 -465:2:2194 -466:2:2195 -467:2:2193 -468:2:2194 -469:2:2195 -470:2:2206 -471:2:2211 -472:2:2212 -473:0:4365 -474:2:2224 -475:0:4365 -476:3:2528 -477:0:4365 -478:2:2226 -479:0:4365 -480:3:2529 -481:0:4365 -482:2:1936 -483:0:4365 -484:2:2129 -485:0:4365 -486:2:2130 -487:0:4365 -488:2:2134 -489:0:4365 -490:3:2528 -491:0:4365 -492:2:2136 -493:0:4365 -494:3:2529 -495:0:4365 -496:2:2137 -497:2:2141 -498:2:2142 -499:2:2150 -500:2:2151 -501:2:2155 -502:2:2156 -503:2:2150 -504:2:2151 -505:2:2152 -506:2:2164 -507:2:2169 -508:2:2173 -509:2:2174 -510:2:2181 -511:2:2182 -512:2:2193 -513:2:2194 -514:2:2195 -515:2:2193 -516:2:2194 -517:2:2195 -518:2:2206 -519:2:2211 -520:2:2212 -521:0:4365 -522:2:2224 -523:0:4365 -524:3:2528 -525:0:4365 -526:2:2226 -527:0:4365 -528:3:2529 -529:0:4365 -530:2:2230 -531:0:4365 -532:3:2528 -533:0:4365 -534:2:2235 -535:2:2239 -536:2:2240 -537:2:2248 -538:2:2249 -539:2:2253 -540:2:2254 -541:2:2248 -542:2:2249 -543:2:2250 -544:2:2262 -545:2:2267 -546:2:2271 -547:2:2272 -548:2:2279 -549:2:2280 -550:2:2291 -551:2:2292 -552:2:2293 -553:2:2291 -554:2:2292 -555:2:2293 -556:2:2304 -557:2:2309 -558:2:2310 -559:0:4365 -560:3:2529 -561:0:4365 -562:2:2322 -563:0:4365 -564:2:1169 -565:0:4365 -566:3:2528 -567:0:4365 -568:2:1170 -569:0:4365 -570:3:2529 -571:0:4365 -572:3:2530 -573:0:4365 -574:3:2536 -575:0:4365 -576:3:2537 -577:0:4365 -578:3:2547 -579:0:4365 -580:3:2548 -581:0:4365 -582:3:2552 -583:3:2553 -584:3:2557 -585:3:2561 -586:3:2562 -587:3:2557 -588:3:2561 -589:3:2562 -590:3:2566 -591:3:2574 -592:3:2575 -593:3:2580 -594:3:2587 -595:3:2588 -596:3:2587 -597:3:2588 -598:3:2595 -599:3:2600 -600:0:4365 -601:3:2611 -602:0:4365 -603:3:2615 -604:3:2616 -605:3:2620 -606:3:2624 -607:3:2625 -608:3:2620 -609:3:2624 -610:3:2625 -611:3:2629 -612:3:2637 -613:3:2638 -614:3:2643 -615:3:2650 -616:3:2651 -617:3:2650 -618:3:2651 -619:3:2658 -620:3:2663 -621:0:4365 -622:3:2611 -623:0:4365 -624:3:2615 -625:3:2616 -626:3:2620 -627:3:2624 -628:3:2625 -629:3:2620 -630:3:2624 -631:3:2625 -632:3:2629 -633:3:2637 -634:3:2638 -635:3:2643 -636:3:2650 -637:3:2651 -638:3:2650 -639:3:2651 -640:3:2658 -641:3:2663 -642:0:4365 -643:3:2674 -644:0:4365 -645:3:2682 -646:3:2683 -647:3:2687 -648:3:2691 -649:3:2692 -650:3:2687 -651:3:2691 -652:3:2692 -653:3:2696 -654:3:2704 -655:3:2705 -656:3:2710 -657:3:2717 -658:3:2718 -659:3:2717 -660:3:2718 -661:3:2725 -662:3:2730 -663:0:4365 -664:3:2745 -665:0:4365 -666:3:2746 -667:0:4365 -668:2:1173 -669:0:4365 -670:3:2747 -671:0:4365 -672:2:1179 -673:0:4365 -674:2:1180 -675:0:4365 -676:3:2746 -677:0:4365 -678:2:1181 -679:2:1185 -680:2:1186 -681:2:1194 -682:2:1195 -683:2:1199 -684:2:1200 -685:2:1194 -686:2:1195 -687:2:1199 -688:2:1200 -689:2:1208 -690:2:1213 -691:2:1217 -692:2:1218 -693:2:1225 -694:2:1226 -695:2:1237 -696:2:1238 -697:2:1239 -698:2:1237 -699:2:1238 -700:2:1239 -701:2:1250 -702:2:1255 -703:2:1256 -704:0:4365 -705:3:2747 -706:0:4365 -707:2:1268 -708:0:4365 -709:3:2746 -710:0:4365 -711:2:1270 -712:0:4365 -713:3:2747 -714:0:4365 -715:2:1271 -716:2:1275 -717:2:1276 -718:2:1284 -719:2:1285 -720:2:1289 -721:2:1290 -722:2:1284 -723:2:1285 -724:2:1289 -725:2:1290 -726:2:1298 -727:2:1303 -728:2:1307 -729:2:1308 -730:2:1315 -731:2:1316 -732:2:1327 -733:2:1328 -734:2:1329 -735:2:1327 -736:2:1328 -737:2:1329 -738:2:1340 -739:2:1345 -740:2:1346 -741:0:4365 -742:2:1358 -743:0:4365 -744:2:1360 -745:0:4365 -746:3:2746 -747:0:4365 -748:2:1361 -749:0:4365 -750:3:2747 -751:0:4365 -752:2:1362 -753:2:1366 -754:2:1367 -755:2:1375 -756:2:1376 -757:2:1380 -758:2:1381 -759:2:1375 -760:2:1376 -761:2:1380 -762:2:1381 -763:2:1389 -764:2:1394 -765:2:1398 -766:2:1399 -767:2:1406 -768:2:1407 -769:2:1418 -770:2:1419 -771:2:1420 -772:2:1418 -773:2:1419 -774:2:1420 -775:2:1431 -776:2:1436 -777:2:1437 -778:0:4365 -779:2:1449 -780:0:4365 -781:3:2746 -782:0:4365 -783:2:1451 -784:0:4365 -785:3:2747 -786:0:4365 -787:2:1652 -788:0:4365 -789:2:1653 -790:0:4365 -791:2:1657 -792:0:4365 -793:2:1180 -794:0:4365 -795:3:2746 -796:0:4365 -797:2:1181 -798:2:1185 -799:2:1186 -800:2:1194 -801:2:1195 -802:2:1199 -803:2:1200 -804:2:1194 -805:2:1195 -806:2:1196 -807:2:1208 -808:2:1213 -809:2:1217 -810:2:1218 -811:2:1225 -812:2:1226 -813:2:1237 -814:2:1238 -815:2:1239 -816:2:1237 -817:2:1238 -818:2:1239 -819:2:1250 -820:2:1255 -821:2:1256 -822:0:4365 -823:3:2747 -824:0:4365 -825:2:1268 -826:0:4365 -827:3:2746 -828:0:4365 -829:2:1270 -830:0:4365 -831:3:2747 -832:0:4365 -833:2:1271 -834:2:1275 -835:2:1276 -836:2:1284 -837:2:1285 -838:2:1289 -839:2:1290 -840:2:1284 -841:2:1285 -842:2:1289 -843:2:1290 -844:2:1298 -845:2:1303 -846:2:1307 -847:2:1308 -848:2:1315 -849:2:1316 -850:2:1327 -851:2:1328 -852:2:1329 -853:2:1327 -854:2:1328 -855:2:1329 -856:2:1340 -857:2:1345 -858:2:1346 -859:0:4365 -860:2:1358 -861:0:4365 -862:2:1454 -863:0:4365 -864:3:2746 -865:0:4365 -866:2:1455 -867:0:4365 -868:3:2747 -869:0:4365 -870:2:1652 -871:0:4365 -872:2:1653 -873:0:4365 -874:2:1657 -875:0:4365 -876:2:1660 -877:0:4365 -878:3:2746 -879:0:4365 -880:2:1665 -881:2:1669 -882:2:1670 -883:2:1678 -884:2:1679 -885:2:1683 -886:2:1684 -887:2:1678 -888:2:1679 -889:2:1680 -890:2:1692 -891:2:1697 -892:2:1701 -893:2:1702 -894:2:1709 -895:2:1710 -896:2:1721 -897:2:1722 -898:2:1723 -899:2:1721 -900:2:1722 -901:2:1723 -902:2:1734 -903:2:1739 -904:2:1740 -905:0:4365 -906:3:2747 -907:0:4365 -908:2:1752 -909:0:4365 -910:3:2746 -911:0:4365 -912:2:1754 -913:0:4365 -914:3:2747 -915:0:4365 -916:2:1755 -917:2:1759 -918:2:1760 -919:2:1768 -920:2:1769 -921:2:1773 -922:2:1774 -923:2:1768 -924:2:1769 -925:2:1773 -926:2:1774 -927:2:1782 -928:2:1787 -929:2:1791 -930:2:1792 -931:2:1799 -932:2:1800 -933:2:1811 -934:2:1812 -935:2:1813 -936:2:1811 -937:2:1812 -938:2:1813 -939:2:1824 -940:2:1829 -941:2:1830 -942:0:4365 -943:2:1842 -944:0:4365 -945:3:2746 -946:0:4365 -947:2:1844 -948:0:4365 -949:3:2747 -950:0:4365 -951:2:1845 -952:2:1849 -953:2:1850 -954:2:1858 -955:2:1859 -956:2:1863 -957:2:1864 -958:2:1858 -959:2:1859 -960:2:1863 -961:2:1864 -962:2:1872 -963:2:1877 -964:2:1881 -965:2:1882 -966:2:1889 -967:2:1890 -968:2:1901 -969:2:1902 -970:2:1903 -971:2:1901 -972:2:1902 -973:2:1903 -974:2:1914 -975:2:1919 -976:2:1920 -977:0:4365 -978:2:1932 -979:0:4365 -980:3:2746 -981:0:4365 -982:2:1934 -983:0:4365 -984:3:2747 -985:0:4365 -986:2:1935 -987:0:4365 -988:2:1936 -989:0:4365 -990:2:2129 -991:0:4365 -992:2:2130 -993:0:4365 -994:2:2134 -995:0:4365 -996:3:2746 -997:0:4365 -998:2:2136 -999:0:4365 -1000:3:2747 -1001:0:4365 -1002:2:2137 -1003:2:2141 -1004:2:2142 -1005:2:2150 -1006:2:2151 -1007:2:2155 -1008:2:2156 -1009:2:2150 -1010:2:2151 -1011:2:2155 -1012:2:2156 -1013:2:2164 -1014:2:2169 -1015:2:2173 -1016:2:2174 -1017:2:2181 -1018:2:2182 -1019:2:2193 -1020:2:2194 -1021:2:2195 -1022:2:2193 -1023:2:2194 -1024:2:2195 -1025:2:2206 -1026:2:2211 -1027:2:2212 -1028:0:4365 -1029:2:2224 -1030:0:4365 -1031:3:2746 -1032:0:4365 -1033:2:2226 -1034:0:4365 -1035:3:2747 -1036:0:4365 -1037:2:1936 -1038:0:4365 -1039:2:2129 -1040:0:4365 -1041:2:2130 -1042:0:4365 -1043:2:2134 -1044:0:4365 -1045:3:2746 -1046:0:4365 -1047:2:2136 -1048:0:4365 -1049:3:2747 -1050:0:4365 -1051:2:2137 -1052:2:2141 -1053:2:2142 -1054:2:2150 -1055:2:2151 -1056:2:2155 -1057:2:2156 -1058:2:2150 -1059:2:2151 -1060:2:2152 -1061:2:2164 -1062:2:2169 -1063:2:2173 -1064:2:2174 -1065:2:2181 -1066:2:2182 -1067:2:2193 -1068:2:2194 -1069:2:2195 -1070:2:2193 -1071:2:2194 -1072:2:2195 -1073:2:2206 -1074:2:2211 -1075:2:2212 -1076:0:4365 -1077:2:2224 -1078:0:4365 -1079:3:2746 -1080:0:4365 -1081:2:2226 -1082:0:4365 -1083:3:2747 -1084:0:4365 -1085:2:2230 -1086:0:4365 -1087:3:2746 -1088:0:4365 -1089:2:2235 -1090:2:2239 -1091:2:2240 -1092:2:2248 -1093:2:2249 -1094:2:2253 -1095:2:2254 -1096:2:2248 -1097:2:2249 -1098:2:2250 -1099:2:2262 -1100:2:2267 -1101:2:2271 -1102:2:2272 -1103:2:2279 -1104:2:2280 -1105:2:2291 -1106:2:2292 -1107:2:2293 -1108:2:2291 -1109:2:2292 -1110:2:2293 -1111:2:2304 -1112:2:2309 -1113:2:2310 -1114:0:4365 -1115:3:2747 -1116:0:4365 -1117:2:2322 -1118:0:4365 -1119:2:1169 -1120:0:4365 -1121:3:2746 -1122:0:4365 -1123:2:1170 -1124:0:4365 -1125:3:2747 -1126:0:4365 -1127:3:2748 -1128:0:4365 -1129:3:2754 -1130:0:4365 -1131:3:2755 -1132:3:2759 -1133:3:2760 -1134:3:2768 -1135:3:2769 -1136:3:2773 -1137:3:2774 -1138:3:2768 -1139:3:2769 -1140:3:2773 -1141:3:2774 -1142:3:2782 -1143:3:2787 -1144:3:2791 -1145:3:2792 -1146:3:2799 -1147:3:2800 -1148:3:2811 -1149:3:2812 -1150:3:2813 -1151:3:2811 -1152:3:2812 -1153:3:2813 -1154:3:2824 -1155:3:2829 -1156:3:2830 -1157:0:4365 -1158:3:2842 -1159:0:4365 -1160:3:2843 -1161:0:4365 -1162:2:1173 -1163:0:4365 -1164:3:2844 -1165:0:4365 -1166:2:1179 -1167:0:4365 -1168:2:1180 -1169:0:4365 -1170:3:2843 -1171:0:4365 -1172:2:1181 -1173:2:1185 -1174:2:1186 -1175:2:1194 -1176:2:1195 -1177:2:1199 -1178:2:1200 -1179:2:1194 -1180:2:1195 -1181:2:1199 -1182:2:1200 -1183:2:1208 -1184:2:1213 -1185:2:1217 -1186:2:1218 -1187:2:1225 -1188:2:1226 -1189:2:1237 -1190:2:1238 -1191:2:1239 -1192:2:1237 -1193:2:1238 -1194:2:1239 -1195:2:1250 -1196:2:1255 -1197:2:1256 -1198:0:4365 -1199:3:2844 -1200:0:4365 -1201:2:1268 -1202:0:4365 -1203:3:2843 -1204:0:4365 -1205:2:1270 -1206:0:4365 -1207:3:2844 -1208:0:4365 -1209:2:1271 -1210:2:1275 -1211:2:1276 -1212:2:1284 -1213:2:1285 -1214:2:1289 -1215:2:1290 -1216:2:1284 -1217:2:1285 -1218:2:1289 -1219:2:1290 -1220:2:1298 -1221:2:1303 -1222:2:1307 -1223:2:1308 -1224:2:1315 -1225:2:1316 -1226:2:1327 -1227:2:1328 -1228:2:1329 -1229:2:1327 -1230:2:1328 -1231:2:1329 -1232:2:1340 -1233:2:1345 -1234:2:1346 -1235:0:4365 -1236:2:1358 -1237:0:4365 -1238:2:1360 -1239:0:4365 -1240:3:2843 -1241:0:4365 -1242:2:1361 -1243:0:4365 -1244:3:2844 -1245:0:4365 -1246:2:1362 -1247:2:1366 -1248:2:1367 -1249:2:1375 -1250:2:1376 -1251:2:1380 -1252:2:1381 -1253:2:1375 -1254:2:1376 -1255:2:1380 -1256:2:1381 -1257:2:1389 -1258:2:1394 -1259:2:1398 -1260:2:1399 -1261:2:1406 -1262:2:1407 -1263:2:1418 -1264:2:1419 -1265:2:1420 -1266:2:1418 -1267:2:1419 -1268:2:1420 -1269:2:1431 -1270:2:1436 -1271:2:1437 -1272:0:4365 -1273:2:1449 -1274:0:4365 -1275:3:2843 -1276:0:4365 -1277:2:1451 -1278:0:4365 -1279:3:2844 -1280:0:4365 -1281:2:1652 -1282:0:4365 -1283:2:1653 -1284:0:4365 -1285:2:1657 -1286:0:4365 -1287:2:1180 -1288:0:4365 -1289:3:2843 -1290:0:4365 -1291:2:1181 -1292:2:1185 -1293:2:1186 -1294:2:1194 -1295:2:1195 -1296:2:1199 -1297:2:1200 -1298:2:1194 -1299:2:1195 -1300:2:1196 -1301:2:1208 -1302:2:1213 -1303:2:1217 -1304:2:1218 -1305:2:1225 -1306:2:1226 -1307:2:1237 -1308:2:1238 -1309:2:1239 -1310:2:1237 -1311:2:1238 -1312:2:1239 -1313:2:1250 -1314:2:1255 -1315:2:1256 -1316:0:4365 -1317:3:2844 -1318:0:4365 -1319:2:1268 -1320:0:4365 -1321:3:2843 -1322:0:4365 -1323:2:1270 -1324:0:4365 -1325:3:2844 -1326:0:4365 -1327:2:1271 -1328:2:1275 -1329:2:1276 -1330:2:1284 -1331:2:1285 -1332:2:1289 -1333:2:1290 -1334:2:1284 -1335:2:1285 -1336:2:1289 -1337:2:1290 -1338:2:1298 -1339:2:1303 -1340:2:1307 -1341:2:1308 -1342:2:1315 -1343:2:1316 -1344:2:1327 -1345:2:1328 -1346:2:1329 -1347:2:1327 -1348:2:1328 -1349:2:1329 -1350:2:1340 -1351:2:1345 -1352:2:1346 -1353:0:4365 -1354:2:1358 -1355:0:4365 -1356:2:1454 -1357:0:4365 -1358:3:2843 -1359:0:4365 -1360:2:1455 -1361:0:4365 -1362:3:2844 -1363:0:4365 -1364:2:1652 -1365:0:4365 -1366:2:1653 -1367:0:4365 -1368:2:1657 -1369:0:4365 -1370:2:1660 -1371:0:4365 -1372:3:2843 -1373:0:4365 -1374:2:1665 -1375:2:1669 -1376:2:1670 -1377:2:1678 -1378:2:1679 -1379:2:1683 -1380:2:1684 -1381:2:1678 -1382:2:1679 -1383:2:1680 -1384:2:1692 -1385:2:1697 -1386:2:1701 -1387:2:1702 -1388:2:1709 -1389:2:1710 -1390:2:1721 -1391:2:1722 -1392:2:1723 -1393:2:1721 -1394:2:1722 -1395:2:1723 -1396:2:1734 -1397:2:1739 -1398:2:1740 -1399:0:4365 -1400:3:2844 -1401:0:4365 -1402:2:1752 -1403:0:4365 -1404:3:2843 -1405:0:4365 -1406:2:1754 -1407:0:4365 -1408:3:2844 -1409:0:4365 -1410:2:1755 -1411:2:1759 -1412:2:1760 -1413:2:1768 -1414:2:1769 -1415:2:1773 -1416:2:1774 -1417:2:1768 -1418:2:1769 -1419:2:1773 -1420:2:1774 -1421:2:1782 -1422:2:1787 -1423:2:1791 -1424:2:1792 -1425:2:1799 -1426:2:1800 -1427:2:1811 -1428:2:1812 -1429:2:1813 -1430:2:1811 -1431:2:1812 -1432:2:1813 -1433:2:1824 -1434:2:1829 -1435:2:1830 -1436:0:4365 -1437:2:1842 -1438:0:4365 -1439:3:2843 -1440:0:4365 -1441:2:1844 -1442:0:4365 -1443:3:2844 -1444:0:4365 -1445:2:1845 -1446:2:1849 -1447:2:1850 -1448:2:1858 -1449:2:1859 -1450:2:1863 -1451:2:1864 -1452:2:1858 -1453:2:1859 -1454:2:1863 -1455:2:1864 -1456:2:1872 -1457:2:1877 -1458:2:1881 -1459:2:1882 -1460:2:1889 -1461:2:1890 -1462:2:1901 -1463:2:1902 -1464:2:1903 -1465:2:1901 -1466:2:1902 -1467:2:1903 -1468:2:1914 -1469:2:1919 -1470:2:1920 -1471:0:4365 -1472:2:1932 -1473:0:4365 -1474:3:2843 -1475:0:4365 -1476:2:1934 -1477:0:4365 -1478:3:2844 -1479:0:4365 -1480:2:1935 -1481:0:4365 -1482:2:1936 -1483:0:4365 -1484:2:2129 -1485:0:4365 -1486:2:2130 -1487:0:4365 -1488:2:2134 -1489:0:4365 -1490:3:2843 -1491:0:4365 -1492:2:2136 -1493:0:4365 -1494:3:2844 -1495:0:4365 -1496:2:2137 -1497:2:2141 -1498:2:2142 -1499:2:2150 -1500:2:2151 -1501:2:2155 -1502:2:2156 -1503:2:2150 -1504:2:2151 -1505:2:2155 -1506:2:2156 -1507:2:2164 -1508:2:2169 -1509:2:2173 -1510:2:2174 -1511:2:2181 -1512:2:2182 -1513:2:2193 -1514:2:2194 -1515:2:2195 -1516:2:2193 -1517:2:2194 -1518:2:2195 -1519:2:2206 -1520:2:2211 -1521:2:2212 -1522:0:4365 -1523:2:2224 -1524:0:4365 -1525:3:2843 -1526:0:4365 -1527:2:2226 -1528:0:4365 -1529:3:2844 -1530:0:4365 -1531:2:1936 -1532:0:4365 -1533:2:2129 -1534:0:4365 -1535:2:2130 -1536:0:4365 -1537:2:2134 -1538:0:4365 -1539:3:2843 -1540:0:4365 -1541:2:2136 -1542:0:4365 -1543:3:2844 -1544:0:4365 -1545:2:2137 -1546:2:2141 -1547:2:2142 -1548:2:2150 -1549:2:2151 -1550:2:2155 -1551:2:2156 -1552:2:2150 -1553:2:2151 -1554:2:2152 -1555:2:2164 -1556:2:2169 -1557:2:2173 -1558:2:2174 -1559:2:2181 -1560:2:2182 -1561:2:2193 -1562:2:2194 -1563:2:2195 -1564:2:2193 -1565:2:2194 -1566:2:2195 -1567:2:2206 -1568:2:2211 -1569:2:2212 -1570:0:4365 -1571:2:2224 -1572:0:4365 -1573:3:2843 -1574:0:4365 -1575:2:2226 -1576:0:4365 -1577:3:2844 -1578:0:4365 -1579:2:2230 -1580:0:4365 -1581:3:2843 -1582:0:4365 -1583:2:2235 -1584:2:2239 -1585:2:2240 -1586:2:2248 -1587:2:2249 -1588:2:2253 -1589:2:2254 -1590:2:2248 -1591:2:2249 -1592:2:2250 -1593:2:2262 -1594:2:2267 -1595:2:2271 -1596:2:2272 -1597:2:2279 -1598:2:2280 -1599:2:2291 -1600:2:2292 -1601:2:2293 -1602:2:2291 -1603:2:2292 -1604:2:2293 -1605:2:2304 -1606:2:2309 -1607:2:2310 -1608:0:4365 -1609:3:2844 -1610:0:4365 -1611:2:2322 -1612:0:4365 -1613:2:1169 -1614:0:4365 -1615:3:2843 -1616:0:4365 -1617:2:1170 -1618:0:4365 -1619:3:2844 -1620:0:4365 -1621:3:2845 -1622:0:4365 -1623:3:2851 -1624:0:4365 -1625:3:2854 -1626:3:2855 -1627:3:2867 -1628:3:2868 -1629:3:2872 -1630:3:2873 -1631:3:2867 -1632:3:2868 -1633:3:2872 -1634:3:2873 -1635:3:2881 -1636:3:2886 -1637:3:2890 -1638:3:2891 -1639:3:2898 -1640:3:2899 -1641:3:2910 -1642:3:2911 -1643:3:2912 -1644:3:2910 -1645:3:2911 -1646:3:2912 -1647:3:2923 -1648:3:2928 -1649:3:2929 -1650:0:4365 -1651:3:2941 -1652:0:4365 -1653:3:2942 -1654:0:4365 -1655:2:1173 -1656:0:4365 -1657:3:2943 -1658:0:4365 -1659:2:1179 -1660:0:4365 -1661:2:1180 -1662:0:4365 -1663:3:2942 -1664:0:4365 -1665:2:1181 -1666:2:1185 -1667:2:1186 -1668:2:1194 -1669:2:1195 -1670:2:1199 -1671:2:1200 -1672:2:1194 -1673:2:1195 -1674:2:1199 -1675:2:1200 -1676:2:1208 -1677:2:1213 -1678:2:1217 -1679:2:1218 -1680:2:1225 -1681:2:1226 -1682:2:1237 -1683:2:1238 -1684:2:1239 -1685:2:1237 -1686:2:1238 -1687:2:1239 -1688:2:1250 -1689:2:1255 -1690:2:1256 -1691:0:4365 -1692:3:2943 -1693:0:4365 -1694:2:1268 -1695:0:4365 -1696:3:2942 -1697:0:4365 -1698:2:1270 -1699:0:4365 -1700:3:2943 -1701:0:4365 -1702:2:1271 -1703:2:1275 -1704:2:1276 -1705:2:1284 -1706:2:1285 -1707:2:1289 -1708:2:1290 -1709:2:1284 -1710:2:1285 -1711:2:1289 -1712:2:1290 -1713:2:1298 -1714:2:1303 -1715:2:1307 -1716:2:1308 -1717:2:1315 -1718:2:1316 -1719:2:1327 -1720:2:1328 -1721:2:1329 -1722:2:1327 -1723:2:1328 -1724:2:1329 -1725:2:1340 -1726:2:1345 -1727:2:1346 -1728:0:4365 -1729:2:1358 -1730:0:4365 -1731:2:1360 -1732:0:4365 -1733:3:2942 -1734:0:4365 -1735:2:1361 -1736:0:4365 -1737:3:2943 -1738:0:4365 -1739:2:1362 -1740:2:1366 -1741:2:1367 -1742:2:1375 -1743:2:1376 -1744:2:1380 -1745:2:1381 -1746:2:1375 -1747:2:1376 -1748:2:1380 -1749:2:1381 -1750:2:1389 -1751:2:1394 -1752:2:1398 -1753:2:1399 -1754:2:1406 -1755:2:1407 -1756:2:1418 -1757:2:1419 -1758:2:1420 -1759:2:1418 -1760:2:1419 -1761:2:1420 -1762:2:1431 -1763:2:1436 -1764:2:1437 -1765:0:4365 -1766:2:1449 -1767:0:4365 -1768:3:2942 -1769:0:4365 -1770:2:1451 -1771:0:4365 -1772:3:2943 -1773:0:4365 -1774:2:1652 -1775:0:4365 -1776:2:1653 -1777:0:4365 -1778:2:1657 -1779:0:4365 -1780:2:1180 -1781:0:4365 -1782:3:2942 -1783:0:4365 -1784:2:1181 -1785:2:1185 -1786:2:1186 -1787:2:1194 -1788:2:1195 -1789:2:1199 -1790:2:1200 -1791:2:1194 -1792:2:1195 -1793:2:1196 -1794:2:1208 -1795:2:1213 -1796:2:1217 -1797:2:1218 -1798:2:1225 -1799:2:1226 -1800:2:1237 -1801:2:1238 -1802:2:1239 -1803:2:1237 -1804:2:1238 -1805:2:1239 -1806:2:1250 -1807:2:1255 -1808:2:1256 -1809:0:4365 -1810:3:2943 -1811:0:4365 -1812:2:1268 -1813:0:4365 -1814:3:2942 -1815:0:4365 -1816:2:1270 -1817:0:4365 -1818:3:2943 -1819:0:4365 -1820:2:1271 -1821:2:1275 -1822:2:1276 -1823:2:1284 -1824:2:1285 -1825:2:1289 -1826:2:1290 -1827:2:1284 -1828:2:1285 -1829:2:1289 -1830:2:1290 -1831:2:1298 -1832:2:1303 -1833:2:1307 -1834:2:1308 -1835:2:1315 -1836:2:1316 -1837:2:1327 -1838:2:1328 -1839:2:1329 -1840:2:1327 -1841:2:1328 -1842:2:1329 -1843:2:1340 -1844:2:1345 -1845:2:1346 -1846:0:4365 -1847:2:1358 -1848:0:4365 -1849:2:1454 -1850:0:4365 -1851:3:2942 -1852:0:4365 -1853:2:1455 -1854:0:4365 -1855:3:2943 -1856:0:4365 -1857:2:1652 -1858:0:4365 -1859:2:1653 -1860:0:4365 -1861:2:1657 -1862:0:4365 -1863:2:1660 -1864:0:4365 -1865:3:2942 -1866:0:4365 -1867:2:1665 -1868:2:1669 -1869:2:1670 -1870:2:1678 -1871:2:1679 -1872:2:1683 -1873:2:1684 -1874:2:1678 -1875:2:1679 -1876:2:1680 -1877:2:1692 -1878:2:1697 -1879:2:1701 -1880:2:1702 -1881:2:1709 -1882:2:1710 -1883:2:1721 -1884:2:1722 -1885:2:1723 -1886:2:1721 -1887:2:1722 -1888:2:1723 -1889:2:1734 -1890:2:1739 -1891:2:1740 -1892:0:4365 -1893:3:2943 -1894:0:4365 -1895:2:1752 -1896:0:4365 -1897:3:2942 -1898:0:4365 -1899:2:1754 -1900:0:4365 -1901:3:2943 -1902:0:4365 -1903:2:1755 -1904:2:1759 -1905:2:1760 -1906:2:1768 -1907:2:1769 -1908:2:1773 -1909:2:1774 -1910:2:1768 -1911:2:1769 -1912:2:1773 -1913:2:1774 -1914:2:1782 -1915:2:1787 -1916:2:1791 -1917:2:1792 -1918:2:1799 -1919:2:1800 -1920:2:1811 -1921:2:1812 -1922:2:1813 -1923:2:1811 -1924:2:1812 -1925:2:1813 -1926:2:1824 -1927:2:1829 -1928:2:1830 -1929:0:4365 -1930:2:1842 -1931:0:4365 -1932:3:2942 -1933:0:4365 -1934:2:1844 -1935:0:4365 -1936:3:2943 -1937:0:4365 -1938:2:1845 -1939:2:1849 -1940:2:1850 -1941:2:1858 -1942:2:1859 -1943:2:1863 -1944:2:1864 -1945:2:1858 -1946:2:1859 -1947:2:1863 -1948:2:1864 -1949:2:1872 -1950:2:1877 -1951:2:1881 -1952:2:1882 -1953:2:1889 -1954:2:1890 -1955:2:1901 -1956:2:1902 -1957:2:1903 -1958:2:1901 -1959:2:1902 -1960:2:1903 -1961:2:1914 -1962:2:1919 -1963:2:1920 -1964:0:4365 -1965:2:1932 -1966:0:4365 -1967:3:2942 -1968:0:4365 -1969:2:1934 -1970:0:4365 -1971:3:2943 -1972:0:4365 -1973:2:1935 -1974:0:4365 -1975:2:1936 -1976:0:4365 -1977:2:2129 -1978:0:4365 -1979:2:2130 -1980:0:4365 -1981:2:2134 -1982:0:4365 -1983:3:2942 -1984:0:4365 -1985:2:2136 -1986:0:4365 -1987:3:2943 -1988:0:4365 -1989:2:2137 -1990:2:2141 -1991:2:2142 -1992:2:2150 -1993:2:2151 -1994:2:2155 -1995:2:2156 -1996:2:2150 -1997:2:2151 -1998:2:2155 -1999:2:2156 -2000:2:2164 -2001:2:2169 -2002:2:2173 -2003:2:2174 -2004:2:2181 -2005:2:2182 -2006:2:2193 -2007:2:2194 -2008:2:2195 -2009:2:2193 -2010:2:2194 -2011:2:2195 -2012:2:2206 -2013:2:2211 -2014:2:2212 -2015:0:4365 -2016:2:2224 -2017:0:4365 -2018:3:2942 -2019:0:4365 -2020:2:2226 -2021:0:4365 -2022:3:2943 -2023:0:4365 -2024:2:1936 -2025:0:4365 -2026:2:2129 -2027:0:4365 -2028:2:2130 -2029:0:4365 -2030:2:2134 -2031:0:4365 -2032:3:2942 -2033:0:4365 -2034:2:2136 -2035:0:4365 -2036:3:2943 -2037:0:4365 -2038:2:2137 -2039:2:2141 -2040:2:2142 -2041:2:2150 -2042:2:2151 -2043:2:2155 -2044:2:2156 -2045:2:2150 -2046:2:2151 -2047:2:2152 -2048:2:2164 -2049:2:2169 -2050:2:2173 -2051:2:2174 -2052:2:2181 -2053:2:2182 -2054:2:2193 -2055:2:2194 -2056:2:2195 -2057:2:2193 -2058:2:2194 -2059:2:2195 -2060:2:2206 -2061:2:2211 -2062:2:2212 -2063:0:4365 -2064:2:2224 -2065:0:4365 -2066:3:2942 -2067:0:4365 -2068:2:2226 -2069:0:4365 -2070:3:2943 -2071:0:4365 -2072:2:2230 -2073:0:4365 -2074:3:2942 -2075:0:4365 -2076:2:2235 -2077:2:2239 -2078:2:2240 -2079:2:2248 -2080:2:2249 -2081:2:2253 -2082:2:2254 -2083:2:2248 -2084:2:2249 -2085:2:2250 -2086:2:2262 -2087:2:2267 -2088:2:2271 -2089:2:2272 -2090:2:2279 -2091:2:2280 -2092:2:2291 -2093:2:2292 -2094:2:2293 -2095:2:2291 -2096:2:2292 -2097:2:2293 -2098:2:2304 -2099:2:2309 -2100:2:2310 -2101:0:4365 -2102:3:2943 -2103:0:4365 -2104:2:2322 -2105:0:4365 -2106:2:1169 -2107:0:4365 -2108:3:2942 -2109:0:4365 -2110:2:1170 -2111:0:4365 -2112:3:2943 -2113:0:4365 -2114:3:2944 -2115:0:4365 -2116:3:2950 -2117:0:4365 -2118:3:2951 -2119:0:4365 -2120:3:2952 -2121:0:4365 -2122:3:2953 -2123:0:4365 -2124:3:2954 -2125:3:2958 -2126:3:2959 -2127:3:2967 -2128:3:2968 -2129:3:2972 -2130:3:2973 -2131:3:2967 -2132:3:2968 -2133:3:2972 -2134:3:2973 -2135:3:2981 -2136:3:2986 -2137:3:2990 -2138:3:2991 -2139:3:2998 -2140:3:2999 -2141:3:3010 -2142:3:3011 -2143:3:3012 -2144:3:3010 -2145:3:3011 -2146:3:3012 -2147:3:3023 -2148:3:3028 -2149:3:3029 -2150:0:4365 -2151:3:3041 -2152:0:4365 -2153:3:3042 -2154:0:4365 -2155:2:1173 -2156:0:4365 -2157:3:3043 -2158:0:4365 -2159:2:1179 -2160:0:4365 -2161:2:1180 -2162:0:4365 -2163:3:3042 -2164:0:4365 -2165:2:1181 -2166:2:1185 -2167:2:1186 -2168:2:1194 -2169:2:1195 -2170:2:1199 -2171:2:1200 -2172:2:1194 -2173:2:1195 -2174:2:1199 -2175:2:1200 -2176:2:1208 -2177:2:1213 -2178:2:1217 -2179:2:1218 -2180:2:1225 -2181:2:1226 -2182:2:1237 -2183:2:1238 -2184:2:1239 -2185:2:1237 -2186:2:1238 -2187:2:1239 -2188:2:1250 -2189:2:1255 -2190:2:1256 -2191:0:4365 -2192:3:3043 -2193:0:4365 -2194:2:1268 -2195:0:4365 -2196:3:3042 -2197:0:4365 -2198:2:1270 -2199:0:4365 -2200:3:3043 -2201:0:4365 -2202:2:1271 -2203:2:1275 -2204:2:1276 -2205:2:1284 -2206:2:1285 -2207:2:1289 -2208:2:1290 -2209:2:1284 -2210:2:1285 -2211:2:1289 -2212:2:1290 -2213:2:1298 -2214:2:1303 -2215:2:1307 -2216:2:1308 -2217:2:1315 -2218:2:1316 -2219:2:1327 -2220:2:1328 -2221:2:1329 -2222:2:1327 -2223:2:1328 -2224:2:1329 -2225:2:1340 -2226:2:1345 -2227:2:1346 -2228:0:4365 -2229:2:1358 -2230:0:4365 -2231:2:1360 -2232:0:4365 -2233:3:3042 -2234:0:4365 -2235:2:1361 -2236:0:4365 -2237:3:3043 -2238:0:4365 -2239:2:1362 -2240:2:1366 -2241:2:1367 -2242:2:1375 -2243:2:1376 -2244:2:1380 -2245:2:1381 -2246:2:1375 -2247:2:1376 -2248:2:1380 -2249:2:1381 -2250:2:1389 -2251:2:1394 -2252:2:1398 -2253:2:1399 -2254:2:1406 -2255:2:1407 -2256:2:1418 -2257:2:1419 -2258:2:1420 -2259:2:1418 -2260:2:1419 -2261:2:1420 -2262:2:1431 -2263:2:1436 -2264:2:1437 -2265:0:4365 -2266:2:1449 -2267:0:4365 -2268:3:3042 -2269:0:4365 -2270:2:1451 -2271:0:4365 -2272:3:3043 -2273:0:4365 -2274:2:1652 -2275:0:4365 -2276:2:1653 -2277:0:4365 -2278:2:1657 -2279:0:4365 -2280:2:1180 -2281:0:4365 -2282:3:3042 -2283:0:4365 -2284:2:1181 -2285:2:1185 -2286:2:1186 -2287:2:1194 -2288:2:1195 -2289:2:1199 -2290:2:1200 -2291:2:1194 -2292:2:1195 -2293:2:1196 -2294:2:1208 -2295:2:1213 -2296:2:1217 -2297:2:1218 -2298:2:1225 -2299:2:1226 -2300:2:1237 -2301:2:1238 -2302:2:1239 -2303:2:1237 -2304:2:1238 -2305:2:1239 -2306:2:1250 -2307:2:1255 -2308:2:1256 -2309:0:4365 -2310:3:3043 -2311:0:4365 -2312:2:1268 -2313:0:4365 -2314:3:3042 -2315:0:4365 -2316:2:1270 -2317:0:4365 -2318:3:3043 -2319:0:4365 -2320:2:1271 -2321:2:1275 -2322:2:1276 -2323:2:1284 -2324:2:1285 -2325:2:1289 -2326:2:1290 -2327:2:1284 -2328:2:1285 -2329:2:1289 -2330:2:1290 -2331:2:1298 -2332:2:1303 -2333:2:1307 -2334:2:1308 -2335:2:1315 -2336:2:1316 -2337:2:1327 -2338:2:1328 -2339:2:1329 -2340:2:1327 -2341:2:1328 -2342:2:1329 -2343:2:1340 -2344:2:1345 -2345:2:1346 -2346:0:4365 -2347:2:1358 -2348:0:4365 -2349:2:1454 -2350:0:4365 -2351:3:3042 -2352:0:4365 -2353:2:1455 -2354:0:4365 -2355:3:3043 -2356:0:4365 -2357:2:1652 -2358:0:4365 -2359:2:1653 -2360:0:4365 -2361:2:1657 -2362:0:4365 -2363:2:1660 -2364:0:4365 -2365:3:3042 -2366:0:4365 -2367:2:1665 -2368:2:1669 -2369:2:1670 -2370:2:1678 -2371:2:1679 -2372:2:1683 -2373:2:1684 -2374:2:1678 -2375:2:1679 -2376:2:1680 -2377:2:1692 -2378:2:1697 -2379:2:1701 -2380:2:1702 -2381:2:1709 -2382:2:1710 -2383:2:1721 -2384:2:1722 -2385:2:1723 -2386:2:1721 -2387:2:1722 -2388:2:1723 -2389:2:1734 -2390:2:1739 -2391:2:1740 -2392:0:4365 -2393:3:3043 -2394:0:4365 -2395:2:1752 -2396:0:4365 -2397:3:3042 -2398:0:4365 -2399:2:1754 -2400:0:4365 -2401:3:3043 -2402:0:4365 -2403:2:1755 -2404:2:1759 -2405:2:1760 -2406:2:1768 -2407:2:1769 -2408:2:1773 -2409:2:1774 -2410:2:1768 -2411:2:1769 -2412:2:1773 -2413:2:1774 -2414:2:1782 -2415:2:1787 -2416:2:1791 -2417:2:1792 -2418:2:1799 -2419:2:1800 -2420:2:1811 -2421:2:1812 -2422:2:1813 -2423:2:1811 -2424:2:1812 -2425:2:1813 -2426:2:1824 -2427:2:1829 -2428:2:1830 -2429:0:4365 -2430:2:1842 -2431:0:4365 -2432:3:3042 -2433:0:4365 -2434:2:1844 -2435:0:4365 -2436:3:3043 -2437:0:4365 -2438:2:1845 -2439:2:1849 -2440:2:1850 -2441:2:1858 -2442:2:1859 -2443:2:1863 -2444:2:1864 -2445:2:1858 -2446:2:1859 -2447:2:1863 -2448:2:1864 -2449:2:1872 -2450:2:1877 -2451:2:1881 -2452:2:1882 -2453:2:1889 -2454:2:1890 -2455:2:1901 -2456:2:1902 -2457:2:1903 -2458:2:1901 -2459:2:1902 -2460:2:1903 -2461:2:1914 -2462:2:1919 -2463:2:1920 -2464:0:4365 -2465:2:1932 -2466:0:4365 -2467:3:3042 -2468:0:4365 -2469:2:1934 -2470:0:4365 -2471:3:3043 -2472:0:4365 -2473:2:1935 -2474:0:4365 -2475:2:1936 -2476:0:4365 -2477:2:2129 -2478:0:4365 -2479:2:2130 -2480:0:4365 -2481:2:2134 -2482:0:4365 -2483:3:3042 -2484:0:4365 -2485:2:2136 -2486:0:4365 -2487:3:3043 -2488:0:4365 -2489:2:2137 -2490:2:2141 -2491:2:2142 -2492:2:2150 -2493:2:2151 -2494:2:2155 -2495:2:2156 -2496:2:2150 -2497:2:2151 -2498:2:2155 -2499:2:2156 -2500:2:2164 -2501:2:2169 -2502:2:2173 -2503:2:2174 -2504:2:2181 -2505:2:2182 -2506:2:2193 -2507:2:2194 -2508:2:2195 -2509:2:2193 -2510:2:2194 -2511:2:2195 -2512:2:2206 -2513:2:2211 -2514:2:2212 -2515:0:4365 -2516:2:2224 -2517:0:4365 -2518:3:3042 -2519:0:4365 -2520:2:2226 -2521:0:4365 -2522:3:3043 -2523:0:4365 -2524:2:1936 -2525:0:4365 -2526:2:2129 -2527:0:4365 -2528:2:2130 -2529:0:4365 -2530:2:2134 -2531:0:4365 -2532:3:3042 -2533:0:4365 -2534:2:2136 -2535:0:4365 -2536:3:3043 -2537:0:4365 -2538:2:2137 -2539:2:2141 -2540:2:2142 -2541:2:2150 -2542:2:2151 -2543:2:2155 -2544:2:2156 -2545:2:2150 -2546:2:2151 -2547:2:2152 -2548:2:2164 -2549:2:2169 -2550:2:2173 -2551:2:2174 -2552:2:2181 -2553:2:2182 -2554:2:2193 -2555:2:2194 -2556:2:2195 -2557:2:2193 -2558:2:2194 -2559:2:2195 -2560:2:2206 -2561:2:2211 -2562:2:2212 -2563:0:4365 -2564:2:2224 -2565:0:4365 -2566:3:3042 -2567:0:4365 -2568:2:2226 -2569:0:4365 -2570:3:3043 -2571:0:4365 -2572:2:2230 -2573:0:4365 -2574:3:3042 -2575:0:4365 -2576:2:2235 -2577:2:2239 -2578:2:2240 -2579:2:2248 -2580:2:2249 -2581:2:2253 -2582:2:2254 -2583:2:2248 -2584:2:2249 -2585:2:2250 -2586:2:2262 -2587:2:2267 -2588:2:2271 -2589:2:2272 -2590:2:2279 -2591:2:2280 -2592:2:2291 -2593:2:2292 -2594:2:2293 -2595:2:2291 -2596:2:2292 -2597:2:2293 -2598:2:2304 -2599:2:2309 -2600:2:2310 -2601:0:4365 -2602:3:3043 -2603:0:4365 -2604:2:2322 -2605:0:4365 -2606:2:1169 -2607:0:4365 -2608:3:3042 -2609:0:4365 -2610:2:1170 -2611:0:4365 -2612:3:3043 -2613:0:4365 -2614:3:3044 -2615:0:4365 -2616:3:3257 -2617:0:4365 -2618:3:3265 -2619:0:4365 -2620:3:3266 -2621:3:3270 -2622:3:3271 -2623:3:3279 -2624:3:3280 -2625:3:3284 -2626:3:3285 -2627:3:3279 -2628:3:3280 -2629:3:3284 -2630:3:3285 -2631:3:3293 -2632:3:3298 -2633:3:3302 -2634:3:3303 -2635:3:3310 -2636:3:3311 -2637:3:3322 -2638:3:3323 -2639:3:3324 -2640:3:3322 -2641:3:3323 -2642:3:3324 -2643:3:3335 -2644:3:3340 -2645:3:3341 -2646:0:4365 -2647:3:3353 -2648:0:4365 -2649:3:3354 -2650:0:4365 -2651:2:1173 -2652:0:4365 -2653:3:3355 -2654:0:4365 -2655:2:1179 -2656:0:4365 -2657:2:1180 -2658:0:4365 -2659:3:3354 -2660:0:4365 -2661:2:1181 -2662:2:1185 -2663:2:1186 -2664:2:1194 -2665:2:1195 -2666:2:1199 -2667:2:1200 -2668:2:1194 -2669:2:1195 -2670:2:1199 -2671:2:1200 -2672:2:1208 -2673:2:1213 -2674:2:1217 -2675:2:1218 -2676:2:1225 -2677:2:1226 -2678:2:1237 -2679:2:1238 -2680:2:1239 -2681:2:1237 -2682:2:1238 -2683:2:1239 -2684:2:1250 -2685:2:1255 -2686:2:1256 -2687:0:4365 -2688:3:3355 -2689:0:4365 -2690:2:1268 -2691:0:4365 -2692:3:3354 -2693:0:4365 -2694:2:1270 -2695:0:4365 -2696:3:3355 -2697:0:4365 -2698:2:1271 -2699:2:1275 -2700:2:1276 -2701:2:1284 -2702:2:1285 -2703:2:1289 -2704:2:1290 -2705:2:1284 -2706:2:1285 -2707:2:1289 -2708:2:1290 -2709:2:1298 -2710:2:1303 -2711:2:1307 -2712:2:1308 -2713:2:1315 -2714:2:1316 -2715:2:1327 -2716:2:1328 -2717:2:1329 -2718:2:1327 -2719:2:1328 -2720:2:1329 -2721:2:1340 -2722:2:1345 -2723:2:1346 -2724:0:4365 -2725:2:1358 -2726:0:4365 -2727:2:1360 -2728:0:4365 -2729:3:3354 -2730:0:4365 -2731:2:1361 -2732:0:4365 -2733:3:3355 -2734:0:4365 -2735:2:1362 -2736:2:1366 -2737:2:1367 -2738:2:1375 -2739:2:1376 -2740:2:1380 -2741:2:1381 -2742:2:1375 -2743:2:1376 -2744:2:1380 -2745:2:1381 -2746:2:1389 -2747:2:1394 -2748:2:1398 -2749:2:1399 -2750:2:1406 -2751:2:1407 -2752:2:1418 -2753:2:1419 -2754:2:1420 -2755:2:1418 -2756:2:1419 -2757:2:1420 -2758:2:1431 -2759:2:1436 -2760:2:1437 -2761:0:4365 -2762:2:1449 -2763:0:4365 -2764:3:3354 -2765:0:4365 -2766:2:1451 -2767:0:4365 -2768:3:3355 -2769:0:4365 -2770:2:1652 -2771:0:4365 -2772:2:1653 -2773:0:4365 -2774:2:1657 -2775:0:4365 -2776:2:1180 -2777:0:4365 -2778:3:3354 -2779:0:4365 -2780:2:1181 -2781:2:1185 -2782:2:1186 -2783:2:1194 -2784:2:1195 -2785:2:1199 -2786:2:1200 -2787:2:1194 -2788:2:1195 -2789:2:1196 -2790:2:1208 -2791:2:1213 -2792:2:1217 -2793:2:1218 -2794:2:1225 -2795:2:1226 -2796:2:1237 -2797:2:1238 -2798:2:1239 -2799:2:1237 -2800:2:1238 -2801:2:1239 -2802:2:1250 -2803:2:1255 -2804:2:1256 -2805:0:4365 -2806:3:3355 -2807:0:4365 -2808:2:1268 -2809:0:4365 -2810:3:3354 -2811:0:4365 -2812:2:1270 -2813:0:4365 -2814:3:3355 -2815:0:4365 -2816:2:1271 -2817:2:1275 -2818:2:1276 -2819:2:1284 -2820:2:1285 -2821:2:1289 -2822:2:1290 -2823:2:1284 -2824:2:1285 -2825:2:1289 -2826:2:1290 -2827:2:1298 -2828:2:1303 -2829:2:1307 -2830:2:1308 -2831:2:1315 -2832:2:1316 -2833:2:1327 -2834:2:1328 -2835:2:1329 -2836:2:1327 -2837:2:1328 -2838:2:1329 -2839:2:1340 -2840:2:1345 -2841:2:1346 -2842:0:4365 -2843:2:1358 -2844:0:4365 -2845:2:1454 -2846:0:4365 -2847:3:3354 -2848:0:4365 -2849:2:1455 -2850:0:4365 -2851:3:3355 -2852:0:4365 -2853:2:1652 -2854:0:4365 -2855:2:1653 -2856:0:4365 -2857:2:1657 -2858:0:4365 -2859:2:1660 -2860:0:4365 -2861:3:3354 -2862:0:4365 -2863:2:1665 -2864:2:1669 -2865:2:1670 -2866:2:1678 -2867:2:1679 -2868:2:1683 -2869:2:1684 -2870:2:1678 -2871:2:1679 -2872:2:1680 -2873:2:1692 -2874:2:1697 -2875:2:1701 -2876:2:1702 -2877:2:1709 -2878:2:1710 -2879:2:1721 -2880:2:1722 -2881:2:1723 -2882:2:1721 -2883:2:1722 -2884:2:1723 -2885:2:1734 -2886:2:1739 -2887:2:1740 -2888:0:4365 -2889:3:3355 -2890:0:4365 -2891:2:1752 -2892:0:4365 -2893:3:3354 -2894:0:4365 -2895:2:1754 -2896:0:4365 -2897:3:3355 -2898:0:4365 -2899:2:1755 -2900:2:1759 -2901:2:1760 -2902:2:1768 -2903:2:1769 -2904:2:1773 -2905:2:1774 -2906:2:1768 -2907:2:1769 -2908:2:1773 -2909:2:1774 -2910:2:1782 -2911:2:1787 -2912:2:1791 -2913:2:1792 -2914:2:1799 -2915:2:1800 -2916:2:1811 -2917:2:1812 -2918:2:1813 -2919:2:1811 -2920:2:1812 -2921:2:1813 -2922:2:1824 -2923:2:1829 -2924:2:1830 -2925:0:4365 -2926:2:1842 -2927:0:4365 -2928:3:3354 -2929:0:4365 -2930:2:1844 -2931:0:4365 -2932:3:3355 -2933:0:4365 -2934:2:1845 -2935:2:1849 -2936:2:1850 -2937:2:1858 -2938:2:1859 -2939:2:1863 -2940:2:1864 -2941:2:1858 -2942:2:1859 -2943:2:1863 -2944:2:1864 -2945:2:1872 -2946:2:1877 -2947:2:1881 -2948:2:1882 -2949:2:1889 -2950:2:1890 -2951:2:1901 -2952:2:1902 -2953:2:1903 -2954:2:1901 -2955:2:1902 -2956:2:1903 -2957:2:1914 -2958:2:1919 -2959:2:1920 -2960:0:4365 -2961:2:1932 -2962:0:4365 -2963:3:3354 -2964:0:4365 -2965:2:1934 -2966:0:4365 -2967:3:3355 -2968:0:4365 -2969:2:1935 -2970:0:4365 -2971:2:1936 -2972:0:4365 -2973:2:2129 -2974:0:4365 -2975:2:2130 -2976:0:4365 -2977:2:2134 -2978:0:4365 -2979:3:3354 -2980:0:4365 -2981:2:2136 -2982:0:4365 -2983:3:3355 -2984:0:4365 -2985:2:2137 -2986:2:2141 -2987:2:2142 -2988:2:2150 -2989:2:2151 -2990:2:2155 -2991:2:2156 -2992:2:2150 -2993:2:2151 -2994:2:2155 -2995:2:2156 -2996:2:2164 -2997:2:2169 -2998:2:2173 -2999:2:2174 -3000:2:2181 -3001:2:2182 -3002:2:2193 -3003:2:2194 -3004:2:2195 -3005:2:2193 -3006:2:2194 -3007:2:2195 -3008:2:2206 -3009:2:2211 -3010:2:2212 -3011:0:4365 -3012:2:2224 -3013:0:4365 -3014:3:3354 -3015:0:4365 -3016:2:2226 -3017:0:4365 -3018:3:3355 -3019:0:4365 -3020:2:1936 -3021:0:4365 -3022:2:2129 -3023:0:4365 -3024:2:2130 -3025:0:4365 -3026:2:2134 -3027:0:4365 -3028:3:3354 -3029:0:4365 -3030:2:2136 -3031:0:4365 -3032:3:3355 -3033:0:4365 -3034:2:2137 -3035:2:2141 -3036:2:2142 -3037:2:2150 -3038:2:2151 -3039:2:2155 -3040:2:2156 -3041:2:2150 -3042:2:2151 -3043:2:2152 -3044:2:2164 -3045:2:2169 -3046:2:2173 -3047:2:2174 -3048:2:2181 -3049:2:2182 -3050:2:2193 -3051:2:2194 -3052:2:2195 -3053:2:2193 -3054:2:2194 -3055:2:2195 -3056:2:2206 -3057:2:2211 -3058:2:2212 -3059:0:4365 -3060:2:2224 -3061:0:4365 -3062:3:3354 -3063:0:4365 -3064:2:2226 -3065:0:4365 -3066:3:3355 -3067:0:4365 -3068:2:2230 -3069:0:4365 -3070:3:3354 -3071:0:4365 -3072:2:2235 -3073:2:2239 -3074:2:2240 -3075:2:2248 -3076:2:2249 -3077:2:2253 -3078:2:2254 -3079:2:2248 -3080:2:2249 -3081:2:2250 -3082:2:2262 -3083:2:2267 -3084:2:2271 -3085:2:2272 -3086:2:2279 -3087:2:2280 -3088:2:2291 -3089:2:2292 -3090:2:2293 -3091:2:2291 -3092:2:2292 -3093:2:2293 -3094:2:2304 -3095:2:2309 -3096:2:2310 -3097:0:4365 -3098:3:3355 -3099:0:4365 -3100:2:2322 -3101:0:4365 -3102:2:1169 -3103:0:4365 -3104:3:3354 -3105:0:4365 -3106:2:1170 -3107:0:4365 -3108:3:3355 -3109:0:4365 -3110:3:3356 -3111:0:4365 -3112:3:3366 -3113:0:4365 -3114:3:2951 -3115:0:4365 -3116:3:2952 -3117:0:4365 -3118:3:2953 -3119:0:4365 -3120:3:2954 -3121:3:2958 -3122:3:2959 -3123:3:2967 -3124:3:2968 -3125:3:2972 -3126:3:2973 -3127:3:2967 -3128:3:2968 -3129:3:2972 -3130:3:2973 -3131:3:2981 -3132:3:2986 -3133:3:2990 -3134:3:2991 -3135:3:2998 -3136:3:2999 -3137:3:3010 -3138:3:3011 -3139:3:3012 -3140:3:3010 -3141:3:3011 -3142:3:3012 -3143:3:3023 -3144:3:3028 -3145:3:3029 -3146:0:4365 -3147:3:3041 -3148:0:4365 -3149:3:3042 -3150:0:4365 -3151:2:1173 -3152:0:4365 -3153:3:3043 -3154:0:4365 -3155:2:1179 -3156:0:4365 -3157:2:1180 -3158:0:4365 -3159:3:3042 -3160:0:4365 -3161:2:1181 -3162:2:1185 -3163:2:1186 -3164:2:1194 -3165:2:1195 -3166:2:1199 -3167:2:1200 -3168:2:1194 -3169:2:1195 -3170:2:1199 -3171:2:1200 -3172:2:1208 -3173:2:1213 -3174:2:1217 -3175:2:1218 -3176:2:1225 -3177:2:1226 -3178:2:1237 -3179:2:1238 -3180:2:1239 -3181:2:1237 -3182:2:1238 -3183:2:1239 -3184:2:1250 -3185:2:1255 -3186:2:1256 -3187:0:4365 -3188:3:3043 -3189:0:4365 -3190:2:1268 -3191:0:4365 -3192:3:3042 -3193:0:4365 -3194:2:1270 -3195:0:4365 -3196:3:3043 -3197:0:4365 -3198:2:1271 -3199:2:1275 -3200:2:1276 -3201:2:1284 -3202:2:1285 -3203:2:1289 -3204:2:1290 -3205:2:1284 -3206:2:1285 -3207:2:1289 -3208:2:1290 -3209:2:1298 -3210:2:1303 -3211:2:1307 -3212:2:1308 -3213:2:1315 -3214:2:1316 -3215:2:1327 -3216:2:1328 -3217:2:1329 -3218:2:1327 -3219:2:1328 -3220:2:1329 -3221:2:1340 -3222:2:1345 -3223:2:1346 -3224:0:4365 -3225:2:1358 -3226:0:4365 -3227:2:1360 -3228:0:4365 -3229:3:3042 -3230:0:4365 -3231:2:1361 -3232:0:4365 -3233:3:3043 -3234:0:4365 -3235:2:1362 -3236:2:1366 -3237:2:1367 -3238:2:1375 -3239:2:1376 -3240:2:1380 -3241:2:1381 -3242:2:1375 -3243:2:1376 -3244:2:1380 -3245:2:1381 -3246:2:1389 -3247:2:1394 -3248:2:1398 -3249:2:1399 -3250:2:1406 -3251:2:1407 -3252:2:1418 -3253:2:1419 -3254:2:1420 -3255:2:1418 -3256:2:1419 -3257:2:1420 -3258:2:1431 -3259:2:1436 -3260:2:1437 -3261:0:4365 -3262:2:1449 -3263:0:4365 -3264:3:3042 -3265:0:4365 -3266:2:1451 -3267:0:4365 -3268:3:3043 -3269:0:4365 -3270:2:1652 -3271:0:4365 -3272:2:1653 -3273:0:4365 -3274:2:1657 -3275:0:4365 -3276:2:1180 -3277:0:4365 -3278:3:3042 -3279:0:4365 -3280:2:1181 -3281:2:1185 -3282:2:1186 -3283:2:1194 -3284:2:1195 -3285:2:1199 -3286:2:1200 -3287:2:1194 -3288:2:1195 -3289:2:1196 -3290:2:1208 -3291:2:1213 -3292:2:1217 -3293:2:1218 -3294:2:1225 -3295:2:1226 -3296:2:1237 -3297:2:1238 -3298:2:1239 -3299:2:1237 -3300:2:1238 -3301:2:1239 -3302:2:1250 -3303:2:1255 -3304:2:1256 -3305:0:4365 -3306:3:3043 -3307:0:4365 -3308:2:1268 -3309:0:4365 -3310:3:3042 -3311:0:4365 -3312:2:1270 -3313:0:4365 -3314:3:3043 -3315:0:4365 -3316:2:1271 -3317:2:1275 -3318:2:1276 -3319:2:1284 -3320:2:1285 -3321:2:1289 -3322:2:1290 -3323:2:1284 -3324:2:1285 -3325:2:1289 -3326:2:1290 -3327:2:1298 -3328:2:1303 -3329:2:1307 -3330:2:1308 -3331:2:1315 -3332:2:1316 -3333:2:1327 -3334:2:1328 -3335:2:1329 -3336:2:1327 -3337:2:1328 -3338:2:1329 -3339:2:1340 -3340:2:1345 -3341:2:1346 -3342:0:4365 -3343:2:1358 -3344:0:4365 -3345:2:1454 -3346:0:4365 -3347:3:3042 -3348:0:4365 -3349:2:1455 -3350:0:4365 -3351:3:3043 -3352:0:4365 -3353:2:1652 -3354:0:4365 -3355:2:1653 -3356:0:4365 -3357:2:1657 -3358:0:4365 -3359:2:1660 -3360:0:4365 -3361:3:3042 -3362:0:4365 -3363:2:1665 -3364:2:1669 -3365:2:1670 -3366:2:1678 -3367:2:1679 -3368:2:1683 -3369:2:1684 -3370:2:1678 -3371:2:1679 -3372:2:1680 -3373:2:1692 -3374:2:1697 -3375:2:1701 -3376:2:1702 -3377:2:1709 -3378:2:1710 -3379:2:1721 -3380:2:1722 -3381:2:1723 -3382:2:1721 -3383:2:1722 -3384:2:1723 -3385:2:1734 -3386:2:1739 -3387:2:1740 -3388:0:4365 -3389:3:3043 -3390:0:4365 -3391:2:1752 -3392:0:4365 -3393:3:3042 -3394:0:4365 -3395:2:1754 -3396:0:4365 -3397:3:3043 -3398:0:4365 -3399:2:1755 -3400:2:1759 -3401:2:1760 -3402:2:1768 -3403:2:1769 -3404:2:1773 -3405:2:1774 -3406:2:1768 -3407:2:1769 -3408:2:1773 -3409:2:1774 -3410:2:1782 -3411:2:1787 -3412:2:1791 -3413:2:1792 -3414:2:1799 -3415:2:1800 -3416:2:1811 -3417:2:1812 -3418:2:1813 -3419:2:1811 -3420:2:1812 -3421:2:1813 -3422:2:1824 -3423:2:1829 -3424:2:1830 -3425:0:4365 -3426:2:1842 -3427:0:4365 -3428:3:3042 -3429:0:4365 -3430:2:1844 -3431:0:4365 -3432:3:3043 -3433:0:4365 -3434:2:1845 -3435:2:1849 -3436:2:1850 -3437:2:1858 -3438:2:1859 -3439:2:1863 -3440:2:1864 -3441:2:1858 -3442:2:1859 -3443:2:1863 -3444:2:1864 -3445:2:1872 -3446:2:1877 -3447:2:1881 -3448:2:1882 -3449:2:1889 -3450:2:1890 -3451:2:1901 -3452:2:1902 -3453:2:1903 -3454:2:1901 -3455:2:1902 -3456:2:1903 -3457:2:1914 -3458:2:1919 -3459:2:1920 -3460:0:4365 -3461:2:1932 -3462:0:4365 -3463:3:3042 -3464:0:4365 -3465:2:1934 -3466:0:4365 -3467:3:3043 -3468:0:4365 -3469:2:1935 -3470:0:4365 -3471:2:1936 -3472:0:4365 -3473:2:2129 -3474:0:4365 -3475:2:2130 -3476:0:4365 -3477:2:2134 -3478:0:4365 -3479:3:3042 -3480:0:4365 -3481:2:2136 -3482:0:4365 -3483:3:3043 -3484:0:4365 -3485:2:2137 -3486:2:2141 -3487:2:2142 -3488:2:2150 -3489:2:2151 -3490:2:2155 -3491:2:2156 -3492:2:2150 -3493:2:2151 -3494:2:2155 -3495:2:2156 -3496:2:2164 -3497:2:2169 -3498:2:2173 -3499:2:2174 -3500:2:2181 -3501:2:2182 -3502:2:2193 -3503:2:2194 -3504:2:2195 -3505:2:2193 -3506:2:2194 -3507:2:2195 -3508:2:2206 -3509:2:2211 -3510:2:2212 -3511:0:4365 -3512:2:2224 -3513:0:4365 -3514:3:3042 -3515:0:4365 -3516:2:2226 -3517:0:4365 -3518:3:3043 -3519:0:4365 -3520:2:1936 -3521:0:4365 -3522:2:2129 -3523:0:4365 -3524:2:2130 -3525:0:4365 -3526:2:2134 -3527:0:4365 -3528:3:3042 -3529:0:4365 -3530:2:2136 -3531:0:4365 -3532:3:3043 -3533:0:4365 -3534:2:2137 -3535:2:2141 -3536:2:2142 -3537:2:2150 -3538:2:2151 -3539:2:2155 -3540:2:2156 -3541:2:2150 -3542:2:2151 -3543:2:2152 -3544:2:2164 -3545:2:2169 -3546:2:2173 -3547:2:2174 -3548:2:2181 -3549:2:2182 -3550:2:2193 -3551:2:2194 -3552:2:2195 -3553:2:2193 -3554:2:2194 -3555:2:2195 -3556:2:2206 -3557:2:2211 -3558:2:2212 -3559:0:4365 -3560:2:2224 -3561:0:4365 -3562:3:3042 -3563:0:4365 -3564:2:2226 -3565:0:4365 -3566:3:3043 -3567:0:4365 -3568:2:2230 -3569:0:4365 -3570:3:3042 -3571:0:4365 -3572:2:2235 -3573:2:2239 -3574:2:2240 -3575:2:2248 -3576:2:2249 -3577:2:2253 -3578:2:2254 -3579:2:2248 -3580:2:2249 -3581:2:2250 -3582:2:2262 -3583:2:2267 -3584:2:2271 -3585:2:2272 -3586:2:2279 -3587:2:2280 -3588:2:2291 -3589:2:2292 -3590:2:2293 -3591:2:2291 -3592:2:2292 -3593:2:2293 -3594:2:2304 -3595:2:2309 -3596:2:2310 -3597:0:4365 -3598:3:3043 -3599:0:4365 -3600:2:2322 -3601:0:4365 -3602:2:1169 -3603:0:4365 -3604:3:3042 -3605:0:4365 -3606:2:1170 -3607:0:4365 -3608:3:3043 -3609:0:4365 -3610:3:3044 -3611:0:4365 -3612:3:3257 -3613:0:4365 -3614:3:3362 -3615:0:4365 -3616:3:3363 -3617:0:4365 -3618:3:3367 -3619:0:4365 -3620:3:3373 -3621:3:3377 -3622:3:3378 -3623:3:3386 -3624:3:3387 -3625:3:3391 -3626:3:3392 -3627:3:3386 -3628:3:3387 -3629:3:3391 -3630:3:3392 -3631:3:3400 -3632:3:3405 -3633:3:3409 -3634:3:3410 -3635:3:3417 -3636:3:3418 -3637:3:3429 -3638:3:3430 -3639:3:3431 -3640:3:3429 -3641:3:3430 -3642:3:3431 -3643:3:3442 -3644:3:3447 -3645:3:3448 -3646:0:4365 -3647:3:3460 -3648:0:4365 -3649:3:3461 -3650:0:4365 -3651:2:1173 -3652:0:4365 -3653:3:3462 -3654:0:4365 -3655:2:1179 -3656:0:4365 -3657:2:1180 -3658:0:4365 -3659:3:3461 -3660:0:4365 -3661:2:1181 -3662:2:1185 -3663:2:1186 -3664:2:1194 -3665:2:1195 -3666:2:1199 -3667:2:1200 -3668:2:1194 -3669:2:1195 -3670:2:1199 -3671:2:1200 -3672:2:1208 -3673:2:1213 -3674:2:1217 -3675:2:1218 -3676:2:1225 -3677:2:1226 -3678:2:1237 -3679:2:1238 -3680:2:1239 -3681:2:1237 -3682:2:1238 -3683:2:1239 -3684:2:1250 -3685:2:1255 -3686:2:1256 -3687:0:4365 -3688:3:3462 -3689:0:4365 -3690:2:1268 -3691:0:4365 -3692:3:3461 -3693:0:4365 -3694:2:1270 -3695:0:4365 -3696:3:3462 -3697:0:4365 -3698:2:1271 -3699:2:1275 -3700:2:1276 -3701:2:1284 -3702:2:1285 -3703:2:1289 -3704:2:1290 -3705:2:1284 -3706:2:1285 -3707:2:1289 -3708:2:1290 -3709:2:1298 -3710:2:1303 -3711:2:1307 -3712:2:1308 -3713:2:1315 -3714:2:1316 -3715:2:1327 -3716:2:1328 -3717:2:1329 -3718:2:1327 -3719:2:1328 -3720:2:1329 -3721:2:1340 -3722:2:1345 -3723:2:1346 -3724:0:4365 -3725:2:1358 -3726:0:4365 -3727:2:1360 -3728:0:4365 -3729:3:3461 -3730:0:4365 -3731:2:1361 -3732:0:4365 -3733:3:3462 -3734:0:4365 -3735:2:1362 -3736:2:1366 -3737:2:1367 -3738:2:1375 -3739:2:1376 -3740:2:1380 -3741:2:1381 -3742:2:1375 -3743:2:1376 -3744:2:1380 -3745:2:1381 -3746:2:1389 -3747:2:1394 -3748:2:1398 -3749:2:1399 -3750:2:1406 -3751:2:1407 -3752:2:1418 -3753:2:1419 -3754:2:1420 -3755:2:1418 -3756:2:1419 -3757:2:1420 -3758:2:1431 -3759:2:1436 -3760:2:1437 -3761:0:4365 -3762:2:1449 -3763:0:4365 -3764:3:3461 -3765:0:4365 -3766:2:1451 -3767:0:4365 -3768:3:3462 -3769:0:4365 -3770:2:1652 -3771:0:4365 -3772:2:1653 -3773:0:4365 -3774:2:1657 -3775:0:4365 -3776:2:1180 -3777:0:4365 -3778:3:3461 -3779:0:4365 -3780:2:1181 -3781:2:1185 -3782:2:1186 -3783:2:1194 -3784:2:1195 -3785:2:1199 -3786:2:1200 -3787:2:1194 -3788:2:1195 -3789:2:1196 -3790:2:1208 -3791:2:1213 -3792:2:1217 -3793:2:1218 -3794:2:1225 -3795:2:1226 -3796:2:1237 -3797:2:1238 -3798:2:1239 -3799:2:1237 -3800:2:1238 -3801:2:1239 -3802:2:1250 -3803:2:1255 -3804:2:1256 -3805:0:4365 -3806:3:3462 -3807:0:4365 -3808:2:1268 -3809:0:4365 -3810:3:3461 -3811:0:4365 -3812:2:1270 -3813:0:4365 -3814:3:3462 -3815:0:4365 -3816:2:1271 -3817:2:1275 -3818:2:1276 -3819:2:1284 -3820:2:1285 -3821:2:1289 -3822:2:1290 -3823:2:1284 -3824:2:1285 -3825:2:1289 -3826:2:1290 -3827:2:1298 -3828:2:1303 -3829:2:1307 -3830:2:1308 -3831:2:1315 -3832:2:1316 -3833:2:1327 -3834:2:1328 -3835:2:1329 -3836:2:1327 -3837:2:1328 -3838:2:1329 -3839:2:1340 -3840:2:1345 -3841:2:1346 -3842:0:4365 -3843:2:1358 -3844:0:4365 -3845:2:1454 -3846:0:4365 -3847:3:3461 -3848:0:4365 -3849:2:1455 -3850:0:4365 -3851:3:3462 -3852:0:4365 -3853:2:1652 -3854:0:4365 -3855:2:1653 -3856:0:4365 -3857:2:1657 -3858:0:4365 -3859:2:1660 -3860:0:4365 -3861:3:3461 -3862:0:4365 -3863:2:1665 -3864:2:1669 -3865:2:1670 -3866:2:1678 -3867:2:1679 -3868:2:1683 -3869:2:1684 -3870:2:1678 -3871:2:1679 -3872:2:1680 -3873:2:1692 -3874:2:1697 -3875:2:1701 -3876:2:1702 -3877:2:1709 -3878:2:1710 -3879:2:1721 -3880:2:1722 -3881:2:1723 -3882:2:1721 -3883:2:1722 -3884:2:1723 -3885:2:1734 -3886:2:1739 -3887:2:1740 -3888:0:4365 -3889:3:3462 -3890:0:4365 -3891:2:1752 -3892:0:4365 -3893:3:3461 -3894:0:4365 -3895:2:1754 -3896:0:4365 -3897:3:3462 -3898:0:4365 -3899:2:1755 -3900:2:1759 -3901:2:1760 -3902:2:1768 -3903:2:1769 -3904:2:1773 -3905:2:1774 -3906:2:1768 -3907:2:1769 -3908:2:1773 -3909:2:1774 -3910:2:1782 -3911:2:1787 -3912:2:1791 -3913:2:1792 -3914:2:1799 -3915:2:1800 -3916:2:1811 -3917:2:1812 -3918:2:1813 -3919:2:1811 -3920:2:1812 -3921:2:1813 -3922:2:1824 -3923:2:1829 -3924:2:1830 -3925:0:4365 -3926:2:1842 -3927:0:4365 -3928:3:3461 -3929:0:4365 -3930:2:1844 -3931:0:4365 -3932:3:3462 -3933:0:4365 -3934:2:1845 -3935:2:1849 -3936:2:1850 -3937:2:1858 -3938:2:1859 -3939:2:1863 -3940:2:1864 -3941:2:1858 -3942:2:1859 -3943:2:1863 -3944:2:1864 -3945:2:1872 -3946:2:1877 -3947:2:1881 -3948:2:1882 -3949:2:1889 -3950:2:1890 -3951:2:1901 -3952:2:1902 -3953:2:1903 -3954:2:1901 -3955:2:1902 -3956:2:1903 -3957:2:1914 -3958:2:1919 -3959:2:1920 -3960:0:4365 -3961:2:1932 -3962:0:4365 -3963:3:3461 -3964:0:4365 -3965:2:1934 -3966:0:4365 -3967:3:3462 -3968:0:4365 -3969:2:1935 -3970:0:4365 -3971:2:1936 -3972:0:4365 -3973:2:2129 -3974:0:4365 -3975:2:2130 -3976:0:4365 -3977:2:2134 -3978:0:4365 -3979:3:3461 -3980:0:4365 -3981:2:2136 -3982:0:4365 -3983:3:3462 -3984:0:4365 -3985:2:2137 -3986:2:2141 -3987:2:2142 -3988:2:2150 -3989:2:2151 -3990:2:2155 -3991:2:2156 -3992:2:2150 -3993:2:2151 -3994:2:2155 -3995:2:2156 -3996:2:2164 -3997:2:2169 -3998:2:2173 -3999:2:2174 -4000:2:2181 -4001:2:2182 -4002:2:2193 -4003:2:2194 -4004:2:2195 -4005:2:2193 -4006:2:2194 -4007:2:2195 -4008:2:2206 -4009:2:2211 -4010:2:2212 -4011:0:4365 -4012:2:2224 -4013:0:4365 -4014:3:3461 -4015:0:4365 -4016:2:2226 -4017:0:4365 -4018:3:3462 -4019:0:4365 -4020:2:1936 -4021:0:4365 -4022:2:2129 -4023:0:4365 -4024:2:2130 -4025:0:4365 -4026:2:2134 -4027:0:4365 -4028:3:3461 -4029:0:4365 -4030:2:2136 -4031:0:4365 -4032:3:3462 -4033:0:4365 -4034:2:2137 -4035:2:2141 -4036:2:2142 -4037:2:2150 -4038:2:2151 -4039:2:2155 -4040:2:2156 -4041:2:2150 -4042:2:2151 -4043:2:2152 -4044:2:2164 -4045:2:2169 -4046:2:2173 -4047:2:2174 -4048:2:2181 -4049:2:2182 -4050:2:2193 -4051:2:2194 -4052:2:2195 -4053:2:2193 -4054:2:2194 -4055:2:2195 -4056:2:2206 -4057:2:2211 -4058:2:2212 -4059:0:4365 -4060:2:2224 -4061:0:4365 -4062:3:3461 -4063:0:4365 -4064:2:2226 -4065:0:4365 -4066:3:3462 -4067:0:4365 -4068:2:2230 -4069:0:4365 -4070:3:3461 -4071:0:4365 -4072:2:2235 -4073:2:2239 -4074:2:2240 -4075:2:2248 -4076:2:2249 -4077:2:2253 -4078:2:2254 -4079:2:2248 -4080:2:2249 -4081:2:2250 -4082:2:2262 -4083:2:2267 -4084:2:2271 -4085:2:2272 -4086:2:2279 -4087:2:2280 -4088:2:2291 -4089:2:2292 -4090:2:2293 -4091:2:2291 -4092:2:2292 -4093:2:2293 -4094:2:2304 -4095:2:2309 -4096:2:2310 -4097:0:4365 -4098:3:3462 -4099:0:4365 -4100:2:2322 -4101:0:4365 -4102:2:1169 -4103:0:4365 -4104:3:3461 -4105:0:4365 -4106:2:1170 -4107:0:4365 -4108:3:3462 -4109:0:4365 -4110:3:3463 -4111:0:4365 -4112:3:3469 -4113:0:4365 -4114:3:3470 -4115:3:3474 -4116:3:3475 -4117:3:3483 -4118:3:3484 -4119:3:3488 -4120:3:3489 -4121:3:3483 -4122:3:3484 -4123:3:3488 -4124:3:3489 -4125:3:3497 -4126:3:3502 -4127:3:3506 -4128:3:3507 -4129:3:3514 -4130:3:3515 -4131:3:3526 -4132:3:3527 -4133:3:3528 -4134:3:3526 -4135:3:3527 -4136:3:3528 -4137:3:3539 -4138:3:3544 -4139:3:3545 -4140:0:4365 -4141:3:3557 -4142:0:4365 -4143:3:3558 -4144:0:4365 -4145:2:1173 -4146:0:4365 -4147:3:3559 -4148:0:4365 -4149:2:1179 -4150:0:4365 -4151:2:1180 -4152:0:4365 -4153:3:3558 -4154:0:4365 -4155:2:1181 -4156:2:1185 -4157:2:1186 -4158:2:1194 -4159:2:1195 -4160:2:1199 -4161:2:1200 -4162:2:1194 -4163:2:1195 -4164:2:1199 -4165:2:1200 -4166:2:1208 -4167:2:1213 -4168:2:1217 -4169:2:1218 -4170:2:1225 -4171:2:1226 -4172:2:1237 -4173:2:1238 -4174:2:1239 -4175:2:1237 -4176:2:1238 -4177:2:1239 -4178:2:1250 -4179:2:1255 -4180:2:1256 -4181:0:4365 -4182:3:3559 -4183:0:4365 -4184:2:1268 -4185:0:4365 -4186:3:3558 -4187:0:4365 -4188:2:1270 -4189:0:4365 -4190:3:3559 -4191:0:4365 -4192:2:1271 -4193:2:1275 -4194:2:1276 -4195:2:1284 -4196:2:1285 -4197:2:1289 -4198:2:1290 -4199:2:1284 -4200:2:1285 -4201:2:1289 -4202:2:1290 -4203:2:1298 -4204:2:1303 -4205:2:1307 -4206:2:1308 -4207:2:1315 -4208:2:1316 -4209:2:1327 -4210:2:1328 -4211:2:1329 -4212:2:1327 -4213:2:1328 -4214:2:1329 -4215:2:1340 -4216:2:1345 -4217:2:1346 -4218:0:4365 -4219:2:1358 -4220:0:4365 -4221:2:1360 -4222:0:4365 -4223:3:3558 -4224:0:4365 -4225:2:1361 -4226:0:4365 -4227:3:3559 -4228:0:4365 -4229:2:1362 -4230:2:1366 -4231:2:1367 -4232:2:1375 -4233:2:1376 -4234:2:1380 -4235:2:1381 -4236:2:1375 -4237:2:1376 -4238:2:1380 -4239:2:1381 -4240:2:1389 -4241:2:1394 -4242:2:1398 -4243:2:1399 -4244:2:1406 -4245:2:1407 -4246:2:1418 -4247:2:1419 -4248:2:1420 -4249:2:1418 -4250:2:1419 -4251:2:1420 -4252:2:1431 -4253:2:1436 -4254:2:1437 -4255:0:4365 -4256:2:1449 -4257:0:4365 -4258:3:3558 -4259:0:4365 -4260:2:1451 -4261:0:4365 -4262:3:3559 -4263:0:4365 -4264:2:1652 -4265:0:4365 -4266:2:1653 -4267:0:4365 -4268:2:1657 -4269:0:4365 -4270:2:1180 -4271:0:4365 -4272:3:3558 -4273:0:4365 -4274:2:1181 -4275:2:1185 -4276:2:1186 -4277:2:1194 -4278:2:1195 -4279:2:1199 -4280:2:1200 -4281:2:1194 -4282:2:1195 -4283:2:1196 -4284:2:1208 -4285:2:1213 -4286:2:1217 -4287:2:1218 -4288:2:1225 -4289:2:1226 -4290:2:1237 -4291:2:1238 -4292:2:1239 -4293:2:1237 -4294:2:1238 -4295:2:1239 -4296:2:1250 -4297:2:1255 -4298:2:1256 -4299:0:4365 -4300:3:3559 -4301:0:4365 -4302:2:1268 -4303:0:4365 -4304:3:3558 -4305:0:4365 -4306:2:1270 -4307:0:4365 -4308:3:3559 -4309:0:4365 -4310:2:1271 -4311:2:1275 -4312:2:1276 -4313:2:1284 -4314:2:1285 -4315:2:1289 -4316:2:1290 -4317:2:1284 -4318:2:1285 -4319:2:1289 -4320:2:1290 -4321:2:1298 -4322:2:1303 -4323:2:1307 -4324:2:1308 -4325:2:1315 -4326:2:1316 -4327:2:1327 -4328:2:1328 -4329:2:1329 -4330:2:1327 -4331:2:1328 -4332:2:1329 -4333:2:1340 -4334:2:1345 -4335:2:1346 -4336:0:4365 -4337:2:1358 -4338:0:4365 -4339:2:1454 -4340:0:4365 -4341:3:3558 -4342:0:4365 -4343:2:1455 -4344:0:4365 -4345:3:3559 -4346:0:4365 -4347:2:1652 -4348:0:4365 -4349:2:1653 -4350:0:4365 -4351:2:1657 -4352:0:4365 -4353:2:1660 -4354:0:4365 -4355:3:3558 -4356:0:4365 -4357:2:1665 -4358:2:1669 -4359:2:1670 -4360:2:1678 -4361:2:1679 -4362:2:1683 -4363:2:1684 -4364:2:1678 -4365:2:1679 -4366:2:1680 -4367:2:1692 -4368:2:1697 -4369:2:1701 -4370:2:1702 -4371:2:1709 -4372:2:1710 -4373:2:1721 -4374:2:1722 -4375:2:1723 -4376:2:1721 -4377:2:1722 -4378:2:1723 -4379:2:1734 -4380:2:1739 -4381:2:1740 -4382:0:4365 -4383:3:3559 -4384:0:4365 -4385:2:1752 -4386:0:4365 -4387:3:3558 -4388:0:4365 -4389:2:1754 -4390:0:4365 -4391:3:3559 -4392:0:4365 -4393:2:1755 -4394:2:1759 -4395:2:1760 -4396:2:1768 -4397:2:1769 -4398:2:1773 -4399:2:1774 -4400:2:1768 -4401:2:1769 -4402:2:1773 -4403:2:1774 -4404:2:1782 -4405:2:1787 -4406:2:1791 -4407:2:1792 -4408:2:1799 -4409:2:1800 -4410:2:1811 -4411:2:1812 -4412:2:1813 -4413:2:1811 -4414:2:1812 -4415:2:1813 -4416:2:1824 -4417:2:1829 -4418:2:1830 -4419:0:4365 -4420:2:1842 -4421:0:4365 -4422:3:3558 -4423:0:4365 -4424:2:1844 -4425:0:4365 -4426:3:3559 -4427:0:4365 -4428:2:1845 -4429:2:1849 -4430:2:1850 -4431:2:1858 -4432:2:1859 -4433:2:1863 -4434:2:1864 -4435:2:1858 -4436:2:1859 -4437:2:1863 -4438:2:1864 -4439:2:1872 -4440:2:1877 -4441:2:1881 -4442:2:1882 -4443:2:1889 -4444:2:1890 -4445:2:1901 -4446:2:1902 -4447:2:1903 -4448:2:1901 -4449:2:1902 -4450:2:1903 -4451:2:1914 -4452:2:1919 -4453:2:1920 -4454:0:4365 -4455:2:1932 -4456:0:4365 -4457:3:3558 -4458:0:4365 -4459:2:1934 -4460:0:4365 -4461:3:3559 -4462:0:4365 -4463:2:1935 -4464:0:4365 -4465:2:1936 -4466:0:4365 -4467:2:2129 -4468:0:4365 -4469:2:2130 -4470:0:4365 -4471:2:2134 -4472:0:4365 -4473:3:3558 -4474:0:4365 -4475:2:2136 -4476:0:4365 -4477:3:3559 -4478:0:4365 -4479:2:2137 -4480:2:2141 -4481:2:2142 -4482:2:2150 -4483:2:2151 -4484:2:2155 -4485:2:2156 -4486:2:2150 -4487:2:2151 -4488:2:2155 -4489:2:2156 -4490:2:2164 -4491:2:2169 -4492:2:2173 -4493:2:2174 -4494:2:2181 -4495:2:2182 -4496:2:2193 -4497:2:2194 -4498:2:2195 -4499:2:2193 -4500:2:2194 -4501:2:2195 -4502:2:2206 -4503:2:2211 -4504:2:2212 -4505:0:4365 -4506:2:2224 -4507:0:4365 -4508:3:3558 -4509:0:4365 -4510:2:2226 -4511:0:4365 -4512:3:3559 -4513:0:4365 -4514:2:1936 -4515:0:4365 -4516:2:2129 -4517:0:4365 -4518:2:2130 -4519:0:4365 -4520:2:2134 -4521:0:4365 -4522:3:3558 -4523:0:4365 -4524:2:2136 -4525:0:4365 -4526:3:3559 -4527:0:4365 -4528:2:2137 -4529:2:2141 -4530:2:2142 -4531:2:2150 -4532:2:2151 -4533:2:2155 -4534:2:2156 -4535:2:2150 -4536:2:2151 -4537:2:2152 -4538:2:2164 -4539:2:2169 -4540:2:2173 -4541:2:2174 -4542:2:2181 -4543:2:2182 -4544:2:2193 -4545:2:2194 -4546:2:2195 -4547:2:2193 -4548:2:2194 -4549:2:2195 -4550:2:2206 -4551:2:2211 -4552:2:2212 -4553:0:4365 -4554:2:2224 -4555:0:4365 -4556:3:3558 -4557:0:4365 -4558:2:2226 -4559:0:4365 -4560:3:3559 -4561:0:4365 -4562:2:2230 -4563:0:4365 -4564:3:3558 -4565:0:4365 -4566:2:2235 -4567:2:2239 -4568:2:2240 -4569:2:2248 -4570:2:2249 -4571:2:2253 -4572:2:2254 -4573:2:2248 -4574:2:2249 -4575:2:2250 -4576:2:2262 -4577:2:2267 -4578:2:2271 -4579:2:2272 -4580:2:2279 -4581:2:2280 -4582:2:2291 -4583:2:2292 -4584:2:2293 -4585:2:2291 -4586:2:2292 -4587:2:2293 -4588:2:2304 -4589:2:2309 -4590:2:2310 -4591:0:4365 -4592:3:3559 -4593:0:4365 -4594:2:2322 -4595:0:4365 -4596:2:1169 -4597:0:4365 -4598:3:3558 -4599:0:4365 -4600:2:1170 -4601:0:4365 -4602:3:3559 -4603:0:4365 -4604:3:3560 -4605:0:4365 -4606:3:3566 -4607:0:4365 -4608:3:3569 -4609:3:3570 -4610:3:3582 -4611:3:3583 -4612:3:3587 -4613:3:3588 -4614:3:3582 -4615:3:3583 -4616:3:3587 -4617:3:3588 -4618:3:3596 -4619:3:3601 -4620:3:3605 -4621:3:3606 -4622:3:3613 -4623:3:3614 -4624:3:3625 -4625:3:3626 -4626:3:3627 -4627:3:3625 -4628:3:3626 -4629:3:3627 -4630:3:3638 -4631:3:3643 -4632:3:3644 -4633:0:4365 -4634:3:3656 -4635:0:4365 -4636:3:3657 -4637:0:4365 -4638:2:1173 -4639:0:4365 -4640:3:3658 -4641:0:4365 -4642:2:1179 -4643:0:4365 -4644:2:1180 -4645:0:4365 -4646:3:3657 -4647:0:4365 -4648:2:1181 -4649:2:1185 -4650:2:1186 -4651:2:1194 -4652:2:1195 -4653:2:1199 -4654:2:1200 -4655:2:1194 -4656:2:1195 -4657:2:1199 -4658:2:1200 -4659:2:1208 -4660:2:1213 -4661:2:1217 -4662:2:1218 -4663:2:1225 -4664:2:1226 -4665:2:1237 -4666:2:1238 -4667:2:1239 -4668:2:1237 -4669:2:1238 -4670:2:1239 -4671:2:1250 -4672:2:1255 -4673:2:1256 -4674:0:4365 -4675:3:3658 -4676:0:4365 -4677:2:1268 -4678:0:4365 -4679:3:3657 -4680:0:4365 -4681:2:1270 -4682:0:4365 -4683:3:3658 -4684:0:4365 -4685:2:1271 -4686:2:1275 -4687:2:1276 -4688:2:1284 -4689:2:1285 -4690:2:1289 -4691:2:1290 -4692:2:1284 -4693:2:1285 -4694:2:1289 -4695:2:1290 -4696:2:1298 -4697:2:1303 -4698:2:1307 -4699:2:1308 -4700:2:1315 -4701:2:1316 -4702:2:1327 -4703:2:1328 -4704:2:1329 -4705:2:1327 -4706:2:1328 -4707:2:1329 -4708:2:1340 -4709:2:1345 -4710:2:1346 -4711:0:4365 -4712:2:1358 -4713:0:4365 -4714:2:1360 -4715:0:4365 -4716:3:3657 -4717:0:4365 -4718:2:1361 -4719:0:4365 -4720:3:3658 -4721:0:4365 -4722:2:1362 -4723:2:1366 -4724:2:1367 -4725:2:1375 -4726:2:1376 -4727:2:1380 -4728:2:1381 -4729:2:1375 -4730:2:1376 -4731:2:1380 -4732:2:1381 -4733:2:1389 -4734:2:1394 -4735:2:1398 -4736:2:1399 -4737:2:1406 -4738:2:1407 -4739:2:1418 -4740:2:1419 -4741:2:1420 -4742:2:1418 -4743:2:1419 -4744:2:1420 -4745:2:1431 -4746:2:1436 -4747:2:1437 -4748:0:4365 -4749:2:1449 -4750:0:4365 -4751:3:3657 -4752:0:4365 -4753:2:1451 -4754:0:4365 -4755:3:3658 -4756:0:4365 -4757:2:1652 -4758:0:4365 -4759:2:1653 -4760:0:4365 -4761:2:1657 -4762:0:4365 -4763:2:1180 -4764:0:4365 -4765:3:3657 -4766:0:4365 -4767:2:1181 -4768:2:1185 -4769:2:1186 -4770:2:1194 -4771:2:1195 -4772:2:1199 -4773:2:1200 -4774:2:1194 -4775:2:1195 -4776:2:1196 -4777:2:1208 -4778:2:1213 -4779:2:1217 -4780:2:1218 -4781:2:1225 -4782:2:1226 -4783:2:1237 -4784:2:1238 -4785:2:1239 -4786:2:1237 -4787:2:1238 -4788:2:1239 -4789:2:1250 -4790:2:1255 -4791:2:1256 -4792:0:4365 -4793:3:3658 -4794:0:4365 -4795:2:1268 -4796:0:4365 -4797:3:3657 -4798:0:4365 -4799:2:1270 -4800:0:4365 -4801:3:3658 -4802:0:4365 -4803:2:1271 -4804:2:1275 -4805:2:1276 -4806:2:1284 -4807:2:1285 -4808:2:1289 -4809:2:1290 -4810:2:1284 -4811:2:1285 -4812:2:1289 -4813:2:1290 -4814:2:1298 -4815:2:1303 -4816:2:1307 -4817:2:1308 -4818:2:1315 -4819:2:1316 -4820:2:1327 -4821:2:1328 -4822:2:1329 -4823:2:1327 -4824:2:1328 -4825:2:1329 -4826:2:1340 -4827:2:1345 -4828:2:1346 -4829:0:4365 -4830:2:1358 -4831:0:4365 -4832:2:1454 -4833:0:4365 -4834:3:3657 -4835:0:4365 -4836:2:1455 -4837:0:4365 -4838:3:3658 -4839:0:4365 -4840:2:1652 -4841:0:4365 -4842:2:1653 -4843:0:4365 -4844:2:1657 -4845:0:4365 -4846:2:1660 -4847:0:4365 -4848:3:3657 -4849:0:4365 -4850:2:1665 -4851:2:1669 -4852:2:1670 -4853:2:1678 -4854:2:1679 -4855:2:1683 -4856:2:1684 -4857:2:1678 -4858:2:1679 -4859:2:1680 -4860:2:1692 -4861:2:1697 -4862:2:1701 -4863:2:1702 -4864:2:1709 -4865:2:1710 -4866:2:1721 -4867:2:1722 -4868:2:1723 -4869:2:1721 -4870:2:1722 -4871:2:1723 -4872:2:1734 -4873:2:1739 -4874:2:1740 -4875:0:4365 -4876:3:3658 -4877:0:4365 -4878:2:1752 -4879:0:4365 -4880:3:3657 -4881:0:4365 -4882:2:1754 -4883:0:4365 -4884:3:3658 -4885:0:4365 -4886:2:1755 -4887:2:1759 -4888:2:1760 -4889:2:1768 -4890:2:1769 -4891:2:1773 -4892:2:1774 -4893:2:1768 -4894:2:1769 -4895:2:1773 -4896:2:1774 -4897:2:1782 -4898:2:1787 -4899:2:1791 -4900:2:1792 -4901:2:1799 -4902:2:1800 -4903:2:1811 -4904:2:1812 -4905:2:1813 -4906:2:1811 -4907:2:1812 -4908:2:1813 -4909:2:1824 -4910:2:1829 -4911:2:1830 -4912:0:4365 -4913:2:1842 -4914:0:4365 -4915:3:3657 -4916:0:4365 -4917:2:1844 -4918:0:4365 -4919:3:3658 -4920:0:4365 -4921:2:1845 -4922:2:1849 -4923:2:1850 -4924:2:1858 -4925:2:1859 -4926:2:1863 -4927:2:1864 -4928:2:1858 -4929:2:1859 -4930:2:1863 -4931:2:1864 -4932:2:1872 -4933:2:1877 -4934:2:1881 -4935:2:1882 -4936:2:1889 -4937:2:1890 -4938:2:1901 -4939:2:1902 -4940:2:1903 -4941:2:1901 -4942:2:1902 -4943:2:1903 -4944:2:1914 -4945:2:1919 -4946:2:1920 -4947:0:4365 -4948:2:1932 -4949:0:4365 -4950:3:3657 -4951:0:4365 -4952:2:1934 -4953:0:4365 -4954:3:3658 -4955:0:4365 -4956:2:1935 -4957:0:4365 -4958:2:1936 -4959:0:4365 -4960:2:2129 -4961:0:4365 -4962:2:2130 -4963:0:4365 -4964:2:2134 -4965:0:4365 -4966:3:3657 -4967:0:4365 -4968:2:2136 -4969:0:4365 -4970:3:3658 -4971:0:4365 -4972:2:2137 -4973:2:2141 -4974:2:2142 -4975:2:2150 -4976:2:2151 -4977:2:2155 -4978:2:2156 -4979:2:2150 -4980:2:2151 -4981:2:2155 -4982:2:2156 -4983:2:2164 -4984:2:2169 -4985:2:2173 -4986:2:2174 -4987:2:2181 -4988:2:2182 -4989:2:2193 -4990:2:2194 -4991:2:2195 -4992:2:2193 -4993:2:2194 -4994:2:2195 -4995:2:2206 -4996:2:2211 -4997:2:2212 -4998:0:4365 -4999:2:2224 -5000:0:4365 -5001:3:3657 -5002:0:4365 -5003:2:2226 -5004:0:4365 -5005:3:3658 -5006:0:4365 -5007:2:1936 -5008:0:4365 -5009:2:2129 -5010:0:4365 -5011:2:2130 -5012:0:4365 -5013:2:2134 -5014:0:4365 -5015:3:3657 -5016:0:4365 -5017:2:2136 -5018:0:4365 -5019:3:3658 -5020:0:4365 -5021:2:2137 -5022:2:2141 -5023:2:2142 -5024:2:2150 -5025:2:2151 -5026:2:2155 -5027:2:2156 -5028:2:2150 -5029:2:2151 -5030:2:2152 -5031:2:2164 -5032:2:2169 -5033:2:2173 -5034:2:2174 -5035:2:2181 -5036:2:2182 -5037:2:2193 -5038:2:2194 -5039:2:2195 -5040:2:2193 -5041:2:2194 -5042:2:2195 -5043:2:2206 -5044:2:2211 -5045:2:2212 -5046:0:4365 -5047:2:2224 -5048:0:4365 -5049:3:3657 -5050:0:4365 -5051:2:2226 -5052:0:4365 -5053:3:3658 -5054:0:4365 -5055:2:2230 -5056:0:4365 -5057:3:3657 -5058:0:4365 -5059:2:2235 -5060:2:2239 -5061:2:2240 -5062:2:2248 -5063:2:2249 -5064:2:2253 -5065:2:2254 -5066:2:2248 -5067:2:2249 -5068:2:2250 -5069:2:2262 -5070:2:2267 -5071:2:2271 -5072:2:2272 -5073:2:2279 -5074:2:2280 -5075:2:2291 -5076:2:2292 -5077:2:2293 -5078:2:2291 -5079:2:2292 -5080:2:2293 -5081:2:2304 -5082:2:2309 -5083:2:2310 -5084:0:4365 -5085:3:3658 -5086:0:4365 -5087:2:2322 -5088:0:4365 -5089:2:1169 -5090:0:4365 -5091:3:3657 -5092:0:4365 -5093:2:1170 -5094:0:4365 -5095:3:3658 -5096:0:4365 -5097:3:3659 -5098:0:4365 -5099:3:3665 -5100:0:4365 -5101:3:3666 -5102:0:4365 -5103:3:3667 -5104:0:4365 -5105:3:3668 -5106:0:4365 -5107:3:3669 -5108:3:3673 -5109:3:3674 -5110:3:3682 -5111:3:3683 -5112:3:3687 -5113:3:3688 -5114:3:3682 -5115:3:3683 -5116:3:3687 -5117:3:3688 -5118:3:3696 -5119:3:3701 -5120:3:3705 -5121:3:3706 -5122:3:3713 -5123:3:3714 -5124:3:3725 -5125:3:3726 -5126:3:3727 -5127:3:3725 -5128:3:3726 -5129:3:3727 -5130:3:3738 -5131:3:3743 -5132:3:3744 -5133:0:4365 -5134:3:3756 -5135:0:4365 -5136:3:3757 -5137:0:4365 -5138:2:1173 -5139:0:4365 -5140:3:3758 -5141:0:4365 -5142:2:1179 -5143:0:4365 -5144:2:1180 -5145:0:4365 -5146:3:3757 -5147:0:4365 -5148:2:1181 -5149:2:1185 -5150:2:1186 -5151:2:1194 -5152:2:1195 -5153:2:1199 -5154:2:1200 -5155:2:1194 -5156:2:1195 -5157:2:1199 -5158:2:1200 -5159:2:1208 -5160:2:1213 -5161:2:1217 -5162:2:1218 -5163:2:1225 -5164:2:1226 -5165:2:1237 -5166:2:1238 -5167:2:1239 -5168:2:1237 -5169:2:1238 -5170:2:1239 -5171:2:1250 -5172:2:1255 -5173:2:1256 -5174:0:4365 -5175:3:3758 -5176:0:4365 -5177:2:1268 -5178:0:4365 -5179:3:3757 -5180:0:4365 -5181:2:1270 -5182:0:4365 -5183:3:3758 -5184:0:4365 -5185:2:1271 -5186:2:1275 -5187:2:1276 -5188:2:1284 -5189:2:1285 -5190:2:1289 -5191:2:1290 -5192:2:1284 -5193:2:1285 -5194:2:1289 -5195:2:1290 -5196:2:1298 -5197:2:1303 -5198:2:1307 -5199:2:1308 -5200:2:1315 -5201:2:1316 -5202:2:1327 -5203:2:1328 -5204:2:1329 -5205:2:1327 -5206:2:1328 -5207:2:1329 -5208:2:1340 -5209:2:1345 -5210:2:1346 -5211:0:4365 -5212:2:1358 -5213:0:4365 -5214:2:1360 -5215:0:4365 -5216:3:3757 -5217:0:4365 -5218:2:1361 -5219:0:4365 -5220:3:3758 -5221:0:4365 -5222:2:1362 -5223:2:1366 -5224:2:1367 -5225:2:1375 -5226:2:1376 -5227:2:1380 -5228:2:1381 -5229:2:1375 -5230:2:1376 -5231:2:1380 -5232:2:1381 -5233:2:1389 -5234:2:1394 -5235:2:1398 -5236:2:1399 -5237:2:1406 -5238:2:1407 -5239:2:1418 -5240:2:1419 -5241:2:1420 -5242:2:1418 -5243:2:1419 -5244:2:1420 -5245:2:1431 -5246:2:1436 -5247:2:1437 -5248:0:4365 -5249:2:1449 -5250:0:4365 -5251:3:3757 -5252:0:4365 -5253:2:1451 -5254:0:4365 -5255:3:3758 -5256:0:4365 -5257:2:1652 -5258:0:4365 -5259:2:1653 -5260:0:4365 -5261:2:1657 -5262:0:4365 -5263:2:1180 -5264:0:4365 -5265:3:3757 -5266:0:4365 -5267:2:1181 -5268:2:1185 -5269:2:1186 -5270:2:1194 -5271:2:1195 -5272:2:1199 -5273:2:1200 -5274:2:1194 -5275:2:1195 -5276:2:1196 -5277:2:1208 -5278:2:1213 -5279:2:1217 -5280:2:1218 -5281:2:1225 -5282:2:1226 -5283:2:1237 -5284:2:1238 -5285:2:1239 -5286:2:1237 -5287:2:1238 -5288:2:1239 -5289:2:1250 -5290:2:1255 -5291:2:1256 -5292:0:4365 -5293:3:3758 -5294:0:4365 -5295:2:1268 -5296:0:4365 -5297:3:3757 -5298:0:4365 -5299:2:1270 -5300:0:4365 -5301:3:3758 -5302:0:4365 -5303:2:1271 -5304:2:1275 -5305:2:1276 -5306:2:1284 -5307:2:1285 -5308:2:1289 -5309:2:1290 -5310:2:1284 -5311:2:1285 -5312:2:1289 -5313:2:1290 -5314:2:1298 -5315:2:1303 -5316:2:1307 -5317:2:1308 -5318:2:1315 -5319:2:1316 -5320:2:1327 -5321:2:1328 -5322:2:1329 -5323:2:1327 -5324:2:1328 -5325:2:1329 -5326:2:1340 -5327:2:1345 -5328:2:1346 -5329:0:4365 -5330:2:1358 -5331:0:4365 -5332:2:1454 -5333:0:4365 -5334:3:3757 -5335:0:4365 -5336:2:1455 -5337:0:4365 -5338:3:3758 -5339:0:4365 -5340:2:1652 -5341:0:4365 -5342:2:1653 -5343:0:4365 -5344:2:1657 -5345:0:4365 -5346:2:1660 -5347:0:4365 -5348:3:3757 -5349:0:4365 -5350:2:1665 -5351:2:1669 -5352:2:1670 -5353:2:1678 -5354:2:1679 -5355:2:1683 -5356:2:1684 -5357:2:1678 -5358:2:1679 -5359:2:1680 -5360:2:1692 -5361:2:1697 -5362:2:1701 -5363:2:1702 -5364:2:1709 -5365:2:1710 -5366:2:1721 -5367:2:1722 -5368:2:1723 -5369:2:1721 -5370:2:1722 -5371:2:1723 -5372:2:1734 -5373:2:1739 -5374:2:1740 -5375:0:4365 -5376:3:3758 -5377:0:4365 -5378:2:1752 -5379:0:4365 -5380:3:3757 -5381:0:4365 -5382:2:1754 -5383:0:4365 -5384:3:3758 -5385:0:4365 -5386:2:1755 -5387:2:1759 -5388:2:1760 -5389:2:1768 -5390:2:1769 -5391:2:1773 -5392:2:1774 -5393:2:1768 -5394:2:1769 -5395:2:1773 -5396:2:1774 -5397:2:1782 -5398:2:1787 -5399:2:1791 -5400:2:1792 -5401:2:1799 -5402:2:1800 -5403:2:1811 -5404:2:1812 -5405:2:1813 -5406:2:1811 -5407:2:1812 -5408:2:1813 -5409:2:1824 -5410:2:1829 -5411:2:1830 -5412:0:4365 -5413:2:1842 -5414:0:4365 -5415:3:3757 -5416:0:4365 -5417:2:1844 -5418:0:4365 -5419:3:3758 -5420:0:4365 -5421:2:1845 -5422:2:1849 -5423:2:1850 -5424:2:1858 -5425:2:1859 -5426:2:1863 -5427:2:1864 -5428:2:1858 -5429:2:1859 -5430:2:1863 -5431:2:1864 -5432:2:1872 -5433:2:1877 -5434:2:1881 -5435:2:1882 -5436:2:1889 -5437:2:1890 -5438:2:1901 -5439:2:1902 -5440:2:1903 -5441:2:1901 -5442:2:1902 -5443:2:1903 -5444:2:1914 -5445:2:1919 -5446:2:1920 -5447:0:4365 -5448:2:1932 -5449:0:4365 -5450:3:3757 -5451:0:4365 -5452:2:1934 -5453:0:4365 -5454:3:3758 -5455:0:4365 -5456:2:1935 -5457:0:4365 -5458:2:1936 -5459:0:4365 -5460:2:2129 -5461:0:4365 -5462:2:2130 -5463:0:4365 -5464:2:2134 -5465:0:4365 -5466:3:3757 -5467:0:4365 -5468:2:2136 -5469:0:4365 -5470:3:3758 -5471:0:4365 -5472:2:2137 -5473:2:2141 -5474:2:2142 -5475:2:2150 -5476:2:2151 -5477:2:2155 -5478:2:2156 -5479:2:2150 -5480:2:2151 -5481:2:2155 -5482:2:2156 -5483:2:2164 -5484:2:2169 -5485:2:2173 -5486:2:2174 -5487:2:2181 -5488:2:2182 -5489:2:2193 -5490:2:2194 -5491:2:2195 -5492:2:2193 -5493:2:2194 -5494:2:2195 -5495:2:2206 -5496:2:2211 -5497:2:2212 -5498:0:4365 -5499:2:2224 -5500:0:4365 -5501:3:3757 -5502:0:4365 -5503:2:2226 -5504:0:4365 -5505:3:3758 -5506:0:4365 -5507:2:1936 -5508:0:4365 -5509:2:2129 -5510:0:4365 -5511:2:2130 -5512:0:4365 -5513:2:2134 -5514:0:4365 -5515:3:3757 -5516:0:4365 -5517:2:2136 -5518:0:4365 -5519:3:3758 -5520:0:4365 -5521:2:2137 -5522:2:2141 -5523:2:2142 -5524:2:2150 -5525:2:2151 -5526:2:2155 -5527:2:2156 -5528:2:2150 -5529:2:2151 -5530:2:2152 -5531:2:2164 -5532:2:2169 -5533:2:2173 -5534:2:2174 -5535:2:2181 -5536:2:2182 -5537:2:2193 -5538:2:2194 -5539:2:2195 -5540:2:2193 -5541:2:2194 -5542:2:2195 -5543:2:2206 -5544:2:2211 -5545:2:2212 -5546:0:4365 -5547:2:2224 -5548:0:4365 -5549:3:3757 -5550:0:4365 -5551:2:2226 -5552:0:4365 -5553:3:3758 -5554:0:4365 -5555:2:2230 -5556:0:4365 -5557:3:3757 -5558:0:4365 -5559:2:2235 -5560:2:2239 -5561:2:2240 -5562:2:2248 -5563:2:2249 -5564:2:2253 -5565:2:2254 -5566:2:2248 -5567:2:2249 -5568:2:2250 -5569:2:2262 -5570:2:2267 -5571:2:2271 -5572:2:2272 -5573:2:2279 -5574:2:2280 -5575:2:2291 -5576:2:2292 -5577:2:2293 -5578:2:2291 -5579:2:2292 -5580:2:2293 -5581:2:2304 -5582:2:2309 -5583:2:2310 -5584:0:4365 -5585:3:3758 -5586:0:4365 -5587:2:2322 -5588:0:4365 -5589:2:1169 -5590:0:4365 -5591:3:3757 -5592:0:4365 -5593:2:1170 -5594:0:4365 -5595:3:3758 -5596:0:4365 -5597:3:3759 -5598:0:4365 -5599:3:3972 -5600:0:4365 -5601:3:3980 -5602:0:4365 -5603:3:3981 -5604:3:3985 -5605:3:3986 -5606:3:3994 -5607:3:3995 -5608:3:3999 -5609:3:4000 -5610:3:3994 -5611:3:3995 -5612:3:3999 -5613:3:4000 -5614:3:4008 -5615:3:4013 -5616:3:4017 -5617:3:4018 -5618:3:4025 -5619:3:4026 -5620:3:4037 -5621:3:4038 -5622:3:4039 -5623:3:4037 -5624:3:4038 -5625:3:4039 -5626:3:4050 -5627:3:4055 -5628:3:4056 -5629:0:4365 -5630:3:4068 -5631:0:4365 -5632:3:4069 -5633:0:4365 -5634:2:1173 -5635:0:4365 -5636:3:4070 -5637:0:4365 -5638:2:1179 -5639:0:4365 -5640:2:1180 -5641:0:4365 -5642:3:4069 -5643:0:4365 -5644:2:1181 -5645:2:1185 -5646:2:1186 -5647:2:1194 -5648:2:1195 -5649:2:1199 -5650:2:1200 -5651:2:1194 -5652:2:1195 -5653:2:1199 -5654:2:1200 -5655:2:1208 -5656:2:1213 -5657:2:1217 -5658:2:1218 -5659:2:1225 -5660:2:1226 -5661:2:1237 -5662:2:1238 -5663:2:1239 -5664:2:1237 -5665:2:1238 -5666:2:1239 -5667:2:1250 -5668:2:1255 -5669:2:1256 -5670:0:4365 -5671:3:4070 -5672:0:4365 -5673:2:1268 -5674:0:4365 -5675:3:4069 -5676:0:4365 -5677:2:1270 -5678:0:4365 -5679:3:4070 -5680:0:4365 -5681:2:1271 -5682:2:1275 -5683:2:1276 -5684:2:1284 -5685:2:1285 -5686:2:1289 -5687:2:1290 -5688:2:1284 -5689:2:1285 -5690:2:1289 -5691:2:1290 -5692:2:1298 -5693:2:1303 -5694:2:1307 -5695:2:1308 -5696:2:1315 -5697:2:1316 -5698:2:1327 -5699:2:1328 -5700:2:1329 -5701:2:1327 -5702:2:1328 -5703:2:1329 -5704:2:1340 -5705:2:1345 -5706:2:1346 -5707:0:4365 -5708:2:1358 -5709:0:4365 -5710:2:1360 -5711:0:4365 -5712:3:4069 -5713:0:4365 -5714:2:1361 -5715:0:4365 -5716:3:4070 -5717:0:4365 -5718:2:1362 -5719:2:1366 -5720:2:1367 -5721:2:1375 -5722:2:1376 -5723:2:1380 -5724:2:1381 -5725:2:1375 -5726:2:1376 -5727:2:1380 -5728:2:1381 -5729:2:1389 -5730:2:1394 -5731:2:1398 -5732:2:1399 -5733:2:1406 -5734:2:1407 -5735:2:1418 -5736:2:1419 -5737:2:1420 -5738:2:1418 -5739:2:1419 -5740:2:1420 -5741:2:1431 -5742:2:1436 -5743:2:1437 -5744:0:4365 -5745:2:1449 -5746:0:4365 -5747:3:4069 -5748:0:4365 -5749:2:1451 -5750:0:4365 -5751:3:4070 -5752:0:4365 -5753:2:1652 -5754:0:4365 -5755:2:1653 -5756:0:4365 -5757:2:1657 -5758:0:4365 -5759:2:1180 -5760:0:4365 -5761:3:4069 -5762:0:4365 -5763:2:1181 -5764:2:1185 -5765:2:1186 -5766:2:1194 -5767:2:1195 -5768:2:1199 -5769:2:1200 -5770:2:1194 -5771:2:1195 -5772:2:1196 -5773:2:1208 -5774:2:1213 -5775:2:1217 -5776:2:1218 -5777:2:1225 -5778:2:1226 -5779:2:1237 -5780:2:1238 -5781:2:1239 -5782:2:1237 -5783:2:1238 -5784:2:1239 -5785:2:1250 -5786:2:1255 -5787:2:1256 -5788:0:4365 -5789:3:4070 -5790:0:4365 -5791:2:1268 -5792:0:4365 -5793:3:4069 -5794:0:4365 -5795:2:1270 -5796:0:4365 -5797:3:4070 -5798:0:4365 -5799:2:1271 -5800:2:1275 -5801:2:1276 -5802:2:1284 -5803:2:1285 -5804:2:1289 -5805:2:1290 -5806:2:1284 -5807:2:1285 -5808:2:1289 -5809:2:1290 -5810:2:1298 -5811:2:1303 -5812:2:1307 -5813:2:1308 -5814:2:1315 -5815:2:1316 -5816:2:1327 -5817:2:1328 -5818:2:1329 -5819:2:1327 -5820:2:1328 -5821:2:1329 -5822:2:1340 -5823:2:1345 -5824:2:1346 -5825:0:4365 -5826:2:1358 -5827:0:4365 -5828:2:1454 -5829:0:4365 -5830:3:4069 -5831:0:4365 -5832:2:1455 -5833:0:4365 -5834:3:4070 -5835:0:4365 -5836:2:1652 -5837:0:4365 -5838:2:1653 -5839:0:4365 -5840:2:1657 -5841:0:4365 -5842:2:1660 -5843:0:4365 -5844:3:4069 -5845:0:4365 -5846:2:1665 -5847:2:1669 -5848:2:1670 -5849:2:1678 -5850:2:1679 -5851:2:1683 -5852:2:1684 -5853:2:1678 -5854:2:1679 -5855:2:1680 -5856:2:1692 -5857:2:1697 -5858:2:1701 -5859:2:1702 -5860:2:1709 -5861:2:1710 -5862:2:1721 -5863:2:1722 -5864:2:1723 -5865:2:1721 -5866:2:1722 -5867:2:1723 -5868:2:1734 -5869:2:1739 -5870:2:1740 -5871:0:4365 -5872:3:4070 -5873:0:4365 -5874:2:1752 -5875:0:4365 -5876:3:4069 -5877:0:4365 -5878:2:1754 -5879:0:4365 -5880:3:4070 -5881:0:4365 -5882:2:1755 -5883:2:1759 -5884:2:1760 -5885:2:1768 -5886:2:1769 -5887:2:1773 -5888:2:1774 -5889:2:1768 -5890:2:1769 -5891:2:1773 -5892:2:1774 -5893:2:1782 -5894:2:1787 -5895:2:1791 -5896:2:1792 -5897:2:1799 -5898:2:1800 -5899:2:1811 -5900:2:1812 -5901:2:1813 -5902:2:1811 -5903:2:1812 -5904:2:1813 -5905:2:1824 -5906:2:1829 -5907:2:1830 -5908:0:4365 -5909:2:1842 -5910:0:4365 -5911:3:4069 -5912:0:4365 -5913:2:1844 -5914:0:4365 -5915:3:4070 -5916:0:4365 -5917:2:1845 -5918:2:1849 -5919:2:1850 -5920:2:1858 -5921:2:1859 -5922:2:1863 -5923:2:1864 -5924:2:1858 -5925:2:1859 -5926:2:1863 -5927:2:1864 -5928:2:1872 -5929:2:1877 -5930:2:1881 -5931:2:1882 -5932:2:1889 -5933:2:1890 -5934:2:1901 -5935:2:1902 -5936:2:1903 -5937:2:1901 -5938:2:1902 -5939:2:1903 -5940:2:1914 -5941:2:1919 -5942:2:1920 -5943:0:4365 -5944:2:1932 -5945:0:4365 -5946:3:4069 -5947:0:4365 -5948:2:1934 -5949:0:4365 -5950:3:4070 -5951:0:4365 -5952:2:1935 -5953:0:4365 -5954:2:1936 -5955:0:4365 -5956:2:2129 -5957:0:4365 -5958:2:2130 -5959:0:4365 -5960:2:2134 -5961:0:4365 -5962:3:4069 -5963:0:4365 -5964:2:2136 -5965:0:4365 -5966:3:4070 -5967:0:4365 -5968:2:2137 -5969:2:2141 -5970:2:2142 -5971:2:2150 -5972:2:2151 -5973:2:2155 -5974:2:2156 -5975:2:2150 -5976:2:2151 -5977:2:2155 -5978:2:2156 -5979:2:2164 -5980:2:2169 -5981:2:2173 -5982:2:2174 -5983:2:2181 -5984:2:2182 -5985:2:2193 -5986:2:2194 -5987:2:2195 -5988:2:2193 -5989:2:2194 -5990:2:2195 -5991:2:2206 -5992:2:2211 -5993:2:2212 -5994:0:4365 -5995:2:2224 -5996:0:4365 -5997:3:4069 -5998:0:4365 -5999:2:2226 -6000:0:4365 -6001:3:4070 -6002:0:4365 -6003:2:1936 -6004:0:4365 -6005:2:2129 -6006:0:4365 -6007:2:2130 -6008:0:4365 -6009:2:2134 -6010:0:4365 -6011:3:4069 -6012:0:4365 -6013:2:2136 -6014:0:4365 -6015:3:4070 -6016:0:4365 -6017:2:2137 -6018:2:2141 -6019:2:2142 -6020:2:2150 -6021:2:2151 -6022:2:2155 -6023:2:2156 -6024:2:2150 -6025:2:2151 -6026:2:2152 -6027:2:2164 -6028:2:2169 -6029:2:2173 -6030:2:2174 -6031:2:2181 -6032:2:2182 -6033:2:2193 -6034:2:2194 -6035:2:2195 -6036:2:2193 -6037:2:2194 -6038:2:2195 -6039:2:2206 -6040:2:2211 -6041:2:2212 -6042:0:4365 -6043:2:2224 -6044:0:4365 -6045:3:4069 -6046:0:4365 -6047:2:2226 -6048:0:4365 -6049:3:4070 -6050:0:4365 -6051:2:2230 -6052:0:4365 -6053:3:4069 -6054:0:4365 -6055:2:2235 -6056:2:2239 -6057:2:2240 -6058:2:2248 -6059:2:2249 -6060:2:2253 -6061:2:2254 -6062:2:2248 -6063:2:2249 -6064:2:2250 -6065:2:2262 -6066:2:2267 -6067:2:2271 -6068:2:2272 -6069:2:2279 -6070:2:2280 -6071:2:2291 -6072:2:2292 -6073:2:2293 -6074:2:2291 -6075:2:2292 -6076:2:2293 -6077:2:2304 -6078:2:2309 -6079:2:2310 -6080:0:4365 -6081:3:4070 -6082:0:4365 -6083:2:2322 -6084:0:4365 -6085:2:1169 -6086:0:4365 -6087:3:4069 -6088:0:4365 -6089:2:1170 -6090:0:4365 -6091:3:4070 -6092:0:4365 -6093:3:4071 -6094:0:4365 -6095:3:4081 -6096:0:4365 -6097:3:3666 -6098:0:4365 -6099:3:3667 -6100:0:4365 -6101:3:3668 -6102:0:4365 -6103:3:3669 -6104:3:3673 -6105:3:3674 -6106:3:3682 -6107:3:3683 -6108:3:3687 -6109:3:3688 -6110:3:3682 -6111:3:3683 -6112:3:3687 -6113:3:3688 -6114:3:3696 -6115:3:3701 -6116:3:3705 -6117:3:3706 -6118:3:3713 -6119:3:3714 -6120:3:3725 -6121:3:3726 -6122:3:3727 -6123:3:3725 -6124:3:3726 -6125:3:3727 -6126:3:3738 -6127:3:3743 -6128:3:3744 -6129:0:4365 -6130:3:3756 -6131:0:4365 -6132:3:3757 -6133:0:4365 -6134:2:1173 -6135:0:4365 -6136:3:3758 -6137:0:4365 -6138:2:1179 -6139:0:4365 -6140:2:1180 -6141:0:4365 -6142:3:3757 -6143:0:4365 -6144:2:1181 -6145:2:1185 -6146:2:1186 -6147:2:1194 -6148:2:1195 -6149:2:1199 -6150:2:1200 -6151:2:1194 -6152:2:1195 -6153:2:1199 -6154:2:1200 -6155:2:1208 -6156:2:1213 -6157:2:1217 -6158:2:1218 -6159:2:1225 -6160:2:1226 -6161:2:1237 -6162:2:1238 -6163:2:1239 -6164:2:1237 -6165:2:1238 -6166:2:1239 -6167:2:1250 -6168:2:1255 -6169:2:1256 -6170:0:4365 -6171:3:3758 -6172:0:4365 -6173:2:1268 -6174:0:4365 -6175:3:3757 -6176:0:4365 -6177:2:1270 -6178:0:4365 -6179:3:3758 -6180:0:4365 -6181:2:1271 -6182:2:1275 -6183:2:1276 -6184:2:1284 -6185:2:1285 -6186:2:1289 -6187:2:1290 -6188:2:1284 -6189:2:1285 -6190:2:1289 -6191:2:1290 -6192:2:1298 -6193:2:1303 -6194:2:1307 -6195:2:1308 -6196:2:1315 -6197:2:1316 -6198:2:1327 -6199:2:1328 -6200:2:1329 -6201:2:1327 -6202:2:1328 -6203:2:1329 -6204:2:1340 -6205:2:1345 -6206:2:1346 -6207:0:4365 -6208:2:1358 -6209:0:4365 -6210:2:1360 -6211:0:4365 -6212:3:3757 -6213:0:4365 -6214:2:1361 -6215:0:4365 -6216:3:3758 -6217:0:4365 -6218:2:1362 -6219:2:1366 -6220:2:1367 -6221:2:1375 -6222:2:1376 -6223:2:1380 -6224:2:1381 -6225:2:1375 -6226:2:1376 -6227:2:1380 -6228:2:1381 -6229:2:1389 -6230:2:1394 -6231:2:1398 -6232:2:1399 -6233:2:1406 -6234:2:1407 -6235:2:1418 -6236:2:1419 -6237:2:1420 -6238:2:1418 -6239:2:1419 -6240:2:1420 -6241:2:1431 -6242:2:1436 -6243:2:1437 -6244:0:4365 -6245:2:1449 -6246:0:4365 -6247:3:3757 -6248:0:4365 -6249:2:1451 -6250:0:4365 -6251:3:3758 -6252:0:4365 -6253:2:1652 -6254:0:4365 -6255:2:1653 -6256:0:4365 -6257:2:1657 -6258:0:4365 -6259:2:1180 -6260:0:4365 -6261:3:3757 -6262:0:4365 -6263:2:1181 -6264:2:1185 -6265:2:1186 -6266:2:1194 -6267:2:1195 -6268:2:1199 -6269:2:1200 -6270:2:1194 -6271:2:1195 -6272:2:1196 -6273:2:1208 -6274:2:1213 -6275:2:1217 -6276:2:1218 -6277:2:1225 -6278:2:1226 -6279:2:1237 -6280:2:1238 -6281:2:1239 -6282:2:1237 -6283:2:1238 -6284:2:1239 -6285:2:1250 -6286:2:1255 -6287:2:1256 -6288:0:4365 -6289:3:3758 -6290:0:4365 -6291:2:1268 -6292:0:4365 -6293:3:3757 -6294:0:4365 -6295:2:1270 -6296:0:4365 -6297:3:3758 -6298:0:4365 -6299:2:1271 -6300:2:1275 -6301:2:1276 -6302:2:1284 -6303:2:1285 -6304:2:1289 -6305:2:1290 -6306:2:1284 -6307:2:1285 -6308:2:1289 -6309:2:1290 -6310:2:1298 -6311:2:1303 -6312:2:1307 -6313:2:1308 -6314:2:1315 -6315:2:1316 -6316:2:1327 -6317:2:1328 -6318:2:1329 -6319:2:1327 -6320:2:1328 -6321:2:1329 -6322:2:1340 -6323:2:1345 -6324:2:1346 -6325:0:4365 -6326:2:1358 -6327:0:4365 -6328:2:1454 -6329:0:4365 -6330:3:3757 -6331:0:4365 -6332:2:1455 -6333:0:4365 -6334:3:3758 -6335:0:4365 -6336:2:1652 -6337:0:4365 -6338:2:1653 -6339:0:4365 -6340:2:1657 -6341:0:4365 -6342:2:1660 -6343:0:4365 -6344:3:3757 -6345:0:4365 -6346:2:1665 -6347:2:1669 -6348:2:1670 -6349:2:1678 -6350:2:1679 -6351:2:1683 -6352:2:1684 -6353:2:1678 -6354:2:1679 -6355:2:1680 -6356:2:1692 -6357:2:1697 -6358:2:1701 -6359:2:1702 -6360:2:1709 -6361:2:1710 -6362:2:1721 -6363:2:1722 -6364:2:1723 -6365:2:1721 -6366:2:1722 -6367:2:1723 -6368:2:1734 -6369:2:1739 -6370:2:1740 -6371:0:4365 -6372:3:3758 -6373:0:4365 -6374:2:1752 -6375:0:4365 -6376:3:3757 -6377:0:4365 -6378:2:1754 -6379:0:4365 -6380:3:3758 -6381:0:4365 -6382:2:1755 -6383:2:1759 -6384:2:1760 -6385:2:1768 -6386:2:1769 -6387:2:1773 -6388:2:1774 -6389:2:1768 -6390:2:1769 -6391:2:1773 -6392:2:1774 -6393:2:1782 -6394:2:1787 -6395:2:1791 -6396:2:1792 -6397:2:1799 -6398:2:1800 -6399:2:1811 -6400:2:1812 -6401:2:1813 -6402:2:1811 -6403:2:1812 -6404:2:1813 -6405:2:1824 -6406:2:1829 -6407:2:1830 -6408:0:4365 -6409:2:1842 -6410:0:4365 -6411:3:3757 -6412:0:4365 -6413:2:1844 -6414:0:4365 -6415:3:3758 -6416:0:4365 -6417:2:1845 -6418:2:1849 -6419:2:1850 -6420:2:1858 -6421:2:1859 -6422:2:1863 -6423:2:1864 -6424:2:1858 -6425:2:1859 -6426:2:1863 -6427:2:1864 -6428:2:1872 -6429:2:1877 -6430:2:1881 -6431:2:1882 -6432:2:1889 -6433:2:1890 -6434:2:1901 -6435:2:1902 -6436:2:1903 -6437:2:1901 -6438:2:1902 -6439:2:1903 -6440:2:1914 -6441:2:1919 -6442:2:1920 -6443:0:4365 -6444:2:1932 -6445:0:4365 -6446:3:3757 -6447:0:4365 -6448:2:1934 -6449:0:4365 -6450:3:3758 -6451:0:4365 -6452:2:1935 -6453:0:4365 -6454:2:1936 -6455:0:4365 -6456:2:2129 -6457:0:4365 -6458:2:2130 -6459:0:4365 -6460:2:2134 -6461:0:4365 -6462:3:3757 -6463:0:4365 -6464:2:2136 -6465:0:4365 -6466:3:3758 -6467:0:4365 -6468:2:2137 -6469:2:2141 -6470:2:2142 -6471:2:2150 -6472:2:2151 -6473:2:2155 -6474:2:2156 -6475:2:2150 -6476:2:2151 -6477:2:2155 -6478:2:2156 -6479:2:2164 -6480:2:2169 -6481:2:2173 -6482:2:2174 -6483:2:2181 -6484:2:2182 -6485:2:2193 -6486:2:2194 -6487:2:2195 -6488:2:2193 -6489:2:2194 -6490:2:2195 -6491:2:2206 -6492:2:2211 -6493:2:2212 -6494:0:4365 -6495:2:2224 -6496:0:4365 -6497:3:3757 -6498:0:4365 -6499:2:2226 -6500:0:4365 -6501:3:3758 -6502:0:4365 -6503:2:1936 -6504:0:4365 -6505:2:2129 -6506:0:4365 -6507:2:2130 -6508:0:4365 -6509:2:2134 -6510:0:4365 -6511:3:3757 -6512:0:4365 -6513:2:2136 -6514:0:4365 -6515:3:3758 -6516:0:4365 -6517:2:2137 -6518:2:2141 -6519:2:2142 -6520:2:2150 -6521:2:2151 -6522:2:2155 -6523:2:2156 -6524:2:2150 -6525:2:2151 -6526:2:2152 -6527:2:2164 -6528:2:2169 -6529:2:2173 -6530:2:2174 -6531:2:2181 -6532:2:2182 -6533:2:2193 -6534:2:2194 -6535:2:2195 -6536:2:2193 -6537:2:2194 -6538:2:2195 -6539:2:2206 -6540:2:2211 -6541:2:2212 -6542:0:4365 -6543:2:2224 -6544:0:4365 -6545:3:3757 -6546:0:4365 -6547:2:2226 -6548:0:4365 -6549:3:3758 -6550:0:4365 -6551:2:2230 -6552:0:4365 -6553:3:3757 -6554:0:4365 -6555:2:2235 -6556:2:2239 -6557:2:2240 -6558:2:2248 -6559:2:2249 -6560:2:2253 -6561:2:2254 -6562:2:2248 -6563:2:2249 -6564:2:2250 -6565:2:2262 -6566:2:2267 -6567:2:2271 -6568:2:2272 -6569:2:2279 -6570:2:2280 -6571:2:2291 -6572:2:2292 -6573:2:2293 -6574:2:2291 -6575:2:2292 -6576:2:2293 -6577:2:2304 -6578:2:2309 -6579:2:2310 -6580:0:4365 -6581:3:3758 -6582:0:4365 -6583:2:2322 -6584:0:4365 -6585:2:1169 -6586:0:4365 -6587:3:3757 -6588:0:4365 -6589:2:1170 -6590:0:4365 -6591:3:3758 -6592:0:4365 -6593:3:3759 -6594:0:4365 -6595:3:3972 -6596:0:4365 -6597:3:4077 -6598:0:4365 -6599:3:4078 -6600:0:4365 -6601:3:4082 -6602:0:4365 -6603:3:4088 -6604:0:4365 -6605:3:4092 -6606:3:4093 -6607:3:4097 -6608:3:4101 -6609:3:4102 -6610:3:4097 -6611:3:4101 -6612:3:4102 -6613:3:4106 -6614:3:4114 -6615:3:4115 -6616:3:4120 -6617:3:4127 -6618:3:4128 -6619:3:4127 -6620:3:4128 -6621:3:4135 -6622:3:4140 -6623:0:4365 -6624:3:4151 -6625:0:4365 -6626:3:4155 -6627:3:4156 -6628:3:4160 -6629:3:4164 -6630:3:4165 -6631:3:4160 -6632:3:4164 -6633:3:4165 -6634:3:4169 -6635:3:4177 -6636:3:4178 -6637:3:4183 -6638:3:4190 -6639:3:4191 -6640:3:4190 -6641:3:4191 -6642:3:4198 -6643:3:4203 -6644:0:4365 -6645:3:4151 -6646:0:4365 -6647:3:4155 -6648:3:4156 -6649:3:4160 -6650:3:4164 -6651:3:4165 -6652:3:4160 -6653:3:4164 -6654:3:4165 -6655:3:4169 -6656:3:4177 -6657:3:4178 -6658:3:4183 -6659:3:4190 -6660:3:4191 -6661:3:4190 -6662:3:4191 -6663:3:4198 -6664:3:4203 -6665:0:4365 -6666:3:4214 -6667:0:4365 -6668:3:4222 -6669:3:4223 -6670:3:4227 -6671:3:4231 -6672:3:4232 -6673:3:4227 -6674:3:4231 -6675:3:4232 -6676:3:4236 -6677:3:4244 -6678:3:4245 -6679:3:4250 -6680:3:4257 -6681:3:4258 -6682:3:4257 -6683:3:4258 -6684:3:4265 -6685:3:4270 -6686:0:4365 -6687:3:4285 -6688:0:4365 -6689:3:4286 -6690:0:4365 -6691:2:1173 -6692:0:4365 -6693:3:4287 -6694:0:4365 -6695:2:1179 -6696:0:4365 -6697:2:1180 -6698:0:4365 -6699:3:4286 -6700:0:4365 -6701:2:1181 -6702:2:1185 -6703:2:1186 -6704:2:1194 -6705:2:1195 -6706:2:1199 -6707:2:1200 -6708:2:1194 -6709:2:1195 -6710:2:1199 -6711:2:1200 -6712:2:1208 -6713:2:1213 -6714:2:1217 -6715:2:1218 -6716:2:1225 -6717:2:1226 -6718:2:1237 -6719:2:1238 -6720:2:1239 -6721:2:1237 -6722:2:1238 -6723:2:1239 -6724:2:1250 -6725:2:1255 -6726:2:1256 -6727:0:4365 -6728:3:4287 -6729:0:4365 -6730:2:1268 -6731:0:4365 -6732:3:4286 -6733:0:4365 -6734:2:1270 -6735:0:4365 -6736:3:4287 -6737:0:4365 -6738:2:1271 -6739:2:1275 -6740:2:1276 -6741:2:1284 -6742:2:1285 -6743:2:1289 -6744:2:1290 -6745:2:1284 -6746:2:1285 -6747:2:1289 -6748:2:1290 -6749:2:1298 -6750:2:1303 -6751:2:1307 -6752:2:1308 -6753:2:1315 -6754:2:1316 -6755:2:1327 -6756:2:1328 -6757:2:1329 -6758:2:1327 -6759:2:1328 -6760:2:1329 -6761:2:1340 -6762:2:1345 -6763:2:1346 -6764:0:4365 -6765:2:1358 -6766:0:4365 -6767:2:1360 -6768:0:4365 -6769:3:4286 -6770:0:4365 -6771:2:1361 -6772:0:4365 -6773:3:4287 -6774:0:4365 -6775:2:1362 -6776:2:1366 -6777:2:1367 -6778:2:1375 -6779:2:1376 -6780:2:1380 -6781:2:1381 -6782:2:1375 -6783:2:1376 -6784:2:1380 -6785:2:1381 -6786:2:1389 -6787:2:1394 -6788:2:1398 -6789:2:1399 -6790:2:1406 -6791:2:1407 -6792:2:1418 -6793:2:1419 -6794:2:1420 -6795:2:1418 -6796:2:1419 -6797:2:1420 -6798:2:1431 -6799:2:1436 -6800:2:1437 -6801:0:4365 -6802:2:1449 -6803:0:4365 -6804:3:4286 -6805:0:4365 -6806:2:1451 -6807:0:4365 -6808:3:4287 -6809:0:4365 -6810:2:1652 -6811:0:4365 -6812:2:1653 -6813:0:4365 -6814:2:1657 -6815:0:4365 -6816:2:1180 -6817:0:4365 -6818:3:4286 -6819:0:4365 -6820:2:1181 -6821:2:1185 -6822:2:1186 -6823:2:1194 -6824:2:1195 -6825:2:1199 -6826:2:1200 -6827:2:1194 -6828:2:1195 -6829:2:1196 -6830:2:1208 -6831:2:1213 -6832:2:1217 -6833:2:1218 -6834:2:1225 -6835:2:1226 -6836:2:1237 -6837:2:1238 -6838:2:1239 -6839:2:1237 -6840:2:1238 -6841:2:1239 -6842:2:1250 -6843:2:1255 -6844:2:1256 -6845:0:4365 -6846:3:4287 -6847:0:4365 -6848:2:1268 -6849:0:4365 -6850:3:4286 -6851:0:4365 -6852:2:1270 -6853:0:4365 -6854:3:4287 -6855:0:4365 -6856:2:1271 -6857:2:1275 -6858:2:1276 -6859:2:1284 -6860:2:1285 -6861:2:1289 -6862:2:1290 -6863:2:1284 -6864:2:1285 -6865:2:1289 -6866:2:1290 -6867:2:1298 -6868:2:1303 -6869:2:1307 -6870:2:1308 -6871:2:1315 -6872:2:1316 -6873:2:1327 -6874:2:1328 -6875:2:1329 -6876:2:1327 -6877:2:1328 -6878:2:1329 -6879:2:1340 -6880:2:1345 -6881:2:1346 -6882:0:4365 -6883:2:1358 -6884:0:4365 -6885:2:1454 -6886:0:4365 -6887:3:4286 -6888:0:4365 -6889:2:1455 -6890:0:4365 -6891:3:4287 -6892:0:4365 -6893:2:1652 -6894:0:4365 -6895:2:1653 -6896:0:4365 -6897:2:1657 -6898:0:4365 -6899:2:1660 -6900:0:4365 -6901:3:4286 -6902:0:4365 -6903:2:1665 -6904:2:1669 -6905:2:1670 -6906:2:1678 -6907:2:1679 -6908:2:1683 -6909:2:1684 -6910:2:1678 -6911:2:1679 -6912:2:1680 -6913:2:1692 -6914:2:1697 -6915:2:1701 -6916:2:1702 -6917:2:1709 -6918:2:1710 -6919:2:1721 -6920:2:1722 -6921:2:1723 -6922:2:1721 -6923:2:1722 -6924:2:1723 -6925:2:1734 -6926:2:1739 -6927:2:1740 -6928:0:4365 -6929:3:4287 -6930:0:4365 -6931:2:1752 -6932:0:4365 -6933:3:4286 -6934:0:4365 -6935:2:1754 -6936:0:4365 -6937:3:4287 -6938:0:4365 -6939:2:1755 -6940:2:1759 -6941:2:1760 -6942:2:1768 -6943:2:1769 -6944:2:1773 -6945:2:1774 -6946:2:1768 -6947:2:1769 -6948:2:1773 -6949:2:1774 -6950:2:1782 -6951:2:1787 -6952:2:1791 -6953:2:1792 -6954:2:1799 -6955:2:1800 -6956:2:1811 -6957:2:1812 -6958:2:1813 -6959:2:1811 -6960:2:1812 -6961:2:1813 -6962:2:1824 -6963:2:1829 -6964:2:1830 -6965:0:4365 -6966:2:1842 -6967:0:4365 -6968:3:4286 -6969:0:4365 -6970:2:1844 -6971:0:4365 -6972:3:4287 -6973:0:4365 -6974:2:1845 -6975:2:1849 -6976:2:1850 -6977:2:1858 -6978:2:1859 -6979:2:1863 -6980:2:1864 -6981:2:1858 -6982:2:1859 -6983:2:1863 -6984:2:1864 -6985:2:1872 -6986:2:1877 -6987:2:1881 -6988:2:1882 -6989:2:1889 -6990:2:1890 -6991:2:1901 -6992:2:1902 -6993:2:1903 -6994:2:1901 -6995:2:1902 -6996:2:1903 -6997:2:1914 -6998:2:1919 -6999:2:1920 -7000:0:4365 -7001:2:1932 -7002:0:4365 -7003:3:4286 -7004:0:4365 -7005:2:1934 -7006:0:4365 -7007:3:4287 -7008:0:4365 -7009:2:1935 -7010:0:4365 -7011:2:1936 -7012:0:4365 -7013:2:2129 -7014:0:4365 -7015:2:2130 -7016:0:4365 -7017:2:2134 -7018:0:4365 -7019:3:4286 -7020:0:4365 -7021:2:2136 -7022:0:4365 -7023:3:4287 -7024:0:4365 -7025:2:2137 -7026:2:2141 -7027:2:2142 -7028:2:2150 -7029:2:2151 -7030:2:2155 -7031:2:2156 -7032:2:2150 -7033:2:2151 -7034:2:2155 -7035:2:2156 -7036:2:2164 -7037:2:2169 -7038:2:2173 -7039:2:2174 -7040:2:2181 -7041:2:2182 -7042:2:2193 -7043:2:2194 -7044:2:2195 -7045:2:2193 -7046:2:2194 -7047:2:2195 -7048:2:2206 -7049:2:2211 -7050:2:2212 -7051:0:4365 -7052:2:2224 -7053:0:4365 -7054:3:4286 -7055:0:4365 -7056:2:2226 -7057:0:4365 -7058:3:4287 -7059:0:4365 -7060:2:1936 -7061:0:4365 -7062:2:2129 -7063:0:4365 -7064:2:2130 -7065:0:4365 -7066:2:2134 -7067:0:4365 -7068:3:4286 -7069:0:4365 -7070:2:2136 -7071:0:4365 -7072:3:4287 -7073:0:4365 -7074:2:2137 -7075:2:2141 -7076:2:2142 -7077:2:2150 -7078:2:2151 -7079:2:2155 -7080:2:2156 -7081:2:2150 -7082:2:2151 -7083:2:2152 -7084:2:2164 -7085:2:2169 -7086:2:2173 -7087:2:2174 -7088:2:2181 -7089:2:2182 -7090:2:2193 -7091:2:2194 -7092:2:2195 -7093:2:2193 -7094:2:2194 -7095:2:2195 -7096:2:2206 -7097:2:2211 -7098:2:2212 -7099:0:4365 -7100:2:2224 -7101:0:4365 -7102:3:4286 -7103:0:4365 -7104:2:2226 -7105:0:4365 -7106:3:4287 -7107:0:4365 -7108:2:2230 -7109:0:4365 -7110:3:4286 -7111:0:4365 -7112:2:2235 -7113:2:2239 -7114:2:2240 -7115:2:2248 -7116:2:2249 -7117:2:2253 -7118:2:2254 -7119:2:2248 -7120:2:2249 -7121:2:2250 -7122:2:2262 -7123:2:2267 -7124:2:2271 -7125:2:2272 -7126:2:2279 -7127:2:2280 -7128:2:2291 -7129:2:2292 -7130:2:2293 -7131:2:2291 -7132:2:2292 -7133:2:2293 -7134:2:2304 -7135:2:2309 -7136:2:2310 -7137:0:4365 -7138:3:4287 -7139:0:4365 -7140:2:2322 -7141:0:4365 -7142:2:1169 -7143:0:4365 -7144:3:4286 -7145:0:4365 -7146:2:1170 -7147:0:4365 -7148:3:4287 -7149:0:4365 -7150:3:4288 -7151:0:4365 -7152:3:4294 -7153:0:4365 -7154:3:4295 -7155:0:4365 -7156:3:2338 -7157:0:4365 -7158:3:2339 -7159:3:2343 -7160:3:2344 -7161:3:2352 -7162:3:2353 -7163:3:2357 -7164:3:2358 -7165:3:2352 -7166:3:2353 -7167:3:2357 -7168:3:2358 -7169:3:2366 -7170:3:2371 -7171:3:2375 -7172:3:2376 -7173:3:2383 -7174:3:2384 -7175:3:2395 -7176:3:2396 -7177:3:2397 -7178:3:2395 -7179:3:2396 -7180:3:2397 -7181:3:2408 -7182:3:2413 -7183:3:2414 -7184:0:4365 -7185:3:2426 -7186:0:4365 -7187:3:2427 -7188:0:4365 -7189:2:1173 -7190:0:4365 -7191:3:2428 -7192:0:4365 -7193:2:1179 -7194:0:4365 -7195:2:1180 -7196:0:4365 -7197:3:2427 -7198:0:4365 -7199:2:1181 -7200:2:1185 -7201:2:1186 -7202:2:1194 -7203:2:1195 -7204:2:1199 -7205:2:1200 -7206:2:1194 -7207:2:1195 -7208:2:1199 -7209:2:1200 -7210:2:1208 -7211:2:1213 -7212:2:1217 -7213:2:1218 -7214:2:1225 -7215:2:1226 -7216:2:1237 -7217:2:1238 -7218:2:1239 -7219:2:1237 -7220:2:1238 -7221:2:1239 -7222:2:1250 -7223:2:1255 -7224:2:1256 -7225:0:4365 -7226:3:2428 -7227:0:4365 -7228:2:1268 -7229:0:4365 -7230:3:2427 -7231:0:4365 -7232:2:1270 -7233:0:4365 -7234:3:2428 -7235:0:4365 -7236:2:1271 -7237:2:1275 -7238:2:1276 -7239:2:1284 -7240:2:1285 -7241:2:1289 -7242:2:1290 -7243:2:1284 -7244:2:1285 -7245:2:1289 -7246:2:1290 -7247:2:1298 -7248:2:1303 -7249:2:1307 -7250:2:1308 -7251:2:1315 -7252:2:1316 -7253:2:1327 -7254:2:1328 -7255:2:1329 -7256:2:1327 -7257:2:1328 -7258:2:1329 -7259:2:1340 -7260:2:1345 -7261:2:1346 -7262:0:4365 -7263:2:1358 -7264:0:4365 -7265:2:1360 -7266:0:4365 -7267:3:2427 -7268:0:4365 -7269:2:1361 -7270:0:4365 -7271:3:2428 -7272:0:4365 -7273:2:1362 -7274:2:1366 -7275:2:1367 -7276:2:1375 -7277:2:1376 -7278:2:1380 -7279:2:1381 -7280:2:1375 -7281:2:1376 -7282:2:1380 -7283:2:1381 -7284:2:1389 -7285:2:1394 -7286:2:1398 -7287:2:1399 -7288:2:1406 -7289:2:1407 -7290:2:1418 -7291:2:1419 -7292:2:1420 -7293:2:1418 -7294:2:1419 -7295:2:1420 -7296:2:1431 -7297:2:1436 -7298:2:1437 -7299:0:4365 -7300:2:1449 -7301:0:4365 -7302:3:2427 -7303:0:4365 -7304:2:1451 -7305:0:4365 -7306:3:2428 -7307:0:4365 -7308:2:1652 -7309:0:4365 -7310:2:1653 -7311:0:4365 -7312:2:1657 -7313:0:4365 -7314:2:1180 -7315:0:4365 -7316:3:2427 -7317:0:4365 -7318:2:1181 -7319:2:1185 -7320:2:1186 -7321:2:1194 -7322:2:1195 -7323:2:1199 -7324:2:1200 -7325:2:1194 -7326:2:1195 -7327:2:1196 -7328:2:1208 -7329:2:1213 -7330:2:1217 -7331:2:1218 -7332:2:1225 -7333:2:1226 -7334:2:1237 -7335:2:1238 -7336:2:1239 -7337:2:1237 -7338:2:1238 -7339:2:1239 -7340:2:1250 -7341:2:1255 -7342:2:1256 -7343:0:4365 -7344:3:2428 -7345:0:4365 -7346:2:1268 -7347:0:4365 -7348:3:2427 -7349:0:4365 -7350:2:1270 -7351:0:4365 -7352:3:2428 -7353:0:4365 -7354:2:1271 -7355:2:1275 -7356:2:1276 -7357:2:1284 -7358:2:1285 -7359:2:1289 -7360:2:1290 -7361:2:1284 -7362:2:1285 -7363:2:1289 -7364:2:1290 -7365:2:1298 -7366:2:1303 -7367:2:1307 -7368:2:1308 -7369:2:1315 -7370:2:1316 -7371:2:1327 -7372:2:1328 -7373:2:1329 -7374:2:1327 -7375:2:1328 -7376:2:1329 -7377:2:1340 -7378:2:1345 -7379:2:1346 -7380:0:4365 -7381:2:1358 -7382:0:4365 -7383:2:1454 -7384:0:4365 -7385:3:2427 -7386:0:4365 -7387:2:1455 -7388:0:4365 -7389:3:2428 -7390:0:4365 -7391:2:1652 -7392:0:4365 -7393:2:1653 -7394:0:4365 -7395:2:1657 -7396:0:4365 -7397:2:1660 -7398:0:4365 -7399:3:2427 -7400:0:4365 -7401:2:1665 -7402:2:1669 -7403:2:1670 -7404:2:1678 -7405:2:1679 -7406:2:1683 -7407:2:1684 -7408:2:1678 -7409:2:1679 -7410:2:1680 -7411:2:1692 -7412:2:1697 -7413:2:1701 -7414:2:1702 -7415:2:1709 -7416:2:1710 -7417:2:1721 -7418:2:1722 -7419:2:1723 -7420:2:1721 -7421:2:1722 -7422:2:1723 -7423:2:1734 -7424:2:1739 -7425:2:1740 -7426:0:4365 -7427:3:2428 -7428:0:4365 -7429:2:1752 -7430:0:4365 -7431:3:2427 -7432:0:4365 -7433:2:1754 -7434:0:4365 -7435:3:2428 -7436:0:4365 -7437:2:1755 -7438:2:1759 -7439:2:1760 -7440:2:1768 -7441:2:1769 -7442:2:1773 -7443:2:1774 -7444:2:1768 -7445:2:1769 -7446:2:1773 -7447:2:1774 -7448:2:1782 -7449:2:1787 -7450:2:1791 -7451:2:1792 -7452:2:1799 -7453:2:1800 -7454:2:1811 -7455:2:1812 -7456:2:1813 -7457:2:1811 -7458:2:1812 -7459:2:1813 -7460:2:1824 -7461:2:1829 -7462:2:1830 -7463:0:4365 -7464:2:1842 -7465:0:4365 -7466:3:2427 -7467:0:4365 -7468:2:1844 -7469:0:4365 -7470:3:2428 -7471:0:4365 -7472:2:1845 -7473:2:1849 -7474:2:1850 -7475:2:1858 -7476:2:1859 -7477:2:1863 -7478:2:1864 -7479:2:1858 -7480:2:1859 -7481:2:1863 -7482:2:1864 -7483:2:1872 -7484:2:1877 -7485:2:1881 -7486:2:1882 -7487:2:1889 -7488:2:1890 -7489:2:1901 -7490:2:1902 -7491:2:1903 -7492:2:1901 -7493:2:1902 -7494:2:1903 -7495:2:1914 -7496:2:1919 -7497:2:1920 -7498:0:4365 -7499:2:1932 -7500:0:4365 -7501:3:2427 -7502:0:4365 -7503:2:1934 -7504:0:4365 -7505:3:2428 -7506:0:4365 -7507:2:1935 -7508:0:4365 -7509:2:1936 -7510:0:4365 -7511:2:2129 -7512:0:4365 -7513:2:2130 -7514:0:4365 -7515:2:2134 -7516:0:4365 -7517:3:2427 -7518:0:4365 -7519:2:2136 -7520:0:4365 -7521:3:2428 -7522:0:4365 -7523:2:2137 -7524:2:2141 -7525:2:2142 -7526:2:2150 -7527:2:2151 -7528:2:2155 -7529:2:2156 -7530:2:2150 -7531:2:2151 -7532:2:2155 -7533:2:2156 -7534:2:2164 -7535:2:2169 -7536:2:2173 -7537:2:2174 -7538:2:2181 -7539:2:2182 -7540:2:2193 -7541:2:2194 -7542:2:2195 -7543:2:2193 -7544:2:2194 -7545:2:2195 -7546:2:2206 -7547:2:2211 -7548:2:2212 -7549:0:4365 -7550:2:2224 -7551:0:4365 -7552:3:2427 -7553:0:4365 -7554:2:2226 -7555:0:4365 -7556:3:2428 -7557:0:4365 -7558:2:1936 -7559:0:4365 -7560:2:2129 -7561:0:4365 -7562:2:2130 -7563:0:4365 -7564:2:2134 -7565:0:4365 -7566:3:2427 -7567:0:4365 -7568:2:2136 -7569:0:4365 -7570:3:2428 -7571:0:4365 -7572:2:2137 -7573:2:2141 -7574:2:2142 -7575:2:2150 -7576:2:2151 -7577:2:2155 -7578:2:2156 -7579:2:2150 -7580:2:2151 -7581:2:2152 -7582:2:2164 -7583:2:2169 -7584:2:2173 -7585:2:2174 -7586:2:2181 -7587:2:2182 -7588:2:2193 -7589:2:2194 -7590:2:2195 -7591:2:2193 -7592:2:2194 -7593:2:2195 -7594:2:2206 -7595:2:2211 -7596:2:2212 -7597:0:4365 -7598:2:2224 -7599:0:4365 -7600:3:2427 -7601:0:4365 -7602:2:2226 -7603:0:4365 -7604:3:2428 -7605:0:4365 -7606:2:2230 -7607:0:4365 -7608:3:2427 -7609:0:4365 -7610:2:2235 -7611:2:2239 -7612:2:2240 -7613:2:2248 -7614:2:2249 -7615:2:2253 -7616:2:2254 -7617:2:2248 -7618:2:2249 -7619:2:2250 -7620:2:2262 -7621:2:2267 -7622:2:2271 -7623:2:2272 -7624:2:2279 -7625:2:2280 -7626:2:2291 -7627:2:2292 -7628:2:2293 -7629:2:2291 -7630:2:2292 -7631:2:2293 -7632:2:2304 -7633:2:2309 -7634:2:2310 -7635:0:4365 -7636:3:2428 -7637:0:4365 -7638:2:2322 -7639:0:4365 -7640:2:1169 -7641:0:4365 -7642:3:2427 -7643:0:4365 -7644:2:1170 -7645:0:4365 -7646:3:2428 -7647:0:4365 -7648:3:2429 -7649:0:4365 -7650:3:2435 -7651:3:2436 -7652:0:4365 -7653:3:2440 -7654:3:2444 -7655:3:2445 -7656:3:2453 -7657:3:2454 -7658:3:2458 -7659:3:2459 -7660:3:2453 -7661:3:2454 -7662:3:2458 -7663:3:2459 -7664:3:2467 -7665:3:2472 -7666:3:2473 -7667:3:2484 -7668:3:2485 -7669:3:2496 -7670:3:2497 -7671:3:2498 -7672:3:2496 -7673:3:2497 -7674:3:2498 -7675:3:2509 -7676:3:2514 -7677:3:2515 -7678:0:4365 -7679:3:2527 -7680:0:4365 -7681:3:2528 -7682:0:4365 -7683:2:1173 -7684:0:4365 -7685:3:2529 -7686:0:4365 -7687:2:1179 -7688:0:4365 -7689:2:1180 -7690:0:4365 -7691:3:2528 -7692:0:4365 -7693:2:1181 -7694:2:1185 -7695:2:1186 -7696:2:1194 -7697:2:1195 -7698:2:1199 -7699:2:1200 -7700:2:1194 -7701:2:1195 -7702:2:1199 -7703:2:1200 -7704:2:1208 -7705:2:1213 -7706:2:1217 -7707:2:1218 -7708:2:1225 -7709:2:1226 -7710:2:1237 -7711:2:1238 -7712:2:1239 -7713:2:1237 -7714:2:1238 -7715:2:1239 -7716:2:1250 -7717:2:1255 -7718:2:1256 -7719:0:4365 -7720:3:2529 -7721:0:4365 -7722:2:1268 -7723:0:4365 -7724:3:2528 -7725:0:4365 -7726:2:1270 -7727:0:4365 -7728:3:2529 -7729:0:4365 -7730:2:1271 -7731:2:1275 -7732:2:1276 -7733:2:1284 -7734:2:1285 -7735:2:1289 -7736:2:1290 -7737:2:1284 -7738:2:1285 -7739:2:1289 -7740:2:1290 -7741:2:1298 -7742:2:1303 -7743:2:1307 -7744:2:1308 -7745:2:1315 -7746:2:1316 -7747:2:1327 -7748:2:1328 -7749:2:1329 -7750:2:1327 -7751:2:1328 -7752:2:1329 -7753:2:1340 -7754:2:1345 -7755:2:1346 -7756:0:4365 -7757:2:1358 -7758:0:4365 -7759:2:1360 -7760:0:4365 -7761:3:2528 -7762:0:4365 -7763:2:1361 -7764:0:4365 -7765:3:2529 -7766:0:4365 -7767:2:1362 -7768:2:1366 -7769:2:1367 -7770:2:1375 -7771:2:1376 -7772:2:1380 -7773:2:1381 -7774:2:1375 -7775:2:1376 -7776:2:1380 -7777:2:1381 -7778:2:1389 -7779:2:1394 -7780:2:1398 -7781:2:1399 -7782:2:1406 -7783:2:1407 -7784:2:1418 -7785:2:1419 -7786:2:1420 -7787:2:1418 -7788:2:1419 -7789:2:1420 -7790:2:1431 -7791:2:1436 -7792:2:1437 -7793:0:4365 -7794:2:1449 -7795:0:4365 -7796:3:2528 -7797:0:4365 -7798:2:1451 -7799:0:4365 -7800:3:2529 -7801:0:4365 -7802:2:1652 -7803:0:4365 -7804:2:1653 -7805:0:4365 -7806:2:1657 -7807:0:4365 -7808:2:1180 -7809:0:4365 -7810:3:2528 -7811:0:4365 -7812:2:1181 -7813:2:1185 -7814:2:1186 -7815:2:1194 -7816:2:1195 -7817:2:1199 -7818:2:1200 -7819:2:1194 -7820:2:1195 -7821:2:1196 -7822:2:1208 -7823:2:1213 -7824:2:1217 -7825:2:1218 -7826:2:1225 -7827:2:1226 -7828:2:1237 -7829:2:1238 -7830:2:1239 -7831:2:1237 -7832:2:1238 -7833:2:1239 -7834:2:1250 -7835:2:1255 -7836:2:1256 -7837:0:4365 -7838:3:2529 -7839:0:4365 -7840:2:1268 -7841:0:4365 -7842:3:2528 -7843:0:4365 -7844:2:1270 -7845:0:4365 -7846:3:2529 -7847:0:4365 -7848:2:1271 -7849:2:1275 -7850:2:1276 -7851:2:1284 -7852:2:1285 -7853:2:1289 -7854:2:1290 -7855:2:1284 -7856:2:1285 -7857:2:1289 -7858:2:1290 -7859:2:1298 -7860:2:1303 -7861:2:1307 -7862:2:1308 -7863:2:1315 -7864:2:1316 -7865:2:1327 -7866:2:1328 -7867:2:1329 -7868:2:1327 -7869:2:1328 -7870:2:1329 -7871:2:1340 -7872:2:1345 -7873:2:1346 -7874:0:4365 -7875:2:1358 -7876:0:4365 -7877:2:1454 -7878:0:4365 -7879:3:2528 -7880:0:4365 -7881:2:1455 -7882:0:4365 -7883:3:2529 -7884:0:4365 -7885:2:1652 -7886:0:4365 -7887:2:1653 -7888:0:4365 -7889:2:1657 -7890:0:4365 -7891:2:1660 -7892:0:4365 -7893:3:2528 -7894:0:4365 -7895:2:1665 -7896:2:1669 -7897:2:1670 -7898:2:1678 -7899:2:1679 -7900:2:1683 -7901:2:1684 -7902:2:1678 -7903:2:1679 -7904:2:1680 -7905:2:1692 -7906:2:1697 -7907:2:1701 -7908:2:1702 -7909:2:1709 -7910:2:1710 -7911:2:1721 -7912:2:1722 -7913:2:1723 -7914:2:1721 -7915:2:1722 -7916:2:1723 -7917:2:1734 -7918:2:1739 -7919:2:1740 -7920:0:4365 -7921:3:2529 -7922:0:4365 -7923:2:1752 -7924:0:4365 -7925:3:2528 -7926:0:4365 -7927:2:1754 -7928:0:4365 -7929:3:2529 -7930:0:4365 -7931:2:1755 -7932:2:1759 -7933:2:1760 -7934:2:1768 -7935:2:1769 -7936:2:1773 -7937:2:1774 -7938:2:1768 -7939:2:1769 -7940:2:1773 -7941:2:1774 -7942:2:1782 -7943:2:1787 -7944:2:1791 -7945:2:1792 -7946:2:1799 -7947:2:1800 -7948:2:1811 -7949:2:1812 -7950:2:1813 -7951:2:1811 -7952:2:1812 -7953:2:1813 -7954:2:1824 -7955:2:1829 -7956:2:1830 -7957:0:4365 -7958:2:1842 -7959:0:4365 -7960:3:2528 -7961:0:4365 -7962:2:1844 -7963:0:4365 -7964:3:2529 -7965:0:4365 -7966:2:1845 -7967:2:1849 -7968:2:1850 -7969:2:1858 -7970:2:1859 -7971:2:1863 -7972:2:1864 -7973:2:1858 -7974:2:1859 -7975:2:1863 -7976:2:1864 -7977:2:1872 -7978:2:1877 -7979:2:1881 -7980:2:1882 -7981:2:1889 -7982:2:1890 -7983:2:1901 -7984:2:1902 -7985:2:1903 -7986:2:1901 -7987:2:1902 -7988:2:1903 -7989:2:1914 -7990:2:1919 -7991:2:1920 -7992:0:4365 -7993:2:1932 -7994:0:4365 -7995:3:2528 -7996:0:4365 -7997:2:1934 -7998:0:4365 -7999:3:2529 -8000:0:4365 -8001:2:1935 -8002:0:4365 -8003:2:1936 -8004:0:4365 -8005:2:2129 -8006:0:4365 -8007:2:2130 -8008:0:4365 -8009:2:2134 -8010:0:4365 -8011:3:2528 -8012:0:4365 -8013:2:2136 -8014:0:4365 -8015:3:2529 -8016:0:4365 -8017:2:2137 -8018:2:2141 -8019:2:2142 -8020:2:2150 -8021:2:2151 -8022:2:2155 -8023:2:2156 -8024:2:2150 -8025:2:2151 -8026:2:2155 -8027:2:2156 -8028:2:2164 -8029:2:2169 -8030:2:2173 -8031:2:2174 -8032:2:2181 -8033:2:2182 -8034:2:2193 -8035:2:2194 -8036:2:2195 -8037:2:2193 -8038:2:2194 -8039:2:2195 -8040:2:2206 -8041:2:2211 -8042:2:2212 -8043:0:4365 -8044:2:2224 -8045:0:4365 -8046:3:2528 -8047:0:4365 -8048:2:2226 -8049:0:4365 -8050:3:2529 -8051:0:4365 -8052:2:1936 -8053:0:4365 -8054:2:2129 -8055:0:4365 -8056:2:2130 -8057:0:4365 -8058:2:2134 -8059:0:4365 -8060:3:2528 -8061:0:4365 -8062:2:2136 -8063:0:4365 -8064:3:2529 -8065:0:4365 -8066:2:2137 -8067:2:2141 -8068:2:2142 -8069:2:2150 -8070:2:2151 -8071:2:2155 -8072:2:2156 -8073:2:2150 -8074:2:2151 -8075:2:2152 -8076:2:2164 -8077:2:2169 -8078:2:2173 -8079:2:2174 -8080:2:2181 -8081:2:2182 -8082:2:2193 -8083:2:2194 -8084:2:2195 -8085:2:2193 -8086:2:2194 -8087:2:2195 -8088:2:2206 -8089:2:2211 -8090:2:2212 -8091:0:4365 -8092:2:2224 -8093:0:4365 -8094:3:2528 -8095:0:4365 -8096:2:2226 -8097:0:4365 -8098:3:2529 -8099:0:4365 -8100:2:2230 -8101:0:4365 -8102:3:2528 -8103:0:4365 -8104:2:2235 -8105:2:2239 -8106:2:2240 -8107:2:2248 -8108:2:2249 -8109:2:2253 -8110:2:2254 -8111:2:2248 -8112:2:2249 -8113:2:2250 -8114:2:2262 -8115:2:2267 -8116:2:2271 -8117:2:2272 -8118:2:2279 -8119:2:2280 -8120:2:2291 -8121:2:2292 -8122:2:2293 -8123:2:2291 -8124:2:2292 -8125:2:2293 -8126:2:2304 -8127:2:2309 -8128:2:2310 -8129:0:4365 -8130:3:2529 -8131:0:4365 -8132:2:2322 -8133:0:4365 -8134:2:1169 -8135:0:4365 -8136:3:2528 -8137:0:4365 -8138:2:1170 -8139:0:4365 -8140:3:2529 -8141:0:4365 -8142:3:2530 -8143:0:4365 -8144:3:2536 -8145:0:4365 -8146:3:2537 -8147:0:4365 -8148:3:2547 -8149:0:4365 -8150:3:2548 -8151:0:4365 -8152:3:2552 -8153:3:2553 -8154:3:2557 -8155:3:2561 -8156:3:2562 -8157:3:2557 -8158:3:2561 -8159:3:2562 -8160:3:2566 -8161:3:2574 -8162:3:2575 -8163:3:2580 -8164:3:2587 -8165:3:2588 -8166:3:2587 -8167:3:2588 -8168:3:2595 -8169:3:2600 -8170:0:4365 -8171:3:2611 -8172:0:4365 -8173:3:2615 -8174:3:2616 -8175:3:2620 -8176:3:2624 -8177:3:2625 -8178:3:2620 -8179:3:2624 -8180:3:2625 -8181:3:2629 -8182:3:2637 -8183:3:2638 -8184:3:2643 -8185:3:2650 -8186:3:2651 -8187:3:2650 -8188:3:2651 -8189:3:2658 -8190:3:2663 -8191:0:4365 -8192:3:2611 -8193:0:4365 -8194:3:2615 -8195:3:2616 -8196:3:2620 -8197:3:2624 -8198:3:2625 -8199:3:2620 -8200:3:2624 -8201:3:2625 -8202:3:2629 -8203:3:2637 -8204:3:2638 -8205:3:2643 -8206:3:2650 -8207:3:2651 -8208:3:2650 -8209:3:2651 -8210:3:2658 -8211:3:2663 -8212:0:4365 -8213:3:2674 -8214:0:4365 -8215:3:2682 -8216:3:2683 -8217:3:2687 -8218:3:2691 -8219:3:2692 -8220:3:2687 -8221:3:2691 -8222:3:2692 -8223:3:2696 -8224:3:2704 -8225:3:2705 -8226:3:2710 -8227:3:2717 -8228:3:2718 -8229:3:2717 -8230:3:2718 -8231:3:2725 -8232:3:2730 -8233:0:4365 -8234:3:2745 -8235:0:4365 -8236:3:2746 -8237:0:4365 -8238:2:1173 -8239:0:4365 -8240:3:2747 -8241:0:4365 -8242:2:1179 -8243:0:4365 -8244:2:1180 -8245:0:4365 -8246:3:2746 -8247:0:4365 -8248:2:1181 -8249:2:1185 -8250:2:1186 -8251:2:1194 -8252:2:1195 -8253:2:1199 -8254:2:1200 -8255:2:1194 -8256:2:1195 -8257:2:1199 -8258:2:1200 -8259:2:1208 -8260:2:1213 -8261:2:1217 -8262:2:1218 -8263:2:1225 -8264:2:1226 -8265:2:1237 -8266:2:1238 -8267:2:1239 -8268:2:1237 -8269:2:1238 -8270:2:1239 -8271:2:1250 -8272:2:1255 -8273:2:1256 -8274:0:4365 -8275:3:2747 -8276:0:4365 -8277:2:1268 -8278:0:4365 -8279:3:2746 -8280:0:4365 -8281:2:1270 -8282:0:4365 -8283:3:2747 -8284:0:4365 -8285:2:1271 -8286:2:1275 -8287:2:1276 -8288:2:1284 -8289:2:1285 -8290:2:1289 -8291:2:1290 -8292:2:1284 -8293:2:1285 -8294:2:1289 -8295:2:1290 -8296:2:1298 -8297:2:1303 -8298:2:1307 -8299:2:1308 -8300:2:1315 -8301:2:1316 -8302:2:1327 -8303:2:1328 -8304:2:1329 -8305:2:1327 -8306:2:1328 -8307:2:1329 -8308:2:1340 -8309:2:1345 -8310:2:1346 -8311:0:4365 -8312:2:1358 -8313:0:4365 -8314:2:1360 -8315:0:4365 -8316:3:2746 -8317:0:4365 -8318:2:1361 -8319:0:4365 -8320:3:2747 -8321:0:4365 -8322:2:1362 -8323:2:1366 -8324:2:1367 -8325:2:1375 -8326:2:1376 -8327:2:1380 -8328:2:1381 -8329:2:1375 -8330:2:1376 -8331:2:1380 -8332:2:1381 -8333:2:1389 -8334:2:1394 -8335:2:1398 -8336:2:1399 -8337:2:1406 -8338:2:1407 -8339:2:1418 -8340:2:1419 -8341:2:1420 -8342:2:1418 -8343:2:1419 -8344:2:1420 -8345:2:1431 -8346:2:1436 -8347:2:1437 -8348:0:4365 -8349:2:1449 -8350:0:4365 -8351:3:2746 -8352:0:4365 -8353:2:1451 -8354:0:4365 -8355:3:2747 -8356:0:4365 -8357:2:1652 -8358:0:4365 -8359:2:1653 -8360:0:4365 -8361:2:1657 -8362:0:4365 -8363:2:1180 -8364:0:4365 -8365:3:2746 -8366:0:4365 -8367:2:1181 -8368:2:1185 -8369:2:1186 -8370:2:1194 -8371:2:1195 -8372:2:1199 -8373:2:1200 -8374:2:1194 -8375:2:1195 -8376:2:1196 -8377:2:1208 -8378:2:1213 -8379:2:1217 -8380:2:1218 -8381:2:1225 -8382:2:1226 -8383:2:1237 -8384:2:1238 -8385:2:1239 -8386:2:1237 -8387:2:1238 -8388:2:1239 -8389:2:1250 -8390:2:1255 -8391:2:1256 -8392:0:4365 -8393:3:2747 -8394:0:4365 -8395:2:1268 -8396:0:4365 -8397:3:2746 -8398:0:4365 -8399:2:1270 -8400:0:4365 -8401:3:2747 -8402:0:4365 -8403:2:1271 -8404:2:1275 -8405:2:1276 -8406:2:1284 -8407:2:1285 -8408:2:1289 -8409:2:1290 -8410:2:1284 -8411:2:1285 -8412:2:1289 -8413:2:1290 -8414:2:1298 -8415:2:1303 -8416:2:1307 -8417:2:1308 -8418:2:1315 -8419:2:1316 -8420:2:1327 -8421:2:1328 -8422:2:1329 -8423:2:1327 -8424:2:1328 -8425:2:1329 -8426:2:1340 -8427:2:1345 -8428:2:1346 -8429:0:4365 -8430:2:1358 -8431:0:4365 -8432:2:1454 -8433:0:4365 -8434:3:2746 -8435:0:4365 -8436:2:1455 -8437:0:4365 -8438:3:2747 -8439:0:4365 -8440:2:1652 -8441:0:4365 -8442:2:1653 -8443:0:4365 -8444:2:1657 -8445:0:4365 -8446:2:1660 -8447:0:4365 -8448:3:2746 -8449:0:4365 -8450:2:1665 -8451:2:1669 -8452:2:1670 -8453:2:1678 -8454:2:1679 -8455:2:1683 -8456:2:1684 -8457:2:1678 -8458:2:1679 -8459:2:1680 -8460:2:1692 -8461:2:1697 -8462:2:1701 -8463:2:1702 -8464:2:1709 -8465:2:1710 -8466:2:1721 -8467:2:1722 -8468:2:1723 -8469:2:1721 -8470:2:1722 -8471:2:1723 -8472:2:1734 -8473:2:1739 -8474:2:1740 -8475:0:4365 -8476:3:2747 -8477:0:4365 -8478:2:1752 -8479:0:4365 -8480:3:2746 -8481:0:4365 -8482:2:1754 -8483:0:4365 -8484:3:2747 -8485:0:4365 -8486:2:1755 -8487:2:1759 -8488:2:1760 -8489:2:1768 -8490:2:1769 -8491:2:1773 -8492:2:1774 -8493:2:1768 -8494:2:1769 -8495:2:1773 -8496:2:1774 -8497:2:1782 -8498:2:1787 -8499:2:1791 -8500:2:1792 -8501:2:1799 -8502:2:1800 -8503:2:1811 -8504:2:1812 -8505:2:1813 -8506:2:1811 -8507:2:1812 -8508:2:1813 -8509:2:1824 -8510:2:1829 -8511:2:1830 -8512:0:4365 -8513:2:1842 -8514:0:4365 -8515:3:2746 -8516:0:4365 -8517:2:1844 -8518:0:4365 -8519:3:2747 -8520:0:4365 -8521:2:1845 -8522:2:1849 -8523:2:1850 -8524:2:1858 -8525:2:1859 -8526:2:1863 -8527:2:1864 -8528:2:1858 -8529:2:1859 -8530:2:1863 -8531:2:1864 -8532:2:1872 -8533:2:1877 -8534:2:1881 -8535:2:1882 -8536:2:1889 -8537:2:1890 -8538:2:1901 -8539:2:1902 -8540:2:1903 -8541:2:1901 -8542:2:1902 -8543:2:1903 -8544:2:1914 -8545:2:1919 -8546:2:1920 -8547:0:4365 -8548:2:1932 -8549:0:4365 -8550:3:2746 -8551:0:4365 -8552:2:1934 -8553:0:4365 -8554:3:2747 -8555:0:4365 -8556:2:1935 -8557:0:4365 -8558:2:1936 -8559:0:4365 -8560:2:2129 -8561:0:4365 -8562:2:2130 -8563:0:4365 -8564:2:2134 -8565:0:4365 -8566:3:2746 -8567:0:4365 -8568:2:2136 -8569:0:4365 -8570:3:2747 -8571:0:4365 -8572:2:2137 -8573:2:2141 -8574:2:2142 -8575:2:2150 -8576:2:2151 -8577:2:2155 -8578:2:2156 -8579:2:2150 -8580:2:2151 -8581:2:2155 -8582:2:2156 -8583:2:2164 -8584:2:2169 -8585:2:2173 -8586:2:2174 -8587:2:2181 -8588:2:2182 -8589:2:2193 -8590:2:2194 -8591:2:2195 -8592:2:2193 -8593:2:2194 -8594:2:2195 -8595:2:2206 -8596:2:2211 -8597:2:2212 -8598:0:4365 -8599:2:2224 -8600:0:4365 -8601:3:2746 -8602:0:4365 -8603:2:2226 -8604:0:4365 -8605:3:2747 -8606:0:4365 -8607:2:1936 -8608:0:4365 -8609:2:2129 -8610:0:4365 -8611:2:2130 -8612:0:4365 -8613:2:2134 -8614:0:4365 -8615:3:2746 -8616:0:4365 -8617:2:2136 -8618:0:4365 -8619:3:2747 -8620:0:4365 -8621:2:2137 -8622:2:2141 -8623:2:2142 -8624:2:2150 -8625:2:2151 -8626:2:2155 -8627:2:2156 -8628:2:2150 -8629:2:2151 -8630:2:2152 -8631:2:2164 -8632:2:2169 -8633:2:2173 -8634:2:2174 -8635:2:2181 -8636:2:2182 -8637:2:2193 -8638:2:2194 -8639:2:2195 -8640:2:2193 -8641:2:2194 -8642:2:2195 -8643:2:2206 -8644:2:2211 -8645:2:2212 -8646:0:4365 -8647:2:2224 -8648:0:4365 -8649:3:2746 -8650:0:4365 -8651:2:2226 -8652:0:4365 -8653:3:2747 -8654:0:4365 -8655:2:2230 -8656:0:4365 -8657:3:2746 -8658:0:4365 -8659:2:2235 -8660:2:2239 -8661:2:2240 -8662:2:2248 -8663:2:2249 -8664:2:2253 -8665:2:2254 -8666:2:2248 -8667:2:2249 -8668:2:2250 -8669:2:2262 -8670:2:2267 -8671:2:2271 -8672:2:2272 -8673:2:2279 -8674:2:2280 -8675:2:2291 -8676:2:2292 -8677:2:2293 -8678:2:2291 -8679:2:2292 -8680:2:2293 -8681:2:2304 -8682:2:2309 -8683:2:2310 -8684:0:4365 -8685:3:2747 -8686:0:4365 -8687:2:2322 -8688:0:4365 -8689:2:1169 -8690:0:4365 -8691:3:2746 -8692:0:4365 -8693:2:1170 -8694:0:4365 -8695:3:2747 -8696:0:4365 -8697:3:2748 -8698:0:4365 -8699:3:2754 -8700:0:4365 -8701:3:2755 -8702:3:2759 -8703:3:2760 -8704:3:2768 -8705:3:2769 -8706:3:2773 -8707:3:2774 -8708:3:2768 -8709:3:2769 -8710:3:2773 -8711:3:2774 -8712:3:2782 -8713:3:2787 -8714:3:2791 -8715:3:2792 -8716:3:2799 -8717:3:2800 -8718:3:2811 -8719:3:2812 -8720:3:2813 -8721:3:2811 -8722:3:2812 -8723:3:2813 -8724:3:2824 -8725:3:2829 -8726:3:2830 -8727:0:4365 -8728:3:2842 -8729:0:4365 -8730:3:2843 -8731:0:4365 -8732:2:1173 -8733:0:4365 -8734:3:2844 -8735:0:4365 -8736:2:1179 -8737:0:4365 -8738:2:1180 -8739:0:4365 -8740:3:2843 -8741:0:4365 -8742:2:1181 -8743:2:1185 -8744:2:1186 -8745:2:1194 -8746:2:1195 -8747:2:1199 -8748:2:1200 -8749:2:1194 -8750:2:1195 -8751:2:1199 -8752:2:1200 -8753:2:1208 -8754:2:1213 -8755:2:1217 -8756:2:1218 -8757:2:1225 -8758:2:1226 -8759:2:1237 -8760:2:1238 -8761:2:1239 -8762:2:1237 -8763:2:1238 -8764:2:1239 -8765:2:1250 -8766:2:1255 -8767:2:1256 -8768:0:4365 -8769:3:2844 -8770:0:4365 -8771:2:1268 -8772:0:4365 -8773:3:2843 -8774:0:4365 -8775:2:1270 -8776:0:4365 -8777:3:2844 -8778:0:4365 -8779:2:1271 -8780:2:1275 -8781:2:1276 -8782:2:1284 -8783:2:1285 -8784:2:1289 -8785:2:1290 -8786:2:1284 -8787:2:1285 -8788:2:1289 -8789:2:1290 -8790:2:1298 -8791:2:1303 -8792:2:1307 -8793:2:1308 -8794:2:1315 -8795:2:1316 -8796:2:1327 -8797:2:1328 -8798:2:1329 -8799:2:1327 -8800:2:1328 -8801:2:1329 -8802:2:1340 -8803:2:1345 -8804:2:1346 -8805:0:4365 -8806:2:1358 -8807:0:4365 -8808:2:1360 -8809:0:4365 -8810:3:2843 -8811:0:4365 -8812:2:1361 -8813:0:4365 -8814:3:2844 -8815:0:4365 -8816:2:1362 -8817:2:1366 -8818:2:1367 -8819:2:1375 -8820:2:1376 -8821:2:1380 -8822:2:1381 -8823:2:1375 -8824:2:1376 -8825:2:1380 -8826:2:1381 -8827:2:1389 -8828:2:1394 -8829:2:1398 -8830:2:1399 -8831:2:1406 -8832:2:1407 -8833:2:1418 -8834:2:1419 -8835:2:1420 -8836:2:1418 -8837:2:1419 -8838:2:1420 -8839:2:1431 -8840:2:1436 -8841:2:1437 -8842:0:4365 -8843:2:1449 -8844:0:4365 -8845:3:2843 -8846:0:4365 -8847:2:1451 -8848:0:4365 -8849:3:2844 -8850:0:4365 -8851:2:1652 -8852:0:4365 -8853:2:1653 -8854:0:4365 -8855:2:1657 -8856:0:4365 -8857:2:1180 -8858:0:4365 -8859:3:2843 -8860:0:4365 -8861:2:1181 -8862:2:1185 -8863:2:1186 -8864:2:1194 -8865:2:1195 -8866:2:1199 -8867:2:1200 -8868:2:1194 -8869:2:1195 -8870:2:1196 -8871:2:1208 -8872:2:1213 -8873:2:1217 -8874:2:1218 -8875:2:1225 -8876:2:1226 -8877:2:1237 -8878:2:1238 -8879:2:1239 -8880:2:1237 -8881:2:1238 -8882:2:1239 -8883:2:1250 -8884:2:1255 -8885:2:1256 -8886:0:4365 -8887:3:2844 -8888:0:4365 -8889:2:1268 -8890:0:4365 -8891:3:2843 -8892:0:4365 -8893:2:1270 -8894:0:4365 -8895:3:2844 -8896:0:4365 -8897:2:1271 -8898:2:1275 -8899:2:1276 -8900:2:1284 -8901:2:1285 -8902:2:1289 -8903:2:1290 -8904:2:1284 -8905:2:1285 -8906:2:1289 -8907:2:1290 -8908:2:1298 -8909:2:1303 -8910:2:1307 -8911:2:1308 -8912:2:1315 -8913:2:1316 -8914:2:1327 -8915:2:1328 -8916:2:1329 -8917:2:1327 -8918:2:1328 -8919:2:1329 -8920:2:1340 -8921:2:1345 -8922:2:1346 -8923:0:4365 -8924:2:1358 -8925:0:4365 -8926:2:1454 -8927:0:4365 -8928:3:2843 -8929:0:4365 -8930:2:1455 -8931:0:4365 -8932:3:2844 -8933:0:4365 -8934:2:1652 -8935:0:4365 -8936:2:1653 -8937:0:4365 -8938:2:1657 -8939:0:4365 -8940:2:1660 -8941:0:4365 -8942:3:2843 -8943:0:4365 -8944:2:1665 -8945:2:1669 -8946:2:1670 -8947:2:1678 -8948:2:1679 -8949:2:1683 -8950:2:1684 -8951:2:1678 -8952:2:1679 -8953:2:1680 -8954:2:1692 -8955:2:1697 -8956:2:1701 -8957:2:1702 -8958:2:1709 -8959:2:1710 -8960:2:1721 -8961:2:1722 -8962:2:1723 -8963:2:1721 -8964:2:1722 -8965:2:1723 -8966:2:1734 -8967:2:1739 -8968:2:1740 -8969:0:4365 -8970:3:2844 -8971:0:4365 -8972:2:1752 -8973:0:4365 -8974:3:2843 -8975:0:4365 -8976:2:1754 -8977:0:4365 -8978:3:2844 -8979:0:4365 -8980:2:1755 -8981:2:1759 -8982:2:1760 -8983:2:1768 -8984:2:1769 -8985:2:1773 -8986:2:1774 -8987:2:1768 -8988:2:1769 -8989:2:1773 -8990:2:1774 -8991:2:1782 -8992:2:1787 -8993:2:1791 -8994:2:1792 -8995:2:1799 -8996:2:1800 -8997:2:1811 -8998:2:1812 -8999:2:1813 -9000:2:1811 -9001:2:1812 -9002:2:1813 -9003:2:1824 -9004:2:1829 -9005:2:1830 -9006:0:4365 -9007:2:1842 -9008:0:4365 -9009:3:2843 -9010:0:4365 -9011:2:1844 -9012:0:4365 -9013:3:2844 -9014:0:4365 -9015:2:1845 -9016:2:1849 -9017:2:1850 -9018:2:1858 -9019:2:1859 -9020:2:1863 -9021:2:1864 -9022:2:1858 -9023:2:1859 -9024:2:1863 -9025:2:1864 -9026:2:1872 -9027:2:1877 -9028:2:1881 -9029:2:1882 -9030:2:1889 -9031:2:1890 -9032:2:1901 -9033:2:1902 -9034:2:1903 -9035:2:1901 -9036:2:1902 -9037:2:1903 -9038:2:1914 -9039:2:1919 -9040:2:1920 -9041:0:4365 -9042:2:1932 -9043:0:4365 -9044:3:2843 -9045:0:4365 -9046:2:1934 -9047:0:4365 -9048:3:2844 -9049:0:4365 -9050:2:1935 -9051:0:4365 -9052:2:1936 -9053:0:4365 -9054:2:2129 -9055:0:4365 -9056:2:2130 -9057:0:4365 -9058:2:2134 -9059:0:4365 -9060:3:2843 -9061:0:4365 -9062:2:2136 -9063:0:4365 -9064:3:2844 -9065:0:4365 -9066:2:2137 -9067:2:2141 -9068:2:2142 -9069:2:2150 -9070:2:2151 -9071:2:2155 -9072:2:2156 -9073:2:2150 -9074:2:2151 -9075:2:2155 -9076:2:2156 -9077:2:2164 -9078:2:2169 -9079:2:2173 -9080:2:2174 -9081:2:2181 -9082:2:2182 -9083:2:2193 -9084:2:2194 -9085:2:2195 -9086:2:2193 -9087:2:2194 -9088:2:2195 -9089:2:2206 -9090:2:2211 -9091:2:2212 -9092:0:4365 -9093:2:2224 -9094:0:4365 -9095:3:2843 -9096:0:4365 -9097:2:2226 -9098:0:4365 -9099:3:2844 -9100:0:4365 -9101:2:1936 -9102:0:4365 -9103:2:2129 -9104:0:4365 -9105:2:2130 -9106:0:4365 -9107:2:2134 -9108:0:4365 -9109:3:2843 -9110:0:4365 -9111:2:2136 -9112:0:4365 -9113:3:2844 -9114:0:4365 -9115:2:2137 -9116:2:2141 -9117:2:2142 -9118:2:2150 -9119:2:2151 -9120:2:2155 -9121:2:2156 -9122:2:2150 -9123:2:2151 -9124:2:2152 -9125:2:2164 -9126:2:2169 -9127:2:2173 -9128:2:2174 -9129:2:2181 -9130:2:2182 -9131:2:2193 -9132:2:2194 -9133:2:2195 -9134:2:2193 -9135:2:2194 -9136:2:2195 -9137:2:2206 -9138:2:2211 -9139:2:2212 -9140:0:4365 -9141:2:2224 -9142:0:4365 -9143:3:2843 -9144:0:4365 -9145:2:2226 -9146:0:4365 -9147:3:2844 -9148:0:4365 -9149:2:2230 -9150:0:4365 -9151:3:2843 -9152:0:4365 -9153:2:2235 -9154:2:2239 -9155:2:2240 -9156:2:2248 -9157:2:2249 -9158:2:2253 -9159:2:2254 -9160:2:2248 -9161:2:2249 -9162:2:2250 -9163:2:2262 -9164:2:2267 -9165:2:2271 -9166:2:2272 -9167:2:2279 -9168:2:2280 -9169:2:2291 -9170:2:2292 -9171:2:2293 -9172:2:2291 -9173:2:2292 -9174:2:2293 -9175:2:2304 -9176:2:2309 -9177:2:2310 -9178:0:4365 -9179:3:2844 -9180:0:4365 -9181:2:2322 -9182:0:4365 -9183:2:1169 -9184:0:4365 -9185:3:2843 -9186:0:4365 -9187:2:1170 -9188:0:4365 -9189:3:2844 -9190:0:4365 -9191:3:2845 -9192:0:4365 -9193:3:2851 -9194:0:4365 -9195:3:2854 -9196:3:2855 -9197:3:2867 -9198:3:2868 -9199:3:2872 -9200:3:2873 -9201:3:2867 -9202:3:2868 -9203:3:2872 -9204:3:2873 -9205:3:2881 -9206:3:2886 -9207:3:2890 -9208:3:2891 -9209:3:2898 -9210:3:2899 -9211:3:2910 -9212:3:2911 -9213:3:2912 -9214:3:2910 -9215:3:2911 -9216:3:2912 -9217:3:2923 -9218:3:2928 -9219:3:2929 -9220:0:4365 -9221:3:2941 -9222:0:4365 -9223:3:2942 -9224:0:4365 -9225:2:1173 -9226:0:4365 -9227:3:2943 -9228:0:4365 -9229:2:1179 -9230:0:4365 -9231:2:1180 -9232:0:4365 -9233:3:2942 -9234:0:4365 -9235:2:1181 -9236:2:1185 -9237:2:1186 -9238:2:1194 -9239:2:1195 -9240:2:1199 -9241:2:1200 -9242:2:1194 -9243:2:1195 -9244:2:1199 -9245:2:1200 -9246:2:1208 -9247:2:1213 -9248:2:1217 -9249:2:1218 -9250:2:1225 -9251:2:1226 -9252:2:1237 -9253:2:1238 -9254:2:1239 -9255:2:1237 -9256:2:1238 -9257:2:1239 -9258:2:1250 -9259:2:1255 -9260:2:1256 -9261:0:4365 -9262:3:2943 -9263:0:4365 -9264:2:1268 -9265:0:4365 -9266:3:2942 -9267:0:4365 -9268:2:1270 -9269:0:4365 -9270:3:2943 -9271:0:4365 -9272:2:1271 -9273:2:1275 -9274:2:1276 -9275:2:1284 -9276:2:1285 -9277:2:1289 -9278:2:1290 -9279:2:1284 -9280:2:1285 -9281:2:1289 -9282:2:1290 -9283:2:1298 -9284:2:1303 -9285:2:1307 -9286:2:1308 -9287:2:1315 -9288:2:1316 -9289:2:1327 -9290:2:1328 -9291:2:1329 -9292:2:1327 -9293:2:1328 -9294:2:1329 -9295:2:1340 -9296:2:1345 -9297:2:1346 -9298:0:4365 -9299:2:1358 -9300:0:4365 -9301:2:1360 -9302:0:4365 -9303:3:2942 -9304:0:4365 -9305:2:1361 -9306:0:4365 -9307:3:2943 -9308:0:4365 -9309:2:1362 -9310:2:1366 -9311:2:1367 -9312:2:1375 -9313:2:1376 -9314:2:1380 -9315:2:1381 -9316:2:1375 -9317:2:1376 -9318:2:1380 -9319:2:1381 -9320:2:1389 -9321:2:1394 -9322:2:1398 -9323:2:1399 -9324:2:1406 -9325:2:1407 -9326:2:1418 -9327:2:1419 -9328:2:1420 -9329:2:1418 -9330:2:1419 -9331:2:1420 -9332:2:1431 -9333:2:1436 -9334:2:1437 -9335:0:4365 -9336:2:1449 -9337:0:4365 -9338:3:2942 -9339:0:4365 -9340:2:1451 -9341:0:4365 -9342:3:2943 -9343:0:4365 -9344:2:1652 -9345:0:4365 -9346:2:1653 -9347:0:4365 -9348:2:1657 -9349:0:4365 -9350:2:1180 -9351:0:4365 -9352:3:2942 -9353:0:4365 -9354:2:1181 -9355:2:1185 -9356:2:1186 -9357:2:1194 -9358:2:1195 -9359:2:1199 -9360:2:1200 -9361:2:1194 -9362:2:1195 -9363:2:1196 -9364:2:1208 -9365:2:1213 -9366:2:1217 -9367:2:1218 -9368:2:1225 -9369:2:1226 -9370:2:1237 -9371:2:1238 -9372:2:1239 -9373:2:1237 -9374:2:1238 -9375:2:1239 -9376:2:1250 -9377:2:1255 -9378:2:1256 -9379:0:4365 -9380:3:2943 -9381:0:4365 -9382:2:1268 -9383:0:4365 -9384:3:2942 -9385:0:4365 -9386:2:1270 -9387:0:4365 -9388:3:2943 -9389:0:4365 -9390:2:1271 -9391:2:1275 -9392:2:1276 -9393:2:1284 -9394:2:1285 -9395:2:1289 -9396:2:1290 -9397:2:1284 -9398:2:1285 -9399:2:1289 -9400:2:1290 -9401:2:1298 -9402:2:1303 -9403:2:1307 -9404:2:1308 -9405:2:1315 -9406:2:1316 -9407:2:1327 -9408:2:1328 -9409:2:1329 -9410:2:1327 -9411:2:1328 -9412:2:1329 -9413:2:1340 -9414:2:1345 -9415:2:1346 -9416:0:4365 -9417:2:1358 -9418:0:4365 -9419:2:1454 -9420:0:4365 -9421:3:2942 -9422:0:4365 -9423:2:1455 -9424:0:4365 -9425:3:2943 -9426:0:4365 -9427:2:1652 -9428:0:4365 -9429:2:1653 -9430:0:4365 -9431:2:1657 -9432:0:4365 -9433:2:1660 -9434:0:4365 -9435:3:2942 -9436:0:4365 -9437:2:1665 -9438:2:1669 -9439:2:1670 -9440:2:1678 -9441:2:1679 -9442:2:1683 -9443:2:1684 -9444:2:1678 -9445:2:1679 -9446:2:1680 -9447:2:1692 -9448:2:1697 -9449:2:1701 -9450:2:1702 -9451:2:1709 -9452:2:1710 -9453:2:1721 -9454:2:1722 -9455:2:1723 -9456:2:1721 -9457:2:1722 -9458:2:1723 -9459:2:1734 -9460:2:1739 -9461:2:1740 -9462:0:4365 -9463:3:2943 -9464:0:4365 -9465:2:1752 -9466:0:4365 -9467:3:2942 -9468:0:4365 -9469:2:1754 -9470:0:4365 -9471:3:2943 -9472:0:4365 -9473:2:1755 -9474:2:1759 -9475:2:1760 -9476:2:1768 -9477:2:1769 -9478:2:1773 -9479:2:1774 -9480:2:1768 -9481:2:1769 -9482:2:1773 -9483:2:1774 -9484:2:1782 -9485:2:1787 -9486:2:1791 -9487:2:1792 -9488:2:1799 -9489:2:1800 -9490:2:1811 -9491:2:1812 -9492:2:1813 -9493:2:1811 -9494:2:1812 -9495:2:1813 -9496:2:1824 -9497:2:1829 -9498:2:1830 -9499:0:4365 -9500:2:1842 -9501:0:4365 -9502:3:2942 -9503:0:4365 -9504:2:1844 -9505:0:4365 -9506:3:2943 -9507:0:4365 -9508:2:1845 -9509:2:1849 -9510:2:1850 -9511:2:1858 -9512:2:1859 -9513:2:1863 -9514:2:1864 -9515:2:1858 -9516:2:1859 -9517:2:1863 -9518:2:1864 -9519:2:1872 -9520:2:1877 -9521:2:1881 -9522:2:1882 -9523:2:1889 -9524:2:1890 -9525:2:1901 -9526:2:1902 -9527:2:1903 -9528:2:1901 -9529:2:1902 -9530:2:1903 -9531:2:1914 -9532:2:1919 -9533:2:1920 -9534:0:4365 -9535:2:1932 -9536:0:4365 -9537:3:2942 -9538:0:4365 -9539:2:1934 -9540:0:4365 -9541:3:2943 -9542:0:4365 -9543:2:1935 -9544:0:4365 -9545:2:1936 -9546:0:4365 -9547:2:2129 -9548:0:4365 -9549:2:2130 -9550:0:4365 -9551:2:2134 -9552:0:4365 -9553:3:2942 -9554:0:4365 -9555:2:2136 -9556:0:4365 -9557:3:2943 -9558:0:4365 -9559:2:2137 -9560:2:2141 -9561:2:2142 -9562:2:2150 -9563:2:2151 -9564:2:2155 -9565:2:2156 -9566:2:2150 -9567:2:2151 -9568:2:2155 -9569:2:2156 -9570:2:2164 -9571:2:2169 -9572:2:2173 -9573:2:2174 -9574:2:2181 -9575:2:2182 -9576:2:2193 -9577:2:2194 -9578:2:2195 -9579:2:2193 -9580:2:2194 -9581:2:2195 -9582:2:2206 -9583:2:2211 -9584:2:2212 -9585:0:4365 -9586:2:2224 -9587:0:4365 -9588:3:2942 -9589:0:4365 -9590:2:2226 -9591:0:4365 -9592:3:2943 -9593:0:4365 -9594:2:1936 -9595:0:4365 -9596:2:2129 -9597:0:4365 -9598:2:2130 -9599:0:4365 -9600:2:2134 -9601:0:4365 -9602:3:2942 -9603:0:4365 -9604:2:2136 -9605:0:4365 -9606:3:2943 -9607:0:4365 -9608:2:2137 -9609:2:2141 -9610:2:2142 -9611:2:2150 -9612:2:2151 -9613:2:2155 -9614:2:2156 -9615:2:2150 -9616:2:2151 -9617:2:2152 -9618:2:2164 -9619:2:2169 -9620:2:2173 -9621:2:2174 -9622:2:2181 -9623:2:2182 -9624:2:2193 -9625:2:2194 -9626:2:2195 -9627:2:2193 -9628:2:2194 -9629:2:2195 -9630:2:2206 -9631:2:2211 -9632:2:2212 -9633:0:4365 -9634:2:2224 -9635:0:4365 -9636:3:2942 -9637:0:4365 -9638:2:2226 -9639:0:4365 -9640:3:2943 -9641:0:4365 -9642:2:2230 -9643:0:4365 -9644:3:2942 -9645:0:4365 -9646:2:2235 -9647:2:2239 -9648:2:2240 -9649:2:2248 -9650:2:2249 -9651:2:2253 -9652:2:2254 -9653:2:2248 -9654:2:2249 -9655:2:2250 -9656:2:2262 -9657:2:2267 -9658:2:2271 -9659:2:2272 -9660:2:2279 -9661:2:2280 -9662:2:2291 -9663:2:2292 -9664:2:2293 -9665:2:2291 -9666:2:2292 -9667:2:2293 -9668:2:2304 -9669:2:2309 -9670:2:2310 -9671:0:4365 -9672:3:2943 -9673:0:4365 -9674:2:2322 -9675:0:4365 -9676:2:1169 -9677:0:4365 -9678:3:2942 -9679:0:4365 -9680:2:1170 -9681:0:4365 -9682:3:2943 -9683:0:4365 -9684:3:2944 -9685:0:4365 -9686:3:2950 -9687:0:4365 -9688:3:2951 -9689:0:4365 -9690:3:2952 -9691:0:4365 -9692:3:2953 -9693:0:4365 -9694:3:2954 -9695:3:2958 -9696:3:2959 -9697:3:2967 -9698:3:2968 -9699:3:2972 -9700:3:2973 -9701:3:2967 -9702:3:2968 -9703:3:2972 -9704:3:2973 -9705:3:2981 -9706:3:2986 -9707:3:2990 -9708:3:2991 -9709:3:2998 -9710:3:2999 -9711:3:3010 -9712:3:3011 -9713:3:3012 -9714:3:3010 -9715:3:3011 -9716:3:3012 -9717:3:3023 -9718:3:3028 -9719:3:3029 -9720:0:4365 -9721:3:3041 -9722:0:4365 -9723:3:3042 -9724:0:4365 -9725:2:1173 -9726:0:4365 -9727:3:3043 -9728:0:4365 -9729:2:1179 -9730:0:4365 -9731:2:1180 -9732:0:4365 -9733:3:3042 -9734:0:4365 -9735:2:1181 -9736:2:1185 -9737:2:1186 -9738:2:1194 -9739:2:1195 -9740:2:1199 -9741:2:1200 -9742:2:1194 -9743:2:1195 -9744:2:1199 -9745:2:1200 -9746:2:1208 -9747:2:1213 -9748:2:1217 -9749:2:1218 -9750:2:1225 -9751:2:1226 -9752:2:1237 -9753:2:1238 -9754:2:1239 -9755:2:1237 -9756:2:1238 -9757:2:1239 -9758:2:1250 -9759:2:1255 -9760:2:1256 -9761:0:4365 -9762:3:3043 -9763:0:4365 -9764:2:1268 -9765:0:4365 -9766:3:3042 -9767:0:4365 -9768:2:1270 -9769:0:4365 -9770:3:3043 -9771:0:4365 -9772:2:1271 -9773:2:1275 -9774:2:1276 -9775:2:1284 -9776:2:1285 -9777:2:1289 -9778:2:1290 -9779:2:1284 -9780:2:1285 -9781:2:1289 -9782:2:1290 -9783:2:1298 -9784:2:1303 -9785:2:1307 -9786:2:1308 -9787:2:1315 -9788:2:1316 -9789:2:1327 -9790:2:1328 -9791:2:1329 -9792:2:1327 -9793:2:1328 -9794:2:1329 -9795:2:1340 -9796:2:1345 -9797:2:1346 -9798:0:4365 -9799:2:1358 -9800:0:4365 -9801:2:1360 -9802:0:4365 -9803:3:3042 -9804:0:4365 -9805:2:1361 -9806:0:4365 -9807:3:3043 -9808:0:4365 -9809:2:1362 -9810:2:1366 -9811:2:1367 -9812:2:1375 -9813:2:1376 -9814:2:1380 -9815:2:1381 -9816:2:1375 -9817:2:1376 -9818:2:1380 -9819:2:1381 -9820:2:1389 -9821:2:1394 -9822:2:1398 -9823:2:1399 -9824:2:1406 -9825:2:1407 -9826:2:1418 -9827:2:1419 -9828:2:1420 -9829:2:1418 -9830:2:1419 -9831:2:1420 -9832:2:1431 -9833:2:1436 -9834:2:1437 -9835:0:4365 -9836:2:1449 -9837:0:4365 -9838:3:3042 -9839:0:4365 -9840:2:1451 -9841:0:4365 -9842:3:3043 -9843:0:4365 -9844:2:1652 -9845:0:4365 -9846:2:1653 -9847:0:4365 -9848:2:1657 -9849:0:4365 -9850:2:1180 -9851:0:4365 -9852:3:3042 -9853:0:4365 -9854:2:1181 -9855:2:1185 -9856:2:1186 -9857:2:1194 -9858:2:1195 -9859:2:1199 -9860:2:1200 -9861:2:1194 -9862:2:1195 -9863:2:1196 -9864:2:1208 -9865:2:1213 -9866:2:1217 -9867:2:1218 -9868:2:1225 -9869:2:1226 -9870:2:1237 -9871:2:1238 -9872:2:1239 -9873:2:1237 -9874:2:1238 -9875:2:1239 -9876:2:1250 -9877:2:1255 -9878:2:1256 -9879:0:4365 -9880:3:3043 -9881:0:4365 -9882:2:1268 -9883:0:4365 -9884:3:3042 -9885:0:4365 -9886:2:1270 -9887:0:4365 -9888:3:3043 -9889:0:4365 -9890:2:1271 -9891:2:1275 -9892:2:1276 -9893:2:1284 -9894:2:1285 -9895:2:1289 -9896:2:1290 -9897:2:1284 -9898:2:1285 -9899:2:1289 -9900:2:1290 -9901:2:1298 -9902:2:1303 -9903:2:1307 -9904:2:1308 -9905:2:1315 -9906:2:1316 -9907:2:1327 -9908:2:1328 -9909:2:1329 -9910:2:1327 -9911:2:1328 -9912:2:1329 -9913:2:1340 -9914:2:1345 -9915:2:1346 -9916:0:4365 -9917:2:1358 -9918:0:4365 -9919:2:1454 -9920:0:4365 -9921:3:3042 -9922:0:4365 -9923:2:1455 -9924:0:4365 -9925:3:3043 -9926:0:4365 -9927:2:1652 -9928:0:4365 -9929:2:1653 -9930:0:4365 -9931:2:1657 -9932:0:4365 -9933:2:1660 -9934:0:4365 -9935:3:3042 -9936:0:4365 -9937:2:1665 -9938:2:1669 -9939:2:1670 -9940:2:1678 -9941:2:1679 -9942:2:1683 -9943:2:1684 -9944:2:1678 -9945:2:1679 -9946:2:1680 -9947:2:1692 -9948:2:1697 -9949:2:1701 -9950:2:1702 -9951:2:1709 -9952:2:1710 -9953:2:1721 -9954:2:1722 -9955:2:1723 -9956:2:1721 -9957:2:1722 -9958:2:1723 -9959:2:1734 -9960:2:1739 -9961:2:1740 -9962:0:4365 -9963:3:3043 -9964:0:4365 -9965:2:1752 -9966:0:4365 -9967:3:3042 -9968:0:4365 -9969:2:1754 -9970:0:4365 -9971:3:3043 -9972:0:4365 -9973:2:1755 -9974:2:1759 -9975:2:1760 -9976:2:1768 -9977:2:1769 -9978:2:1773 -9979:2:1774 -9980:2:1768 -9981:2:1769 -9982:2:1773 -9983:2:1774 -9984:2:1782 -9985:2:1787 -9986:2:1791 -9987:2:1792 -9988:2:1799 -9989:2:1800 -9990:2:1811 -9991:2:1812 -9992:2:1813 -9993:2:1811 -9994:2:1812 -9995:2:1813 -9996:2:1824 -9997:2:1829 -9998:2:1830 -9999:0:4365 -10000:2:1842 -10001:0:4365 -10002:3:3042 -10003:0:4365 -10004:2:1844 -10005:0:4365 -10006:3:3043 -10007:0:4365 -10008:2:1845 -10009:2:1849 -10010:2:1850 -10011:2:1858 -10012:2:1859 -10013:2:1863 -10014:2:1864 -10015:2:1858 -10016:2:1859 -10017:2:1863 -10018:2:1864 -10019:2:1872 -10020:2:1877 -10021:2:1881 -10022:2:1882 -10023:2:1889 -10024:2:1890 -10025:2:1901 -10026:2:1902 -10027:2:1903 -10028:2:1901 -10029:2:1902 -10030:2:1903 -10031:2:1914 -10032:2:1919 -10033:2:1920 -10034:0:4365 -10035:2:1932 -10036:0:4365 -10037:3:3042 -10038:0:4365 -10039:2:1934 -10040:0:4365 -10041:3:3043 -10042:0:4365 -10043:2:1935 -10044:0:4365 -10045:2:1936 -10046:0:4365 -10047:2:2129 -10048:0:4365 -10049:2:2130 -10050:0:4365 -10051:2:2134 -10052:0:4365 -10053:3:3042 -10054:0:4365 -10055:2:2136 -10056:0:4365 -10057:3:3043 -10058:0:4365 -10059:2:2137 -10060:2:2141 -10061:2:2142 -10062:2:2150 -10063:2:2151 -10064:2:2155 -10065:2:2156 -10066:2:2150 -10067:2:2151 -10068:2:2155 -10069:2:2156 -10070:2:2164 -10071:2:2169 -10072:2:2173 -10073:2:2174 -10074:2:2181 -10075:2:2182 -10076:2:2193 -10077:2:2194 -10078:2:2195 -10079:2:2193 -10080:2:2194 -10081:2:2195 -10082:2:2206 -10083:2:2211 -10084:2:2212 -10085:0:4365 -10086:2:2224 -10087:0:4365 -10088:3:3042 -10089:0:4365 -10090:2:2226 -10091:0:4365 -10092:3:3043 -10093:0:4365 -10094:2:1936 -10095:0:4365 -10096:2:2129 -10097:0:4365 -10098:2:2130 -10099:0:4365 -10100:2:2134 -10101:0:4365 -10102:3:3042 -10103:0:4365 -10104:2:2136 -10105:0:4365 -10106:3:3043 -10107:0:4365 -10108:2:2137 -10109:2:2141 -10110:2:2142 -10111:2:2150 -10112:2:2151 -10113:2:2155 -10114:2:2156 -10115:2:2150 -10116:2:2151 -10117:2:2152 -10118:2:2164 -10119:2:2169 -10120:2:2173 -10121:2:2174 -10122:2:2181 -10123:2:2182 -10124:2:2193 -10125:2:2194 -10126:2:2195 -10127:2:2193 -10128:2:2194 -10129:2:2195 -10130:2:2206 -10131:2:2211 -10132:2:2212 -10133:0:4365 -10134:2:2224 -10135:0:4365 -10136:3:3042 -10137:0:4365 -10138:2:2226 -10139:0:4365 -10140:3:3043 -10141:0:4365 -10142:2:2230 -10143:0:4365 -10144:3:3042 -10145:0:4365 -10146:2:2235 -10147:2:2239 -10148:2:2240 -10149:2:2248 -10150:2:2249 -10151:2:2253 -10152:2:2254 -10153:2:2248 -10154:2:2249 -10155:2:2250 -10156:2:2262 -10157:2:2267 -10158:2:2271 -10159:2:2272 -10160:2:2279 -10161:2:2280 -10162:2:2291 -10163:2:2292 -10164:2:2293 -10165:2:2291 -10166:2:2292 -10167:2:2293 -10168:2:2304 -10169:2:2309 -10170:2:2310 -10171:0:4365 -10172:3:3043 -10173:0:4365 -10174:2:2322 -10175:0:4365 -10176:2:1169 -10177:0:4365 -10178:3:3042 -10179:0:4365 -10180:2:1170 -10181:0:4365 -10182:3:3043 -10183:0:4365 -10184:3:3044 -10185:0:4365 -10186:3:3257 -10187:0:4365 -10188:3:3265 -10189:0:4365 -10190:3:3266 -10191:3:3270 -10192:3:3271 -10193:3:3279 -10194:3:3280 -10195:3:3284 -10196:3:3285 -10197:3:3279 -10198:3:3280 -10199:3:3284 -10200:3:3285 -10201:3:3293 -10202:3:3298 -10203:3:3302 -10204:3:3303 -10205:3:3310 -10206:3:3311 -10207:3:3322 -10208:3:3323 -10209:3:3324 -10210:3:3322 -10211:3:3323 -10212:3:3324 -10213:3:3335 -10214:3:3340 -10215:3:3341 -10216:0:4365 -10217:3:3353 -10218:0:4365 -10219:3:3354 -10220:0:4365 -10221:2:1173 -10222:0:4365 -10223:3:3355 -10224:0:4365 -10225:2:1179 -10226:0:4365 -10227:2:1180 -10228:0:4365 -10229:3:3354 -10230:0:4365 -10231:2:1181 -10232:2:1185 -10233:2:1186 -10234:2:1194 -10235:2:1195 -10236:2:1199 -10237:2:1200 -10238:2:1194 -10239:2:1195 -10240:2:1199 -10241:2:1200 -10242:2:1208 -10243:2:1213 -10244:2:1217 -10245:2:1218 -10246:2:1225 -10247:2:1226 -10248:2:1237 -10249:2:1238 -10250:2:1239 -10251:2:1237 -10252:2:1238 -10253:2:1239 -10254:2:1250 -10255:2:1255 -10256:2:1256 -10257:0:4365 -10258:3:3355 -10259:0:4365 -10260:2:1268 -10261:0:4365 -10262:3:3354 -10263:0:4365 -10264:2:1270 -10265:0:4365 -10266:3:3355 -10267:0:4365 -10268:2:1271 -10269:2:1275 -10270:2:1276 -10271:2:1284 -10272:2:1285 -10273:2:1289 -10274:2:1290 -10275:2:1284 -10276:2:1285 -10277:2:1289 -10278:2:1290 -10279:2:1298 -10280:2:1303 -10281:2:1307 -10282:2:1308 -10283:2:1315 -10284:2:1316 -10285:2:1327 -10286:2:1328 -10287:2:1329 -10288:2:1327 -10289:2:1328 -10290:2:1329 -10291:2:1340 -10292:2:1345 -10293:2:1346 -10294:0:4365 -10295:2:1358 -10296:0:4365 -10297:2:1360 -10298:0:4365 -10299:3:3354 -10300:0:4365 -10301:2:1361 -10302:0:4365 -10303:3:3355 -10304:0:4365 -10305:2:1362 -10306:2:1366 -10307:2:1367 -10308:2:1375 -10309:2:1376 -10310:2:1380 -10311:2:1381 -10312:2:1375 -10313:2:1376 -10314:2:1380 -10315:2:1381 -10316:2:1389 -10317:2:1394 -10318:2:1398 -10319:2:1399 -10320:2:1406 -10321:2:1407 -10322:2:1418 -10323:2:1419 -10324:2:1420 -10325:2:1418 -10326:2:1419 -10327:2:1420 -10328:2:1431 -10329:2:1436 -10330:2:1437 -10331:0:4365 -10332:2:1449 -10333:0:4365 -10334:3:3354 -10335:0:4365 -10336:2:1451 -10337:0:4365 -10338:3:3355 -10339:0:4365 -10340:2:1652 -10341:0:4365 -10342:2:1653 -10343:0:4365 -10344:2:1657 -10345:0:4365 -10346:2:1180 -10347:0:4365 -10348:3:3354 -10349:0:4365 -10350:2:1181 -10351:2:1185 -10352:2:1186 -10353:2:1194 -10354:2:1195 -10355:2:1199 -10356:2:1200 -10357:2:1194 -10358:2:1195 -10359:2:1196 -10360:2:1208 -10361:2:1213 -10362:2:1217 -10363:2:1218 -10364:2:1225 -10365:2:1226 -10366:2:1237 -10367:2:1238 -10368:2:1239 -10369:2:1237 -10370:2:1238 -10371:2:1239 -10372:2:1250 -10373:2:1255 -10374:2:1256 -10375:0:4365 -10376:3:3355 -10377:0:4365 -10378:2:1268 -10379:0:4365 -10380:3:3354 -10381:0:4365 -10382:2:1270 -10383:0:4365 -10384:3:3355 -10385:0:4365 -10386:2:1271 -10387:2:1275 -10388:2:1276 -10389:2:1284 -10390:2:1285 -10391:2:1289 -10392:2:1290 -10393:2:1284 -10394:2:1285 -10395:2:1289 -10396:2:1290 -10397:2:1298 -10398:2:1303 -10399:2:1307 -10400:2:1308 -10401:2:1315 -10402:2:1316 -10403:2:1327 -10404:2:1328 -10405:2:1329 -10406:2:1327 -10407:2:1328 -10408:2:1329 -10409:2:1340 -10410:2:1345 -10411:2:1346 -10412:0:4365 -10413:2:1358 -10414:0:4365 -10415:2:1454 -10416:0:4365 -10417:3:3354 -10418:0:4365 -10419:2:1455 -10420:0:4365 -10421:3:3355 -10422:0:4365 -10423:2:1652 -10424:0:4365 -10425:2:1653 -10426:0:4365 -10427:2:1657 -10428:0:4365 -10429:2:1660 -10430:0:4365 -10431:3:3354 -10432:0:4365 -10433:2:1665 -10434:2:1669 -10435:2:1670 -10436:2:1678 -10437:2:1679 -10438:2:1683 -10439:2:1684 -10440:2:1678 -10441:2:1679 -10442:2:1680 -10443:2:1692 -10444:2:1697 -10445:2:1701 -10446:2:1702 -10447:2:1709 -10448:2:1710 -10449:2:1721 -10450:2:1722 -10451:2:1723 -10452:2:1721 -10453:2:1722 -10454:2:1723 -10455:2:1734 -10456:2:1739 -10457:2:1740 -10458:0:4365 -10459:3:3355 -10460:0:4365 -10461:2:1752 -10462:0:4365 -10463:3:3354 -10464:0:4365 -10465:2:1754 -10466:0:4365 -10467:3:3355 -10468:0:4365 -10469:2:1755 -10470:2:1759 -10471:2:1760 -10472:2:1768 -10473:2:1769 -10474:2:1773 -10475:2:1774 -10476:2:1768 -10477:2:1769 -10478:2:1773 -10479:2:1774 -10480:2:1782 -10481:2:1787 -10482:2:1791 -10483:2:1792 -10484:2:1799 -10485:2:1800 -10486:2:1811 -10487:2:1812 -10488:2:1813 -10489:2:1811 -10490:2:1812 -10491:2:1813 -10492:2:1824 -10493:2:1829 -10494:2:1830 -10495:0:4365 -10496:2:1842 -10497:0:4365 -10498:3:3354 -10499:0:4365 -10500:2:1844 -10501:0:4365 -10502:3:3355 -10503:0:4365 -10504:2:1845 -10505:2:1849 -10506:2:1850 -10507:2:1858 -10508:2:1859 -10509:2:1863 -10510:2:1864 -10511:2:1858 -10512:2:1859 -10513:2:1863 -10514:2:1864 -10515:2:1872 -10516:2:1877 -10517:2:1881 -10518:2:1882 -10519:2:1889 -10520:2:1890 -10521:2:1901 -10522:2:1902 -10523:2:1903 -10524:2:1901 -10525:2:1902 -10526:2:1903 -10527:2:1914 -10528:2:1919 -10529:2:1920 -10530:0:4365 -10531:2:1932 -10532:0:4365 -10533:3:3354 -10534:0:4365 -10535:2:1934 -10536:0:4365 -10537:3:3355 -10538:0:4365 -10539:2:1935 -10540:0:4365 -10541:2:1936 -10542:0:4365 -10543:2:2129 -10544:0:4365 -10545:2:2130 -10546:0:4365 -10547:2:2134 -10548:0:4365 -10549:3:3354 -10550:0:4365 -10551:2:2136 -10552:0:4365 -10553:3:3355 -10554:0:4365 -10555:2:2137 -10556:2:2141 -10557:2:2142 -10558:2:2150 -10559:2:2151 -10560:2:2155 -10561:2:2156 -10562:2:2150 -10563:2:2151 -10564:2:2155 -10565:2:2156 -10566:2:2164 -10567:2:2169 -10568:2:2173 -10569:2:2174 -10570:2:2181 -10571:2:2182 -10572:2:2193 -10573:2:2194 -10574:2:2195 -10575:2:2193 -10576:2:2194 -10577:2:2195 -10578:2:2206 -10579:2:2211 -10580:2:2212 -10581:0:4365 -10582:2:2224 -10583:0:4365 -10584:3:3354 -10585:0:4365 -10586:2:2226 -10587:0:4365 -10588:3:3355 -10589:0:4365 -10590:2:1936 -10591:0:4365 -10592:2:2129 -10593:0:4365 -10594:2:2130 -10595:0:4365 -10596:2:2134 -10597:0:4365 -10598:3:3354 -10599:0:4365 -10600:2:2136 -10601:0:4365 -10602:3:3355 -10603:0:4365 -10604:2:2137 -10605:2:2141 -10606:2:2142 -10607:2:2150 -10608:2:2151 -10609:2:2155 -10610:2:2156 -10611:2:2150 -10612:2:2151 -10613:2:2152 -10614:2:2164 -10615:2:2169 -10616:2:2173 -10617:2:2174 -10618:2:2181 -10619:2:2182 -10620:2:2193 -10621:2:2194 -10622:2:2195 -10623:2:2193 -10624:2:2194 -10625:2:2195 -10626:2:2206 -10627:2:2211 -10628:2:2212 -10629:0:4365 -10630:2:2224 -10631:0:4365 -10632:3:3354 -10633:0:4365 -10634:2:2226 -10635:0:4365 -10636:3:3355 -10637:0:4365 -10638:2:2230 -10639:0:4365 -10640:3:3354 -10641:0:4365 -10642:2:2235 -10643:2:2239 -10644:2:2240 -10645:2:2248 -10646:2:2249 -10647:2:2253 -10648:2:2254 -10649:2:2248 -10650:2:2249 -10651:2:2250 -10652:2:2262 -10653:2:2267 -10654:2:2271 -10655:2:2272 -10656:2:2279 -10657:2:2280 -10658:2:2291 -10659:2:2292 -10660:2:2293 -10661:2:2291 -10662:2:2292 -10663:2:2293 -10664:2:2304 -10665:2:2309 -10666:2:2310 -10667:0:4365 -10668:3:3355 -10669:0:4365 -10670:2:2322 -10671:0:4365 -10672:2:1169 -10673:0:4365 -10674:3:3354 -10675:0:4365 -10676:2:1170 -10677:0:4365 -10678:3:3355 -10679:0:4365 -10680:3:3356 -10681:0:4365 -10682:3:3366 -10683:0:4365 -10684:3:2951 -10685:0:4365 -10686:3:2952 -10687:0:4365 -10688:3:2953 -10689:0:4365 -10690:3:2954 -10691:3:2958 -10692:3:2959 -10693:3:2967 -10694:3:2968 -10695:3:2972 -10696:3:2973 -10697:3:2967 -10698:3:2968 -10699:3:2972 -10700:3:2973 -10701:3:2981 -10702:3:2986 -10703:3:2990 -10704:3:2991 -10705:3:2998 -10706:3:2999 -10707:3:3010 -10708:3:3011 -10709:3:3012 -10710:3:3010 -10711:3:3011 -10712:3:3012 -10713:3:3023 -10714:3:3028 -10715:3:3029 -10716:0:4365 -10717:3:3041 -10718:0:4365 -10719:3:3042 -10720:0:4365 -10721:2:1173 -10722:0:4365 -10723:3:3043 -10724:0:4365 -10725:2:1179 -10726:0:4365 -10727:2:1180 -10728:0:4365 -10729:3:3042 -10730:0:4365 -10731:2:1181 -10732:2:1185 -10733:2:1186 -10734:2:1194 -10735:2:1195 -10736:2:1199 -10737:2:1200 -10738:2:1194 -10739:2:1195 -10740:2:1199 -10741:2:1200 -10742:2:1208 -10743:2:1213 -10744:2:1217 -10745:2:1218 -10746:2:1225 -10747:2:1226 -10748:2:1237 -10749:2:1238 -10750:2:1239 -10751:2:1237 -10752:2:1238 -10753:2:1239 -10754:2:1250 -10755:2:1255 -10756:2:1256 -10757:0:4365 -10758:3:3043 -10759:0:4365 -10760:2:1268 -10761:0:4365 -10762:3:3042 -10763:0:4365 -10764:2:1270 -10765:0:4365 -10766:3:3043 -10767:0:4365 -10768:2:1271 -10769:2:1275 -10770:2:1276 -10771:2:1284 -10772:2:1285 -10773:2:1289 -10774:2:1290 -10775:2:1284 -10776:2:1285 -10777:2:1289 -10778:2:1290 -10779:2:1298 -10780:2:1303 -10781:2:1307 -10782:2:1308 -10783:2:1315 -10784:2:1316 -10785:2:1327 -10786:2:1328 -10787:2:1329 -10788:2:1327 -10789:2:1328 -10790:2:1329 -10791:2:1340 -10792:2:1345 -10793:2:1346 -10794:0:4365 -10795:2:1358 -10796:0:4365 -10797:2:1360 -10798:0:4365 -10799:3:3042 -10800:0:4365 -10801:2:1361 -10802:0:4365 -10803:3:3043 -10804:0:4365 -10805:2:1362 -10806:2:1366 -10807:2:1367 -10808:2:1375 -10809:2:1376 -10810:2:1380 -10811:2:1381 -10812:2:1375 -10813:2:1376 -10814:2:1380 -10815:2:1381 -10816:2:1389 -10817:2:1394 -10818:2:1398 -10819:2:1399 -10820:2:1406 -10821:2:1407 -10822:2:1418 -10823:2:1419 -10824:2:1420 -10825:2:1418 -10826:2:1419 -10827:2:1420 -10828:2:1431 -10829:2:1436 -10830:2:1437 -10831:0:4365 -10832:2:1449 -10833:0:4365 -10834:3:3042 -10835:0:4365 -10836:2:1451 -10837:0:4365 -10838:3:3043 -10839:0:4365 -10840:2:1652 -10841:0:4365 -10842:2:1653 -10843:0:4365 -10844:2:1657 -10845:0:4365 -10846:2:1180 -10847:0:4365 -10848:3:3042 -10849:0:4365 -10850:2:1181 -10851:2:1185 -10852:2:1186 -10853:2:1194 -10854:2:1195 -10855:2:1199 -10856:2:1200 -10857:2:1194 -10858:2:1195 -10859:2:1196 -10860:2:1208 -10861:2:1213 -10862:2:1217 -10863:2:1218 -10864:2:1225 -10865:2:1226 -10866:2:1237 -10867:2:1238 -10868:2:1239 -10869:2:1237 -10870:2:1238 -10871:2:1239 -10872:2:1250 -10873:2:1255 -10874:2:1256 -10875:0:4365 -10876:3:3043 -10877:0:4365 -10878:2:1268 -10879:0:4365 -10880:3:3042 -10881:0:4365 -10882:2:1270 -10883:0:4365 -10884:3:3043 -10885:0:4365 -10886:2:1271 -10887:2:1275 -10888:2:1276 -10889:2:1284 -10890:2:1285 -10891:2:1289 -10892:2:1290 -10893:2:1284 -10894:2:1285 -10895:2:1289 -10896:2:1290 -10897:2:1298 -10898:2:1303 -10899:2:1307 -10900:2:1308 -10901:2:1315 -10902:2:1316 -10903:2:1327 -10904:2:1328 -10905:2:1329 -10906:2:1327 -10907:2:1328 -10908:2:1329 -10909:2:1340 -10910:2:1345 -10911:2:1346 -10912:0:4365 -10913:2:1358 -10914:0:4365 -10915:2:1454 -10916:0:4365 -10917:3:3042 -10918:0:4365 -10919:2:1455 -10920:0:4365 -10921:3:3043 -10922:0:4365 -10923:2:1652 -10924:0:4365 -10925:2:1653 -10926:0:4365 -10927:2:1657 -10928:0:4365 -10929:2:1660 -10930:0:4365 -10931:3:3042 -10932:0:4365 -10933:2:1665 -10934:2:1669 -10935:2:1670 -10936:2:1678 -10937:2:1679 -10938:2:1683 -10939:2:1684 -10940:2:1678 -10941:2:1679 -10942:2:1680 -10943:2:1692 -10944:2:1697 -10945:2:1701 -10946:2:1702 -10947:2:1709 -10948:2:1710 -10949:2:1721 -10950:2:1722 -10951:2:1723 -10952:2:1721 -10953:2:1722 -10954:2:1723 -10955:2:1734 -10956:2:1739 -10957:2:1740 -10958:0:4365 -10959:3:3043 -10960:0:4365 -10961:2:1752 -10962:0:4365 -10963:3:3042 -10964:0:4365 -10965:2:1754 -10966:0:4365 -10967:3:3043 -10968:0:4365 -10969:2:1755 -10970:2:1759 -10971:2:1760 -10972:2:1768 -10973:2:1769 -10974:2:1773 -10975:2:1774 -10976:2:1768 -10977:2:1769 -10978:2:1773 -10979:2:1774 -10980:2:1782 -10981:2:1787 -10982:2:1791 -10983:2:1792 -10984:2:1799 -10985:2:1800 -10986:2:1811 -10987:2:1812 -10988:2:1813 -10989:2:1811 -10990:2:1812 -10991:2:1813 -10992:2:1824 -10993:2:1829 -10994:2:1830 -10995:0:4365 -10996:2:1842 -10997:0:4365 -10998:3:3042 -10999:0:4365 -11000:2:1844 -11001:0:4365 -11002:3:3043 -11003:0:4365 -11004:2:1845 -11005:2:1849 -11006:2:1850 -11007:2:1858 -11008:2:1859 -11009:2:1863 -11010:2:1864 -11011:2:1858 -11012:2:1859 -11013:2:1863 -11014:2:1864 -11015:2:1872 -11016:2:1877 -11017:2:1881 -11018:2:1882 -11019:2:1889 -11020:2:1890 -11021:2:1901 -11022:2:1902 -11023:2:1903 -11024:2:1901 -11025:2:1902 -11026:2:1903 -11027:2:1914 -11028:2:1919 -11029:2:1920 -11030:0:4365 -11031:2:1932 -11032:0:4365 -11033:3:3042 -11034:0:4365 -11035:2:1934 -11036:0:4365 -11037:3:3043 -11038:0:4365 -11039:2:1935 -11040:0:4365 -11041:2:1936 -11042:0:4365 -11043:2:2129 -11044:0:4365 -11045:2:2130 -11046:0:4365 -11047:2:2134 -11048:0:4365 -11049:3:3042 -11050:0:4365 -11051:2:2136 -11052:0:4365 -11053:3:3043 -11054:0:4365 -11055:2:2137 -11056:2:2141 -11057:2:2142 -11058:2:2150 -11059:2:2151 -11060:2:2155 -11061:2:2156 -11062:2:2150 -11063:2:2151 -11064:2:2155 -11065:2:2156 -11066:2:2164 -11067:2:2169 -11068:2:2173 -11069:2:2174 -11070:2:2181 -11071:2:2182 -11072:2:2193 -11073:2:2194 -11074:2:2195 -11075:2:2193 -11076:2:2194 -11077:2:2195 -11078:2:2206 -11079:2:2211 -11080:2:2212 -11081:0:4365 -11082:2:2224 -11083:0:4365 -11084:3:3042 -11085:0:4365 -11086:2:2226 -11087:0:4365 -11088:3:3043 -11089:0:4365 -11090:2:1936 -11091:0:4365 -11092:2:2129 -11093:0:4365 -11094:2:2130 -11095:0:4365 -11096:2:2134 -11097:0:4365 -11098:3:3042 -11099:0:4365 -11100:2:2136 -11101:0:4365 -11102:3:3043 -11103:0:4365 -11104:2:2137 -11105:2:2141 -11106:2:2142 -11107:2:2150 -11108:2:2151 -11109:2:2155 -11110:2:2156 -11111:2:2150 -11112:2:2151 -11113:2:2152 -11114:2:2164 -11115:2:2169 -11116:2:2173 -11117:2:2174 -11118:2:2181 -11119:2:2182 -11120:2:2193 -11121:2:2194 -11122:2:2195 -11123:2:2193 -11124:2:2194 -11125:2:2195 -11126:2:2206 -11127:2:2211 -11128:2:2212 -11129:0:4365 -11130:2:2224 -11131:0:4365 -11132:3:3042 -11133:0:4365 -11134:2:2226 -11135:0:4365 -11136:3:3043 -11137:0:4365 -11138:2:2230 -11139:0:4365 -11140:3:3042 -11141:0:4365 -11142:2:2235 -11143:2:2239 -11144:2:2240 -11145:2:2248 -11146:2:2249 -11147:2:2253 -11148:2:2254 -11149:2:2248 -11150:2:2249 -11151:2:2250 -11152:2:2262 -11153:2:2267 -11154:2:2271 -11155:2:2272 -11156:2:2279 -11157:2:2280 -11158:2:2291 -11159:2:2292 -11160:2:2293 -11161:2:2291 -11162:2:2292 -11163:2:2293 -11164:2:2304 -11165:2:2309 -11166:2:2310 -11167:0:4365 -11168:3:3043 -11169:0:4365 -11170:2:2322 -11171:0:4365 -11172:2:1169 -11173:0:4365 -11174:3:3042 -11175:0:4365 -11176:2:1170 -11177:0:4365 -11178:3:3043 -11179:0:4365 -11180:3:3044 -11181:0:4365 -11182:3:3257 -11183:0:4365 -11184:3:3362 -11185:0:4365 -11186:3:3363 -11187:0:4365 -11188:3:3367 -11189:0:4365 -11190:3:3373 -11191:3:3377 -11192:3:3378 -11193:3:3386 -11194:3:3387 -11195:3:3391 -11196:3:3392 -11197:3:3386 -11198:3:3387 -11199:3:3391 -11200:3:3392 -11201:3:3400 -11202:3:3405 -11203:3:3409 -11204:3:3410 -11205:3:3417 -11206:3:3418 -11207:3:3429 -11208:3:3430 -11209:3:3431 -11210:3:3429 -11211:3:3430 -11212:3:3431 -11213:3:3442 -11214:3:3447 -11215:3:3448 -11216:0:4365 -11217:3:3460 -11218:0:4365 -11219:3:3461 -11220:0:4365 -11221:2:1173 -11222:0:4365 -11223:3:3462 -11224:0:4365 -11225:2:1179 -11226:0:4365 -11227:2:1180 -11228:0:4365 -11229:3:3461 -11230:0:4365 -11231:2:1181 -11232:2:1185 -11233:2:1186 -11234:2:1194 -11235:2:1195 -11236:2:1199 -11237:2:1200 -11238:2:1194 -11239:2:1195 -11240:2:1199 -11241:2:1200 -11242:2:1208 -11243:2:1213 -11244:2:1217 -11245:2:1218 -11246:2:1225 -11247:2:1226 -11248:2:1237 -11249:2:1238 -11250:2:1239 -11251:2:1237 -11252:2:1238 -11253:2:1239 -11254:2:1250 -11255:2:1255 -11256:2:1256 -11257:0:4365 -11258:3:3462 -11259:0:4365 -11260:2:1268 -11261:0:4365 -11262:3:3461 -11263:0:4365 -11264:2:1270 -11265:0:4365 -11266:3:3462 -11267:0:4365 -11268:2:1271 -11269:2:1275 -11270:2:1276 -11271:2:1284 -11272:2:1285 -11273:2:1289 -11274:2:1290 -11275:2:1284 -11276:2:1285 -11277:2:1289 -11278:2:1290 -11279:2:1298 -11280:2:1303 -11281:2:1307 -11282:2:1308 -11283:2:1315 -11284:2:1316 -11285:2:1327 -11286:2:1328 -11287:2:1329 -11288:2:1327 -11289:2:1328 -11290:2:1329 -11291:2:1340 -11292:2:1345 -11293:2:1346 -11294:0:4365 -11295:2:1358 -11296:0:4365 -11297:2:1360 -11298:0:4365 -11299:3:3461 -11300:0:4365 -11301:2:1361 -11302:0:4365 -11303:3:3462 -11304:0:4365 -11305:2:1362 -11306:2:1366 -11307:2:1367 -11308:2:1375 -11309:2:1376 -11310:2:1380 -11311:2:1381 -11312:2:1375 -11313:2:1376 -11314:2:1380 -11315:2:1381 -11316:2:1389 -11317:2:1394 -11318:2:1398 -11319:2:1399 -11320:2:1406 -11321:2:1407 -11322:2:1418 -11323:2:1419 -11324:2:1420 -11325:2:1418 -11326:2:1419 -11327:2:1420 -11328:2:1431 -11329:2:1436 -11330:2:1437 -11331:0:4365 -11332:2:1449 -11333:0:4365 -11334:3:3461 -11335:0:4365 -11336:2:1451 -11337:0:4365 -11338:3:3462 -11339:0:4365 -11340:2:1652 -11341:0:4365 -11342:2:1653 -11343:0:4365 -11344:2:1657 -11345:0:4365 -11346:2:1180 -11347:0:4365 -11348:3:3461 -11349:0:4365 -11350:2:1181 -11351:2:1185 -11352:2:1186 -11353:2:1194 -11354:2:1195 -11355:2:1199 -11356:2:1200 -11357:2:1194 -11358:2:1195 -11359:2:1196 -11360:2:1208 -11361:2:1213 -11362:2:1217 -11363:2:1218 -11364:2:1225 -11365:2:1226 -11366:2:1237 -11367:2:1238 -11368:2:1239 -11369:2:1237 -11370:2:1238 -11371:2:1239 -11372:2:1250 -11373:2:1255 -11374:2:1256 -11375:0:4365 -11376:3:3462 -11377:0:4365 -11378:2:1268 -11379:0:4365 -11380:3:3461 -11381:0:4365 -11382:2:1270 -11383:0:4365 -11384:3:3462 -11385:0:4365 -11386:2:1271 -11387:2:1275 -11388:2:1276 -11389:2:1284 -11390:2:1285 -11391:2:1289 -11392:2:1290 -11393:2:1284 -11394:2:1285 -11395:2:1289 -11396:2:1290 -11397:2:1298 -11398:2:1303 -11399:2:1307 -11400:2:1308 -11401:2:1315 -11402:2:1316 -11403:2:1327 -11404:2:1328 -11405:2:1329 -11406:2:1327 -11407:2:1328 -11408:2:1329 -11409:2:1340 -11410:2:1345 -11411:2:1346 -11412:0:4365 -11413:2:1358 -11414:0:4365 -11415:2:1454 -11416:0:4365 -11417:3:3461 -11418:0:4365 -11419:2:1455 -11420:0:4365 -11421:3:3462 -11422:0:4365 -11423:2:1652 -11424:0:4365 -11425:2:1653 -11426:0:4365 -11427:2:1657 -11428:0:4365 -11429:2:1660 -11430:0:4365 -11431:3:3461 -11432:0:4365 -11433:2:1665 -11434:2:1669 -11435:2:1670 -11436:2:1678 -11437:2:1679 -11438:2:1683 -11439:2:1684 -11440:2:1678 -11441:2:1679 -11442:2:1680 -11443:2:1692 -11444:2:1697 -11445:2:1701 -11446:2:1702 -11447:2:1709 -11448:2:1710 -11449:2:1721 -11450:2:1722 -11451:2:1723 -11452:2:1721 -11453:2:1722 -11454:2:1723 -11455:2:1734 -11456:2:1739 -11457:2:1740 -11458:0:4365 -11459:3:3462 -11460:0:4365 -11461:2:1752 -11462:0:4365 -11463:3:3461 -11464:0:4365 -11465:2:1754 -11466:0:4365 -11467:3:3462 -11468:0:4365 -11469:2:1755 -11470:2:1759 -11471:2:1760 -11472:2:1768 -11473:2:1769 -11474:2:1773 -11475:2:1774 -11476:2:1768 -11477:2:1769 -11478:2:1773 -11479:2:1774 -11480:2:1782 -11481:2:1787 -11482:2:1791 -11483:2:1792 -11484:2:1799 -11485:2:1800 -11486:2:1811 -11487:2:1812 -11488:2:1813 -11489:2:1811 -11490:2:1812 -11491:2:1813 -11492:2:1824 -11493:2:1829 -11494:2:1830 -11495:0:4365 -11496:2:1842 -11497:0:4365 -11498:3:3461 -11499:0:4365 -11500:2:1844 -11501:0:4365 -11502:3:3462 -11503:0:4365 -11504:2:1845 -11505:2:1849 -11506:2:1850 -11507:2:1858 -11508:2:1859 -11509:2:1863 -11510:2:1864 -11511:2:1858 -11512:2:1859 -11513:2:1863 -11514:2:1864 -11515:2:1872 -11516:2:1877 -11517:2:1881 -11518:2:1882 -11519:2:1889 -11520:2:1890 -11521:2:1901 -11522:2:1902 -11523:2:1903 -11524:2:1901 -11525:2:1902 -11526:2:1903 -11527:2:1914 -11528:2:1919 -11529:2:1920 -11530:0:4365 -11531:2:1932 -11532:0:4365 -11533:3:3461 -11534:0:4365 -11535:2:1934 -11536:0:4365 -11537:3:3462 -11538:0:4365 -11539:2:1935 -11540:0:4365 -11541:2:1936 -11542:0:4365 -11543:2:2129 -11544:0:4365 -11545:2:2130 -11546:0:4365 -11547:2:2134 -11548:0:4365 -11549:3:3461 -11550:0:4365 -11551:2:2136 -11552:0:4365 -11553:3:3462 -11554:0:4365 -11555:2:2137 -11556:2:2141 -11557:2:2142 -11558:2:2150 -11559:2:2151 -11560:2:2155 -11561:2:2156 -11562:2:2150 -11563:2:2151 -11564:2:2155 -11565:2:2156 -11566:2:2164 -11567:2:2169 -11568:2:2173 -11569:2:2174 -11570:2:2181 -11571:2:2182 -11572:2:2193 -11573:2:2194 -11574:2:2195 -11575:2:2193 -11576:2:2194 -11577:2:2195 -11578:2:2206 -11579:2:2211 -11580:2:2212 -11581:0:4365 -11582:2:2224 -11583:0:4365 -11584:3:3461 -11585:0:4365 -11586:2:2226 -11587:0:4365 -11588:3:3462 -11589:0:4365 -11590:2:1936 -11591:0:4365 -11592:2:2129 -11593:0:4365 -11594:2:2130 -11595:0:4365 -11596:2:2134 -11597:0:4365 -11598:3:3461 -11599:0:4365 -11600:2:2136 -11601:0:4365 -11602:3:3462 -11603:0:4365 -11604:2:2137 -11605:2:2141 -11606:2:2142 -11607:2:2150 -11608:2:2151 -11609:2:2155 -11610:2:2156 -11611:2:2150 -11612:2:2151 -11613:2:2152 -11614:2:2164 -11615:2:2169 -11616:2:2173 -11617:2:2174 -11618:2:2181 -11619:2:2182 -11620:2:2193 -11621:2:2194 -11622:2:2195 -11623:2:2193 -11624:2:2194 -11625:2:2195 -11626:2:2206 -11627:2:2211 -11628:2:2212 -11629:0:4365 -11630:2:2224 -11631:0:4365 -11632:3:3461 -11633:0:4365 -11634:2:2226 -11635:0:4365 -11636:3:3462 -11637:0:4365 -11638:2:2230 -11639:0:4365 -11640:3:3461 -11641:0:4365 -11642:2:2235 -11643:2:2239 -11644:2:2240 -11645:2:2248 -11646:2:2249 -11647:2:2253 -11648:2:2254 -11649:2:2248 -11650:2:2249 -11651:2:2250 -11652:2:2262 -11653:2:2267 -11654:2:2271 -11655:2:2272 -11656:2:2279 -11657:2:2280 -11658:2:2291 -11659:2:2292 -11660:2:2293 -11661:2:2291 -11662:2:2292 -11663:2:2293 -11664:2:2304 -11665:2:2309 -11666:2:2310 -11667:0:4365 -11668:3:3462 -11669:0:4365 -11670:2:2322 -11671:0:4365 -11672:2:1169 -11673:0:4365 -11674:3:3461 -11675:0:4365 -11676:2:1170 -11677:0:4365 -11678:3:3462 -11679:0:4365 -11680:3:3463 -11681:0:4365 -11682:3:3469 -11683:0:4365 -11684:3:3470 -11685:3:3474 -11686:3:3475 -11687:3:3483 -11688:3:3484 -11689:3:3488 -11690:3:3489 -11691:3:3483 -11692:3:3484 -11693:3:3488 -11694:3:3489 -11695:3:3497 -11696:3:3502 -11697:3:3506 -11698:3:3507 -11699:3:3514 -11700:3:3515 -11701:3:3526 -11702:3:3527 -11703:3:3528 -11704:3:3526 -11705:3:3527 -11706:3:3528 -11707:3:3539 -11708:3:3544 -11709:3:3545 -11710:0:4365 -11711:3:3557 -11712:0:4365 -11713:3:3558 -11714:0:4365 -11715:2:1173 -11716:0:4365 -11717:3:3559 -11718:0:4365 -11719:2:1179 -11720:0:4365 -11721:2:1180 -11722:0:4365 -11723:3:3558 -11724:0:4365 -11725:2:1181 -11726:2:1185 -11727:2:1186 -11728:2:1194 -11729:2:1195 -11730:2:1199 -11731:2:1200 -11732:2:1194 -11733:2:1195 -11734:2:1199 -11735:2:1200 -11736:2:1208 -11737:2:1213 -11738:2:1217 -11739:2:1218 -11740:2:1225 -11741:2:1226 -11742:2:1237 -11743:2:1238 -11744:2:1239 -11745:2:1237 -11746:2:1238 -11747:2:1239 -11748:2:1250 -11749:2:1255 -11750:2:1256 -11751:0:4365 -11752:3:3559 -11753:0:4365 -11754:2:1268 -11755:0:4365 -11756:3:3558 -11757:0:4365 -11758:2:1270 -11759:0:4365 -11760:3:3559 -11761:0:4365 -11762:2:1271 -11763:2:1275 -11764:2:1276 -11765:2:1284 -11766:2:1285 -11767:2:1289 -11768:2:1290 -11769:2:1284 -11770:2:1285 -11771:2:1289 -11772:2:1290 -11773:2:1298 -11774:2:1303 -11775:2:1307 -11776:2:1308 -11777:2:1315 -11778:2:1316 -11779:2:1327 -11780:2:1328 -11781:2:1329 -11782:2:1327 -11783:2:1328 -11784:2:1329 -11785:2:1340 -11786:2:1345 -11787:2:1346 -11788:0:4365 -11789:2:1358 -11790:0:4365 -11791:2:1360 -11792:0:4365 -11793:3:3558 -11794:0:4365 -11795:2:1361 -11796:0:4365 -11797:3:3559 -11798:0:4365 -11799:2:1362 -11800:2:1366 -11801:2:1367 -11802:2:1375 -11803:2:1376 -11804:2:1380 -11805:2:1381 -11806:2:1375 -11807:2:1376 -11808:2:1380 -11809:2:1381 -11810:2:1389 -11811:2:1394 -11812:2:1398 -11813:2:1399 -11814:2:1406 -11815:2:1407 -11816:2:1418 -11817:2:1419 -11818:2:1420 -11819:2:1418 -11820:2:1419 -11821:2:1420 -11822:2:1431 -11823:2:1436 -11824:2:1437 -11825:0:4365 -11826:2:1449 -11827:0:4365 -11828:3:3558 -11829:0:4365 -11830:2:1451 -11831:0:4365 -11832:3:3559 -11833:0:4365 -11834:2:1652 -11835:0:4365 -11836:2:1653 -11837:0:4365 -11838:2:1657 -11839:0:4365 -11840:2:1180 -11841:0:4365 -11842:3:3558 -11843:0:4365 -11844:2:1181 -11845:2:1185 -11846:2:1186 -11847:2:1194 -11848:2:1195 -11849:2:1199 -11850:2:1200 -11851:2:1194 -11852:2:1195 -11853:2:1196 -11854:2:1208 -11855:2:1213 -11856:2:1217 -11857:2:1218 -11858:2:1225 -11859:2:1226 -11860:2:1237 -11861:2:1238 -11862:2:1239 -11863:2:1237 -11864:2:1238 -11865:2:1239 -11866:2:1250 -11867:2:1255 -11868:2:1256 -11869:0:4365 -11870:3:3559 -11871:0:4365 -11872:2:1268 -11873:0:4365 -11874:3:3558 -11875:0:4365 -11876:2:1270 -11877:0:4365 -11878:3:3559 -11879:0:4365 -11880:2:1271 -11881:2:1275 -11882:2:1276 -11883:2:1284 -11884:2:1285 -11885:2:1289 -11886:2:1290 -11887:2:1284 -11888:2:1285 -11889:2:1289 -11890:2:1290 -11891:2:1298 -11892:2:1303 -11893:2:1307 -11894:2:1308 -11895:2:1315 -11896:2:1316 -11897:2:1327 -11898:2:1328 -11899:2:1329 -11900:2:1327 -11901:2:1328 -11902:2:1329 -11903:2:1340 -11904:2:1345 -11905:2:1346 -11906:0:4365 -11907:2:1358 -11908:0:4365 -11909:2:1454 -11910:0:4365 -11911:3:3558 -11912:0:4365 -11913:2:1455 -11914:0:4365 -11915:3:3559 -11916:0:4365 -11917:2:1652 -11918:0:4365 -11919:2:1653 -11920:0:4365 -11921:2:1657 -11922:0:4365 -11923:2:1660 -11924:0:4365 -11925:3:3558 -11926:0:4365 -11927:2:1665 -11928:2:1669 -11929:2:1670 -11930:2:1678 -11931:2:1679 -11932:2:1683 -11933:2:1684 -11934:2:1678 -11935:2:1679 -11936:2:1680 -11937:2:1692 -11938:2:1697 -11939:2:1701 -11940:2:1702 -11941:2:1709 -11942:2:1710 -11943:2:1721 -11944:2:1722 -11945:2:1723 -11946:2:1721 -11947:2:1722 -11948:2:1723 -11949:2:1734 -11950:2:1739 -11951:2:1740 -11952:0:4365 -11953:3:3559 -11954:0:4365 -11955:2:1752 -11956:0:4365 -11957:3:3558 -11958:0:4365 -11959:2:1754 -11960:0:4365 -11961:3:3559 -11962:0:4365 -11963:2:1755 -11964:2:1759 -11965:2:1760 -11966:2:1768 -11967:2:1769 -11968:2:1773 -11969:2:1774 -11970:2:1768 -11971:2:1769 -11972:2:1773 -11973:2:1774 -11974:2:1782 -11975:2:1787 -11976:2:1791 -11977:2:1792 -11978:2:1799 -11979:2:1800 -11980:2:1811 -11981:2:1812 -11982:2:1813 -11983:2:1811 -11984:2:1812 -11985:2:1813 -11986:2:1824 -11987:2:1829 -11988:2:1830 -11989:0:4365 -11990:2:1842 -11991:0:4365 -11992:3:3558 -11993:0:4365 -11994:2:1844 -11995:0:4365 -11996:3:3559 -11997:0:4365 -11998:2:1845 -11999:2:1849 -12000:2:1850 -12001:2:1858 -12002:2:1859 -12003:2:1863 -12004:2:1864 -12005:2:1858 -12006:2:1859 -12007:2:1863 -12008:2:1864 -12009:2:1872 -12010:2:1877 -12011:2:1881 -12012:2:1882 -12013:2:1889 -12014:2:1890 -12015:2:1901 -12016:2:1902 -12017:2:1903 -12018:2:1901 -12019:2:1902 -12020:2:1903 -12021:2:1914 -12022:2:1919 -12023:2:1920 -12024:0:4365 -12025:2:1932 -12026:0:4365 -12027:3:3558 -12028:0:4365 -12029:2:1934 -12030:0:4365 -12031:3:3559 -12032:0:4365 -12033:2:1935 -12034:0:4365 -12035:2:1936 -12036:0:4365 -12037:2:2129 -12038:0:4365 -12039:2:2130 -12040:0:4365 -12041:2:2134 -12042:0:4365 -12043:3:3558 -12044:0:4365 -12045:2:2136 -12046:0:4365 -12047:3:3559 -12048:0:4365 -12049:2:2137 -12050:2:2141 -12051:2:2142 -12052:2:2150 -12053:2:2151 -12054:2:2155 -12055:2:2156 -12056:2:2150 -12057:2:2151 -12058:2:2155 -12059:2:2156 -12060:2:2164 -12061:2:2169 -12062:2:2173 -12063:2:2174 -12064:2:2181 -12065:2:2182 -12066:2:2193 -12067:2:2194 -12068:2:2195 -12069:2:2193 -12070:2:2194 -12071:2:2195 -12072:2:2206 -12073:2:2211 -12074:2:2212 -12075:0:4365 -12076:2:2224 -12077:0:4365 -12078:3:3558 -12079:0:4365 -12080:2:2226 -12081:0:4365 -12082:3:3559 -12083:0:4365 -12084:2:1936 -12085:0:4365 -12086:2:2129 -12087:0:4365 -12088:2:2130 -12089:0:4365 -12090:2:2134 -12091:0:4365 -12092:3:3558 -12093:0:4365 -12094:2:2136 -12095:0:4365 -12096:3:3559 -12097:0:4365 -12098:2:2137 -12099:2:2141 -12100:2:2142 -12101:2:2150 -12102:2:2151 -12103:2:2155 -12104:2:2156 -12105:2:2150 -12106:2:2151 -12107:2:2152 -12108:2:2164 -12109:2:2169 -12110:2:2173 -12111:2:2174 -12112:2:2181 -12113:2:2182 -12114:2:2193 -12115:2:2194 -12116:2:2195 -12117:2:2193 -12118:2:2194 -12119:2:2195 -12120:2:2206 -12121:2:2211 -12122:2:2212 -12123:0:4365 -12124:2:2224 -12125:0:4365 -12126:3:3558 -12127:0:4365 -12128:2:2226 -12129:0:4365 -12130:3:3559 -12131:0:4365 -12132:2:2230 -12133:0:4365 -12134:3:3558 -12135:0:4365 -12136:2:2235 -12137:2:2239 -12138:2:2240 -12139:2:2248 -12140:2:2249 -12141:2:2253 -12142:2:2254 -12143:2:2248 -12144:2:2249 -12145:2:2250 -12146:2:2262 -12147:2:2267 -12148:2:2271 -12149:2:2272 -12150:2:2279 -12151:2:2280 -12152:2:2291 -12153:2:2292 -12154:2:2293 -12155:2:2291 -12156:2:2292 -12157:2:2293 -12158:2:2304 -12159:2:2309 -12160:2:2310 -12161:0:4365 -12162:3:3559 -12163:0:4365 -12164:2:2322 -12165:0:4365 -12166:2:1169 -12167:0:4365 -12168:3:3558 -12169:0:4365 -12170:2:1170 -12171:0:4365 -12172:3:3559 -12173:0:4365 -12174:3:3560 -12175:0:4365 -12176:3:3566 -12177:0:4365 -12178:3:3569 -12179:3:3570 -12180:3:3582 -12181:3:3583 -12182:3:3587 -12183:3:3588 -12184:3:3582 -12185:3:3583 -12186:3:3587 -12187:3:3588 -12188:3:3596 -12189:3:3601 -12190:3:3605 -12191:3:3606 -12192:3:3613 -12193:3:3614 -12194:3:3625 -12195:3:3626 -12196:3:3627 -12197:3:3625 -12198:3:3626 -12199:3:3627 -12200:3:3638 -12201:3:3643 -12202:3:3644 -12203:0:4365 -12204:3:3656 -12205:0:4365 -12206:3:3657 -12207:0:4365 -12208:2:1173 -12209:0:4365 -12210:3:3658 -12211:0:4365 -12212:2:1179 -12213:0:4365 -12214:2:1180 -12215:0:4365 -12216:3:3657 -12217:0:4365 -12218:2:1181 -12219:2:1185 -12220:2:1186 -12221:2:1194 -12222:2:1195 -12223:2:1199 -12224:2:1200 -12225:2:1194 -12226:2:1195 -12227:2:1199 -12228:2:1200 -12229:2:1208 -12230:2:1213 -12231:2:1217 -12232:2:1218 -12233:2:1225 -12234:2:1226 -12235:2:1237 -12236:2:1238 -12237:2:1239 -12238:2:1237 -12239:2:1238 -12240:2:1239 -12241:2:1250 -12242:2:1255 -12243:2:1256 -12244:0:4365 -12245:3:3658 -12246:0:4365 -12247:2:1268 -12248:0:4365 -12249:3:3657 -12250:0:4365 -12251:2:1270 -12252:0:4365 -12253:3:3658 -12254:0:4365 -12255:2:1271 -12256:2:1275 -12257:2:1276 -12258:2:1284 -12259:2:1285 -12260:2:1289 -12261:2:1290 -12262:2:1284 -12263:2:1285 -12264:2:1289 -12265:2:1290 -12266:2:1298 -12267:2:1303 -12268:2:1307 -12269:2:1308 -12270:2:1315 -12271:2:1316 -12272:2:1327 -12273:2:1328 -12274:2:1329 -12275:2:1327 -12276:2:1328 -12277:2:1329 -12278:2:1340 -12279:2:1345 -12280:2:1346 -12281:0:4365 -12282:2:1358 -12283:0:4365 -12284:2:1360 -12285:0:4365 -12286:3:3657 -12287:0:4365 -12288:2:1361 -12289:0:4365 -12290:3:3658 -12291:0:4365 -12292:2:1362 -12293:2:1366 -12294:2:1367 -12295:2:1375 -12296:2:1376 -12297:2:1380 -12298:2:1381 -12299:2:1375 -12300:2:1376 -12301:2:1380 -12302:2:1381 -12303:2:1389 -12304:2:1394 -12305:2:1398 -12306:2:1399 -12307:2:1406 -12308:2:1407 -12309:2:1418 -12310:2:1419 -12311:2:1420 -12312:2:1418 -12313:2:1419 -12314:2:1420 -12315:2:1431 -12316:2:1436 -12317:2:1437 -12318:0:4365 -12319:2:1449 -12320:0:4365 -12321:3:3657 -12322:0:4365 -12323:2:1451 -12324:0:4365 -12325:3:3658 -12326:0:4365 -12327:2:1652 -12328:0:4365 -12329:2:1653 -12330:0:4365 -12331:2:1657 -12332:0:4365 -12333:2:1180 -12334:0:4365 -12335:3:3657 -12336:0:4365 -12337:2:1181 -12338:2:1185 -12339:2:1186 -12340:2:1194 -12341:2:1195 -12342:2:1199 -12343:2:1200 -12344:2:1194 -12345:2:1195 -12346:2:1196 -12347:2:1208 -12348:2:1213 -12349:2:1217 -12350:2:1218 -12351:2:1225 -12352:2:1226 -12353:2:1237 -12354:2:1238 -12355:2:1239 -12356:2:1237 -12357:2:1238 -12358:2:1239 -12359:2:1250 -12360:2:1255 -12361:2:1256 -12362:0:4365 -12363:3:3658 -12364:0:4365 -12365:2:1268 -12366:0:4365 -12367:3:3657 -12368:0:4365 -12369:2:1270 -12370:0:4365 -12371:3:3658 -12372:0:4365 -12373:2:1271 -12374:2:1275 -12375:2:1276 -12376:2:1284 -12377:2:1285 -12378:2:1289 -12379:2:1290 -12380:2:1284 -12381:2:1285 -12382:2:1289 -12383:2:1290 -12384:2:1298 -12385:2:1303 -12386:2:1307 -12387:2:1308 -12388:2:1315 -12389:2:1316 -12390:2:1327 -12391:2:1328 -12392:2:1329 -12393:2:1327 -12394:2:1328 -12395:2:1329 -12396:2:1340 -12397:2:1345 -12398:2:1346 -12399:0:4365 -12400:2:1358 -12401:0:4365 -12402:2:1454 -12403:0:4365 -12404:3:3657 -12405:0:4365 -12406:2:1455 -12407:0:4365 -12408:3:3658 -12409:0:4365 -12410:2:1652 -12411:0:4365 -12412:2:1653 -12413:0:4365 -12414:2:1657 -12415:0:4365 -12416:2:1660 -12417:0:4365 -12418:3:3657 -12419:0:4365 -12420:2:1665 -12421:2:1669 -12422:2:1670 -12423:2:1678 -12424:2:1679 -12425:2:1683 -12426:2:1684 -12427:2:1678 -12428:2:1679 -12429:2:1680 -12430:2:1692 -12431:2:1697 -12432:2:1701 -12433:2:1702 -12434:2:1709 -12435:2:1710 -12436:2:1721 -12437:2:1722 -12438:2:1723 -12439:2:1721 -12440:2:1722 -12441:2:1723 -12442:2:1734 -12443:2:1739 -12444:2:1740 -12445:0:4365 -12446:3:3658 -12447:0:4365 -12448:2:1752 -12449:0:4365 -12450:3:3657 -12451:0:4365 -12452:2:1754 -12453:0:4365 -12454:3:3658 -12455:0:4365 -12456:2:1755 -12457:2:1759 -12458:2:1760 -12459:2:1768 -12460:2:1769 -12461:2:1773 -12462:2:1774 -12463:2:1768 -12464:2:1769 -12465:2:1773 -12466:2:1774 -12467:2:1782 -12468:2:1787 -12469:2:1791 -12470:2:1792 -12471:2:1799 -12472:2:1800 -12473:2:1811 -12474:2:1812 -12475:2:1813 -12476:2:1811 -12477:2:1812 -12478:2:1813 -12479:2:1824 -12480:2:1829 -12481:2:1830 -12482:0:4365 -12483:2:1842 -12484:0:4365 -12485:3:3657 -12486:0:4365 -12487:2:1844 -12488:0:4365 -12489:3:3658 -12490:0:4365 -12491:2:1845 -12492:2:1849 -12493:2:1850 -12494:2:1858 -12495:2:1859 -12496:2:1863 -12497:2:1864 -12498:2:1858 -12499:2:1859 -12500:2:1863 -12501:2:1864 -12502:2:1872 -12503:2:1877 -12504:2:1881 -12505:2:1882 -12506:2:1889 -12507:2:1890 -12508:2:1901 -12509:2:1902 -12510:2:1903 -12511:2:1901 -12512:2:1902 -12513:2:1903 -12514:2:1914 -12515:2:1919 -12516:2:1920 -12517:0:4365 -12518:2:1932 -12519:0:4365 -12520:3:3657 -12521:0:4365 -12522:2:1934 -12523:0:4365 -12524:3:3658 -12525:0:4365 -12526:2:1935 -12527:0:4365 -12528:2:1936 -12529:0:4365 -12530:2:2129 -12531:0:4365 -12532:2:2130 -12533:0:4365 -12534:2:2134 -12535:0:4365 -12536:3:3657 -12537:0:4365 -12538:2:2136 -12539:0:4365 -12540:3:3658 -12541:0:4365 -12542:2:2137 -12543:2:2141 -12544:2:2142 -12545:2:2150 -12546:2:2151 -12547:2:2155 -12548:2:2156 -12549:2:2150 -12550:2:2151 -12551:2:2155 -12552:2:2156 -12553:2:2164 -12554:2:2169 -12555:2:2173 -12556:2:2174 -12557:2:2181 -12558:2:2182 -12559:2:2193 -12560:2:2194 -12561:2:2195 -12562:2:2193 -12563:2:2194 -12564:2:2195 -12565:2:2206 -12566:2:2211 -12567:2:2212 -12568:0:4365 -12569:2:2224 -12570:0:4365 -12571:3:3657 -12572:0:4365 -12573:2:2226 -12574:0:4365 -12575:3:3658 -12576:0:4365 -12577:2:1936 -12578:0:4365 -12579:2:2129 -12580:0:4365 -12581:2:2130 -12582:0:4365 -12583:2:2134 -12584:0:4365 -12585:3:3657 -12586:0:4365 -12587:2:2136 -12588:0:4365 -12589:3:3658 -12590:0:4365 -12591:2:2137 -12592:2:2141 -12593:2:2142 -12594:2:2150 -12595:2:2151 -12596:2:2155 -12597:2:2156 -12598:2:2150 -12599:2:2151 -12600:2:2152 -12601:2:2164 -12602:2:2169 -12603:2:2173 -12604:2:2174 -12605:2:2181 -12606:2:2182 -12607:2:2193 -12608:2:2194 -12609:2:2195 -12610:2:2193 -12611:2:2194 -12612:2:2195 -12613:2:2206 -12614:2:2211 -12615:2:2212 -12616:0:4365 -12617:2:2224 -12618:0:4365 -12619:3:3657 -12620:0:4365 -12621:2:2226 -12622:0:4365 -12623:3:3658 -12624:0:4365 -12625:2:2230 -12626:0:4365 -12627:3:3657 -12628:0:4365 -12629:2:2235 -12630:2:2239 -12631:2:2240 -12632:2:2248 -12633:2:2249 -12634:2:2253 -12635:2:2254 -12636:2:2248 -12637:2:2249 -12638:2:2250 -12639:2:2262 -12640:2:2267 -12641:2:2271 -12642:2:2272 -12643:2:2279 -12644:2:2280 -12645:2:2291 -12646:2:2292 -12647:2:2293 -12648:2:2291 -12649:2:2292 -12650:2:2293 -12651:2:2304 -12652:2:2309 -12653:2:2310 -12654:0:4365 -12655:3:3658 -12656:0:4365 -12657:2:2322 -12658:0:4365 -12659:2:1169 -12660:0:4365 -12661:3:3657 -12662:0:4365 -12663:2:1170 -12664:0:4365 -12665:3:3658 -12666:0:4365 -12667:3:3659 -12668:0:4365 -12669:3:3665 -12670:0:4365 -12671:3:3666 -12672:0:4365 -12673:3:3667 -12674:0:4365 -12675:3:3668 -12676:0:4365 -12677:3:3669 -12678:3:3673 -12679:3:3674 -12680:3:3682 -12681:3:3683 -12682:3:3687 -12683:3:3688 -12684:3:3682 -12685:3:3683 -12686:3:3687 -12687:3:3688 -12688:3:3696 -12689:3:3701 -12690:3:3705 -12691:3:3706 -12692:3:3713 -12693:3:3714 -12694:3:3725 -12695:3:3726 -12696:3:3727 -12697:3:3725 -12698:3:3726 -12699:3:3727 -12700:3:3738 -12701:3:3743 -12702:3:3744 -12703:0:4365 -12704:3:3756 -12705:0:4365 -12706:3:3757 -12707:0:4365 -12708:2:1173 -12709:0:4365 -12710:3:3758 -12711:0:4365 -12712:2:1179 -12713:0:4365 -12714:2:1180 -12715:0:4365 -12716:3:3757 -12717:0:4365 -12718:2:1181 -12719:2:1185 -12720:2:1186 -12721:2:1194 -12722:2:1195 -12723:2:1199 -12724:2:1200 -12725:2:1194 -12726:2:1195 -12727:2:1199 -12728:2:1200 -12729:2:1208 -12730:2:1213 -12731:2:1217 -12732:2:1218 -12733:2:1225 -12734:2:1226 -12735:2:1237 -12736:2:1238 -12737:2:1239 -12738:2:1237 -12739:2:1238 -12740:2:1239 -12741:2:1250 -12742:2:1255 -12743:2:1256 -12744:0:4365 -12745:3:3758 -12746:0:4365 -12747:2:1268 -12748:0:4365 -12749:3:3757 -12750:0:4365 -12751:2:1270 -12752:0:4365 -12753:3:3758 -12754:0:4365 -12755:2:1271 -12756:2:1275 -12757:2:1276 -12758:2:1284 -12759:2:1285 -12760:2:1289 -12761:2:1290 -12762:2:1284 -12763:2:1285 -12764:2:1289 -12765:2:1290 -12766:2:1298 -12767:2:1303 -12768:2:1307 -12769:2:1308 -12770:2:1315 -12771:2:1316 -12772:2:1327 -12773:2:1328 -12774:2:1329 -12775:2:1327 -12776:2:1328 -12777:2:1329 -12778:2:1340 -12779:2:1345 -12780:2:1346 -12781:0:4365 -12782:2:1358 -12783:0:4365 -12784:2:1360 -12785:0:4365 -12786:3:3757 -12787:0:4365 -12788:2:1361 -12789:0:4365 -12790:3:3758 -12791:0:4365 -12792:2:1362 -12793:2:1366 -12794:2:1367 -12795:2:1375 -12796:2:1376 -12797:2:1380 -12798:2:1381 -12799:2:1375 -12800:2:1376 -12801:2:1380 -12802:2:1381 -12803:2:1389 -12804:2:1394 -12805:2:1398 -12806:2:1399 -12807:2:1406 -12808:2:1407 -12809:2:1418 -12810:2:1419 -12811:2:1420 -12812:2:1418 -12813:2:1419 -12814:2:1420 -12815:2:1431 -12816:2:1436 -12817:2:1437 -12818:0:4365 -12819:2:1449 -12820:0:4365 -12821:3:3757 -12822:0:4365 -12823:2:1451 -12824:0:4365 -12825:3:3758 -12826:0:4365 -12827:2:1652 -12828:0:4365 -12829:2:1653 -12830:0:4365 -12831:2:1657 -12832:0:4365 -12833:2:1180 -12834:0:4365 -12835:3:3757 -12836:0:4365 -12837:2:1181 -12838:2:1185 -12839:2:1186 -12840:2:1194 -12841:2:1195 -12842:2:1199 -12843:2:1200 -12844:2:1194 -12845:2:1195 -12846:2:1196 -12847:2:1208 -12848:2:1213 -12849:2:1217 -12850:2:1218 -12851:2:1225 -12852:2:1226 -12853:2:1237 -12854:2:1238 -12855:2:1239 -12856:2:1237 -12857:2:1238 -12858:2:1239 -12859:2:1250 -12860:2:1255 -12861:2:1256 -12862:0:4365 -12863:3:3758 -12864:0:4365 -12865:2:1268 -12866:0:4365 -12867:3:3757 -12868:0:4365 -12869:2:1270 -12870:0:4365 -12871:3:3758 -12872:0:4365 -12873:2:1271 -12874:2:1275 -12875:2:1276 -12876:2:1284 -12877:2:1285 -12878:2:1289 -12879:2:1290 -12880:2:1284 -12881:2:1285 -12882:2:1289 -12883:2:1290 -12884:2:1298 -12885:2:1303 -12886:2:1307 -12887:2:1308 -12888:2:1315 -12889:2:1316 -12890:2:1327 -12891:2:1328 -12892:2:1329 -12893:2:1327 -12894:2:1328 -12895:2:1329 -12896:2:1340 -12897:2:1345 -12898:2:1346 -12899:0:4365 -12900:2:1358 -12901:0:4365 -12902:2:1454 -12903:0:4365 -12904:3:3757 -12905:0:4365 -12906:2:1455 -12907:0:4365 -12908:3:3758 -12909:0:4365 -12910:2:1652 -12911:0:4365 -12912:2:1653 -12913:0:4365 -12914:2:1657 -12915:0:4365 -12916:2:1660 -12917:0:4365 -12918:3:3757 -12919:0:4365 -12920:2:1665 -12921:2:1669 -12922:2:1670 -12923:2:1678 -12924:2:1679 -12925:2:1683 -12926:2:1684 -12927:2:1678 -12928:2:1679 -12929:2:1680 -12930:2:1692 -12931:2:1697 -12932:2:1701 -12933:2:1702 -12934:2:1709 -12935:2:1710 -12936:2:1721 -12937:2:1722 -12938:2:1723 -12939:2:1721 -12940:2:1722 -12941:2:1723 -12942:2:1734 -12943:2:1739 -12944:2:1740 -12945:0:4365 -12946:3:3758 -12947:0:4365 -12948:2:1752 -12949:0:4365 -12950:3:3757 -12951:0:4365 -12952:2:1754 -12953:0:4365 -12954:3:3758 -12955:0:4365 -12956:2:1755 -12957:2:1759 -12958:2:1760 -12959:2:1768 -12960:2:1769 -12961:2:1773 -12962:2:1774 -12963:2:1768 -12964:2:1769 -12965:2:1773 -12966:2:1774 -12967:2:1782 -12968:2:1787 -12969:2:1791 -12970:2:1792 -12971:2:1799 -12972:2:1800 -12973:2:1811 -12974:2:1812 -12975:2:1813 -12976:2:1811 -12977:2:1812 -12978:2:1813 -12979:2:1824 -12980:2:1829 -12981:2:1830 -12982:0:4365 -12983:2:1842 -12984:0:4365 -12985:3:3757 -12986:0:4365 -12987:2:1844 -12988:0:4365 -12989:3:3758 -12990:0:4365 -12991:2:1845 -12992:2:1849 -12993:2:1850 -12994:2:1858 -12995:2:1859 -12996:2:1863 -12997:2:1864 -12998:2:1858 -12999:2:1859 -13000:2:1863 -13001:2:1864 -13002:2:1872 -13003:2:1877 -13004:2:1881 -13005:2:1882 -13006:2:1889 -13007:2:1890 -13008:2:1901 -13009:2:1902 -13010:2:1903 -13011:2:1901 -13012:2:1902 -13013:2:1903 -13014:2:1914 -13015:2:1919 -13016:2:1920 -13017:0:4365 -13018:2:1932 -13019:0:4365 -13020:3:3757 -13021:0:4365 -13022:2:1934 -13023:0:4365 -13024:3:3758 -13025:0:4365 -13026:2:1935 -13027:0:4365 -13028:2:1936 -13029:0:4365 -13030:2:2129 -13031:0:4365 -13032:2:2130 -13033:0:4365 -13034:2:2134 -13035:0:4365 -13036:3:3757 -13037:0:4365 -13038:2:2136 -13039:0:4365 -13040:3:3758 -13041:0:4365 -13042:2:2137 -13043:2:2141 -13044:2:2142 -13045:2:2150 -13046:2:2151 -13047:2:2155 -13048:2:2156 -13049:2:2150 -13050:2:2151 -13051:2:2155 -13052:2:2156 -13053:2:2164 -13054:2:2169 -13055:2:2173 -13056:2:2174 -13057:2:2181 -13058:2:2182 -13059:2:2193 -13060:2:2194 -13061:2:2195 -13062:2:2193 -13063:2:2194 -13064:2:2195 -13065:2:2206 -13066:2:2211 -13067:2:2212 -13068:0:4365 -13069:2:2224 -13070:0:4365 -13071:3:3757 -13072:0:4365 -13073:2:2226 -13074:0:4365 -13075:3:3758 -13076:0:4365 -13077:2:1936 -13078:0:4365 -13079:2:2129 -13080:0:4365 -13081:2:2130 -13082:0:4365 -13083:2:2134 -13084:0:4365 -13085:3:3757 -13086:0:4365 -13087:2:2136 -13088:0:4365 -13089:3:3758 -13090:0:4365 -13091:2:2137 -13092:2:2141 -13093:2:2142 -13094:2:2150 -13095:2:2151 -13096:2:2155 -13097:2:2156 -13098:2:2150 -13099:2:2151 -13100:2:2152 -13101:2:2164 -13102:2:2169 -13103:2:2173 -13104:2:2174 -13105:2:2181 -13106:2:2182 -13107:2:2193 -13108:2:2194 -13109:2:2195 -13110:2:2193 -13111:2:2194 -13112:2:2195 -13113:2:2206 -13114:2:2211 -13115:2:2212 -13116:0:4365 -13117:2:2224 -13118:0:4365 -13119:3:3757 -13120:0:4365 -13121:2:2226 -13122:0:4365 -13123:3:3758 -13124:0:4365 -13125:2:2230 -13126:0:4365 -13127:3:3757 -13128:0:4365 -13129:2:2235 -13130:2:2239 -13131:2:2240 -13132:2:2248 -13133:2:2249 -13134:2:2253 -13135:2:2254 -13136:2:2248 -13137:2:2249 -13138:2:2250 -13139:2:2262 -13140:2:2267 -13141:2:2271 -13142:2:2272 -13143:2:2279 -13144:2:2280 -13145:2:2291 -13146:2:2292 -13147:2:2293 -13148:2:2291 -13149:2:2292 -13150:2:2293 -13151:2:2304 -13152:2:2309 -13153:2:2310 -13154:0:4365 -13155:3:3758 -13156:0:4365 -13157:2:2322 -13158:0:4365 -13159:2:1169 -13160:0:4365 -13161:3:3757 -13162:0:4365 -13163:2:1170 -13164:0:4365 -13165:3:3758 -13166:0:4365 -13167:3:3759 -13168:0:4365 -13169:3:3972 -13170:0:4365 -13171:3:3980 -13172:0:4365 -13173:3:3981 -13174:3:3985 -13175:3:3986 -13176:3:3994 -13177:3:3995 -13178:3:3999 -13179:3:4000 -13180:3:3994 -13181:3:3995 -13182:3:3999 -13183:3:4000 -13184:3:4008 -13185:3:4013 -13186:3:4017 -13187:3:4018 -13188:3:4025 -13189:3:4026 -13190:3:4037 -13191:3:4038 -13192:3:4039 -13193:3:4037 -13194:3:4038 -13195:3:4039 -13196:3:4050 -13197:3:4055 -13198:3:4056 -13199:0:4365 -13200:3:4068 -13201:0:4365 -13202:3:4069 -13203:0:4365 -13204:2:1173 -13205:0:4365 -13206:3:4070 -13207:0:4365 -13208:2:1179 -13209:0:4365 -13210:2:1180 -13211:0:4365 -13212:3:4069 -13213:0:4365 -13214:2:1181 -13215:2:1185 -13216:2:1186 -13217:2:1194 -13218:2:1195 -13219:2:1199 -13220:2:1200 -13221:2:1194 -13222:2:1195 -13223:2:1199 -13224:2:1200 -13225:2:1208 -13226:2:1213 -13227:2:1217 -13228:2:1218 -13229:2:1225 -13230:2:1226 -13231:2:1237 -13232:2:1238 -13233:2:1239 -13234:2:1237 -13235:2:1238 -13236:2:1239 -13237:2:1250 -13238:2:1255 -13239:2:1256 -13240:0:4365 -13241:3:4070 -13242:0:4365 -13243:2:1268 -13244:0:4365 -13245:3:4069 -13246:0:4365 -13247:2:1270 -13248:0:4365 -13249:3:4070 -13250:0:4365 -13251:2:1271 -13252:2:1275 -13253:2:1276 -13254:2:1284 -13255:2:1285 -13256:2:1289 -13257:2:1290 -13258:2:1284 -13259:2:1285 -13260:2:1289 -13261:2:1290 -13262:2:1298 -13263:2:1303 -13264:2:1307 -13265:2:1308 -13266:2:1315 -13267:2:1316 -13268:2:1327 -13269:2:1328 -13270:2:1329 -13271:2:1327 -13272:2:1328 -13273:2:1329 -13274:2:1340 -13275:2:1345 -13276:2:1346 -13277:0:4365 -13278:2:1358 -13279:0:4365 -13280:2:1360 -13281:0:4365 -13282:3:4069 -13283:0:4365 -13284:2:1361 -13285:0:4365 -13286:3:4070 -13287:0:4365 -13288:2:1362 -13289:2:1366 -13290:2:1367 -13291:2:1375 -13292:2:1376 -13293:2:1380 -13294:2:1381 -13295:2:1375 -13296:2:1376 -13297:2:1380 -13298:2:1381 -13299:2:1389 -13300:2:1394 -13301:2:1398 -13302:2:1399 -13303:2:1406 -13304:2:1407 -13305:2:1418 -13306:2:1419 -13307:2:1420 -13308:2:1418 -13309:2:1419 -13310:2:1420 -13311:2:1431 -13312:2:1436 -13313:2:1437 -13314:0:4365 -13315:2:1449 -13316:0:4365 -13317:3:4069 -13318:0:4365 -13319:2:1451 -13320:0:4365 -13321:3:4070 -13322:0:4365 -13323:2:1652 -13324:0:4365 -13325:2:1653 -13326:0:4365 -13327:2:1657 -13328:0:4365 -13329:2:1180 -13330:0:4365 -13331:3:4069 -13332:0:4365 -13333:2:1181 -13334:2:1185 -13335:2:1186 -13336:2:1194 -13337:2:1195 -13338:2:1199 -13339:2:1200 -13340:2:1194 -13341:2:1195 -13342:2:1196 -13343:2:1208 -13344:2:1213 -13345:2:1217 -13346:2:1218 -13347:2:1225 -13348:2:1226 -13349:2:1237 -13350:2:1238 -13351:2:1239 -13352:2:1237 -13353:2:1238 -13354:2:1239 -13355:2:1250 -13356:2:1255 -13357:2:1256 -13358:0:4365 -13359:3:4070 -13360:0:4365 -13361:2:1268 -13362:0:4365 -13363:3:4069 -13364:0:4365 -13365:2:1270 -13366:0:4365 -13367:3:4070 -13368:0:4365 -13369:2:1271 -13370:2:1275 -13371:2:1276 -13372:2:1284 -13373:2:1285 -13374:2:1289 -13375:2:1290 -13376:2:1284 -13377:2:1285 -13378:2:1289 -13379:2:1290 -13380:2:1298 -13381:2:1303 -13382:2:1307 -13383:2:1308 -13384:2:1315 -13385:2:1316 -13386:2:1327 -13387:2:1328 -13388:2:1329 -13389:2:1327 -13390:2:1328 -13391:2:1329 -13392:2:1340 -13393:2:1345 -13394:2:1346 -13395:0:4365 -13396:2:1358 -13397:0:4365 -13398:2:1454 -13399:0:4365 -13400:3:4069 -13401:0:4365 -13402:2:1455 -13403:0:4365 -13404:3:4070 -13405:0:4365 -13406:2:1652 -13407:0:4365 -13408:2:1653 -13409:0:4365 -13410:2:1657 -13411:0:4365 -13412:2:1660 -13413:0:4365 -13414:3:4069 -13415:0:4365 -13416:2:1665 -13417:2:1669 -13418:2:1670 -13419:2:1678 -13420:2:1679 -13421:2:1683 -13422:2:1684 -13423:2:1678 -13424:2:1679 -13425:2:1680 -13426:2:1692 -13427:2:1697 -13428:2:1701 -13429:2:1702 -13430:2:1709 -13431:2:1710 -13432:2:1721 -13433:2:1722 -13434:2:1723 -13435:2:1721 -13436:2:1722 -13437:2:1723 -13438:2:1734 -13439:2:1739 -13440:2:1740 -13441:0:4365 -13442:3:4070 -13443:0:4365 -13444:2:1752 -13445:0:4365 -13446:3:4069 -13447:0:4365 -13448:2:1754 -13449:0:4365 -13450:3:4070 -13451:0:4365 -13452:2:1755 -13453:2:1759 -13454:2:1760 -13455:2:1768 -13456:2:1769 -13457:2:1773 -13458:2:1774 -13459:2:1768 -13460:2:1769 -13461:2:1773 -13462:2:1774 -13463:2:1782 -13464:2:1787 -13465:2:1791 -13466:2:1792 -13467:2:1799 -13468:2:1800 -13469:2:1811 -13470:2:1812 -13471:2:1813 -13472:2:1811 -13473:2:1812 -13474:2:1813 -13475:2:1824 -13476:2:1829 -13477:2:1830 -13478:0:4365 -13479:2:1842 -13480:0:4365 -13481:3:4069 -13482:0:4365 -13483:2:1844 -13484:0:4365 -13485:3:4070 -13486:0:4365 -13487:2:1845 -13488:2:1849 -13489:2:1850 -13490:2:1858 -13491:2:1859 -13492:2:1863 -13493:2:1864 -13494:2:1858 -13495:2:1859 -13496:2:1863 -13497:2:1864 -13498:2:1872 -13499:2:1877 -13500:2:1881 -13501:2:1882 -13502:2:1889 -13503:2:1890 -13504:2:1901 -13505:2:1902 -13506:2:1903 -13507:2:1901 -13508:2:1902 -13509:2:1903 -13510:2:1914 -13511:2:1919 -13512:2:1920 -13513:0:4365 -13514:2:1932 -13515:0:4365 -13516:3:4069 -13517:0:4365 -13518:2:1934 -13519:0:4365 -13520:3:4070 -13521:0:4365 -13522:2:1935 -13523:0:4365 -13524:2:1936 -13525:0:4365 -13526:2:2129 -13527:0:4365 -13528:2:2130 -13529:0:4365 -13530:2:2134 -13531:0:4365 -13532:3:4069 -13533:0:4365 -13534:2:2136 -13535:0:4365 -13536:3:4070 -13537:0:4365 -13538:2:2137 -13539:2:2141 -13540:2:2142 -13541:2:2150 -13542:2:2151 -13543:2:2155 -13544:2:2156 -13545:2:2150 -13546:2:2151 -13547:2:2155 -13548:2:2156 -13549:2:2164 -13550:2:2169 -13551:2:2173 -13552:2:2174 -13553:2:2181 -13554:2:2182 -13555:2:2193 -13556:2:2194 -13557:2:2195 -13558:2:2193 -13559:2:2194 -13560:2:2195 -13561:2:2206 -13562:2:2211 -13563:2:2212 -13564:0:4365 -13565:2:2224 -13566:0:4365 -13567:3:4069 -13568:0:4365 -13569:2:2226 -13570:0:4365 -13571:3:4070 -13572:0:4365 -13573:2:1936 -13574:0:4365 -13575:2:2129 -13576:0:4365 -13577:2:2130 -13578:0:4365 -13579:2:2134 -13580:0:4365 -13581:3:4069 -13582:0:4365 -13583:2:2136 -13584:0:4365 -13585:3:4070 -13586:0:4365 -13587:2:2137 -13588:2:2141 -13589:2:2142 -13590:2:2150 -13591:2:2151 -13592:2:2155 -13593:2:2156 -13594:2:2150 -13595:2:2151 -13596:2:2152 -13597:2:2164 -13598:2:2169 -13599:2:2173 -13600:2:2174 -13601:2:2181 -13602:2:2182 -13603:2:2193 -13604:2:2194 -13605:2:2195 -13606:2:2193 -13607:2:2194 -13608:2:2195 -13609:2:2206 -13610:2:2211 -13611:2:2212 -13612:0:4365 -13613:2:2224 -13614:0:4365 -13615:3:4069 -13616:0:4365 -13617:2:2226 -13618:0:4365 -13619:3:4070 -13620:0:4365 -13621:2:2230 -13622:0:4365 -13623:3:4069 -13624:0:4365 -13625:2:2235 -13626:2:2239 -13627:2:2240 -13628:2:2248 -13629:2:2249 -13630:2:2253 -13631:2:2254 -13632:2:2248 -13633:2:2249 -13634:2:2250 -13635:2:2262 -13636:2:2267 -13637:2:2271 -13638:2:2272 -13639:2:2279 -13640:2:2280 -13641:2:2291 -13642:2:2292 -13643:2:2293 -13644:2:2291 -13645:2:2292 -13646:2:2293 -13647:2:2304 -13648:2:2309 -13649:2:2310 -13650:0:4365 -13651:3:4070 -13652:0:4365 -13653:2:2322 -13654:0:4365 -13655:2:1169 -13656:0:4365 -13657:3:4069 -13658:0:4365 -13659:2:1170 -13660:0:4365 -13661:3:4070 -13662:0:4365 -13663:3:4071 -13664:0:4365 -13665:3:4081 -13666:0:4365 -13667:3:3666 -13668:0:4365 -13669:3:3667 -13670:0:4365 -13671:3:3668 -13672:0:4365 -13673:3:3669 -13674:3:3673 -13675:3:3674 -13676:3:3682 -13677:3:3683 -13678:3:3687 -13679:3:3688 -13680:3:3682 -13681:3:3683 -13682:3:3687 -13683:3:3688 -13684:3:3696 -13685:3:3701 -13686:3:3705 -13687:3:3706 -13688:3:3713 -13689:3:3714 -13690:3:3725 -13691:3:3726 -13692:3:3727 -13693:3:3725 -13694:3:3726 -13695:3:3727 -13696:3:3738 -13697:3:3743 -13698:3:3744 -13699:0:4365 -13700:3:3756 -13701:0:4365 -13702:3:3757 -13703:0:4365 -13704:2:1173 -13705:0:4365 -13706:3:3758 -13707:0:4365 -13708:2:1179 -13709:0:4365 -13710:2:1180 -13711:0:4365 -13712:3:3757 -13713:0:4365 -13714:2:1181 -13715:2:1185 -13716:2:1186 -13717:2:1194 -13718:2:1195 -13719:2:1199 -13720:2:1200 -13721:2:1194 -13722:2:1195 -13723:2:1199 -13724:2:1200 -13725:2:1208 -13726:2:1213 -13727:2:1217 -13728:2:1218 -13729:2:1225 -13730:2:1226 -13731:2:1237 -13732:2:1238 -13733:2:1239 -13734:2:1237 -13735:2:1238 -13736:2:1239 -13737:2:1250 -13738:2:1255 -13739:2:1256 -13740:0:4365 -13741:3:3758 -13742:0:4365 -13743:2:1268 -13744:0:4365 -13745:3:3757 -13746:0:4365 -13747:2:1270 -13748:0:4365 -13749:3:3758 -13750:0:4365 -13751:2:1271 -13752:2:1275 -13753:2:1276 -13754:2:1284 -13755:2:1285 -13756:2:1289 -13757:2:1290 -13758:2:1284 -13759:2:1285 -13760:2:1289 -13761:2:1290 -13762:2:1298 -13763:2:1303 -13764:2:1307 -13765:2:1308 -13766:2:1315 -13767:2:1316 -13768:2:1327 -13769:2:1328 -13770:2:1329 -13771:2:1327 -13772:2:1328 -13773:2:1329 -13774:2:1340 -13775:2:1345 -13776:2:1346 -13777:0:4365 -13778:2:1358 -13779:0:4365 -13780:2:1360 -13781:0:4365 -13782:3:3757 -13783:0:4365 -13784:2:1361 -13785:0:4365 -13786:3:3758 -13787:0:4365 -13788:2:1362 -13789:2:1366 -13790:2:1367 -13791:2:1375 -13792:2:1376 -13793:2:1380 -13794:2:1381 -13795:2:1375 -13796:2:1376 -13797:2:1380 -13798:2:1381 -13799:2:1389 -13800:2:1394 -13801:2:1398 -13802:2:1399 -13803:2:1406 -13804:2:1407 -13805:2:1418 -13806:2:1419 -13807:2:1420 -13808:2:1418 -13809:2:1419 -13810:2:1420 -13811:2:1431 -13812:2:1436 -13813:2:1437 -13814:0:4365 -13815:2:1449 -13816:0:4365 -13817:3:3757 -13818:0:4365 -13819:2:1451 -13820:0:4365 -13821:3:3758 -13822:0:4365 -13823:2:1652 -13824:0:4365 -13825:2:1653 -13826:0:4365 -13827:2:1657 -13828:0:4365 -13829:2:1180 -13830:0:4365 -13831:3:3757 -13832:0:4365 -13833:2:1181 -13834:2:1185 -13835:2:1186 -13836:2:1194 -13837:2:1195 -13838:2:1199 -13839:2:1200 -13840:2:1194 -13841:2:1195 -13842:2:1196 -13843:2:1208 -13844:2:1213 -13845:2:1217 -13846:2:1218 -13847:2:1225 -13848:2:1226 -13849:2:1237 -13850:2:1238 -13851:2:1239 -13852:2:1237 -13853:2:1238 -13854:2:1239 -13855:2:1250 -13856:2:1255 -13857:2:1256 -13858:0:4365 -13859:3:3758 -13860:0:4365 -13861:2:1268 -13862:0:4365 -13863:3:3757 -13864:0:4365 -13865:2:1270 -13866:0:4365 -13867:3:3758 -13868:0:4365 -13869:2:1271 -13870:2:1275 -13871:2:1276 -13872:2:1284 -13873:2:1285 -13874:2:1289 -13875:2:1290 -13876:2:1284 -13877:2:1285 -13878:2:1289 -13879:2:1290 -13880:2:1298 -13881:2:1303 -13882:2:1307 -13883:2:1308 -13884:2:1315 -13885:2:1316 -13886:2:1327 -13887:2:1328 -13888:2:1329 -13889:2:1327 -13890:2:1328 -13891:2:1329 -13892:2:1340 -13893:2:1345 -13894:2:1346 -13895:0:4365 -13896:2:1358 -13897:0:4365 -13898:2:1454 -13899:0:4365 -13900:3:3757 -13901:0:4365 -13902:2:1455 -13903:0:4365 -13904:3:3758 -13905:0:4365 -13906:2:1652 -13907:0:4365 -13908:2:1653 -13909:0:4365 -13910:2:1657 -13911:0:4365 -13912:2:1660 -13913:0:4365 -13914:3:3757 -13915:0:4365 -13916:2:1665 -13917:2:1669 -13918:2:1670 -13919:2:1678 -13920:2:1679 -13921:2:1683 -13922:2:1684 -13923:2:1678 -13924:2:1679 -13925:2:1680 -13926:2:1692 -13927:2:1697 -13928:2:1701 -13929:2:1702 -13930:2:1709 -13931:2:1710 -13932:2:1721 -13933:2:1722 -13934:2:1723 -13935:2:1721 -13936:2:1722 -13937:2:1723 -13938:2:1734 -13939:2:1739 -13940:2:1740 -13941:0:4365 -13942:3:3758 -13943:0:4365 -13944:2:1752 -13945:0:4365 -13946:3:3757 -13947:0:4365 -13948:2:1754 -13949:0:4365 -13950:3:3758 -13951:0:4365 -13952:2:1755 -13953:2:1759 -13954:2:1760 -13955:2:1768 -13956:2:1769 -13957:2:1773 -13958:2:1774 -13959:2:1768 -13960:2:1769 -13961:2:1773 -13962:2:1774 -13963:2:1782 -13964:2:1787 -13965:2:1791 -13966:2:1792 -13967:2:1799 -13968:2:1800 -13969:2:1811 -13970:2:1812 -13971:2:1813 -13972:2:1811 -13973:2:1812 -13974:2:1813 -13975:2:1824 -13976:2:1829 -13977:2:1830 -13978:0:4365 -13979:2:1842 -13980:0:4365 -13981:3:3757 -13982:0:4365 -13983:2:1844 -13984:0:4365 -13985:3:3758 -13986:0:4365 -13987:2:1845 -13988:2:1849 -13989:2:1850 -13990:2:1858 -13991:2:1859 -13992:2:1863 -13993:2:1864 -13994:2:1858 -13995:2:1859 -13996:2:1863 -13997:2:1864 -13998:2:1872 -13999:2:1877 -14000:2:1881 -14001:2:1882 -14002:2:1889 -14003:2:1890 -14004:2:1901 -14005:2:1902 -14006:2:1903 -14007:2:1901 -14008:2:1902 -14009:2:1903 -14010:2:1914 -14011:2:1919 -14012:2:1920 -14013:0:4365 -14014:2:1932 -14015:0:4365 -14016:3:3757 -14017:0:4365 -14018:2:1934 -14019:0:4365 -14020:3:3758 -14021:0:4365 -14022:2:1935 -14023:0:4365 -14024:2:1936 -14025:0:4365 -14026:2:2129 -14027:0:4365 -14028:2:2130 -14029:0:4365 -14030:2:2134 -14031:0:4365 -14032:3:3757 -14033:0:4365 -14034:2:2136 -14035:0:4365 -14036:3:3758 -14037:0:4365 -14038:2:2137 -14039:2:2141 -14040:2:2142 -14041:2:2150 -14042:2:2151 -14043:2:2155 -14044:2:2156 -14045:2:2150 -14046:2:2151 -14047:2:2155 -14048:2:2156 -14049:2:2164 -14050:2:2169 -14051:2:2173 -14052:2:2174 -14053:2:2181 -14054:2:2182 -14055:2:2193 -14056:2:2194 -14057:2:2195 -14058:2:2193 -14059:2:2194 -14060:2:2195 -14061:2:2206 -14062:2:2211 -14063:2:2212 -14064:0:4365 -14065:2:2224 -14066:0:4365 -14067:3:3757 -14068:0:4365 -14069:2:2226 -14070:0:4365 -14071:3:3758 -14072:0:4365 -14073:2:1936 -14074:0:4365 -14075:2:2129 -14076:0:4365 -14077:2:2130 -14078:0:4365 -14079:2:2134 -14080:0:4365 -14081:3:3757 -14082:0:4365 -14083:2:2136 -14084:0:4365 -14085:3:3758 -14086:0:4365 -14087:2:2137 -14088:2:2141 -14089:2:2142 -14090:2:2150 -14091:2:2151 -14092:2:2155 -14093:2:2156 -14094:2:2150 -14095:2:2151 -14096:2:2152 -14097:2:2164 -14098:2:2169 -14099:2:2173 -14100:2:2174 -14101:2:2181 -14102:2:2182 -14103:2:2193 -14104:2:2194 -14105:2:2195 -14106:2:2193 -14107:2:2194 -14108:2:2195 -14109:2:2206 -14110:2:2211 -14111:2:2212 -14112:0:4365 -14113:2:2224 -14114:0:4365 -14115:3:3757 -14116:0:4365 -14117:2:2226 -14118:0:4365 -14119:3:3758 -14120:0:4365 -14121:2:2230 -14122:0:4365 -14123:3:3757 -14124:0:4365 -14125:2:2235 -14126:2:2239 -14127:2:2240 -14128:2:2248 -14129:2:2249 -14130:2:2253 -14131:2:2254 -14132:2:2248 -14133:2:2249 -14134:2:2250 -14135:2:2262 -14136:2:2267 -14137:2:2271 -14138:2:2272 -14139:2:2279 -14140:2:2280 -14141:2:2291 -14142:2:2292 -14143:2:2293 -14144:2:2291 -14145:2:2292 -14146:2:2293 -14147:2:2304 -14148:2:2309 -14149:2:2310 -14150:0:4365 -14151:3:3758 -14152:0:4365 -14153:2:2322 -14154:0:4365 -14155:2:1169 -14156:0:4365 -14157:3:3757 -14158:0:4365 -14159:2:1170 -14160:0:4365 -14161:3:3758 -14162:0:4365 -14163:3:3759 -14164:0:4365 -14165:3:3972 -14166:0:4365 -14167:3:4077 -14168:0:4365 -14169:3:4078 -14170:0:4365 -14171:3:4082 -14172:0:4365 -14173:3:4088 -14174:0:4365 -14175:3:4092 -14176:3:4093 -14177:3:4097 -14178:3:4101 -14179:3:4102 -14180:3:4097 -14181:3:4101 -14182:3:4102 -14183:3:4106 -14184:3:4114 -14185:3:4115 -14186:3:4120 -14187:3:4127 -14188:3:4128 -14189:3:4127 -14190:3:4128 -14191:3:4135 -14192:3:4140 -14193:0:4365 -14194:3:4151 -14195:0:4365 -14196:3:4155 -14197:3:4156 -14198:3:4160 -14199:3:4164 -14200:3:4165 -14201:3:4160 -14202:3:4164 -14203:3:4165 -14204:3:4169 -14205:3:4177 -14206:3:4178 -14207:3:4183 -14208:3:4190 -14209:3:4191 -14210:3:4190 -14211:3:4191 -14212:3:4198 -14213:3:4203 -14214:0:4365 -14215:3:4151 -14216:0:4365 -14217:3:4155 -14218:3:4156 -14219:3:4160 -14220:3:4164 -14221:3:4165 -14222:3:4160 -14223:3:4164 -14224:3:4165 -14225:3:4169 -14226:3:4177 -14227:3:4178 -14228:3:4183 -14229:3:4190 -14230:3:4191 -14231:3:4190 -14232:3:4191 -14233:3:4198 -14234:3:4203 -14235:0:4365 -14236:3:4214 -14237:0:4365 -14238:3:4222 -14239:3:4223 -14240:3:4227 -14241:3:4231 -14242:3:4232 -14243:3:4227 -14244:3:4231 -14245:3:4232 -14246:3:4236 -14247:3:4244 -14248:3:4245 -14249:3:4250 -14250:3:4257 -14251:3:4258 -14252:3:4257 -14253:3:4258 -14254:3:4265 -14255:3:4270 -14256:0:4365 -14257:3:4285 -14258:0:4365 -14259:3:4286 -14260:0:4365 -14261:2:1173 -14262:0:4365 -14263:3:4287 -14264:0:4365 -14265:2:1179 -14266:0:4365 -14267:2:1180 -14268:0:4365 -14269:3:4286 -14270:0:4365 -14271:2:1181 -14272:2:1185 -14273:2:1186 -14274:2:1194 -14275:2:1195 -14276:2:1199 -14277:2:1200 -14278:2:1194 -14279:2:1195 -14280:2:1199 -14281:2:1200 -14282:2:1208 -14283:2:1213 -14284:2:1217 -14285:2:1218 -14286:2:1225 -14287:2:1226 -14288:2:1237 -14289:2:1238 -14290:2:1239 -14291:2:1237 -14292:2:1238 -14293:2:1239 -14294:2:1250 -14295:2:1255 -14296:2:1256 -14297:0:4365 -14298:3:4287 -14299:0:4365 -14300:2:1268 -14301:0:4365 -14302:3:4286 -14303:0:4365 -14304:2:1270 -14305:0:4365 -14306:3:4287 -14307:0:4365 -14308:2:1271 -14309:2:1275 -14310:2:1276 -14311:2:1284 -14312:2:1285 -14313:2:1289 -14314:2:1290 -14315:2:1284 -14316:2:1285 -14317:2:1289 -14318:2:1290 -14319:2:1298 -14320:2:1303 -14321:2:1307 -14322:2:1308 -14323:2:1315 -14324:2:1316 -14325:2:1327 -14326:2:1328 -14327:2:1329 -14328:2:1327 -14329:2:1328 -14330:2:1329 -14331:2:1340 -14332:2:1345 -14333:2:1346 -14334:0:4365 -14335:2:1358 -14336:0:4365 -14337:2:1360 -14338:0:4365 -14339:3:4286 -14340:0:4365 -14341:2:1361 -14342:0:4365 -14343:3:4287 -14344:0:4365 -14345:2:1362 -14346:2:1366 -14347:2:1367 -14348:2:1375 -14349:2:1376 -14350:2:1380 -14351:2:1381 -14352:2:1375 -14353:2:1376 -14354:2:1380 -14355:2:1381 -14356:2:1389 -14357:2:1394 -14358:2:1398 -14359:2:1399 -14360:2:1406 -14361:2:1407 -14362:2:1418 -14363:2:1419 -14364:2:1420 -14365:2:1418 -14366:2:1419 -14367:2:1420 -14368:2:1431 -14369:2:1436 -14370:2:1437 -14371:0:4365 -14372:2:1449 -14373:0:4365 -14374:3:4286 -14375:0:4365 -14376:2:1451 -14377:0:4365 -14378:3:4287 -14379:0:4365 -14380:2:1652 -14381:0:4365 -14382:2:1653 -14383:0:4365 -14384:2:1657 -14385:0:4365 -14386:2:1180 -14387:0:4365 -14388:3:4286 -14389:0:4365 -14390:2:1181 -14391:2:1185 -14392:2:1186 -14393:2:1194 -14394:2:1195 -14395:2:1199 -14396:2:1200 -14397:2:1194 -14398:2:1195 -14399:2:1196 -14400:2:1208 -14401:2:1213 -14402:2:1217 -14403:2:1218 -14404:2:1225 -14405:2:1226 -14406:2:1237 -14407:2:1238 -14408:2:1239 -14409:2:1237 -14410:2:1238 -14411:2:1239 -14412:2:1250 -14413:2:1255 -14414:2:1256 -14415:0:4365 -14416:3:4287 -14417:0:4365 -14418:2:1268 -14419:0:4365 -14420:3:4286 -14421:0:4365 -14422:2:1270 -14423:0:4365 -14424:3:4287 -14425:0:4365 -14426:2:1271 -14427:2:1275 -14428:2:1276 -14429:2:1284 -14430:2:1285 -14431:2:1289 -14432:2:1290 -14433:2:1284 -14434:2:1285 -14435:2:1289 -14436:2:1290 -14437:2:1298 -14438:2:1303 -14439:2:1307 -14440:2:1308 -14441:2:1315 -14442:2:1316 -14443:2:1327 -14444:2:1328 -14445:2:1329 -14446:2:1327 -14447:2:1328 -14448:2:1329 -14449:2:1340 -14450:2:1345 -14451:2:1346 -14452:0:4365 -14453:2:1358 -14454:0:4365 -14455:2:1454 -14456:0:4365 -14457:3:4286 -14458:0:4365 -14459:2:1455 -14460:0:4365 -14461:3:4287 -14462:0:4365 -14463:2:1652 -14464:0:4365 -14465:2:1653 -14466:0:4365 -14467:2:1657 -14468:0:4365 -14469:2:1660 -14470:0:4365 -14471:3:4286 -14472:0:4365 -14473:2:1665 -14474:2:1669 -14475:2:1670 -14476:2:1678 -14477:2:1679 -14478:2:1683 -14479:2:1684 -14480:2:1678 -14481:2:1679 -14482:2:1680 -14483:2:1692 -14484:2:1697 -14485:2:1701 -14486:2:1702 -14487:2:1709 -14488:2:1710 -14489:2:1721 -14490:2:1722 -14491:2:1723 -14492:2:1721 -14493:2:1722 -14494:2:1723 -14495:2:1734 -14496:2:1739 -14497:2:1740 -14498:0:4365 -14499:3:4287 -14500:0:4365 -14501:2:1752 -14502:0:4365 -14503:3:4286 -14504:0:4365 -14505:2:1754 -14506:0:4365 -14507:3:4287 -14508:0:4365 -14509:2:1755 -14510:2:1759 -14511:2:1760 -14512:2:1768 -14513:2:1769 -14514:2:1773 -14515:2:1774 -14516:2:1768 -14517:2:1769 -14518:2:1773 -14519:2:1774 -14520:2:1782 -14521:2:1787 -14522:2:1791 -14523:2:1792 -14524:2:1799 -14525:2:1800 -14526:2:1811 -14527:2:1812 -14528:2:1813 -14529:2:1811 -14530:2:1812 -14531:2:1813 -14532:2:1824 -14533:2:1829 -14534:2:1830 -14535:0:4365 -14536:2:1842 -14537:0:4365 -14538:3:4286 -14539:0:4365 -14540:2:1844 -14541:0:4365 -14542:3:4287 -14543:0:4365 -14544:2:1845 -14545:2:1849 -14546:2:1850 -14547:2:1858 -14548:2:1859 -14549:2:1863 -14550:2:1864 -14551:2:1858 -14552:2:1859 -14553:2:1863 -14554:2:1864 -14555:2:1872 -14556:2:1877 -14557:2:1881 -14558:2:1882 -14559:2:1889 -14560:2:1890 -14561:2:1901 -14562:2:1902 -14563:2:1903 -14564:2:1901 -14565:2:1902 -14566:2:1903 -14567:2:1914 -14568:2:1919 -14569:2:1920 -14570:0:4365 -14571:2:1932 -14572:0:4365 -14573:3:4286 -14574:0:4365 -14575:2:1934 -14576:0:4365 -14577:3:4287 -14578:0:4365 -14579:2:1935 -14580:0:4365 -14581:2:1936 -14582:0:4365 -14583:2:2129 -14584:0:4365 -14585:2:2130 -14586:0:4365 -14587:2:2134 -14588:0:4365 -14589:3:4286 -14590:0:4365 -14591:2:2136 -14592:0:4365 -14593:3:4287 -14594:0:4365 -14595:2:2137 -14596:2:2141 -14597:2:2142 -14598:2:2150 -14599:2:2151 -14600:2:2155 -14601:2:2156 -14602:2:2150 -14603:2:2151 -14604:2:2155 -14605:2:2156 -14606:2:2164 -14607:2:2169 -14608:2:2173 -14609:2:2174 -14610:2:2181 -14611:2:2182 -14612:2:2193 -14613:2:2194 -14614:2:2195 -14615:2:2193 -14616:2:2194 -14617:2:2195 -14618:2:2206 -14619:2:2211 -14620:2:2212 -14621:0:4365 -14622:2:2224 -14623:0:4365 -14624:3:4286 -14625:0:4365 -14626:2:2226 -14627:0:4365 -14628:3:4287 -14629:0:4365 -14630:2:1936 -14631:0:4365 -14632:2:2129 -14633:0:4365 -14634:2:2130 -14635:0:4365 -14636:2:2134 -14637:0:4365 -14638:3:4286 -14639:0:4365 -14640:2:2136 -14641:0:4365 -14642:3:4287 -14643:0:4365 -14644:2:2137 -14645:2:2141 -14646:2:2142 -14647:2:2150 -14648:2:2151 -14649:2:2155 -14650:2:2156 -14651:2:2150 -14652:2:2151 -14653:2:2152 -14654:2:2164 -14655:2:2169 -14656:2:2173 -14657:2:2174 -14658:2:2181 -14659:2:2182 -14660:2:2193 -14661:2:2194 -14662:2:2195 -14663:2:2193 -14664:2:2194 -14665:2:2195 -14666:2:2206 -14667:2:2211 -14668:2:2212 -14669:0:4365 -14670:2:2224 -14671:0:4365 -14672:3:4286 -14673:0:4365 -14674:2:2226 -14675:0:4365 -14676:3:4287 -14677:0:4365 -14678:2:2230 -14679:0:4365 -14680:3:4286 -14681:0:4365 -14682:2:2235 -14683:2:2239 -14684:2:2240 -14685:2:2248 -14686:2:2249 -14687:2:2253 -14688:2:2254 -14689:2:2248 -14690:2:2249 -14691:2:2250 -14692:2:2262 -14693:2:2267 -14694:2:2271 -14695:2:2272 -14696:2:2279 -14697:2:2280 -14698:2:2291 -14699:2:2292 -14700:2:2293 -14701:2:2291 -14702:2:2292 -14703:2:2293 -14704:2:2304 -14705:2:2309 -14706:2:2310 -14707:0:4365 -14708:3:4287 -14709:0:4365 -14710:2:2322 -14711:0:4365 -14712:2:1169 -14713:0:4365 -14714:3:4286 -14715:0:4365 -14716:2:1170 -14717:0:4365 -14718:3:4287 -14719:0:4365 -14720:3:4288 -14721:0:4365 -14722:3:4294 -14723:0:4365 -14724:3:4295 -14725:0:4365 -14726:3:2338 -14727:0:4365 -14728:3:2339 -14729:3:2343 -14730:3:2344 -14731:3:2352 -14732:3:2353 -14733:3:2357 -14734:3:2358 -14735:3:2352 -14736:3:2353 -14737:3:2357 -14738:3:2358 -14739:3:2366 -14740:3:2371 -14741:3:2375 -14742:3:2376 -14743:3:2383 -14744:3:2384 -14745:3:2395 -14746:3:2396 -14747:3:2397 -14748:3:2395 -14749:3:2396 -14750:3:2397 -14751:3:2408 -14752:3:2413 -14753:3:2414 -14754:0:4365 -14755:3:2426 -14756:0:4365 -14757:3:2427 -14758:0:4365 -14759:2:1173 -14760:0:4365 -14761:3:2428 -14762:0:4365 -14763:2:1179 -14764:0:4365 -14765:2:1180 -14766:0:4365 -14767:3:2427 -14768:0:4365 -14769:2:1181 -14770:2:1185 -14771:2:1186 -14772:2:1194 -14773:2:1195 -14774:2:1199 -14775:2:1200 -14776:2:1194 -14777:2:1195 -14778:2:1199 -14779:2:1200 -14780:2:1208 -14781:2:1213 -14782:2:1217 -14783:2:1218 -14784:2:1225 -14785:2:1226 -14786:2:1237 -14787:2:1238 -14788:2:1239 -14789:2:1237 -14790:2:1238 -14791:2:1239 -14792:2:1250 -14793:2:1255 -14794:2:1256 -14795:0:4365 -14796:3:2428 -14797:0:4365 -14798:2:1268 -14799:0:4365 -14800:3:2427 -14801:0:4365 -14802:2:1270 -14803:0:4365 -14804:3:2428 -14805:0:4365 -14806:2:1271 -14807:2:1275 -14808:2:1276 -14809:2:1284 -14810:2:1285 -14811:2:1289 -14812:2:1290 -14813:2:1284 -14814:2:1285 -14815:2:1289 -14816:2:1290 -14817:2:1298 -14818:2:1303 -14819:2:1307 -14820:2:1308 -14821:2:1315 -14822:2:1316 -14823:2:1327 -14824:2:1328 -14825:2:1329 -14826:2:1327 -14827:2:1328 -14828:2:1329 -14829:2:1340 -14830:2:1345 -14831:2:1346 -14832:0:4365 -14833:2:1358 -14834:0:4365 -14835:2:1360 -14836:0:4365 -14837:3:2427 -14838:0:4365 -14839:2:1361 -14840:0:4365 -14841:3:2428 -14842:0:4365 -14843:2:1362 -14844:2:1366 -14845:2:1367 -14846:2:1375 -14847:2:1376 -14848:2:1380 -14849:2:1381 -14850:2:1375 -14851:2:1376 -14852:2:1380 -14853:2:1381 -14854:2:1389 -14855:2:1394 -14856:2:1398 -14857:2:1399 -14858:2:1406 -14859:2:1407 -14860:2:1418 -14861:2:1419 -14862:2:1420 -14863:2:1418 -14864:2:1419 -14865:2:1420 -14866:2:1431 -14867:2:1436 -14868:2:1437 -14869:0:4365 -14870:2:1449 -14871:0:4365 -14872:3:2427 -14873:0:4365 -14874:2:1451 -14875:0:4365 -14876:3:2428 -14877:0:4365 -14878:2:1652 -14879:0:4365 -14880:2:1653 -14881:0:4365 -14882:2:1657 -14883:0:4365 -14884:2:1180 -14885:0:4365 -14886:3:2427 -14887:0:4365 -14888:2:1181 -14889:2:1185 -14890:2:1186 -14891:2:1194 -14892:2:1195 -14893:2:1199 -14894:2:1200 -14895:2:1194 -14896:2:1195 -14897:2:1196 -14898:2:1208 -14899:2:1213 -14900:2:1217 -14901:2:1218 -14902:2:1225 -14903:2:1226 -14904:2:1237 -14905:2:1238 -14906:2:1239 -14907:2:1237 -14908:2:1238 -14909:2:1239 -14910:2:1250 -14911:2:1255 -14912:2:1256 -14913:0:4365 -14914:3:2428 -14915:0:4365 -14916:2:1268 -14917:0:4365 -14918:3:2427 -14919:0:4365 -14920:2:1270 -14921:0:4365 -14922:3:2428 -14923:0:4365 -14924:2:1271 -14925:2:1275 -14926:2:1276 -14927:2:1284 -14928:2:1285 -14929:2:1289 -14930:2:1290 -14931:2:1284 -14932:2:1285 -14933:2:1289 -14934:2:1290 -14935:2:1298 -14936:2:1303 -14937:2:1307 -14938:2:1308 -14939:2:1315 -14940:2:1316 -14941:2:1327 -14942:2:1328 -14943:2:1329 -14944:2:1327 -14945:2:1328 -14946:2:1329 -14947:2:1340 -14948:2:1345 -14949:2:1346 -14950:0:4365 -14951:2:1358 -14952:0:4365 -14953:2:1454 -14954:0:4365 -14955:3:2427 -14956:0:4365 -14957:2:1455 -14958:0:4365 -14959:3:2428 -14960:0:4365 -14961:2:1652 -14962:0:4365 -14963:2:1653 -14964:0:4365 -14965:2:1657 -14966:0:4365 -14967:2:1660 -14968:0:4365 -14969:3:2427 -14970:0:4365 -14971:2:1665 -14972:2:1669 -14973:2:1670 -14974:2:1678 -14975:2:1679 -14976:2:1683 -14977:2:1684 -14978:2:1678 -14979:2:1679 -14980:2:1680 -14981:2:1692 -14982:2:1697 -14983:2:1701 -14984:2:1702 -14985:2:1709 -14986:2:1710 -14987:2:1721 -14988:2:1722 -14989:2:1723 -14990:2:1721 -14991:2:1722 -14992:2:1723 -14993:2:1734 -14994:2:1739 -14995:2:1740 -14996:0:4365 -14997:3:2428 -14998:0:4365 -14999:2:1752 -15000:0:4365 -15001:3:2427 -15002:0:4365 -15003:2:1754 -15004:0:4365 -15005:3:2428 -15006:0:4365 -15007:2:1755 -15008:2:1759 -15009:2:1760 -15010:2:1768 -15011:2:1769 -15012:2:1773 -15013:2:1774 -15014:2:1768 -15015:2:1769 -15016:2:1773 -15017:2:1774 -15018:2:1782 -15019:2:1787 -15020:2:1791 -15021:2:1792 -15022:2:1799 -15023:2:1800 -15024:2:1811 -15025:2:1812 -15026:2:1813 -15027:2:1811 -15028:2:1812 -15029:2:1813 -15030:2:1824 -15031:2:1829 -15032:2:1830 -15033:0:4365 -15034:2:1842 -15035:0:4365 -15036:3:2427 -15037:0:4365 -15038:2:1844 -15039:0:4363 -15040:3:2428 -15041:0:4369 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_nested.define b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_nested.define deleted file mode 100644 index 0fb59bd..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_nested.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_NEST_LEVEL 2 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_nested.log b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_nested.log deleted file mode 100644 index 1bc5996..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_nested.log +++ /dev/null @@ -1,232 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_nested.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 715) -Depth= 22961 States= 1e+06 Transitions= 8.79e+06 Memory= 535.002 t= 17.2 R= 6e+04 -Depth= 22961 States= 2e+06 Transitions= 1.79e+07 Memory= 603.654 t= 34.7 R= 6e+04 -Depth= 25030 States= 3e+06 Transitions= 2.69e+07 Memory= 672.404 t= 52.6 R= 6e+04 -pan: resizing hashtable to -w22.. done -Depth= 25030 States= 4e+06 Transitions= 3.73e+07 Memory= 772.080 t= 74.4 R= 5e+04 -Depth= 25030 States= 5e+06 Transitions= 4.77e+07 Memory= 840.830 t= 96.2 R= 5e+04 -Depth= 25030 States= 6e+06 Transitions= 5.45e+07 Memory= 909.483 t= 110 R= 5e+04 -Depth= 25030 States= 7e+06 Transitions= 6.05e+07 Memory= 978.135 t= 122 R= 6e+04 -Depth= 25030 States= 8e+06 Transitions= 6.68e+07 Memory= 1046.787 t= 135 R= 6e+04 -Depth= 25030 States= 9e+06 Transitions= 7.29e+07 Memory= 1115.537 t= 148 R= 6e+04 -pan: resizing hashtable to -w24.. done -Depth= 25030 States= 1e+07 Transitions= 7.91e+07 Memory= 1308.283 t= 162 R= 6e+04 -Depth= 25030 States= 1.1e+07 Transitions= 8.5e+07 Memory= 1376.936 t= 174 R= 6e+04 -Depth= 25030 States= 1.2e+07 Transitions= 9.12e+07 Memory= 1445.588 t= 186 R= 6e+04 -Depth= 25030 States= 1.3e+07 Transitions= 9.79e+07 Memory= 1514.240 t= 200 R= 7e+04 -Depth= 25030 States= 1.4e+07 Transitions= 1.09e+08 Memory= 1582.990 t= 222 R= 6e+04 -Depth= 25030 States= 1.5e+07 Transitions= 1.18e+08 Memory= 1651.643 t= 240 R= 6e+04 -Depth= 25030 States= 1.6e+07 Transitions= 1.27e+08 Memory= 1720.295 t= 258 R= 6e+04 -Depth= 25030 States= 1.7e+07 Transitions= 1.36e+08 Memory= 1788.947 t= 276 R= 6e+04 -Depth= 25030 States= 1.8e+07 Transitions= 1.44e+08 Memory= 1857.697 t= 292 R= 6e+04 -Depth= 25030 States= 1.9e+07 Transitions= 1.54e+08 Memory= 1926.350 t= 313 R= 6e+04 -Depth= 25030 States= 2e+07 Transitions= 1.64e+08 Memory= 1995.002 t= 333 R= 6e+04 -Depth= 25104 States= 2.1e+07 Transitions= 1.73e+08 Memory= 2063.654 t= 350 R= 6e+04 -Depth= 25104 States= 2.2e+07 Transitions= 1.83e+08 Memory= 2132.404 t= 370 R= 6e+04 -Depth= 25104 States= 2.3e+07 Transitions= 1.89e+08 Memory= 2201.057 t= 384 R= 6e+04 -Depth= 25152 States= 2.4e+07 Transitions= 1.98e+08 Memory= 2269.709 t= 402 R= 6e+04 -Depth= 25152 States= 2.5e+07 Transitions= 2.08e+08 Memory= 2338.361 t= 421 R= 6e+04 -Depth= 25152 States= 2.6e+07 Transitions= 2.15e+08 Memory= 2407.111 t= 436 R= 6e+04 -Depth= 25152 States= 2.7e+07 Transitions= 2.24e+08 Memory= 2475.764 t= 454 R= 6e+04 -Depth= 25152 States= 2.8e+07 Transitions= 2.33e+08 Memory= 2544.416 t= 471 R= 6e+04 -Depth= 25152 States= 2.9e+07 Transitions= 2.42e+08 Memory= 2613.068 t= 490 R= 6e+04 -Depth= 32255 States= 3e+07 Transitions= 2.5e+08 Memory= 2681.818 t= 506 R= 6e+04 -Depth= 33413 States= 3.1e+07 Transitions= 2.61e+08 Memory= 2750.471 t= 530 R= 6e+04 -Depth= 33413 States= 3.2e+07 Transitions= 2.73e+08 Memory= 2819.123 t= 555 R= 6e+04 -Depth= 33413 States= 3.3e+07 Transitions= 2.83e+08 Memory= 2887.873 t= 576 R= 6e+04 -Depth= 33413 States= 3.4e+07 Transitions= 2.94e+08 Memory= 2956.526 t= 598 R= 6e+04 -pan: resizing hashtable to -w26.. done -Depth= 33413 States= 3.5e+07 Transitions= 3.03e+08 Memory= 3521.260 t= 624 R= 6e+04 -Depth= 33413 States= 3.6e+07 Transitions= 3.15e+08 Memory= 3589.912 t= 648 R= 6e+04 -Depth= 33413 States= 3.7e+07 Transitions= 3.25e+08 Memory= 3658.565 t= 667 R= 6e+04 -Depth= 33413 States= 3.8e+07 Transitions= 3.34e+08 Memory= 3727.315 t= 687 R= 6e+04 -Depth= 33413 States= 3.9e+07 Transitions= 3.4e+08 Memory= 3795.967 t= 699 R= 6e+04 -Depth= 33413 States= 4e+07 Transitions= 3.48e+08 Memory= 3864.619 t= 715 R= 6e+04 -Depth= 33413 States= 4.1e+07 Transitions= 3.58e+08 Memory= 3933.272 t= 735 R= 6e+04 -Depth= 33413 States= 4.2e+07 Transitions= 3.64e+08 Memory= 4002.022 t= 747 R= 6e+04 -Depth= 33413 States= 4.3e+07 Transitions= 3.72e+08 Memory= 4070.674 t= 762 R= 6e+04 -Depth= 33413 States= 4.4e+07 Transitions= 3.82e+08 Memory= 4139.326 t= 783 R= 6e+04 -Depth= 33413 States= 4.5e+07 Transitions= 3.89e+08 Memory= 4207.979 t= 799 R= 6e+04 -Depth= 33413 States= 4.6e+07 Transitions= 3.95e+08 Memory= 4276.631 t= 810 R= 6e+04 -Depth= 33413 States= 4.7e+07 Transitions= 4.01e+08 Memory= 4345.381 t= 823 R= 6e+04 -Depth= 33413 States= 4.8e+07 Transitions= 4.07e+08 Memory= 4414.033 t= 835 R= 6e+04 -Depth= 33413 States= 4.9e+07 Transitions= 4.16e+08 Memory= 4482.686 t= 852 R= 6e+04 -Depth= 33413 States= 5e+07 Transitions= 4.25e+08 Memory= 4551.338 t= 871 R= 6e+04 -Depth= 33413 States= 5.1e+07 Transitions= 4.31e+08 Memory= 4620.088 t= 883 R= 6e+04 -Depth= 33413 States= 5.2e+07 Transitions= 4.37e+08 Memory= 4688.740 t= 896 R= 6e+04 -Depth= 33413 States= 5.3e+07 Transitions= 4.43e+08 Memory= 4757.393 t= 907 R= 6e+04 -Depth= 33413 States= 5.4e+07 Transitions= 4.5e+08 Memory= 4826.045 t= 922 R= 6e+04 -Depth= 33413 States= 5.5e+07 Transitions= 4.62e+08 Memory= 4894.795 t= 947 R= 6e+04 -Depth= 33413 States= 5.6e+07 Transitions= 4.71e+08 Memory= 4963.447 t= 966 R= 6e+04 -Depth= 33413 States= 5.7e+07 Transitions= 4.81e+08 Memory= 5032.100 t= 987 R= 6e+04 -Depth= 33413 States= 5.8e+07 Transitions= 4.92e+08 Memory= 5100.752 t= 1.01e+03 R= 6e+04 -Depth= 33413 States= 5.9e+07 Transitions= 5.05e+08 Memory= 5169.502 t= 1.03e+03 R= 6e+04 -Depth= 33413 States= 6e+07 Transitions= 5.18e+08 Memory= 5238.154 t= 1.06e+03 R= 6e+04 -Depth= 33413 States= 6.1e+07 Transitions= 5.27e+08 Memory= 5306.807 t= 1.08e+03 R= 6e+04 -Depth= 33413 States= 6.2e+07 Transitions= 5.37e+08 Memory= 5375.459 t= 1.1e+03 R= 6e+04 -Depth= 33413 States= 6.3e+07 Transitions= 5.47e+08 Memory= 5444.111 t= 1.12e+03 R= 6e+04 -Depth= 33413 States= 6.4e+07 Transitions= 5.54e+08 Memory= 5512.861 t= 1.13e+03 R= 6e+04 -Depth= 33413 States= 6.5e+07 Transitions= 5.6e+08 Memory= 5581.514 t= 1.14e+03 R= 6e+04 -Depth= 33413 States= 6.6e+07 Transitions= 5.66e+08 Memory= 5650.166 t= 1.16e+03 R= 6e+04 -Depth= 33413 States= 6.7e+07 Transitions= 5.73e+08 Memory= 5718.818 t= 1.17e+03 R= 6e+04 -Depth= 33413 States= 6.8e+07 Transitions= 5.82e+08 Memory= 5787.568 t= 1.19e+03 R= 6e+04 -Depth= 33413 States= 6.9e+07 Transitions= 5.9e+08 Memory= 5856.221 t= 1.21e+03 R= 6e+04 -Depth= 33413 States= 7e+07 Transitions= 5.99e+08 Memory= 5924.873 t= 1.22e+03 R= 6e+04 -Depth= 33413 States= 7.1e+07 Transitions= 6.08e+08 Memory= 5993.526 t= 1.24e+03 R= 6e+04 -Depth= 33413 States= 7.2e+07 Transitions= 6.18e+08 Memory= 6062.276 t= 1.26e+03 R= 6e+04 -Depth= 33413 States= 7.3e+07 Transitions= 6.27e+08 Memory= 6130.928 t= 1.28e+03 R= 6e+04 -Depth= 33413 States= 7.4e+07 Transitions= 6.33e+08 Memory= 6199.580 t= 1.29e+03 R= 6e+04 -Depth= 33413 States= 7.5e+07 Transitions= 6.39e+08 Memory= 6268.233 t= 1.31e+03 R= 6e+04 -Depth= 33413 States= 7.6e+07 Transitions= 6.45e+08 Memory= 6336.983 t= 1.32e+03 R= 6e+04 -Depth= 33413 States= 7.7e+07 Transitions= 6.55e+08 Memory= 6405.635 t= 1.34e+03 R= 6e+04 -Depth= 33413 States= 7.8e+07 Transitions= 6.61e+08 Memory= 6474.287 t= 1.35e+03 R= 6e+04 -Depth= 33413 States= 7.9e+07 Transitions= 6.71e+08 Memory= 6542.940 t= 1.37e+03 R= 6e+04 -Depth= 33413 States= 8e+07 Transitions= 6.77e+08 Memory= 6611.592 t= 1.38e+03 R= 6e+04 -Depth= 33413 States= 8.1e+07 Transitions= 6.83e+08 Memory= 6680.342 t= 1.4e+03 R= 6e+04 -Depth= 33413 States= 8.2e+07 Transitions= 6.91e+08 Memory= 6748.994 t= 1.41e+03 R= 6e+04 -Depth= 33413 States= 8.3e+07 Transitions= 6.97e+08 Memory= 6817.647 t= 1.43e+03 R= 6e+04 -Depth= 33413 States= 8.4e+07 Transitions= 7.06e+08 Memory= 6886.299 t= 1.44e+03 R= 6e+04 -Depth= 33413 States= 8.5e+07 Transitions= 7.15e+08 Memory= 6955.049 t= 1.46e+03 R= 6e+04 -Depth= 33413 States= 8.6e+07 Transitions= 7.24e+08 Memory= 7023.701 t= 1.48e+03 R= 6e+04 -Depth= 33413 States= 8.7e+07 Transitions= 7.35e+08 Memory= 7092.354 t= 1.5e+03 R= 6e+04 -Depth= 33413 States= 8.8e+07 Transitions= 7.46e+08 Memory= 7161.006 t= 1.52e+03 R= 6e+04 -Depth= 33413 States= 8.9e+07 Transitions= 7.61e+08 Memory= 7229.756 t= 1.56e+03 R= 6e+04 -Depth= 33413 States= 9e+07 Transitions= 7.83e+08 Memory= 7298.408 t= 1.6e+03 R= 6e+04 -Depth= 33413 States= 9.1e+07 Transitions= 7.97e+08 Memory= 7367.061 t= 1.63e+03 R= 6e+04 -Depth= 33413 States= 9.2e+07 Transitions= 8.12e+08 Memory= 7435.713 t= 1.66e+03 R= 6e+04 -Depth= 33413 States= 9.3e+07 Transitions= 8.24e+08 Memory= 7504.463 t= 1.68e+03 R= 6e+04 -Depth= 33413 States= 9.4e+07 Transitions= 8.32e+08 Memory= 7573.115 t= 1.7e+03 R= 6e+04 -Depth= 33413 States= 9.5e+07 Transitions= 8.46e+08 Memory= 7641.768 t= 1.73e+03 R= 5e+04 -Depth= 33413 States= 9.6e+07 Transitions= 8.57e+08 Memory= 7710.420 t= 1.75e+03 R= 5e+04 -Depth= 33413 States= 9.7e+07 Transitions= 8.71e+08 Memory= 7779.072 t= 1.78e+03 R= 5e+04 -Depth= 33413 States= 9.8e+07 Transitions= 8.84e+08 Memory= 7847.822 t= 1.81e+03 R= 5e+04 -Depth= 33413 States= 9.9e+07 Transitions= 8.97e+08 Memory= 7916.475 t= 1.83e+03 R= 5e+04 -Depth= 33413 States= 1e+08 Transitions= 9.08e+08 Memory= 7985.127 t= 1.85e+03 R= 5e+04 -Depth= 33413 States= 1.01e+08 Transitions= 9.22e+08 Memory= 8053.779 t= 1.88e+03 R= 5e+04 -Depth= 33413 States= 1.02e+08 Transitions= 9.35e+08 Memory= 8122.529 t= 1.91e+03 R= 5e+04 -Depth= 33413 States= 1.03e+08 Transitions= 9.47e+08 Memory= 8191.182 t= 1.93e+03 R= 5e+04 -Depth= 33413 States= 1.04e+08 Transitions= 9.59e+08 Memory= 8259.834 t= 1.96e+03 R= 5e+04 -Depth= 33413 States= 1.05e+08 Transitions= 9.68e+08 Memory= 8328.486 t= 1.97e+03 R= 5e+04 -Depth= 33413 States= 1.06e+08 Transitions= 9.78e+08 Memory= 8397.236 t= 2e+03 R= 5e+04 -Depth= 33413 States= 1.07e+08 Transitions= 9.97e+08 Memory= 8465.889 t= 2.04e+03 R= 5e+04 -Depth= 33413 States= 1.08e+08 Transitions= 1.01e+09 Memory= 8534.541 t= 2.06e+03 R= 5e+04 -Depth= 33413 States= 1.09e+08 Transitions= 1.02e+09 Memory= 8603.193 t= 2.09e+03 R= 5e+04 -Depth= 33413 States= 1.1e+08 Transitions= 1.03e+09 Memory= 8671.846 t= 2.1e+03 R= 5e+04 -Depth= 33413 States= 1.11e+08 Transitions= 1.05e+09 Memory= 8740.596 t= 2.13e+03 R= 5e+04 -Depth= 33413 States= 1.12e+08 Transitions= 1.06e+09 Memory= 8809.248 t= 2.17e+03 R= 5e+04 -Depth= 33413 States= 1.13e+08 Transitions= 1.08e+09 Memory= 8877.901 t= 2.19e+03 R= 5e+04 -Depth= 33413 States= 1.14e+08 Transitions= 1.09e+09 Memory= 8946.553 t= 2.22e+03 R= 5e+04 -Depth= 33413 States= 1.15e+08 Transitions= 1.1e+09 Memory= 9015.303 t= 2.24e+03 R= 5e+04 -Depth= 33413 States= 1.16e+08 Transitions= 1.11e+09 Memory= 9083.955 t= 2.26e+03 R= 5e+04 -Depth= 33413 States= 1.17e+08 Transitions= 1.11e+09 Memory= 9152.608 t= 2.27e+03 R= 5e+04 -Depth= 33413 States= 1.18e+08 Transitions= 1.12e+09 Memory= 9221.260 t= 2.29e+03 R= 5e+04 -Depth= 33413 States= 1.19e+08 Transitions= 1.13e+09 Memory= 9290.010 t= 2.3e+03 R= 5e+04 -Depth= 33413 States= 1.2e+08 Transitions= 1.14e+09 Memory= 9358.662 t= 2.32e+03 R= 5e+04 -Depth= 33413 States= 1.21e+08 Transitions= 1.15e+09 Memory= 9427.315 t= 2.34e+03 R= 5e+04 -Depth= 33413 States= 1.22e+08 Transitions= 1.17e+09 Memory= 9495.967 t= 2.38e+03 R= 5e+04 -Depth= 33413 States= 1.23e+08 Transitions= 1.18e+09 Memory= 9564.717 t= 2.41e+03 R= 5e+04 -Depth= 33413 States= 1.24e+08 Transitions= 1.19e+09 Memory= 9633.369 t= 2.43e+03 R= 5e+04 -Depth= 33413 States= 1.25e+08 Transitions= 1.2e+09 Memory= 9702.022 t= 2.46e+03 R= 5e+04 -Depth= 33413 States= 1.26e+08 Transitions= 1.22e+09 Memory= 9770.674 t= 2.48e+03 R= 5e+04 -Depth= 33413 States= 1.27e+08 Transitions= 1.23e+09 Memory= 9839.326 t= 2.51e+03 R= 5e+04 -Depth= 33413 States= 1.28e+08 Transitions= 1.24e+09 Memory= 9908.076 t= 2.54e+03 R= 5e+04 -Depth= 33413 States= 1.29e+08 Transitions= 1.25e+09 Memory= 9976.729 t= 2.56e+03 R= 5e+04 -Depth= 33413 States= 1.3e+08 Transitions= 1.26e+09 Memory= 10045.381 t= 2.58e+03 R= 5e+04 -Depth= 33413 States= 1.31e+08 Transitions= 1.27e+09 Memory= 10114.033 t= 2.61e+03 R= 5e+04 -Depth= 33413 States= 1.32e+08 Transitions= 1.28e+09 Memory= 10182.783 t= 2.62e+03 R= 5e+04 -Depth= 33413 States= 1.33e+08 Transitions= 1.29e+09 Memory= 10251.436 t= 2.64e+03 R= 5e+04 -Depth= 33413 States= 1.34e+08 Transitions= 1.3e+09 Memory= 10320.088 t= 2.66e+03 R= 5e+04 -Depth= 33413 States= 1.35e+08 Transitions= 1.31e+09 Memory= 10388.740 t= 2.68e+03 R= 5e+04 -pan: resizing hashtable to -w28.. done -Depth= 33413 States= 1.36e+08 Transitions= 1.32e+09 Memory= 12441.428 t= 2.73e+03 R= 5e+04 -Depth= 33413 States= 1.37e+08 Transitions= 1.32e+09 Memory= 12510.178 t= 2.75e+03 R= 5e+04 -Depth= 33413 States= 1.38e+08 Transitions= 1.33e+09 Memory= 12578.830 t= 2.77e+03 R= 5e+04 -Depth= 33413 States= 1.39e+08 Transitions= 1.35e+09 Memory= 12647.483 t= 2.79e+03 R= 5e+04 -Depth= 33413 States= 1.4e+08 Transitions= 1.36e+09 Memory= 12716.135 t= 2.82e+03 R= 5e+04 -Depth= 33413 States= 1.41e+08 Transitions= 1.37e+09 Memory= 12784.787 t= 2.84e+03 R= 5e+04 -Depth= 33413 States= 1.42e+08 Transitions= 1.38e+09 Memory= 12853.537 t= 2.86e+03 R= 5e+04 -Depth= 33413 States= 1.43e+08 Transitions= 1.4e+09 Memory= 12922.190 t= 2.9e+03 R= 5e+04 -Depth= 33413 States= 1.44e+08 Transitions= 1.41e+09 Memory= 12990.842 t= 2.91e+03 R= 5e+04 -Depth= 33413 States= 1.45e+08 Transitions= 1.42e+09 Memory= 13059.494 t= 2.93e+03 R= 5e+04 -Depth= 33413 States= 1.46e+08 Transitions= 1.43e+09 Memory= 13128.244 t= 2.96e+03 R= 5e+04 -Depth= 33413 States= 1.47e+08 Transitions= 1.45e+09 Memory= 13196.897 t= 3e+03 R= 5e+04 -Depth= 33413 States= 1.48e+08 Transitions= 1.47e+09 Memory= 13265.549 t= 3.03e+03 R= 5e+04 -Depth= 33413 States= 1.49e+08 Transitions= 1.48e+09 Memory= 13334.201 t= 3.06e+03 R= 5e+04 -Depth= 33413 States= 1.5e+08 Transitions= 1.5e+09 Memory= 13402.951 t= 3.09e+03 R= 5e+04 -Depth= 33413 States= 1.51e+08 Transitions= 1.5e+09 Memory= 13471.604 t= 3.11e+03 R= 5e+04 -Depth= 33413 States= 1.52e+08 Transitions= 1.52e+09 Memory= 13540.256 t= 3.13e+03 R= 5e+04 -Depth= 33413 States= 1.53e+08 Transitions= 1.53e+09 Memory= 13608.908 t= 3.15e+03 R= 5e+04 -Depth= 33413 States= 1.54e+08 Transitions= 1.55e+09 Memory= 13677.658 t= 3.19e+03 R= 5e+04 -Depth= 33413 States= 1.55e+08 Transitions= 1.56e+09 Memory= 13746.311 t= 3.22e+03 R= 5e+04 -Depth= 33413 States= 1.56e+08 Transitions= 1.58e+09 Memory= 13814.963 t= 3.25e+03 R= 5e+04 -Depth= 33413 States= 1.57e+08 Transitions= 1.59e+09 Memory= 13883.615 t= 3.29e+03 R= 5e+04 -Depth= 33413 States= 1.58e+08 Transitions= 1.6e+09 Memory= 13952.268 t= 3.31e+03 R= 5e+04 -Depth= 33413 States= 1.59e+08 Transitions= 1.61e+09 Memory= 14021.018 t= 3.33e+03 R= 5e+04 -Depth= 33413 States= 1.6e+08 Transitions= 1.63e+09 Memory= 14089.670 t= 3.36e+03 R= 5e+04 -Depth= 33413 States= 1.61e+08 Transitions= 1.64e+09 Memory= 14158.322 t= 3.39e+03 R= 5e+04 -Depth= 33413 States= 1.62e+08 Transitions= 1.66e+09 Memory= 14226.975 t= 3.42e+03 R= 5e+04 -Depth= 33413 States= 1.63e+08 Transitions= 1.67e+09 Memory= 14295.725 t= 3.45e+03 R= 5e+04 -Depth= 33413 States= 1.64e+08 Transitions= 1.69e+09 Memory= 14364.377 t= 3.48e+03 R= 5e+04 -Depth= 33413 States= 1.65e+08 Transitions= 1.7e+09 Memory= 14433.029 t= 3.5e+03 R= 5e+04 -Depth= 33413 States= 1.66e+08 Transitions= 1.71e+09 Memory= 14501.682 t= 3.52e+03 R= 5e+04 -Depth= 33413 States= 1.67e+08 Transitions= 1.72e+09 Memory= 14570.432 t= 3.55e+03 R= 5e+04 -Depth= 33413 States= 1.68e+08 Transitions= 1.73e+09 Memory= 14639.084 t= 3.57e+03 R= 5e+04 -Depth= 33413 States= 1.69e+08 Transitions= 1.74e+09 Memory= 14707.736 t= 3.59e+03 R= 5e+04 -Depth= 33413 States= 1.7e+08 Transitions= 1.76e+09 Memory= 14776.389 t= 3.62e+03 R= 5e+04 -Depth= 33413 States= 1.71e+08 Transitions= 1.77e+09 Memory= 14845.041 t= 3.64e+03 R= 5e+04 -Depth= 33413 States= 1.72e+08 Transitions= 1.77e+09 Memory= 14913.791 t= 3.65e+03 R= 5e+04 -Depth= 33413 States= 1.73e+08 Transitions= 1.78e+09 Memory= 14982.443 t= 3.66e+03 R= 5e+04 -Depth= 33413 States= 1.74e+08 Transitions= 1.79e+09 Memory= 15051.096 t= 3.68e+03 R= 5e+04 -Depth= 33413 States= 1.75e+08 Transitions= 1.79e+09 Memory= 15119.748 t= 3.69e+03 R= 5e+04 -Depth= 33413 States= 1.76e+08 Transitions= 1.8e+09 Memory= 15188.498 t= 3.71e+03 R= 5e+04 -Depth= 33413 States= 1.77e+08 Transitions= 1.8e+09 Memory= 15257.151 t= 3.72e+03 R= 5e+04 -Depth= 33413 States= 1.78e+08 Transitions= 1.81e+09 Memory= 15325.803 t= 3.73e+03 R= 5e+04 -Depth= 33413 States= 1.79e+08 Transitions= 1.82e+09 Memory= 15394.455 t= 3.75e+03 R= 5e+04 -Depth= 33413 States= 1.8e+08 Transitions= 1.83e+09 Memory= 15463.205 t= 3.76e+03 R= 5e+04 -Depth= 33413 States= 1.81e+08 Transitions= 1.83e+09 Memory= 15531.858 t= 3.77e+03 R= 5e+04 -Depth= 33413 States= 1.82e+08 Transitions= 1.84e+09 Memory= 15600.510 t= 3.79e+03 R= 5e+04 -Depth= 33413 States= 1.83e+08 Transitions= 1.85e+09 Memory= 15669.162 t= 3.8e+03 R= 5e+04 -Depth= 33413 States= 1.84e+08 Transitions= 1.86e+09 Memory= 15737.912 t= 3.82e+03 R= 5e+04 -Depth= 33413 States= 1.85e+08 Transitions= 1.87e+09 Memory= 15806.565 t= 3.84e+03 R= 5e+04 -Depth= 33413 States= 1.86e+08 Transitions= 1.88e+09 Memory= 15875.217 t= 3.87e+03 R= 5e+04 -Depth= 33413 States= 1.87e+08 Transitions= 1.89e+09 Memory= 15943.869 t= 3.89e+03 R= 5e+04 -Depth= 33413 States= 1.88e+08 Transitions= 1.9e+09 Memory= 16012.522 t= 3.91e+03 R= 5e+04 -Depth= 33413 States= 1.89e+08 Transitions= 1.91e+09 Memory= 16081.272 t= 3.94e+03 R= 5e+04 -Depth= 33413 States= 1.9e+08 Transitions= 1.92e+09 Memory= 16149.924 t= 3.96e+03 R= 5e+04 -Depth= 33413 States= 1.91e+08 Transitions= 1.94e+09 Memory= 16218.576 t= 3.98e+03 R= 5e+04 -Depth= 33413 States= 1.92e+08 Transitions= 1.95e+09 Memory= 16287.229 t= 4.02e+03 R= 5e+04 -Depth= 33413 States= 1.93e+08 Transitions= 1.96e+09 Memory= 16355.979 t= 4.05e+03 R= 5e+04 -Depth= 33413 States= 1.94e+08 Transitions= 1.97e+09 Memory= 16424.631 t= 4.09e+03 R= 5e+04 -Depth= 33413 States= 1.95e+08 Transitions= 1.99e+09 Memory= 16493.283 t= 4.17e+03 R= 5e+04 -Depth= 33413 States= 1.96e+08 Transitions= 2e+09 Memory= 16561.936 t= 4.26e+03 R= 5e+04 -Depth= 33413 States= 1.97e+08 Transitions= 2.02e+09 Memory= 16630.686 t= 4.36e+03 R= 5e+04 -Depth= 33413 States= 1.98e+08 Transitions= 2.04e+09 Memory= 16699.338 t= 4.45e+03 R= 4e+04 -Depth= 33413 States= 1.99e+08 Transitions= 2.05e+09 Memory= 16767.990 t= 4.53e+03 R= 4e+04 -Depth= 33413 States= 2e+08 Transitions= 2.06e+09 Memory= 16836.643 t= 4.59e+03 R= 4e+04 -Depth= 33413 States= 2.01e+08 Transitions= 2.07e+09 Memory= 16905.393 t= 4.64e+03 R= 4e+04 -Depth= 33413 States= 2.02e+08 Transitions= 2.07e+09 Memory= 16974.045 t= 4.7e+03 R= 4e+04 -Depth= 33413 States= 2.03e+08 Transitions= 2.08e+09 Memory= 17042.697 t= 4.78e+03 R= 4e+04 -Depth= 33413 States= 2.04e+08 Transitions= 2.1e+09 Memory= 17111.350 t= 4.9e+03 R= 4e+04 -Depth= 33413 States= 2.05e+08 Transitions= 2.11e+09 Memory= 17180.002 t= 5.05e+03 R= 4e+04 -Depth= 33413 States= 2.06e+08 Transitions= 2.13e+09 Memory= 17248.752 t= 5.25e+03 R= 4e+04 -Depth= 33413 States= 2.07e+08 Transitions= 2.14e+09 Memory= 17317.404 t= 5.45e+03 R= 4e+04 -Depth= 33413 States= 2.08e+08 Transitions= 2.15e+09 Memory= 17386.057 t= 5.65e+03 R= 4e+04 -Depth= 33413 States= 2.09e+08 Transitions= 2.16e+09 Memory= 17454.709 t= 5.86e+03 R= 4e+04 -Depth= 33413 States= 2.1e+08 Transitions= 2.17e+09 Memory= 17523.459 t= 6.1e+03 R= 3e+04 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_nested.spin.input b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_nested.spin.input deleted file mode 100644 index c94928c..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_nested.spin.input +++ /dev/null @@ -1,696 +0,0 @@ -#define READER_NEST_LEVEL 1 - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE -#define get_pid() ((_pid < 1) -> 0 : 1) -#elif defined(TEST_SIGNAL_ON_READ) -#define get_pid() ((_pid < 2) -> 0 : 1) -#else -#define get_pid() (_pid) -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - dispatch_sighand_read_exec(); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - dispatch_sighand_read_exec(); - data_access[get_readerid()] = 1; - ooo_mem(i); - dispatch_sighand_read_exec(); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - if - :: get_readerid() == 0 -> -progress_reader: - skip; - fi; -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - if - :: get_readerid() == 0 -> -progress_reader: - skip; - fi; -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_nested.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_nested.spin.input.trail deleted file mode 100644 index 6f29ad2..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_nested.spin.input.trail +++ /dev/null @@ -1,11161 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4365 -2:4:4317 -3:4:4320 -4:4:4320 -5:4:4320 -6:4:4323 -7:4:4331 -8:4:4331 -9:4:4331 -10:4:4334 -11:4:4340 -12:4:4344 -13:4:4344 -14:4:4344 -15:4:4347 -16:4:4340 -17:4:4344 -18:4:4344 -19:4:4344 -20:4:4347 -21:4:4355 -22:4:4359 -23:4:4360 -24:0:4365 -25:4:4362 -26:0:4365 -27:3:2331 -28:0:4365 -29:3:2337 -30:0:4365 -31:3:2338 -32:0:4365 -33:3:2339 -34:3:2343 -35:3:2344 -36:3:2352 -37:3:2353 -38:3:2357 -39:3:2358 -40:3:2352 -41:3:2353 -42:3:2357 -43:3:2358 -44:3:2366 -45:3:2371 -46:3:2375 -47:3:2376 -48:3:2383 -49:3:2384 -50:3:2395 -51:3:2396 -52:3:2397 -53:3:2395 -54:3:2396 -55:3:2397 -56:3:2408 -57:3:2413 -58:3:2414 -59:0:4365 -60:3:2426 -61:0:4365 -62:3:2427 -63:0:4365 -64:2:1162 -65:0:4365 -66:3:2428 -67:0:4365 -68:2:1168 -69:0:4365 -70:2:1169 -71:0:4365 -72:3:2427 -73:0:4365 -74:2:1170 -75:0:4365 -76:3:2428 -77:0:4365 -78:3:2429 -79:0:4365 -80:3:2435 -81:3:2436 -82:0:4365 -83:3:2440 -84:3:2444 -85:3:2445 -86:3:2453 -87:3:2454 -88:3:2458 -89:3:2459 -90:3:2453 -91:3:2454 -92:3:2458 -93:3:2459 -94:3:2467 -95:3:2472 -96:3:2473 -97:3:2484 -98:3:2485 -99:3:2496 -100:3:2497 -101:3:2498 -102:3:2496 -103:3:2497 -104:3:2498 -105:3:2509 -106:3:2514 -107:3:2515 -108:0:4365 -109:3:2527 -110:0:4365 -111:3:2528 -112:0:4365 -113:2:1173 -114:0:4365 -115:3:2529 -116:0:4365 -117:2:1179 -118:0:4365 -119:2:1180 -120:0:4365 -121:3:2528 -122:0:4365 -123:2:1181 -124:2:1185 -125:2:1186 -126:2:1194 -127:2:1195 -128:2:1199 -129:2:1200 -130:2:1194 -131:2:1195 -132:2:1199 -133:2:1200 -134:2:1208 -135:2:1213 -136:2:1217 -137:2:1218 -138:2:1225 -139:2:1226 -140:2:1237 -141:2:1238 -142:2:1239 -143:2:1237 -144:2:1238 -145:2:1239 -146:2:1250 -147:2:1255 -148:2:1256 -149:0:4365 -150:3:2529 -151:0:4365 -152:2:1268 -153:0:4365 -154:3:2528 -155:0:4365 -156:2:1270 -157:0:4365 -158:3:2529 -159:0:4365 -160:2:1271 -161:2:1275 -162:2:1276 -163:2:1284 -164:2:1285 -165:2:1289 -166:2:1290 -167:2:1284 -168:2:1285 -169:2:1289 -170:2:1290 -171:2:1298 -172:2:1303 -173:2:1307 -174:2:1308 -175:2:1315 -176:2:1316 -177:2:1327 -178:2:1328 -179:2:1329 -180:2:1327 -181:2:1328 -182:2:1329 -183:2:1340 -184:2:1345 -185:2:1346 -186:0:4365 -187:2:1358 -188:0:4365 -189:2:1360 -190:0:4365 -191:3:2528 -192:0:4365 -193:2:1361 -194:0:4365 -195:3:2529 -196:0:4365 -197:2:1362 -198:2:1366 -199:2:1367 -200:2:1375 -201:2:1376 -202:2:1380 -203:2:1381 -204:2:1375 -205:2:1376 -206:2:1380 -207:2:1381 -208:2:1389 -209:2:1394 -210:2:1398 -211:2:1399 -212:2:1406 -213:2:1407 -214:2:1418 -215:2:1419 -216:2:1420 -217:2:1418 -218:2:1419 -219:2:1420 -220:2:1431 -221:2:1436 -222:2:1437 -223:0:4365 -224:2:1449 -225:0:4365 -226:3:2528 -227:0:4365 -228:2:1451 -229:0:4365 -230:3:2529 -231:0:4365 -232:2:1652 -233:0:4365 -234:2:1653 -235:0:4365 -236:2:1657 -237:0:4365 -238:2:1660 -239:0:4365 -240:3:2528 -241:0:4365 -242:2:1665 -243:2:1669 -244:2:1670 -245:2:1678 -246:2:1679 -247:2:1683 -248:2:1684 -249:2:1678 -250:2:1679 -251:2:1680 -252:2:1692 -253:2:1697 -254:2:1701 -255:2:1702 -256:2:1709 -257:2:1710 -258:2:1721 -259:2:1722 -260:2:1723 -261:2:1721 -262:2:1722 -263:2:1723 -264:2:1734 -265:2:1739 -266:2:1740 -267:0:4365 -268:3:2529 -269:0:4365 -270:2:1752 -271:0:4365 -272:3:2528 -273:0:4365 -274:2:1754 -275:0:4365 -276:3:2529 -277:0:4365 -278:2:1755 -279:2:1759 -280:2:1760 -281:2:1768 -282:2:1769 -283:2:1773 -284:2:1774 -285:2:1768 -286:2:1769 -287:2:1773 -288:2:1774 -289:2:1782 -290:2:1787 -291:2:1791 -292:2:1792 -293:2:1799 -294:2:1800 -295:2:1811 -296:2:1812 -297:2:1813 -298:2:1811 -299:2:1812 -300:2:1813 -301:2:1824 -302:2:1829 -303:2:1830 -304:0:4365 -305:2:1842 -306:0:4365 -307:3:2528 -308:0:4365 -309:2:1844 -310:0:4365 -311:3:2529 -312:0:4365 -313:2:1845 -314:2:1849 -315:2:1850 -316:2:1858 -317:2:1859 -318:2:1863 -319:2:1864 -320:2:1858 -321:2:1859 -322:2:1863 -323:2:1864 -324:2:1872 -325:2:1877 -326:2:1881 -327:2:1882 -328:2:1889 -329:2:1890 -330:2:1901 -331:2:1902 -332:2:1903 -333:2:1901 -334:2:1902 -335:2:1903 -336:2:1914 -337:2:1919 -338:2:1920 -339:0:4365 -340:2:1932 -341:0:4365 -342:3:2528 -343:0:4365 -344:2:1934 -345:0:4365 -346:3:2529 -347:0:4365 -348:2:1935 -349:0:4365 -350:2:1936 -351:0:4365 -352:2:2129 -353:0:4365 -354:2:2130 -355:0:4365 -356:2:2134 -357:0:4365 -358:3:2528 -359:0:4365 -360:2:2136 -361:0:4365 -362:3:2529 -363:0:4365 -364:2:2137 -365:2:2141 -366:2:2142 -367:2:2150 -368:2:2151 -369:2:2155 -370:2:2156 -371:2:2150 -372:2:2151 -373:2:2155 -374:2:2156 -375:2:2164 -376:2:2169 -377:2:2173 -378:2:2174 -379:2:2181 -380:2:2182 -381:2:2193 -382:2:2194 -383:2:2195 -384:2:2193 -385:2:2194 -386:2:2195 -387:2:2206 -388:2:2211 -389:2:2212 -390:0:4365 -391:2:2224 -392:0:4365 -393:3:2528 -394:0:4365 -395:2:2226 -396:0:4365 -397:3:2529 -398:0:4365 -399:2:2230 -400:0:4365 -401:3:2528 -402:0:4365 -403:2:2235 -404:2:2239 -405:2:2240 -406:2:2248 -407:2:2249 -408:2:2253 -409:2:2254 -410:2:2248 -411:2:2249 -412:2:2250 -413:2:2262 -414:2:2267 -415:2:2271 -416:2:2272 -417:2:2279 -418:2:2280 -419:2:2291 -420:2:2292 -421:2:2293 -422:2:2291 -423:2:2292 -424:2:2293 -425:2:2304 -426:2:2309 -427:2:2310 -428:0:4365 -429:3:2529 -430:0:4365 -431:2:2322 -432:0:4365 -433:2:1169 -434:0:4365 -435:3:2528 -436:0:4365 -437:2:1170 -438:0:4365 -439:3:2529 -440:0:4365 -441:3:2530 -442:0:4365 -443:3:2536 -444:0:4365 -445:3:2537 -446:0:4365 -447:3:2547 -448:0:4365 -449:3:2548 -450:0:4365 -451:3:2552 -452:3:2553 -453:3:2557 -454:3:2561 -455:3:2562 -456:3:2557 -457:3:2561 -458:3:2562 -459:3:2566 -460:3:2574 -461:3:2575 -462:3:2580 -463:3:2587 -464:3:2588 -465:3:2587 -466:3:2588 -467:3:2595 -468:3:2600 -469:0:4365 -470:3:2611 -471:0:4365 -472:3:2615 -473:3:2616 -474:3:2620 -475:3:2624 -476:3:2625 -477:3:2620 -478:3:2624 -479:3:2625 -480:3:2629 -481:3:2637 -482:3:2638 -483:3:2643 -484:3:2650 -485:3:2651 -486:3:2650 -487:3:2651 -488:3:2658 -489:3:2663 -490:0:4365 -491:3:2611 -492:0:4365 -493:3:2615 -494:3:2616 -495:3:2620 -496:3:2624 -497:3:2625 -498:3:2620 -499:3:2624 -500:3:2625 -501:3:2629 -502:3:2637 -503:3:2638 -504:3:2643 -505:3:2650 -506:3:2651 -507:3:2650 -508:3:2651 -509:3:2658 -510:3:2663 -511:0:4365 -512:3:2674 -513:0:4365 -514:3:2682 -515:3:2683 -516:3:2687 -517:3:2691 -518:3:2692 -519:3:2687 -520:3:2691 -521:3:2692 -522:3:2696 -523:3:2704 -524:3:2705 -525:3:2710 -526:3:2717 -527:3:2718 -528:3:2717 -529:3:2718 -530:3:2725 -531:3:2730 -532:0:4365 -533:3:2745 -534:0:4365 -535:3:2746 -536:0:4365 -537:2:1173 -538:0:4365 -539:3:2747 -540:0:4365 -541:2:1179 -542:0:4365 -543:2:1180 -544:0:4365 -545:3:2746 -546:0:4365 -547:2:1181 -548:2:1185 -549:2:1186 -550:2:1194 -551:2:1195 -552:2:1199 -553:2:1200 -554:2:1194 -555:2:1195 -556:2:1199 -557:2:1200 -558:2:1208 -559:2:1213 -560:2:1217 -561:2:1218 -562:2:1225 -563:2:1226 -564:2:1237 -565:2:1238 -566:2:1239 -567:2:1237 -568:2:1238 -569:2:1239 -570:2:1250 -571:2:1255 -572:2:1256 -573:0:4365 -574:3:2747 -575:0:4365 -576:2:1268 -577:0:4365 -578:3:2746 -579:0:4365 -580:2:1270 -581:0:4365 -582:3:2747 -583:0:4365 -584:2:1271 -585:2:1275 -586:2:1276 -587:2:1284 -588:2:1285 -589:2:1289 -590:2:1290 -591:2:1284 -592:2:1285 -593:2:1289 -594:2:1290 -595:2:1298 -596:2:1303 -597:2:1307 -598:2:1308 -599:2:1315 -600:2:1316 -601:2:1327 -602:2:1328 -603:2:1329 -604:2:1327 -605:2:1328 -606:2:1329 -607:2:1340 -608:2:1345 -609:2:1346 -610:0:4365 -611:2:1358 -612:0:4365 -613:2:1360 -614:0:4365 -615:3:2746 -616:0:4365 -617:2:1361 -618:0:4365 -619:3:2747 -620:0:4365 -621:2:1362 -622:2:1366 -623:2:1367 -624:2:1375 -625:2:1376 -626:2:1380 -627:2:1381 -628:2:1375 -629:2:1376 -630:2:1380 -631:2:1381 -632:2:1389 -633:2:1394 -634:2:1398 -635:2:1399 -636:2:1406 -637:2:1407 -638:2:1418 -639:2:1419 -640:2:1420 -641:2:1418 -642:2:1419 -643:2:1420 -644:2:1431 -645:2:1436 -646:2:1437 -647:0:4365 -648:2:1449 -649:0:4365 -650:3:2746 -651:0:4365 -652:2:1451 -653:0:4365 -654:3:2747 -655:0:4365 -656:2:1652 -657:0:4365 -658:2:1653 -659:0:4365 -660:2:1657 -661:0:4365 -662:2:1660 -663:0:4365 -664:3:2746 -665:0:4365 -666:2:1665 -667:2:1669 -668:2:1670 -669:2:1678 -670:2:1679 -671:2:1683 -672:2:1684 -673:2:1678 -674:2:1679 -675:2:1680 -676:2:1692 -677:2:1697 -678:2:1701 -679:2:1702 -680:2:1709 -681:2:1710 -682:2:1721 -683:2:1722 -684:2:1723 -685:2:1721 -686:2:1722 -687:2:1723 -688:2:1734 -689:2:1739 -690:2:1740 -691:0:4365 -692:3:2747 -693:0:4365 -694:2:1752 -695:0:4365 -696:3:2746 -697:0:4365 -698:2:1754 -699:0:4365 -700:3:2747 -701:0:4365 -702:2:1755 -703:2:1759 -704:2:1760 -705:2:1768 -706:2:1769 -707:2:1773 -708:2:1774 -709:2:1768 -710:2:1769 -711:2:1773 -712:2:1774 -713:2:1782 -714:2:1787 -715:2:1791 -716:2:1792 -717:2:1799 -718:2:1800 -719:2:1811 -720:2:1812 -721:2:1813 -722:2:1811 -723:2:1812 -724:2:1813 -725:2:1824 -726:2:1829 -727:2:1830 -728:0:4365 -729:2:1842 -730:0:4365 -731:3:2746 -732:0:4365 -733:2:1844 -734:0:4365 -735:3:2747 -736:0:4365 -737:2:1845 -738:2:1849 -739:2:1850 -740:2:1858 -741:2:1859 -742:2:1863 -743:2:1864 -744:2:1858 -745:2:1859 -746:2:1863 -747:2:1864 -748:2:1872 -749:2:1877 -750:2:1881 -751:2:1882 -752:2:1889 -753:2:1890 -754:2:1901 -755:2:1902 -756:2:1903 -757:2:1901 -758:2:1902 -759:2:1903 -760:2:1914 -761:2:1919 -762:2:1920 -763:0:4365 -764:2:1932 -765:0:4365 -766:3:2746 -767:0:4365 -768:2:1934 -769:0:4365 -770:3:2747 -771:0:4365 -772:2:1935 -773:0:4365 -774:2:1936 -775:0:4365 -776:2:2129 -777:0:4365 -778:2:2130 -779:0:4365 -780:2:2134 -781:0:4365 -782:3:2746 -783:0:4365 -784:2:2136 -785:0:4365 -786:3:2747 -787:0:4365 -788:2:2137 -789:2:2141 -790:2:2142 -791:2:2150 -792:2:2151 -793:2:2155 -794:2:2156 -795:2:2150 -796:2:2151 -797:2:2155 -798:2:2156 -799:2:2164 -800:2:2169 -801:2:2173 -802:2:2174 -803:2:2181 -804:2:2182 -805:2:2193 -806:2:2194 -807:2:2195 -808:2:2193 -809:2:2194 -810:2:2195 -811:2:2206 -812:2:2211 -813:2:2212 -814:0:4365 -815:2:2224 -816:0:4365 -817:3:2746 -818:0:4365 -819:2:2226 -820:0:4365 -821:3:2747 -822:0:4365 -823:2:2230 -824:0:4365 -825:3:2746 -826:0:4365 -827:2:2235 -828:2:2239 -829:2:2240 -830:2:2248 -831:2:2249 -832:2:2253 -833:2:2254 -834:2:2248 -835:2:2249 -836:2:2250 -837:2:2262 -838:2:2267 -839:2:2271 -840:2:2272 -841:2:2279 -842:2:2280 -843:2:2291 -844:2:2292 -845:2:2293 -846:2:2291 -847:2:2292 -848:2:2293 -849:2:2304 -850:2:2309 -851:2:2310 -852:0:4365 -853:3:2747 -854:0:4365 -855:2:2322 -856:0:4365 -857:2:1169 -858:0:4365 -859:3:2746 -860:0:4365 -861:2:1170 -862:0:4365 -863:3:2747 -864:0:4365 -865:3:2748 -866:0:4365 -867:3:2754 -868:0:4365 -869:3:2755 -870:3:2759 -871:3:2760 -872:3:2768 -873:3:2769 -874:3:2773 -875:3:2774 -876:3:2768 -877:3:2769 -878:3:2773 -879:3:2774 -880:3:2782 -881:3:2787 -882:3:2791 -883:3:2792 -884:3:2799 -885:3:2800 -886:3:2811 -887:3:2812 -888:3:2813 -889:3:2811 -890:3:2812 -891:3:2813 -892:3:2824 -893:3:2829 -894:3:2830 -895:0:4365 -896:3:2842 -897:0:4365 -898:3:2843 -899:0:4365 -900:2:1173 -901:0:4365 -902:3:2844 -903:0:4365 -904:2:1179 -905:0:4365 -906:2:1180 -907:0:4365 -908:3:2843 -909:0:4365 -910:2:1181 -911:2:1185 -912:2:1186 -913:2:1194 -914:2:1195 -915:2:1199 -916:2:1200 -917:2:1194 -918:2:1195 -919:2:1199 -920:2:1200 -921:2:1208 -922:2:1213 -923:2:1217 -924:2:1218 -925:2:1225 -926:2:1226 -927:2:1237 -928:2:1238 -929:2:1239 -930:2:1237 -931:2:1238 -932:2:1239 -933:2:1250 -934:2:1255 -935:2:1256 -936:0:4365 -937:3:2844 -938:0:4365 -939:2:1268 -940:0:4365 -941:3:2843 -942:0:4365 -943:2:1270 -944:0:4365 -945:3:2844 -946:0:4365 -947:2:1271 -948:2:1275 -949:2:1276 -950:2:1284 -951:2:1285 -952:2:1289 -953:2:1290 -954:2:1284 -955:2:1285 -956:2:1289 -957:2:1290 -958:2:1298 -959:2:1303 -960:2:1307 -961:2:1308 -962:2:1315 -963:2:1316 -964:2:1327 -965:2:1328 -966:2:1329 -967:2:1327 -968:2:1328 -969:2:1329 -970:2:1340 -971:2:1345 -972:2:1346 -973:0:4365 -974:2:1358 -975:0:4365 -976:2:1360 -977:0:4365 -978:3:2843 -979:0:4365 -980:2:1361 -981:0:4365 -982:3:2844 -983:0:4365 -984:2:1362 -985:2:1366 -986:2:1367 -987:2:1375 -988:2:1376 -989:2:1380 -990:2:1381 -991:2:1375 -992:2:1376 -993:2:1380 -994:2:1381 -995:2:1389 -996:2:1394 -997:2:1398 -998:2:1399 -999:2:1406 -1000:2:1407 -1001:2:1418 -1002:2:1419 -1003:2:1420 -1004:2:1418 -1005:2:1419 -1006:2:1420 -1007:2:1431 -1008:2:1436 -1009:2:1437 -1010:0:4365 -1011:2:1449 -1012:0:4365 -1013:3:2843 -1014:0:4365 -1015:2:1451 -1016:0:4365 -1017:3:2844 -1018:0:4365 -1019:2:1652 -1020:0:4365 -1021:2:1653 -1022:0:4365 -1023:2:1657 -1024:0:4365 -1025:2:1660 -1026:0:4365 -1027:3:2843 -1028:0:4365 -1029:2:1665 -1030:2:1669 -1031:2:1670 -1032:2:1678 -1033:2:1679 -1034:2:1683 -1035:2:1684 -1036:2:1678 -1037:2:1679 -1038:2:1680 -1039:2:1692 -1040:2:1697 -1041:2:1701 -1042:2:1702 -1043:2:1709 -1044:2:1710 -1045:2:1721 -1046:2:1722 -1047:2:1723 -1048:2:1721 -1049:2:1722 -1050:2:1723 -1051:2:1734 -1052:2:1739 -1053:2:1740 -1054:0:4365 -1055:3:2844 -1056:0:4365 -1057:2:1752 -1058:0:4365 -1059:3:2843 -1060:0:4365 -1061:2:1754 -1062:0:4365 -1063:3:2844 -1064:0:4365 -1065:2:1755 -1066:2:1759 -1067:2:1760 -1068:2:1768 -1069:2:1769 -1070:2:1773 -1071:2:1774 -1072:2:1768 -1073:2:1769 -1074:2:1773 -1075:2:1774 -1076:2:1782 -1077:2:1787 -1078:2:1791 -1079:2:1792 -1080:2:1799 -1081:2:1800 -1082:2:1811 -1083:2:1812 -1084:2:1813 -1085:2:1811 -1086:2:1812 -1087:2:1813 -1088:2:1824 -1089:2:1829 -1090:2:1830 -1091:0:4365 -1092:2:1842 -1093:0:4365 -1094:3:2843 -1095:0:4365 -1096:2:1844 -1097:0:4365 -1098:3:2844 -1099:0:4365 -1100:2:1845 -1101:2:1849 -1102:2:1850 -1103:2:1858 -1104:2:1859 -1105:2:1863 -1106:2:1864 -1107:2:1858 -1108:2:1859 -1109:2:1863 -1110:2:1864 -1111:2:1872 -1112:2:1877 -1113:2:1881 -1114:2:1882 -1115:2:1889 -1116:2:1890 -1117:2:1901 -1118:2:1902 -1119:2:1903 -1120:2:1901 -1121:2:1902 -1122:2:1903 -1123:2:1914 -1124:2:1919 -1125:2:1920 -1126:0:4365 -1127:2:1932 -1128:0:4365 -1129:3:2843 -1130:0:4365 -1131:2:1934 -1132:0:4365 -1133:3:2844 -1134:0:4365 -1135:2:1935 -1136:0:4365 -1137:2:1936 -1138:0:4365 -1139:2:2129 -1140:0:4365 -1141:2:2130 -1142:0:4365 -1143:2:2134 -1144:0:4365 -1145:3:2843 -1146:0:4365 -1147:2:2136 -1148:0:4365 -1149:3:2844 -1150:0:4365 -1151:2:2137 -1152:2:2141 -1153:2:2142 -1154:2:2150 -1155:2:2151 -1156:2:2155 -1157:2:2156 -1158:2:2150 -1159:2:2151 -1160:2:2155 -1161:2:2156 -1162:2:2164 -1163:2:2169 -1164:2:2173 -1165:2:2174 -1166:2:2181 -1167:2:2182 -1168:2:2193 -1169:2:2194 -1170:2:2195 -1171:2:2193 -1172:2:2194 -1173:2:2195 -1174:2:2206 -1175:2:2211 -1176:2:2212 -1177:0:4365 -1178:2:2224 -1179:0:4365 -1180:3:2843 -1181:0:4365 -1182:2:2226 -1183:0:4365 -1184:3:2844 -1185:0:4365 -1186:2:2230 -1187:0:4365 -1188:3:2843 -1189:0:4365 -1190:2:2235 -1191:2:2239 -1192:2:2240 -1193:2:2248 -1194:2:2249 -1195:2:2253 -1196:2:2254 -1197:2:2248 -1198:2:2249 -1199:2:2250 -1200:2:2262 -1201:2:2267 -1202:2:2271 -1203:2:2272 -1204:2:2279 -1205:2:2280 -1206:2:2291 -1207:2:2292 -1208:2:2293 -1209:2:2291 -1210:2:2292 -1211:2:2293 -1212:2:2304 -1213:2:2309 -1214:2:2310 -1215:0:4365 -1216:3:2844 -1217:0:4365 -1218:2:2322 -1219:0:4365 -1220:2:1169 -1221:0:4365 -1222:3:2843 -1223:0:4365 -1224:2:1170 -1225:0:4365 -1226:3:2844 -1227:0:4365 -1228:3:2845 -1229:0:4365 -1230:3:2851 -1231:0:4365 -1232:3:2854 -1233:3:2855 -1234:3:2867 -1235:3:2868 -1236:3:2872 -1237:3:2873 -1238:3:2867 -1239:3:2868 -1240:3:2872 -1241:3:2873 -1242:3:2881 -1243:3:2886 -1244:3:2890 -1245:3:2891 -1246:3:2898 -1247:3:2899 -1248:3:2910 -1249:3:2911 -1250:3:2912 -1251:3:2910 -1252:3:2911 -1253:3:2912 -1254:3:2923 -1255:3:2928 -1256:3:2929 -1257:0:4365 -1258:3:2941 -1259:0:4365 -1260:3:2942 -1261:0:4365 -1262:2:1173 -1263:0:4365 -1264:3:2943 -1265:0:4365 -1266:2:1179 -1267:0:4365 -1268:2:1180 -1269:0:4365 -1270:3:2942 -1271:0:4365 -1272:2:1181 -1273:2:1185 -1274:2:1186 -1275:2:1194 -1276:2:1195 -1277:2:1199 -1278:2:1200 -1279:2:1194 -1280:2:1195 -1281:2:1199 -1282:2:1200 -1283:2:1208 -1284:2:1213 -1285:2:1217 -1286:2:1218 -1287:2:1225 -1288:2:1226 -1289:2:1237 -1290:2:1238 -1291:2:1239 -1292:2:1237 -1293:2:1238 -1294:2:1239 -1295:2:1250 -1296:2:1255 -1297:2:1256 -1298:0:4365 -1299:3:2943 -1300:0:4365 -1301:2:1268 -1302:0:4365 -1303:3:2942 -1304:0:4365 -1305:2:1270 -1306:0:4365 -1307:3:2943 -1308:0:4365 -1309:2:1271 -1310:2:1275 -1311:2:1276 -1312:2:1284 -1313:2:1285 -1314:2:1289 -1315:2:1290 -1316:2:1284 -1317:2:1285 -1318:2:1289 -1319:2:1290 -1320:2:1298 -1321:2:1303 -1322:2:1307 -1323:2:1308 -1324:2:1315 -1325:2:1316 -1326:2:1327 -1327:2:1328 -1328:2:1329 -1329:2:1327 -1330:2:1328 -1331:2:1329 -1332:2:1340 -1333:2:1345 -1334:2:1346 -1335:0:4365 -1336:2:1358 -1337:0:4365 -1338:2:1360 -1339:0:4365 -1340:3:2942 -1341:0:4365 -1342:2:1361 -1343:0:4365 -1344:3:2943 -1345:0:4365 -1346:2:1362 -1347:2:1366 -1348:2:1367 -1349:2:1375 -1350:2:1376 -1351:2:1380 -1352:2:1381 -1353:2:1375 -1354:2:1376 -1355:2:1380 -1356:2:1381 -1357:2:1389 -1358:2:1394 -1359:2:1398 -1360:2:1399 -1361:2:1406 -1362:2:1407 -1363:2:1418 -1364:2:1419 -1365:2:1420 -1366:2:1418 -1367:2:1419 -1368:2:1420 -1369:2:1431 -1370:2:1436 -1371:2:1437 -1372:0:4365 -1373:2:1449 -1374:0:4365 -1375:3:2942 -1376:0:4365 -1377:2:1451 -1378:0:4365 -1379:3:2943 -1380:0:4365 -1381:2:1652 -1382:0:4365 -1383:2:1653 -1384:0:4365 -1385:2:1657 -1386:0:4365 -1387:2:1660 -1388:0:4365 -1389:3:2942 -1390:0:4365 -1391:2:1665 -1392:2:1669 -1393:2:1670 -1394:2:1678 -1395:2:1679 -1396:2:1683 -1397:2:1684 -1398:2:1678 -1399:2:1679 -1400:2:1680 -1401:2:1692 -1402:2:1697 -1403:2:1701 -1404:2:1702 -1405:2:1709 -1406:2:1710 -1407:2:1721 -1408:2:1722 -1409:2:1723 -1410:2:1721 -1411:2:1722 -1412:2:1723 -1413:2:1734 -1414:2:1739 -1415:2:1740 -1416:0:4365 -1417:3:2943 -1418:0:4365 -1419:2:1752 -1420:0:4365 -1421:3:2942 -1422:0:4365 -1423:2:1754 -1424:0:4365 -1425:3:2943 -1426:0:4365 -1427:2:1755 -1428:2:1759 -1429:2:1760 -1430:2:1768 -1431:2:1769 -1432:2:1773 -1433:2:1774 -1434:2:1768 -1435:2:1769 -1436:2:1773 -1437:2:1774 -1438:2:1782 -1439:2:1787 -1440:2:1791 -1441:2:1792 -1442:2:1799 -1443:2:1800 -1444:2:1811 -1445:2:1812 -1446:2:1813 -1447:2:1811 -1448:2:1812 -1449:2:1813 -1450:2:1824 -1451:2:1829 -1452:2:1830 -1453:0:4365 -1454:2:1842 -1455:0:4365 -1456:3:2942 -1457:0:4365 -1458:2:1844 -1459:0:4365 -1460:3:2943 -1461:0:4365 -1462:2:1845 -1463:2:1849 -1464:2:1850 -1465:2:1858 -1466:2:1859 -1467:2:1863 -1468:2:1864 -1469:2:1858 -1470:2:1859 -1471:2:1863 -1472:2:1864 -1473:2:1872 -1474:2:1877 -1475:2:1881 -1476:2:1882 -1477:2:1889 -1478:2:1890 -1479:2:1901 -1480:2:1902 -1481:2:1903 -1482:2:1901 -1483:2:1902 -1484:2:1903 -1485:2:1914 -1486:2:1919 -1487:2:1920 -1488:0:4365 -1489:2:1932 -1490:0:4365 -1491:3:2942 -1492:0:4365 -1493:2:1934 -1494:0:4365 -1495:3:2943 -1496:0:4365 -1497:2:1935 -1498:0:4365 -1499:2:1936 -1500:0:4365 -1501:2:2129 -1502:0:4365 -1503:2:2130 -1504:0:4365 -1505:2:2134 -1506:0:4365 -1507:3:2942 -1508:0:4365 -1509:2:2136 -1510:0:4365 -1511:3:2943 -1512:0:4365 -1513:2:2137 -1514:2:2141 -1515:2:2142 -1516:2:2150 -1517:2:2151 -1518:2:2155 -1519:2:2156 -1520:2:2150 -1521:2:2151 -1522:2:2155 -1523:2:2156 -1524:2:2164 -1525:2:2169 -1526:2:2173 -1527:2:2174 -1528:2:2181 -1529:2:2182 -1530:2:2193 -1531:2:2194 -1532:2:2195 -1533:2:2193 -1534:2:2194 -1535:2:2195 -1536:2:2206 -1537:2:2211 -1538:2:2212 -1539:0:4365 -1540:2:2224 -1541:0:4365 -1542:3:2942 -1543:0:4365 -1544:2:2226 -1545:0:4365 -1546:3:2943 -1547:0:4365 -1548:2:2230 -1549:0:4365 -1550:3:2942 -1551:0:4365 -1552:2:2235 -1553:2:2239 -1554:2:2240 -1555:2:2248 -1556:2:2249 -1557:2:2253 -1558:2:2254 -1559:2:2248 -1560:2:2249 -1561:2:2250 -1562:2:2262 -1563:2:2267 -1564:2:2271 -1565:2:2272 -1566:2:2279 -1567:2:2280 -1568:2:2291 -1569:2:2292 -1570:2:2293 -1571:2:2291 -1572:2:2292 -1573:2:2293 -1574:2:2304 -1575:2:2309 -1576:2:2310 -1577:0:4365 -1578:3:2943 -1579:0:4365 -1580:2:2322 -1581:0:4365 -1582:2:1169 -1583:0:4365 -1584:3:2942 -1585:0:4365 -1586:2:1170 -1587:0:4365 -1588:3:2943 -1589:0:4365 -1590:3:2944 -1591:0:4365 -1592:3:2950 -1593:0:4365 -1594:3:2951 -1595:0:4365 -1596:3:2952 -1597:0:4365 -1598:3:2953 -1599:0:4365 -1600:3:2954 -1601:3:2958 -1602:3:2959 -1603:3:2967 -1604:3:2968 -1605:3:2972 -1606:3:2973 -1607:3:2967 -1608:3:2968 -1609:3:2972 -1610:3:2973 -1611:3:2981 -1612:3:2986 -1613:3:2990 -1614:3:2991 -1615:3:2998 -1616:3:2999 -1617:3:3010 -1618:3:3011 -1619:3:3012 -1620:3:3010 -1621:3:3011 -1622:3:3012 -1623:3:3023 -1624:3:3028 -1625:3:3029 -1626:0:4365 -1627:3:3041 -1628:0:4365 -1629:3:3042 -1630:0:4365 -1631:2:1173 -1632:0:4365 -1633:3:3043 -1634:0:4365 -1635:2:1179 -1636:0:4365 -1637:2:1180 -1638:0:4365 -1639:3:3042 -1640:0:4365 -1641:2:1181 -1642:2:1185 -1643:2:1186 -1644:2:1194 -1645:2:1195 -1646:2:1199 -1647:2:1200 -1648:2:1194 -1649:2:1195 -1650:2:1199 -1651:2:1200 -1652:2:1208 -1653:2:1213 -1654:2:1217 -1655:2:1218 -1656:2:1225 -1657:2:1226 -1658:2:1237 -1659:2:1238 -1660:2:1239 -1661:2:1237 -1662:2:1238 -1663:2:1239 -1664:2:1250 -1665:2:1255 -1666:2:1256 -1667:0:4365 -1668:3:3043 -1669:0:4365 -1670:2:1268 -1671:0:4365 -1672:3:3042 -1673:0:4365 -1674:2:1270 -1675:0:4365 -1676:3:3043 -1677:0:4365 -1678:2:1271 -1679:2:1275 -1680:2:1276 -1681:2:1284 -1682:2:1285 -1683:2:1289 -1684:2:1290 -1685:2:1284 -1686:2:1285 -1687:2:1289 -1688:2:1290 -1689:2:1298 -1690:2:1303 -1691:2:1307 -1692:2:1308 -1693:2:1315 -1694:2:1316 -1695:2:1327 -1696:2:1328 -1697:2:1329 -1698:2:1327 -1699:2:1328 -1700:2:1329 -1701:2:1340 -1702:2:1345 -1703:2:1346 -1704:0:4365 -1705:2:1358 -1706:0:4365 -1707:2:1360 -1708:0:4365 -1709:3:3042 -1710:0:4365 -1711:2:1361 -1712:0:4365 -1713:3:3043 -1714:0:4365 -1715:2:1362 -1716:2:1366 -1717:2:1367 -1718:2:1375 -1719:2:1376 -1720:2:1380 -1721:2:1381 -1722:2:1375 -1723:2:1376 -1724:2:1380 -1725:2:1381 -1726:2:1389 -1727:2:1394 -1728:2:1398 -1729:2:1399 -1730:2:1406 -1731:2:1407 -1732:2:1418 -1733:2:1419 -1734:2:1420 -1735:2:1418 -1736:2:1419 -1737:2:1420 -1738:2:1431 -1739:2:1436 -1740:2:1437 -1741:0:4365 -1742:2:1449 -1743:0:4365 -1744:3:3042 -1745:0:4365 -1746:2:1451 -1747:0:4365 -1748:3:3043 -1749:0:4365 -1750:2:1652 -1751:0:4365 -1752:2:1653 -1753:0:4365 -1754:2:1657 -1755:0:4365 -1756:2:1660 -1757:0:4365 -1758:3:3042 -1759:0:4365 -1760:2:1665 -1761:2:1669 -1762:2:1670 -1763:2:1678 -1764:2:1679 -1765:2:1683 -1766:2:1684 -1767:2:1678 -1768:2:1679 -1769:2:1680 -1770:2:1692 -1771:2:1697 -1772:2:1701 -1773:2:1702 -1774:2:1709 -1775:2:1710 -1776:2:1721 -1777:2:1722 -1778:2:1723 -1779:2:1721 -1780:2:1722 -1781:2:1723 -1782:2:1734 -1783:2:1739 -1784:2:1740 -1785:0:4365 -1786:3:3043 -1787:0:4365 -1788:2:1752 -1789:0:4365 -1790:3:3042 -1791:0:4365 -1792:2:1754 -1793:0:4365 -1794:3:3043 -1795:0:4365 -1796:2:1755 -1797:2:1759 -1798:2:1760 -1799:2:1768 -1800:2:1769 -1801:2:1773 -1802:2:1774 -1803:2:1768 -1804:2:1769 -1805:2:1773 -1806:2:1774 -1807:2:1782 -1808:2:1787 -1809:2:1791 -1810:2:1792 -1811:2:1799 -1812:2:1800 -1813:2:1811 -1814:2:1812 -1815:2:1813 -1816:2:1811 -1817:2:1812 -1818:2:1813 -1819:2:1824 -1820:2:1829 -1821:2:1830 -1822:0:4365 -1823:2:1842 -1824:0:4365 -1825:3:3042 -1826:0:4365 -1827:2:1844 -1828:0:4365 -1829:3:3043 -1830:0:4365 -1831:2:1845 -1832:2:1849 -1833:2:1850 -1834:2:1858 -1835:2:1859 -1836:2:1863 -1837:2:1864 -1838:2:1858 -1839:2:1859 -1840:2:1863 -1841:2:1864 -1842:2:1872 -1843:2:1877 -1844:2:1881 -1845:2:1882 -1846:2:1889 -1847:2:1890 -1848:2:1901 -1849:2:1902 -1850:2:1903 -1851:2:1901 -1852:2:1902 -1853:2:1903 -1854:2:1914 -1855:2:1919 -1856:2:1920 -1857:0:4365 -1858:2:1932 -1859:0:4365 -1860:3:3042 -1861:0:4365 -1862:2:1934 -1863:0:4365 -1864:3:3043 -1865:0:4365 -1866:2:1935 -1867:0:4365 -1868:2:1936 -1869:0:4365 -1870:2:2129 -1871:0:4365 -1872:2:2130 -1873:0:4365 -1874:2:2134 -1875:0:4365 -1876:3:3042 -1877:0:4365 -1878:2:2136 -1879:0:4365 -1880:3:3043 -1881:0:4365 -1882:2:2137 -1883:2:2141 -1884:2:2142 -1885:2:2150 -1886:2:2151 -1887:2:2155 -1888:2:2156 -1889:2:2150 -1890:2:2151 -1891:2:2155 -1892:2:2156 -1893:2:2164 -1894:2:2169 -1895:2:2173 -1896:2:2174 -1897:2:2181 -1898:2:2182 -1899:2:2193 -1900:2:2194 -1901:2:2195 -1902:2:2193 -1903:2:2194 -1904:2:2195 -1905:2:2206 -1906:2:2211 -1907:2:2212 -1908:0:4365 -1909:2:2224 -1910:0:4365 -1911:3:3042 -1912:0:4365 -1913:2:2226 -1914:0:4365 -1915:3:3043 -1916:0:4365 -1917:2:2230 -1918:0:4365 -1919:3:3042 -1920:0:4365 -1921:2:2235 -1922:2:2239 -1923:2:2240 -1924:2:2248 -1925:2:2249 -1926:2:2253 -1927:2:2254 -1928:2:2248 -1929:2:2249 -1930:2:2250 -1931:2:2262 -1932:2:2267 -1933:2:2271 -1934:2:2272 -1935:2:2279 -1936:2:2280 -1937:2:2291 -1938:2:2292 -1939:2:2293 -1940:2:2291 -1941:2:2292 -1942:2:2293 -1943:2:2304 -1944:2:2309 -1945:2:2310 -1946:0:4365 -1947:3:3043 -1948:0:4365 -1949:2:2322 -1950:0:4365 -1951:2:1169 -1952:0:4365 -1953:3:3042 -1954:0:4365 -1955:2:1170 -1956:0:4365 -1957:3:3043 -1958:0:4365 -1959:3:3044 -1960:0:4365 -1961:3:3257 -1962:0:4365 -1963:3:3265 -1964:0:4365 -1965:3:3266 -1966:3:3270 -1967:3:3271 -1968:3:3279 -1969:3:3280 -1970:3:3284 -1971:3:3285 -1972:3:3279 -1973:3:3280 -1974:3:3284 -1975:3:3285 -1976:3:3293 -1977:3:3298 -1978:3:3302 -1979:3:3303 -1980:3:3310 -1981:3:3311 -1982:3:3322 -1983:3:3323 -1984:3:3324 -1985:3:3322 -1986:3:3323 -1987:3:3324 -1988:3:3335 -1989:3:3340 -1990:3:3341 -1991:0:4365 -1992:3:3353 -1993:0:4365 -1994:3:3354 -1995:0:4365 -1996:2:1173 -1997:0:4365 -1998:3:3355 -1999:0:4365 -2000:2:1179 -2001:0:4365 -2002:2:1180 -2003:0:4365 -2004:3:3354 -2005:0:4365 -2006:2:1181 -2007:2:1185 -2008:2:1186 -2009:2:1194 -2010:2:1195 -2011:2:1199 -2012:2:1200 -2013:2:1194 -2014:2:1195 -2015:2:1199 -2016:2:1200 -2017:2:1208 -2018:2:1213 -2019:2:1217 -2020:2:1218 -2021:2:1225 -2022:2:1226 -2023:2:1237 -2024:2:1238 -2025:2:1239 -2026:2:1237 -2027:2:1238 -2028:2:1239 -2029:2:1250 -2030:2:1255 -2031:2:1256 -2032:0:4365 -2033:3:3355 -2034:0:4365 -2035:2:1268 -2036:0:4365 -2037:3:3354 -2038:0:4365 -2039:2:1270 -2040:0:4365 -2041:3:3355 -2042:0:4365 -2043:2:1271 -2044:2:1275 -2045:2:1276 -2046:2:1284 -2047:2:1285 -2048:2:1289 -2049:2:1290 -2050:2:1284 -2051:2:1285 -2052:2:1289 -2053:2:1290 -2054:2:1298 -2055:2:1303 -2056:2:1307 -2057:2:1308 -2058:2:1315 -2059:2:1316 -2060:2:1327 -2061:2:1328 -2062:2:1329 -2063:2:1327 -2064:2:1328 -2065:2:1329 -2066:2:1340 -2067:2:1345 -2068:2:1346 -2069:0:4365 -2070:2:1358 -2071:0:4365 -2072:2:1360 -2073:0:4365 -2074:3:3354 -2075:0:4365 -2076:2:1361 -2077:0:4365 -2078:3:3355 -2079:0:4365 -2080:2:1362 -2081:2:1366 -2082:2:1367 -2083:2:1375 -2084:2:1376 -2085:2:1380 -2086:2:1381 -2087:2:1375 -2088:2:1376 -2089:2:1380 -2090:2:1381 -2091:2:1389 -2092:2:1394 -2093:2:1398 -2094:2:1399 -2095:2:1406 -2096:2:1407 -2097:2:1418 -2098:2:1419 -2099:2:1420 -2100:2:1418 -2101:2:1419 -2102:2:1420 -2103:2:1431 -2104:2:1436 -2105:2:1437 -2106:0:4365 -2107:2:1449 -2108:0:4365 -2109:3:3354 -2110:0:4365 -2111:2:1451 -2112:0:4365 -2113:3:3355 -2114:0:4365 -2115:2:1652 -2116:0:4365 -2117:2:1653 -2118:0:4365 -2119:2:1657 -2120:0:4365 -2121:2:1660 -2122:0:4365 -2123:3:3354 -2124:0:4365 -2125:2:1665 -2126:2:1669 -2127:2:1670 -2128:2:1678 -2129:2:1679 -2130:2:1683 -2131:2:1684 -2132:2:1678 -2133:2:1679 -2134:2:1680 -2135:2:1692 -2136:2:1697 -2137:2:1701 -2138:2:1702 -2139:2:1709 -2140:2:1710 -2141:2:1721 -2142:2:1722 -2143:2:1723 -2144:2:1721 -2145:2:1722 -2146:2:1723 -2147:2:1734 -2148:2:1739 -2149:2:1740 -2150:0:4365 -2151:3:3355 -2152:0:4365 -2153:2:1752 -2154:0:4365 -2155:3:3354 -2156:0:4365 -2157:2:1754 -2158:0:4365 -2159:3:3355 -2160:0:4365 -2161:2:1755 -2162:2:1759 -2163:2:1760 -2164:2:1768 -2165:2:1769 -2166:2:1773 -2167:2:1774 -2168:2:1768 -2169:2:1769 -2170:2:1773 -2171:2:1774 -2172:2:1782 -2173:2:1787 -2174:2:1791 -2175:2:1792 -2176:2:1799 -2177:2:1800 -2178:2:1811 -2179:2:1812 -2180:2:1813 -2181:2:1811 -2182:2:1812 -2183:2:1813 -2184:2:1824 -2185:2:1829 -2186:2:1830 -2187:0:4365 -2188:2:1842 -2189:0:4365 -2190:3:3354 -2191:0:4365 -2192:2:1844 -2193:0:4365 -2194:3:3355 -2195:0:4365 -2196:2:1845 -2197:2:1849 -2198:2:1850 -2199:2:1858 -2200:2:1859 -2201:2:1863 -2202:2:1864 -2203:2:1858 -2204:2:1859 -2205:2:1863 -2206:2:1864 -2207:2:1872 -2208:2:1877 -2209:2:1881 -2210:2:1882 -2211:2:1889 -2212:2:1890 -2213:2:1901 -2214:2:1902 -2215:2:1903 -2216:2:1901 -2217:2:1902 -2218:2:1903 -2219:2:1914 -2220:2:1919 -2221:2:1920 -2222:0:4365 -2223:2:1932 -2224:0:4365 -2225:3:3354 -2226:0:4365 -2227:2:1934 -2228:0:4365 -2229:3:3355 -2230:0:4365 -2231:2:1935 -2232:0:4365 -2233:2:1936 -2234:0:4365 -2235:2:2129 -2236:0:4365 -2237:2:2130 -2238:0:4365 -2239:2:2134 -2240:0:4365 -2241:3:3354 -2242:0:4365 -2243:2:2136 -2244:0:4365 -2245:3:3355 -2246:0:4365 -2247:2:2137 -2248:2:2141 -2249:2:2142 -2250:2:2150 -2251:2:2151 -2252:2:2155 -2253:2:2156 -2254:2:2150 -2255:2:2151 -2256:2:2155 -2257:2:2156 -2258:2:2164 -2259:2:2169 -2260:2:2173 -2261:2:2174 -2262:2:2181 -2263:2:2182 -2264:2:2193 -2265:2:2194 -2266:2:2195 -2267:2:2193 -2268:2:2194 -2269:2:2195 -2270:2:2206 -2271:2:2211 -2272:2:2212 -2273:0:4365 -2274:2:2224 -2275:0:4365 -2276:3:3354 -2277:0:4365 -2278:2:2226 -2279:0:4365 -2280:3:3355 -2281:0:4365 -2282:2:2230 -2283:0:4365 -2284:3:3354 -2285:0:4365 -2286:2:2235 -2287:2:2239 -2288:2:2240 -2289:2:2248 -2290:2:2249 -2291:2:2253 -2292:2:2254 -2293:2:2248 -2294:2:2249 -2295:2:2250 -2296:2:2262 -2297:2:2267 -2298:2:2271 -2299:2:2272 -2300:2:2279 -2301:2:2280 -2302:2:2291 -2303:2:2292 -2304:2:2293 -2305:2:2291 -2306:2:2292 -2307:2:2293 -2308:2:2304 -2309:2:2309 -2310:2:2310 -2311:0:4365 -2312:3:3355 -2313:0:4365 -2314:2:2322 -2315:0:4365 -2316:2:1169 -2317:0:4365 -2318:3:3354 -2319:0:4365 -2320:2:1170 -2321:0:4365 -2322:3:3355 -2323:0:4365 -2324:3:3356 -2325:0:4365 -2326:3:3366 -2327:0:4365 -2328:3:2951 -2329:0:4365 -2330:3:2952 -2331:0:4365 -2332:3:2953 -2333:0:4365 -2334:3:2954 -2335:3:2958 -2336:3:2959 -2337:3:2967 -2338:3:2968 -2339:3:2972 -2340:3:2973 -2341:3:2967 -2342:3:2968 -2343:3:2972 -2344:3:2973 -2345:3:2981 -2346:3:2986 -2347:3:2990 -2348:3:2991 -2349:3:2998 -2350:3:2999 -2351:3:3010 -2352:3:3011 -2353:3:3012 -2354:3:3010 -2355:3:3011 -2356:3:3012 -2357:3:3023 -2358:3:3028 -2359:3:3029 -2360:0:4365 -2361:3:3041 -2362:0:4365 -2363:3:3042 -2364:0:4365 -2365:2:1173 -2366:0:4365 -2367:3:3043 -2368:0:4365 -2369:2:1179 -2370:0:4365 -2371:2:1180 -2372:0:4365 -2373:3:3042 -2374:0:4365 -2375:2:1181 -2376:2:1185 -2377:2:1186 -2378:2:1194 -2379:2:1195 -2380:2:1199 -2381:2:1200 -2382:2:1194 -2383:2:1195 -2384:2:1199 -2385:2:1200 -2386:2:1208 -2387:2:1213 -2388:2:1217 -2389:2:1218 -2390:2:1225 -2391:2:1226 -2392:2:1237 -2393:2:1238 -2394:2:1239 -2395:2:1237 -2396:2:1238 -2397:2:1239 -2398:2:1250 -2399:2:1255 -2400:2:1256 -2401:0:4365 -2402:3:3043 -2403:0:4365 -2404:2:1268 -2405:0:4365 -2406:3:3042 -2407:0:4365 -2408:2:1270 -2409:0:4365 -2410:3:3043 -2411:0:4365 -2412:2:1271 -2413:2:1275 -2414:2:1276 -2415:2:1284 -2416:2:1285 -2417:2:1289 -2418:2:1290 -2419:2:1284 -2420:2:1285 -2421:2:1289 -2422:2:1290 -2423:2:1298 -2424:2:1303 -2425:2:1307 -2426:2:1308 -2427:2:1315 -2428:2:1316 -2429:2:1327 -2430:2:1328 -2431:2:1329 -2432:2:1327 -2433:2:1328 -2434:2:1329 -2435:2:1340 -2436:2:1345 -2437:2:1346 -2438:0:4365 -2439:2:1358 -2440:0:4365 -2441:2:1360 -2442:0:4365 -2443:3:3042 -2444:0:4365 -2445:2:1361 -2446:0:4365 -2447:3:3043 -2448:0:4365 -2449:2:1362 -2450:2:1366 -2451:2:1367 -2452:2:1375 -2453:2:1376 -2454:2:1380 -2455:2:1381 -2456:2:1375 -2457:2:1376 -2458:2:1380 -2459:2:1381 -2460:2:1389 -2461:2:1394 -2462:2:1398 -2463:2:1399 -2464:2:1406 -2465:2:1407 -2466:2:1418 -2467:2:1419 -2468:2:1420 -2469:2:1418 -2470:2:1419 -2471:2:1420 -2472:2:1431 -2473:2:1436 -2474:2:1437 -2475:0:4365 -2476:2:1449 -2477:0:4365 -2478:3:3042 -2479:0:4365 -2480:2:1451 -2481:0:4365 -2482:3:3043 -2483:0:4365 -2484:2:1652 -2485:0:4365 -2486:2:1653 -2487:0:4365 -2488:2:1657 -2489:0:4365 -2490:2:1660 -2491:0:4365 -2492:3:3042 -2493:0:4365 -2494:2:1665 -2495:2:1669 -2496:2:1670 -2497:2:1678 -2498:2:1679 -2499:2:1683 -2500:2:1684 -2501:2:1678 -2502:2:1679 -2503:2:1680 -2504:2:1692 -2505:2:1697 -2506:2:1701 -2507:2:1702 -2508:2:1709 -2509:2:1710 -2510:2:1721 -2511:2:1722 -2512:2:1723 -2513:2:1721 -2514:2:1722 -2515:2:1723 -2516:2:1734 -2517:2:1739 -2518:2:1740 -2519:0:4365 -2520:3:3043 -2521:0:4365 -2522:2:1752 -2523:0:4365 -2524:3:3042 -2525:0:4365 -2526:2:1754 -2527:0:4365 -2528:3:3043 -2529:0:4365 -2530:2:1755 -2531:2:1759 -2532:2:1760 -2533:2:1768 -2534:2:1769 -2535:2:1773 -2536:2:1774 -2537:2:1768 -2538:2:1769 -2539:2:1773 -2540:2:1774 -2541:2:1782 -2542:2:1787 -2543:2:1791 -2544:2:1792 -2545:2:1799 -2546:2:1800 -2547:2:1811 -2548:2:1812 -2549:2:1813 -2550:2:1811 -2551:2:1812 -2552:2:1813 -2553:2:1824 -2554:2:1829 -2555:2:1830 -2556:0:4365 -2557:2:1842 -2558:0:4365 -2559:3:3042 -2560:0:4365 -2561:2:1844 -2562:0:4365 -2563:3:3043 -2564:0:4365 -2565:2:1845 -2566:2:1849 -2567:2:1850 -2568:2:1858 -2569:2:1859 -2570:2:1863 -2571:2:1864 -2572:2:1858 -2573:2:1859 -2574:2:1863 -2575:2:1864 -2576:2:1872 -2577:2:1877 -2578:2:1881 -2579:2:1882 -2580:2:1889 -2581:2:1890 -2582:2:1901 -2583:2:1902 -2584:2:1903 -2585:2:1901 -2586:2:1902 -2587:2:1903 -2588:2:1914 -2589:2:1919 -2590:2:1920 -2591:0:4365 -2592:2:1932 -2593:0:4365 -2594:3:3042 -2595:0:4365 -2596:2:1934 -2597:0:4365 -2598:3:3043 -2599:0:4365 -2600:2:1935 -2601:0:4365 -2602:2:1936 -2603:0:4365 -2604:2:2129 -2605:0:4365 -2606:2:2130 -2607:0:4365 -2608:2:2134 -2609:0:4365 -2610:3:3042 -2611:0:4365 -2612:2:2136 -2613:0:4365 -2614:3:3043 -2615:0:4365 -2616:2:2137 -2617:2:2141 -2618:2:2142 -2619:2:2150 -2620:2:2151 -2621:2:2155 -2622:2:2156 -2623:2:2150 -2624:2:2151 -2625:2:2155 -2626:2:2156 -2627:2:2164 -2628:2:2169 -2629:2:2173 -2630:2:2174 -2631:2:2181 -2632:2:2182 -2633:2:2193 -2634:2:2194 -2635:2:2195 -2636:2:2193 -2637:2:2194 -2638:2:2195 -2639:2:2206 -2640:2:2211 -2641:2:2212 -2642:0:4365 -2643:2:2224 -2644:0:4365 -2645:3:3042 -2646:0:4365 -2647:2:2226 -2648:0:4365 -2649:3:3043 -2650:0:4365 -2651:2:2230 -2652:0:4365 -2653:3:3042 -2654:0:4365 -2655:2:2235 -2656:2:2239 -2657:2:2240 -2658:2:2248 -2659:2:2249 -2660:2:2253 -2661:2:2254 -2662:2:2248 -2663:2:2249 -2664:2:2250 -2665:2:2262 -2666:2:2267 -2667:2:2271 -2668:2:2272 -2669:2:2279 -2670:2:2280 -2671:2:2291 -2672:2:2292 -2673:2:2293 -2674:2:2291 -2675:2:2292 -2676:2:2293 -2677:2:2304 -2678:2:2309 -2679:2:2310 -2680:0:4365 -2681:3:3043 -2682:0:4365 -2683:2:2322 -2684:0:4365 -2685:2:1169 -2686:0:4365 -2687:3:3042 -2688:0:4365 -2689:2:1170 -2690:0:4365 -2691:3:3043 -2692:0:4365 -2693:3:3044 -2694:0:4365 -2695:3:3257 -2696:0:4365 -2697:3:3362 -2698:0:4365 -2699:3:3363 -2700:0:4365 -2701:3:3367 -2702:0:4365 -2703:3:3373 -2704:3:3377 -2705:3:3378 -2706:3:3386 -2707:3:3387 -2708:3:3391 -2709:3:3392 -2710:3:3386 -2711:3:3387 -2712:3:3391 -2713:3:3392 -2714:3:3400 -2715:3:3405 -2716:3:3409 -2717:3:3410 -2718:3:3417 -2719:3:3418 -2720:3:3429 -2721:3:3430 -2722:3:3431 -2723:3:3429 -2724:3:3430 -2725:3:3431 -2726:3:3442 -2727:3:3447 -2728:3:3448 -2729:0:4365 -2730:3:3460 -2731:0:4365 -2732:3:3461 -2733:0:4365 -2734:2:1173 -2735:0:4365 -2736:3:3462 -2737:0:4365 -2738:2:1179 -2739:0:4365 -2740:2:1180 -2741:0:4365 -2742:3:3461 -2743:0:4365 -2744:2:1181 -2745:2:1185 -2746:2:1186 -2747:2:1194 -2748:2:1195 -2749:2:1199 -2750:2:1200 -2751:2:1194 -2752:2:1195 -2753:2:1199 -2754:2:1200 -2755:2:1208 -2756:2:1213 -2757:2:1217 -2758:2:1218 -2759:2:1225 -2760:2:1226 -2761:2:1237 -2762:2:1238 -2763:2:1239 -2764:2:1237 -2765:2:1238 -2766:2:1239 -2767:2:1250 -2768:2:1255 -2769:2:1256 -2770:0:4365 -2771:3:3462 -2772:0:4365 -2773:2:1268 -2774:0:4365 -2775:3:3461 -2776:0:4365 -2777:2:1270 -2778:0:4365 -2779:3:3462 -2780:0:4365 -2781:2:1271 -2782:2:1275 -2783:2:1276 -2784:2:1284 -2785:2:1285 -2786:2:1289 -2787:2:1290 -2788:2:1284 -2789:2:1285 -2790:2:1289 -2791:2:1290 -2792:2:1298 -2793:2:1303 -2794:2:1307 -2795:2:1308 -2796:2:1315 -2797:2:1316 -2798:2:1327 -2799:2:1328 -2800:2:1329 -2801:2:1327 -2802:2:1328 -2803:2:1329 -2804:2:1340 -2805:2:1345 -2806:2:1346 -2807:0:4365 -2808:2:1358 -2809:0:4365 -2810:2:1360 -2811:0:4365 -2812:3:3461 -2813:0:4365 -2814:2:1361 -2815:0:4365 -2816:3:3462 -2817:0:4365 -2818:2:1362 -2819:2:1366 -2820:2:1367 -2821:2:1375 -2822:2:1376 -2823:2:1380 -2824:2:1381 -2825:2:1375 -2826:2:1376 -2827:2:1380 -2828:2:1381 -2829:2:1389 -2830:2:1394 -2831:2:1398 -2832:2:1399 -2833:2:1406 -2834:2:1407 -2835:2:1418 -2836:2:1419 -2837:2:1420 -2838:2:1418 -2839:2:1419 -2840:2:1420 -2841:2:1431 -2842:2:1436 -2843:2:1437 -2844:0:4365 -2845:2:1449 -2846:0:4365 -2847:3:3461 -2848:0:4365 -2849:2:1451 -2850:0:4365 -2851:3:3462 -2852:0:4365 -2853:2:1652 -2854:0:4365 -2855:2:1653 -2856:0:4365 -2857:2:1657 -2858:0:4365 -2859:2:1660 -2860:0:4365 -2861:3:3461 -2862:0:4365 -2863:2:1665 -2864:2:1669 -2865:2:1670 -2866:2:1678 -2867:2:1679 -2868:2:1683 -2869:2:1684 -2870:2:1678 -2871:2:1679 -2872:2:1680 -2873:2:1692 -2874:2:1697 -2875:2:1701 -2876:2:1702 -2877:2:1709 -2878:2:1710 -2879:2:1721 -2880:2:1722 -2881:2:1723 -2882:2:1721 -2883:2:1722 -2884:2:1723 -2885:2:1734 -2886:2:1739 -2887:2:1740 -2888:0:4365 -2889:3:3462 -2890:0:4365 -2891:2:1752 -2892:0:4365 -2893:3:3461 -2894:0:4365 -2895:2:1754 -2896:0:4365 -2897:3:3462 -2898:0:4365 -2899:2:1755 -2900:2:1759 -2901:2:1760 -2902:2:1768 -2903:2:1769 -2904:2:1773 -2905:2:1774 -2906:2:1768 -2907:2:1769 -2908:2:1773 -2909:2:1774 -2910:2:1782 -2911:2:1787 -2912:2:1791 -2913:2:1792 -2914:2:1799 -2915:2:1800 -2916:2:1811 -2917:2:1812 -2918:2:1813 -2919:2:1811 -2920:2:1812 -2921:2:1813 -2922:2:1824 -2923:2:1829 -2924:2:1830 -2925:0:4365 -2926:2:1842 -2927:0:4365 -2928:3:3461 -2929:0:4365 -2930:2:1844 -2931:0:4365 -2932:3:3462 -2933:0:4365 -2934:2:1845 -2935:2:1849 -2936:2:1850 -2937:2:1858 -2938:2:1859 -2939:2:1863 -2940:2:1864 -2941:2:1858 -2942:2:1859 -2943:2:1863 -2944:2:1864 -2945:2:1872 -2946:2:1877 -2947:2:1881 -2948:2:1882 -2949:2:1889 -2950:2:1890 -2951:2:1901 -2952:2:1902 -2953:2:1903 -2954:2:1901 -2955:2:1902 -2956:2:1903 -2957:2:1914 -2958:2:1919 -2959:2:1920 -2960:0:4365 -2961:2:1932 -2962:0:4365 -2963:3:3461 -2964:0:4365 -2965:2:1934 -2966:0:4365 -2967:3:3462 -2968:0:4365 -2969:2:1935 -2970:0:4365 -2971:2:1936 -2972:0:4365 -2973:2:2129 -2974:0:4365 -2975:2:2130 -2976:0:4365 -2977:2:2134 -2978:0:4365 -2979:3:3461 -2980:0:4365 -2981:2:2136 -2982:0:4365 -2983:3:3462 -2984:0:4365 -2985:2:2137 -2986:2:2141 -2987:2:2142 -2988:2:2150 -2989:2:2151 -2990:2:2155 -2991:2:2156 -2992:2:2150 -2993:2:2151 -2994:2:2155 -2995:2:2156 -2996:2:2164 -2997:2:2169 -2998:2:2173 -2999:2:2174 -3000:2:2181 -3001:2:2182 -3002:2:2193 -3003:2:2194 -3004:2:2195 -3005:2:2193 -3006:2:2194 -3007:2:2195 -3008:2:2206 -3009:2:2211 -3010:2:2212 -3011:0:4365 -3012:2:2224 -3013:0:4365 -3014:3:3461 -3015:0:4365 -3016:2:2226 -3017:0:4365 -3018:3:3462 -3019:0:4365 -3020:2:2230 -3021:0:4365 -3022:3:3461 -3023:0:4365 -3024:2:2235 -3025:2:2239 -3026:2:2240 -3027:2:2248 -3028:2:2249 -3029:2:2253 -3030:2:2254 -3031:2:2248 -3032:2:2249 -3033:2:2250 -3034:2:2262 -3035:2:2267 -3036:2:2271 -3037:2:2272 -3038:2:2279 -3039:2:2280 -3040:2:2291 -3041:2:2292 -3042:2:2293 -3043:2:2291 -3044:2:2292 -3045:2:2293 -3046:2:2304 -3047:2:2309 -3048:2:2310 -3049:0:4365 -3050:3:3462 -3051:0:4365 -3052:2:2322 -3053:0:4365 -3054:2:1169 -3055:0:4365 -3056:3:3461 -3057:0:4365 -3058:2:1170 -3059:0:4365 -3060:3:3462 -3061:0:4365 -3062:3:3463 -3063:0:4365 -3064:3:3469 -3065:0:4365 -3066:3:3470 -3067:3:3474 -3068:3:3475 -3069:3:3483 -3070:3:3484 -3071:3:3488 -3072:3:3489 -3073:3:3483 -3074:3:3484 -3075:3:3488 -3076:3:3489 -3077:3:3497 -3078:3:3502 -3079:3:3506 -3080:3:3507 -3081:3:3514 -3082:3:3515 -3083:3:3526 -3084:3:3527 -3085:3:3528 -3086:3:3526 -3087:3:3527 -3088:3:3528 -3089:3:3539 -3090:3:3544 -3091:3:3545 -3092:0:4365 -3093:3:3557 -3094:0:4365 -3095:3:3558 -3096:0:4365 -3097:2:1173 -3098:0:4365 -3099:3:3559 -3100:0:4365 -3101:2:1179 -3102:0:4365 -3103:2:1180 -3104:0:4365 -3105:3:3558 -3106:0:4365 -3107:2:1181 -3108:2:1185 -3109:2:1186 -3110:2:1194 -3111:2:1195 -3112:2:1199 -3113:2:1200 -3114:2:1194 -3115:2:1195 -3116:2:1199 -3117:2:1200 -3118:2:1208 -3119:2:1213 -3120:2:1217 -3121:2:1218 -3122:2:1225 -3123:2:1226 -3124:2:1237 -3125:2:1238 -3126:2:1239 -3127:2:1237 -3128:2:1238 -3129:2:1239 -3130:2:1250 -3131:2:1255 -3132:2:1256 -3133:0:4365 -3134:3:3559 -3135:0:4365 -3136:2:1268 -3137:0:4365 -3138:3:3558 -3139:0:4365 -3140:2:1270 -3141:0:4365 -3142:3:3559 -3143:0:4365 -3144:2:1271 -3145:2:1275 -3146:2:1276 -3147:2:1284 -3148:2:1285 -3149:2:1289 -3150:2:1290 -3151:2:1284 -3152:2:1285 -3153:2:1289 -3154:2:1290 -3155:2:1298 -3156:2:1303 -3157:2:1307 -3158:2:1308 -3159:2:1315 -3160:2:1316 -3161:2:1327 -3162:2:1328 -3163:2:1329 -3164:2:1327 -3165:2:1328 -3166:2:1329 -3167:2:1340 -3168:2:1345 -3169:2:1346 -3170:0:4365 -3171:2:1358 -3172:0:4365 -3173:2:1360 -3174:0:4365 -3175:3:3558 -3176:0:4365 -3177:2:1361 -3178:0:4365 -3179:3:3559 -3180:0:4365 -3181:2:1362 -3182:2:1366 -3183:2:1367 -3184:2:1375 -3185:2:1376 -3186:2:1380 -3187:2:1381 -3188:2:1375 -3189:2:1376 -3190:2:1380 -3191:2:1381 -3192:2:1389 -3193:2:1394 -3194:2:1398 -3195:2:1399 -3196:2:1406 -3197:2:1407 -3198:2:1418 -3199:2:1419 -3200:2:1420 -3201:2:1418 -3202:2:1419 -3203:2:1420 -3204:2:1431 -3205:2:1436 -3206:2:1437 -3207:0:4365 -3208:2:1449 -3209:0:4365 -3210:3:3558 -3211:0:4365 -3212:2:1451 -3213:0:4365 -3214:3:3559 -3215:0:4365 -3216:2:1652 -3217:0:4365 -3218:2:1653 -3219:0:4365 -3220:2:1657 -3221:0:4365 -3222:2:1660 -3223:0:4365 -3224:3:3558 -3225:0:4365 -3226:2:1665 -3227:2:1669 -3228:2:1670 -3229:2:1678 -3230:2:1679 -3231:2:1683 -3232:2:1684 -3233:2:1678 -3234:2:1679 -3235:2:1680 -3236:2:1692 -3237:2:1697 -3238:2:1701 -3239:2:1702 -3240:2:1709 -3241:2:1710 -3242:2:1721 -3243:2:1722 -3244:2:1723 -3245:2:1721 -3246:2:1722 -3247:2:1723 -3248:2:1734 -3249:2:1739 -3250:2:1740 -3251:0:4365 -3252:3:3559 -3253:0:4365 -3254:2:1752 -3255:0:4365 -3256:3:3558 -3257:0:4365 -3258:2:1754 -3259:0:4365 -3260:3:3559 -3261:0:4365 -3262:2:1755 -3263:2:1759 -3264:2:1760 -3265:2:1768 -3266:2:1769 -3267:2:1773 -3268:2:1774 -3269:2:1768 -3270:2:1769 -3271:2:1773 -3272:2:1774 -3273:2:1782 -3274:2:1787 -3275:2:1791 -3276:2:1792 -3277:2:1799 -3278:2:1800 -3279:2:1811 -3280:2:1812 -3281:2:1813 -3282:2:1811 -3283:2:1812 -3284:2:1813 -3285:2:1824 -3286:2:1829 -3287:2:1830 -3288:0:4365 -3289:2:1842 -3290:0:4365 -3291:3:3558 -3292:0:4365 -3293:2:1844 -3294:0:4365 -3295:3:3559 -3296:0:4365 -3297:2:1845 -3298:2:1849 -3299:2:1850 -3300:2:1858 -3301:2:1859 -3302:2:1863 -3303:2:1864 -3304:2:1858 -3305:2:1859 -3306:2:1863 -3307:2:1864 -3308:2:1872 -3309:2:1877 -3310:2:1881 -3311:2:1882 -3312:2:1889 -3313:2:1890 -3314:2:1901 -3315:2:1902 -3316:2:1903 -3317:2:1901 -3318:2:1902 -3319:2:1903 -3320:2:1914 -3321:2:1919 -3322:2:1920 -3323:0:4365 -3324:2:1932 -3325:0:4365 -3326:3:3558 -3327:0:4365 -3328:2:1934 -3329:0:4365 -3330:3:3559 -3331:0:4365 -3332:2:1935 -3333:0:4365 -3334:2:1936 -3335:0:4365 -3336:2:2129 -3337:0:4365 -3338:2:2130 -3339:0:4365 -3340:2:2134 -3341:0:4365 -3342:3:3558 -3343:0:4365 -3344:2:2136 -3345:0:4365 -3346:3:3559 -3347:0:4365 -3348:2:2137 -3349:2:2141 -3350:2:2142 -3351:2:2150 -3352:2:2151 -3353:2:2155 -3354:2:2156 -3355:2:2150 -3356:2:2151 -3357:2:2155 -3358:2:2156 -3359:2:2164 -3360:2:2169 -3361:2:2173 -3362:2:2174 -3363:2:2181 -3364:2:2182 -3365:2:2193 -3366:2:2194 -3367:2:2195 -3368:2:2193 -3369:2:2194 -3370:2:2195 -3371:2:2206 -3372:2:2211 -3373:2:2212 -3374:0:4365 -3375:2:2224 -3376:0:4365 -3377:3:3558 -3378:0:4365 -3379:2:2226 -3380:0:4365 -3381:3:3559 -3382:0:4365 -3383:2:2230 -3384:0:4365 -3385:3:3558 -3386:0:4365 -3387:2:2235 -3388:2:2239 -3389:2:2240 -3390:2:2248 -3391:2:2249 -3392:2:2253 -3393:2:2254 -3394:2:2248 -3395:2:2249 -3396:2:2250 -3397:2:2262 -3398:2:2267 -3399:2:2271 -3400:2:2272 -3401:2:2279 -3402:2:2280 -3403:2:2291 -3404:2:2292 -3405:2:2293 -3406:2:2291 -3407:2:2292 -3408:2:2293 -3409:2:2304 -3410:2:2309 -3411:2:2310 -3412:0:4365 -3413:3:3559 -3414:0:4365 -3415:2:2322 -3416:0:4365 -3417:2:1169 -3418:0:4365 -3419:3:3558 -3420:0:4365 -3421:2:1170 -3422:0:4365 -3423:3:3559 -3424:0:4365 -3425:3:3560 -3426:0:4365 -3427:3:3566 -3428:0:4365 -3429:3:3569 -3430:3:3570 -3431:3:3582 -3432:3:3583 -3433:3:3587 -3434:3:3588 -3435:3:3582 -3436:3:3583 -3437:3:3587 -3438:3:3588 -3439:3:3596 -3440:3:3601 -3441:3:3605 -3442:3:3606 -3443:3:3613 -3444:3:3614 -3445:3:3625 -3446:3:3626 -3447:3:3627 -3448:3:3625 -3449:3:3626 -3450:3:3627 -3451:3:3638 -3452:3:3643 -3453:3:3644 -3454:0:4365 -3455:3:3656 -3456:0:4365 -3457:3:3657 -3458:0:4365 -3459:2:1173 -3460:0:4365 -3461:3:3658 -3462:0:4365 -3463:2:1179 -3464:0:4365 -3465:2:1180 -3466:0:4365 -3467:3:3657 -3468:0:4365 -3469:2:1181 -3470:2:1185 -3471:2:1186 -3472:2:1194 -3473:2:1195 -3474:2:1199 -3475:2:1200 -3476:2:1194 -3477:2:1195 -3478:2:1199 -3479:2:1200 -3480:2:1208 -3481:2:1213 -3482:2:1217 -3483:2:1218 -3484:2:1225 -3485:2:1226 -3486:2:1237 -3487:2:1238 -3488:2:1239 -3489:2:1237 -3490:2:1238 -3491:2:1239 -3492:2:1250 -3493:2:1255 -3494:2:1256 -3495:0:4365 -3496:3:3658 -3497:0:4365 -3498:2:1268 -3499:0:4365 -3500:3:3657 -3501:0:4365 -3502:2:1270 -3503:0:4365 -3504:3:3658 -3505:0:4365 -3506:2:1271 -3507:2:1275 -3508:2:1276 -3509:2:1284 -3510:2:1285 -3511:2:1289 -3512:2:1290 -3513:2:1284 -3514:2:1285 -3515:2:1289 -3516:2:1290 -3517:2:1298 -3518:2:1303 -3519:2:1307 -3520:2:1308 -3521:2:1315 -3522:2:1316 -3523:2:1327 -3524:2:1328 -3525:2:1329 -3526:2:1327 -3527:2:1328 -3528:2:1329 -3529:2:1340 -3530:2:1345 -3531:2:1346 -3532:0:4365 -3533:2:1358 -3534:0:4365 -3535:2:1360 -3536:0:4365 -3537:3:3657 -3538:0:4365 -3539:2:1361 -3540:0:4365 -3541:3:3658 -3542:0:4365 -3543:2:1362 -3544:2:1366 -3545:2:1367 -3546:2:1375 -3547:2:1376 -3548:2:1380 -3549:2:1381 -3550:2:1375 -3551:2:1376 -3552:2:1380 -3553:2:1381 -3554:2:1389 -3555:2:1394 -3556:2:1398 -3557:2:1399 -3558:2:1406 -3559:2:1407 -3560:2:1418 -3561:2:1419 -3562:2:1420 -3563:2:1418 -3564:2:1419 -3565:2:1420 -3566:2:1431 -3567:2:1436 -3568:2:1437 -3569:0:4365 -3570:2:1449 -3571:0:4365 -3572:3:3657 -3573:0:4365 -3574:2:1451 -3575:0:4365 -3576:3:3658 -3577:0:4365 -3578:2:1652 -3579:0:4365 -3580:2:1653 -3581:0:4365 -3582:2:1657 -3583:0:4365 -3584:2:1660 -3585:0:4365 -3586:3:3657 -3587:0:4365 -3588:2:1665 -3589:2:1669 -3590:2:1670 -3591:2:1678 -3592:2:1679 -3593:2:1683 -3594:2:1684 -3595:2:1678 -3596:2:1679 -3597:2:1680 -3598:2:1692 -3599:2:1697 -3600:2:1701 -3601:2:1702 -3602:2:1709 -3603:2:1710 -3604:2:1721 -3605:2:1722 -3606:2:1723 -3607:2:1721 -3608:2:1722 -3609:2:1723 -3610:2:1734 -3611:2:1739 -3612:2:1740 -3613:0:4365 -3614:3:3658 -3615:0:4365 -3616:2:1752 -3617:0:4365 -3618:3:3657 -3619:0:4365 -3620:2:1754 -3621:0:4365 -3622:3:3658 -3623:0:4365 -3624:2:1755 -3625:2:1759 -3626:2:1760 -3627:2:1768 -3628:2:1769 -3629:2:1773 -3630:2:1774 -3631:2:1768 -3632:2:1769 -3633:2:1773 -3634:2:1774 -3635:2:1782 -3636:2:1787 -3637:2:1791 -3638:2:1792 -3639:2:1799 -3640:2:1800 -3641:2:1811 -3642:2:1812 -3643:2:1813 -3644:2:1811 -3645:2:1812 -3646:2:1813 -3647:2:1824 -3648:2:1829 -3649:2:1830 -3650:0:4365 -3651:2:1842 -3652:0:4365 -3653:3:3657 -3654:0:4365 -3655:2:1844 -3656:0:4365 -3657:3:3658 -3658:0:4365 -3659:2:1845 -3660:2:1849 -3661:2:1850 -3662:2:1858 -3663:2:1859 -3664:2:1863 -3665:2:1864 -3666:2:1858 -3667:2:1859 -3668:2:1863 -3669:2:1864 -3670:2:1872 -3671:2:1877 -3672:2:1881 -3673:2:1882 -3674:2:1889 -3675:2:1890 -3676:2:1901 -3677:2:1902 -3678:2:1903 -3679:2:1901 -3680:2:1902 -3681:2:1903 -3682:2:1914 -3683:2:1919 -3684:2:1920 -3685:0:4365 -3686:2:1932 -3687:0:4365 -3688:3:3657 -3689:0:4365 -3690:2:1934 -3691:0:4365 -3692:3:3658 -3693:0:4365 -3694:2:1935 -3695:0:4365 -3696:2:1936 -3697:0:4365 -3698:2:2129 -3699:0:4365 -3700:2:2130 -3701:0:4365 -3702:2:2134 -3703:0:4365 -3704:3:3657 -3705:0:4365 -3706:2:2136 -3707:0:4365 -3708:3:3658 -3709:0:4365 -3710:2:2137 -3711:2:2141 -3712:2:2142 -3713:2:2150 -3714:2:2151 -3715:2:2155 -3716:2:2156 -3717:2:2150 -3718:2:2151 -3719:2:2155 -3720:2:2156 -3721:2:2164 -3722:2:2169 -3723:2:2173 -3724:2:2174 -3725:2:2181 -3726:2:2182 -3727:2:2193 -3728:2:2194 -3729:2:2195 -3730:2:2193 -3731:2:2194 -3732:2:2195 -3733:2:2206 -3734:2:2211 -3735:2:2212 -3736:0:4365 -3737:2:2224 -3738:0:4365 -3739:3:3657 -3740:0:4365 -3741:2:2226 -3742:0:4365 -3743:3:3658 -3744:0:4365 -3745:2:2230 -3746:0:4365 -3747:3:3657 -3748:0:4365 -3749:2:2235 -3750:2:2239 -3751:2:2240 -3752:2:2248 -3753:2:2249 -3754:2:2253 -3755:2:2254 -3756:2:2248 -3757:2:2249 -3758:2:2250 -3759:2:2262 -3760:2:2267 -3761:2:2271 -3762:2:2272 -3763:2:2279 -3764:2:2280 -3765:2:2291 -3766:2:2292 -3767:2:2293 -3768:2:2291 -3769:2:2292 -3770:2:2293 -3771:2:2304 -3772:2:2309 -3773:2:2310 -3774:0:4365 -3775:3:3658 -3776:0:4365 -3777:2:2322 -3778:0:4365 -3779:2:1169 -3780:0:4365 -3781:3:3657 -3782:0:4365 -3783:2:1170 -3784:0:4365 -3785:3:3658 -3786:0:4365 -3787:3:3659 -3788:0:4365 -3789:3:3665 -3790:0:4365 -3791:3:3666 -3792:0:4365 -3793:3:3667 -3794:0:4365 -3795:3:3668 -3796:0:4365 -3797:3:3669 -3798:3:3673 -3799:3:3674 -3800:3:3682 -3801:3:3683 -3802:3:3687 -3803:3:3688 -3804:3:3682 -3805:3:3683 -3806:3:3687 -3807:3:3688 -3808:3:3696 -3809:3:3701 -3810:3:3705 -3811:3:3706 -3812:3:3713 -3813:3:3714 -3814:3:3725 -3815:3:3726 -3816:3:3727 -3817:3:3725 -3818:3:3726 -3819:3:3727 -3820:3:3738 -3821:3:3743 -3822:3:3744 -3823:0:4365 -3824:3:3756 -3825:0:4365 -3826:3:3757 -3827:0:4365 -3828:2:1173 -3829:0:4365 -3830:3:3758 -3831:0:4365 -3832:2:1179 -3833:0:4365 -3834:2:1180 -3835:0:4365 -3836:3:3757 -3837:0:4365 -3838:2:1181 -3839:2:1185 -3840:2:1186 -3841:2:1194 -3842:2:1195 -3843:2:1199 -3844:2:1200 -3845:2:1194 -3846:2:1195 -3847:2:1199 -3848:2:1200 -3849:2:1208 -3850:2:1213 -3851:2:1217 -3852:2:1218 -3853:2:1225 -3854:2:1226 -3855:2:1237 -3856:2:1238 -3857:2:1239 -3858:2:1237 -3859:2:1238 -3860:2:1239 -3861:2:1250 -3862:2:1255 -3863:2:1256 -3864:0:4365 -3865:3:3758 -3866:0:4365 -3867:2:1268 -3868:0:4365 -3869:3:3757 -3870:0:4365 -3871:2:1270 -3872:0:4365 -3873:3:3758 -3874:0:4365 -3875:2:1271 -3876:2:1275 -3877:2:1276 -3878:2:1284 -3879:2:1285 -3880:2:1289 -3881:2:1290 -3882:2:1284 -3883:2:1285 -3884:2:1289 -3885:2:1290 -3886:2:1298 -3887:2:1303 -3888:2:1307 -3889:2:1308 -3890:2:1315 -3891:2:1316 -3892:2:1327 -3893:2:1328 -3894:2:1329 -3895:2:1327 -3896:2:1328 -3897:2:1329 -3898:2:1340 -3899:2:1345 -3900:2:1346 -3901:0:4365 -3902:2:1358 -3903:0:4365 -3904:2:1360 -3905:0:4365 -3906:3:3757 -3907:0:4365 -3908:2:1361 -3909:0:4365 -3910:3:3758 -3911:0:4365 -3912:2:1362 -3913:2:1366 -3914:2:1367 -3915:2:1375 -3916:2:1376 -3917:2:1380 -3918:2:1381 -3919:2:1375 -3920:2:1376 -3921:2:1380 -3922:2:1381 -3923:2:1389 -3924:2:1394 -3925:2:1398 -3926:2:1399 -3927:2:1406 -3928:2:1407 -3929:2:1418 -3930:2:1419 -3931:2:1420 -3932:2:1418 -3933:2:1419 -3934:2:1420 -3935:2:1431 -3936:2:1436 -3937:2:1437 -3938:0:4365 -3939:2:1449 -3940:0:4365 -3941:3:3757 -3942:0:4365 -3943:2:1451 -3944:0:4365 -3945:3:3758 -3946:0:4365 -3947:2:1652 -3948:0:4365 -3949:2:1653 -3950:0:4365 -3951:2:1657 -3952:0:4365 -3953:2:1660 -3954:0:4365 -3955:3:3757 -3956:0:4365 -3957:2:1665 -3958:2:1669 -3959:2:1670 -3960:2:1678 -3961:2:1679 -3962:2:1683 -3963:2:1684 -3964:2:1678 -3965:2:1679 -3966:2:1680 -3967:2:1692 -3968:2:1697 -3969:2:1701 -3970:2:1702 -3971:2:1709 -3972:2:1710 -3973:2:1721 -3974:2:1722 -3975:2:1723 -3976:2:1721 -3977:2:1722 -3978:2:1723 -3979:2:1734 -3980:2:1739 -3981:2:1740 -3982:0:4365 -3983:3:3758 -3984:0:4365 -3985:2:1752 -3986:0:4365 -3987:3:3757 -3988:0:4365 -3989:2:1754 -3990:0:4365 -3991:3:3758 -3992:0:4365 -3993:2:1755 -3994:2:1759 -3995:2:1760 -3996:2:1768 -3997:2:1769 -3998:2:1773 -3999:2:1774 -4000:2:1768 -4001:2:1769 -4002:2:1773 -4003:2:1774 -4004:2:1782 -4005:2:1787 -4006:2:1791 -4007:2:1792 -4008:2:1799 -4009:2:1800 -4010:2:1811 -4011:2:1812 -4012:2:1813 -4013:2:1811 -4014:2:1812 -4015:2:1813 -4016:2:1824 -4017:2:1829 -4018:2:1830 -4019:0:4365 -4020:2:1842 -4021:0:4365 -4022:3:3757 -4023:0:4365 -4024:2:1844 -4025:0:4365 -4026:3:3758 -4027:0:4365 -4028:2:1845 -4029:2:1849 -4030:2:1850 -4031:2:1858 -4032:2:1859 -4033:2:1863 -4034:2:1864 -4035:2:1858 -4036:2:1859 -4037:2:1863 -4038:2:1864 -4039:2:1872 -4040:2:1877 -4041:2:1881 -4042:2:1882 -4043:2:1889 -4044:2:1890 -4045:2:1901 -4046:2:1902 -4047:2:1903 -4048:2:1901 -4049:2:1902 -4050:2:1903 -4051:2:1914 -4052:2:1919 -4053:2:1920 -4054:0:4365 -4055:2:1932 -4056:0:4365 -4057:3:3757 -4058:0:4365 -4059:2:1934 -4060:0:4365 -4061:3:3758 -4062:0:4365 -4063:2:1935 -4064:0:4365 -4065:2:1936 -4066:0:4365 -4067:2:2129 -4068:0:4365 -4069:2:2130 -4070:0:4365 -4071:2:2134 -4072:0:4365 -4073:3:3757 -4074:0:4365 -4075:2:2136 -4076:0:4365 -4077:3:3758 -4078:0:4365 -4079:2:2137 -4080:2:2141 -4081:2:2142 -4082:2:2150 -4083:2:2151 -4084:2:2155 -4085:2:2156 -4086:2:2150 -4087:2:2151 -4088:2:2155 -4089:2:2156 -4090:2:2164 -4091:2:2169 -4092:2:2173 -4093:2:2174 -4094:2:2181 -4095:2:2182 -4096:2:2193 -4097:2:2194 -4098:2:2195 -4099:2:2193 -4100:2:2194 -4101:2:2195 -4102:2:2206 -4103:2:2211 -4104:2:2212 -4105:0:4365 -4106:2:2224 -4107:0:4365 -4108:3:3757 -4109:0:4365 -4110:2:2226 -4111:0:4365 -4112:3:3758 -4113:0:4365 -4114:2:2230 -4115:0:4365 -4116:3:3757 -4117:0:4365 -4118:2:2235 -4119:2:2239 -4120:2:2240 -4121:2:2248 -4122:2:2249 -4123:2:2253 -4124:2:2254 -4125:2:2248 -4126:2:2249 -4127:2:2250 -4128:2:2262 -4129:2:2267 -4130:2:2271 -4131:2:2272 -4132:2:2279 -4133:2:2280 -4134:2:2291 -4135:2:2292 -4136:2:2293 -4137:2:2291 -4138:2:2292 -4139:2:2293 -4140:2:2304 -4141:2:2309 -4142:2:2310 -4143:0:4365 -4144:3:3758 -4145:0:4365 -4146:2:2322 -4147:0:4365 -4148:2:1169 -4149:0:4365 -4150:3:3757 -4151:0:4365 -4152:2:1170 -4153:0:4365 -4154:3:3758 -4155:0:4365 -4156:3:3759 -4157:0:4365 -4158:3:3972 -4159:0:4365 -4160:3:3980 -4161:0:4365 -4162:3:3981 -4163:3:3985 -4164:3:3986 -4165:3:3994 -4166:3:3995 -4167:3:3999 -4168:3:4000 -4169:3:3994 -4170:3:3995 -4171:3:3999 -4172:3:4000 -4173:3:4008 -4174:3:4013 -4175:3:4017 -4176:3:4018 -4177:3:4025 -4178:3:4026 -4179:3:4037 -4180:3:4038 -4181:3:4039 -4182:3:4037 -4183:3:4038 -4184:3:4039 -4185:3:4050 -4186:3:4055 -4187:3:4056 -4188:0:4365 -4189:3:4068 -4190:0:4365 -4191:3:4069 -4192:0:4365 -4193:2:1173 -4194:0:4365 -4195:3:4070 -4196:0:4365 -4197:2:1179 -4198:0:4365 -4199:2:1180 -4200:0:4365 -4201:3:4069 -4202:0:4365 -4203:2:1181 -4204:2:1185 -4205:2:1186 -4206:2:1194 -4207:2:1195 -4208:2:1199 -4209:2:1200 -4210:2:1194 -4211:2:1195 -4212:2:1199 -4213:2:1200 -4214:2:1208 -4215:2:1213 -4216:2:1217 -4217:2:1218 -4218:2:1225 -4219:2:1226 -4220:2:1237 -4221:2:1238 -4222:2:1239 -4223:2:1237 -4224:2:1238 -4225:2:1239 -4226:2:1250 -4227:2:1255 -4228:2:1256 -4229:0:4365 -4230:3:4070 -4231:0:4365 -4232:2:1268 -4233:0:4365 -4234:3:4069 -4235:0:4365 -4236:2:1270 -4237:0:4365 -4238:3:4070 -4239:0:4365 -4240:2:1271 -4241:2:1275 -4242:2:1276 -4243:2:1284 -4244:2:1285 -4245:2:1289 -4246:2:1290 -4247:2:1284 -4248:2:1285 -4249:2:1289 -4250:2:1290 -4251:2:1298 -4252:2:1303 -4253:2:1307 -4254:2:1308 -4255:2:1315 -4256:2:1316 -4257:2:1327 -4258:2:1328 -4259:2:1329 -4260:2:1327 -4261:2:1328 -4262:2:1329 -4263:2:1340 -4264:2:1345 -4265:2:1346 -4266:0:4365 -4267:2:1358 -4268:0:4365 -4269:2:1360 -4270:0:4365 -4271:3:4069 -4272:0:4365 -4273:2:1361 -4274:0:4365 -4275:3:4070 -4276:0:4365 -4277:2:1362 -4278:2:1366 -4279:2:1367 -4280:2:1375 -4281:2:1376 -4282:2:1380 -4283:2:1381 -4284:2:1375 -4285:2:1376 -4286:2:1380 -4287:2:1381 -4288:2:1389 -4289:2:1394 -4290:2:1398 -4291:2:1399 -4292:2:1406 -4293:2:1407 -4294:2:1418 -4295:2:1419 -4296:2:1420 -4297:2:1418 -4298:2:1419 -4299:2:1420 -4300:2:1431 -4301:2:1436 -4302:2:1437 -4303:0:4365 -4304:2:1449 -4305:0:4365 -4306:3:4069 -4307:0:4365 -4308:2:1451 -4309:0:4365 -4310:3:4070 -4311:0:4365 -4312:2:1652 -4313:0:4365 -4314:2:1653 -4315:0:4365 -4316:2:1657 -4317:0:4365 -4318:2:1660 -4319:0:4365 -4320:3:4069 -4321:0:4365 -4322:2:1665 -4323:2:1669 -4324:2:1670 -4325:2:1678 -4326:2:1679 -4327:2:1683 -4328:2:1684 -4329:2:1678 -4330:2:1679 -4331:2:1680 -4332:2:1692 -4333:2:1697 -4334:2:1701 -4335:2:1702 -4336:2:1709 -4337:2:1710 -4338:2:1721 -4339:2:1722 -4340:2:1723 -4341:2:1721 -4342:2:1722 -4343:2:1723 -4344:2:1734 -4345:2:1739 -4346:2:1740 -4347:0:4365 -4348:3:4070 -4349:0:4365 -4350:2:1752 -4351:0:4365 -4352:3:4069 -4353:0:4365 -4354:2:1754 -4355:0:4365 -4356:3:4070 -4357:0:4365 -4358:2:1755 -4359:2:1759 -4360:2:1760 -4361:2:1768 -4362:2:1769 -4363:2:1773 -4364:2:1774 -4365:2:1768 -4366:2:1769 -4367:2:1773 -4368:2:1774 -4369:2:1782 -4370:2:1787 -4371:2:1791 -4372:2:1792 -4373:2:1799 -4374:2:1800 -4375:2:1811 -4376:2:1812 -4377:2:1813 -4378:2:1811 -4379:2:1812 -4380:2:1813 -4381:2:1824 -4382:2:1829 -4383:2:1830 -4384:0:4365 -4385:2:1842 -4386:0:4365 -4387:3:4069 -4388:0:4365 -4389:2:1844 -4390:0:4365 -4391:3:4070 -4392:0:4365 -4393:2:1845 -4394:2:1849 -4395:2:1850 -4396:2:1858 -4397:2:1859 -4398:2:1863 -4399:2:1864 -4400:2:1858 -4401:2:1859 -4402:2:1863 -4403:2:1864 -4404:2:1872 -4405:2:1877 -4406:2:1881 -4407:2:1882 -4408:2:1889 -4409:2:1890 -4410:2:1901 -4411:2:1902 -4412:2:1903 -4413:2:1901 -4414:2:1902 -4415:2:1903 -4416:2:1914 -4417:2:1919 -4418:2:1920 -4419:0:4365 -4420:2:1932 -4421:0:4365 -4422:3:4069 -4423:0:4365 -4424:2:1934 -4425:0:4365 -4426:3:4070 -4427:0:4365 -4428:2:1935 -4429:0:4365 -4430:2:1936 -4431:0:4365 -4432:2:2129 -4433:0:4365 -4434:2:2130 -4435:0:4365 -4436:2:2134 -4437:0:4365 -4438:3:4069 -4439:0:4365 -4440:2:2136 -4441:0:4365 -4442:3:4070 -4443:0:4365 -4444:2:2137 -4445:2:2141 -4446:2:2142 -4447:2:2150 -4448:2:2151 -4449:2:2155 -4450:2:2156 -4451:2:2150 -4452:2:2151 -4453:2:2155 -4454:2:2156 -4455:2:2164 -4456:2:2169 -4457:2:2173 -4458:2:2174 -4459:2:2181 -4460:2:2182 -4461:2:2193 -4462:2:2194 -4463:2:2195 -4464:2:2193 -4465:2:2194 -4466:2:2195 -4467:2:2206 -4468:2:2211 -4469:2:2212 -4470:0:4365 -4471:2:2224 -4472:0:4365 -4473:3:4069 -4474:0:4365 -4475:2:2226 -4476:0:4365 -4477:3:4070 -4478:0:4365 -4479:2:2230 -4480:0:4365 -4481:3:4069 -4482:0:4365 -4483:2:2235 -4484:2:2239 -4485:2:2240 -4486:2:2248 -4487:2:2249 -4488:2:2253 -4489:2:2254 -4490:2:2248 -4491:2:2249 -4492:2:2250 -4493:2:2262 -4494:2:2267 -4495:2:2271 -4496:2:2272 -4497:2:2279 -4498:2:2280 -4499:2:2291 -4500:2:2292 -4501:2:2293 -4502:2:2291 -4503:2:2292 -4504:2:2293 -4505:2:2304 -4506:2:2309 -4507:2:2310 -4508:0:4365 -4509:3:4070 -4510:0:4365 -4511:2:2322 -4512:0:4365 -4513:2:1169 -4514:0:4365 -4515:3:4069 -4516:0:4365 -4517:2:1170 -4518:0:4365 -4519:3:4070 -4520:0:4365 -4521:3:4071 -4522:0:4365 -4523:3:4081 -4524:0:4365 -4525:3:3666 -4526:0:4365 -4527:3:3667 -4528:0:4365 -4529:3:3668 -4530:0:4365 -4531:3:3669 -4532:3:3673 -4533:3:3674 -4534:3:3682 -4535:3:3683 -4536:3:3687 -4537:3:3688 -4538:3:3682 -4539:3:3683 -4540:3:3687 -4541:3:3688 -4542:3:3696 -4543:3:3701 -4544:3:3705 -4545:3:3706 -4546:3:3713 -4547:3:3714 -4548:3:3725 -4549:3:3726 -4550:3:3727 -4551:3:3725 -4552:3:3726 -4553:3:3727 -4554:3:3738 -4555:3:3743 -4556:3:3744 -4557:0:4365 -4558:3:3756 -4559:0:4365 -4560:3:3757 -4561:0:4365 -4562:2:1173 -4563:0:4365 -4564:3:3758 -4565:0:4365 -4566:2:1179 -4567:0:4365 -4568:2:1180 -4569:0:4365 -4570:3:3757 -4571:0:4365 -4572:2:1181 -4573:2:1185 -4574:2:1186 -4575:2:1194 -4576:2:1195 -4577:2:1199 -4578:2:1200 -4579:2:1194 -4580:2:1195 -4581:2:1199 -4582:2:1200 -4583:2:1208 -4584:2:1213 -4585:2:1217 -4586:2:1218 -4587:2:1225 -4588:2:1226 -4589:2:1237 -4590:2:1238 -4591:2:1239 -4592:2:1237 -4593:2:1238 -4594:2:1239 -4595:2:1250 -4596:2:1255 -4597:2:1256 -4598:0:4365 -4599:3:3758 -4600:0:4365 -4601:2:1268 -4602:0:4365 -4603:3:3757 -4604:0:4365 -4605:2:1270 -4606:0:4365 -4607:3:3758 -4608:0:4365 -4609:2:1271 -4610:2:1275 -4611:2:1276 -4612:2:1284 -4613:2:1285 -4614:2:1289 -4615:2:1290 -4616:2:1284 -4617:2:1285 -4618:2:1289 -4619:2:1290 -4620:2:1298 -4621:2:1303 -4622:2:1307 -4623:2:1308 -4624:2:1315 -4625:2:1316 -4626:2:1327 -4627:2:1328 -4628:2:1329 -4629:2:1327 -4630:2:1328 -4631:2:1329 -4632:2:1340 -4633:2:1345 -4634:2:1346 -4635:0:4365 -4636:2:1358 -4637:0:4365 -4638:2:1360 -4639:0:4365 -4640:3:3757 -4641:0:4365 -4642:2:1361 -4643:0:4365 -4644:3:3758 -4645:0:4365 -4646:2:1362 -4647:2:1366 -4648:2:1367 -4649:2:1375 -4650:2:1376 -4651:2:1380 -4652:2:1381 -4653:2:1375 -4654:2:1376 -4655:2:1380 -4656:2:1381 -4657:2:1389 -4658:2:1394 -4659:2:1398 -4660:2:1399 -4661:2:1406 -4662:2:1407 -4663:2:1418 -4664:2:1419 -4665:2:1420 -4666:2:1418 -4667:2:1419 -4668:2:1420 -4669:2:1431 -4670:2:1436 -4671:2:1437 -4672:0:4365 -4673:2:1449 -4674:0:4365 -4675:3:3757 -4676:0:4365 -4677:2:1451 -4678:0:4365 -4679:3:3758 -4680:0:4365 -4681:2:1652 -4682:0:4365 -4683:2:1653 -4684:0:4365 -4685:2:1657 -4686:0:4365 -4687:2:1660 -4688:0:4365 -4689:3:3757 -4690:0:4365 -4691:2:1665 -4692:2:1669 -4693:2:1670 -4694:2:1678 -4695:2:1679 -4696:2:1683 -4697:2:1684 -4698:2:1678 -4699:2:1679 -4700:2:1680 -4701:2:1692 -4702:2:1697 -4703:2:1701 -4704:2:1702 -4705:2:1709 -4706:2:1710 -4707:2:1721 -4708:2:1722 -4709:2:1723 -4710:2:1721 -4711:2:1722 -4712:2:1723 -4713:2:1734 -4714:2:1739 -4715:2:1740 -4716:0:4365 -4717:3:3758 -4718:0:4365 -4719:2:1752 -4720:0:4365 -4721:3:3757 -4722:0:4365 -4723:2:1754 -4724:0:4365 -4725:3:3758 -4726:0:4365 -4727:2:1755 -4728:2:1759 -4729:2:1760 -4730:2:1768 -4731:2:1769 -4732:2:1773 -4733:2:1774 -4734:2:1768 -4735:2:1769 -4736:2:1773 -4737:2:1774 -4738:2:1782 -4739:2:1787 -4740:2:1791 -4741:2:1792 -4742:2:1799 -4743:2:1800 -4744:2:1811 -4745:2:1812 -4746:2:1813 -4747:2:1811 -4748:2:1812 -4749:2:1813 -4750:2:1824 -4751:2:1829 -4752:2:1830 -4753:0:4365 -4754:2:1842 -4755:0:4365 -4756:3:3757 -4757:0:4365 -4758:2:1844 -4759:0:4365 -4760:3:3758 -4761:0:4365 -4762:2:1845 -4763:2:1849 -4764:2:1850 -4765:2:1858 -4766:2:1859 -4767:2:1863 -4768:2:1864 -4769:2:1858 -4770:2:1859 -4771:2:1863 -4772:2:1864 -4773:2:1872 -4774:2:1877 -4775:2:1881 -4776:2:1882 -4777:2:1889 -4778:2:1890 -4779:2:1901 -4780:2:1902 -4781:2:1903 -4782:2:1901 -4783:2:1902 -4784:2:1903 -4785:2:1914 -4786:2:1919 -4787:2:1920 -4788:0:4365 -4789:2:1932 -4790:0:4365 -4791:3:3757 -4792:0:4365 -4793:2:1934 -4794:0:4365 -4795:3:3758 -4796:0:4365 -4797:2:1935 -4798:0:4365 -4799:2:1936 -4800:0:4365 -4801:2:2129 -4802:0:4365 -4803:2:2130 -4804:0:4365 -4805:2:2134 -4806:0:4365 -4807:3:3757 -4808:0:4365 -4809:2:2136 -4810:0:4365 -4811:3:3758 -4812:0:4365 -4813:2:2137 -4814:2:2141 -4815:2:2142 -4816:2:2150 -4817:2:2151 -4818:2:2155 -4819:2:2156 -4820:2:2150 -4821:2:2151 -4822:2:2155 -4823:2:2156 -4824:2:2164 -4825:2:2169 -4826:2:2173 -4827:2:2174 -4828:2:2181 -4829:2:2182 -4830:2:2193 -4831:2:2194 -4832:2:2195 -4833:2:2193 -4834:2:2194 -4835:2:2195 -4836:2:2206 -4837:2:2211 -4838:2:2212 -4839:0:4365 -4840:2:2224 -4841:0:4365 -4842:3:3757 -4843:0:4365 -4844:2:2226 -4845:0:4365 -4846:3:3758 -4847:0:4365 -4848:2:2230 -4849:0:4365 -4850:3:3757 -4851:0:4365 -4852:2:2235 -4853:2:2239 -4854:2:2240 -4855:2:2248 -4856:2:2249 -4857:2:2253 -4858:2:2254 -4859:2:2248 -4860:2:2249 -4861:2:2250 -4862:2:2262 -4863:2:2267 -4864:2:2271 -4865:2:2272 -4866:2:2279 -4867:2:2280 -4868:2:2291 -4869:2:2292 -4870:2:2293 -4871:2:2291 -4872:2:2292 -4873:2:2293 -4874:2:2304 -4875:2:2309 -4876:2:2310 -4877:0:4365 -4878:3:3758 -4879:0:4365 -4880:2:2322 -4881:0:4365 -4882:2:1169 -4883:0:4365 -4884:3:3757 -4885:0:4365 -4886:2:1170 -4887:0:4365 -4888:3:3758 -4889:0:4365 -4890:3:3759 -4891:0:4365 -4892:3:3972 -4893:0:4365 -4894:3:4077 -4895:0:4365 -4896:3:4078 -4897:0:4365 -4898:3:4082 -4899:0:4365 -4900:3:4088 -4901:0:4365 -4902:3:4092 -4903:3:4093 -4904:3:4097 -4905:3:4101 -4906:3:4102 -4907:3:4097 -4908:3:4101 -4909:3:4102 -4910:3:4106 -4911:3:4114 -4912:3:4115 -4913:3:4120 -4914:3:4127 -4915:3:4128 -4916:3:4127 -4917:3:4128 -4918:3:4135 -4919:3:4140 -4920:0:4365 -4921:3:4151 -4922:0:4365 -4923:3:4155 -4924:3:4156 -4925:3:4160 -4926:3:4164 -4927:3:4165 -4928:3:4160 -4929:3:4164 -4930:3:4165 -4931:3:4169 -4932:3:4177 -4933:3:4178 -4934:3:4183 -4935:3:4190 -4936:3:4191 -4937:3:4190 -4938:3:4191 -4939:3:4198 -4940:3:4203 -4941:0:4365 -4942:3:4151 -4943:0:4365 -4944:3:4155 -4945:3:4156 -4946:3:4160 -4947:3:4164 -4948:3:4165 -4949:3:4160 -4950:3:4164 -4951:3:4165 -4952:3:4169 -4953:3:4177 -4954:3:4178 -4955:3:4183 -4956:3:4190 -4957:3:4191 -4958:3:4190 -4959:3:4191 -4960:3:4198 -4961:3:4203 -4962:0:4365 -4963:3:4214 -4964:0:4365 -4965:3:4222 -4966:3:4223 -4967:3:4227 -4968:3:4231 -4969:3:4232 -4970:3:4227 -4971:3:4231 -4972:3:4232 -4973:3:4236 -4974:3:4244 -4975:3:4245 -4976:3:4250 -4977:3:4257 -4978:3:4258 -4979:3:4257 -4980:3:4258 -4981:3:4265 -4982:3:4270 -4983:0:4365 -4984:3:4285 -4985:0:4365 -4986:3:4286 -4987:0:4365 -4988:2:1173 -4989:0:4365 -4990:3:4287 -4991:0:4365 -4992:2:1179 -4993:0:4365 -4994:2:1180 -4995:0:4365 -4996:3:4286 -4997:0:4365 -4998:2:1181 -4999:2:1185 -5000:2:1186 -5001:2:1194 -5002:2:1195 -5003:2:1199 -5004:2:1200 -5005:2:1194 -5006:2:1195 -5007:2:1199 -5008:2:1200 -5009:2:1208 -5010:2:1213 -5011:2:1217 -5012:2:1218 -5013:2:1225 -5014:2:1226 -5015:2:1237 -5016:2:1238 -5017:2:1239 -5018:2:1237 -5019:2:1238 -5020:2:1239 -5021:2:1250 -5022:2:1255 -5023:2:1256 -5024:0:4365 -5025:3:4287 -5026:0:4365 -5027:2:1268 -5028:0:4365 -5029:3:4286 -5030:0:4365 -5031:2:1270 -5032:0:4365 -5033:3:4287 -5034:0:4365 -5035:2:1271 -5036:2:1275 -5037:2:1276 -5038:2:1284 -5039:2:1285 -5040:2:1289 -5041:2:1290 -5042:2:1284 -5043:2:1285 -5044:2:1289 -5045:2:1290 -5046:2:1298 -5047:2:1303 -5048:2:1307 -5049:2:1308 -5050:2:1315 -5051:2:1316 -5052:2:1327 -5053:2:1328 -5054:2:1329 -5055:2:1327 -5056:2:1328 -5057:2:1329 -5058:2:1340 -5059:2:1345 -5060:2:1346 -5061:0:4365 -5062:2:1358 -5063:0:4365 -5064:2:1360 -5065:0:4365 -5066:3:4286 -5067:0:4365 -5068:2:1361 -5069:0:4365 -5070:3:4287 -5071:0:4365 -5072:2:1362 -5073:2:1366 -5074:2:1367 -5075:2:1375 -5076:2:1376 -5077:2:1380 -5078:2:1381 -5079:2:1375 -5080:2:1376 -5081:2:1380 -5082:2:1381 -5083:2:1389 -5084:2:1394 -5085:2:1398 -5086:2:1399 -5087:2:1406 -5088:2:1407 -5089:2:1418 -5090:2:1419 -5091:2:1420 -5092:2:1418 -5093:2:1419 -5094:2:1420 -5095:2:1431 -5096:2:1436 -5097:2:1437 -5098:0:4365 -5099:2:1449 -5100:0:4365 -5101:3:4286 -5102:0:4365 -5103:2:1451 -5104:0:4365 -5105:3:4287 -5106:0:4365 -5107:2:1652 -5108:0:4365 -5109:2:1653 -5110:0:4365 -5111:2:1657 -5112:0:4365 -5113:2:1660 -5114:0:4365 -5115:3:4286 -5116:0:4365 -5117:2:1665 -5118:2:1669 -5119:2:1670 -5120:2:1678 -5121:2:1679 -5122:2:1683 -5123:2:1684 -5124:2:1678 -5125:2:1679 -5126:2:1680 -5127:2:1692 -5128:2:1697 -5129:2:1701 -5130:2:1702 -5131:2:1709 -5132:2:1710 -5133:2:1721 -5134:2:1722 -5135:2:1723 -5136:2:1721 -5137:2:1722 -5138:2:1723 -5139:2:1734 -5140:2:1739 -5141:2:1740 -5142:0:4365 -5143:3:4287 -5144:0:4365 -5145:2:1752 -5146:0:4365 -5147:3:4286 -5148:0:4365 -5149:2:1754 -5150:0:4365 -5151:3:4287 -5152:0:4365 -5153:2:1755 -5154:2:1759 -5155:2:1760 -5156:2:1768 -5157:2:1769 -5158:2:1773 -5159:2:1774 -5160:2:1768 -5161:2:1769 -5162:2:1773 -5163:2:1774 -5164:2:1782 -5165:2:1787 -5166:2:1791 -5167:2:1792 -5168:2:1799 -5169:2:1800 -5170:2:1811 -5171:2:1812 -5172:2:1813 -5173:2:1811 -5174:2:1812 -5175:2:1813 -5176:2:1824 -5177:2:1829 -5178:2:1830 -5179:0:4365 -5180:2:1842 -5181:0:4365 -5182:3:4286 -5183:0:4365 -5184:2:1844 -5185:0:4365 -5186:3:4287 -5187:0:4365 -5188:2:1845 -5189:2:1849 -5190:2:1850 -5191:2:1858 -5192:2:1859 -5193:2:1863 -5194:2:1864 -5195:2:1858 -5196:2:1859 -5197:2:1863 -5198:2:1864 -5199:2:1872 -5200:2:1877 -5201:2:1881 -5202:2:1882 -5203:2:1889 -5204:2:1890 -5205:2:1901 -5206:2:1902 -5207:2:1903 -5208:2:1901 -5209:2:1902 -5210:2:1903 -5211:2:1914 -5212:2:1919 -5213:2:1920 -5214:0:4365 -5215:2:1932 -5216:0:4365 -5217:3:4286 -5218:0:4365 -5219:2:1934 -5220:0:4365 -5221:3:4287 -5222:0:4365 -5223:2:1935 -5224:0:4365 -5225:2:1936 -5226:0:4365 -5227:2:2129 -5228:0:4365 -5229:2:2130 -5230:0:4365 -5231:2:2134 -5232:0:4365 -5233:3:4286 -5234:0:4365 -5235:2:2136 -5236:0:4365 -5237:3:4287 -5238:0:4365 -5239:2:2137 -5240:2:2141 -5241:2:2142 -5242:2:2150 -5243:2:2151 -5244:2:2155 -5245:2:2156 -5246:2:2150 -5247:2:2151 -5248:2:2155 -5249:2:2156 -5250:2:2164 -5251:2:2169 -5252:2:2173 -5253:2:2174 -5254:2:2181 -5255:2:2182 -5256:2:2193 -5257:2:2194 -5258:2:2195 -5259:2:2193 -5260:2:2194 -5261:2:2195 -5262:2:2206 -5263:2:2211 -5264:2:2212 -5265:0:4365 -5266:2:2224 -5267:0:4365 -5268:3:4286 -5269:0:4365 -5270:2:2226 -5271:0:4365 -5272:3:4287 -5273:0:4365 -5274:2:2230 -5275:0:4365 -5276:3:4286 -5277:0:4365 -5278:2:2235 -5279:2:2239 -5280:2:2240 -5281:2:2248 -5282:2:2249 -5283:2:2253 -5284:2:2254 -5285:2:2248 -5286:2:2249 -5287:2:2250 -5288:2:2262 -5289:2:2267 -5290:2:2271 -5291:2:2272 -5292:2:2279 -5293:2:2280 -5294:2:2291 -5295:2:2292 -5296:2:2293 -5297:2:2291 -5298:2:2292 -5299:2:2293 -5300:2:2304 -5301:2:2309 -5302:2:2310 -5303:0:4365 -5304:3:4287 -5305:0:4365 -5306:2:2322 -5307:0:4365 -5308:2:1169 -5309:0:4365 -5310:3:4286 -5311:0:4365 -5312:2:1170 -5313:0:4365 -5314:3:4287 -5315:0:4365 -5316:3:4288 -5317:0:4365 -5318:3:4294 -5319:0:4365 -5320:3:4295 -5321:0:4365 -5322:3:2338 -5323:0:4365 -5324:3:2339 -5325:3:2343 -5326:3:2344 -5327:3:2352 -5328:3:2353 -5329:3:2357 -5330:3:2358 -5331:3:2352 -5332:3:2353 -5333:3:2357 -5334:3:2358 -5335:3:2366 -5336:3:2371 -5337:3:2375 -5338:3:2376 -5339:3:2383 -5340:3:2384 -5341:3:2395 -5342:3:2396 -5343:3:2397 -5344:3:2395 -5345:3:2396 -5346:3:2397 -5347:3:2408 -5348:3:2413 -5349:3:2414 -5350:0:4365 -5351:3:2426 -5352:0:4365 -5353:3:2427 -5354:0:4365 -5355:2:1173 -5356:0:4365 -5357:3:2428 -5358:0:4365 -5359:2:1179 -5360:0:4365 -5361:2:1180 -5362:0:4365 -5363:3:2427 -5364:0:4365 -5365:2:1181 -5366:2:1185 -5367:2:1186 -5368:2:1194 -5369:2:1195 -5370:2:1199 -5371:2:1200 -5372:2:1194 -5373:2:1195 -5374:2:1199 -5375:2:1200 -5376:2:1208 -5377:2:1213 -5378:2:1217 -5379:2:1218 -5380:2:1225 -5381:2:1226 -5382:2:1237 -5383:2:1238 -5384:2:1239 -5385:2:1237 -5386:2:1238 -5387:2:1239 -5388:2:1250 -5389:2:1255 -5390:2:1256 -5391:0:4365 -5392:3:2428 -5393:0:4365 -5394:2:1268 -5395:0:4365 -5396:3:2427 -5397:0:4365 -5398:2:1270 -5399:0:4365 -5400:3:2428 -5401:0:4365 -5402:2:1271 -5403:2:1275 -5404:2:1276 -5405:2:1284 -5406:2:1285 -5407:2:1289 -5408:2:1290 -5409:2:1284 -5410:2:1285 -5411:2:1289 -5412:2:1290 -5413:2:1298 -5414:2:1303 -5415:2:1307 -5416:2:1308 -5417:2:1315 -5418:2:1316 -5419:2:1327 -5420:2:1328 -5421:2:1329 -5422:2:1327 -5423:2:1328 -5424:2:1329 -5425:2:1340 -5426:2:1345 -5427:2:1346 -5428:0:4365 -5429:2:1358 -5430:0:4365 -5431:2:1360 -5432:0:4365 -5433:3:2427 -5434:0:4365 -5435:2:1361 -5436:0:4365 -5437:3:2428 -5438:0:4365 -5439:2:1362 -5440:2:1366 -5441:2:1367 -5442:2:1375 -5443:2:1376 -5444:2:1380 -5445:2:1381 -5446:2:1375 -5447:2:1376 -5448:2:1380 -5449:2:1381 -5450:2:1389 -5451:2:1394 -5452:2:1398 -5453:2:1399 -5454:2:1406 -5455:2:1407 -5456:2:1418 -5457:2:1419 -5458:2:1420 -5459:2:1418 -5460:2:1419 -5461:2:1420 -5462:2:1431 -5463:2:1436 -5464:2:1437 -5465:0:4365 -5466:2:1449 -5467:0:4365 -5468:3:2427 -5469:0:4365 -5470:2:1451 -5471:0:4365 -5472:3:2428 -5473:0:4365 -5474:2:1652 -5475:0:4365 -5476:2:1653 -5477:0:4365 -5478:2:1657 -5479:0:4365 -5480:2:1660 -5481:0:4365 -5482:3:2427 -5483:0:4365 -5484:2:1665 -5485:2:1669 -5486:2:1670 -5487:2:1678 -5488:2:1679 -5489:2:1683 -5490:2:1684 -5491:2:1678 -5492:2:1679 -5493:2:1680 -5494:2:1692 -5495:2:1697 -5496:2:1701 -5497:2:1702 -5498:2:1709 -5499:2:1710 -5500:2:1721 -5501:2:1722 -5502:2:1723 -5503:2:1721 -5504:2:1722 -5505:2:1723 -5506:2:1734 -5507:2:1739 -5508:2:1740 -5509:0:4365 -5510:3:2428 -5511:0:4365 -5512:2:1752 -5513:0:4365 -5514:3:2427 -5515:0:4365 -5516:2:1754 -5517:0:4365 -5518:3:2428 -5519:0:4365 -5520:2:1755 -5521:2:1759 -5522:2:1760 -5523:2:1768 -5524:2:1769 -5525:2:1773 -5526:2:1774 -5527:2:1768 -5528:2:1769 -5529:2:1773 -5530:2:1774 -5531:2:1782 -5532:2:1787 -5533:2:1791 -5534:2:1792 -5535:2:1799 -5536:2:1800 -5537:2:1811 -5538:2:1812 -5539:2:1813 -5540:2:1811 -5541:2:1812 -5542:2:1813 -5543:2:1824 -5544:2:1829 -5545:2:1830 -5546:0:4365 -5547:2:1842 -5548:0:4365 -5549:3:2427 -5550:0:4365 -5551:2:1844 -5552:0:4365 -5553:3:2428 -5554:0:4365 -5555:2:1845 -5556:2:1849 -5557:2:1850 -5558:2:1858 -5559:2:1859 -5560:2:1863 -5561:2:1864 -5562:2:1858 -5563:2:1859 -5564:2:1863 -5565:2:1864 -5566:2:1872 -5567:2:1877 -5568:2:1881 -5569:2:1882 -5570:2:1889 -5571:2:1890 -5572:2:1901 -5573:2:1902 -5574:2:1903 -5575:2:1901 -5576:2:1902 -5577:2:1903 -5578:2:1914 -5579:2:1919 -5580:2:1920 -5581:0:4365 -5582:2:1932 -5583:0:4365 -5584:3:2427 -5585:0:4365 -5586:2:1934 -5587:0:4365 -5588:3:2428 -5589:0:4365 -5590:2:1935 -5591:0:4365 -5592:2:1936 -5593:0:4365 -5594:2:2129 -5595:0:4365 -5596:2:2130 -5597:0:4365 -5598:2:2134 -5599:0:4365 -5600:3:2427 -5601:0:4365 -5602:2:2136 -5603:0:4365 -5604:3:2428 -5605:0:4365 -5606:2:2137 -5607:2:2141 -5608:2:2142 -5609:2:2150 -5610:2:2151 -5611:2:2155 -5612:2:2156 -5613:2:2150 -5614:2:2151 -5615:2:2155 -5616:2:2156 -5617:2:2164 -5618:2:2169 -5619:2:2173 -5620:2:2174 -5621:2:2181 -5622:2:2182 -5623:2:2193 -5624:2:2194 -5625:2:2195 -5626:2:2193 -5627:2:2194 -5628:2:2195 -5629:2:2206 -5630:2:2211 -5631:2:2212 -5632:0:4365 -5633:2:2224 -5634:0:4365 -5635:3:2427 -5636:0:4365 -5637:2:2226 -5638:0:4365 -5639:3:2428 -5640:0:4365 -5641:2:2230 -5642:0:4365 -5643:3:2427 -5644:0:4365 -5645:2:2235 -5646:2:2239 -5647:2:2240 -5648:2:2248 -5649:2:2249 -5650:2:2253 -5651:2:2254 -5652:2:2248 -5653:2:2249 -5654:2:2250 -5655:2:2262 -5656:2:2267 -5657:2:2271 -5658:2:2272 -5659:2:2279 -5660:2:2280 -5661:2:2291 -5662:2:2292 -5663:2:2293 -5664:2:2291 -5665:2:2292 -5666:2:2293 -5667:2:2304 -5668:2:2309 -5669:2:2310 -5670:0:4365 -5671:3:2428 -5672:0:4365 -5673:2:2322 -5674:0:4365 -5675:2:1169 -5676:0:4365 -5677:3:2427 -5678:0:4365 -5679:2:1170 -5680:0:4365 -5681:3:2428 -5682:0:4365 -5683:3:2429 -5684:0:4365 -5685:3:2435 -5686:3:2436 -5687:0:4365 -5688:3:2440 -5689:3:2444 -5690:3:2445 -5691:3:2453 -5692:3:2454 -5693:3:2458 -5694:3:2459 -5695:3:2453 -5696:3:2454 -5697:3:2458 -5698:3:2459 -5699:3:2467 -5700:3:2472 -5701:3:2473 -5702:3:2484 -5703:3:2485 -5704:3:2496 -5705:3:2497 -5706:3:2498 -5707:3:2496 -5708:3:2497 -5709:3:2498 -5710:3:2509 -5711:3:2514 -5712:3:2515 -5713:0:4365 -5714:3:2527 -5715:0:4365 -5716:3:2528 -5717:0:4365 -5718:2:1173 -5719:0:4365 -5720:3:2529 -5721:0:4365 -5722:2:1179 -5723:0:4365 -5724:2:1180 -5725:0:4365 -5726:3:2528 -5727:0:4365 -5728:2:1181 -5729:2:1185 -5730:2:1186 -5731:2:1194 -5732:2:1195 -5733:2:1199 -5734:2:1200 -5735:2:1194 -5736:2:1195 -5737:2:1199 -5738:2:1200 -5739:2:1208 -5740:2:1213 -5741:2:1217 -5742:2:1218 -5743:2:1225 -5744:2:1226 -5745:2:1237 -5746:2:1238 -5747:2:1239 -5748:2:1237 -5749:2:1238 -5750:2:1239 -5751:2:1250 -5752:2:1255 -5753:2:1256 -5754:0:4365 -5755:3:2529 -5756:0:4365 -5757:2:1268 -5758:0:4365 -5759:3:2528 -5760:0:4365 -5761:2:1270 -5762:0:4365 -5763:3:2529 -5764:0:4365 -5765:2:1271 -5766:2:1275 -5767:2:1276 -5768:2:1284 -5769:2:1285 -5770:2:1289 -5771:2:1290 -5772:2:1284 -5773:2:1285 -5774:2:1289 -5775:2:1290 -5776:2:1298 -5777:2:1303 -5778:2:1307 -5779:2:1308 -5780:2:1315 -5781:2:1316 -5782:2:1327 -5783:2:1328 -5784:2:1329 -5785:2:1327 -5786:2:1328 -5787:2:1329 -5788:2:1340 -5789:2:1345 -5790:2:1346 -5791:0:4365 -5792:2:1358 -5793:0:4365 -5794:2:1360 -5795:0:4365 -5796:3:2528 -5797:0:4365 -5798:2:1361 -5799:0:4365 -5800:3:2529 -5801:0:4365 -5802:2:1362 -5803:2:1366 -5804:2:1367 -5805:2:1375 -5806:2:1376 -5807:2:1380 -5808:2:1381 -5809:2:1375 -5810:2:1376 -5811:2:1380 -5812:2:1381 -5813:2:1389 -5814:2:1394 -5815:2:1398 -5816:2:1399 -5817:2:1406 -5818:2:1407 -5819:2:1418 -5820:2:1419 -5821:2:1420 -5822:2:1418 -5823:2:1419 -5824:2:1420 -5825:2:1431 -5826:2:1436 -5827:2:1437 -5828:0:4365 -5829:2:1449 -5830:0:4365 -5831:3:2528 -5832:0:4365 -5833:2:1451 -5834:0:4365 -5835:3:2529 -5836:0:4365 -5837:2:1652 -5838:0:4365 -5839:2:1653 -5840:0:4365 -5841:2:1657 -5842:0:4365 -5843:2:1660 -5844:0:4365 -5845:3:2528 -5846:0:4365 -5847:2:1665 -5848:2:1669 -5849:2:1670 -5850:2:1678 -5851:2:1679 -5852:2:1683 -5853:2:1684 -5854:2:1678 -5855:2:1679 -5856:2:1680 -5857:2:1692 -5858:2:1697 -5859:2:1701 -5860:2:1702 -5861:2:1709 -5862:2:1710 -5863:2:1721 -5864:2:1722 -5865:2:1723 -5866:2:1721 -5867:2:1722 -5868:2:1723 -5869:2:1734 -5870:2:1739 -5871:2:1740 -5872:0:4365 -5873:3:2529 -5874:0:4365 -5875:2:1752 -5876:0:4365 -5877:3:2528 -5878:0:4365 -5879:2:1754 -5880:0:4365 -5881:3:2529 -5882:0:4365 -5883:2:1755 -5884:2:1759 -5885:2:1760 -5886:2:1768 -5887:2:1769 -5888:2:1773 -5889:2:1774 -5890:2:1768 -5891:2:1769 -5892:2:1773 -5893:2:1774 -5894:2:1782 -5895:2:1787 -5896:2:1791 -5897:2:1792 -5898:2:1799 -5899:2:1800 -5900:2:1811 -5901:2:1812 -5902:2:1813 -5903:2:1811 -5904:2:1812 -5905:2:1813 -5906:2:1824 -5907:2:1829 -5908:2:1830 -5909:0:4365 -5910:2:1842 -5911:0:4365 -5912:3:2528 -5913:0:4365 -5914:2:1844 -5915:0:4365 -5916:3:2529 -5917:0:4365 -5918:2:1845 -5919:2:1849 -5920:2:1850 -5921:2:1858 -5922:2:1859 -5923:2:1863 -5924:2:1864 -5925:2:1858 -5926:2:1859 -5927:2:1863 -5928:2:1864 -5929:2:1872 -5930:2:1877 -5931:2:1881 -5932:2:1882 -5933:2:1889 -5934:2:1890 -5935:2:1901 -5936:2:1902 -5937:2:1903 -5938:2:1901 -5939:2:1902 -5940:2:1903 -5941:2:1914 -5942:2:1919 -5943:2:1920 -5944:0:4365 -5945:2:1932 -5946:0:4365 -5947:3:2528 -5948:0:4365 -5949:2:1934 -5950:0:4365 -5951:3:2529 -5952:0:4365 -5953:2:1935 -5954:0:4365 -5955:2:1936 -5956:0:4365 -5957:2:2129 -5958:0:4365 -5959:2:2130 -5960:0:4365 -5961:2:2134 -5962:0:4365 -5963:3:2528 -5964:0:4365 -5965:2:2136 -5966:0:4365 -5967:3:2529 -5968:0:4365 -5969:2:2137 -5970:2:2141 -5971:2:2142 -5972:2:2150 -5973:2:2151 -5974:2:2155 -5975:2:2156 -5976:2:2150 -5977:2:2151 -5978:2:2155 -5979:2:2156 -5980:2:2164 -5981:2:2169 -5982:2:2173 -5983:2:2174 -5984:2:2181 -5985:2:2182 -5986:2:2193 -5987:2:2194 -5988:2:2195 -5989:2:2193 -5990:2:2194 -5991:2:2195 -5992:2:2206 -5993:2:2211 -5994:2:2212 -5995:0:4365 -5996:2:2224 -5997:0:4365 -5998:3:2528 -5999:0:4365 -6000:2:2226 -6001:0:4365 -6002:3:2529 -6003:0:4365 -6004:2:2230 -6005:0:4365 -6006:3:2528 -6007:0:4365 -6008:2:2235 -6009:2:2239 -6010:2:2240 -6011:2:2248 -6012:2:2249 -6013:2:2253 -6014:2:2254 -6015:2:2248 -6016:2:2249 -6017:2:2250 -6018:2:2262 -6019:2:2267 -6020:2:2271 -6021:2:2272 -6022:2:2279 -6023:2:2280 -6024:2:2291 -6025:2:2292 -6026:2:2293 -6027:2:2291 -6028:2:2292 -6029:2:2293 -6030:2:2304 -6031:2:2309 -6032:2:2310 -6033:0:4365 -6034:3:2529 -6035:0:4365 -6036:2:2322 -6037:0:4365 -6038:2:1169 -6039:0:4365 -6040:3:2528 -6041:0:4365 -6042:2:1170 -6043:0:4365 -6044:3:2529 -6045:0:4365 -6046:3:2530 -6047:0:4365 -6048:3:2536 -6049:0:4365 -6050:3:2537 -6051:0:4365 -6052:3:2547 -6053:0:4365 -6054:3:2548 -6055:0:4365 -6056:3:2552 -6057:3:2553 -6058:3:2557 -6059:3:2561 -6060:3:2562 -6061:3:2557 -6062:3:2561 -6063:3:2562 -6064:3:2566 -6065:3:2574 -6066:3:2575 -6067:3:2580 -6068:3:2587 -6069:3:2588 -6070:3:2587 -6071:3:2588 -6072:3:2595 -6073:3:2600 -6074:0:4365 -6075:3:2611 -6076:0:4365 -6077:3:2615 -6078:3:2616 -6079:3:2620 -6080:3:2624 -6081:3:2625 -6082:3:2620 -6083:3:2624 -6084:3:2625 -6085:3:2629 -6086:3:2637 -6087:3:2638 -6088:3:2643 -6089:3:2650 -6090:3:2651 -6091:3:2650 -6092:3:2651 -6093:3:2658 -6094:3:2663 -6095:0:4365 -6096:3:2611 -6097:0:4365 -6098:3:2615 -6099:3:2616 -6100:3:2620 -6101:3:2624 -6102:3:2625 -6103:3:2620 -6104:3:2624 -6105:3:2625 -6106:3:2629 -6107:3:2637 -6108:3:2638 -6109:3:2643 -6110:3:2650 -6111:3:2651 -6112:3:2650 -6113:3:2651 -6114:3:2658 -6115:3:2663 -6116:0:4365 -6117:3:2674 -6118:0:4365 -6119:3:2682 -6120:3:2683 -6121:3:2687 -6122:3:2691 -6123:3:2692 -6124:3:2687 -6125:3:2691 -6126:3:2692 -6127:3:2696 -6128:3:2704 -6129:3:2705 -6130:3:2710 -6131:3:2717 -6132:3:2718 -6133:3:2717 -6134:3:2718 -6135:3:2725 -6136:3:2730 -6137:0:4365 -6138:3:2745 -6139:0:4365 -6140:3:2746 -6141:0:4365 -6142:2:1173 -6143:0:4365 -6144:3:2747 -6145:0:4365 -6146:2:1179 -6147:0:4365 -6148:2:1180 -6149:0:4365 -6150:3:2746 -6151:0:4365 -6152:2:1181 -6153:2:1185 -6154:2:1186 -6155:2:1194 -6156:2:1195 -6157:2:1199 -6158:2:1200 -6159:2:1194 -6160:2:1195 -6161:2:1199 -6162:2:1200 -6163:2:1208 -6164:2:1213 -6165:2:1217 -6166:2:1218 -6167:2:1225 -6168:2:1226 -6169:2:1237 -6170:2:1238 -6171:2:1239 -6172:2:1237 -6173:2:1238 -6174:2:1239 -6175:2:1250 -6176:2:1255 -6177:2:1256 -6178:0:4365 -6179:3:2747 -6180:0:4365 -6181:2:1268 -6182:0:4365 -6183:3:2746 -6184:0:4365 -6185:2:1270 -6186:0:4365 -6187:3:2747 -6188:0:4365 -6189:2:1271 -6190:2:1275 -6191:2:1276 -6192:2:1284 -6193:2:1285 -6194:2:1289 -6195:2:1290 -6196:2:1284 -6197:2:1285 -6198:2:1289 -6199:2:1290 -6200:2:1298 -6201:2:1303 -6202:2:1307 -6203:2:1308 -6204:2:1315 -6205:2:1316 -6206:2:1327 -6207:2:1328 -6208:2:1329 -6209:2:1327 -6210:2:1328 -6211:2:1329 -6212:2:1340 -6213:2:1345 -6214:2:1346 -6215:0:4365 -6216:2:1358 -6217:0:4365 -6218:2:1360 -6219:0:4365 -6220:3:2746 -6221:0:4365 -6222:2:1361 -6223:0:4365 -6224:3:2747 -6225:0:4365 -6226:2:1362 -6227:2:1366 -6228:2:1367 -6229:2:1375 -6230:2:1376 -6231:2:1380 -6232:2:1381 -6233:2:1375 -6234:2:1376 -6235:2:1380 -6236:2:1381 -6237:2:1389 -6238:2:1394 -6239:2:1398 -6240:2:1399 -6241:2:1406 -6242:2:1407 -6243:2:1418 -6244:2:1419 -6245:2:1420 -6246:2:1418 -6247:2:1419 -6248:2:1420 -6249:2:1431 -6250:2:1436 -6251:2:1437 -6252:0:4365 -6253:2:1449 -6254:0:4365 -6255:3:2746 -6256:0:4365 -6257:2:1451 -6258:0:4365 -6259:3:2747 -6260:0:4365 -6261:2:1652 -6262:0:4365 -6263:2:1653 -6264:0:4365 -6265:2:1657 -6266:0:4365 -6267:2:1660 -6268:0:4365 -6269:3:2746 -6270:0:4365 -6271:2:1665 -6272:2:1669 -6273:2:1670 -6274:2:1678 -6275:2:1679 -6276:2:1683 -6277:2:1684 -6278:2:1678 -6279:2:1679 -6280:2:1680 -6281:2:1692 -6282:2:1697 -6283:2:1701 -6284:2:1702 -6285:2:1709 -6286:2:1710 -6287:2:1721 -6288:2:1722 -6289:2:1723 -6290:2:1721 -6291:2:1722 -6292:2:1723 -6293:2:1734 -6294:2:1739 -6295:2:1740 -6296:0:4365 -6297:3:2747 -6298:0:4365 -6299:2:1752 -6300:0:4365 -6301:3:2746 -6302:0:4365 -6303:2:1754 -6304:0:4365 -6305:3:2747 -6306:0:4365 -6307:2:1755 -6308:2:1759 -6309:2:1760 -6310:2:1768 -6311:2:1769 -6312:2:1773 -6313:2:1774 -6314:2:1768 -6315:2:1769 -6316:2:1773 -6317:2:1774 -6318:2:1782 -6319:2:1787 -6320:2:1791 -6321:2:1792 -6322:2:1799 -6323:2:1800 -6324:2:1811 -6325:2:1812 -6326:2:1813 -6327:2:1811 -6328:2:1812 -6329:2:1813 -6330:2:1824 -6331:2:1829 -6332:2:1830 -6333:0:4365 -6334:2:1842 -6335:0:4365 -6336:3:2746 -6337:0:4365 -6338:2:1844 -6339:0:4365 -6340:3:2747 -6341:0:4365 -6342:2:1845 -6343:2:1849 -6344:2:1850 -6345:2:1858 -6346:2:1859 -6347:2:1863 -6348:2:1864 -6349:2:1858 -6350:2:1859 -6351:2:1863 -6352:2:1864 -6353:2:1872 -6354:2:1877 -6355:2:1881 -6356:2:1882 -6357:2:1889 -6358:2:1890 -6359:2:1901 -6360:2:1902 -6361:2:1903 -6362:2:1901 -6363:2:1902 -6364:2:1903 -6365:2:1914 -6366:2:1919 -6367:2:1920 -6368:0:4365 -6369:2:1932 -6370:0:4365 -6371:3:2746 -6372:0:4365 -6373:2:1934 -6374:0:4365 -6375:3:2747 -6376:0:4365 -6377:2:1935 -6378:0:4365 -6379:2:1936 -6380:0:4365 -6381:2:2129 -6382:0:4365 -6383:2:2130 -6384:0:4365 -6385:2:2134 -6386:0:4365 -6387:3:2746 -6388:0:4365 -6389:2:2136 -6390:0:4365 -6391:3:2747 -6392:0:4365 -6393:2:2137 -6394:2:2141 -6395:2:2142 -6396:2:2150 -6397:2:2151 -6398:2:2155 -6399:2:2156 -6400:2:2150 -6401:2:2151 -6402:2:2155 -6403:2:2156 -6404:2:2164 -6405:2:2169 -6406:2:2173 -6407:2:2174 -6408:2:2181 -6409:2:2182 -6410:2:2193 -6411:2:2194 -6412:2:2195 -6413:2:2193 -6414:2:2194 -6415:2:2195 -6416:2:2206 -6417:2:2211 -6418:2:2212 -6419:0:4365 -6420:2:2224 -6421:0:4365 -6422:3:2746 -6423:0:4365 -6424:2:2226 -6425:0:4365 -6426:3:2747 -6427:0:4365 -6428:2:2230 -6429:0:4365 -6430:3:2746 -6431:0:4365 -6432:2:2235 -6433:2:2239 -6434:2:2240 -6435:2:2248 -6436:2:2249 -6437:2:2253 -6438:2:2254 -6439:2:2248 -6440:2:2249 -6441:2:2250 -6442:2:2262 -6443:2:2267 -6444:2:2271 -6445:2:2272 -6446:2:2279 -6447:2:2280 -6448:2:2291 -6449:2:2292 -6450:2:2293 -6451:2:2291 -6452:2:2292 -6453:2:2293 -6454:2:2304 -6455:2:2309 -6456:2:2310 -6457:0:4365 -6458:3:2747 -6459:0:4365 -6460:2:2322 -6461:0:4365 -6462:2:1169 -6463:0:4365 -6464:3:2746 -6465:0:4365 -6466:2:1170 -6467:0:4365 -6468:3:2747 -6469:0:4365 -6470:3:2748 -6471:0:4365 -6472:3:2754 -6473:0:4365 -6474:3:2755 -6475:3:2759 -6476:3:2760 -6477:3:2768 -6478:3:2769 -6479:3:2773 -6480:3:2774 -6481:3:2768 -6482:3:2769 -6483:3:2773 -6484:3:2774 -6485:3:2782 -6486:3:2787 -6487:3:2791 -6488:3:2792 -6489:3:2799 -6490:3:2800 -6491:3:2811 -6492:3:2812 -6493:3:2813 -6494:3:2811 -6495:3:2812 -6496:3:2813 -6497:3:2824 -6498:3:2829 -6499:3:2830 -6500:0:4365 -6501:3:2842 -6502:0:4365 -6503:3:2843 -6504:0:4365 -6505:2:1173 -6506:0:4365 -6507:3:2844 -6508:0:4365 -6509:2:1179 -6510:0:4365 -6511:2:1180 -6512:0:4365 -6513:3:2843 -6514:0:4365 -6515:2:1181 -6516:2:1185 -6517:2:1186 -6518:2:1194 -6519:2:1195 -6520:2:1199 -6521:2:1200 -6522:2:1194 -6523:2:1195 -6524:2:1199 -6525:2:1200 -6526:2:1208 -6527:2:1213 -6528:2:1217 -6529:2:1218 -6530:2:1225 -6531:2:1226 -6532:2:1237 -6533:2:1238 -6534:2:1239 -6535:2:1237 -6536:2:1238 -6537:2:1239 -6538:2:1250 -6539:2:1255 -6540:2:1256 -6541:0:4365 -6542:3:2844 -6543:0:4365 -6544:2:1268 -6545:0:4365 -6546:3:2843 -6547:0:4365 -6548:2:1270 -6549:0:4365 -6550:3:2844 -6551:0:4365 -6552:2:1271 -6553:2:1275 -6554:2:1276 -6555:2:1284 -6556:2:1285 -6557:2:1289 -6558:2:1290 -6559:2:1284 -6560:2:1285 -6561:2:1289 -6562:2:1290 -6563:2:1298 -6564:2:1303 -6565:2:1307 -6566:2:1308 -6567:2:1315 -6568:2:1316 -6569:2:1327 -6570:2:1328 -6571:2:1329 -6572:2:1327 -6573:2:1328 -6574:2:1329 -6575:2:1340 -6576:2:1345 -6577:2:1346 -6578:0:4365 -6579:2:1358 -6580:0:4365 -6581:2:1360 -6582:0:4365 -6583:3:2843 -6584:0:4365 -6585:2:1361 -6586:0:4365 -6587:3:2844 -6588:0:4365 -6589:2:1362 -6590:2:1366 -6591:2:1367 -6592:2:1375 -6593:2:1376 -6594:2:1380 -6595:2:1381 -6596:2:1375 -6597:2:1376 -6598:2:1380 -6599:2:1381 -6600:2:1389 -6601:2:1394 -6602:2:1398 -6603:2:1399 -6604:2:1406 -6605:2:1407 -6606:2:1418 -6607:2:1419 -6608:2:1420 -6609:2:1418 -6610:2:1419 -6611:2:1420 -6612:2:1431 -6613:2:1436 -6614:2:1437 -6615:0:4365 -6616:2:1449 -6617:0:4365 -6618:3:2843 -6619:0:4365 -6620:2:1451 -6621:0:4365 -6622:3:2844 -6623:0:4365 -6624:2:1652 -6625:0:4365 -6626:2:1653 -6627:0:4365 -6628:2:1657 -6629:0:4365 -6630:2:1660 -6631:0:4365 -6632:3:2843 -6633:0:4365 -6634:2:1665 -6635:2:1669 -6636:2:1670 -6637:2:1678 -6638:2:1679 -6639:2:1683 -6640:2:1684 -6641:2:1678 -6642:2:1679 -6643:2:1680 -6644:2:1692 -6645:2:1697 -6646:2:1701 -6647:2:1702 -6648:2:1709 -6649:2:1710 -6650:2:1721 -6651:2:1722 -6652:2:1723 -6653:2:1721 -6654:2:1722 -6655:2:1723 -6656:2:1734 -6657:2:1739 -6658:2:1740 -6659:0:4365 -6660:3:2844 -6661:0:4365 -6662:2:1752 -6663:0:4365 -6664:3:2843 -6665:0:4365 -6666:2:1754 -6667:0:4365 -6668:3:2844 -6669:0:4365 -6670:2:1755 -6671:2:1759 -6672:2:1760 -6673:2:1768 -6674:2:1769 -6675:2:1773 -6676:2:1774 -6677:2:1768 -6678:2:1769 -6679:2:1773 -6680:2:1774 -6681:2:1782 -6682:2:1787 -6683:2:1791 -6684:2:1792 -6685:2:1799 -6686:2:1800 -6687:2:1811 -6688:2:1812 -6689:2:1813 -6690:2:1811 -6691:2:1812 -6692:2:1813 -6693:2:1824 -6694:2:1829 -6695:2:1830 -6696:0:4365 -6697:2:1842 -6698:0:4365 -6699:3:2843 -6700:0:4365 -6701:2:1844 -6702:0:4365 -6703:3:2844 -6704:0:4365 -6705:2:1845 -6706:2:1849 -6707:2:1850 -6708:2:1858 -6709:2:1859 -6710:2:1863 -6711:2:1864 -6712:2:1858 -6713:2:1859 -6714:2:1863 -6715:2:1864 -6716:2:1872 -6717:2:1877 -6718:2:1881 -6719:2:1882 -6720:2:1889 -6721:2:1890 -6722:2:1901 -6723:2:1902 -6724:2:1903 -6725:2:1901 -6726:2:1902 -6727:2:1903 -6728:2:1914 -6729:2:1919 -6730:2:1920 -6731:0:4365 -6732:2:1932 -6733:0:4365 -6734:3:2843 -6735:0:4365 -6736:2:1934 -6737:0:4365 -6738:3:2844 -6739:0:4365 -6740:2:1935 -6741:0:4365 -6742:2:1936 -6743:0:4365 -6744:2:2129 -6745:0:4365 -6746:2:2130 -6747:0:4365 -6748:2:2134 -6749:0:4365 -6750:3:2843 -6751:0:4365 -6752:2:2136 -6753:0:4365 -6754:3:2844 -6755:0:4365 -6756:2:2137 -6757:2:2141 -6758:2:2142 -6759:2:2150 -6760:2:2151 -6761:2:2155 -6762:2:2156 -6763:2:2150 -6764:2:2151 -6765:2:2155 -6766:2:2156 -6767:2:2164 -6768:2:2169 -6769:2:2173 -6770:2:2174 -6771:2:2181 -6772:2:2182 -6773:2:2193 -6774:2:2194 -6775:2:2195 -6776:2:2193 -6777:2:2194 -6778:2:2195 -6779:2:2206 -6780:2:2211 -6781:2:2212 -6782:0:4365 -6783:2:2224 -6784:0:4365 -6785:3:2843 -6786:0:4365 -6787:2:2226 -6788:0:4365 -6789:3:2844 -6790:0:4365 -6791:2:2230 -6792:0:4365 -6793:3:2843 -6794:0:4365 -6795:2:2235 -6796:2:2239 -6797:2:2240 -6798:2:2248 -6799:2:2249 -6800:2:2253 -6801:2:2254 -6802:2:2248 -6803:2:2249 -6804:2:2250 -6805:2:2262 -6806:2:2267 -6807:2:2271 -6808:2:2272 -6809:2:2279 -6810:2:2280 -6811:2:2291 -6812:2:2292 -6813:2:2293 -6814:2:2291 -6815:2:2292 -6816:2:2293 -6817:2:2304 -6818:2:2309 -6819:2:2310 -6820:0:4365 -6821:3:2844 -6822:0:4365 -6823:2:2322 -6824:0:4365 -6825:2:1169 -6826:0:4365 -6827:3:2843 -6828:0:4365 -6829:2:1170 -6830:0:4365 -6831:3:2844 -6832:0:4365 -6833:3:2845 -6834:0:4365 -6835:3:2851 -6836:0:4365 -6837:3:2854 -6838:3:2855 -6839:3:2867 -6840:3:2868 -6841:3:2872 -6842:3:2873 -6843:3:2867 -6844:3:2868 -6845:3:2872 -6846:3:2873 -6847:3:2881 -6848:3:2886 -6849:3:2890 -6850:3:2891 -6851:3:2898 -6852:3:2899 -6853:3:2910 -6854:3:2911 -6855:3:2912 -6856:3:2910 -6857:3:2911 -6858:3:2912 -6859:3:2923 -6860:3:2928 -6861:3:2929 -6862:0:4365 -6863:3:2941 -6864:0:4365 -6865:3:2942 -6866:0:4365 -6867:2:1173 -6868:0:4365 -6869:3:2943 -6870:0:4365 -6871:2:1179 -6872:0:4365 -6873:2:1180 -6874:0:4365 -6875:3:2942 -6876:0:4365 -6877:2:1181 -6878:2:1185 -6879:2:1186 -6880:2:1194 -6881:2:1195 -6882:2:1199 -6883:2:1200 -6884:2:1194 -6885:2:1195 -6886:2:1199 -6887:2:1200 -6888:2:1208 -6889:2:1213 -6890:2:1217 -6891:2:1218 -6892:2:1225 -6893:2:1226 -6894:2:1237 -6895:2:1238 -6896:2:1239 -6897:2:1237 -6898:2:1238 -6899:2:1239 -6900:2:1250 -6901:2:1255 -6902:2:1256 -6903:0:4365 -6904:3:2943 -6905:0:4365 -6906:2:1268 -6907:0:4365 -6908:3:2942 -6909:0:4365 -6910:2:1270 -6911:0:4365 -6912:3:2943 -6913:0:4365 -6914:2:1271 -6915:2:1275 -6916:2:1276 -6917:2:1284 -6918:2:1285 -6919:2:1289 -6920:2:1290 -6921:2:1284 -6922:2:1285 -6923:2:1289 -6924:2:1290 -6925:2:1298 -6926:2:1303 -6927:2:1307 -6928:2:1308 -6929:2:1315 -6930:2:1316 -6931:2:1327 -6932:2:1328 -6933:2:1329 -6934:2:1327 -6935:2:1328 -6936:2:1329 -6937:2:1340 -6938:2:1345 -6939:2:1346 -6940:0:4365 -6941:2:1358 -6942:0:4365 -6943:2:1360 -6944:0:4365 -6945:3:2942 -6946:0:4365 -6947:2:1361 -6948:0:4365 -6949:3:2943 -6950:0:4365 -6951:2:1362 -6952:2:1366 -6953:2:1367 -6954:2:1375 -6955:2:1376 -6956:2:1380 -6957:2:1381 -6958:2:1375 -6959:2:1376 -6960:2:1380 -6961:2:1381 -6962:2:1389 -6963:2:1394 -6964:2:1398 -6965:2:1399 -6966:2:1406 -6967:2:1407 -6968:2:1418 -6969:2:1419 -6970:2:1420 -6971:2:1418 -6972:2:1419 -6973:2:1420 -6974:2:1431 -6975:2:1436 -6976:2:1437 -6977:0:4365 -6978:2:1449 -6979:0:4365 -6980:3:2942 -6981:0:4365 -6982:2:1451 -6983:0:4365 -6984:3:2943 -6985:0:4365 -6986:2:1652 -6987:0:4365 -6988:2:1653 -6989:0:4365 -6990:2:1657 -6991:0:4365 -6992:2:1660 -6993:0:4365 -6994:3:2942 -6995:0:4365 -6996:2:1665 -6997:2:1669 -6998:2:1670 -6999:2:1678 -7000:2:1679 -7001:2:1683 -7002:2:1684 -7003:2:1678 -7004:2:1679 -7005:2:1680 -7006:2:1692 -7007:2:1697 -7008:2:1701 -7009:2:1702 -7010:2:1709 -7011:2:1710 -7012:2:1721 -7013:2:1722 -7014:2:1723 -7015:2:1721 -7016:2:1722 -7017:2:1723 -7018:2:1734 -7019:2:1739 -7020:2:1740 -7021:0:4365 -7022:3:2943 -7023:0:4365 -7024:2:1752 -7025:0:4365 -7026:3:2942 -7027:0:4365 -7028:2:1754 -7029:0:4365 -7030:3:2943 -7031:0:4365 -7032:2:1755 -7033:2:1759 -7034:2:1760 -7035:2:1768 -7036:2:1769 -7037:2:1773 -7038:2:1774 -7039:2:1768 -7040:2:1769 -7041:2:1773 -7042:2:1774 -7043:2:1782 -7044:2:1787 -7045:2:1791 -7046:2:1792 -7047:2:1799 -7048:2:1800 -7049:2:1811 -7050:2:1812 -7051:2:1813 -7052:2:1811 -7053:2:1812 -7054:2:1813 -7055:2:1824 -7056:2:1829 -7057:2:1830 -7058:0:4365 -7059:2:1842 -7060:0:4365 -7061:3:2942 -7062:0:4365 -7063:2:1844 -7064:0:4365 -7065:3:2943 -7066:0:4365 -7067:2:1845 -7068:2:1849 -7069:2:1850 -7070:2:1858 -7071:2:1859 -7072:2:1863 -7073:2:1864 -7074:2:1858 -7075:2:1859 -7076:2:1863 -7077:2:1864 -7078:2:1872 -7079:2:1877 -7080:2:1881 -7081:2:1882 -7082:2:1889 -7083:2:1890 -7084:2:1901 -7085:2:1902 -7086:2:1903 -7087:2:1901 -7088:2:1902 -7089:2:1903 -7090:2:1914 -7091:2:1919 -7092:2:1920 -7093:0:4365 -7094:2:1932 -7095:0:4365 -7096:3:2942 -7097:0:4365 -7098:2:1934 -7099:0:4365 -7100:3:2943 -7101:0:4365 -7102:2:1935 -7103:0:4365 -7104:2:1936 -7105:0:4365 -7106:2:2129 -7107:0:4365 -7108:2:2130 -7109:0:4365 -7110:2:2134 -7111:0:4365 -7112:3:2942 -7113:0:4365 -7114:2:2136 -7115:0:4365 -7116:3:2943 -7117:0:4365 -7118:2:2137 -7119:2:2141 -7120:2:2142 -7121:2:2150 -7122:2:2151 -7123:2:2155 -7124:2:2156 -7125:2:2150 -7126:2:2151 -7127:2:2155 -7128:2:2156 -7129:2:2164 -7130:2:2169 -7131:2:2173 -7132:2:2174 -7133:2:2181 -7134:2:2182 -7135:2:2193 -7136:2:2194 -7137:2:2195 -7138:2:2193 -7139:2:2194 -7140:2:2195 -7141:2:2206 -7142:2:2211 -7143:2:2212 -7144:0:4365 -7145:2:2224 -7146:0:4365 -7147:3:2942 -7148:0:4365 -7149:2:2226 -7150:0:4365 -7151:3:2943 -7152:0:4365 -7153:2:2230 -7154:0:4365 -7155:3:2942 -7156:0:4365 -7157:2:2235 -7158:2:2239 -7159:2:2240 -7160:2:2248 -7161:2:2249 -7162:2:2253 -7163:2:2254 -7164:2:2248 -7165:2:2249 -7166:2:2250 -7167:2:2262 -7168:2:2267 -7169:2:2271 -7170:2:2272 -7171:2:2279 -7172:2:2280 -7173:2:2291 -7174:2:2292 -7175:2:2293 -7176:2:2291 -7177:2:2292 -7178:2:2293 -7179:2:2304 -7180:2:2309 -7181:2:2310 -7182:0:4365 -7183:3:2943 -7184:0:4365 -7185:2:2322 -7186:0:4365 -7187:2:1169 -7188:0:4365 -7189:3:2942 -7190:0:4365 -7191:2:1170 -7192:0:4365 -7193:3:2943 -7194:0:4365 -7195:3:2944 -7196:0:4365 -7197:3:2950 -7198:0:4365 -7199:3:2951 -7200:0:4365 -7201:3:2952 -7202:0:4365 -7203:3:2953 -7204:0:4365 -7205:3:2954 -7206:3:2958 -7207:3:2959 -7208:3:2967 -7209:3:2968 -7210:3:2972 -7211:3:2973 -7212:3:2967 -7213:3:2968 -7214:3:2972 -7215:3:2973 -7216:3:2981 -7217:3:2986 -7218:3:2990 -7219:3:2991 -7220:3:2998 -7221:3:2999 -7222:3:3010 -7223:3:3011 -7224:3:3012 -7225:3:3010 -7226:3:3011 -7227:3:3012 -7228:3:3023 -7229:3:3028 -7230:3:3029 -7231:0:4365 -7232:3:3041 -7233:0:4365 -7234:3:3042 -7235:0:4365 -7236:2:1173 -7237:0:4365 -7238:3:3043 -7239:0:4365 -7240:2:1179 -7241:0:4365 -7242:2:1180 -7243:0:4365 -7244:3:3042 -7245:0:4365 -7246:2:1181 -7247:2:1185 -7248:2:1186 -7249:2:1194 -7250:2:1195 -7251:2:1199 -7252:2:1200 -7253:2:1194 -7254:2:1195 -7255:2:1199 -7256:2:1200 -7257:2:1208 -7258:2:1213 -7259:2:1217 -7260:2:1218 -7261:2:1225 -7262:2:1226 -7263:2:1237 -7264:2:1238 -7265:2:1239 -7266:2:1237 -7267:2:1238 -7268:2:1239 -7269:2:1250 -7270:2:1255 -7271:2:1256 -7272:0:4365 -7273:3:3043 -7274:0:4365 -7275:2:1268 -7276:0:4365 -7277:3:3042 -7278:0:4365 -7279:2:1270 -7280:0:4365 -7281:3:3043 -7282:0:4365 -7283:2:1271 -7284:2:1275 -7285:2:1276 -7286:2:1284 -7287:2:1285 -7288:2:1289 -7289:2:1290 -7290:2:1284 -7291:2:1285 -7292:2:1289 -7293:2:1290 -7294:2:1298 -7295:2:1303 -7296:2:1307 -7297:2:1308 -7298:2:1315 -7299:2:1316 -7300:2:1327 -7301:2:1328 -7302:2:1329 -7303:2:1327 -7304:2:1328 -7305:2:1329 -7306:2:1340 -7307:2:1345 -7308:2:1346 -7309:0:4365 -7310:2:1358 -7311:0:4365 -7312:2:1360 -7313:0:4365 -7314:3:3042 -7315:0:4365 -7316:2:1361 -7317:0:4365 -7318:3:3043 -7319:0:4365 -7320:2:1362 -7321:2:1366 -7322:2:1367 -7323:2:1375 -7324:2:1376 -7325:2:1380 -7326:2:1381 -7327:2:1375 -7328:2:1376 -7329:2:1380 -7330:2:1381 -7331:2:1389 -7332:2:1394 -7333:2:1398 -7334:2:1399 -7335:2:1406 -7336:2:1407 -7337:2:1418 -7338:2:1419 -7339:2:1420 -7340:2:1418 -7341:2:1419 -7342:2:1420 -7343:2:1431 -7344:2:1436 -7345:2:1437 -7346:0:4365 -7347:2:1449 -7348:0:4365 -7349:3:3042 -7350:0:4365 -7351:2:1451 -7352:0:4365 -7353:3:3043 -7354:0:4365 -7355:2:1652 -7356:0:4365 -7357:2:1653 -7358:0:4365 -7359:2:1657 -7360:0:4365 -7361:2:1660 -7362:0:4365 -7363:3:3042 -7364:0:4365 -7365:2:1665 -7366:2:1669 -7367:2:1670 -7368:2:1678 -7369:2:1679 -7370:2:1683 -7371:2:1684 -7372:2:1678 -7373:2:1679 -7374:2:1680 -7375:2:1692 -7376:2:1697 -7377:2:1701 -7378:2:1702 -7379:2:1709 -7380:2:1710 -7381:2:1721 -7382:2:1722 -7383:2:1723 -7384:2:1721 -7385:2:1722 -7386:2:1723 -7387:2:1734 -7388:2:1739 -7389:2:1740 -7390:0:4365 -7391:3:3043 -7392:0:4365 -7393:2:1752 -7394:0:4365 -7395:3:3042 -7396:0:4365 -7397:2:1754 -7398:0:4365 -7399:3:3043 -7400:0:4365 -7401:2:1755 -7402:2:1759 -7403:2:1760 -7404:2:1768 -7405:2:1769 -7406:2:1773 -7407:2:1774 -7408:2:1768 -7409:2:1769 -7410:2:1773 -7411:2:1774 -7412:2:1782 -7413:2:1787 -7414:2:1791 -7415:2:1792 -7416:2:1799 -7417:2:1800 -7418:2:1811 -7419:2:1812 -7420:2:1813 -7421:2:1811 -7422:2:1812 -7423:2:1813 -7424:2:1824 -7425:2:1829 -7426:2:1830 -7427:0:4365 -7428:2:1842 -7429:0:4365 -7430:3:3042 -7431:0:4365 -7432:2:1844 -7433:0:4365 -7434:3:3043 -7435:0:4365 -7436:2:1845 -7437:2:1849 -7438:2:1850 -7439:2:1858 -7440:2:1859 -7441:2:1863 -7442:2:1864 -7443:2:1858 -7444:2:1859 -7445:2:1863 -7446:2:1864 -7447:2:1872 -7448:2:1877 -7449:2:1881 -7450:2:1882 -7451:2:1889 -7452:2:1890 -7453:2:1901 -7454:2:1902 -7455:2:1903 -7456:2:1901 -7457:2:1902 -7458:2:1903 -7459:2:1914 -7460:2:1919 -7461:2:1920 -7462:0:4365 -7463:2:1932 -7464:0:4365 -7465:3:3042 -7466:0:4365 -7467:2:1934 -7468:0:4365 -7469:3:3043 -7470:0:4365 -7471:2:1935 -7472:0:4365 -7473:2:1936 -7474:0:4365 -7475:2:2129 -7476:0:4365 -7477:2:2130 -7478:0:4365 -7479:2:2134 -7480:0:4365 -7481:3:3042 -7482:0:4365 -7483:2:2136 -7484:0:4365 -7485:3:3043 -7486:0:4365 -7487:2:2137 -7488:2:2141 -7489:2:2142 -7490:2:2150 -7491:2:2151 -7492:2:2155 -7493:2:2156 -7494:2:2150 -7495:2:2151 -7496:2:2155 -7497:2:2156 -7498:2:2164 -7499:2:2169 -7500:2:2173 -7501:2:2174 -7502:2:2181 -7503:2:2182 -7504:2:2193 -7505:2:2194 -7506:2:2195 -7507:2:2193 -7508:2:2194 -7509:2:2195 -7510:2:2206 -7511:2:2211 -7512:2:2212 -7513:0:4365 -7514:2:2224 -7515:0:4365 -7516:3:3042 -7517:0:4365 -7518:2:2226 -7519:0:4365 -7520:3:3043 -7521:0:4365 -7522:2:2230 -7523:0:4365 -7524:3:3042 -7525:0:4365 -7526:2:2235 -7527:2:2239 -7528:2:2240 -7529:2:2248 -7530:2:2249 -7531:2:2253 -7532:2:2254 -7533:2:2248 -7534:2:2249 -7535:2:2250 -7536:2:2262 -7537:2:2267 -7538:2:2271 -7539:2:2272 -7540:2:2279 -7541:2:2280 -7542:2:2291 -7543:2:2292 -7544:2:2293 -7545:2:2291 -7546:2:2292 -7547:2:2293 -7548:2:2304 -7549:2:2309 -7550:2:2310 -7551:0:4365 -7552:3:3043 -7553:0:4365 -7554:2:2322 -7555:0:4365 -7556:2:1169 -7557:0:4365 -7558:3:3042 -7559:0:4365 -7560:2:1170 -7561:0:4365 -7562:3:3043 -7563:0:4365 -7564:3:3044 -7565:0:4365 -7566:3:3257 -7567:0:4365 -7568:3:3265 -7569:0:4365 -7570:3:3266 -7571:3:3270 -7572:3:3271 -7573:3:3279 -7574:3:3280 -7575:3:3284 -7576:3:3285 -7577:3:3279 -7578:3:3280 -7579:3:3284 -7580:3:3285 -7581:3:3293 -7582:3:3298 -7583:3:3302 -7584:3:3303 -7585:3:3310 -7586:3:3311 -7587:3:3322 -7588:3:3323 -7589:3:3324 -7590:3:3322 -7591:3:3323 -7592:3:3324 -7593:3:3335 -7594:3:3340 -7595:3:3341 -7596:0:4365 -7597:3:3353 -7598:0:4365 -7599:3:3354 -7600:0:4365 -7601:2:1173 -7602:0:4365 -7603:3:3355 -7604:0:4365 -7605:2:1179 -7606:0:4365 -7607:2:1180 -7608:0:4365 -7609:3:3354 -7610:0:4365 -7611:2:1181 -7612:2:1185 -7613:2:1186 -7614:2:1194 -7615:2:1195 -7616:2:1199 -7617:2:1200 -7618:2:1194 -7619:2:1195 -7620:2:1199 -7621:2:1200 -7622:2:1208 -7623:2:1213 -7624:2:1217 -7625:2:1218 -7626:2:1225 -7627:2:1226 -7628:2:1237 -7629:2:1238 -7630:2:1239 -7631:2:1237 -7632:2:1238 -7633:2:1239 -7634:2:1250 -7635:2:1255 -7636:2:1256 -7637:0:4365 -7638:3:3355 -7639:0:4365 -7640:2:1268 -7641:0:4365 -7642:3:3354 -7643:0:4365 -7644:2:1270 -7645:0:4365 -7646:3:3355 -7647:0:4365 -7648:2:1271 -7649:2:1275 -7650:2:1276 -7651:2:1284 -7652:2:1285 -7653:2:1289 -7654:2:1290 -7655:2:1284 -7656:2:1285 -7657:2:1289 -7658:2:1290 -7659:2:1298 -7660:2:1303 -7661:2:1307 -7662:2:1308 -7663:2:1315 -7664:2:1316 -7665:2:1327 -7666:2:1328 -7667:2:1329 -7668:2:1327 -7669:2:1328 -7670:2:1329 -7671:2:1340 -7672:2:1345 -7673:2:1346 -7674:0:4365 -7675:2:1358 -7676:0:4365 -7677:2:1360 -7678:0:4365 -7679:3:3354 -7680:0:4365 -7681:2:1361 -7682:0:4365 -7683:3:3355 -7684:0:4365 -7685:2:1362 -7686:2:1366 -7687:2:1367 -7688:2:1375 -7689:2:1376 -7690:2:1380 -7691:2:1381 -7692:2:1375 -7693:2:1376 -7694:2:1380 -7695:2:1381 -7696:2:1389 -7697:2:1394 -7698:2:1398 -7699:2:1399 -7700:2:1406 -7701:2:1407 -7702:2:1418 -7703:2:1419 -7704:2:1420 -7705:2:1418 -7706:2:1419 -7707:2:1420 -7708:2:1431 -7709:2:1436 -7710:2:1437 -7711:0:4365 -7712:2:1449 -7713:0:4365 -7714:3:3354 -7715:0:4365 -7716:2:1451 -7717:0:4365 -7718:3:3355 -7719:0:4365 -7720:2:1652 -7721:0:4365 -7722:2:1653 -7723:0:4365 -7724:2:1657 -7725:0:4365 -7726:2:1660 -7727:0:4365 -7728:3:3354 -7729:0:4365 -7730:2:1665 -7731:2:1669 -7732:2:1670 -7733:2:1678 -7734:2:1679 -7735:2:1683 -7736:2:1684 -7737:2:1678 -7738:2:1679 -7739:2:1680 -7740:2:1692 -7741:2:1697 -7742:2:1701 -7743:2:1702 -7744:2:1709 -7745:2:1710 -7746:2:1721 -7747:2:1722 -7748:2:1723 -7749:2:1721 -7750:2:1722 -7751:2:1723 -7752:2:1734 -7753:2:1739 -7754:2:1740 -7755:0:4365 -7756:3:3355 -7757:0:4365 -7758:2:1752 -7759:0:4365 -7760:3:3354 -7761:0:4365 -7762:2:1754 -7763:0:4365 -7764:3:3355 -7765:0:4365 -7766:2:1755 -7767:2:1759 -7768:2:1760 -7769:2:1768 -7770:2:1769 -7771:2:1773 -7772:2:1774 -7773:2:1768 -7774:2:1769 -7775:2:1773 -7776:2:1774 -7777:2:1782 -7778:2:1787 -7779:2:1791 -7780:2:1792 -7781:2:1799 -7782:2:1800 -7783:2:1811 -7784:2:1812 -7785:2:1813 -7786:2:1811 -7787:2:1812 -7788:2:1813 -7789:2:1824 -7790:2:1829 -7791:2:1830 -7792:0:4365 -7793:2:1842 -7794:0:4365 -7795:3:3354 -7796:0:4365 -7797:2:1844 -7798:0:4365 -7799:3:3355 -7800:0:4365 -7801:2:1845 -7802:2:1849 -7803:2:1850 -7804:2:1858 -7805:2:1859 -7806:2:1863 -7807:2:1864 -7808:2:1858 -7809:2:1859 -7810:2:1863 -7811:2:1864 -7812:2:1872 -7813:2:1877 -7814:2:1881 -7815:2:1882 -7816:2:1889 -7817:2:1890 -7818:2:1901 -7819:2:1902 -7820:2:1903 -7821:2:1901 -7822:2:1902 -7823:2:1903 -7824:2:1914 -7825:2:1919 -7826:2:1920 -7827:0:4365 -7828:2:1932 -7829:0:4365 -7830:3:3354 -7831:0:4365 -7832:2:1934 -7833:0:4365 -7834:3:3355 -7835:0:4365 -7836:2:1935 -7837:0:4365 -7838:2:1936 -7839:0:4365 -7840:2:2129 -7841:0:4365 -7842:2:2130 -7843:0:4365 -7844:2:2134 -7845:0:4365 -7846:3:3354 -7847:0:4365 -7848:2:2136 -7849:0:4365 -7850:3:3355 -7851:0:4365 -7852:2:2137 -7853:2:2141 -7854:2:2142 -7855:2:2150 -7856:2:2151 -7857:2:2155 -7858:2:2156 -7859:2:2150 -7860:2:2151 -7861:2:2155 -7862:2:2156 -7863:2:2164 -7864:2:2169 -7865:2:2173 -7866:2:2174 -7867:2:2181 -7868:2:2182 -7869:2:2193 -7870:2:2194 -7871:2:2195 -7872:2:2193 -7873:2:2194 -7874:2:2195 -7875:2:2206 -7876:2:2211 -7877:2:2212 -7878:0:4365 -7879:2:2224 -7880:0:4365 -7881:3:3354 -7882:0:4365 -7883:2:2226 -7884:0:4365 -7885:3:3355 -7886:0:4365 -7887:2:2230 -7888:0:4365 -7889:3:3354 -7890:0:4365 -7891:2:2235 -7892:2:2239 -7893:2:2240 -7894:2:2248 -7895:2:2249 -7896:2:2253 -7897:2:2254 -7898:2:2248 -7899:2:2249 -7900:2:2250 -7901:2:2262 -7902:2:2267 -7903:2:2271 -7904:2:2272 -7905:2:2279 -7906:2:2280 -7907:2:2291 -7908:2:2292 -7909:2:2293 -7910:2:2291 -7911:2:2292 -7912:2:2293 -7913:2:2304 -7914:2:2309 -7915:2:2310 -7916:0:4365 -7917:3:3355 -7918:0:4365 -7919:2:2322 -7920:0:4365 -7921:2:1169 -7922:0:4365 -7923:3:3354 -7924:0:4365 -7925:2:1170 -7926:0:4365 -7927:3:3355 -7928:0:4365 -7929:3:3356 -7930:0:4365 -7931:3:3366 -7932:0:4365 -7933:3:2951 -7934:0:4365 -7935:3:2952 -7936:0:4365 -7937:3:2953 -7938:0:4365 -7939:3:2954 -7940:3:2958 -7941:3:2959 -7942:3:2967 -7943:3:2968 -7944:3:2972 -7945:3:2973 -7946:3:2967 -7947:3:2968 -7948:3:2972 -7949:3:2973 -7950:3:2981 -7951:3:2986 -7952:3:2990 -7953:3:2991 -7954:3:2998 -7955:3:2999 -7956:3:3010 -7957:3:3011 -7958:3:3012 -7959:3:3010 -7960:3:3011 -7961:3:3012 -7962:3:3023 -7963:3:3028 -7964:3:3029 -7965:0:4365 -7966:3:3041 -7967:0:4365 -7968:3:3042 -7969:0:4365 -7970:2:1173 -7971:0:4365 -7972:3:3043 -7973:0:4365 -7974:2:1179 -7975:0:4365 -7976:2:1180 -7977:0:4365 -7978:3:3042 -7979:0:4365 -7980:2:1181 -7981:2:1185 -7982:2:1186 -7983:2:1194 -7984:2:1195 -7985:2:1199 -7986:2:1200 -7987:2:1194 -7988:2:1195 -7989:2:1199 -7990:2:1200 -7991:2:1208 -7992:2:1213 -7993:2:1217 -7994:2:1218 -7995:2:1225 -7996:2:1226 -7997:2:1237 -7998:2:1238 -7999:2:1239 -8000:2:1237 -8001:2:1238 -8002:2:1239 -8003:2:1250 -8004:2:1255 -8005:2:1256 -8006:0:4365 -8007:3:3043 -8008:0:4365 -8009:2:1268 -8010:0:4365 -8011:3:3042 -8012:0:4365 -8013:2:1270 -8014:0:4365 -8015:3:3043 -8016:0:4365 -8017:2:1271 -8018:2:1275 -8019:2:1276 -8020:2:1284 -8021:2:1285 -8022:2:1289 -8023:2:1290 -8024:2:1284 -8025:2:1285 -8026:2:1289 -8027:2:1290 -8028:2:1298 -8029:2:1303 -8030:2:1307 -8031:2:1308 -8032:2:1315 -8033:2:1316 -8034:2:1327 -8035:2:1328 -8036:2:1329 -8037:2:1327 -8038:2:1328 -8039:2:1329 -8040:2:1340 -8041:2:1345 -8042:2:1346 -8043:0:4365 -8044:2:1358 -8045:0:4365 -8046:2:1360 -8047:0:4365 -8048:3:3042 -8049:0:4365 -8050:2:1361 -8051:0:4365 -8052:3:3043 -8053:0:4365 -8054:2:1362 -8055:2:1366 -8056:2:1367 -8057:2:1375 -8058:2:1376 -8059:2:1380 -8060:2:1381 -8061:2:1375 -8062:2:1376 -8063:2:1380 -8064:2:1381 -8065:2:1389 -8066:2:1394 -8067:2:1398 -8068:2:1399 -8069:2:1406 -8070:2:1407 -8071:2:1418 -8072:2:1419 -8073:2:1420 -8074:2:1418 -8075:2:1419 -8076:2:1420 -8077:2:1431 -8078:2:1436 -8079:2:1437 -8080:0:4365 -8081:2:1449 -8082:0:4365 -8083:3:3042 -8084:0:4365 -8085:2:1451 -8086:0:4365 -8087:3:3043 -8088:0:4365 -8089:2:1652 -8090:0:4365 -8091:2:1653 -8092:0:4365 -8093:2:1657 -8094:0:4365 -8095:2:1660 -8096:0:4365 -8097:3:3042 -8098:0:4365 -8099:2:1665 -8100:2:1669 -8101:2:1670 -8102:2:1678 -8103:2:1679 -8104:2:1683 -8105:2:1684 -8106:2:1678 -8107:2:1679 -8108:2:1680 -8109:2:1692 -8110:2:1697 -8111:2:1701 -8112:2:1702 -8113:2:1709 -8114:2:1710 -8115:2:1721 -8116:2:1722 -8117:2:1723 -8118:2:1721 -8119:2:1722 -8120:2:1723 -8121:2:1734 -8122:2:1739 -8123:2:1740 -8124:0:4365 -8125:3:3043 -8126:0:4365 -8127:2:1752 -8128:0:4365 -8129:3:3042 -8130:0:4365 -8131:2:1754 -8132:0:4365 -8133:3:3043 -8134:0:4365 -8135:2:1755 -8136:2:1759 -8137:2:1760 -8138:2:1768 -8139:2:1769 -8140:2:1773 -8141:2:1774 -8142:2:1768 -8143:2:1769 -8144:2:1773 -8145:2:1774 -8146:2:1782 -8147:2:1787 -8148:2:1791 -8149:2:1792 -8150:2:1799 -8151:2:1800 -8152:2:1811 -8153:2:1812 -8154:2:1813 -8155:2:1811 -8156:2:1812 -8157:2:1813 -8158:2:1824 -8159:2:1829 -8160:2:1830 -8161:0:4365 -8162:2:1842 -8163:0:4365 -8164:3:3042 -8165:0:4365 -8166:2:1844 -8167:0:4365 -8168:3:3043 -8169:0:4365 -8170:2:1845 -8171:2:1849 -8172:2:1850 -8173:2:1858 -8174:2:1859 -8175:2:1863 -8176:2:1864 -8177:2:1858 -8178:2:1859 -8179:2:1863 -8180:2:1864 -8181:2:1872 -8182:2:1877 -8183:2:1881 -8184:2:1882 -8185:2:1889 -8186:2:1890 -8187:2:1901 -8188:2:1902 -8189:2:1903 -8190:2:1901 -8191:2:1902 -8192:2:1903 -8193:2:1914 -8194:2:1919 -8195:2:1920 -8196:0:4365 -8197:2:1932 -8198:0:4365 -8199:3:3042 -8200:0:4365 -8201:2:1934 -8202:0:4365 -8203:3:3043 -8204:0:4365 -8205:2:1935 -8206:0:4365 -8207:2:1936 -8208:0:4365 -8209:2:2129 -8210:0:4365 -8211:2:2130 -8212:0:4365 -8213:2:2134 -8214:0:4365 -8215:3:3042 -8216:0:4365 -8217:2:2136 -8218:0:4365 -8219:3:3043 -8220:0:4365 -8221:2:2137 -8222:2:2141 -8223:2:2142 -8224:2:2150 -8225:2:2151 -8226:2:2155 -8227:2:2156 -8228:2:2150 -8229:2:2151 -8230:2:2155 -8231:2:2156 -8232:2:2164 -8233:2:2169 -8234:2:2173 -8235:2:2174 -8236:2:2181 -8237:2:2182 -8238:2:2193 -8239:2:2194 -8240:2:2195 -8241:2:2193 -8242:2:2194 -8243:2:2195 -8244:2:2206 -8245:2:2211 -8246:2:2212 -8247:0:4365 -8248:2:2224 -8249:0:4365 -8250:3:3042 -8251:0:4365 -8252:2:2226 -8253:0:4365 -8254:3:3043 -8255:0:4365 -8256:2:2230 -8257:0:4365 -8258:3:3042 -8259:0:4365 -8260:2:2235 -8261:2:2239 -8262:2:2240 -8263:2:2248 -8264:2:2249 -8265:2:2253 -8266:2:2254 -8267:2:2248 -8268:2:2249 -8269:2:2250 -8270:2:2262 -8271:2:2267 -8272:2:2271 -8273:2:2272 -8274:2:2279 -8275:2:2280 -8276:2:2291 -8277:2:2292 -8278:2:2293 -8279:2:2291 -8280:2:2292 -8281:2:2293 -8282:2:2304 -8283:2:2309 -8284:2:2310 -8285:0:4365 -8286:3:3043 -8287:0:4365 -8288:2:2322 -8289:0:4365 -8290:2:1169 -8291:0:4365 -8292:3:3042 -8293:0:4365 -8294:2:1170 -8295:0:4365 -8296:3:3043 -8297:0:4365 -8298:3:3044 -8299:0:4365 -8300:3:3257 -8301:0:4365 -8302:3:3362 -8303:0:4365 -8304:3:3363 -8305:0:4365 -8306:3:3367 -8307:0:4365 -8308:3:3373 -8309:3:3377 -8310:3:3378 -8311:3:3386 -8312:3:3387 -8313:3:3391 -8314:3:3392 -8315:3:3386 -8316:3:3387 -8317:3:3391 -8318:3:3392 -8319:3:3400 -8320:3:3405 -8321:3:3409 -8322:3:3410 -8323:3:3417 -8324:3:3418 -8325:3:3429 -8326:3:3430 -8327:3:3431 -8328:3:3429 -8329:3:3430 -8330:3:3431 -8331:3:3442 -8332:3:3447 -8333:3:3448 -8334:0:4365 -8335:3:3460 -8336:0:4365 -8337:3:3461 -8338:0:4365 -8339:2:1173 -8340:0:4365 -8341:3:3462 -8342:0:4365 -8343:2:1179 -8344:0:4365 -8345:2:1180 -8346:0:4365 -8347:3:3461 -8348:0:4365 -8349:2:1181 -8350:2:1185 -8351:2:1186 -8352:2:1194 -8353:2:1195 -8354:2:1199 -8355:2:1200 -8356:2:1194 -8357:2:1195 -8358:2:1199 -8359:2:1200 -8360:2:1208 -8361:2:1213 -8362:2:1217 -8363:2:1218 -8364:2:1225 -8365:2:1226 -8366:2:1237 -8367:2:1238 -8368:2:1239 -8369:2:1237 -8370:2:1238 -8371:2:1239 -8372:2:1250 -8373:2:1255 -8374:2:1256 -8375:0:4365 -8376:3:3462 -8377:0:4365 -8378:2:1268 -8379:0:4365 -8380:3:3461 -8381:0:4365 -8382:2:1270 -8383:0:4365 -8384:3:3462 -8385:0:4365 -8386:2:1271 -8387:2:1275 -8388:2:1276 -8389:2:1284 -8390:2:1285 -8391:2:1289 -8392:2:1290 -8393:2:1284 -8394:2:1285 -8395:2:1289 -8396:2:1290 -8397:2:1298 -8398:2:1303 -8399:2:1307 -8400:2:1308 -8401:2:1315 -8402:2:1316 -8403:2:1327 -8404:2:1328 -8405:2:1329 -8406:2:1327 -8407:2:1328 -8408:2:1329 -8409:2:1340 -8410:2:1345 -8411:2:1346 -8412:0:4365 -8413:2:1358 -8414:0:4365 -8415:2:1360 -8416:0:4365 -8417:3:3461 -8418:0:4365 -8419:2:1361 -8420:0:4365 -8421:3:3462 -8422:0:4365 -8423:2:1362 -8424:2:1366 -8425:2:1367 -8426:2:1375 -8427:2:1376 -8428:2:1380 -8429:2:1381 -8430:2:1375 -8431:2:1376 -8432:2:1380 -8433:2:1381 -8434:2:1389 -8435:2:1394 -8436:2:1398 -8437:2:1399 -8438:2:1406 -8439:2:1407 -8440:2:1418 -8441:2:1419 -8442:2:1420 -8443:2:1418 -8444:2:1419 -8445:2:1420 -8446:2:1431 -8447:2:1436 -8448:2:1437 -8449:0:4365 -8450:2:1449 -8451:0:4365 -8452:3:3461 -8453:0:4365 -8454:2:1451 -8455:0:4365 -8456:3:3462 -8457:0:4365 -8458:2:1652 -8459:0:4365 -8460:2:1653 -8461:0:4365 -8462:2:1657 -8463:0:4365 -8464:2:1660 -8465:0:4365 -8466:3:3461 -8467:0:4365 -8468:2:1665 -8469:2:1669 -8470:2:1670 -8471:2:1678 -8472:2:1679 -8473:2:1683 -8474:2:1684 -8475:2:1678 -8476:2:1679 -8477:2:1680 -8478:2:1692 -8479:2:1697 -8480:2:1701 -8481:2:1702 -8482:2:1709 -8483:2:1710 -8484:2:1721 -8485:2:1722 -8486:2:1723 -8487:2:1721 -8488:2:1722 -8489:2:1723 -8490:2:1734 -8491:2:1739 -8492:2:1740 -8493:0:4365 -8494:3:3462 -8495:0:4365 -8496:2:1752 -8497:0:4365 -8498:3:3461 -8499:0:4365 -8500:2:1754 -8501:0:4365 -8502:3:3462 -8503:0:4365 -8504:2:1755 -8505:2:1759 -8506:2:1760 -8507:2:1768 -8508:2:1769 -8509:2:1773 -8510:2:1774 -8511:2:1768 -8512:2:1769 -8513:2:1773 -8514:2:1774 -8515:2:1782 -8516:2:1787 -8517:2:1791 -8518:2:1792 -8519:2:1799 -8520:2:1800 -8521:2:1811 -8522:2:1812 -8523:2:1813 -8524:2:1811 -8525:2:1812 -8526:2:1813 -8527:2:1824 -8528:2:1829 -8529:2:1830 -8530:0:4365 -8531:2:1842 -8532:0:4365 -8533:3:3461 -8534:0:4365 -8535:2:1844 -8536:0:4365 -8537:3:3462 -8538:0:4365 -8539:2:1845 -8540:2:1849 -8541:2:1850 -8542:2:1858 -8543:2:1859 -8544:2:1863 -8545:2:1864 -8546:2:1858 -8547:2:1859 -8548:2:1863 -8549:2:1864 -8550:2:1872 -8551:2:1877 -8552:2:1881 -8553:2:1882 -8554:2:1889 -8555:2:1890 -8556:2:1901 -8557:2:1902 -8558:2:1903 -8559:2:1901 -8560:2:1902 -8561:2:1903 -8562:2:1914 -8563:2:1919 -8564:2:1920 -8565:0:4365 -8566:2:1932 -8567:0:4365 -8568:3:3461 -8569:0:4365 -8570:2:1934 -8571:0:4365 -8572:3:3462 -8573:0:4365 -8574:2:1935 -8575:0:4365 -8576:2:1936 -8577:0:4365 -8578:2:2129 -8579:0:4365 -8580:2:2130 -8581:0:4365 -8582:2:2134 -8583:0:4365 -8584:3:3461 -8585:0:4365 -8586:2:2136 -8587:0:4365 -8588:3:3462 -8589:0:4365 -8590:2:2137 -8591:2:2141 -8592:2:2142 -8593:2:2150 -8594:2:2151 -8595:2:2155 -8596:2:2156 -8597:2:2150 -8598:2:2151 -8599:2:2155 -8600:2:2156 -8601:2:2164 -8602:2:2169 -8603:2:2173 -8604:2:2174 -8605:2:2181 -8606:2:2182 -8607:2:2193 -8608:2:2194 -8609:2:2195 -8610:2:2193 -8611:2:2194 -8612:2:2195 -8613:2:2206 -8614:2:2211 -8615:2:2212 -8616:0:4365 -8617:2:2224 -8618:0:4365 -8619:3:3461 -8620:0:4365 -8621:2:2226 -8622:0:4365 -8623:3:3462 -8624:0:4365 -8625:2:2230 -8626:0:4365 -8627:3:3461 -8628:0:4365 -8629:2:2235 -8630:2:2239 -8631:2:2240 -8632:2:2248 -8633:2:2249 -8634:2:2253 -8635:2:2254 -8636:2:2248 -8637:2:2249 -8638:2:2250 -8639:2:2262 -8640:2:2267 -8641:2:2271 -8642:2:2272 -8643:2:2279 -8644:2:2280 -8645:2:2291 -8646:2:2292 -8647:2:2293 -8648:2:2291 -8649:2:2292 -8650:2:2293 -8651:2:2304 -8652:2:2309 -8653:2:2310 -8654:0:4365 -8655:3:3462 -8656:0:4365 -8657:2:2322 -8658:0:4365 -8659:2:1169 -8660:0:4365 -8661:3:3461 -8662:0:4365 -8663:2:1170 -8664:0:4365 -8665:3:3462 -8666:0:4365 -8667:3:3463 -8668:0:4365 -8669:3:3469 -8670:0:4365 -8671:3:3470 -8672:3:3474 -8673:3:3475 -8674:3:3483 -8675:3:3484 -8676:3:3488 -8677:3:3489 -8678:3:3483 -8679:3:3484 -8680:3:3488 -8681:3:3489 -8682:3:3497 -8683:3:3502 -8684:3:3506 -8685:3:3507 -8686:3:3514 -8687:3:3515 -8688:3:3526 -8689:3:3527 -8690:3:3528 -8691:3:3526 -8692:3:3527 -8693:3:3528 -8694:3:3539 -8695:3:3544 -8696:3:3545 -8697:0:4365 -8698:3:3557 -8699:0:4365 -8700:3:3558 -8701:0:4365 -8702:2:1173 -8703:0:4365 -8704:3:3559 -8705:0:4365 -8706:2:1179 -8707:0:4365 -8708:2:1180 -8709:0:4365 -8710:3:3558 -8711:0:4365 -8712:2:1181 -8713:2:1185 -8714:2:1186 -8715:2:1194 -8716:2:1195 -8717:2:1199 -8718:2:1200 -8719:2:1194 -8720:2:1195 -8721:2:1199 -8722:2:1200 -8723:2:1208 -8724:2:1213 -8725:2:1217 -8726:2:1218 -8727:2:1225 -8728:2:1226 -8729:2:1237 -8730:2:1238 -8731:2:1239 -8732:2:1237 -8733:2:1238 -8734:2:1239 -8735:2:1250 -8736:2:1255 -8737:2:1256 -8738:0:4365 -8739:3:3559 -8740:0:4365 -8741:2:1268 -8742:0:4365 -8743:3:3558 -8744:0:4365 -8745:2:1270 -8746:0:4365 -8747:3:3559 -8748:0:4365 -8749:2:1271 -8750:2:1275 -8751:2:1276 -8752:2:1284 -8753:2:1285 -8754:2:1289 -8755:2:1290 -8756:2:1284 -8757:2:1285 -8758:2:1289 -8759:2:1290 -8760:2:1298 -8761:2:1303 -8762:2:1307 -8763:2:1308 -8764:2:1315 -8765:2:1316 -8766:2:1327 -8767:2:1328 -8768:2:1329 -8769:2:1327 -8770:2:1328 -8771:2:1329 -8772:2:1340 -8773:2:1345 -8774:2:1346 -8775:0:4365 -8776:2:1358 -8777:0:4365 -8778:2:1360 -8779:0:4365 -8780:3:3558 -8781:0:4365 -8782:2:1361 -8783:0:4365 -8784:3:3559 -8785:0:4365 -8786:2:1362 -8787:2:1366 -8788:2:1367 -8789:2:1375 -8790:2:1376 -8791:2:1380 -8792:2:1381 -8793:2:1375 -8794:2:1376 -8795:2:1380 -8796:2:1381 -8797:2:1389 -8798:2:1394 -8799:2:1398 -8800:2:1399 -8801:2:1406 -8802:2:1407 -8803:2:1418 -8804:2:1419 -8805:2:1420 -8806:2:1418 -8807:2:1419 -8808:2:1420 -8809:2:1431 -8810:2:1436 -8811:2:1437 -8812:0:4365 -8813:2:1449 -8814:0:4365 -8815:3:3558 -8816:0:4365 -8817:2:1451 -8818:0:4365 -8819:3:3559 -8820:0:4365 -8821:2:1652 -8822:0:4365 -8823:2:1653 -8824:0:4365 -8825:2:1657 -8826:0:4365 -8827:2:1660 -8828:0:4365 -8829:3:3558 -8830:0:4365 -8831:2:1665 -8832:2:1669 -8833:2:1670 -8834:2:1678 -8835:2:1679 -8836:2:1683 -8837:2:1684 -8838:2:1678 -8839:2:1679 -8840:2:1680 -8841:2:1692 -8842:2:1697 -8843:2:1701 -8844:2:1702 -8845:2:1709 -8846:2:1710 -8847:2:1721 -8848:2:1722 -8849:2:1723 -8850:2:1721 -8851:2:1722 -8852:2:1723 -8853:2:1734 -8854:2:1739 -8855:2:1740 -8856:0:4365 -8857:3:3559 -8858:0:4365 -8859:2:1752 -8860:0:4365 -8861:3:3558 -8862:0:4365 -8863:2:1754 -8864:0:4365 -8865:3:3559 -8866:0:4365 -8867:2:1755 -8868:2:1759 -8869:2:1760 -8870:2:1768 -8871:2:1769 -8872:2:1773 -8873:2:1774 -8874:2:1768 -8875:2:1769 -8876:2:1773 -8877:2:1774 -8878:2:1782 -8879:2:1787 -8880:2:1791 -8881:2:1792 -8882:2:1799 -8883:2:1800 -8884:2:1811 -8885:2:1812 -8886:2:1813 -8887:2:1811 -8888:2:1812 -8889:2:1813 -8890:2:1824 -8891:2:1829 -8892:2:1830 -8893:0:4365 -8894:2:1842 -8895:0:4365 -8896:3:3558 -8897:0:4365 -8898:2:1844 -8899:0:4365 -8900:3:3559 -8901:0:4365 -8902:2:1845 -8903:2:1849 -8904:2:1850 -8905:2:1858 -8906:2:1859 -8907:2:1863 -8908:2:1864 -8909:2:1858 -8910:2:1859 -8911:2:1863 -8912:2:1864 -8913:2:1872 -8914:2:1877 -8915:2:1881 -8916:2:1882 -8917:2:1889 -8918:2:1890 -8919:2:1901 -8920:2:1902 -8921:2:1903 -8922:2:1901 -8923:2:1902 -8924:2:1903 -8925:2:1914 -8926:2:1919 -8927:2:1920 -8928:0:4365 -8929:2:1932 -8930:0:4365 -8931:3:3558 -8932:0:4365 -8933:2:1934 -8934:0:4365 -8935:3:3559 -8936:0:4365 -8937:2:1935 -8938:0:4365 -8939:2:1936 -8940:0:4365 -8941:2:2129 -8942:0:4365 -8943:2:2130 -8944:0:4365 -8945:2:2134 -8946:0:4365 -8947:3:3558 -8948:0:4365 -8949:2:2136 -8950:0:4365 -8951:3:3559 -8952:0:4365 -8953:2:2137 -8954:2:2141 -8955:2:2142 -8956:2:2150 -8957:2:2151 -8958:2:2155 -8959:2:2156 -8960:2:2150 -8961:2:2151 -8962:2:2155 -8963:2:2156 -8964:2:2164 -8965:2:2169 -8966:2:2173 -8967:2:2174 -8968:2:2181 -8969:2:2182 -8970:2:2193 -8971:2:2194 -8972:2:2195 -8973:2:2193 -8974:2:2194 -8975:2:2195 -8976:2:2206 -8977:2:2211 -8978:2:2212 -8979:0:4365 -8980:2:2224 -8981:0:4365 -8982:3:3558 -8983:0:4365 -8984:2:2226 -8985:0:4365 -8986:3:3559 -8987:0:4365 -8988:2:2230 -8989:0:4365 -8990:3:3558 -8991:0:4365 -8992:2:2235 -8993:2:2239 -8994:2:2240 -8995:2:2248 -8996:2:2249 -8997:2:2253 -8998:2:2254 -8999:2:2248 -9000:2:2249 -9001:2:2250 -9002:2:2262 -9003:2:2267 -9004:2:2271 -9005:2:2272 -9006:2:2279 -9007:2:2280 -9008:2:2291 -9009:2:2292 -9010:2:2293 -9011:2:2291 -9012:2:2292 -9013:2:2293 -9014:2:2304 -9015:2:2309 -9016:2:2310 -9017:0:4365 -9018:3:3559 -9019:0:4365 -9020:2:2322 -9021:0:4365 -9022:2:1169 -9023:0:4365 -9024:3:3558 -9025:0:4365 -9026:2:1170 -9027:0:4365 -9028:3:3559 -9029:0:4365 -9030:3:3560 -9031:0:4365 -9032:3:3566 -9033:0:4365 -9034:3:3569 -9035:3:3570 -9036:3:3582 -9037:3:3583 -9038:3:3587 -9039:3:3588 -9040:3:3582 -9041:3:3583 -9042:3:3587 -9043:3:3588 -9044:3:3596 -9045:3:3601 -9046:3:3605 -9047:3:3606 -9048:3:3613 -9049:3:3614 -9050:3:3625 -9051:3:3626 -9052:3:3627 -9053:3:3625 -9054:3:3626 -9055:3:3627 -9056:3:3638 -9057:3:3643 -9058:3:3644 -9059:0:4365 -9060:3:3656 -9061:0:4365 -9062:3:3657 -9063:0:4365 -9064:2:1173 -9065:0:4365 -9066:3:3658 -9067:0:4365 -9068:2:1179 -9069:0:4365 -9070:2:1180 -9071:0:4365 -9072:3:3657 -9073:0:4365 -9074:2:1181 -9075:2:1185 -9076:2:1186 -9077:2:1194 -9078:2:1195 -9079:2:1199 -9080:2:1200 -9081:2:1194 -9082:2:1195 -9083:2:1199 -9084:2:1200 -9085:2:1208 -9086:2:1213 -9087:2:1217 -9088:2:1218 -9089:2:1225 -9090:2:1226 -9091:2:1237 -9092:2:1238 -9093:2:1239 -9094:2:1237 -9095:2:1238 -9096:2:1239 -9097:2:1250 -9098:2:1255 -9099:2:1256 -9100:0:4365 -9101:3:3658 -9102:0:4365 -9103:2:1268 -9104:0:4365 -9105:3:3657 -9106:0:4365 -9107:2:1270 -9108:0:4365 -9109:3:3658 -9110:0:4365 -9111:2:1271 -9112:2:1275 -9113:2:1276 -9114:2:1284 -9115:2:1285 -9116:2:1289 -9117:2:1290 -9118:2:1284 -9119:2:1285 -9120:2:1289 -9121:2:1290 -9122:2:1298 -9123:2:1303 -9124:2:1307 -9125:2:1308 -9126:2:1315 -9127:2:1316 -9128:2:1327 -9129:2:1328 -9130:2:1329 -9131:2:1327 -9132:2:1328 -9133:2:1329 -9134:2:1340 -9135:2:1345 -9136:2:1346 -9137:0:4365 -9138:2:1358 -9139:0:4365 -9140:2:1360 -9141:0:4365 -9142:3:3657 -9143:0:4365 -9144:2:1361 -9145:0:4365 -9146:3:3658 -9147:0:4365 -9148:2:1362 -9149:2:1366 -9150:2:1367 -9151:2:1375 -9152:2:1376 -9153:2:1380 -9154:2:1381 -9155:2:1375 -9156:2:1376 -9157:2:1380 -9158:2:1381 -9159:2:1389 -9160:2:1394 -9161:2:1398 -9162:2:1399 -9163:2:1406 -9164:2:1407 -9165:2:1418 -9166:2:1419 -9167:2:1420 -9168:2:1418 -9169:2:1419 -9170:2:1420 -9171:2:1431 -9172:2:1436 -9173:2:1437 -9174:0:4365 -9175:2:1449 -9176:0:4365 -9177:3:3657 -9178:0:4365 -9179:2:1451 -9180:0:4365 -9181:3:3658 -9182:0:4365 -9183:2:1652 -9184:0:4365 -9185:2:1653 -9186:0:4365 -9187:2:1657 -9188:0:4365 -9189:2:1660 -9190:0:4365 -9191:3:3657 -9192:0:4365 -9193:2:1665 -9194:2:1669 -9195:2:1670 -9196:2:1678 -9197:2:1679 -9198:2:1683 -9199:2:1684 -9200:2:1678 -9201:2:1679 -9202:2:1680 -9203:2:1692 -9204:2:1697 -9205:2:1701 -9206:2:1702 -9207:2:1709 -9208:2:1710 -9209:2:1721 -9210:2:1722 -9211:2:1723 -9212:2:1721 -9213:2:1722 -9214:2:1723 -9215:2:1734 -9216:2:1739 -9217:2:1740 -9218:0:4365 -9219:3:3658 -9220:0:4365 -9221:2:1752 -9222:0:4365 -9223:3:3657 -9224:0:4365 -9225:2:1754 -9226:0:4365 -9227:3:3658 -9228:0:4365 -9229:2:1755 -9230:2:1759 -9231:2:1760 -9232:2:1768 -9233:2:1769 -9234:2:1773 -9235:2:1774 -9236:2:1768 -9237:2:1769 -9238:2:1773 -9239:2:1774 -9240:2:1782 -9241:2:1787 -9242:2:1791 -9243:2:1792 -9244:2:1799 -9245:2:1800 -9246:2:1811 -9247:2:1812 -9248:2:1813 -9249:2:1811 -9250:2:1812 -9251:2:1813 -9252:2:1824 -9253:2:1829 -9254:2:1830 -9255:0:4365 -9256:2:1842 -9257:0:4365 -9258:3:3657 -9259:0:4365 -9260:2:1844 -9261:0:4365 -9262:3:3658 -9263:0:4365 -9264:2:1845 -9265:2:1849 -9266:2:1850 -9267:2:1858 -9268:2:1859 -9269:2:1863 -9270:2:1864 -9271:2:1858 -9272:2:1859 -9273:2:1863 -9274:2:1864 -9275:2:1872 -9276:2:1877 -9277:2:1881 -9278:2:1882 -9279:2:1889 -9280:2:1890 -9281:2:1901 -9282:2:1902 -9283:2:1903 -9284:2:1901 -9285:2:1902 -9286:2:1903 -9287:2:1914 -9288:2:1919 -9289:2:1920 -9290:0:4365 -9291:2:1932 -9292:0:4365 -9293:3:3657 -9294:0:4365 -9295:2:1934 -9296:0:4365 -9297:3:3658 -9298:0:4365 -9299:2:1935 -9300:0:4365 -9301:2:1936 -9302:0:4365 -9303:2:2129 -9304:0:4365 -9305:2:2130 -9306:0:4365 -9307:2:2134 -9308:0:4365 -9309:3:3657 -9310:0:4365 -9311:2:2136 -9312:0:4365 -9313:3:3658 -9314:0:4365 -9315:2:2137 -9316:2:2141 -9317:2:2142 -9318:2:2150 -9319:2:2151 -9320:2:2155 -9321:2:2156 -9322:2:2150 -9323:2:2151 -9324:2:2155 -9325:2:2156 -9326:2:2164 -9327:2:2169 -9328:2:2173 -9329:2:2174 -9330:2:2181 -9331:2:2182 -9332:2:2193 -9333:2:2194 -9334:2:2195 -9335:2:2193 -9336:2:2194 -9337:2:2195 -9338:2:2206 -9339:2:2211 -9340:2:2212 -9341:0:4365 -9342:2:2224 -9343:0:4365 -9344:3:3657 -9345:0:4365 -9346:2:2226 -9347:0:4365 -9348:3:3658 -9349:0:4365 -9350:2:2230 -9351:0:4365 -9352:3:3657 -9353:0:4365 -9354:2:2235 -9355:2:2239 -9356:2:2240 -9357:2:2248 -9358:2:2249 -9359:2:2253 -9360:2:2254 -9361:2:2248 -9362:2:2249 -9363:2:2250 -9364:2:2262 -9365:2:2267 -9366:2:2271 -9367:2:2272 -9368:2:2279 -9369:2:2280 -9370:2:2291 -9371:2:2292 -9372:2:2293 -9373:2:2291 -9374:2:2292 -9375:2:2293 -9376:2:2304 -9377:2:2309 -9378:2:2310 -9379:0:4365 -9380:3:3658 -9381:0:4365 -9382:2:2322 -9383:0:4365 -9384:2:1169 -9385:0:4365 -9386:3:3657 -9387:0:4365 -9388:2:1170 -9389:0:4365 -9390:3:3658 -9391:0:4365 -9392:3:3659 -9393:0:4365 -9394:3:3665 -9395:0:4365 -9396:3:3666 -9397:0:4365 -9398:3:3667 -9399:0:4365 -9400:3:3668 -9401:0:4365 -9402:3:3669 -9403:3:3673 -9404:3:3674 -9405:3:3682 -9406:3:3683 -9407:3:3687 -9408:3:3688 -9409:3:3682 -9410:3:3683 -9411:3:3687 -9412:3:3688 -9413:3:3696 -9414:3:3701 -9415:3:3705 -9416:3:3706 -9417:3:3713 -9418:3:3714 -9419:3:3725 -9420:3:3726 -9421:3:3727 -9422:3:3725 -9423:3:3726 -9424:3:3727 -9425:3:3738 -9426:3:3743 -9427:3:3744 -9428:0:4365 -9429:3:3756 -9430:0:4365 -9431:3:3757 -9432:0:4365 -9433:2:1173 -9434:0:4365 -9435:3:3758 -9436:0:4365 -9437:2:1179 -9438:0:4365 -9439:2:1180 -9440:0:4365 -9441:3:3757 -9442:0:4365 -9443:2:1181 -9444:2:1185 -9445:2:1186 -9446:2:1194 -9447:2:1195 -9448:2:1199 -9449:2:1200 -9450:2:1194 -9451:2:1195 -9452:2:1199 -9453:2:1200 -9454:2:1208 -9455:2:1213 -9456:2:1217 -9457:2:1218 -9458:2:1225 -9459:2:1226 -9460:2:1237 -9461:2:1238 -9462:2:1239 -9463:2:1237 -9464:2:1238 -9465:2:1239 -9466:2:1250 -9467:2:1255 -9468:2:1256 -9469:0:4365 -9470:3:3758 -9471:0:4365 -9472:2:1268 -9473:0:4365 -9474:3:3757 -9475:0:4365 -9476:2:1270 -9477:0:4365 -9478:3:3758 -9479:0:4365 -9480:2:1271 -9481:2:1275 -9482:2:1276 -9483:2:1284 -9484:2:1285 -9485:2:1289 -9486:2:1290 -9487:2:1284 -9488:2:1285 -9489:2:1289 -9490:2:1290 -9491:2:1298 -9492:2:1303 -9493:2:1307 -9494:2:1308 -9495:2:1315 -9496:2:1316 -9497:2:1327 -9498:2:1328 -9499:2:1329 -9500:2:1327 -9501:2:1328 -9502:2:1329 -9503:2:1340 -9504:2:1345 -9505:2:1346 -9506:0:4365 -9507:2:1358 -9508:0:4365 -9509:2:1360 -9510:0:4365 -9511:3:3757 -9512:0:4365 -9513:2:1361 -9514:0:4365 -9515:3:3758 -9516:0:4365 -9517:2:1362 -9518:2:1366 -9519:2:1367 -9520:2:1375 -9521:2:1376 -9522:2:1380 -9523:2:1381 -9524:2:1375 -9525:2:1376 -9526:2:1380 -9527:2:1381 -9528:2:1389 -9529:2:1394 -9530:2:1398 -9531:2:1399 -9532:2:1406 -9533:2:1407 -9534:2:1418 -9535:2:1419 -9536:2:1420 -9537:2:1418 -9538:2:1419 -9539:2:1420 -9540:2:1431 -9541:2:1436 -9542:2:1437 -9543:0:4365 -9544:2:1449 -9545:0:4365 -9546:3:3757 -9547:0:4365 -9548:2:1451 -9549:0:4365 -9550:3:3758 -9551:0:4365 -9552:2:1652 -9553:0:4365 -9554:2:1653 -9555:0:4365 -9556:2:1657 -9557:0:4365 -9558:2:1660 -9559:0:4365 -9560:3:3757 -9561:0:4365 -9562:2:1665 -9563:2:1669 -9564:2:1670 -9565:2:1678 -9566:2:1679 -9567:2:1683 -9568:2:1684 -9569:2:1678 -9570:2:1679 -9571:2:1680 -9572:2:1692 -9573:2:1697 -9574:2:1701 -9575:2:1702 -9576:2:1709 -9577:2:1710 -9578:2:1721 -9579:2:1722 -9580:2:1723 -9581:2:1721 -9582:2:1722 -9583:2:1723 -9584:2:1734 -9585:2:1739 -9586:2:1740 -9587:0:4365 -9588:3:3758 -9589:0:4365 -9590:2:1752 -9591:0:4365 -9592:3:3757 -9593:0:4365 -9594:2:1754 -9595:0:4365 -9596:3:3758 -9597:0:4365 -9598:2:1755 -9599:2:1759 -9600:2:1760 -9601:2:1768 -9602:2:1769 -9603:2:1773 -9604:2:1774 -9605:2:1768 -9606:2:1769 -9607:2:1773 -9608:2:1774 -9609:2:1782 -9610:2:1787 -9611:2:1791 -9612:2:1792 -9613:2:1799 -9614:2:1800 -9615:2:1811 -9616:2:1812 -9617:2:1813 -9618:2:1811 -9619:2:1812 -9620:2:1813 -9621:2:1824 -9622:2:1829 -9623:2:1830 -9624:0:4365 -9625:2:1842 -9626:0:4365 -9627:3:3757 -9628:0:4365 -9629:2:1844 -9630:0:4365 -9631:3:3758 -9632:0:4365 -9633:2:1845 -9634:2:1849 -9635:2:1850 -9636:2:1858 -9637:2:1859 -9638:2:1863 -9639:2:1864 -9640:2:1858 -9641:2:1859 -9642:2:1863 -9643:2:1864 -9644:2:1872 -9645:2:1877 -9646:2:1881 -9647:2:1882 -9648:2:1889 -9649:2:1890 -9650:2:1901 -9651:2:1902 -9652:2:1903 -9653:2:1901 -9654:2:1902 -9655:2:1903 -9656:2:1914 -9657:2:1919 -9658:2:1920 -9659:0:4365 -9660:2:1932 -9661:0:4365 -9662:3:3757 -9663:0:4365 -9664:2:1934 -9665:0:4365 -9666:3:3758 -9667:0:4365 -9668:2:1935 -9669:0:4365 -9670:2:1936 -9671:0:4365 -9672:2:2129 -9673:0:4365 -9674:2:2130 -9675:0:4365 -9676:2:2134 -9677:0:4365 -9678:3:3757 -9679:0:4365 -9680:2:2136 -9681:0:4365 -9682:3:3758 -9683:0:4365 -9684:2:2137 -9685:2:2141 -9686:2:2142 -9687:2:2150 -9688:2:2151 -9689:2:2155 -9690:2:2156 -9691:2:2150 -9692:2:2151 -9693:2:2155 -9694:2:2156 -9695:2:2164 -9696:2:2169 -9697:2:2173 -9698:2:2174 -9699:2:2181 -9700:2:2182 -9701:2:2193 -9702:2:2194 -9703:2:2195 -9704:2:2193 -9705:2:2194 -9706:2:2195 -9707:2:2206 -9708:2:2211 -9709:2:2212 -9710:0:4365 -9711:2:2224 -9712:0:4365 -9713:3:3757 -9714:0:4365 -9715:2:2226 -9716:0:4365 -9717:3:3758 -9718:0:4365 -9719:2:2230 -9720:0:4365 -9721:3:3757 -9722:0:4365 -9723:2:2235 -9724:2:2239 -9725:2:2240 -9726:2:2248 -9727:2:2249 -9728:2:2253 -9729:2:2254 -9730:2:2248 -9731:2:2249 -9732:2:2250 -9733:2:2262 -9734:2:2267 -9735:2:2271 -9736:2:2272 -9737:2:2279 -9738:2:2280 -9739:2:2291 -9740:2:2292 -9741:2:2293 -9742:2:2291 -9743:2:2292 -9744:2:2293 -9745:2:2304 -9746:2:2309 -9747:2:2310 -9748:0:4365 -9749:3:3758 -9750:0:4365 -9751:2:2322 -9752:0:4365 -9753:2:1169 -9754:0:4365 -9755:3:3757 -9756:0:4365 -9757:2:1170 -9758:0:4365 -9759:3:3758 -9760:0:4365 -9761:3:3759 -9762:0:4365 -9763:3:3972 -9764:0:4365 -9765:3:3980 -9766:0:4365 -9767:3:3981 -9768:3:3985 -9769:3:3986 -9770:3:3994 -9771:3:3995 -9772:3:3999 -9773:3:4000 -9774:3:3994 -9775:3:3995 -9776:3:3999 -9777:3:4000 -9778:3:4008 -9779:3:4013 -9780:3:4017 -9781:3:4018 -9782:3:4025 -9783:3:4026 -9784:3:4037 -9785:3:4038 -9786:3:4039 -9787:3:4037 -9788:3:4038 -9789:3:4039 -9790:3:4050 -9791:3:4055 -9792:3:4056 -9793:0:4365 -9794:3:4068 -9795:0:4365 -9796:3:4069 -9797:0:4365 -9798:2:1173 -9799:0:4365 -9800:3:4070 -9801:0:4365 -9802:2:1179 -9803:0:4365 -9804:2:1180 -9805:0:4365 -9806:3:4069 -9807:0:4365 -9808:2:1181 -9809:2:1185 -9810:2:1186 -9811:2:1194 -9812:2:1195 -9813:2:1199 -9814:2:1200 -9815:2:1194 -9816:2:1195 -9817:2:1199 -9818:2:1200 -9819:2:1208 -9820:2:1213 -9821:2:1217 -9822:2:1218 -9823:2:1225 -9824:2:1226 -9825:2:1237 -9826:2:1238 -9827:2:1239 -9828:2:1237 -9829:2:1238 -9830:2:1239 -9831:2:1250 -9832:2:1255 -9833:2:1256 -9834:0:4365 -9835:3:4070 -9836:0:4365 -9837:2:1268 -9838:0:4365 -9839:3:4069 -9840:0:4365 -9841:2:1270 -9842:0:4365 -9843:3:4070 -9844:0:4365 -9845:2:1271 -9846:2:1275 -9847:2:1276 -9848:2:1284 -9849:2:1285 -9850:2:1289 -9851:2:1290 -9852:2:1284 -9853:2:1285 -9854:2:1289 -9855:2:1290 -9856:2:1298 -9857:2:1303 -9858:2:1307 -9859:2:1308 -9860:2:1315 -9861:2:1316 -9862:2:1327 -9863:2:1328 -9864:2:1329 -9865:2:1327 -9866:2:1328 -9867:2:1329 -9868:2:1340 -9869:2:1345 -9870:2:1346 -9871:0:4365 -9872:2:1358 -9873:0:4365 -9874:2:1360 -9875:0:4365 -9876:3:4069 -9877:0:4365 -9878:2:1361 -9879:0:4365 -9880:3:4070 -9881:0:4365 -9882:2:1362 -9883:2:1366 -9884:2:1367 -9885:2:1375 -9886:2:1376 -9887:2:1380 -9888:2:1381 -9889:2:1375 -9890:2:1376 -9891:2:1380 -9892:2:1381 -9893:2:1389 -9894:2:1394 -9895:2:1398 -9896:2:1399 -9897:2:1406 -9898:2:1407 -9899:2:1418 -9900:2:1419 -9901:2:1420 -9902:2:1418 -9903:2:1419 -9904:2:1420 -9905:2:1431 -9906:2:1436 -9907:2:1437 -9908:0:4365 -9909:2:1449 -9910:0:4365 -9911:3:4069 -9912:0:4365 -9913:2:1451 -9914:0:4365 -9915:3:4070 -9916:0:4365 -9917:2:1652 -9918:0:4365 -9919:2:1653 -9920:0:4365 -9921:2:1657 -9922:0:4365 -9923:2:1660 -9924:0:4365 -9925:3:4069 -9926:0:4365 -9927:2:1665 -9928:2:1669 -9929:2:1670 -9930:2:1678 -9931:2:1679 -9932:2:1683 -9933:2:1684 -9934:2:1678 -9935:2:1679 -9936:2:1680 -9937:2:1692 -9938:2:1697 -9939:2:1701 -9940:2:1702 -9941:2:1709 -9942:2:1710 -9943:2:1721 -9944:2:1722 -9945:2:1723 -9946:2:1721 -9947:2:1722 -9948:2:1723 -9949:2:1734 -9950:2:1739 -9951:2:1740 -9952:0:4365 -9953:3:4070 -9954:0:4365 -9955:2:1752 -9956:0:4365 -9957:3:4069 -9958:0:4365 -9959:2:1754 -9960:0:4365 -9961:3:4070 -9962:0:4365 -9963:2:1755 -9964:2:1759 -9965:2:1760 -9966:2:1768 -9967:2:1769 -9968:2:1773 -9969:2:1774 -9970:2:1768 -9971:2:1769 -9972:2:1773 -9973:2:1774 -9974:2:1782 -9975:2:1787 -9976:2:1791 -9977:2:1792 -9978:2:1799 -9979:2:1800 -9980:2:1811 -9981:2:1812 -9982:2:1813 -9983:2:1811 -9984:2:1812 -9985:2:1813 -9986:2:1824 -9987:2:1829 -9988:2:1830 -9989:0:4365 -9990:2:1842 -9991:0:4365 -9992:3:4069 -9993:0:4365 -9994:2:1844 -9995:0:4365 -9996:3:4070 -9997:0:4365 -9998:2:1845 -9999:2:1849 -10000:2:1850 -10001:2:1858 -10002:2:1859 -10003:2:1863 -10004:2:1864 -10005:2:1858 -10006:2:1859 -10007:2:1863 -10008:2:1864 -10009:2:1872 -10010:2:1877 -10011:2:1881 -10012:2:1882 -10013:2:1889 -10014:2:1890 -10015:2:1901 -10016:2:1902 -10017:2:1903 -10018:2:1901 -10019:2:1902 -10020:2:1903 -10021:2:1914 -10022:2:1919 -10023:2:1920 -10024:0:4365 -10025:2:1932 -10026:0:4365 -10027:3:4069 -10028:0:4365 -10029:2:1934 -10030:0:4365 -10031:3:4070 -10032:0:4365 -10033:2:1935 -10034:0:4365 -10035:2:1936 -10036:0:4365 -10037:2:2129 -10038:0:4365 -10039:2:2130 -10040:0:4365 -10041:2:2134 -10042:0:4365 -10043:3:4069 -10044:0:4365 -10045:2:2136 -10046:0:4365 -10047:3:4070 -10048:0:4365 -10049:2:2137 -10050:2:2141 -10051:2:2142 -10052:2:2150 -10053:2:2151 -10054:2:2155 -10055:2:2156 -10056:2:2150 -10057:2:2151 -10058:2:2155 -10059:2:2156 -10060:2:2164 -10061:2:2169 -10062:2:2173 -10063:2:2174 -10064:2:2181 -10065:2:2182 -10066:2:2193 -10067:2:2194 -10068:2:2195 -10069:2:2193 -10070:2:2194 -10071:2:2195 -10072:2:2206 -10073:2:2211 -10074:2:2212 -10075:0:4365 -10076:2:2224 -10077:0:4365 -10078:3:4069 -10079:0:4365 -10080:2:2226 -10081:0:4365 -10082:3:4070 -10083:0:4365 -10084:2:2230 -10085:0:4365 -10086:3:4069 -10087:0:4365 -10088:2:2235 -10089:2:2239 -10090:2:2240 -10091:2:2248 -10092:2:2249 -10093:2:2253 -10094:2:2254 -10095:2:2248 -10096:2:2249 -10097:2:2250 -10098:2:2262 -10099:2:2267 -10100:2:2271 -10101:2:2272 -10102:2:2279 -10103:2:2280 -10104:2:2291 -10105:2:2292 -10106:2:2293 -10107:2:2291 -10108:2:2292 -10109:2:2293 -10110:2:2304 -10111:2:2309 -10112:2:2310 -10113:0:4365 -10114:3:4070 -10115:0:4365 -10116:2:2322 -10117:0:4365 -10118:2:1169 -10119:0:4365 -10120:3:4069 -10121:0:4365 -10122:2:1170 -10123:0:4365 -10124:3:4070 -10125:0:4365 -10126:3:4071 -10127:0:4365 -10128:3:4081 -10129:0:4365 -10130:3:3666 -10131:0:4365 -10132:3:3667 -10133:0:4365 -10134:3:3668 -10135:0:4365 -10136:3:3669 -10137:3:3673 -10138:3:3674 -10139:3:3682 -10140:3:3683 -10141:3:3687 -10142:3:3688 -10143:3:3682 -10144:3:3683 -10145:3:3687 -10146:3:3688 -10147:3:3696 -10148:3:3701 -10149:3:3705 -10150:3:3706 -10151:3:3713 -10152:3:3714 -10153:3:3725 -10154:3:3726 -10155:3:3727 -10156:3:3725 -10157:3:3726 -10158:3:3727 -10159:3:3738 -10160:3:3743 -10161:3:3744 -10162:0:4365 -10163:3:3756 -10164:0:4365 -10165:3:3757 -10166:0:4365 -10167:2:1173 -10168:0:4365 -10169:3:3758 -10170:0:4365 -10171:2:1179 -10172:0:4365 -10173:2:1180 -10174:0:4365 -10175:3:3757 -10176:0:4365 -10177:2:1181 -10178:2:1185 -10179:2:1186 -10180:2:1194 -10181:2:1195 -10182:2:1199 -10183:2:1200 -10184:2:1194 -10185:2:1195 -10186:2:1199 -10187:2:1200 -10188:2:1208 -10189:2:1213 -10190:2:1217 -10191:2:1218 -10192:2:1225 -10193:2:1226 -10194:2:1237 -10195:2:1238 -10196:2:1239 -10197:2:1237 -10198:2:1238 -10199:2:1239 -10200:2:1250 -10201:2:1255 -10202:2:1256 -10203:0:4365 -10204:3:3758 -10205:0:4365 -10206:2:1268 -10207:0:4365 -10208:3:3757 -10209:0:4365 -10210:2:1270 -10211:0:4365 -10212:3:3758 -10213:0:4365 -10214:2:1271 -10215:2:1275 -10216:2:1276 -10217:2:1284 -10218:2:1285 -10219:2:1289 -10220:2:1290 -10221:2:1284 -10222:2:1285 -10223:2:1289 -10224:2:1290 -10225:2:1298 -10226:2:1303 -10227:2:1307 -10228:2:1308 -10229:2:1315 -10230:2:1316 -10231:2:1327 -10232:2:1328 -10233:2:1329 -10234:2:1327 -10235:2:1328 -10236:2:1329 -10237:2:1340 -10238:2:1345 -10239:2:1346 -10240:0:4365 -10241:2:1358 -10242:0:4365 -10243:2:1360 -10244:0:4365 -10245:3:3757 -10246:0:4365 -10247:2:1361 -10248:0:4365 -10249:3:3758 -10250:0:4365 -10251:2:1362 -10252:2:1366 -10253:2:1367 -10254:2:1375 -10255:2:1376 -10256:2:1380 -10257:2:1381 -10258:2:1375 -10259:2:1376 -10260:2:1380 -10261:2:1381 -10262:2:1389 -10263:2:1394 -10264:2:1398 -10265:2:1399 -10266:2:1406 -10267:2:1407 -10268:2:1418 -10269:2:1419 -10270:2:1420 -10271:2:1418 -10272:2:1419 -10273:2:1420 -10274:2:1431 -10275:2:1436 -10276:2:1437 -10277:0:4365 -10278:2:1449 -10279:0:4365 -10280:3:3757 -10281:0:4365 -10282:2:1451 -10283:0:4365 -10284:3:3758 -10285:0:4365 -10286:2:1652 -10287:0:4365 -10288:2:1653 -10289:0:4365 -10290:2:1657 -10291:0:4365 -10292:2:1660 -10293:0:4365 -10294:3:3757 -10295:0:4365 -10296:2:1665 -10297:2:1669 -10298:2:1670 -10299:2:1678 -10300:2:1679 -10301:2:1683 -10302:2:1684 -10303:2:1678 -10304:2:1679 -10305:2:1680 -10306:2:1692 -10307:2:1697 -10308:2:1701 -10309:2:1702 -10310:2:1709 -10311:2:1710 -10312:2:1721 -10313:2:1722 -10314:2:1723 -10315:2:1721 -10316:2:1722 -10317:2:1723 -10318:2:1734 -10319:2:1739 -10320:2:1740 -10321:0:4365 -10322:3:3758 -10323:0:4365 -10324:2:1752 -10325:0:4365 -10326:3:3757 -10327:0:4365 -10328:2:1754 -10329:0:4365 -10330:3:3758 -10331:0:4365 -10332:2:1755 -10333:2:1759 -10334:2:1760 -10335:2:1768 -10336:2:1769 -10337:2:1773 -10338:2:1774 -10339:2:1768 -10340:2:1769 -10341:2:1773 -10342:2:1774 -10343:2:1782 -10344:2:1787 -10345:2:1791 -10346:2:1792 -10347:2:1799 -10348:2:1800 -10349:2:1811 -10350:2:1812 -10351:2:1813 -10352:2:1811 -10353:2:1812 -10354:2:1813 -10355:2:1824 -10356:2:1829 -10357:2:1830 -10358:0:4365 -10359:2:1842 -10360:0:4365 -10361:3:3757 -10362:0:4365 -10363:2:1844 -10364:0:4365 -10365:3:3758 -10366:0:4365 -10367:2:1845 -10368:2:1849 -10369:2:1850 -10370:2:1858 -10371:2:1859 -10372:2:1863 -10373:2:1864 -10374:2:1858 -10375:2:1859 -10376:2:1863 -10377:2:1864 -10378:2:1872 -10379:2:1877 -10380:2:1881 -10381:2:1882 -10382:2:1889 -10383:2:1890 -10384:2:1901 -10385:2:1902 -10386:2:1903 -10387:2:1901 -10388:2:1902 -10389:2:1903 -10390:2:1914 -10391:2:1919 -10392:2:1920 -10393:0:4365 -10394:2:1932 -10395:0:4365 -10396:3:3757 -10397:0:4365 -10398:2:1934 -10399:0:4365 -10400:3:3758 -10401:0:4365 -10402:2:1935 -10403:0:4365 -10404:2:1936 -10405:0:4365 -10406:2:2129 -10407:0:4365 -10408:2:2130 -10409:0:4365 -10410:2:2134 -10411:0:4365 -10412:3:3757 -10413:0:4365 -10414:2:2136 -10415:0:4365 -10416:3:3758 -10417:0:4365 -10418:2:2137 -10419:2:2141 -10420:2:2142 -10421:2:2150 -10422:2:2151 -10423:2:2155 -10424:2:2156 -10425:2:2150 -10426:2:2151 -10427:2:2155 -10428:2:2156 -10429:2:2164 -10430:2:2169 -10431:2:2173 -10432:2:2174 -10433:2:2181 -10434:2:2182 -10435:2:2193 -10436:2:2194 -10437:2:2195 -10438:2:2193 -10439:2:2194 -10440:2:2195 -10441:2:2206 -10442:2:2211 -10443:2:2212 -10444:0:4365 -10445:2:2224 -10446:0:4365 -10447:3:3757 -10448:0:4365 -10449:2:2226 -10450:0:4365 -10451:3:3758 -10452:0:4365 -10453:2:2230 -10454:0:4365 -10455:3:3757 -10456:0:4365 -10457:2:2235 -10458:2:2239 -10459:2:2240 -10460:2:2248 -10461:2:2249 -10462:2:2253 -10463:2:2254 -10464:2:2248 -10465:2:2249 -10466:2:2250 -10467:2:2262 -10468:2:2267 -10469:2:2271 -10470:2:2272 -10471:2:2279 -10472:2:2280 -10473:2:2291 -10474:2:2292 -10475:2:2293 -10476:2:2291 -10477:2:2292 -10478:2:2293 -10479:2:2304 -10480:2:2309 -10481:2:2310 -10482:0:4365 -10483:3:3758 -10484:0:4365 -10485:2:2322 -10486:0:4365 -10487:2:1169 -10488:0:4365 -10489:3:3757 -10490:0:4365 -10491:2:1170 -10492:0:4365 -10493:3:3758 -10494:0:4365 -10495:3:3759 -10496:0:4365 -10497:3:3972 -10498:0:4365 -10499:3:4077 -10500:0:4365 -10501:3:4078 -10502:0:4365 -10503:3:4082 -10504:0:4365 -10505:3:4088 -10506:0:4365 -10507:3:4092 -10508:3:4093 -10509:3:4097 -10510:3:4101 -10511:3:4102 -10512:3:4097 -10513:3:4101 -10514:3:4102 -10515:3:4106 -10516:3:4114 -10517:3:4115 -10518:3:4120 -10519:3:4127 -10520:3:4128 -10521:3:4127 -10522:3:4128 -10523:3:4135 -10524:3:4140 -10525:0:4365 -10526:3:4151 -10527:0:4365 -10528:3:4155 -10529:3:4156 -10530:3:4160 -10531:3:4164 -10532:3:4165 -10533:3:4160 -10534:3:4164 -10535:3:4165 -10536:3:4169 -10537:3:4177 -10538:3:4178 -10539:3:4183 -10540:3:4190 -10541:3:4191 -10542:3:4190 -10543:3:4191 -10544:3:4198 -10545:3:4203 -10546:0:4365 -10547:3:4151 -10548:0:4365 -10549:3:4155 -10550:3:4156 -10551:3:4160 -10552:3:4164 -10553:3:4165 -10554:3:4160 -10555:3:4164 -10556:3:4165 -10557:3:4169 -10558:3:4177 -10559:3:4178 -10560:3:4183 -10561:3:4190 -10562:3:4191 -10563:3:4190 -10564:3:4191 -10565:3:4198 -10566:3:4203 -10567:0:4365 -10568:3:4214 -10569:0:4365 -10570:3:4222 -10571:3:4223 -10572:3:4227 -10573:3:4231 -10574:3:4232 -10575:3:4227 -10576:3:4231 -10577:3:4232 -10578:3:4236 -10579:3:4244 -10580:3:4245 -10581:3:4250 -10582:3:4257 -10583:3:4258 -10584:3:4257 -10585:3:4258 -10586:3:4265 -10587:3:4270 -10588:0:4365 -10589:3:4285 -10590:0:4365 -10591:3:4286 -10592:0:4365 -10593:2:1173 -10594:0:4365 -10595:3:4287 -10596:0:4365 -10597:2:1179 -10598:0:4365 -10599:2:1180 -10600:0:4365 -10601:3:4286 -10602:0:4365 -10603:2:1181 -10604:2:1185 -10605:2:1186 -10606:2:1194 -10607:2:1195 -10608:2:1199 -10609:2:1200 -10610:2:1194 -10611:2:1195 -10612:2:1199 -10613:2:1200 -10614:2:1208 -10615:2:1213 -10616:2:1217 -10617:2:1218 -10618:2:1225 -10619:2:1226 -10620:2:1237 -10621:2:1238 -10622:2:1239 -10623:2:1237 -10624:2:1238 -10625:2:1239 -10626:2:1250 -10627:2:1255 -10628:2:1256 -10629:0:4365 -10630:3:4287 -10631:0:4365 -10632:2:1268 -10633:0:4365 -10634:3:4286 -10635:0:4365 -10636:2:1270 -10637:0:4365 -10638:3:4287 -10639:0:4365 -10640:2:1271 -10641:2:1275 -10642:2:1276 -10643:2:1284 -10644:2:1285 -10645:2:1289 -10646:2:1290 -10647:2:1284 -10648:2:1285 -10649:2:1289 -10650:2:1290 -10651:2:1298 -10652:2:1303 -10653:2:1307 -10654:2:1308 -10655:2:1315 -10656:2:1316 -10657:2:1327 -10658:2:1328 -10659:2:1329 -10660:2:1327 -10661:2:1328 -10662:2:1329 -10663:2:1340 -10664:2:1345 -10665:2:1346 -10666:0:4365 -10667:2:1358 -10668:0:4365 -10669:2:1360 -10670:0:4365 -10671:3:4286 -10672:0:4365 -10673:2:1361 -10674:0:4365 -10675:3:4287 -10676:0:4365 -10677:2:1362 -10678:2:1366 -10679:2:1367 -10680:2:1375 -10681:2:1376 -10682:2:1380 -10683:2:1381 -10684:2:1375 -10685:2:1376 -10686:2:1380 -10687:2:1381 -10688:2:1389 -10689:2:1394 -10690:2:1398 -10691:2:1399 -10692:2:1406 -10693:2:1407 -10694:2:1418 -10695:2:1419 -10696:2:1420 -10697:2:1418 -10698:2:1419 -10699:2:1420 -10700:2:1431 -10701:2:1436 -10702:2:1437 -10703:0:4365 -10704:2:1449 -10705:0:4365 -10706:3:4286 -10707:0:4365 -10708:2:1451 -10709:0:4365 -10710:3:4287 -10711:0:4365 -10712:2:1652 -10713:0:4365 -10714:2:1653 -10715:0:4365 -10716:2:1657 -10717:0:4365 -10718:2:1660 -10719:0:4365 -10720:3:4286 -10721:0:4365 -10722:2:1665 -10723:2:1669 -10724:2:1670 -10725:2:1678 -10726:2:1679 -10727:2:1683 -10728:2:1684 -10729:2:1678 -10730:2:1679 -10731:2:1680 -10732:2:1692 -10733:2:1697 -10734:2:1701 -10735:2:1702 -10736:2:1709 -10737:2:1710 -10738:2:1721 -10739:2:1722 -10740:2:1723 -10741:2:1721 -10742:2:1722 -10743:2:1723 -10744:2:1734 -10745:2:1739 -10746:2:1740 -10747:0:4365 -10748:3:4287 -10749:0:4365 -10750:2:1752 -10751:0:4365 -10752:3:4286 -10753:0:4365 -10754:2:1754 -10755:0:4365 -10756:3:4287 -10757:0:4365 -10758:2:1755 -10759:2:1759 -10760:2:1760 -10761:2:1768 -10762:2:1769 -10763:2:1773 -10764:2:1774 -10765:2:1768 -10766:2:1769 -10767:2:1773 -10768:2:1774 -10769:2:1782 -10770:2:1787 -10771:2:1791 -10772:2:1792 -10773:2:1799 -10774:2:1800 -10775:2:1811 -10776:2:1812 -10777:2:1813 -10778:2:1811 -10779:2:1812 -10780:2:1813 -10781:2:1824 -10782:2:1829 -10783:2:1830 -10784:0:4365 -10785:2:1842 -10786:0:4365 -10787:3:4286 -10788:0:4365 -10789:2:1844 -10790:0:4365 -10791:3:4287 -10792:0:4365 -10793:2:1845 -10794:2:1849 -10795:2:1850 -10796:2:1858 -10797:2:1859 -10798:2:1863 -10799:2:1864 -10800:2:1858 -10801:2:1859 -10802:2:1863 -10803:2:1864 -10804:2:1872 -10805:2:1877 -10806:2:1881 -10807:2:1882 -10808:2:1889 -10809:2:1890 -10810:2:1901 -10811:2:1902 -10812:2:1903 -10813:2:1901 -10814:2:1902 -10815:2:1903 -10816:2:1914 -10817:2:1919 -10818:2:1920 -10819:0:4365 -10820:2:1932 -10821:0:4365 -10822:3:4286 -10823:0:4365 -10824:2:1934 -10825:0:4365 -10826:3:4287 -10827:0:4365 -10828:2:1935 -10829:0:4365 -10830:2:1936 -10831:0:4365 -10832:2:2129 -10833:0:4365 -10834:2:2130 -10835:0:4365 -10836:2:2134 -10837:0:4365 -10838:3:4286 -10839:0:4365 -10840:2:2136 -10841:0:4365 -10842:3:4287 -10843:0:4365 -10844:2:2137 -10845:2:2141 -10846:2:2142 -10847:2:2150 -10848:2:2151 -10849:2:2155 -10850:2:2156 -10851:2:2150 -10852:2:2151 -10853:2:2155 -10854:2:2156 -10855:2:2164 -10856:2:2169 -10857:2:2173 -10858:2:2174 -10859:2:2181 -10860:2:2182 -10861:2:2193 -10862:2:2194 -10863:2:2195 -10864:2:2193 -10865:2:2194 -10866:2:2195 -10867:2:2206 -10868:2:2211 -10869:2:2212 -10870:0:4365 -10871:2:2224 -10872:0:4365 -10873:3:4286 -10874:0:4365 -10875:2:2226 -10876:0:4365 -10877:3:4287 -10878:0:4365 -10879:2:2230 -10880:0:4365 -10881:3:4286 -10882:0:4365 -10883:2:2235 -10884:2:2239 -10885:2:2240 -10886:2:2248 -10887:2:2249 -10888:2:2253 -10889:2:2254 -10890:2:2248 -10891:2:2249 -10892:2:2250 -10893:2:2262 -10894:2:2267 -10895:2:2271 -10896:2:2272 -10897:2:2279 -10898:2:2280 -10899:2:2291 -10900:2:2292 -10901:2:2293 -10902:2:2291 -10903:2:2292 -10904:2:2293 -10905:2:2304 -10906:2:2309 -10907:2:2310 -10908:0:4365 -10909:3:4287 -10910:0:4365 -10911:2:2322 -10912:0:4365 -10913:2:1169 -10914:0:4365 -10915:3:4286 -10916:0:4365 -10917:2:1170 -10918:0:4365 -10919:3:4287 -10920:0:4365 -10921:3:4288 -10922:0:4365 -10923:3:4294 -10924:0:4365 -10925:3:4295 -10926:0:4365 -10927:3:2338 -10928:0:4365 -10929:3:2339 -10930:3:2343 -10931:3:2344 -10932:3:2352 -10933:3:2353 -10934:3:2357 -10935:3:2358 -10936:3:2352 -10937:3:2353 -10938:3:2357 -10939:3:2358 -10940:3:2366 -10941:3:2371 -10942:3:2375 -10943:3:2376 -10944:3:2383 -10945:3:2384 -10946:3:2395 -10947:3:2396 -10948:3:2397 -10949:3:2395 -10950:3:2396 -10951:3:2397 -10952:3:2408 -10953:3:2413 -10954:3:2414 -10955:0:4365 -10956:3:2426 -10957:0:4365 -10958:3:2427 -10959:0:4365 -10960:2:1173 -10961:0:4365 -10962:3:2428 -10963:0:4365 -10964:2:1179 -10965:0:4365 -10966:2:1180 -10967:0:4365 -10968:3:2427 -10969:0:4365 -10970:2:1181 -10971:2:1185 -10972:2:1186 -10973:2:1194 -10974:2:1195 -10975:2:1199 -10976:2:1200 -10977:2:1194 -10978:2:1195 -10979:2:1199 -10980:2:1200 -10981:2:1208 -10982:2:1213 -10983:2:1217 -10984:2:1218 -10985:2:1225 -10986:2:1226 -10987:2:1237 -10988:2:1238 -10989:2:1239 -10990:2:1237 -10991:2:1238 -10992:2:1239 -10993:2:1250 -10994:2:1255 -10995:2:1256 -10996:0:4365 -10997:3:2428 -10998:0:4365 -10999:2:1268 -11000:0:4365 -11001:3:2427 -11002:0:4365 -11003:2:1270 -11004:0:4365 -11005:3:2428 -11006:0:4365 -11007:2:1271 -11008:2:1275 -11009:2:1276 -11010:2:1284 -11011:2:1285 -11012:2:1289 -11013:2:1290 -11014:2:1284 -11015:2:1285 -11016:2:1289 -11017:2:1290 -11018:2:1298 -11019:2:1303 -11020:2:1307 -11021:2:1308 -11022:2:1315 -11023:2:1316 -11024:2:1327 -11025:2:1328 -11026:2:1329 -11027:2:1327 -11028:2:1328 -11029:2:1329 -11030:2:1340 -11031:2:1345 -11032:2:1346 -11033:0:4365 -11034:2:1358 -11035:0:4365 -11036:2:1360 -11037:0:4365 -11038:3:2427 -11039:0:4365 -11040:2:1361 -11041:0:4365 -11042:3:2428 -11043:0:4365 -11044:2:1362 -11045:2:1366 -11046:2:1367 -11047:2:1375 -11048:2:1376 -11049:2:1380 -11050:2:1381 -11051:2:1375 -11052:2:1376 -11053:2:1380 -11054:2:1381 -11055:2:1389 -11056:2:1394 -11057:2:1398 -11058:2:1399 -11059:2:1406 -11060:2:1407 -11061:2:1418 -11062:2:1419 -11063:2:1420 -11064:2:1418 -11065:2:1419 -11066:2:1420 -11067:2:1431 -11068:2:1436 -11069:2:1437 -11070:0:4365 -11071:2:1449 -11072:0:4365 -11073:3:2427 -11074:0:4365 -11075:2:1451 -11076:0:4365 -11077:3:2428 -11078:0:4365 -11079:2:1652 -11080:0:4365 -11081:2:1653 -11082:0:4365 -11083:2:1657 -11084:0:4365 -11085:2:1660 -11086:0:4365 -11087:3:2427 -11088:0:4365 -11089:2:1665 -11090:2:1669 -11091:2:1670 -11092:2:1678 -11093:2:1679 -11094:2:1683 -11095:2:1684 -11096:2:1678 -11097:2:1679 -11098:2:1680 -11099:2:1692 -11100:2:1697 -11101:2:1701 -11102:2:1702 -11103:2:1709 -11104:2:1710 -11105:2:1721 -11106:2:1722 -11107:2:1723 -11108:2:1721 -11109:2:1722 -11110:2:1723 -11111:2:1734 -11112:2:1739 -11113:2:1740 -11114:0:4365 -11115:3:2428 -11116:0:4365 -11117:2:1752 -11118:0:4365 -11119:3:2427 -11120:0:4365 -11121:2:1754 -11122:0:4365 -11123:3:2428 -11124:0:4365 -11125:2:1755 -11126:2:1759 -11127:2:1760 -11128:2:1768 -11129:2:1769 -11130:2:1773 -11131:2:1774 -11132:2:1768 -11133:2:1769 -11134:2:1773 -11135:2:1774 -11136:2:1782 -11137:2:1787 -11138:2:1791 -11139:2:1792 -11140:2:1799 -11141:2:1800 -11142:2:1811 -11143:2:1812 -11144:2:1813 -11145:2:1811 -11146:2:1812 -11147:2:1813 -11148:2:1824 -11149:2:1829 -11150:2:1830 -11151:0:4365 -11152:2:1842 -11153:0:4365 -11154:3:2427 -11155:0:4365 -11156:2:1844 -11157:0:4363 -11158:3:2428 -11159:0:4369 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_mb.define b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_mb.define deleted file mode 100644 index 136ef67..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_mb.define +++ /dev/null @@ -1,2 +0,0 @@ -#define NO_RMB -#define NO_WMB diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_mb.log b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_mb.log deleted file mode 100644 index 4cee7dc..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_mb.log +++ /dev/null @@ -1,382 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_mb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 743) - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 72 byte, depth reached 10856, errors: 0 - 161519 states, stored - 1724866 states, matched - 1886385 transitions (= stored+matched) - 6692565 atomic steps -hash conflicts: 84009 (resolved) - -Stats on memory usage (in Megabytes): - 15.404 equivalent memory usage for states (stored*(State-vector + overhead)) - 10.421 actual memory usage for states (compression: 67.65%) - state-vector as stored = 40 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 476.115 total actual memory usage - -unreached in proctype urcu_reader_sig - line 403, "pan.___", state 330, "(1)" - line 614, "pan.___", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 652, "pan.___", state 213, "(1)" - line 403, "pan.___", state 239, "(1)" - line 403, "pan.___", state 525, "(1)" - line 399, "pan.___", state 610, "(1)" - line 403, "pan.___", state 624, "(1)" - line 403, "pan.___", state 724, "(1)" - line 399, "pan.___", state 805, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 807, "(1)" - line 399, "pan.___", state 808, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 808, "else" - line 399, "pan.___", state 811, "(1)" - line 403, "pan.___", state 819, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 821, "(1)" - line 403, "pan.___", state 822, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 822, "else" - line 403, "pan.___", state 825, "(1)" - line 403, "pan.___", state 826, "(1)" - line 403, "pan.___", state 826, "(1)" - line 401, "pan.___", state 831, "((j<1))" - line 401, "pan.___", state 831, "((j>=1))" - line 408, "pan.___", state 837, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 850, "(1)" - line 409, "pan.___", state 851, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 851, "else" - line 409, "pan.___", state 854, "(1)" - line 409, "pan.___", state 855, "(1)" - line 409, "pan.___", state 855, "(1)" - line 413, "pan.___", state 863, "(1)" - line 413, "pan.___", state 864, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 864, "else" - line 413, "pan.___", state 867, "(1)" - line 413, "pan.___", state 868, "(1)" - line 413, "pan.___", state 868, "(1)" - line 411, "pan.___", state 873, "((j<1))" - line 411, "pan.___", state 873, "((j>=1))" - line 418, "pan.___", state 880, "(1)" - line 418, "pan.___", state 881, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 881, "else" - line 418, "pan.___", state 884, "(1)" - line 418, "pan.___", state 885, "(1)" - line 418, "pan.___", state 885, "(1)" - line 399, "pan.___", state 896, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 898, "(1)" - line 399, "pan.___", state 899, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 899, "else" - line 399, "pan.___", state 902, "(1)" - line 403, "pan.___", state 910, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 912, "(1)" - line 403, "pan.___", state 913, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 913, "else" - line 403, "pan.___", state 916, "(1)" - line 403, "pan.___", state 917, "(1)" - line 403, "pan.___", state 917, "(1)" - line 401, "pan.___", state 922, "((j<1))" - line 401, "pan.___", state 922, "((j>=1))" - line 408, "pan.___", state 928, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 941, "(1)" - line 409, "pan.___", state 942, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 942, "else" - line 409, "pan.___", state 945, "(1)" - line 409, "pan.___", state 946, "(1)" - line 409, "pan.___", state 946, "(1)" - line 413, "pan.___", state 954, "(1)" - line 413, "pan.___", state 955, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 955, "else" - line 413, "pan.___", state 958, "(1)" - line 413, "pan.___", state 959, "(1)" - line 413, "pan.___", state 959, "(1)" - line 411, "pan.___", state 964, "((j<1))" - line 411, "pan.___", state 964, "((j>=1))" - line 418, "pan.___", state 971, "(1)" - line 418, "pan.___", state 972, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 972, "else" - line 418, "pan.___", state 975, "(1)" - line 418, "pan.___", state 976, "(1)" - line 418, "pan.___", state 976, "(1)" - line 194, "pan.___", state 981, "(1)" - line 194, "pan.___", state 981, "(1)" - line 214, "pan.___", state 985, "((i<1))" - line 214, "pan.___", state 985, "((i>=1))" - line 399, "pan.___", state 991, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 993, "(1)" - line 399, "pan.___", state 994, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 994, "else" - line 399, "pan.___", state 997, "(1)" - line 403, "pan.___", state 1005, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 1007, "(1)" - line 403, "pan.___", state 1008, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 1008, "else" - line 403, "pan.___", state 1011, "(1)" - line 403, "pan.___", state 1012, "(1)" - line 403, "pan.___", state 1012, "(1)" - line 401, "pan.___", state 1017, "((j<1))" - line 401, "pan.___", state 1017, "((j>=1))" - line 408, "pan.___", state 1023, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 1036, "(1)" - line 409, "pan.___", state 1037, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 1037, "else" - line 409, "pan.___", state 1040, "(1)" - line 409, "pan.___", state 1041, "(1)" - line 409, "pan.___", state 1041, "(1)" - line 413, "pan.___", state 1049, "(1)" - line 413, "pan.___", state 1050, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 1050, "else" - line 413, "pan.___", state 1053, "(1)" - line 413, "pan.___", state 1054, "(1)" - line 413, "pan.___", state 1054, "(1)" - line 411, "pan.___", state 1059, "((j<1))" - line 411, "pan.___", state 1059, "((j>=1))" - line 418, "pan.___", state 1066, "(1)" - line 418, "pan.___", state 1067, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 1067, "else" - line 418, "pan.___", state 1070, "(1)" - line 418, "pan.___", state 1071, "(1)" - line 418, "pan.___", state 1071, "(1)" - line 194, "pan.___", state 1076, "(1)" - line 194, "pan.___", state 1076, "(1)" - line 221, "pan.___", state 1077, "(1)" - line 221, "pan.___", state 1077, "(1)" - line 356, "pan.___", state 1083, "((sighand_exec==1))" - line 356, "pan.___", state 1083, "else" - line 362, "pan.___", state 1086, "sighand_exec = 1" - line 399, "pan.___", state 1099, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 1101, "(1)" - line 399, "pan.___", state 1102, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 1102, "else" - line 399, "pan.___", state 1105, "(1)" - line 403, "pan.___", state 1113, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 1115, "(1)" - line 403, "pan.___", state 1116, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 1116, "else" - line 403, "pan.___", state 1119, "(1)" - line 403, "pan.___", state 1120, "(1)" - line 403, "pan.___", state 1120, "(1)" - line 401, "pan.___", state 1125, "((i<1))" - line 401, "pan.___", state 1125, "((i>=1))" - line 408, "pan.___", state 1131, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 1144, "(1)" - line 409, "pan.___", state 1145, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 1145, "else" - line 409, "pan.___", state 1148, "(1)" - line 409, "pan.___", state 1149, "(1)" - line 409, "pan.___", state 1149, "(1)" - line 413, "pan.___", state 1157, "(1)" - line 413, "pan.___", state 1158, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 1158, "else" - line 413, "pan.___", state 1161, "(1)" - line 413, "pan.___", state 1162, "(1)" - line 413, "pan.___", state 1162, "(1)" - line 411, "pan.___", state 1167, "((i<1))" - line 411, "pan.___", state 1167, "((i>=1))" - line 418, "pan.___", state 1174, "(1)" - line 418, "pan.___", state 1175, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 1175, "else" - line 418, "pan.___", state 1178, "(1)" - line 418, "pan.___", state 1179, "(1)" - line 418, "pan.___", state 1179, "(1)" - line 420, "pan.___", state 1182, "(1)" - line 420, "pan.___", state 1182, "(1)" - line 362, "pan.___", state 1191, "sighand_exec = 1" - line 403, "pan.___", state 1222, "(1)" - line 403, "pan.___", state 1319, "(1)" - line 399, "pan.___", state 1404, "(1)" - line 403, "pan.___", state 1418, "(1)" - line 403, "pan.___", state 1518, "(1)" - line 399, "pan.___", state 1599, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 1601, "(1)" - line 399, "pan.___", state 1602, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 1602, "else" - line 399, "pan.___", state 1605, "(1)" - line 403, "pan.___", state 1613, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 1615, "(1)" - line 403, "pan.___", state 1616, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 1616, "else" - line 403, "pan.___", state 1619, "(1)" - line 403, "pan.___", state 1620, "(1)" - line 403, "pan.___", state 1620, "(1)" - line 401, "pan.___", state 1625, "((j<1))" - line 401, "pan.___", state 1625, "((j>=1))" - line 408, "pan.___", state 1631, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 1644, "(1)" - line 409, "pan.___", state 1645, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 1645, "else" - line 409, "pan.___", state 1648, "(1)" - line 409, "pan.___", state 1649, "(1)" - line 409, "pan.___", state 1649, "(1)" - line 413, "pan.___", state 1657, "(1)" - line 413, "pan.___", state 1658, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 1658, "else" - line 413, "pan.___", state 1661, "(1)" - line 413, "pan.___", state 1662, "(1)" - line 413, "pan.___", state 1662, "(1)" - line 411, "pan.___", state 1667, "((j<1))" - line 411, "pan.___", state 1667, "((j>=1))" - line 418, "pan.___", state 1674, "(1)" - line 418, "pan.___", state 1675, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 1675, "else" - line 418, "pan.___", state 1678, "(1)" - line 418, "pan.___", state 1679, "(1)" - line 418, "pan.___", state 1679, "(1)" - line 399, "pan.___", state 1690, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 1692, "(1)" - line 399, "pan.___", state 1693, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 1693, "else" - line 399, "pan.___", state 1696, "(1)" - line 403, "pan.___", state 1704, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 1706, "(1)" - line 403, "pan.___", state 1707, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 1707, "else" - line 403, "pan.___", state 1710, "(1)" - line 403, "pan.___", state 1711, "(1)" - line 403, "pan.___", state 1711, "(1)" - line 401, "pan.___", state 1716, "((j<1))" - line 401, "pan.___", state 1716, "((j>=1))" - line 408, "pan.___", state 1722, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 1735, "(1)" - line 409, "pan.___", state 1736, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 1736, "else" - line 409, "pan.___", state 1739, "(1)" - line 409, "pan.___", state 1740, "(1)" - line 409, "pan.___", state 1740, "(1)" - line 413, "pan.___", state 1748, "(1)" - line 413, "pan.___", state 1749, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 1749, "else" - line 413, "pan.___", state 1752, "(1)" - line 413, "pan.___", state 1753, "(1)" - line 413, "pan.___", state 1753, "(1)" - line 411, "pan.___", state 1758, "((j<1))" - line 411, "pan.___", state 1758, "((j>=1))" - line 418, "pan.___", state 1765, "(1)" - line 418, "pan.___", state 1766, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 1766, "else" - line 418, "pan.___", state 1769, "(1)" - line 418, "pan.___", state 1770, "(1)" - line 418, "pan.___", state 1770, "(1)" - line 194, "pan.___", state 1775, "(1)" - line 194, "pan.___", state 1775, "(1)" - line 214, "pan.___", state 1779, "((i<1))" - line 214, "pan.___", state 1779, "((i>=1))" - line 399, "pan.___", state 1785, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 1787, "(1)" - line 399, "pan.___", state 1788, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 1788, "else" - line 399, "pan.___", state 1791, "(1)" - line 403, "pan.___", state 1799, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 1801, "(1)" - line 403, "pan.___", state 1802, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 1802, "else" - line 403, "pan.___", state 1805, "(1)" - line 403, "pan.___", state 1806, "(1)" - line 403, "pan.___", state 1806, "(1)" - line 401, "pan.___", state 1811, "((j<1))" - line 401, "pan.___", state 1811, "((j>=1))" - line 408, "pan.___", state 1817, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 1830, "(1)" - line 409, "pan.___", state 1831, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 1831, "else" - line 409, "pan.___", state 1834, "(1)" - line 409, "pan.___", state 1835, "(1)" - line 409, "pan.___", state 1835, "(1)" - line 413, "pan.___", state 1843, "(1)" - line 413, "pan.___", state 1844, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 1844, "else" - line 413, "pan.___", state 1847, "(1)" - line 413, "pan.___", state 1848, "(1)" - line 413, "pan.___", state 1848, "(1)" - line 411, "pan.___", state 1853, "((j<1))" - line 411, "pan.___", state 1853, "((j>=1))" - line 418, "pan.___", state 1860, "(1)" - line 418, "pan.___", state 1861, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 1861, "else" - line 418, "pan.___", state 1864, "(1)" - line 418, "pan.___", state 1865, "(1)" - line 418, "pan.___", state 1865, "(1)" - line 194, "pan.___", state 1870, "(1)" - line 194, "pan.___", state 1870, "(1)" - line 221, "pan.___", state 1871, "(1)" - line 221, "pan.___", state 1871, "(1)" - line 356, "pan.___", state 1877, "((sighand_exec==1))" - line 356, "pan.___", state 1877, "else" - line 362, "pan.___", state 1880, "sighand_exec = 1" - line 399, "pan.___", state 1893, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 1895, "(1)" - line 399, "pan.___", state 1896, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 1896, "else" - line 399, "pan.___", state 1899, "(1)" - line 403, "pan.___", state 1907, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 1909, "(1)" - line 403, "pan.___", state 1910, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 1910, "else" - line 403, "pan.___", state 1913, "(1)" - line 403, "pan.___", state 1914, "(1)" - line 403, "pan.___", state 1914, "(1)" - line 401, "pan.___", state 1919, "((i<1))" - line 401, "pan.___", state 1919, "((i>=1))" - line 408, "pan.___", state 1925, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 1938, "(1)" - line 409, "pan.___", state 1939, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 1939, "else" - line 409, "pan.___", state 1942, "(1)" - line 409, "pan.___", state 1943, "(1)" - line 409, "pan.___", state 1943, "(1)" - line 413, "pan.___", state 1951, "(1)" - line 413, "pan.___", state 1952, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 1952, "else" - line 413, "pan.___", state 1955, "(1)" - line 413, "pan.___", state 1956, "(1)" - line 413, "pan.___", state 1956, "(1)" - line 411, "pan.___", state 1961, "((i<1))" - line 411, "pan.___", state 1961, "((i>=1))" - line 418, "pan.___", state 1968, "(1)" - line 418, "pan.___", state 1969, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 1969, "else" - line 418, "pan.___", state 1972, "(1)" - line 418, "pan.___", state 1973, "(1)" - line 418, "pan.___", state 1973, "(1)" - line 420, "pan.___", state 1976, "(1)" - line 420, "pan.___", state 1976, "(1)" - line 362, "pan.___", state 1985, "sighand_exec = 1" - line 403, "pan.___", state 2016, "(1)" - line 702, "pan.___", state 2304, "-end-" - (221 of 2304 states) -unreached in proctype :init: - (0 of 46 states) -unreached in proctype :never: - line 748, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 1.47 seconds -pan: rate 109876.87 states/second -pan: avg transition delay 7.7927e-07 usec -cp .input.spin urcu_free_no_mb.spin.input -cp .input.spin.trail urcu_free_no_mb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_mb.spin.input b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_mb.spin.input deleted file mode 100644 index 48411ec..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_mb.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define NO_RMB -#define NO_WMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_mb.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_mb.spin.input.trail deleted file mode 100644 index 00fba51..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_mb.spin.input.trail +++ /dev/null @@ -1,2172 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4249 -2:4:4201 -3:4:4204 -4:4:4204 -5:4:4207 -6:4:4215 -7:4:4215 -8:4:4218 -9:4:4224 -10:4:4228 -11:4:4228 -12:4:4231 -13:4:4239 -14:4:4243 -15:4:4244 -16:0:4249 -17:4:4246 -18:0:4249 -19:3:1991 -20:0:4249 -21:3:1997 -22:0:4249 -23:3:1998 -24:0:4249 -25:3:1999 -26:3:2003 -27:3:2004 -28:3:2012 -29:3:2013 -30:3:2017 -31:3:2018 -32:3:2026 -33:3:2031 -34:3:2035 -35:3:2036 -36:3:2043 -37:3:2044 -38:3:2055 -39:3:2056 -40:3:2057 -41:3:2068 -42:3:2073 -43:3:2074 -44:0:4249 -45:3:2086 -46:0:4249 -47:3:2088 -48:3:2089 -49:0:4249 -50:3:2093 -51:3:2097 -52:3:2098 -53:3:2106 -54:3:2107 -55:3:2111 -56:3:2112 -57:3:2120 -58:3:2125 -59:3:2126 -60:3:2137 -61:3:2138 -62:3:2149 -63:3:2150 -64:3:2151 -65:3:2162 -66:3:2167 -67:3:2168 -68:0:4249 -69:3:2180 -70:0:4249 -71:3:2182 -72:0:4249 -73:3:2183 -74:0:4249 -75:3:2193 -76:0:4249 -77:3:2194 -78:0:4249 -79:3:2195 -80:3:2199 -81:3:2200 -82:3:2208 -83:3:2209 -84:3:2213 -85:3:2214 -86:3:2222 -87:3:2227 -88:3:2231 -89:3:2232 -90:3:2239 -91:3:2240 -92:3:2251 -93:3:2252 -94:3:2253 -95:3:2264 -96:3:2269 -97:3:2270 -98:0:4249 -99:3:2285 -100:0:4249 -101:3:2286 -102:3:2290 -103:3:2291 -104:3:2299 -105:3:2300 -106:3:2304 -107:3:2305 -108:3:2313 -109:3:2318 -110:3:2322 -111:3:2323 -112:3:2330 -113:3:2331 -114:3:2342 -115:3:2343 -116:3:2344 -117:3:2355 -118:3:2360 -119:3:2361 -120:0:4249 -121:3:2376 -122:0:4249 -123:3:2381 -124:3:2385 -125:3:2386 -126:3:2394 -127:3:2395 -128:3:2399 -129:3:2400 -130:3:2408 -131:3:2413 -132:3:2417 -133:3:2418 -134:3:2425 -135:3:2426 -136:3:2437 -137:3:2438 -138:3:2439 -139:3:2450 -140:3:2455 -141:3:2456 -142:0:4249 -143:3:2475 -144:0:4249 -145:3:2477 -146:0:4249 -147:3:2478 -148:3:2482 -149:3:2483 -150:3:2491 -151:3:2492 -152:3:2496 -153:3:2497 -154:3:2505 -155:3:2510 -156:3:2514 -157:3:2515 -158:3:2522 -159:3:2523 -160:3:2534 -161:3:2535 -162:3:2536 -163:3:2547 -164:3:2552 -165:3:2553 -166:0:4249 -167:3:2565 -168:0:4249 -169:3:2567 -170:0:4249 -171:3:2570 -172:3:2571 -173:3:2583 -174:3:2584 -175:3:2588 -176:3:2589 -177:3:2597 -178:3:2602 -179:3:2606 -180:3:2607 -181:3:2614 -182:3:2615 -183:3:2626 -184:3:2627 -185:3:2628 -186:3:2639 -187:3:2644 -188:3:2645 -189:0:4249 -190:3:2657 -191:0:4249 -192:3:2659 -193:0:4249 -194:3:2660 -195:0:4249 -196:3:2661 -197:0:4249 -198:3:2662 -199:0:4249 -200:3:2663 -201:3:2667 -202:3:2668 -203:3:2676 -204:3:2677 -205:3:2681 -206:3:2682 -207:3:2690 -208:3:2695 -209:3:2699 -210:3:2700 -211:3:2707 -212:3:2708 -213:3:2719 -214:3:2720 -215:3:2721 -216:3:2732 -217:3:2737 -218:3:2738 -219:0:4249 -220:3:2750 -221:0:4249 -222:3:3036 -223:0:4249 -224:3:3134 -225:0:4249 -226:3:3135 -227:0:4249 -228:3:3139 -229:0:4249 -230:3:3145 -231:3:3149 -232:3:3150 -233:3:3158 -234:3:3159 -235:3:3163 -236:3:3164 -237:3:3172 -238:3:3177 -239:3:3181 -240:3:3182 -241:3:3189 -242:3:3190 -243:3:3201 -244:3:3202 -245:3:3203 -246:3:3214 -247:3:3219 -248:3:3220 -249:0:4249 -250:3:3232 -251:0:4249 -252:3:3234 -253:0:4249 -254:3:3235 -255:3:3239 -256:3:3240 -257:3:3248 -258:3:3249 -259:3:3253 -260:3:3254 -261:3:3262 -262:3:3267 -263:3:3271 -264:3:3272 -265:3:3279 -266:3:3280 -267:3:3291 -268:3:3292 -269:3:3293 -270:3:3304 -271:3:3309 -272:3:3310 -273:0:4249 -274:3:3322 -275:0:4249 -276:3:3324 -277:0:4249 -278:3:3327 -279:3:3328 -280:3:3340 -281:3:3341 -282:3:3345 -283:3:3346 -284:3:3354 -285:3:3359 -286:3:3363 -287:3:3364 -288:3:3371 -289:3:3372 -290:3:3383 -291:3:3384 -292:3:3385 -293:3:3396 -294:3:3401 -295:3:3402 -296:0:4249 -297:3:3414 -298:0:4249 -299:3:3416 -300:0:4249 -301:3:3417 -302:0:4249 -303:3:3418 -304:0:4249 -305:3:3419 -306:0:4249 -307:3:3420 -308:3:3424 -309:3:3425 -310:3:3433 -311:3:3434 -312:3:3438 -313:3:3439 -314:3:3447 -315:3:3452 -316:3:3456 -317:3:3457 -318:3:3464 -319:3:3465 -320:3:3476 -321:3:3477 -322:3:3478 -323:3:3489 -324:3:3494 -325:3:3495 -326:0:4249 -327:3:3507 -328:0:4249 -329:3:3793 -330:0:4249 -331:3:3891 -332:0:4249 -333:3:3892 -334:0:4249 -335:3:3896 -336:0:4249 -337:3:3902 -338:0:4249 -339:3:3903 -340:3:3907 -341:3:3908 -342:3:3916 -343:3:3917 -344:3:3921 -345:3:3922 -346:3:3930 -347:3:3935 -348:3:3939 -349:3:3940 -350:3:3947 -351:3:3948 -352:3:3959 -353:3:3960 -354:3:3961 -355:3:3972 -356:3:3977 -357:3:3978 -358:0:4249 -359:3:3993 -360:0:4249 -361:3:3994 -362:3:3998 -363:3:3999 -364:3:4007 -365:3:4008 -366:3:4012 -367:3:4013 -368:3:4021 -369:3:4026 -370:3:4030 -371:3:4031 -372:3:4038 -373:3:4039 -374:3:4050 -375:3:4051 -376:3:4052 -377:3:4063 -378:3:4068 -379:3:4069 -380:0:4249 -381:3:4084 -382:0:4249 -383:3:4089 -384:3:4093 -385:3:4094 -386:3:4102 -387:3:4103 -388:3:4107 -389:3:4108 -390:3:4116 -391:3:4121 -392:3:4125 -393:3:4126 -394:3:4133 -395:3:4134 -396:3:4145 -397:3:4146 -398:3:4147 -399:3:4158 -400:3:4163 -401:3:4164 -402:0:4249 -403:3:4183 -404:0:4249 -405:3:4185 -406:0:4249 -407:3:4186 -408:0:4249 -409:3:1998 -410:0:4249 -411:3:1999 -412:3:2003 -413:3:2004 -414:3:2012 -415:3:2013 -416:3:2017 -417:3:2018 -418:3:2026 -419:3:2031 -420:3:2035 -421:3:2036 -422:3:2043 -423:3:2044 -424:3:2055 -425:3:2056 -426:3:2057 -427:3:2068 -428:3:2073 -429:3:2074 -430:0:4249 -431:3:2086 -432:0:4249 -433:3:2088 -434:3:2089 -435:0:4249 -436:3:2093 -437:3:2097 -438:3:2098 -439:3:2106 -440:3:2107 -441:3:2111 -442:3:2112 -443:3:2120 -444:3:2125 -445:3:2126 -446:3:2137 -447:3:2138 -448:3:2149 -449:3:2150 -450:3:2151 -451:3:2162 -452:3:2167 -453:3:2168 -454:0:4249 -455:3:2180 -456:0:4249 -457:3:2182 -458:0:4249 -459:3:2183 -460:0:4249 -461:3:2193 -462:0:4249 -463:3:2194 -464:0:4249 -465:3:2195 -466:3:2199 -467:3:2200 -468:3:2208 -469:3:2209 -470:3:2213 -471:3:2214 -472:3:2222 -473:3:2227 -474:3:2231 -475:3:2232 -476:3:2239 -477:3:2240 -478:3:2251 -479:3:2252 -480:3:2253 -481:3:2264 -482:3:2269 -483:3:2270 -484:0:4249 -485:3:2285 -486:0:4249 -487:3:2286 -488:3:2290 -489:3:2291 -490:3:2299 -491:3:2300 -492:3:2304 -493:3:2305 -494:3:2313 -495:3:2318 -496:3:2322 -497:3:2323 -498:3:2330 -499:3:2331 -500:3:2342 -501:3:2343 -502:3:2344 -503:3:2355 -504:3:2360 -505:3:2361 -506:0:4249 -507:3:2376 -508:0:4249 -509:3:2381 -510:3:2385 -511:3:2386 -512:3:2394 -513:3:2395 -514:3:2399 -515:3:2400 -516:3:2408 -517:3:2413 -518:3:2417 -519:3:2418 -520:3:2425 -521:3:2426 -522:3:2437 -523:3:2438 -524:3:2439 -525:3:2450 -526:3:2455 -527:3:2456 -528:0:4249 -529:3:2475 -530:0:4249 -531:3:2477 -532:0:4249 -533:3:2478 -534:3:2482 -535:3:2483 -536:3:2491 -537:3:2492 -538:3:2496 -539:3:2497 -540:3:2505 -541:3:2510 -542:3:2514 -543:3:2515 -544:3:2522 -545:3:2523 -546:3:2534 -547:3:2535 -548:3:2536 -549:3:2547 -550:3:2552 -551:3:2553 -552:0:4249 -553:3:2565 -554:0:4249 -555:3:2567 -556:0:4249 -557:3:2570 -558:3:2571 -559:3:2583 -560:3:2584 -561:3:2588 -562:3:2589 -563:3:2597 -564:3:2602 -565:3:2606 -566:3:2607 -567:3:2614 -568:3:2615 -569:3:2626 -570:3:2627 -571:3:2628 -572:3:2639 -573:3:2644 -574:3:2645 -575:0:4249 -576:3:2657 -577:0:4249 -578:3:2659 -579:0:4249 -580:3:2660 -581:0:4249 -582:3:2661 -583:0:4249 -584:3:2662 -585:0:4249 -586:3:2663 -587:3:2667 -588:3:2668 -589:3:2676 -590:3:2677 -591:3:2681 -592:3:2682 -593:3:2690 -594:3:2695 -595:3:2699 -596:3:2700 -597:3:2707 -598:3:2708 -599:3:2719 -600:3:2720 -601:3:2721 -602:3:2732 -603:3:2737 -604:3:2738 -605:0:4249 -606:3:2750 -607:0:4249 -608:3:3036 -609:0:4249 -610:3:3134 -611:0:4249 -612:3:3135 -613:0:4249 -614:3:3139 -615:0:4249 -616:3:3145 -617:3:3149 -618:3:3150 -619:3:3158 -620:3:3159 -621:3:3163 -622:3:3164 -623:3:3172 -624:3:3177 -625:3:3181 -626:3:3182 -627:3:3189 -628:3:3190 -629:3:3201 -630:3:3202 -631:3:3203 -632:3:3214 -633:3:3219 -634:3:3220 -635:0:4249 -636:3:3232 -637:0:4249 -638:3:3234 -639:0:4249 -640:3:3235 -641:3:3239 -642:3:3240 -643:3:3248 -644:3:3249 -645:3:3253 -646:3:3254 -647:3:3262 -648:3:3267 -649:3:3271 -650:3:3272 -651:3:3279 -652:3:3280 -653:3:3291 -654:3:3292 -655:3:3293 -656:3:3304 -657:3:3309 -658:3:3310 -659:0:4249 -660:3:3322 -661:0:4249 -662:3:3324 -663:0:4249 -664:3:3327 -665:3:3328 -666:3:3340 -667:3:3341 -668:3:3345 -669:3:3346 -670:3:3354 -671:3:3359 -672:3:3363 -673:3:3364 -674:3:3371 -675:3:3372 -676:3:3383 -677:3:3384 -678:3:3385 -679:3:3396 -680:3:3401 -681:3:3402 -682:0:4249 -683:3:3414 -684:0:4249 -685:3:3416 -686:0:4249 -687:3:3417 -688:0:4249 -689:3:3418 -690:0:4249 -691:3:3419 -692:0:4249 -693:3:3420 -694:3:3424 -695:3:3425 -696:3:3433 -697:3:3434 -698:3:3438 -699:3:3439 -700:3:3447 -701:3:3452 -702:3:3456 -703:3:3457 -704:3:3464 -705:3:3465 -706:3:3476 -707:3:3477 -708:3:3478 -709:3:3489 -710:3:3494 -711:3:3495 -712:0:4249 -713:3:3507 -714:0:4249 -715:3:3793 -716:0:4249 -717:3:3891 -718:0:4249 -719:3:3892 -720:0:4249 -721:3:3896 -722:0:4249 -723:3:3902 -724:0:4249 -725:3:3903 -726:3:3907 -727:3:3908 -728:3:3916 -729:3:3917 -730:3:3921 -731:3:3922 -732:3:3930 -733:3:3935 -734:3:3939 -735:3:3940 -736:3:3947 -737:3:3948 -738:3:3959 -739:3:3960 -740:3:3961 -741:3:3972 -742:3:3977 -743:3:3978 -744:0:4249 -745:3:3993 -746:0:4249 -747:3:3994 -748:3:3998 -749:3:3999 -750:3:4007 -751:3:4008 -752:3:4012 -753:3:4013 -754:3:4021 -755:3:4026 -756:3:4030 -757:3:4031 -758:3:4038 -759:3:4039 -760:3:4050 -761:3:4051 -762:3:4052 -763:3:4063 -764:3:4068 -765:3:4069 -766:0:4249 -767:3:4084 -768:0:4249 -769:3:4089 -770:3:4093 -771:3:4094 -772:3:4102 -773:3:4103 -774:3:4107 -775:3:4108 -776:3:4116 -777:3:4121 -778:3:4125 -779:3:4126 -780:3:4133 -781:3:4134 -782:3:4145 -783:3:4146 -784:3:4147 -785:3:4158 -786:3:4163 -787:3:4164 -788:0:4249 -789:3:4183 -790:0:4249 -791:3:4185 -792:0:4249 -793:3:4186 -794:0:4249 -795:3:1998 -796:0:4249 -797:3:1999 -798:3:2003 -799:3:2004 -800:3:2012 -801:3:2013 -802:3:2017 -803:3:2018 -804:3:2026 -805:3:2031 -806:3:2035 -807:3:2036 -808:3:2043 -809:3:2044 -810:3:2055 -811:3:2056 -812:3:2057 -813:3:2068 -814:3:2073 -815:3:2074 -816:0:4249 -817:3:2086 -818:0:4249 -819:3:2088 -820:3:2089 -821:0:4249 -822:3:2093 -823:3:2097 -824:3:2098 -825:3:2106 -826:3:2107 -827:3:2111 -828:3:2112 -829:3:2120 -830:3:2125 -831:3:2126 -832:3:2137 -833:3:2138 -834:3:2149 -835:3:2150 -836:3:2151 -837:3:2162 -838:3:2167 -839:3:2168 -840:0:4249 -841:3:2180 -842:0:4249 -843:3:2182 -844:0:4249 -845:3:2183 -846:0:4249 -847:3:2193 -848:0:4249 -849:3:2194 -850:0:4249 -851:3:2195 -852:3:2199 -853:3:2200 -854:3:2208 -855:3:2209 -856:3:2213 -857:3:2214 -858:3:2222 -859:3:2227 -860:3:2231 -861:3:2232 -862:3:2239 -863:3:2240 -864:3:2251 -865:3:2252 -866:3:2253 -867:3:2264 -868:3:2269 -869:3:2270 -870:0:4249 -871:3:2285 -872:0:4249 -873:3:2286 -874:3:2290 -875:3:2291 -876:3:2299 -877:3:2300 -878:3:2304 -879:3:2305 -880:3:2313 -881:3:2318 -882:3:2322 -883:3:2323 -884:3:2330 -885:3:2331 -886:3:2342 -887:3:2343 -888:3:2344 -889:3:2355 -890:3:2360 -891:3:2361 -892:0:4249 -893:3:2376 -894:0:4249 -895:3:2381 -896:3:2385 -897:3:2386 -898:3:2394 -899:3:2395 -900:3:2399 -901:3:2400 -902:3:2408 -903:3:2413 -904:3:2417 -905:3:2418 -906:3:2425 -907:3:2426 -908:3:2437 -909:3:2438 -910:3:2439 -911:3:2450 -912:3:2455 -913:3:2456 -914:0:4249 -915:3:2475 -916:0:4249 -917:3:2477 -918:0:4249 -919:3:2478 -920:3:2482 -921:3:2483 -922:3:2491 -923:3:2492 -924:3:2496 -925:3:2497 -926:3:2505 -927:3:2510 -928:3:2514 -929:3:2515 -930:3:2522 -931:3:2523 -932:3:2534 -933:3:2535 -934:3:2536 -935:3:2547 -936:3:2552 -937:3:2553 -938:0:4249 -939:3:2565 -940:0:4249 -941:3:2567 -942:0:4249 -943:3:2570 -944:3:2571 -945:3:2583 -946:3:2584 -947:3:2588 -948:3:2589 -949:3:2597 -950:3:2602 -951:3:2606 -952:3:2607 -953:3:2614 -954:3:2615 -955:3:2626 -956:3:2627 -957:3:2628 -958:3:2639 -959:3:2644 -960:3:2645 -961:0:4249 -962:3:2657 -963:0:4249 -964:3:2659 -965:0:4249 -966:3:2660 -967:0:4249 -968:3:2661 -969:0:4249 -970:3:2662 -971:0:4249 -972:3:2663 -973:3:2667 -974:3:2668 -975:3:2676 -976:3:2677 -977:3:2681 -978:3:2682 -979:3:2690 -980:3:2695 -981:3:2699 -982:3:2700 -983:3:2707 -984:3:2708 -985:3:2719 -986:3:2720 -987:3:2721 -988:3:2732 -989:3:2737 -990:3:2738 -991:0:4249 -992:3:2750 -993:0:4249 -994:3:3036 -995:0:4249 -996:3:3134 -997:0:4249 -998:3:3135 -999:0:4249 -1000:3:3139 -1001:0:4249 -1002:3:3145 -1003:3:3149 -1004:3:3150 -1005:3:3158 -1006:3:3159 -1007:3:3163 -1008:3:3164 -1009:3:3172 -1010:3:3177 -1011:3:3181 -1012:3:3182 -1013:3:3189 -1014:3:3190 -1015:3:3201 -1016:3:3202 -1017:3:3203 -1018:3:3214 -1019:3:3219 -1020:3:3220 -1021:0:4249 -1022:3:3232 -1023:0:4249 -1024:3:3234 -1025:0:4249 -1026:3:3235 -1027:3:3239 -1028:3:3240 -1029:3:3248 -1030:3:3249 -1031:3:3253 -1032:3:3254 -1033:3:3262 -1034:3:3267 -1035:3:3271 -1036:3:3272 -1037:3:3279 -1038:3:3280 -1039:3:3291 -1040:3:3292 -1041:3:3293 -1042:3:3304 -1043:3:3309 -1044:3:3310 -1045:0:4249 -1046:3:3322 -1047:0:4249 -1048:3:3324 -1049:0:4249 -1050:3:3327 -1051:3:3328 -1052:3:3340 -1053:3:3341 -1054:3:3345 -1055:3:3346 -1056:3:3354 -1057:3:3359 -1058:3:3363 -1059:3:3364 -1060:3:3371 -1061:3:3372 -1062:3:3383 -1063:3:3384 -1064:3:3385 -1065:3:3396 -1066:3:3401 -1067:3:3402 -1068:0:4249 -1069:3:3414 -1070:0:4249 -1071:3:3416 -1072:0:4249 -1073:3:3417 -1074:0:4249 -1075:3:3418 -1076:0:4249 -1077:3:3419 -1078:0:4249 -1079:3:3420 -1080:3:3424 -1081:3:3425 -1082:3:3433 -1083:3:3434 -1084:3:3438 -1085:3:3439 -1086:3:3447 -1087:3:3452 -1088:3:3456 -1089:3:3457 -1090:3:3464 -1091:3:3465 -1092:3:3476 -1093:3:3477 -1094:3:3478 -1095:3:3489 -1096:3:3494 -1097:3:3495 -1098:0:4249 -1099:3:3507 -1100:0:4249 -1101:3:3793 -1102:0:4249 -1103:3:3891 -1104:0:4249 -1105:3:3892 -1106:0:4249 -1107:3:3896 -1108:0:4249 -1109:3:3902 -1110:0:4249 -1111:3:3903 -1112:3:3907 -1113:3:3908 -1114:3:3916 -1115:3:3917 -1116:3:3921 -1117:3:3922 -1118:3:3930 -1119:3:3935 -1120:3:3939 -1121:3:3940 -1122:3:3947 -1123:3:3948 -1124:3:3959 -1125:3:3960 -1126:3:3961 -1127:3:3972 -1128:3:3977 -1129:3:3978 -1130:0:4249 -1131:3:3993 -1132:0:4249 -1133:3:3994 -1134:3:3998 -1135:3:3999 -1136:3:4007 -1137:3:4008 -1138:3:4012 -1139:3:4013 -1140:3:4021 -1141:3:4026 -1142:3:4030 -1143:3:4031 -1144:3:4038 -1145:3:4039 -1146:3:4050 -1147:3:4051 -1148:3:4052 -1149:3:4063 -1150:3:4068 -1151:3:4069 -1152:0:4249 -1153:3:4084 -1154:0:4249 -1155:3:4089 -1156:3:4093 -1157:3:4094 -1158:3:4102 -1159:3:4103 -1160:3:4107 -1161:3:4108 -1162:3:4116 -1163:3:4121 -1164:3:4125 -1165:3:4126 -1166:3:4133 -1167:3:4134 -1168:3:4145 -1169:3:4146 -1170:3:4147 -1171:3:4158 -1172:3:4163 -1173:3:4164 -1174:0:4249 -1175:3:4183 -1176:0:4249 -1177:3:4185 -1178:0:4249 -1179:3:4186 -1180:0:4249 -1181:3:1998 -1182:0:4249 -1183:3:1999 -1184:3:2003 -1185:3:2004 -1186:3:2012 -1187:3:2013 -1188:3:2017 -1189:3:2018 -1190:3:2026 -1191:3:2031 -1192:3:2035 -1193:3:2036 -1194:3:2043 -1195:3:2044 -1196:3:2055 -1197:3:2056 -1198:3:2057 -1199:3:2068 -1200:3:2073 -1201:3:2074 -1202:0:4249 -1203:3:2086 -1204:0:4249 -1205:3:2088 -1206:3:2089 -1207:0:4249 -1208:3:2093 -1209:3:2097 -1210:3:2098 -1211:3:2106 -1212:3:2107 -1213:3:2111 -1214:3:2112 -1215:3:2120 -1216:3:2125 -1217:3:2126 -1218:3:2137 -1219:3:2138 -1220:3:2149 -1221:3:2150 -1222:3:2151 -1223:3:2162 -1224:3:2167 -1225:3:2168 -1226:0:4249 -1227:3:2180 -1228:0:4249 -1229:3:2182 -1230:0:4249 -1231:3:2183 -1232:0:4249 -1233:3:2193 -1234:0:4249 -1235:3:2194 -1236:0:4249 -1237:3:2195 -1238:3:2199 -1239:3:2200 -1240:3:2208 -1241:3:2209 -1242:3:2213 -1243:3:2214 -1244:3:2222 -1245:3:2227 -1246:3:2231 -1247:3:2232 -1248:3:2239 -1249:3:2240 -1250:3:2251 -1251:3:2252 -1252:3:2253 -1253:3:2264 -1254:3:2269 -1255:3:2270 -1256:0:4249 -1257:3:2285 -1258:0:4249 -1259:3:2286 -1260:3:2290 -1261:3:2291 -1262:3:2299 -1263:3:2300 -1264:3:2304 -1265:3:2305 -1266:3:2313 -1267:3:2318 -1268:3:2322 -1269:3:2323 -1270:3:2330 -1271:3:2331 -1272:3:2342 -1273:3:2343 -1274:3:2344 -1275:3:2355 -1276:3:2360 -1277:3:2361 -1278:0:4249 -1279:3:2376 -1280:0:4249 -1281:3:2381 -1282:3:2385 -1283:3:2386 -1284:3:2394 -1285:3:2395 -1286:3:2399 -1287:3:2400 -1288:3:2408 -1289:3:2413 -1290:3:2417 -1291:3:2418 -1292:3:2425 -1293:3:2426 -1294:3:2437 -1295:3:2438 -1296:3:2439 -1297:3:2450 -1298:3:2455 -1299:3:2456 -1300:0:4249 -1301:3:2475 -1302:0:4249 -1303:3:2477 -1304:0:4249 -1305:3:2478 -1306:3:2482 -1307:3:2483 -1308:3:2491 -1309:3:2492 -1310:3:2496 -1311:3:2497 -1312:3:2505 -1313:3:2510 -1314:3:2514 -1315:3:2515 -1316:3:2522 -1317:3:2523 -1318:3:2534 -1319:3:2535 -1320:3:2536 -1321:3:2547 -1322:3:2552 -1323:3:2553 -1324:0:4249 -1325:3:2565 -1326:0:4249 -1327:3:2567 -1328:0:4249 -1329:3:2570 -1330:3:2571 -1331:3:2583 -1332:3:2584 -1333:3:2588 -1334:3:2589 -1335:3:2597 -1336:3:2602 -1337:3:2606 -1338:3:2607 -1339:3:2614 -1340:3:2615 -1341:3:2626 -1342:3:2627 -1343:3:2628 -1344:3:2639 -1345:3:2644 -1346:3:2645 -1347:0:4249 -1348:3:2657 -1349:0:4249 -1350:3:2659 -1351:0:4249 -1352:3:2660 -1353:0:4249 -1354:3:2661 -1355:0:4249 -1356:3:2662 -1357:0:4249 -1358:3:2663 -1359:3:2667 -1360:3:2668 -1361:3:2676 -1362:3:2677 -1363:3:2681 -1364:3:2682 -1365:3:2690 -1366:3:2695 -1367:3:2699 -1368:3:2700 -1369:3:2707 -1370:3:2708 -1371:3:2719 -1372:3:2720 -1373:3:2721 -1374:3:2732 -1375:3:2737 -1376:3:2738 -1377:0:4249 -1378:3:2750 -1379:0:4249 -1380:3:3036 -1381:0:4249 -1382:3:3134 -1383:0:4249 -1384:3:3135 -1385:0:4249 -1386:3:3139 -1387:0:4249 -1388:3:3145 -1389:3:3149 -1390:3:3150 -1391:3:3158 -1392:3:3159 -1393:3:3163 -1394:3:3164 -1395:3:3172 -1396:3:3177 -1397:3:3181 -1398:3:3182 -1399:3:3189 -1400:3:3190 -1401:3:3201 -1402:3:3202 -1403:3:3203 -1404:3:3214 -1405:3:3219 -1406:3:3220 -1407:0:4249 -1408:3:3232 -1409:0:4249 -1410:3:3234 -1411:0:4249 -1412:3:3235 -1413:3:3239 -1414:3:3240 -1415:3:3248 -1416:3:3249 -1417:3:3253 -1418:3:3254 -1419:3:3262 -1420:3:3267 -1421:3:3271 -1422:3:3272 -1423:3:3279 -1424:3:3280 -1425:3:3291 -1426:3:3292 -1427:3:3293 -1428:3:3304 -1429:3:3309 -1430:3:3310 -1431:0:4249 -1432:3:3322 -1433:0:4249 -1434:3:3324 -1435:0:4249 -1436:3:3327 -1437:3:3328 -1438:3:3340 -1439:3:3341 -1440:3:3345 -1441:3:3346 -1442:3:3354 -1443:3:3359 -1444:3:3363 -1445:3:3364 -1446:3:3371 -1447:3:3372 -1448:3:3383 -1449:3:3384 -1450:3:3385 -1451:3:3396 -1452:3:3401 -1453:3:3402 -1454:0:4249 -1455:3:3414 -1456:0:4249 -1457:3:3416 -1458:0:4249 -1459:3:3417 -1460:0:4249 -1461:3:3418 -1462:0:4249 -1463:3:3419 -1464:0:4249 -1465:3:3420 -1466:3:3424 -1467:3:3425 -1468:3:3433 -1469:3:3434 -1470:3:3438 -1471:3:3439 -1472:3:3447 -1473:3:3452 -1474:3:3456 -1475:3:3457 -1476:3:3464 -1477:3:3465 -1478:3:3476 -1479:3:3477 -1480:3:3478 -1481:3:3489 -1482:3:3494 -1483:3:3495 -1484:0:4249 -1485:3:3507 -1486:0:4249 -1487:3:3793 -1488:0:4249 -1489:3:3891 -1490:0:4249 -1491:3:3892 -1492:0:4249 -1493:3:3896 -1494:0:4249 -1495:3:3902 -1496:0:4249 -1497:3:3903 -1498:3:3907 -1499:3:3908 -1500:3:3916 -1501:3:3917 -1502:3:3921 -1503:3:3922 -1504:3:3930 -1505:3:3935 -1506:3:3939 -1507:3:3940 -1508:3:3947 -1509:3:3948 -1510:3:3959 -1511:3:3960 -1512:3:3961 -1513:3:3972 -1514:3:3977 -1515:3:3978 -1516:0:4249 -1517:3:3993 -1518:0:4249 -1519:3:3994 -1520:3:3998 -1521:3:3999 -1522:3:4007 -1523:3:4008 -1524:3:4012 -1525:3:4013 -1526:3:4021 -1527:3:4026 -1528:3:4030 -1529:3:4031 -1530:3:4038 -1531:3:4039 -1532:3:4050 -1533:3:4051 -1534:3:4052 -1535:3:4063 -1536:3:4068 -1537:3:4069 -1538:0:4249 -1539:3:4084 -1540:0:4249 -1541:3:4089 -1542:3:4093 -1543:3:4094 -1544:3:4102 -1545:3:4103 -1546:3:4107 -1547:3:4108 -1548:3:4116 -1549:3:4121 -1550:3:4125 -1551:3:4126 -1552:3:4133 -1553:3:4134 -1554:3:4145 -1555:3:4146 -1556:3:4147 -1557:3:4158 -1558:3:4163 -1559:3:4164 -1560:0:4249 -1561:3:4183 -1562:0:4249 -1563:3:4185 -1564:0:4249 -1565:3:4186 -1566:0:4249 -1567:3:1998 -1568:0:4249 -1569:3:1999 -1570:3:2003 -1571:3:2004 -1572:3:2012 -1573:3:2013 -1574:3:2017 -1575:3:2018 -1576:3:2026 -1577:3:2031 -1578:3:2035 -1579:3:2036 -1580:3:2043 -1581:3:2044 -1582:3:2055 -1583:3:2056 -1584:3:2057 -1585:3:2068 -1586:3:2073 -1587:3:2074 -1588:0:4249 -1589:3:2086 -1590:0:4249 -1591:3:2088 -1592:3:2089 -1593:0:4249 -1594:3:2093 -1595:3:2097 -1596:3:2098 -1597:3:2106 -1598:3:2107 -1599:3:2111 -1600:3:2112 -1601:3:2120 -1602:3:2133 -1603:3:2134 -1604:3:2137 -1605:3:2138 -1606:3:2149 -1607:3:2150 -1608:3:2151 -1609:3:2162 -1610:3:2167 -1611:3:2170 -1612:3:2171 -1613:0:4249 -1614:3:2180 -1615:0:4249 -1616:3:2182 -1617:0:4249 -1618:3:2183 -1619:0:4249 -1620:3:2193 -1621:0:4249 -1622:3:2194 -1623:0:4249 -1624:3:2195 -1625:3:2199 -1626:3:2200 -1627:3:2208 -1628:3:2209 -1629:3:2213 -1630:3:2214 -1631:3:2222 -1632:3:2235 -1633:3:2236 -1634:3:2239 -1635:3:2240 -1636:3:2251 -1637:3:2252 -1638:3:2253 -1639:3:2264 -1640:3:2269 -1641:3:2272 -1642:3:2273 -1643:0:4249 -1644:3:2285 -1645:0:4249 -1646:3:2286 -1647:3:2290 -1648:3:2291 -1649:3:2299 -1650:3:2300 -1651:3:2304 -1652:3:2305 -1653:3:2313 -1654:3:2326 -1655:3:2327 -1656:3:2330 -1657:3:2331 -1658:3:2342 -1659:3:2343 -1660:3:2344 -1661:3:2355 -1662:3:2360 -1663:3:2363 -1664:3:2364 -1665:0:4249 -1666:3:2376 -1667:0:4249 -1668:3:2381 -1669:3:2385 -1670:3:2386 -1671:3:2394 -1672:3:2395 -1673:3:2399 -1674:3:2400 -1675:3:2408 -1676:3:2421 -1677:3:2422 -1678:3:2425 -1679:3:2426 -1680:3:2437 -1681:3:2438 -1682:3:2439 -1683:3:2450 -1684:3:2455 -1685:3:2458 -1686:3:2459 -1687:0:4249 -1688:3:2475 -1689:0:4249 -1690:3:2477 -1691:0:4249 -1692:3:2478 -1693:3:2482 -1694:3:2483 -1695:3:2491 -1696:3:2492 -1697:3:2496 -1698:3:2497 -1699:3:2505 -1700:3:2518 -1701:3:2519 -1702:3:2522 -1703:3:2523 -1704:3:2534 -1705:3:2535 -1706:3:2536 -1707:3:2547 -1708:3:2552 -1709:3:2555 -1710:3:2556 -1711:0:4249 -1712:3:2565 -1713:0:4249 -1714:3:2567 -1715:0:4249 -1716:3:2570 -1717:3:2571 -1718:3:2583 -1719:3:2584 -1720:3:2588 -1721:3:2589 -1722:3:2597 -1723:3:2610 -1724:3:2611 -1725:3:2614 -1726:3:2615 -1727:3:2626 -1728:3:2627 -1729:3:2628 -1730:3:2639 -1731:3:2644 -1732:3:2647 -1733:3:2648 -1734:0:4249 -1735:3:2657 -1736:0:4249 -1737:3:2659 -1738:0:4249 -1739:3:2660 -1740:0:4249 -1741:3:2661 -1742:0:4249 -1743:3:2662 -1744:0:4249 -1745:3:2663 -1746:3:2667 -1747:3:2668 -1748:3:2676 -1749:3:2677 -1750:3:2681 -1751:3:2682 -1752:3:2690 -1753:3:2703 -1754:3:2704 -1755:3:2707 -1756:3:2708 -1757:3:2719 -1758:3:2720 -1759:3:2721 -1760:3:2732 -1761:3:2737 -1762:3:2740 -1763:3:2741 -1764:0:4249 -1765:3:2750 -1766:0:4249 -1767:3:3036 -1768:0:4249 -1769:3:3134 -1770:0:4249 -1771:3:3135 -1772:0:4249 -1773:3:3139 -1774:0:4249 -1775:3:3145 -1776:3:3149 -1777:3:3150 -1778:3:3158 -1779:3:3159 -1780:3:3163 -1781:3:3164 -1782:3:3172 -1783:3:3185 -1784:3:3186 -1785:3:3189 -1786:3:3190 -1787:3:3201 -1788:3:3202 -1789:3:3203 -1790:3:3214 -1791:3:3219 -1792:3:3222 -1793:3:3223 -1794:0:4249 -1795:3:3232 -1796:0:4249 -1797:3:3234 -1798:0:4249 -1799:3:3235 -1800:3:3239 -1801:3:3240 -1802:3:3248 -1803:3:3249 -1804:3:3253 -1805:3:3254 -1806:3:3262 -1807:3:3275 -1808:3:3276 -1809:3:3279 -1810:3:3280 -1811:3:3291 -1812:3:3292 -1813:3:3293 -1814:3:3304 -1815:3:3309 -1816:3:3312 -1817:3:3313 -1818:0:4249 -1819:3:3322 -1820:0:4249 -1821:3:3324 -1822:0:4249 -1823:3:3327 -1824:3:3328 -1825:3:3340 -1826:3:3341 -1827:3:3345 -1828:3:3346 -1829:3:3354 -1830:3:3367 -1831:3:3368 -1832:3:3371 -1833:3:3372 -1834:3:3383 -1835:3:3384 -1836:3:3385 -1837:3:3396 -1838:3:3401 -1839:3:3404 -1840:3:3405 -1841:0:4249 -1842:3:3414 -1843:0:4249 -1844:3:3416 -1845:0:4249 -1846:3:3417 -1847:0:4249 -1848:3:3418 -1849:0:4249 -1850:3:3419 -1851:0:4249 -1852:3:3420 -1853:3:3424 -1854:3:3425 -1855:3:3433 -1856:3:3434 -1857:3:3438 -1858:3:3439 -1859:3:3447 -1860:3:3460 -1861:3:3461 -1862:3:3464 -1863:3:3465 -1864:3:3476 -1865:3:3477 -1866:3:3478 -1867:3:3489 -1868:3:3494 -1869:3:3497 -1870:3:3498 -1871:0:4249 -1872:3:3507 -1873:0:4249 -1874:3:3793 -1875:0:4249 -1876:3:3891 -1877:0:4249 -1878:3:3892 -1879:0:4249 -1880:3:3896 -1881:0:4249 -1882:3:3902 -1883:0:4249 -1884:3:3903 -1885:3:3907 -1886:3:3908 -1887:3:3916 -1888:3:3917 -1889:3:3921 -1890:3:3922 -1891:3:3930 -1892:3:3943 -1893:3:3944 -1894:3:3947 -1895:3:3948 -1896:3:3959 -1897:3:3960 -1898:3:3961 -1899:3:3972 -1900:3:3977 -1901:3:3980 -1902:3:3981 -1903:0:4249 -1904:3:3993 -1905:0:4249 -1906:3:3994 -1907:3:3998 -1908:3:3999 -1909:3:4007 -1910:3:4008 -1911:3:4012 -1912:3:4013 -1913:3:4021 -1914:3:4034 -1915:3:4035 -1916:3:4038 -1917:3:4039 -1918:3:4050 -1919:3:4051 -1920:3:4052 -1921:3:4063 -1922:3:4068 -1923:3:4071 -1924:3:4072 -1925:0:4249 -1926:3:4084 -1927:0:4249 -1928:3:4089 -1929:3:4093 -1930:3:4094 -1931:3:4102 -1932:3:4103 -1933:3:4107 -1934:3:4108 -1935:3:4116 -1936:3:4129 -1937:3:4130 -1938:3:4133 -1939:3:4134 -1940:3:4145 -1941:3:4146 -1942:3:4147 -1943:3:4158 -1944:3:4163 -1945:3:4166 -1946:3:4167 -1947:0:4249 -1948:3:4183 -1949:0:4249 -1950:3:4185 -1951:0:4249 -1952:3:4186 -1953:0:4249 -1954:3:4189 -1955:0:4249 -1956:3:4194 -1957:0:4249 -1958:2:1016 -1959:0:4249 -1960:3:4195 -1961:0:4249 -1962:2:1022 -1963:0:4249 -1964:3:4194 -1965:0:4249 -1966:2:1023 -1967:0:4249 -1968:3:4195 -1969:0:4249 -1970:2:1024 -1971:0:4249 -1972:3:4194 -1973:0:4249 -1974:2:1025 -1975:0:4249 -1976:3:4195 -1977:0:4249 -1978:1:2 -1979:0:4249 -1980:3:4194 -1981:0:4249 -1982:2:1026 -1983:0:4249 -1984:3:4195 -1985:0:4249 -1986:1:8 -1987:0:4249 -1988:3:4194 -1989:0:4249 -1990:2:1025 -1991:0:4249 -1992:3:4195 -1993:0:4249 -1994:1:9 -1995:0:4249 -1996:3:4194 -1997:0:4249 -1998:2:1026 -1999:0:4249 -2000:3:4195 -2001:0:4249 -2002:1:10 -2003:0:4249 -2004:3:4194 -2005:0:4249 -2006:2:1025 -2007:0:4249 -2008:3:4195 -2009:0:4249 -2010:1:11 -2011:0:4249 -2012:3:4194 -2013:0:4249 -2014:2:1026 -2015:0:4249 -2016:3:4195 -2017:0:4249 -2018:1:12 -2019:1:16 -2020:1:17 -2021:1:25 -2022:1:26 -2023:1:30 -2024:1:31 -2025:1:39 -2026:1:44 -2027:1:48 -2028:1:49 -2029:1:56 -2030:1:57 -2031:1:68 -2032:1:69 -2033:1:70 -2034:1:81 -2035:1:86 -2036:1:87 -2037:0:4249 -2038:3:4194 -2039:0:4249 -2040:2:1025 -2041:0:4249 -2042:3:4195 -2043:0:4249 -2044:1:99 -2045:0:4249 -2046:3:4194 -2047:0:4249 -2048:2:1026 -2049:0:4249 -2050:3:4195 -2051:0:4249 -2052:2:1027 -2053:0:4249 -2054:3:4194 -2055:0:4249 -2056:2:1028 -2057:0:4249 -2058:3:4195 -2059:0:4249 -2060:2:1039 -2061:0:4249 -2062:3:4194 -2063:0:4249 -2064:2:1040 -2065:0:4249 -2066:3:4195 -2067:0:4249 -2068:2:1041 -2069:2:1045 -2070:2:1046 -2071:2:1054 -2072:2:1055 -2073:2:1059 -2074:2:1060 -2075:2:1068 -2076:2:1073 -2077:2:1077 -2078:2:1078 -2079:2:1085 -2080:2:1086 -2081:2:1097 -2082:2:1098 -2083:2:1099 -2084:2:1110 -2085:2:1115 -2086:2:1116 -2087:0:4249 -2088:3:4194 -2089:0:4249 -2090:2:1128 -2091:0:4249 -2092:3:4195 -2093:0:4249 -2094:2:1129 -2095:2:1133 -2096:2:1134 -2097:2:1142 -2098:2:1143 -2099:2:1147 -2100:2:1148 -2101:2:1156 -2102:2:1161 -2103:2:1165 -2104:2:1166 -2105:2:1173 -2106:2:1174 -2107:2:1185 -2108:2:1186 -2109:2:1187 -2110:2:1198 -2111:2:1203 -2112:2:1204 -2113:0:4249 -2114:3:4194 -2115:0:4249 -2116:2:1216 -2117:0:4249 -2118:3:4195 -2119:0:4249 -2120:2:1217 -2121:0:4249 -2122:3:4194 -2123:0:4249 -2124:2:1218 -2125:2:1222 -2126:2:1223 -2127:2:1231 -2128:2:1232 -2129:2:1236 -2130:2:1237 -2131:2:1245 -2132:2:1250 -2133:2:1254 -2134:2:1255 -2135:2:1262 -2136:2:1263 -2137:2:1274 -2138:2:1275 -2139:2:1276 -2140:2:1287 -2141:2:1292 -2142:2:1293 -2143:0:4249 -2144:3:4195 -2145:0:4249 -2146:2:1305 -2147:0:4249 -2148:3:4194 -2149:0:4249 -2150:2:1590 -2151:0:4249 -2152:3:4195 -2153:0:4249 -2154:2:1591 -2155:0:4249 -2156:3:4194 -2157:0:4249 -2158:2:1596 -2159:0:4249 -2160:3:4195 -2161:0:4249 -2162:2:1601 -2163:0:4249 -2164:3:4194 -2165:0:4249 -2166:2:1602 -2167:0:4247 -2168:3:4195 -2169:0:4253 -2170:2:1211 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_rmb.define b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_rmb.log b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_rmb.log deleted file mode 100644 index 5eb694e..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_rmb.log +++ /dev/null @@ -1,280 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_rmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 742) - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 10519, errors: 0 - 20146 states, stored - 191615 states, matched - 211761 transitions (= stored+matched) - 711676 atomic steps -hash conflicts: 1222 (resolved) - -Stats on memory usage (in Megabytes): - 1.614 equivalent memory usage for states (stored*(State-vector + overhead)) - 1.509 actual memory usage for states (compression: 93.51%) - state-vector as stored = 51 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 467.229 total actual memory usage - -unreached in proctype urcu_reader_sig - line 402, "pan.___", state 330, "(1)" - line 613, "pan.___", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 59, "(1)" - line 417, "pan.___", state 89, "(1)" - line 398, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 408, "pan.___", state 160, "(1)" - line 651, "pan.___", state 213, "(1)" - line 174, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 178, "pan.___", state 233, "(1)" - line 174, "pan.___", state 257, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 658, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 182, "pan.___", state 660, "(1)" - line 182, "pan.___", state 661, "((cache_dirty_generation_ptr.bitfield&(1<<0)))" - line 182, "pan.___", state 661, "else" - line 174, "pan.___", state 671, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 693, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 174, "pan.___", state 710, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 712, "(1)" - line 178, "pan.___", state 719, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 721, "(1)" - line 178, "pan.___", state 722, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 722, "else" - line 176, "pan.___", state 727, "((j<1))" - line 176, "pan.___", state 727, "((j>=1))" - line 182, "pan.___", state 732, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 182, "pan.___", state 734, "(1)" - line 182, "pan.___", state 735, "((cache_dirty_generation_ptr.bitfield&(1<<0)))" - line 182, "pan.___", state 735, "else" - line 192, "pan.___", state 740, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 192, "pan.___", state 740, "else" - line 220, "pan.___", state 741, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 220, "pan.___", state 741, "else" - line 355, "pan.___", state 747, "((sighand_exec==1))" - line 355, "pan.___", state 747, "else" - line 361, "pan.___", state 750, "sighand_exec = 1" - line 398, "pan.___", state 763, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 765, "(1)" - line 398, "pan.___", state 766, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 766, "else" - line 398, "pan.___", state 769, "(1)" - line 402, "pan.___", state 777, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 779, "(1)" - line 402, "pan.___", state 780, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 780, "else" - line 402, "pan.___", state 783, "(1)" - line 402, "pan.___", state 784, "(1)" - line 402, "pan.___", state 784, "(1)" - line 400, "pan.___", state 789, "((i<1))" - line 400, "pan.___", state 789, "((i>=1))" - line 407, "pan.___", state 795, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 808, "(1)" - line 408, "pan.___", state 809, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 809, "else" - line 408, "pan.___", state 812, "(1)" - line 408, "pan.___", state 813, "(1)" - line 408, "pan.___", state 813, "(1)" - line 412, "pan.___", state 821, "(1)" - line 412, "pan.___", state 822, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 822, "else" - line 412, "pan.___", state 825, "(1)" - line 412, "pan.___", state 826, "(1)" - line 412, "pan.___", state 826, "(1)" - line 410, "pan.___", state 831, "((i<1))" - line 410, "pan.___", state 831, "((i>=1))" - line 417, "pan.___", state 838, "(1)" - line 417, "pan.___", state 839, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 839, "else" - line 417, "pan.___", state 842, "(1)" - line 417, "pan.___", state 843, "(1)" - line 417, "pan.___", state 843, "(1)" - line 419, "pan.___", state 846, "(1)" - line 419, "pan.___", state 846, "(1)" - line 361, "pan.___", state 855, "sighand_exec = 1" - line 402, "pan.___", state 886, "(1)" - line 407, "pan.___", state 902, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 945, "(1)" - line 402, "pan.___", state 983, "(1)" - line 407, "pan.___", state 999, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1042, "(1)" - line 398, "pan.___", state 1068, "(1)" - line 402, "pan.___", state 1082, "(1)" - line 407, "pan.___", state 1098, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1141, "(1)" - line 402, "pan.___", state 1182, "(1)" - line 407, "pan.___", state 1198, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1241, "(1)" - line 174, "pan.___", state 1262, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 1264, "(1)" - line 178, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 1273, "(1)" - line 178, "pan.___", state 1274, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 1274, "else" - line 176, "pan.___", state 1279, "((j<1))" - line 176, "pan.___", state 1279, "((j>=1))" - line 182, "pan.___", state 1284, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 182, "pan.___", state 1286, "(1)" - line 182, "pan.___", state 1287, "((cache_dirty_generation_ptr.bitfield&(1<<0)))" - line 182, "pan.___", state 1287, "else" - line 174, "pan.___", state 1297, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 1319, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 174, "pan.___", state 1336, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 1338, "(1)" - line 178, "pan.___", state 1345, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 1347, "(1)" - line 178, "pan.___", state 1348, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 1348, "else" - line 176, "pan.___", state 1353, "((j<1))" - line 176, "pan.___", state 1353, "((j>=1))" - line 182, "pan.___", state 1358, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 182, "pan.___", state 1360, "(1)" - line 182, "pan.___", state 1361, "((cache_dirty_generation_ptr.bitfield&(1<<0)))" - line 182, "pan.___", state 1361, "else" - line 192, "pan.___", state 1366, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 192, "pan.___", state 1366, "else" - line 220, "pan.___", state 1367, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 220, "pan.___", state 1367, "else" - line 355, "pan.___", state 1373, "((sighand_exec==1))" - line 355, "pan.___", state 1373, "else" - line 361, "pan.___", state 1376, "sighand_exec = 1" - line 398, "pan.___", state 1389, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 1391, "(1)" - line 398, "pan.___", state 1392, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 1392, "else" - line 398, "pan.___", state 1395, "(1)" - line 402, "pan.___", state 1403, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 1405, "(1)" - line 402, "pan.___", state 1406, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 1406, "else" - line 402, "pan.___", state 1409, "(1)" - line 402, "pan.___", state 1410, "(1)" - line 402, "pan.___", state 1410, "(1)" - line 400, "pan.___", state 1415, "((i<1))" - line 400, "pan.___", state 1415, "((i>=1))" - line 407, "pan.___", state 1421, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 1434, "(1)" - line 408, "pan.___", state 1435, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 1435, "else" - line 408, "pan.___", state 1438, "(1)" - line 408, "pan.___", state 1439, "(1)" - line 408, "pan.___", state 1439, "(1)" - line 412, "pan.___", state 1447, "(1)" - line 412, "pan.___", state 1448, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 1448, "else" - line 412, "pan.___", state 1451, "(1)" - line 412, "pan.___", state 1452, "(1)" - line 412, "pan.___", state 1452, "(1)" - line 410, "pan.___", state 1457, "((i<1))" - line 410, "pan.___", state 1457, "((i>=1))" - line 417, "pan.___", state 1464, "(1)" - line 417, "pan.___", state 1465, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 1465, "else" - line 417, "pan.___", state 1468, "(1)" - line 417, "pan.___", state 1469, "(1)" - line 417, "pan.___", state 1469, "(1)" - line 419, "pan.___", state 1472, "(1)" - line 419, "pan.___", state 1472, "(1)" - line 361, "pan.___", state 1481, "sighand_exec = 1" - line 178, "pan.___", state 1506, "(1)" - line 182, "pan.___", state 1517, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 174, "pan.___", state 1530, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_rmb.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_rmb.spin.input.trail deleted file mode 100644 index 8219815..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_rmb.spin.input.trail +++ /dev/null @@ -1,1805 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:2905 -2:4:2857 -3:4:2860 -4:4:2860 -5:4:2863 -6:4:2871 -7:4:2871 -8:4:2874 -9:4:2880 -10:4:2884 -11:4:2884 -12:4:2887 -13:4:2895 -14:4:2899 -15:4:2900 -16:0:2905 -17:4:2902 -18:0:2905 -19:3:1319 -20:0:2905 -21:3:1325 -22:0:2905 -23:3:1326 -24:0:2905 -25:3:1327 -26:3:1331 -27:3:1332 -28:3:1340 -29:3:1341 -30:3:1345 -31:3:1346 -32:3:1354 -33:3:1359 -34:3:1363 -35:3:1364 -36:3:1371 -37:3:1372 -38:3:1383 -39:3:1384 -40:3:1385 -41:3:1396 -42:3:1401 -43:3:1402 -44:0:2905 -45:3:1414 -46:0:2905 -47:3:1416 -48:3:1417 -49:0:2905 -50:3:1421 -51:3:1425 -52:3:1426 -53:3:1434 -54:3:1435 -55:3:1439 -56:3:1440 -57:3:1448 -58:3:1453 -59:3:1454 -60:3:1465 -61:3:1466 -62:3:1477 -63:3:1478 -64:3:1479 -65:3:1490 -66:3:1495 -67:3:1496 -68:0:2905 -69:3:1508 -70:0:2905 -71:3:1510 -72:0:2905 -73:3:1511 -74:0:2905 -75:3:1521 -76:0:2905 -77:3:1522 -78:0:2905 -79:3:1526 -80:3:1527 -81:3:1531 -82:3:1535 -83:3:1536 -84:3:1540 -85:3:1548 -86:3:1549 -87:0:2905 -88:3:1557 -89:0:2905 -90:3:1561 -91:3:1562 -92:3:1566 -93:3:1570 -94:3:1571 -95:3:1575 -96:3:1583 -97:3:1584 -98:0:2905 -99:3:1592 -100:0:2905 -101:3:1600 -102:3:1601 -103:3:1605 -104:3:1609 -105:3:1610 -106:3:1614 -107:3:1622 -108:3:1623 -109:0:2905 -110:3:1635 -111:0:2905 -112:3:1637 -113:0:2905 -114:3:1638 -115:3:1642 -116:3:1643 -117:3:1651 -118:3:1652 -119:3:1656 -120:3:1657 -121:3:1665 -122:3:1670 -123:3:1674 -124:3:1675 -125:3:1682 -126:3:1683 -127:3:1694 -128:3:1695 -129:3:1696 -130:3:1707 -131:3:1712 -132:3:1713 -133:0:2905 -134:3:1725 -135:0:2905 -136:3:1727 -137:0:2905 -138:3:1730 -139:3:1731 -140:3:1743 -141:3:1744 -142:3:1748 -143:3:1749 -144:3:1757 -145:3:1762 -146:3:1766 -147:3:1767 -148:3:1774 -149:3:1775 -150:3:1786 -151:3:1787 -152:3:1788 -153:3:1799 -154:3:1804 -155:3:1805 -156:0:2905 -157:3:1817 -158:0:2905 -159:3:1819 -160:0:2905 -161:3:1820 -162:0:2905 -163:3:1821 -164:0:2905 -165:3:1822 -166:0:2905 -167:3:1823 -168:3:1827 -169:3:1828 -170:3:1836 -171:3:1837 -172:3:1841 -173:3:1842 -174:3:1850 -175:3:1855 -176:3:1859 -177:3:1860 -178:3:1867 -179:3:1868 -180:3:1879 -181:3:1880 -182:3:1881 -183:3:1892 -184:3:1897 -185:3:1898 -186:0:2905 -187:3:1910 -188:0:2905 -189:3:2028 -190:0:2905 -191:3:2126 -192:0:2905 -193:3:2127 -194:0:2905 -195:3:2131 -196:0:2905 -197:3:2137 -198:3:2141 -199:3:2142 -200:3:2150 -201:3:2151 -202:3:2155 -203:3:2156 -204:3:2164 -205:3:2169 -206:3:2173 -207:3:2174 -208:3:2181 -209:3:2182 -210:3:2193 -211:3:2194 -212:3:2195 -213:3:2206 -214:3:2211 -215:3:2212 -216:0:2905 -217:3:2224 -218:0:2905 -219:3:2226 -220:0:2905 -221:3:2227 -222:3:2231 -223:3:2232 -224:3:2240 -225:3:2241 -226:3:2245 -227:3:2246 -228:3:2254 -229:3:2259 -230:3:2263 -231:3:2264 -232:3:2271 -233:3:2272 -234:3:2283 -235:3:2284 -236:3:2285 -237:3:2296 -238:3:2301 -239:3:2302 -240:0:2905 -241:3:2314 -242:0:2905 -243:3:2316 -244:0:2905 -245:3:2319 -246:3:2320 -247:3:2332 -248:3:2333 -249:3:2337 -250:3:2338 -251:3:2346 -252:3:2351 -253:3:2355 -254:3:2356 -255:3:2363 -256:3:2364 -257:3:2375 -258:3:2376 -259:3:2377 -260:3:2388 -261:3:2393 -262:3:2394 -263:0:2905 -264:3:2406 -265:0:2905 -266:3:2408 -267:0:2905 -268:3:2409 -269:0:2905 -270:3:2410 -271:0:2905 -272:3:2411 -273:0:2905 -274:3:2412 -275:3:2416 -276:3:2417 -277:3:2425 -278:3:2426 -279:3:2430 -280:3:2431 -281:3:2439 -282:3:2444 -283:3:2448 -284:3:2449 -285:3:2456 -286:3:2457 -287:3:2468 -288:3:2469 -289:3:2470 -290:3:2481 -291:3:2486 -292:3:2487 -293:0:2905 -294:3:2499 -295:0:2905 -296:3:2617 -297:0:2905 -298:3:2715 -299:0:2905 -300:3:2716 -301:0:2905 -302:3:2720 -303:0:2905 -304:3:2726 -305:0:2905 -306:3:2730 -307:3:2731 -308:3:2735 -309:3:2739 -310:3:2740 -311:3:2744 -312:3:2752 -313:3:2753 -314:0:2905 -315:3:2761 -316:0:2905 -317:3:2765 -318:3:2766 -319:3:2770 -320:3:2774 -321:3:2775 -322:3:2779 -323:3:2787 -324:3:2788 -325:0:2905 -326:3:2796 -327:0:2905 -328:3:2804 -329:3:2805 -330:3:2809 -331:3:2813 -332:3:2814 -333:3:2818 -334:3:2826 -335:3:2827 -336:0:2905 -337:3:2839 -338:0:2905 -339:3:2841 -340:0:2905 -341:3:2842 -342:0:2905 -343:3:1326 -344:0:2905 -345:3:1327 -346:3:1331 -347:3:1332 -348:3:1340 -349:3:1341 -350:3:1345 -351:3:1346 -352:3:1354 -353:3:1359 -354:3:1363 -355:3:1364 -356:3:1371 -357:3:1372 -358:3:1383 -359:3:1384 -360:3:1385 -361:3:1396 -362:3:1401 -363:3:1402 -364:0:2905 -365:3:1414 -366:0:2905 -367:3:1416 -368:3:1417 -369:0:2905 -370:3:1421 -371:3:1425 -372:3:1426 -373:3:1434 -374:3:1435 -375:3:1439 -376:3:1440 -377:3:1448 -378:3:1453 -379:3:1454 -380:3:1465 -381:3:1466 -382:3:1477 -383:3:1478 -384:3:1479 -385:3:1490 -386:3:1495 -387:3:1496 -388:0:2905 -389:3:1508 -390:0:2905 -391:3:1510 -392:0:2905 -393:3:1511 -394:0:2905 -395:3:1521 -396:0:2905 -397:3:1522 -398:0:2905 -399:3:1526 -400:3:1527 -401:3:1531 -402:3:1535 -403:3:1536 -404:3:1540 -405:3:1548 -406:3:1549 -407:0:2905 -408:3:1557 -409:0:2905 -410:3:1561 -411:3:1562 -412:3:1566 -413:3:1570 -414:3:1571 -415:3:1575 -416:3:1583 -417:3:1584 -418:0:2905 -419:3:1592 -420:0:2905 -421:3:1600 -422:3:1601 -423:3:1605 -424:3:1609 -425:3:1610 -426:3:1614 -427:3:1622 -428:3:1623 -429:0:2905 -430:3:1635 -431:0:2905 -432:3:1637 -433:0:2905 -434:3:1638 -435:3:1642 -436:3:1643 -437:3:1651 -438:3:1652 -439:3:1656 -440:3:1657 -441:3:1665 -442:3:1670 -443:3:1674 -444:3:1675 -445:3:1682 -446:3:1683 -447:3:1694 -448:3:1695 -449:3:1696 -450:3:1707 -451:3:1712 -452:3:1713 -453:0:2905 -454:3:1725 -455:0:2905 -456:3:1727 -457:0:2905 -458:3:1730 -459:3:1731 -460:3:1743 -461:3:1744 -462:3:1748 -463:3:1749 -464:3:1757 -465:3:1762 -466:3:1766 -467:3:1767 -468:3:1774 -469:3:1775 -470:3:1786 -471:3:1787 -472:3:1788 -473:3:1799 -474:3:1804 -475:3:1805 -476:0:2905 -477:3:1817 -478:0:2905 -479:3:1819 -480:0:2905 -481:3:1820 -482:0:2905 -483:3:1821 -484:0:2905 -485:3:1822 -486:0:2905 -487:3:1823 -488:3:1827 -489:3:1828 -490:3:1836 -491:3:1837 -492:3:1841 -493:3:1842 -494:3:1850 -495:3:1855 -496:3:1859 -497:3:1860 -498:3:1867 -499:3:1868 -500:3:1879 -501:3:1880 -502:3:1881 -503:3:1892 -504:3:1897 -505:3:1898 -506:0:2905 -507:3:1910 -508:0:2905 -509:3:2028 -510:0:2905 -511:3:2126 -512:0:2905 -513:3:2127 -514:0:2905 -515:3:2131 -516:0:2905 -517:3:2137 -518:3:2141 -519:3:2142 -520:3:2150 -521:3:2151 -522:3:2155 -523:3:2156 -524:3:2164 -525:3:2169 -526:3:2173 -527:3:2174 -528:3:2181 -529:3:2182 -530:3:2193 -531:3:2194 -532:3:2195 -533:3:2206 -534:3:2211 -535:3:2212 -536:0:2905 -537:3:2224 -538:0:2905 -539:3:2226 -540:0:2905 -541:3:2227 -542:3:2231 -543:3:2232 -544:3:2240 -545:3:2241 -546:3:2245 -547:3:2246 -548:3:2254 -549:3:2259 -550:3:2263 -551:3:2264 -552:3:2271 -553:3:2272 -554:3:2283 -555:3:2284 -556:3:2285 -557:3:2296 -558:3:2301 -559:3:2302 -560:0:2905 -561:3:2314 -562:0:2905 -563:3:2316 -564:0:2905 -565:3:2319 -566:3:2320 -567:3:2332 -568:3:2333 -569:3:2337 -570:3:2338 -571:3:2346 -572:3:2351 -573:3:2355 -574:3:2356 -575:3:2363 -576:3:2364 -577:3:2375 -578:3:2376 -579:3:2377 -580:3:2388 -581:3:2393 -582:3:2394 -583:0:2905 -584:3:2406 -585:0:2905 -586:3:2408 -587:0:2905 -588:3:2409 -589:0:2905 -590:3:2410 -591:0:2905 -592:3:2411 -593:0:2905 -594:3:2412 -595:3:2416 -596:3:2417 -597:3:2425 -598:3:2426 -599:3:2430 -600:3:2431 -601:3:2439 -602:3:2444 -603:3:2448 -604:3:2449 -605:3:2456 -606:3:2457 -607:3:2468 -608:3:2469 -609:3:2470 -610:3:2481 -611:3:2486 -612:3:2487 -613:0:2905 -614:3:2499 -615:0:2905 -616:3:2617 -617:0:2905 -618:3:2715 -619:0:2905 -620:3:2716 -621:0:2905 -622:3:2720 -623:0:2905 -624:3:2726 -625:0:2905 -626:3:2730 -627:3:2731 -628:3:2735 -629:3:2739 -630:3:2740 -631:3:2744 -632:3:2752 -633:3:2753 -634:0:2905 -635:3:2761 -636:0:2905 -637:3:2765 -638:3:2766 -639:3:2770 -640:3:2774 -641:3:2775 -642:3:2779 -643:3:2787 -644:3:2788 -645:0:2905 -646:3:2796 -647:0:2905 -648:3:2804 -649:3:2805 -650:3:2809 -651:3:2813 -652:3:2814 -653:3:2818 -654:3:2826 -655:3:2827 -656:0:2905 -657:3:2839 -658:0:2905 -659:3:2841 -660:0:2905 -661:3:2842 -662:0:2905 -663:3:1326 -664:0:2905 -665:3:1327 -666:3:1331 -667:3:1332 -668:3:1340 -669:3:1341 -670:3:1345 -671:3:1346 -672:3:1354 -673:3:1359 -674:3:1363 -675:3:1364 -676:3:1371 -677:3:1372 -678:3:1383 -679:3:1384 -680:3:1385 -681:3:1396 -682:3:1401 -683:3:1402 -684:0:2905 -685:3:1414 -686:0:2905 -687:3:1416 -688:3:1417 -689:0:2905 -690:3:1421 -691:3:1425 -692:3:1426 -693:3:1434 -694:3:1435 -695:3:1439 -696:3:1440 -697:3:1448 -698:3:1453 -699:3:1454 -700:3:1465 -701:3:1466 -702:3:1477 -703:3:1478 -704:3:1479 -705:3:1490 -706:3:1495 -707:3:1496 -708:0:2905 -709:3:1508 -710:0:2905 -711:3:1510 -712:0:2905 -713:3:1511 -714:0:2905 -715:3:1521 -716:0:2905 -717:3:1522 -718:0:2905 -719:3:1526 -720:3:1527 -721:3:1531 -722:3:1535 -723:3:1536 -724:3:1540 -725:3:1548 -726:3:1549 -727:0:2905 -728:3:1557 -729:0:2905 -730:3:1561 -731:3:1562 -732:3:1566 -733:3:1570 -734:3:1571 -735:3:1575 -736:3:1583 -737:3:1584 -738:0:2905 -739:3:1592 -740:0:2905 -741:3:1600 -742:3:1601 -743:3:1605 -744:3:1609 -745:3:1610 -746:3:1614 -747:3:1622 -748:3:1623 -749:0:2905 -750:3:1635 -751:0:2905 -752:3:1637 -753:0:2905 -754:3:1638 -755:3:1642 -756:3:1643 -757:3:1651 -758:3:1652 -759:3:1656 -760:3:1657 -761:3:1665 -762:3:1670 -763:3:1674 -764:3:1675 -765:3:1682 -766:3:1683 -767:3:1694 -768:3:1695 -769:3:1696 -770:3:1707 -771:3:1712 -772:3:1713 -773:0:2905 -774:3:1725 -775:0:2905 -776:3:1727 -777:0:2905 -778:3:1730 -779:3:1731 -780:3:1743 -781:3:1744 -782:3:1748 -783:3:1749 -784:3:1757 -785:3:1762 -786:3:1766 -787:3:1767 -788:3:1774 -789:3:1775 -790:3:1786 -791:3:1787 -792:3:1788 -793:3:1799 -794:3:1804 -795:3:1805 -796:0:2905 -797:3:1817 -798:0:2905 -799:3:1819 -800:0:2905 -801:3:1820 -802:0:2905 -803:3:1821 -804:0:2905 -805:3:1822 -806:0:2905 -807:3:1823 -808:3:1827 -809:3:1828 -810:3:1836 -811:3:1837 -812:3:1841 -813:3:1842 -814:3:1850 -815:3:1855 -816:3:1859 -817:3:1860 -818:3:1867 -819:3:1868 -820:3:1879 -821:3:1880 -822:3:1881 -823:3:1892 -824:3:1897 -825:3:1898 -826:0:2905 -827:3:1910 -828:0:2905 -829:3:2028 -830:0:2905 -831:3:2126 -832:0:2905 -833:3:2127 -834:0:2905 -835:3:2131 -836:0:2905 -837:3:2137 -838:3:2141 -839:3:2142 -840:3:2150 -841:3:2151 -842:3:2155 -843:3:2156 -844:3:2164 -845:3:2169 -846:3:2173 -847:3:2174 -848:3:2181 -849:3:2182 -850:3:2193 -851:3:2194 -852:3:2195 -853:3:2206 -854:3:2211 -855:3:2212 -856:0:2905 -857:3:2224 -858:0:2905 -859:3:2226 -860:0:2905 -861:3:2227 -862:3:2231 -863:3:2232 -864:3:2240 -865:3:2241 -866:3:2245 -867:3:2246 -868:3:2254 -869:3:2259 -870:3:2263 -871:3:2264 -872:3:2271 -873:3:2272 -874:3:2283 -875:3:2284 -876:3:2285 -877:3:2296 -878:3:2301 -879:3:2302 -880:0:2905 -881:3:2314 -882:0:2905 -883:3:2316 -884:0:2905 -885:3:2319 -886:3:2320 -887:3:2332 -888:3:2333 -889:3:2337 -890:3:2338 -891:3:2346 -892:3:2351 -893:3:2355 -894:3:2356 -895:3:2363 -896:3:2364 -897:3:2375 -898:3:2376 -899:3:2377 -900:3:2388 -901:3:2393 -902:3:2394 -903:0:2905 -904:3:2406 -905:0:2905 -906:3:2408 -907:0:2905 -908:3:2409 -909:0:2905 -910:3:2410 -911:0:2905 -912:3:2411 -913:0:2905 -914:3:2412 -915:3:2416 -916:3:2417 -917:3:2425 -918:3:2426 -919:3:2430 -920:3:2431 -921:3:2439 -922:3:2444 -923:3:2448 -924:3:2449 -925:3:2456 -926:3:2457 -927:3:2468 -928:3:2469 -929:3:2470 -930:3:2481 -931:3:2486 -932:3:2487 -933:0:2905 -934:3:2499 -935:0:2905 -936:3:2617 -937:0:2905 -938:3:2715 -939:0:2905 -940:3:2716 -941:0:2905 -942:3:2720 -943:0:2905 -944:3:2726 -945:0:2905 -946:3:2730 -947:3:2731 -948:3:2735 -949:3:2739 -950:3:2740 -951:3:2744 -952:3:2752 -953:3:2753 -954:0:2905 -955:3:2761 -956:0:2905 -957:3:2765 -958:3:2766 -959:3:2770 -960:3:2774 -961:3:2775 -962:3:2779 -963:3:2787 -964:3:2788 -965:0:2905 -966:3:2796 -967:0:2905 -968:3:2804 -969:3:2805 -970:3:2809 -971:3:2813 -972:3:2814 -973:3:2818 -974:3:2826 -975:3:2827 -976:0:2905 -977:3:2839 -978:0:2905 -979:3:2841 -980:0:2905 -981:3:2842 -982:0:2905 -983:3:1326 -984:0:2905 -985:3:1327 -986:3:1331 -987:3:1332 -988:3:1340 -989:3:1341 -990:3:1345 -991:3:1346 -992:3:1354 -993:3:1359 -994:3:1363 -995:3:1364 -996:3:1371 -997:3:1372 -998:3:1383 -999:3:1384 -1000:3:1385 -1001:3:1396 -1002:3:1401 -1003:3:1402 -1004:0:2905 -1005:3:1414 -1006:0:2905 -1007:3:1416 -1008:3:1417 -1009:0:2905 -1010:3:1421 -1011:3:1425 -1012:3:1426 -1013:3:1434 -1014:3:1435 -1015:3:1439 -1016:3:1440 -1017:3:1448 -1018:3:1453 -1019:3:1454 -1020:3:1465 -1021:3:1466 -1022:3:1477 -1023:3:1478 -1024:3:1479 -1025:3:1490 -1026:3:1495 -1027:3:1496 -1028:0:2905 -1029:3:1508 -1030:0:2905 -1031:3:1510 -1032:0:2905 -1033:3:1511 -1034:0:2905 -1035:3:1521 -1036:0:2905 -1037:3:1522 -1038:0:2905 -1039:3:1526 -1040:3:1527 -1041:3:1531 -1042:3:1535 -1043:3:1536 -1044:3:1540 -1045:3:1548 -1046:3:1549 -1047:0:2905 -1048:3:1557 -1049:0:2905 -1050:3:1561 -1051:3:1562 -1052:3:1566 -1053:3:1570 -1054:3:1571 -1055:3:1575 -1056:3:1583 -1057:3:1584 -1058:0:2905 -1059:3:1592 -1060:0:2905 -1061:3:1600 -1062:3:1601 -1063:3:1605 -1064:3:1609 -1065:3:1610 -1066:3:1614 -1067:3:1622 -1068:3:1623 -1069:0:2905 -1070:3:1635 -1071:0:2905 -1072:3:1637 -1073:0:2905 -1074:3:1638 -1075:3:1642 -1076:3:1643 -1077:3:1651 -1078:3:1652 -1079:3:1656 -1080:3:1657 -1081:3:1665 -1082:3:1670 -1083:3:1674 -1084:3:1675 -1085:3:1682 -1086:3:1683 -1087:3:1694 -1088:3:1695 -1089:3:1696 -1090:3:1707 -1091:3:1712 -1092:3:1713 -1093:0:2905 -1094:3:1725 -1095:0:2905 -1096:3:1727 -1097:0:2905 -1098:3:1730 -1099:3:1731 -1100:3:1743 -1101:3:1744 -1102:3:1748 -1103:3:1749 -1104:3:1757 -1105:3:1762 -1106:3:1766 -1107:3:1767 -1108:3:1774 -1109:3:1775 -1110:3:1786 -1111:3:1787 -1112:3:1788 -1113:3:1799 -1114:3:1804 -1115:3:1805 -1116:0:2905 -1117:3:1817 -1118:0:2905 -1119:3:1819 -1120:0:2905 -1121:3:1820 -1122:0:2905 -1123:3:1821 -1124:0:2905 -1125:3:1822 -1126:0:2905 -1127:3:1823 -1128:3:1827 -1129:3:1828 -1130:3:1836 -1131:3:1837 -1132:3:1841 -1133:3:1842 -1134:3:1850 -1135:3:1855 -1136:3:1859 -1137:3:1860 -1138:3:1867 -1139:3:1868 -1140:3:1879 -1141:3:1880 -1142:3:1881 -1143:3:1892 -1144:3:1897 -1145:3:1898 -1146:0:2905 -1147:3:1910 -1148:0:2905 -1149:3:2028 -1150:0:2905 -1151:3:2126 -1152:0:2905 -1153:3:2127 -1154:0:2905 -1155:3:2131 -1156:0:2905 -1157:3:2137 -1158:3:2141 -1159:3:2142 -1160:3:2150 -1161:3:2151 -1162:3:2155 -1163:3:2156 -1164:3:2164 -1165:3:2169 -1166:3:2173 -1167:3:2174 -1168:3:2181 -1169:3:2182 -1170:3:2193 -1171:3:2194 -1172:3:2195 -1173:3:2206 -1174:3:2211 -1175:3:2212 -1176:0:2905 -1177:3:2224 -1178:0:2905 -1179:3:2226 -1180:0:2905 -1181:3:2227 -1182:3:2231 -1183:3:2232 -1184:3:2240 -1185:3:2241 -1186:3:2245 -1187:3:2246 -1188:3:2254 -1189:3:2259 -1190:3:2263 -1191:3:2264 -1192:3:2271 -1193:3:2272 -1194:3:2283 -1195:3:2284 -1196:3:2285 -1197:3:2296 -1198:3:2301 -1199:3:2302 -1200:0:2905 -1201:3:2314 -1202:0:2905 -1203:3:2316 -1204:0:2905 -1205:3:2319 -1206:3:2320 -1207:3:2332 -1208:3:2333 -1209:3:2337 -1210:3:2338 -1211:3:2346 -1212:3:2351 -1213:3:2355 -1214:3:2356 -1215:3:2363 -1216:3:2364 -1217:3:2375 -1218:3:2376 -1219:3:2377 -1220:3:2388 -1221:3:2393 -1222:3:2394 -1223:0:2905 -1224:3:2406 -1225:0:2905 -1226:3:2408 -1227:0:2905 -1228:3:2409 -1229:0:2905 -1230:3:2410 -1231:0:2905 -1232:3:2411 -1233:0:2905 -1234:3:2412 -1235:3:2416 -1236:3:2417 -1237:3:2425 -1238:3:2426 -1239:3:2430 -1240:3:2431 -1241:3:2439 -1242:3:2444 -1243:3:2448 -1244:3:2449 -1245:3:2456 -1246:3:2457 -1247:3:2468 -1248:3:2469 -1249:3:2470 -1250:3:2481 -1251:3:2486 -1252:3:2487 -1253:0:2905 -1254:3:2499 -1255:0:2905 -1256:3:2617 -1257:0:2905 -1258:3:2715 -1259:0:2905 -1260:3:2716 -1261:0:2905 -1262:3:2720 -1263:0:2905 -1264:3:2726 -1265:0:2905 -1266:3:2730 -1267:3:2731 -1268:3:2735 -1269:3:2739 -1270:3:2740 -1271:3:2744 -1272:3:2752 -1273:3:2753 -1274:0:2905 -1275:3:2761 -1276:0:2905 -1277:3:2765 -1278:3:2766 -1279:3:2770 -1280:3:2774 -1281:3:2775 -1282:3:2779 -1283:3:2787 -1284:3:2788 -1285:0:2905 -1286:3:2796 -1287:0:2905 -1288:3:2804 -1289:3:2805 -1290:3:2809 -1291:3:2813 -1292:3:2814 -1293:3:2818 -1294:3:2826 -1295:3:2827 -1296:0:2905 -1297:3:2839 -1298:0:2905 -1299:3:2841 -1300:0:2905 -1301:3:2842 -1302:0:2905 -1303:3:1326 -1304:0:2905 -1305:3:1327 -1306:3:1331 -1307:3:1332 -1308:3:1340 -1309:3:1341 -1310:3:1345 -1311:3:1346 -1312:3:1354 -1313:3:1359 -1314:3:1363 -1315:3:1364 -1316:3:1371 -1317:3:1372 -1318:3:1383 -1319:3:1384 -1320:3:1385 -1321:3:1396 -1322:3:1401 -1323:3:1402 -1324:0:2905 -1325:3:1414 -1326:0:2905 -1327:3:1416 -1328:3:1417 -1329:0:2905 -1330:3:1421 -1331:3:1425 -1332:3:1426 -1333:3:1434 -1334:3:1435 -1335:3:1439 -1336:3:1440 -1337:3:1448 -1338:3:1461 -1339:3:1462 -1340:3:1465 -1341:3:1466 -1342:3:1477 -1343:3:1478 -1344:3:1479 -1345:3:1490 -1346:3:1495 -1347:3:1498 -1348:3:1499 -1349:0:2905 -1350:3:1508 -1351:0:2905 -1352:3:1510 -1353:0:2905 -1354:3:1511 -1355:0:2905 -1356:3:1521 -1357:0:2905 -1358:3:1522 -1359:0:2905 -1360:2:680 -1361:0:2905 -1362:2:686 -1363:0:2905 -1364:2:687 -1365:0:2905 -1366:2:688 -1367:0:2905 -1368:2:689 -1369:0:2905 -1370:1:2 -1371:0:2905 -1372:2:690 -1373:0:2905 -1374:1:8 -1375:0:2905 -1376:1:9 -1377:0:2905 -1378:1:10 -1379:0:2905 -1380:1:11 -1381:0:2905 -1382:2:689 -1383:0:2905 -1384:1:12 -1385:1:16 -1386:1:17 -1387:1:25 -1388:1:26 -1389:1:30 -1390:1:31 -1391:1:39 -1392:1:44 -1393:1:48 -1394:1:49 -1395:1:56 -1396:1:57 -1397:1:68 -1398:1:69 -1399:1:70 -1400:1:81 -1401:1:86 -1402:1:87 -1403:0:2905 -1404:2:690 -1405:0:2905 -1406:3:1526 -1407:3:1527 -1408:3:1531 -1409:3:1535 -1410:3:1536 -1411:3:1540 -1412:3:1545 -1413:0:2905 -1414:3:1557 -1415:0:2905 -1416:3:1561 -1417:3:1562 -1418:3:1566 -1419:3:1570 -1420:3:1571 -1421:3:1575 -1422:3:1583 -1423:3:1584 -1424:0:2905 -1425:3:1592 -1426:0:2905 -1427:3:1600 -1428:3:1601 -1429:3:1605 -1430:3:1609 -1431:3:1610 -1432:3:1614 -1433:3:1622 -1434:3:1623 -1435:0:2905 -1436:3:1635 -1437:0:2905 -1438:3:1637 -1439:0:2905 -1440:3:1638 -1441:3:1642 -1442:3:1643 -1443:3:1651 -1444:3:1652 -1445:3:1656 -1446:3:1657 -1447:3:1665 -1448:3:1670 -1449:3:1674 -1450:3:1675 -1451:3:1682 -1452:3:1683 -1453:3:1694 -1454:3:1695 -1455:3:1696 -1456:3:1707 -1457:3:1712 -1458:3:1713 -1459:0:2905 -1460:3:1725 -1461:0:2905 -1462:3:1727 -1463:0:2905 -1464:3:1730 -1465:3:1731 -1466:3:1743 -1467:3:1744 -1468:3:1748 -1469:3:1749 -1470:3:1757 -1471:3:1762 -1472:3:1766 -1473:3:1767 -1474:3:1774 -1475:3:1775 -1476:3:1786 -1477:3:1787 -1478:3:1788 -1479:3:1799 -1480:3:1804 -1481:3:1805 -1482:0:2905 -1483:3:1817 -1484:0:2905 -1485:3:1819 -1486:0:2905 -1487:3:1820 -1488:0:2905 -1489:3:1821 -1490:0:2905 -1491:3:1822 -1492:0:2905 -1493:3:1823 -1494:3:1827 -1495:3:1828 -1496:3:1836 -1497:3:1837 -1498:3:1841 -1499:3:1842 -1500:3:1850 -1501:3:1855 -1502:3:1859 -1503:3:1860 -1504:3:1867 -1505:3:1868 -1506:3:1879 -1507:3:1880 -1508:3:1881 -1509:3:1892 -1510:3:1897 -1511:3:1898 -1512:0:2905 -1513:3:1910 -1514:0:2905 -1515:3:2028 -1516:0:2905 -1517:3:2126 -1518:0:2905 -1519:3:2127 -1520:0:2905 -1521:3:2131 -1522:0:2905 -1523:3:2137 -1524:3:2141 -1525:3:2142 -1526:3:2150 -1527:3:2151 -1528:3:2155 -1529:3:2156 -1530:3:2164 -1531:3:2169 -1532:3:2173 -1533:3:2174 -1534:3:2181 -1535:3:2182 -1536:3:2193 -1537:3:2194 -1538:3:2195 -1539:3:2206 -1540:3:2211 -1541:3:2212 -1542:0:2905 -1543:3:2224 -1544:0:2905 -1545:3:2226 -1546:0:2905 -1547:3:2227 -1548:3:2231 -1549:3:2232 -1550:3:2240 -1551:3:2241 -1552:3:2245 -1553:3:2246 -1554:3:2254 -1555:3:2259 -1556:3:2263 -1557:3:2264 -1558:3:2271 -1559:3:2272 -1560:3:2283 -1561:3:2284 -1562:3:2285 -1563:3:2296 -1564:3:2301 -1565:3:2302 -1566:0:2905 -1567:3:2314 -1568:0:2905 -1569:3:2316 -1570:0:2905 -1571:3:2319 -1572:3:2320 -1573:3:2332 -1574:3:2333 -1575:3:2337 -1576:3:2338 -1577:3:2346 -1578:3:2351 -1579:3:2355 -1580:3:2356 -1581:3:2363 -1582:3:2364 -1583:3:2375 -1584:3:2376 -1585:3:2377 -1586:3:2388 -1587:3:2393 -1588:3:2394 -1589:0:2905 -1590:3:2406 -1591:0:2905 -1592:3:2408 -1593:0:2905 -1594:3:2409 -1595:0:2905 -1596:3:2410 -1597:0:2905 -1598:3:2411 -1599:0:2905 -1600:3:2412 -1601:3:2416 -1602:3:2417 -1603:3:2425 -1604:3:2426 -1605:3:2430 -1606:3:2431 -1607:3:2439 -1608:3:2444 -1609:3:2448 -1610:3:2449 -1611:3:2456 -1612:3:2457 -1613:3:2468 -1614:3:2469 -1615:3:2470 -1616:3:2481 -1617:3:2486 -1618:3:2487 -1619:0:2905 -1620:3:2499 -1621:0:2905 -1622:3:2617 -1623:0:2905 -1624:3:2715 -1625:0:2905 -1626:3:2716 -1627:0:2905 -1628:3:2720 -1629:0:2905 -1630:3:2726 -1631:0:2905 -1632:3:2730 -1633:3:2731 -1634:3:2735 -1635:3:2739 -1636:3:2740 -1637:3:2744 -1638:3:2752 -1639:3:2753 -1640:0:2905 -1641:3:2761 -1642:0:2905 -1643:3:2765 -1644:3:2766 -1645:3:2770 -1646:3:2774 -1647:3:2775 -1648:3:2779 -1649:3:2787 -1650:3:2788 -1651:0:2905 -1652:3:2796 -1653:0:2905 -1654:3:2804 -1655:3:2805 -1656:3:2809 -1657:3:2813 -1658:3:2814 -1659:3:2818 -1660:3:2826 -1661:3:2827 -1662:0:2905 -1663:3:2839 -1664:0:2905 -1665:3:2841 -1666:0:2905 -1667:3:2842 -1668:0:2905 -1669:3:2845 -1670:0:2905 -1671:3:2850 -1672:0:2905 -1673:2:689 -1674:0:2905 -1675:3:2851 -1676:0:2905 -1677:1:99 -1678:0:2905 -1679:3:2850 -1680:0:2905 -1681:2:690 -1682:0:2905 -1683:3:2851 -1684:0:2905 -1685:2:691 -1686:0:2905 -1687:3:2850 -1688:0:2905 -1689:2:692 -1690:0:2905 -1691:3:2851 -1692:0:2905 -1693:2:703 -1694:0:2905 -1695:3:2850 -1696:0:2905 -1697:2:704 -1698:0:2905 -1699:3:2851 -1700:0:2905 -1701:2:705 -1702:2:709 -1703:2:710 -1704:2:718 -1705:2:719 -1706:2:723 -1707:2:724 -1708:2:732 -1709:2:737 -1710:2:741 -1711:2:742 -1712:2:749 -1713:2:750 -1714:2:761 -1715:2:762 -1716:2:763 -1717:2:774 -1718:2:786 -1719:2:787 -1720:0:2905 -1721:3:2850 -1722:0:2905 -1723:2:792 -1724:0:2905 -1725:3:2851 -1726:0:2905 -1727:2:793 -1728:2:797 -1729:2:798 -1730:2:806 -1731:2:807 -1732:2:811 -1733:2:812 -1734:2:820 -1735:2:825 -1736:2:829 -1737:2:830 -1738:2:837 -1739:2:838 -1740:2:849 -1741:2:850 -1742:2:851 -1743:2:862 -1744:2:874 -1745:2:875 -1746:0:2905 -1747:3:2850 -1748:0:2905 -1749:2:880 -1750:0:2905 -1751:3:2851 -1752:0:2905 -1753:2:881 -1754:0:2905 -1755:3:2850 -1756:0:2905 -1757:2:882 -1758:2:886 -1759:2:887 -1760:2:895 -1761:2:896 -1762:2:900 -1763:2:901 -1764:2:909 -1765:2:914 -1766:2:918 -1767:2:919 -1768:2:926 -1769:2:927 -1770:2:938 -1771:2:939 -1772:2:940 -1773:2:951 -1774:2:963 -1775:2:964 -1776:0:2905 -1777:3:2851 -1778:0:2905 -1779:2:969 -1780:0:2905 -1781:3:2850 -1782:0:2905 -1783:2:1086 -1784:0:2905 -1785:3:2851 -1786:0:2905 -1787:2:1087 -1788:0:2905 -1789:3:2850 -1790:0:2905 -1791:2:1092 -1792:0:2905 -1793:3:2851 -1794:0:2905 -1795:2:1097 -1796:0:2905 -1797:3:2850 -1798:0:2905 -1799:2:1098 -1800:0:2903 -1801:3:2851 -1802:0:2909 -1803:3:1630 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_wmb.define b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_wmb.log b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_wmb.log deleted file mode 100644 index a346ed9..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_wmb.log +++ /dev/null @@ -1,224 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_wmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 742) - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 10499, errors: 0 - 159431 states, stored - 1505398 states, matched - 1664829 transitions (= stored+matched) - 5794809 atomic steps -hash conflicts: 62144 (resolved) - -Stats on memory usage (in Megabytes): - 12.772 equivalent memory usage for states (stored*(State-vector + overhead)) - 8.936 actual memory usage for states (compression: 69.96%) - state-vector as stored = 31 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 474.651 total actual memory usage - -unreached in proctype urcu_reader_sig - line 402, "pan.___", state 330, "(1)" - line 613, "pan.___", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 651, "pan.___", state 213, "(1)" - line 402, "pan.___", state 348, "(1)" - line 398, "pan.___", state 433, "(1)" - line 402, "pan.___", state 447, "(1)" - line 402, "pan.___", state 547, "(1)" - line 159, "pan.___", state 628, "(1)" - line 163, "pan.___", state 636, "(1)" - line 163, "pan.___", state 637, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 637, "else" - line 161, "pan.___", state 642, "((j<1))" - line 161, "pan.___", state 642, "((j>=1))" - line 167, "pan.___", state 648, "(1)" - line 167, "pan.___", state 649, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 649, "else" - line 159, "pan.___", state 660, "(1)" - line 163, "pan.___", state 668, "(1)" - line 163, "pan.___", state 669, "(!((cache_dirty_urcu_active_readers.bitfield&(1<=1))" - line 167, "pan.___", state 680, "(1)" - line 167, "pan.___", state 681, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 159, "pan.___", state 696, "(1)" - line 163, "pan.___", state 704, "(1)" - line 163, "pan.___", state 705, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 705, "else" - line 161, "pan.___", state 710, "((j<1))" - line 161, "pan.___", state 710, "((j>=1))" - line 167, "pan.___", state 716, "(1)" - line 167, "pan.___", state 717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 717, "else" - line 201, "pan.___", state 722, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 201, "pan.___", state 722, "else" - line 220, "pan.___", state 723, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 220, "pan.___", state 723, "else" - line 355, "pan.___", state 729, "((sighand_exec==1))" - line 355, "pan.___", state 729, "else" - line 361, "pan.___", state 732, "sighand_exec = 1" - line 398, "pan.___", state 745, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 747, "(1)" - line 398, "pan.___", state 748, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 748, "else" - line 398, "pan.___", state 751, "(1)" - line 402, "pan.___", state 759, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 761, "(1)" - line 402, "pan.___", state 762, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 762, "else" - line 402, "pan.___", state 765, "(1)" - line 402, "pan.___", state 766, "(1)" - line 402, "pan.___", state 766, "(1)" - line 400, "pan.___", state 771, "((i<1))" - line 400, "pan.___", state 771, "((i>=1))" - line 407, "pan.___", state 777, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 790, "(1)" - line 408, "pan.___", state 791, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 791, "else" - line 408, "pan.___", state 794, "(1)" - line 408, "pan.___", state 795, "(1)" - line 408, "pan.___", state 795, "(1)" - line 412, "pan.___", state 803, "(1)" - line 412, "pan.___", state 804, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 804, "else" - line 412, "pan.___", state 807, "(1)" - line 412, "pan.___", state 808, "(1)" - line 412, "pan.___", state 808, "(1)" - line 410, "pan.___", state 813, "((i<1))" - line 410, "pan.___", state 813, "((i>=1))" - line 417, "pan.___", state 820, "(1)" - line 417, "pan.___", state 821, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 821, "else" - line 417, "pan.___", state 824, "(1)" - line 417, "pan.___", state 825, "(1)" - line 417, "pan.___", state 825, "(1)" - line 419, "pan.___", state 828, "(1)" - line 419, "pan.___", state 828, "(1)" - line 361, "pan.___", state 837, "sighand_exec = 1" - line 402, "pan.___", state 868, "(1)" - line 402, "pan.___", state 965, "(1)" - line 398, "pan.___", state 1050, "(1)" - line 402, "pan.___", state 1064, "(1)" - line 402, "pan.___", state 1164, "(1)" - line 159, "pan.___", state 1245, "(1)" - line 163, "pan.___", state 1253, "(1)" - line 163, "pan.___", state 1254, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 1254, "else" - line 161, "pan.___", state 1259, "((j<1))" - line 161, "pan.___", state 1259, "((j>=1))" - line 167, "pan.___", state 1265, "(1)" - line 167, "pan.___", state 1266, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 1266, "else" - line 159, "pan.___", state 1277, "(1)" - line 163, "pan.___", state 1285, "(1)" - line 163, "pan.___", state 1286, "(!((cache_dirty_urcu_active_readers.bitfield&(1<=1))" - line 167, "pan.___", state 1297, "(1)" - line 167, "pan.___", state 1298, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 159, "pan.___", state 1313, "(1)" - line 163, "pan.___", state 1321, "(1)" - line 163, "pan.___", state 1322, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 1322, "else" - line 161, "pan.___", state 1327, "((j<1))" - line 161, "pan.___", state 1327, "((j>=1))" - line 167, "pan.___", state 1333, "(1)" - line 167, "pan.___", state 1334, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 1334, "else" - line 201, "pan.___", state 1339, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 201, "pan.___", state 1339, "else" - line 220, "pan.___", state 1340, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 220, "pan.___", state 1340, "else" - line 355, "pan.___", state 1346, "((sighand_exec==1))" - line 355, "pan.___", state 1346, "else" - line 361, "pan.___", state 1349, "sighand_exec = 1" - line 398, "pan.___", state 1362, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 1364, "(1)" - line 398, "pan.___", state 1365, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 1365, "else" - line 398, "pan.___", state 1368, "(1)" - line 402, "pan.___", state 1376, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 1378, "(1)" - line 402, "pan.___", state 1379, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 1379, "else" - line 402, "pan.___", state 1382, "(1)" - line 402, "pan.___", state 1383, "(1)" - line 402, "pan.___", state 1383, "(1)" - line 400, "pan.___", state 1388, "((i<1))" - line 400, "pan.___", state 1388, "((i>=1))" - line 407, "pan.___", state 1394, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 1407, "(1)" - line 408, "pan.___", state 1408, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 1408, "else" - line 408, "pan.___", state 1411, "(1)" - line 408, "pan.___", state 1412, "(1)" - line 408, "pan.___", state 1412, "(1)" - line 412, "pan.___", state 1420, "(1)" - line 412, "pan.___", state 1421, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 1421, "else" - line 412, "pan.___", state 1424, "(1)" - line 412, "pan.___", state 1425, "(1)" - line 412, "pan.___", state 1425, "(1)" - line 410, "pan.___", state 1430, "((i<1))" - line 410, "pan.___", state 1430, "((i>=1))" - line 417, "pan.___", state 1437, "(1)" - line 417, "pan.___", state 1438, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 1438, "else" - line 417, "pan.___", state 1441, "(1)" - line 417, "pan.___", state 1442, "(1)" - line 417, "pan.___", state 1442, "(1)" - line 419, "pan.___", state 1445, "(1)" - line 419, "pan.___", state 1445, "(1)" - line 361, "pan.___", state 1454, "sighand_exec = 1" - line 701, "pan.___", state 1596, "-end-" - (111 of 1596 states) -unreached in proctype :init: - (0 of 46 states) -unreached in proctype :never: - line 747, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 1.23 seconds -pan: rate 129618.7 states/second -pan: avg transition delay 7.3881e-07 usec -cp .input.spin urcu_free_no_wmb.spin.input -cp .input.spin.trail urcu_free_no_wmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_wmb.spin.input b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_wmb.spin.input deleted file mode 100644 index 808154e..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_wmb.spin.input +++ /dev/null @@ -1,722 +0,0 @@ -#define NO_WMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_wmb.spin.input.trail deleted file mode 100644 index 522df0a..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_no_wmb.spin.input.trail +++ /dev/null @@ -1,1677 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:2833 -2:4:2785 -3:4:2788 -4:4:2788 -5:4:2791 -6:4:2799 -7:4:2799 -8:4:2802 -9:4:2808 -10:4:2812 -11:4:2812 -12:4:2815 -13:4:2823 -14:4:2827 -15:4:2828 -16:0:2833 -17:4:2830 -18:0:2833 -19:3:1283 -20:0:2833 -21:3:1289 -22:0:2833 -23:3:1290 -24:0:2833 -25:3:1291 -26:3:1295 -27:3:1296 -28:3:1304 -29:3:1305 -30:3:1309 -31:3:1310 -32:3:1318 -33:3:1323 -34:3:1327 -35:3:1328 -36:3:1335 -37:3:1336 -38:3:1347 -39:3:1348 -40:3:1349 -41:3:1360 -42:3:1365 -43:3:1366 -44:0:2833 -45:3:1378 -46:0:2833 -47:3:1380 -48:3:1381 -49:0:2833 -50:3:1385 -51:3:1389 -52:3:1390 -53:3:1398 -54:3:1399 -55:3:1403 -56:3:1404 -57:3:1412 -58:3:1417 -59:3:1418 -60:3:1429 -61:3:1430 -62:3:1441 -63:3:1442 -64:3:1443 -65:3:1454 -66:3:1459 -67:3:1460 -68:0:2833 -69:3:1472 -70:0:2833 -71:3:1474 -72:0:2833 -73:3:1475 -74:0:2833 -75:3:1485 -76:0:2833 -77:3:1486 -78:0:2833 -79:3:1487 -80:3:1494 -81:3:1495 -82:3:1502 -83:3:1507 -84:0:2833 -85:3:1518 -86:0:2833 -87:3:1519 -88:3:1526 -89:3:1527 -90:3:1534 -91:3:1539 -92:0:2833 -93:3:1550 -94:0:2833 -95:3:1555 -96:3:1562 -97:3:1563 -98:3:1570 -99:3:1575 -100:0:2833 -101:3:1590 -102:0:2833 -103:3:1592 -104:0:2833 -105:3:1593 -106:3:1597 -107:3:1598 -108:3:1606 -109:3:1607 -110:3:1611 -111:3:1612 -112:3:1620 -113:3:1625 -114:3:1629 -115:3:1630 -116:3:1637 -117:3:1638 -118:3:1649 -119:3:1650 -120:3:1651 -121:3:1662 -122:3:1667 -123:3:1668 -124:0:2833 -125:3:1680 -126:0:2833 -127:3:1682 -128:0:2833 -129:3:1685 -130:3:1686 -131:3:1698 -132:3:1699 -133:3:1703 -134:3:1704 -135:3:1712 -136:3:1717 -137:3:1721 -138:3:1722 -139:3:1729 -140:3:1730 -141:3:1741 -142:3:1742 -143:3:1743 -144:3:1754 -145:3:1759 -146:3:1760 -147:0:2833 -148:3:1772 -149:0:2833 -150:3:1774 -151:0:2833 -152:3:1775 -153:0:2833 -154:3:1776 -155:0:2833 -156:3:1777 -157:0:2833 -158:3:1778 -159:3:1782 -160:3:1783 -161:3:1791 -162:3:1792 -163:3:1796 -164:3:1797 -165:3:1805 -166:3:1810 -167:3:1814 -168:3:1815 -169:3:1822 -170:3:1823 -171:3:1834 -172:3:1835 -173:3:1836 -174:3:1847 -175:3:1852 -176:3:1853 -177:0:2833 -178:3:1865 -179:0:2833 -180:3:1974 -181:0:2833 -182:3:2072 -183:0:2833 -184:3:2073 -185:0:2833 -186:3:2077 -187:0:2833 -188:3:2083 -189:3:2087 -190:3:2088 -191:3:2096 -192:3:2097 -193:3:2101 -194:3:2102 -195:3:2110 -196:3:2115 -197:3:2119 -198:3:2120 -199:3:2127 -200:3:2128 -201:3:2139 -202:3:2140 -203:3:2141 -204:3:2152 -205:3:2157 -206:3:2158 -207:0:2833 -208:3:2170 -209:0:2833 -210:3:2172 -211:0:2833 -212:3:2173 -213:3:2177 -214:3:2178 -215:3:2186 -216:3:2187 -217:3:2191 -218:3:2192 -219:3:2200 -220:3:2205 -221:3:2209 -222:3:2210 -223:3:2217 -224:3:2218 -225:3:2229 -226:3:2230 -227:3:2231 -228:3:2242 -229:3:2247 -230:3:2248 -231:0:2833 -232:3:2260 -233:0:2833 -234:3:2262 -235:0:2833 -236:3:2265 -237:3:2266 -238:3:2278 -239:3:2279 -240:3:2283 -241:3:2284 -242:3:2292 -243:3:2297 -244:3:2301 -245:3:2302 -246:3:2309 -247:3:2310 -248:3:2321 -249:3:2322 -250:3:2323 -251:3:2334 -252:3:2339 -253:3:2340 -254:0:2833 -255:3:2352 -256:0:2833 -257:3:2354 -258:0:2833 -259:3:2355 -260:0:2833 -261:3:2356 -262:0:2833 -263:3:2357 -264:0:2833 -265:3:2358 -266:3:2362 -267:3:2363 -268:3:2371 -269:3:2372 -270:3:2376 -271:3:2377 -272:3:2385 -273:3:2390 -274:3:2394 -275:3:2395 -276:3:2402 -277:3:2403 -278:3:2414 -279:3:2415 -280:3:2416 -281:3:2427 -282:3:2432 -283:3:2433 -284:0:2833 -285:3:2445 -286:0:2833 -287:3:2554 -288:0:2833 -289:3:2652 -290:0:2833 -291:3:2653 -292:0:2833 -293:3:2657 -294:0:2833 -295:3:2663 -296:0:2833 -297:3:2664 -298:3:2671 -299:3:2672 -300:3:2679 -301:3:2684 -302:0:2833 -303:3:2695 -304:0:2833 -305:3:2696 -306:3:2703 -307:3:2704 -308:3:2711 -309:3:2716 -310:0:2833 -311:3:2727 -312:0:2833 -313:3:2732 -314:3:2739 -315:3:2740 -316:3:2747 -317:3:2752 -318:0:2833 -319:3:2767 -320:0:2833 -321:3:2769 -322:0:2833 -323:3:2770 -324:0:2833 -325:3:1290 -326:0:2833 -327:3:1291 -328:3:1295 -329:3:1296 -330:3:1304 -331:3:1305 -332:3:1309 -333:3:1310 -334:3:1318 -335:3:1323 -336:3:1327 -337:3:1328 -338:3:1335 -339:3:1336 -340:3:1347 -341:3:1348 -342:3:1349 -343:3:1360 -344:3:1365 -345:3:1366 -346:0:2833 -347:3:1378 -348:0:2833 -349:3:1380 -350:3:1381 -351:0:2833 -352:3:1385 -353:3:1389 -354:3:1390 -355:3:1398 -356:3:1399 -357:3:1403 -358:3:1404 -359:3:1412 -360:3:1417 -361:3:1418 -362:3:1429 -363:3:1430 -364:3:1441 -365:3:1442 -366:3:1443 -367:3:1454 -368:3:1459 -369:3:1460 -370:0:2833 -371:3:1472 -372:0:2833 -373:3:1474 -374:0:2833 -375:3:1475 -376:0:2833 -377:3:1485 -378:0:2833 -379:3:1486 -380:0:2833 -381:3:1487 -382:3:1494 -383:3:1495 -384:3:1502 -385:3:1507 -386:0:2833 -387:3:1518 -388:0:2833 -389:3:1519 -390:3:1526 -391:3:1527 -392:3:1534 -393:3:1539 -394:0:2833 -395:3:1550 -396:0:2833 -397:3:1555 -398:3:1562 -399:3:1563 -400:3:1570 -401:3:1575 -402:0:2833 -403:3:1590 -404:0:2833 -405:3:1592 -406:0:2833 -407:3:1593 -408:3:1597 -409:3:1598 -410:3:1606 -411:3:1607 -412:3:1611 -413:3:1612 -414:3:1620 -415:3:1625 -416:3:1629 -417:3:1630 -418:3:1637 -419:3:1638 -420:3:1649 -421:3:1650 -422:3:1651 -423:3:1662 -424:3:1667 -425:3:1668 -426:0:2833 -427:3:1680 -428:0:2833 -429:3:1682 -430:0:2833 -431:3:1685 -432:3:1686 -433:3:1698 -434:3:1699 -435:3:1703 -436:3:1704 -437:3:1712 -438:3:1717 -439:3:1721 -440:3:1722 -441:3:1729 -442:3:1730 -443:3:1741 -444:3:1742 -445:3:1743 -446:3:1754 -447:3:1759 -448:3:1760 -449:0:2833 -450:3:1772 -451:0:2833 -452:3:1774 -453:0:2833 -454:3:1775 -455:0:2833 -456:3:1776 -457:0:2833 -458:3:1777 -459:0:2833 -460:3:1778 -461:3:1782 -462:3:1783 -463:3:1791 -464:3:1792 -465:3:1796 -466:3:1797 -467:3:1805 -468:3:1810 -469:3:1814 -470:3:1815 -471:3:1822 -472:3:1823 -473:3:1834 -474:3:1835 -475:3:1836 -476:3:1847 -477:3:1852 -478:3:1853 -479:0:2833 -480:3:1865 -481:0:2833 -482:3:1974 -483:0:2833 -484:3:2072 -485:0:2833 -486:3:2073 -487:0:2833 -488:3:2077 -489:0:2833 -490:3:2083 -491:3:2087 -492:3:2088 -493:3:2096 -494:3:2097 -495:3:2101 -496:3:2102 -497:3:2110 -498:3:2115 -499:3:2119 -500:3:2120 -501:3:2127 -502:3:2128 -503:3:2139 -504:3:2140 -505:3:2141 -506:3:2152 -507:3:2157 -508:3:2158 -509:0:2833 -510:3:2170 -511:0:2833 -512:3:2172 -513:0:2833 -514:3:2173 -515:3:2177 -516:3:2178 -517:3:2186 -518:3:2187 -519:3:2191 -520:3:2192 -521:3:2200 -522:3:2205 -523:3:2209 -524:3:2210 -525:3:2217 -526:3:2218 -527:3:2229 -528:3:2230 -529:3:2231 -530:3:2242 -531:3:2247 -532:3:2248 -533:0:2833 -534:3:2260 -535:0:2833 -536:3:2262 -537:0:2833 -538:3:2265 -539:3:2266 -540:3:2278 -541:3:2279 -542:3:2283 -543:3:2284 -544:3:2292 -545:3:2297 -546:3:2301 -547:3:2302 -548:3:2309 -549:3:2310 -550:3:2321 -551:3:2322 -552:3:2323 -553:3:2334 -554:3:2339 -555:3:2340 -556:0:2833 -557:3:2352 -558:0:2833 -559:3:2354 -560:0:2833 -561:3:2355 -562:0:2833 -563:3:2356 -564:0:2833 -565:3:2357 -566:0:2833 -567:3:2358 -568:3:2362 -569:3:2363 -570:3:2371 -571:3:2372 -572:3:2376 -573:3:2377 -574:3:2385 -575:3:2390 -576:3:2394 -577:3:2395 -578:3:2402 -579:3:2403 -580:3:2414 -581:3:2415 -582:3:2416 -583:3:2427 -584:3:2432 -585:3:2433 -586:0:2833 -587:3:2445 -588:0:2833 -589:3:2554 -590:0:2833 -591:3:2652 -592:0:2833 -593:3:2653 -594:0:2833 -595:3:2657 -596:0:2833 -597:3:2663 -598:0:2833 -599:3:2664 -600:3:2671 -601:3:2672 -602:3:2679 -603:3:2684 -604:0:2833 -605:3:2695 -606:0:2833 -607:3:2696 -608:3:2703 -609:3:2704 -610:3:2711 -611:3:2716 -612:0:2833 -613:3:2727 -614:0:2833 -615:3:2732 -616:3:2739 -617:3:2740 -618:3:2747 -619:3:2752 -620:0:2833 -621:3:2767 -622:0:2833 -623:3:2769 -624:0:2833 -625:3:2770 -626:0:2833 -627:3:1290 -628:0:2833 -629:3:1291 -630:3:1295 -631:3:1296 -632:3:1304 -633:3:1305 -634:3:1309 -635:3:1310 -636:3:1318 -637:3:1323 -638:3:1327 -639:3:1328 -640:3:1335 -641:3:1336 -642:3:1347 -643:3:1348 -644:3:1349 -645:3:1360 -646:3:1365 -647:3:1366 -648:0:2833 -649:3:1378 -650:0:2833 -651:3:1380 -652:3:1381 -653:0:2833 -654:3:1385 -655:3:1389 -656:3:1390 -657:3:1398 -658:3:1399 -659:3:1403 -660:3:1404 -661:3:1412 -662:3:1417 -663:3:1418 -664:3:1429 -665:3:1430 -666:3:1441 -667:3:1442 -668:3:1443 -669:3:1454 -670:3:1459 -671:3:1460 -672:0:2833 -673:3:1472 -674:0:2833 -675:3:1474 -676:0:2833 -677:3:1475 -678:0:2833 -679:3:1485 -680:0:2833 -681:3:1486 -682:0:2833 -683:3:1487 -684:3:1494 -685:3:1495 -686:3:1502 -687:3:1507 -688:0:2833 -689:3:1518 -690:0:2833 -691:3:1519 -692:3:1526 -693:3:1527 -694:3:1534 -695:3:1539 -696:0:2833 -697:3:1550 -698:0:2833 -699:3:1555 -700:3:1562 -701:3:1563 -702:3:1570 -703:3:1575 -704:0:2833 -705:3:1590 -706:0:2833 -707:3:1592 -708:0:2833 -709:3:1593 -710:3:1597 -711:3:1598 -712:3:1606 -713:3:1607 -714:3:1611 -715:3:1612 -716:3:1620 -717:3:1625 -718:3:1629 -719:3:1630 -720:3:1637 -721:3:1638 -722:3:1649 -723:3:1650 -724:3:1651 -725:3:1662 -726:3:1667 -727:3:1668 -728:0:2833 -729:3:1680 -730:0:2833 -731:3:1682 -732:0:2833 -733:3:1685 -734:3:1686 -735:3:1698 -736:3:1699 -737:3:1703 -738:3:1704 -739:3:1712 -740:3:1717 -741:3:1721 -742:3:1722 -743:3:1729 -744:3:1730 -745:3:1741 -746:3:1742 -747:3:1743 -748:3:1754 -749:3:1759 -750:3:1760 -751:0:2833 -752:3:1772 -753:0:2833 -754:3:1774 -755:0:2833 -756:3:1775 -757:0:2833 -758:3:1776 -759:0:2833 -760:3:1777 -761:0:2833 -762:3:1778 -763:3:1782 -764:3:1783 -765:3:1791 -766:3:1792 -767:3:1796 -768:3:1797 -769:3:1805 -770:3:1810 -771:3:1814 -772:3:1815 -773:3:1822 -774:3:1823 -775:3:1834 -776:3:1835 -777:3:1836 -778:3:1847 -779:3:1852 -780:3:1853 -781:0:2833 -782:3:1865 -783:0:2833 -784:3:1974 -785:0:2833 -786:3:2072 -787:0:2833 -788:3:2073 -789:0:2833 -790:3:2077 -791:0:2833 -792:3:2083 -793:3:2087 -794:3:2088 -795:3:2096 -796:3:2097 -797:3:2101 -798:3:2102 -799:3:2110 -800:3:2115 -801:3:2119 -802:3:2120 -803:3:2127 -804:3:2128 -805:3:2139 -806:3:2140 -807:3:2141 -808:3:2152 -809:3:2157 -810:3:2158 -811:0:2833 -812:3:2170 -813:0:2833 -814:3:2172 -815:0:2833 -816:3:2173 -817:3:2177 -818:3:2178 -819:3:2186 -820:3:2187 -821:3:2191 -822:3:2192 -823:3:2200 -824:3:2205 -825:3:2209 -826:3:2210 -827:3:2217 -828:3:2218 -829:3:2229 -830:3:2230 -831:3:2231 -832:3:2242 -833:3:2247 -834:3:2248 -835:0:2833 -836:3:2260 -837:0:2833 -838:3:2262 -839:0:2833 -840:3:2265 -841:3:2266 -842:3:2278 -843:3:2279 -844:3:2283 -845:3:2284 -846:3:2292 -847:3:2297 -848:3:2301 -849:3:2302 -850:3:2309 -851:3:2310 -852:3:2321 -853:3:2322 -854:3:2323 -855:3:2334 -856:3:2339 -857:3:2340 -858:0:2833 -859:3:2352 -860:0:2833 -861:3:2354 -862:0:2833 -863:3:2355 -864:0:2833 -865:3:2356 -866:0:2833 -867:3:2357 -868:0:2833 -869:3:2358 -870:3:2362 -871:3:2363 -872:3:2371 -873:3:2372 -874:3:2376 -875:3:2377 -876:3:2385 -877:3:2390 -878:3:2394 -879:3:2395 -880:3:2402 -881:3:2403 -882:3:2414 -883:3:2415 -884:3:2416 -885:3:2427 -886:3:2432 -887:3:2433 -888:0:2833 -889:3:2445 -890:0:2833 -891:3:2554 -892:0:2833 -893:3:2652 -894:0:2833 -895:3:2653 -896:0:2833 -897:3:2657 -898:0:2833 -899:3:2663 -900:0:2833 -901:3:2664 -902:3:2671 -903:3:2672 -904:3:2679 -905:3:2684 -906:0:2833 -907:3:2695 -908:0:2833 -909:3:2696 -910:3:2703 -911:3:2704 -912:3:2711 -913:3:2716 -914:0:2833 -915:3:2727 -916:0:2833 -917:3:2732 -918:3:2739 -919:3:2740 -920:3:2747 -921:3:2752 -922:0:2833 -923:3:2767 -924:0:2833 -925:3:2769 -926:0:2833 -927:3:2770 -928:0:2833 -929:3:1290 -930:0:2833 -931:3:1291 -932:3:1295 -933:3:1296 -934:3:1304 -935:3:1305 -936:3:1309 -937:3:1310 -938:3:1318 -939:3:1323 -940:3:1327 -941:3:1328 -942:3:1335 -943:3:1336 -944:3:1347 -945:3:1348 -946:3:1349 -947:3:1360 -948:3:1365 -949:3:1366 -950:0:2833 -951:3:1378 -952:0:2833 -953:3:1380 -954:3:1381 -955:0:2833 -956:3:1385 -957:3:1389 -958:3:1390 -959:3:1398 -960:3:1399 -961:3:1403 -962:3:1404 -963:3:1412 -964:3:1417 -965:3:1418 -966:3:1429 -967:3:1430 -968:3:1441 -969:3:1442 -970:3:1443 -971:3:1454 -972:3:1459 -973:3:1460 -974:0:2833 -975:3:1472 -976:0:2833 -977:3:1474 -978:0:2833 -979:3:1475 -980:0:2833 -981:3:1485 -982:0:2833 -983:3:1486 -984:0:2833 -985:3:1487 -986:3:1494 -987:3:1495 -988:3:1502 -989:3:1507 -990:0:2833 -991:3:1518 -992:0:2833 -993:3:1519 -994:3:1526 -995:3:1527 -996:3:1534 -997:3:1539 -998:0:2833 -999:3:1550 -1000:0:2833 -1001:3:1555 -1002:3:1562 -1003:3:1563 -1004:3:1570 -1005:3:1575 -1006:0:2833 -1007:3:1590 -1008:0:2833 -1009:3:1592 -1010:0:2833 -1011:3:1593 -1012:3:1597 -1013:3:1598 -1014:3:1606 -1015:3:1607 -1016:3:1611 -1017:3:1612 -1018:3:1620 -1019:3:1625 -1020:3:1629 -1021:3:1630 -1022:3:1637 -1023:3:1638 -1024:3:1649 -1025:3:1650 -1026:3:1651 -1027:3:1662 -1028:3:1667 -1029:3:1668 -1030:0:2833 -1031:3:1680 -1032:0:2833 -1033:3:1682 -1034:0:2833 -1035:3:1685 -1036:3:1686 -1037:3:1698 -1038:3:1699 -1039:3:1703 -1040:3:1704 -1041:3:1712 -1042:3:1717 -1043:3:1721 -1044:3:1722 -1045:3:1729 -1046:3:1730 -1047:3:1741 -1048:3:1742 -1049:3:1743 -1050:3:1754 -1051:3:1759 -1052:3:1760 -1053:0:2833 -1054:3:1772 -1055:0:2833 -1056:3:1774 -1057:0:2833 -1058:3:1775 -1059:0:2833 -1060:3:1776 -1061:0:2833 -1062:3:1777 -1063:0:2833 -1064:3:1778 -1065:3:1782 -1066:3:1783 -1067:3:1791 -1068:3:1792 -1069:3:1796 -1070:3:1797 -1071:3:1805 -1072:3:1810 -1073:3:1814 -1074:3:1815 -1075:3:1822 -1076:3:1823 -1077:3:1834 -1078:3:1835 -1079:3:1836 -1080:3:1847 -1081:3:1852 -1082:3:1853 -1083:0:2833 -1084:3:1865 -1085:0:2833 -1086:3:1974 -1087:0:2833 -1088:3:2072 -1089:0:2833 -1090:3:2073 -1091:0:2833 -1092:3:2077 -1093:0:2833 -1094:3:2083 -1095:3:2087 -1096:3:2088 -1097:3:2096 -1098:3:2097 -1099:3:2101 -1100:3:2102 -1101:3:2110 -1102:3:2115 -1103:3:2119 -1104:3:2120 -1105:3:2127 -1106:3:2128 -1107:3:2139 -1108:3:2140 -1109:3:2141 -1110:3:2152 -1111:3:2157 -1112:3:2158 -1113:0:2833 -1114:3:2170 -1115:0:2833 -1116:3:2172 -1117:0:2833 -1118:3:2173 -1119:3:2177 -1120:3:2178 -1121:3:2186 -1122:3:2187 -1123:3:2191 -1124:3:2192 -1125:3:2200 -1126:3:2205 -1127:3:2209 -1128:3:2210 -1129:3:2217 -1130:3:2218 -1131:3:2229 -1132:3:2230 -1133:3:2231 -1134:3:2242 -1135:3:2247 -1136:3:2248 -1137:0:2833 -1138:3:2260 -1139:0:2833 -1140:3:2262 -1141:0:2833 -1142:3:2265 -1143:3:2266 -1144:3:2278 -1145:3:2279 -1146:3:2283 -1147:3:2284 -1148:3:2292 -1149:3:2297 -1150:3:2301 -1151:3:2302 -1152:3:2309 -1153:3:2310 -1154:3:2321 -1155:3:2322 -1156:3:2323 -1157:3:2334 -1158:3:2339 -1159:3:2340 -1160:0:2833 -1161:3:2352 -1162:0:2833 -1163:3:2354 -1164:0:2833 -1165:3:2355 -1166:0:2833 -1167:3:2356 -1168:0:2833 -1169:3:2357 -1170:0:2833 -1171:3:2358 -1172:3:2362 -1173:3:2363 -1174:3:2371 -1175:3:2372 -1176:3:2376 -1177:3:2377 -1178:3:2385 -1179:3:2390 -1180:3:2394 -1181:3:2395 -1182:3:2402 -1183:3:2403 -1184:3:2414 -1185:3:2415 -1186:3:2416 -1187:3:2427 -1188:3:2432 -1189:3:2433 -1190:0:2833 -1191:3:2445 -1192:0:2833 -1193:3:2554 -1194:0:2833 -1195:3:2652 -1196:0:2833 -1197:3:2653 -1198:0:2833 -1199:3:2657 -1200:0:2833 -1201:3:2663 -1202:0:2833 -1203:3:2664 -1204:3:2671 -1205:3:2672 -1206:3:2679 -1207:3:2684 -1208:0:2833 -1209:3:2695 -1210:0:2833 -1211:3:2696 -1212:3:2703 -1213:3:2704 -1214:3:2711 -1215:3:2716 -1216:0:2833 -1217:3:2727 -1218:0:2833 -1219:3:2732 -1220:3:2739 -1221:3:2740 -1222:3:2747 -1223:3:2752 -1224:0:2833 -1225:3:2767 -1226:0:2833 -1227:3:2769 -1228:0:2833 -1229:3:2770 -1230:0:2833 -1231:3:1290 -1232:0:2833 -1233:3:1291 -1234:3:1295 -1235:3:1296 -1236:3:1304 -1237:3:1305 -1238:3:1309 -1239:3:1310 -1240:3:1318 -1241:3:1323 -1242:3:1327 -1243:3:1328 -1244:3:1335 -1245:3:1336 -1246:3:1347 -1247:3:1348 -1248:3:1349 -1249:3:1360 -1250:3:1365 -1251:3:1366 -1252:0:2833 -1253:3:1378 -1254:0:2833 -1255:3:1380 -1256:3:1381 -1257:0:2833 -1258:3:1385 -1259:3:1389 -1260:3:1390 -1261:3:1398 -1262:3:1399 -1263:3:1403 -1264:3:1404 -1265:3:1412 -1266:3:1417 -1267:3:1418 -1268:3:1429 -1269:3:1430 -1270:3:1441 -1271:3:1442 -1272:3:1443 -1273:3:1454 -1274:3:1459 -1275:3:1460 -1276:0:2833 -1277:3:1472 -1278:0:2833 -1279:3:1474 -1280:0:2833 -1281:3:1475 -1282:0:2833 -1283:3:1485 -1284:0:2833 -1285:3:1486 -1286:0:2833 -1287:3:1487 -1288:3:1494 -1289:3:1495 -1290:3:1502 -1291:3:1507 -1292:0:2833 -1293:3:1518 -1294:0:2833 -1295:2:662 -1296:0:2833 -1297:2:668 -1298:0:2833 -1299:2:669 -1300:0:2833 -1301:2:670 -1302:0:2833 -1303:2:671 -1304:0:2833 -1305:1:2 -1306:0:2833 -1307:2:672 -1308:0:2833 -1309:1:8 -1310:0:2833 -1311:1:9 -1312:0:2833 -1313:1:10 -1314:0:2833 -1315:1:11 -1316:0:2833 -1317:2:671 -1318:0:2833 -1319:1:12 -1320:1:16 -1321:1:17 -1322:1:25 -1323:1:26 -1324:1:30 -1325:1:31 -1326:1:39 -1327:1:44 -1328:1:48 -1329:1:49 -1330:1:56 -1331:1:57 -1332:1:68 -1333:1:69 -1334:1:70 -1335:1:81 -1336:1:93 -1337:1:94 -1338:0:2833 -1339:2:672 -1340:0:2833 -1341:1:99 -1342:0:2833 -1343:2:673 -1344:0:2833 -1345:2:674 -1346:0:2833 -1347:2:685 -1348:0:2833 -1349:2:686 -1350:0:2833 -1351:2:687 -1352:2:691 -1353:2:692 -1354:2:700 -1355:2:701 -1356:2:705 -1357:2:706 -1358:2:714 -1359:2:719 -1360:2:723 -1361:2:724 -1362:2:731 -1363:2:732 -1364:2:743 -1365:2:744 -1366:2:745 -1367:2:756 -1368:2:768 -1369:2:769 -1370:0:2833 -1371:2:774 -1372:0:2833 -1373:2:775 -1374:2:779 -1375:2:780 -1376:2:788 -1377:2:789 -1378:2:793 -1379:2:794 -1380:2:802 -1381:2:807 -1382:2:811 -1383:2:812 -1384:2:819 -1385:2:820 -1386:2:831 -1387:2:832 -1388:2:833 -1389:2:844 -1390:2:856 -1391:2:857 -1392:0:2833 -1393:2:862 -1394:0:2833 -1395:2:863 -1396:0:2833 -1397:2:864 -1398:2:868 -1399:2:869 -1400:2:877 -1401:2:878 -1402:2:882 -1403:2:883 -1404:2:891 -1405:2:896 -1406:2:900 -1407:2:901 -1408:2:908 -1409:2:909 -1410:2:920 -1411:2:921 -1412:2:922 -1413:2:933 -1414:2:945 -1415:2:946 -1416:0:2833 -1417:2:951 -1418:0:2833 -1419:2:1059 -1420:0:2833 -1421:2:1060 -1422:0:2833 -1423:2:1065 -1424:0:2833 -1425:2:1070 -1426:0:2833 -1427:3:1519 -1428:3:1526 -1429:3:1529 -1430:3:1530 -1431:3:1534 -1432:3:1539 -1433:0:2833 -1434:3:1550 -1435:0:2833 -1436:3:1555 -1437:3:1562 -1438:3:1563 -1439:3:1570 -1440:3:1575 -1441:0:2833 -1442:3:1590 -1443:0:2833 -1444:3:1592 -1445:0:2833 -1446:3:1593 -1447:3:1597 -1448:3:1598 -1449:3:1606 -1450:3:1607 -1451:3:1611 -1452:3:1612 -1453:3:1620 -1454:3:1625 -1455:3:1629 -1456:3:1630 -1457:3:1637 -1458:3:1638 -1459:3:1649 -1460:3:1650 -1461:3:1651 -1462:3:1662 -1463:3:1667 -1464:3:1668 -1465:0:2833 -1466:3:1680 -1467:0:2833 -1468:3:1682 -1469:0:2833 -1470:3:1685 -1471:3:1686 -1472:3:1698 -1473:3:1699 -1474:3:1703 -1475:3:1704 -1476:3:1712 -1477:3:1717 -1478:3:1721 -1479:3:1722 -1480:3:1729 -1481:3:1730 -1482:3:1741 -1483:3:1742 -1484:3:1743 -1485:3:1754 -1486:3:1759 -1487:3:1760 -1488:0:2833 -1489:3:1772 -1490:0:2833 -1491:3:1774 -1492:0:2833 -1493:3:1775 -1494:0:2833 -1495:3:1776 -1496:0:2833 -1497:3:1777 -1498:0:2833 -1499:3:1778 -1500:3:1782 -1501:3:1783 -1502:3:1791 -1503:3:1792 -1504:3:1796 -1505:3:1797 -1506:3:1805 -1507:3:1810 -1508:3:1814 -1509:3:1815 -1510:3:1822 -1511:3:1823 -1512:3:1834 -1513:3:1835 -1514:3:1836 -1515:3:1847 -1516:3:1852 -1517:3:1853 -1518:0:2833 -1519:3:1865 -1520:0:2833 -1521:3:1974 -1522:0:2833 -1523:3:2072 -1524:0:2833 -1525:3:2073 -1526:0:2833 -1527:3:2077 -1528:0:2833 -1529:3:2083 -1530:3:2087 -1531:3:2088 -1532:3:2096 -1533:3:2097 -1534:3:2101 -1535:3:2102 -1536:3:2110 -1537:3:2115 -1538:3:2119 -1539:3:2120 -1540:3:2127 -1541:3:2128 -1542:3:2139 -1543:3:2140 -1544:3:2141 -1545:3:2152 -1546:3:2157 -1547:3:2158 -1548:0:2833 -1549:3:2170 -1550:0:2833 -1551:3:2172 -1552:0:2833 -1553:3:2173 -1554:3:2177 -1555:3:2178 -1556:3:2186 -1557:3:2187 -1558:3:2191 -1559:3:2192 -1560:3:2200 -1561:3:2205 -1562:3:2209 -1563:3:2210 -1564:3:2217 -1565:3:2218 -1566:3:2229 -1567:3:2230 -1568:3:2231 -1569:3:2242 -1570:3:2247 -1571:3:2248 -1572:0:2833 -1573:3:2260 -1574:0:2833 -1575:3:2262 -1576:0:2833 -1577:3:2265 -1578:3:2266 -1579:3:2278 -1580:3:2279 -1581:3:2283 -1582:3:2284 -1583:3:2292 -1584:3:2297 -1585:3:2301 -1586:3:2302 -1587:3:2309 -1588:3:2310 -1589:3:2321 -1590:3:2322 -1591:3:2323 -1592:3:2334 -1593:3:2339 -1594:3:2340 -1595:0:2833 -1596:3:2352 -1597:0:2833 -1598:3:2354 -1599:0:2833 -1600:3:2355 -1601:0:2833 -1602:3:2356 -1603:0:2833 -1604:3:2357 -1605:0:2833 -1606:3:2358 -1607:3:2362 -1608:3:2363 -1609:3:2371 -1610:3:2372 -1611:3:2376 -1612:3:2377 -1613:3:2385 -1614:3:2390 -1615:3:2394 -1616:3:2395 -1617:3:2402 -1618:3:2403 -1619:3:2414 -1620:3:2415 -1621:3:2416 -1622:3:2427 -1623:3:2432 -1624:3:2433 -1625:0:2833 -1626:3:2445 -1627:0:2833 -1628:3:2554 -1629:0:2833 -1630:3:2652 -1631:0:2833 -1632:3:2653 -1633:0:2833 -1634:3:2657 -1635:0:2833 -1636:3:2663 -1637:0:2833 -1638:3:2664 -1639:3:2671 -1640:3:2672 -1641:3:2679 -1642:3:2684 -1643:0:2833 -1644:3:2695 -1645:0:2833 -1646:3:2696 -1647:3:2703 -1648:3:2706 -1649:3:2707 -1650:3:2711 -1651:3:2716 -1652:0:2833 -1653:3:2727 -1654:0:2833 -1655:3:2732 -1656:3:2739 -1657:3:2740 -1658:3:2747 -1659:3:2752 -1660:0:2833 -1661:3:2767 -1662:0:2833 -1663:3:2769 -1664:0:2833 -1665:3:2770 -1666:0:2833 -1667:3:2773 -1668:0:2833 -1669:3:2778 -1670:0:2833 -1671:2:1071 -1672:0:2831 -1673:3:2779 -1674:0:2837 -1675:1:288 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_single_flip.define b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_single_flip.log b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_single_flip.log deleted file mode 100644 index f854175..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_single_flip.log +++ /dev/null @@ -1,224 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_single_flip.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 742) - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 6934, errors: 0 - 7626 states, stored - 67235 states, matched - 74861 transitions (= stored+matched) - 248896 atomic steps -hash conflicts: 113 (resolved) - -Stats on memory usage (in Megabytes): - 0.611 equivalent memory usage for states (stored*(State-vector + overhead)) - 0.867 actual memory usage for states (unsuccessful compression: 141.88%) - state-vector as stored = 91 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 466.545 total actual memory usage - -unreached in proctype urcu_reader_sig - line 402, "pan.___", state 330, "(1)" - line 613, "pan.___", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 59, "(1)" - line 417, "pan.___", state 89, "(1)" - line 398, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 408, "pan.___", state 160, "(1)" - line 651, "pan.___", state 213, "(1)" - line 174, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 178, "pan.___", state 233, "(1)" - line 159, "pan.___", state 254, "(1)" - line 163, "pan.___", state 262, "(1)" - line 167, "pan.___", state 274, "(1)" - line 174, "pan.___", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 752, "(1)" - line 163, "pan.___", state 760, "(1)" - line 163, "pan.___", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 761, "else" - line 161, "pan.___", state 766, "((j<1))" - line 161, "pan.___", state 766, "((j>=1))" - line 167, "pan.___", state 772, "(1)" - line 167, "pan.___", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 773, "else" - line 169, "pan.___", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 776, "else" - line 174, "pan.___", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 167, "pan.___", state 835, "(1)" - line 167, "pan.___", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 174, "pan.___", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 852, "(1)" - line 178, "pan.___", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 861, "(1)" - line 178, "pan.___", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 862, "else" - line 176, "pan.___", state 867, "((j<1))" - line 176, "pan.___", state 867, "((j>=1))" - line 182, "pan.___", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 882, "(1)" - line 163, "pan.___", state 890, "(1)" - line 163, "pan.___", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 891, "else" - line 161, "pan.___", state 896, "((j<1))" - line 161, "pan.___", state 896, "((j>=1))" - line 167, "pan.___", state 902, "(1)" - line 167, "pan.___", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 903, "else" - line 169, "pan.___", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 906, "else" - line 201, "pan.___", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 201, "pan.___", state 908, "else" - line 220, "pan.___", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 220, "pan.___", state 909, "else" - line 355, "pan.___", state 915, "((sighand_exec==1))" - line 355, "pan.___", state 915, "else" - line 361, "pan.___", state 918, "sighand_exec = 1" - line 398, "pan.___", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 933, "(1)" - line 398, "pan.___", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 934, "else" - line 398, "pan.___", state 937, "(1)" - line 402, "pan.___", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 947, "(1)" - line 402, "pan.___", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 948, "else" - line 402, "pan.___", state 951, "(1)" - line 402, "pan.___", state 952, "(1)" - line 402, "pan.___", state 952, "(1)" - line 400, "pan.___", state 957, "((i<1))" - line 400, "pan.___", state 957, "((i>=1))" - line 407, "pan.___", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 976, "(1)" - line 408, "pan.___", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 977, "else" - line 408, "pan.___", state 980, "(1)" - line 408, "pan.___", state 981, "(1)" - line 408, "pan.___", state 981, "(1)" - line 412, "pan.___", state 989, "(1)" - line 412, "pan.___", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 990, "else" - line 412, "pan.___", state 993, "(1)" - line 412, "pan.___", state 994, "(1)" - line 412, "pan.___", state 994, "(1)" - line 410, "pan.___", state 999, "((i<1))" - line 410, "pan.___", state 999, "((i>=1))" - line 417, "pan.___", state 1006, "(1)" - line 417, "pan.___", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 1007, "else" - line 417, "pan.___", state 1010, "(1)" - line 417, "pan.___", state 1011, "(1)" - line 417, "pan.___", state 1011, "(1)" - line 419, "pan.___", state 1014, "(1)" - line 419, "pan.___", state 1014, "(1)" - line 361, "pan.___", state 1023, "sighand_exec = 1" - line 178, "pan.___", state 1048, "(1)" - line 182, "pan.___", state 1059, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 1069, "(1)" - line 163, "pan.___", state 1077, "(1)" - line 167, "pan.___", state 1089, "(1)" - line 174, "pan.___", state 1100, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_single_flip.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_single_flip.spin.input.trail deleted file mode 100644 index 84cf653..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_free_single_flip.spin.input.trail +++ /dev/null @@ -1,1379 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:2904 -2:4:2856 -3:4:2859 -4:4:2859 -5:4:2862 -6:4:2870 -7:4:2870 -8:4:2873 -9:4:2879 -10:4:2883 -11:4:2883 -12:4:2886 -13:4:2894 -14:4:2898 -15:4:2899 -16:0:2904 -17:4:2901 -18:0:2904 -19:3:1655 -20:0:2904 -21:3:1661 -22:0:2904 -23:3:1662 -24:0:2904 -25:3:1663 -26:3:1667 -27:3:1668 -28:3:1676 -29:3:1677 -30:3:1681 -31:3:1682 -32:3:1690 -33:3:1695 -34:3:1699 -35:3:1700 -36:3:1707 -37:3:1708 -38:3:1719 -39:3:1720 -40:3:1721 -41:3:1732 -42:3:1737 -43:3:1738 -44:0:2904 -45:3:1750 -46:0:2904 -47:3:1752 -48:3:1753 -49:0:2904 -50:3:1757 -51:3:1761 -52:3:1762 -53:3:1770 -54:3:1771 -55:3:1775 -56:3:1776 -57:3:1784 -58:3:1789 -59:3:1790 -60:3:1801 -61:3:1802 -62:3:1813 -63:3:1814 -64:3:1815 -65:3:1826 -66:3:1831 -67:3:1832 -68:0:2904 -69:3:1844 -70:0:2904 -71:3:1846 -72:0:2904 -73:3:1847 -74:0:2904 -75:3:1857 -76:0:2904 -77:3:1858 -78:0:2904 -79:3:1862 -80:3:1863 -81:3:1867 -82:3:1871 -83:3:1872 -84:3:1876 -85:3:1884 -86:3:1885 -87:3:1890 -88:3:1897 -89:3:1898 -90:3:1905 -91:3:1910 -92:0:2904 -93:3:1921 -94:0:2904 -95:3:1925 -96:3:1926 -97:3:1930 -98:3:1934 -99:3:1935 -100:3:1939 -101:3:1947 -102:3:1948 -103:3:1953 -104:3:1960 -105:3:1961 -106:3:1968 -107:3:1973 -108:0:2904 -109:3:1984 -110:0:2904 -111:3:1992 -112:3:1993 -113:3:1997 -114:3:2001 -115:3:2002 -116:3:2006 -117:3:2014 -118:3:2015 -119:3:2020 -120:3:2027 -121:3:2028 -122:3:2035 -123:3:2040 -124:0:2904 -125:3:2055 -126:0:2904 -127:3:2057 -128:0:2904 -129:3:2058 -130:3:2062 -131:3:2063 -132:3:2071 -133:3:2072 -134:3:2076 -135:3:2077 -136:3:2085 -137:3:2090 -138:3:2094 -139:3:2095 -140:3:2102 -141:3:2103 -142:3:2114 -143:3:2115 -144:3:2116 -145:3:2127 -146:3:2132 -147:3:2133 -148:0:2904 -149:3:2145 -150:0:2904 -151:3:2147 -152:0:2904 -153:3:2150 -154:3:2151 -155:3:2163 -156:3:2164 -157:3:2168 -158:3:2169 -159:3:2177 -160:3:2182 -161:3:2186 -162:3:2187 -163:3:2194 -164:3:2195 -165:3:2206 -166:3:2207 -167:3:2208 -168:3:2219 -169:3:2224 -170:3:2225 -171:0:2904 -172:3:2237 -173:0:2904 -174:3:2239 -175:0:2904 -176:3:2240 -177:0:2904 -178:3:2241 -179:0:2904 -180:3:2242 -181:0:2904 -182:3:2243 -183:3:2247 -184:3:2248 -185:3:2256 -186:3:2257 -187:3:2261 -188:3:2262 -189:3:2270 -190:3:2275 -191:3:2279 -192:3:2280 -193:3:2287 -194:3:2288 -195:3:2299 -196:3:2300 -197:3:2301 -198:3:2312 -199:3:2317 -200:3:2318 -201:0:2904 -202:3:2330 -203:0:2904 -204:3:2532 -205:0:2904 -206:3:2630 -207:0:2904 -208:3:2631 -209:0:2904 -210:3:2635 -211:0:2904 -212:3:2641 -213:0:2904 -214:3:2645 -215:3:2646 -216:3:2650 -217:3:2654 -218:3:2655 -219:3:2659 -220:3:2667 -221:3:2668 -222:3:2673 -223:3:2680 -224:3:2681 -225:3:2688 -226:3:2693 -227:0:2904 -228:3:2704 -229:0:2904 -230:3:2708 -231:3:2709 -232:3:2713 -233:3:2717 -234:3:2718 -235:3:2722 -236:3:2730 -237:3:2731 -238:3:2736 -239:3:2743 -240:3:2744 -241:3:2751 -242:3:2756 -243:0:2904 -244:3:2767 -245:0:2904 -246:3:2775 -247:3:2776 -248:3:2780 -249:3:2784 -250:3:2785 -251:3:2789 -252:3:2797 -253:3:2798 -254:3:2803 -255:3:2810 -256:3:2811 -257:3:2818 -258:3:2823 -259:0:2904 -260:3:2838 -261:0:2904 -262:3:2840 -263:0:2904 -264:3:2841 -265:0:2904 -266:3:1662 -267:0:2904 -268:3:1663 -269:3:1667 -270:3:1668 -271:3:1676 -272:3:1677 -273:3:1681 -274:3:1682 -275:3:1690 -276:3:1695 -277:3:1699 -278:3:1700 -279:3:1707 -280:3:1708 -281:3:1719 -282:3:1720 -283:3:1721 -284:3:1732 -285:3:1737 -286:3:1738 -287:0:2904 -288:3:1750 -289:0:2904 -290:3:1752 -291:3:1753 -292:0:2904 -293:3:1757 -294:3:1761 -295:3:1762 -296:3:1770 -297:3:1771 -298:3:1775 -299:3:1776 -300:3:1784 -301:3:1789 -302:3:1790 -303:3:1801 -304:3:1802 -305:3:1813 -306:3:1814 -307:3:1815 -308:3:1826 -309:3:1831 -310:3:1832 -311:0:2904 -312:3:1844 -313:0:2904 -314:3:1846 -315:0:2904 -316:3:1847 -317:0:2904 -318:3:1857 -319:0:2904 -320:3:1858 -321:0:2904 -322:3:1862 -323:3:1863 -324:3:1867 -325:3:1871 -326:3:1872 -327:3:1876 -328:3:1884 -329:3:1885 -330:3:1890 -331:3:1897 -332:3:1898 -333:3:1905 -334:3:1910 -335:0:2904 -336:3:1921 -337:0:2904 -338:3:1925 -339:3:1926 -340:3:1930 -341:3:1934 -342:3:1935 -343:3:1939 -344:3:1947 -345:3:1948 -346:3:1953 -347:3:1960 -348:3:1961 -349:3:1968 -350:3:1973 -351:0:2904 -352:3:1984 -353:0:2904 -354:3:1992 -355:3:1993 -356:3:1997 -357:3:2001 -358:3:2002 -359:3:2006 -360:3:2014 -361:3:2015 -362:3:2020 -363:3:2027 -364:3:2028 -365:3:2035 -366:3:2040 -367:0:2904 -368:3:2055 -369:0:2904 -370:3:2057 -371:0:2904 -372:3:2058 -373:3:2062 -374:3:2063 -375:3:2071 -376:3:2072 -377:3:2076 -378:3:2077 -379:3:2085 -380:3:2090 -381:3:2094 -382:3:2095 -383:3:2102 -384:3:2103 -385:3:2114 -386:3:2115 -387:3:2116 -388:3:2127 -389:3:2132 -390:3:2133 -391:0:2904 -392:3:2145 -393:0:2904 -394:3:2147 -395:0:2904 -396:3:2150 -397:3:2151 -398:3:2163 -399:3:2164 -400:3:2168 -401:3:2169 -402:3:2177 -403:3:2182 -404:3:2186 -405:3:2187 -406:3:2194 -407:3:2195 -408:3:2206 -409:3:2207 -410:3:2208 -411:3:2219 -412:3:2224 -413:3:2225 -414:0:2904 -415:3:2237 -416:0:2904 -417:3:2239 -418:0:2904 -419:3:2240 -420:0:2904 -421:3:2241 -422:0:2904 -423:3:2242 -424:0:2904 -425:3:2243 -426:3:2247 -427:3:2248 -428:3:2256 -429:3:2257 -430:3:2261 -431:3:2262 -432:3:2270 -433:3:2275 -434:3:2279 -435:3:2280 -436:3:2287 -437:3:2288 -438:3:2299 -439:3:2300 -440:3:2301 -441:3:2312 -442:3:2317 -443:3:2318 -444:0:2904 -445:3:2330 -446:0:2904 -447:3:2532 -448:0:2904 -449:3:2630 -450:0:2904 -451:3:2631 -452:0:2904 -453:3:2635 -454:0:2904 -455:3:2641 -456:0:2904 -457:3:2645 -458:3:2646 -459:3:2650 -460:3:2654 -461:3:2655 -462:3:2659 -463:3:2667 -464:3:2668 -465:3:2673 -466:3:2680 -467:3:2681 -468:3:2688 -469:3:2693 -470:0:2904 -471:3:2704 -472:0:2904 -473:3:2708 -474:3:2709 -475:3:2713 -476:3:2717 -477:3:2718 -478:3:2722 -479:3:2730 -480:3:2731 -481:3:2736 -482:3:2743 -483:3:2744 -484:3:2751 -485:3:2756 -486:0:2904 -487:3:2767 -488:0:2904 -489:3:2775 -490:3:2776 -491:3:2780 -492:3:2784 -493:3:2785 -494:3:2789 -495:3:2797 -496:3:2798 -497:3:2803 -498:3:2810 -499:3:2811 -500:3:2818 -501:3:2823 -502:0:2904 -503:3:2838 -504:0:2904 -505:3:2840 -506:0:2904 -507:3:2841 -508:0:2904 -509:3:1662 -510:0:2904 -511:3:1663 -512:3:1667 -513:3:1668 -514:3:1676 -515:3:1677 -516:3:1681 -517:3:1682 -518:3:1690 -519:3:1695 -520:3:1699 -521:3:1700 -522:3:1707 -523:3:1708 -524:3:1719 -525:3:1720 -526:3:1721 -527:3:1732 -528:3:1737 -529:3:1738 -530:0:2904 -531:3:1750 -532:0:2904 -533:3:1752 -534:3:1753 -535:0:2904 -536:3:1757 -537:3:1761 -538:3:1762 -539:3:1770 -540:3:1771 -541:3:1775 -542:3:1776 -543:3:1784 -544:3:1789 -545:3:1790 -546:3:1801 -547:3:1802 -548:3:1813 -549:3:1814 -550:3:1815 -551:3:1826 -552:3:1831 -553:3:1832 -554:0:2904 -555:3:1844 -556:0:2904 -557:3:1846 -558:0:2904 -559:3:1847 -560:0:2904 -561:3:1857 -562:0:2904 -563:3:1858 -564:0:2904 -565:3:1862 -566:3:1863 -567:3:1867 -568:3:1871 -569:3:1872 -570:3:1876 -571:3:1884 -572:3:1885 -573:3:1890 -574:3:1897 -575:3:1898 -576:3:1905 -577:3:1910 -578:0:2904 -579:3:1921 -580:0:2904 -581:3:1925 -582:3:1926 -583:3:1930 -584:3:1934 -585:3:1935 -586:3:1939 -587:3:1947 -588:3:1948 -589:3:1953 -590:3:1960 -591:3:1961 -592:3:1968 -593:3:1973 -594:0:2904 -595:3:1984 -596:0:2904 -597:3:1992 -598:3:1993 -599:3:1997 -600:3:2001 -601:3:2002 -602:3:2006 -603:3:2014 -604:3:2015 -605:3:2020 -606:3:2027 -607:3:2028 -608:3:2035 -609:3:2040 -610:0:2904 -611:3:2055 -612:0:2904 -613:3:2057 -614:0:2904 -615:3:2058 -616:3:2062 -617:3:2063 -618:3:2071 -619:3:2072 -620:3:2076 -621:3:2077 -622:3:2085 -623:3:2090 -624:3:2094 -625:3:2095 -626:3:2102 -627:3:2103 -628:3:2114 -629:3:2115 -630:3:2116 -631:3:2127 -632:3:2132 -633:3:2133 -634:0:2904 -635:3:2145 -636:0:2904 -637:3:2147 -638:0:2904 -639:3:2150 -640:3:2151 -641:3:2163 -642:3:2164 -643:3:2168 -644:3:2169 -645:3:2177 -646:3:2182 -647:3:2186 -648:3:2187 -649:3:2194 -650:3:2195 -651:3:2206 -652:3:2207 -653:3:2208 -654:3:2219 -655:3:2224 -656:3:2225 -657:0:2904 -658:3:2237 -659:0:2904 -660:3:2239 -661:0:2904 -662:3:2240 -663:0:2904 -664:3:2241 -665:0:2904 -666:3:2242 -667:0:2904 -668:3:2243 -669:3:2247 -670:3:2248 -671:3:2256 -672:3:2257 -673:3:2261 -674:3:2262 -675:3:2270 -676:3:2275 -677:3:2279 -678:3:2280 -679:3:2287 -680:3:2288 -681:3:2299 -682:3:2300 -683:3:2301 -684:3:2312 -685:3:2317 -686:3:2318 -687:0:2904 -688:3:2330 -689:0:2904 -690:3:2532 -691:0:2904 -692:3:2630 -693:0:2904 -694:3:2631 -695:0:2904 -696:3:2635 -697:0:2904 -698:3:2641 -699:0:2904 -700:3:2645 -701:3:2646 -702:3:2650 -703:3:2654 -704:3:2655 -705:3:2659 -706:3:2667 -707:3:2668 -708:3:2673 -709:3:2680 -710:3:2681 -711:3:2688 -712:3:2693 -713:0:2904 -714:3:2704 -715:0:2904 -716:3:2708 -717:3:2709 -718:3:2713 -719:3:2717 -720:3:2718 -721:3:2722 -722:3:2730 -723:3:2731 -724:3:2736 -725:3:2743 -726:3:2744 -727:3:2751 -728:3:2756 -729:0:2904 -730:3:2767 -731:0:2904 -732:3:2775 -733:3:2776 -734:3:2780 -735:3:2784 -736:3:2785 -737:3:2789 -738:3:2797 -739:3:2798 -740:3:2803 -741:3:2810 -742:3:2811 -743:3:2818 -744:3:2823 -745:0:2904 -746:3:2838 -747:0:2904 -748:3:2840 -749:0:2904 -750:3:2841 -751:0:2904 -752:3:1662 -753:0:2904 -754:3:1663 -755:3:1667 -756:3:1668 -757:3:1676 -758:3:1677 -759:3:1681 -760:3:1682 -761:3:1690 -762:3:1695 -763:3:1699 -764:3:1700 -765:3:1707 -766:3:1708 -767:3:1719 -768:3:1720 -769:3:1721 -770:3:1732 -771:3:1737 -772:3:1738 -773:0:2904 -774:3:1750 -775:0:2904 -776:3:1752 -777:3:1753 -778:0:2904 -779:3:1757 -780:3:1761 -781:3:1762 -782:3:1770 -783:3:1771 -784:3:1775 -785:3:1776 -786:3:1784 -787:3:1789 -788:3:1790 -789:3:1801 -790:3:1802 -791:3:1813 -792:3:1814 -793:3:1815 -794:3:1826 -795:3:1831 -796:3:1832 -797:0:2904 -798:3:1844 -799:0:2904 -800:3:1846 -801:0:2904 -802:3:1847 -803:0:2904 -804:3:1857 -805:0:2904 -806:3:1858 -807:0:2904 -808:3:1862 -809:3:1863 -810:3:1867 -811:3:1871 -812:3:1872 -813:3:1876 -814:3:1884 -815:3:1885 -816:3:1890 -817:3:1897 -818:3:1898 -819:3:1905 -820:3:1910 -821:0:2904 -822:3:1921 -823:0:2904 -824:3:1925 -825:3:1926 -826:3:1930 -827:3:1934 -828:3:1935 -829:3:1939 -830:3:1947 -831:3:1948 -832:3:1953 -833:3:1960 -834:3:1961 -835:3:1968 -836:3:1973 -837:0:2904 -838:3:1984 -839:0:2904 -840:3:1992 -841:3:1993 -842:3:1997 -843:3:2001 -844:3:2002 -845:3:2006 -846:3:2014 -847:3:2015 -848:3:2020 -849:3:2027 -850:3:2028 -851:3:2035 -852:3:2040 -853:0:2904 -854:3:2055 -855:0:2904 -856:3:2057 -857:0:2904 -858:3:2058 -859:3:2062 -860:3:2063 -861:3:2071 -862:3:2072 -863:3:2076 -864:3:2077 -865:3:2085 -866:3:2090 -867:3:2094 -868:3:2095 -869:3:2102 -870:3:2103 -871:3:2114 -872:3:2115 -873:3:2116 -874:3:2127 -875:3:2132 -876:3:2133 -877:0:2904 -878:3:2145 -879:0:2904 -880:3:2147 -881:0:2904 -882:3:2150 -883:3:2151 -884:3:2163 -885:3:2164 -886:3:2168 -887:3:2169 -888:3:2177 -889:3:2182 -890:3:2186 -891:3:2187 -892:3:2194 -893:3:2195 -894:3:2206 -895:3:2207 -896:3:2208 -897:3:2219 -898:3:2224 -899:3:2225 -900:0:2904 -901:3:2237 -902:0:2904 -903:3:2239 -904:0:2904 -905:3:2240 -906:0:2904 -907:3:2241 -908:0:2904 -909:3:2242 -910:0:2904 -911:3:2243 -912:3:2247 -913:3:2248 -914:3:2256 -915:3:2257 -916:3:2261 -917:3:2262 -918:3:2270 -919:3:2275 -920:3:2279 -921:3:2280 -922:3:2287 -923:3:2288 -924:3:2299 -925:3:2300 -926:3:2301 -927:3:2312 -928:3:2317 -929:3:2318 -930:0:2904 -931:3:2330 -932:0:2904 -933:3:2532 -934:0:2904 -935:3:2630 -936:0:2904 -937:3:2631 -938:0:2904 -939:3:2635 -940:0:2904 -941:3:2641 -942:0:2904 -943:3:2645 -944:3:2646 -945:3:2650 -946:3:2654 -947:3:2655 -948:3:2659 -949:3:2667 -950:3:2668 -951:3:2673 -952:3:2680 -953:3:2681 -954:3:2688 -955:3:2693 -956:0:2904 -957:3:2704 -958:0:2904 -959:2:848 -960:0:2904 -961:2:854 -962:0:2904 -963:2:855 -964:0:2904 -965:2:856 -966:0:2904 -967:2:857 -968:0:2904 -969:1:2 -970:0:2904 -971:2:858 -972:0:2904 -973:1:8 -974:0:2904 -975:1:9 -976:0:2904 -977:1:10 -978:0:2904 -979:1:11 -980:0:2904 -981:2:857 -982:0:2904 -983:1:12 -984:1:16 -985:1:17 -986:1:25 -987:1:26 -988:1:30 -989:1:31 -990:1:39 -991:1:44 -992:1:48 -993:1:49 -994:1:63 -995:1:64 -996:1:68 -997:1:69 -998:1:70 -999:1:81 -1000:1:86 -1001:1:87 -1002:0:2904 -1003:2:858 -1004:0:2904 -1005:1:99 -1006:0:2904 -1007:2:859 -1008:0:2904 -1009:2:860 -1010:0:2904 -1011:2:871 -1012:0:2904 -1013:2:872 -1014:0:2904 -1015:2:873 -1016:2:877 -1017:2:878 -1018:2:886 -1019:2:887 -1020:2:891 -1021:2:892 -1022:2:900 -1023:2:905 -1024:2:909 -1025:2:910 -1026:2:924 -1027:2:925 -1028:2:929 -1029:2:930 -1030:2:931 -1031:2:942 -1032:2:947 -1033:2:948 -1034:0:2904 -1035:2:960 -1036:0:2904 -1037:2:961 -1038:2:965 -1039:2:966 -1040:2:974 -1041:2:975 -1042:2:979 -1043:2:980 -1044:2:988 -1045:2:993 -1046:2:997 -1047:2:998 -1048:2:1012 -1049:2:1013 -1050:2:1017 -1051:2:1018 -1052:2:1019 -1053:2:1030 -1054:2:1035 -1055:2:1036 -1056:0:2904 -1057:2:1048 -1058:0:2904 -1059:2:1049 -1060:0:2904 -1061:3:2708 -1062:3:2709 -1063:3:2713 -1064:3:2717 -1065:3:2718 -1066:3:2722 -1067:3:2730 -1068:3:2731 -1069:3:2736 -1070:3:2743 -1071:3:2744 -1072:3:2751 -1073:3:2756 -1074:0:2904 -1075:3:2767 -1076:0:2904 -1077:3:2775 -1078:3:2776 -1079:3:2780 -1080:3:2784 -1081:3:2785 -1082:3:2789 -1083:3:2797 -1084:3:2798 -1085:3:2803 -1086:3:2810 -1087:3:2811 -1088:3:2818 -1089:3:2823 -1090:0:2904 -1091:3:2838 -1092:0:2904 -1093:3:2840 -1094:0:2904 -1095:3:2841 -1096:0:2904 -1097:3:1662 -1098:0:2904 -1099:3:1663 -1100:3:1667 -1101:3:1668 -1102:3:1676 -1103:3:1677 -1104:3:1681 -1105:3:1682 -1106:3:1690 -1107:3:1695 -1108:3:1699 -1109:3:1700 -1110:3:1707 -1111:3:1708 -1112:3:1719 -1113:3:1720 -1114:3:1721 -1115:3:1732 -1116:3:1737 -1117:3:1738 -1118:0:2904 -1119:3:1750 -1120:0:2904 -1121:3:1752 -1122:3:1753 -1123:0:2904 -1124:3:1757 -1125:3:1761 -1126:3:1762 -1127:3:1770 -1128:3:1771 -1129:3:1775 -1130:3:1776 -1131:3:1784 -1132:3:1789 -1133:3:1790 -1134:3:1801 -1135:3:1802 -1136:3:1813 -1137:3:1814 -1138:3:1815 -1139:3:1826 -1140:3:1831 -1141:3:1832 -1142:0:2904 -1143:3:1844 -1144:0:2904 -1145:3:1846 -1146:0:2904 -1147:3:1847 -1148:0:2904 -1149:3:1857 -1150:0:2904 -1151:3:1858 -1152:0:2904 -1153:3:1862 -1154:3:1863 -1155:3:1867 -1156:3:1871 -1157:3:1872 -1158:3:1876 -1159:3:1884 -1160:3:1885 -1161:3:1890 -1162:3:1897 -1163:3:1898 -1164:3:1905 -1165:3:1910 -1166:0:2904 -1167:3:1921 -1168:0:2904 -1169:2:1050 -1170:2:1054 -1171:2:1055 -1172:2:1063 -1173:2:1064 -1174:2:1068 -1175:2:1069 -1176:2:1077 -1177:2:1082 -1178:2:1086 -1179:2:1087 -1180:2:1094 -1181:2:1095 -1182:2:1106 -1183:2:1107 -1184:2:1108 -1185:2:1119 -1186:2:1131 -1187:2:1132 -1188:0:2904 -1189:2:1137 -1190:0:2904 -1191:2:1338 -1192:0:2904 -1193:2:1339 -1194:0:2904 -1195:2:1344 -1196:0:2904 -1197:2:1349 -1198:0:2904 -1199:3:1925 -1200:3:1926 -1201:3:1930 -1202:3:1931 -1203:3:1939 -1204:3:1947 -1205:3:1948 -1206:3:1953 -1207:3:1960 -1208:3:1961 -1209:3:1968 -1210:3:1973 -1211:0:2904 -1212:3:1984 -1213:0:2904 -1214:3:1992 -1215:3:1993 -1216:3:1997 -1217:3:2001 -1218:3:2002 -1219:3:2006 -1220:3:2014 -1221:3:2015 -1222:3:2020 -1223:3:2027 -1224:3:2028 -1225:3:2035 -1226:3:2040 -1227:0:2904 -1228:3:2055 -1229:0:2904 -1230:3:2057 -1231:0:2904 -1232:3:2058 -1233:3:2062 -1234:3:2063 -1235:3:2071 -1236:3:2072 -1237:3:2076 -1238:3:2077 -1239:3:2085 -1240:3:2090 -1241:3:2094 -1242:3:2095 -1243:3:2102 -1244:3:2103 -1245:3:2114 -1246:3:2115 -1247:3:2116 -1248:3:2127 -1249:3:2132 -1250:3:2133 -1251:0:2904 -1252:3:2145 -1253:0:2904 -1254:3:2147 -1255:0:2904 -1256:3:2150 -1257:3:2151 -1258:3:2163 -1259:3:2164 -1260:3:2168 -1261:3:2169 -1262:3:2177 -1263:3:2182 -1264:3:2186 -1265:3:2187 -1266:3:2194 -1267:3:2195 -1268:3:2206 -1269:3:2207 -1270:3:2208 -1271:3:2219 -1272:3:2224 -1273:3:2225 -1274:0:2904 -1275:3:2237 -1276:0:2904 -1277:3:2239 -1278:0:2904 -1279:3:2240 -1280:0:2904 -1281:3:2241 -1282:0:2904 -1283:3:2242 -1284:0:2904 -1285:3:2243 -1286:3:2247 -1287:3:2248 -1288:3:2256 -1289:3:2257 -1290:3:2261 -1291:3:2262 -1292:3:2270 -1293:3:2275 -1294:3:2279 -1295:3:2280 -1296:3:2287 -1297:3:2288 -1298:3:2299 -1299:3:2300 -1300:3:2301 -1301:3:2312 -1302:3:2317 -1303:3:2318 -1304:0:2904 -1305:3:2330 -1306:0:2904 -1307:3:2532 -1308:0:2904 -1309:3:2630 -1310:0:2904 -1311:3:2631 -1312:0:2904 -1313:3:2635 -1314:0:2904 -1315:3:2641 -1316:0:2904 -1317:3:2645 -1318:3:2646 -1319:3:2650 -1320:3:2654 -1321:3:2655 -1322:3:2659 -1323:3:2667 -1324:3:2668 -1325:3:2673 -1326:3:2680 -1327:3:2681 -1328:3:2688 -1329:3:2693 -1330:0:2904 -1331:3:2704 -1332:0:2904 -1333:3:2708 -1334:3:2709 -1335:3:2713 -1336:3:2717 -1337:3:2718 -1338:3:2722 -1339:3:2730 -1340:3:2731 -1341:3:2736 -1342:3:2743 -1343:3:2744 -1344:3:2751 -1345:3:2756 -1346:0:2904 -1347:3:2767 -1348:0:2904 -1349:3:2775 -1350:3:2776 -1351:3:2780 -1352:3:2784 -1353:3:2785 -1354:3:2789 -1355:3:2797 -1356:3:2798 -1357:3:2803 -1358:3:2810 -1359:3:2811 -1360:3:2818 -1361:3:2823 -1362:0:2904 -1363:3:2838 -1364:0:2904 -1365:3:2840 -1366:0:2904 -1367:3:2841 -1368:0:2904 -1369:3:2844 -1370:0:2904 -1371:3:2849 -1372:0:2904 -1373:2:1350 -1374:0:2902 -1375:3:2850 -1376:0:2908 -1377:1:296 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress.ltl b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_reader.define b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_reader.log b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_reader.log deleted file mode 100644 index a1a6122..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_reader.log +++ /dev/null @@ -1,348 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_reader.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 742) -depth 12: Claim reached state 9 (line 747) -depth 86: Claim reached state 9 (line 746) - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 10679, errors: 0 - 38182 states, stored (88898 visited) - 997091 states, matched - 1085989 transitions (= visited+matched) - 3694897 atomic steps -hash conflicts: 9602 (resolved) - -Stats on memory usage (in Megabytes): - 3.059 equivalent memory usage for states (stored*(State-vector + overhead)) - 2.930 actual memory usage for states (compression: 95.79%) - state-vector as stored = 52 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 468.596 total actual memory usage - -unreached in proctype urcu_reader_sig - line 402, "pan.___", state 330, "(1)" - line 613, "pan.___", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 59, "(1)" - line 417, "pan.___", state 89, "(1)" - line 398, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 408, "pan.___", state 160, "(1)" - line 651, "pan.___", state 213, "(1)" - line 174, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 178, "pan.___", state 233, "(1)" - line 159, "pan.___", state 254, "(1)" - line 163, "pan.___", state 262, "(1)" - line 167, "pan.___", state 274, "(1)" - line 174, "pan.___", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 752, "(1)" - line 163, "pan.___", state 760, "(1)" - line 163, "pan.___", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 761, "else" - line 161, "pan.___", state 766, "((j<1))" - line 161, "pan.___", state 766, "((j>=1))" - line 167, "pan.___", state 772, "(1)" - line 167, "pan.___", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 773, "else" - line 169, "pan.___", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 776, "else" - line 174, "pan.___", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 167, "pan.___", state 835, "(1)" - line 167, "pan.___", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 174, "pan.___", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 852, "(1)" - line 178, "pan.___", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 861, "(1)" - line 178, "pan.___", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 862, "else" - line 176, "pan.___", state 867, "((j<1))" - line 176, "pan.___", state 867, "((j>=1))" - line 182, "pan.___", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 882, "(1)" - line 163, "pan.___", state 890, "(1)" - line 163, "pan.___", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 891, "else" - line 161, "pan.___", state 896, "((j<1))" - line 161, "pan.___", state 896, "((j>=1))" - line 167, "pan.___", state 902, "(1)" - line 167, "pan.___", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 903, "else" - line 169, "pan.___", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 906, "else" - line 201, "pan.___", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 201, "pan.___", state 908, "else" - line 220, "pan.___", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 220, "pan.___", state 909, "else" - line 355, "pan.___", state 915, "((sighand_exec==1))" - line 355, "pan.___", state 915, "else" - line 361, "pan.___", state 918, "sighand_exec = 1" - line 398, "pan.___", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 933, "(1)" - line 398, "pan.___", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 934, "else" - line 398, "pan.___", state 937, "(1)" - line 402, "pan.___", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 947, "(1)" - line 402, "pan.___", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 948, "else" - line 402, "pan.___", state 951, "(1)" - line 402, "pan.___", state 952, "(1)" - line 402, "pan.___", state 952, "(1)" - line 400, "pan.___", state 957, "((i<1))" - line 400, "pan.___", state 957, "((i>=1))" - line 407, "pan.___", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 976, "(1)" - line 408, "pan.___", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 977, "else" - line 408, "pan.___", state 980, "(1)" - line 408, "pan.___", state 981, "(1)" - line 408, "pan.___", state 981, "(1)" - line 412, "pan.___", state 989, "(1)" - line 412, "pan.___", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 990, "else" - line 412, "pan.___", state 993, "(1)" - line 412, "pan.___", state 994, "(1)" - line 412, "pan.___", state 994, "(1)" - line 410, "pan.___", state 999, "((i<1))" - line 410, "pan.___", state 999, "((i>=1))" - line 417, "pan.___", state 1006, "(1)" - line 417, "pan.___", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 1007, "else" - line 417, "pan.___", state 1010, "(1)" - line 417, "pan.___", state 1011, "(1)" - line 417, "pan.___", state 1011, "(1)" - line 419, "pan.___", state 1014, "(1)" - line 419, "pan.___", state 1014, "(1)" - line 361, "pan.___", state 1023, "sighand_exec = 1" - line 402, "pan.___", state 1054, "(1)" - line 407, "pan.___", state 1070, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1113, "(1)" - line 402, "pan.___", state 1151, "(1)" - line 407, "pan.___", state 1167, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1210, "(1)" - line 398, "pan.___", state 1236, "(1)" - line 402, "pan.___", state 1250, "(1)" - line 407, "pan.___", state 1266, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1309, "(1)" - line 402, "pan.___", state 1350, "(1)" - line 407, "pan.___", state 1366, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1409, "(1)" - line 174, "pan.___", state 1430, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 1432, "(1)" - line 178, "pan.___", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 1441, "(1)" - line 178, "pan.___", state 1442, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 1442, "else" - line 176, "pan.___", state 1447, "((j<1))" - line 176, "pan.___", state 1447, "((j>=1))" - line 182, "pan.___", state 1452, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 1462, "(1)" - line 163, "pan.___", state 1470, "(1)" - line 163, "pan.___", state 1471, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 1471, "else" - line 161, "pan.___", state 1476, "((j<1))" - line 161, "pan.___", state 1476, "((j>=1))" - line 167, "pan.___", state 1482, "(1)" - line 167, "pan.___", state 1483, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 1483, "else" - line 169, "pan.___", state 1486, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 1486, "else" - line 174, "pan.___", state 1493, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 1515, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 167, "pan.___", state 1545, "(1)" - line 167, "pan.___", state 1546, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 174, "pan.___", state 1560, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 1562, "(1)" - line 178, "pan.___", state 1569, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 1571, "(1)" - line 178, "pan.___", state 1572, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 1572, "else" - line 176, "pan.___", state 1577, "((j<1))" - line 176, "pan.___", state 1577, "((j>=1))" - line 182, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 1592, "(1)" - line 163, "pan.___", state 1600, "(1)" - line 163, "pan.___", state 1601, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 1601, "else" - line 161, "pan.___", state 1606, "((j<1))" - line 161, "pan.___", state 1606, "((j>=1))" - line 167, "pan.___", state 1612, "(1)" - line 167, "pan.___", state 1613, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 1613, "else" - line 169, "pan.___", state 1616, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 1616, "else" - line 201, "pan.___", state 1618, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 201, "pan.___", state 1618, "else" - line 220, "pan.___", state 1619, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 220, "pan.___", state 1619, "else" - line 355, "pan.___", state 1625, "((sighand_exec==1))" - line 355, "pan.___", state 1625, "else" - line 361, "pan.___", state 1628, "sighand_exec = 1" - line 398, "pan.___", state 1641, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 1643, "(1)" - line 398, "pan.___", state 1644, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 1644, "else" - line 398, "pan.___", state 1647, "(1)" - line 402, "pan.___", state 1655, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 1657, "(1)" - line 402, "pan.___", state 1658, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 1658, "else" - line 402, "pan.___", state 1661, "(1)" - line 402, "pan.___", state 1662, "(1)" - line 402, "pan.___", state 1662, "(1)" - line 400, "pan.___", state 1667, "((i<1))" - line 400, "pan.___", state 1667, "((i>=1))" - line 407, "pan.___", state 1673, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 1686, "(1)" - line 408, "pan.___", state 1687, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 1687, "else" - line 408, "pan.___", state 1690, "(1)" - line 408, "pan.___", state 1691, "(1)" - line 408, "pan.___", state 1691, "(1)" - line 412, "pan.___", state 1699, "(1)" - line 412, "pan.___", state 1700, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 1700, "else" - line 412, "pan.___", state 1703, "(1)" - line 412, "pan.___", state 1704, "(1)" - line 412, "pan.___", state 1704, "(1)" - line 410, "pan.___", state 1709, "((i<1))" - line 410, "pan.___", state 1709, "((i>=1))" - line 417, "pan.___", state 1716, "(1)" - line 417, "pan.___", state 1717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 1717, "else" - line 417, "pan.___", state 1720, "(1)" - line 417, "pan.___", state 1721, "(1)" - line 417, "pan.___", state 1721, "(1)" - line 419, "pan.___", state 1724, "(1)" - line 419, "pan.___", state 1724, "(1)" - line 361, "pan.___", state 1733, "sighand_exec = 1" - line 178, "pan.___", state 1758, "(1)" - line 182, "pan.___", state 1769, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 1779, "(1)" - line 163, "pan.___", state 1787, "(1)" - line 167, "pan.___", state 1799, "(1)" - line 174, "pan.___", state 1810, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_reader.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_reader.spin.input.trail deleted file mode 100644 index 7c42af1..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_reader.spin.input.trail +++ /dev/null @@ -1,1270 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4401 -2:4:4353 -3:4:4356 -4:4:4356 -5:4:4359 -6:4:4367 -7:4:4367 -8:4:4370 -9:4:4376 -10:4:4380 -11:4:4380 -12:4:4383 -13:4:4391 -14:4:4395 -15:4:4396 -16:0:4401 -17:4:4398 -18:0:4401 -19:3:2479 -20:0:4401 -21:3:2485 -22:0:4401 -23:3:2486 -24:0:4401 -25:3:2487 -26:3:2491 -27:3:2492 -28:3:2500 -29:3:2501 -30:3:2505 -31:3:2506 -32:3:2514 -33:3:2519 -34:3:2523 -35:3:2524 -36:3:2531 -37:3:2532 -38:3:2543 -39:3:2544 -40:3:2545 -41:3:2556 -42:3:2561 -43:3:2562 -44:0:4401 -45:3:2574 -46:0:4401 -47:3:2576 -48:3:2577 -49:0:4401 -50:3:2581 -51:3:2585 -52:3:2586 -53:3:2594 -54:3:2595 -55:3:2599 -56:3:2600 -57:3:2608 -58:3:2613 -59:3:2614 -60:3:2625 -61:3:2626 -62:3:2637 -63:3:2638 -64:3:2639 -65:3:2650 -66:3:2655 -67:3:2656 -68:0:4401 -69:3:2668 -70:0:4401 -71:3:2670 -72:0:4401 -73:3:2671 -74:0:4401 -75:3:2681 -76:0:4401 -77:3:2682 -78:0:4401 -79:3:2686 -80:3:2687 -81:3:2691 -82:3:2695 -83:3:2696 -84:3:2700 -85:3:2708 -86:3:2709 -87:3:2714 -88:3:2721 -89:3:2722 -90:3:2729 -91:3:2734 -92:0:4401 -93:3:2745 -94:0:4401 -95:3:2749 -96:3:2750 -97:3:2754 -98:3:2758 -99:3:2759 -100:3:2763 -101:3:2771 -102:3:2772 -103:3:2777 -104:3:2784 -105:3:2785 -106:3:2792 -107:3:2797 -108:0:4401 -109:3:2808 -110:0:4401 -111:3:2816 -112:3:2817 -113:3:2821 -114:3:2825 -115:3:2826 -116:3:2830 -117:3:2838 -118:3:2839 -119:3:2844 -120:3:2851 -121:3:2852 -122:3:2859 -123:3:2864 -124:0:4401 -125:3:2879 -126:0:4401 -127:3:2881 -128:0:4401 -129:3:2882 -130:3:2886 -131:3:2887 -132:3:2895 -133:3:2896 -134:3:2900 -135:3:2901 -136:3:2909 -137:3:2914 -138:3:2918 -139:3:2919 -140:3:2926 -141:3:2927 -142:3:2938 -143:3:2939 -144:3:2940 -145:3:2951 -146:3:2956 -147:3:2957 -148:0:4401 -149:3:2969 -150:0:4401 -151:3:2971 -152:0:4401 -153:3:2974 -154:3:2975 -155:3:2987 -156:3:2988 -157:3:2992 -158:3:2993 -159:3:3001 -160:3:3006 -161:3:3010 -162:3:3011 -163:3:3018 -164:3:3019 -165:3:3030 -166:3:3031 -167:3:3032 -168:3:3043 -169:3:3048 -170:3:3049 -171:0:4401 -172:3:3061 -173:0:4401 -174:3:3063 -175:0:4401 -176:3:3064 -177:0:4401 -178:3:3065 -179:0:4401 -180:3:3066 -181:0:4401 -182:3:3067 -183:3:3071 -184:3:3072 -185:3:3080 -186:3:3081 -187:3:3085 -188:3:3086 -189:3:3094 -190:3:3099 -191:3:3103 -192:3:3104 -193:3:3111 -194:3:3112 -195:3:3123 -196:3:3124 -197:3:3125 -198:3:3136 -199:3:3141 -200:3:3142 -201:0:4401 -202:3:3154 -203:0:4401 -204:3:3356 -205:0:4401 -206:3:3454 -207:0:4401 -208:3:3455 -209:0:4401 -210:3:3459 -211:0:4401 -212:3:3465 -213:3:3469 -214:3:3470 -215:3:3478 -216:3:3479 -217:3:3483 -218:3:3484 -219:3:3492 -220:3:3497 -221:3:3501 -222:3:3502 -223:3:3509 -224:3:3510 -225:3:3521 -226:3:3522 -227:3:3523 -228:3:3534 -229:3:3539 -230:3:3540 -231:0:4401 -232:3:3552 -233:0:4401 -234:3:3554 -235:0:4401 -236:3:3555 -237:3:3559 -238:3:3560 -239:3:3568 -240:3:3569 -241:3:3573 -242:3:3574 -243:3:3582 -244:3:3587 -245:3:3591 -246:3:3592 -247:3:3599 -248:3:3600 -249:3:3611 -250:3:3612 -251:3:3613 -252:3:3624 -253:3:3629 -254:3:3630 -255:0:4401 -256:3:3642 -257:0:4401 -258:3:3644 -259:0:4401 -260:3:3647 -261:3:3648 -262:3:3660 -263:3:3661 -264:3:3665 -265:3:3666 -266:3:3674 -267:3:3679 -268:3:3683 -269:3:3684 -270:3:3691 -271:3:3692 -272:3:3703 -273:3:3704 -274:3:3705 -275:3:3716 -276:3:3721 -277:3:3722 -278:0:4401 -279:3:3734 -280:0:4401 -281:3:3736 -282:0:4401 -283:3:3737 -284:0:4401 -285:3:3738 -286:0:4401 -287:3:3739 -288:0:4401 -289:3:3740 -290:3:3744 -291:3:3745 -292:3:3753 -293:3:3754 -294:3:3758 -295:3:3759 -296:3:3767 -297:3:3772 -298:3:3776 -299:3:3777 -300:3:3784 -301:3:3785 -302:3:3796 -303:3:3797 -304:3:3798 -305:3:3809 -306:3:3814 -307:3:3815 -308:0:4401 -309:3:3827 -310:0:4401 -311:3:4029 -312:0:4401 -313:3:4127 -314:0:4401 -315:3:4128 -316:0:4401 -317:3:4132 -318:0:4401 -319:3:4138 -320:0:4401 -321:3:4142 -322:3:4143 -323:3:4147 -324:3:4151 -325:3:4152 -326:3:4156 -327:3:4164 -328:3:4165 -329:3:4170 -330:3:4177 -331:3:4178 -332:3:4185 -333:3:4190 -334:0:4401 -335:3:4201 -336:0:4401 -337:3:4205 -338:3:4206 -339:3:4210 -340:3:4214 -341:3:4215 -342:3:4219 -343:3:4227 -344:3:4228 -345:3:4233 -346:3:4240 -347:3:4241 -348:3:4248 -349:3:4253 -350:0:4401 -351:3:4264 -352:0:4401 -353:3:4272 -354:3:4273 -355:3:4277 -356:3:4281 -357:3:4282 -358:3:4286 -359:3:4294 -360:3:4295 -361:3:4300 -362:3:4307 -363:3:4308 -364:3:4315 -365:3:4320 -366:0:4401 -367:3:4335 -368:0:4401 -369:3:4337 -370:0:4401 -371:3:4338 -372:0:4401 -373:3:2486 -374:0:4401 -375:3:2487 -376:3:2491 -377:3:2492 -378:3:2500 -379:3:2501 -380:3:2505 -381:3:2506 -382:3:2514 -383:3:2519 -384:3:2523 -385:3:2524 -386:3:2531 -387:3:2532 -388:3:2543 -389:3:2544 -390:3:2545 -391:3:2556 -392:3:2561 -393:3:2562 -394:0:4401 -395:3:2574 -396:0:4401 -397:3:2576 -398:3:2577 -399:0:4401 -400:3:2581 -401:3:2585 -402:3:2586 -403:3:2594 -404:3:2595 -405:3:2599 -406:3:2600 -407:3:2608 -408:3:2613 -409:3:2614 -410:3:2625 -411:3:2626 -412:3:2637 -413:3:2638 -414:3:2639 -415:3:2650 -416:3:2655 -417:3:2656 -418:0:4401 -419:3:2668 -420:0:4401 -421:3:2670 -422:0:4401 -423:3:2671 -424:0:4401 -425:3:2681 -426:0:4401 -427:3:2682 -428:0:4401 -429:3:2686 -430:3:2687 -431:3:2691 -432:3:2695 -433:3:2696 -434:3:2700 -435:3:2708 -436:3:2709 -437:3:2714 -438:3:2721 -439:3:2722 -440:3:2729 -441:3:2734 -442:0:4401 -443:3:2745 -444:0:4401 -445:3:2749 -446:3:2750 -447:3:2754 -448:3:2758 -449:3:2759 -450:3:2763 -451:3:2771 -452:3:2772 -453:3:2777 -454:3:2784 -455:3:2785 -456:3:2792 -457:3:2797 -458:0:4401 -459:3:2808 -460:0:4401 -461:3:2816 -462:3:2817 -463:3:2821 -464:3:2825 -465:3:2826 -466:3:2830 -467:3:2838 -468:3:2839 -469:3:2844 -470:3:2851 -471:3:2852 -472:3:2859 -473:3:2864 -474:0:4401 -475:3:2879 -476:0:4401 -477:3:2881 -478:0:4401 -479:3:2882 -480:3:2886 -481:3:2887 -482:3:2895 -483:3:2896 -484:3:2900 -485:3:2901 -486:3:2909 -487:3:2914 -488:3:2918 -489:3:2919 -490:3:2926 -491:3:2927 -492:3:2938 -493:3:2939 -494:3:2940 -495:3:2951 -496:3:2956 -497:3:2957 -498:0:4401 -499:3:2969 -500:0:4401 -501:3:2971 -502:0:4401 -503:3:2974 -504:3:2975 -505:3:2987 -506:3:2988 -507:3:2992 -508:3:2993 -509:3:3001 -510:3:3006 -511:3:3010 -512:3:3011 -513:3:3018 -514:3:3019 -515:3:3030 -516:3:3031 -517:3:3032 -518:3:3043 -519:3:3048 -520:3:3049 -521:0:4401 -522:3:3061 -523:0:4401 -524:3:3063 -525:0:4401 -526:3:3064 -527:0:4401 -528:3:3065 -529:0:4401 -530:3:3066 -531:0:4401 -532:3:3067 -533:3:3071 -534:3:3072 -535:3:3080 -536:3:3081 -537:3:3085 -538:3:3086 -539:3:3094 -540:3:3099 -541:3:3103 -542:3:3104 -543:3:3111 -544:3:3112 -545:3:3123 -546:3:3124 -547:3:3125 -548:3:3136 -549:3:3141 -550:3:3142 -551:0:4401 -552:3:3154 -553:0:4401 -554:3:3356 -555:0:4401 -556:3:3454 -557:0:4401 -558:3:3455 -559:0:4401 -560:3:3459 -561:0:4401 -562:3:3465 -563:3:3469 -564:3:3470 -565:3:3478 -566:3:3479 -567:3:3483 -568:3:3484 -569:3:3492 -570:3:3497 -571:3:3501 -572:3:3502 -573:3:3509 -574:3:3510 -575:3:3521 -576:3:3522 -577:3:3523 -578:3:3534 -579:3:3539 -580:3:3540 -581:0:4401 -582:3:3552 -583:0:4401 -584:3:3554 -585:0:4401 -586:3:3555 -587:3:3559 -588:3:3560 -589:3:3568 -590:3:3569 -591:3:3573 -592:3:3574 -593:3:3582 -594:3:3587 -595:3:3591 -596:3:3592 -597:3:3599 -598:3:3600 -599:3:3611 -600:3:3612 -601:3:3613 -602:3:3624 -603:3:3629 -604:3:3630 -605:0:4401 -606:3:3642 -607:0:4401 -608:3:3644 -609:0:4401 -610:3:3647 -611:3:3648 -612:3:3660 -613:3:3661 -614:3:3665 -615:3:3666 -616:3:3674 -617:3:3679 -618:3:3683 -619:3:3684 -620:3:3691 -621:3:3692 -622:3:3703 -623:3:3704 -624:3:3705 -625:3:3716 -626:3:3721 -627:3:3722 -628:0:4401 -629:3:3734 -630:0:4401 -631:3:3736 -632:0:4401 -633:3:3737 -634:0:4401 -635:3:3738 -636:0:4401 -637:3:3739 -638:0:4401 -639:3:3740 -640:3:3744 -641:3:3745 -642:3:3753 -643:3:3754 -644:3:3758 -645:3:3759 -646:3:3767 -647:3:3772 -648:3:3776 -649:3:3777 -650:3:3784 -651:3:3785 -652:3:3796 -653:3:3797 -654:3:3798 -655:3:3809 -656:3:3814 -657:3:3815 -658:0:4401 -659:3:3827 -660:0:4401 -661:3:4029 -662:0:4401 -663:3:4127 -664:0:4401 -665:3:4128 -666:0:4401 -667:3:4132 -668:0:4401 -669:3:4138 -670:0:4401 -671:3:4142 -672:3:4143 -673:3:4147 -674:3:4151 -675:3:4152 -676:3:4156 -677:3:4164 -678:3:4165 -679:3:4170 -680:3:4177 -681:3:4178 -682:3:4185 -683:3:4190 -684:0:4401 -685:3:4201 -686:0:4401 -687:3:4205 -688:3:4206 -689:3:4210 -690:3:4214 -691:3:4215 -692:3:4219 -693:3:4227 -694:3:4228 -695:3:4233 -696:3:4240 -697:3:4241 -698:3:4248 -699:3:4253 -700:0:4401 -701:3:4264 -702:0:4401 -703:3:4272 -704:3:4273 -705:3:4277 -706:3:4281 -707:3:4282 -708:3:4286 -709:3:4294 -710:3:4295 -711:3:4300 -712:3:4307 -713:3:4308 -714:3:4315 -715:3:4320 -716:0:4401 -717:3:4335 -718:0:4401 -719:3:4337 -720:0:4401 -721:3:4338 -722:0:4401 -723:3:2486 -724:0:4401 -725:3:2487 -726:3:2491 -727:3:2492 -728:3:2500 -729:3:2501 -730:3:2505 -731:3:2506 -732:3:2514 -733:3:2519 -734:3:2523 -735:3:2524 -736:3:2531 -737:3:2532 -738:3:2543 -739:3:2544 -740:3:2545 -741:3:2556 -742:3:2561 -743:3:2562 -744:0:4401 -745:3:2574 -746:0:4401 -747:3:2576 -748:3:2577 -749:0:4401 -750:3:2581 -751:3:2585 -752:3:2586 -753:3:2594 -754:3:2595 -755:3:2599 -756:3:2600 -757:3:2608 -758:3:2613 -759:3:2614 -760:3:2625 -761:3:2626 -762:3:2637 -763:3:2638 -764:3:2639 -765:3:2650 -766:3:2655 -767:3:2656 -768:0:4401 -769:3:2668 -770:0:4401 -771:3:2670 -772:0:4401 -773:3:2671 -774:0:4401 -775:3:2681 -776:0:4401 -777:3:2682 -778:0:4401 -779:3:2686 -780:3:2687 -781:3:2691 -782:3:2695 -783:3:2696 -784:3:2700 -785:3:2708 -786:3:2709 -787:3:2714 -788:3:2721 -789:3:2722 -790:3:2729 -791:3:2734 -792:0:4401 -793:3:2745 -794:0:4401 -795:3:2749 -796:3:2750 -797:3:2754 -798:3:2758 -799:3:2759 -800:3:2763 -801:3:2771 -802:3:2772 -803:3:2777 -804:3:2784 -805:3:2785 -806:3:2792 -807:3:2797 -808:0:4401 -809:3:2808 -810:0:4401 -811:3:2816 -812:3:2817 -813:3:2821 -814:3:2825 -815:3:2826 -816:3:2830 -817:3:2838 -818:3:2839 -819:3:2844 -820:3:2851 -821:3:2852 -822:3:2859 -823:3:2864 -824:0:4401 -825:3:2879 -826:0:4401 -827:3:2881 -828:0:4401 -829:3:2882 -830:3:2886 -831:3:2887 -832:3:2895 -833:3:2896 -834:3:2900 -835:3:2901 -836:3:2909 -837:3:2914 -838:3:2918 -839:3:2919 -840:3:2926 -841:3:2927 -842:3:2938 -843:3:2939 -844:3:2940 -845:3:2951 -846:3:2956 -847:3:2957 -848:0:4401 -849:3:2969 -850:0:4401 -851:3:2971 -852:0:4401 -853:3:2974 -854:3:2975 -855:3:2987 -856:3:2988 -857:3:2992 -858:3:2993 -859:3:3001 -860:3:3006 -861:3:3010 -862:3:3011 -863:3:3018 -864:3:3019 -865:3:3030 -866:3:3031 -867:3:3032 -868:3:3043 -869:3:3048 -870:3:3049 -871:0:4401 -872:3:3061 -873:0:4401 -874:3:3063 -875:0:4401 -876:3:3064 -877:0:4401 -878:3:3065 -879:0:4401 -880:3:3066 -881:0:4401 -882:3:3067 -883:3:3071 -884:3:3072 -885:3:3080 -886:3:3081 -887:3:3085 -888:3:3086 -889:3:3094 -890:3:3099 -891:3:3103 -892:3:3104 -893:3:3111 -894:3:3112 -895:3:3123 -896:3:3124 -897:3:3125 -898:3:3136 -899:3:3141 -900:3:3142 -901:0:4401 -902:3:3154 -903:0:4401 -904:3:3356 -905:0:4401 -906:3:3454 -907:0:4401 -908:3:3455 -909:0:4401 -910:3:3459 -911:0:4401 -912:3:3465 -913:3:3469 -914:3:3470 -915:3:3478 -916:3:3479 -917:3:3483 -918:3:3484 -919:3:3492 -920:3:3497 -921:3:3501 -922:3:3502 -923:3:3509 -924:3:3510 -925:3:3521 -926:3:3522 -927:3:3523 -928:3:3534 -929:3:3539 -930:3:3540 -931:0:4401 -932:3:3552 -933:0:4401 -934:3:3554 -935:0:4401 -936:3:3555 -937:3:3559 -938:3:3560 -939:3:3568 -940:3:3569 -941:3:3573 -942:3:3574 -943:3:3582 -944:3:3587 -945:3:3591 -946:3:3592 -947:3:3599 -948:3:3600 -949:3:3611 -950:3:3612 -951:3:3613 -952:3:3624 -953:3:3629 -954:3:3630 -955:0:4401 -956:3:3642 -957:0:4401 -958:3:3644 -959:0:4401 -960:3:3647 -961:3:3648 -962:3:3660 -963:3:3661 -964:3:3665 -965:3:3666 -966:3:3674 -967:3:3679 -968:3:3683 -969:3:3684 -970:3:3691 -971:3:3692 -972:3:3703 -973:3:3704 -974:3:3705 -975:3:3716 -976:3:3721 -977:3:3722 -978:0:4401 -979:3:3734 -980:0:4401 -981:3:3736 -982:0:4401 -983:3:3737 -984:0:4401 -985:3:3738 -986:0:4401 -987:3:3739 -988:0:4401 -989:3:3740 -990:3:3744 -991:3:3745 -992:3:3753 -993:3:3754 -994:3:3758 -995:3:3759 -996:3:3767 -997:3:3772 -998:3:3776 -999:3:3777 -1000:3:3784 -1001:3:3785 -1002:3:3796 -1003:3:3797 -1004:3:3798 -1005:3:3809 -1006:3:3814 -1007:3:3815 -1008:0:4401 -1009:3:3827 -1010:0:4401 -1011:3:4029 -1012:0:4401 -1013:3:4127 -1014:0:4401 -1015:3:4128 -1016:0:4401 -1017:3:4132 -1018:0:4401 -1019:3:4138 -1020:0:4401 -1021:3:4142 -1022:3:4143 -1023:3:4147 -1024:3:4151 -1025:3:4152 -1026:3:4156 -1027:3:4164 -1028:3:4165 -1029:3:4170 -1030:3:4177 -1031:3:4178 -1032:3:4185 -1033:3:4190 -1034:0:4401 -1035:3:4201 -1036:0:4401 -1037:3:4205 -1038:3:4206 -1039:3:4210 -1040:3:4214 -1041:3:4215 -1042:3:4219 -1043:3:4227 -1044:3:4228 -1045:3:4233 -1046:3:4240 -1047:3:4241 -1048:3:4248 -1049:3:4253 -1050:0:4401 -1051:3:4264 -1052:0:4401 -1053:3:4272 -1054:3:4273 -1055:3:4277 -1056:3:4281 -1057:3:4282 -1058:3:4286 -1059:3:4294 -1060:3:4295 -1061:3:4300 -1062:3:4307 -1063:3:4308 -1064:3:4315 -1065:3:4320 -1066:0:4401 -1067:3:4335 -1068:0:4401 -1069:3:4337 -1070:0:4401 -1071:3:4338 -1072:0:4401 -1073:3:4341 -1074:0:4401 -1075:3:4346 -1076:0:4401 -1077:2:1236 -1078:0:4401 -1079:3:4347 -1080:0:4401 -1081:2:1242 -1082:0:4401 -1083:3:4346 -1084:0:4401 -1085:2:1243 -1086:0:4401 -1087:3:4347 -1088:0:4401 -1089:2:1244 -1090:0:4401 -1091:3:4346 -1092:0:4401 -1093:2:1245 -1094:0:4401 -1095:3:4347 -1096:0:4401 -1097:1:2 -1098:0:4401 -1099:3:4346 -1100:0:4401 -1101:2:1246 -1102:0:4401 -1103:3:4347 -1104:0:4401 -1105:1:8 -1106:0:4401 -1107:3:4346 -1108:0:4401 -1109:2:1245 -1110:0:4401 -1111:3:4347 -1112:0:4401 -1113:1:9 -1114:0:4401 -1115:3:4346 -1116:0:4401 -1117:2:1246 -1118:0:4401 -1119:3:4347 -1120:0:4401 -1121:1:10 -1122:0:4401 -1123:3:4346 -1124:0:4401 -1125:2:1245 -1126:0:4401 -1127:3:4347 -1128:0:4401 -1129:1:11 -1130:0:4401 -1131:3:4346 -1132:0:4401 -1133:2:1246 -1134:0:4401 -1135:3:4347 -1136:0:4401 -1137:1:14 -1138:0:4401 -1139:3:4346 -1140:0:4401 -1141:2:1245 -1142:0:4401 -1143:3:4347 -1144:0:4401 -1145:1:15 -1146:0:4401 -1147:3:4346 -1148:0:4401 -1149:2:1246 -1150:0:4401 -1151:3:4347 -1152:0:4401 -1153:1:16 -1154:1:20 -1155:1:21 -1156:1:29 -1157:1:30 -1158:1:34 -1159:1:35 -1160:1:43 -1161:1:48 -1162:1:52 -1163:1:53 -1164:1:60 -1165:1:61 -1166:1:72 -1167:1:73 -1168:1:74 -1169:1:85 -1170:1:90 -1171:1:91 -1172:0:4401 -1173:3:4346 -1174:0:4401 -1175:2:1245 -1176:0:4401 -1177:3:4347 -1178:0:4401 -1179:1:103 -1180:0:4401 -1181:3:4346 -1182:0:4401 -1183:2:1246 -1184:0:4401 -1185:3:4347 -1186:0:4401 -1187:2:1247 -1188:0:4401 -1189:3:4346 -1190:0:4401 -1191:2:1253 -1192:0:4401 -1193:3:4347 -1194:0:4401 -1195:2:1254 -1196:0:4399 -1197:3:4346 -1198:0:4405 -1199:3:4347 -1200:0:4405 -1201:2:1257 -1202:0:4405 -1203:3:4346 -1204:0:4405 -1205:2:1258 -1206:0:4405 -1207:3:4347 -1208:0:4405 -1209:2:1259 -1210:2:1263 -1211:2:1264 -1212:2:1272 -1213:2:1273 -1214:2:1277 -1215:2:1278 -1216:2:1286 -1217:2:1291 -1218:2:1295 -1219:2:1296 -1220:2:1303 -1221:2:1304 -1222:2:1315 -1223:2:1316 -1224:2:1317 -1225:2:1328 -1226:2:1333 -1227:2:1334 -1228:0:4405 -1229:3:4346 -1230:0:4405 -1231:2:1346 -1232:0:4405 -1233:3:4347 -1234:0:4405 -1235:2:1347 -1236:0:4405 -1237:3:4346 -1238:0:4405 -1239:1:104 --1:-1:-1 -1240:0:4405 -1241:3:4347 -1242:0:4405 -1243:3:4346 -1244:0:4405 -1245:2:1348 -1246:0:4405 -1247:3:4347 -1248:0:4405 -1249:2:1347 -1250:0:4405 -1251:3:4346 -1252:0:4405 -1253:1:105 -1254:0:4405 -1255:3:4347 -1256:0:4405 -1257:3:4346 -1258:0:4405 -1259:2:1348 -1260:0:4405 -1261:3:4347 -1262:0:4405 -1263:2:1347 -1264:0:4405 -1265:3:4346 -1266:0:4405 -1267:1:104 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer.define b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer.log b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer.log deleted file mode 100644 index 02c53cf..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer.log +++ /dev/null @@ -1,348 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 742) -depth 12: Claim reached state 9 (line 747) -depth 28: Claim reached state 9 (line 746) - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 10679, errors: 0 - 38555 states, stored (92500 visited) - 1044204 states, matched - 1136704 transitions (= visited+matched) - 3867169 atomic steps -hash conflicts: 8572 (resolved) - -Stats on memory usage (in Megabytes): - 3.089 equivalent memory usage for states (stored*(State-vector + overhead)) - 2.930 actual memory usage for states (compression: 94.87%) - state-vector as stored = 52 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 468.596 total actual memory usage - -unreached in proctype urcu_reader_sig - line 402, "pan.___", state 330, "(1)" - line 613, "pan.___", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 59, "(1)" - line 417, "pan.___", state 89, "(1)" - line 398, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 408, "pan.___", state 160, "(1)" - line 651, "pan.___", state 213, "(1)" - line 174, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 178, "pan.___", state 233, "(1)" - line 159, "pan.___", state 254, "(1)" - line 163, "pan.___", state 262, "(1)" - line 167, "pan.___", state 274, "(1)" - line 174, "pan.___", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 752, "(1)" - line 163, "pan.___", state 760, "(1)" - line 163, "pan.___", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 761, "else" - line 161, "pan.___", state 766, "((j<1))" - line 161, "pan.___", state 766, "((j>=1))" - line 167, "pan.___", state 772, "(1)" - line 167, "pan.___", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 773, "else" - line 169, "pan.___", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 776, "else" - line 174, "pan.___", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 167, "pan.___", state 835, "(1)" - line 167, "pan.___", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 174, "pan.___", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 852, "(1)" - line 178, "pan.___", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 861, "(1)" - line 178, "pan.___", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 862, "else" - line 176, "pan.___", state 867, "((j<1))" - line 176, "pan.___", state 867, "((j>=1))" - line 182, "pan.___", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 882, "(1)" - line 163, "pan.___", state 890, "(1)" - line 163, "pan.___", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 891, "else" - line 161, "pan.___", state 896, "((j<1))" - line 161, "pan.___", state 896, "((j>=1))" - line 167, "pan.___", state 902, "(1)" - line 167, "pan.___", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 903, "else" - line 169, "pan.___", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 906, "else" - line 201, "pan.___", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 201, "pan.___", state 908, "else" - line 220, "pan.___", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 220, "pan.___", state 909, "else" - line 355, "pan.___", state 915, "((sighand_exec==1))" - line 355, "pan.___", state 915, "else" - line 361, "pan.___", state 918, "sighand_exec = 1" - line 398, "pan.___", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 933, "(1)" - line 398, "pan.___", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 934, "else" - line 398, "pan.___", state 937, "(1)" - line 402, "pan.___", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 947, "(1)" - line 402, "pan.___", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 948, "else" - line 402, "pan.___", state 951, "(1)" - line 402, "pan.___", state 952, "(1)" - line 402, "pan.___", state 952, "(1)" - line 400, "pan.___", state 957, "((i<1))" - line 400, "pan.___", state 957, "((i>=1))" - line 407, "pan.___", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 976, "(1)" - line 408, "pan.___", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 977, "else" - line 408, "pan.___", state 980, "(1)" - line 408, "pan.___", state 981, "(1)" - line 408, "pan.___", state 981, "(1)" - line 412, "pan.___", state 989, "(1)" - line 412, "pan.___", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 990, "else" - line 412, "pan.___", state 993, "(1)" - line 412, "pan.___", state 994, "(1)" - line 412, "pan.___", state 994, "(1)" - line 410, "pan.___", state 999, "((i<1))" - line 410, "pan.___", state 999, "((i>=1))" - line 417, "pan.___", state 1006, "(1)" - line 417, "pan.___", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 1007, "else" - line 417, "pan.___", state 1010, "(1)" - line 417, "pan.___", state 1011, "(1)" - line 417, "pan.___", state 1011, "(1)" - line 419, "pan.___", state 1014, "(1)" - line 419, "pan.___", state 1014, "(1)" - line 361, "pan.___", state 1023, "sighand_exec = 1" - line 402, "pan.___", state 1054, "(1)" - line 407, "pan.___", state 1070, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1113, "(1)" - line 402, "pan.___", state 1151, "(1)" - line 407, "pan.___", state 1167, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1210, "(1)" - line 398, "pan.___", state 1236, "(1)" - line 402, "pan.___", state 1250, "(1)" - line 407, "pan.___", state 1266, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1309, "(1)" - line 402, "pan.___", state 1350, "(1)" - line 407, "pan.___", state 1366, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1409, "(1)" - line 174, "pan.___", state 1430, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 1432, "(1)" - line 178, "pan.___", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 1441, "(1)" - line 178, "pan.___", state 1442, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 1442, "else" - line 176, "pan.___", state 1447, "((j<1))" - line 176, "pan.___", state 1447, "((j>=1))" - line 182, "pan.___", state 1452, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 1462, "(1)" - line 163, "pan.___", state 1470, "(1)" - line 163, "pan.___", state 1471, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 1471, "else" - line 161, "pan.___", state 1476, "((j<1))" - line 161, "pan.___", state 1476, "((j>=1))" - line 167, "pan.___", state 1482, "(1)" - line 167, "pan.___", state 1483, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 1483, "else" - line 169, "pan.___", state 1486, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 1486, "else" - line 174, "pan.___", state 1493, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 1515, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 167, "pan.___", state 1545, "(1)" - line 167, "pan.___", state 1546, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 174, "pan.___", state 1560, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 1562, "(1)" - line 178, "pan.___", state 1569, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 1571, "(1)" - line 178, "pan.___", state 1572, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 1572, "else" - line 176, "pan.___", state 1577, "((j<1))" - line 176, "pan.___", state 1577, "((j>=1))" - line 182, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 1592, "(1)" - line 163, "pan.___", state 1600, "(1)" - line 163, "pan.___", state 1601, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 1601, "else" - line 161, "pan.___", state 1606, "((j<1))" - line 161, "pan.___", state 1606, "((j>=1))" - line 167, "pan.___", state 1612, "(1)" - line 167, "pan.___", state 1613, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 1613, "else" - line 169, "pan.___", state 1616, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 1616, "else" - line 201, "pan.___", state 1618, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 201, "pan.___", state 1618, "else" - line 220, "pan.___", state 1619, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 220, "pan.___", state 1619, "else" - line 355, "pan.___", state 1625, "((sighand_exec==1))" - line 355, "pan.___", state 1625, "else" - line 361, "pan.___", state 1628, "sighand_exec = 1" - line 398, "pan.___", state 1641, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 1643, "(1)" - line 398, "pan.___", state 1644, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 1644, "else" - line 398, "pan.___", state 1647, "(1)" - line 402, "pan.___", state 1655, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 1657, "(1)" - line 402, "pan.___", state 1658, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 1658, "else" - line 402, "pan.___", state 1661, "(1)" - line 402, "pan.___", state 1662, "(1)" - line 402, "pan.___", state 1662, "(1)" - line 400, "pan.___", state 1667, "((i<1))" - line 400, "pan.___", state 1667, "((i>=1))" - line 407, "pan.___", state 1673, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 1686, "(1)" - line 408, "pan.___", state 1687, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 1687, "else" - line 408, "pan.___", state 1690, "(1)" - line 408, "pan.___", state 1691, "(1)" - line 408, "pan.___", state 1691, "(1)" - line 412, "pan.___", state 1699, "(1)" - line 412, "pan.___", state 1700, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 1700, "else" - line 412, "pan.___", state 1703, "(1)" - line 412, "pan.___", state 1704, "(1)" - line 412, "pan.___", state 1704, "(1)" - line 410, "pan.___", state 1709, "((i<1))" - line 410, "pan.___", state 1709, "((i>=1))" - line 417, "pan.___", state 1716, "(1)" - line 417, "pan.___", state 1717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 1717, "else" - line 417, "pan.___", state 1720, "(1)" - line 417, "pan.___", state 1721, "(1)" - line 417, "pan.___", state 1721, "(1)" - line 419, "pan.___", state 1724, "(1)" - line 419, "pan.___", state 1724, "(1)" - line 361, "pan.___", state 1733, "sighand_exec = 1" - line 178, "pan.___", state 1758, "(1)" - line 182, "pan.___", state 1769, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 1779, "(1)" - line 163, "pan.___", state 1787, "(1)" - line 167, "pan.___", state 1799, "(1)" - line 174, "pan.___", state 1810, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer.spin.input.trail deleted file mode 100644 index e65d663..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer.spin.input.trail +++ /dev/null @@ -1,9 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2679 -2:1:2673 -3:1:2674 -4:1:2675 -5:1:2676 -6:0:2685 -7:5:1129 diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer_error.define b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer_error.log b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer_error.log deleted file mode 100644 index cd4e32b..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer_error.log +++ /dev/null @@ -1,286 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer_error.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 743) -depth 12: Claim reached state 9 (line 748) -depth 28: Claim reached state 9 (line 747) - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 10679, errors: 0 - 38555 states, stored (92500 visited) - 1044204 states, matched - 1136704 transitions (= visited+matched) - 3867169 atomic steps -hash conflicts: 6390 (resolved) - -Stats on memory usage (in Megabytes): - 3.089 equivalent memory usage for states (stored*(State-vector + overhead)) - 2.767 actual memory usage for states (compression: 89.58%) - state-vector as stored = 47 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 468.498 total actual memory usage - -unreached in proctype urcu_reader_sig - line 403, "pan.___", state 330, "(1)" - line 614, "pan.___", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 59, "(1)" - line 418, "pan.___", state 89, "(1)" - line 399, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 409, "pan.___", state 160, "(1)" - line 652, "pan.___", state 213, "(1)" - line 175, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 179, "pan.___", state 233, "(1)" - line 160, "pan.___", state 254, "(1)" - line 164, "pan.___", state 262, "(1)" - line 168, "pan.___", state 274, "(1)" - line 175, "pan.___", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 753, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 766, "(1)" - line 409, "pan.___", state 767, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 767, "else" - line 409, "pan.___", state 770, "(1)" - line 409, "pan.___", state 771, "(1)" - line 409, "pan.___", state 771, "(1)" - line 413, "pan.___", state 779, "(1)" - line 413, "pan.___", state 780, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 780, "else" - line 413, "pan.___", state 783, "(1)" - line 413, "pan.___", state 784, "(1)" - line 413, "pan.___", state 784, "(1)" - line 411, "pan.___", state 789, "((i<1))" - line 411, "pan.___", state 789, "((i>=1))" - line 418, "pan.___", state 796, "(1)" - line 418, "pan.___", state 797, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 797, "else" - line 418, "pan.___", state 800, "(1)" - line 418, "pan.___", state 801, "(1)" - line 418, "pan.___", state 801, "(1)" - line 420, "pan.___", state 804, "(1)" - line 420, "pan.___", state 804, "(1)" - line 356, "pan.___", state 810, "((sighand_exec==1))" - line 356, "pan.___", state 810, "else" - line 362, "pan.___", state 813, "sighand_exec = 1" - line 399, "pan.___", state 826, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 828, "(1)" - line 399, "pan.___", state 829, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 829, "else" - line 399, "pan.___", state 832, "(1)" - line 403, "pan.___", state 840, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 842, "(1)" - line 403, "pan.___", state 843, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 843, "else" - line 403, "pan.___", state 846, "(1)" - line 403, "pan.___", state 847, "(1)" - line 403, "pan.___", state 847, "(1)" - line 401, "pan.___", state 852, "((i<1))" - line 401, "pan.___", state 852, "((i>=1))" - line 408, "pan.___", state 858, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 871, "(1)" - line 409, "pan.___", state 872, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 872, "else" - line 409, "pan.___", state 875, "(1)" - line 409, "pan.___", state 876, "(1)" - line 409, "pan.___", state 876, "(1)" - line 413, "pan.___", state 884, "(1)" - line 413, "pan.___", state 885, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 885, "else" - line 413, "pan.___", state 888, "(1)" - line 413, "pan.___", state 889, "(1)" - line 413, "pan.___", state 889, "(1)" - line 411, "pan.___", state 894, "((i<1))" - line 411, "pan.___", state 894, "((i>=1))" - line 418, "pan.___", state 901, "(1)" - line 418, "pan.___", state 902, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 902, "else" - line 418, "pan.___", state 905, "(1)" - line 418, "pan.___", state 906, "(1)" - line 418, "pan.___", state 906, "(1)" - line 420, "pan.___", state 909, "(1)" - line 420, "pan.___", state 909, "(1)" - line 362, "pan.___", state 918, "sighand_exec = 1" - line 403, "pan.___", state 949, "(1)" - line 408, "pan.___", state 965, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 418, "pan.___", state 1008, "(1)" - line 403, "pan.___", state 1046, "(1)" - line 408, "pan.___", state 1062, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 418, "pan.___", state 1105, "(1)" - line 399, "pan.___", state 1131, "(1)" - line 403, "pan.___", state 1145, "(1)" - line 408, "pan.___", state 1161, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 418, "pan.___", state 1204, "(1)" - line 403, "pan.___", state 1245, "(1)" - line 408, "pan.___", state 1261, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 418, "pan.___", state 1304, "(1)" - line 399, "pan.___", state 1326, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 1328, "(1)" - line 399, "pan.___", state 1329, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 1329, "else" - line 399, "pan.___", state 1332, "(1)" - line 403, "pan.___", state 1340, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 1342, "(1)" - line 403, "pan.___", state 1343, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 1343, "else" - line 403, "pan.___", state 1346, "(1)" - line 403, "pan.___", state 1347, "(1)" - line 403, "pan.___", state 1347, "(1)" - line 401, "pan.___", state 1352, "((i<1))" - line 401, "pan.___", state 1352, "((i>=1))" - line 408, "pan.___", state 1358, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 1371, "(1)" - line 409, "pan.___", state 1372, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 1372, "else" - line 409, "pan.___", state 1375, "(1)" - line 409, "pan.___", state 1376, "(1)" - line 409, "pan.___", state 1376, "(1)" - line 413, "pan.___", state 1384, "(1)" - line 413, "pan.___", state 1385, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 1385, "else" - line 413, "pan.___", state 1388, "(1)" - line 413, "pan.___", state 1389, "(1)" - line 413, "pan.___", state 1389, "(1)" - line 411, "pan.___", state 1394, "((i<1))" - line 411, "pan.___", state 1394, "((i>=1))" - line 418, "pan.___", state 1401, "(1)" - line 418, "pan.___", state 1402, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 1402, "else" - line 418, "pan.___", state 1405, "(1)" - line 418, "pan.___", state 1406, "(1)" - line 418, "pan.___", state 1406, "(1)" - line 420, "pan.___", state 1409, "(1)" - line 420, "pan.___", state 1409, "(1)" - line 356, "pan.___", state 1415, "((sighand_exec==1))" - line 356, "pan.___", state 1415, "else" - line 362, "pan.___", state 1418, "sighand_exec = 1" - line 399, "pan.___", state 1431, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 1433, "(1)" - line 399, "pan.___", state 1434, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 1434, "else" - line 399, "pan.___", state 1437, "(1)" - line 403, "pan.___", state 1445, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 1447, "(1)" - line 403, "pan.___", state 1448, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 1448, "else" - line 403, "pan.___", state 1451, "(1)" - line 403, "pan.___", state 1452, "(1)" - line 403, "pan.___", state 1452, "(1)" - line 401, "pan.___", state 1457, "((i<1))" - line 401, "pan.___", state 1457, "((i>=1))" - line 408, "pan.___", state 1463, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 1476, "(1)" - line 409, "pan.___", state 1477, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 1477, "else" - line 409, "pan.___", state 1480, "(1)" - line 409, "pan.___", state 1481, "(1)" - line 409, "pan.___", state 1481, "(1)" - line 413, "pan.___", state 1489, "(1)" - line 413, "pan.___", state 1490, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 1490, "else" - line 413, "pan.___", state 1493, "(1)" - line 413, "pan.___", state 1494, "(1)" - line 413, "pan.___", state 1494, "(1)" - line 411, "pan.___", state 1499, "((i<1))" - line 411, "pan.___", state 1499, "((i>=1))" - line 418, "pan.___", state 1506, "(1)" - line 418, "pan.___", state 1507, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 1507, "else" - line 418, "pan.___", state 1510, "(1)" - line 418, "pan.___", state 1511, "(1)" - line 418, "pan.___", state 1511, "(1)" - line 420, "pan.___", state 1514, "(1)" - line 420, "pan.___", state 1514, "(1)" - line 362, "pan.___", state 1523, "sighand_exec = 1" - line 179, "pan.___", state 1548, "(1)" - line 183, "pan.___", state 1559, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 160, "pan.___", state 1569, "(1)" - line 164, "pan.___", state 1577, "(1)" - line 168, "pan.___", state 1589, "(1)" - line 175, "pan.___", state 1600, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer_error.spin.input.trail deleted file mode 100644 index 5b0eadd..0000000 --- a/formal-model/urcu-nosched-model/result-signal-over-writer/urcu_progress_writer_error.spin.input.trail +++ /dev/null @@ -1,4231 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2965 -2:3:2917 -3:3:2920 -4:3:2920 -5:3:2920 -6:3:2923 -7:3:2931 -8:3:2931 -9:3:2931 -10:3:2934 -11:3:2940 -12:3:2944 -13:3:2944 -14:3:2944 -15:3:2947 -16:3:2955 -17:3:2959 -18:3:2960 -19:0:2965 -20:3:2962 -21:0:2965 -22:2:1151 -23:0:2965 -24:2:1157 -25:0:2965 -26:2:1158 -27:0:2965 -28:2:1159 -29:2:1163 -30:2:1164 -31:2:1172 -32:2:1173 -33:2:1177 -34:2:1178 -35:2:1186 -36:2:1191 -37:2:1195 -38:2:1196 -39:2:1203 -40:2:1204 -41:2:1215 -42:2:1216 -43:2:1217 -44:2:1228 -45:2:1233 -46:2:1234 -47:0:2963 -48:2:1246 -49:0:2969 -50:2:1247 -51:0:2969 -52:1:2 -53:0:2969 -54:2:1248 -55:0:2969 -56:1:8 -57:0:2969 -58:1:9 -59:0:2969 -60:2:1247 -61:0:2969 -62:2:1248 -63:0:2969 -64:1:10 -65:0:2969 -66:2:1249 -67:0:2969 -68:2:1255 -69:2:1256 -70:0:2969 -71:2:1260 -72:2:1264 -73:2:1265 -74:2:1273 -75:2:1274 -76:2:1278 -77:2:1279 -78:2:1287 -79:2:1292 -80:2:1293 -81:2:1304 -82:2:1305 -83:2:1316 -84:2:1317 -85:2:1318 -86:2:1329 -87:2:1334 -88:2:1335 -89:0:2969 -90:2:1347 -91:0:2969 -92:2:1348 -93:0:2969 -94:1:13 -95:0:2969 -96:2:1349 -97:0:2969 -98:1:19 -99:0:2969 -100:1:20 -101:0:2969 -102:2:1348 -103:0:2969 -104:2:1349 -105:0:2969 -106:1:21 -107:1:25 -108:1:26 -109:1:34 -110:1:35 -111:1:39 -112:1:40 -113:1:48 -114:1:53 -115:1:57 -116:1:58 -117:1:65 -118:1:66 -119:1:77 -120:1:78 -121:1:79 -122:1:90 -123:1:95 -124:1:96 -125:0:2969 -126:2:1348 -127:0:2969 -128:2:1349 -129:0:2969 -130:1:108 -131:0:2969 -132:2:1348 -133:0:2969 -134:2:1349 -135:0:2969 -136:1:109 -137:1:113 -138:1:114 -139:1:122 -140:1:123 -141:1:127 -142:1:128 -143:1:136 -144:1:141 -145:1:145 -146:1:146 -147:1:153 -148:1:154 -149:1:165 -150:1:166 -151:1:167 -152:1:178 -153:1:183 -154:1:184 -155:0:2969 -156:1:196 -157:0:2969 -158:2:1348 -159:0:2969 -160:2:1349 -161:0:2969 -162:1:197 -163:0:2969 -164:2:1348 -165:0:2969 -166:2:1349 -167:0:2969 -168:1:198 -169:1:202 -170:1:203 -171:1:211 -172:1:212 -173:1:216 -174:1:217 -175:1:225 -176:1:230 -177:1:234 -178:1:235 -179:1:242 -180:1:243 -181:1:254 -182:1:255 -183:1:256 -184:1:267 -185:1:272 -186:1:273 -187:0:2969 -188:2:1348 -189:0:2969 -190:2:1349 -191:0:2969 -192:1:285 -193:0:2969 -194:1:486 -195:0:2969 -196:1:487 -197:0:2969 -198:1:20 -199:0:2969 -200:2:1348 -201:0:2969 -202:2:1349 -203:0:2969 -204:1:21 -205:1:25 -206:1:26 -207:1:34 -208:1:35 -209:1:36 -210:1:48 -211:1:53 -212:1:57 -213:1:58 -214:1:65 -215:1:66 -216:1:77 -217:1:78 -218:1:79 -219:1:90 -220:1:95 -221:1:96 -222:0:2969 -223:2:1348 -224:0:2969 -225:2:1349 -226:0:2969 -227:1:108 -228:0:2969 -229:2:1348 -230:0:2969 -231:2:1349 -232:0:2969 -233:1:109 -234:1:113 -235:1:114 -236:1:122 -237:1:123 -238:1:127 -239:1:128 -240:1:136 -241:1:141 -242:1:145 -243:1:146 -244:1:153 -245:1:154 -246:1:165 -247:1:166 -248:1:167 -249:1:178 -250:1:183 -251:1:184 -252:0:2969 -253:1:288 -254:0:2969 -255:2:1348 -256:0:2969 -257:2:1349 -258:0:2969 -259:1:289 -260:0:2969 -261:1:486 -262:0:2969 -263:1:487 -264:0:2969 -265:1:492 -266:0:2969 -267:2:1348 -268:0:2969 -269:2:1349 -270:0:2969 -271:1:497 -272:1:501 -273:1:502 -274:1:510 -275:1:511 -276:1:512 -277:1:524 -278:1:529 -279:1:533 -280:1:534 -281:1:541 -282:1:542 -283:1:553 -284:1:554 -285:1:555 -286:1:566 -287:1:571 -288:1:572 -289:0:2969 -290:2:1348 -291:0:2969 -292:2:1349 -293:0:2969 -294:1:584 -295:0:2969 -296:2:1348 -297:0:2969 -298:2:1349 -299:0:2969 -300:1:585 -301:1:589 -302:1:590 -303:1:598 -304:1:599 -305:1:603 -306:1:604 -307:1:612 -308:1:617 -309:1:621 -310:1:622 -311:1:629 -312:1:630 -313:1:641 -314:1:642 -315:1:643 -316:1:654 -317:1:659 -318:1:660 -319:0:2969 -320:2:1348 -321:0:2969 -322:2:1349 -323:0:2969 -324:1:672 -325:0:2969 -326:2:1348 -327:0:2969 -328:2:1349 -329:0:2969 -330:1:673 -331:1:677 -332:1:678 -333:1:686 -334:1:687 -335:1:691 -336:1:692 -337:1:700 -338:1:705 -339:1:709 -340:1:710 -341:1:717 -342:1:718 -343:1:729 -344:1:730 -345:1:731 -346:1:742 -347:1:747 -348:1:748 -349:0:2969 -350:2:1348 -351:0:2969 -352:2:1349 -353:0:2969 -354:1:760 -355:0:2969 -356:1:761 -357:0:2969 -358:1:762 -359:0:2969 -360:1:955 -361:0:2969 -362:1:956 -363:0:2969 -364:2:1348 -365:0:2969 -366:2:1349 -367:0:2969 -368:1:960 -369:0:2969 -370:2:1348 -371:0:2969 -372:2:1349 -373:0:2969 -374:1:961 -375:1:965 -376:1:966 -377:1:974 -378:1:975 -379:1:979 -380:1:980 -381:1:988 -382:1:993 -383:1:997 -384:1:998 -385:1:1005 -386:1:1006 -387:1:1017 -388:1:1018 -389:1:1019 -390:1:1030 -391:1:1035 -392:1:1036 -393:0:2969 -394:2:1348 -395:0:2969 -396:2:1349 -397:0:2969 -398:1:1048 -399:0:2969 -400:1:762 -401:0:2969 -402:1:955 -403:0:2969 -404:1:956 -405:0:2969 -406:2:1348 -407:0:2969 -408:2:1349 -409:0:2969 -410:1:960 -411:0:2969 -412:2:1348 -413:0:2969 -414:2:1349 -415:0:2969 -416:1:961 -417:1:965 -418:1:966 -419:1:974 -420:1:975 -421:1:976 -422:1:988 -423:1:993 -424:1:997 -425:1:998 -426:1:1005 -427:1:1006 -428:1:1017 -429:1:1018 -430:1:1019 -431:1:1030 -432:1:1035 -433:1:1036 -434:0:2969 -435:2:1348 -436:0:2969 -437:2:1349 -438:0:2969 -439:1:1048 -440:0:2969 -441:1:1052 -442:0:2969 -443:2:1348 -444:0:2969 -445:2:1349 -446:0:2969 -447:1:1057 -448:1:1061 -449:1:1062 -450:1:1070 -451:1:1071 -452:1:1072 -453:1:1084 -454:1:1089 -455:1:1093 -456:1:1094 -457:1:1101 -458:1:1102 -459:1:1113 -460:1:1114 -461:1:1115 -462:1:1126 -463:1:1131 -464:1:1132 -465:0:2969 -466:1:9 -467:0:2969 -468:2:1348 -469:0:2969 -470:2:1349 -471:0:2969 -472:1:10 -473:0:2969 -474:2:1350 -475:0:2969 -476:2:1356 -477:0:2969 -478:2:1357 -479:0:2969 -480:2:1367 -481:0:2969 -482:2:1368 -483:0:2969 -484:2:1372 -485:2:1373 -486:2:1377 -487:2:1381 -488:2:1382 -489:2:1386 -490:2:1394 -491:2:1395 -492:2:1400 -493:2:1407 -494:2:1408 -495:2:1415 -496:2:1420 -497:0:2969 -498:2:1431 -499:0:2969 -500:2:1435 -501:2:1436 -502:2:1440 -503:2:1444 -504:2:1445 -505:2:1449 -506:2:1457 -507:2:1458 -508:2:1463 -509:2:1470 -510:2:1471 -511:2:1478 -512:2:1483 -513:0:2969 -514:2:1494 -515:0:2969 -516:2:1502 -517:2:1503 -518:2:1507 -519:2:1511 -520:2:1512 -521:2:1516 -522:2:1524 -523:2:1525 -524:2:1530 -525:2:1537 -526:2:1538 -527:2:1545 -528:2:1550 -529:0:2969 -530:2:1565 -531:0:2969 -532:2:1566 -533:0:2969 -534:1:13 -535:0:2969 -536:2:1567 -537:0:2969 -538:1:19 -539:0:2969 -540:1:20 -541:0:2969 -542:2:1566 -543:0:2969 -544:2:1567 -545:0:2969 -546:1:21 -547:1:25 -548:1:26 -549:1:34 -550:1:35 -551:1:39 -552:1:40 -553:1:48 -554:1:53 -555:1:57 -556:1:58 -557:1:65 -558:1:66 -559:1:77 -560:1:78 -561:1:79 -562:1:90 -563:1:95 -564:1:96 -565:0:2969 -566:2:1566 -567:0:2969 -568:2:1567 -569:0:2969 -570:1:108 -571:0:2969 -572:2:1566 -573:0:2969 -574:2:1567 -575:0:2969 -576:1:109 -577:1:113 -578:1:114 -579:1:122 -580:1:123 -581:1:127 -582:1:128 -583:1:136 -584:1:141 -585:1:145 -586:1:146 -587:1:153 -588:1:154 -589:1:165 -590:1:166 -591:1:167 -592:1:178 -593:1:183 -594:1:184 -595:0:2969 -596:1:196 -597:0:2969 -598:2:1566 -599:0:2969 -600:2:1567 -601:0:2969 -602:1:197 -603:0:2969 -604:2:1566 -605:0:2969 -606:2:1567 -607:0:2969 -608:1:198 -609:1:202 -610:1:203 -611:1:211 -612:1:212 -613:1:216 -614:1:217 -615:1:225 -616:1:230 -617:1:234 -618:1:235 -619:1:242 -620:1:243 -621:1:254 -622:1:255 -623:1:256 -624:1:267 -625:1:272 -626:1:273 -627:0:2969 -628:2:1566 -629:0:2969 -630:2:1567 -631:0:2969 -632:1:285 -633:0:2969 -634:1:486 -635:0:2969 -636:1:487 -637:0:2969 -638:1:20 -639:0:2969 -640:2:1566 -641:0:2969 -642:2:1567 -643:0:2969 -644:1:21 -645:1:25 -646:1:26 -647:1:34 -648:1:35 -649:1:36 -650:1:48 -651:1:53 -652:1:57 -653:1:58 -654:1:65 -655:1:66 -656:1:77 -657:1:78 -658:1:79 -659:1:90 -660:1:95 -661:1:96 -662:0:2969 -663:2:1566 -664:0:2969 -665:2:1567 -666:0:2969 -667:1:108 -668:0:2969 -669:2:1566 -670:0:2969 -671:2:1567 -672:0:2969 -673:1:109 -674:1:113 -675:1:114 -676:1:122 -677:1:123 -678:1:127 -679:1:128 -680:1:136 -681:1:141 -682:1:145 -683:1:146 -684:1:153 -685:1:154 -686:1:165 -687:1:166 -688:1:167 -689:1:178 -690:1:183 -691:1:184 -692:0:2969 -693:1:288 -694:0:2969 -695:2:1566 -696:0:2969 -697:2:1567 -698:0:2969 -699:1:289 -700:0:2969 -701:1:486 -702:0:2969 -703:1:487 -704:0:2969 -705:1:492 -706:0:2969 -707:2:1566 -708:0:2969 -709:2:1567 -710:0:2969 -711:1:497 -712:1:501 -713:1:502 -714:1:510 -715:1:511 -716:1:512 -717:1:524 -718:1:529 -719:1:533 -720:1:534 -721:1:541 -722:1:542 -723:1:553 -724:1:554 -725:1:555 -726:1:566 -727:1:571 -728:1:572 -729:0:2969 -730:2:1566 -731:0:2969 -732:2:1567 -733:0:2969 -734:1:584 -735:0:2969 -736:2:1566 -737:0:2969 -738:2:1567 -739:0:2969 -740:1:585 -741:1:589 -742:1:590 -743:1:598 -744:1:599 -745:1:603 -746:1:604 -747:1:612 -748:1:617 -749:1:621 -750:1:622 -751:1:629 -752:1:630 -753:1:641 -754:1:642 -755:1:643 -756:1:654 -757:1:659 -758:1:660 -759:0:2969 -760:2:1566 -761:0:2969 -762:2:1567 -763:0:2969 -764:1:672 -765:0:2969 -766:2:1566 -767:0:2969 -768:2:1567 -769:0:2969 -770:1:673 -771:1:677 -772:1:678 -773:1:686 -774:1:687 -775:1:691 -776:1:692 -777:1:700 -778:1:705 -779:1:709 -780:1:710 -781:1:717 -782:1:718 -783:1:729 -784:1:730 -785:1:731 -786:1:742 -787:1:747 -788:1:748 -789:0:2969 -790:2:1566 -791:0:2969 -792:2:1567 -793:0:2969 -794:1:760 -795:0:2969 -796:1:761 -797:0:2969 -798:1:762 -799:0:2969 -800:1:955 -801:0:2969 -802:1:956 -803:0:2969 -804:2:1566 -805:0:2969 -806:2:1567 -807:0:2969 -808:1:960 -809:0:2969 -810:2:1566 -811:0:2969 -812:2:1567 -813:0:2969 -814:1:961 -815:1:965 -816:1:966 -817:1:974 -818:1:975 -819:1:979 -820:1:980 -821:1:988 -822:1:993 -823:1:997 -824:1:998 -825:1:1005 -826:1:1006 -827:1:1017 -828:1:1018 -829:1:1019 -830:1:1030 -831:1:1035 -832:1:1036 -833:0:2969 -834:2:1566 -835:0:2969 -836:2:1567 -837:0:2969 -838:1:1048 -839:0:2969 -840:1:762 -841:0:2969 -842:1:955 -843:0:2969 -844:1:956 -845:0:2969 -846:2:1566 -847:0:2969 -848:2:1567 -849:0:2969 -850:1:960 -851:0:2969 -852:2:1566 -853:0:2969 -854:2:1567 -855:0:2969 -856:1:961 -857:1:965 -858:1:966 -859:1:974 -860:1:975 -861:1:976 -862:1:988 -863:1:993 -864:1:997 -865:1:998 -866:1:1005 -867:1:1006 -868:1:1017 -869:1:1018 -870:1:1019 -871:1:1030 -872:1:1035 -873:1:1036 -874:0:2969 -875:2:1566 -876:0:2969 -877:2:1567 -878:0:2969 -879:1:1048 -880:0:2969 -881:1:1052 -882:0:2969 -883:2:1566 -884:0:2969 -885:2:1567 -886:0:2969 -887:1:1057 -888:1:1061 -889:1:1062 -890:1:1070 -891:1:1071 -892:1:1072 -893:1:1084 -894:1:1089 -895:1:1093 -896:1:1094 -897:1:1101 -898:1:1102 -899:1:1113 -900:1:1114 -901:1:1115 -902:1:1126 -903:1:1131 -904:1:1132 -905:0:2969 -906:1:9 -907:0:2969 -908:2:1566 -909:0:2969 -910:2:1567 -911:0:2969 -912:1:10 -913:0:2969 -914:2:1568 -915:0:2969 -916:2:1574 -917:0:2969 -918:2:1575 -919:2:1579 -920:2:1580 -921:2:1588 -922:2:1589 -923:2:1593 -924:2:1594 -925:2:1602 -926:2:1607 -927:2:1611 -928:2:1612 -929:2:1619 -930:2:1620 -931:2:1631 -932:2:1632 -933:2:1633 -934:2:1644 -935:2:1649 -936:2:1650 -937:0:2969 -938:2:1662 -939:0:2969 -940:2:1663 -941:0:2969 -942:1:13 -943:0:2969 -944:2:1664 -945:0:2969 -946:1:19 -947:0:2969 -948:1:20 -949:0:2969 -950:2:1663 -951:0:2969 -952:2:1664 -953:0:2969 -954:1:21 -955:1:25 -956:1:26 -957:1:34 -958:1:35 -959:1:39 -960:1:40 -961:1:48 -962:1:53 -963:1:57 -964:1:58 -965:1:65 -966:1:66 -967:1:77 -968:1:78 -969:1:79 -970:1:90 -971:1:95 -972:1:96 -973:0:2969 -974:2:1663 -975:0:2969 -976:2:1664 -977:0:2969 -978:1:108 -979:0:2969 -980:2:1663 -981:0:2969 -982:2:1664 -983:0:2969 -984:1:109 -985:1:113 -986:1:114 -987:1:122 -988:1:123 -989:1:127 -990:1:128 -991:1:136 -992:1:141 -993:1:145 -994:1:146 -995:1:153 -996:1:154 -997:1:165 -998:1:166 -999:1:167 -1000:1:178 -1001:1:183 -1002:1:184 -1003:0:2969 -1004:1:196 -1005:0:2969 -1006:2:1663 -1007:0:2969 -1008:2:1664 -1009:0:2969 -1010:1:197 -1011:0:2969 -1012:2:1663 -1013:0:2969 -1014:2:1664 -1015:0:2969 -1016:1:198 -1017:1:202 -1018:1:203 -1019:1:211 -1020:1:212 -1021:1:216 -1022:1:217 -1023:1:225 -1024:1:230 -1025:1:234 -1026:1:235 -1027:1:242 -1028:1:243 -1029:1:254 -1030:1:255 -1031:1:256 -1032:1:267 -1033:1:272 -1034:1:273 -1035:0:2969 -1036:2:1663 -1037:0:2969 -1038:2:1664 -1039:0:2969 -1040:1:285 -1041:0:2969 -1042:1:486 -1043:0:2969 -1044:1:487 -1045:0:2969 -1046:1:20 -1047:0:2969 -1048:2:1663 -1049:0:2969 -1050:2:1664 -1051:0:2969 -1052:1:21 -1053:1:25 -1054:1:26 -1055:1:34 -1056:1:35 -1057:1:36 -1058:1:48 -1059:1:53 -1060:1:57 -1061:1:58 -1062:1:65 -1063:1:66 -1064:1:77 -1065:1:78 -1066:1:79 -1067:1:90 -1068:1:95 -1069:1:96 -1070:0:2969 -1071:2:1663 -1072:0:2969 -1073:2:1664 -1074:0:2969 -1075:1:108 -1076:0:2969 -1077:2:1663 -1078:0:2969 -1079:2:1664 -1080:0:2969 -1081:1:109 -1082:1:113 -1083:1:114 -1084:1:122 -1085:1:123 -1086:1:127 -1087:1:128 -1088:1:136 -1089:1:141 -1090:1:145 -1091:1:146 -1092:1:153 -1093:1:154 -1094:1:165 -1095:1:166 -1096:1:167 -1097:1:178 -1098:1:183 -1099:1:184 -1100:0:2969 -1101:1:288 -1102:0:2969 -1103:2:1663 -1104:0:2969 -1105:2:1664 -1106:0:2969 -1107:1:289 -1108:0:2969 -1109:1:486 -1110:0:2969 -1111:1:487 -1112:0:2969 -1113:1:492 -1114:0:2969 -1115:2:1663 -1116:0:2969 -1117:2:1664 -1118:0:2969 -1119:1:497 -1120:1:501 -1121:1:502 -1122:1:510 -1123:1:511 -1124:1:512 -1125:1:524 -1126:1:529 -1127:1:533 -1128:1:534 -1129:1:541 -1130:1:542 -1131:1:553 -1132:1:554 -1133:1:555 -1134:1:566 -1135:1:571 -1136:1:572 -1137:0:2969 -1138:2:1663 -1139:0:2969 -1140:2:1664 -1141:0:2969 -1142:1:584 -1143:0:2969 -1144:2:1663 -1145:0:2969 -1146:2:1664 -1147:0:2969 -1148:1:585 -1149:1:589 -1150:1:590 -1151:1:598 -1152:1:599 -1153:1:603 -1154:1:604 -1155:1:612 -1156:1:617 -1157:1:621 -1158:1:622 -1159:1:629 -1160:1:630 -1161:1:641 -1162:1:642 -1163:1:643 -1164:1:654 -1165:1:659 -1166:1:660 -1167:0:2969 -1168:2:1663 -1169:0:2969 -1170:2:1664 -1171:0:2969 -1172:1:672 -1173:0:2969 -1174:2:1663 -1175:0:2969 -1176:2:1664 -1177:0:2969 -1178:1:673 -1179:1:677 -1180:1:678 -1181:1:686 -1182:1:687 -1183:1:691 -1184:1:692 -1185:1:700 -1186:1:705 -1187:1:709 -1188:1:710 -1189:1:717 -1190:1:718 -1191:1:729 -1192:1:730 -1193:1:731 -1194:1:742 -1195:1:747 -1196:1:748 -1197:0:2969 -1198:2:1663 -1199:0:2969 -1200:2:1664 -1201:0:2969 -1202:1:760 -1203:0:2969 -1204:1:761 -1205:0:2969 -1206:1:762 -1207:0:2969 -1208:1:955 -1209:0:2969 -1210:1:956 -1211:0:2969 -1212:2:1663 -1213:0:2969 -1214:2:1664 -1215:0:2969 -1216:1:960 -1217:0:2969 -1218:2:1663 -1219:0:2969 -1220:2:1664 -1221:0:2969 -1222:1:961 -1223:1:965 -1224:1:966 -1225:1:974 -1226:1:975 -1227:1:979 -1228:1:980 -1229:1:988 -1230:1:993 -1231:1:997 -1232:1:998 -1233:1:1005 -1234:1:1006 -1235:1:1017 -1236:1:1018 -1237:1:1019 -1238:1:1030 -1239:1:1035 -1240:1:1036 -1241:0:2969 -1242:2:1663 -1243:0:2969 -1244:2:1664 -1245:0:2969 -1246:1:1048 -1247:0:2969 -1248:1:762 -1249:0:2969 -1250:1:955 -1251:0:2969 -1252:1:956 -1253:0:2969 -1254:2:1663 -1255:0:2969 -1256:2:1664 -1257:0:2969 -1258:1:960 -1259:0:2969 -1260:2:1663 -1261:0:2969 -1262:2:1664 -1263:0:2969 -1264:1:961 -1265:1:965 -1266:1:966 -1267:1:974 -1268:1:975 -1269:1:976 -1270:1:988 -1271:1:993 -1272:1:997 -1273:1:998 -1274:1:1005 -1275:1:1006 -1276:1:1017 -1277:1:1018 -1278:1:1019 -1279:1:1030 -1280:1:1035 -1281:1:1036 -1282:0:2969 -1283:2:1663 -1284:0:2969 -1285:2:1664 -1286:0:2969 -1287:1:1048 -1288:0:2969 -1289:1:1052 -1290:0:2969 -1291:2:1663 -1292:0:2969 -1293:2:1664 -1294:0:2969 -1295:1:1057 -1296:1:1061 -1297:1:1062 -1298:1:1070 -1299:1:1071 -1300:1:1072 -1301:1:1084 -1302:1:1089 -1303:1:1093 -1304:1:1094 -1305:1:1101 -1306:1:1102 -1307:1:1113 -1308:1:1114 -1309:1:1115 -1310:1:1126 -1311:1:1131 -1312:1:1132 -1313:0:2969 -1314:1:9 -1315:0:2969 -1316:2:1663 -1317:0:2969 -1318:2:1664 -1319:0:2969 -1320:1:10 -1321:0:2969 -1322:2:1665 -1323:0:2969 -1324:2:1671 -1325:0:2969 -1326:2:1674 -1327:2:1675 -1328:2:1687 -1329:2:1688 -1330:2:1692 -1331:2:1693 -1332:2:1701 -1333:2:1706 -1334:2:1710 -1335:2:1711 -1336:2:1718 -1337:2:1719 -1338:2:1730 -1339:2:1731 -1340:2:1732 -1341:2:1743 -1342:2:1748 -1343:2:1749 -1344:0:2969 -1345:2:1761 -1346:0:2969 -1347:2:1762 -1348:0:2969 -1349:1:13 -1350:0:2969 -1351:2:1763 -1352:0:2969 -1353:1:19 -1354:0:2969 -1355:1:20 -1356:0:2969 -1357:2:1762 -1358:0:2969 -1359:2:1763 -1360:0:2969 -1361:1:21 -1362:1:25 -1363:1:26 -1364:1:34 -1365:1:35 -1366:1:39 -1367:1:40 -1368:1:48 -1369:1:53 -1370:1:57 -1371:1:58 -1372:1:65 -1373:1:66 -1374:1:77 -1375:1:78 -1376:1:79 -1377:1:90 -1378:1:95 -1379:1:96 -1380:0:2969 -1381:2:1762 -1382:0:2969 -1383:2:1763 -1384:0:2969 -1385:1:108 -1386:0:2969 -1387:2:1762 -1388:0:2969 -1389:2:1763 -1390:0:2969 -1391:1:109 -1392:1:113 -1393:1:114 -1394:1:122 -1395:1:123 -1396:1:127 -1397:1:128 -1398:1:136 -1399:1:141 -1400:1:145 -1401:1:146 -1402:1:153 -1403:1:154 -1404:1:165 -1405:1:166 -1406:1:167 -1407:1:178 -1408:1:183 -1409:1:184 -1410:0:2969 -1411:1:196 -1412:0:2969 -1413:2:1762 -1414:0:2969 -1415:2:1763 -1416:0:2969 -1417:1:197 -1418:0:2969 -1419:2:1762 -1420:0:2969 -1421:2:1763 -1422:0:2969 -1423:1:198 -1424:1:202 -1425:1:203 -1426:1:211 -1427:1:212 -1428:1:216 -1429:1:217 -1430:1:225 -1431:1:230 -1432:1:234 -1433:1:235 -1434:1:242 -1435:1:243 -1436:1:254 -1437:1:255 -1438:1:256 -1439:1:267 -1440:1:272 -1441:1:273 -1442:0:2969 -1443:2:1762 -1444:0:2969 -1445:2:1763 -1446:0:2969 -1447:1:285 -1448:0:2969 -1449:1:486 -1450:0:2969 -1451:1:487 -1452:0:2969 -1453:1:20 -1454:0:2969 -1455:2:1762 -1456:0:2969 -1457:2:1763 -1458:0:2969 -1459:1:21 -1460:1:25 -1461:1:26 -1462:1:34 -1463:1:35 -1464:1:36 -1465:1:48 -1466:1:53 -1467:1:57 -1468:1:58 -1469:1:65 -1470:1:66 -1471:1:77 -1472:1:78 -1473:1:79 -1474:1:90 -1475:1:95 -1476:1:96 -1477:0:2969 -1478:2:1762 -1479:0:2969 -1480:2:1763 -1481:0:2969 -1482:1:108 -1483:0:2969 -1484:2:1762 -1485:0:2969 -1486:2:1763 -1487:0:2969 -1488:1:109 -1489:1:113 -1490:1:114 -1491:1:122 -1492:1:123 -1493:1:127 -1494:1:128 -1495:1:136 -1496:1:141 -1497:1:145 -1498:1:146 -1499:1:153 -1500:1:154 -1501:1:165 -1502:1:166 -1503:1:167 -1504:1:178 -1505:1:183 -1506:1:184 -1507:0:2969 -1508:1:288 -1509:0:2969 -1510:2:1762 -1511:0:2969 -1512:2:1763 -1513:0:2969 -1514:1:289 -1515:0:2969 -1516:1:486 -1517:0:2969 -1518:1:487 -1519:0:2969 -1520:1:492 -1521:0:2969 -1522:2:1762 -1523:0:2969 -1524:2:1763 -1525:0:2969 -1526:1:497 -1527:1:501 -1528:1:502 -1529:1:510 -1530:1:511 -1531:1:512 -1532:1:524 -1533:1:529 -1534:1:533 -1535:1:534 -1536:1:541 -1537:1:542 -1538:1:553 -1539:1:554 -1540:1:555 -1541:1:566 -1542:1:571 -1543:1:572 -1544:0:2969 -1545:2:1762 -1546:0:2969 -1547:2:1763 -1548:0:2969 -1549:1:584 -1550:0:2969 -1551:2:1762 -1552:0:2969 -1553:2:1763 -1554:0:2969 -1555:1:585 -1556:1:589 -1557:1:590 -1558:1:598 -1559:1:599 -1560:1:603 -1561:1:604 -1562:1:612 -1563:1:617 -1564:1:621 -1565:1:622 -1566:1:629 -1567:1:630 -1568:1:641 -1569:1:642 -1570:1:643 -1571:1:654 -1572:1:659 -1573:1:660 -1574:0:2969 -1575:2:1762 -1576:0:2969 -1577:2:1763 -1578:0:2969 -1579:1:672 -1580:0:2969 -1581:2:1762 -1582:0:2969 -1583:2:1763 -1584:0:2969 -1585:1:673 -1586:1:677 -1587:1:678 -1588:1:686 -1589:1:687 -1590:1:691 -1591:1:692 -1592:1:700 -1593:1:705 -1594:1:709 -1595:1:710 -1596:1:717 -1597:1:718 -1598:1:729 -1599:1:730 -1600:1:731 -1601:1:742 -1602:1:747 -1603:1:748 -1604:0:2969 -1605:2:1762 -1606:0:2969 -1607:2:1763 -1608:0:2969 -1609:1:760 -1610:0:2969 -1611:1:761 -1612:0:2969 -1613:1:762 -1614:0:2969 -1615:1:955 -1616:0:2969 -1617:1:956 -1618:0:2969 -1619:2:1762 -1620:0:2969 -1621:2:1763 -1622:0:2969 -1623:1:960 -1624:0:2969 -1625:2:1762 -1626:0:2969 -1627:2:1763 -1628:0:2969 -1629:1:961 -1630:1:965 -1631:1:966 -1632:1:974 -1633:1:975 -1634:1:979 -1635:1:980 -1636:1:988 -1637:1:993 -1638:1:997 -1639:1:998 -1640:1:1005 -1641:1:1006 -1642:1:1017 -1643:1:1018 -1644:1:1019 -1645:1:1030 -1646:1:1035 -1647:1:1036 -1648:0:2969 -1649:2:1762 -1650:0:2969 -1651:2:1763 -1652:0:2969 -1653:1:1048 -1654:0:2969 -1655:1:762 -1656:0:2969 -1657:1:955 -1658:0:2969 -1659:1:956 -1660:0:2969 -1661:2:1762 -1662:0:2969 -1663:2:1763 -1664:0:2969 -1665:1:960 -1666:0:2969 -1667:2:1762 -1668:0:2969 -1669:2:1763 -1670:0:2969 -1671:1:961 -1672:1:965 -1673:1:966 -1674:1:974 -1675:1:975 -1676:1:976 -1677:1:988 -1678:1:993 -1679:1:997 -1680:1:998 -1681:1:1005 -1682:1:1006 -1683:1:1017 -1684:1:1018 -1685:1:1019 -1686:1:1030 -1687:1:1035 -1688:1:1036 -1689:0:2969 -1690:2:1762 -1691:0:2969 -1692:2:1763 -1693:0:2969 -1694:1:1048 -1695:0:2969 -1696:1:1052 -1697:0:2969 -1698:2:1762 -1699:0:2969 -1700:2:1763 -1701:0:2969 -1702:1:1057 -1703:1:1061 -1704:1:1062 -1705:1:1070 -1706:1:1071 -1707:1:1072 -1708:1:1084 -1709:1:1089 -1710:1:1093 -1711:1:1094 -1712:1:1101 -1713:1:1102 -1714:1:1113 -1715:1:1114 -1716:1:1115 -1717:1:1126 -1718:1:1131 -1719:1:1132 -1720:0:2969 -1721:1:9 -1722:0:2969 -1723:2:1762 -1724:0:2969 -1725:2:1763 -1726:0:2969 -1727:1:10 -1728:0:2969 -1729:2:1764 -1730:0:2969 -1731:2:1770 -1732:0:2969 -1733:2:1771 -1734:0:2969 -1735:2:1772 -1736:0:2969 -1737:2:1773 -1738:0:2969 -1739:2:1774 -1740:2:1778 -1741:2:1779 -1742:2:1787 -1743:2:1788 -1744:2:1792 -1745:2:1793 -1746:2:1801 -1747:2:1806 -1748:2:1810 -1749:2:1811 -1750:2:1818 -1751:2:1819 -1752:2:1830 -1753:2:1831 -1754:2:1832 -1755:2:1843 -1756:2:1848 -1757:2:1849 -1758:0:2969 -1759:2:1861 -1760:0:2969 -1761:2:1862 -1762:0:2969 -1763:1:13 -1764:0:2969 -1765:2:1863 -1766:0:2969 -1767:1:19 -1768:0:2969 -1769:1:20 -1770:0:2969 -1771:2:1862 -1772:0:2969 -1773:2:1863 -1774:0:2969 -1775:1:21 -1776:1:25 -1777:1:26 -1778:1:34 -1779:1:35 -1780:1:39 -1781:1:40 -1782:1:48 -1783:1:53 -1784:1:57 -1785:1:58 -1786:1:65 -1787:1:66 -1788:1:77 -1789:1:78 -1790:1:79 -1791:1:90 -1792:1:95 -1793:1:96 -1794:0:2969 -1795:2:1862 -1796:0:2969 -1797:2:1863 -1798:0:2969 -1799:1:108 -1800:0:2969 -1801:2:1862 -1802:0:2969 -1803:2:1863 -1804:0:2969 -1805:1:109 -1806:1:113 -1807:1:114 -1808:1:122 -1809:1:123 -1810:1:127 -1811:1:128 -1812:1:136 -1813:1:141 -1814:1:145 -1815:1:146 -1816:1:153 -1817:1:154 -1818:1:165 -1819:1:166 -1820:1:167 -1821:1:178 -1822:1:183 -1823:1:184 -1824:0:2969 -1825:1:196 -1826:0:2969 -1827:2:1862 -1828:0:2969 -1829:2:1863 -1830:0:2969 -1831:1:197 -1832:0:2969 -1833:2:1862 -1834:0:2969 -1835:2:1863 -1836:0:2969 -1837:1:198 -1838:1:202 -1839:1:203 -1840:1:211 -1841:1:212 -1842:1:216 -1843:1:217 -1844:1:225 -1845:1:230 -1846:1:234 -1847:1:235 -1848:1:242 -1849:1:243 -1850:1:254 -1851:1:255 -1852:1:256 -1853:1:267 -1854:1:272 -1855:1:273 -1856:0:2969 -1857:2:1862 -1858:0:2969 -1859:2:1863 -1860:0:2969 -1861:1:285 -1862:0:2969 -1863:1:486 -1864:0:2969 -1865:1:487 -1866:0:2969 -1867:1:20 -1868:0:2969 -1869:2:1862 -1870:0:2969 -1871:2:1863 -1872:0:2969 -1873:1:21 -1874:1:25 -1875:1:26 -1876:1:34 -1877:1:35 -1878:1:36 -1879:1:48 -1880:1:53 -1881:1:57 -1882:1:58 -1883:1:65 -1884:1:66 -1885:1:77 -1886:1:78 -1887:1:79 -1888:1:90 -1889:1:95 -1890:1:96 -1891:0:2969 -1892:2:1862 -1893:0:2969 -1894:2:1863 -1895:0:2969 -1896:1:108 -1897:0:2969 -1898:2:1862 -1899:0:2969 -1900:2:1863 -1901:0:2969 -1902:1:109 -1903:1:113 -1904:1:114 -1905:1:122 -1906:1:123 -1907:1:127 -1908:1:128 -1909:1:136 -1910:1:141 -1911:1:145 -1912:1:146 -1913:1:153 -1914:1:154 -1915:1:165 -1916:1:166 -1917:1:167 -1918:1:178 -1919:1:183 -1920:1:184 -1921:0:2969 -1922:1:288 -1923:0:2969 -1924:2:1862 -1925:0:2969 -1926:2:1863 -1927:0:2969 -1928:1:289 -1929:0:2969 -1930:1:486 -1931:0:2969 -1932:1:487 -1933:0:2969 -1934:1:492 -1935:0:2969 -1936:2:1862 -1937:0:2969 -1938:2:1863 -1939:0:2969 -1940:1:497 -1941:1:501 -1942:1:502 -1943:1:510 -1944:1:511 -1945:1:512 -1946:1:524 -1947:1:529 -1948:1:533 -1949:1:534 -1950:1:541 -1951:1:542 -1952:1:553 -1953:1:554 -1954:1:555 -1955:1:566 -1956:1:571 -1957:1:572 -1958:0:2969 -1959:2:1862 -1960:0:2969 -1961:2:1863 -1962:0:2969 -1963:1:584 -1964:0:2969 -1965:2:1862 -1966:0:2969 -1967:2:1863 -1968:0:2969 -1969:1:585 -1970:1:589 -1971:1:590 -1972:1:598 -1973:1:599 -1974:1:603 -1975:1:604 -1976:1:612 -1977:1:617 -1978:1:621 -1979:1:622 -1980:1:629 -1981:1:630 -1982:1:641 -1983:1:642 -1984:1:643 -1985:1:654 -1986:1:659 -1987:1:660 -1988:0:2969 -1989:2:1862 -1990:0:2969 -1991:2:1863 -1992:0:2969 -1993:1:672 -1994:0:2969 -1995:2:1862 -1996:0:2969 -1997:2:1863 -1998:0:2969 -1999:1:673 -2000:1:677 -2001:1:678 -2002:1:686 -2003:1:687 -2004:1:691 -2005:1:692 -2006:1:700 -2007:1:705 -2008:1:709 -2009:1:710 -2010:1:717 -2011:1:718 -2012:1:729 -2013:1:730 -2014:1:731 -2015:1:742 -2016:1:747 -2017:1:748 -2018:0:2969 -2019:2:1862 -2020:0:2969 -2021:2:1863 -2022:0:2969 -2023:1:760 -2024:0:2969 -2025:1:761 -2026:0:2969 -2027:1:762 -2028:0:2969 -2029:1:955 -2030:0:2969 -2031:1:956 -2032:0:2969 -2033:2:1862 -2034:0:2969 -2035:2:1863 -2036:0:2969 -2037:1:960 -2038:0:2969 -2039:2:1862 -2040:0:2969 -2041:2:1863 -2042:0:2969 -2043:1:961 -2044:1:965 -2045:1:966 -2046:1:974 -2047:1:975 -2048:1:979 -2049:1:980 -2050:1:988 -2051:1:993 -2052:1:997 -2053:1:998 -2054:1:1005 -2055:1:1006 -2056:1:1017 -2057:1:1018 -2058:1:1019 -2059:1:1030 -2060:1:1035 -2061:1:1036 -2062:0:2969 -2063:2:1862 -2064:0:2969 -2065:2:1863 -2066:0:2969 -2067:1:1048 -2068:0:2969 -2069:1:762 -2070:0:2969 -2071:1:955 -2072:0:2969 -2073:1:956 -2074:0:2969 -2075:2:1862 -2076:0:2969 -2077:2:1863 -2078:0:2969 -2079:1:960 -2080:0:2969 -2081:2:1862 -2082:0:2969 -2083:2:1863 -2084:0:2969 -2085:1:961 -2086:1:965 -2087:1:966 -2088:1:974 -2089:1:975 -2090:1:976 -2091:1:988 -2092:1:993 -2093:1:997 -2094:1:998 -2095:1:1005 -2096:1:1006 -2097:1:1017 -2098:1:1018 -2099:1:1019 -2100:1:1030 -2101:1:1035 -2102:1:1036 -2103:0:2969 -2104:2:1862 -2105:0:2969 -2106:2:1863 -2107:0:2969 -2108:1:1048 -2109:0:2969 -2110:1:1052 -2111:0:2969 -2112:2:1862 -2113:0:2969 -2114:2:1863 -2115:0:2969 -2116:1:1057 -2117:1:1061 -2118:1:1062 -2119:1:1070 -2120:1:1071 -2121:1:1072 -2122:1:1084 -2123:1:1089 -2124:1:1093 -2125:1:1094 -2126:1:1101 -2127:1:1102 -2128:1:1113 -2129:1:1114 -2130:1:1115 -2131:1:1126 -2132:1:1131 -2133:1:1132 -2134:0:2969 -2135:1:9 -2136:0:2969 -2137:2:1862 -2138:0:2969 -2139:2:1863 -2140:0:2969 -2141:1:10 -2142:0:2969 -2143:2:1864 -2144:0:2969 -2145:2:1967 -2146:0:2969 -2147:2:2072 -2148:0:2969 -2149:2:2073 -2150:0:2969 -2151:2:2077 -2152:0:2969 -2153:2:2083 -2154:2:2087 -2155:2:2088 -2156:2:2096 -2157:2:2097 -2158:2:2101 -2159:2:2102 -2160:2:2110 -2161:2:2115 -2162:2:2119 -2163:2:2120 -2164:2:2127 -2165:2:2128 -2166:2:2139 -2167:2:2140 -2168:2:2141 -2169:2:2152 -2170:2:2157 -2171:2:2158 -2172:0:2969 -2173:2:2170 -2174:0:2969 -2175:2:2171 -2176:0:2969 -2177:1:13 -2178:0:2969 -2179:2:2172 -2180:0:2969 -2181:1:19 -2182:0:2969 -2183:1:20 -2184:0:2969 -2185:2:2171 -2186:0:2969 -2187:2:2172 -2188:0:2969 -2189:1:21 -2190:1:25 -2191:1:26 -2192:1:34 -2193:1:35 -2194:1:39 -2195:1:40 -2196:1:48 -2197:1:53 -2198:1:57 -2199:1:58 -2200:1:65 -2201:1:66 -2202:1:77 -2203:1:78 -2204:1:79 -2205:1:90 -2206:1:95 -2207:1:96 -2208:0:2969 -2209:2:2171 -2210:0:2969 -2211:2:2172 -2212:0:2969 -2213:1:108 -2214:0:2969 -2215:2:2171 -2216:0:2969 -2217:2:2172 -2218:0:2969 -2219:1:109 -2220:1:113 -2221:1:114 -2222:1:122 -2223:1:123 -2224:1:127 -2225:1:128 -2226:1:136 -2227:1:141 -2228:1:145 -2229:1:146 -2230:1:153 -2231:1:154 -2232:1:165 -2233:1:166 -2234:1:167 -2235:1:178 -2236:1:183 -2237:1:184 -2238:0:2969 -2239:1:196 -2240:0:2969 -2241:2:2171 -2242:0:2969 -2243:2:2172 -2244:0:2969 -2245:1:197 -2246:0:2969 -2247:2:2171 -2248:0:2969 -2249:2:2172 -2250:0:2969 -2251:1:198 -2252:1:202 -2253:1:203 -2254:1:211 -2255:1:212 -2256:1:216 -2257:1:217 -2258:1:225 -2259:1:230 -2260:1:234 -2261:1:235 -2262:1:242 -2263:1:243 -2264:1:254 -2265:1:255 -2266:1:256 -2267:1:267 -2268:1:272 -2269:1:273 -2270:0:2969 -2271:2:2171 -2272:0:2969 -2273:2:2172 -2274:0:2969 -2275:1:285 -2276:0:2969 -2277:1:486 -2278:0:2969 -2279:1:487 -2280:0:2969 -2281:1:20 -2282:0:2969 -2283:2:2171 -2284:0:2969 -2285:2:2172 -2286:0:2969 -2287:1:21 -2288:1:25 -2289:1:26 -2290:1:34 -2291:1:35 -2292:1:36 -2293:1:48 -2294:1:53 -2295:1:57 -2296:1:58 -2297:1:65 -2298:1:66 -2299:1:77 -2300:1:78 -2301:1:79 -2302:1:90 -2303:1:95 -2304:1:96 -2305:0:2969 -2306:2:2171 -2307:0:2969 -2308:2:2172 -2309:0:2969 -2310:1:108 -2311:0:2969 -2312:2:2171 -2313:0:2969 -2314:2:2172 -2315:0:2969 -2316:1:109 -2317:1:113 -2318:1:114 -2319:1:122 -2320:1:123 -2321:1:127 -2322:1:128 -2323:1:136 -2324:1:141 -2325:1:145 -2326:1:146 -2327:1:153 -2328:1:154 -2329:1:165 -2330:1:166 -2331:1:167 -2332:1:178 -2333:1:183 -2334:1:184 -2335:0:2969 -2336:1:288 -2337:0:2969 -2338:2:2171 -2339:0:2969 -2340:2:2172 -2341:0:2969 -2342:1:289 -2343:0:2969 -2344:1:486 -2345:0:2969 -2346:1:487 -2347:0:2969 -2348:1:492 -2349:0:2969 -2350:2:2171 -2351:0:2969 -2352:2:2172 -2353:0:2969 -2354:1:497 -2355:1:501 -2356:1:502 -2357:1:510 -2358:1:511 -2359:1:512 -2360:1:524 -2361:1:529 -2362:1:533 -2363:1:534 -2364:1:541 -2365:1:542 -2366:1:553 -2367:1:554 -2368:1:555 -2369:1:566 -2370:1:571 -2371:1:572 -2372:0:2969 -2373:2:2171 -2374:0:2969 -2375:2:2172 -2376:0:2969 -2377:1:584 -2378:0:2969 -2379:2:2171 -2380:0:2969 -2381:2:2172 -2382:0:2969 -2383:1:585 -2384:1:589 -2385:1:590 -2386:1:598 -2387:1:599 -2388:1:603 -2389:1:604 -2390:1:612 -2391:1:617 -2392:1:621 -2393:1:622 -2394:1:629 -2395:1:630 -2396:1:641 -2397:1:642 -2398:1:643 -2399:1:654 -2400:1:659 -2401:1:660 -2402:0:2969 -2403:2:2171 -2404:0:2969 -2405:2:2172 -2406:0:2969 -2407:1:672 -2408:0:2969 -2409:2:2171 -2410:0:2969 -2411:2:2172 -2412:0:2969 -2413:1:673 -2414:1:677 -2415:1:678 -2416:1:686 -2417:1:687 -2418:1:691 -2419:1:692 -2420:1:700 -2421:1:705 -2422:1:709 -2423:1:710 -2424:1:717 -2425:1:718 -2426:1:729 -2427:1:730 -2428:1:731 -2429:1:742 -2430:1:747 -2431:1:748 -2432:0:2969 -2433:2:2171 -2434:0:2969 -2435:2:2172 -2436:0:2969 -2437:1:760 -2438:0:2969 -2439:1:761 -2440:0:2969 -2441:1:762 -2442:0:2969 -2443:1:955 -2444:0:2969 -2445:1:956 -2446:0:2969 -2447:2:2171 -2448:0:2969 -2449:2:2172 -2450:0:2969 -2451:1:960 -2452:0:2969 -2453:2:2171 -2454:0:2969 -2455:2:2172 -2456:0:2969 -2457:1:961 -2458:1:965 -2459:1:966 -2460:1:974 -2461:1:975 -2462:1:979 -2463:1:980 -2464:1:988 -2465:1:993 -2466:1:997 -2467:1:998 -2468:1:1005 -2469:1:1006 -2470:1:1017 -2471:1:1018 -2472:1:1019 -2473:1:1030 -2474:1:1035 -2475:1:1036 -2476:0:2969 -2477:2:2171 -2478:0:2969 -2479:2:2172 -2480:0:2969 -2481:1:1048 -2482:0:2969 -2483:1:762 -2484:0:2969 -2485:1:955 -2486:0:2969 -2487:1:956 -2488:0:2969 -2489:2:2171 -2490:0:2969 -2491:2:2172 -2492:0:2969 -2493:1:960 -2494:0:2969 -2495:2:2171 -2496:0:2969 -2497:2:2172 -2498:0:2969 -2499:1:961 -2500:1:965 -2501:1:966 -2502:1:974 -2503:1:975 -2504:1:976 -2505:1:988 -2506:1:993 -2507:1:997 -2508:1:998 -2509:1:1005 -2510:1:1006 -2511:1:1017 -2512:1:1018 -2513:1:1019 -2514:1:1030 -2515:1:1035 -2516:1:1036 -2517:0:2969 -2518:2:2171 -2519:0:2969 -2520:2:2172 -2521:0:2969 -2522:1:1048 -2523:0:2969 -2524:1:1052 -2525:0:2969 -2526:2:2171 -2527:0:2969 -2528:2:2172 -2529:0:2969 -2530:1:1057 -2531:1:1061 -2532:1:1062 -2533:1:1070 -2534:1:1071 -2535:1:1072 -2536:1:1084 -2537:1:1089 -2538:1:1093 -2539:1:1094 -2540:1:1101 -2541:1:1102 -2542:1:1113 -2543:1:1114 -2544:1:1115 -2545:1:1126 -2546:1:1131 -2547:1:1132 -2548:0:2969 -2549:1:9 -2550:0:2969 -2551:2:2171 -2552:0:2969 -2553:2:2172 -2554:0:2969 -2555:1:10 -2556:0:2969 -2557:2:2173 -2558:0:2969 -2559:2:2179 -2560:0:2969 -2561:2:2180 -2562:2:2184 -2563:2:2185 -2564:2:2193 -2565:2:2194 -2566:2:2198 -2567:2:2199 -2568:2:2207 -2569:2:2212 -2570:2:2216 -2571:2:2217 -2572:2:2224 -2573:2:2225 -2574:2:2236 -2575:2:2237 -2576:2:2238 -2577:2:2249 -2578:2:2254 -2579:2:2255 -2580:0:2969 -2581:2:2267 -2582:0:2969 -2583:2:2268 -2584:0:2969 -2585:1:13 -2586:0:2969 -2587:2:2269 -2588:0:2969 -2589:1:19 -2590:0:2969 -2591:1:20 -2592:0:2969 -2593:2:2268 -2594:0:2969 -2595:2:2269 -2596:0:2969 -2597:1:21 -2598:1:25 -2599:1:26 -2600:1:34 -2601:1:35 -2602:1:39 -2603:1:40 -2604:1:48 -2605:1:53 -2606:1:57 -2607:1:58 -2608:1:65 -2609:1:66 -2610:1:77 -2611:1:78 -2612:1:79 -2613:1:90 -2614:1:95 -2615:1:96 -2616:0:2969 -2617:2:2268 -2618:0:2969 -2619:2:2269 -2620:0:2969 -2621:1:108 -2622:0:2969 -2623:2:2268 -2624:0:2969 -2625:2:2269 -2626:0:2969 -2627:1:109 -2628:1:113 -2629:1:114 -2630:1:122 -2631:1:123 -2632:1:127 -2633:1:128 -2634:1:136 -2635:1:141 -2636:1:145 -2637:1:146 -2638:1:153 -2639:1:154 -2640:1:165 -2641:1:166 -2642:1:167 -2643:1:178 -2644:1:183 -2645:1:184 -2646:0:2969 -2647:1:196 -2648:0:2969 -2649:2:2268 -2650:0:2969 -2651:2:2269 -2652:0:2969 -2653:1:197 -2654:0:2969 -2655:2:2268 -2656:0:2969 -2657:2:2269 -2658:0:2969 -2659:1:198 -2660:1:202 -2661:1:203 -2662:1:211 -2663:1:212 -2664:1:216 -2665:1:217 -2666:1:225 -2667:1:230 -2668:1:234 -2669:1:235 -2670:1:242 -2671:1:243 -2672:1:254 -2673:1:255 -2674:1:256 -2675:1:267 -2676:1:272 -2677:1:273 -2678:0:2969 -2679:2:2268 -2680:0:2969 -2681:2:2269 -2682:0:2969 -2683:1:285 -2684:0:2969 -2685:1:486 -2686:0:2969 -2687:1:487 -2688:0:2969 -2689:1:20 -2690:0:2969 -2691:2:2268 -2692:0:2969 -2693:2:2269 -2694:0:2969 -2695:1:21 -2696:1:25 -2697:1:26 -2698:1:34 -2699:1:35 -2700:1:36 -2701:1:48 -2702:1:53 -2703:1:57 -2704:1:58 -2705:1:65 -2706:1:66 -2707:1:77 -2708:1:78 -2709:1:79 -2710:1:90 -2711:1:95 -2712:1:96 -2713:0:2969 -2714:2:2268 -2715:0:2969 -2716:2:2269 -2717:0:2969 -2718:1:108 -2719:0:2969 -2720:2:2268 -2721:0:2969 -2722:2:2269 -2723:0:2969 -2724:1:109 -2725:1:113 -2726:1:114 -2727:1:122 -2728:1:123 -2729:1:127 -2730:1:128 -2731:1:136 -2732:1:141 -2733:1:145 -2734:1:146 -2735:1:153 -2736:1:154 -2737:1:165 -2738:1:166 -2739:1:167 -2740:1:178 -2741:1:183 -2742:1:184 -2743:0:2969 -2744:1:288 -2745:0:2969 -2746:2:2268 -2747:0:2969 -2748:2:2269 -2749:0:2969 -2750:1:289 -2751:0:2969 -2752:1:486 -2753:0:2969 -2754:1:487 -2755:0:2969 -2756:1:492 -2757:0:2969 -2758:2:2268 -2759:0:2969 -2760:2:2269 -2761:0:2969 -2762:1:497 -2763:1:501 -2764:1:502 -2765:1:510 -2766:1:511 -2767:1:512 -2768:1:524 -2769:1:529 -2770:1:533 -2771:1:534 -2772:1:541 -2773:1:542 -2774:1:553 -2775:1:554 -2776:1:555 -2777:1:566 -2778:1:571 -2779:1:572 -2780:0:2969 -2781:2:2268 -2782:0:2969 -2783:2:2269 -2784:0:2969 -2785:1:584 -2786:0:2969 -2787:2:2268 -2788:0:2969 -2789:2:2269 -2790:0:2969 -2791:1:585 -2792:1:589 -2793:1:590 -2794:1:598 -2795:1:599 -2796:1:603 -2797:1:604 -2798:1:612 -2799:1:617 -2800:1:621 -2801:1:622 -2802:1:629 -2803:1:630 -2804:1:641 -2805:1:642 -2806:1:643 -2807:1:654 -2808:1:659 -2809:1:660 -2810:0:2969 -2811:2:2268 -2812:0:2969 -2813:2:2269 -2814:0:2969 -2815:1:672 -2816:0:2969 -2817:2:2268 -2818:0:2969 -2819:2:2269 -2820:0:2969 -2821:1:673 -2822:1:677 -2823:1:678 -2824:1:686 -2825:1:687 -2826:1:691 -2827:1:692 -2828:1:700 -2829:1:705 -2830:1:709 -2831:1:710 -2832:1:717 -2833:1:718 -2834:1:729 -2835:1:730 -2836:1:731 -2837:1:742 -2838:1:747 -2839:1:748 -2840:0:2969 -2841:2:2268 -2842:0:2969 -2843:2:2269 -2844:0:2969 -2845:1:760 -2846:0:2969 -2847:1:761 -2848:0:2969 -2849:1:762 -2850:0:2969 -2851:1:955 -2852:0:2969 -2853:1:956 -2854:0:2969 -2855:2:2268 -2856:0:2969 -2857:2:2269 -2858:0:2969 -2859:1:960 -2860:0:2969 -2861:2:2268 -2862:0:2969 -2863:2:2269 -2864:0:2969 -2865:1:961 -2866:1:965 -2867:1:966 -2868:1:974 -2869:1:975 -2870:1:979 -2871:1:980 -2872:1:988 -2873:1:993 -2874:1:997 -2875:1:998 -2876:1:1005 -2877:1:1006 -2878:1:1017 -2879:1:1018 -2880:1:1019 -2881:1:1030 -2882:1:1035 -2883:1:1036 -2884:0:2969 -2885:2:2268 -2886:0:2969 -2887:2:2269 -2888:0:2969 -2889:1:1048 -2890:0:2969 -2891:1:762 -2892:0:2969 -2893:1:955 -2894:0:2969 -2895:1:956 -2896:0:2969 -2897:2:2268 -2898:0:2969 -2899:2:2269 -2900:0:2969 -2901:1:960 -2902:0:2969 -2903:2:2268 -2904:0:2969 -2905:2:2269 -2906:0:2969 -2907:1:961 -2908:1:965 -2909:1:966 -2910:1:974 -2911:1:975 -2912:1:976 -2913:1:988 -2914:1:993 -2915:1:997 -2916:1:998 -2917:1:1005 -2918:1:1006 -2919:1:1017 -2920:1:1018 -2921:1:1019 -2922:1:1030 -2923:1:1035 -2924:1:1036 -2925:0:2969 -2926:2:2268 -2927:0:2969 -2928:2:2269 -2929:0:2969 -2930:1:1048 -2931:0:2969 -2932:1:1052 -2933:0:2969 -2934:2:2268 -2935:0:2969 -2936:2:2269 -2937:0:2969 -2938:1:1057 -2939:1:1061 -2940:1:1062 -2941:1:1070 -2942:1:1079 -2943:1:1080 -2944:1:1084 -2945:1:1089 -2946:1:1093 -2947:1:1094 -2948:1:1101 -2949:1:1102 -2950:1:1113 -2951:1:1114 -2952:1:1117 -2953:1:1118 -2954:1:1126 -2955:1:1131 -2956:1:1132 -2957:0:2969 -2958:1:9 -2959:0:2969 -2960:2:2268 -2961:0:2969 -2962:2:2269 -2963:0:2969 -2964:1:10 -2965:0:2969 -2966:2:2270 -2967:0:2969 -2968:2:2276 -2969:0:2969 -2970:2:2279 -2971:2:2280 -2972:2:2292 -2973:2:2293 -2974:2:2297 -2975:2:2298 -2976:2:2306 -2977:2:2311 -2978:2:2315 -2979:2:2316 -2980:2:2323 -2981:2:2324 -2982:2:2335 -2983:2:2336 -2984:2:2337 -2985:2:2348 -2986:2:2353 -2987:2:2354 -2988:0:2969 -2989:2:2366 -2990:0:2969 -2991:2:2367 -2992:0:2969 -2993:1:13 -2994:0:2969 -2995:2:2368 -2996:0:2969 -2997:1:19 -2998:0:2969 -2999:1:20 -3000:0:2969 -3001:2:2367 -3002:0:2969 -3003:2:2368 -3004:0:2969 -3005:1:21 -3006:1:25 -3007:1:26 -3008:1:34 -3009:1:35 -3010:1:36 -3011:1:48 -3012:1:53 -3013:1:57 -3014:1:58 -3015:1:65 -3016:1:66 -3017:1:77 -3018:1:78 -3019:1:79 -3020:1:90 -3021:1:95 -3022:1:96 -3023:0:2969 -3024:2:2367 -3025:0:2969 -3026:2:2368 -3027:0:2969 -3028:1:108 -3029:0:2969 -3030:2:2367 -3031:0:2969 -3032:2:2368 -3033:0:2969 -3034:1:109 -3035:1:113 -3036:1:114 -3037:1:122 -3038:1:123 -3039:1:127 -3040:1:128 -3041:1:136 -3042:1:141 -3043:1:145 -3044:1:146 -3045:1:153 -3046:1:154 -3047:1:165 -3048:1:166 -3049:1:167 -3050:1:178 -3051:1:183 -3052:1:184 -3053:0:2969 -3054:1:196 -3055:0:2969 -3056:2:2367 -3057:0:2969 -3058:2:2368 -3059:0:2969 -3060:1:197 -3061:0:2969 -3062:2:2367 -3063:0:2969 -3064:2:2368 -3065:0:2969 -3066:1:198 -3067:1:202 -3068:1:203 -3069:1:211 -3070:1:212 -3071:1:216 -3072:1:217 -3073:1:225 -3074:1:230 -3075:1:234 -3076:1:235 -3077:1:242 -3078:1:243 -3079:1:254 -3080:1:255 -3081:1:256 -3082:1:267 -3083:1:272 -3084:1:273 -3085:0:2969 -3086:2:2367 -3087:0:2969 -3088:2:2368 -3089:0:2969 -3090:1:285 -3091:0:2969 -3092:1:486 -3093:0:2969 -3094:1:487 -3095:0:2969 -3096:1:20 -3097:0:2969 -3098:2:2367 -3099:0:2969 -3100:2:2368 -3101:0:2969 -3102:1:21 -3103:1:25 -3104:1:26 -3105:1:34 -3106:1:35 -3107:1:36 -3108:1:48 -3109:1:53 -3110:1:57 -3111:1:58 -3112:1:65 -3113:1:66 -3114:1:77 -3115:1:78 -3116:1:79 -3117:1:90 -3118:1:95 -3119:1:96 -3120:0:2969 -3121:2:2367 -3122:0:2969 -3123:2:2368 -3124:0:2969 -3125:1:108 -3126:0:2969 -3127:2:2367 -3128:0:2969 -3129:2:2368 -3130:0:2969 -3131:1:109 -3132:1:113 -3133:1:114 -3134:1:122 -3135:1:123 -3136:1:127 -3137:1:128 -3138:1:136 -3139:1:141 -3140:1:145 -3141:1:146 -3142:1:153 -3143:1:154 -3144:1:165 -3145:1:166 -3146:1:167 -3147:1:178 -3148:1:183 -3149:1:184 -3150:0:2969 -3151:1:288 -3152:0:2969 -3153:2:2367 -3154:0:2969 -3155:2:2368 -3156:0:2969 -3157:1:289 -3158:0:2969 -3159:1:486 -3160:0:2969 -3161:1:487 -3162:0:2969 -3163:1:492 -3164:0:2969 -3165:2:2367 -3166:0:2969 -3167:2:2368 -3168:0:2969 -3169:1:497 -3170:1:501 -3171:1:502 -3172:1:510 -3173:1:511 -3174:1:512 -3175:1:524 -3176:1:529 -3177:1:533 -3178:1:534 -3179:1:541 -3180:1:542 -3181:1:553 -3182:1:554 -3183:1:555 -3184:1:566 -3185:1:571 -3186:1:572 -3187:0:2969 -3188:2:2367 -3189:0:2969 -3190:2:2368 -3191:0:2969 -3192:1:584 -3193:0:2969 -3194:2:2367 -3195:0:2969 -3196:2:2368 -3197:0:2969 -3198:1:585 -3199:1:589 -3200:1:590 -3201:1:598 -3202:1:599 -3203:1:603 -3204:1:604 -3205:1:612 -3206:1:617 -3207:1:621 -3208:1:622 -3209:1:629 -3210:1:630 -3211:1:641 -3212:1:642 -3213:1:643 -3214:1:654 -3215:1:659 -3216:1:660 -3217:0:2969 -3218:2:2367 -3219:0:2969 -3220:2:2368 -3221:0:2969 -3222:1:672 -3223:0:2969 -3224:2:2367 -3225:0:2969 -3226:2:2368 -3227:0:2969 -3228:1:673 -3229:1:677 -3230:1:678 -3231:1:686 -3232:1:687 -3233:1:691 -3234:1:692 -3235:1:700 -3236:1:705 -3237:1:709 -3238:1:710 -3239:1:717 -3240:1:718 -3241:1:729 -3242:1:730 -3243:1:731 -3244:1:742 -3245:1:747 -3246:1:748 -3247:0:2969 -3248:2:2367 -3249:0:2969 -3250:2:2368 -3251:0:2969 -3252:1:760 -3253:0:2969 -3254:1:761 -3255:0:2969 -3256:1:762 -3257:0:2969 -3258:1:955 -3259:0:2969 -3260:1:956 -3261:0:2969 -3262:2:2367 -3263:0:2969 -3264:2:2368 -3265:0:2969 -3266:1:960 -3267:0:2969 -3268:2:2367 -3269:0:2969 -3270:2:2368 -3271:0:2969 -3272:1:961 -3273:1:965 -3274:1:966 -3275:1:974 -3276:1:975 -3277:1:979 -3278:1:980 -3279:1:988 -3280:1:993 -3281:1:997 -3282:1:998 -3283:1:1005 -3284:1:1006 -3285:1:1017 -3286:1:1018 -3287:1:1019 -3288:1:1030 -3289:1:1035 -3290:1:1036 -3291:0:2969 -3292:2:2367 -3293:0:2969 -3294:2:2368 -3295:0:2969 -3296:1:1048 -3297:0:2969 -3298:1:762 -3299:0:2969 -3300:1:955 -3301:0:2969 -3302:1:956 -3303:0:2969 -3304:2:2367 -3305:0:2969 -3306:2:2368 -3307:0:2969 -3308:1:960 -3309:0:2969 -3310:2:2367 -3311:0:2969 -3312:2:2368 -3313:0:2969 -3314:1:961 -3315:1:965 -3316:1:966 -3317:1:974 -3318:1:975 -3319:1:976 -3320:1:988 -3321:1:993 -3322:1:997 -3323:1:998 -3324:1:1005 -3325:1:1006 -3326:1:1017 -3327:1:1018 -3328:1:1019 -3329:1:1030 -3330:1:1035 -3331:1:1036 -3332:0:2969 -3333:2:2367 -3334:0:2969 -3335:2:2368 -3336:0:2969 -3337:1:1048 -3338:0:2969 -3339:1:1052 -3340:0:2969 -3341:2:2367 -3342:0:2969 -3343:2:2368 -3344:0:2969 -3345:1:1057 -3346:1:1061 -3347:1:1062 -3348:1:1070 -3349:1:1071 -3350:1:1072 -3351:1:1084 -3352:1:1089 -3353:1:1093 -3354:1:1094 -3355:1:1101 -3356:1:1102 -3357:1:1113 -3358:1:1114 -3359:1:1115 -3360:1:1126 -3361:1:1131 -3362:1:1132 -3363:0:2969 -3364:1:9 -3365:0:2969 -3366:2:2367 -3367:0:2969 -3368:2:2368 -3369:0:2969 -3370:1:10 -3371:0:2969 -3372:2:2369 -3373:0:2969 -3374:2:2375 -3375:0:2969 -3376:2:2376 -3377:0:2969 -3378:2:2377 -3379:0:2969 -3380:2:2378 -3381:0:2969 -3382:2:2379 -3383:2:2383 -3384:2:2384 -3385:2:2392 -3386:2:2393 -3387:2:2397 -3388:2:2398 -3389:2:2406 -3390:2:2411 -3391:2:2415 -3392:2:2416 -3393:2:2423 -3394:2:2424 -3395:2:2435 -3396:2:2443 -3397:2:2444 -3398:2:2448 -3399:2:2453 -3400:2:2454 -3401:0:2969 -3402:2:2466 -3403:0:2969 -3404:2:2467 -3405:0:2969 -3406:1:13 --1:-1:-1 -3407:0:2969 -3408:2:2468 -3409:0:2969 -3410:1:19 -3411:0:2969 -3412:1:20 -3413:0:2969 -3414:2:2467 -3415:0:2969 -3416:2:2468 -3417:0:2969 -3418:1:21 -3419:1:25 -3420:1:26 -3421:1:34 -3422:1:35 -3423:1:39 -3424:1:40 -3425:1:48 -3426:1:53 -3427:1:57 -3428:1:58 -3429:1:65 -3430:1:66 -3431:1:77 -3432:1:78 -3433:1:79 -3434:1:90 -3435:1:95 -3436:1:96 -3437:0:2969 -3438:2:2467 -3439:0:2969 -3440:2:2468 -3441:0:2969 -3442:1:108 -3443:0:2969 -3444:2:2467 -3445:0:2969 -3446:2:2468 -3447:0:2969 -3448:1:109 -3449:1:113 -3450:1:114 -3451:1:122 -3452:1:123 -3453:1:127 -3454:1:128 -3455:1:136 -3456:1:141 -3457:1:145 -3458:1:146 -3459:1:153 -3460:1:154 -3461:1:165 -3462:1:166 -3463:1:167 -3464:1:178 -3465:1:183 -3466:1:184 -3467:0:2969 -3468:1:196 -3469:0:2969 -3470:2:2467 -3471:0:2969 -3472:2:2468 -3473:0:2969 -3474:1:197 -3475:0:2969 -3476:2:2467 -3477:0:2969 -3478:2:2468 -3479:0:2969 -3480:1:198 -3481:1:202 -3482:1:203 -3483:1:211 -3484:1:212 -3485:1:216 -3486:1:217 -3487:1:225 -3488:1:230 -3489:1:234 -3490:1:235 -3491:1:242 -3492:1:243 -3493:1:254 -3494:1:255 -3495:1:256 -3496:1:267 -3497:1:272 -3498:1:273 -3499:0:2969 -3500:2:2467 -3501:0:2969 -3502:2:2468 -3503:0:2969 -3504:1:285 -3505:0:2969 -3506:1:486 -3507:0:2969 -3508:1:487 -3509:0:2969 -3510:1:20 -3511:0:2969 -3512:2:2467 -3513:0:2969 -3514:2:2468 -3515:0:2969 -3516:1:21 -3517:1:25 -3518:1:26 -3519:1:34 -3520:1:35 -3521:1:36 -3522:1:48 -3523:1:53 -3524:1:57 -3525:1:58 -3526:1:65 -3527:1:66 -3528:1:77 -3529:1:78 -3530:1:79 -3531:1:90 -3532:1:95 -3533:1:96 -3534:0:2969 -3535:2:2467 -3536:0:2969 -3537:2:2468 -3538:0:2969 -3539:1:108 -3540:0:2969 -3541:2:2467 -3542:0:2969 -3543:2:2468 -3544:0:2969 -3545:1:109 -3546:1:113 -3547:1:114 -3548:1:122 -3549:1:123 -3550:1:127 -3551:1:128 -3552:1:136 -3553:1:141 -3554:1:145 -3555:1:146 -3556:1:153 -3557:1:154 -3558:1:165 -3559:1:166 -3560:1:167 -3561:1:178 -3562:1:183 -3563:1:184 -3564:0:2969 -3565:1:288 -3566:0:2969 -3567:2:2467 -3568:0:2969 -3569:2:2468 -3570:0:2969 -3571:1:289 -3572:0:2969 -3573:1:486 -3574:0:2969 -3575:1:487 -3576:0:2969 -3577:1:492 -3578:0:2969 -3579:2:2467 -3580:0:2969 -3581:2:2468 -3582:0:2969 -3583:1:497 -3584:1:501 -3585:1:502 -3586:1:510 -3587:1:511 -3588:1:512 -3589:1:524 -3590:1:529 -3591:1:533 -3592:1:534 -3593:1:541 -3594:1:542 -3595:1:553 -3596:1:554 -3597:1:555 -3598:1:566 -3599:1:571 -3600:1:572 -3601:0:2969 -3602:2:2467 -3603:0:2969 -3604:2:2468 -3605:0:2969 -3606:1:584 -3607:0:2969 -3608:2:2467 -3609:0:2969 -3610:2:2468 -3611:0:2969 -3612:1:585 -3613:1:589 -3614:1:590 -3615:1:598 -3616:1:599 -3617:1:603 -3618:1:604 -3619:1:612 -3620:1:617 -3621:1:621 -3622:1:622 -3623:1:629 -3624:1:630 -3625:1:641 -3626:1:642 -3627:1:643 -3628:1:654 -3629:1:659 -3630:1:660 -3631:0:2969 -3632:2:2467 -3633:0:2969 -3634:2:2468 -3635:0:2969 -3636:1:672 -3637:0:2969 -3638:2:2467 -3639:0:2969 -3640:2:2468 -3641:0:2969 -3642:1:673 -3643:1:677 -3644:1:678 -3645:1:686 -3646:1:687 -3647:1:691 -3648:1:692 -3649:1:700 -3650:1:705 -3651:1:709 -3652:1:710 -3653:1:717 -3654:1:718 -3655:1:729 -3656:1:730 -3657:1:731 -3658:1:742 -3659:1:747 -3660:1:748 -3661:0:2969 -3662:2:2467 -3663:0:2969 -3664:2:2468 -3665:0:2969 -3666:1:760 -3667:0:2969 -3668:1:761 -3669:0:2969 -3670:1:762 -3671:0:2969 -3672:1:955 -3673:0:2969 -3674:1:956 -3675:0:2969 -3676:2:2467 -3677:0:2969 -3678:2:2468 -3679:0:2969 -3680:1:960 -3681:0:2969 -3682:2:2467 -3683:0:2969 -3684:2:2468 -3685:0:2969 -3686:1:961 -3687:1:965 -3688:1:966 -3689:1:974 -3690:1:975 -3691:1:979 -3692:1:980 -3693:1:988 -3694:1:993 -3695:1:997 -3696:1:998 -3697:1:1005 -3698:1:1006 -3699:1:1017 -3700:1:1018 -3701:1:1019 -3702:1:1030 -3703:1:1035 -3704:1:1036 -3705:0:2969 -3706:2:2467 -3707:0:2969 -3708:2:2468 -3709:0:2969 -3710:1:1048 -3711:0:2969 -3712:1:762 -3713:0:2969 -3714:1:955 -3715:0:2969 -3716:1:956 -3717:0:2969 -3718:2:2467 -3719:0:2969 -3720:2:2468 -3721:0:2969 -3722:1:960 -3723:0:2969 -3724:2:2467 -3725:0:2969 -3726:2:2468 -3727:0:2969 -3728:1:961 -3729:1:965 -3730:1:966 -3731:1:974 -3732:1:975 -3733:1:976 -3734:1:988 -3735:1:993 -3736:1:997 -3737:1:998 -3738:1:1005 -3739:1:1006 -3740:1:1017 -3741:1:1018 -3742:1:1019 -3743:1:1030 -3744:1:1035 -3745:1:1036 -3746:0:2969 -3747:2:2467 -3748:0:2969 -3749:2:2468 -3750:0:2969 -3751:1:1048 -3752:0:2969 -3753:1:1052 -3754:0:2969 -3755:2:2467 -3756:0:2969 -3757:2:2468 -3758:0:2969 -3759:1:1057 -3760:1:1061 -3761:1:1062 -3762:1:1070 -3763:1:1071 -3764:1:1072 -3765:1:1084 -3766:1:1089 -3767:1:1093 -3768:1:1094 -3769:1:1101 -3770:1:1102 -3771:1:1113 -3772:1:1114 -3773:1:1115 -3774:1:1126 -3775:1:1131 -3776:1:1132 -3777:0:2969 -3778:1:9 -3779:0:2969 -3780:2:2467 -3781:0:2969 -3782:2:2468 -3783:0:2969 -3784:1:10 -3785:0:2969 -3786:2:2469 -3787:0:2969 -3788:2:2475 -3789:0:2969 -3790:2:2476 -3791:2:2480 -3792:2:2481 -3793:2:2489 -3794:2:2490 -3795:2:2494 -3796:2:2495 -3797:2:2503 -3798:2:2508 -3799:2:2512 -3800:2:2513 -3801:2:2520 -3802:2:2521 -3803:2:2532 -3804:2:2540 -3805:2:2541 -3806:2:2545 -3807:2:2550 -3808:2:2551 -3809:0:2969 -3810:2:2563 -3811:0:2969 -3812:2:2564 -3813:0:2969 -3814:1:13 -3815:0:2969 -3816:2:2565 -3817:0:2969 -3818:1:19 -3819:0:2969 -3820:1:20 -3821:0:2969 -3822:2:2564 -3823:0:2969 -3824:2:2565 -3825:0:2969 -3826:1:21 -3827:1:25 -3828:1:26 -3829:1:34 -3830:1:35 -3831:1:39 -3832:1:40 -3833:1:48 -3834:1:53 -3835:1:57 -3836:1:58 -3837:1:65 -3838:1:66 -3839:1:77 -3840:1:78 -3841:1:79 -3842:1:90 -3843:1:95 -3844:1:96 -3845:0:2969 -3846:2:2564 -3847:0:2969 -3848:2:2565 -3849:0:2969 -3850:1:108 -3851:0:2969 -3852:2:2564 -3853:0:2969 -3854:2:2565 -3855:0:2969 -3856:1:109 -3857:1:113 -3858:1:114 -3859:1:122 -3860:1:123 -3861:1:127 -3862:1:128 -3863:1:136 -3864:1:141 -3865:1:145 -3866:1:146 -3867:1:153 -3868:1:154 -3869:1:165 -3870:1:166 -3871:1:167 -3872:1:178 -3873:1:183 -3874:1:184 -3875:0:2969 -3876:1:196 -3877:0:2969 -3878:2:2564 -3879:0:2969 -3880:2:2565 -3881:0:2969 -3882:1:197 -3883:0:2969 -3884:2:2564 -3885:0:2969 -3886:2:2565 -3887:0:2969 -3888:1:198 -3889:1:202 -3890:1:203 -3891:1:211 -3892:1:212 -3893:1:216 -3894:1:217 -3895:1:225 -3896:1:230 -3897:1:234 -3898:1:235 -3899:1:242 -3900:1:243 -3901:1:254 -3902:1:255 -3903:1:256 -3904:1:267 -3905:1:272 -3906:1:273 -3907:0:2969 -3908:2:2564 -3909:0:2969 -3910:2:2565 -3911:0:2969 -3912:1:285 -3913:0:2969 -3914:1:486 -3915:0:2969 -3916:1:487 -3917:0:2969 -3918:1:20 -3919:0:2969 -3920:2:2564 -3921:0:2969 -3922:2:2565 -3923:0:2969 -3924:1:21 -3925:1:25 -3926:1:26 -3927:1:34 -3928:1:35 -3929:1:36 -3930:1:48 -3931:1:53 -3932:1:57 -3933:1:58 -3934:1:65 -3935:1:66 -3936:1:77 -3937:1:78 -3938:1:79 -3939:1:90 -3940:1:95 -3941:1:96 -3942:0:2969 -3943:2:2564 -3944:0:2969 -3945:2:2565 -3946:0:2969 -3947:1:108 -3948:0:2969 -3949:2:2564 -3950:0:2969 -3951:2:2565 -3952:0:2969 -3953:1:109 -3954:1:113 -3955:1:114 -3956:1:122 -3957:1:123 -3958:1:127 -3959:1:128 -3960:1:136 -3961:1:141 -3962:1:145 -3963:1:146 -3964:1:153 -3965:1:154 -3966:1:165 -3967:1:166 -3968:1:167 -3969:1:178 -3970:1:183 -3971:1:184 -3972:0:2969 -3973:1:288 -3974:0:2969 -3975:2:2564 -3976:0:2969 -3977:2:2565 -3978:0:2969 -3979:1:289 -3980:0:2969 -3981:1:486 -3982:0:2969 -3983:1:487 -3984:0:2969 -3985:1:492 -3986:0:2969 -3987:2:2564 -3988:0:2969 -3989:2:2565 -3990:0:2969 -3991:1:497 -3992:1:501 -3993:1:502 -3994:1:510 -3995:1:511 -3996:1:512 -3997:1:524 -3998:1:529 -3999:1:533 -4000:1:534 -4001:1:541 -4002:1:542 -4003:1:553 -4004:1:554 -4005:1:555 -4006:1:566 -4007:1:571 -4008:1:572 -4009:0:2969 -4010:2:2564 -4011:0:2969 -4012:2:2565 -4013:0:2969 -4014:1:584 -4015:0:2969 -4016:2:2564 -4017:0:2969 -4018:2:2565 -4019:0:2969 -4020:1:585 -4021:1:589 -4022:1:590 -4023:1:598 -4024:1:599 -4025:1:603 -4026:1:604 -4027:1:612 -4028:1:617 -4029:1:621 -4030:1:622 -4031:1:629 -4032:1:630 -4033:1:641 -4034:1:642 -4035:1:643 -4036:1:654 -4037:1:659 -4038:1:660 -4039:0:2969 -4040:2:2564 -4041:0:2969 -4042:2:2565 -4043:0:2969 -4044:1:672 -4045:0:2969 -4046:2:2564 -4047:0:2969 -4048:2:2565 -4049:0:2969 -4050:1:673 -4051:1:677 -4052:1:678 -4053:1:686 -4054:1:687 -4055:1:691 -4056:1:692 -4057:1:700 -4058:1:705 -4059:1:709 -4060:1:710 -4061:1:717 -4062:1:718 -4063:1:729 -4064:1:730 -4065:1:731 -4066:1:742 -4067:1:747 -4068:1:748 -4069:0:2969 -4070:2:2564 -4071:0:2969 -4072:2:2565 -4073:0:2969 -4074:1:760 -4075:0:2969 -4076:1:761 -4077:0:2969 -4078:1:762 -4079:0:2969 -4080:1:955 -4081:0:2969 -4082:1:956 -4083:0:2969 -4084:2:2564 -4085:0:2969 -4086:2:2565 -4087:0:2969 -4088:1:960 -4089:0:2969 -4090:2:2564 -4091:0:2969 -4092:2:2565 -4093:0:2969 -4094:1:961 -4095:1:965 -4096:1:966 -4097:1:974 -4098:1:975 -4099:1:979 -4100:1:980 -4101:1:988 -4102:1:993 -4103:1:997 -4104:1:998 -4105:1:1005 -4106:1:1006 -4107:1:1017 -4108:1:1018 -4109:1:1019 -4110:1:1030 -4111:1:1035 -4112:1:1036 -4113:0:2969 -4114:2:2564 -4115:0:2969 -4116:2:2565 -4117:0:2969 -4118:1:1048 -4119:0:2969 -4120:1:762 -4121:0:2969 -4122:1:955 -4123:0:2969 -4124:1:956 -4125:0:2969 -4126:2:2564 -4127:0:2969 -4128:2:2565 -4129:0:2969 -4130:1:960 -4131:0:2969 -4132:2:2564 -4133:0:2969 -4134:2:2565 -4135:0:2969 -4136:1:961 -4137:1:965 -4138:1:966 -4139:1:974 -4140:1:975 -4141:1:976 -4142:1:988 -4143:1:993 -4144:1:997 -4145:1:998 -4146:1:1005 -4147:1:1006 -4148:1:1017 -4149:1:1018 -4150:1:1019 -4151:1:1030 -4152:1:1035 -4153:1:1036 -4154:0:2969 -4155:2:2564 -4156:0:2969 -4157:2:2565 -4158:0:2969 -4159:1:1048 -4160:0:2969 -4161:1:1052 -4162:0:2969 -4163:2:2564 -4164:0:2969 -4165:2:2565 -4166:0:2969 -4167:1:1057 -4168:1:1061 -4169:1:1062 -4170:1:1070 -4171:1:1071 -4172:1:1072 -4173:1:1084 -4174:1:1089 -4175:1:1093 -4176:1:1094 -4177:1:1101 -4178:1:1102 -4179:1:1113 -4180:1:1114 -4181:1:1115 -4182:1:1126 -4183:1:1131 -4184:1:1132 -4185:0:2969 -4186:1:9 -4187:0:2969 -4188:2:2564 -4189:0:2969 -4190:2:2565 -4191:0:2969 -4192:1:10 -4193:0:2969 -4194:2:2566 -4195:0:2969 -4196:1:11 -4197:0:2969 -4198:2:2377 -4199:0:2969 -4200:1:12 -4201:0:2969 -4202:2:2378 -4203:0:2969 -4204:2:2379 -4205:2:2383 -4206:2:2384 -4207:2:2392 -4208:2:2393 -4209:2:2397 -4210:2:2398 -4211:2:2406 -4212:2:2411 -4213:2:2415 -4214:2:2416 -4215:2:2423 -4216:2:2424 -4217:2:2435 -4218:2:2443 -4219:2:2444 -4220:2:2448 -4221:2:2453 -4222:2:2454 -4223:0:2969 -4224:2:2466 -4225:0:2969 -4226:2:2467 -4227:0:2969 -4228:1:13 diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/DEFINES b/formal-model/urcu-nosched-model/result-standard-execution-nest/DEFINES deleted file mode 100644 index 150a83c..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/DEFINES +++ /dev/null @@ -1,17 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -//#define READER_NEST_LEVEL 1 -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/Makefile b/formal-model/urcu-nosched-model/result-standard-execution-nest/Makefile deleted file mode 100644 index 8af320d..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/Makefile +++ /dev/null @@ -1,172 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - #nested useless with signal test. - #make urcu_free_nested | tee urcu_free_nested.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/asserts.log b/formal-model/urcu-nosched-model/result-standard-execution-nest/asserts.log deleted file mode 100644 index 51f1ac0..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/asserts.log +++ /dev/null @@ -1,250 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -cat DEFINES > .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w20 -Depth= 3212 States= 1e+06 Transitions= 1.17e+07 Memory= 519.572 t= 7.66 R= 1e+05 -Depth= 3212 States= 2e+06 Transitions= 2.38e+07 Memory= 572.990 t= 16 R= 1e+05 -Depth= 3212 States= 3e+06 Transitions= 3.62e+07 Memory= 626.408 t= 24.9 R= 1e+05 -pan: resizing hashtable to -w22.. done - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim - (none specified) - assertion violations + - cycle checks - (disabled by -DSAFETY) - invalid end states + - -State-vector 48 byte, depth reached 3212, errors: 0 - 3539988 states, stored - 39085459 states, matched - 42625447 transitions (= stored+matched) -1.5602888e+08 atomic steps -hash conflicts: 28971442 (resolved) - -Stats on memory usage (in Megabytes): - 256.576 equivalent memory usage for states (stored*(State-vector + overhead)) - 196.718 actual memory usage for states (compression: 76.67%) - state-vector as stored = 30 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 686.338 total actual memory usage - -unreached in proctype urcu_reader - line 398, ".input.spin", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 61, "(1)" - line 417, ".input.spin", state 91, "(1)" - line 398, ".input.spin", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 151, "(1)" - line 417, ".input.spin", state 181, "(1)" - line 398, ".input.spin", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 242, "(1)" - line 417, ".input.spin", state 272, "(1)" - line 398, ".input.spin", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 360, "(1)" - line 417, ".input.spin", state 390, "(1)" - line 539, ".input.spin", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 398, ".input.spin", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 402, ".input.spin", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 59, "(1)" - line 412, ".input.spin", state 72, "(1)" - line 417, ".input.spin", state 89, "(1)" - line 398, ".input.spin", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 402, ".input.spin", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 153, "(1)" - line 412, ".input.spin", state 166, "(1)" - line 651, ".input.spin", state 199, "(1)" - line 174, ".input.spin", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 178, ".input.spin", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 159, ".input.spin", state 240, "(1)" - line 163, ".input.spin", state 248, "(1)" - line 167, ".input.spin", state 260, "(1)" - line 174, ".input.spin", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 407, ".input.spin", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 927, "(1)" - line 408, ".input.spin", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 408, ".input.spin", state 928, "else" - line 408, ".input.spin", state 931, "(1)" - line 408, ".input.spin", state 932, "(1)" - line 408, ".input.spin", state 932, "(1)" - line 412, ".input.spin", state 940, "(1)" - line 412, ".input.spin", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 412, ".input.spin", state 941, "else" - line 412, ".input.spin", state 944, "(1)" - line 412, ".input.spin", state 945, "(1)" - line 412, ".input.spin", state 945, "(1)" - line 410, ".input.spin", state 950, "((i<1))" - line 410, ".input.spin", state 950, "((i>=1))" - line 417, ".input.spin", state 957, "(1)" - line 417, ".input.spin", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 417, ".input.spin", state 958, "else" - line 417, ".input.spin", state 961, "(1)" - line 417, ".input.spin", state 962, "(1)" - line 417, ".input.spin", state 962, "(1)" - line 419, ".input.spin", state 965, "(1)" - line 419, ".input.spin", state 965, "(1)" - line 402, ".input.spin", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, ".input.spin", state 1040, "(1)" - line 417, ".input.spin", state 1057, "(1)" - line 402, ".input.spin", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, ".input.spin", state 1130, "(1)" - line 417, ".input.spin", state 1147, "(1)" - line 398, ".input.spin", state 1166, "(1)" - line 402, ".input.spin", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, ".input.spin", state 1222, "(1)" - line 417, ".input.spin", state 1239, "(1)" - line 402, ".input.spin", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, ".input.spin", state 1315, "(1)" - line 417, ".input.spin", state 1332, "(1)" - line 178, ".input.spin", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 182, ".input.spin", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 159, ".input.spin", state 1378, "(1)" - line 163, ".input.spin", state 1386, "(1)" - line 167, ".input.spin", state 1398, "(1)" - line 174, ".input.spin", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 407, ".input.spin", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 1595, "(1)" - line 408, ".input.spin", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 408, ".input.spin", state 1596, "else" - line 408, ".input.spin", state 1599, "(1)" - line 408, ".input.spin", state 1600, "(1)" - line 408, ".input.spin", state 1600, "(1)" - line 412, ".input.spin", state 1608, "(1)" - line 412, ".input.spin", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 412, ".input.spin", state 1609, "else" - line 412, ".input.spin", state 1612, "(1)" - line 412, ".input.spin", state 1613, "(1)" - line 412, ".input.spin", state 1613, "(1)" - line 410, ".input.spin", state 1618, "((i<1))" - line 410, ".input.spin", state 1618, "((i>=1))" - line 417, ".input.spin", state 1625, "(1)" - line 417, ".input.spin", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 417, ".input.spin", state 1626, "else" - line 417, ".input.spin", state 1629, "(1)" - line 417, ".input.spin", state 1630, "(1)" - line 417, ".input.spin", state 1630, "(1)" - line 419, ".input.spin", state 1633, "(1)" - line 419, ".input.spin", state 1633, "(1)" - line 178, ".input.spin", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 182, ".input.spin", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 159, ".input.spin", state 1681, "(1)" - line 163, ".input.spin", state 1689, "(1)" - line 167, ".input.spin", state 1701, "(1)" - line 174, ".input.spin", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/asserts.spin.input.trail b/formal-model/urcu-nosched-model/result-standard-execution-nest/asserts.spin.input.trail deleted file mode 100644 index 287e52a..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/asserts.spin.input.trail +++ /dev/null @@ -1,6 +0,0 @@ --4:-4:-4 -1:0:2673 -2:0:2674 -3:0:2675 -4:0:2676 -5:4:1129 diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/references.txt b/formal-model/urcu-nosched-model/result-standard-execution-nest/references.txt deleted file mode 100644 index 72c67a2..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/references.txt +++ /dev/null @@ -1,13 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html - -LTL vs CTL : - -http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 -http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf - (downloaded) diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu.sh b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu.spin b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu.spin deleted file mode 100644 index 2cfcb70..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu.spin +++ /dev/null @@ -1,705 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free.log b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free.log deleted file mode 100644 index 884b15e..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free.log +++ /dev/null @@ -1,262 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 743) -Depth= 3880 States= 1e+06 Transitions= 1.18e+07 Memory= 527.190 t= 9.53 R= 1e+05 -Depth= 3880 States= 2e+06 Transitions= 2.39e+07 Memory= 588.225 t= 19.8 R= 1e+05 -Depth= 3880 States= 3e+06 Transitions= 3.61e+07 Memory= 649.260 t= 30.5 R= 1e+05 -pan: resizing hashtable to -w22.. done -Depth= 3880 States= 4e+06 Transitions= 4.84e+07 Memory= 741.318 t= 41.1 R= 1e+05 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 3880, errors: 0 - 4015564 states, stored - 44539121 states, matched - 48554685 transitions (= stored+matched) -1.7777933e+08 atomic steps -hash conflicts: 33629695 (resolved) - -Stats on memory usage (in Megabytes): - 321.681 equivalent memory usage for states (stored*(State-vector + overhead)) - 252.629 actual memory usage for states (compression: 78.53%) - state-vector as stored = 38 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 742.295 total actual memory usage - -unreached in proctype urcu_reader - line 398, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 61, "(1)" - line 417, "pan.___", state 91, "(1)" - line 398, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 151, "(1)" - line 417, "pan.___", state 181, "(1)" - line 398, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 242, "(1)" - line 417, "pan.___", state 272, "(1)" - line 398, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 360, "(1)" - line 417, "pan.___", state 390, "(1)" - line 539, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 402, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 59, "(1)" - line 412, "pan.___", state 72, "(1)" - line 417, "pan.___", state 89, "(1)" - line 398, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 402, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 153, "(1)" - line 412, "pan.___", state 166, "(1)" - line 651, "pan.___", state 199, "(1)" - line 174, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 178, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 240, "(1)" - line 163, "pan.___", state 248, "(1)" - line 167, "pan.___", state 260, "(1)" - line 174, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 407, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 927, "(1)" - line 408, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 408, "pan.___", state 928, "else" - line 408, "pan.___", state 931, "(1)" - line 408, "pan.___", state 932, "(1)" - line 408, "pan.___", state 932, "(1)" - line 412, "pan.___", state 940, "(1)" - line 412, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 412, "pan.___", state 941, "else" - line 412, "pan.___", state 944, "(1)" - line 412, "pan.___", state 945, "(1)" - line 412, "pan.___", state 945, "(1)" - line 410, "pan.___", state 950, "((i<1))" - line 410, "pan.___", state 950, "((i>=1))" - line 417, "pan.___", state 957, "(1)" - line 417, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 417, "pan.___", state 958, "else" - line 417, "pan.___", state 961, "(1)" - line 417, "pan.___", state 962, "(1)" - line 417, "pan.___", state 962, "(1)" - line 419, "pan.___", state 965, "(1)" - line 419, "pan.___", state 965, "(1)" - line 402, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 1040, "(1)" - line 417, "pan.___", state 1057, "(1)" - line 402, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 1130, "(1)" - line 417, "pan.___", state 1147, "(1)" - line 398, "pan.___", state 1166, "(1)" - line 402, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 1222, "(1)" - line 417, "pan.___", state 1239, "(1)" - line 402, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 1315, "(1)" - line 417, "pan.___", state 1332, "(1)" - line 178, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 182, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 1378, "(1)" - line 163, "pan.___", state 1386, "(1)" - line 167, "pan.___", state 1398, "(1)" - line 174, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 407, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1595, "(1)" - line 408, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 408, "pan.___", state 1596, "else" - line 408, "pan.___", state 1599, "(1)" - line 408, "pan.___", state 1600, "(1)" - line 408, "pan.___", state 1600, "(1)" - line 412, "pan.___", state 1608, "(1)" - line 412, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 412, "pan.___", state 1609, "else" - line 412, "pan.___", state 1612, "(1)" - line 412, "pan.___", state 1613, "(1)" - line 412, "pan.___", state 1613, "(1)" - line 410, "pan.___", state 1618, "((i<1))" - line 410, "pan.___", state 1618, "((i>=1))" - line 417, "pan.___", state 1625, "(1)" - line 417, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 417, "pan.___", state 1626, "else" - line 417, "pan.___", state 1629, "(1)" - line 417, "pan.___", state 1630, "(1)" - line 417, "pan.___", state 1630, "(1)" - line 419, "pan.___", state 1633, "(1)" - line 419, "pan.___", state 1633, "(1)" - line 178, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 182, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 1681, "(1)" - line 163, "pan.___", state 1689, "(1)" - line 167, "pan.___", state 1701, "(1)" - line 174, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< !read_free_race) diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free.spin.input b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free.spin.input deleted file mode 100644 index f2f00e4..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free.spin.input +++ /dev/null @@ -1,722 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -//#define READER_NEST_LEVEL 1 -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free.spin.input.trail b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free.spin.input.trail deleted file mode 100644 index 837f3d9..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free.spin.input.trail +++ /dev/null @@ -1,15043 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4365 -2:4:4317 -3:4:4320 -4:4:4320 -5:4:4320 -6:4:4323 -7:4:4331 -8:4:4331 -9:4:4331 -10:4:4334 -11:4:4340 -12:4:4344 -13:4:4344 -14:4:4344 -15:4:4347 -16:4:4340 -17:4:4344 -18:4:4344 -19:4:4344 -20:4:4347 -21:4:4355 -22:4:4359 -23:4:4360 -24:0:4365 -25:4:4362 -26:0:4365 -27:3:2331 -28:0:4365 -29:3:2337 -30:0:4365 -31:3:2338 -32:0:4365 -33:3:2339 -34:3:2343 -35:3:2344 -36:3:2352 -37:3:2353 -38:3:2357 -39:3:2358 -40:3:2352 -41:3:2353 -42:3:2357 -43:3:2358 -44:3:2366 -45:3:2371 -46:3:2375 -47:3:2376 -48:3:2383 -49:3:2384 -50:3:2395 -51:3:2396 -52:3:2397 -53:3:2395 -54:3:2396 -55:3:2397 -56:3:2408 -57:3:2413 -58:3:2414 -59:0:4365 -60:3:2426 -61:0:4365 -62:3:2427 -63:0:4365 -64:2:1162 -65:0:4365 -66:3:2428 -67:0:4365 -68:2:1168 -69:0:4365 -70:2:1169 -71:0:4365 -72:3:2427 -73:0:4365 -74:2:1170 -75:0:4365 -76:3:2428 -77:0:4365 -78:3:2429 -79:0:4365 -80:3:2435 -81:3:2436 -82:0:4365 -83:3:2440 -84:3:2444 -85:3:2445 -86:3:2453 -87:3:2454 -88:3:2458 -89:3:2459 -90:3:2453 -91:3:2454 -92:3:2458 -93:3:2459 -94:3:2467 -95:3:2472 -96:3:2473 -97:3:2484 -98:3:2485 -99:3:2496 -100:3:2497 -101:3:2498 -102:3:2496 -103:3:2497 -104:3:2498 -105:3:2509 -106:3:2514 -107:3:2515 -108:0:4365 -109:3:2527 -110:0:4365 -111:3:2528 -112:0:4365 -113:2:1173 -114:0:4365 -115:3:2529 -116:0:4365 -117:2:1179 -118:0:4365 -119:2:1180 -120:0:4365 -121:3:2528 -122:0:4365 -123:2:1181 -124:2:1185 -125:2:1186 -126:2:1194 -127:2:1195 -128:2:1199 -129:2:1200 -130:2:1194 -131:2:1195 -132:2:1199 -133:2:1200 -134:2:1208 -135:2:1213 -136:2:1217 -137:2:1218 -138:2:1225 -139:2:1226 -140:2:1237 -141:2:1238 -142:2:1239 -143:2:1237 -144:2:1238 -145:2:1239 -146:2:1250 -147:2:1255 -148:2:1256 -149:0:4365 -150:3:2529 -151:0:4365 -152:2:1268 -153:0:4365 -154:3:2528 -155:0:4365 -156:2:1270 -157:0:4365 -158:3:2529 -159:0:4365 -160:2:1271 -161:2:1275 -162:2:1276 -163:2:1284 -164:2:1285 -165:2:1289 -166:2:1290 -167:2:1284 -168:2:1285 -169:2:1289 -170:2:1290 -171:2:1298 -172:2:1303 -173:2:1307 -174:2:1308 -175:2:1315 -176:2:1316 -177:2:1327 -178:2:1328 -179:2:1329 -180:2:1327 -181:2:1328 -182:2:1329 -183:2:1340 -184:2:1345 -185:2:1346 -186:0:4365 -187:2:1358 -188:0:4365 -189:2:1360 -190:0:4365 -191:3:2528 -192:0:4365 -193:2:1361 -194:0:4365 -195:3:2529 -196:0:4365 -197:2:1362 -198:2:1366 -199:2:1367 -200:2:1375 -201:2:1376 -202:2:1380 -203:2:1381 -204:2:1375 -205:2:1376 -206:2:1380 -207:2:1381 -208:2:1389 -209:2:1394 -210:2:1398 -211:2:1399 -212:2:1406 -213:2:1407 -214:2:1418 -215:2:1419 -216:2:1420 -217:2:1418 -218:2:1419 -219:2:1420 -220:2:1431 -221:2:1436 -222:2:1437 -223:0:4365 -224:2:1449 -225:0:4365 -226:3:2528 -227:0:4365 -228:2:1451 -229:0:4365 -230:3:2529 -231:0:4365 -232:2:1652 -233:0:4365 -234:2:1653 -235:0:4365 -236:2:1657 -237:0:4365 -238:2:1180 -239:0:4365 -240:3:2528 -241:0:4365 -242:2:1181 -243:2:1185 -244:2:1186 -245:2:1194 -246:2:1195 -247:2:1199 -248:2:1200 -249:2:1194 -250:2:1195 -251:2:1196 -252:2:1208 -253:2:1213 -254:2:1217 -255:2:1218 -256:2:1225 -257:2:1226 -258:2:1237 -259:2:1238 -260:2:1239 -261:2:1237 -262:2:1238 -263:2:1239 -264:2:1250 -265:2:1255 -266:2:1256 -267:0:4365 -268:3:2529 -269:0:4365 -270:2:1268 -271:0:4365 -272:3:2528 -273:0:4365 -274:2:1270 -275:0:4365 -276:3:2529 -277:0:4365 -278:2:1271 -279:2:1275 -280:2:1276 -281:2:1284 -282:2:1285 -283:2:1289 -284:2:1290 -285:2:1284 -286:2:1285 -287:2:1289 -288:2:1290 -289:2:1298 -290:2:1303 -291:2:1307 -292:2:1308 -293:2:1315 -294:2:1316 -295:2:1327 -296:2:1328 -297:2:1329 -298:2:1327 -299:2:1328 -300:2:1329 -301:2:1340 -302:2:1345 -303:2:1346 -304:0:4365 -305:2:1358 -306:0:4365 -307:2:1454 -308:0:4365 -309:3:2528 -310:0:4365 -311:2:1455 -312:0:4365 -313:3:2529 -314:0:4365 -315:2:1652 -316:0:4365 -317:2:1653 -318:0:4365 -319:2:1657 -320:0:4365 -321:2:1660 -322:0:4365 -323:3:2528 -324:0:4365 -325:2:1665 -326:2:1669 -327:2:1670 -328:2:1678 -329:2:1679 -330:2:1683 -331:2:1684 -332:2:1678 -333:2:1679 -334:2:1680 -335:2:1692 -336:2:1697 -337:2:1701 -338:2:1702 -339:2:1709 -340:2:1710 -341:2:1721 -342:2:1722 -343:2:1723 -344:2:1721 -345:2:1722 -346:2:1723 -347:2:1734 -348:2:1739 -349:2:1740 -350:0:4365 -351:3:2529 -352:0:4365 -353:2:1752 -354:0:4365 -355:3:2528 -356:0:4365 -357:2:1754 -358:0:4365 -359:3:2529 -360:0:4365 -361:2:1755 -362:2:1759 -363:2:1760 -364:2:1768 -365:2:1769 -366:2:1773 -367:2:1774 -368:2:1768 -369:2:1769 -370:2:1773 -371:2:1774 -372:2:1782 -373:2:1787 -374:2:1791 -375:2:1792 -376:2:1799 -377:2:1800 -378:2:1811 -379:2:1812 -380:2:1813 -381:2:1811 -382:2:1812 -383:2:1813 -384:2:1824 -385:2:1829 -386:2:1830 -387:0:4365 -388:2:1842 -389:0:4365 -390:3:2528 -391:0:4365 -392:2:1844 -393:0:4365 -394:3:2529 -395:0:4365 -396:2:1845 -397:2:1849 -398:2:1850 -399:2:1858 -400:2:1859 -401:2:1863 -402:2:1864 -403:2:1858 -404:2:1859 -405:2:1863 -406:2:1864 -407:2:1872 -408:2:1877 -409:2:1881 -410:2:1882 -411:2:1889 -412:2:1890 -413:2:1901 -414:2:1902 -415:2:1903 -416:2:1901 -417:2:1902 -418:2:1903 -419:2:1914 -420:2:1919 -421:2:1920 -422:0:4365 -423:2:1932 -424:0:4365 -425:3:2528 -426:0:4365 -427:2:1934 -428:0:4365 -429:3:2529 -430:0:4365 -431:2:1935 -432:0:4365 -433:2:1936 -434:0:4365 -435:2:2129 -436:0:4365 -437:2:2130 -438:0:4365 -439:2:2134 -440:0:4365 -441:3:2528 -442:0:4365 -443:2:2136 -444:0:4365 -445:3:2529 -446:0:4365 -447:2:2137 -448:2:2141 -449:2:2142 -450:2:2150 -451:2:2151 -452:2:2155 -453:2:2156 -454:2:2150 -455:2:2151 -456:2:2155 -457:2:2156 -458:2:2164 -459:2:2169 -460:2:2173 -461:2:2174 -462:2:2181 -463:2:2182 -464:2:2193 -465:2:2194 -466:2:2195 -467:2:2193 -468:2:2194 -469:2:2195 -470:2:2206 -471:2:2211 -472:2:2212 -473:0:4365 -474:2:2224 -475:0:4365 -476:3:2528 -477:0:4365 -478:2:2226 -479:0:4365 -480:3:2529 -481:0:4365 -482:2:1936 -483:0:4365 -484:2:2129 -485:0:4365 -486:2:2130 -487:0:4365 -488:2:2134 -489:0:4365 -490:3:2528 -491:0:4365 -492:2:2136 -493:0:4365 -494:3:2529 -495:0:4365 -496:2:2137 -497:2:2141 -498:2:2142 -499:2:2150 -500:2:2151 -501:2:2155 -502:2:2156 -503:2:2150 -504:2:2151 -505:2:2152 -506:2:2164 -507:2:2169 -508:2:2173 -509:2:2174 -510:2:2181 -511:2:2182 -512:2:2193 -513:2:2194 -514:2:2195 -515:2:2193 -516:2:2194 -517:2:2195 -518:2:2206 -519:2:2211 -520:2:2212 -521:0:4365 -522:2:2224 -523:0:4365 -524:3:2528 -525:0:4365 -526:2:2226 -527:0:4365 -528:3:2529 -529:0:4365 -530:2:2230 -531:0:4365 -532:3:2528 -533:0:4365 -534:2:2235 -535:2:2239 -536:2:2240 -537:2:2248 -538:2:2249 -539:2:2253 -540:2:2254 -541:2:2248 -542:2:2249 -543:2:2250 -544:2:2262 -545:2:2267 -546:2:2271 -547:2:2272 -548:2:2279 -549:2:2280 -550:2:2291 -551:2:2292 -552:2:2293 -553:2:2291 -554:2:2292 -555:2:2293 -556:2:2304 -557:2:2309 -558:2:2310 -559:0:4365 -560:3:2529 -561:0:4365 -562:2:2322 -563:0:4365 -564:2:1169 -565:0:4365 -566:3:2528 -567:0:4365 -568:2:1170 -569:0:4365 -570:3:2529 -571:0:4365 -572:3:2530 -573:0:4365 -574:3:2536 -575:0:4365 -576:3:2537 -577:0:4365 -578:3:2547 -579:0:4365 -580:3:2548 -581:0:4365 -582:3:2552 -583:3:2553 -584:3:2557 -585:3:2561 -586:3:2562 -587:3:2557 -588:3:2561 -589:3:2562 -590:3:2566 -591:3:2574 -592:3:2575 -593:3:2580 -594:3:2587 -595:3:2588 -596:3:2587 -597:3:2588 -598:3:2595 -599:3:2600 -600:0:4365 -601:3:2611 -602:0:4365 -603:3:2615 -604:3:2616 -605:3:2620 -606:3:2624 -607:3:2625 -608:3:2620 -609:3:2624 -610:3:2625 -611:3:2629 -612:3:2637 -613:3:2638 -614:3:2643 -615:3:2650 -616:3:2651 -617:3:2650 -618:3:2651 -619:3:2658 -620:3:2663 -621:0:4365 -622:3:2611 -623:0:4365 -624:3:2615 -625:3:2616 -626:3:2620 -627:3:2624 -628:3:2625 -629:3:2620 -630:3:2624 -631:3:2625 -632:3:2629 -633:3:2637 -634:3:2638 -635:3:2643 -636:3:2650 -637:3:2651 -638:3:2650 -639:3:2651 -640:3:2658 -641:3:2663 -642:0:4365 -643:3:2674 -644:0:4365 -645:3:2682 -646:3:2683 -647:3:2687 -648:3:2691 -649:3:2692 -650:3:2687 -651:3:2691 -652:3:2692 -653:3:2696 -654:3:2704 -655:3:2705 -656:3:2710 -657:3:2717 -658:3:2718 -659:3:2717 -660:3:2718 -661:3:2725 -662:3:2730 -663:0:4365 -664:3:2745 -665:0:4365 -666:3:2746 -667:0:4365 -668:2:1173 -669:0:4365 -670:3:2747 -671:0:4365 -672:2:1179 -673:0:4365 -674:2:1180 -675:0:4365 -676:3:2746 -677:0:4365 -678:2:1181 -679:2:1185 -680:2:1186 -681:2:1194 -682:2:1195 -683:2:1199 -684:2:1200 -685:2:1194 -686:2:1195 -687:2:1199 -688:2:1200 -689:2:1208 -690:2:1213 -691:2:1217 -692:2:1218 -693:2:1225 -694:2:1226 -695:2:1237 -696:2:1238 -697:2:1239 -698:2:1237 -699:2:1238 -700:2:1239 -701:2:1250 -702:2:1255 -703:2:1256 -704:0:4365 -705:3:2747 -706:0:4365 -707:2:1268 -708:0:4365 -709:3:2746 -710:0:4365 -711:2:1270 -712:0:4365 -713:3:2747 -714:0:4365 -715:2:1271 -716:2:1275 -717:2:1276 -718:2:1284 -719:2:1285 -720:2:1289 -721:2:1290 -722:2:1284 -723:2:1285 -724:2:1289 -725:2:1290 -726:2:1298 -727:2:1303 -728:2:1307 -729:2:1308 -730:2:1315 -731:2:1316 -732:2:1327 -733:2:1328 -734:2:1329 -735:2:1327 -736:2:1328 -737:2:1329 -738:2:1340 -739:2:1345 -740:2:1346 -741:0:4365 -742:2:1358 -743:0:4365 -744:2:1360 -745:0:4365 -746:3:2746 -747:0:4365 -748:2:1361 -749:0:4365 -750:3:2747 -751:0:4365 -752:2:1362 -753:2:1366 -754:2:1367 -755:2:1375 -756:2:1376 -757:2:1380 -758:2:1381 -759:2:1375 -760:2:1376 -761:2:1380 -762:2:1381 -763:2:1389 -764:2:1394 -765:2:1398 -766:2:1399 -767:2:1406 -768:2:1407 -769:2:1418 -770:2:1419 -771:2:1420 -772:2:1418 -773:2:1419 -774:2:1420 -775:2:1431 -776:2:1436 -777:2:1437 -778:0:4365 -779:2:1449 -780:0:4365 -781:3:2746 -782:0:4365 -783:2:1451 -784:0:4365 -785:3:2747 -786:0:4365 -787:2:1652 -788:0:4365 -789:2:1653 -790:0:4365 -791:2:1657 -792:0:4365 -793:2:1180 -794:0:4365 -795:3:2746 -796:0:4365 -797:2:1181 -798:2:1185 -799:2:1186 -800:2:1194 -801:2:1195 -802:2:1199 -803:2:1200 -804:2:1194 -805:2:1195 -806:2:1196 -807:2:1208 -808:2:1213 -809:2:1217 -810:2:1218 -811:2:1225 -812:2:1226 -813:2:1237 -814:2:1238 -815:2:1239 -816:2:1237 -817:2:1238 -818:2:1239 -819:2:1250 -820:2:1255 -821:2:1256 -822:0:4365 -823:3:2747 -824:0:4365 -825:2:1268 -826:0:4365 -827:3:2746 -828:0:4365 -829:2:1270 -830:0:4365 -831:3:2747 -832:0:4365 -833:2:1271 -834:2:1275 -835:2:1276 -836:2:1284 -837:2:1285 -838:2:1289 -839:2:1290 -840:2:1284 -841:2:1285 -842:2:1289 -843:2:1290 -844:2:1298 -845:2:1303 -846:2:1307 -847:2:1308 -848:2:1315 -849:2:1316 -850:2:1327 -851:2:1328 -852:2:1329 -853:2:1327 -854:2:1328 -855:2:1329 -856:2:1340 -857:2:1345 -858:2:1346 -859:0:4365 -860:2:1358 -861:0:4365 -862:2:1454 -863:0:4365 -864:3:2746 -865:0:4365 -866:2:1455 -867:0:4365 -868:3:2747 -869:0:4365 -870:2:1652 -871:0:4365 -872:2:1653 -873:0:4365 -874:2:1657 -875:0:4365 -876:2:1660 -877:0:4365 -878:3:2746 -879:0:4365 -880:2:1665 -881:2:1669 -882:2:1670 -883:2:1678 -884:2:1679 -885:2:1683 -886:2:1684 -887:2:1678 -888:2:1679 -889:2:1680 -890:2:1692 -891:2:1697 -892:2:1701 -893:2:1702 -894:2:1709 -895:2:1710 -896:2:1721 -897:2:1722 -898:2:1723 -899:2:1721 -900:2:1722 -901:2:1723 -902:2:1734 -903:2:1739 -904:2:1740 -905:0:4365 -906:3:2747 -907:0:4365 -908:2:1752 -909:0:4365 -910:3:2746 -911:0:4365 -912:2:1754 -913:0:4365 -914:3:2747 -915:0:4365 -916:2:1755 -917:2:1759 -918:2:1760 -919:2:1768 -920:2:1769 -921:2:1773 -922:2:1774 -923:2:1768 -924:2:1769 -925:2:1773 -926:2:1774 -927:2:1782 -928:2:1787 -929:2:1791 -930:2:1792 -931:2:1799 -932:2:1800 -933:2:1811 -934:2:1812 -935:2:1813 -936:2:1811 -937:2:1812 -938:2:1813 -939:2:1824 -940:2:1829 -941:2:1830 -942:0:4365 -943:2:1842 -944:0:4365 -945:3:2746 -946:0:4365 -947:2:1844 -948:0:4365 -949:3:2747 -950:0:4365 -951:2:1845 -952:2:1849 -953:2:1850 -954:2:1858 -955:2:1859 -956:2:1863 -957:2:1864 -958:2:1858 -959:2:1859 -960:2:1863 -961:2:1864 -962:2:1872 -963:2:1877 -964:2:1881 -965:2:1882 -966:2:1889 -967:2:1890 -968:2:1901 -969:2:1902 -970:2:1903 -971:2:1901 -972:2:1902 -973:2:1903 -974:2:1914 -975:2:1919 -976:2:1920 -977:0:4365 -978:2:1932 -979:0:4365 -980:3:2746 -981:0:4365 -982:2:1934 -983:0:4365 -984:3:2747 -985:0:4365 -986:2:1935 -987:0:4365 -988:2:1936 -989:0:4365 -990:2:2129 -991:0:4365 -992:2:2130 -993:0:4365 -994:2:2134 -995:0:4365 -996:3:2746 -997:0:4365 -998:2:2136 -999:0:4365 -1000:3:2747 -1001:0:4365 -1002:2:2137 -1003:2:2141 -1004:2:2142 -1005:2:2150 -1006:2:2151 -1007:2:2155 -1008:2:2156 -1009:2:2150 -1010:2:2151 -1011:2:2155 -1012:2:2156 -1013:2:2164 -1014:2:2169 -1015:2:2173 -1016:2:2174 -1017:2:2181 -1018:2:2182 -1019:2:2193 -1020:2:2194 -1021:2:2195 -1022:2:2193 -1023:2:2194 -1024:2:2195 -1025:2:2206 -1026:2:2211 -1027:2:2212 -1028:0:4365 -1029:2:2224 -1030:0:4365 -1031:3:2746 -1032:0:4365 -1033:2:2226 -1034:0:4365 -1035:3:2747 -1036:0:4365 -1037:2:1936 -1038:0:4365 -1039:2:2129 -1040:0:4365 -1041:2:2130 -1042:0:4365 -1043:2:2134 -1044:0:4365 -1045:3:2746 -1046:0:4365 -1047:2:2136 -1048:0:4365 -1049:3:2747 -1050:0:4365 -1051:2:2137 -1052:2:2141 -1053:2:2142 -1054:2:2150 -1055:2:2151 -1056:2:2155 -1057:2:2156 -1058:2:2150 -1059:2:2151 -1060:2:2152 -1061:2:2164 -1062:2:2169 -1063:2:2173 -1064:2:2174 -1065:2:2181 -1066:2:2182 -1067:2:2193 -1068:2:2194 -1069:2:2195 -1070:2:2193 -1071:2:2194 -1072:2:2195 -1073:2:2206 -1074:2:2211 -1075:2:2212 -1076:0:4365 -1077:2:2224 -1078:0:4365 -1079:3:2746 -1080:0:4365 -1081:2:2226 -1082:0:4365 -1083:3:2747 -1084:0:4365 -1085:2:2230 -1086:0:4365 -1087:3:2746 -1088:0:4365 -1089:2:2235 -1090:2:2239 -1091:2:2240 -1092:2:2248 -1093:2:2249 -1094:2:2253 -1095:2:2254 -1096:2:2248 -1097:2:2249 -1098:2:2250 -1099:2:2262 -1100:2:2267 -1101:2:2271 -1102:2:2272 -1103:2:2279 -1104:2:2280 -1105:2:2291 -1106:2:2292 -1107:2:2293 -1108:2:2291 -1109:2:2292 -1110:2:2293 -1111:2:2304 -1112:2:2309 -1113:2:2310 -1114:0:4365 -1115:3:2747 -1116:0:4365 -1117:2:2322 -1118:0:4365 -1119:2:1169 -1120:0:4365 -1121:3:2746 -1122:0:4365 -1123:2:1170 -1124:0:4365 -1125:3:2747 -1126:0:4365 -1127:3:2748 -1128:0:4365 -1129:3:2754 -1130:0:4365 -1131:3:2755 -1132:3:2759 -1133:3:2760 -1134:3:2768 -1135:3:2769 -1136:3:2773 -1137:3:2774 -1138:3:2768 -1139:3:2769 -1140:3:2773 -1141:3:2774 -1142:3:2782 -1143:3:2787 -1144:3:2791 -1145:3:2792 -1146:3:2799 -1147:3:2800 -1148:3:2811 -1149:3:2812 -1150:3:2813 -1151:3:2811 -1152:3:2812 -1153:3:2813 -1154:3:2824 -1155:3:2829 -1156:3:2830 -1157:0:4365 -1158:3:2842 -1159:0:4365 -1160:3:2843 -1161:0:4365 -1162:2:1173 -1163:0:4365 -1164:3:2844 -1165:0:4365 -1166:2:1179 -1167:0:4365 -1168:2:1180 -1169:0:4365 -1170:3:2843 -1171:0:4365 -1172:2:1181 -1173:2:1185 -1174:2:1186 -1175:2:1194 -1176:2:1195 -1177:2:1199 -1178:2:1200 -1179:2:1194 -1180:2:1195 -1181:2:1199 -1182:2:1200 -1183:2:1208 -1184:2:1213 -1185:2:1217 -1186:2:1218 -1187:2:1225 -1188:2:1226 -1189:2:1237 -1190:2:1238 -1191:2:1239 -1192:2:1237 -1193:2:1238 -1194:2:1239 -1195:2:1250 -1196:2:1255 -1197:2:1256 -1198:0:4365 -1199:3:2844 -1200:0:4365 -1201:2:1268 -1202:0:4365 -1203:3:2843 -1204:0:4365 -1205:2:1270 -1206:0:4365 -1207:3:2844 -1208:0:4365 -1209:2:1271 -1210:2:1275 -1211:2:1276 -1212:2:1284 -1213:2:1285 -1214:2:1289 -1215:2:1290 -1216:2:1284 -1217:2:1285 -1218:2:1289 -1219:2:1290 -1220:2:1298 -1221:2:1303 -1222:2:1307 -1223:2:1308 -1224:2:1315 -1225:2:1316 -1226:2:1327 -1227:2:1328 -1228:2:1329 -1229:2:1327 -1230:2:1328 -1231:2:1329 -1232:2:1340 -1233:2:1345 -1234:2:1346 -1235:0:4365 -1236:2:1358 -1237:0:4365 -1238:2:1360 -1239:0:4365 -1240:3:2843 -1241:0:4365 -1242:2:1361 -1243:0:4365 -1244:3:2844 -1245:0:4365 -1246:2:1362 -1247:2:1366 -1248:2:1367 -1249:2:1375 -1250:2:1376 -1251:2:1380 -1252:2:1381 -1253:2:1375 -1254:2:1376 -1255:2:1380 -1256:2:1381 -1257:2:1389 -1258:2:1394 -1259:2:1398 -1260:2:1399 -1261:2:1406 -1262:2:1407 -1263:2:1418 -1264:2:1419 -1265:2:1420 -1266:2:1418 -1267:2:1419 -1268:2:1420 -1269:2:1431 -1270:2:1436 -1271:2:1437 -1272:0:4365 -1273:2:1449 -1274:0:4365 -1275:3:2843 -1276:0:4365 -1277:2:1451 -1278:0:4365 -1279:3:2844 -1280:0:4365 -1281:2:1652 -1282:0:4365 -1283:2:1653 -1284:0:4365 -1285:2:1657 -1286:0:4365 -1287:2:1180 -1288:0:4365 -1289:3:2843 -1290:0:4365 -1291:2:1181 -1292:2:1185 -1293:2:1186 -1294:2:1194 -1295:2:1195 -1296:2:1199 -1297:2:1200 -1298:2:1194 -1299:2:1195 -1300:2:1196 -1301:2:1208 -1302:2:1213 -1303:2:1217 -1304:2:1218 -1305:2:1225 -1306:2:1226 -1307:2:1237 -1308:2:1238 -1309:2:1239 -1310:2:1237 -1311:2:1238 -1312:2:1239 -1313:2:1250 -1314:2:1255 -1315:2:1256 -1316:0:4365 -1317:3:2844 -1318:0:4365 -1319:2:1268 -1320:0:4365 -1321:3:2843 -1322:0:4365 -1323:2:1270 -1324:0:4365 -1325:3:2844 -1326:0:4365 -1327:2:1271 -1328:2:1275 -1329:2:1276 -1330:2:1284 -1331:2:1285 -1332:2:1289 -1333:2:1290 -1334:2:1284 -1335:2:1285 -1336:2:1289 -1337:2:1290 -1338:2:1298 -1339:2:1303 -1340:2:1307 -1341:2:1308 -1342:2:1315 -1343:2:1316 -1344:2:1327 -1345:2:1328 -1346:2:1329 -1347:2:1327 -1348:2:1328 -1349:2:1329 -1350:2:1340 -1351:2:1345 -1352:2:1346 -1353:0:4365 -1354:2:1358 -1355:0:4365 -1356:2:1454 -1357:0:4365 -1358:3:2843 -1359:0:4365 -1360:2:1455 -1361:0:4365 -1362:3:2844 -1363:0:4365 -1364:2:1652 -1365:0:4365 -1366:2:1653 -1367:0:4365 -1368:2:1657 -1369:0:4365 -1370:2:1660 -1371:0:4365 -1372:3:2843 -1373:0:4365 -1374:2:1665 -1375:2:1669 -1376:2:1670 -1377:2:1678 -1378:2:1679 -1379:2:1683 -1380:2:1684 -1381:2:1678 -1382:2:1679 -1383:2:1680 -1384:2:1692 -1385:2:1697 -1386:2:1701 -1387:2:1702 -1388:2:1709 -1389:2:1710 -1390:2:1721 -1391:2:1722 -1392:2:1723 -1393:2:1721 -1394:2:1722 -1395:2:1723 -1396:2:1734 -1397:2:1739 -1398:2:1740 -1399:0:4365 -1400:3:2844 -1401:0:4365 -1402:2:1752 -1403:0:4365 -1404:3:2843 -1405:0:4365 -1406:2:1754 -1407:0:4365 -1408:3:2844 -1409:0:4365 -1410:2:1755 -1411:2:1759 -1412:2:1760 -1413:2:1768 -1414:2:1769 -1415:2:1773 -1416:2:1774 -1417:2:1768 -1418:2:1769 -1419:2:1773 -1420:2:1774 -1421:2:1782 -1422:2:1787 -1423:2:1791 -1424:2:1792 -1425:2:1799 -1426:2:1800 -1427:2:1811 -1428:2:1812 -1429:2:1813 -1430:2:1811 -1431:2:1812 -1432:2:1813 -1433:2:1824 -1434:2:1829 -1435:2:1830 -1436:0:4365 -1437:2:1842 -1438:0:4365 -1439:3:2843 -1440:0:4365 -1441:2:1844 -1442:0:4365 -1443:3:2844 -1444:0:4365 -1445:2:1845 -1446:2:1849 -1447:2:1850 -1448:2:1858 -1449:2:1859 -1450:2:1863 -1451:2:1864 -1452:2:1858 -1453:2:1859 -1454:2:1863 -1455:2:1864 -1456:2:1872 -1457:2:1877 -1458:2:1881 -1459:2:1882 -1460:2:1889 -1461:2:1890 -1462:2:1901 -1463:2:1902 -1464:2:1903 -1465:2:1901 -1466:2:1902 -1467:2:1903 -1468:2:1914 -1469:2:1919 -1470:2:1920 -1471:0:4365 -1472:2:1932 -1473:0:4365 -1474:3:2843 -1475:0:4365 -1476:2:1934 -1477:0:4365 -1478:3:2844 -1479:0:4365 -1480:2:1935 -1481:0:4365 -1482:2:1936 -1483:0:4365 -1484:2:2129 -1485:0:4365 -1486:2:2130 -1487:0:4365 -1488:2:2134 -1489:0:4365 -1490:3:2843 -1491:0:4365 -1492:2:2136 -1493:0:4365 -1494:3:2844 -1495:0:4365 -1496:2:2137 -1497:2:2141 -1498:2:2142 -1499:2:2150 -1500:2:2151 -1501:2:2155 -1502:2:2156 -1503:2:2150 -1504:2:2151 -1505:2:2155 -1506:2:2156 -1507:2:2164 -1508:2:2169 -1509:2:2173 -1510:2:2174 -1511:2:2181 -1512:2:2182 -1513:2:2193 -1514:2:2194 -1515:2:2195 -1516:2:2193 -1517:2:2194 -1518:2:2195 -1519:2:2206 -1520:2:2211 -1521:2:2212 -1522:0:4365 -1523:2:2224 -1524:0:4365 -1525:3:2843 -1526:0:4365 -1527:2:2226 -1528:0:4365 -1529:3:2844 -1530:0:4365 -1531:2:1936 -1532:0:4365 -1533:2:2129 -1534:0:4365 -1535:2:2130 -1536:0:4365 -1537:2:2134 -1538:0:4365 -1539:3:2843 -1540:0:4365 -1541:2:2136 -1542:0:4365 -1543:3:2844 -1544:0:4365 -1545:2:2137 -1546:2:2141 -1547:2:2142 -1548:2:2150 -1549:2:2151 -1550:2:2155 -1551:2:2156 -1552:2:2150 -1553:2:2151 -1554:2:2152 -1555:2:2164 -1556:2:2169 -1557:2:2173 -1558:2:2174 -1559:2:2181 -1560:2:2182 -1561:2:2193 -1562:2:2194 -1563:2:2195 -1564:2:2193 -1565:2:2194 -1566:2:2195 -1567:2:2206 -1568:2:2211 -1569:2:2212 -1570:0:4365 -1571:2:2224 -1572:0:4365 -1573:3:2843 -1574:0:4365 -1575:2:2226 -1576:0:4365 -1577:3:2844 -1578:0:4365 -1579:2:2230 -1580:0:4365 -1581:3:2843 -1582:0:4365 -1583:2:2235 -1584:2:2239 -1585:2:2240 -1586:2:2248 -1587:2:2249 -1588:2:2253 -1589:2:2254 -1590:2:2248 -1591:2:2249 -1592:2:2250 -1593:2:2262 -1594:2:2267 -1595:2:2271 -1596:2:2272 -1597:2:2279 -1598:2:2280 -1599:2:2291 -1600:2:2292 -1601:2:2293 -1602:2:2291 -1603:2:2292 -1604:2:2293 -1605:2:2304 -1606:2:2309 -1607:2:2310 -1608:0:4365 -1609:3:2844 -1610:0:4365 -1611:2:2322 -1612:0:4365 -1613:2:1169 -1614:0:4365 -1615:3:2843 -1616:0:4365 -1617:2:1170 -1618:0:4365 -1619:3:2844 -1620:0:4365 -1621:3:2845 -1622:0:4365 -1623:3:2851 -1624:0:4365 -1625:3:2854 -1626:3:2855 -1627:3:2867 -1628:3:2868 -1629:3:2872 -1630:3:2873 -1631:3:2867 -1632:3:2868 -1633:3:2872 -1634:3:2873 -1635:3:2881 -1636:3:2886 -1637:3:2890 -1638:3:2891 -1639:3:2898 -1640:3:2899 -1641:3:2910 -1642:3:2911 -1643:3:2912 -1644:3:2910 -1645:3:2911 -1646:3:2912 -1647:3:2923 -1648:3:2928 -1649:3:2929 -1650:0:4365 -1651:3:2941 -1652:0:4365 -1653:3:2942 -1654:0:4365 -1655:2:1173 -1656:0:4365 -1657:3:2943 -1658:0:4365 -1659:2:1179 -1660:0:4365 -1661:2:1180 -1662:0:4365 -1663:3:2942 -1664:0:4365 -1665:2:1181 -1666:2:1185 -1667:2:1186 -1668:2:1194 -1669:2:1195 -1670:2:1199 -1671:2:1200 -1672:2:1194 -1673:2:1195 -1674:2:1199 -1675:2:1200 -1676:2:1208 -1677:2:1213 -1678:2:1217 -1679:2:1218 -1680:2:1225 -1681:2:1226 -1682:2:1237 -1683:2:1238 -1684:2:1239 -1685:2:1237 -1686:2:1238 -1687:2:1239 -1688:2:1250 -1689:2:1255 -1690:2:1256 -1691:0:4365 -1692:3:2943 -1693:0:4365 -1694:2:1268 -1695:0:4365 -1696:3:2942 -1697:0:4365 -1698:2:1270 -1699:0:4365 -1700:3:2943 -1701:0:4365 -1702:2:1271 -1703:2:1275 -1704:2:1276 -1705:2:1284 -1706:2:1285 -1707:2:1289 -1708:2:1290 -1709:2:1284 -1710:2:1285 -1711:2:1289 -1712:2:1290 -1713:2:1298 -1714:2:1303 -1715:2:1307 -1716:2:1308 -1717:2:1315 -1718:2:1316 -1719:2:1327 -1720:2:1328 -1721:2:1329 -1722:2:1327 -1723:2:1328 -1724:2:1329 -1725:2:1340 -1726:2:1345 -1727:2:1346 -1728:0:4365 -1729:2:1358 -1730:0:4365 -1731:2:1360 -1732:0:4365 -1733:3:2942 -1734:0:4365 -1735:2:1361 -1736:0:4365 -1737:3:2943 -1738:0:4365 -1739:2:1362 -1740:2:1366 -1741:2:1367 -1742:2:1375 -1743:2:1376 -1744:2:1380 -1745:2:1381 -1746:2:1375 -1747:2:1376 -1748:2:1380 -1749:2:1381 -1750:2:1389 -1751:2:1394 -1752:2:1398 -1753:2:1399 -1754:2:1406 -1755:2:1407 -1756:2:1418 -1757:2:1419 -1758:2:1420 -1759:2:1418 -1760:2:1419 -1761:2:1420 -1762:2:1431 -1763:2:1436 -1764:2:1437 -1765:0:4365 -1766:2:1449 -1767:0:4365 -1768:3:2942 -1769:0:4365 -1770:2:1451 -1771:0:4365 -1772:3:2943 -1773:0:4365 -1774:2:1652 -1775:0:4365 -1776:2:1653 -1777:0:4365 -1778:2:1657 -1779:0:4365 -1780:2:1180 -1781:0:4365 -1782:3:2942 -1783:0:4365 -1784:2:1181 -1785:2:1185 -1786:2:1186 -1787:2:1194 -1788:2:1195 -1789:2:1199 -1790:2:1200 -1791:2:1194 -1792:2:1195 -1793:2:1196 -1794:2:1208 -1795:2:1213 -1796:2:1217 -1797:2:1218 -1798:2:1225 -1799:2:1226 -1800:2:1237 -1801:2:1238 -1802:2:1239 -1803:2:1237 -1804:2:1238 -1805:2:1239 -1806:2:1250 -1807:2:1255 -1808:2:1256 -1809:0:4365 -1810:3:2943 -1811:0:4365 -1812:2:1268 -1813:0:4365 -1814:3:2942 -1815:0:4365 -1816:2:1270 -1817:0:4365 -1818:3:2943 -1819:0:4365 -1820:2:1271 -1821:2:1275 -1822:2:1276 -1823:2:1284 -1824:2:1285 -1825:2:1289 -1826:2:1290 -1827:2:1284 -1828:2:1285 -1829:2:1289 -1830:2:1290 -1831:2:1298 -1832:2:1303 -1833:2:1307 -1834:2:1308 -1835:2:1315 -1836:2:1316 -1837:2:1327 -1838:2:1328 -1839:2:1329 -1840:2:1327 -1841:2:1328 -1842:2:1329 -1843:2:1340 -1844:2:1345 -1845:2:1346 -1846:0:4365 -1847:2:1358 -1848:0:4365 -1849:2:1454 -1850:0:4365 -1851:3:2942 -1852:0:4365 -1853:2:1455 -1854:0:4365 -1855:3:2943 -1856:0:4365 -1857:2:1652 -1858:0:4365 -1859:2:1653 -1860:0:4365 -1861:2:1657 -1862:0:4365 -1863:2:1660 -1864:0:4365 -1865:3:2942 -1866:0:4365 -1867:2:1665 -1868:2:1669 -1869:2:1670 -1870:2:1678 -1871:2:1679 -1872:2:1683 -1873:2:1684 -1874:2:1678 -1875:2:1679 -1876:2:1680 -1877:2:1692 -1878:2:1697 -1879:2:1701 -1880:2:1702 -1881:2:1709 -1882:2:1710 -1883:2:1721 -1884:2:1722 -1885:2:1723 -1886:2:1721 -1887:2:1722 -1888:2:1723 -1889:2:1734 -1890:2:1739 -1891:2:1740 -1892:0:4365 -1893:3:2943 -1894:0:4365 -1895:2:1752 -1896:0:4365 -1897:3:2942 -1898:0:4365 -1899:2:1754 -1900:0:4365 -1901:3:2943 -1902:0:4365 -1903:2:1755 -1904:2:1759 -1905:2:1760 -1906:2:1768 -1907:2:1769 -1908:2:1773 -1909:2:1774 -1910:2:1768 -1911:2:1769 -1912:2:1773 -1913:2:1774 -1914:2:1782 -1915:2:1787 -1916:2:1791 -1917:2:1792 -1918:2:1799 -1919:2:1800 -1920:2:1811 -1921:2:1812 -1922:2:1813 -1923:2:1811 -1924:2:1812 -1925:2:1813 -1926:2:1824 -1927:2:1829 -1928:2:1830 -1929:0:4365 -1930:2:1842 -1931:0:4365 -1932:3:2942 -1933:0:4365 -1934:2:1844 -1935:0:4365 -1936:3:2943 -1937:0:4365 -1938:2:1845 -1939:2:1849 -1940:2:1850 -1941:2:1858 -1942:2:1859 -1943:2:1863 -1944:2:1864 -1945:2:1858 -1946:2:1859 -1947:2:1863 -1948:2:1864 -1949:2:1872 -1950:2:1877 -1951:2:1881 -1952:2:1882 -1953:2:1889 -1954:2:1890 -1955:2:1901 -1956:2:1902 -1957:2:1903 -1958:2:1901 -1959:2:1902 -1960:2:1903 -1961:2:1914 -1962:2:1919 -1963:2:1920 -1964:0:4365 -1965:2:1932 -1966:0:4365 -1967:3:2942 -1968:0:4365 -1969:2:1934 -1970:0:4365 -1971:3:2943 -1972:0:4365 -1973:2:1935 -1974:0:4365 -1975:2:1936 -1976:0:4365 -1977:2:2129 -1978:0:4365 -1979:2:2130 -1980:0:4365 -1981:2:2134 -1982:0:4365 -1983:3:2942 -1984:0:4365 -1985:2:2136 -1986:0:4365 -1987:3:2943 -1988:0:4365 -1989:2:2137 -1990:2:2141 -1991:2:2142 -1992:2:2150 -1993:2:2151 -1994:2:2155 -1995:2:2156 -1996:2:2150 -1997:2:2151 -1998:2:2155 -1999:2:2156 -2000:2:2164 -2001:2:2169 -2002:2:2173 -2003:2:2174 -2004:2:2181 -2005:2:2182 -2006:2:2193 -2007:2:2194 -2008:2:2195 -2009:2:2193 -2010:2:2194 -2011:2:2195 -2012:2:2206 -2013:2:2211 -2014:2:2212 -2015:0:4365 -2016:2:2224 -2017:0:4365 -2018:3:2942 -2019:0:4365 -2020:2:2226 -2021:0:4365 -2022:3:2943 -2023:0:4365 -2024:2:1936 -2025:0:4365 -2026:2:2129 -2027:0:4365 -2028:2:2130 -2029:0:4365 -2030:2:2134 -2031:0:4365 -2032:3:2942 -2033:0:4365 -2034:2:2136 -2035:0:4365 -2036:3:2943 -2037:0:4365 -2038:2:2137 -2039:2:2141 -2040:2:2142 -2041:2:2150 -2042:2:2151 -2043:2:2155 -2044:2:2156 -2045:2:2150 -2046:2:2151 -2047:2:2152 -2048:2:2164 -2049:2:2169 -2050:2:2173 -2051:2:2174 -2052:2:2181 -2053:2:2182 -2054:2:2193 -2055:2:2194 -2056:2:2195 -2057:2:2193 -2058:2:2194 -2059:2:2195 -2060:2:2206 -2061:2:2211 -2062:2:2212 -2063:0:4365 -2064:2:2224 -2065:0:4365 -2066:3:2942 -2067:0:4365 -2068:2:2226 -2069:0:4365 -2070:3:2943 -2071:0:4365 -2072:2:2230 -2073:0:4365 -2074:3:2942 -2075:0:4365 -2076:2:2235 -2077:2:2239 -2078:2:2240 -2079:2:2248 -2080:2:2249 -2081:2:2253 -2082:2:2254 -2083:2:2248 -2084:2:2249 -2085:2:2250 -2086:2:2262 -2087:2:2267 -2088:2:2271 -2089:2:2272 -2090:2:2279 -2091:2:2280 -2092:2:2291 -2093:2:2292 -2094:2:2293 -2095:2:2291 -2096:2:2292 -2097:2:2293 -2098:2:2304 -2099:2:2309 -2100:2:2310 -2101:0:4365 -2102:3:2943 -2103:0:4365 -2104:2:2322 -2105:0:4365 -2106:2:1169 -2107:0:4365 -2108:3:2942 -2109:0:4365 -2110:2:1170 -2111:0:4365 -2112:3:2943 -2113:0:4365 -2114:3:2944 -2115:0:4365 -2116:3:2950 -2117:0:4365 -2118:3:2951 -2119:0:4365 -2120:3:2952 -2121:0:4365 -2122:3:2953 -2123:0:4365 -2124:3:2954 -2125:3:2958 -2126:3:2959 -2127:3:2967 -2128:3:2968 -2129:3:2972 -2130:3:2973 -2131:3:2967 -2132:3:2968 -2133:3:2972 -2134:3:2973 -2135:3:2981 -2136:3:2986 -2137:3:2990 -2138:3:2991 -2139:3:2998 -2140:3:2999 -2141:3:3010 -2142:3:3011 -2143:3:3012 -2144:3:3010 -2145:3:3011 -2146:3:3012 -2147:3:3023 -2148:3:3028 -2149:3:3029 -2150:0:4365 -2151:3:3041 -2152:0:4365 -2153:3:3042 -2154:0:4365 -2155:2:1173 -2156:0:4365 -2157:3:3043 -2158:0:4365 -2159:2:1179 -2160:0:4365 -2161:2:1180 -2162:0:4365 -2163:3:3042 -2164:0:4365 -2165:2:1181 -2166:2:1185 -2167:2:1186 -2168:2:1194 -2169:2:1195 -2170:2:1199 -2171:2:1200 -2172:2:1194 -2173:2:1195 -2174:2:1199 -2175:2:1200 -2176:2:1208 -2177:2:1213 -2178:2:1217 -2179:2:1218 -2180:2:1225 -2181:2:1226 -2182:2:1237 -2183:2:1238 -2184:2:1239 -2185:2:1237 -2186:2:1238 -2187:2:1239 -2188:2:1250 -2189:2:1255 -2190:2:1256 -2191:0:4365 -2192:3:3043 -2193:0:4365 -2194:2:1268 -2195:0:4365 -2196:3:3042 -2197:0:4365 -2198:2:1270 -2199:0:4365 -2200:3:3043 -2201:0:4365 -2202:2:1271 -2203:2:1275 -2204:2:1276 -2205:2:1284 -2206:2:1285 -2207:2:1289 -2208:2:1290 -2209:2:1284 -2210:2:1285 -2211:2:1289 -2212:2:1290 -2213:2:1298 -2214:2:1303 -2215:2:1307 -2216:2:1308 -2217:2:1315 -2218:2:1316 -2219:2:1327 -2220:2:1328 -2221:2:1329 -2222:2:1327 -2223:2:1328 -2224:2:1329 -2225:2:1340 -2226:2:1345 -2227:2:1346 -2228:0:4365 -2229:2:1358 -2230:0:4365 -2231:2:1360 -2232:0:4365 -2233:3:3042 -2234:0:4365 -2235:2:1361 -2236:0:4365 -2237:3:3043 -2238:0:4365 -2239:2:1362 -2240:2:1366 -2241:2:1367 -2242:2:1375 -2243:2:1376 -2244:2:1380 -2245:2:1381 -2246:2:1375 -2247:2:1376 -2248:2:1380 -2249:2:1381 -2250:2:1389 -2251:2:1394 -2252:2:1398 -2253:2:1399 -2254:2:1406 -2255:2:1407 -2256:2:1418 -2257:2:1419 -2258:2:1420 -2259:2:1418 -2260:2:1419 -2261:2:1420 -2262:2:1431 -2263:2:1436 -2264:2:1437 -2265:0:4365 -2266:2:1449 -2267:0:4365 -2268:3:3042 -2269:0:4365 -2270:2:1451 -2271:0:4365 -2272:3:3043 -2273:0:4365 -2274:2:1652 -2275:0:4365 -2276:2:1653 -2277:0:4365 -2278:2:1657 -2279:0:4365 -2280:2:1180 -2281:0:4365 -2282:3:3042 -2283:0:4365 -2284:2:1181 -2285:2:1185 -2286:2:1186 -2287:2:1194 -2288:2:1195 -2289:2:1199 -2290:2:1200 -2291:2:1194 -2292:2:1195 -2293:2:1196 -2294:2:1208 -2295:2:1213 -2296:2:1217 -2297:2:1218 -2298:2:1225 -2299:2:1226 -2300:2:1237 -2301:2:1238 -2302:2:1239 -2303:2:1237 -2304:2:1238 -2305:2:1239 -2306:2:1250 -2307:2:1255 -2308:2:1256 -2309:0:4365 -2310:3:3043 -2311:0:4365 -2312:2:1268 -2313:0:4365 -2314:3:3042 -2315:0:4365 -2316:2:1270 -2317:0:4365 -2318:3:3043 -2319:0:4365 -2320:2:1271 -2321:2:1275 -2322:2:1276 -2323:2:1284 -2324:2:1285 -2325:2:1289 -2326:2:1290 -2327:2:1284 -2328:2:1285 -2329:2:1289 -2330:2:1290 -2331:2:1298 -2332:2:1303 -2333:2:1307 -2334:2:1308 -2335:2:1315 -2336:2:1316 -2337:2:1327 -2338:2:1328 -2339:2:1329 -2340:2:1327 -2341:2:1328 -2342:2:1329 -2343:2:1340 -2344:2:1345 -2345:2:1346 -2346:0:4365 -2347:2:1358 -2348:0:4365 -2349:2:1454 -2350:0:4365 -2351:3:3042 -2352:0:4365 -2353:2:1455 -2354:0:4365 -2355:3:3043 -2356:0:4365 -2357:2:1652 -2358:0:4365 -2359:2:1653 -2360:0:4365 -2361:2:1657 -2362:0:4365 -2363:2:1660 -2364:0:4365 -2365:3:3042 -2366:0:4365 -2367:2:1665 -2368:2:1669 -2369:2:1670 -2370:2:1678 -2371:2:1679 -2372:2:1683 -2373:2:1684 -2374:2:1678 -2375:2:1679 -2376:2:1680 -2377:2:1692 -2378:2:1697 -2379:2:1701 -2380:2:1702 -2381:2:1709 -2382:2:1710 -2383:2:1721 -2384:2:1722 -2385:2:1723 -2386:2:1721 -2387:2:1722 -2388:2:1723 -2389:2:1734 -2390:2:1739 -2391:2:1740 -2392:0:4365 -2393:3:3043 -2394:0:4365 -2395:2:1752 -2396:0:4365 -2397:3:3042 -2398:0:4365 -2399:2:1754 -2400:0:4365 -2401:3:3043 -2402:0:4365 -2403:2:1755 -2404:2:1759 -2405:2:1760 -2406:2:1768 -2407:2:1769 -2408:2:1773 -2409:2:1774 -2410:2:1768 -2411:2:1769 -2412:2:1773 -2413:2:1774 -2414:2:1782 -2415:2:1787 -2416:2:1791 -2417:2:1792 -2418:2:1799 -2419:2:1800 -2420:2:1811 -2421:2:1812 -2422:2:1813 -2423:2:1811 -2424:2:1812 -2425:2:1813 -2426:2:1824 -2427:2:1829 -2428:2:1830 -2429:0:4365 -2430:2:1842 -2431:0:4365 -2432:3:3042 -2433:0:4365 -2434:2:1844 -2435:0:4365 -2436:3:3043 -2437:0:4365 -2438:2:1845 -2439:2:1849 -2440:2:1850 -2441:2:1858 -2442:2:1859 -2443:2:1863 -2444:2:1864 -2445:2:1858 -2446:2:1859 -2447:2:1863 -2448:2:1864 -2449:2:1872 -2450:2:1877 -2451:2:1881 -2452:2:1882 -2453:2:1889 -2454:2:1890 -2455:2:1901 -2456:2:1902 -2457:2:1903 -2458:2:1901 -2459:2:1902 -2460:2:1903 -2461:2:1914 -2462:2:1919 -2463:2:1920 -2464:0:4365 -2465:2:1932 -2466:0:4365 -2467:3:3042 -2468:0:4365 -2469:2:1934 -2470:0:4365 -2471:3:3043 -2472:0:4365 -2473:2:1935 -2474:0:4365 -2475:2:1936 -2476:0:4365 -2477:2:2129 -2478:0:4365 -2479:2:2130 -2480:0:4365 -2481:2:2134 -2482:0:4365 -2483:3:3042 -2484:0:4365 -2485:2:2136 -2486:0:4365 -2487:3:3043 -2488:0:4365 -2489:2:2137 -2490:2:2141 -2491:2:2142 -2492:2:2150 -2493:2:2151 -2494:2:2155 -2495:2:2156 -2496:2:2150 -2497:2:2151 -2498:2:2155 -2499:2:2156 -2500:2:2164 -2501:2:2169 -2502:2:2173 -2503:2:2174 -2504:2:2181 -2505:2:2182 -2506:2:2193 -2507:2:2194 -2508:2:2195 -2509:2:2193 -2510:2:2194 -2511:2:2195 -2512:2:2206 -2513:2:2211 -2514:2:2212 -2515:0:4365 -2516:2:2224 -2517:0:4365 -2518:3:3042 -2519:0:4365 -2520:2:2226 -2521:0:4365 -2522:3:3043 -2523:0:4365 -2524:2:1936 -2525:0:4365 -2526:2:2129 -2527:0:4365 -2528:2:2130 -2529:0:4365 -2530:2:2134 -2531:0:4365 -2532:3:3042 -2533:0:4365 -2534:2:2136 -2535:0:4365 -2536:3:3043 -2537:0:4365 -2538:2:2137 -2539:2:2141 -2540:2:2142 -2541:2:2150 -2542:2:2151 -2543:2:2155 -2544:2:2156 -2545:2:2150 -2546:2:2151 -2547:2:2152 -2548:2:2164 -2549:2:2169 -2550:2:2173 -2551:2:2174 -2552:2:2181 -2553:2:2182 -2554:2:2193 -2555:2:2194 -2556:2:2195 -2557:2:2193 -2558:2:2194 -2559:2:2195 -2560:2:2206 -2561:2:2211 -2562:2:2212 -2563:0:4365 -2564:2:2224 -2565:0:4365 -2566:3:3042 -2567:0:4365 -2568:2:2226 -2569:0:4365 -2570:3:3043 -2571:0:4365 -2572:2:2230 -2573:0:4365 -2574:3:3042 -2575:0:4365 -2576:2:2235 -2577:2:2239 -2578:2:2240 -2579:2:2248 -2580:2:2249 -2581:2:2253 -2582:2:2254 -2583:2:2248 -2584:2:2249 -2585:2:2250 -2586:2:2262 -2587:2:2267 -2588:2:2271 -2589:2:2272 -2590:2:2279 -2591:2:2280 -2592:2:2291 -2593:2:2292 -2594:2:2293 -2595:2:2291 -2596:2:2292 -2597:2:2293 -2598:2:2304 -2599:2:2309 -2600:2:2310 -2601:0:4365 -2602:3:3043 -2603:0:4365 -2604:2:2322 -2605:0:4365 -2606:2:1169 -2607:0:4365 -2608:3:3042 -2609:0:4365 -2610:2:1170 -2611:0:4365 -2612:3:3043 -2613:0:4365 -2614:3:3044 -2615:0:4365 -2616:3:3257 -2617:0:4365 -2618:3:3265 -2619:0:4365 -2620:3:3266 -2621:3:3270 -2622:3:3271 -2623:3:3279 -2624:3:3280 -2625:3:3284 -2626:3:3285 -2627:3:3279 -2628:3:3280 -2629:3:3284 -2630:3:3285 -2631:3:3293 -2632:3:3298 -2633:3:3302 -2634:3:3303 -2635:3:3310 -2636:3:3311 -2637:3:3322 -2638:3:3323 -2639:3:3324 -2640:3:3322 -2641:3:3323 -2642:3:3324 -2643:3:3335 -2644:3:3340 -2645:3:3341 -2646:0:4365 -2647:3:3353 -2648:0:4365 -2649:3:3354 -2650:0:4365 -2651:2:1173 -2652:0:4365 -2653:3:3355 -2654:0:4365 -2655:2:1179 -2656:0:4365 -2657:2:1180 -2658:0:4365 -2659:3:3354 -2660:0:4365 -2661:2:1181 -2662:2:1185 -2663:2:1186 -2664:2:1194 -2665:2:1195 -2666:2:1199 -2667:2:1200 -2668:2:1194 -2669:2:1195 -2670:2:1199 -2671:2:1200 -2672:2:1208 -2673:2:1213 -2674:2:1217 -2675:2:1218 -2676:2:1225 -2677:2:1226 -2678:2:1237 -2679:2:1238 -2680:2:1239 -2681:2:1237 -2682:2:1238 -2683:2:1239 -2684:2:1250 -2685:2:1255 -2686:2:1256 -2687:0:4365 -2688:3:3355 -2689:0:4365 -2690:2:1268 -2691:0:4365 -2692:3:3354 -2693:0:4365 -2694:2:1270 -2695:0:4365 -2696:3:3355 -2697:0:4365 -2698:2:1271 -2699:2:1275 -2700:2:1276 -2701:2:1284 -2702:2:1285 -2703:2:1289 -2704:2:1290 -2705:2:1284 -2706:2:1285 -2707:2:1289 -2708:2:1290 -2709:2:1298 -2710:2:1303 -2711:2:1307 -2712:2:1308 -2713:2:1315 -2714:2:1316 -2715:2:1327 -2716:2:1328 -2717:2:1329 -2718:2:1327 -2719:2:1328 -2720:2:1329 -2721:2:1340 -2722:2:1345 -2723:2:1346 -2724:0:4365 -2725:2:1358 -2726:0:4365 -2727:2:1360 -2728:0:4365 -2729:3:3354 -2730:0:4365 -2731:2:1361 -2732:0:4365 -2733:3:3355 -2734:0:4365 -2735:2:1362 -2736:2:1366 -2737:2:1367 -2738:2:1375 -2739:2:1376 -2740:2:1380 -2741:2:1381 -2742:2:1375 -2743:2:1376 -2744:2:1380 -2745:2:1381 -2746:2:1389 -2747:2:1394 -2748:2:1398 -2749:2:1399 -2750:2:1406 -2751:2:1407 -2752:2:1418 -2753:2:1419 -2754:2:1420 -2755:2:1418 -2756:2:1419 -2757:2:1420 -2758:2:1431 -2759:2:1436 -2760:2:1437 -2761:0:4365 -2762:2:1449 -2763:0:4365 -2764:3:3354 -2765:0:4365 -2766:2:1451 -2767:0:4365 -2768:3:3355 -2769:0:4365 -2770:2:1652 -2771:0:4365 -2772:2:1653 -2773:0:4365 -2774:2:1657 -2775:0:4365 -2776:2:1180 -2777:0:4365 -2778:3:3354 -2779:0:4365 -2780:2:1181 -2781:2:1185 -2782:2:1186 -2783:2:1194 -2784:2:1195 -2785:2:1199 -2786:2:1200 -2787:2:1194 -2788:2:1195 -2789:2:1196 -2790:2:1208 -2791:2:1213 -2792:2:1217 -2793:2:1218 -2794:2:1225 -2795:2:1226 -2796:2:1237 -2797:2:1238 -2798:2:1239 -2799:2:1237 -2800:2:1238 -2801:2:1239 -2802:2:1250 -2803:2:1255 -2804:2:1256 -2805:0:4365 -2806:3:3355 -2807:0:4365 -2808:2:1268 -2809:0:4365 -2810:3:3354 -2811:0:4365 -2812:2:1270 -2813:0:4365 -2814:3:3355 -2815:0:4365 -2816:2:1271 -2817:2:1275 -2818:2:1276 -2819:2:1284 -2820:2:1285 -2821:2:1289 -2822:2:1290 -2823:2:1284 -2824:2:1285 -2825:2:1289 -2826:2:1290 -2827:2:1298 -2828:2:1303 -2829:2:1307 -2830:2:1308 -2831:2:1315 -2832:2:1316 -2833:2:1327 -2834:2:1328 -2835:2:1329 -2836:2:1327 -2837:2:1328 -2838:2:1329 -2839:2:1340 -2840:2:1345 -2841:2:1346 -2842:0:4365 -2843:2:1358 -2844:0:4365 -2845:2:1454 -2846:0:4365 -2847:3:3354 -2848:0:4365 -2849:2:1455 -2850:0:4365 -2851:3:3355 -2852:0:4365 -2853:2:1652 -2854:0:4365 -2855:2:1653 -2856:0:4365 -2857:2:1657 -2858:0:4365 -2859:2:1660 -2860:0:4365 -2861:3:3354 -2862:0:4365 -2863:2:1665 -2864:2:1669 -2865:2:1670 -2866:2:1678 -2867:2:1679 -2868:2:1683 -2869:2:1684 -2870:2:1678 -2871:2:1679 -2872:2:1680 -2873:2:1692 -2874:2:1697 -2875:2:1701 -2876:2:1702 -2877:2:1709 -2878:2:1710 -2879:2:1721 -2880:2:1722 -2881:2:1723 -2882:2:1721 -2883:2:1722 -2884:2:1723 -2885:2:1734 -2886:2:1739 -2887:2:1740 -2888:0:4365 -2889:3:3355 -2890:0:4365 -2891:2:1752 -2892:0:4365 -2893:3:3354 -2894:0:4365 -2895:2:1754 -2896:0:4365 -2897:3:3355 -2898:0:4365 -2899:2:1755 -2900:2:1759 -2901:2:1760 -2902:2:1768 -2903:2:1769 -2904:2:1773 -2905:2:1774 -2906:2:1768 -2907:2:1769 -2908:2:1773 -2909:2:1774 -2910:2:1782 -2911:2:1787 -2912:2:1791 -2913:2:1792 -2914:2:1799 -2915:2:1800 -2916:2:1811 -2917:2:1812 -2918:2:1813 -2919:2:1811 -2920:2:1812 -2921:2:1813 -2922:2:1824 -2923:2:1829 -2924:2:1830 -2925:0:4365 -2926:2:1842 -2927:0:4365 -2928:3:3354 -2929:0:4365 -2930:2:1844 -2931:0:4365 -2932:3:3355 -2933:0:4365 -2934:2:1845 -2935:2:1849 -2936:2:1850 -2937:2:1858 -2938:2:1859 -2939:2:1863 -2940:2:1864 -2941:2:1858 -2942:2:1859 -2943:2:1863 -2944:2:1864 -2945:2:1872 -2946:2:1877 -2947:2:1881 -2948:2:1882 -2949:2:1889 -2950:2:1890 -2951:2:1901 -2952:2:1902 -2953:2:1903 -2954:2:1901 -2955:2:1902 -2956:2:1903 -2957:2:1914 -2958:2:1919 -2959:2:1920 -2960:0:4365 -2961:2:1932 -2962:0:4365 -2963:3:3354 -2964:0:4365 -2965:2:1934 -2966:0:4365 -2967:3:3355 -2968:0:4365 -2969:2:1935 -2970:0:4365 -2971:2:1936 -2972:0:4365 -2973:2:2129 -2974:0:4365 -2975:2:2130 -2976:0:4365 -2977:2:2134 -2978:0:4365 -2979:3:3354 -2980:0:4365 -2981:2:2136 -2982:0:4365 -2983:3:3355 -2984:0:4365 -2985:2:2137 -2986:2:2141 -2987:2:2142 -2988:2:2150 -2989:2:2151 -2990:2:2155 -2991:2:2156 -2992:2:2150 -2993:2:2151 -2994:2:2155 -2995:2:2156 -2996:2:2164 -2997:2:2169 -2998:2:2173 -2999:2:2174 -3000:2:2181 -3001:2:2182 -3002:2:2193 -3003:2:2194 -3004:2:2195 -3005:2:2193 -3006:2:2194 -3007:2:2195 -3008:2:2206 -3009:2:2211 -3010:2:2212 -3011:0:4365 -3012:2:2224 -3013:0:4365 -3014:3:3354 -3015:0:4365 -3016:2:2226 -3017:0:4365 -3018:3:3355 -3019:0:4365 -3020:2:1936 -3021:0:4365 -3022:2:2129 -3023:0:4365 -3024:2:2130 -3025:0:4365 -3026:2:2134 -3027:0:4365 -3028:3:3354 -3029:0:4365 -3030:2:2136 -3031:0:4365 -3032:3:3355 -3033:0:4365 -3034:2:2137 -3035:2:2141 -3036:2:2142 -3037:2:2150 -3038:2:2151 -3039:2:2155 -3040:2:2156 -3041:2:2150 -3042:2:2151 -3043:2:2152 -3044:2:2164 -3045:2:2169 -3046:2:2173 -3047:2:2174 -3048:2:2181 -3049:2:2182 -3050:2:2193 -3051:2:2194 -3052:2:2195 -3053:2:2193 -3054:2:2194 -3055:2:2195 -3056:2:2206 -3057:2:2211 -3058:2:2212 -3059:0:4365 -3060:2:2224 -3061:0:4365 -3062:3:3354 -3063:0:4365 -3064:2:2226 -3065:0:4365 -3066:3:3355 -3067:0:4365 -3068:2:2230 -3069:0:4365 -3070:3:3354 -3071:0:4365 -3072:2:2235 -3073:2:2239 -3074:2:2240 -3075:2:2248 -3076:2:2249 -3077:2:2253 -3078:2:2254 -3079:2:2248 -3080:2:2249 -3081:2:2250 -3082:2:2262 -3083:2:2267 -3084:2:2271 -3085:2:2272 -3086:2:2279 -3087:2:2280 -3088:2:2291 -3089:2:2292 -3090:2:2293 -3091:2:2291 -3092:2:2292 -3093:2:2293 -3094:2:2304 -3095:2:2309 -3096:2:2310 -3097:0:4365 -3098:3:3355 -3099:0:4365 -3100:2:2322 -3101:0:4365 -3102:2:1169 -3103:0:4365 -3104:3:3354 -3105:0:4365 -3106:2:1170 -3107:0:4365 -3108:3:3355 -3109:0:4365 -3110:3:3356 -3111:0:4365 -3112:3:3366 -3113:0:4365 -3114:3:2951 -3115:0:4365 -3116:3:2952 -3117:0:4365 -3118:3:2953 -3119:0:4365 -3120:3:2954 -3121:3:2958 -3122:3:2959 -3123:3:2967 -3124:3:2968 -3125:3:2972 -3126:3:2973 -3127:3:2967 -3128:3:2968 -3129:3:2972 -3130:3:2973 -3131:3:2981 -3132:3:2986 -3133:3:2990 -3134:3:2991 -3135:3:2998 -3136:3:2999 -3137:3:3010 -3138:3:3011 -3139:3:3012 -3140:3:3010 -3141:3:3011 -3142:3:3012 -3143:3:3023 -3144:3:3028 -3145:3:3029 -3146:0:4365 -3147:3:3041 -3148:0:4365 -3149:3:3042 -3150:0:4365 -3151:2:1173 -3152:0:4365 -3153:3:3043 -3154:0:4365 -3155:2:1179 -3156:0:4365 -3157:2:1180 -3158:0:4365 -3159:3:3042 -3160:0:4365 -3161:2:1181 -3162:2:1185 -3163:2:1186 -3164:2:1194 -3165:2:1195 -3166:2:1199 -3167:2:1200 -3168:2:1194 -3169:2:1195 -3170:2:1199 -3171:2:1200 -3172:2:1208 -3173:2:1213 -3174:2:1217 -3175:2:1218 -3176:2:1225 -3177:2:1226 -3178:2:1237 -3179:2:1238 -3180:2:1239 -3181:2:1237 -3182:2:1238 -3183:2:1239 -3184:2:1250 -3185:2:1255 -3186:2:1256 -3187:0:4365 -3188:3:3043 -3189:0:4365 -3190:2:1268 -3191:0:4365 -3192:3:3042 -3193:0:4365 -3194:2:1270 -3195:0:4365 -3196:3:3043 -3197:0:4365 -3198:2:1271 -3199:2:1275 -3200:2:1276 -3201:2:1284 -3202:2:1285 -3203:2:1289 -3204:2:1290 -3205:2:1284 -3206:2:1285 -3207:2:1289 -3208:2:1290 -3209:2:1298 -3210:2:1303 -3211:2:1307 -3212:2:1308 -3213:2:1315 -3214:2:1316 -3215:2:1327 -3216:2:1328 -3217:2:1329 -3218:2:1327 -3219:2:1328 -3220:2:1329 -3221:2:1340 -3222:2:1345 -3223:2:1346 -3224:0:4365 -3225:2:1358 -3226:0:4365 -3227:2:1360 -3228:0:4365 -3229:3:3042 -3230:0:4365 -3231:2:1361 -3232:0:4365 -3233:3:3043 -3234:0:4365 -3235:2:1362 -3236:2:1366 -3237:2:1367 -3238:2:1375 -3239:2:1376 -3240:2:1380 -3241:2:1381 -3242:2:1375 -3243:2:1376 -3244:2:1380 -3245:2:1381 -3246:2:1389 -3247:2:1394 -3248:2:1398 -3249:2:1399 -3250:2:1406 -3251:2:1407 -3252:2:1418 -3253:2:1419 -3254:2:1420 -3255:2:1418 -3256:2:1419 -3257:2:1420 -3258:2:1431 -3259:2:1436 -3260:2:1437 -3261:0:4365 -3262:2:1449 -3263:0:4365 -3264:3:3042 -3265:0:4365 -3266:2:1451 -3267:0:4365 -3268:3:3043 -3269:0:4365 -3270:2:1652 -3271:0:4365 -3272:2:1653 -3273:0:4365 -3274:2:1657 -3275:0:4365 -3276:2:1180 -3277:0:4365 -3278:3:3042 -3279:0:4365 -3280:2:1181 -3281:2:1185 -3282:2:1186 -3283:2:1194 -3284:2:1195 -3285:2:1199 -3286:2:1200 -3287:2:1194 -3288:2:1195 -3289:2:1196 -3290:2:1208 -3291:2:1213 -3292:2:1217 -3293:2:1218 -3294:2:1225 -3295:2:1226 -3296:2:1237 -3297:2:1238 -3298:2:1239 -3299:2:1237 -3300:2:1238 -3301:2:1239 -3302:2:1250 -3303:2:1255 -3304:2:1256 -3305:0:4365 -3306:3:3043 -3307:0:4365 -3308:2:1268 -3309:0:4365 -3310:3:3042 -3311:0:4365 -3312:2:1270 -3313:0:4365 -3314:3:3043 -3315:0:4365 -3316:2:1271 -3317:2:1275 -3318:2:1276 -3319:2:1284 -3320:2:1285 -3321:2:1289 -3322:2:1290 -3323:2:1284 -3324:2:1285 -3325:2:1289 -3326:2:1290 -3327:2:1298 -3328:2:1303 -3329:2:1307 -3330:2:1308 -3331:2:1315 -3332:2:1316 -3333:2:1327 -3334:2:1328 -3335:2:1329 -3336:2:1327 -3337:2:1328 -3338:2:1329 -3339:2:1340 -3340:2:1345 -3341:2:1346 -3342:0:4365 -3343:2:1358 -3344:0:4365 -3345:2:1454 -3346:0:4365 -3347:3:3042 -3348:0:4365 -3349:2:1455 -3350:0:4365 -3351:3:3043 -3352:0:4365 -3353:2:1652 -3354:0:4365 -3355:2:1653 -3356:0:4365 -3357:2:1657 -3358:0:4365 -3359:2:1660 -3360:0:4365 -3361:3:3042 -3362:0:4365 -3363:2:1665 -3364:2:1669 -3365:2:1670 -3366:2:1678 -3367:2:1679 -3368:2:1683 -3369:2:1684 -3370:2:1678 -3371:2:1679 -3372:2:1680 -3373:2:1692 -3374:2:1697 -3375:2:1701 -3376:2:1702 -3377:2:1709 -3378:2:1710 -3379:2:1721 -3380:2:1722 -3381:2:1723 -3382:2:1721 -3383:2:1722 -3384:2:1723 -3385:2:1734 -3386:2:1739 -3387:2:1740 -3388:0:4365 -3389:3:3043 -3390:0:4365 -3391:2:1752 -3392:0:4365 -3393:3:3042 -3394:0:4365 -3395:2:1754 -3396:0:4365 -3397:3:3043 -3398:0:4365 -3399:2:1755 -3400:2:1759 -3401:2:1760 -3402:2:1768 -3403:2:1769 -3404:2:1773 -3405:2:1774 -3406:2:1768 -3407:2:1769 -3408:2:1773 -3409:2:1774 -3410:2:1782 -3411:2:1787 -3412:2:1791 -3413:2:1792 -3414:2:1799 -3415:2:1800 -3416:2:1811 -3417:2:1812 -3418:2:1813 -3419:2:1811 -3420:2:1812 -3421:2:1813 -3422:2:1824 -3423:2:1829 -3424:2:1830 -3425:0:4365 -3426:2:1842 -3427:0:4365 -3428:3:3042 -3429:0:4365 -3430:2:1844 -3431:0:4365 -3432:3:3043 -3433:0:4365 -3434:2:1845 -3435:2:1849 -3436:2:1850 -3437:2:1858 -3438:2:1859 -3439:2:1863 -3440:2:1864 -3441:2:1858 -3442:2:1859 -3443:2:1863 -3444:2:1864 -3445:2:1872 -3446:2:1877 -3447:2:1881 -3448:2:1882 -3449:2:1889 -3450:2:1890 -3451:2:1901 -3452:2:1902 -3453:2:1903 -3454:2:1901 -3455:2:1902 -3456:2:1903 -3457:2:1914 -3458:2:1919 -3459:2:1920 -3460:0:4365 -3461:2:1932 -3462:0:4365 -3463:3:3042 -3464:0:4365 -3465:2:1934 -3466:0:4365 -3467:3:3043 -3468:0:4365 -3469:2:1935 -3470:0:4365 -3471:2:1936 -3472:0:4365 -3473:2:2129 -3474:0:4365 -3475:2:2130 -3476:0:4365 -3477:2:2134 -3478:0:4365 -3479:3:3042 -3480:0:4365 -3481:2:2136 -3482:0:4365 -3483:3:3043 -3484:0:4365 -3485:2:2137 -3486:2:2141 -3487:2:2142 -3488:2:2150 -3489:2:2151 -3490:2:2155 -3491:2:2156 -3492:2:2150 -3493:2:2151 -3494:2:2155 -3495:2:2156 -3496:2:2164 -3497:2:2169 -3498:2:2173 -3499:2:2174 -3500:2:2181 -3501:2:2182 -3502:2:2193 -3503:2:2194 -3504:2:2195 -3505:2:2193 -3506:2:2194 -3507:2:2195 -3508:2:2206 -3509:2:2211 -3510:2:2212 -3511:0:4365 -3512:2:2224 -3513:0:4365 -3514:3:3042 -3515:0:4365 -3516:2:2226 -3517:0:4365 -3518:3:3043 -3519:0:4365 -3520:2:1936 -3521:0:4365 -3522:2:2129 -3523:0:4365 -3524:2:2130 -3525:0:4365 -3526:2:2134 -3527:0:4365 -3528:3:3042 -3529:0:4365 -3530:2:2136 -3531:0:4365 -3532:3:3043 -3533:0:4365 -3534:2:2137 -3535:2:2141 -3536:2:2142 -3537:2:2150 -3538:2:2151 -3539:2:2155 -3540:2:2156 -3541:2:2150 -3542:2:2151 -3543:2:2152 -3544:2:2164 -3545:2:2169 -3546:2:2173 -3547:2:2174 -3548:2:2181 -3549:2:2182 -3550:2:2193 -3551:2:2194 -3552:2:2195 -3553:2:2193 -3554:2:2194 -3555:2:2195 -3556:2:2206 -3557:2:2211 -3558:2:2212 -3559:0:4365 -3560:2:2224 -3561:0:4365 -3562:3:3042 -3563:0:4365 -3564:2:2226 -3565:0:4365 -3566:3:3043 -3567:0:4365 -3568:2:2230 -3569:0:4365 -3570:3:3042 -3571:0:4365 -3572:2:2235 -3573:2:2239 -3574:2:2240 -3575:2:2248 -3576:2:2249 -3577:2:2253 -3578:2:2254 -3579:2:2248 -3580:2:2249 -3581:2:2250 -3582:2:2262 -3583:2:2267 -3584:2:2271 -3585:2:2272 -3586:2:2279 -3587:2:2280 -3588:2:2291 -3589:2:2292 -3590:2:2293 -3591:2:2291 -3592:2:2292 -3593:2:2293 -3594:2:2304 -3595:2:2309 -3596:2:2310 -3597:0:4365 -3598:3:3043 -3599:0:4365 -3600:2:2322 -3601:0:4365 -3602:2:1169 -3603:0:4365 -3604:3:3042 -3605:0:4365 -3606:2:1170 -3607:0:4365 -3608:3:3043 -3609:0:4365 -3610:3:3044 -3611:0:4365 -3612:3:3257 -3613:0:4365 -3614:3:3362 -3615:0:4365 -3616:3:3363 -3617:0:4365 -3618:3:3367 -3619:0:4365 -3620:3:3373 -3621:3:3377 -3622:3:3378 -3623:3:3386 -3624:3:3387 -3625:3:3391 -3626:3:3392 -3627:3:3386 -3628:3:3387 -3629:3:3391 -3630:3:3392 -3631:3:3400 -3632:3:3405 -3633:3:3409 -3634:3:3410 -3635:3:3417 -3636:3:3418 -3637:3:3429 -3638:3:3430 -3639:3:3431 -3640:3:3429 -3641:3:3430 -3642:3:3431 -3643:3:3442 -3644:3:3447 -3645:3:3448 -3646:0:4365 -3647:3:3460 -3648:0:4365 -3649:3:3461 -3650:0:4365 -3651:2:1173 -3652:0:4365 -3653:3:3462 -3654:0:4365 -3655:2:1179 -3656:0:4365 -3657:2:1180 -3658:0:4365 -3659:3:3461 -3660:0:4365 -3661:2:1181 -3662:2:1185 -3663:2:1186 -3664:2:1194 -3665:2:1195 -3666:2:1199 -3667:2:1200 -3668:2:1194 -3669:2:1195 -3670:2:1199 -3671:2:1200 -3672:2:1208 -3673:2:1213 -3674:2:1217 -3675:2:1218 -3676:2:1225 -3677:2:1226 -3678:2:1237 -3679:2:1238 -3680:2:1239 -3681:2:1237 -3682:2:1238 -3683:2:1239 -3684:2:1250 -3685:2:1255 -3686:2:1256 -3687:0:4365 -3688:3:3462 -3689:0:4365 -3690:2:1268 -3691:0:4365 -3692:3:3461 -3693:0:4365 -3694:2:1270 -3695:0:4365 -3696:3:3462 -3697:0:4365 -3698:2:1271 -3699:2:1275 -3700:2:1276 -3701:2:1284 -3702:2:1285 -3703:2:1289 -3704:2:1290 -3705:2:1284 -3706:2:1285 -3707:2:1289 -3708:2:1290 -3709:2:1298 -3710:2:1303 -3711:2:1307 -3712:2:1308 -3713:2:1315 -3714:2:1316 -3715:2:1327 -3716:2:1328 -3717:2:1329 -3718:2:1327 -3719:2:1328 -3720:2:1329 -3721:2:1340 -3722:2:1345 -3723:2:1346 -3724:0:4365 -3725:2:1358 -3726:0:4365 -3727:2:1360 -3728:0:4365 -3729:3:3461 -3730:0:4365 -3731:2:1361 -3732:0:4365 -3733:3:3462 -3734:0:4365 -3735:2:1362 -3736:2:1366 -3737:2:1367 -3738:2:1375 -3739:2:1376 -3740:2:1380 -3741:2:1381 -3742:2:1375 -3743:2:1376 -3744:2:1380 -3745:2:1381 -3746:2:1389 -3747:2:1394 -3748:2:1398 -3749:2:1399 -3750:2:1406 -3751:2:1407 -3752:2:1418 -3753:2:1419 -3754:2:1420 -3755:2:1418 -3756:2:1419 -3757:2:1420 -3758:2:1431 -3759:2:1436 -3760:2:1437 -3761:0:4365 -3762:2:1449 -3763:0:4365 -3764:3:3461 -3765:0:4365 -3766:2:1451 -3767:0:4365 -3768:3:3462 -3769:0:4365 -3770:2:1652 -3771:0:4365 -3772:2:1653 -3773:0:4365 -3774:2:1657 -3775:0:4365 -3776:2:1180 -3777:0:4365 -3778:3:3461 -3779:0:4365 -3780:2:1181 -3781:2:1185 -3782:2:1186 -3783:2:1194 -3784:2:1195 -3785:2:1199 -3786:2:1200 -3787:2:1194 -3788:2:1195 -3789:2:1196 -3790:2:1208 -3791:2:1213 -3792:2:1217 -3793:2:1218 -3794:2:1225 -3795:2:1226 -3796:2:1237 -3797:2:1238 -3798:2:1239 -3799:2:1237 -3800:2:1238 -3801:2:1239 -3802:2:1250 -3803:2:1255 -3804:2:1256 -3805:0:4365 -3806:3:3462 -3807:0:4365 -3808:2:1268 -3809:0:4365 -3810:3:3461 -3811:0:4365 -3812:2:1270 -3813:0:4365 -3814:3:3462 -3815:0:4365 -3816:2:1271 -3817:2:1275 -3818:2:1276 -3819:2:1284 -3820:2:1285 -3821:2:1289 -3822:2:1290 -3823:2:1284 -3824:2:1285 -3825:2:1289 -3826:2:1290 -3827:2:1298 -3828:2:1303 -3829:2:1307 -3830:2:1308 -3831:2:1315 -3832:2:1316 -3833:2:1327 -3834:2:1328 -3835:2:1329 -3836:2:1327 -3837:2:1328 -3838:2:1329 -3839:2:1340 -3840:2:1345 -3841:2:1346 -3842:0:4365 -3843:2:1358 -3844:0:4365 -3845:2:1454 -3846:0:4365 -3847:3:3461 -3848:0:4365 -3849:2:1455 -3850:0:4365 -3851:3:3462 -3852:0:4365 -3853:2:1652 -3854:0:4365 -3855:2:1653 -3856:0:4365 -3857:2:1657 -3858:0:4365 -3859:2:1660 -3860:0:4365 -3861:3:3461 -3862:0:4365 -3863:2:1665 -3864:2:1669 -3865:2:1670 -3866:2:1678 -3867:2:1679 -3868:2:1683 -3869:2:1684 -3870:2:1678 -3871:2:1679 -3872:2:1680 -3873:2:1692 -3874:2:1697 -3875:2:1701 -3876:2:1702 -3877:2:1709 -3878:2:1710 -3879:2:1721 -3880:2:1722 -3881:2:1723 -3882:2:1721 -3883:2:1722 -3884:2:1723 -3885:2:1734 -3886:2:1739 -3887:2:1740 -3888:0:4365 -3889:3:3462 -3890:0:4365 -3891:2:1752 -3892:0:4365 -3893:3:3461 -3894:0:4365 -3895:2:1754 -3896:0:4365 -3897:3:3462 -3898:0:4365 -3899:2:1755 -3900:2:1759 -3901:2:1760 -3902:2:1768 -3903:2:1769 -3904:2:1773 -3905:2:1774 -3906:2:1768 -3907:2:1769 -3908:2:1773 -3909:2:1774 -3910:2:1782 -3911:2:1787 -3912:2:1791 -3913:2:1792 -3914:2:1799 -3915:2:1800 -3916:2:1811 -3917:2:1812 -3918:2:1813 -3919:2:1811 -3920:2:1812 -3921:2:1813 -3922:2:1824 -3923:2:1829 -3924:2:1830 -3925:0:4365 -3926:2:1842 -3927:0:4365 -3928:3:3461 -3929:0:4365 -3930:2:1844 -3931:0:4365 -3932:3:3462 -3933:0:4365 -3934:2:1845 -3935:2:1849 -3936:2:1850 -3937:2:1858 -3938:2:1859 -3939:2:1863 -3940:2:1864 -3941:2:1858 -3942:2:1859 -3943:2:1863 -3944:2:1864 -3945:2:1872 -3946:2:1877 -3947:2:1881 -3948:2:1882 -3949:2:1889 -3950:2:1890 -3951:2:1901 -3952:2:1902 -3953:2:1903 -3954:2:1901 -3955:2:1902 -3956:2:1903 -3957:2:1914 -3958:2:1919 -3959:2:1920 -3960:0:4365 -3961:2:1932 -3962:0:4365 -3963:3:3461 -3964:0:4365 -3965:2:1934 -3966:0:4365 -3967:3:3462 -3968:0:4365 -3969:2:1935 -3970:0:4365 -3971:2:1936 -3972:0:4365 -3973:2:2129 -3974:0:4365 -3975:2:2130 -3976:0:4365 -3977:2:2134 -3978:0:4365 -3979:3:3461 -3980:0:4365 -3981:2:2136 -3982:0:4365 -3983:3:3462 -3984:0:4365 -3985:2:2137 -3986:2:2141 -3987:2:2142 -3988:2:2150 -3989:2:2151 -3990:2:2155 -3991:2:2156 -3992:2:2150 -3993:2:2151 -3994:2:2155 -3995:2:2156 -3996:2:2164 -3997:2:2169 -3998:2:2173 -3999:2:2174 -4000:2:2181 -4001:2:2182 -4002:2:2193 -4003:2:2194 -4004:2:2195 -4005:2:2193 -4006:2:2194 -4007:2:2195 -4008:2:2206 -4009:2:2211 -4010:2:2212 -4011:0:4365 -4012:2:2224 -4013:0:4365 -4014:3:3461 -4015:0:4365 -4016:2:2226 -4017:0:4365 -4018:3:3462 -4019:0:4365 -4020:2:1936 -4021:0:4365 -4022:2:2129 -4023:0:4365 -4024:2:2130 -4025:0:4365 -4026:2:2134 -4027:0:4365 -4028:3:3461 -4029:0:4365 -4030:2:2136 -4031:0:4365 -4032:3:3462 -4033:0:4365 -4034:2:2137 -4035:2:2141 -4036:2:2142 -4037:2:2150 -4038:2:2151 -4039:2:2155 -4040:2:2156 -4041:2:2150 -4042:2:2151 -4043:2:2152 -4044:2:2164 -4045:2:2169 -4046:2:2173 -4047:2:2174 -4048:2:2181 -4049:2:2182 -4050:2:2193 -4051:2:2194 -4052:2:2195 -4053:2:2193 -4054:2:2194 -4055:2:2195 -4056:2:2206 -4057:2:2211 -4058:2:2212 -4059:0:4365 -4060:2:2224 -4061:0:4365 -4062:3:3461 -4063:0:4365 -4064:2:2226 -4065:0:4365 -4066:3:3462 -4067:0:4365 -4068:2:2230 -4069:0:4365 -4070:3:3461 -4071:0:4365 -4072:2:2235 -4073:2:2239 -4074:2:2240 -4075:2:2248 -4076:2:2249 -4077:2:2253 -4078:2:2254 -4079:2:2248 -4080:2:2249 -4081:2:2250 -4082:2:2262 -4083:2:2267 -4084:2:2271 -4085:2:2272 -4086:2:2279 -4087:2:2280 -4088:2:2291 -4089:2:2292 -4090:2:2293 -4091:2:2291 -4092:2:2292 -4093:2:2293 -4094:2:2304 -4095:2:2309 -4096:2:2310 -4097:0:4365 -4098:3:3462 -4099:0:4365 -4100:2:2322 -4101:0:4365 -4102:2:1169 -4103:0:4365 -4104:3:3461 -4105:0:4365 -4106:2:1170 -4107:0:4365 -4108:3:3462 -4109:0:4365 -4110:3:3463 -4111:0:4365 -4112:3:3469 -4113:0:4365 -4114:3:3470 -4115:3:3474 -4116:3:3475 -4117:3:3483 -4118:3:3484 -4119:3:3488 -4120:3:3489 -4121:3:3483 -4122:3:3484 -4123:3:3488 -4124:3:3489 -4125:3:3497 -4126:3:3502 -4127:3:3506 -4128:3:3507 -4129:3:3514 -4130:3:3515 -4131:3:3526 -4132:3:3527 -4133:3:3528 -4134:3:3526 -4135:3:3527 -4136:3:3528 -4137:3:3539 -4138:3:3544 -4139:3:3545 -4140:0:4365 -4141:3:3557 -4142:0:4365 -4143:3:3558 -4144:0:4365 -4145:2:1173 -4146:0:4365 -4147:3:3559 -4148:0:4365 -4149:2:1179 -4150:0:4365 -4151:2:1180 -4152:0:4365 -4153:3:3558 -4154:0:4365 -4155:2:1181 -4156:2:1185 -4157:2:1186 -4158:2:1194 -4159:2:1195 -4160:2:1199 -4161:2:1200 -4162:2:1194 -4163:2:1195 -4164:2:1199 -4165:2:1200 -4166:2:1208 -4167:2:1213 -4168:2:1217 -4169:2:1218 -4170:2:1225 -4171:2:1226 -4172:2:1237 -4173:2:1238 -4174:2:1239 -4175:2:1237 -4176:2:1238 -4177:2:1239 -4178:2:1250 -4179:2:1255 -4180:2:1256 -4181:0:4365 -4182:3:3559 -4183:0:4365 -4184:2:1268 -4185:0:4365 -4186:3:3558 -4187:0:4365 -4188:2:1270 -4189:0:4365 -4190:3:3559 -4191:0:4365 -4192:2:1271 -4193:2:1275 -4194:2:1276 -4195:2:1284 -4196:2:1285 -4197:2:1289 -4198:2:1290 -4199:2:1284 -4200:2:1285 -4201:2:1289 -4202:2:1290 -4203:2:1298 -4204:2:1303 -4205:2:1307 -4206:2:1308 -4207:2:1315 -4208:2:1316 -4209:2:1327 -4210:2:1328 -4211:2:1329 -4212:2:1327 -4213:2:1328 -4214:2:1329 -4215:2:1340 -4216:2:1345 -4217:2:1346 -4218:0:4365 -4219:2:1358 -4220:0:4365 -4221:2:1360 -4222:0:4365 -4223:3:3558 -4224:0:4365 -4225:2:1361 -4226:0:4365 -4227:3:3559 -4228:0:4365 -4229:2:1362 -4230:2:1366 -4231:2:1367 -4232:2:1375 -4233:2:1376 -4234:2:1380 -4235:2:1381 -4236:2:1375 -4237:2:1376 -4238:2:1380 -4239:2:1381 -4240:2:1389 -4241:2:1394 -4242:2:1398 -4243:2:1399 -4244:2:1406 -4245:2:1407 -4246:2:1418 -4247:2:1419 -4248:2:1420 -4249:2:1418 -4250:2:1419 -4251:2:1420 -4252:2:1431 -4253:2:1436 -4254:2:1437 -4255:0:4365 -4256:2:1449 -4257:0:4365 -4258:3:3558 -4259:0:4365 -4260:2:1451 -4261:0:4365 -4262:3:3559 -4263:0:4365 -4264:2:1652 -4265:0:4365 -4266:2:1653 -4267:0:4365 -4268:2:1657 -4269:0:4365 -4270:2:1180 -4271:0:4365 -4272:3:3558 -4273:0:4365 -4274:2:1181 -4275:2:1185 -4276:2:1186 -4277:2:1194 -4278:2:1195 -4279:2:1199 -4280:2:1200 -4281:2:1194 -4282:2:1195 -4283:2:1196 -4284:2:1208 -4285:2:1213 -4286:2:1217 -4287:2:1218 -4288:2:1225 -4289:2:1226 -4290:2:1237 -4291:2:1238 -4292:2:1239 -4293:2:1237 -4294:2:1238 -4295:2:1239 -4296:2:1250 -4297:2:1255 -4298:2:1256 -4299:0:4365 -4300:3:3559 -4301:0:4365 -4302:2:1268 -4303:0:4365 -4304:3:3558 -4305:0:4365 -4306:2:1270 -4307:0:4365 -4308:3:3559 -4309:0:4365 -4310:2:1271 -4311:2:1275 -4312:2:1276 -4313:2:1284 -4314:2:1285 -4315:2:1289 -4316:2:1290 -4317:2:1284 -4318:2:1285 -4319:2:1289 -4320:2:1290 -4321:2:1298 -4322:2:1303 -4323:2:1307 -4324:2:1308 -4325:2:1315 -4326:2:1316 -4327:2:1327 -4328:2:1328 -4329:2:1329 -4330:2:1327 -4331:2:1328 -4332:2:1329 -4333:2:1340 -4334:2:1345 -4335:2:1346 -4336:0:4365 -4337:2:1358 -4338:0:4365 -4339:2:1454 -4340:0:4365 -4341:3:3558 -4342:0:4365 -4343:2:1455 -4344:0:4365 -4345:3:3559 -4346:0:4365 -4347:2:1652 -4348:0:4365 -4349:2:1653 -4350:0:4365 -4351:2:1657 -4352:0:4365 -4353:2:1660 -4354:0:4365 -4355:3:3558 -4356:0:4365 -4357:2:1665 -4358:2:1669 -4359:2:1670 -4360:2:1678 -4361:2:1679 -4362:2:1683 -4363:2:1684 -4364:2:1678 -4365:2:1679 -4366:2:1680 -4367:2:1692 -4368:2:1697 -4369:2:1701 -4370:2:1702 -4371:2:1709 -4372:2:1710 -4373:2:1721 -4374:2:1722 -4375:2:1723 -4376:2:1721 -4377:2:1722 -4378:2:1723 -4379:2:1734 -4380:2:1739 -4381:2:1740 -4382:0:4365 -4383:3:3559 -4384:0:4365 -4385:2:1752 -4386:0:4365 -4387:3:3558 -4388:0:4365 -4389:2:1754 -4390:0:4365 -4391:3:3559 -4392:0:4365 -4393:2:1755 -4394:2:1759 -4395:2:1760 -4396:2:1768 -4397:2:1769 -4398:2:1773 -4399:2:1774 -4400:2:1768 -4401:2:1769 -4402:2:1773 -4403:2:1774 -4404:2:1782 -4405:2:1787 -4406:2:1791 -4407:2:1792 -4408:2:1799 -4409:2:1800 -4410:2:1811 -4411:2:1812 -4412:2:1813 -4413:2:1811 -4414:2:1812 -4415:2:1813 -4416:2:1824 -4417:2:1829 -4418:2:1830 -4419:0:4365 -4420:2:1842 -4421:0:4365 -4422:3:3558 -4423:0:4365 -4424:2:1844 -4425:0:4365 -4426:3:3559 -4427:0:4365 -4428:2:1845 -4429:2:1849 -4430:2:1850 -4431:2:1858 -4432:2:1859 -4433:2:1863 -4434:2:1864 -4435:2:1858 -4436:2:1859 -4437:2:1863 -4438:2:1864 -4439:2:1872 -4440:2:1877 -4441:2:1881 -4442:2:1882 -4443:2:1889 -4444:2:1890 -4445:2:1901 -4446:2:1902 -4447:2:1903 -4448:2:1901 -4449:2:1902 -4450:2:1903 -4451:2:1914 -4452:2:1919 -4453:2:1920 -4454:0:4365 -4455:2:1932 -4456:0:4365 -4457:3:3558 -4458:0:4365 -4459:2:1934 -4460:0:4365 -4461:3:3559 -4462:0:4365 -4463:2:1935 -4464:0:4365 -4465:2:1936 -4466:0:4365 -4467:2:2129 -4468:0:4365 -4469:2:2130 -4470:0:4365 -4471:2:2134 -4472:0:4365 -4473:3:3558 -4474:0:4365 -4475:2:2136 -4476:0:4365 -4477:3:3559 -4478:0:4365 -4479:2:2137 -4480:2:2141 -4481:2:2142 -4482:2:2150 -4483:2:2151 -4484:2:2155 -4485:2:2156 -4486:2:2150 -4487:2:2151 -4488:2:2155 -4489:2:2156 -4490:2:2164 -4491:2:2169 -4492:2:2173 -4493:2:2174 -4494:2:2181 -4495:2:2182 -4496:2:2193 -4497:2:2194 -4498:2:2195 -4499:2:2193 -4500:2:2194 -4501:2:2195 -4502:2:2206 -4503:2:2211 -4504:2:2212 -4505:0:4365 -4506:2:2224 -4507:0:4365 -4508:3:3558 -4509:0:4365 -4510:2:2226 -4511:0:4365 -4512:3:3559 -4513:0:4365 -4514:2:1936 -4515:0:4365 -4516:2:2129 -4517:0:4365 -4518:2:2130 -4519:0:4365 -4520:2:2134 -4521:0:4365 -4522:3:3558 -4523:0:4365 -4524:2:2136 -4525:0:4365 -4526:3:3559 -4527:0:4365 -4528:2:2137 -4529:2:2141 -4530:2:2142 -4531:2:2150 -4532:2:2151 -4533:2:2155 -4534:2:2156 -4535:2:2150 -4536:2:2151 -4537:2:2152 -4538:2:2164 -4539:2:2169 -4540:2:2173 -4541:2:2174 -4542:2:2181 -4543:2:2182 -4544:2:2193 -4545:2:2194 -4546:2:2195 -4547:2:2193 -4548:2:2194 -4549:2:2195 -4550:2:2206 -4551:2:2211 -4552:2:2212 -4553:0:4365 -4554:2:2224 -4555:0:4365 -4556:3:3558 -4557:0:4365 -4558:2:2226 -4559:0:4365 -4560:3:3559 -4561:0:4365 -4562:2:2230 -4563:0:4365 -4564:3:3558 -4565:0:4365 -4566:2:2235 -4567:2:2239 -4568:2:2240 -4569:2:2248 -4570:2:2249 -4571:2:2253 -4572:2:2254 -4573:2:2248 -4574:2:2249 -4575:2:2250 -4576:2:2262 -4577:2:2267 -4578:2:2271 -4579:2:2272 -4580:2:2279 -4581:2:2280 -4582:2:2291 -4583:2:2292 -4584:2:2293 -4585:2:2291 -4586:2:2292 -4587:2:2293 -4588:2:2304 -4589:2:2309 -4590:2:2310 -4591:0:4365 -4592:3:3559 -4593:0:4365 -4594:2:2322 -4595:0:4365 -4596:2:1169 -4597:0:4365 -4598:3:3558 -4599:0:4365 -4600:2:1170 -4601:0:4365 -4602:3:3559 -4603:0:4365 -4604:3:3560 -4605:0:4365 -4606:3:3566 -4607:0:4365 -4608:3:3569 -4609:3:3570 -4610:3:3582 -4611:3:3583 -4612:3:3587 -4613:3:3588 -4614:3:3582 -4615:3:3583 -4616:3:3587 -4617:3:3588 -4618:3:3596 -4619:3:3601 -4620:3:3605 -4621:3:3606 -4622:3:3613 -4623:3:3614 -4624:3:3625 -4625:3:3626 -4626:3:3627 -4627:3:3625 -4628:3:3626 -4629:3:3627 -4630:3:3638 -4631:3:3643 -4632:3:3644 -4633:0:4365 -4634:3:3656 -4635:0:4365 -4636:3:3657 -4637:0:4365 -4638:2:1173 -4639:0:4365 -4640:3:3658 -4641:0:4365 -4642:2:1179 -4643:0:4365 -4644:2:1180 -4645:0:4365 -4646:3:3657 -4647:0:4365 -4648:2:1181 -4649:2:1185 -4650:2:1186 -4651:2:1194 -4652:2:1195 -4653:2:1199 -4654:2:1200 -4655:2:1194 -4656:2:1195 -4657:2:1199 -4658:2:1200 -4659:2:1208 -4660:2:1213 -4661:2:1217 -4662:2:1218 -4663:2:1225 -4664:2:1226 -4665:2:1237 -4666:2:1238 -4667:2:1239 -4668:2:1237 -4669:2:1238 -4670:2:1239 -4671:2:1250 -4672:2:1255 -4673:2:1256 -4674:0:4365 -4675:3:3658 -4676:0:4365 -4677:2:1268 -4678:0:4365 -4679:3:3657 -4680:0:4365 -4681:2:1270 -4682:0:4365 -4683:3:3658 -4684:0:4365 -4685:2:1271 -4686:2:1275 -4687:2:1276 -4688:2:1284 -4689:2:1285 -4690:2:1289 -4691:2:1290 -4692:2:1284 -4693:2:1285 -4694:2:1289 -4695:2:1290 -4696:2:1298 -4697:2:1303 -4698:2:1307 -4699:2:1308 -4700:2:1315 -4701:2:1316 -4702:2:1327 -4703:2:1328 -4704:2:1329 -4705:2:1327 -4706:2:1328 -4707:2:1329 -4708:2:1340 -4709:2:1345 -4710:2:1346 -4711:0:4365 -4712:2:1358 -4713:0:4365 -4714:2:1360 -4715:0:4365 -4716:3:3657 -4717:0:4365 -4718:2:1361 -4719:0:4365 -4720:3:3658 -4721:0:4365 -4722:2:1362 -4723:2:1366 -4724:2:1367 -4725:2:1375 -4726:2:1376 -4727:2:1380 -4728:2:1381 -4729:2:1375 -4730:2:1376 -4731:2:1380 -4732:2:1381 -4733:2:1389 -4734:2:1394 -4735:2:1398 -4736:2:1399 -4737:2:1406 -4738:2:1407 -4739:2:1418 -4740:2:1419 -4741:2:1420 -4742:2:1418 -4743:2:1419 -4744:2:1420 -4745:2:1431 -4746:2:1436 -4747:2:1437 -4748:0:4365 -4749:2:1449 -4750:0:4365 -4751:3:3657 -4752:0:4365 -4753:2:1451 -4754:0:4365 -4755:3:3658 -4756:0:4365 -4757:2:1652 -4758:0:4365 -4759:2:1653 -4760:0:4365 -4761:2:1657 -4762:0:4365 -4763:2:1180 -4764:0:4365 -4765:3:3657 -4766:0:4365 -4767:2:1181 -4768:2:1185 -4769:2:1186 -4770:2:1194 -4771:2:1195 -4772:2:1199 -4773:2:1200 -4774:2:1194 -4775:2:1195 -4776:2:1196 -4777:2:1208 -4778:2:1213 -4779:2:1217 -4780:2:1218 -4781:2:1225 -4782:2:1226 -4783:2:1237 -4784:2:1238 -4785:2:1239 -4786:2:1237 -4787:2:1238 -4788:2:1239 -4789:2:1250 -4790:2:1255 -4791:2:1256 -4792:0:4365 -4793:3:3658 -4794:0:4365 -4795:2:1268 -4796:0:4365 -4797:3:3657 -4798:0:4365 -4799:2:1270 -4800:0:4365 -4801:3:3658 -4802:0:4365 -4803:2:1271 -4804:2:1275 -4805:2:1276 -4806:2:1284 -4807:2:1285 -4808:2:1289 -4809:2:1290 -4810:2:1284 -4811:2:1285 -4812:2:1289 -4813:2:1290 -4814:2:1298 -4815:2:1303 -4816:2:1307 -4817:2:1308 -4818:2:1315 -4819:2:1316 -4820:2:1327 -4821:2:1328 -4822:2:1329 -4823:2:1327 -4824:2:1328 -4825:2:1329 -4826:2:1340 -4827:2:1345 -4828:2:1346 -4829:0:4365 -4830:2:1358 -4831:0:4365 -4832:2:1454 -4833:0:4365 -4834:3:3657 -4835:0:4365 -4836:2:1455 -4837:0:4365 -4838:3:3658 -4839:0:4365 -4840:2:1652 -4841:0:4365 -4842:2:1653 -4843:0:4365 -4844:2:1657 -4845:0:4365 -4846:2:1660 -4847:0:4365 -4848:3:3657 -4849:0:4365 -4850:2:1665 -4851:2:1669 -4852:2:1670 -4853:2:1678 -4854:2:1679 -4855:2:1683 -4856:2:1684 -4857:2:1678 -4858:2:1679 -4859:2:1680 -4860:2:1692 -4861:2:1697 -4862:2:1701 -4863:2:1702 -4864:2:1709 -4865:2:1710 -4866:2:1721 -4867:2:1722 -4868:2:1723 -4869:2:1721 -4870:2:1722 -4871:2:1723 -4872:2:1734 -4873:2:1739 -4874:2:1740 -4875:0:4365 -4876:3:3658 -4877:0:4365 -4878:2:1752 -4879:0:4365 -4880:3:3657 -4881:0:4365 -4882:2:1754 -4883:0:4365 -4884:3:3658 -4885:0:4365 -4886:2:1755 -4887:2:1759 -4888:2:1760 -4889:2:1768 -4890:2:1769 -4891:2:1773 -4892:2:1774 -4893:2:1768 -4894:2:1769 -4895:2:1773 -4896:2:1774 -4897:2:1782 -4898:2:1787 -4899:2:1791 -4900:2:1792 -4901:2:1799 -4902:2:1800 -4903:2:1811 -4904:2:1812 -4905:2:1813 -4906:2:1811 -4907:2:1812 -4908:2:1813 -4909:2:1824 -4910:2:1829 -4911:2:1830 -4912:0:4365 -4913:2:1842 -4914:0:4365 -4915:3:3657 -4916:0:4365 -4917:2:1844 -4918:0:4365 -4919:3:3658 -4920:0:4365 -4921:2:1845 -4922:2:1849 -4923:2:1850 -4924:2:1858 -4925:2:1859 -4926:2:1863 -4927:2:1864 -4928:2:1858 -4929:2:1859 -4930:2:1863 -4931:2:1864 -4932:2:1872 -4933:2:1877 -4934:2:1881 -4935:2:1882 -4936:2:1889 -4937:2:1890 -4938:2:1901 -4939:2:1902 -4940:2:1903 -4941:2:1901 -4942:2:1902 -4943:2:1903 -4944:2:1914 -4945:2:1919 -4946:2:1920 -4947:0:4365 -4948:2:1932 -4949:0:4365 -4950:3:3657 -4951:0:4365 -4952:2:1934 -4953:0:4365 -4954:3:3658 -4955:0:4365 -4956:2:1935 -4957:0:4365 -4958:2:1936 -4959:0:4365 -4960:2:2129 -4961:0:4365 -4962:2:2130 -4963:0:4365 -4964:2:2134 -4965:0:4365 -4966:3:3657 -4967:0:4365 -4968:2:2136 -4969:0:4365 -4970:3:3658 -4971:0:4365 -4972:2:2137 -4973:2:2141 -4974:2:2142 -4975:2:2150 -4976:2:2151 -4977:2:2155 -4978:2:2156 -4979:2:2150 -4980:2:2151 -4981:2:2155 -4982:2:2156 -4983:2:2164 -4984:2:2169 -4985:2:2173 -4986:2:2174 -4987:2:2181 -4988:2:2182 -4989:2:2193 -4990:2:2194 -4991:2:2195 -4992:2:2193 -4993:2:2194 -4994:2:2195 -4995:2:2206 -4996:2:2211 -4997:2:2212 -4998:0:4365 -4999:2:2224 -5000:0:4365 -5001:3:3657 -5002:0:4365 -5003:2:2226 -5004:0:4365 -5005:3:3658 -5006:0:4365 -5007:2:1936 -5008:0:4365 -5009:2:2129 -5010:0:4365 -5011:2:2130 -5012:0:4365 -5013:2:2134 -5014:0:4365 -5015:3:3657 -5016:0:4365 -5017:2:2136 -5018:0:4365 -5019:3:3658 -5020:0:4365 -5021:2:2137 -5022:2:2141 -5023:2:2142 -5024:2:2150 -5025:2:2151 -5026:2:2155 -5027:2:2156 -5028:2:2150 -5029:2:2151 -5030:2:2152 -5031:2:2164 -5032:2:2169 -5033:2:2173 -5034:2:2174 -5035:2:2181 -5036:2:2182 -5037:2:2193 -5038:2:2194 -5039:2:2195 -5040:2:2193 -5041:2:2194 -5042:2:2195 -5043:2:2206 -5044:2:2211 -5045:2:2212 -5046:0:4365 -5047:2:2224 -5048:0:4365 -5049:3:3657 -5050:0:4365 -5051:2:2226 -5052:0:4365 -5053:3:3658 -5054:0:4365 -5055:2:2230 -5056:0:4365 -5057:3:3657 -5058:0:4365 -5059:2:2235 -5060:2:2239 -5061:2:2240 -5062:2:2248 -5063:2:2249 -5064:2:2253 -5065:2:2254 -5066:2:2248 -5067:2:2249 -5068:2:2250 -5069:2:2262 -5070:2:2267 -5071:2:2271 -5072:2:2272 -5073:2:2279 -5074:2:2280 -5075:2:2291 -5076:2:2292 -5077:2:2293 -5078:2:2291 -5079:2:2292 -5080:2:2293 -5081:2:2304 -5082:2:2309 -5083:2:2310 -5084:0:4365 -5085:3:3658 -5086:0:4365 -5087:2:2322 -5088:0:4365 -5089:2:1169 -5090:0:4365 -5091:3:3657 -5092:0:4365 -5093:2:1170 -5094:0:4365 -5095:3:3658 -5096:0:4365 -5097:3:3659 -5098:0:4365 -5099:3:3665 -5100:0:4365 -5101:3:3666 -5102:0:4365 -5103:3:3667 -5104:0:4365 -5105:3:3668 -5106:0:4365 -5107:3:3669 -5108:3:3673 -5109:3:3674 -5110:3:3682 -5111:3:3683 -5112:3:3687 -5113:3:3688 -5114:3:3682 -5115:3:3683 -5116:3:3687 -5117:3:3688 -5118:3:3696 -5119:3:3701 -5120:3:3705 -5121:3:3706 -5122:3:3713 -5123:3:3714 -5124:3:3725 -5125:3:3726 -5126:3:3727 -5127:3:3725 -5128:3:3726 -5129:3:3727 -5130:3:3738 -5131:3:3743 -5132:3:3744 -5133:0:4365 -5134:3:3756 -5135:0:4365 -5136:3:3757 -5137:0:4365 -5138:2:1173 -5139:0:4365 -5140:3:3758 -5141:0:4365 -5142:2:1179 -5143:0:4365 -5144:2:1180 -5145:0:4365 -5146:3:3757 -5147:0:4365 -5148:2:1181 -5149:2:1185 -5150:2:1186 -5151:2:1194 -5152:2:1195 -5153:2:1199 -5154:2:1200 -5155:2:1194 -5156:2:1195 -5157:2:1199 -5158:2:1200 -5159:2:1208 -5160:2:1213 -5161:2:1217 -5162:2:1218 -5163:2:1225 -5164:2:1226 -5165:2:1237 -5166:2:1238 -5167:2:1239 -5168:2:1237 -5169:2:1238 -5170:2:1239 -5171:2:1250 -5172:2:1255 -5173:2:1256 -5174:0:4365 -5175:3:3758 -5176:0:4365 -5177:2:1268 -5178:0:4365 -5179:3:3757 -5180:0:4365 -5181:2:1270 -5182:0:4365 -5183:3:3758 -5184:0:4365 -5185:2:1271 -5186:2:1275 -5187:2:1276 -5188:2:1284 -5189:2:1285 -5190:2:1289 -5191:2:1290 -5192:2:1284 -5193:2:1285 -5194:2:1289 -5195:2:1290 -5196:2:1298 -5197:2:1303 -5198:2:1307 -5199:2:1308 -5200:2:1315 -5201:2:1316 -5202:2:1327 -5203:2:1328 -5204:2:1329 -5205:2:1327 -5206:2:1328 -5207:2:1329 -5208:2:1340 -5209:2:1345 -5210:2:1346 -5211:0:4365 -5212:2:1358 -5213:0:4365 -5214:2:1360 -5215:0:4365 -5216:3:3757 -5217:0:4365 -5218:2:1361 -5219:0:4365 -5220:3:3758 -5221:0:4365 -5222:2:1362 -5223:2:1366 -5224:2:1367 -5225:2:1375 -5226:2:1376 -5227:2:1380 -5228:2:1381 -5229:2:1375 -5230:2:1376 -5231:2:1380 -5232:2:1381 -5233:2:1389 -5234:2:1394 -5235:2:1398 -5236:2:1399 -5237:2:1406 -5238:2:1407 -5239:2:1418 -5240:2:1419 -5241:2:1420 -5242:2:1418 -5243:2:1419 -5244:2:1420 -5245:2:1431 -5246:2:1436 -5247:2:1437 -5248:0:4365 -5249:2:1449 -5250:0:4365 -5251:3:3757 -5252:0:4365 -5253:2:1451 -5254:0:4365 -5255:3:3758 -5256:0:4365 -5257:2:1652 -5258:0:4365 -5259:2:1653 -5260:0:4365 -5261:2:1657 -5262:0:4365 -5263:2:1180 -5264:0:4365 -5265:3:3757 -5266:0:4365 -5267:2:1181 -5268:2:1185 -5269:2:1186 -5270:2:1194 -5271:2:1195 -5272:2:1199 -5273:2:1200 -5274:2:1194 -5275:2:1195 -5276:2:1196 -5277:2:1208 -5278:2:1213 -5279:2:1217 -5280:2:1218 -5281:2:1225 -5282:2:1226 -5283:2:1237 -5284:2:1238 -5285:2:1239 -5286:2:1237 -5287:2:1238 -5288:2:1239 -5289:2:1250 -5290:2:1255 -5291:2:1256 -5292:0:4365 -5293:3:3758 -5294:0:4365 -5295:2:1268 -5296:0:4365 -5297:3:3757 -5298:0:4365 -5299:2:1270 -5300:0:4365 -5301:3:3758 -5302:0:4365 -5303:2:1271 -5304:2:1275 -5305:2:1276 -5306:2:1284 -5307:2:1285 -5308:2:1289 -5309:2:1290 -5310:2:1284 -5311:2:1285 -5312:2:1289 -5313:2:1290 -5314:2:1298 -5315:2:1303 -5316:2:1307 -5317:2:1308 -5318:2:1315 -5319:2:1316 -5320:2:1327 -5321:2:1328 -5322:2:1329 -5323:2:1327 -5324:2:1328 -5325:2:1329 -5326:2:1340 -5327:2:1345 -5328:2:1346 -5329:0:4365 -5330:2:1358 -5331:0:4365 -5332:2:1454 -5333:0:4365 -5334:3:3757 -5335:0:4365 -5336:2:1455 -5337:0:4365 -5338:3:3758 -5339:0:4365 -5340:2:1652 -5341:0:4365 -5342:2:1653 -5343:0:4365 -5344:2:1657 -5345:0:4365 -5346:2:1660 -5347:0:4365 -5348:3:3757 -5349:0:4365 -5350:2:1665 -5351:2:1669 -5352:2:1670 -5353:2:1678 -5354:2:1679 -5355:2:1683 -5356:2:1684 -5357:2:1678 -5358:2:1679 -5359:2:1680 -5360:2:1692 -5361:2:1697 -5362:2:1701 -5363:2:1702 -5364:2:1709 -5365:2:1710 -5366:2:1721 -5367:2:1722 -5368:2:1723 -5369:2:1721 -5370:2:1722 -5371:2:1723 -5372:2:1734 -5373:2:1739 -5374:2:1740 -5375:0:4365 -5376:3:3758 -5377:0:4365 -5378:2:1752 -5379:0:4365 -5380:3:3757 -5381:0:4365 -5382:2:1754 -5383:0:4365 -5384:3:3758 -5385:0:4365 -5386:2:1755 -5387:2:1759 -5388:2:1760 -5389:2:1768 -5390:2:1769 -5391:2:1773 -5392:2:1774 -5393:2:1768 -5394:2:1769 -5395:2:1773 -5396:2:1774 -5397:2:1782 -5398:2:1787 -5399:2:1791 -5400:2:1792 -5401:2:1799 -5402:2:1800 -5403:2:1811 -5404:2:1812 -5405:2:1813 -5406:2:1811 -5407:2:1812 -5408:2:1813 -5409:2:1824 -5410:2:1829 -5411:2:1830 -5412:0:4365 -5413:2:1842 -5414:0:4365 -5415:3:3757 -5416:0:4365 -5417:2:1844 -5418:0:4365 -5419:3:3758 -5420:0:4365 -5421:2:1845 -5422:2:1849 -5423:2:1850 -5424:2:1858 -5425:2:1859 -5426:2:1863 -5427:2:1864 -5428:2:1858 -5429:2:1859 -5430:2:1863 -5431:2:1864 -5432:2:1872 -5433:2:1877 -5434:2:1881 -5435:2:1882 -5436:2:1889 -5437:2:1890 -5438:2:1901 -5439:2:1902 -5440:2:1903 -5441:2:1901 -5442:2:1902 -5443:2:1903 -5444:2:1914 -5445:2:1919 -5446:2:1920 -5447:0:4365 -5448:2:1932 -5449:0:4365 -5450:3:3757 -5451:0:4365 -5452:2:1934 -5453:0:4365 -5454:3:3758 -5455:0:4365 -5456:2:1935 -5457:0:4365 -5458:2:1936 -5459:0:4365 -5460:2:2129 -5461:0:4365 -5462:2:2130 -5463:0:4365 -5464:2:2134 -5465:0:4365 -5466:3:3757 -5467:0:4365 -5468:2:2136 -5469:0:4365 -5470:3:3758 -5471:0:4365 -5472:2:2137 -5473:2:2141 -5474:2:2142 -5475:2:2150 -5476:2:2151 -5477:2:2155 -5478:2:2156 -5479:2:2150 -5480:2:2151 -5481:2:2155 -5482:2:2156 -5483:2:2164 -5484:2:2169 -5485:2:2173 -5486:2:2174 -5487:2:2181 -5488:2:2182 -5489:2:2193 -5490:2:2194 -5491:2:2195 -5492:2:2193 -5493:2:2194 -5494:2:2195 -5495:2:2206 -5496:2:2211 -5497:2:2212 -5498:0:4365 -5499:2:2224 -5500:0:4365 -5501:3:3757 -5502:0:4365 -5503:2:2226 -5504:0:4365 -5505:3:3758 -5506:0:4365 -5507:2:1936 -5508:0:4365 -5509:2:2129 -5510:0:4365 -5511:2:2130 -5512:0:4365 -5513:2:2134 -5514:0:4365 -5515:3:3757 -5516:0:4365 -5517:2:2136 -5518:0:4365 -5519:3:3758 -5520:0:4365 -5521:2:2137 -5522:2:2141 -5523:2:2142 -5524:2:2150 -5525:2:2151 -5526:2:2155 -5527:2:2156 -5528:2:2150 -5529:2:2151 -5530:2:2152 -5531:2:2164 -5532:2:2169 -5533:2:2173 -5534:2:2174 -5535:2:2181 -5536:2:2182 -5537:2:2193 -5538:2:2194 -5539:2:2195 -5540:2:2193 -5541:2:2194 -5542:2:2195 -5543:2:2206 -5544:2:2211 -5545:2:2212 -5546:0:4365 -5547:2:2224 -5548:0:4365 -5549:3:3757 -5550:0:4365 -5551:2:2226 -5552:0:4365 -5553:3:3758 -5554:0:4365 -5555:2:2230 -5556:0:4365 -5557:3:3757 -5558:0:4365 -5559:2:2235 -5560:2:2239 -5561:2:2240 -5562:2:2248 -5563:2:2249 -5564:2:2253 -5565:2:2254 -5566:2:2248 -5567:2:2249 -5568:2:2250 -5569:2:2262 -5570:2:2267 -5571:2:2271 -5572:2:2272 -5573:2:2279 -5574:2:2280 -5575:2:2291 -5576:2:2292 -5577:2:2293 -5578:2:2291 -5579:2:2292 -5580:2:2293 -5581:2:2304 -5582:2:2309 -5583:2:2310 -5584:0:4365 -5585:3:3758 -5586:0:4365 -5587:2:2322 -5588:0:4365 -5589:2:1169 -5590:0:4365 -5591:3:3757 -5592:0:4365 -5593:2:1170 -5594:0:4365 -5595:3:3758 -5596:0:4365 -5597:3:3759 -5598:0:4365 -5599:3:3972 -5600:0:4365 -5601:3:3980 -5602:0:4365 -5603:3:3981 -5604:3:3985 -5605:3:3986 -5606:3:3994 -5607:3:3995 -5608:3:3999 -5609:3:4000 -5610:3:3994 -5611:3:3995 -5612:3:3999 -5613:3:4000 -5614:3:4008 -5615:3:4013 -5616:3:4017 -5617:3:4018 -5618:3:4025 -5619:3:4026 -5620:3:4037 -5621:3:4038 -5622:3:4039 -5623:3:4037 -5624:3:4038 -5625:3:4039 -5626:3:4050 -5627:3:4055 -5628:3:4056 -5629:0:4365 -5630:3:4068 -5631:0:4365 -5632:3:4069 -5633:0:4365 -5634:2:1173 -5635:0:4365 -5636:3:4070 -5637:0:4365 -5638:2:1179 -5639:0:4365 -5640:2:1180 -5641:0:4365 -5642:3:4069 -5643:0:4365 -5644:2:1181 -5645:2:1185 -5646:2:1186 -5647:2:1194 -5648:2:1195 -5649:2:1199 -5650:2:1200 -5651:2:1194 -5652:2:1195 -5653:2:1199 -5654:2:1200 -5655:2:1208 -5656:2:1213 -5657:2:1217 -5658:2:1218 -5659:2:1225 -5660:2:1226 -5661:2:1237 -5662:2:1238 -5663:2:1239 -5664:2:1237 -5665:2:1238 -5666:2:1239 -5667:2:1250 -5668:2:1255 -5669:2:1256 -5670:0:4365 -5671:3:4070 -5672:0:4365 -5673:2:1268 -5674:0:4365 -5675:3:4069 -5676:0:4365 -5677:2:1270 -5678:0:4365 -5679:3:4070 -5680:0:4365 -5681:2:1271 -5682:2:1275 -5683:2:1276 -5684:2:1284 -5685:2:1285 -5686:2:1289 -5687:2:1290 -5688:2:1284 -5689:2:1285 -5690:2:1289 -5691:2:1290 -5692:2:1298 -5693:2:1303 -5694:2:1307 -5695:2:1308 -5696:2:1315 -5697:2:1316 -5698:2:1327 -5699:2:1328 -5700:2:1329 -5701:2:1327 -5702:2:1328 -5703:2:1329 -5704:2:1340 -5705:2:1345 -5706:2:1346 -5707:0:4365 -5708:2:1358 -5709:0:4365 -5710:2:1360 -5711:0:4365 -5712:3:4069 -5713:0:4365 -5714:2:1361 -5715:0:4365 -5716:3:4070 -5717:0:4365 -5718:2:1362 -5719:2:1366 -5720:2:1367 -5721:2:1375 -5722:2:1376 -5723:2:1380 -5724:2:1381 -5725:2:1375 -5726:2:1376 -5727:2:1380 -5728:2:1381 -5729:2:1389 -5730:2:1394 -5731:2:1398 -5732:2:1399 -5733:2:1406 -5734:2:1407 -5735:2:1418 -5736:2:1419 -5737:2:1420 -5738:2:1418 -5739:2:1419 -5740:2:1420 -5741:2:1431 -5742:2:1436 -5743:2:1437 -5744:0:4365 -5745:2:1449 -5746:0:4365 -5747:3:4069 -5748:0:4365 -5749:2:1451 -5750:0:4365 -5751:3:4070 -5752:0:4365 -5753:2:1652 -5754:0:4365 -5755:2:1653 -5756:0:4365 -5757:2:1657 -5758:0:4365 -5759:2:1180 -5760:0:4365 -5761:3:4069 -5762:0:4365 -5763:2:1181 -5764:2:1185 -5765:2:1186 -5766:2:1194 -5767:2:1195 -5768:2:1199 -5769:2:1200 -5770:2:1194 -5771:2:1195 -5772:2:1196 -5773:2:1208 -5774:2:1213 -5775:2:1217 -5776:2:1218 -5777:2:1225 -5778:2:1226 -5779:2:1237 -5780:2:1238 -5781:2:1239 -5782:2:1237 -5783:2:1238 -5784:2:1239 -5785:2:1250 -5786:2:1255 -5787:2:1256 -5788:0:4365 -5789:3:4070 -5790:0:4365 -5791:2:1268 -5792:0:4365 -5793:3:4069 -5794:0:4365 -5795:2:1270 -5796:0:4365 -5797:3:4070 -5798:0:4365 -5799:2:1271 -5800:2:1275 -5801:2:1276 -5802:2:1284 -5803:2:1285 -5804:2:1289 -5805:2:1290 -5806:2:1284 -5807:2:1285 -5808:2:1289 -5809:2:1290 -5810:2:1298 -5811:2:1303 -5812:2:1307 -5813:2:1308 -5814:2:1315 -5815:2:1316 -5816:2:1327 -5817:2:1328 -5818:2:1329 -5819:2:1327 -5820:2:1328 -5821:2:1329 -5822:2:1340 -5823:2:1345 -5824:2:1346 -5825:0:4365 -5826:2:1358 -5827:0:4365 -5828:2:1454 -5829:0:4365 -5830:3:4069 -5831:0:4365 -5832:2:1455 -5833:0:4365 -5834:3:4070 -5835:0:4365 -5836:2:1652 -5837:0:4365 -5838:2:1653 -5839:0:4365 -5840:2:1657 -5841:0:4365 -5842:2:1660 -5843:0:4365 -5844:3:4069 -5845:0:4365 -5846:2:1665 -5847:2:1669 -5848:2:1670 -5849:2:1678 -5850:2:1679 -5851:2:1683 -5852:2:1684 -5853:2:1678 -5854:2:1679 -5855:2:1680 -5856:2:1692 -5857:2:1697 -5858:2:1701 -5859:2:1702 -5860:2:1709 -5861:2:1710 -5862:2:1721 -5863:2:1722 -5864:2:1723 -5865:2:1721 -5866:2:1722 -5867:2:1723 -5868:2:1734 -5869:2:1739 -5870:2:1740 -5871:0:4365 -5872:3:4070 -5873:0:4365 -5874:2:1752 -5875:0:4365 -5876:3:4069 -5877:0:4365 -5878:2:1754 -5879:0:4365 -5880:3:4070 -5881:0:4365 -5882:2:1755 -5883:2:1759 -5884:2:1760 -5885:2:1768 -5886:2:1769 -5887:2:1773 -5888:2:1774 -5889:2:1768 -5890:2:1769 -5891:2:1773 -5892:2:1774 -5893:2:1782 -5894:2:1787 -5895:2:1791 -5896:2:1792 -5897:2:1799 -5898:2:1800 -5899:2:1811 -5900:2:1812 -5901:2:1813 -5902:2:1811 -5903:2:1812 -5904:2:1813 -5905:2:1824 -5906:2:1829 -5907:2:1830 -5908:0:4365 -5909:2:1842 -5910:0:4365 -5911:3:4069 -5912:0:4365 -5913:2:1844 -5914:0:4365 -5915:3:4070 -5916:0:4365 -5917:2:1845 -5918:2:1849 -5919:2:1850 -5920:2:1858 -5921:2:1859 -5922:2:1863 -5923:2:1864 -5924:2:1858 -5925:2:1859 -5926:2:1863 -5927:2:1864 -5928:2:1872 -5929:2:1877 -5930:2:1881 -5931:2:1882 -5932:2:1889 -5933:2:1890 -5934:2:1901 -5935:2:1902 -5936:2:1903 -5937:2:1901 -5938:2:1902 -5939:2:1903 -5940:2:1914 -5941:2:1919 -5942:2:1920 -5943:0:4365 -5944:2:1932 -5945:0:4365 -5946:3:4069 -5947:0:4365 -5948:2:1934 -5949:0:4365 -5950:3:4070 -5951:0:4365 -5952:2:1935 -5953:0:4365 -5954:2:1936 -5955:0:4365 -5956:2:2129 -5957:0:4365 -5958:2:2130 -5959:0:4365 -5960:2:2134 -5961:0:4365 -5962:3:4069 -5963:0:4365 -5964:2:2136 -5965:0:4365 -5966:3:4070 -5967:0:4365 -5968:2:2137 -5969:2:2141 -5970:2:2142 -5971:2:2150 -5972:2:2151 -5973:2:2155 -5974:2:2156 -5975:2:2150 -5976:2:2151 -5977:2:2155 -5978:2:2156 -5979:2:2164 -5980:2:2169 -5981:2:2173 -5982:2:2174 -5983:2:2181 -5984:2:2182 -5985:2:2193 -5986:2:2194 -5987:2:2195 -5988:2:2193 -5989:2:2194 -5990:2:2195 -5991:2:2206 -5992:2:2211 -5993:2:2212 -5994:0:4365 -5995:2:2224 -5996:0:4365 -5997:3:4069 -5998:0:4365 -5999:2:2226 -6000:0:4365 -6001:3:4070 -6002:0:4365 -6003:2:1936 -6004:0:4365 -6005:2:2129 -6006:0:4365 -6007:2:2130 -6008:0:4365 -6009:2:2134 -6010:0:4365 -6011:3:4069 -6012:0:4365 -6013:2:2136 -6014:0:4365 -6015:3:4070 -6016:0:4365 -6017:2:2137 -6018:2:2141 -6019:2:2142 -6020:2:2150 -6021:2:2151 -6022:2:2155 -6023:2:2156 -6024:2:2150 -6025:2:2151 -6026:2:2152 -6027:2:2164 -6028:2:2169 -6029:2:2173 -6030:2:2174 -6031:2:2181 -6032:2:2182 -6033:2:2193 -6034:2:2194 -6035:2:2195 -6036:2:2193 -6037:2:2194 -6038:2:2195 -6039:2:2206 -6040:2:2211 -6041:2:2212 -6042:0:4365 -6043:2:2224 -6044:0:4365 -6045:3:4069 -6046:0:4365 -6047:2:2226 -6048:0:4365 -6049:3:4070 -6050:0:4365 -6051:2:2230 -6052:0:4365 -6053:3:4069 -6054:0:4365 -6055:2:2235 -6056:2:2239 -6057:2:2240 -6058:2:2248 -6059:2:2249 -6060:2:2253 -6061:2:2254 -6062:2:2248 -6063:2:2249 -6064:2:2250 -6065:2:2262 -6066:2:2267 -6067:2:2271 -6068:2:2272 -6069:2:2279 -6070:2:2280 -6071:2:2291 -6072:2:2292 -6073:2:2293 -6074:2:2291 -6075:2:2292 -6076:2:2293 -6077:2:2304 -6078:2:2309 -6079:2:2310 -6080:0:4365 -6081:3:4070 -6082:0:4365 -6083:2:2322 -6084:0:4365 -6085:2:1169 -6086:0:4365 -6087:3:4069 -6088:0:4365 -6089:2:1170 -6090:0:4365 -6091:3:4070 -6092:0:4365 -6093:3:4071 -6094:0:4365 -6095:3:4081 -6096:0:4365 -6097:3:3666 -6098:0:4365 -6099:3:3667 -6100:0:4365 -6101:3:3668 -6102:0:4365 -6103:3:3669 -6104:3:3673 -6105:3:3674 -6106:3:3682 -6107:3:3683 -6108:3:3687 -6109:3:3688 -6110:3:3682 -6111:3:3683 -6112:3:3687 -6113:3:3688 -6114:3:3696 -6115:3:3701 -6116:3:3705 -6117:3:3706 -6118:3:3713 -6119:3:3714 -6120:3:3725 -6121:3:3726 -6122:3:3727 -6123:3:3725 -6124:3:3726 -6125:3:3727 -6126:3:3738 -6127:3:3743 -6128:3:3744 -6129:0:4365 -6130:3:3756 -6131:0:4365 -6132:3:3757 -6133:0:4365 -6134:2:1173 -6135:0:4365 -6136:3:3758 -6137:0:4365 -6138:2:1179 -6139:0:4365 -6140:2:1180 -6141:0:4365 -6142:3:3757 -6143:0:4365 -6144:2:1181 -6145:2:1185 -6146:2:1186 -6147:2:1194 -6148:2:1195 -6149:2:1199 -6150:2:1200 -6151:2:1194 -6152:2:1195 -6153:2:1199 -6154:2:1200 -6155:2:1208 -6156:2:1213 -6157:2:1217 -6158:2:1218 -6159:2:1225 -6160:2:1226 -6161:2:1237 -6162:2:1238 -6163:2:1239 -6164:2:1237 -6165:2:1238 -6166:2:1239 -6167:2:1250 -6168:2:1255 -6169:2:1256 -6170:0:4365 -6171:3:3758 -6172:0:4365 -6173:2:1268 -6174:0:4365 -6175:3:3757 -6176:0:4365 -6177:2:1270 -6178:0:4365 -6179:3:3758 -6180:0:4365 -6181:2:1271 -6182:2:1275 -6183:2:1276 -6184:2:1284 -6185:2:1285 -6186:2:1289 -6187:2:1290 -6188:2:1284 -6189:2:1285 -6190:2:1289 -6191:2:1290 -6192:2:1298 -6193:2:1303 -6194:2:1307 -6195:2:1308 -6196:2:1315 -6197:2:1316 -6198:2:1327 -6199:2:1328 -6200:2:1329 -6201:2:1327 -6202:2:1328 -6203:2:1329 -6204:2:1340 -6205:2:1345 -6206:2:1346 -6207:0:4365 -6208:2:1358 -6209:0:4365 -6210:2:1360 -6211:0:4365 -6212:3:3757 -6213:0:4365 -6214:2:1361 -6215:0:4365 -6216:3:3758 -6217:0:4365 -6218:2:1362 -6219:2:1366 -6220:2:1367 -6221:2:1375 -6222:2:1376 -6223:2:1380 -6224:2:1381 -6225:2:1375 -6226:2:1376 -6227:2:1380 -6228:2:1381 -6229:2:1389 -6230:2:1394 -6231:2:1398 -6232:2:1399 -6233:2:1406 -6234:2:1407 -6235:2:1418 -6236:2:1419 -6237:2:1420 -6238:2:1418 -6239:2:1419 -6240:2:1420 -6241:2:1431 -6242:2:1436 -6243:2:1437 -6244:0:4365 -6245:2:1449 -6246:0:4365 -6247:3:3757 -6248:0:4365 -6249:2:1451 -6250:0:4365 -6251:3:3758 -6252:0:4365 -6253:2:1652 -6254:0:4365 -6255:2:1653 -6256:0:4365 -6257:2:1657 -6258:0:4365 -6259:2:1180 -6260:0:4365 -6261:3:3757 -6262:0:4365 -6263:2:1181 -6264:2:1185 -6265:2:1186 -6266:2:1194 -6267:2:1195 -6268:2:1199 -6269:2:1200 -6270:2:1194 -6271:2:1195 -6272:2:1196 -6273:2:1208 -6274:2:1213 -6275:2:1217 -6276:2:1218 -6277:2:1225 -6278:2:1226 -6279:2:1237 -6280:2:1238 -6281:2:1239 -6282:2:1237 -6283:2:1238 -6284:2:1239 -6285:2:1250 -6286:2:1255 -6287:2:1256 -6288:0:4365 -6289:3:3758 -6290:0:4365 -6291:2:1268 -6292:0:4365 -6293:3:3757 -6294:0:4365 -6295:2:1270 -6296:0:4365 -6297:3:3758 -6298:0:4365 -6299:2:1271 -6300:2:1275 -6301:2:1276 -6302:2:1284 -6303:2:1285 -6304:2:1289 -6305:2:1290 -6306:2:1284 -6307:2:1285 -6308:2:1289 -6309:2:1290 -6310:2:1298 -6311:2:1303 -6312:2:1307 -6313:2:1308 -6314:2:1315 -6315:2:1316 -6316:2:1327 -6317:2:1328 -6318:2:1329 -6319:2:1327 -6320:2:1328 -6321:2:1329 -6322:2:1340 -6323:2:1345 -6324:2:1346 -6325:0:4365 -6326:2:1358 -6327:0:4365 -6328:2:1454 -6329:0:4365 -6330:3:3757 -6331:0:4365 -6332:2:1455 -6333:0:4365 -6334:3:3758 -6335:0:4365 -6336:2:1652 -6337:0:4365 -6338:2:1653 -6339:0:4365 -6340:2:1657 -6341:0:4365 -6342:2:1660 -6343:0:4365 -6344:3:3757 -6345:0:4365 -6346:2:1665 -6347:2:1669 -6348:2:1670 -6349:2:1678 -6350:2:1679 -6351:2:1683 -6352:2:1684 -6353:2:1678 -6354:2:1679 -6355:2:1680 -6356:2:1692 -6357:2:1697 -6358:2:1701 -6359:2:1702 -6360:2:1709 -6361:2:1710 -6362:2:1721 -6363:2:1722 -6364:2:1723 -6365:2:1721 -6366:2:1722 -6367:2:1723 -6368:2:1734 -6369:2:1739 -6370:2:1740 -6371:0:4365 -6372:3:3758 -6373:0:4365 -6374:2:1752 -6375:0:4365 -6376:3:3757 -6377:0:4365 -6378:2:1754 -6379:0:4365 -6380:3:3758 -6381:0:4365 -6382:2:1755 -6383:2:1759 -6384:2:1760 -6385:2:1768 -6386:2:1769 -6387:2:1773 -6388:2:1774 -6389:2:1768 -6390:2:1769 -6391:2:1773 -6392:2:1774 -6393:2:1782 -6394:2:1787 -6395:2:1791 -6396:2:1792 -6397:2:1799 -6398:2:1800 -6399:2:1811 -6400:2:1812 -6401:2:1813 -6402:2:1811 -6403:2:1812 -6404:2:1813 -6405:2:1824 -6406:2:1829 -6407:2:1830 -6408:0:4365 -6409:2:1842 -6410:0:4365 -6411:3:3757 -6412:0:4365 -6413:2:1844 -6414:0:4365 -6415:3:3758 -6416:0:4365 -6417:2:1845 -6418:2:1849 -6419:2:1850 -6420:2:1858 -6421:2:1859 -6422:2:1863 -6423:2:1864 -6424:2:1858 -6425:2:1859 -6426:2:1863 -6427:2:1864 -6428:2:1872 -6429:2:1877 -6430:2:1881 -6431:2:1882 -6432:2:1889 -6433:2:1890 -6434:2:1901 -6435:2:1902 -6436:2:1903 -6437:2:1901 -6438:2:1902 -6439:2:1903 -6440:2:1914 -6441:2:1919 -6442:2:1920 -6443:0:4365 -6444:2:1932 -6445:0:4365 -6446:3:3757 -6447:0:4365 -6448:2:1934 -6449:0:4365 -6450:3:3758 -6451:0:4365 -6452:2:1935 -6453:0:4365 -6454:2:1936 -6455:0:4365 -6456:2:2129 -6457:0:4365 -6458:2:2130 -6459:0:4365 -6460:2:2134 -6461:0:4365 -6462:3:3757 -6463:0:4365 -6464:2:2136 -6465:0:4365 -6466:3:3758 -6467:0:4365 -6468:2:2137 -6469:2:2141 -6470:2:2142 -6471:2:2150 -6472:2:2151 -6473:2:2155 -6474:2:2156 -6475:2:2150 -6476:2:2151 -6477:2:2155 -6478:2:2156 -6479:2:2164 -6480:2:2169 -6481:2:2173 -6482:2:2174 -6483:2:2181 -6484:2:2182 -6485:2:2193 -6486:2:2194 -6487:2:2195 -6488:2:2193 -6489:2:2194 -6490:2:2195 -6491:2:2206 -6492:2:2211 -6493:2:2212 -6494:0:4365 -6495:2:2224 -6496:0:4365 -6497:3:3757 -6498:0:4365 -6499:2:2226 -6500:0:4365 -6501:3:3758 -6502:0:4365 -6503:2:1936 -6504:0:4365 -6505:2:2129 -6506:0:4365 -6507:2:2130 -6508:0:4365 -6509:2:2134 -6510:0:4365 -6511:3:3757 -6512:0:4365 -6513:2:2136 -6514:0:4365 -6515:3:3758 -6516:0:4365 -6517:2:2137 -6518:2:2141 -6519:2:2142 -6520:2:2150 -6521:2:2151 -6522:2:2155 -6523:2:2156 -6524:2:2150 -6525:2:2151 -6526:2:2152 -6527:2:2164 -6528:2:2169 -6529:2:2173 -6530:2:2174 -6531:2:2181 -6532:2:2182 -6533:2:2193 -6534:2:2194 -6535:2:2195 -6536:2:2193 -6537:2:2194 -6538:2:2195 -6539:2:2206 -6540:2:2211 -6541:2:2212 -6542:0:4365 -6543:2:2224 -6544:0:4365 -6545:3:3757 -6546:0:4365 -6547:2:2226 -6548:0:4365 -6549:3:3758 -6550:0:4365 -6551:2:2230 -6552:0:4365 -6553:3:3757 -6554:0:4365 -6555:2:2235 -6556:2:2239 -6557:2:2240 -6558:2:2248 -6559:2:2249 -6560:2:2253 -6561:2:2254 -6562:2:2248 -6563:2:2249 -6564:2:2250 -6565:2:2262 -6566:2:2267 -6567:2:2271 -6568:2:2272 -6569:2:2279 -6570:2:2280 -6571:2:2291 -6572:2:2292 -6573:2:2293 -6574:2:2291 -6575:2:2292 -6576:2:2293 -6577:2:2304 -6578:2:2309 -6579:2:2310 -6580:0:4365 -6581:3:3758 -6582:0:4365 -6583:2:2322 -6584:0:4365 -6585:2:1169 -6586:0:4365 -6587:3:3757 -6588:0:4365 -6589:2:1170 -6590:0:4365 -6591:3:3758 -6592:0:4365 -6593:3:3759 -6594:0:4365 -6595:3:3972 -6596:0:4365 -6597:3:4077 -6598:0:4365 -6599:3:4078 -6600:0:4365 -6601:3:4082 -6602:0:4365 -6603:3:4088 -6604:0:4365 -6605:3:4092 -6606:3:4093 -6607:3:4097 -6608:3:4101 -6609:3:4102 -6610:3:4097 -6611:3:4101 -6612:3:4102 -6613:3:4106 -6614:3:4114 -6615:3:4115 -6616:3:4120 -6617:3:4127 -6618:3:4128 -6619:3:4127 -6620:3:4128 -6621:3:4135 -6622:3:4140 -6623:0:4365 -6624:3:4151 -6625:0:4365 -6626:3:4155 -6627:3:4156 -6628:3:4160 -6629:3:4164 -6630:3:4165 -6631:3:4160 -6632:3:4164 -6633:3:4165 -6634:3:4169 -6635:3:4177 -6636:3:4178 -6637:3:4183 -6638:3:4190 -6639:3:4191 -6640:3:4190 -6641:3:4191 -6642:3:4198 -6643:3:4203 -6644:0:4365 -6645:3:4151 -6646:0:4365 -6647:3:4155 -6648:3:4156 -6649:3:4160 -6650:3:4164 -6651:3:4165 -6652:3:4160 -6653:3:4164 -6654:3:4165 -6655:3:4169 -6656:3:4177 -6657:3:4178 -6658:3:4183 -6659:3:4190 -6660:3:4191 -6661:3:4190 -6662:3:4191 -6663:3:4198 -6664:3:4203 -6665:0:4365 -6666:3:4214 -6667:0:4365 -6668:3:4222 -6669:3:4223 -6670:3:4227 -6671:3:4231 -6672:3:4232 -6673:3:4227 -6674:3:4231 -6675:3:4232 -6676:3:4236 -6677:3:4244 -6678:3:4245 -6679:3:4250 -6680:3:4257 -6681:3:4258 -6682:3:4257 -6683:3:4258 -6684:3:4265 -6685:3:4270 -6686:0:4365 -6687:3:4285 -6688:0:4365 -6689:3:4286 -6690:0:4365 -6691:2:1173 -6692:0:4365 -6693:3:4287 -6694:0:4365 -6695:2:1179 -6696:0:4365 -6697:2:1180 -6698:0:4365 -6699:3:4286 -6700:0:4365 -6701:2:1181 -6702:2:1185 -6703:2:1186 -6704:2:1194 -6705:2:1195 -6706:2:1199 -6707:2:1200 -6708:2:1194 -6709:2:1195 -6710:2:1199 -6711:2:1200 -6712:2:1208 -6713:2:1213 -6714:2:1217 -6715:2:1218 -6716:2:1225 -6717:2:1226 -6718:2:1237 -6719:2:1238 -6720:2:1239 -6721:2:1237 -6722:2:1238 -6723:2:1239 -6724:2:1250 -6725:2:1255 -6726:2:1256 -6727:0:4365 -6728:3:4287 -6729:0:4365 -6730:2:1268 -6731:0:4365 -6732:3:4286 -6733:0:4365 -6734:2:1270 -6735:0:4365 -6736:3:4287 -6737:0:4365 -6738:2:1271 -6739:2:1275 -6740:2:1276 -6741:2:1284 -6742:2:1285 -6743:2:1289 -6744:2:1290 -6745:2:1284 -6746:2:1285 -6747:2:1289 -6748:2:1290 -6749:2:1298 -6750:2:1303 -6751:2:1307 -6752:2:1308 -6753:2:1315 -6754:2:1316 -6755:2:1327 -6756:2:1328 -6757:2:1329 -6758:2:1327 -6759:2:1328 -6760:2:1329 -6761:2:1340 -6762:2:1345 -6763:2:1346 -6764:0:4365 -6765:2:1358 -6766:0:4365 -6767:2:1360 -6768:0:4365 -6769:3:4286 -6770:0:4365 -6771:2:1361 -6772:0:4365 -6773:3:4287 -6774:0:4365 -6775:2:1362 -6776:2:1366 -6777:2:1367 -6778:2:1375 -6779:2:1376 -6780:2:1380 -6781:2:1381 -6782:2:1375 -6783:2:1376 -6784:2:1380 -6785:2:1381 -6786:2:1389 -6787:2:1394 -6788:2:1398 -6789:2:1399 -6790:2:1406 -6791:2:1407 -6792:2:1418 -6793:2:1419 -6794:2:1420 -6795:2:1418 -6796:2:1419 -6797:2:1420 -6798:2:1431 -6799:2:1436 -6800:2:1437 -6801:0:4365 -6802:2:1449 -6803:0:4365 -6804:3:4286 -6805:0:4365 -6806:2:1451 -6807:0:4365 -6808:3:4287 -6809:0:4365 -6810:2:1652 -6811:0:4365 -6812:2:1653 -6813:0:4365 -6814:2:1657 -6815:0:4365 -6816:2:1180 -6817:0:4365 -6818:3:4286 -6819:0:4365 -6820:2:1181 -6821:2:1185 -6822:2:1186 -6823:2:1194 -6824:2:1195 -6825:2:1199 -6826:2:1200 -6827:2:1194 -6828:2:1195 -6829:2:1196 -6830:2:1208 -6831:2:1213 -6832:2:1217 -6833:2:1218 -6834:2:1225 -6835:2:1226 -6836:2:1237 -6837:2:1238 -6838:2:1239 -6839:2:1237 -6840:2:1238 -6841:2:1239 -6842:2:1250 -6843:2:1255 -6844:2:1256 -6845:0:4365 -6846:3:4287 -6847:0:4365 -6848:2:1268 -6849:0:4365 -6850:3:4286 -6851:0:4365 -6852:2:1270 -6853:0:4365 -6854:3:4287 -6855:0:4365 -6856:2:1271 -6857:2:1275 -6858:2:1276 -6859:2:1284 -6860:2:1285 -6861:2:1289 -6862:2:1290 -6863:2:1284 -6864:2:1285 -6865:2:1289 -6866:2:1290 -6867:2:1298 -6868:2:1303 -6869:2:1307 -6870:2:1308 -6871:2:1315 -6872:2:1316 -6873:2:1327 -6874:2:1328 -6875:2:1329 -6876:2:1327 -6877:2:1328 -6878:2:1329 -6879:2:1340 -6880:2:1345 -6881:2:1346 -6882:0:4365 -6883:2:1358 -6884:0:4365 -6885:2:1454 -6886:0:4365 -6887:3:4286 -6888:0:4365 -6889:2:1455 -6890:0:4365 -6891:3:4287 -6892:0:4365 -6893:2:1652 -6894:0:4365 -6895:2:1653 -6896:0:4365 -6897:2:1657 -6898:0:4365 -6899:2:1660 -6900:0:4365 -6901:3:4286 -6902:0:4365 -6903:2:1665 -6904:2:1669 -6905:2:1670 -6906:2:1678 -6907:2:1679 -6908:2:1683 -6909:2:1684 -6910:2:1678 -6911:2:1679 -6912:2:1680 -6913:2:1692 -6914:2:1697 -6915:2:1701 -6916:2:1702 -6917:2:1709 -6918:2:1710 -6919:2:1721 -6920:2:1722 -6921:2:1723 -6922:2:1721 -6923:2:1722 -6924:2:1723 -6925:2:1734 -6926:2:1739 -6927:2:1740 -6928:0:4365 -6929:3:4287 -6930:0:4365 -6931:2:1752 -6932:0:4365 -6933:3:4286 -6934:0:4365 -6935:2:1754 -6936:0:4365 -6937:3:4287 -6938:0:4365 -6939:2:1755 -6940:2:1759 -6941:2:1760 -6942:2:1768 -6943:2:1769 -6944:2:1773 -6945:2:1774 -6946:2:1768 -6947:2:1769 -6948:2:1773 -6949:2:1774 -6950:2:1782 -6951:2:1787 -6952:2:1791 -6953:2:1792 -6954:2:1799 -6955:2:1800 -6956:2:1811 -6957:2:1812 -6958:2:1813 -6959:2:1811 -6960:2:1812 -6961:2:1813 -6962:2:1824 -6963:2:1829 -6964:2:1830 -6965:0:4365 -6966:2:1842 -6967:0:4365 -6968:3:4286 -6969:0:4365 -6970:2:1844 -6971:0:4365 -6972:3:4287 -6973:0:4365 -6974:2:1845 -6975:2:1849 -6976:2:1850 -6977:2:1858 -6978:2:1859 -6979:2:1863 -6980:2:1864 -6981:2:1858 -6982:2:1859 -6983:2:1863 -6984:2:1864 -6985:2:1872 -6986:2:1877 -6987:2:1881 -6988:2:1882 -6989:2:1889 -6990:2:1890 -6991:2:1901 -6992:2:1902 -6993:2:1903 -6994:2:1901 -6995:2:1902 -6996:2:1903 -6997:2:1914 -6998:2:1919 -6999:2:1920 -7000:0:4365 -7001:2:1932 -7002:0:4365 -7003:3:4286 -7004:0:4365 -7005:2:1934 -7006:0:4365 -7007:3:4287 -7008:0:4365 -7009:2:1935 -7010:0:4365 -7011:2:1936 -7012:0:4365 -7013:2:2129 -7014:0:4365 -7015:2:2130 -7016:0:4365 -7017:2:2134 -7018:0:4365 -7019:3:4286 -7020:0:4365 -7021:2:2136 -7022:0:4365 -7023:3:4287 -7024:0:4365 -7025:2:2137 -7026:2:2141 -7027:2:2142 -7028:2:2150 -7029:2:2151 -7030:2:2155 -7031:2:2156 -7032:2:2150 -7033:2:2151 -7034:2:2155 -7035:2:2156 -7036:2:2164 -7037:2:2169 -7038:2:2173 -7039:2:2174 -7040:2:2181 -7041:2:2182 -7042:2:2193 -7043:2:2194 -7044:2:2195 -7045:2:2193 -7046:2:2194 -7047:2:2195 -7048:2:2206 -7049:2:2211 -7050:2:2212 -7051:0:4365 -7052:2:2224 -7053:0:4365 -7054:3:4286 -7055:0:4365 -7056:2:2226 -7057:0:4365 -7058:3:4287 -7059:0:4365 -7060:2:1936 -7061:0:4365 -7062:2:2129 -7063:0:4365 -7064:2:2130 -7065:0:4365 -7066:2:2134 -7067:0:4365 -7068:3:4286 -7069:0:4365 -7070:2:2136 -7071:0:4365 -7072:3:4287 -7073:0:4365 -7074:2:2137 -7075:2:2141 -7076:2:2142 -7077:2:2150 -7078:2:2151 -7079:2:2155 -7080:2:2156 -7081:2:2150 -7082:2:2151 -7083:2:2152 -7084:2:2164 -7085:2:2169 -7086:2:2173 -7087:2:2174 -7088:2:2181 -7089:2:2182 -7090:2:2193 -7091:2:2194 -7092:2:2195 -7093:2:2193 -7094:2:2194 -7095:2:2195 -7096:2:2206 -7097:2:2211 -7098:2:2212 -7099:0:4365 -7100:2:2224 -7101:0:4365 -7102:3:4286 -7103:0:4365 -7104:2:2226 -7105:0:4365 -7106:3:4287 -7107:0:4365 -7108:2:2230 -7109:0:4365 -7110:3:4286 -7111:0:4365 -7112:2:2235 -7113:2:2239 -7114:2:2240 -7115:2:2248 -7116:2:2249 -7117:2:2253 -7118:2:2254 -7119:2:2248 -7120:2:2249 -7121:2:2250 -7122:2:2262 -7123:2:2267 -7124:2:2271 -7125:2:2272 -7126:2:2279 -7127:2:2280 -7128:2:2291 -7129:2:2292 -7130:2:2293 -7131:2:2291 -7132:2:2292 -7133:2:2293 -7134:2:2304 -7135:2:2309 -7136:2:2310 -7137:0:4365 -7138:3:4287 -7139:0:4365 -7140:2:2322 -7141:0:4365 -7142:2:1169 -7143:0:4365 -7144:3:4286 -7145:0:4365 -7146:2:1170 -7147:0:4365 -7148:3:4287 -7149:0:4365 -7150:3:4288 -7151:0:4365 -7152:3:4294 -7153:0:4365 -7154:3:4295 -7155:0:4365 -7156:3:2338 -7157:0:4365 -7158:3:2339 -7159:3:2343 -7160:3:2344 -7161:3:2352 -7162:3:2353 -7163:3:2357 -7164:3:2358 -7165:3:2352 -7166:3:2353 -7167:3:2357 -7168:3:2358 -7169:3:2366 -7170:3:2371 -7171:3:2375 -7172:3:2376 -7173:3:2383 -7174:3:2384 -7175:3:2395 -7176:3:2396 -7177:3:2397 -7178:3:2395 -7179:3:2396 -7180:3:2397 -7181:3:2408 -7182:3:2413 -7183:3:2414 -7184:0:4365 -7185:3:2426 -7186:0:4365 -7187:3:2427 -7188:0:4365 -7189:2:1173 -7190:0:4365 -7191:3:2428 -7192:0:4365 -7193:2:1179 -7194:0:4365 -7195:2:1180 -7196:0:4365 -7197:3:2427 -7198:0:4365 -7199:2:1181 -7200:2:1185 -7201:2:1186 -7202:2:1194 -7203:2:1195 -7204:2:1199 -7205:2:1200 -7206:2:1194 -7207:2:1195 -7208:2:1199 -7209:2:1200 -7210:2:1208 -7211:2:1213 -7212:2:1217 -7213:2:1218 -7214:2:1225 -7215:2:1226 -7216:2:1237 -7217:2:1238 -7218:2:1239 -7219:2:1237 -7220:2:1238 -7221:2:1239 -7222:2:1250 -7223:2:1255 -7224:2:1256 -7225:0:4365 -7226:3:2428 -7227:0:4365 -7228:2:1268 -7229:0:4365 -7230:3:2427 -7231:0:4365 -7232:2:1270 -7233:0:4365 -7234:3:2428 -7235:0:4365 -7236:2:1271 -7237:2:1275 -7238:2:1276 -7239:2:1284 -7240:2:1285 -7241:2:1289 -7242:2:1290 -7243:2:1284 -7244:2:1285 -7245:2:1289 -7246:2:1290 -7247:2:1298 -7248:2:1303 -7249:2:1307 -7250:2:1308 -7251:2:1315 -7252:2:1316 -7253:2:1327 -7254:2:1328 -7255:2:1329 -7256:2:1327 -7257:2:1328 -7258:2:1329 -7259:2:1340 -7260:2:1345 -7261:2:1346 -7262:0:4365 -7263:2:1358 -7264:0:4365 -7265:2:1360 -7266:0:4365 -7267:3:2427 -7268:0:4365 -7269:2:1361 -7270:0:4365 -7271:3:2428 -7272:0:4365 -7273:2:1362 -7274:2:1366 -7275:2:1367 -7276:2:1375 -7277:2:1376 -7278:2:1380 -7279:2:1381 -7280:2:1375 -7281:2:1376 -7282:2:1380 -7283:2:1381 -7284:2:1389 -7285:2:1394 -7286:2:1398 -7287:2:1399 -7288:2:1406 -7289:2:1407 -7290:2:1418 -7291:2:1419 -7292:2:1420 -7293:2:1418 -7294:2:1419 -7295:2:1420 -7296:2:1431 -7297:2:1436 -7298:2:1437 -7299:0:4365 -7300:2:1449 -7301:0:4365 -7302:3:2427 -7303:0:4365 -7304:2:1451 -7305:0:4365 -7306:3:2428 -7307:0:4365 -7308:2:1652 -7309:0:4365 -7310:2:1653 -7311:0:4365 -7312:2:1657 -7313:0:4365 -7314:2:1180 -7315:0:4365 -7316:3:2427 -7317:0:4365 -7318:2:1181 -7319:2:1185 -7320:2:1186 -7321:2:1194 -7322:2:1195 -7323:2:1199 -7324:2:1200 -7325:2:1194 -7326:2:1195 -7327:2:1196 -7328:2:1208 -7329:2:1213 -7330:2:1217 -7331:2:1218 -7332:2:1225 -7333:2:1226 -7334:2:1237 -7335:2:1238 -7336:2:1239 -7337:2:1237 -7338:2:1238 -7339:2:1239 -7340:2:1250 -7341:2:1255 -7342:2:1256 -7343:0:4365 -7344:3:2428 -7345:0:4365 -7346:2:1268 -7347:0:4365 -7348:3:2427 -7349:0:4365 -7350:2:1270 -7351:0:4365 -7352:3:2428 -7353:0:4365 -7354:2:1271 -7355:2:1275 -7356:2:1276 -7357:2:1284 -7358:2:1285 -7359:2:1289 -7360:2:1290 -7361:2:1284 -7362:2:1285 -7363:2:1289 -7364:2:1290 -7365:2:1298 -7366:2:1303 -7367:2:1307 -7368:2:1308 -7369:2:1315 -7370:2:1316 -7371:2:1327 -7372:2:1328 -7373:2:1329 -7374:2:1327 -7375:2:1328 -7376:2:1329 -7377:2:1340 -7378:2:1345 -7379:2:1346 -7380:0:4365 -7381:2:1358 -7382:0:4365 -7383:2:1454 -7384:0:4365 -7385:3:2427 -7386:0:4365 -7387:2:1455 -7388:0:4365 -7389:3:2428 -7390:0:4365 -7391:2:1652 -7392:0:4365 -7393:2:1653 -7394:0:4365 -7395:2:1657 -7396:0:4365 -7397:2:1660 -7398:0:4365 -7399:3:2427 -7400:0:4365 -7401:2:1665 -7402:2:1669 -7403:2:1670 -7404:2:1678 -7405:2:1679 -7406:2:1683 -7407:2:1684 -7408:2:1678 -7409:2:1679 -7410:2:1680 -7411:2:1692 -7412:2:1697 -7413:2:1701 -7414:2:1702 -7415:2:1709 -7416:2:1710 -7417:2:1721 -7418:2:1722 -7419:2:1723 -7420:2:1721 -7421:2:1722 -7422:2:1723 -7423:2:1734 -7424:2:1739 -7425:2:1740 -7426:0:4365 -7427:3:2428 -7428:0:4365 -7429:2:1752 -7430:0:4365 -7431:3:2427 -7432:0:4365 -7433:2:1754 -7434:0:4365 -7435:3:2428 -7436:0:4365 -7437:2:1755 -7438:2:1759 -7439:2:1760 -7440:2:1768 -7441:2:1769 -7442:2:1773 -7443:2:1774 -7444:2:1768 -7445:2:1769 -7446:2:1773 -7447:2:1774 -7448:2:1782 -7449:2:1787 -7450:2:1791 -7451:2:1792 -7452:2:1799 -7453:2:1800 -7454:2:1811 -7455:2:1812 -7456:2:1813 -7457:2:1811 -7458:2:1812 -7459:2:1813 -7460:2:1824 -7461:2:1829 -7462:2:1830 -7463:0:4365 -7464:2:1842 -7465:0:4365 -7466:3:2427 -7467:0:4365 -7468:2:1844 -7469:0:4365 -7470:3:2428 -7471:0:4365 -7472:2:1845 -7473:2:1849 -7474:2:1850 -7475:2:1858 -7476:2:1859 -7477:2:1863 -7478:2:1864 -7479:2:1858 -7480:2:1859 -7481:2:1863 -7482:2:1864 -7483:2:1872 -7484:2:1877 -7485:2:1881 -7486:2:1882 -7487:2:1889 -7488:2:1890 -7489:2:1901 -7490:2:1902 -7491:2:1903 -7492:2:1901 -7493:2:1902 -7494:2:1903 -7495:2:1914 -7496:2:1919 -7497:2:1920 -7498:0:4365 -7499:2:1932 -7500:0:4365 -7501:3:2427 -7502:0:4365 -7503:2:1934 -7504:0:4365 -7505:3:2428 -7506:0:4365 -7507:2:1935 -7508:0:4365 -7509:2:1936 -7510:0:4365 -7511:2:2129 -7512:0:4365 -7513:2:2130 -7514:0:4365 -7515:2:2134 -7516:0:4365 -7517:3:2427 -7518:0:4365 -7519:2:2136 -7520:0:4365 -7521:3:2428 -7522:0:4365 -7523:2:2137 -7524:2:2141 -7525:2:2142 -7526:2:2150 -7527:2:2151 -7528:2:2155 -7529:2:2156 -7530:2:2150 -7531:2:2151 -7532:2:2155 -7533:2:2156 -7534:2:2164 -7535:2:2169 -7536:2:2173 -7537:2:2174 -7538:2:2181 -7539:2:2182 -7540:2:2193 -7541:2:2194 -7542:2:2195 -7543:2:2193 -7544:2:2194 -7545:2:2195 -7546:2:2206 -7547:2:2211 -7548:2:2212 -7549:0:4365 -7550:2:2224 -7551:0:4365 -7552:3:2427 -7553:0:4365 -7554:2:2226 -7555:0:4365 -7556:3:2428 -7557:0:4365 -7558:2:1936 -7559:0:4365 -7560:2:2129 -7561:0:4365 -7562:2:2130 -7563:0:4365 -7564:2:2134 -7565:0:4365 -7566:3:2427 -7567:0:4365 -7568:2:2136 -7569:0:4365 -7570:3:2428 -7571:0:4365 -7572:2:2137 -7573:2:2141 -7574:2:2142 -7575:2:2150 -7576:2:2151 -7577:2:2155 -7578:2:2156 -7579:2:2150 -7580:2:2151 -7581:2:2152 -7582:2:2164 -7583:2:2169 -7584:2:2173 -7585:2:2174 -7586:2:2181 -7587:2:2182 -7588:2:2193 -7589:2:2194 -7590:2:2195 -7591:2:2193 -7592:2:2194 -7593:2:2195 -7594:2:2206 -7595:2:2211 -7596:2:2212 -7597:0:4365 -7598:2:2224 -7599:0:4365 -7600:3:2427 -7601:0:4365 -7602:2:2226 -7603:0:4365 -7604:3:2428 -7605:0:4365 -7606:2:2230 -7607:0:4365 -7608:3:2427 -7609:0:4365 -7610:2:2235 -7611:2:2239 -7612:2:2240 -7613:2:2248 -7614:2:2249 -7615:2:2253 -7616:2:2254 -7617:2:2248 -7618:2:2249 -7619:2:2250 -7620:2:2262 -7621:2:2267 -7622:2:2271 -7623:2:2272 -7624:2:2279 -7625:2:2280 -7626:2:2291 -7627:2:2292 -7628:2:2293 -7629:2:2291 -7630:2:2292 -7631:2:2293 -7632:2:2304 -7633:2:2309 -7634:2:2310 -7635:0:4365 -7636:3:2428 -7637:0:4365 -7638:2:2322 -7639:0:4365 -7640:2:1169 -7641:0:4365 -7642:3:2427 -7643:0:4365 -7644:2:1170 -7645:0:4365 -7646:3:2428 -7647:0:4365 -7648:3:2429 -7649:0:4365 -7650:3:2435 -7651:3:2436 -7652:0:4365 -7653:3:2440 -7654:3:2444 -7655:3:2445 -7656:3:2453 -7657:3:2454 -7658:3:2458 -7659:3:2459 -7660:3:2453 -7661:3:2454 -7662:3:2458 -7663:3:2459 -7664:3:2467 -7665:3:2472 -7666:3:2473 -7667:3:2484 -7668:3:2485 -7669:3:2496 -7670:3:2497 -7671:3:2498 -7672:3:2496 -7673:3:2497 -7674:3:2498 -7675:3:2509 -7676:3:2514 -7677:3:2515 -7678:0:4365 -7679:3:2527 -7680:0:4365 -7681:3:2528 -7682:0:4365 -7683:2:1173 -7684:0:4365 -7685:3:2529 -7686:0:4365 -7687:2:1179 -7688:0:4365 -7689:2:1180 -7690:0:4365 -7691:3:2528 -7692:0:4365 -7693:2:1181 -7694:2:1185 -7695:2:1186 -7696:2:1194 -7697:2:1195 -7698:2:1199 -7699:2:1200 -7700:2:1194 -7701:2:1195 -7702:2:1199 -7703:2:1200 -7704:2:1208 -7705:2:1213 -7706:2:1217 -7707:2:1218 -7708:2:1225 -7709:2:1226 -7710:2:1237 -7711:2:1238 -7712:2:1239 -7713:2:1237 -7714:2:1238 -7715:2:1239 -7716:2:1250 -7717:2:1255 -7718:2:1256 -7719:0:4365 -7720:3:2529 -7721:0:4365 -7722:2:1268 -7723:0:4365 -7724:3:2528 -7725:0:4365 -7726:2:1270 -7727:0:4365 -7728:3:2529 -7729:0:4365 -7730:2:1271 -7731:2:1275 -7732:2:1276 -7733:2:1284 -7734:2:1285 -7735:2:1289 -7736:2:1290 -7737:2:1284 -7738:2:1285 -7739:2:1289 -7740:2:1290 -7741:2:1298 -7742:2:1303 -7743:2:1307 -7744:2:1308 -7745:2:1315 -7746:2:1316 -7747:2:1327 -7748:2:1328 -7749:2:1329 -7750:2:1327 -7751:2:1328 -7752:2:1329 -7753:2:1340 -7754:2:1345 -7755:2:1346 -7756:0:4365 -7757:2:1358 -7758:0:4365 -7759:2:1360 -7760:0:4365 -7761:3:2528 -7762:0:4365 -7763:2:1361 -7764:0:4365 -7765:3:2529 -7766:0:4365 -7767:2:1362 -7768:2:1366 -7769:2:1367 -7770:2:1375 -7771:2:1376 -7772:2:1380 -7773:2:1381 -7774:2:1375 -7775:2:1376 -7776:2:1380 -7777:2:1381 -7778:2:1389 -7779:2:1394 -7780:2:1398 -7781:2:1399 -7782:2:1406 -7783:2:1407 -7784:2:1418 -7785:2:1419 -7786:2:1420 -7787:2:1418 -7788:2:1419 -7789:2:1420 -7790:2:1431 -7791:2:1436 -7792:2:1437 -7793:0:4365 -7794:2:1449 -7795:0:4365 -7796:3:2528 -7797:0:4365 -7798:2:1451 -7799:0:4365 -7800:3:2529 -7801:0:4365 -7802:2:1652 -7803:0:4365 -7804:2:1653 -7805:0:4365 -7806:2:1657 -7807:0:4365 -7808:2:1180 -7809:0:4365 -7810:3:2528 -7811:0:4365 -7812:2:1181 -7813:2:1185 -7814:2:1186 -7815:2:1194 -7816:2:1195 -7817:2:1199 -7818:2:1200 -7819:2:1194 -7820:2:1195 -7821:2:1196 -7822:2:1208 -7823:2:1213 -7824:2:1217 -7825:2:1218 -7826:2:1225 -7827:2:1226 -7828:2:1237 -7829:2:1238 -7830:2:1239 -7831:2:1237 -7832:2:1238 -7833:2:1239 -7834:2:1250 -7835:2:1255 -7836:2:1256 -7837:0:4365 -7838:3:2529 -7839:0:4365 -7840:2:1268 -7841:0:4365 -7842:3:2528 -7843:0:4365 -7844:2:1270 -7845:0:4365 -7846:3:2529 -7847:0:4365 -7848:2:1271 -7849:2:1275 -7850:2:1276 -7851:2:1284 -7852:2:1285 -7853:2:1289 -7854:2:1290 -7855:2:1284 -7856:2:1285 -7857:2:1289 -7858:2:1290 -7859:2:1298 -7860:2:1303 -7861:2:1307 -7862:2:1308 -7863:2:1315 -7864:2:1316 -7865:2:1327 -7866:2:1328 -7867:2:1329 -7868:2:1327 -7869:2:1328 -7870:2:1329 -7871:2:1340 -7872:2:1345 -7873:2:1346 -7874:0:4365 -7875:2:1358 -7876:0:4365 -7877:2:1454 -7878:0:4365 -7879:3:2528 -7880:0:4365 -7881:2:1455 -7882:0:4365 -7883:3:2529 -7884:0:4365 -7885:2:1652 -7886:0:4365 -7887:2:1653 -7888:0:4365 -7889:2:1657 -7890:0:4365 -7891:2:1660 -7892:0:4365 -7893:3:2528 -7894:0:4365 -7895:2:1665 -7896:2:1669 -7897:2:1670 -7898:2:1678 -7899:2:1679 -7900:2:1683 -7901:2:1684 -7902:2:1678 -7903:2:1679 -7904:2:1680 -7905:2:1692 -7906:2:1697 -7907:2:1701 -7908:2:1702 -7909:2:1709 -7910:2:1710 -7911:2:1721 -7912:2:1722 -7913:2:1723 -7914:2:1721 -7915:2:1722 -7916:2:1723 -7917:2:1734 -7918:2:1739 -7919:2:1740 -7920:0:4365 -7921:3:2529 -7922:0:4365 -7923:2:1752 -7924:0:4365 -7925:3:2528 -7926:0:4365 -7927:2:1754 -7928:0:4365 -7929:3:2529 -7930:0:4365 -7931:2:1755 -7932:2:1759 -7933:2:1760 -7934:2:1768 -7935:2:1769 -7936:2:1773 -7937:2:1774 -7938:2:1768 -7939:2:1769 -7940:2:1773 -7941:2:1774 -7942:2:1782 -7943:2:1787 -7944:2:1791 -7945:2:1792 -7946:2:1799 -7947:2:1800 -7948:2:1811 -7949:2:1812 -7950:2:1813 -7951:2:1811 -7952:2:1812 -7953:2:1813 -7954:2:1824 -7955:2:1829 -7956:2:1830 -7957:0:4365 -7958:2:1842 -7959:0:4365 -7960:3:2528 -7961:0:4365 -7962:2:1844 -7963:0:4365 -7964:3:2529 -7965:0:4365 -7966:2:1845 -7967:2:1849 -7968:2:1850 -7969:2:1858 -7970:2:1859 -7971:2:1863 -7972:2:1864 -7973:2:1858 -7974:2:1859 -7975:2:1863 -7976:2:1864 -7977:2:1872 -7978:2:1877 -7979:2:1881 -7980:2:1882 -7981:2:1889 -7982:2:1890 -7983:2:1901 -7984:2:1902 -7985:2:1903 -7986:2:1901 -7987:2:1902 -7988:2:1903 -7989:2:1914 -7990:2:1919 -7991:2:1920 -7992:0:4365 -7993:2:1932 -7994:0:4365 -7995:3:2528 -7996:0:4365 -7997:2:1934 -7998:0:4365 -7999:3:2529 -8000:0:4365 -8001:2:1935 -8002:0:4365 -8003:2:1936 -8004:0:4365 -8005:2:2129 -8006:0:4365 -8007:2:2130 -8008:0:4365 -8009:2:2134 -8010:0:4365 -8011:3:2528 -8012:0:4365 -8013:2:2136 -8014:0:4365 -8015:3:2529 -8016:0:4365 -8017:2:2137 -8018:2:2141 -8019:2:2142 -8020:2:2150 -8021:2:2151 -8022:2:2155 -8023:2:2156 -8024:2:2150 -8025:2:2151 -8026:2:2155 -8027:2:2156 -8028:2:2164 -8029:2:2169 -8030:2:2173 -8031:2:2174 -8032:2:2181 -8033:2:2182 -8034:2:2193 -8035:2:2194 -8036:2:2195 -8037:2:2193 -8038:2:2194 -8039:2:2195 -8040:2:2206 -8041:2:2211 -8042:2:2212 -8043:0:4365 -8044:2:2224 -8045:0:4365 -8046:3:2528 -8047:0:4365 -8048:2:2226 -8049:0:4365 -8050:3:2529 -8051:0:4365 -8052:2:1936 -8053:0:4365 -8054:2:2129 -8055:0:4365 -8056:2:2130 -8057:0:4365 -8058:2:2134 -8059:0:4365 -8060:3:2528 -8061:0:4365 -8062:2:2136 -8063:0:4365 -8064:3:2529 -8065:0:4365 -8066:2:2137 -8067:2:2141 -8068:2:2142 -8069:2:2150 -8070:2:2151 -8071:2:2155 -8072:2:2156 -8073:2:2150 -8074:2:2151 -8075:2:2152 -8076:2:2164 -8077:2:2169 -8078:2:2173 -8079:2:2174 -8080:2:2181 -8081:2:2182 -8082:2:2193 -8083:2:2194 -8084:2:2195 -8085:2:2193 -8086:2:2194 -8087:2:2195 -8088:2:2206 -8089:2:2211 -8090:2:2212 -8091:0:4365 -8092:2:2224 -8093:0:4365 -8094:3:2528 -8095:0:4365 -8096:2:2226 -8097:0:4365 -8098:3:2529 -8099:0:4365 -8100:2:2230 -8101:0:4365 -8102:3:2528 -8103:0:4365 -8104:2:2235 -8105:2:2239 -8106:2:2240 -8107:2:2248 -8108:2:2249 -8109:2:2253 -8110:2:2254 -8111:2:2248 -8112:2:2249 -8113:2:2250 -8114:2:2262 -8115:2:2267 -8116:2:2271 -8117:2:2272 -8118:2:2279 -8119:2:2280 -8120:2:2291 -8121:2:2292 -8122:2:2293 -8123:2:2291 -8124:2:2292 -8125:2:2293 -8126:2:2304 -8127:2:2309 -8128:2:2310 -8129:0:4365 -8130:3:2529 -8131:0:4365 -8132:2:2322 -8133:0:4365 -8134:2:1169 -8135:0:4365 -8136:3:2528 -8137:0:4365 -8138:2:1170 -8139:0:4365 -8140:3:2529 -8141:0:4365 -8142:3:2530 -8143:0:4365 -8144:3:2536 -8145:0:4365 -8146:3:2537 -8147:0:4365 -8148:3:2547 -8149:0:4365 -8150:3:2548 -8151:0:4365 -8152:3:2552 -8153:3:2553 -8154:3:2557 -8155:3:2561 -8156:3:2562 -8157:3:2557 -8158:3:2561 -8159:3:2562 -8160:3:2566 -8161:3:2574 -8162:3:2575 -8163:3:2580 -8164:3:2587 -8165:3:2588 -8166:3:2587 -8167:3:2588 -8168:3:2595 -8169:3:2600 -8170:0:4365 -8171:3:2611 -8172:0:4365 -8173:3:2615 -8174:3:2616 -8175:3:2620 -8176:3:2624 -8177:3:2625 -8178:3:2620 -8179:3:2624 -8180:3:2625 -8181:3:2629 -8182:3:2637 -8183:3:2638 -8184:3:2643 -8185:3:2650 -8186:3:2651 -8187:3:2650 -8188:3:2651 -8189:3:2658 -8190:3:2663 -8191:0:4365 -8192:3:2611 -8193:0:4365 -8194:3:2615 -8195:3:2616 -8196:3:2620 -8197:3:2624 -8198:3:2625 -8199:3:2620 -8200:3:2624 -8201:3:2625 -8202:3:2629 -8203:3:2637 -8204:3:2638 -8205:3:2643 -8206:3:2650 -8207:3:2651 -8208:3:2650 -8209:3:2651 -8210:3:2658 -8211:3:2663 -8212:0:4365 -8213:3:2674 -8214:0:4365 -8215:3:2682 -8216:3:2683 -8217:3:2687 -8218:3:2691 -8219:3:2692 -8220:3:2687 -8221:3:2691 -8222:3:2692 -8223:3:2696 -8224:3:2704 -8225:3:2705 -8226:3:2710 -8227:3:2717 -8228:3:2718 -8229:3:2717 -8230:3:2718 -8231:3:2725 -8232:3:2730 -8233:0:4365 -8234:3:2745 -8235:0:4365 -8236:3:2746 -8237:0:4365 -8238:2:1173 -8239:0:4365 -8240:3:2747 -8241:0:4365 -8242:2:1179 -8243:0:4365 -8244:2:1180 -8245:0:4365 -8246:3:2746 -8247:0:4365 -8248:2:1181 -8249:2:1185 -8250:2:1186 -8251:2:1194 -8252:2:1195 -8253:2:1199 -8254:2:1200 -8255:2:1194 -8256:2:1195 -8257:2:1199 -8258:2:1200 -8259:2:1208 -8260:2:1213 -8261:2:1217 -8262:2:1218 -8263:2:1225 -8264:2:1226 -8265:2:1237 -8266:2:1238 -8267:2:1239 -8268:2:1237 -8269:2:1238 -8270:2:1239 -8271:2:1250 -8272:2:1255 -8273:2:1256 -8274:0:4365 -8275:3:2747 -8276:0:4365 -8277:2:1268 -8278:0:4365 -8279:3:2746 -8280:0:4365 -8281:2:1270 -8282:0:4365 -8283:3:2747 -8284:0:4365 -8285:2:1271 -8286:2:1275 -8287:2:1276 -8288:2:1284 -8289:2:1285 -8290:2:1289 -8291:2:1290 -8292:2:1284 -8293:2:1285 -8294:2:1289 -8295:2:1290 -8296:2:1298 -8297:2:1303 -8298:2:1307 -8299:2:1308 -8300:2:1315 -8301:2:1316 -8302:2:1327 -8303:2:1328 -8304:2:1329 -8305:2:1327 -8306:2:1328 -8307:2:1329 -8308:2:1340 -8309:2:1345 -8310:2:1346 -8311:0:4365 -8312:2:1358 -8313:0:4365 -8314:2:1360 -8315:0:4365 -8316:3:2746 -8317:0:4365 -8318:2:1361 -8319:0:4365 -8320:3:2747 -8321:0:4365 -8322:2:1362 -8323:2:1366 -8324:2:1367 -8325:2:1375 -8326:2:1376 -8327:2:1380 -8328:2:1381 -8329:2:1375 -8330:2:1376 -8331:2:1380 -8332:2:1381 -8333:2:1389 -8334:2:1394 -8335:2:1398 -8336:2:1399 -8337:2:1406 -8338:2:1407 -8339:2:1418 -8340:2:1419 -8341:2:1420 -8342:2:1418 -8343:2:1419 -8344:2:1420 -8345:2:1431 -8346:2:1436 -8347:2:1437 -8348:0:4365 -8349:2:1449 -8350:0:4365 -8351:3:2746 -8352:0:4365 -8353:2:1451 -8354:0:4365 -8355:3:2747 -8356:0:4365 -8357:2:1652 -8358:0:4365 -8359:2:1653 -8360:0:4365 -8361:2:1657 -8362:0:4365 -8363:2:1180 -8364:0:4365 -8365:3:2746 -8366:0:4365 -8367:2:1181 -8368:2:1185 -8369:2:1186 -8370:2:1194 -8371:2:1195 -8372:2:1199 -8373:2:1200 -8374:2:1194 -8375:2:1195 -8376:2:1196 -8377:2:1208 -8378:2:1213 -8379:2:1217 -8380:2:1218 -8381:2:1225 -8382:2:1226 -8383:2:1237 -8384:2:1238 -8385:2:1239 -8386:2:1237 -8387:2:1238 -8388:2:1239 -8389:2:1250 -8390:2:1255 -8391:2:1256 -8392:0:4365 -8393:3:2747 -8394:0:4365 -8395:2:1268 -8396:0:4365 -8397:3:2746 -8398:0:4365 -8399:2:1270 -8400:0:4365 -8401:3:2747 -8402:0:4365 -8403:2:1271 -8404:2:1275 -8405:2:1276 -8406:2:1284 -8407:2:1285 -8408:2:1289 -8409:2:1290 -8410:2:1284 -8411:2:1285 -8412:2:1289 -8413:2:1290 -8414:2:1298 -8415:2:1303 -8416:2:1307 -8417:2:1308 -8418:2:1315 -8419:2:1316 -8420:2:1327 -8421:2:1328 -8422:2:1329 -8423:2:1327 -8424:2:1328 -8425:2:1329 -8426:2:1340 -8427:2:1345 -8428:2:1346 -8429:0:4365 -8430:2:1358 -8431:0:4365 -8432:2:1454 -8433:0:4365 -8434:3:2746 -8435:0:4365 -8436:2:1455 -8437:0:4365 -8438:3:2747 -8439:0:4365 -8440:2:1652 -8441:0:4365 -8442:2:1653 -8443:0:4365 -8444:2:1657 -8445:0:4365 -8446:2:1660 -8447:0:4365 -8448:3:2746 -8449:0:4365 -8450:2:1665 -8451:2:1669 -8452:2:1670 -8453:2:1678 -8454:2:1679 -8455:2:1683 -8456:2:1684 -8457:2:1678 -8458:2:1679 -8459:2:1680 -8460:2:1692 -8461:2:1697 -8462:2:1701 -8463:2:1702 -8464:2:1709 -8465:2:1710 -8466:2:1721 -8467:2:1722 -8468:2:1723 -8469:2:1721 -8470:2:1722 -8471:2:1723 -8472:2:1734 -8473:2:1739 -8474:2:1740 -8475:0:4365 -8476:3:2747 -8477:0:4365 -8478:2:1752 -8479:0:4365 -8480:3:2746 -8481:0:4365 -8482:2:1754 -8483:0:4365 -8484:3:2747 -8485:0:4365 -8486:2:1755 -8487:2:1759 -8488:2:1760 -8489:2:1768 -8490:2:1769 -8491:2:1773 -8492:2:1774 -8493:2:1768 -8494:2:1769 -8495:2:1773 -8496:2:1774 -8497:2:1782 -8498:2:1787 -8499:2:1791 -8500:2:1792 -8501:2:1799 -8502:2:1800 -8503:2:1811 -8504:2:1812 -8505:2:1813 -8506:2:1811 -8507:2:1812 -8508:2:1813 -8509:2:1824 -8510:2:1829 -8511:2:1830 -8512:0:4365 -8513:2:1842 -8514:0:4365 -8515:3:2746 -8516:0:4365 -8517:2:1844 -8518:0:4365 -8519:3:2747 -8520:0:4365 -8521:2:1845 -8522:2:1849 -8523:2:1850 -8524:2:1858 -8525:2:1859 -8526:2:1863 -8527:2:1864 -8528:2:1858 -8529:2:1859 -8530:2:1863 -8531:2:1864 -8532:2:1872 -8533:2:1877 -8534:2:1881 -8535:2:1882 -8536:2:1889 -8537:2:1890 -8538:2:1901 -8539:2:1902 -8540:2:1903 -8541:2:1901 -8542:2:1902 -8543:2:1903 -8544:2:1914 -8545:2:1919 -8546:2:1920 -8547:0:4365 -8548:2:1932 -8549:0:4365 -8550:3:2746 -8551:0:4365 -8552:2:1934 -8553:0:4365 -8554:3:2747 -8555:0:4365 -8556:2:1935 -8557:0:4365 -8558:2:1936 -8559:0:4365 -8560:2:2129 -8561:0:4365 -8562:2:2130 -8563:0:4365 -8564:2:2134 -8565:0:4365 -8566:3:2746 -8567:0:4365 -8568:2:2136 -8569:0:4365 -8570:3:2747 -8571:0:4365 -8572:2:2137 -8573:2:2141 -8574:2:2142 -8575:2:2150 -8576:2:2151 -8577:2:2155 -8578:2:2156 -8579:2:2150 -8580:2:2151 -8581:2:2155 -8582:2:2156 -8583:2:2164 -8584:2:2169 -8585:2:2173 -8586:2:2174 -8587:2:2181 -8588:2:2182 -8589:2:2193 -8590:2:2194 -8591:2:2195 -8592:2:2193 -8593:2:2194 -8594:2:2195 -8595:2:2206 -8596:2:2211 -8597:2:2212 -8598:0:4365 -8599:2:2224 -8600:0:4365 -8601:3:2746 -8602:0:4365 -8603:2:2226 -8604:0:4365 -8605:3:2747 -8606:0:4365 -8607:2:1936 -8608:0:4365 -8609:2:2129 -8610:0:4365 -8611:2:2130 -8612:0:4365 -8613:2:2134 -8614:0:4365 -8615:3:2746 -8616:0:4365 -8617:2:2136 -8618:0:4365 -8619:3:2747 -8620:0:4365 -8621:2:2137 -8622:2:2141 -8623:2:2142 -8624:2:2150 -8625:2:2151 -8626:2:2155 -8627:2:2156 -8628:2:2150 -8629:2:2151 -8630:2:2152 -8631:2:2164 -8632:2:2169 -8633:2:2173 -8634:2:2174 -8635:2:2181 -8636:2:2182 -8637:2:2193 -8638:2:2194 -8639:2:2195 -8640:2:2193 -8641:2:2194 -8642:2:2195 -8643:2:2206 -8644:2:2211 -8645:2:2212 -8646:0:4365 -8647:2:2224 -8648:0:4365 -8649:3:2746 -8650:0:4365 -8651:2:2226 -8652:0:4365 -8653:3:2747 -8654:0:4365 -8655:2:2230 -8656:0:4365 -8657:3:2746 -8658:0:4365 -8659:2:2235 -8660:2:2239 -8661:2:2240 -8662:2:2248 -8663:2:2249 -8664:2:2253 -8665:2:2254 -8666:2:2248 -8667:2:2249 -8668:2:2250 -8669:2:2262 -8670:2:2267 -8671:2:2271 -8672:2:2272 -8673:2:2279 -8674:2:2280 -8675:2:2291 -8676:2:2292 -8677:2:2293 -8678:2:2291 -8679:2:2292 -8680:2:2293 -8681:2:2304 -8682:2:2309 -8683:2:2310 -8684:0:4365 -8685:3:2747 -8686:0:4365 -8687:2:2322 -8688:0:4365 -8689:2:1169 -8690:0:4365 -8691:3:2746 -8692:0:4365 -8693:2:1170 -8694:0:4365 -8695:3:2747 -8696:0:4365 -8697:3:2748 -8698:0:4365 -8699:3:2754 -8700:0:4365 -8701:3:2755 -8702:3:2759 -8703:3:2760 -8704:3:2768 -8705:3:2769 -8706:3:2773 -8707:3:2774 -8708:3:2768 -8709:3:2769 -8710:3:2773 -8711:3:2774 -8712:3:2782 -8713:3:2787 -8714:3:2791 -8715:3:2792 -8716:3:2799 -8717:3:2800 -8718:3:2811 -8719:3:2812 -8720:3:2813 -8721:3:2811 -8722:3:2812 -8723:3:2813 -8724:3:2824 -8725:3:2829 -8726:3:2830 -8727:0:4365 -8728:3:2842 -8729:0:4365 -8730:3:2843 -8731:0:4365 -8732:2:1173 -8733:0:4365 -8734:3:2844 -8735:0:4365 -8736:2:1179 -8737:0:4365 -8738:2:1180 -8739:0:4365 -8740:3:2843 -8741:0:4365 -8742:2:1181 -8743:2:1185 -8744:2:1186 -8745:2:1194 -8746:2:1195 -8747:2:1199 -8748:2:1200 -8749:2:1194 -8750:2:1195 -8751:2:1199 -8752:2:1200 -8753:2:1208 -8754:2:1213 -8755:2:1217 -8756:2:1218 -8757:2:1225 -8758:2:1226 -8759:2:1237 -8760:2:1238 -8761:2:1239 -8762:2:1237 -8763:2:1238 -8764:2:1239 -8765:2:1250 -8766:2:1255 -8767:2:1256 -8768:0:4365 -8769:3:2844 -8770:0:4365 -8771:2:1268 -8772:0:4365 -8773:3:2843 -8774:0:4365 -8775:2:1270 -8776:0:4365 -8777:3:2844 -8778:0:4365 -8779:2:1271 -8780:2:1275 -8781:2:1276 -8782:2:1284 -8783:2:1285 -8784:2:1289 -8785:2:1290 -8786:2:1284 -8787:2:1285 -8788:2:1289 -8789:2:1290 -8790:2:1298 -8791:2:1303 -8792:2:1307 -8793:2:1308 -8794:2:1315 -8795:2:1316 -8796:2:1327 -8797:2:1328 -8798:2:1329 -8799:2:1327 -8800:2:1328 -8801:2:1329 -8802:2:1340 -8803:2:1345 -8804:2:1346 -8805:0:4365 -8806:2:1358 -8807:0:4365 -8808:2:1360 -8809:0:4365 -8810:3:2843 -8811:0:4365 -8812:2:1361 -8813:0:4365 -8814:3:2844 -8815:0:4365 -8816:2:1362 -8817:2:1366 -8818:2:1367 -8819:2:1375 -8820:2:1376 -8821:2:1380 -8822:2:1381 -8823:2:1375 -8824:2:1376 -8825:2:1380 -8826:2:1381 -8827:2:1389 -8828:2:1394 -8829:2:1398 -8830:2:1399 -8831:2:1406 -8832:2:1407 -8833:2:1418 -8834:2:1419 -8835:2:1420 -8836:2:1418 -8837:2:1419 -8838:2:1420 -8839:2:1431 -8840:2:1436 -8841:2:1437 -8842:0:4365 -8843:2:1449 -8844:0:4365 -8845:3:2843 -8846:0:4365 -8847:2:1451 -8848:0:4365 -8849:3:2844 -8850:0:4365 -8851:2:1652 -8852:0:4365 -8853:2:1653 -8854:0:4365 -8855:2:1657 -8856:0:4365 -8857:2:1180 -8858:0:4365 -8859:3:2843 -8860:0:4365 -8861:2:1181 -8862:2:1185 -8863:2:1186 -8864:2:1194 -8865:2:1195 -8866:2:1199 -8867:2:1200 -8868:2:1194 -8869:2:1195 -8870:2:1196 -8871:2:1208 -8872:2:1213 -8873:2:1217 -8874:2:1218 -8875:2:1225 -8876:2:1226 -8877:2:1237 -8878:2:1238 -8879:2:1239 -8880:2:1237 -8881:2:1238 -8882:2:1239 -8883:2:1250 -8884:2:1255 -8885:2:1256 -8886:0:4365 -8887:3:2844 -8888:0:4365 -8889:2:1268 -8890:0:4365 -8891:3:2843 -8892:0:4365 -8893:2:1270 -8894:0:4365 -8895:3:2844 -8896:0:4365 -8897:2:1271 -8898:2:1275 -8899:2:1276 -8900:2:1284 -8901:2:1285 -8902:2:1289 -8903:2:1290 -8904:2:1284 -8905:2:1285 -8906:2:1289 -8907:2:1290 -8908:2:1298 -8909:2:1303 -8910:2:1307 -8911:2:1308 -8912:2:1315 -8913:2:1316 -8914:2:1327 -8915:2:1328 -8916:2:1329 -8917:2:1327 -8918:2:1328 -8919:2:1329 -8920:2:1340 -8921:2:1345 -8922:2:1346 -8923:0:4365 -8924:2:1358 -8925:0:4365 -8926:2:1454 -8927:0:4365 -8928:3:2843 -8929:0:4365 -8930:2:1455 -8931:0:4365 -8932:3:2844 -8933:0:4365 -8934:2:1652 -8935:0:4365 -8936:2:1653 -8937:0:4365 -8938:2:1657 -8939:0:4365 -8940:2:1660 -8941:0:4365 -8942:3:2843 -8943:0:4365 -8944:2:1665 -8945:2:1669 -8946:2:1670 -8947:2:1678 -8948:2:1679 -8949:2:1683 -8950:2:1684 -8951:2:1678 -8952:2:1679 -8953:2:1680 -8954:2:1692 -8955:2:1697 -8956:2:1701 -8957:2:1702 -8958:2:1709 -8959:2:1710 -8960:2:1721 -8961:2:1722 -8962:2:1723 -8963:2:1721 -8964:2:1722 -8965:2:1723 -8966:2:1734 -8967:2:1739 -8968:2:1740 -8969:0:4365 -8970:3:2844 -8971:0:4365 -8972:2:1752 -8973:0:4365 -8974:3:2843 -8975:0:4365 -8976:2:1754 -8977:0:4365 -8978:3:2844 -8979:0:4365 -8980:2:1755 -8981:2:1759 -8982:2:1760 -8983:2:1768 -8984:2:1769 -8985:2:1773 -8986:2:1774 -8987:2:1768 -8988:2:1769 -8989:2:1773 -8990:2:1774 -8991:2:1782 -8992:2:1787 -8993:2:1791 -8994:2:1792 -8995:2:1799 -8996:2:1800 -8997:2:1811 -8998:2:1812 -8999:2:1813 -9000:2:1811 -9001:2:1812 -9002:2:1813 -9003:2:1824 -9004:2:1829 -9005:2:1830 -9006:0:4365 -9007:2:1842 -9008:0:4365 -9009:3:2843 -9010:0:4365 -9011:2:1844 -9012:0:4365 -9013:3:2844 -9014:0:4365 -9015:2:1845 -9016:2:1849 -9017:2:1850 -9018:2:1858 -9019:2:1859 -9020:2:1863 -9021:2:1864 -9022:2:1858 -9023:2:1859 -9024:2:1863 -9025:2:1864 -9026:2:1872 -9027:2:1877 -9028:2:1881 -9029:2:1882 -9030:2:1889 -9031:2:1890 -9032:2:1901 -9033:2:1902 -9034:2:1903 -9035:2:1901 -9036:2:1902 -9037:2:1903 -9038:2:1914 -9039:2:1919 -9040:2:1920 -9041:0:4365 -9042:2:1932 -9043:0:4365 -9044:3:2843 -9045:0:4365 -9046:2:1934 -9047:0:4365 -9048:3:2844 -9049:0:4365 -9050:2:1935 -9051:0:4365 -9052:2:1936 -9053:0:4365 -9054:2:2129 -9055:0:4365 -9056:2:2130 -9057:0:4365 -9058:2:2134 -9059:0:4365 -9060:3:2843 -9061:0:4365 -9062:2:2136 -9063:0:4365 -9064:3:2844 -9065:0:4365 -9066:2:2137 -9067:2:2141 -9068:2:2142 -9069:2:2150 -9070:2:2151 -9071:2:2155 -9072:2:2156 -9073:2:2150 -9074:2:2151 -9075:2:2155 -9076:2:2156 -9077:2:2164 -9078:2:2169 -9079:2:2173 -9080:2:2174 -9081:2:2181 -9082:2:2182 -9083:2:2193 -9084:2:2194 -9085:2:2195 -9086:2:2193 -9087:2:2194 -9088:2:2195 -9089:2:2206 -9090:2:2211 -9091:2:2212 -9092:0:4365 -9093:2:2224 -9094:0:4365 -9095:3:2843 -9096:0:4365 -9097:2:2226 -9098:0:4365 -9099:3:2844 -9100:0:4365 -9101:2:1936 -9102:0:4365 -9103:2:2129 -9104:0:4365 -9105:2:2130 -9106:0:4365 -9107:2:2134 -9108:0:4365 -9109:3:2843 -9110:0:4365 -9111:2:2136 -9112:0:4365 -9113:3:2844 -9114:0:4365 -9115:2:2137 -9116:2:2141 -9117:2:2142 -9118:2:2150 -9119:2:2151 -9120:2:2155 -9121:2:2156 -9122:2:2150 -9123:2:2151 -9124:2:2152 -9125:2:2164 -9126:2:2169 -9127:2:2173 -9128:2:2174 -9129:2:2181 -9130:2:2182 -9131:2:2193 -9132:2:2194 -9133:2:2195 -9134:2:2193 -9135:2:2194 -9136:2:2195 -9137:2:2206 -9138:2:2211 -9139:2:2212 -9140:0:4365 -9141:2:2224 -9142:0:4365 -9143:3:2843 -9144:0:4365 -9145:2:2226 -9146:0:4365 -9147:3:2844 -9148:0:4365 -9149:2:2230 -9150:0:4365 -9151:3:2843 -9152:0:4365 -9153:2:2235 -9154:2:2239 -9155:2:2240 -9156:2:2248 -9157:2:2249 -9158:2:2253 -9159:2:2254 -9160:2:2248 -9161:2:2249 -9162:2:2250 -9163:2:2262 -9164:2:2267 -9165:2:2271 -9166:2:2272 -9167:2:2279 -9168:2:2280 -9169:2:2291 -9170:2:2292 -9171:2:2293 -9172:2:2291 -9173:2:2292 -9174:2:2293 -9175:2:2304 -9176:2:2309 -9177:2:2310 -9178:0:4365 -9179:3:2844 -9180:0:4365 -9181:2:2322 -9182:0:4365 -9183:2:1169 -9184:0:4365 -9185:3:2843 -9186:0:4365 -9187:2:1170 -9188:0:4365 -9189:3:2844 -9190:0:4365 -9191:3:2845 -9192:0:4365 -9193:3:2851 -9194:0:4365 -9195:3:2854 -9196:3:2855 -9197:3:2867 -9198:3:2868 -9199:3:2872 -9200:3:2873 -9201:3:2867 -9202:3:2868 -9203:3:2872 -9204:3:2873 -9205:3:2881 -9206:3:2886 -9207:3:2890 -9208:3:2891 -9209:3:2898 -9210:3:2899 -9211:3:2910 -9212:3:2911 -9213:3:2912 -9214:3:2910 -9215:3:2911 -9216:3:2912 -9217:3:2923 -9218:3:2928 -9219:3:2929 -9220:0:4365 -9221:3:2941 -9222:0:4365 -9223:3:2942 -9224:0:4365 -9225:2:1173 -9226:0:4365 -9227:3:2943 -9228:0:4365 -9229:2:1179 -9230:0:4365 -9231:2:1180 -9232:0:4365 -9233:3:2942 -9234:0:4365 -9235:2:1181 -9236:2:1185 -9237:2:1186 -9238:2:1194 -9239:2:1195 -9240:2:1199 -9241:2:1200 -9242:2:1194 -9243:2:1195 -9244:2:1199 -9245:2:1200 -9246:2:1208 -9247:2:1213 -9248:2:1217 -9249:2:1218 -9250:2:1225 -9251:2:1226 -9252:2:1237 -9253:2:1238 -9254:2:1239 -9255:2:1237 -9256:2:1238 -9257:2:1239 -9258:2:1250 -9259:2:1255 -9260:2:1256 -9261:0:4365 -9262:3:2943 -9263:0:4365 -9264:2:1268 -9265:0:4365 -9266:3:2942 -9267:0:4365 -9268:2:1270 -9269:0:4365 -9270:3:2943 -9271:0:4365 -9272:2:1271 -9273:2:1275 -9274:2:1276 -9275:2:1284 -9276:2:1285 -9277:2:1289 -9278:2:1290 -9279:2:1284 -9280:2:1285 -9281:2:1289 -9282:2:1290 -9283:2:1298 -9284:2:1303 -9285:2:1307 -9286:2:1308 -9287:2:1315 -9288:2:1316 -9289:2:1327 -9290:2:1328 -9291:2:1329 -9292:2:1327 -9293:2:1328 -9294:2:1329 -9295:2:1340 -9296:2:1345 -9297:2:1346 -9298:0:4365 -9299:2:1358 -9300:0:4365 -9301:2:1360 -9302:0:4365 -9303:3:2942 -9304:0:4365 -9305:2:1361 -9306:0:4365 -9307:3:2943 -9308:0:4365 -9309:2:1362 -9310:2:1366 -9311:2:1367 -9312:2:1375 -9313:2:1376 -9314:2:1380 -9315:2:1381 -9316:2:1375 -9317:2:1376 -9318:2:1380 -9319:2:1381 -9320:2:1389 -9321:2:1394 -9322:2:1398 -9323:2:1399 -9324:2:1406 -9325:2:1407 -9326:2:1418 -9327:2:1419 -9328:2:1420 -9329:2:1418 -9330:2:1419 -9331:2:1420 -9332:2:1431 -9333:2:1436 -9334:2:1437 -9335:0:4365 -9336:2:1449 -9337:0:4365 -9338:3:2942 -9339:0:4365 -9340:2:1451 -9341:0:4365 -9342:3:2943 -9343:0:4365 -9344:2:1652 -9345:0:4365 -9346:2:1653 -9347:0:4365 -9348:2:1657 -9349:0:4365 -9350:2:1180 -9351:0:4365 -9352:3:2942 -9353:0:4365 -9354:2:1181 -9355:2:1185 -9356:2:1186 -9357:2:1194 -9358:2:1195 -9359:2:1199 -9360:2:1200 -9361:2:1194 -9362:2:1195 -9363:2:1196 -9364:2:1208 -9365:2:1213 -9366:2:1217 -9367:2:1218 -9368:2:1225 -9369:2:1226 -9370:2:1237 -9371:2:1238 -9372:2:1239 -9373:2:1237 -9374:2:1238 -9375:2:1239 -9376:2:1250 -9377:2:1255 -9378:2:1256 -9379:0:4365 -9380:3:2943 -9381:0:4365 -9382:2:1268 -9383:0:4365 -9384:3:2942 -9385:0:4365 -9386:2:1270 -9387:0:4365 -9388:3:2943 -9389:0:4365 -9390:2:1271 -9391:2:1275 -9392:2:1276 -9393:2:1284 -9394:2:1285 -9395:2:1289 -9396:2:1290 -9397:2:1284 -9398:2:1285 -9399:2:1289 -9400:2:1290 -9401:2:1298 -9402:2:1303 -9403:2:1307 -9404:2:1308 -9405:2:1315 -9406:2:1316 -9407:2:1327 -9408:2:1328 -9409:2:1329 -9410:2:1327 -9411:2:1328 -9412:2:1329 -9413:2:1340 -9414:2:1345 -9415:2:1346 -9416:0:4365 -9417:2:1358 -9418:0:4365 -9419:2:1454 -9420:0:4365 -9421:3:2942 -9422:0:4365 -9423:2:1455 -9424:0:4365 -9425:3:2943 -9426:0:4365 -9427:2:1652 -9428:0:4365 -9429:2:1653 -9430:0:4365 -9431:2:1657 -9432:0:4365 -9433:2:1660 -9434:0:4365 -9435:3:2942 -9436:0:4365 -9437:2:1665 -9438:2:1669 -9439:2:1670 -9440:2:1678 -9441:2:1679 -9442:2:1683 -9443:2:1684 -9444:2:1678 -9445:2:1679 -9446:2:1680 -9447:2:1692 -9448:2:1697 -9449:2:1701 -9450:2:1702 -9451:2:1709 -9452:2:1710 -9453:2:1721 -9454:2:1722 -9455:2:1723 -9456:2:1721 -9457:2:1722 -9458:2:1723 -9459:2:1734 -9460:2:1739 -9461:2:1740 -9462:0:4365 -9463:3:2943 -9464:0:4365 -9465:2:1752 -9466:0:4365 -9467:3:2942 -9468:0:4365 -9469:2:1754 -9470:0:4365 -9471:3:2943 -9472:0:4365 -9473:2:1755 -9474:2:1759 -9475:2:1760 -9476:2:1768 -9477:2:1769 -9478:2:1773 -9479:2:1774 -9480:2:1768 -9481:2:1769 -9482:2:1773 -9483:2:1774 -9484:2:1782 -9485:2:1787 -9486:2:1791 -9487:2:1792 -9488:2:1799 -9489:2:1800 -9490:2:1811 -9491:2:1812 -9492:2:1813 -9493:2:1811 -9494:2:1812 -9495:2:1813 -9496:2:1824 -9497:2:1829 -9498:2:1830 -9499:0:4365 -9500:2:1842 -9501:0:4365 -9502:3:2942 -9503:0:4365 -9504:2:1844 -9505:0:4365 -9506:3:2943 -9507:0:4365 -9508:2:1845 -9509:2:1849 -9510:2:1850 -9511:2:1858 -9512:2:1859 -9513:2:1863 -9514:2:1864 -9515:2:1858 -9516:2:1859 -9517:2:1863 -9518:2:1864 -9519:2:1872 -9520:2:1877 -9521:2:1881 -9522:2:1882 -9523:2:1889 -9524:2:1890 -9525:2:1901 -9526:2:1902 -9527:2:1903 -9528:2:1901 -9529:2:1902 -9530:2:1903 -9531:2:1914 -9532:2:1919 -9533:2:1920 -9534:0:4365 -9535:2:1932 -9536:0:4365 -9537:3:2942 -9538:0:4365 -9539:2:1934 -9540:0:4365 -9541:3:2943 -9542:0:4365 -9543:2:1935 -9544:0:4365 -9545:2:1936 -9546:0:4365 -9547:2:2129 -9548:0:4365 -9549:2:2130 -9550:0:4365 -9551:2:2134 -9552:0:4365 -9553:3:2942 -9554:0:4365 -9555:2:2136 -9556:0:4365 -9557:3:2943 -9558:0:4365 -9559:2:2137 -9560:2:2141 -9561:2:2142 -9562:2:2150 -9563:2:2151 -9564:2:2155 -9565:2:2156 -9566:2:2150 -9567:2:2151 -9568:2:2155 -9569:2:2156 -9570:2:2164 -9571:2:2169 -9572:2:2173 -9573:2:2174 -9574:2:2181 -9575:2:2182 -9576:2:2193 -9577:2:2194 -9578:2:2195 -9579:2:2193 -9580:2:2194 -9581:2:2195 -9582:2:2206 -9583:2:2211 -9584:2:2212 -9585:0:4365 -9586:2:2224 -9587:0:4365 -9588:3:2942 -9589:0:4365 -9590:2:2226 -9591:0:4365 -9592:3:2943 -9593:0:4365 -9594:2:1936 -9595:0:4365 -9596:2:2129 -9597:0:4365 -9598:2:2130 -9599:0:4365 -9600:2:2134 -9601:0:4365 -9602:3:2942 -9603:0:4365 -9604:2:2136 -9605:0:4365 -9606:3:2943 -9607:0:4365 -9608:2:2137 -9609:2:2141 -9610:2:2142 -9611:2:2150 -9612:2:2151 -9613:2:2155 -9614:2:2156 -9615:2:2150 -9616:2:2151 -9617:2:2152 -9618:2:2164 -9619:2:2169 -9620:2:2173 -9621:2:2174 -9622:2:2181 -9623:2:2182 -9624:2:2193 -9625:2:2194 -9626:2:2195 -9627:2:2193 -9628:2:2194 -9629:2:2195 -9630:2:2206 -9631:2:2211 -9632:2:2212 -9633:0:4365 -9634:2:2224 -9635:0:4365 -9636:3:2942 -9637:0:4365 -9638:2:2226 -9639:0:4365 -9640:3:2943 -9641:0:4365 -9642:2:2230 -9643:0:4365 -9644:3:2942 -9645:0:4365 -9646:2:2235 -9647:2:2239 -9648:2:2240 -9649:2:2248 -9650:2:2249 -9651:2:2253 -9652:2:2254 -9653:2:2248 -9654:2:2249 -9655:2:2250 -9656:2:2262 -9657:2:2267 -9658:2:2271 -9659:2:2272 -9660:2:2279 -9661:2:2280 -9662:2:2291 -9663:2:2292 -9664:2:2293 -9665:2:2291 -9666:2:2292 -9667:2:2293 -9668:2:2304 -9669:2:2309 -9670:2:2310 -9671:0:4365 -9672:3:2943 -9673:0:4365 -9674:2:2322 -9675:0:4365 -9676:2:1169 -9677:0:4365 -9678:3:2942 -9679:0:4365 -9680:2:1170 -9681:0:4365 -9682:3:2943 -9683:0:4365 -9684:3:2944 -9685:0:4365 -9686:3:2950 -9687:0:4365 -9688:3:2951 -9689:0:4365 -9690:3:2952 -9691:0:4365 -9692:3:2953 -9693:0:4365 -9694:3:2954 -9695:3:2958 -9696:3:2959 -9697:3:2967 -9698:3:2968 -9699:3:2972 -9700:3:2973 -9701:3:2967 -9702:3:2968 -9703:3:2972 -9704:3:2973 -9705:3:2981 -9706:3:2986 -9707:3:2990 -9708:3:2991 -9709:3:2998 -9710:3:2999 -9711:3:3010 -9712:3:3011 -9713:3:3012 -9714:3:3010 -9715:3:3011 -9716:3:3012 -9717:3:3023 -9718:3:3028 -9719:3:3029 -9720:0:4365 -9721:3:3041 -9722:0:4365 -9723:3:3042 -9724:0:4365 -9725:2:1173 -9726:0:4365 -9727:3:3043 -9728:0:4365 -9729:2:1179 -9730:0:4365 -9731:2:1180 -9732:0:4365 -9733:3:3042 -9734:0:4365 -9735:2:1181 -9736:2:1185 -9737:2:1186 -9738:2:1194 -9739:2:1195 -9740:2:1199 -9741:2:1200 -9742:2:1194 -9743:2:1195 -9744:2:1199 -9745:2:1200 -9746:2:1208 -9747:2:1213 -9748:2:1217 -9749:2:1218 -9750:2:1225 -9751:2:1226 -9752:2:1237 -9753:2:1238 -9754:2:1239 -9755:2:1237 -9756:2:1238 -9757:2:1239 -9758:2:1250 -9759:2:1255 -9760:2:1256 -9761:0:4365 -9762:3:3043 -9763:0:4365 -9764:2:1268 -9765:0:4365 -9766:3:3042 -9767:0:4365 -9768:2:1270 -9769:0:4365 -9770:3:3043 -9771:0:4365 -9772:2:1271 -9773:2:1275 -9774:2:1276 -9775:2:1284 -9776:2:1285 -9777:2:1289 -9778:2:1290 -9779:2:1284 -9780:2:1285 -9781:2:1289 -9782:2:1290 -9783:2:1298 -9784:2:1303 -9785:2:1307 -9786:2:1308 -9787:2:1315 -9788:2:1316 -9789:2:1327 -9790:2:1328 -9791:2:1329 -9792:2:1327 -9793:2:1328 -9794:2:1329 -9795:2:1340 -9796:2:1345 -9797:2:1346 -9798:0:4365 -9799:2:1358 -9800:0:4365 -9801:2:1360 -9802:0:4365 -9803:3:3042 -9804:0:4365 -9805:2:1361 -9806:0:4365 -9807:3:3043 -9808:0:4365 -9809:2:1362 -9810:2:1366 -9811:2:1367 -9812:2:1375 -9813:2:1376 -9814:2:1380 -9815:2:1381 -9816:2:1375 -9817:2:1376 -9818:2:1380 -9819:2:1381 -9820:2:1389 -9821:2:1394 -9822:2:1398 -9823:2:1399 -9824:2:1406 -9825:2:1407 -9826:2:1418 -9827:2:1419 -9828:2:1420 -9829:2:1418 -9830:2:1419 -9831:2:1420 -9832:2:1431 -9833:2:1436 -9834:2:1437 -9835:0:4365 -9836:2:1449 -9837:0:4365 -9838:3:3042 -9839:0:4365 -9840:2:1451 -9841:0:4365 -9842:3:3043 -9843:0:4365 -9844:2:1652 -9845:0:4365 -9846:2:1653 -9847:0:4365 -9848:2:1657 -9849:0:4365 -9850:2:1180 -9851:0:4365 -9852:3:3042 -9853:0:4365 -9854:2:1181 -9855:2:1185 -9856:2:1186 -9857:2:1194 -9858:2:1195 -9859:2:1199 -9860:2:1200 -9861:2:1194 -9862:2:1195 -9863:2:1196 -9864:2:1208 -9865:2:1213 -9866:2:1217 -9867:2:1218 -9868:2:1225 -9869:2:1226 -9870:2:1237 -9871:2:1238 -9872:2:1239 -9873:2:1237 -9874:2:1238 -9875:2:1239 -9876:2:1250 -9877:2:1255 -9878:2:1256 -9879:0:4365 -9880:3:3043 -9881:0:4365 -9882:2:1268 -9883:0:4365 -9884:3:3042 -9885:0:4365 -9886:2:1270 -9887:0:4365 -9888:3:3043 -9889:0:4365 -9890:2:1271 -9891:2:1275 -9892:2:1276 -9893:2:1284 -9894:2:1285 -9895:2:1289 -9896:2:1290 -9897:2:1284 -9898:2:1285 -9899:2:1289 -9900:2:1290 -9901:2:1298 -9902:2:1303 -9903:2:1307 -9904:2:1308 -9905:2:1315 -9906:2:1316 -9907:2:1327 -9908:2:1328 -9909:2:1329 -9910:2:1327 -9911:2:1328 -9912:2:1329 -9913:2:1340 -9914:2:1345 -9915:2:1346 -9916:0:4365 -9917:2:1358 -9918:0:4365 -9919:2:1454 -9920:0:4365 -9921:3:3042 -9922:0:4365 -9923:2:1455 -9924:0:4365 -9925:3:3043 -9926:0:4365 -9927:2:1652 -9928:0:4365 -9929:2:1653 -9930:0:4365 -9931:2:1657 -9932:0:4365 -9933:2:1660 -9934:0:4365 -9935:3:3042 -9936:0:4365 -9937:2:1665 -9938:2:1669 -9939:2:1670 -9940:2:1678 -9941:2:1679 -9942:2:1683 -9943:2:1684 -9944:2:1678 -9945:2:1679 -9946:2:1680 -9947:2:1692 -9948:2:1697 -9949:2:1701 -9950:2:1702 -9951:2:1709 -9952:2:1710 -9953:2:1721 -9954:2:1722 -9955:2:1723 -9956:2:1721 -9957:2:1722 -9958:2:1723 -9959:2:1734 -9960:2:1739 -9961:2:1740 -9962:0:4365 -9963:3:3043 -9964:0:4365 -9965:2:1752 -9966:0:4365 -9967:3:3042 -9968:0:4365 -9969:2:1754 -9970:0:4365 -9971:3:3043 -9972:0:4365 -9973:2:1755 -9974:2:1759 -9975:2:1760 -9976:2:1768 -9977:2:1769 -9978:2:1773 -9979:2:1774 -9980:2:1768 -9981:2:1769 -9982:2:1773 -9983:2:1774 -9984:2:1782 -9985:2:1787 -9986:2:1791 -9987:2:1792 -9988:2:1799 -9989:2:1800 -9990:2:1811 -9991:2:1812 -9992:2:1813 -9993:2:1811 -9994:2:1812 -9995:2:1813 -9996:2:1824 -9997:2:1829 -9998:2:1830 -9999:0:4365 -10000:2:1842 -10001:0:4365 -10002:3:3042 -10003:0:4365 -10004:2:1844 -10005:0:4365 -10006:3:3043 -10007:0:4365 -10008:2:1845 -10009:2:1849 -10010:2:1850 -10011:2:1858 -10012:2:1859 -10013:2:1863 -10014:2:1864 -10015:2:1858 -10016:2:1859 -10017:2:1863 -10018:2:1864 -10019:2:1872 -10020:2:1877 -10021:2:1881 -10022:2:1882 -10023:2:1889 -10024:2:1890 -10025:2:1901 -10026:2:1902 -10027:2:1903 -10028:2:1901 -10029:2:1902 -10030:2:1903 -10031:2:1914 -10032:2:1919 -10033:2:1920 -10034:0:4365 -10035:2:1932 -10036:0:4365 -10037:3:3042 -10038:0:4365 -10039:2:1934 -10040:0:4365 -10041:3:3043 -10042:0:4365 -10043:2:1935 -10044:0:4365 -10045:2:1936 -10046:0:4365 -10047:2:2129 -10048:0:4365 -10049:2:2130 -10050:0:4365 -10051:2:2134 -10052:0:4365 -10053:3:3042 -10054:0:4365 -10055:2:2136 -10056:0:4365 -10057:3:3043 -10058:0:4365 -10059:2:2137 -10060:2:2141 -10061:2:2142 -10062:2:2150 -10063:2:2151 -10064:2:2155 -10065:2:2156 -10066:2:2150 -10067:2:2151 -10068:2:2155 -10069:2:2156 -10070:2:2164 -10071:2:2169 -10072:2:2173 -10073:2:2174 -10074:2:2181 -10075:2:2182 -10076:2:2193 -10077:2:2194 -10078:2:2195 -10079:2:2193 -10080:2:2194 -10081:2:2195 -10082:2:2206 -10083:2:2211 -10084:2:2212 -10085:0:4365 -10086:2:2224 -10087:0:4365 -10088:3:3042 -10089:0:4365 -10090:2:2226 -10091:0:4365 -10092:3:3043 -10093:0:4365 -10094:2:1936 -10095:0:4365 -10096:2:2129 -10097:0:4365 -10098:2:2130 -10099:0:4365 -10100:2:2134 -10101:0:4365 -10102:3:3042 -10103:0:4365 -10104:2:2136 -10105:0:4365 -10106:3:3043 -10107:0:4365 -10108:2:2137 -10109:2:2141 -10110:2:2142 -10111:2:2150 -10112:2:2151 -10113:2:2155 -10114:2:2156 -10115:2:2150 -10116:2:2151 -10117:2:2152 -10118:2:2164 -10119:2:2169 -10120:2:2173 -10121:2:2174 -10122:2:2181 -10123:2:2182 -10124:2:2193 -10125:2:2194 -10126:2:2195 -10127:2:2193 -10128:2:2194 -10129:2:2195 -10130:2:2206 -10131:2:2211 -10132:2:2212 -10133:0:4365 -10134:2:2224 -10135:0:4365 -10136:3:3042 -10137:0:4365 -10138:2:2226 -10139:0:4365 -10140:3:3043 -10141:0:4365 -10142:2:2230 -10143:0:4365 -10144:3:3042 -10145:0:4365 -10146:2:2235 -10147:2:2239 -10148:2:2240 -10149:2:2248 -10150:2:2249 -10151:2:2253 -10152:2:2254 -10153:2:2248 -10154:2:2249 -10155:2:2250 -10156:2:2262 -10157:2:2267 -10158:2:2271 -10159:2:2272 -10160:2:2279 -10161:2:2280 -10162:2:2291 -10163:2:2292 -10164:2:2293 -10165:2:2291 -10166:2:2292 -10167:2:2293 -10168:2:2304 -10169:2:2309 -10170:2:2310 -10171:0:4365 -10172:3:3043 -10173:0:4365 -10174:2:2322 -10175:0:4365 -10176:2:1169 -10177:0:4365 -10178:3:3042 -10179:0:4365 -10180:2:1170 -10181:0:4365 -10182:3:3043 -10183:0:4365 -10184:3:3044 -10185:0:4365 -10186:3:3257 -10187:0:4365 -10188:3:3265 -10189:0:4365 -10190:3:3266 -10191:3:3270 -10192:3:3271 -10193:3:3279 -10194:3:3280 -10195:3:3284 -10196:3:3285 -10197:3:3279 -10198:3:3280 -10199:3:3284 -10200:3:3285 -10201:3:3293 -10202:3:3298 -10203:3:3302 -10204:3:3303 -10205:3:3310 -10206:3:3311 -10207:3:3322 -10208:3:3323 -10209:3:3324 -10210:3:3322 -10211:3:3323 -10212:3:3324 -10213:3:3335 -10214:3:3340 -10215:3:3341 -10216:0:4365 -10217:3:3353 -10218:0:4365 -10219:3:3354 -10220:0:4365 -10221:2:1173 -10222:0:4365 -10223:3:3355 -10224:0:4365 -10225:2:1179 -10226:0:4365 -10227:2:1180 -10228:0:4365 -10229:3:3354 -10230:0:4365 -10231:2:1181 -10232:2:1185 -10233:2:1186 -10234:2:1194 -10235:2:1195 -10236:2:1199 -10237:2:1200 -10238:2:1194 -10239:2:1195 -10240:2:1199 -10241:2:1200 -10242:2:1208 -10243:2:1213 -10244:2:1217 -10245:2:1218 -10246:2:1225 -10247:2:1226 -10248:2:1237 -10249:2:1238 -10250:2:1239 -10251:2:1237 -10252:2:1238 -10253:2:1239 -10254:2:1250 -10255:2:1255 -10256:2:1256 -10257:0:4365 -10258:3:3355 -10259:0:4365 -10260:2:1268 -10261:0:4365 -10262:3:3354 -10263:0:4365 -10264:2:1270 -10265:0:4365 -10266:3:3355 -10267:0:4365 -10268:2:1271 -10269:2:1275 -10270:2:1276 -10271:2:1284 -10272:2:1285 -10273:2:1289 -10274:2:1290 -10275:2:1284 -10276:2:1285 -10277:2:1289 -10278:2:1290 -10279:2:1298 -10280:2:1303 -10281:2:1307 -10282:2:1308 -10283:2:1315 -10284:2:1316 -10285:2:1327 -10286:2:1328 -10287:2:1329 -10288:2:1327 -10289:2:1328 -10290:2:1329 -10291:2:1340 -10292:2:1345 -10293:2:1346 -10294:0:4365 -10295:2:1358 -10296:0:4365 -10297:2:1360 -10298:0:4365 -10299:3:3354 -10300:0:4365 -10301:2:1361 -10302:0:4365 -10303:3:3355 -10304:0:4365 -10305:2:1362 -10306:2:1366 -10307:2:1367 -10308:2:1375 -10309:2:1376 -10310:2:1380 -10311:2:1381 -10312:2:1375 -10313:2:1376 -10314:2:1380 -10315:2:1381 -10316:2:1389 -10317:2:1394 -10318:2:1398 -10319:2:1399 -10320:2:1406 -10321:2:1407 -10322:2:1418 -10323:2:1419 -10324:2:1420 -10325:2:1418 -10326:2:1419 -10327:2:1420 -10328:2:1431 -10329:2:1436 -10330:2:1437 -10331:0:4365 -10332:2:1449 -10333:0:4365 -10334:3:3354 -10335:0:4365 -10336:2:1451 -10337:0:4365 -10338:3:3355 -10339:0:4365 -10340:2:1652 -10341:0:4365 -10342:2:1653 -10343:0:4365 -10344:2:1657 -10345:0:4365 -10346:2:1180 -10347:0:4365 -10348:3:3354 -10349:0:4365 -10350:2:1181 -10351:2:1185 -10352:2:1186 -10353:2:1194 -10354:2:1195 -10355:2:1199 -10356:2:1200 -10357:2:1194 -10358:2:1195 -10359:2:1196 -10360:2:1208 -10361:2:1213 -10362:2:1217 -10363:2:1218 -10364:2:1225 -10365:2:1226 -10366:2:1237 -10367:2:1238 -10368:2:1239 -10369:2:1237 -10370:2:1238 -10371:2:1239 -10372:2:1250 -10373:2:1255 -10374:2:1256 -10375:0:4365 -10376:3:3355 -10377:0:4365 -10378:2:1268 -10379:0:4365 -10380:3:3354 -10381:0:4365 -10382:2:1270 -10383:0:4365 -10384:3:3355 -10385:0:4365 -10386:2:1271 -10387:2:1275 -10388:2:1276 -10389:2:1284 -10390:2:1285 -10391:2:1289 -10392:2:1290 -10393:2:1284 -10394:2:1285 -10395:2:1289 -10396:2:1290 -10397:2:1298 -10398:2:1303 -10399:2:1307 -10400:2:1308 -10401:2:1315 -10402:2:1316 -10403:2:1327 -10404:2:1328 -10405:2:1329 -10406:2:1327 -10407:2:1328 -10408:2:1329 -10409:2:1340 -10410:2:1345 -10411:2:1346 -10412:0:4365 -10413:2:1358 -10414:0:4365 -10415:2:1454 -10416:0:4365 -10417:3:3354 -10418:0:4365 -10419:2:1455 -10420:0:4365 -10421:3:3355 -10422:0:4365 -10423:2:1652 -10424:0:4365 -10425:2:1653 -10426:0:4365 -10427:2:1657 -10428:0:4365 -10429:2:1660 -10430:0:4365 -10431:3:3354 -10432:0:4365 -10433:2:1665 -10434:2:1669 -10435:2:1670 -10436:2:1678 -10437:2:1679 -10438:2:1683 -10439:2:1684 -10440:2:1678 -10441:2:1679 -10442:2:1680 -10443:2:1692 -10444:2:1697 -10445:2:1701 -10446:2:1702 -10447:2:1709 -10448:2:1710 -10449:2:1721 -10450:2:1722 -10451:2:1723 -10452:2:1721 -10453:2:1722 -10454:2:1723 -10455:2:1734 -10456:2:1739 -10457:2:1740 -10458:0:4365 -10459:3:3355 -10460:0:4365 -10461:2:1752 -10462:0:4365 -10463:3:3354 -10464:0:4365 -10465:2:1754 -10466:0:4365 -10467:3:3355 -10468:0:4365 -10469:2:1755 -10470:2:1759 -10471:2:1760 -10472:2:1768 -10473:2:1769 -10474:2:1773 -10475:2:1774 -10476:2:1768 -10477:2:1769 -10478:2:1773 -10479:2:1774 -10480:2:1782 -10481:2:1787 -10482:2:1791 -10483:2:1792 -10484:2:1799 -10485:2:1800 -10486:2:1811 -10487:2:1812 -10488:2:1813 -10489:2:1811 -10490:2:1812 -10491:2:1813 -10492:2:1824 -10493:2:1829 -10494:2:1830 -10495:0:4365 -10496:2:1842 -10497:0:4365 -10498:3:3354 -10499:0:4365 -10500:2:1844 -10501:0:4365 -10502:3:3355 -10503:0:4365 -10504:2:1845 -10505:2:1849 -10506:2:1850 -10507:2:1858 -10508:2:1859 -10509:2:1863 -10510:2:1864 -10511:2:1858 -10512:2:1859 -10513:2:1863 -10514:2:1864 -10515:2:1872 -10516:2:1877 -10517:2:1881 -10518:2:1882 -10519:2:1889 -10520:2:1890 -10521:2:1901 -10522:2:1902 -10523:2:1903 -10524:2:1901 -10525:2:1902 -10526:2:1903 -10527:2:1914 -10528:2:1919 -10529:2:1920 -10530:0:4365 -10531:2:1932 -10532:0:4365 -10533:3:3354 -10534:0:4365 -10535:2:1934 -10536:0:4365 -10537:3:3355 -10538:0:4365 -10539:2:1935 -10540:0:4365 -10541:2:1936 -10542:0:4365 -10543:2:2129 -10544:0:4365 -10545:2:2130 -10546:0:4365 -10547:2:2134 -10548:0:4365 -10549:3:3354 -10550:0:4365 -10551:2:2136 -10552:0:4365 -10553:3:3355 -10554:0:4365 -10555:2:2137 -10556:2:2141 -10557:2:2142 -10558:2:2150 -10559:2:2151 -10560:2:2155 -10561:2:2156 -10562:2:2150 -10563:2:2151 -10564:2:2155 -10565:2:2156 -10566:2:2164 -10567:2:2169 -10568:2:2173 -10569:2:2174 -10570:2:2181 -10571:2:2182 -10572:2:2193 -10573:2:2194 -10574:2:2195 -10575:2:2193 -10576:2:2194 -10577:2:2195 -10578:2:2206 -10579:2:2211 -10580:2:2212 -10581:0:4365 -10582:2:2224 -10583:0:4365 -10584:3:3354 -10585:0:4365 -10586:2:2226 -10587:0:4365 -10588:3:3355 -10589:0:4365 -10590:2:1936 -10591:0:4365 -10592:2:2129 -10593:0:4365 -10594:2:2130 -10595:0:4365 -10596:2:2134 -10597:0:4365 -10598:3:3354 -10599:0:4365 -10600:2:2136 -10601:0:4365 -10602:3:3355 -10603:0:4365 -10604:2:2137 -10605:2:2141 -10606:2:2142 -10607:2:2150 -10608:2:2151 -10609:2:2155 -10610:2:2156 -10611:2:2150 -10612:2:2151 -10613:2:2152 -10614:2:2164 -10615:2:2169 -10616:2:2173 -10617:2:2174 -10618:2:2181 -10619:2:2182 -10620:2:2193 -10621:2:2194 -10622:2:2195 -10623:2:2193 -10624:2:2194 -10625:2:2195 -10626:2:2206 -10627:2:2211 -10628:2:2212 -10629:0:4365 -10630:2:2224 -10631:0:4365 -10632:3:3354 -10633:0:4365 -10634:2:2226 -10635:0:4365 -10636:3:3355 -10637:0:4365 -10638:2:2230 -10639:0:4365 -10640:3:3354 -10641:0:4365 -10642:2:2235 -10643:2:2239 -10644:2:2240 -10645:2:2248 -10646:2:2249 -10647:2:2253 -10648:2:2254 -10649:2:2248 -10650:2:2249 -10651:2:2250 -10652:2:2262 -10653:2:2267 -10654:2:2271 -10655:2:2272 -10656:2:2279 -10657:2:2280 -10658:2:2291 -10659:2:2292 -10660:2:2293 -10661:2:2291 -10662:2:2292 -10663:2:2293 -10664:2:2304 -10665:2:2309 -10666:2:2310 -10667:0:4365 -10668:3:3355 -10669:0:4365 -10670:2:2322 -10671:0:4365 -10672:2:1169 -10673:0:4365 -10674:3:3354 -10675:0:4365 -10676:2:1170 -10677:0:4365 -10678:3:3355 -10679:0:4365 -10680:3:3356 -10681:0:4365 -10682:3:3366 -10683:0:4365 -10684:3:2951 -10685:0:4365 -10686:3:2952 -10687:0:4365 -10688:3:2953 -10689:0:4365 -10690:3:2954 -10691:3:2958 -10692:3:2959 -10693:3:2967 -10694:3:2968 -10695:3:2972 -10696:3:2973 -10697:3:2967 -10698:3:2968 -10699:3:2972 -10700:3:2973 -10701:3:2981 -10702:3:2986 -10703:3:2990 -10704:3:2991 -10705:3:2998 -10706:3:2999 -10707:3:3010 -10708:3:3011 -10709:3:3012 -10710:3:3010 -10711:3:3011 -10712:3:3012 -10713:3:3023 -10714:3:3028 -10715:3:3029 -10716:0:4365 -10717:3:3041 -10718:0:4365 -10719:3:3042 -10720:0:4365 -10721:2:1173 -10722:0:4365 -10723:3:3043 -10724:0:4365 -10725:2:1179 -10726:0:4365 -10727:2:1180 -10728:0:4365 -10729:3:3042 -10730:0:4365 -10731:2:1181 -10732:2:1185 -10733:2:1186 -10734:2:1194 -10735:2:1195 -10736:2:1199 -10737:2:1200 -10738:2:1194 -10739:2:1195 -10740:2:1199 -10741:2:1200 -10742:2:1208 -10743:2:1213 -10744:2:1217 -10745:2:1218 -10746:2:1225 -10747:2:1226 -10748:2:1237 -10749:2:1238 -10750:2:1239 -10751:2:1237 -10752:2:1238 -10753:2:1239 -10754:2:1250 -10755:2:1255 -10756:2:1256 -10757:0:4365 -10758:3:3043 -10759:0:4365 -10760:2:1268 -10761:0:4365 -10762:3:3042 -10763:0:4365 -10764:2:1270 -10765:0:4365 -10766:3:3043 -10767:0:4365 -10768:2:1271 -10769:2:1275 -10770:2:1276 -10771:2:1284 -10772:2:1285 -10773:2:1289 -10774:2:1290 -10775:2:1284 -10776:2:1285 -10777:2:1289 -10778:2:1290 -10779:2:1298 -10780:2:1303 -10781:2:1307 -10782:2:1308 -10783:2:1315 -10784:2:1316 -10785:2:1327 -10786:2:1328 -10787:2:1329 -10788:2:1327 -10789:2:1328 -10790:2:1329 -10791:2:1340 -10792:2:1345 -10793:2:1346 -10794:0:4365 -10795:2:1358 -10796:0:4365 -10797:2:1360 -10798:0:4365 -10799:3:3042 -10800:0:4365 -10801:2:1361 -10802:0:4365 -10803:3:3043 -10804:0:4365 -10805:2:1362 -10806:2:1366 -10807:2:1367 -10808:2:1375 -10809:2:1376 -10810:2:1380 -10811:2:1381 -10812:2:1375 -10813:2:1376 -10814:2:1380 -10815:2:1381 -10816:2:1389 -10817:2:1394 -10818:2:1398 -10819:2:1399 -10820:2:1406 -10821:2:1407 -10822:2:1418 -10823:2:1419 -10824:2:1420 -10825:2:1418 -10826:2:1419 -10827:2:1420 -10828:2:1431 -10829:2:1436 -10830:2:1437 -10831:0:4365 -10832:2:1449 -10833:0:4365 -10834:3:3042 -10835:0:4365 -10836:2:1451 -10837:0:4365 -10838:3:3043 -10839:0:4365 -10840:2:1652 -10841:0:4365 -10842:2:1653 -10843:0:4365 -10844:2:1657 -10845:0:4365 -10846:2:1180 -10847:0:4365 -10848:3:3042 -10849:0:4365 -10850:2:1181 -10851:2:1185 -10852:2:1186 -10853:2:1194 -10854:2:1195 -10855:2:1199 -10856:2:1200 -10857:2:1194 -10858:2:1195 -10859:2:1196 -10860:2:1208 -10861:2:1213 -10862:2:1217 -10863:2:1218 -10864:2:1225 -10865:2:1226 -10866:2:1237 -10867:2:1238 -10868:2:1239 -10869:2:1237 -10870:2:1238 -10871:2:1239 -10872:2:1250 -10873:2:1255 -10874:2:1256 -10875:0:4365 -10876:3:3043 -10877:0:4365 -10878:2:1268 -10879:0:4365 -10880:3:3042 -10881:0:4365 -10882:2:1270 -10883:0:4365 -10884:3:3043 -10885:0:4365 -10886:2:1271 -10887:2:1275 -10888:2:1276 -10889:2:1284 -10890:2:1285 -10891:2:1289 -10892:2:1290 -10893:2:1284 -10894:2:1285 -10895:2:1289 -10896:2:1290 -10897:2:1298 -10898:2:1303 -10899:2:1307 -10900:2:1308 -10901:2:1315 -10902:2:1316 -10903:2:1327 -10904:2:1328 -10905:2:1329 -10906:2:1327 -10907:2:1328 -10908:2:1329 -10909:2:1340 -10910:2:1345 -10911:2:1346 -10912:0:4365 -10913:2:1358 -10914:0:4365 -10915:2:1454 -10916:0:4365 -10917:3:3042 -10918:0:4365 -10919:2:1455 -10920:0:4365 -10921:3:3043 -10922:0:4365 -10923:2:1652 -10924:0:4365 -10925:2:1653 -10926:0:4365 -10927:2:1657 -10928:0:4365 -10929:2:1660 -10930:0:4365 -10931:3:3042 -10932:0:4365 -10933:2:1665 -10934:2:1669 -10935:2:1670 -10936:2:1678 -10937:2:1679 -10938:2:1683 -10939:2:1684 -10940:2:1678 -10941:2:1679 -10942:2:1680 -10943:2:1692 -10944:2:1697 -10945:2:1701 -10946:2:1702 -10947:2:1709 -10948:2:1710 -10949:2:1721 -10950:2:1722 -10951:2:1723 -10952:2:1721 -10953:2:1722 -10954:2:1723 -10955:2:1734 -10956:2:1739 -10957:2:1740 -10958:0:4365 -10959:3:3043 -10960:0:4365 -10961:2:1752 -10962:0:4365 -10963:3:3042 -10964:0:4365 -10965:2:1754 -10966:0:4365 -10967:3:3043 -10968:0:4365 -10969:2:1755 -10970:2:1759 -10971:2:1760 -10972:2:1768 -10973:2:1769 -10974:2:1773 -10975:2:1774 -10976:2:1768 -10977:2:1769 -10978:2:1773 -10979:2:1774 -10980:2:1782 -10981:2:1787 -10982:2:1791 -10983:2:1792 -10984:2:1799 -10985:2:1800 -10986:2:1811 -10987:2:1812 -10988:2:1813 -10989:2:1811 -10990:2:1812 -10991:2:1813 -10992:2:1824 -10993:2:1829 -10994:2:1830 -10995:0:4365 -10996:2:1842 -10997:0:4365 -10998:3:3042 -10999:0:4365 -11000:2:1844 -11001:0:4365 -11002:3:3043 -11003:0:4365 -11004:2:1845 -11005:2:1849 -11006:2:1850 -11007:2:1858 -11008:2:1859 -11009:2:1863 -11010:2:1864 -11011:2:1858 -11012:2:1859 -11013:2:1863 -11014:2:1864 -11015:2:1872 -11016:2:1877 -11017:2:1881 -11018:2:1882 -11019:2:1889 -11020:2:1890 -11021:2:1901 -11022:2:1902 -11023:2:1903 -11024:2:1901 -11025:2:1902 -11026:2:1903 -11027:2:1914 -11028:2:1919 -11029:2:1920 -11030:0:4365 -11031:2:1932 -11032:0:4365 -11033:3:3042 -11034:0:4365 -11035:2:1934 -11036:0:4365 -11037:3:3043 -11038:0:4365 -11039:2:1935 -11040:0:4365 -11041:2:1936 -11042:0:4365 -11043:2:2129 -11044:0:4365 -11045:2:2130 -11046:0:4365 -11047:2:2134 -11048:0:4365 -11049:3:3042 -11050:0:4365 -11051:2:2136 -11052:0:4365 -11053:3:3043 -11054:0:4365 -11055:2:2137 -11056:2:2141 -11057:2:2142 -11058:2:2150 -11059:2:2151 -11060:2:2155 -11061:2:2156 -11062:2:2150 -11063:2:2151 -11064:2:2155 -11065:2:2156 -11066:2:2164 -11067:2:2169 -11068:2:2173 -11069:2:2174 -11070:2:2181 -11071:2:2182 -11072:2:2193 -11073:2:2194 -11074:2:2195 -11075:2:2193 -11076:2:2194 -11077:2:2195 -11078:2:2206 -11079:2:2211 -11080:2:2212 -11081:0:4365 -11082:2:2224 -11083:0:4365 -11084:3:3042 -11085:0:4365 -11086:2:2226 -11087:0:4365 -11088:3:3043 -11089:0:4365 -11090:2:1936 -11091:0:4365 -11092:2:2129 -11093:0:4365 -11094:2:2130 -11095:0:4365 -11096:2:2134 -11097:0:4365 -11098:3:3042 -11099:0:4365 -11100:2:2136 -11101:0:4365 -11102:3:3043 -11103:0:4365 -11104:2:2137 -11105:2:2141 -11106:2:2142 -11107:2:2150 -11108:2:2151 -11109:2:2155 -11110:2:2156 -11111:2:2150 -11112:2:2151 -11113:2:2152 -11114:2:2164 -11115:2:2169 -11116:2:2173 -11117:2:2174 -11118:2:2181 -11119:2:2182 -11120:2:2193 -11121:2:2194 -11122:2:2195 -11123:2:2193 -11124:2:2194 -11125:2:2195 -11126:2:2206 -11127:2:2211 -11128:2:2212 -11129:0:4365 -11130:2:2224 -11131:0:4365 -11132:3:3042 -11133:0:4365 -11134:2:2226 -11135:0:4365 -11136:3:3043 -11137:0:4365 -11138:2:2230 -11139:0:4365 -11140:3:3042 -11141:0:4365 -11142:2:2235 -11143:2:2239 -11144:2:2240 -11145:2:2248 -11146:2:2249 -11147:2:2253 -11148:2:2254 -11149:2:2248 -11150:2:2249 -11151:2:2250 -11152:2:2262 -11153:2:2267 -11154:2:2271 -11155:2:2272 -11156:2:2279 -11157:2:2280 -11158:2:2291 -11159:2:2292 -11160:2:2293 -11161:2:2291 -11162:2:2292 -11163:2:2293 -11164:2:2304 -11165:2:2309 -11166:2:2310 -11167:0:4365 -11168:3:3043 -11169:0:4365 -11170:2:2322 -11171:0:4365 -11172:2:1169 -11173:0:4365 -11174:3:3042 -11175:0:4365 -11176:2:1170 -11177:0:4365 -11178:3:3043 -11179:0:4365 -11180:3:3044 -11181:0:4365 -11182:3:3257 -11183:0:4365 -11184:3:3362 -11185:0:4365 -11186:3:3363 -11187:0:4365 -11188:3:3367 -11189:0:4365 -11190:3:3373 -11191:3:3377 -11192:3:3378 -11193:3:3386 -11194:3:3387 -11195:3:3391 -11196:3:3392 -11197:3:3386 -11198:3:3387 -11199:3:3391 -11200:3:3392 -11201:3:3400 -11202:3:3405 -11203:3:3409 -11204:3:3410 -11205:3:3417 -11206:3:3418 -11207:3:3429 -11208:3:3430 -11209:3:3431 -11210:3:3429 -11211:3:3430 -11212:3:3431 -11213:3:3442 -11214:3:3447 -11215:3:3448 -11216:0:4365 -11217:3:3460 -11218:0:4365 -11219:3:3461 -11220:0:4365 -11221:2:1173 -11222:0:4365 -11223:3:3462 -11224:0:4365 -11225:2:1179 -11226:0:4365 -11227:2:1180 -11228:0:4365 -11229:3:3461 -11230:0:4365 -11231:2:1181 -11232:2:1185 -11233:2:1186 -11234:2:1194 -11235:2:1195 -11236:2:1199 -11237:2:1200 -11238:2:1194 -11239:2:1195 -11240:2:1199 -11241:2:1200 -11242:2:1208 -11243:2:1213 -11244:2:1217 -11245:2:1218 -11246:2:1225 -11247:2:1226 -11248:2:1237 -11249:2:1238 -11250:2:1239 -11251:2:1237 -11252:2:1238 -11253:2:1239 -11254:2:1250 -11255:2:1255 -11256:2:1256 -11257:0:4365 -11258:3:3462 -11259:0:4365 -11260:2:1268 -11261:0:4365 -11262:3:3461 -11263:0:4365 -11264:2:1270 -11265:0:4365 -11266:3:3462 -11267:0:4365 -11268:2:1271 -11269:2:1275 -11270:2:1276 -11271:2:1284 -11272:2:1285 -11273:2:1289 -11274:2:1290 -11275:2:1284 -11276:2:1285 -11277:2:1289 -11278:2:1290 -11279:2:1298 -11280:2:1303 -11281:2:1307 -11282:2:1308 -11283:2:1315 -11284:2:1316 -11285:2:1327 -11286:2:1328 -11287:2:1329 -11288:2:1327 -11289:2:1328 -11290:2:1329 -11291:2:1340 -11292:2:1345 -11293:2:1346 -11294:0:4365 -11295:2:1358 -11296:0:4365 -11297:2:1360 -11298:0:4365 -11299:3:3461 -11300:0:4365 -11301:2:1361 -11302:0:4365 -11303:3:3462 -11304:0:4365 -11305:2:1362 -11306:2:1366 -11307:2:1367 -11308:2:1375 -11309:2:1376 -11310:2:1380 -11311:2:1381 -11312:2:1375 -11313:2:1376 -11314:2:1380 -11315:2:1381 -11316:2:1389 -11317:2:1394 -11318:2:1398 -11319:2:1399 -11320:2:1406 -11321:2:1407 -11322:2:1418 -11323:2:1419 -11324:2:1420 -11325:2:1418 -11326:2:1419 -11327:2:1420 -11328:2:1431 -11329:2:1436 -11330:2:1437 -11331:0:4365 -11332:2:1449 -11333:0:4365 -11334:3:3461 -11335:0:4365 -11336:2:1451 -11337:0:4365 -11338:3:3462 -11339:0:4365 -11340:2:1652 -11341:0:4365 -11342:2:1653 -11343:0:4365 -11344:2:1657 -11345:0:4365 -11346:2:1180 -11347:0:4365 -11348:3:3461 -11349:0:4365 -11350:2:1181 -11351:2:1185 -11352:2:1186 -11353:2:1194 -11354:2:1195 -11355:2:1199 -11356:2:1200 -11357:2:1194 -11358:2:1195 -11359:2:1196 -11360:2:1208 -11361:2:1213 -11362:2:1217 -11363:2:1218 -11364:2:1225 -11365:2:1226 -11366:2:1237 -11367:2:1238 -11368:2:1239 -11369:2:1237 -11370:2:1238 -11371:2:1239 -11372:2:1250 -11373:2:1255 -11374:2:1256 -11375:0:4365 -11376:3:3462 -11377:0:4365 -11378:2:1268 -11379:0:4365 -11380:3:3461 -11381:0:4365 -11382:2:1270 -11383:0:4365 -11384:3:3462 -11385:0:4365 -11386:2:1271 -11387:2:1275 -11388:2:1276 -11389:2:1284 -11390:2:1285 -11391:2:1289 -11392:2:1290 -11393:2:1284 -11394:2:1285 -11395:2:1289 -11396:2:1290 -11397:2:1298 -11398:2:1303 -11399:2:1307 -11400:2:1308 -11401:2:1315 -11402:2:1316 -11403:2:1327 -11404:2:1328 -11405:2:1329 -11406:2:1327 -11407:2:1328 -11408:2:1329 -11409:2:1340 -11410:2:1345 -11411:2:1346 -11412:0:4365 -11413:2:1358 -11414:0:4365 -11415:2:1454 -11416:0:4365 -11417:3:3461 -11418:0:4365 -11419:2:1455 -11420:0:4365 -11421:3:3462 -11422:0:4365 -11423:2:1652 -11424:0:4365 -11425:2:1653 -11426:0:4365 -11427:2:1657 -11428:0:4365 -11429:2:1660 -11430:0:4365 -11431:3:3461 -11432:0:4365 -11433:2:1665 -11434:2:1669 -11435:2:1670 -11436:2:1678 -11437:2:1679 -11438:2:1683 -11439:2:1684 -11440:2:1678 -11441:2:1679 -11442:2:1680 -11443:2:1692 -11444:2:1697 -11445:2:1701 -11446:2:1702 -11447:2:1709 -11448:2:1710 -11449:2:1721 -11450:2:1722 -11451:2:1723 -11452:2:1721 -11453:2:1722 -11454:2:1723 -11455:2:1734 -11456:2:1739 -11457:2:1740 -11458:0:4365 -11459:3:3462 -11460:0:4365 -11461:2:1752 -11462:0:4365 -11463:3:3461 -11464:0:4365 -11465:2:1754 -11466:0:4365 -11467:3:3462 -11468:0:4365 -11469:2:1755 -11470:2:1759 -11471:2:1760 -11472:2:1768 -11473:2:1769 -11474:2:1773 -11475:2:1774 -11476:2:1768 -11477:2:1769 -11478:2:1773 -11479:2:1774 -11480:2:1782 -11481:2:1787 -11482:2:1791 -11483:2:1792 -11484:2:1799 -11485:2:1800 -11486:2:1811 -11487:2:1812 -11488:2:1813 -11489:2:1811 -11490:2:1812 -11491:2:1813 -11492:2:1824 -11493:2:1829 -11494:2:1830 -11495:0:4365 -11496:2:1842 -11497:0:4365 -11498:3:3461 -11499:0:4365 -11500:2:1844 -11501:0:4365 -11502:3:3462 -11503:0:4365 -11504:2:1845 -11505:2:1849 -11506:2:1850 -11507:2:1858 -11508:2:1859 -11509:2:1863 -11510:2:1864 -11511:2:1858 -11512:2:1859 -11513:2:1863 -11514:2:1864 -11515:2:1872 -11516:2:1877 -11517:2:1881 -11518:2:1882 -11519:2:1889 -11520:2:1890 -11521:2:1901 -11522:2:1902 -11523:2:1903 -11524:2:1901 -11525:2:1902 -11526:2:1903 -11527:2:1914 -11528:2:1919 -11529:2:1920 -11530:0:4365 -11531:2:1932 -11532:0:4365 -11533:3:3461 -11534:0:4365 -11535:2:1934 -11536:0:4365 -11537:3:3462 -11538:0:4365 -11539:2:1935 -11540:0:4365 -11541:2:1936 -11542:0:4365 -11543:2:2129 -11544:0:4365 -11545:2:2130 -11546:0:4365 -11547:2:2134 -11548:0:4365 -11549:3:3461 -11550:0:4365 -11551:2:2136 -11552:0:4365 -11553:3:3462 -11554:0:4365 -11555:2:2137 -11556:2:2141 -11557:2:2142 -11558:2:2150 -11559:2:2151 -11560:2:2155 -11561:2:2156 -11562:2:2150 -11563:2:2151 -11564:2:2155 -11565:2:2156 -11566:2:2164 -11567:2:2169 -11568:2:2173 -11569:2:2174 -11570:2:2181 -11571:2:2182 -11572:2:2193 -11573:2:2194 -11574:2:2195 -11575:2:2193 -11576:2:2194 -11577:2:2195 -11578:2:2206 -11579:2:2211 -11580:2:2212 -11581:0:4365 -11582:2:2224 -11583:0:4365 -11584:3:3461 -11585:0:4365 -11586:2:2226 -11587:0:4365 -11588:3:3462 -11589:0:4365 -11590:2:1936 -11591:0:4365 -11592:2:2129 -11593:0:4365 -11594:2:2130 -11595:0:4365 -11596:2:2134 -11597:0:4365 -11598:3:3461 -11599:0:4365 -11600:2:2136 -11601:0:4365 -11602:3:3462 -11603:0:4365 -11604:2:2137 -11605:2:2141 -11606:2:2142 -11607:2:2150 -11608:2:2151 -11609:2:2155 -11610:2:2156 -11611:2:2150 -11612:2:2151 -11613:2:2152 -11614:2:2164 -11615:2:2169 -11616:2:2173 -11617:2:2174 -11618:2:2181 -11619:2:2182 -11620:2:2193 -11621:2:2194 -11622:2:2195 -11623:2:2193 -11624:2:2194 -11625:2:2195 -11626:2:2206 -11627:2:2211 -11628:2:2212 -11629:0:4365 -11630:2:2224 -11631:0:4365 -11632:3:3461 -11633:0:4365 -11634:2:2226 -11635:0:4365 -11636:3:3462 -11637:0:4365 -11638:2:2230 -11639:0:4365 -11640:3:3461 -11641:0:4365 -11642:2:2235 -11643:2:2239 -11644:2:2240 -11645:2:2248 -11646:2:2249 -11647:2:2253 -11648:2:2254 -11649:2:2248 -11650:2:2249 -11651:2:2250 -11652:2:2262 -11653:2:2267 -11654:2:2271 -11655:2:2272 -11656:2:2279 -11657:2:2280 -11658:2:2291 -11659:2:2292 -11660:2:2293 -11661:2:2291 -11662:2:2292 -11663:2:2293 -11664:2:2304 -11665:2:2309 -11666:2:2310 -11667:0:4365 -11668:3:3462 -11669:0:4365 -11670:2:2322 -11671:0:4365 -11672:2:1169 -11673:0:4365 -11674:3:3461 -11675:0:4365 -11676:2:1170 -11677:0:4365 -11678:3:3462 -11679:0:4365 -11680:3:3463 -11681:0:4365 -11682:3:3469 -11683:0:4365 -11684:3:3470 -11685:3:3474 -11686:3:3475 -11687:3:3483 -11688:3:3484 -11689:3:3488 -11690:3:3489 -11691:3:3483 -11692:3:3484 -11693:3:3488 -11694:3:3489 -11695:3:3497 -11696:3:3502 -11697:3:3506 -11698:3:3507 -11699:3:3514 -11700:3:3515 -11701:3:3526 -11702:3:3527 -11703:3:3528 -11704:3:3526 -11705:3:3527 -11706:3:3528 -11707:3:3539 -11708:3:3544 -11709:3:3545 -11710:0:4365 -11711:3:3557 -11712:0:4365 -11713:3:3558 -11714:0:4365 -11715:2:1173 -11716:0:4365 -11717:3:3559 -11718:0:4365 -11719:2:1179 -11720:0:4365 -11721:2:1180 -11722:0:4365 -11723:3:3558 -11724:0:4365 -11725:2:1181 -11726:2:1185 -11727:2:1186 -11728:2:1194 -11729:2:1195 -11730:2:1199 -11731:2:1200 -11732:2:1194 -11733:2:1195 -11734:2:1199 -11735:2:1200 -11736:2:1208 -11737:2:1213 -11738:2:1217 -11739:2:1218 -11740:2:1225 -11741:2:1226 -11742:2:1237 -11743:2:1238 -11744:2:1239 -11745:2:1237 -11746:2:1238 -11747:2:1239 -11748:2:1250 -11749:2:1255 -11750:2:1256 -11751:0:4365 -11752:3:3559 -11753:0:4365 -11754:2:1268 -11755:0:4365 -11756:3:3558 -11757:0:4365 -11758:2:1270 -11759:0:4365 -11760:3:3559 -11761:0:4365 -11762:2:1271 -11763:2:1275 -11764:2:1276 -11765:2:1284 -11766:2:1285 -11767:2:1289 -11768:2:1290 -11769:2:1284 -11770:2:1285 -11771:2:1289 -11772:2:1290 -11773:2:1298 -11774:2:1303 -11775:2:1307 -11776:2:1308 -11777:2:1315 -11778:2:1316 -11779:2:1327 -11780:2:1328 -11781:2:1329 -11782:2:1327 -11783:2:1328 -11784:2:1329 -11785:2:1340 -11786:2:1345 -11787:2:1346 -11788:0:4365 -11789:2:1358 -11790:0:4365 -11791:2:1360 -11792:0:4365 -11793:3:3558 -11794:0:4365 -11795:2:1361 -11796:0:4365 -11797:3:3559 -11798:0:4365 -11799:2:1362 -11800:2:1366 -11801:2:1367 -11802:2:1375 -11803:2:1376 -11804:2:1380 -11805:2:1381 -11806:2:1375 -11807:2:1376 -11808:2:1380 -11809:2:1381 -11810:2:1389 -11811:2:1394 -11812:2:1398 -11813:2:1399 -11814:2:1406 -11815:2:1407 -11816:2:1418 -11817:2:1419 -11818:2:1420 -11819:2:1418 -11820:2:1419 -11821:2:1420 -11822:2:1431 -11823:2:1436 -11824:2:1437 -11825:0:4365 -11826:2:1449 -11827:0:4365 -11828:3:3558 -11829:0:4365 -11830:2:1451 -11831:0:4365 -11832:3:3559 -11833:0:4365 -11834:2:1652 -11835:0:4365 -11836:2:1653 -11837:0:4365 -11838:2:1657 -11839:0:4365 -11840:2:1180 -11841:0:4365 -11842:3:3558 -11843:0:4365 -11844:2:1181 -11845:2:1185 -11846:2:1186 -11847:2:1194 -11848:2:1195 -11849:2:1199 -11850:2:1200 -11851:2:1194 -11852:2:1195 -11853:2:1196 -11854:2:1208 -11855:2:1213 -11856:2:1217 -11857:2:1218 -11858:2:1225 -11859:2:1226 -11860:2:1237 -11861:2:1238 -11862:2:1239 -11863:2:1237 -11864:2:1238 -11865:2:1239 -11866:2:1250 -11867:2:1255 -11868:2:1256 -11869:0:4365 -11870:3:3559 -11871:0:4365 -11872:2:1268 -11873:0:4365 -11874:3:3558 -11875:0:4365 -11876:2:1270 -11877:0:4365 -11878:3:3559 -11879:0:4365 -11880:2:1271 -11881:2:1275 -11882:2:1276 -11883:2:1284 -11884:2:1285 -11885:2:1289 -11886:2:1290 -11887:2:1284 -11888:2:1285 -11889:2:1289 -11890:2:1290 -11891:2:1298 -11892:2:1303 -11893:2:1307 -11894:2:1308 -11895:2:1315 -11896:2:1316 -11897:2:1327 -11898:2:1328 -11899:2:1329 -11900:2:1327 -11901:2:1328 -11902:2:1329 -11903:2:1340 -11904:2:1345 -11905:2:1346 -11906:0:4365 -11907:2:1358 -11908:0:4365 -11909:2:1454 -11910:0:4365 -11911:3:3558 -11912:0:4365 -11913:2:1455 -11914:0:4365 -11915:3:3559 -11916:0:4365 -11917:2:1652 -11918:0:4365 -11919:2:1653 -11920:0:4365 -11921:2:1657 -11922:0:4365 -11923:2:1660 -11924:0:4365 -11925:3:3558 -11926:0:4365 -11927:2:1665 -11928:2:1669 -11929:2:1670 -11930:2:1678 -11931:2:1679 -11932:2:1683 -11933:2:1684 -11934:2:1678 -11935:2:1679 -11936:2:1680 -11937:2:1692 -11938:2:1697 -11939:2:1701 -11940:2:1702 -11941:2:1709 -11942:2:1710 -11943:2:1721 -11944:2:1722 -11945:2:1723 -11946:2:1721 -11947:2:1722 -11948:2:1723 -11949:2:1734 -11950:2:1739 -11951:2:1740 -11952:0:4365 -11953:3:3559 -11954:0:4365 -11955:2:1752 -11956:0:4365 -11957:3:3558 -11958:0:4365 -11959:2:1754 -11960:0:4365 -11961:3:3559 -11962:0:4365 -11963:2:1755 -11964:2:1759 -11965:2:1760 -11966:2:1768 -11967:2:1769 -11968:2:1773 -11969:2:1774 -11970:2:1768 -11971:2:1769 -11972:2:1773 -11973:2:1774 -11974:2:1782 -11975:2:1787 -11976:2:1791 -11977:2:1792 -11978:2:1799 -11979:2:1800 -11980:2:1811 -11981:2:1812 -11982:2:1813 -11983:2:1811 -11984:2:1812 -11985:2:1813 -11986:2:1824 -11987:2:1829 -11988:2:1830 -11989:0:4365 -11990:2:1842 -11991:0:4365 -11992:3:3558 -11993:0:4365 -11994:2:1844 -11995:0:4365 -11996:3:3559 -11997:0:4365 -11998:2:1845 -11999:2:1849 -12000:2:1850 -12001:2:1858 -12002:2:1859 -12003:2:1863 -12004:2:1864 -12005:2:1858 -12006:2:1859 -12007:2:1863 -12008:2:1864 -12009:2:1872 -12010:2:1877 -12011:2:1881 -12012:2:1882 -12013:2:1889 -12014:2:1890 -12015:2:1901 -12016:2:1902 -12017:2:1903 -12018:2:1901 -12019:2:1902 -12020:2:1903 -12021:2:1914 -12022:2:1919 -12023:2:1920 -12024:0:4365 -12025:2:1932 -12026:0:4365 -12027:3:3558 -12028:0:4365 -12029:2:1934 -12030:0:4365 -12031:3:3559 -12032:0:4365 -12033:2:1935 -12034:0:4365 -12035:2:1936 -12036:0:4365 -12037:2:2129 -12038:0:4365 -12039:2:2130 -12040:0:4365 -12041:2:2134 -12042:0:4365 -12043:3:3558 -12044:0:4365 -12045:2:2136 -12046:0:4365 -12047:3:3559 -12048:0:4365 -12049:2:2137 -12050:2:2141 -12051:2:2142 -12052:2:2150 -12053:2:2151 -12054:2:2155 -12055:2:2156 -12056:2:2150 -12057:2:2151 -12058:2:2155 -12059:2:2156 -12060:2:2164 -12061:2:2169 -12062:2:2173 -12063:2:2174 -12064:2:2181 -12065:2:2182 -12066:2:2193 -12067:2:2194 -12068:2:2195 -12069:2:2193 -12070:2:2194 -12071:2:2195 -12072:2:2206 -12073:2:2211 -12074:2:2212 -12075:0:4365 -12076:2:2224 -12077:0:4365 -12078:3:3558 -12079:0:4365 -12080:2:2226 -12081:0:4365 -12082:3:3559 -12083:0:4365 -12084:2:1936 -12085:0:4365 -12086:2:2129 -12087:0:4365 -12088:2:2130 -12089:0:4365 -12090:2:2134 -12091:0:4365 -12092:3:3558 -12093:0:4365 -12094:2:2136 -12095:0:4365 -12096:3:3559 -12097:0:4365 -12098:2:2137 -12099:2:2141 -12100:2:2142 -12101:2:2150 -12102:2:2151 -12103:2:2155 -12104:2:2156 -12105:2:2150 -12106:2:2151 -12107:2:2152 -12108:2:2164 -12109:2:2169 -12110:2:2173 -12111:2:2174 -12112:2:2181 -12113:2:2182 -12114:2:2193 -12115:2:2194 -12116:2:2195 -12117:2:2193 -12118:2:2194 -12119:2:2195 -12120:2:2206 -12121:2:2211 -12122:2:2212 -12123:0:4365 -12124:2:2224 -12125:0:4365 -12126:3:3558 -12127:0:4365 -12128:2:2226 -12129:0:4365 -12130:3:3559 -12131:0:4365 -12132:2:2230 -12133:0:4365 -12134:3:3558 -12135:0:4365 -12136:2:2235 -12137:2:2239 -12138:2:2240 -12139:2:2248 -12140:2:2249 -12141:2:2253 -12142:2:2254 -12143:2:2248 -12144:2:2249 -12145:2:2250 -12146:2:2262 -12147:2:2267 -12148:2:2271 -12149:2:2272 -12150:2:2279 -12151:2:2280 -12152:2:2291 -12153:2:2292 -12154:2:2293 -12155:2:2291 -12156:2:2292 -12157:2:2293 -12158:2:2304 -12159:2:2309 -12160:2:2310 -12161:0:4365 -12162:3:3559 -12163:0:4365 -12164:2:2322 -12165:0:4365 -12166:2:1169 -12167:0:4365 -12168:3:3558 -12169:0:4365 -12170:2:1170 -12171:0:4365 -12172:3:3559 -12173:0:4365 -12174:3:3560 -12175:0:4365 -12176:3:3566 -12177:0:4365 -12178:3:3569 -12179:3:3570 -12180:3:3582 -12181:3:3583 -12182:3:3587 -12183:3:3588 -12184:3:3582 -12185:3:3583 -12186:3:3587 -12187:3:3588 -12188:3:3596 -12189:3:3601 -12190:3:3605 -12191:3:3606 -12192:3:3613 -12193:3:3614 -12194:3:3625 -12195:3:3626 -12196:3:3627 -12197:3:3625 -12198:3:3626 -12199:3:3627 -12200:3:3638 -12201:3:3643 -12202:3:3644 -12203:0:4365 -12204:3:3656 -12205:0:4365 -12206:3:3657 -12207:0:4365 -12208:2:1173 -12209:0:4365 -12210:3:3658 -12211:0:4365 -12212:2:1179 -12213:0:4365 -12214:2:1180 -12215:0:4365 -12216:3:3657 -12217:0:4365 -12218:2:1181 -12219:2:1185 -12220:2:1186 -12221:2:1194 -12222:2:1195 -12223:2:1199 -12224:2:1200 -12225:2:1194 -12226:2:1195 -12227:2:1199 -12228:2:1200 -12229:2:1208 -12230:2:1213 -12231:2:1217 -12232:2:1218 -12233:2:1225 -12234:2:1226 -12235:2:1237 -12236:2:1238 -12237:2:1239 -12238:2:1237 -12239:2:1238 -12240:2:1239 -12241:2:1250 -12242:2:1255 -12243:2:1256 -12244:0:4365 -12245:3:3658 -12246:0:4365 -12247:2:1268 -12248:0:4365 -12249:3:3657 -12250:0:4365 -12251:2:1270 -12252:0:4365 -12253:3:3658 -12254:0:4365 -12255:2:1271 -12256:2:1275 -12257:2:1276 -12258:2:1284 -12259:2:1285 -12260:2:1289 -12261:2:1290 -12262:2:1284 -12263:2:1285 -12264:2:1289 -12265:2:1290 -12266:2:1298 -12267:2:1303 -12268:2:1307 -12269:2:1308 -12270:2:1315 -12271:2:1316 -12272:2:1327 -12273:2:1328 -12274:2:1329 -12275:2:1327 -12276:2:1328 -12277:2:1329 -12278:2:1340 -12279:2:1345 -12280:2:1346 -12281:0:4365 -12282:2:1358 -12283:0:4365 -12284:2:1360 -12285:0:4365 -12286:3:3657 -12287:0:4365 -12288:2:1361 -12289:0:4365 -12290:3:3658 -12291:0:4365 -12292:2:1362 -12293:2:1366 -12294:2:1367 -12295:2:1375 -12296:2:1376 -12297:2:1380 -12298:2:1381 -12299:2:1375 -12300:2:1376 -12301:2:1380 -12302:2:1381 -12303:2:1389 -12304:2:1394 -12305:2:1398 -12306:2:1399 -12307:2:1406 -12308:2:1407 -12309:2:1418 -12310:2:1419 -12311:2:1420 -12312:2:1418 -12313:2:1419 -12314:2:1420 -12315:2:1431 -12316:2:1436 -12317:2:1437 -12318:0:4365 -12319:2:1449 -12320:0:4365 -12321:3:3657 -12322:0:4365 -12323:2:1451 -12324:0:4365 -12325:3:3658 -12326:0:4365 -12327:2:1652 -12328:0:4365 -12329:2:1653 -12330:0:4365 -12331:2:1657 -12332:0:4365 -12333:2:1180 -12334:0:4365 -12335:3:3657 -12336:0:4365 -12337:2:1181 -12338:2:1185 -12339:2:1186 -12340:2:1194 -12341:2:1195 -12342:2:1199 -12343:2:1200 -12344:2:1194 -12345:2:1195 -12346:2:1196 -12347:2:1208 -12348:2:1213 -12349:2:1217 -12350:2:1218 -12351:2:1225 -12352:2:1226 -12353:2:1237 -12354:2:1238 -12355:2:1239 -12356:2:1237 -12357:2:1238 -12358:2:1239 -12359:2:1250 -12360:2:1255 -12361:2:1256 -12362:0:4365 -12363:3:3658 -12364:0:4365 -12365:2:1268 -12366:0:4365 -12367:3:3657 -12368:0:4365 -12369:2:1270 -12370:0:4365 -12371:3:3658 -12372:0:4365 -12373:2:1271 -12374:2:1275 -12375:2:1276 -12376:2:1284 -12377:2:1285 -12378:2:1289 -12379:2:1290 -12380:2:1284 -12381:2:1285 -12382:2:1289 -12383:2:1290 -12384:2:1298 -12385:2:1303 -12386:2:1307 -12387:2:1308 -12388:2:1315 -12389:2:1316 -12390:2:1327 -12391:2:1328 -12392:2:1329 -12393:2:1327 -12394:2:1328 -12395:2:1329 -12396:2:1340 -12397:2:1345 -12398:2:1346 -12399:0:4365 -12400:2:1358 -12401:0:4365 -12402:2:1454 -12403:0:4365 -12404:3:3657 -12405:0:4365 -12406:2:1455 -12407:0:4365 -12408:3:3658 -12409:0:4365 -12410:2:1652 -12411:0:4365 -12412:2:1653 -12413:0:4365 -12414:2:1657 -12415:0:4365 -12416:2:1660 -12417:0:4365 -12418:3:3657 -12419:0:4365 -12420:2:1665 -12421:2:1669 -12422:2:1670 -12423:2:1678 -12424:2:1679 -12425:2:1683 -12426:2:1684 -12427:2:1678 -12428:2:1679 -12429:2:1680 -12430:2:1692 -12431:2:1697 -12432:2:1701 -12433:2:1702 -12434:2:1709 -12435:2:1710 -12436:2:1721 -12437:2:1722 -12438:2:1723 -12439:2:1721 -12440:2:1722 -12441:2:1723 -12442:2:1734 -12443:2:1739 -12444:2:1740 -12445:0:4365 -12446:3:3658 -12447:0:4365 -12448:2:1752 -12449:0:4365 -12450:3:3657 -12451:0:4365 -12452:2:1754 -12453:0:4365 -12454:3:3658 -12455:0:4365 -12456:2:1755 -12457:2:1759 -12458:2:1760 -12459:2:1768 -12460:2:1769 -12461:2:1773 -12462:2:1774 -12463:2:1768 -12464:2:1769 -12465:2:1773 -12466:2:1774 -12467:2:1782 -12468:2:1787 -12469:2:1791 -12470:2:1792 -12471:2:1799 -12472:2:1800 -12473:2:1811 -12474:2:1812 -12475:2:1813 -12476:2:1811 -12477:2:1812 -12478:2:1813 -12479:2:1824 -12480:2:1829 -12481:2:1830 -12482:0:4365 -12483:2:1842 -12484:0:4365 -12485:3:3657 -12486:0:4365 -12487:2:1844 -12488:0:4365 -12489:3:3658 -12490:0:4365 -12491:2:1845 -12492:2:1849 -12493:2:1850 -12494:2:1858 -12495:2:1859 -12496:2:1863 -12497:2:1864 -12498:2:1858 -12499:2:1859 -12500:2:1863 -12501:2:1864 -12502:2:1872 -12503:2:1877 -12504:2:1881 -12505:2:1882 -12506:2:1889 -12507:2:1890 -12508:2:1901 -12509:2:1902 -12510:2:1903 -12511:2:1901 -12512:2:1902 -12513:2:1903 -12514:2:1914 -12515:2:1919 -12516:2:1920 -12517:0:4365 -12518:2:1932 -12519:0:4365 -12520:3:3657 -12521:0:4365 -12522:2:1934 -12523:0:4365 -12524:3:3658 -12525:0:4365 -12526:2:1935 -12527:0:4365 -12528:2:1936 -12529:0:4365 -12530:2:2129 -12531:0:4365 -12532:2:2130 -12533:0:4365 -12534:2:2134 -12535:0:4365 -12536:3:3657 -12537:0:4365 -12538:2:2136 -12539:0:4365 -12540:3:3658 -12541:0:4365 -12542:2:2137 -12543:2:2141 -12544:2:2142 -12545:2:2150 -12546:2:2151 -12547:2:2155 -12548:2:2156 -12549:2:2150 -12550:2:2151 -12551:2:2155 -12552:2:2156 -12553:2:2164 -12554:2:2169 -12555:2:2173 -12556:2:2174 -12557:2:2181 -12558:2:2182 -12559:2:2193 -12560:2:2194 -12561:2:2195 -12562:2:2193 -12563:2:2194 -12564:2:2195 -12565:2:2206 -12566:2:2211 -12567:2:2212 -12568:0:4365 -12569:2:2224 -12570:0:4365 -12571:3:3657 -12572:0:4365 -12573:2:2226 -12574:0:4365 -12575:3:3658 -12576:0:4365 -12577:2:1936 -12578:0:4365 -12579:2:2129 -12580:0:4365 -12581:2:2130 -12582:0:4365 -12583:2:2134 -12584:0:4365 -12585:3:3657 -12586:0:4365 -12587:2:2136 -12588:0:4365 -12589:3:3658 -12590:0:4365 -12591:2:2137 -12592:2:2141 -12593:2:2142 -12594:2:2150 -12595:2:2151 -12596:2:2155 -12597:2:2156 -12598:2:2150 -12599:2:2151 -12600:2:2152 -12601:2:2164 -12602:2:2169 -12603:2:2173 -12604:2:2174 -12605:2:2181 -12606:2:2182 -12607:2:2193 -12608:2:2194 -12609:2:2195 -12610:2:2193 -12611:2:2194 -12612:2:2195 -12613:2:2206 -12614:2:2211 -12615:2:2212 -12616:0:4365 -12617:2:2224 -12618:0:4365 -12619:3:3657 -12620:0:4365 -12621:2:2226 -12622:0:4365 -12623:3:3658 -12624:0:4365 -12625:2:2230 -12626:0:4365 -12627:3:3657 -12628:0:4365 -12629:2:2235 -12630:2:2239 -12631:2:2240 -12632:2:2248 -12633:2:2249 -12634:2:2253 -12635:2:2254 -12636:2:2248 -12637:2:2249 -12638:2:2250 -12639:2:2262 -12640:2:2267 -12641:2:2271 -12642:2:2272 -12643:2:2279 -12644:2:2280 -12645:2:2291 -12646:2:2292 -12647:2:2293 -12648:2:2291 -12649:2:2292 -12650:2:2293 -12651:2:2304 -12652:2:2309 -12653:2:2310 -12654:0:4365 -12655:3:3658 -12656:0:4365 -12657:2:2322 -12658:0:4365 -12659:2:1169 -12660:0:4365 -12661:3:3657 -12662:0:4365 -12663:2:1170 -12664:0:4365 -12665:3:3658 -12666:0:4365 -12667:3:3659 -12668:0:4365 -12669:3:3665 -12670:0:4365 -12671:3:3666 -12672:0:4365 -12673:3:3667 -12674:0:4365 -12675:3:3668 -12676:0:4365 -12677:3:3669 -12678:3:3673 -12679:3:3674 -12680:3:3682 -12681:3:3683 -12682:3:3687 -12683:3:3688 -12684:3:3682 -12685:3:3683 -12686:3:3687 -12687:3:3688 -12688:3:3696 -12689:3:3701 -12690:3:3705 -12691:3:3706 -12692:3:3713 -12693:3:3714 -12694:3:3725 -12695:3:3726 -12696:3:3727 -12697:3:3725 -12698:3:3726 -12699:3:3727 -12700:3:3738 -12701:3:3743 -12702:3:3744 -12703:0:4365 -12704:3:3756 -12705:0:4365 -12706:3:3757 -12707:0:4365 -12708:2:1173 -12709:0:4365 -12710:3:3758 -12711:0:4365 -12712:2:1179 -12713:0:4365 -12714:2:1180 -12715:0:4365 -12716:3:3757 -12717:0:4365 -12718:2:1181 -12719:2:1185 -12720:2:1186 -12721:2:1194 -12722:2:1195 -12723:2:1199 -12724:2:1200 -12725:2:1194 -12726:2:1195 -12727:2:1199 -12728:2:1200 -12729:2:1208 -12730:2:1213 -12731:2:1217 -12732:2:1218 -12733:2:1225 -12734:2:1226 -12735:2:1237 -12736:2:1238 -12737:2:1239 -12738:2:1237 -12739:2:1238 -12740:2:1239 -12741:2:1250 -12742:2:1255 -12743:2:1256 -12744:0:4365 -12745:3:3758 -12746:0:4365 -12747:2:1268 -12748:0:4365 -12749:3:3757 -12750:0:4365 -12751:2:1270 -12752:0:4365 -12753:3:3758 -12754:0:4365 -12755:2:1271 -12756:2:1275 -12757:2:1276 -12758:2:1284 -12759:2:1285 -12760:2:1289 -12761:2:1290 -12762:2:1284 -12763:2:1285 -12764:2:1289 -12765:2:1290 -12766:2:1298 -12767:2:1303 -12768:2:1307 -12769:2:1308 -12770:2:1315 -12771:2:1316 -12772:2:1327 -12773:2:1328 -12774:2:1329 -12775:2:1327 -12776:2:1328 -12777:2:1329 -12778:2:1340 -12779:2:1345 -12780:2:1346 -12781:0:4365 -12782:2:1358 -12783:0:4365 -12784:2:1360 -12785:0:4365 -12786:3:3757 -12787:0:4365 -12788:2:1361 -12789:0:4365 -12790:3:3758 -12791:0:4365 -12792:2:1362 -12793:2:1366 -12794:2:1367 -12795:2:1375 -12796:2:1376 -12797:2:1380 -12798:2:1381 -12799:2:1375 -12800:2:1376 -12801:2:1380 -12802:2:1381 -12803:2:1389 -12804:2:1394 -12805:2:1398 -12806:2:1399 -12807:2:1406 -12808:2:1407 -12809:2:1418 -12810:2:1419 -12811:2:1420 -12812:2:1418 -12813:2:1419 -12814:2:1420 -12815:2:1431 -12816:2:1436 -12817:2:1437 -12818:0:4365 -12819:2:1449 -12820:0:4365 -12821:3:3757 -12822:0:4365 -12823:2:1451 -12824:0:4365 -12825:3:3758 -12826:0:4365 -12827:2:1652 -12828:0:4365 -12829:2:1653 -12830:0:4365 -12831:2:1657 -12832:0:4365 -12833:2:1180 -12834:0:4365 -12835:3:3757 -12836:0:4365 -12837:2:1181 -12838:2:1185 -12839:2:1186 -12840:2:1194 -12841:2:1195 -12842:2:1199 -12843:2:1200 -12844:2:1194 -12845:2:1195 -12846:2:1196 -12847:2:1208 -12848:2:1213 -12849:2:1217 -12850:2:1218 -12851:2:1225 -12852:2:1226 -12853:2:1237 -12854:2:1238 -12855:2:1239 -12856:2:1237 -12857:2:1238 -12858:2:1239 -12859:2:1250 -12860:2:1255 -12861:2:1256 -12862:0:4365 -12863:3:3758 -12864:0:4365 -12865:2:1268 -12866:0:4365 -12867:3:3757 -12868:0:4365 -12869:2:1270 -12870:0:4365 -12871:3:3758 -12872:0:4365 -12873:2:1271 -12874:2:1275 -12875:2:1276 -12876:2:1284 -12877:2:1285 -12878:2:1289 -12879:2:1290 -12880:2:1284 -12881:2:1285 -12882:2:1289 -12883:2:1290 -12884:2:1298 -12885:2:1303 -12886:2:1307 -12887:2:1308 -12888:2:1315 -12889:2:1316 -12890:2:1327 -12891:2:1328 -12892:2:1329 -12893:2:1327 -12894:2:1328 -12895:2:1329 -12896:2:1340 -12897:2:1345 -12898:2:1346 -12899:0:4365 -12900:2:1358 -12901:0:4365 -12902:2:1454 -12903:0:4365 -12904:3:3757 -12905:0:4365 -12906:2:1455 -12907:0:4365 -12908:3:3758 -12909:0:4365 -12910:2:1652 -12911:0:4365 -12912:2:1653 -12913:0:4365 -12914:2:1657 -12915:0:4365 -12916:2:1660 -12917:0:4365 -12918:3:3757 -12919:0:4365 -12920:2:1665 -12921:2:1669 -12922:2:1670 -12923:2:1678 -12924:2:1679 -12925:2:1683 -12926:2:1684 -12927:2:1678 -12928:2:1679 -12929:2:1680 -12930:2:1692 -12931:2:1697 -12932:2:1701 -12933:2:1702 -12934:2:1709 -12935:2:1710 -12936:2:1721 -12937:2:1722 -12938:2:1723 -12939:2:1721 -12940:2:1722 -12941:2:1723 -12942:2:1734 -12943:2:1739 -12944:2:1740 -12945:0:4365 -12946:3:3758 -12947:0:4365 -12948:2:1752 -12949:0:4365 -12950:3:3757 -12951:0:4365 -12952:2:1754 -12953:0:4365 -12954:3:3758 -12955:0:4365 -12956:2:1755 -12957:2:1759 -12958:2:1760 -12959:2:1768 -12960:2:1769 -12961:2:1773 -12962:2:1774 -12963:2:1768 -12964:2:1769 -12965:2:1773 -12966:2:1774 -12967:2:1782 -12968:2:1787 -12969:2:1791 -12970:2:1792 -12971:2:1799 -12972:2:1800 -12973:2:1811 -12974:2:1812 -12975:2:1813 -12976:2:1811 -12977:2:1812 -12978:2:1813 -12979:2:1824 -12980:2:1829 -12981:2:1830 -12982:0:4365 -12983:2:1842 -12984:0:4365 -12985:3:3757 -12986:0:4365 -12987:2:1844 -12988:0:4365 -12989:3:3758 -12990:0:4365 -12991:2:1845 -12992:2:1849 -12993:2:1850 -12994:2:1858 -12995:2:1859 -12996:2:1863 -12997:2:1864 -12998:2:1858 -12999:2:1859 -13000:2:1863 -13001:2:1864 -13002:2:1872 -13003:2:1877 -13004:2:1881 -13005:2:1882 -13006:2:1889 -13007:2:1890 -13008:2:1901 -13009:2:1902 -13010:2:1903 -13011:2:1901 -13012:2:1902 -13013:2:1903 -13014:2:1914 -13015:2:1919 -13016:2:1920 -13017:0:4365 -13018:2:1932 -13019:0:4365 -13020:3:3757 -13021:0:4365 -13022:2:1934 -13023:0:4365 -13024:3:3758 -13025:0:4365 -13026:2:1935 -13027:0:4365 -13028:2:1936 -13029:0:4365 -13030:2:2129 -13031:0:4365 -13032:2:2130 -13033:0:4365 -13034:2:2134 -13035:0:4365 -13036:3:3757 -13037:0:4365 -13038:2:2136 -13039:0:4365 -13040:3:3758 -13041:0:4365 -13042:2:2137 -13043:2:2141 -13044:2:2142 -13045:2:2150 -13046:2:2151 -13047:2:2155 -13048:2:2156 -13049:2:2150 -13050:2:2151 -13051:2:2155 -13052:2:2156 -13053:2:2164 -13054:2:2169 -13055:2:2173 -13056:2:2174 -13057:2:2181 -13058:2:2182 -13059:2:2193 -13060:2:2194 -13061:2:2195 -13062:2:2193 -13063:2:2194 -13064:2:2195 -13065:2:2206 -13066:2:2211 -13067:2:2212 -13068:0:4365 -13069:2:2224 -13070:0:4365 -13071:3:3757 -13072:0:4365 -13073:2:2226 -13074:0:4365 -13075:3:3758 -13076:0:4365 -13077:2:1936 -13078:0:4365 -13079:2:2129 -13080:0:4365 -13081:2:2130 -13082:0:4365 -13083:2:2134 -13084:0:4365 -13085:3:3757 -13086:0:4365 -13087:2:2136 -13088:0:4365 -13089:3:3758 -13090:0:4365 -13091:2:2137 -13092:2:2141 -13093:2:2142 -13094:2:2150 -13095:2:2151 -13096:2:2155 -13097:2:2156 -13098:2:2150 -13099:2:2151 -13100:2:2152 -13101:2:2164 -13102:2:2169 -13103:2:2173 -13104:2:2174 -13105:2:2181 -13106:2:2182 -13107:2:2193 -13108:2:2194 -13109:2:2195 -13110:2:2193 -13111:2:2194 -13112:2:2195 -13113:2:2206 -13114:2:2211 -13115:2:2212 -13116:0:4365 -13117:2:2224 -13118:0:4365 -13119:3:3757 -13120:0:4365 -13121:2:2226 -13122:0:4365 -13123:3:3758 -13124:0:4365 -13125:2:2230 -13126:0:4365 -13127:3:3757 -13128:0:4365 -13129:2:2235 -13130:2:2239 -13131:2:2240 -13132:2:2248 -13133:2:2249 -13134:2:2253 -13135:2:2254 -13136:2:2248 -13137:2:2249 -13138:2:2250 -13139:2:2262 -13140:2:2267 -13141:2:2271 -13142:2:2272 -13143:2:2279 -13144:2:2280 -13145:2:2291 -13146:2:2292 -13147:2:2293 -13148:2:2291 -13149:2:2292 -13150:2:2293 -13151:2:2304 -13152:2:2309 -13153:2:2310 -13154:0:4365 -13155:3:3758 -13156:0:4365 -13157:2:2322 -13158:0:4365 -13159:2:1169 -13160:0:4365 -13161:3:3757 -13162:0:4365 -13163:2:1170 -13164:0:4365 -13165:3:3758 -13166:0:4365 -13167:3:3759 -13168:0:4365 -13169:3:3972 -13170:0:4365 -13171:3:3980 -13172:0:4365 -13173:3:3981 -13174:3:3985 -13175:3:3986 -13176:3:3994 -13177:3:3995 -13178:3:3999 -13179:3:4000 -13180:3:3994 -13181:3:3995 -13182:3:3999 -13183:3:4000 -13184:3:4008 -13185:3:4013 -13186:3:4017 -13187:3:4018 -13188:3:4025 -13189:3:4026 -13190:3:4037 -13191:3:4038 -13192:3:4039 -13193:3:4037 -13194:3:4038 -13195:3:4039 -13196:3:4050 -13197:3:4055 -13198:3:4056 -13199:0:4365 -13200:3:4068 -13201:0:4365 -13202:3:4069 -13203:0:4365 -13204:2:1173 -13205:0:4365 -13206:3:4070 -13207:0:4365 -13208:2:1179 -13209:0:4365 -13210:2:1180 -13211:0:4365 -13212:3:4069 -13213:0:4365 -13214:2:1181 -13215:2:1185 -13216:2:1186 -13217:2:1194 -13218:2:1195 -13219:2:1199 -13220:2:1200 -13221:2:1194 -13222:2:1195 -13223:2:1199 -13224:2:1200 -13225:2:1208 -13226:2:1213 -13227:2:1217 -13228:2:1218 -13229:2:1225 -13230:2:1226 -13231:2:1237 -13232:2:1238 -13233:2:1239 -13234:2:1237 -13235:2:1238 -13236:2:1239 -13237:2:1250 -13238:2:1255 -13239:2:1256 -13240:0:4365 -13241:3:4070 -13242:0:4365 -13243:2:1268 -13244:0:4365 -13245:3:4069 -13246:0:4365 -13247:2:1270 -13248:0:4365 -13249:3:4070 -13250:0:4365 -13251:2:1271 -13252:2:1275 -13253:2:1276 -13254:2:1284 -13255:2:1285 -13256:2:1289 -13257:2:1290 -13258:2:1284 -13259:2:1285 -13260:2:1289 -13261:2:1290 -13262:2:1298 -13263:2:1303 -13264:2:1307 -13265:2:1308 -13266:2:1315 -13267:2:1316 -13268:2:1327 -13269:2:1328 -13270:2:1329 -13271:2:1327 -13272:2:1328 -13273:2:1329 -13274:2:1340 -13275:2:1345 -13276:2:1346 -13277:0:4365 -13278:2:1358 -13279:0:4365 -13280:2:1360 -13281:0:4365 -13282:3:4069 -13283:0:4365 -13284:2:1361 -13285:0:4365 -13286:3:4070 -13287:0:4365 -13288:2:1362 -13289:2:1366 -13290:2:1367 -13291:2:1375 -13292:2:1376 -13293:2:1380 -13294:2:1381 -13295:2:1375 -13296:2:1376 -13297:2:1380 -13298:2:1381 -13299:2:1389 -13300:2:1394 -13301:2:1398 -13302:2:1399 -13303:2:1406 -13304:2:1407 -13305:2:1418 -13306:2:1419 -13307:2:1420 -13308:2:1418 -13309:2:1419 -13310:2:1420 -13311:2:1431 -13312:2:1436 -13313:2:1437 -13314:0:4365 -13315:2:1449 -13316:0:4365 -13317:3:4069 -13318:0:4365 -13319:2:1451 -13320:0:4365 -13321:3:4070 -13322:0:4365 -13323:2:1652 -13324:0:4365 -13325:2:1653 -13326:0:4365 -13327:2:1657 -13328:0:4365 -13329:2:1180 -13330:0:4365 -13331:3:4069 -13332:0:4365 -13333:2:1181 -13334:2:1185 -13335:2:1186 -13336:2:1194 -13337:2:1195 -13338:2:1199 -13339:2:1200 -13340:2:1194 -13341:2:1195 -13342:2:1196 -13343:2:1208 -13344:2:1213 -13345:2:1217 -13346:2:1218 -13347:2:1225 -13348:2:1226 -13349:2:1237 -13350:2:1238 -13351:2:1239 -13352:2:1237 -13353:2:1238 -13354:2:1239 -13355:2:1250 -13356:2:1255 -13357:2:1256 -13358:0:4365 -13359:3:4070 -13360:0:4365 -13361:2:1268 -13362:0:4365 -13363:3:4069 -13364:0:4365 -13365:2:1270 -13366:0:4365 -13367:3:4070 -13368:0:4365 -13369:2:1271 -13370:2:1275 -13371:2:1276 -13372:2:1284 -13373:2:1285 -13374:2:1289 -13375:2:1290 -13376:2:1284 -13377:2:1285 -13378:2:1289 -13379:2:1290 -13380:2:1298 -13381:2:1303 -13382:2:1307 -13383:2:1308 -13384:2:1315 -13385:2:1316 -13386:2:1327 -13387:2:1328 -13388:2:1329 -13389:2:1327 -13390:2:1328 -13391:2:1329 -13392:2:1340 -13393:2:1345 -13394:2:1346 -13395:0:4365 -13396:2:1358 -13397:0:4365 -13398:2:1454 -13399:0:4365 -13400:3:4069 -13401:0:4365 -13402:2:1455 -13403:0:4365 -13404:3:4070 -13405:0:4365 -13406:2:1652 -13407:0:4365 -13408:2:1653 -13409:0:4365 -13410:2:1657 -13411:0:4365 -13412:2:1660 -13413:0:4365 -13414:3:4069 -13415:0:4365 -13416:2:1665 -13417:2:1669 -13418:2:1670 -13419:2:1678 -13420:2:1679 -13421:2:1683 -13422:2:1684 -13423:2:1678 -13424:2:1679 -13425:2:1680 -13426:2:1692 -13427:2:1697 -13428:2:1701 -13429:2:1702 -13430:2:1709 -13431:2:1710 -13432:2:1721 -13433:2:1722 -13434:2:1723 -13435:2:1721 -13436:2:1722 -13437:2:1723 -13438:2:1734 -13439:2:1739 -13440:2:1740 -13441:0:4365 -13442:3:4070 -13443:0:4365 -13444:2:1752 -13445:0:4365 -13446:3:4069 -13447:0:4365 -13448:2:1754 -13449:0:4365 -13450:3:4070 -13451:0:4365 -13452:2:1755 -13453:2:1759 -13454:2:1760 -13455:2:1768 -13456:2:1769 -13457:2:1773 -13458:2:1774 -13459:2:1768 -13460:2:1769 -13461:2:1773 -13462:2:1774 -13463:2:1782 -13464:2:1787 -13465:2:1791 -13466:2:1792 -13467:2:1799 -13468:2:1800 -13469:2:1811 -13470:2:1812 -13471:2:1813 -13472:2:1811 -13473:2:1812 -13474:2:1813 -13475:2:1824 -13476:2:1829 -13477:2:1830 -13478:0:4365 -13479:2:1842 -13480:0:4365 -13481:3:4069 -13482:0:4365 -13483:2:1844 -13484:0:4365 -13485:3:4070 -13486:0:4365 -13487:2:1845 -13488:2:1849 -13489:2:1850 -13490:2:1858 -13491:2:1859 -13492:2:1863 -13493:2:1864 -13494:2:1858 -13495:2:1859 -13496:2:1863 -13497:2:1864 -13498:2:1872 -13499:2:1877 -13500:2:1881 -13501:2:1882 -13502:2:1889 -13503:2:1890 -13504:2:1901 -13505:2:1902 -13506:2:1903 -13507:2:1901 -13508:2:1902 -13509:2:1903 -13510:2:1914 -13511:2:1919 -13512:2:1920 -13513:0:4365 -13514:2:1932 -13515:0:4365 -13516:3:4069 -13517:0:4365 -13518:2:1934 -13519:0:4365 -13520:3:4070 -13521:0:4365 -13522:2:1935 -13523:0:4365 -13524:2:1936 -13525:0:4365 -13526:2:2129 -13527:0:4365 -13528:2:2130 -13529:0:4365 -13530:2:2134 -13531:0:4365 -13532:3:4069 -13533:0:4365 -13534:2:2136 -13535:0:4365 -13536:3:4070 -13537:0:4365 -13538:2:2137 -13539:2:2141 -13540:2:2142 -13541:2:2150 -13542:2:2151 -13543:2:2155 -13544:2:2156 -13545:2:2150 -13546:2:2151 -13547:2:2155 -13548:2:2156 -13549:2:2164 -13550:2:2169 -13551:2:2173 -13552:2:2174 -13553:2:2181 -13554:2:2182 -13555:2:2193 -13556:2:2194 -13557:2:2195 -13558:2:2193 -13559:2:2194 -13560:2:2195 -13561:2:2206 -13562:2:2211 -13563:2:2212 -13564:0:4365 -13565:2:2224 -13566:0:4365 -13567:3:4069 -13568:0:4365 -13569:2:2226 -13570:0:4365 -13571:3:4070 -13572:0:4365 -13573:2:1936 -13574:0:4365 -13575:2:2129 -13576:0:4365 -13577:2:2130 -13578:0:4365 -13579:2:2134 -13580:0:4365 -13581:3:4069 -13582:0:4365 -13583:2:2136 -13584:0:4365 -13585:3:4070 -13586:0:4365 -13587:2:2137 -13588:2:2141 -13589:2:2142 -13590:2:2150 -13591:2:2151 -13592:2:2155 -13593:2:2156 -13594:2:2150 -13595:2:2151 -13596:2:2152 -13597:2:2164 -13598:2:2169 -13599:2:2173 -13600:2:2174 -13601:2:2181 -13602:2:2182 -13603:2:2193 -13604:2:2194 -13605:2:2195 -13606:2:2193 -13607:2:2194 -13608:2:2195 -13609:2:2206 -13610:2:2211 -13611:2:2212 -13612:0:4365 -13613:2:2224 -13614:0:4365 -13615:3:4069 -13616:0:4365 -13617:2:2226 -13618:0:4365 -13619:3:4070 -13620:0:4365 -13621:2:2230 -13622:0:4365 -13623:3:4069 -13624:0:4365 -13625:2:2235 -13626:2:2239 -13627:2:2240 -13628:2:2248 -13629:2:2249 -13630:2:2253 -13631:2:2254 -13632:2:2248 -13633:2:2249 -13634:2:2250 -13635:2:2262 -13636:2:2267 -13637:2:2271 -13638:2:2272 -13639:2:2279 -13640:2:2280 -13641:2:2291 -13642:2:2292 -13643:2:2293 -13644:2:2291 -13645:2:2292 -13646:2:2293 -13647:2:2304 -13648:2:2309 -13649:2:2310 -13650:0:4365 -13651:3:4070 -13652:0:4365 -13653:2:2322 -13654:0:4365 -13655:2:1169 -13656:0:4365 -13657:3:4069 -13658:0:4365 -13659:2:1170 -13660:0:4365 -13661:3:4070 -13662:0:4365 -13663:3:4071 -13664:0:4365 -13665:3:4081 -13666:0:4365 -13667:3:3666 -13668:0:4365 -13669:3:3667 -13670:0:4365 -13671:3:3668 -13672:0:4365 -13673:3:3669 -13674:3:3673 -13675:3:3674 -13676:3:3682 -13677:3:3683 -13678:3:3687 -13679:3:3688 -13680:3:3682 -13681:3:3683 -13682:3:3687 -13683:3:3688 -13684:3:3696 -13685:3:3701 -13686:3:3705 -13687:3:3706 -13688:3:3713 -13689:3:3714 -13690:3:3725 -13691:3:3726 -13692:3:3727 -13693:3:3725 -13694:3:3726 -13695:3:3727 -13696:3:3738 -13697:3:3743 -13698:3:3744 -13699:0:4365 -13700:3:3756 -13701:0:4365 -13702:3:3757 -13703:0:4365 -13704:2:1173 -13705:0:4365 -13706:3:3758 -13707:0:4365 -13708:2:1179 -13709:0:4365 -13710:2:1180 -13711:0:4365 -13712:3:3757 -13713:0:4365 -13714:2:1181 -13715:2:1185 -13716:2:1186 -13717:2:1194 -13718:2:1195 -13719:2:1199 -13720:2:1200 -13721:2:1194 -13722:2:1195 -13723:2:1199 -13724:2:1200 -13725:2:1208 -13726:2:1213 -13727:2:1217 -13728:2:1218 -13729:2:1225 -13730:2:1226 -13731:2:1237 -13732:2:1238 -13733:2:1239 -13734:2:1237 -13735:2:1238 -13736:2:1239 -13737:2:1250 -13738:2:1255 -13739:2:1256 -13740:0:4365 -13741:3:3758 -13742:0:4365 -13743:2:1268 -13744:0:4365 -13745:3:3757 -13746:0:4365 -13747:2:1270 -13748:0:4365 -13749:3:3758 -13750:0:4365 -13751:2:1271 -13752:2:1275 -13753:2:1276 -13754:2:1284 -13755:2:1285 -13756:2:1289 -13757:2:1290 -13758:2:1284 -13759:2:1285 -13760:2:1289 -13761:2:1290 -13762:2:1298 -13763:2:1303 -13764:2:1307 -13765:2:1308 -13766:2:1315 -13767:2:1316 -13768:2:1327 -13769:2:1328 -13770:2:1329 -13771:2:1327 -13772:2:1328 -13773:2:1329 -13774:2:1340 -13775:2:1345 -13776:2:1346 -13777:0:4365 -13778:2:1358 -13779:0:4365 -13780:2:1360 -13781:0:4365 -13782:3:3757 -13783:0:4365 -13784:2:1361 -13785:0:4365 -13786:3:3758 -13787:0:4365 -13788:2:1362 -13789:2:1366 -13790:2:1367 -13791:2:1375 -13792:2:1376 -13793:2:1380 -13794:2:1381 -13795:2:1375 -13796:2:1376 -13797:2:1380 -13798:2:1381 -13799:2:1389 -13800:2:1394 -13801:2:1398 -13802:2:1399 -13803:2:1406 -13804:2:1407 -13805:2:1418 -13806:2:1419 -13807:2:1420 -13808:2:1418 -13809:2:1419 -13810:2:1420 -13811:2:1431 -13812:2:1436 -13813:2:1437 -13814:0:4365 -13815:2:1449 -13816:0:4365 -13817:3:3757 -13818:0:4365 -13819:2:1451 -13820:0:4365 -13821:3:3758 -13822:0:4365 -13823:2:1652 -13824:0:4365 -13825:2:1653 -13826:0:4365 -13827:2:1657 -13828:0:4365 -13829:2:1180 -13830:0:4365 -13831:3:3757 -13832:0:4365 -13833:2:1181 -13834:2:1185 -13835:2:1186 -13836:2:1194 -13837:2:1195 -13838:2:1199 -13839:2:1200 -13840:2:1194 -13841:2:1195 -13842:2:1196 -13843:2:1208 -13844:2:1213 -13845:2:1217 -13846:2:1218 -13847:2:1225 -13848:2:1226 -13849:2:1237 -13850:2:1238 -13851:2:1239 -13852:2:1237 -13853:2:1238 -13854:2:1239 -13855:2:1250 -13856:2:1255 -13857:2:1256 -13858:0:4365 -13859:3:3758 -13860:0:4365 -13861:2:1268 -13862:0:4365 -13863:3:3757 -13864:0:4365 -13865:2:1270 -13866:0:4365 -13867:3:3758 -13868:0:4365 -13869:2:1271 -13870:2:1275 -13871:2:1276 -13872:2:1284 -13873:2:1285 -13874:2:1289 -13875:2:1290 -13876:2:1284 -13877:2:1285 -13878:2:1289 -13879:2:1290 -13880:2:1298 -13881:2:1303 -13882:2:1307 -13883:2:1308 -13884:2:1315 -13885:2:1316 -13886:2:1327 -13887:2:1328 -13888:2:1329 -13889:2:1327 -13890:2:1328 -13891:2:1329 -13892:2:1340 -13893:2:1345 -13894:2:1346 -13895:0:4365 -13896:2:1358 -13897:0:4365 -13898:2:1454 -13899:0:4365 -13900:3:3757 -13901:0:4365 -13902:2:1455 -13903:0:4365 -13904:3:3758 -13905:0:4365 -13906:2:1652 -13907:0:4365 -13908:2:1653 -13909:0:4365 -13910:2:1657 -13911:0:4365 -13912:2:1660 -13913:0:4365 -13914:3:3757 -13915:0:4365 -13916:2:1665 -13917:2:1669 -13918:2:1670 -13919:2:1678 -13920:2:1679 -13921:2:1683 -13922:2:1684 -13923:2:1678 -13924:2:1679 -13925:2:1680 -13926:2:1692 -13927:2:1697 -13928:2:1701 -13929:2:1702 -13930:2:1709 -13931:2:1710 -13932:2:1721 -13933:2:1722 -13934:2:1723 -13935:2:1721 -13936:2:1722 -13937:2:1723 -13938:2:1734 -13939:2:1739 -13940:2:1740 -13941:0:4365 -13942:3:3758 -13943:0:4365 -13944:2:1752 -13945:0:4365 -13946:3:3757 -13947:0:4365 -13948:2:1754 -13949:0:4365 -13950:3:3758 -13951:0:4365 -13952:2:1755 -13953:2:1759 -13954:2:1760 -13955:2:1768 -13956:2:1769 -13957:2:1773 -13958:2:1774 -13959:2:1768 -13960:2:1769 -13961:2:1773 -13962:2:1774 -13963:2:1782 -13964:2:1787 -13965:2:1791 -13966:2:1792 -13967:2:1799 -13968:2:1800 -13969:2:1811 -13970:2:1812 -13971:2:1813 -13972:2:1811 -13973:2:1812 -13974:2:1813 -13975:2:1824 -13976:2:1829 -13977:2:1830 -13978:0:4365 -13979:2:1842 -13980:0:4365 -13981:3:3757 -13982:0:4365 -13983:2:1844 -13984:0:4365 -13985:3:3758 -13986:0:4365 -13987:2:1845 -13988:2:1849 -13989:2:1850 -13990:2:1858 -13991:2:1859 -13992:2:1863 -13993:2:1864 -13994:2:1858 -13995:2:1859 -13996:2:1863 -13997:2:1864 -13998:2:1872 -13999:2:1877 -14000:2:1881 -14001:2:1882 -14002:2:1889 -14003:2:1890 -14004:2:1901 -14005:2:1902 -14006:2:1903 -14007:2:1901 -14008:2:1902 -14009:2:1903 -14010:2:1914 -14011:2:1919 -14012:2:1920 -14013:0:4365 -14014:2:1932 -14015:0:4365 -14016:3:3757 -14017:0:4365 -14018:2:1934 -14019:0:4365 -14020:3:3758 -14021:0:4365 -14022:2:1935 -14023:0:4365 -14024:2:1936 -14025:0:4365 -14026:2:2129 -14027:0:4365 -14028:2:2130 -14029:0:4365 -14030:2:2134 -14031:0:4365 -14032:3:3757 -14033:0:4365 -14034:2:2136 -14035:0:4365 -14036:3:3758 -14037:0:4365 -14038:2:2137 -14039:2:2141 -14040:2:2142 -14041:2:2150 -14042:2:2151 -14043:2:2155 -14044:2:2156 -14045:2:2150 -14046:2:2151 -14047:2:2155 -14048:2:2156 -14049:2:2164 -14050:2:2169 -14051:2:2173 -14052:2:2174 -14053:2:2181 -14054:2:2182 -14055:2:2193 -14056:2:2194 -14057:2:2195 -14058:2:2193 -14059:2:2194 -14060:2:2195 -14061:2:2206 -14062:2:2211 -14063:2:2212 -14064:0:4365 -14065:2:2224 -14066:0:4365 -14067:3:3757 -14068:0:4365 -14069:2:2226 -14070:0:4365 -14071:3:3758 -14072:0:4365 -14073:2:1936 -14074:0:4365 -14075:2:2129 -14076:0:4365 -14077:2:2130 -14078:0:4365 -14079:2:2134 -14080:0:4365 -14081:3:3757 -14082:0:4365 -14083:2:2136 -14084:0:4365 -14085:3:3758 -14086:0:4365 -14087:2:2137 -14088:2:2141 -14089:2:2142 -14090:2:2150 -14091:2:2151 -14092:2:2155 -14093:2:2156 -14094:2:2150 -14095:2:2151 -14096:2:2152 -14097:2:2164 -14098:2:2169 -14099:2:2173 -14100:2:2174 -14101:2:2181 -14102:2:2182 -14103:2:2193 -14104:2:2194 -14105:2:2195 -14106:2:2193 -14107:2:2194 -14108:2:2195 -14109:2:2206 -14110:2:2211 -14111:2:2212 -14112:0:4365 -14113:2:2224 -14114:0:4365 -14115:3:3757 -14116:0:4365 -14117:2:2226 -14118:0:4365 -14119:3:3758 -14120:0:4365 -14121:2:2230 -14122:0:4365 -14123:3:3757 -14124:0:4365 -14125:2:2235 -14126:2:2239 -14127:2:2240 -14128:2:2248 -14129:2:2249 -14130:2:2253 -14131:2:2254 -14132:2:2248 -14133:2:2249 -14134:2:2250 -14135:2:2262 -14136:2:2267 -14137:2:2271 -14138:2:2272 -14139:2:2279 -14140:2:2280 -14141:2:2291 -14142:2:2292 -14143:2:2293 -14144:2:2291 -14145:2:2292 -14146:2:2293 -14147:2:2304 -14148:2:2309 -14149:2:2310 -14150:0:4365 -14151:3:3758 -14152:0:4365 -14153:2:2322 -14154:0:4365 -14155:2:1169 -14156:0:4365 -14157:3:3757 -14158:0:4365 -14159:2:1170 -14160:0:4365 -14161:3:3758 -14162:0:4365 -14163:3:3759 -14164:0:4365 -14165:3:3972 -14166:0:4365 -14167:3:4077 -14168:0:4365 -14169:3:4078 -14170:0:4365 -14171:3:4082 -14172:0:4365 -14173:3:4088 -14174:0:4365 -14175:3:4092 -14176:3:4093 -14177:3:4097 -14178:3:4101 -14179:3:4102 -14180:3:4097 -14181:3:4101 -14182:3:4102 -14183:3:4106 -14184:3:4114 -14185:3:4115 -14186:3:4120 -14187:3:4127 -14188:3:4128 -14189:3:4127 -14190:3:4128 -14191:3:4135 -14192:3:4140 -14193:0:4365 -14194:3:4151 -14195:0:4365 -14196:3:4155 -14197:3:4156 -14198:3:4160 -14199:3:4164 -14200:3:4165 -14201:3:4160 -14202:3:4164 -14203:3:4165 -14204:3:4169 -14205:3:4177 -14206:3:4178 -14207:3:4183 -14208:3:4190 -14209:3:4191 -14210:3:4190 -14211:3:4191 -14212:3:4198 -14213:3:4203 -14214:0:4365 -14215:3:4151 -14216:0:4365 -14217:3:4155 -14218:3:4156 -14219:3:4160 -14220:3:4164 -14221:3:4165 -14222:3:4160 -14223:3:4164 -14224:3:4165 -14225:3:4169 -14226:3:4177 -14227:3:4178 -14228:3:4183 -14229:3:4190 -14230:3:4191 -14231:3:4190 -14232:3:4191 -14233:3:4198 -14234:3:4203 -14235:0:4365 -14236:3:4214 -14237:0:4365 -14238:3:4222 -14239:3:4223 -14240:3:4227 -14241:3:4231 -14242:3:4232 -14243:3:4227 -14244:3:4231 -14245:3:4232 -14246:3:4236 -14247:3:4244 -14248:3:4245 -14249:3:4250 -14250:3:4257 -14251:3:4258 -14252:3:4257 -14253:3:4258 -14254:3:4265 -14255:3:4270 -14256:0:4365 -14257:3:4285 -14258:0:4365 -14259:3:4286 -14260:0:4365 -14261:2:1173 -14262:0:4365 -14263:3:4287 -14264:0:4365 -14265:2:1179 -14266:0:4365 -14267:2:1180 -14268:0:4365 -14269:3:4286 -14270:0:4365 -14271:2:1181 -14272:2:1185 -14273:2:1186 -14274:2:1194 -14275:2:1195 -14276:2:1199 -14277:2:1200 -14278:2:1194 -14279:2:1195 -14280:2:1199 -14281:2:1200 -14282:2:1208 -14283:2:1213 -14284:2:1217 -14285:2:1218 -14286:2:1225 -14287:2:1226 -14288:2:1237 -14289:2:1238 -14290:2:1239 -14291:2:1237 -14292:2:1238 -14293:2:1239 -14294:2:1250 -14295:2:1255 -14296:2:1256 -14297:0:4365 -14298:3:4287 -14299:0:4365 -14300:2:1268 -14301:0:4365 -14302:3:4286 -14303:0:4365 -14304:2:1270 -14305:0:4365 -14306:3:4287 -14307:0:4365 -14308:2:1271 -14309:2:1275 -14310:2:1276 -14311:2:1284 -14312:2:1285 -14313:2:1289 -14314:2:1290 -14315:2:1284 -14316:2:1285 -14317:2:1289 -14318:2:1290 -14319:2:1298 -14320:2:1303 -14321:2:1307 -14322:2:1308 -14323:2:1315 -14324:2:1316 -14325:2:1327 -14326:2:1328 -14327:2:1329 -14328:2:1327 -14329:2:1328 -14330:2:1329 -14331:2:1340 -14332:2:1345 -14333:2:1346 -14334:0:4365 -14335:2:1358 -14336:0:4365 -14337:2:1360 -14338:0:4365 -14339:3:4286 -14340:0:4365 -14341:2:1361 -14342:0:4365 -14343:3:4287 -14344:0:4365 -14345:2:1362 -14346:2:1366 -14347:2:1367 -14348:2:1375 -14349:2:1376 -14350:2:1380 -14351:2:1381 -14352:2:1375 -14353:2:1376 -14354:2:1380 -14355:2:1381 -14356:2:1389 -14357:2:1394 -14358:2:1398 -14359:2:1399 -14360:2:1406 -14361:2:1407 -14362:2:1418 -14363:2:1419 -14364:2:1420 -14365:2:1418 -14366:2:1419 -14367:2:1420 -14368:2:1431 -14369:2:1436 -14370:2:1437 -14371:0:4365 -14372:2:1449 -14373:0:4365 -14374:3:4286 -14375:0:4365 -14376:2:1451 -14377:0:4365 -14378:3:4287 -14379:0:4365 -14380:2:1652 -14381:0:4365 -14382:2:1653 -14383:0:4365 -14384:2:1657 -14385:0:4365 -14386:2:1180 -14387:0:4365 -14388:3:4286 -14389:0:4365 -14390:2:1181 -14391:2:1185 -14392:2:1186 -14393:2:1194 -14394:2:1195 -14395:2:1199 -14396:2:1200 -14397:2:1194 -14398:2:1195 -14399:2:1196 -14400:2:1208 -14401:2:1213 -14402:2:1217 -14403:2:1218 -14404:2:1225 -14405:2:1226 -14406:2:1237 -14407:2:1238 -14408:2:1239 -14409:2:1237 -14410:2:1238 -14411:2:1239 -14412:2:1250 -14413:2:1255 -14414:2:1256 -14415:0:4365 -14416:3:4287 -14417:0:4365 -14418:2:1268 -14419:0:4365 -14420:3:4286 -14421:0:4365 -14422:2:1270 -14423:0:4365 -14424:3:4287 -14425:0:4365 -14426:2:1271 -14427:2:1275 -14428:2:1276 -14429:2:1284 -14430:2:1285 -14431:2:1289 -14432:2:1290 -14433:2:1284 -14434:2:1285 -14435:2:1289 -14436:2:1290 -14437:2:1298 -14438:2:1303 -14439:2:1307 -14440:2:1308 -14441:2:1315 -14442:2:1316 -14443:2:1327 -14444:2:1328 -14445:2:1329 -14446:2:1327 -14447:2:1328 -14448:2:1329 -14449:2:1340 -14450:2:1345 -14451:2:1346 -14452:0:4365 -14453:2:1358 -14454:0:4365 -14455:2:1454 -14456:0:4365 -14457:3:4286 -14458:0:4365 -14459:2:1455 -14460:0:4365 -14461:3:4287 -14462:0:4365 -14463:2:1652 -14464:0:4365 -14465:2:1653 -14466:0:4365 -14467:2:1657 -14468:0:4365 -14469:2:1660 -14470:0:4365 -14471:3:4286 -14472:0:4365 -14473:2:1665 -14474:2:1669 -14475:2:1670 -14476:2:1678 -14477:2:1679 -14478:2:1683 -14479:2:1684 -14480:2:1678 -14481:2:1679 -14482:2:1680 -14483:2:1692 -14484:2:1697 -14485:2:1701 -14486:2:1702 -14487:2:1709 -14488:2:1710 -14489:2:1721 -14490:2:1722 -14491:2:1723 -14492:2:1721 -14493:2:1722 -14494:2:1723 -14495:2:1734 -14496:2:1739 -14497:2:1740 -14498:0:4365 -14499:3:4287 -14500:0:4365 -14501:2:1752 -14502:0:4365 -14503:3:4286 -14504:0:4365 -14505:2:1754 -14506:0:4365 -14507:3:4287 -14508:0:4365 -14509:2:1755 -14510:2:1759 -14511:2:1760 -14512:2:1768 -14513:2:1769 -14514:2:1773 -14515:2:1774 -14516:2:1768 -14517:2:1769 -14518:2:1773 -14519:2:1774 -14520:2:1782 -14521:2:1787 -14522:2:1791 -14523:2:1792 -14524:2:1799 -14525:2:1800 -14526:2:1811 -14527:2:1812 -14528:2:1813 -14529:2:1811 -14530:2:1812 -14531:2:1813 -14532:2:1824 -14533:2:1829 -14534:2:1830 -14535:0:4365 -14536:2:1842 -14537:0:4365 -14538:3:4286 -14539:0:4365 -14540:2:1844 -14541:0:4365 -14542:3:4287 -14543:0:4365 -14544:2:1845 -14545:2:1849 -14546:2:1850 -14547:2:1858 -14548:2:1859 -14549:2:1863 -14550:2:1864 -14551:2:1858 -14552:2:1859 -14553:2:1863 -14554:2:1864 -14555:2:1872 -14556:2:1877 -14557:2:1881 -14558:2:1882 -14559:2:1889 -14560:2:1890 -14561:2:1901 -14562:2:1902 -14563:2:1903 -14564:2:1901 -14565:2:1902 -14566:2:1903 -14567:2:1914 -14568:2:1919 -14569:2:1920 -14570:0:4365 -14571:2:1932 -14572:0:4365 -14573:3:4286 -14574:0:4365 -14575:2:1934 -14576:0:4365 -14577:3:4287 -14578:0:4365 -14579:2:1935 -14580:0:4365 -14581:2:1936 -14582:0:4365 -14583:2:2129 -14584:0:4365 -14585:2:2130 -14586:0:4365 -14587:2:2134 -14588:0:4365 -14589:3:4286 -14590:0:4365 -14591:2:2136 -14592:0:4365 -14593:3:4287 -14594:0:4365 -14595:2:2137 -14596:2:2141 -14597:2:2142 -14598:2:2150 -14599:2:2151 -14600:2:2155 -14601:2:2156 -14602:2:2150 -14603:2:2151 -14604:2:2155 -14605:2:2156 -14606:2:2164 -14607:2:2169 -14608:2:2173 -14609:2:2174 -14610:2:2181 -14611:2:2182 -14612:2:2193 -14613:2:2194 -14614:2:2195 -14615:2:2193 -14616:2:2194 -14617:2:2195 -14618:2:2206 -14619:2:2211 -14620:2:2212 -14621:0:4365 -14622:2:2224 -14623:0:4365 -14624:3:4286 -14625:0:4365 -14626:2:2226 -14627:0:4365 -14628:3:4287 -14629:0:4365 -14630:2:1936 -14631:0:4365 -14632:2:2129 -14633:0:4365 -14634:2:2130 -14635:0:4365 -14636:2:2134 -14637:0:4365 -14638:3:4286 -14639:0:4365 -14640:2:2136 -14641:0:4365 -14642:3:4287 -14643:0:4365 -14644:2:2137 -14645:2:2141 -14646:2:2142 -14647:2:2150 -14648:2:2151 -14649:2:2155 -14650:2:2156 -14651:2:2150 -14652:2:2151 -14653:2:2152 -14654:2:2164 -14655:2:2169 -14656:2:2173 -14657:2:2174 -14658:2:2181 -14659:2:2182 -14660:2:2193 -14661:2:2194 -14662:2:2195 -14663:2:2193 -14664:2:2194 -14665:2:2195 -14666:2:2206 -14667:2:2211 -14668:2:2212 -14669:0:4365 -14670:2:2224 -14671:0:4365 -14672:3:4286 -14673:0:4365 -14674:2:2226 -14675:0:4365 -14676:3:4287 -14677:0:4365 -14678:2:2230 -14679:0:4365 -14680:3:4286 -14681:0:4365 -14682:2:2235 -14683:2:2239 -14684:2:2240 -14685:2:2248 -14686:2:2249 -14687:2:2253 -14688:2:2254 -14689:2:2248 -14690:2:2249 -14691:2:2250 -14692:2:2262 -14693:2:2267 -14694:2:2271 -14695:2:2272 -14696:2:2279 -14697:2:2280 -14698:2:2291 -14699:2:2292 -14700:2:2293 -14701:2:2291 -14702:2:2292 -14703:2:2293 -14704:2:2304 -14705:2:2309 -14706:2:2310 -14707:0:4365 -14708:3:4287 -14709:0:4365 -14710:2:2322 -14711:0:4365 -14712:2:1169 -14713:0:4365 -14714:3:4286 -14715:0:4365 -14716:2:1170 -14717:0:4365 -14718:3:4287 -14719:0:4365 -14720:3:4288 -14721:0:4365 -14722:3:4294 -14723:0:4365 -14724:3:4295 -14725:0:4365 -14726:3:2338 -14727:0:4365 -14728:3:2339 -14729:3:2343 -14730:3:2344 -14731:3:2352 -14732:3:2353 -14733:3:2357 -14734:3:2358 -14735:3:2352 -14736:3:2353 -14737:3:2357 -14738:3:2358 -14739:3:2366 -14740:3:2371 -14741:3:2375 -14742:3:2376 -14743:3:2383 -14744:3:2384 -14745:3:2395 -14746:3:2396 -14747:3:2397 -14748:3:2395 -14749:3:2396 -14750:3:2397 -14751:3:2408 -14752:3:2413 -14753:3:2414 -14754:0:4365 -14755:3:2426 -14756:0:4365 -14757:3:2427 -14758:0:4365 -14759:2:1173 -14760:0:4365 -14761:3:2428 -14762:0:4365 -14763:2:1179 -14764:0:4365 -14765:2:1180 -14766:0:4365 -14767:3:2427 -14768:0:4365 -14769:2:1181 -14770:2:1185 -14771:2:1186 -14772:2:1194 -14773:2:1195 -14774:2:1199 -14775:2:1200 -14776:2:1194 -14777:2:1195 -14778:2:1199 -14779:2:1200 -14780:2:1208 -14781:2:1213 -14782:2:1217 -14783:2:1218 -14784:2:1225 -14785:2:1226 -14786:2:1237 -14787:2:1238 -14788:2:1239 -14789:2:1237 -14790:2:1238 -14791:2:1239 -14792:2:1250 -14793:2:1255 -14794:2:1256 -14795:0:4365 -14796:3:2428 -14797:0:4365 -14798:2:1268 -14799:0:4365 -14800:3:2427 -14801:0:4365 -14802:2:1270 -14803:0:4365 -14804:3:2428 -14805:0:4365 -14806:2:1271 -14807:2:1275 -14808:2:1276 -14809:2:1284 -14810:2:1285 -14811:2:1289 -14812:2:1290 -14813:2:1284 -14814:2:1285 -14815:2:1289 -14816:2:1290 -14817:2:1298 -14818:2:1303 -14819:2:1307 -14820:2:1308 -14821:2:1315 -14822:2:1316 -14823:2:1327 -14824:2:1328 -14825:2:1329 -14826:2:1327 -14827:2:1328 -14828:2:1329 -14829:2:1340 -14830:2:1345 -14831:2:1346 -14832:0:4365 -14833:2:1358 -14834:0:4365 -14835:2:1360 -14836:0:4365 -14837:3:2427 -14838:0:4365 -14839:2:1361 -14840:0:4365 -14841:3:2428 -14842:0:4365 -14843:2:1362 -14844:2:1366 -14845:2:1367 -14846:2:1375 -14847:2:1376 -14848:2:1380 -14849:2:1381 -14850:2:1375 -14851:2:1376 -14852:2:1380 -14853:2:1381 -14854:2:1389 -14855:2:1394 -14856:2:1398 -14857:2:1399 -14858:2:1406 -14859:2:1407 -14860:2:1418 -14861:2:1419 -14862:2:1420 -14863:2:1418 -14864:2:1419 -14865:2:1420 -14866:2:1431 -14867:2:1436 -14868:2:1437 -14869:0:4365 -14870:2:1449 -14871:0:4365 -14872:3:2427 -14873:0:4365 -14874:2:1451 -14875:0:4365 -14876:3:2428 -14877:0:4365 -14878:2:1652 -14879:0:4365 -14880:2:1653 -14881:0:4365 -14882:2:1657 -14883:0:4365 -14884:2:1180 -14885:0:4365 -14886:3:2427 -14887:0:4365 -14888:2:1181 -14889:2:1185 -14890:2:1186 -14891:2:1194 -14892:2:1195 -14893:2:1199 -14894:2:1200 -14895:2:1194 -14896:2:1195 -14897:2:1196 -14898:2:1208 -14899:2:1213 -14900:2:1217 -14901:2:1218 -14902:2:1225 -14903:2:1226 -14904:2:1237 -14905:2:1238 -14906:2:1239 -14907:2:1237 -14908:2:1238 -14909:2:1239 -14910:2:1250 -14911:2:1255 -14912:2:1256 -14913:0:4365 -14914:3:2428 -14915:0:4365 -14916:2:1268 -14917:0:4365 -14918:3:2427 -14919:0:4365 -14920:2:1270 -14921:0:4365 -14922:3:2428 -14923:0:4365 -14924:2:1271 -14925:2:1275 -14926:2:1276 -14927:2:1284 -14928:2:1285 -14929:2:1289 -14930:2:1290 -14931:2:1284 -14932:2:1285 -14933:2:1289 -14934:2:1290 -14935:2:1298 -14936:2:1303 -14937:2:1307 -14938:2:1308 -14939:2:1315 -14940:2:1316 -14941:2:1327 -14942:2:1328 -14943:2:1329 -14944:2:1327 -14945:2:1328 -14946:2:1329 -14947:2:1340 -14948:2:1345 -14949:2:1346 -14950:0:4365 -14951:2:1358 -14952:0:4365 -14953:2:1454 -14954:0:4365 -14955:3:2427 -14956:0:4365 -14957:2:1455 -14958:0:4365 -14959:3:2428 -14960:0:4365 -14961:2:1652 -14962:0:4365 -14963:2:1653 -14964:0:4365 -14965:2:1657 -14966:0:4365 -14967:2:1660 -14968:0:4365 -14969:3:2427 -14970:0:4365 -14971:2:1665 -14972:2:1669 -14973:2:1670 -14974:2:1678 -14975:2:1679 -14976:2:1683 -14977:2:1684 -14978:2:1678 -14979:2:1679 -14980:2:1680 -14981:2:1692 -14982:2:1697 -14983:2:1701 -14984:2:1702 -14985:2:1709 -14986:2:1710 -14987:2:1721 -14988:2:1722 -14989:2:1723 -14990:2:1721 -14991:2:1722 -14992:2:1723 -14993:2:1734 -14994:2:1739 -14995:2:1740 -14996:0:4365 -14997:3:2428 -14998:0:4365 -14999:2:1752 -15000:0:4365 -15001:3:2427 -15002:0:4365 -15003:2:1754 -15004:0:4365 -15005:3:2428 -15006:0:4365 -15007:2:1755 -15008:2:1759 -15009:2:1760 -15010:2:1768 -15011:2:1769 -15012:2:1773 -15013:2:1774 -15014:2:1768 -15015:2:1769 -15016:2:1773 -15017:2:1774 -15018:2:1782 -15019:2:1787 -15020:2:1791 -15021:2:1792 -15022:2:1799 -15023:2:1800 -15024:2:1811 -15025:2:1812 -15026:2:1813 -15027:2:1811 -15028:2:1812 -15029:2:1813 -15030:2:1824 -15031:2:1829 -15032:2:1830 -15033:0:4365 -15034:2:1842 -15035:0:4365 -15036:3:2427 -15037:0:4365 -15038:2:1844 -15039:0:4363 -15040:3:2428 -15041:0:4369 diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_nested.define b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_nested.define deleted file mode 100644 index 0fb59bd..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_nested.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_NEST_LEVEL 2 diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_nested.log b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_nested.log deleted file mode 100644 index d503334..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_nested.log +++ /dev/null @@ -1,20 +0,0 @@ -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_nested.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 742) -Depth= 3880 States= 1e+06 Transitions= 1.18e+07 Memory= 527.190 t= 9.48 R= 1e+05 -Depth= 3880 States= 2e+06 Transitions= 2.39e+07 Memory= 588.225 t= 19.6 R= 1e+05 -Depth= 3880 States= 3e+06 Transitions= 3.61e+07 Memory= 649.260 t= 30.3 R= 1e+05 diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_nested.spin.input b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_nested.spin.input deleted file mode 100644 index c94928c..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_nested.spin.input +++ /dev/null @@ -1,696 +0,0 @@ -#define READER_NEST_LEVEL 1 - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE -#define get_pid() ((_pid < 1) -> 0 : 1) -#elif defined(TEST_SIGNAL_ON_READ) -#define get_pid() ((_pid < 2) -> 0 : 1) -#else -#define get_pid() (_pid) -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - dispatch_sighand_read_exec(); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - dispatch_sighand_read_exec(); - data_access[get_readerid()] = 1; - ooo_mem(i); - dispatch_sighand_read_exec(); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - if - :: get_readerid() == 0 -> -progress_reader: - skip; - fi; -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - if - :: get_readerid() == 0 -> -progress_reader: - skip; - fi; -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_nested.spin.input.trail b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_nested.spin.input.trail deleted file mode 100644 index 6f29ad2..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_nested.spin.input.trail +++ /dev/null @@ -1,11161 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4365 -2:4:4317 -3:4:4320 -4:4:4320 -5:4:4320 -6:4:4323 -7:4:4331 -8:4:4331 -9:4:4331 -10:4:4334 -11:4:4340 -12:4:4344 -13:4:4344 -14:4:4344 -15:4:4347 -16:4:4340 -17:4:4344 -18:4:4344 -19:4:4344 -20:4:4347 -21:4:4355 -22:4:4359 -23:4:4360 -24:0:4365 -25:4:4362 -26:0:4365 -27:3:2331 -28:0:4365 -29:3:2337 -30:0:4365 -31:3:2338 -32:0:4365 -33:3:2339 -34:3:2343 -35:3:2344 -36:3:2352 -37:3:2353 -38:3:2357 -39:3:2358 -40:3:2352 -41:3:2353 -42:3:2357 -43:3:2358 -44:3:2366 -45:3:2371 -46:3:2375 -47:3:2376 -48:3:2383 -49:3:2384 -50:3:2395 -51:3:2396 -52:3:2397 -53:3:2395 -54:3:2396 -55:3:2397 -56:3:2408 -57:3:2413 -58:3:2414 -59:0:4365 -60:3:2426 -61:0:4365 -62:3:2427 -63:0:4365 -64:2:1162 -65:0:4365 -66:3:2428 -67:0:4365 -68:2:1168 -69:0:4365 -70:2:1169 -71:0:4365 -72:3:2427 -73:0:4365 -74:2:1170 -75:0:4365 -76:3:2428 -77:0:4365 -78:3:2429 -79:0:4365 -80:3:2435 -81:3:2436 -82:0:4365 -83:3:2440 -84:3:2444 -85:3:2445 -86:3:2453 -87:3:2454 -88:3:2458 -89:3:2459 -90:3:2453 -91:3:2454 -92:3:2458 -93:3:2459 -94:3:2467 -95:3:2472 -96:3:2473 -97:3:2484 -98:3:2485 -99:3:2496 -100:3:2497 -101:3:2498 -102:3:2496 -103:3:2497 -104:3:2498 -105:3:2509 -106:3:2514 -107:3:2515 -108:0:4365 -109:3:2527 -110:0:4365 -111:3:2528 -112:0:4365 -113:2:1173 -114:0:4365 -115:3:2529 -116:0:4365 -117:2:1179 -118:0:4365 -119:2:1180 -120:0:4365 -121:3:2528 -122:0:4365 -123:2:1181 -124:2:1185 -125:2:1186 -126:2:1194 -127:2:1195 -128:2:1199 -129:2:1200 -130:2:1194 -131:2:1195 -132:2:1199 -133:2:1200 -134:2:1208 -135:2:1213 -136:2:1217 -137:2:1218 -138:2:1225 -139:2:1226 -140:2:1237 -141:2:1238 -142:2:1239 -143:2:1237 -144:2:1238 -145:2:1239 -146:2:1250 -147:2:1255 -148:2:1256 -149:0:4365 -150:3:2529 -151:0:4365 -152:2:1268 -153:0:4365 -154:3:2528 -155:0:4365 -156:2:1270 -157:0:4365 -158:3:2529 -159:0:4365 -160:2:1271 -161:2:1275 -162:2:1276 -163:2:1284 -164:2:1285 -165:2:1289 -166:2:1290 -167:2:1284 -168:2:1285 -169:2:1289 -170:2:1290 -171:2:1298 -172:2:1303 -173:2:1307 -174:2:1308 -175:2:1315 -176:2:1316 -177:2:1327 -178:2:1328 -179:2:1329 -180:2:1327 -181:2:1328 -182:2:1329 -183:2:1340 -184:2:1345 -185:2:1346 -186:0:4365 -187:2:1358 -188:0:4365 -189:2:1360 -190:0:4365 -191:3:2528 -192:0:4365 -193:2:1361 -194:0:4365 -195:3:2529 -196:0:4365 -197:2:1362 -198:2:1366 -199:2:1367 -200:2:1375 -201:2:1376 -202:2:1380 -203:2:1381 -204:2:1375 -205:2:1376 -206:2:1380 -207:2:1381 -208:2:1389 -209:2:1394 -210:2:1398 -211:2:1399 -212:2:1406 -213:2:1407 -214:2:1418 -215:2:1419 -216:2:1420 -217:2:1418 -218:2:1419 -219:2:1420 -220:2:1431 -221:2:1436 -222:2:1437 -223:0:4365 -224:2:1449 -225:0:4365 -226:3:2528 -227:0:4365 -228:2:1451 -229:0:4365 -230:3:2529 -231:0:4365 -232:2:1652 -233:0:4365 -234:2:1653 -235:0:4365 -236:2:1657 -237:0:4365 -238:2:1660 -239:0:4365 -240:3:2528 -241:0:4365 -242:2:1665 -243:2:1669 -244:2:1670 -245:2:1678 -246:2:1679 -247:2:1683 -248:2:1684 -249:2:1678 -250:2:1679 -251:2:1680 -252:2:1692 -253:2:1697 -254:2:1701 -255:2:1702 -256:2:1709 -257:2:1710 -258:2:1721 -259:2:1722 -260:2:1723 -261:2:1721 -262:2:1722 -263:2:1723 -264:2:1734 -265:2:1739 -266:2:1740 -267:0:4365 -268:3:2529 -269:0:4365 -270:2:1752 -271:0:4365 -272:3:2528 -273:0:4365 -274:2:1754 -275:0:4365 -276:3:2529 -277:0:4365 -278:2:1755 -279:2:1759 -280:2:1760 -281:2:1768 -282:2:1769 -283:2:1773 -284:2:1774 -285:2:1768 -286:2:1769 -287:2:1773 -288:2:1774 -289:2:1782 -290:2:1787 -291:2:1791 -292:2:1792 -293:2:1799 -294:2:1800 -295:2:1811 -296:2:1812 -297:2:1813 -298:2:1811 -299:2:1812 -300:2:1813 -301:2:1824 -302:2:1829 -303:2:1830 -304:0:4365 -305:2:1842 -306:0:4365 -307:3:2528 -308:0:4365 -309:2:1844 -310:0:4365 -311:3:2529 -312:0:4365 -313:2:1845 -314:2:1849 -315:2:1850 -316:2:1858 -317:2:1859 -318:2:1863 -319:2:1864 -320:2:1858 -321:2:1859 -322:2:1863 -323:2:1864 -324:2:1872 -325:2:1877 -326:2:1881 -327:2:1882 -328:2:1889 -329:2:1890 -330:2:1901 -331:2:1902 -332:2:1903 -333:2:1901 -334:2:1902 -335:2:1903 -336:2:1914 -337:2:1919 -338:2:1920 -339:0:4365 -340:2:1932 -341:0:4365 -342:3:2528 -343:0:4365 -344:2:1934 -345:0:4365 -346:3:2529 -347:0:4365 -348:2:1935 -349:0:4365 -350:2:1936 -351:0:4365 -352:2:2129 -353:0:4365 -354:2:2130 -355:0:4365 -356:2:2134 -357:0:4365 -358:3:2528 -359:0:4365 -360:2:2136 -361:0:4365 -362:3:2529 -363:0:4365 -364:2:2137 -365:2:2141 -366:2:2142 -367:2:2150 -368:2:2151 -369:2:2155 -370:2:2156 -371:2:2150 -372:2:2151 -373:2:2155 -374:2:2156 -375:2:2164 -376:2:2169 -377:2:2173 -378:2:2174 -379:2:2181 -380:2:2182 -381:2:2193 -382:2:2194 -383:2:2195 -384:2:2193 -385:2:2194 -386:2:2195 -387:2:2206 -388:2:2211 -389:2:2212 -390:0:4365 -391:2:2224 -392:0:4365 -393:3:2528 -394:0:4365 -395:2:2226 -396:0:4365 -397:3:2529 -398:0:4365 -399:2:2230 -400:0:4365 -401:3:2528 -402:0:4365 -403:2:2235 -404:2:2239 -405:2:2240 -406:2:2248 -407:2:2249 -408:2:2253 -409:2:2254 -410:2:2248 -411:2:2249 -412:2:2250 -413:2:2262 -414:2:2267 -415:2:2271 -416:2:2272 -417:2:2279 -418:2:2280 -419:2:2291 -420:2:2292 -421:2:2293 -422:2:2291 -423:2:2292 -424:2:2293 -425:2:2304 -426:2:2309 -427:2:2310 -428:0:4365 -429:3:2529 -430:0:4365 -431:2:2322 -432:0:4365 -433:2:1169 -434:0:4365 -435:3:2528 -436:0:4365 -437:2:1170 -438:0:4365 -439:3:2529 -440:0:4365 -441:3:2530 -442:0:4365 -443:3:2536 -444:0:4365 -445:3:2537 -446:0:4365 -447:3:2547 -448:0:4365 -449:3:2548 -450:0:4365 -451:3:2552 -452:3:2553 -453:3:2557 -454:3:2561 -455:3:2562 -456:3:2557 -457:3:2561 -458:3:2562 -459:3:2566 -460:3:2574 -461:3:2575 -462:3:2580 -463:3:2587 -464:3:2588 -465:3:2587 -466:3:2588 -467:3:2595 -468:3:2600 -469:0:4365 -470:3:2611 -471:0:4365 -472:3:2615 -473:3:2616 -474:3:2620 -475:3:2624 -476:3:2625 -477:3:2620 -478:3:2624 -479:3:2625 -480:3:2629 -481:3:2637 -482:3:2638 -483:3:2643 -484:3:2650 -485:3:2651 -486:3:2650 -487:3:2651 -488:3:2658 -489:3:2663 -490:0:4365 -491:3:2611 -492:0:4365 -493:3:2615 -494:3:2616 -495:3:2620 -496:3:2624 -497:3:2625 -498:3:2620 -499:3:2624 -500:3:2625 -501:3:2629 -502:3:2637 -503:3:2638 -504:3:2643 -505:3:2650 -506:3:2651 -507:3:2650 -508:3:2651 -509:3:2658 -510:3:2663 -511:0:4365 -512:3:2674 -513:0:4365 -514:3:2682 -515:3:2683 -516:3:2687 -517:3:2691 -518:3:2692 -519:3:2687 -520:3:2691 -521:3:2692 -522:3:2696 -523:3:2704 -524:3:2705 -525:3:2710 -526:3:2717 -527:3:2718 -528:3:2717 -529:3:2718 -530:3:2725 -531:3:2730 -532:0:4365 -533:3:2745 -534:0:4365 -535:3:2746 -536:0:4365 -537:2:1173 -538:0:4365 -539:3:2747 -540:0:4365 -541:2:1179 -542:0:4365 -543:2:1180 -544:0:4365 -545:3:2746 -546:0:4365 -547:2:1181 -548:2:1185 -549:2:1186 -550:2:1194 -551:2:1195 -552:2:1199 -553:2:1200 -554:2:1194 -555:2:1195 -556:2:1199 -557:2:1200 -558:2:1208 -559:2:1213 -560:2:1217 -561:2:1218 -562:2:1225 -563:2:1226 -564:2:1237 -565:2:1238 -566:2:1239 -567:2:1237 -568:2:1238 -569:2:1239 -570:2:1250 -571:2:1255 -572:2:1256 -573:0:4365 -574:3:2747 -575:0:4365 -576:2:1268 -577:0:4365 -578:3:2746 -579:0:4365 -580:2:1270 -581:0:4365 -582:3:2747 -583:0:4365 -584:2:1271 -585:2:1275 -586:2:1276 -587:2:1284 -588:2:1285 -589:2:1289 -590:2:1290 -591:2:1284 -592:2:1285 -593:2:1289 -594:2:1290 -595:2:1298 -596:2:1303 -597:2:1307 -598:2:1308 -599:2:1315 -600:2:1316 -601:2:1327 -602:2:1328 -603:2:1329 -604:2:1327 -605:2:1328 -606:2:1329 -607:2:1340 -608:2:1345 -609:2:1346 -610:0:4365 -611:2:1358 -612:0:4365 -613:2:1360 -614:0:4365 -615:3:2746 -616:0:4365 -617:2:1361 -618:0:4365 -619:3:2747 -620:0:4365 -621:2:1362 -622:2:1366 -623:2:1367 -624:2:1375 -625:2:1376 -626:2:1380 -627:2:1381 -628:2:1375 -629:2:1376 -630:2:1380 -631:2:1381 -632:2:1389 -633:2:1394 -634:2:1398 -635:2:1399 -636:2:1406 -637:2:1407 -638:2:1418 -639:2:1419 -640:2:1420 -641:2:1418 -642:2:1419 -643:2:1420 -644:2:1431 -645:2:1436 -646:2:1437 -647:0:4365 -648:2:1449 -649:0:4365 -650:3:2746 -651:0:4365 -652:2:1451 -653:0:4365 -654:3:2747 -655:0:4365 -656:2:1652 -657:0:4365 -658:2:1653 -659:0:4365 -660:2:1657 -661:0:4365 -662:2:1660 -663:0:4365 -664:3:2746 -665:0:4365 -666:2:1665 -667:2:1669 -668:2:1670 -669:2:1678 -670:2:1679 -671:2:1683 -672:2:1684 -673:2:1678 -674:2:1679 -675:2:1680 -676:2:1692 -677:2:1697 -678:2:1701 -679:2:1702 -680:2:1709 -681:2:1710 -682:2:1721 -683:2:1722 -684:2:1723 -685:2:1721 -686:2:1722 -687:2:1723 -688:2:1734 -689:2:1739 -690:2:1740 -691:0:4365 -692:3:2747 -693:0:4365 -694:2:1752 -695:0:4365 -696:3:2746 -697:0:4365 -698:2:1754 -699:0:4365 -700:3:2747 -701:0:4365 -702:2:1755 -703:2:1759 -704:2:1760 -705:2:1768 -706:2:1769 -707:2:1773 -708:2:1774 -709:2:1768 -710:2:1769 -711:2:1773 -712:2:1774 -713:2:1782 -714:2:1787 -715:2:1791 -716:2:1792 -717:2:1799 -718:2:1800 -719:2:1811 -720:2:1812 -721:2:1813 -722:2:1811 -723:2:1812 -724:2:1813 -725:2:1824 -726:2:1829 -727:2:1830 -728:0:4365 -729:2:1842 -730:0:4365 -731:3:2746 -732:0:4365 -733:2:1844 -734:0:4365 -735:3:2747 -736:0:4365 -737:2:1845 -738:2:1849 -739:2:1850 -740:2:1858 -741:2:1859 -742:2:1863 -743:2:1864 -744:2:1858 -745:2:1859 -746:2:1863 -747:2:1864 -748:2:1872 -749:2:1877 -750:2:1881 -751:2:1882 -752:2:1889 -753:2:1890 -754:2:1901 -755:2:1902 -756:2:1903 -757:2:1901 -758:2:1902 -759:2:1903 -760:2:1914 -761:2:1919 -762:2:1920 -763:0:4365 -764:2:1932 -765:0:4365 -766:3:2746 -767:0:4365 -768:2:1934 -769:0:4365 -770:3:2747 -771:0:4365 -772:2:1935 -773:0:4365 -774:2:1936 -775:0:4365 -776:2:2129 -777:0:4365 -778:2:2130 -779:0:4365 -780:2:2134 -781:0:4365 -782:3:2746 -783:0:4365 -784:2:2136 -785:0:4365 -786:3:2747 -787:0:4365 -788:2:2137 -789:2:2141 -790:2:2142 -791:2:2150 -792:2:2151 -793:2:2155 -794:2:2156 -795:2:2150 -796:2:2151 -797:2:2155 -798:2:2156 -799:2:2164 -800:2:2169 -801:2:2173 -802:2:2174 -803:2:2181 -804:2:2182 -805:2:2193 -806:2:2194 -807:2:2195 -808:2:2193 -809:2:2194 -810:2:2195 -811:2:2206 -812:2:2211 -813:2:2212 -814:0:4365 -815:2:2224 -816:0:4365 -817:3:2746 -818:0:4365 -819:2:2226 -820:0:4365 -821:3:2747 -822:0:4365 -823:2:2230 -824:0:4365 -825:3:2746 -826:0:4365 -827:2:2235 -828:2:2239 -829:2:2240 -830:2:2248 -831:2:2249 -832:2:2253 -833:2:2254 -834:2:2248 -835:2:2249 -836:2:2250 -837:2:2262 -838:2:2267 -839:2:2271 -840:2:2272 -841:2:2279 -842:2:2280 -843:2:2291 -844:2:2292 -845:2:2293 -846:2:2291 -847:2:2292 -848:2:2293 -849:2:2304 -850:2:2309 -851:2:2310 -852:0:4365 -853:3:2747 -854:0:4365 -855:2:2322 -856:0:4365 -857:2:1169 -858:0:4365 -859:3:2746 -860:0:4365 -861:2:1170 -862:0:4365 -863:3:2747 -864:0:4365 -865:3:2748 -866:0:4365 -867:3:2754 -868:0:4365 -869:3:2755 -870:3:2759 -871:3:2760 -872:3:2768 -873:3:2769 -874:3:2773 -875:3:2774 -876:3:2768 -877:3:2769 -878:3:2773 -879:3:2774 -880:3:2782 -881:3:2787 -882:3:2791 -883:3:2792 -884:3:2799 -885:3:2800 -886:3:2811 -887:3:2812 -888:3:2813 -889:3:2811 -890:3:2812 -891:3:2813 -892:3:2824 -893:3:2829 -894:3:2830 -895:0:4365 -896:3:2842 -897:0:4365 -898:3:2843 -899:0:4365 -900:2:1173 -901:0:4365 -902:3:2844 -903:0:4365 -904:2:1179 -905:0:4365 -906:2:1180 -907:0:4365 -908:3:2843 -909:0:4365 -910:2:1181 -911:2:1185 -912:2:1186 -913:2:1194 -914:2:1195 -915:2:1199 -916:2:1200 -917:2:1194 -918:2:1195 -919:2:1199 -920:2:1200 -921:2:1208 -922:2:1213 -923:2:1217 -924:2:1218 -925:2:1225 -926:2:1226 -927:2:1237 -928:2:1238 -929:2:1239 -930:2:1237 -931:2:1238 -932:2:1239 -933:2:1250 -934:2:1255 -935:2:1256 -936:0:4365 -937:3:2844 -938:0:4365 -939:2:1268 -940:0:4365 -941:3:2843 -942:0:4365 -943:2:1270 -944:0:4365 -945:3:2844 -946:0:4365 -947:2:1271 -948:2:1275 -949:2:1276 -950:2:1284 -951:2:1285 -952:2:1289 -953:2:1290 -954:2:1284 -955:2:1285 -956:2:1289 -957:2:1290 -958:2:1298 -959:2:1303 -960:2:1307 -961:2:1308 -962:2:1315 -963:2:1316 -964:2:1327 -965:2:1328 -966:2:1329 -967:2:1327 -968:2:1328 -969:2:1329 -970:2:1340 -971:2:1345 -972:2:1346 -973:0:4365 -974:2:1358 -975:0:4365 -976:2:1360 -977:0:4365 -978:3:2843 -979:0:4365 -980:2:1361 -981:0:4365 -982:3:2844 -983:0:4365 -984:2:1362 -985:2:1366 -986:2:1367 -987:2:1375 -988:2:1376 -989:2:1380 -990:2:1381 -991:2:1375 -992:2:1376 -993:2:1380 -994:2:1381 -995:2:1389 -996:2:1394 -997:2:1398 -998:2:1399 -999:2:1406 -1000:2:1407 -1001:2:1418 -1002:2:1419 -1003:2:1420 -1004:2:1418 -1005:2:1419 -1006:2:1420 -1007:2:1431 -1008:2:1436 -1009:2:1437 -1010:0:4365 -1011:2:1449 -1012:0:4365 -1013:3:2843 -1014:0:4365 -1015:2:1451 -1016:0:4365 -1017:3:2844 -1018:0:4365 -1019:2:1652 -1020:0:4365 -1021:2:1653 -1022:0:4365 -1023:2:1657 -1024:0:4365 -1025:2:1660 -1026:0:4365 -1027:3:2843 -1028:0:4365 -1029:2:1665 -1030:2:1669 -1031:2:1670 -1032:2:1678 -1033:2:1679 -1034:2:1683 -1035:2:1684 -1036:2:1678 -1037:2:1679 -1038:2:1680 -1039:2:1692 -1040:2:1697 -1041:2:1701 -1042:2:1702 -1043:2:1709 -1044:2:1710 -1045:2:1721 -1046:2:1722 -1047:2:1723 -1048:2:1721 -1049:2:1722 -1050:2:1723 -1051:2:1734 -1052:2:1739 -1053:2:1740 -1054:0:4365 -1055:3:2844 -1056:0:4365 -1057:2:1752 -1058:0:4365 -1059:3:2843 -1060:0:4365 -1061:2:1754 -1062:0:4365 -1063:3:2844 -1064:0:4365 -1065:2:1755 -1066:2:1759 -1067:2:1760 -1068:2:1768 -1069:2:1769 -1070:2:1773 -1071:2:1774 -1072:2:1768 -1073:2:1769 -1074:2:1773 -1075:2:1774 -1076:2:1782 -1077:2:1787 -1078:2:1791 -1079:2:1792 -1080:2:1799 -1081:2:1800 -1082:2:1811 -1083:2:1812 -1084:2:1813 -1085:2:1811 -1086:2:1812 -1087:2:1813 -1088:2:1824 -1089:2:1829 -1090:2:1830 -1091:0:4365 -1092:2:1842 -1093:0:4365 -1094:3:2843 -1095:0:4365 -1096:2:1844 -1097:0:4365 -1098:3:2844 -1099:0:4365 -1100:2:1845 -1101:2:1849 -1102:2:1850 -1103:2:1858 -1104:2:1859 -1105:2:1863 -1106:2:1864 -1107:2:1858 -1108:2:1859 -1109:2:1863 -1110:2:1864 -1111:2:1872 -1112:2:1877 -1113:2:1881 -1114:2:1882 -1115:2:1889 -1116:2:1890 -1117:2:1901 -1118:2:1902 -1119:2:1903 -1120:2:1901 -1121:2:1902 -1122:2:1903 -1123:2:1914 -1124:2:1919 -1125:2:1920 -1126:0:4365 -1127:2:1932 -1128:0:4365 -1129:3:2843 -1130:0:4365 -1131:2:1934 -1132:0:4365 -1133:3:2844 -1134:0:4365 -1135:2:1935 -1136:0:4365 -1137:2:1936 -1138:0:4365 -1139:2:2129 -1140:0:4365 -1141:2:2130 -1142:0:4365 -1143:2:2134 -1144:0:4365 -1145:3:2843 -1146:0:4365 -1147:2:2136 -1148:0:4365 -1149:3:2844 -1150:0:4365 -1151:2:2137 -1152:2:2141 -1153:2:2142 -1154:2:2150 -1155:2:2151 -1156:2:2155 -1157:2:2156 -1158:2:2150 -1159:2:2151 -1160:2:2155 -1161:2:2156 -1162:2:2164 -1163:2:2169 -1164:2:2173 -1165:2:2174 -1166:2:2181 -1167:2:2182 -1168:2:2193 -1169:2:2194 -1170:2:2195 -1171:2:2193 -1172:2:2194 -1173:2:2195 -1174:2:2206 -1175:2:2211 -1176:2:2212 -1177:0:4365 -1178:2:2224 -1179:0:4365 -1180:3:2843 -1181:0:4365 -1182:2:2226 -1183:0:4365 -1184:3:2844 -1185:0:4365 -1186:2:2230 -1187:0:4365 -1188:3:2843 -1189:0:4365 -1190:2:2235 -1191:2:2239 -1192:2:2240 -1193:2:2248 -1194:2:2249 -1195:2:2253 -1196:2:2254 -1197:2:2248 -1198:2:2249 -1199:2:2250 -1200:2:2262 -1201:2:2267 -1202:2:2271 -1203:2:2272 -1204:2:2279 -1205:2:2280 -1206:2:2291 -1207:2:2292 -1208:2:2293 -1209:2:2291 -1210:2:2292 -1211:2:2293 -1212:2:2304 -1213:2:2309 -1214:2:2310 -1215:0:4365 -1216:3:2844 -1217:0:4365 -1218:2:2322 -1219:0:4365 -1220:2:1169 -1221:0:4365 -1222:3:2843 -1223:0:4365 -1224:2:1170 -1225:0:4365 -1226:3:2844 -1227:0:4365 -1228:3:2845 -1229:0:4365 -1230:3:2851 -1231:0:4365 -1232:3:2854 -1233:3:2855 -1234:3:2867 -1235:3:2868 -1236:3:2872 -1237:3:2873 -1238:3:2867 -1239:3:2868 -1240:3:2872 -1241:3:2873 -1242:3:2881 -1243:3:2886 -1244:3:2890 -1245:3:2891 -1246:3:2898 -1247:3:2899 -1248:3:2910 -1249:3:2911 -1250:3:2912 -1251:3:2910 -1252:3:2911 -1253:3:2912 -1254:3:2923 -1255:3:2928 -1256:3:2929 -1257:0:4365 -1258:3:2941 -1259:0:4365 -1260:3:2942 -1261:0:4365 -1262:2:1173 -1263:0:4365 -1264:3:2943 -1265:0:4365 -1266:2:1179 -1267:0:4365 -1268:2:1180 -1269:0:4365 -1270:3:2942 -1271:0:4365 -1272:2:1181 -1273:2:1185 -1274:2:1186 -1275:2:1194 -1276:2:1195 -1277:2:1199 -1278:2:1200 -1279:2:1194 -1280:2:1195 -1281:2:1199 -1282:2:1200 -1283:2:1208 -1284:2:1213 -1285:2:1217 -1286:2:1218 -1287:2:1225 -1288:2:1226 -1289:2:1237 -1290:2:1238 -1291:2:1239 -1292:2:1237 -1293:2:1238 -1294:2:1239 -1295:2:1250 -1296:2:1255 -1297:2:1256 -1298:0:4365 -1299:3:2943 -1300:0:4365 -1301:2:1268 -1302:0:4365 -1303:3:2942 -1304:0:4365 -1305:2:1270 -1306:0:4365 -1307:3:2943 -1308:0:4365 -1309:2:1271 -1310:2:1275 -1311:2:1276 -1312:2:1284 -1313:2:1285 -1314:2:1289 -1315:2:1290 -1316:2:1284 -1317:2:1285 -1318:2:1289 -1319:2:1290 -1320:2:1298 -1321:2:1303 -1322:2:1307 -1323:2:1308 -1324:2:1315 -1325:2:1316 -1326:2:1327 -1327:2:1328 -1328:2:1329 -1329:2:1327 -1330:2:1328 -1331:2:1329 -1332:2:1340 -1333:2:1345 -1334:2:1346 -1335:0:4365 -1336:2:1358 -1337:0:4365 -1338:2:1360 -1339:0:4365 -1340:3:2942 -1341:0:4365 -1342:2:1361 -1343:0:4365 -1344:3:2943 -1345:0:4365 -1346:2:1362 -1347:2:1366 -1348:2:1367 -1349:2:1375 -1350:2:1376 -1351:2:1380 -1352:2:1381 -1353:2:1375 -1354:2:1376 -1355:2:1380 -1356:2:1381 -1357:2:1389 -1358:2:1394 -1359:2:1398 -1360:2:1399 -1361:2:1406 -1362:2:1407 -1363:2:1418 -1364:2:1419 -1365:2:1420 -1366:2:1418 -1367:2:1419 -1368:2:1420 -1369:2:1431 -1370:2:1436 -1371:2:1437 -1372:0:4365 -1373:2:1449 -1374:0:4365 -1375:3:2942 -1376:0:4365 -1377:2:1451 -1378:0:4365 -1379:3:2943 -1380:0:4365 -1381:2:1652 -1382:0:4365 -1383:2:1653 -1384:0:4365 -1385:2:1657 -1386:0:4365 -1387:2:1660 -1388:0:4365 -1389:3:2942 -1390:0:4365 -1391:2:1665 -1392:2:1669 -1393:2:1670 -1394:2:1678 -1395:2:1679 -1396:2:1683 -1397:2:1684 -1398:2:1678 -1399:2:1679 -1400:2:1680 -1401:2:1692 -1402:2:1697 -1403:2:1701 -1404:2:1702 -1405:2:1709 -1406:2:1710 -1407:2:1721 -1408:2:1722 -1409:2:1723 -1410:2:1721 -1411:2:1722 -1412:2:1723 -1413:2:1734 -1414:2:1739 -1415:2:1740 -1416:0:4365 -1417:3:2943 -1418:0:4365 -1419:2:1752 -1420:0:4365 -1421:3:2942 -1422:0:4365 -1423:2:1754 -1424:0:4365 -1425:3:2943 -1426:0:4365 -1427:2:1755 -1428:2:1759 -1429:2:1760 -1430:2:1768 -1431:2:1769 -1432:2:1773 -1433:2:1774 -1434:2:1768 -1435:2:1769 -1436:2:1773 -1437:2:1774 -1438:2:1782 -1439:2:1787 -1440:2:1791 -1441:2:1792 -1442:2:1799 -1443:2:1800 -1444:2:1811 -1445:2:1812 -1446:2:1813 -1447:2:1811 -1448:2:1812 -1449:2:1813 -1450:2:1824 -1451:2:1829 -1452:2:1830 -1453:0:4365 -1454:2:1842 -1455:0:4365 -1456:3:2942 -1457:0:4365 -1458:2:1844 -1459:0:4365 -1460:3:2943 -1461:0:4365 -1462:2:1845 -1463:2:1849 -1464:2:1850 -1465:2:1858 -1466:2:1859 -1467:2:1863 -1468:2:1864 -1469:2:1858 -1470:2:1859 -1471:2:1863 -1472:2:1864 -1473:2:1872 -1474:2:1877 -1475:2:1881 -1476:2:1882 -1477:2:1889 -1478:2:1890 -1479:2:1901 -1480:2:1902 -1481:2:1903 -1482:2:1901 -1483:2:1902 -1484:2:1903 -1485:2:1914 -1486:2:1919 -1487:2:1920 -1488:0:4365 -1489:2:1932 -1490:0:4365 -1491:3:2942 -1492:0:4365 -1493:2:1934 -1494:0:4365 -1495:3:2943 -1496:0:4365 -1497:2:1935 -1498:0:4365 -1499:2:1936 -1500:0:4365 -1501:2:2129 -1502:0:4365 -1503:2:2130 -1504:0:4365 -1505:2:2134 -1506:0:4365 -1507:3:2942 -1508:0:4365 -1509:2:2136 -1510:0:4365 -1511:3:2943 -1512:0:4365 -1513:2:2137 -1514:2:2141 -1515:2:2142 -1516:2:2150 -1517:2:2151 -1518:2:2155 -1519:2:2156 -1520:2:2150 -1521:2:2151 -1522:2:2155 -1523:2:2156 -1524:2:2164 -1525:2:2169 -1526:2:2173 -1527:2:2174 -1528:2:2181 -1529:2:2182 -1530:2:2193 -1531:2:2194 -1532:2:2195 -1533:2:2193 -1534:2:2194 -1535:2:2195 -1536:2:2206 -1537:2:2211 -1538:2:2212 -1539:0:4365 -1540:2:2224 -1541:0:4365 -1542:3:2942 -1543:0:4365 -1544:2:2226 -1545:0:4365 -1546:3:2943 -1547:0:4365 -1548:2:2230 -1549:0:4365 -1550:3:2942 -1551:0:4365 -1552:2:2235 -1553:2:2239 -1554:2:2240 -1555:2:2248 -1556:2:2249 -1557:2:2253 -1558:2:2254 -1559:2:2248 -1560:2:2249 -1561:2:2250 -1562:2:2262 -1563:2:2267 -1564:2:2271 -1565:2:2272 -1566:2:2279 -1567:2:2280 -1568:2:2291 -1569:2:2292 -1570:2:2293 -1571:2:2291 -1572:2:2292 -1573:2:2293 -1574:2:2304 -1575:2:2309 -1576:2:2310 -1577:0:4365 -1578:3:2943 -1579:0:4365 -1580:2:2322 -1581:0:4365 -1582:2:1169 -1583:0:4365 -1584:3:2942 -1585:0:4365 -1586:2:1170 -1587:0:4365 -1588:3:2943 -1589:0:4365 -1590:3:2944 -1591:0:4365 -1592:3:2950 -1593:0:4365 -1594:3:2951 -1595:0:4365 -1596:3:2952 -1597:0:4365 -1598:3:2953 -1599:0:4365 -1600:3:2954 -1601:3:2958 -1602:3:2959 -1603:3:2967 -1604:3:2968 -1605:3:2972 -1606:3:2973 -1607:3:2967 -1608:3:2968 -1609:3:2972 -1610:3:2973 -1611:3:2981 -1612:3:2986 -1613:3:2990 -1614:3:2991 -1615:3:2998 -1616:3:2999 -1617:3:3010 -1618:3:3011 -1619:3:3012 -1620:3:3010 -1621:3:3011 -1622:3:3012 -1623:3:3023 -1624:3:3028 -1625:3:3029 -1626:0:4365 -1627:3:3041 -1628:0:4365 -1629:3:3042 -1630:0:4365 -1631:2:1173 -1632:0:4365 -1633:3:3043 -1634:0:4365 -1635:2:1179 -1636:0:4365 -1637:2:1180 -1638:0:4365 -1639:3:3042 -1640:0:4365 -1641:2:1181 -1642:2:1185 -1643:2:1186 -1644:2:1194 -1645:2:1195 -1646:2:1199 -1647:2:1200 -1648:2:1194 -1649:2:1195 -1650:2:1199 -1651:2:1200 -1652:2:1208 -1653:2:1213 -1654:2:1217 -1655:2:1218 -1656:2:1225 -1657:2:1226 -1658:2:1237 -1659:2:1238 -1660:2:1239 -1661:2:1237 -1662:2:1238 -1663:2:1239 -1664:2:1250 -1665:2:1255 -1666:2:1256 -1667:0:4365 -1668:3:3043 -1669:0:4365 -1670:2:1268 -1671:0:4365 -1672:3:3042 -1673:0:4365 -1674:2:1270 -1675:0:4365 -1676:3:3043 -1677:0:4365 -1678:2:1271 -1679:2:1275 -1680:2:1276 -1681:2:1284 -1682:2:1285 -1683:2:1289 -1684:2:1290 -1685:2:1284 -1686:2:1285 -1687:2:1289 -1688:2:1290 -1689:2:1298 -1690:2:1303 -1691:2:1307 -1692:2:1308 -1693:2:1315 -1694:2:1316 -1695:2:1327 -1696:2:1328 -1697:2:1329 -1698:2:1327 -1699:2:1328 -1700:2:1329 -1701:2:1340 -1702:2:1345 -1703:2:1346 -1704:0:4365 -1705:2:1358 -1706:0:4365 -1707:2:1360 -1708:0:4365 -1709:3:3042 -1710:0:4365 -1711:2:1361 -1712:0:4365 -1713:3:3043 -1714:0:4365 -1715:2:1362 -1716:2:1366 -1717:2:1367 -1718:2:1375 -1719:2:1376 -1720:2:1380 -1721:2:1381 -1722:2:1375 -1723:2:1376 -1724:2:1380 -1725:2:1381 -1726:2:1389 -1727:2:1394 -1728:2:1398 -1729:2:1399 -1730:2:1406 -1731:2:1407 -1732:2:1418 -1733:2:1419 -1734:2:1420 -1735:2:1418 -1736:2:1419 -1737:2:1420 -1738:2:1431 -1739:2:1436 -1740:2:1437 -1741:0:4365 -1742:2:1449 -1743:0:4365 -1744:3:3042 -1745:0:4365 -1746:2:1451 -1747:0:4365 -1748:3:3043 -1749:0:4365 -1750:2:1652 -1751:0:4365 -1752:2:1653 -1753:0:4365 -1754:2:1657 -1755:0:4365 -1756:2:1660 -1757:0:4365 -1758:3:3042 -1759:0:4365 -1760:2:1665 -1761:2:1669 -1762:2:1670 -1763:2:1678 -1764:2:1679 -1765:2:1683 -1766:2:1684 -1767:2:1678 -1768:2:1679 -1769:2:1680 -1770:2:1692 -1771:2:1697 -1772:2:1701 -1773:2:1702 -1774:2:1709 -1775:2:1710 -1776:2:1721 -1777:2:1722 -1778:2:1723 -1779:2:1721 -1780:2:1722 -1781:2:1723 -1782:2:1734 -1783:2:1739 -1784:2:1740 -1785:0:4365 -1786:3:3043 -1787:0:4365 -1788:2:1752 -1789:0:4365 -1790:3:3042 -1791:0:4365 -1792:2:1754 -1793:0:4365 -1794:3:3043 -1795:0:4365 -1796:2:1755 -1797:2:1759 -1798:2:1760 -1799:2:1768 -1800:2:1769 -1801:2:1773 -1802:2:1774 -1803:2:1768 -1804:2:1769 -1805:2:1773 -1806:2:1774 -1807:2:1782 -1808:2:1787 -1809:2:1791 -1810:2:1792 -1811:2:1799 -1812:2:1800 -1813:2:1811 -1814:2:1812 -1815:2:1813 -1816:2:1811 -1817:2:1812 -1818:2:1813 -1819:2:1824 -1820:2:1829 -1821:2:1830 -1822:0:4365 -1823:2:1842 -1824:0:4365 -1825:3:3042 -1826:0:4365 -1827:2:1844 -1828:0:4365 -1829:3:3043 -1830:0:4365 -1831:2:1845 -1832:2:1849 -1833:2:1850 -1834:2:1858 -1835:2:1859 -1836:2:1863 -1837:2:1864 -1838:2:1858 -1839:2:1859 -1840:2:1863 -1841:2:1864 -1842:2:1872 -1843:2:1877 -1844:2:1881 -1845:2:1882 -1846:2:1889 -1847:2:1890 -1848:2:1901 -1849:2:1902 -1850:2:1903 -1851:2:1901 -1852:2:1902 -1853:2:1903 -1854:2:1914 -1855:2:1919 -1856:2:1920 -1857:0:4365 -1858:2:1932 -1859:0:4365 -1860:3:3042 -1861:0:4365 -1862:2:1934 -1863:0:4365 -1864:3:3043 -1865:0:4365 -1866:2:1935 -1867:0:4365 -1868:2:1936 -1869:0:4365 -1870:2:2129 -1871:0:4365 -1872:2:2130 -1873:0:4365 -1874:2:2134 -1875:0:4365 -1876:3:3042 -1877:0:4365 -1878:2:2136 -1879:0:4365 -1880:3:3043 -1881:0:4365 -1882:2:2137 -1883:2:2141 -1884:2:2142 -1885:2:2150 -1886:2:2151 -1887:2:2155 -1888:2:2156 -1889:2:2150 -1890:2:2151 -1891:2:2155 -1892:2:2156 -1893:2:2164 -1894:2:2169 -1895:2:2173 -1896:2:2174 -1897:2:2181 -1898:2:2182 -1899:2:2193 -1900:2:2194 -1901:2:2195 -1902:2:2193 -1903:2:2194 -1904:2:2195 -1905:2:2206 -1906:2:2211 -1907:2:2212 -1908:0:4365 -1909:2:2224 -1910:0:4365 -1911:3:3042 -1912:0:4365 -1913:2:2226 -1914:0:4365 -1915:3:3043 -1916:0:4365 -1917:2:2230 -1918:0:4365 -1919:3:3042 -1920:0:4365 -1921:2:2235 -1922:2:2239 -1923:2:2240 -1924:2:2248 -1925:2:2249 -1926:2:2253 -1927:2:2254 -1928:2:2248 -1929:2:2249 -1930:2:2250 -1931:2:2262 -1932:2:2267 -1933:2:2271 -1934:2:2272 -1935:2:2279 -1936:2:2280 -1937:2:2291 -1938:2:2292 -1939:2:2293 -1940:2:2291 -1941:2:2292 -1942:2:2293 -1943:2:2304 -1944:2:2309 -1945:2:2310 -1946:0:4365 -1947:3:3043 -1948:0:4365 -1949:2:2322 -1950:0:4365 -1951:2:1169 -1952:0:4365 -1953:3:3042 -1954:0:4365 -1955:2:1170 -1956:0:4365 -1957:3:3043 -1958:0:4365 -1959:3:3044 -1960:0:4365 -1961:3:3257 -1962:0:4365 -1963:3:3265 -1964:0:4365 -1965:3:3266 -1966:3:3270 -1967:3:3271 -1968:3:3279 -1969:3:3280 -1970:3:3284 -1971:3:3285 -1972:3:3279 -1973:3:3280 -1974:3:3284 -1975:3:3285 -1976:3:3293 -1977:3:3298 -1978:3:3302 -1979:3:3303 -1980:3:3310 -1981:3:3311 -1982:3:3322 -1983:3:3323 -1984:3:3324 -1985:3:3322 -1986:3:3323 -1987:3:3324 -1988:3:3335 -1989:3:3340 -1990:3:3341 -1991:0:4365 -1992:3:3353 -1993:0:4365 -1994:3:3354 -1995:0:4365 -1996:2:1173 -1997:0:4365 -1998:3:3355 -1999:0:4365 -2000:2:1179 -2001:0:4365 -2002:2:1180 -2003:0:4365 -2004:3:3354 -2005:0:4365 -2006:2:1181 -2007:2:1185 -2008:2:1186 -2009:2:1194 -2010:2:1195 -2011:2:1199 -2012:2:1200 -2013:2:1194 -2014:2:1195 -2015:2:1199 -2016:2:1200 -2017:2:1208 -2018:2:1213 -2019:2:1217 -2020:2:1218 -2021:2:1225 -2022:2:1226 -2023:2:1237 -2024:2:1238 -2025:2:1239 -2026:2:1237 -2027:2:1238 -2028:2:1239 -2029:2:1250 -2030:2:1255 -2031:2:1256 -2032:0:4365 -2033:3:3355 -2034:0:4365 -2035:2:1268 -2036:0:4365 -2037:3:3354 -2038:0:4365 -2039:2:1270 -2040:0:4365 -2041:3:3355 -2042:0:4365 -2043:2:1271 -2044:2:1275 -2045:2:1276 -2046:2:1284 -2047:2:1285 -2048:2:1289 -2049:2:1290 -2050:2:1284 -2051:2:1285 -2052:2:1289 -2053:2:1290 -2054:2:1298 -2055:2:1303 -2056:2:1307 -2057:2:1308 -2058:2:1315 -2059:2:1316 -2060:2:1327 -2061:2:1328 -2062:2:1329 -2063:2:1327 -2064:2:1328 -2065:2:1329 -2066:2:1340 -2067:2:1345 -2068:2:1346 -2069:0:4365 -2070:2:1358 -2071:0:4365 -2072:2:1360 -2073:0:4365 -2074:3:3354 -2075:0:4365 -2076:2:1361 -2077:0:4365 -2078:3:3355 -2079:0:4365 -2080:2:1362 -2081:2:1366 -2082:2:1367 -2083:2:1375 -2084:2:1376 -2085:2:1380 -2086:2:1381 -2087:2:1375 -2088:2:1376 -2089:2:1380 -2090:2:1381 -2091:2:1389 -2092:2:1394 -2093:2:1398 -2094:2:1399 -2095:2:1406 -2096:2:1407 -2097:2:1418 -2098:2:1419 -2099:2:1420 -2100:2:1418 -2101:2:1419 -2102:2:1420 -2103:2:1431 -2104:2:1436 -2105:2:1437 -2106:0:4365 -2107:2:1449 -2108:0:4365 -2109:3:3354 -2110:0:4365 -2111:2:1451 -2112:0:4365 -2113:3:3355 -2114:0:4365 -2115:2:1652 -2116:0:4365 -2117:2:1653 -2118:0:4365 -2119:2:1657 -2120:0:4365 -2121:2:1660 -2122:0:4365 -2123:3:3354 -2124:0:4365 -2125:2:1665 -2126:2:1669 -2127:2:1670 -2128:2:1678 -2129:2:1679 -2130:2:1683 -2131:2:1684 -2132:2:1678 -2133:2:1679 -2134:2:1680 -2135:2:1692 -2136:2:1697 -2137:2:1701 -2138:2:1702 -2139:2:1709 -2140:2:1710 -2141:2:1721 -2142:2:1722 -2143:2:1723 -2144:2:1721 -2145:2:1722 -2146:2:1723 -2147:2:1734 -2148:2:1739 -2149:2:1740 -2150:0:4365 -2151:3:3355 -2152:0:4365 -2153:2:1752 -2154:0:4365 -2155:3:3354 -2156:0:4365 -2157:2:1754 -2158:0:4365 -2159:3:3355 -2160:0:4365 -2161:2:1755 -2162:2:1759 -2163:2:1760 -2164:2:1768 -2165:2:1769 -2166:2:1773 -2167:2:1774 -2168:2:1768 -2169:2:1769 -2170:2:1773 -2171:2:1774 -2172:2:1782 -2173:2:1787 -2174:2:1791 -2175:2:1792 -2176:2:1799 -2177:2:1800 -2178:2:1811 -2179:2:1812 -2180:2:1813 -2181:2:1811 -2182:2:1812 -2183:2:1813 -2184:2:1824 -2185:2:1829 -2186:2:1830 -2187:0:4365 -2188:2:1842 -2189:0:4365 -2190:3:3354 -2191:0:4365 -2192:2:1844 -2193:0:4365 -2194:3:3355 -2195:0:4365 -2196:2:1845 -2197:2:1849 -2198:2:1850 -2199:2:1858 -2200:2:1859 -2201:2:1863 -2202:2:1864 -2203:2:1858 -2204:2:1859 -2205:2:1863 -2206:2:1864 -2207:2:1872 -2208:2:1877 -2209:2:1881 -2210:2:1882 -2211:2:1889 -2212:2:1890 -2213:2:1901 -2214:2:1902 -2215:2:1903 -2216:2:1901 -2217:2:1902 -2218:2:1903 -2219:2:1914 -2220:2:1919 -2221:2:1920 -2222:0:4365 -2223:2:1932 -2224:0:4365 -2225:3:3354 -2226:0:4365 -2227:2:1934 -2228:0:4365 -2229:3:3355 -2230:0:4365 -2231:2:1935 -2232:0:4365 -2233:2:1936 -2234:0:4365 -2235:2:2129 -2236:0:4365 -2237:2:2130 -2238:0:4365 -2239:2:2134 -2240:0:4365 -2241:3:3354 -2242:0:4365 -2243:2:2136 -2244:0:4365 -2245:3:3355 -2246:0:4365 -2247:2:2137 -2248:2:2141 -2249:2:2142 -2250:2:2150 -2251:2:2151 -2252:2:2155 -2253:2:2156 -2254:2:2150 -2255:2:2151 -2256:2:2155 -2257:2:2156 -2258:2:2164 -2259:2:2169 -2260:2:2173 -2261:2:2174 -2262:2:2181 -2263:2:2182 -2264:2:2193 -2265:2:2194 -2266:2:2195 -2267:2:2193 -2268:2:2194 -2269:2:2195 -2270:2:2206 -2271:2:2211 -2272:2:2212 -2273:0:4365 -2274:2:2224 -2275:0:4365 -2276:3:3354 -2277:0:4365 -2278:2:2226 -2279:0:4365 -2280:3:3355 -2281:0:4365 -2282:2:2230 -2283:0:4365 -2284:3:3354 -2285:0:4365 -2286:2:2235 -2287:2:2239 -2288:2:2240 -2289:2:2248 -2290:2:2249 -2291:2:2253 -2292:2:2254 -2293:2:2248 -2294:2:2249 -2295:2:2250 -2296:2:2262 -2297:2:2267 -2298:2:2271 -2299:2:2272 -2300:2:2279 -2301:2:2280 -2302:2:2291 -2303:2:2292 -2304:2:2293 -2305:2:2291 -2306:2:2292 -2307:2:2293 -2308:2:2304 -2309:2:2309 -2310:2:2310 -2311:0:4365 -2312:3:3355 -2313:0:4365 -2314:2:2322 -2315:0:4365 -2316:2:1169 -2317:0:4365 -2318:3:3354 -2319:0:4365 -2320:2:1170 -2321:0:4365 -2322:3:3355 -2323:0:4365 -2324:3:3356 -2325:0:4365 -2326:3:3366 -2327:0:4365 -2328:3:2951 -2329:0:4365 -2330:3:2952 -2331:0:4365 -2332:3:2953 -2333:0:4365 -2334:3:2954 -2335:3:2958 -2336:3:2959 -2337:3:2967 -2338:3:2968 -2339:3:2972 -2340:3:2973 -2341:3:2967 -2342:3:2968 -2343:3:2972 -2344:3:2973 -2345:3:2981 -2346:3:2986 -2347:3:2990 -2348:3:2991 -2349:3:2998 -2350:3:2999 -2351:3:3010 -2352:3:3011 -2353:3:3012 -2354:3:3010 -2355:3:3011 -2356:3:3012 -2357:3:3023 -2358:3:3028 -2359:3:3029 -2360:0:4365 -2361:3:3041 -2362:0:4365 -2363:3:3042 -2364:0:4365 -2365:2:1173 -2366:0:4365 -2367:3:3043 -2368:0:4365 -2369:2:1179 -2370:0:4365 -2371:2:1180 -2372:0:4365 -2373:3:3042 -2374:0:4365 -2375:2:1181 -2376:2:1185 -2377:2:1186 -2378:2:1194 -2379:2:1195 -2380:2:1199 -2381:2:1200 -2382:2:1194 -2383:2:1195 -2384:2:1199 -2385:2:1200 -2386:2:1208 -2387:2:1213 -2388:2:1217 -2389:2:1218 -2390:2:1225 -2391:2:1226 -2392:2:1237 -2393:2:1238 -2394:2:1239 -2395:2:1237 -2396:2:1238 -2397:2:1239 -2398:2:1250 -2399:2:1255 -2400:2:1256 -2401:0:4365 -2402:3:3043 -2403:0:4365 -2404:2:1268 -2405:0:4365 -2406:3:3042 -2407:0:4365 -2408:2:1270 -2409:0:4365 -2410:3:3043 -2411:0:4365 -2412:2:1271 -2413:2:1275 -2414:2:1276 -2415:2:1284 -2416:2:1285 -2417:2:1289 -2418:2:1290 -2419:2:1284 -2420:2:1285 -2421:2:1289 -2422:2:1290 -2423:2:1298 -2424:2:1303 -2425:2:1307 -2426:2:1308 -2427:2:1315 -2428:2:1316 -2429:2:1327 -2430:2:1328 -2431:2:1329 -2432:2:1327 -2433:2:1328 -2434:2:1329 -2435:2:1340 -2436:2:1345 -2437:2:1346 -2438:0:4365 -2439:2:1358 -2440:0:4365 -2441:2:1360 -2442:0:4365 -2443:3:3042 -2444:0:4365 -2445:2:1361 -2446:0:4365 -2447:3:3043 -2448:0:4365 -2449:2:1362 -2450:2:1366 -2451:2:1367 -2452:2:1375 -2453:2:1376 -2454:2:1380 -2455:2:1381 -2456:2:1375 -2457:2:1376 -2458:2:1380 -2459:2:1381 -2460:2:1389 -2461:2:1394 -2462:2:1398 -2463:2:1399 -2464:2:1406 -2465:2:1407 -2466:2:1418 -2467:2:1419 -2468:2:1420 -2469:2:1418 -2470:2:1419 -2471:2:1420 -2472:2:1431 -2473:2:1436 -2474:2:1437 -2475:0:4365 -2476:2:1449 -2477:0:4365 -2478:3:3042 -2479:0:4365 -2480:2:1451 -2481:0:4365 -2482:3:3043 -2483:0:4365 -2484:2:1652 -2485:0:4365 -2486:2:1653 -2487:0:4365 -2488:2:1657 -2489:0:4365 -2490:2:1660 -2491:0:4365 -2492:3:3042 -2493:0:4365 -2494:2:1665 -2495:2:1669 -2496:2:1670 -2497:2:1678 -2498:2:1679 -2499:2:1683 -2500:2:1684 -2501:2:1678 -2502:2:1679 -2503:2:1680 -2504:2:1692 -2505:2:1697 -2506:2:1701 -2507:2:1702 -2508:2:1709 -2509:2:1710 -2510:2:1721 -2511:2:1722 -2512:2:1723 -2513:2:1721 -2514:2:1722 -2515:2:1723 -2516:2:1734 -2517:2:1739 -2518:2:1740 -2519:0:4365 -2520:3:3043 -2521:0:4365 -2522:2:1752 -2523:0:4365 -2524:3:3042 -2525:0:4365 -2526:2:1754 -2527:0:4365 -2528:3:3043 -2529:0:4365 -2530:2:1755 -2531:2:1759 -2532:2:1760 -2533:2:1768 -2534:2:1769 -2535:2:1773 -2536:2:1774 -2537:2:1768 -2538:2:1769 -2539:2:1773 -2540:2:1774 -2541:2:1782 -2542:2:1787 -2543:2:1791 -2544:2:1792 -2545:2:1799 -2546:2:1800 -2547:2:1811 -2548:2:1812 -2549:2:1813 -2550:2:1811 -2551:2:1812 -2552:2:1813 -2553:2:1824 -2554:2:1829 -2555:2:1830 -2556:0:4365 -2557:2:1842 -2558:0:4365 -2559:3:3042 -2560:0:4365 -2561:2:1844 -2562:0:4365 -2563:3:3043 -2564:0:4365 -2565:2:1845 -2566:2:1849 -2567:2:1850 -2568:2:1858 -2569:2:1859 -2570:2:1863 -2571:2:1864 -2572:2:1858 -2573:2:1859 -2574:2:1863 -2575:2:1864 -2576:2:1872 -2577:2:1877 -2578:2:1881 -2579:2:1882 -2580:2:1889 -2581:2:1890 -2582:2:1901 -2583:2:1902 -2584:2:1903 -2585:2:1901 -2586:2:1902 -2587:2:1903 -2588:2:1914 -2589:2:1919 -2590:2:1920 -2591:0:4365 -2592:2:1932 -2593:0:4365 -2594:3:3042 -2595:0:4365 -2596:2:1934 -2597:0:4365 -2598:3:3043 -2599:0:4365 -2600:2:1935 -2601:0:4365 -2602:2:1936 -2603:0:4365 -2604:2:2129 -2605:0:4365 -2606:2:2130 -2607:0:4365 -2608:2:2134 -2609:0:4365 -2610:3:3042 -2611:0:4365 -2612:2:2136 -2613:0:4365 -2614:3:3043 -2615:0:4365 -2616:2:2137 -2617:2:2141 -2618:2:2142 -2619:2:2150 -2620:2:2151 -2621:2:2155 -2622:2:2156 -2623:2:2150 -2624:2:2151 -2625:2:2155 -2626:2:2156 -2627:2:2164 -2628:2:2169 -2629:2:2173 -2630:2:2174 -2631:2:2181 -2632:2:2182 -2633:2:2193 -2634:2:2194 -2635:2:2195 -2636:2:2193 -2637:2:2194 -2638:2:2195 -2639:2:2206 -2640:2:2211 -2641:2:2212 -2642:0:4365 -2643:2:2224 -2644:0:4365 -2645:3:3042 -2646:0:4365 -2647:2:2226 -2648:0:4365 -2649:3:3043 -2650:0:4365 -2651:2:2230 -2652:0:4365 -2653:3:3042 -2654:0:4365 -2655:2:2235 -2656:2:2239 -2657:2:2240 -2658:2:2248 -2659:2:2249 -2660:2:2253 -2661:2:2254 -2662:2:2248 -2663:2:2249 -2664:2:2250 -2665:2:2262 -2666:2:2267 -2667:2:2271 -2668:2:2272 -2669:2:2279 -2670:2:2280 -2671:2:2291 -2672:2:2292 -2673:2:2293 -2674:2:2291 -2675:2:2292 -2676:2:2293 -2677:2:2304 -2678:2:2309 -2679:2:2310 -2680:0:4365 -2681:3:3043 -2682:0:4365 -2683:2:2322 -2684:0:4365 -2685:2:1169 -2686:0:4365 -2687:3:3042 -2688:0:4365 -2689:2:1170 -2690:0:4365 -2691:3:3043 -2692:0:4365 -2693:3:3044 -2694:0:4365 -2695:3:3257 -2696:0:4365 -2697:3:3362 -2698:0:4365 -2699:3:3363 -2700:0:4365 -2701:3:3367 -2702:0:4365 -2703:3:3373 -2704:3:3377 -2705:3:3378 -2706:3:3386 -2707:3:3387 -2708:3:3391 -2709:3:3392 -2710:3:3386 -2711:3:3387 -2712:3:3391 -2713:3:3392 -2714:3:3400 -2715:3:3405 -2716:3:3409 -2717:3:3410 -2718:3:3417 -2719:3:3418 -2720:3:3429 -2721:3:3430 -2722:3:3431 -2723:3:3429 -2724:3:3430 -2725:3:3431 -2726:3:3442 -2727:3:3447 -2728:3:3448 -2729:0:4365 -2730:3:3460 -2731:0:4365 -2732:3:3461 -2733:0:4365 -2734:2:1173 -2735:0:4365 -2736:3:3462 -2737:0:4365 -2738:2:1179 -2739:0:4365 -2740:2:1180 -2741:0:4365 -2742:3:3461 -2743:0:4365 -2744:2:1181 -2745:2:1185 -2746:2:1186 -2747:2:1194 -2748:2:1195 -2749:2:1199 -2750:2:1200 -2751:2:1194 -2752:2:1195 -2753:2:1199 -2754:2:1200 -2755:2:1208 -2756:2:1213 -2757:2:1217 -2758:2:1218 -2759:2:1225 -2760:2:1226 -2761:2:1237 -2762:2:1238 -2763:2:1239 -2764:2:1237 -2765:2:1238 -2766:2:1239 -2767:2:1250 -2768:2:1255 -2769:2:1256 -2770:0:4365 -2771:3:3462 -2772:0:4365 -2773:2:1268 -2774:0:4365 -2775:3:3461 -2776:0:4365 -2777:2:1270 -2778:0:4365 -2779:3:3462 -2780:0:4365 -2781:2:1271 -2782:2:1275 -2783:2:1276 -2784:2:1284 -2785:2:1285 -2786:2:1289 -2787:2:1290 -2788:2:1284 -2789:2:1285 -2790:2:1289 -2791:2:1290 -2792:2:1298 -2793:2:1303 -2794:2:1307 -2795:2:1308 -2796:2:1315 -2797:2:1316 -2798:2:1327 -2799:2:1328 -2800:2:1329 -2801:2:1327 -2802:2:1328 -2803:2:1329 -2804:2:1340 -2805:2:1345 -2806:2:1346 -2807:0:4365 -2808:2:1358 -2809:0:4365 -2810:2:1360 -2811:0:4365 -2812:3:3461 -2813:0:4365 -2814:2:1361 -2815:0:4365 -2816:3:3462 -2817:0:4365 -2818:2:1362 -2819:2:1366 -2820:2:1367 -2821:2:1375 -2822:2:1376 -2823:2:1380 -2824:2:1381 -2825:2:1375 -2826:2:1376 -2827:2:1380 -2828:2:1381 -2829:2:1389 -2830:2:1394 -2831:2:1398 -2832:2:1399 -2833:2:1406 -2834:2:1407 -2835:2:1418 -2836:2:1419 -2837:2:1420 -2838:2:1418 -2839:2:1419 -2840:2:1420 -2841:2:1431 -2842:2:1436 -2843:2:1437 -2844:0:4365 -2845:2:1449 -2846:0:4365 -2847:3:3461 -2848:0:4365 -2849:2:1451 -2850:0:4365 -2851:3:3462 -2852:0:4365 -2853:2:1652 -2854:0:4365 -2855:2:1653 -2856:0:4365 -2857:2:1657 -2858:0:4365 -2859:2:1660 -2860:0:4365 -2861:3:3461 -2862:0:4365 -2863:2:1665 -2864:2:1669 -2865:2:1670 -2866:2:1678 -2867:2:1679 -2868:2:1683 -2869:2:1684 -2870:2:1678 -2871:2:1679 -2872:2:1680 -2873:2:1692 -2874:2:1697 -2875:2:1701 -2876:2:1702 -2877:2:1709 -2878:2:1710 -2879:2:1721 -2880:2:1722 -2881:2:1723 -2882:2:1721 -2883:2:1722 -2884:2:1723 -2885:2:1734 -2886:2:1739 -2887:2:1740 -2888:0:4365 -2889:3:3462 -2890:0:4365 -2891:2:1752 -2892:0:4365 -2893:3:3461 -2894:0:4365 -2895:2:1754 -2896:0:4365 -2897:3:3462 -2898:0:4365 -2899:2:1755 -2900:2:1759 -2901:2:1760 -2902:2:1768 -2903:2:1769 -2904:2:1773 -2905:2:1774 -2906:2:1768 -2907:2:1769 -2908:2:1773 -2909:2:1774 -2910:2:1782 -2911:2:1787 -2912:2:1791 -2913:2:1792 -2914:2:1799 -2915:2:1800 -2916:2:1811 -2917:2:1812 -2918:2:1813 -2919:2:1811 -2920:2:1812 -2921:2:1813 -2922:2:1824 -2923:2:1829 -2924:2:1830 -2925:0:4365 -2926:2:1842 -2927:0:4365 -2928:3:3461 -2929:0:4365 -2930:2:1844 -2931:0:4365 -2932:3:3462 -2933:0:4365 -2934:2:1845 -2935:2:1849 -2936:2:1850 -2937:2:1858 -2938:2:1859 -2939:2:1863 -2940:2:1864 -2941:2:1858 -2942:2:1859 -2943:2:1863 -2944:2:1864 -2945:2:1872 -2946:2:1877 -2947:2:1881 -2948:2:1882 -2949:2:1889 -2950:2:1890 -2951:2:1901 -2952:2:1902 -2953:2:1903 -2954:2:1901 -2955:2:1902 -2956:2:1903 -2957:2:1914 -2958:2:1919 -2959:2:1920 -2960:0:4365 -2961:2:1932 -2962:0:4365 -2963:3:3461 -2964:0:4365 -2965:2:1934 -2966:0:4365 -2967:3:3462 -2968:0:4365 -2969:2:1935 -2970:0:4365 -2971:2:1936 -2972:0:4365 -2973:2:2129 -2974:0:4365 -2975:2:2130 -2976:0:4365 -2977:2:2134 -2978:0:4365 -2979:3:3461 -2980:0:4365 -2981:2:2136 -2982:0:4365 -2983:3:3462 -2984:0:4365 -2985:2:2137 -2986:2:2141 -2987:2:2142 -2988:2:2150 -2989:2:2151 -2990:2:2155 -2991:2:2156 -2992:2:2150 -2993:2:2151 -2994:2:2155 -2995:2:2156 -2996:2:2164 -2997:2:2169 -2998:2:2173 -2999:2:2174 -3000:2:2181 -3001:2:2182 -3002:2:2193 -3003:2:2194 -3004:2:2195 -3005:2:2193 -3006:2:2194 -3007:2:2195 -3008:2:2206 -3009:2:2211 -3010:2:2212 -3011:0:4365 -3012:2:2224 -3013:0:4365 -3014:3:3461 -3015:0:4365 -3016:2:2226 -3017:0:4365 -3018:3:3462 -3019:0:4365 -3020:2:2230 -3021:0:4365 -3022:3:3461 -3023:0:4365 -3024:2:2235 -3025:2:2239 -3026:2:2240 -3027:2:2248 -3028:2:2249 -3029:2:2253 -3030:2:2254 -3031:2:2248 -3032:2:2249 -3033:2:2250 -3034:2:2262 -3035:2:2267 -3036:2:2271 -3037:2:2272 -3038:2:2279 -3039:2:2280 -3040:2:2291 -3041:2:2292 -3042:2:2293 -3043:2:2291 -3044:2:2292 -3045:2:2293 -3046:2:2304 -3047:2:2309 -3048:2:2310 -3049:0:4365 -3050:3:3462 -3051:0:4365 -3052:2:2322 -3053:0:4365 -3054:2:1169 -3055:0:4365 -3056:3:3461 -3057:0:4365 -3058:2:1170 -3059:0:4365 -3060:3:3462 -3061:0:4365 -3062:3:3463 -3063:0:4365 -3064:3:3469 -3065:0:4365 -3066:3:3470 -3067:3:3474 -3068:3:3475 -3069:3:3483 -3070:3:3484 -3071:3:3488 -3072:3:3489 -3073:3:3483 -3074:3:3484 -3075:3:3488 -3076:3:3489 -3077:3:3497 -3078:3:3502 -3079:3:3506 -3080:3:3507 -3081:3:3514 -3082:3:3515 -3083:3:3526 -3084:3:3527 -3085:3:3528 -3086:3:3526 -3087:3:3527 -3088:3:3528 -3089:3:3539 -3090:3:3544 -3091:3:3545 -3092:0:4365 -3093:3:3557 -3094:0:4365 -3095:3:3558 -3096:0:4365 -3097:2:1173 -3098:0:4365 -3099:3:3559 -3100:0:4365 -3101:2:1179 -3102:0:4365 -3103:2:1180 -3104:0:4365 -3105:3:3558 -3106:0:4365 -3107:2:1181 -3108:2:1185 -3109:2:1186 -3110:2:1194 -3111:2:1195 -3112:2:1199 -3113:2:1200 -3114:2:1194 -3115:2:1195 -3116:2:1199 -3117:2:1200 -3118:2:1208 -3119:2:1213 -3120:2:1217 -3121:2:1218 -3122:2:1225 -3123:2:1226 -3124:2:1237 -3125:2:1238 -3126:2:1239 -3127:2:1237 -3128:2:1238 -3129:2:1239 -3130:2:1250 -3131:2:1255 -3132:2:1256 -3133:0:4365 -3134:3:3559 -3135:0:4365 -3136:2:1268 -3137:0:4365 -3138:3:3558 -3139:0:4365 -3140:2:1270 -3141:0:4365 -3142:3:3559 -3143:0:4365 -3144:2:1271 -3145:2:1275 -3146:2:1276 -3147:2:1284 -3148:2:1285 -3149:2:1289 -3150:2:1290 -3151:2:1284 -3152:2:1285 -3153:2:1289 -3154:2:1290 -3155:2:1298 -3156:2:1303 -3157:2:1307 -3158:2:1308 -3159:2:1315 -3160:2:1316 -3161:2:1327 -3162:2:1328 -3163:2:1329 -3164:2:1327 -3165:2:1328 -3166:2:1329 -3167:2:1340 -3168:2:1345 -3169:2:1346 -3170:0:4365 -3171:2:1358 -3172:0:4365 -3173:2:1360 -3174:0:4365 -3175:3:3558 -3176:0:4365 -3177:2:1361 -3178:0:4365 -3179:3:3559 -3180:0:4365 -3181:2:1362 -3182:2:1366 -3183:2:1367 -3184:2:1375 -3185:2:1376 -3186:2:1380 -3187:2:1381 -3188:2:1375 -3189:2:1376 -3190:2:1380 -3191:2:1381 -3192:2:1389 -3193:2:1394 -3194:2:1398 -3195:2:1399 -3196:2:1406 -3197:2:1407 -3198:2:1418 -3199:2:1419 -3200:2:1420 -3201:2:1418 -3202:2:1419 -3203:2:1420 -3204:2:1431 -3205:2:1436 -3206:2:1437 -3207:0:4365 -3208:2:1449 -3209:0:4365 -3210:3:3558 -3211:0:4365 -3212:2:1451 -3213:0:4365 -3214:3:3559 -3215:0:4365 -3216:2:1652 -3217:0:4365 -3218:2:1653 -3219:0:4365 -3220:2:1657 -3221:0:4365 -3222:2:1660 -3223:0:4365 -3224:3:3558 -3225:0:4365 -3226:2:1665 -3227:2:1669 -3228:2:1670 -3229:2:1678 -3230:2:1679 -3231:2:1683 -3232:2:1684 -3233:2:1678 -3234:2:1679 -3235:2:1680 -3236:2:1692 -3237:2:1697 -3238:2:1701 -3239:2:1702 -3240:2:1709 -3241:2:1710 -3242:2:1721 -3243:2:1722 -3244:2:1723 -3245:2:1721 -3246:2:1722 -3247:2:1723 -3248:2:1734 -3249:2:1739 -3250:2:1740 -3251:0:4365 -3252:3:3559 -3253:0:4365 -3254:2:1752 -3255:0:4365 -3256:3:3558 -3257:0:4365 -3258:2:1754 -3259:0:4365 -3260:3:3559 -3261:0:4365 -3262:2:1755 -3263:2:1759 -3264:2:1760 -3265:2:1768 -3266:2:1769 -3267:2:1773 -3268:2:1774 -3269:2:1768 -3270:2:1769 -3271:2:1773 -3272:2:1774 -3273:2:1782 -3274:2:1787 -3275:2:1791 -3276:2:1792 -3277:2:1799 -3278:2:1800 -3279:2:1811 -3280:2:1812 -3281:2:1813 -3282:2:1811 -3283:2:1812 -3284:2:1813 -3285:2:1824 -3286:2:1829 -3287:2:1830 -3288:0:4365 -3289:2:1842 -3290:0:4365 -3291:3:3558 -3292:0:4365 -3293:2:1844 -3294:0:4365 -3295:3:3559 -3296:0:4365 -3297:2:1845 -3298:2:1849 -3299:2:1850 -3300:2:1858 -3301:2:1859 -3302:2:1863 -3303:2:1864 -3304:2:1858 -3305:2:1859 -3306:2:1863 -3307:2:1864 -3308:2:1872 -3309:2:1877 -3310:2:1881 -3311:2:1882 -3312:2:1889 -3313:2:1890 -3314:2:1901 -3315:2:1902 -3316:2:1903 -3317:2:1901 -3318:2:1902 -3319:2:1903 -3320:2:1914 -3321:2:1919 -3322:2:1920 -3323:0:4365 -3324:2:1932 -3325:0:4365 -3326:3:3558 -3327:0:4365 -3328:2:1934 -3329:0:4365 -3330:3:3559 -3331:0:4365 -3332:2:1935 -3333:0:4365 -3334:2:1936 -3335:0:4365 -3336:2:2129 -3337:0:4365 -3338:2:2130 -3339:0:4365 -3340:2:2134 -3341:0:4365 -3342:3:3558 -3343:0:4365 -3344:2:2136 -3345:0:4365 -3346:3:3559 -3347:0:4365 -3348:2:2137 -3349:2:2141 -3350:2:2142 -3351:2:2150 -3352:2:2151 -3353:2:2155 -3354:2:2156 -3355:2:2150 -3356:2:2151 -3357:2:2155 -3358:2:2156 -3359:2:2164 -3360:2:2169 -3361:2:2173 -3362:2:2174 -3363:2:2181 -3364:2:2182 -3365:2:2193 -3366:2:2194 -3367:2:2195 -3368:2:2193 -3369:2:2194 -3370:2:2195 -3371:2:2206 -3372:2:2211 -3373:2:2212 -3374:0:4365 -3375:2:2224 -3376:0:4365 -3377:3:3558 -3378:0:4365 -3379:2:2226 -3380:0:4365 -3381:3:3559 -3382:0:4365 -3383:2:2230 -3384:0:4365 -3385:3:3558 -3386:0:4365 -3387:2:2235 -3388:2:2239 -3389:2:2240 -3390:2:2248 -3391:2:2249 -3392:2:2253 -3393:2:2254 -3394:2:2248 -3395:2:2249 -3396:2:2250 -3397:2:2262 -3398:2:2267 -3399:2:2271 -3400:2:2272 -3401:2:2279 -3402:2:2280 -3403:2:2291 -3404:2:2292 -3405:2:2293 -3406:2:2291 -3407:2:2292 -3408:2:2293 -3409:2:2304 -3410:2:2309 -3411:2:2310 -3412:0:4365 -3413:3:3559 -3414:0:4365 -3415:2:2322 -3416:0:4365 -3417:2:1169 -3418:0:4365 -3419:3:3558 -3420:0:4365 -3421:2:1170 -3422:0:4365 -3423:3:3559 -3424:0:4365 -3425:3:3560 -3426:0:4365 -3427:3:3566 -3428:0:4365 -3429:3:3569 -3430:3:3570 -3431:3:3582 -3432:3:3583 -3433:3:3587 -3434:3:3588 -3435:3:3582 -3436:3:3583 -3437:3:3587 -3438:3:3588 -3439:3:3596 -3440:3:3601 -3441:3:3605 -3442:3:3606 -3443:3:3613 -3444:3:3614 -3445:3:3625 -3446:3:3626 -3447:3:3627 -3448:3:3625 -3449:3:3626 -3450:3:3627 -3451:3:3638 -3452:3:3643 -3453:3:3644 -3454:0:4365 -3455:3:3656 -3456:0:4365 -3457:3:3657 -3458:0:4365 -3459:2:1173 -3460:0:4365 -3461:3:3658 -3462:0:4365 -3463:2:1179 -3464:0:4365 -3465:2:1180 -3466:0:4365 -3467:3:3657 -3468:0:4365 -3469:2:1181 -3470:2:1185 -3471:2:1186 -3472:2:1194 -3473:2:1195 -3474:2:1199 -3475:2:1200 -3476:2:1194 -3477:2:1195 -3478:2:1199 -3479:2:1200 -3480:2:1208 -3481:2:1213 -3482:2:1217 -3483:2:1218 -3484:2:1225 -3485:2:1226 -3486:2:1237 -3487:2:1238 -3488:2:1239 -3489:2:1237 -3490:2:1238 -3491:2:1239 -3492:2:1250 -3493:2:1255 -3494:2:1256 -3495:0:4365 -3496:3:3658 -3497:0:4365 -3498:2:1268 -3499:0:4365 -3500:3:3657 -3501:0:4365 -3502:2:1270 -3503:0:4365 -3504:3:3658 -3505:0:4365 -3506:2:1271 -3507:2:1275 -3508:2:1276 -3509:2:1284 -3510:2:1285 -3511:2:1289 -3512:2:1290 -3513:2:1284 -3514:2:1285 -3515:2:1289 -3516:2:1290 -3517:2:1298 -3518:2:1303 -3519:2:1307 -3520:2:1308 -3521:2:1315 -3522:2:1316 -3523:2:1327 -3524:2:1328 -3525:2:1329 -3526:2:1327 -3527:2:1328 -3528:2:1329 -3529:2:1340 -3530:2:1345 -3531:2:1346 -3532:0:4365 -3533:2:1358 -3534:0:4365 -3535:2:1360 -3536:0:4365 -3537:3:3657 -3538:0:4365 -3539:2:1361 -3540:0:4365 -3541:3:3658 -3542:0:4365 -3543:2:1362 -3544:2:1366 -3545:2:1367 -3546:2:1375 -3547:2:1376 -3548:2:1380 -3549:2:1381 -3550:2:1375 -3551:2:1376 -3552:2:1380 -3553:2:1381 -3554:2:1389 -3555:2:1394 -3556:2:1398 -3557:2:1399 -3558:2:1406 -3559:2:1407 -3560:2:1418 -3561:2:1419 -3562:2:1420 -3563:2:1418 -3564:2:1419 -3565:2:1420 -3566:2:1431 -3567:2:1436 -3568:2:1437 -3569:0:4365 -3570:2:1449 -3571:0:4365 -3572:3:3657 -3573:0:4365 -3574:2:1451 -3575:0:4365 -3576:3:3658 -3577:0:4365 -3578:2:1652 -3579:0:4365 -3580:2:1653 -3581:0:4365 -3582:2:1657 -3583:0:4365 -3584:2:1660 -3585:0:4365 -3586:3:3657 -3587:0:4365 -3588:2:1665 -3589:2:1669 -3590:2:1670 -3591:2:1678 -3592:2:1679 -3593:2:1683 -3594:2:1684 -3595:2:1678 -3596:2:1679 -3597:2:1680 -3598:2:1692 -3599:2:1697 -3600:2:1701 -3601:2:1702 -3602:2:1709 -3603:2:1710 -3604:2:1721 -3605:2:1722 -3606:2:1723 -3607:2:1721 -3608:2:1722 -3609:2:1723 -3610:2:1734 -3611:2:1739 -3612:2:1740 -3613:0:4365 -3614:3:3658 -3615:0:4365 -3616:2:1752 -3617:0:4365 -3618:3:3657 -3619:0:4365 -3620:2:1754 -3621:0:4365 -3622:3:3658 -3623:0:4365 -3624:2:1755 -3625:2:1759 -3626:2:1760 -3627:2:1768 -3628:2:1769 -3629:2:1773 -3630:2:1774 -3631:2:1768 -3632:2:1769 -3633:2:1773 -3634:2:1774 -3635:2:1782 -3636:2:1787 -3637:2:1791 -3638:2:1792 -3639:2:1799 -3640:2:1800 -3641:2:1811 -3642:2:1812 -3643:2:1813 -3644:2:1811 -3645:2:1812 -3646:2:1813 -3647:2:1824 -3648:2:1829 -3649:2:1830 -3650:0:4365 -3651:2:1842 -3652:0:4365 -3653:3:3657 -3654:0:4365 -3655:2:1844 -3656:0:4365 -3657:3:3658 -3658:0:4365 -3659:2:1845 -3660:2:1849 -3661:2:1850 -3662:2:1858 -3663:2:1859 -3664:2:1863 -3665:2:1864 -3666:2:1858 -3667:2:1859 -3668:2:1863 -3669:2:1864 -3670:2:1872 -3671:2:1877 -3672:2:1881 -3673:2:1882 -3674:2:1889 -3675:2:1890 -3676:2:1901 -3677:2:1902 -3678:2:1903 -3679:2:1901 -3680:2:1902 -3681:2:1903 -3682:2:1914 -3683:2:1919 -3684:2:1920 -3685:0:4365 -3686:2:1932 -3687:0:4365 -3688:3:3657 -3689:0:4365 -3690:2:1934 -3691:0:4365 -3692:3:3658 -3693:0:4365 -3694:2:1935 -3695:0:4365 -3696:2:1936 -3697:0:4365 -3698:2:2129 -3699:0:4365 -3700:2:2130 -3701:0:4365 -3702:2:2134 -3703:0:4365 -3704:3:3657 -3705:0:4365 -3706:2:2136 -3707:0:4365 -3708:3:3658 -3709:0:4365 -3710:2:2137 -3711:2:2141 -3712:2:2142 -3713:2:2150 -3714:2:2151 -3715:2:2155 -3716:2:2156 -3717:2:2150 -3718:2:2151 -3719:2:2155 -3720:2:2156 -3721:2:2164 -3722:2:2169 -3723:2:2173 -3724:2:2174 -3725:2:2181 -3726:2:2182 -3727:2:2193 -3728:2:2194 -3729:2:2195 -3730:2:2193 -3731:2:2194 -3732:2:2195 -3733:2:2206 -3734:2:2211 -3735:2:2212 -3736:0:4365 -3737:2:2224 -3738:0:4365 -3739:3:3657 -3740:0:4365 -3741:2:2226 -3742:0:4365 -3743:3:3658 -3744:0:4365 -3745:2:2230 -3746:0:4365 -3747:3:3657 -3748:0:4365 -3749:2:2235 -3750:2:2239 -3751:2:2240 -3752:2:2248 -3753:2:2249 -3754:2:2253 -3755:2:2254 -3756:2:2248 -3757:2:2249 -3758:2:2250 -3759:2:2262 -3760:2:2267 -3761:2:2271 -3762:2:2272 -3763:2:2279 -3764:2:2280 -3765:2:2291 -3766:2:2292 -3767:2:2293 -3768:2:2291 -3769:2:2292 -3770:2:2293 -3771:2:2304 -3772:2:2309 -3773:2:2310 -3774:0:4365 -3775:3:3658 -3776:0:4365 -3777:2:2322 -3778:0:4365 -3779:2:1169 -3780:0:4365 -3781:3:3657 -3782:0:4365 -3783:2:1170 -3784:0:4365 -3785:3:3658 -3786:0:4365 -3787:3:3659 -3788:0:4365 -3789:3:3665 -3790:0:4365 -3791:3:3666 -3792:0:4365 -3793:3:3667 -3794:0:4365 -3795:3:3668 -3796:0:4365 -3797:3:3669 -3798:3:3673 -3799:3:3674 -3800:3:3682 -3801:3:3683 -3802:3:3687 -3803:3:3688 -3804:3:3682 -3805:3:3683 -3806:3:3687 -3807:3:3688 -3808:3:3696 -3809:3:3701 -3810:3:3705 -3811:3:3706 -3812:3:3713 -3813:3:3714 -3814:3:3725 -3815:3:3726 -3816:3:3727 -3817:3:3725 -3818:3:3726 -3819:3:3727 -3820:3:3738 -3821:3:3743 -3822:3:3744 -3823:0:4365 -3824:3:3756 -3825:0:4365 -3826:3:3757 -3827:0:4365 -3828:2:1173 -3829:0:4365 -3830:3:3758 -3831:0:4365 -3832:2:1179 -3833:0:4365 -3834:2:1180 -3835:0:4365 -3836:3:3757 -3837:0:4365 -3838:2:1181 -3839:2:1185 -3840:2:1186 -3841:2:1194 -3842:2:1195 -3843:2:1199 -3844:2:1200 -3845:2:1194 -3846:2:1195 -3847:2:1199 -3848:2:1200 -3849:2:1208 -3850:2:1213 -3851:2:1217 -3852:2:1218 -3853:2:1225 -3854:2:1226 -3855:2:1237 -3856:2:1238 -3857:2:1239 -3858:2:1237 -3859:2:1238 -3860:2:1239 -3861:2:1250 -3862:2:1255 -3863:2:1256 -3864:0:4365 -3865:3:3758 -3866:0:4365 -3867:2:1268 -3868:0:4365 -3869:3:3757 -3870:0:4365 -3871:2:1270 -3872:0:4365 -3873:3:3758 -3874:0:4365 -3875:2:1271 -3876:2:1275 -3877:2:1276 -3878:2:1284 -3879:2:1285 -3880:2:1289 -3881:2:1290 -3882:2:1284 -3883:2:1285 -3884:2:1289 -3885:2:1290 -3886:2:1298 -3887:2:1303 -3888:2:1307 -3889:2:1308 -3890:2:1315 -3891:2:1316 -3892:2:1327 -3893:2:1328 -3894:2:1329 -3895:2:1327 -3896:2:1328 -3897:2:1329 -3898:2:1340 -3899:2:1345 -3900:2:1346 -3901:0:4365 -3902:2:1358 -3903:0:4365 -3904:2:1360 -3905:0:4365 -3906:3:3757 -3907:0:4365 -3908:2:1361 -3909:0:4365 -3910:3:3758 -3911:0:4365 -3912:2:1362 -3913:2:1366 -3914:2:1367 -3915:2:1375 -3916:2:1376 -3917:2:1380 -3918:2:1381 -3919:2:1375 -3920:2:1376 -3921:2:1380 -3922:2:1381 -3923:2:1389 -3924:2:1394 -3925:2:1398 -3926:2:1399 -3927:2:1406 -3928:2:1407 -3929:2:1418 -3930:2:1419 -3931:2:1420 -3932:2:1418 -3933:2:1419 -3934:2:1420 -3935:2:1431 -3936:2:1436 -3937:2:1437 -3938:0:4365 -3939:2:1449 -3940:0:4365 -3941:3:3757 -3942:0:4365 -3943:2:1451 -3944:0:4365 -3945:3:3758 -3946:0:4365 -3947:2:1652 -3948:0:4365 -3949:2:1653 -3950:0:4365 -3951:2:1657 -3952:0:4365 -3953:2:1660 -3954:0:4365 -3955:3:3757 -3956:0:4365 -3957:2:1665 -3958:2:1669 -3959:2:1670 -3960:2:1678 -3961:2:1679 -3962:2:1683 -3963:2:1684 -3964:2:1678 -3965:2:1679 -3966:2:1680 -3967:2:1692 -3968:2:1697 -3969:2:1701 -3970:2:1702 -3971:2:1709 -3972:2:1710 -3973:2:1721 -3974:2:1722 -3975:2:1723 -3976:2:1721 -3977:2:1722 -3978:2:1723 -3979:2:1734 -3980:2:1739 -3981:2:1740 -3982:0:4365 -3983:3:3758 -3984:0:4365 -3985:2:1752 -3986:0:4365 -3987:3:3757 -3988:0:4365 -3989:2:1754 -3990:0:4365 -3991:3:3758 -3992:0:4365 -3993:2:1755 -3994:2:1759 -3995:2:1760 -3996:2:1768 -3997:2:1769 -3998:2:1773 -3999:2:1774 -4000:2:1768 -4001:2:1769 -4002:2:1773 -4003:2:1774 -4004:2:1782 -4005:2:1787 -4006:2:1791 -4007:2:1792 -4008:2:1799 -4009:2:1800 -4010:2:1811 -4011:2:1812 -4012:2:1813 -4013:2:1811 -4014:2:1812 -4015:2:1813 -4016:2:1824 -4017:2:1829 -4018:2:1830 -4019:0:4365 -4020:2:1842 -4021:0:4365 -4022:3:3757 -4023:0:4365 -4024:2:1844 -4025:0:4365 -4026:3:3758 -4027:0:4365 -4028:2:1845 -4029:2:1849 -4030:2:1850 -4031:2:1858 -4032:2:1859 -4033:2:1863 -4034:2:1864 -4035:2:1858 -4036:2:1859 -4037:2:1863 -4038:2:1864 -4039:2:1872 -4040:2:1877 -4041:2:1881 -4042:2:1882 -4043:2:1889 -4044:2:1890 -4045:2:1901 -4046:2:1902 -4047:2:1903 -4048:2:1901 -4049:2:1902 -4050:2:1903 -4051:2:1914 -4052:2:1919 -4053:2:1920 -4054:0:4365 -4055:2:1932 -4056:0:4365 -4057:3:3757 -4058:0:4365 -4059:2:1934 -4060:0:4365 -4061:3:3758 -4062:0:4365 -4063:2:1935 -4064:0:4365 -4065:2:1936 -4066:0:4365 -4067:2:2129 -4068:0:4365 -4069:2:2130 -4070:0:4365 -4071:2:2134 -4072:0:4365 -4073:3:3757 -4074:0:4365 -4075:2:2136 -4076:0:4365 -4077:3:3758 -4078:0:4365 -4079:2:2137 -4080:2:2141 -4081:2:2142 -4082:2:2150 -4083:2:2151 -4084:2:2155 -4085:2:2156 -4086:2:2150 -4087:2:2151 -4088:2:2155 -4089:2:2156 -4090:2:2164 -4091:2:2169 -4092:2:2173 -4093:2:2174 -4094:2:2181 -4095:2:2182 -4096:2:2193 -4097:2:2194 -4098:2:2195 -4099:2:2193 -4100:2:2194 -4101:2:2195 -4102:2:2206 -4103:2:2211 -4104:2:2212 -4105:0:4365 -4106:2:2224 -4107:0:4365 -4108:3:3757 -4109:0:4365 -4110:2:2226 -4111:0:4365 -4112:3:3758 -4113:0:4365 -4114:2:2230 -4115:0:4365 -4116:3:3757 -4117:0:4365 -4118:2:2235 -4119:2:2239 -4120:2:2240 -4121:2:2248 -4122:2:2249 -4123:2:2253 -4124:2:2254 -4125:2:2248 -4126:2:2249 -4127:2:2250 -4128:2:2262 -4129:2:2267 -4130:2:2271 -4131:2:2272 -4132:2:2279 -4133:2:2280 -4134:2:2291 -4135:2:2292 -4136:2:2293 -4137:2:2291 -4138:2:2292 -4139:2:2293 -4140:2:2304 -4141:2:2309 -4142:2:2310 -4143:0:4365 -4144:3:3758 -4145:0:4365 -4146:2:2322 -4147:0:4365 -4148:2:1169 -4149:0:4365 -4150:3:3757 -4151:0:4365 -4152:2:1170 -4153:0:4365 -4154:3:3758 -4155:0:4365 -4156:3:3759 -4157:0:4365 -4158:3:3972 -4159:0:4365 -4160:3:3980 -4161:0:4365 -4162:3:3981 -4163:3:3985 -4164:3:3986 -4165:3:3994 -4166:3:3995 -4167:3:3999 -4168:3:4000 -4169:3:3994 -4170:3:3995 -4171:3:3999 -4172:3:4000 -4173:3:4008 -4174:3:4013 -4175:3:4017 -4176:3:4018 -4177:3:4025 -4178:3:4026 -4179:3:4037 -4180:3:4038 -4181:3:4039 -4182:3:4037 -4183:3:4038 -4184:3:4039 -4185:3:4050 -4186:3:4055 -4187:3:4056 -4188:0:4365 -4189:3:4068 -4190:0:4365 -4191:3:4069 -4192:0:4365 -4193:2:1173 -4194:0:4365 -4195:3:4070 -4196:0:4365 -4197:2:1179 -4198:0:4365 -4199:2:1180 -4200:0:4365 -4201:3:4069 -4202:0:4365 -4203:2:1181 -4204:2:1185 -4205:2:1186 -4206:2:1194 -4207:2:1195 -4208:2:1199 -4209:2:1200 -4210:2:1194 -4211:2:1195 -4212:2:1199 -4213:2:1200 -4214:2:1208 -4215:2:1213 -4216:2:1217 -4217:2:1218 -4218:2:1225 -4219:2:1226 -4220:2:1237 -4221:2:1238 -4222:2:1239 -4223:2:1237 -4224:2:1238 -4225:2:1239 -4226:2:1250 -4227:2:1255 -4228:2:1256 -4229:0:4365 -4230:3:4070 -4231:0:4365 -4232:2:1268 -4233:0:4365 -4234:3:4069 -4235:0:4365 -4236:2:1270 -4237:0:4365 -4238:3:4070 -4239:0:4365 -4240:2:1271 -4241:2:1275 -4242:2:1276 -4243:2:1284 -4244:2:1285 -4245:2:1289 -4246:2:1290 -4247:2:1284 -4248:2:1285 -4249:2:1289 -4250:2:1290 -4251:2:1298 -4252:2:1303 -4253:2:1307 -4254:2:1308 -4255:2:1315 -4256:2:1316 -4257:2:1327 -4258:2:1328 -4259:2:1329 -4260:2:1327 -4261:2:1328 -4262:2:1329 -4263:2:1340 -4264:2:1345 -4265:2:1346 -4266:0:4365 -4267:2:1358 -4268:0:4365 -4269:2:1360 -4270:0:4365 -4271:3:4069 -4272:0:4365 -4273:2:1361 -4274:0:4365 -4275:3:4070 -4276:0:4365 -4277:2:1362 -4278:2:1366 -4279:2:1367 -4280:2:1375 -4281:2:1376 -4282:2:1380 -4283:2:1381 -4284:2:1375 -4285:2:1376 -4286:2:1380 -4287:2:1381 -4288:2:1389 -4289:2:1394 -4290:2:1398 -4291:2:1399 -4292:2:1406 -4293:2:1407 -4294:2:1418 -4295:2:1419 -4296:2:1420 -4297:2:1418 -4298:2:1419 -4299:2:1420 -4300:2:1431 -4301:2:1436 -4302:2:1437 -4303:0:4365 -4304:2:1449 -4305:0:4365 -4306:3:4069 -4307:0:4365 -4308:2:1451 -4309:0:4365 -4310:3:4070 -4311:0:4365 -4312:2:1652 -4313:0:4365 -4314:2:1653 -4315:0:4365 -4316:2:1657 -4317:0:4365 -4318:2:1660 -4319:0:4365 -4320:3:4069 -4321:0:4365 -4322:2:1665 -4323:2:1669 -4324:2:1670 -4325:2:1678 -4326:2:1679 -4327:2:1683 -4328:2:1684 -4329:2:1678 -4330:2:1679 -4331:2:1680 -4332:2:1692 -4333:2:1697 -4334:2:1701 -4335:2:1702 -4336:2:1709 -4337:2:1710 -4338:2:1721 -4339:2:1722 -4340:2:1723 -4341:2:1721 -4342:2:1722 -4343:2:1723 -4344:2:1734 -4345:2:1739 -4346:2:1740 -4347:0:4365 -4348:3:4070 -4349:0:4365 -4350:2:1752 -4351:0:4365 -4352:3:4069 -4353:0:4365 -4354:2:1754 -4355:0:4365 -4356:3:4070 -4357:0:4365 -4358:2:1755 -4359:2:1759 -4360:2:1760 -4361:2:1768 -4362:2:1769 -4363:2:1773 -4364:2:1774 -4365:2:1768 -4366:2:1769 -4367:2:1773 -4368:2:1774 -4369:2:1782 -4370:2:1787 -4371:2:1791 -4372:2:1792 -4373:2:1799 -4374:2:1800 -4375:2:1811 -4376:2:1812 -4377:2:1813 -4378:2:1811 -4379:2:1812 -4380:2:1813 -4381:2:1824 -4382:2:1829 -4383:2:1830 -4384:0:4365 -4385:2:1842 -4386:0:4365 -4387:3:4069 -4388:0:4365 -4389:2:1844 -4390:0:4365 -4391:3:4070 -4392:0:4365 -4393:2:1845 -4394:2:1849 -4395:2:1850 -4396:2:1858 -4397:2:1859 -4398:2:1863 -4399:2:1864 -4400:2:1858 -4401:2:1859 -4402:2:1863 -4403:2:1864 -4404:2:1872 -4405:2:1877 -4406:2:1881 -4407:2:1882 -4408:2:1889 -4409:2:1890 -4410:2:1901 -4411:2:1902 -4412:2:1903 -4413:2:1901 -4414:2:1902 -4415:2:1903 -4416:2:1914 -4417:2:1919 -4418:2:1920 -4419:0:4365 -4420:2:1932 -4421:0:4365 -4422:3:4069 -4423:0:4365 -4424:2:1934 -4425:0:4365 -4426:3:4070 -4427:0:4365 -4428:2:1935 -4429:0:4365 -4430:2:1936 -4431:0:4365 -4432:2:2129 -4433:0:4365 -4434:2:2130 -4435:0:4365 -4436:2:2134 -4437:0:4365 -4438:3:4069 -4439:0:4365 -4440:2:2136 -4441:0:4365 -4442:3:4070 -4443:0:4365 -4444:2:2137 -4445:2:2141 -4446:2:2142 -4447:2:2150 -4448:2:2151 -4449:2:2155 -4450:2:2156 -4451:2:2150 -4452:2:2151 -4453:2:2155 -4454:2:2156 -4455:2:2164 -4456:2:2169 -4457:2:2173 -4458:2:2174 -4459:2:2181 -4460:2:2182 -4461:2:2193 -4462:2:2194 -4463:2:2195 -4464:2:2193 -4465:2:2194 -4466:2:2195 -4467:2:2206 -4468:2:2211 -4469:2:2212 -4470:0:4365 -4471:2:2224 -4472:0:4365 -4473:3:4069 -4474:0:4365 -4475:2:2226 -4476:0:4365 -4477:3:4070 -4478:0:4365 -4479:2:2230 -4480:0:4365 -4481:3:4069 -4482:0:4365 -4483:2:2235 -4484:2:2239 -4485:2:2240 -4486:2:2248 -4487:2:2249 -4488:2:2253 -4489:2:2254 -4490:2:2248 -4491:2:2249 -4492:2:2250 -4493:2:2262 -4494:2:2267 -4495:2:2271 -4496:2:2272 -4497:2:2279 -4498:2:2280 -4499:2:2291 -4500:2:2292 -4501:2:2293 -4502:2:2291 -4503:2:2292 -4504:2:2293 -4505:2:2304 -4506:2:2309 -4507:2:2310 -4508:0:4365 -4509:3:4070 -4510:0:4365 -4511:2:2322 -4512:0:4365 -4513:2:1169 -4514:0:4365 -4515:3:4069 -4516:0:4365 -4517:2:1170 -4518:0:4365 -4519:3:4070 -4520:0:4365 -4521:3:4071 -4522:0:4365 -4523:3:4081 -4524:0:4365 -4525:3:3666 -4526:0:4365 -4527:3:3667 -4528:0:4365 -4529:3:3668 -4530:0:4365 -4531:3:3669 -4532:3:3673 -4533:3:3674 -4534:3:3682 -4535:3:3683 -4536:3:3687 -4537:3:3688 -4538:3:3682 -4539:3:3683 -4540:3:3687 -4541:3:3688 -4542:3:3696 -4543:3:3701 -4544:3:3705 -4545:3:3706 -4546:3:3713 -4547:3:3714 -4548:3:3725 -4549:3:3726 -4550:3:3727 -4551:3:3725 -4552:3:3726 -4553:3:3727 -4554:3:3738 -4555:3:3743 -4556:3:3744 -4557:0:4365 -4558:3:3756 -4559:0:4365 -4560:3:3757 -4561:0:4365 -4562:2:1173 -4563:0:4365 -4564:3:3758 -4565:0:4365 -4566:2:1179 -4567:0:4365 -4568:2:1180 -4569:0:4365 -4570:3:3757 -4571:0:4365 -4572:2:1181 -4573:2:1185 -4574:2:1186 -4575:2:1194 -4576:2:1195 -4577:2:1199 -4578:2:1200 -4579:2:1194 -4580:2:1195 -4581:2:1199 -4582:2:1200 -4583:2:1208 -4584:2:1213 -4585:2:1217 -4586:2:1218 -4587:2:1225 -4588:2:1226 -4589:2:1237 -4590:2:1238 -4591:2:1239 -4592:2:1237 -4593:2:1238 -4594:2:1239 -4595:2:1250 -4596:2:1255 -4597:2:1256 -4598:0:4365 -4599:3:3758 -4600:0:4365 -4601:2:1268 -4602:0:4365 -4603:3:3757 -4604:0:4365 -4605:2:1270 -4606:0:4365 -4607:3:3758 -4608:0:4365 -4609:2:1271 -4610:2:1275 -4611:2:1276 -4612:2:1284 -4613:2:1285 -4614:2:1289 -4615:2:1290 -4616:2:1284 -4617:2:1285 -4618:2:1289 -4619:2:1290 -4620:2:1298 -4621:2:1303 -4622:2:1307 -4623:2:1308 -4624:2:1315 -4625:2:1316 -4626:2:1327 -4627:2:1328 -4628:2:1329 -4629:2:1327 -4630:2:1328 -4631:2:1329 -4632:2:1340 -4633:2:1345 -4634:2:1346 -4635:0:4365 -4636:2:1358 -4637:0:4365 -4638:2:1360 -4639:0:4365 -4640:3:3757 -4641:0:4365 -4642:2:1361 -4643:0:4365 -4644:3:3758 -4645:0:4365 -4646:2:1362 -4647:2:1366 -4648:2:1367 -4649:2:1375 -4650:2:1376 -4651:2:1380 -4652:2:1381 -4653:2:1375 -4654:2:1376 -4655:2:1380 -4656:2:1381 -4657:2:1389 -4658:2:1394 -4659:2:1398 -4660:2:1399 -4661:2:1406 -4662:2:1407 -4663:2:1418 -4664:2:1419 -4665:2:1420 -4666:2:1418 -4667:2:1419 -4668:2:1420 -4669:2:1431 -4670:2:1436 -4671:2:1437 -4672:0:4365 -4673:2:1449 -4674:0:4365 -4675:3:3757 -4676:0:4365 -4677:2:1451 -4678:0:4365 -4679:3:3758 -4680:0:4365 -4681:2:1652 -4682:0:4365 -4683:2:1653 -4684:0:4365 -4685:2:1657 -4686:0:4365 -4687:2:1660 -4688:0:4365 -4689:3:3757 -4690:0:4365 -4691:2:1665 -4692:2:1669 -4693:2:1670 -4694:2:1678 -4695:2:1679 -4696:2:1683 -4697:2:1684 -4698:2:1678 -4699:2:1679 -4700:2:1680 -4701:2:1692 -4702:2:1697 -4703:2:1701 -4704:2:1702 -4705:2:1709 -4706:2:1710 -4707:2:1721 -4708:2:1722 -4709:2:1723 -4710:2:1721 -4711:2:1722 -4712:2:1723 -4713:2:1734 -4714:2:1739 -4715:2:1740 -4716:0:4365 -4717:3:3758 -4718:0:4365 -4719:2:1752 -4720:0:4365 -4721:3:3757 -4722:0:4365 -4723:2:1754 -4724:0:4365 -4725:3:3758 -4726:0:4365 -4727:2:1755 -4728:2:1759 -4729:2:1760 -4730:2:1768 -4731:2:1769 -4732:2:1773 -4733:2:1774 -4734:2:1768 -4735:2:1769 -4736:2:1773 -4737:2:1774 -4738:2:1782 -4739:2:1787 -4740:2:1791 -4741:2:1792 -4742:2:1799 -4743:2:1800 -4744:2:1811 -4745:2:1812 -4746:2:1813 -4747:2:1811 -4748:2:1812 -4749:2:1813 -4750:2:1824 -4751:2:1829 -4752:2:1830 -4753:0:4365 -4754:2:1842 -4755:0:4365 -4756:3:3757 -4757:0:4365 -4758:2:1844 -4759:0:4365 -4760:3:3758 -4761:0:4365 -4762:2:1845 -4763:2:1849 -4764:2:1850 -4765:2:1858 -4766:2:1859 -4767:2:1863 -4768:2:1864 -4769:2:1858 -4770:2:1859 -4771:2:1863 -4772:2:1864 -4773:2:1872 -4774:2:1877 -4775:2:1881 -4776:2:1882 -4777:2:1889 -4778:2:1890 -4779:2:1901 -4780:2:1902 -4781:2:1903 -4782:2:1901 -4783:2:1902 -4784:2:1903 -4785:2:1914 -4786:2:1919 -4787:2:1920 -4788:0:4365 -4789:2:1932 -4790:0:4365 -4791:3:3757 -4792:0:4365 -4793:2:1934 -4794:0:4365 -4795:3:3758 -4796:0:4365 -4797:2:1935 -4798:0:4365 -4799:2:1936 -4800:0:4365 -4801:2:2129 -4802:0:4365 -4803:2:2130 -4804:0:4365 -4805:2:2134 -4806:0:4365 -4807:3:3757 -4808:0:4365 -4809:2:2136 -4810:0:4365 -4811:3:3758 -4812:0:4365 -4813:2:2137 -4814:2:2141 -4815:2:2142 -4816:2:2150 -4817:2:2151 -4818:2:2155 -4819:2:2156 -4820:2:2150 -4821:2:2151 -4822:2:2155 -4823:2:2156 -4824:2:2164 -4825:2:2169 -4826:2:2173 -4827:2:2174 -4828:2:2181 -4829:2:2182 -4830:2:2193 -4831:2:2194 -4832:2:2195 -4833:2:2193 -4834:2:2194 -4835:2:2195 -4836:2:2206 -4837:2:2211 -4838:2:2212 -4839:0:4365 -4840:2:2224 -4841:0:4365 -4842:3:3757 -4843:0:4365 -4844:2:2226 -4845:0:4365 -4846:3:3758 -4847:0:4365 -4848:2:2230 -4849:0:4365 -4850:3:3757 -4851:0:4365 -4852:2:2235 -4853:2:2239 -4854:2:2240 -4855:2:2248 -4856:2:2249 -4857:2:2253 -4858:2:2254 -4859:2:2248 -4860:2:2249 -4861:2:2250 -4862:2:2262 -4863:2:2267 -4864:2:2271 -4865:2:2272 -4866:2:2279 -4867:2:2280 -4868:2:2291 -4869:2:2292 -4870:2:2293 -4871:2:2291 -4872:2:2292 -4873:2:2293 -4874:2:2304 -4875:2:2309 -4876:2:2310 -4877:0:4365 -4878:3:3758 -4879:0:4365 -4880:2:2322 -4881:0:4365 -4882:2:1169 -4883:0:4365 -4884:3:3757 -4885:0:4365 -4886:2:1170 -4887:0:4365 -4888:3:3758 -4889:0:4365 -4890:3:3759 -4891:0:4365 -4892:3:3972 -4893:0:4365 -4894:3:4077 -4895:0:4365 -4896:3:4078 -4897:0:4365 -4898:3:4082 -4899:0:4365 -4900:3:4088 -4901:0:4365 -4902:3:4092 -4903:3:4093 -4904:3:4097 -4905:3:4101 -4906:3:4102 -4907:3:4097 -4908:3:4101 -4909:3:4102 -4910:3:4106 -4911:3:4114 -4912:3:4115 -4913:3:4120 -4914:3:4127 -4915:3:4128 -4916:3:4127 -4917:3:4128 -4918:3:4135 -4919:3:4140 -4920:0:4365 -4921:3:4151 -4922:0:4365 -4923:3:4155 -4924:3:4156 -4925:3:4160 -4926:3:4164 -4927:3:4165 -4928:3:4160 -4929:3:4164 -4930:3:4165 -4931:3:4169 -4932:3:4177 -4933:3:4178 -4934:3:4183 -4935:3:4190 -4936:3:4191 -4937:3:4190 -4938:3:4191 -4939:3:4198 -4940:3:4203 -4941:0:4365 -4942:3:4151 -4943:0:4365 -4944:3:4155 -4945:3:4156 -4946:3:4160 -4947:3:4164 -4948:3:4165 -4949:3:4160 -4950:3:4164 -4951:3:4165 -4952:3:4169 -4953:3:4177 -4954:3:4178 -4955:3:4183 -4956:3:4190 -4957:3:4191 -4958:3:4190 -4959:3:4191 -4960:3:4198 -4961:3:4203 -4962:0:4365 -4963:3:4214 -4964:0:4365 -4965:3:4222 -4966:3:4223 -4967:3:4227 -4968:3:4231 -4969:3:4232 -4970:3:4227 -4971:3:4231 -4972:3:4232 -4973:3:4236 -4974:3:4244 -4975:3:4245 -4976:3:4250 -4977:3:4257 -4978:3:4258 -4979:3:4257 -4980:3:4258 -4981:3:4265 -4982:3:4270 -4983:0:4365 -4984:3:4285 -4985:0:4365 -4986:3:4286 -4987:0:4365 -4988:2:1173 -4989:0:4365 -4990:3:4287 -4991:0:4365 -4992:2:1179 -4993:0:4365 -4994:2:1180 -4995:0:4365 -4996:3:4286 -4997:0:4365 -4998:2:1181 -4999:2:1185 -5000:2:1186 -5001:2:1194 -5002:2:1195 -5003:2:1199 -5004:2:1200 -5005:2:1194 -5006:2:1195 -5007:2:1199 -5008:2:1200 -5009:2:1208 -5010:2:1213 -5011:2:1217 -5012:2:1218 -5013:2:1225 -5014:2:1226 -5015:2:1237 -5016:2:1238 -5017:2:1239 -5018:2:1237 -5019:2:1238 -5020:2:1239 -5021:2:1250 -5022:2:1255 -5023:2:1256 -5024:0:4365 -5025:3:4287 -5026:0:4365 -5027:2:1268 -5028:0:4365 -5029:3:4286 -5030:0:4365 -5031:2:1270 -5032:0:4365 -5033:3:4287 -5034:0:4365 -5035:2:1271 -5036:2:1275 -5037:2:1276 -5038:2:1284 -5039:2:1285 -5040:2:1289 -5041:2:1290 -5042:2:1284 -5043:2:1285 -5044:2:1289 -5045:2:1290 -5046:2:1298 -5047:2:1303 -5048:2:1307 -5049:2:1308 -5050:2:1315 -5051:2:1316 -5052:2:1327 -5053:2:1328 -5054:2:1329 -5055:2:1327 -5056:2:1328 -5057:2:1329 -5058:2:1340 -5059:2:1345 -5060:2:1346 -5061:0:4365 -5062:2:1358 -5063:0:4365 -5064:2:1360 -5065:0:4365 -5066:3:4286 -5067:0:4365 -5068:2:1361 -5069:0:4365 -5070:3:4287 -5071:0:4365 -5072:2:1362 -5073:2:1366 -5074:2:1367 -5075:2:1375 -5076:2:1376 -5077:2:1380 -5078:2:1381 -5079:2:1375 -5080:2:1376 -5081:2:1380 -5082:2:1381 -5083:2:1389 -5084:2:1394 -5085:2:1398 -5086:2:1399 -5087:2:1406 -5088:2:1407 -5089:2:1418 -5090:2:1419 -5091:2:1420 -5092:2:1418 -5093:2:1419 -5094:2:1420 -5095:2:1431 -5096:2:1436 -5097:2:1437 -5098:0:4365 -5099:2:1449 -5100:0:4365 -5101:3:4286 -5102:0:4365 -5103:2:1451 -5104:0:4365 -5105:3:4287 -5106:0:4365 -5107:2:1652 -5108:0:4365 -5109:2:1653 -5110:0:4365 -5111:2:1657 -5112:0:4365 -5113:2:1660 -5114:0:4365 -5115:3:4286 -5116:0:4365 -5117:2:1665 -5118:2:1669 -5119:2:1670 -5120:2:1678 -5121:2:1679 -5122:2:1683 -5123:2:1684 -5124:2:1678 -5125:2:1679 -5126:2:1680 -5127:2:1692 -5128:2:1697 -5129:2:1701 -5130:2:1702 -5131:2:1709 -5132:2:1710 -5133:2:1721 -5134:2:1722 -5135:2:1723 -5136:2:1721 -5137:2:1722 -5138:2:1723 -5139:2:1734 -5140:2:1739 -5141:2:1740 -5142:0:4365 -5143:3:4287 -5144:0:4365 -5145:2:1752 -5146:0:4365 -5147:3:4286 -5148:0:4365 -5149:2:1754 -5150:0:4365 -5151:3:4287 -5152:0:4365 -5153:2:1755 -5154:2:1759 -5155:2:1760 -5156:2:1768 -5157:2:1769 -5158:2:1773 -5159:2:1774 -5160:2:1768 -5161:2:1769 -5162:2:1773 -5163:2:1774 -5164:2:1782 -5165:2:1787 -5166:2:1791 -5167:2:1792 -5168:2:1799 -5169:2:1800 -5170:2:1811 -5171:2:1812 -5172:2:1813 -5173:2:1811 -5174:2:1812 -5175:2:1813 -5176:2:1824 -5177:2:1829 -5178:2:1830 -5179:0:4365 -5180:2:1842 -5181:0:4365 -5182:3:4286 -5183:0:4365 -5184:2:1844 -5185:0:4365 -5186:3:4287 -5187:0:4365 -5188:2:1845 -5189:2:1849 -5190:2:1850 -5191:2:1858 -5192:2:1859 -5193:2:1863 -5194:2:1864 -5195:2:1858 -5196:2:1859 -5197:2:1863 -5198:2:1864 -5199:2:1872 -5200:2:1877 -5201:2:1881 -5202:2:1882 -5203:2:1889 -5204:2:1890 -5205:2:1901 -5206:2:1902 -5207:2:1903 -5208:2:1901 -5209:2:1902 -5210:2:1903 -5211:2:1914 -5212:2:1919 -5213:2:1920 -5214:0:4365 -5215:2:1932 -5216:0:4365 -5217:3:4286 -5218:0:4365 -5219:2:1934 -5220:0:4365 -5221:3:4287 -5222:0:4365 -5223:2:1935 -5224:0:4365 -5225:2:1936 -5226:0:4365 -5227:2:2129 -5228:0:4365 -5229:2:2130 -5230:0:4365 -5231:2:2134 -5232:0:4365 -5233:3:4286 -5234:0:4365 -5235:2:2136 -5236:0:4365 -5237:3:4287 -5238:0:4365 -5239:2:2137 -5240:2:2141 -5241:2:2142 -5242:2:2150 -5243:2:2151 -5244:2:2155 -5245:2:2156 -5246:2:2150 -5247:2:2151 -5248:2:2155 -5249:2:2156 -5250:2:2164 -5251:2:2169 -5252:2:2173 -5253:2:2174 -5254:2:2181 -5255:2:2182 -5256:2:2193 -5257:2:2194 -5258:2:2195 -5259:2:2193 -5260:2:2194 -5261:2:2195 -5262:2:2206 -5263:2:2211 -5264:2:2212 -5265:0:4365 -5266:2:2224 -5267:0:4365 -5268:3:4286 -5269:0:4365 -5270:2:2226 -5271:0:4365 -5272:3:4287 -5273:0:4365 -5274:2:2230 -5275:0:4365 -5276:3:4286 -5277:0:4365 -5278:2:2235 -5279:2:2239 -5280:2:2240 -5281:2:2248 -5282:2:2249 -5283:2:2253 -5284:2:2254 -5285:2:2248 -5286:2:2249 -5287:2:2250 -5288:2:2262 -5289:2:2267 -5290:2:2271 -5291:2:2272 -5292:2:2279 -5293:2:2280 -5294:2:2291 -5295:2:2292 -5296:2:2293 -5297:2:2291 -5298:2:2292 -5299:2:2293 -5300:2:2304 -5301:2:2309 -5302:2:2310 -5303:0:4365 -5304:3:4287 -5305:0:4365 -5306:2:2322 -5307:0:4365 -5308:2:1169 -5309:0:4365 -5310:3:4286 -5311:0:4365 -5312:2:1170 -5313:0:4365 -5314:3:4287 -5315:0:4365 -5316:3:4288 -5317:0:4365 -5318:3:4294 -5319:0:4365 -5320:3:4295 -5321:0:4365 -5322:3:2338 -5323:0:4365 -5324:3:2339 -5325:3:2343 -5326:3:2344 -5327:3:2352 -5328:3:2353 -5329:3:2357 -5330:3:2358 -5331:3:2352 -5332:3:2353 -5333:3:2357 -5334:3:2358 -5335:3:2366 -5336:3:2371 -5337:3:2375 -5338:3:2376 -5339:3:2383 -5340:3:2384 -5341:3:2395 -5342:3:2396 -5343:3:2397 -5344:3:2395 -5345:3:2396 -5346:3:2397 -5347:3:2408 -5348:3:2413 -5349:3:2414 -5350:0:4365 -5351:3:2426 -5352:0:4365 -5353:3:2427 -5354:0:4365 -5355:2:1173 -5356:0:4365 -5357:3:2428 -5358:0:4365 -5359:2:1179 -5360:0:4365 -5361:2:1180 -5362:0:4365 -5363:3:2427 -5364:0:4365 -5365:2:1181 -5366:2:1185 -5367:2:1186 -5368:2:1194 -5369:2:1195 -5370:2:1199 -5371:2:1200 -5372:2:1194 -5373:2:1195 -5374:2:1199 -5375:2:1200 -5376:2:1208 -5377:2:1213 -5378:2:1217 -5379:2:1218 -5380:2:1225 -5381:2:1226 -5382:2:1237 -5383:2:1238 -5384:2:1239 -5385:2:1237 -5386:2:1238 -5387:2:1239 -5388:2:1250 -5389:2:1255 -5390:2:1256 -5391:0:4365 -5392:3:2428 -5393:0:4365 -5394:2:1268 -5395:0:4365 -5396:3:2427 -5397:0:4365 -5398:2:1270 -5399:0:4365 -5400:3:2428 -5401:0:4365 -5402:2:1271 -5403:2:1275 -5404:2:1276 -5405:2:1284 -5406:2:1285 -5407:2:1289 -5408:2:1290 -5409:2:1284 -5410:2:1285 -5411:2:1289 -5412:2:1290 -5413:2:1298 -5414:2:1303 -5415:2:1307 -5416:2:1308 -5417:2:1315 -5418:2:1316 -5419:2:1327 -5420:2:1328 -5421:2:1329 -5422:2:1327 -5423:2:1328 -5424:2:1329 -5425:2:1340 -5426:2:1345 -5427:2:1346 -5428:0:4365 -5429:2:1358 -5430:0:4365 -5431:2:1360 -5432:0:4365 -5433:3:2427 -5434:0:4365 -5435:2:1361 -5436:0:4365 -5437:3:2428 -5438:0:4365 -5439:2:1362 -5440:2:1366 -5441:2:1367 -5442:2:1375 -5443:2:1376 -5444:2:1380 -5445:2:1381 -5446:2:1375 -5447:2:1376 -5448:2:1380 -5449:2:1381 -5450:2:1389 -5451:2:1394 -5452:2:1398 -5453:2:1399 -5454:2:1406 -5455:2:1407 -5456:2:1418 -5457:2:1419 -5458:2:1420 -5459:2:1418 -5460:2:1419 -5461:2:1420 -5462:2:1431 -5463:2:1436 -5464:2:1437 -5465:0:4365 -5466:2:1449 -5467:0:4365 -5468:3:2427 -5469:0:4365 -5470:2:1451 -5471:0:4365 -5472:3:2428 -5473:0:4365 -5474:2:1652 -5475:0:4365 -5476:2:1653 -5477:0:4365 -5478:2:1657 -5479:0:4365 -5480:2:1660 -5481:0:4365 -5482:3:2427 -5483:0:4365 -5484:2:1665 -5485:2:1669 -5486:2:1670 -5487:2:1678 -5488:2:1679 -5489:2:1683 -5490:2:1684 -5491:2:1678 -5492:2:1679 -5493:2:1680 -5494:2:1692 -5495:2:1697 -5496:2:1701 -5497:2:1702 -5498:2:1709 -5499:2:1710 -5500:2:1721 -5501:2:1722 -5502:2:1723 -5503:2:1721 -5504:2:1722 -5505:2:1723 -5506:2:1734 -5507:2:1739 -5508:2:1740 -5509:0:4365 -5510:3:2428 -5511:0:4365 -5512:2:1752 -5513:0:4365 -5514:3:2427 -5515:0:4365 -5516:2:1754 -5517:0:4365 -5518:3:2428 -5519:0:4365 -5520:2:1755 -5521:2:1759 -5522:2:1760 -5523:2:1768 -5524:2:1769 -5525:2:1773 -5526:2:1774 -5527:2:1768 -5528:2:1769 -5529:2:1773 -5530:2:1774 -5531:2:1782 -5532:2:1787 -5533:2:1791 -5534:2:1792 -5535:2:1799 -5536:2:1800 -5537:2:1811 -5538:2:1812 -5539:2:1813 -5540:2:1811 -5541:2:1812 -5542:2:1813 -5543:2:1824 -5544:2:1829 -5545:2:1830 -5546:0:4365 -5547:2:1842 -5548:0:4365 -5549:3:2427 -5550:0:4365 -5551:2:1844 -5552:0:4365 -5553:3:2428 -5554:0:4365 -5555:2:1845 -5556:2:1849 -5557:2:1850 -5558:2:1858 -5559:2:1859 -5560:2:1863 -5561:2:1864 -5562:2:1858 -5563:2:1859 -5564:2:1863 -5565:2:1864 -5566:2:1872 -5567:2:1877 -5568:2:1881 -5569:2:1882 -5570:2:1889 -5571:2:1890 -5572:2:1901 -5573:2:1902 -5574:2:1903 -5575:2:1901 -5576:2:1902 -5577:2:1903 -5578:2:1914 -5579:2:1919 -5580:2:1920 -5581:0:4365 -5582:2:1932 -5583:0:4365 -5584:3:2427 -5585:0:4365 -5586:2:1934 -5587:0:4365 -5588:3:2428 -5589:0:4365 -5590:2:1935 -5591:0:4365 -5592:2:1936 -5593:0:4365 -5594:2:2129 -5595:0:4365 -5596:2:2130 -5597:0:4365 -5598:2:2134 -5599:0:4365 -5600:3:2427 -5601:0:4365 -5602:2:2136 -5603:0:4365 -5604:3:2428 -5605:0:4365 -5606:2:2137 -5607:2:2141 -5608:2:2142 -5609:2:2150 -5610:2:2151 -5611:2:2155 -5612:2:2156 -5613:2:2150 -5614:2:2151 -5615:2:2155 -5616:2:2156 -5617:2:2164 -5618:2:2169 -5619:2:2173 -5620:2:2174 -5621:2:2181 -5622:2:2182 -5623:2:2193 -5624:2:2194 -5625:2:2195 -5626:2:2193 -5627:2:2194 -5628:2:2195 -5629:2:2206 -5630:2:2211 -5631:2:2212 -5632:0:4365 -5633:2:2224 -5634:0:4365 -5635:3:2427 -5636:0:4365 -5637:2:2226 -5638:0:4365 -5639:3:2428 -5640:0:4365 -5641:2:2230 -5642:0:4365 -5643:3:2427 -5644:0:4365 -5645:2:2235 -5646:2:2239 -5647:2:2240 -5648:2:2248 -5649:2:2249 -5650:2:2253 -5651:2:2254 -5652:2:2248 -5653:2:2249 -5654:2:2250 -5655:2:2262 -5656:2:2267 -5657:2:2271 -5658:2:2272 -5659:2:2279 -5660:2:2280 -5661:2:2291 -5662:2:2292 -5663:2:2293 -5664:2:2291 -5665:2:2292 -5666:2:2293 -5667:2:2304 -5668:2:2309 -5669:2:2310 -5670:0:4365 -5671:3:2428 -5672:0:4365 -5673:2:2322 -5674:0:4365 -5675:2:1169 -5676:0:4365 -5677:3:2427 -5678:0:4365 -5679:2:1170 -5680:0:4365 -5681:3:2428 -5682:0:4365 -5683:3:2429 -5684:0:4365 -5685:3:2435 -5686:3:2436 -5687:0:4365 -5688:3:2440 -5689:3:2444 -5690:3:2445 -5691:3:2453 -5692:3:2454 -5693:3:2458 -5694:3:2459 -5695:3:2453 -5696:3:2454 -5697:3:2458 -5698:3:2459 -5699:3:2467 -5700:3:2472 -5701:3:2473 -5702:3:2484 -5703:3:2485 -5704:3:2496 -5705:3:2497 -5706:3:2498 -5707:3:2496 -5708:3:2497 -5709:3:2498 -5710:3:2509 -5711:3:2514 -5712:3:2515 -5713:0:4365 -5714:3:2527 -5715:0:4365 -5716:3:2528 -5717:0:4365 -5718:2:1173 -5719:0:4365 -5720:3:2529 -5721:0:4365 -5722:2:1179 -5723:0:4365 -5724:2:1180 -5725:0:4365 -5726:3:2528 -5727:0:4365 -5728:2:1181 -5729:2:1185 -5730:2:1186 -5731:2:1194 -5732:2:1195 -5733:2:1199 -5734:2:1200 -5735:2:1194 -5736:2:1195 -5737:2:1199 -5738:2:1200 -5739:2:1208 -5740:2:1213 -5741:2:1217 -5742:2:1218 -5743:2:1225 -5744:2:1226 -5745:2:1237 -5746:2:1238 -5747:2:1239 -5748:2:1237 -5749:2:1238 -5750:2:1239 -5751:2:1250 -5752:2:1255 -5753:2:1256 -5754:0:4365 -5755:3:2529 -5756:0:4365 -5757:2:1268 -5758:0:4365 -5759:3:2528 -5760:0:4365 -5761:2:1270 -5762:0:4365 -5763:3:2529 -5764:0:4365 -5765:2:1271 -5766:2:1275 -5767:2:1276 -5768:2:1284 -5769:2:1285 -5770:2:1289 -5771:2:1290 -5772:2:1284 -5773:2:1285 -5774:2:1289 -5775:2:1290 -5776:2:1298 -5777:2:1303 -5778:2:1307 -5779:2:1308 -5780:2:1315 -5781:2:1316 -5782:2:1327 -5783:2:1328 -5784:2:1329 -5785:2:1327 -5786:2:1328 -5787:2:1329 -5788:2:1340 -5789:2:1345 -5790:2:1346 -5791:0:4365 -5792:2:1358 -5793:0:4365 -5794:2:1360 -5795:0:4365 -5796:3:2528 -5797:0:4365 -5798:2:1361 -5799:0:4365 -5800:3:2529 -5801:0:4365 -5802:2:1362 -5803:2:1366 -5804:2:1367 -5805:2:1375 -5806:2:1376 -5807:2:1380 -5808:2:1381 -5809:2:1375 -5810:2:1376 -5811:2:1380 -5812:2:1381 -5813:2:1389 -5814:2:1394 -5815:2:1398 -5816:2:1399 -5817:2:1406 -5818:2:1407 -5819:2:1418 -5820:2:1419 -5821:2:1420 -5822:2:1418 -5823:2:1419 -5824:2:1420 -5825:2:1431 -5826:2:1436 -5827:2:1437 -5828:0:4365 -5829:2:1449 -5830:0:4365 -5831:3:2528 -5832:0:4365 -5833:2:1451 -5834:0:4365 -5835:3:2529 -5836:0:4365 -5837:2:1652 -5838:0:4365 -5839:2:1653 -5840:0:4365 -5841:2:1657 -5842:0:4365 -5843:2:1660 -5844:0:4365 -5845:3:2528 -5846:0:4365 -5847:2:1665 -5848:2:1669 -5849:2:1670 -5850:2:1678 -5851:2:1679 -5852:2:1683 -5853:2:1684 -5854:2:1678 -5855:2:1679 -5856:2:1680 -5857:2:1692 -5858:2:1697 -5859:2:1701 -5860:2:1702 -5861:2:1709 -5862:2:1710 -5863:2:1721 -5864:2:1722 -5865:2:1723 -5866:2:1721 -5867:2:1722 -5868:2:1723 -5869:2:1734 -5870:2:1739 -5871:2:1740 -5872:0:4365 -5873:3:2529 -5874:0:4365 -5875:2:1752 -5876:0:4365 -5877:3:2528 -5878:0:4365 -5879:2:1754 -5880:0:4365 -5881:3:2529 -5882:0:4365 -5883:2:1755 -5884:2:1759 -5885:2:1760 -5886:2:1768 -5887:2:1769 -5888:2:1773 -5889:2:1774 -5890:2:1768 -5891:2:1769 -5892:2:1773 -5893:2:1774 -5894:2:1782 -5895:2:1787 -5896:2:1791 -5897:2:1792 -5898:2:1799 -5899:2:1800 -5900:2:1811 -5901:2:1812 -5902:2:1813 -5903:2:1811 -5904:2:1812 -5905:2:1813 -5906:2:1824 -5907:2:1829 -5908:2:1830 -5909:0:4365 -5910:2:1842 -5911:0:4365 -5912:3:2528 -5913:0:4365 -5914:2:1844 -5915:0:4365 -5916:3:2529 -5917:0:4365 -5918:2:1845 -5919:2:1849 -5920:2:1850 -5921:2:1858 -5922:2:1859 -5923:2:1863 -5924:2:1864 -5925:2:1858 -5926:2:1859 -5927:2:1863 -5928:2:1864 -5929:2:1872 -5930:2:1877 -5931:2:1881 -5932:2:1882 -5933:2:1889 -5934:2:1890 -5935:2:1901 -5936:2:1902 -5937:2:1903 -5938:2:1901 -5939:2:1902 -5940:2:1903 -5941:2:1914 -5942:2:1919 -5943:2:1920 -5944:0:4365 -5945:2:1932 -5946:0:4365 -5947:3:2528 -5948:0:4365 -5949:2:1934 -5950:0:4365 -5951:3:2529 -5952:0:4365 -5953:2:1935 -5954:0:4365 -5955:2:1936 -5956:0:4365 -5957:2:2129 -5958:0:4365 -5959:2:2130 -5960:0:4365 -5961:2:2134 -5962:0:4365 -5963:3:2528 -5964:0:4365 -5965:2:2136 -5966:0:4365 -5967:3:2529 -5968:0:4365 -5969:2:2137 -5970:2:2141 -5971:2:2142 -5972:2:2150 -5973:2:2151 -5974:2:2155 -5975:2:2156 -5976:2:2150 -5977:2:2151 -5978:2:2155 -5979:2:2156 -5980:2:2164 -5981:2:2169 -5982:2:2173 -5983:2:2174 -5984:2:2181 -5985:2:2182 -5986:2:2193 -5987:2:2194 -5988:2:2195 -5989:2:2193 -5990:2:2194 -5991:2:2195 -5992:2:2206 -5993:2:2211 -5994:2:2212 -5995:0:4365 -5996:2:2224 -5997:0:4365 -5998:3:2528 -5999:0:4365 -6000:2:2226 -6001:0:4365 -6002:3:2529 -6003:0:4365 -6004:2:2230 -6005:0:4365 -6006:3:2528 -6007:0:4365 -6008:2:2235 -6009:2:2239 -6010:2:2240 -6011:2:2248 -6012:2:2249 -6013:2:2253 -6014:2:2254 -6015:2:2248 -6016:2:2249 -6017:2:2250 -6018:2:2262 -6019:2:2267 -6020:2:2271 -6021:2:2272 -6022:2:2279 -6023:2:2280 -6024:2:2291 -6025:2:2292 -6026:2:2293 -6027:2:2291 -6028:2:2292 -6029:2:2293 -6030:2:2304 -6031:2:2309 -6032:2:2310 -6033:0:4365 -6034:3:2529 -6035:0:4365 -6036:2:2322 -6037:0:4365 -6038:2:1169 -6039:0:4365 -6040:3:2528 -6041:0:4365 -6042:2:1170 -6043:0:4365 -6044:3:2529 -6045:0:4365 -6046:3:2530 -6047:0:4365 -6048:3:2536 -6049:0:4365 -6050:3:2537 -6051:0:4365 -6052:3:2547 -6053:0:4365 -6054:3:2548 -6055:0:4365 -6056:3:2552 -6057:3:2553 -6058:3:2557 -6059:3:2561 -6060:3:2562 -6061:3:2557 -6062:3:2561 -6063:3:2562 -6064:3:2566 -6065:3:2574 -6066:3:2575 -6067:3:2580 -6068:3:2587 -6069:3:2588 -6070:3:2587 -6071:3:2588 -6072:3:2595 -6073:3:2600 -6074:0:4365 -6075:3:2611 -6076:0:4365 -6077:3:2615 -6078:3:2616 -6079:3:2620 -6080:3:2624 -6081:3:2625 -6082:3:2620 -6083:3:2624 -6084:3:2625 -6085:3:2629 -6086:3:2637 -6087:3:2638 -6088:3:2643 -6089:3:2650 -6090:3:2651 -6091:3:2650 -6092:3:2651 -6093:3:2658 -6094:3:2663 -6095:0:4365 -6096:3:2611 -6097:0:4365 -6098:3:2615 -6099:3:2616 -6100:3:2620 -6101:3:2624 -6102:3:2625 -6103:3:2620 -6104:3:2624 -6105:3:2625 -6106:3:2629 -6107:3:2637 -6108:3:2638 -6109:3:2643 -6110:3:2650 -6111:3:2651 -6112:3:2650 -6113:3:2651 -6114:3:2658 -6115:3:2663 -6116:0:4365 -6117:3:2674 -6118:0:4365 -6119:3:2682 -6120:3:2683 -6121:3:2687 -6122:3:2691 -6123:3:2692 -6124:3:2687 -6125:3:2691 -6126:3:2692 -6127:3:2696 -6128:3:2704 -6129:3:2705 -6130:3:2710 -6131:3:2717 -6132:3:2718 -6133:3:2717 -6134:3:2718 -6135:3:2725 -6136:3:2730 -6137:0:4365 -6138:3:2745 -6139:0:4365 -6140:3:2746 -6141:0:4365 -6142:2:1173 -6143:0:4365 -6144:3:2747 -6145:0:4365 -6146:2:1179 -6147:0:4365 -6148:2:1180 -6149:0:4365 -6150:3:2746 -6151:0:4365 -6152:2:1181 -6153:2:1185 -6154:2:1186 -6155:2:1194 -6156:2:1195 -6157:2:1199 -6158:2:1200 -6159:2:1194 -6160:2:1195 -6161:2:1199 -6162:2:1200 -6163:2:1208 -6164:2:1213 -6165:2:1217 -6166:2:1218 -6167:2:1225 -6168:2:1226 -6169:2:1237 -6170:2:1238 -6171:2:1239 -6172:2:1237 -6173:2:1238 -6174:2:1239 -6175:2:1250 -6176:2:1255 -6177:2:1256 -6178:0:4365 -6179:3:2747 -6180:0:4365 -6181:2:1268 -6182:0:4365 -6183:3:2746 -6184:0:4365 -6185:2:1270 -6186:0:4365 -6187:3:2747 -6188:0:4365 -6189:2:1271 -6190:2:1275 -6191:2:1276 -6192:2:1284 -6193:2:1285 -6194:2:1289 -6195:2:1290 -6196:2:1284 -6197:2:1285 -6198:2:1289 -6199:2:1290 -6200:2:1298 -6201:2:1303 -6202:2:1307 -6203:2:1308 -6204:2:1315 -6205:2:1316 -6206:2:1327 -6207:2:1328 -6208:2:1329 -6209:2:1327 -6210:2:1328 -6211:2:1329 -6212:2:1340 -6213:2:1345 -6214:2:1346 -6215:0:4365 -6216:2:1358 -6217:0:4365 -6218:2:1360 -6219:0:4365 -6220:3:2746 -6221:0:4365 -6222:2:1361 -6223:0:4365 -6224:3:2747 -6225:0:4365 -6226:2:1362 -6227:2:1366 -6228:2:1367 -6229:2:1375 -6230:2:1376 -6231:2:1380 -6232:2:1381 -6233:2:1375 -6234:2:1376 -6235:2:1380 -6236:2:1381 -6237:2:1389 -6238:2:1394 -6239:2:1398 -6240:2:1399 -6241:2:1406 -6242:2:1407 -6243:2:1418 -6244:2:1419 -6245:2:1420 -6246:2:1418 -6247:2:1419 -6248:2:1420 -6249:2:1431 -6250:2:1436 -6251:2:1437 -6252:0:4365 -6253:2:1449 -6254:0:4365 -6255:3:2746 -6256:0:4365 -6257:2:1451 -6258:0:4365 -6259:3:2747 -6260:0:4365 -6261:2:1652 -6262:0:4365 -6263:2:1653 -6264:0:4365 -6265:2:1657 -6266:0:4365 -6267:2:1660 -6268:0:4365 -6269:3:2746 -6270:0:4365 -6271:2:1665 -6272:2:1669 -6273:2:1670 -6274:2:1678 -6275:2:1679 -6276:2:1683 -6277:2:1684 -6278:2:1678 -6279:2:1679 -6280:2:1680 -6281:2:1692 -6282:2:1697 -6283:2:1701 -6284:2:1702 -6285:2:1709 -6286:2:1710 -6287:2:1721 -6288:2:1722 -6289:2:1723 -6290:2:1721 -6291:2:1722 -6292:2:1723 -6293:2:1734 -6294:2:1739 -6295:2:1740 -6296:0:4365 -6297:3:2747 -6298:0:4365 -6299:2:1752 -6300:0:4365 -6301:3:2746 -6302:0:4365 -6303:2:1754 -6304:0:4365 -6305:3:2747 -6306:0:4365 -6307:2:1755 -6308:2:1759 -6309:2:1760 -6310:2:1768 -6311:2:1769 -6312:2:1773 -6313:2:1774 -6314:2:1768 -6315:2:1769 -6316:2:1773 -6317:2:1774 -6318:2:1782 -6319:2:1787 -6320:2:1791 -6321:2:1792 -6322:2:1799 -6323:2:1800 -6324:2:1811 -6325:2:1812 -6326:2:1813 -6327:2:1811 -6328:2:1812 -6329:2:1813 -6330:2:1824 -6331:2:1829 -6332:2:1830 -6333:0:4365 -6334:2:1842 -6335:0:4365 -6336:3:2746 -6337:0:4365 -6338:2:1844 -6339:0:4365 -6340:3:2747 -6341:0:4365 -6342:2:1845 -6343:2:1849 -6344:2:1850 -6345:2:1858 -6346:2:1859 -6347:2:1863 -6348:2:1864 -6349:2:1858 -6350:2:1859 -6351:2:1863 -6352:2:1864 -6353:2:1872 -6354:2:1877 -6355:2:1881 -6356:2:1882 -6357:2:1889 -6358:2:1890 -6359:2:1901 -6360:2:1902 -6361:2:1903 -6362:2:1901 -6363:2:1902 -6364:2:1903 -6365:2:1914 -6366:2:1919 -6367:2:1920 -6368:0:4365 -6369:2:1932 -6370:0:4365 -6371:3:2746 -6372:0:4365 -6373:2:1934 -6374:0:4365 -6375:3:2747 -6376:0:4365 -6377:2:1935 -6378:0:4365 -6379:2:1936 -6380:0:4365 -6381:2:2129 -6382:0:4365 -6383:2:2130 -6384:0:4365 -6385:2:2134 -6386:0:4365 -6387:3:2746 -6388:0:4365 -6389:2:2136 -6390:0:4365 -6391:3:2747 -6392:0:4365 -6393:2:2137 -6394:2:2141 -6395:2:2142 -6396:2:2150 -6397:2:2151 -6398:2:2155 -6399:2:2156 -6400:2:2150 -6401:2:2151 -6402:2:2155 -6403:2:2156 -6404:2:2164 -6405:2:2169 -6406:2:2173 -6407:2:2174 -6408:2:2181 -6409:2:2182 -6410:2:2193 -6411:2:2194 -6412:2:2195 -6413:2:2193 -6414:2:2194 -6415:2:2195 -6416:2:2206 -6417:2:2211 -6418:2:2212 -6419:0:4365 -6420:2:2224 -6421:0:4365 -6422:3:2746 -6423:0:4365 -6424:2:2226 -6425:0:4365 -6426:3:2747 -6427:0:4365 -6428:2:2230 -6429:0:4365 -6430:3:2746 -6431:0:4365 -6432:2:2235 -6433:2:2239 -6434:2:2240 -6435:2:2248 -6436:2:2249 -6437:2:2253 -6438:2:2254 -6439:2:2248 -6440:2:2249 -6441:2:2250 -6442:2:2262 -6443:2:2267 -6444:2:2271 -6445:2:2272 -6446:2:2279 -6447:2:2280 -6448:2:2291 -6449:2:2292 -6450:2:2293 -6451:2:2291 -6452:2:2292 -6453:2:2293 -6454:2:2304 -6455:2:2309 -6456:2:2310 -6457:0:4365 -6458:3:2747 -6459:0:4365 -6460:2:2322 -6461:0:4365 -6462:2:1169 -6463:0:4365 -6464:3:2746 -6465:0:4365 -6466:2:1170 -6467:0:4365 -6468:3:2747 -6469:0:4365 -6470:3:2748 -6471:0:4365 -6472:3:2754 -6473:0:4365 -6474:3:2755 -6475:3:2759 -6476:3:2760 -6477:3:2768 -6478:3:2769 -6479:3:2773 -6480:3:2774 -6481:3:2768 -6482:3:2769 -6483:3:2773 -6484:3:2774 -6485:3:2782 -6486:3:2787 -6487:3:2791 -6488:3:2792 -6489:3:2799 -6490:3:2800 -6491:3:2811 -6492:3:2812 -6493:3:2813 -6494:3:2811 -6495:3:2812 -6496:3:2813 -6497:3:2824 -6498:3:2829 -6499:3:2830 -6500:0:4365 -6501:3:2842 -6502:0:4365 -6503:3:2843 -6504:0:4365 -6505:2:1173 -6506:0:4365 -6507:3:2844 -6508:0:4365 -6509:2:1179 -6510:0:4365 -6511:2:1180 -6512:0:4365 -6513:3:2843 -6514:0:4365 -6515:2:1181 -6516:2:1185 -6517:2:1186 -6518:2:1194 -6519:2:1195 -6520:2:1199 -6521:2:1200 -6522:2:1194 -6523:2:1195 -6524:2:1199 -6525:2:1200 -6526:2:1208 -6527:2:1213 -6528:2:1217 -6529:2:1218 -6530:2:1225 -6531:2:1226 -6532:2:1237 -6533:2:1238 -6534:2:1239 -6535:2:1237 -6536:2:1238 -6537:2:1239 -6538:2:1250 -6539:2:1255 -6540:2:1256 -6541:0:4365 -6542:3:2844 -6543:0:4365 -6544:2:1268 -6545:0:4365 -6546:3:2843 -6547:0:4365 -6548:2:1270 -6549:0:4365 -6550:3:2844 -6551:0:4365 -6552:2:1271 -6553:2:1275 -6554:2:1276 -6555:2:1284 -6556:2:1285 -6557:2:1289 -6558:2:1290 -6559:2:1284 -6560:2:1285 -6561:2:1289 -6562:2:1290 -6563:2:1298 -6564:2:1303 -6565:2:1307 -6566:2:1308 -6567:2:1315 -6568:2:1316 -6569:2:1327 -6570:2:1328 -6571:2:1329 -6572:2:1327 -6573:2:1328 -6574:2:1329 -6575:2:1340 -6576:2:1345 -6577:2:1346 -6578:0:4365 -6579:2:1358 -6580:0:4365 -6581:2:1360 -6582:0:4365 -6583:3:2843 -6584:0:4365 -6585:2:1361 -6586:0:4365 -6587:3:2844 -6588:0:4365 -6589:2:1362 -6590:2:1366 -6591:2:1367 -6592:2:1375 -6593:2:1376 -6594:2:1380 -6595:2:1381 -6596:2:1375 -6597:2:1376 -6598:2:1380 -6599:2:1381 -6600:2:1389 -6601:2:1394 -6602:2:1398 -6603:2:1399 -6604:2:1406 -6605:2:1407 -6606:2:1418 -6607:2:1419 -6608:2:1420 -6609:2:1418 -6610:2:1419 -6611:2:1420 -6612:2:1431 -6613:2:1436 -6614:2:1437 -6615:0:4365 -6616:2:1449 -6617:0:4365 -6618:3:2843 -6619:0:4365 -6620:2:1451 -6621:0:4365 -6622:3:2844 -6623:0:4365 -6624:2:1652 -6625:0:4365 -6626:2:1653 -6627:0:4365 -6628:2:1657 -6629:0:4365 -6630:2:1660 -6631:0:4365 -6632:3:2843 -6633:0:4365 -6634:2:1665 -6635:2:1669 -6636:2:1670 -6637:2:1678 -6638:2:1679 -6639:2:1683 -6640:2:1684 -6641:2:1678 -6642:2:1679 -6643:2:1680 -6644:2:1692 -6645:2:1697 -6646:2:1701 -6647:2:1702 -6648:2:1709 -6649:2:1710 -6650:2:1721 -6651:2:1722 -6652:2:1723 -6653:2:1721 -6654:2:1722 -6655:2:1723 -6656:2:1734 -6657:2:1739 -6658:2:1740 -6659:0:4365 -6660:3:2844 -6661:0:4365 -6662:2:1752 -6663:0:4365 -6664:3:2843 -6665:0:4365 -6666:2:1754 -6667:0:4365 -6668:3:2844 -6669:0:4365 -6670:2:1755 -6671:2:1759 -6672:2:1760 -6673:2:1768 -6674:2:1769 -6675:2:1773 -6676:2:1774 -6677:2:1768 -6678:2:1769 -6679:2:1773 -6680:2:1774 -6681:2:1782 -6682:2:1787 -6683:2:1791 -6684:2:1792 -6685:2:1799 -6686:2:1800 -6687:2:1811 -6688:2:1812 -6689:2:1813 -6690:2:1811 -6691:2:1812 -6692:2:1813 -6693:2:1824 -6694:2:1829 -6695:2:1830 -6696:0:4365 -6697:2:1842 -6698:0:4365 -6699:3:2843 -6700:0:4365 -6701:2:1844 -6702:0:4365 -6703:3:2844 -6704:0:4365 -6705:2:1845 -6706:2:1849 -6707:2:1850 -6708:2:1858 -6709:2:1859 -6710:2:1863 -6711:2:1864 -6712:2:1858 -6713:2:1859 -6714:2:1863 -6715:2:1864 -6716:2:1872 -6717:2:1877 -6718:2:1881 -6719:2:1882 -6720:2:1889 -6721:2:1890 -6722:2:1901 -6723:2:1902 -6724:2:1903 -6725:2:1901 -6726:2:1902 -6727:2:1903 -6728:2:1914 -6729:2:1919 -6730:2:1920 -6731:0:4365 -6732:2:1932 -6733:0:4365 -6734:3:2843 -6735:0:4365 -6736:2:1934 -6737:0:4365 -6738:3:2844 -6739:0:4365 -6740:2:1935 -6741:0:4365 -6742:2:1936 -6743:0:4365 -6744:2:2129 -6745:0:4365 -6746:2:2130 -6747:0:4365 -6748:2:2134 -6749:0:4365 -6750:3:2843 -6751:0:4365 -6752:2:2136 -6753:0:4365 -6754:3:2844 -6755:0:4365 -6756:2:2137 -6757:2:2141 -6758:2:2142 -6759:2:2150 -6760:2:2151 -6761:2:2155 -6762:2:2156 -6763:2:2150 -6764:2:2151 -6765:2:2155 -6766:2:2156 -6767:2:2164 -6768:2:2169 -6769:2:2173 -6770:2:2174 -6771:2:2181 -6772:2:2182 -6773:2:2193 -6774:2:2194 -6775:2:2195 -6776:2:2193 -6777:2:2194 -6778:2:2195 -6779:2:2206 -6780:2:2211 -6781:2:2212 -6782:0:4365 -6783:2:2224 -6784:0:4365 -6785:3:2843 -6786:0:4365 -6787:2:2226 -6788:0:4365 -6789:3:2844 -6790:0:4365 -6791:2:2230 -6792:0:4365 -6793:3:2843 -6794:0:4365 -6795:2:2235 -6796:2:2239 -6797:2:2240 -6798:2:2248 -6799:2:2249 -6800:2:2253 -6801:2:2254 -6802:2:2248 -6803:2:2249 -6804:2:2250 -6805:2:2262 -6806:2:2267 -6807:2:2271 -6808:2:2272 -6809:2:2279 -6810:2:2280 -6811:2:2291 -6812:2:2292 -6813:2:2293 -6814:2:2291 -6815:2:2292 -6816:2:2293 -6817:2:2304 -6818:2:2309 -6819:2:2310 -6820:0:4365 -6821:3:2844 -6822:0:4365 -6823:2:2322 -6824:0:4365 -6825:2:1169 -6826:0:4365 -6827:3:2843 -6828:0:4365 -6829:2:1170 -6830:0:4365 -6831:3:2844 -6832:0:4365 -6833:3:2845 -6834:0:4365 -6835:3:2851 -6836:0:4365 -6837:3:2854 -6838:3:2855 -6839:3:2867 -6840:3:2868 -6841:3:2872 -6842:3:2873 -6843:3:2867 -6844:3:2868 -6845:3:2872 -6846:3:2873 -6847:3:2881 -6848:3:2886 -6849:3:2890 -6850:3:2891 -6851:3:2898 -6852:3:2899 -6853:3:2910 -6854:3:2911 -6855:3:2912 -6856:3:2910 -6857:3:2911 -6858:3:2912 -6859:3:2923 -6860:3:2928 -6861:3:2929 -6862:0:4365 -6863:3:2941 -6864:0:4365 -6865:3:2942 -6866:0:4365 -6867:2:1173 -6868:0:4365 -6869:3:2943 -6870:0:4365 -6871:2:1179 -6872:0:4365 -6873:2:1180 -6874:0:4365 -6875:3:2942 -6876:0:4365 -6877:2:1181 -6878:2:1185 -6879:2:1186 -6880:2:1194 -6881:2:1195 -6882:2:1199 -6883:2:1200 -6884:2:1194 -6885:2:1195 -6886:2:1199 -6887:2:1200 -6888:2:1208 -6889:2:1213 -6890:2:1217 -6891:2:1218 -6892:2:1225 -6893:2:1226 -6894:2:1237 -6895:2:1238 -6896:2:1239 -6897:2:1237 -6898:2:1238 -6899:2:1239 -6900:2:1250 -6901:2:1255 -6902:2:1256 -6903:0:4365 -6904:3:2943 -6905:0:4365 -6906:2:1268 -6907:0:4365 -6908:3:2942 -6909:0:4365 -6910:2:1270 -6911:0:4365 -6912:3:2943 -6913:0:4365 -6914:2:1271 -6915:2:1275 -6916:2:1276 -6917:2:1284 -6918:2:1285 -6919:2:1289 -6920:2:1290 -6921:2:1284 -6922:2:1285 -6923:2:1289 -6924:2:1290 -6925:2:1298 -6926:2:1303 -6927:2:1307 -6928:2:1308 -6929:2:1315 -6930:2:1316 -6931:2:1327 -6932:2:1328 -6933:2:1329 -6934:2:1327 -6935:2:1328 -6936:2:1329 -6937:2:1340 -6938:2:1345 -6939:2:1346 -6940:0:4365 -6941:2:1358 -6942:0:4365 -6943:2:1360 -6944:0:4365 -6945:3:2942 -6946:0:4365 -6947:2:1361 -6948:0:4365 -6949:3:2943 -6950:0:4365 -6951:2:1362 -6952:2:1366 -6953:2:1367 -6954:2:1375 -6955:2:1376 -6956:2:1380 -6957:2:1381 -6958:2:1375 -6959:2:1376 -6960:2:1380 -6961:2:1381 -6962:2:1389 -6963:2:1394 -6964:2:1398 -6965:2:1399 -6966:2:1406 -6967:2:1407 -6968:2:1418 -6969:2:1419 -6970:2:1420 -6971:2:1418 -6972:2:1419 -6973:2:1420 -6974:2:1431 -6975:2:1436 -6976:2:1437 -6977:0:4365 -6978:2:1449 -6979:0:4365 -6980:3:2942 -6981:0:4365 -6982:2:1451 -6983:0:4365 -6984:3:2943 -6985:0:4365 -6986:2:1652 -6987:0:4365 -6988:2:1653 -6989:0:4365 -6990:2:1657 -6991:0:4365 -6992:2:1660 -6993:0:4365 -6994:3:2942 -6995:0:4365 -6996:2:1665 -6997:2:1669 -6998:2:1670 -6999:2:1678 -7000:2:1679 -7001:2:1683 -7002:2:1684 -7003:2:1678 -7004:2:1679 -7005:2:1680 -7006:2:1692 -7007:2:1697 -7008:2:1701 -7009:2:1702 -7010:2:1709 -7011:2:1710 -7012:2:1721 -7013:2:1722 -7014:2:1723 -7015:2:1721 -7016:2:1722 -7017:2:1723 -7018:2:1734 -7019:2:1739 -7020:2:1740 -7021:0:4365 -7022:3:2943 -7023:0:4365 -7024:2:1752 -7025:0:4365 -7026:3:2942 -7027:0:4365 -7028:2:1754 -7029:0:4365 -7030:3:2943 -7031:0:4365 -7032:2:1755 -7033:2:1759 -7034:2:1760 -7035:2:1768 -7036:2:1769 -7037:2:1773 -7038:2:1774 -7039:2:1768 -7040:2:1769 -7041:2:1773 -7042:2:1774 -7043:2:1782 -7044:2:1787 -7045:2:1791 -7046:2:1792 -7047:2:1799 -7048:2:1800 -7049:2:1811 -7050:2:1812 -7051:2:1813 -7052:2:1811 -7053:2:1812 -7054:2:1813 -7055:2:1824 -7056:2:1829 -7057:2:1830 -7058:0:4365 -7059:2:1842 -7060:0:4365 -7061:3:2942 -7062:0:4365 -7063:2:1844 -7064:0:4365 -7065:3:2943 -7066:0:4365 -7067:2:1845 -7068:2:1849 -7069:2:1850 -7070:2:1858 -7071:2:1859 -7072:2:1863 -7073:2:1864 -7074:2:1858 -7075:2:1859 -7076:2:1863 -7077:2:1864 -7078:2:1872 -7079:2:1877 -7080:2:1881 -7081:2:1882 -7082:2:1889 -7083:2:1890 -7084:2:1901 -7085:2:1902 -7086:2:1903 -7087:2:1901 -7088:2:1902 -7089:2:1903 -7090:2:1914 -7091:2:1919 -7092:2:1920 -7093:0:4365 -7094:2:1932 -7095:0:4365 -7096:3:2942 -7097:0:4365 -7098:2:1934 -7099:0:4365 -7100:3:2943 -7101:0:4365 -7102:2:1935 -7103:0:4365 -7104:2:1936 -7105:0:4365 -7106:2:2129 -7107:0:4365 -7108:2:2130 -7109:0:4365 -7110:2:2134 -7111:0:4365 -7112:3:2942 -7113:0:4365 -7114:2:2136 -7115:0:4365 -7116:3:2943 -7117:0:4365 -7118:2:2137 -7119:2:2141 -7120:2:2142 -7121:2:2150 -7122:2:2151 -7123:2:2155 -7124:2:2156 -7125:2:2150 -7126:2:2151 -7127:2:2155 -7128:2:2156 -7129:2:2164 -7130:2:2169 -7131:2:2173 -7132:2:2174 -7133:2:2181 -7134:2:2182 -7135:2:2193 -7136:2:2194 -7137:2:2195 -7138:2:2193 -7139:2:2194 -7140:2:2195 -7141:2:2206 -7142:2:2211 -7143:2:2212 -7144:0:4365 -7145:2:2224 -7146:0:4365 -7147:3:2942 -7148:0:4365 -7149:2:2226 -7150:0:4365 -7151:3:2943 -7152:0:4365 -7153:2:2230 -7154:0:4365 -7155:3:2942 -7156:0:4365 -7157:2:2235 -7158:2:2239 -7159:2:2240 -7160:2:2248 -7161:2:2249 -7162:2:2253 -7163:2:2254 -7164:2:2248 -7165:2:2249 -7166:2:2250 -7167:2:2262 -7168:2:2267 -7169:2:2271 -7170:2:2272 -7171:2:2279 -7172:2:2280 -7173:2:2291 -7174:2:2292 -7175:2:2293 -7176:2:2291 -7177:2:2292 -7178:2:2293 -7179:2:2304 -7180:2:2309 -7181:2:2310 -7182:0:4365 -7183:3:2943 -7184:0:4365 -7185:2:2322 -7186:0:4365 -7187:2:1169 -7188:0:4365 -7189:3:2942 -7190:0:4365 -7191:2:1170 -7192:0:4365 -7193:3:2943 -7194:0:4365 -7195:3:2944 -7196:0:4365 -7197:3:2950 -7198:0:4365 -7199:3:2951 -7200:0:4365 -7201:3:2952 -7202:0:4365 -7203:3:2953 -7204:0:4365 -7205:3:2954 -7206:3:2958 -7207:3:2959 -7208:3:2967 -7209:3:2968 -7210:3:2972 -7211:3:2973 -7212:3:2967 -7213:3:2968 -7214:3:2972 -7215:3:2973 -7216:3:2981 -7217:3:2986 -7218:3:2990 -7219:3:2991 -7220:3:2998 -7221:3:2999 -7222:3:3010 -7223:3:3011 -7224:3:3012 -7225:3:3010 -7226:3:3011 -7227:3:3012 -7228:3:3023 -7229:3:3028 -7230:3:3029 -7231:0:4365 -7232:3:3041 -7233:0:4365 -7234:3:3042 -7235:0:4365 -7236:2:1173 -7237:0:4365 -7238:3:3043 -7239:0:4365 -7240:2:1179 -7241:0:4365 -7242:2:1180 -7243:0:4365 -7244:3:3042 -7245:0:4365 -7246:2:1181 -7247:2:1185 -7248:2:1186 -7249:2:1194 -7250:2:1195 -7251:2:1199 -7252:2:1200 -7253:2:1194 -7254:2:1195 -7255:2:1199 -7256:2:1200 -7257:2:1208 -7258:2:1213 -7259:2:1217 -7260:2:1218 -7261:2:1225 -7262:2:1226 -7263:2:1237 -7264:2:1238 -7265:2:1239 -7266:2:1237 -7267:2:1238 -7268:2:1239 -7269:2:1250 -7270:2:1255 -7271:2:1256 -7272:0:4365 -7273:3:3043 -7274:0:4365 -7275:2:1268 -7276:0:4365 -7277:3:3042 -7278:0:4365 -7279:2:1270 -7280:0:4365 -7281:3:3043 -7282:0:4365 -7283:2:1271 -7284:2:1275 -7285:2:1276 -7286:2:1284 -7287:2:1285 -7288:2:1289 -7289:2:1290 -7290:2:1284 -7291:2:1285 -7292:2:1289 -7293:2:1290 -7294:2:1298 -7295:2:1303 -7296:2:1307 -7297:2:1308 -7298:2:1315 -7299:2:1316 -7300:2:1327 -7301:2:1328 -7302:2:1329 -7303:2:1327 -7304:2:1328 -7305:2:1329 -7306:2:1340 -7307:2:1345 -7308:2:1346 -7309:0:4365 -7310:2:1358 -7311:0:4365 -7312:2:1360 -7313:0:4365 -7314:3:3042 -7315:0:4365 -7316:2:1361 -7317:0:4365 -7318:3:3043 -7319:0:4365 -7320:2:1362 -7321:2:1366 -7322:2:1367 -7323:2:1375 -7324:2:1376 -7325:2:1380 -7326:2:1381 -7327:2:1375 -7328:2:1376 -7329:2:1380 -7330:2:1381 -7331:2:1389 -7332:2:1394 -7333:2:1398 -7334:2:1399 -7335:2:1406 -7336:2:1407 -7337:2:1418 -7338:2:1419 -7339:2:1420 -7340:2:1418 -7341:2:1419 -7342:2:1420 -7343:2:1431 -7344:2:1436 -7345:2:1437 -7346:0:4365 -7347:2:1449 -7348:0:4365 -7349:3:3042 -7350:0:4365 -7351:2:1451 -7352:0:4365 -7353:3:3043 -7354:0:4365 -7355:2:1652 -7356:0:4365 -7357:2:1653 -7358:0:4365 -7359:2:1657 -7360:0:4365 -7361:2:1660 -7362:0:4365 -7363:3:3042 -7364:0:4365 -7365:2:1665 -7366:2:1669 -7367:2:1670 -7368:2:1678 -7369:2:1679 -7370:2:1683 -7371:2:1684 -7372:2:1678 -7373:2:1679 -7374:2:1680 -7375:2:1692 -7376:2:1697 -7377:2:1701 -7378:2:1702 -7379:2:1709 -7380:2:1710 -7381:2:1721 -7382:2:1722 -7383:2:1723 -7384:2:1721 -7385:2:1722 -7386:2:1723 -7387:2:1734 -7388:2:1739 -7389:2:1740 -7390:0:4365 -7391:3:3043 -7392:0:4365 -7393:2:1752 -7394:0:4365 -7395:3:3042 -7396:0:4365 -7397:2:1754 -7398:0:4365 -7399:3:3043 -7400:0:4365 -7401:2:1755 -7402:2:1759 -7403:2:1760 -7404:2:1768 -7405:2:1769 -7406:2:1773 -7407:2:1774 -7408:2:1768 -7409:2:1769 -7410:2:1773 -7411:2:1774 -7412:2:1782 -7413:2:1787 -7414:2:1791 -7415:2:1792 -7416:2:1799 -7417:2:1800 -7418:2:1811 -7419:2:1812 -7420:2:1813 -7421:2:1811 -7422:2:1812 -7423:2:1813 -7424:2:1824 -7425:2:1829 -7426:2:1830 -7427:0:4365 -7428:2:1842 -7429:0:4365 -7430:3:3042 -7431:0:4365 -7432:2:1844 -7433:0:4365 -7434:3:3043 -7435:0:4365 -7436:2:1845 -7437:2:1849 -7438:2:1850 -7439:2:1858 -7440:2:1859 -7441:2:1863 -7442:2:1864 -7443:2:1858 -7444:2:1859 -7445:2:1863 -7446:2:1864 -7447:2:1872 -7448:2:1877 -7449:2:1881 -7450:2:1882 -7451:2:1889 -7452:2:1890 -7453:2:1901 -7454:2:1902 -7455:2:1903 -7456:2:1901 -7457:2:1902 -7458:2:1903 -7459:2:1914 -7460:2:1919 -7461:2:1920 -7462:0:4365 -7463:2:1932 -7464:0:4365 -7465:3:3042 -7466:0:4365 -7467:2:1934 -7468:0:4365 -7469:3:3043 -7470:0:4365 -7471:2:1935 -7472:0:4365 -7473:2:1936 -7474:0:4365 -7475:2:2129 -7476:0:4365 -7477:2:2130 -7478:0:4365 -7479:2:2134 -7480:0:4365 -7481:3:3042 -7482:0:4365 -7483:2:2136 -7484:0:4365 -7485:3:3043 -7486:0:4365 -7487:2:2137 -7488:2:2141 -7489:2:2142 -7490:2:2150 -7491:2:2151 -7492:2:2155 -7493:2:2156 -7494:2:2150 -7495:2:2151 -7496:2:2155 -7497:2:2156 -7498:2:2164 -7499:2:2169 -7500:2:2173 -7501:2:2174 -7502:2:2181 -7503:2:2182 -7504:2:2193 -7505:2:2194 -7506:2:2195 -7507:2:2193 -7508:2:2194 -7509:2:2195 -7510:2:2206 -7511:2:2211 -7512:2:2212 -7513:0:4365 -7514:2:2224 -7515:0:4365 -7516:3:3042 -7517:0:4365 -7518:2:2226 -7519:0:4365 -7520:3:3043 -7521:0:4365 -7522:2:2230 -7523:0:4365 -7524:3:3042 -7525:0:4365 -7526:2:2235 -7527:2:2239 -7528:2:2240 -7529:2:2248 -7530:2:2249 -7531:2:2253 -7532:2:2254 -7533:2:2248 -7534:2:2249 -7535:2:2250 -7536:2:2262 -7537:2:2267 -7538:2:2271 -7539:2:2272 -7540:2:2279 -7541:2:2280 -7542:2:2291 -7543:2:2292 -7544:2:2293 -7545:2:2291 -7546:2:2292 -7547:2:2293 -7548:2:2304 -7549:2:2309 -7550:2:2310 -7551:0:4365 -7552:3:3043 -7553:0:4365 -7554:2:2322 -7555:0:4365 -7556:2:1169 -7557:0:4365 -7558:3:3042 -7559:0:4365 -7560:2:1170 -7561:0:4365 -7562:3:3043 -7563:0:4365 -7564:3:3044 -7565:0:4365 -7566:3:3257 -7567:0:4365 -7568:3:3265 -7569:0:4365 -7570:3:3266 -7571:3:3270 -7572:3:3271 -7573:3:3279 -7574:3:3280 -7575:3:3284 -7576:3:3285 -7577:3:3279 -7578:3:3280 -7579:3:3284 -7580:3:3285 -7581:3:3293 -7582:3:3298 -7583:3:3302 -7584:3:3303 -7585:3:3310 -7586:3:3311 -7587:3:3322 -7588:3:3323 -7589:3:3324 -7590:3:3322 -7591:3:3323 -7592:3:3324 -7593:3:3335 -7594:3:3340 -7595:3:3341 -7596:0:4365 -7597:3:3353 -7598:0:4365 -7599:3:3354 -7600:0:4365 -7601:2:1173 -7602:0:4365 -7603:3:3355 -7604:0:4365 -7605:2:1179 -7606:0:4365 -7607:2:1180 -7608:0:4365 -7609:3:3354 -7610:0:4365 -7611:2:1181 -7612:2:1185 -7613:2:1186 -7614:2:1194 -7615:2:1195 -7616:2:1199 -7617:2:1200 -7618:2:1194 -7619:2:1195 -7620:2:1199 -7621:2:1200 -7622:2:1208 -7623:2:1213 -7624:2:1217 -7625:2:1218 -7626:2:1225 -7627:2:1226 -7628:2:1237 -7629:2:1238 -7630:2:1239 -7631:2:1237 -7632:2:1238 -7633:2:1239 -7634:2:1250 -7635:2:1255 -7636:2:1256 -7637:0:4365 -7638:3:3355 -7639:0:4365 -7640:2:1268 -7641:0:4365 -7642:3:3354 -7643:0:4365 -7644:2:1270 -7645:0:4365 -7646:3:3355 -7647:0:4365 -7648:2:1271 -7649:2:1275 -7650:2:1276 -7651:2:1284 -7652:2:1285 -7653:2:1289 -7654:2:1290 -7655:2:1284 -7656:2:1285 -7657:2:1289 -7658:2:1290 -7659:2:1298 -7660:2:1303 -7661:2:1307 -7662:2:1308 -7663:2:1315 -7664:2:1316 -7665:2:1327 -7666:2:1328 -7667:2:1329 -7668:2:1327 -7669:2:1328 -7670:2:1329 -7671:2:1340 -7672:2:1345 -7673:2:1346 -7674:0:4365 -7675:2:1358 -7676:0:4365 -7677:2:1360 -7678:0:4365 -7679:3:3354 -7680:0:4365 -7681:2:1361 -7682:0:4365 -7683:3:3355 -7684:0:4365 -7685:2:1362 -7686:2:1366 -7687:2:1367 -7688:2:1375 -7689:2:1376 -7690:2:1380 -7691:2:1381 -7692:2:1375 -7693:2:1376 -7694:2:1380 -7695:2:1381 -7696:2:1389 -7697:2:1394 -7698:2:1398 -7699:2:1399 -7700:2:1406 -7701:2:1407 -7702:2:1418 -7703:2:1419 -7704:2:1420 -7705:2:1418 -7706:2:1419 -7707:2:1420 -7708:2:1431 -7709:2:1436 -7710:2:1437 -7711:0:4365 -7712:2:1449 -7713:0:4365 -7714:3:3354 -7715:0:4365 -7716:2:1451 -7717:0:4365 -7718:3:3355 -7719:0:4365 -7720:2:1652 -7721:0:4365 -7722:2:1653 -7723:0:4365 -7724:2:1657 -7725:0:4365 -7726:2:1660 -7727:0:4365 -7728:3:3354 -7729:0:4365 -7730:2:1665 -7731:2:1669 -7732:2:1670 -7733:2:1678 -7734:2:1679 -7735:2:1683 -7736:2:1684 -7737:2:1678 -7738:2:1679 -7739:2:1680 -7740:2:1692 -7741:2:1697 -7742:2:1701 -7743:2:1702 -7744:2:1709 -7745:2:1710 -7746:2:1721 -7747:2:1722 -7748:2:1723 -7749:2:1721 -7750:2:1722 -7751:2:1723 -7752:2:1734 -7753:2:1739 -7754:2:1740 -7755:0:4365 -7756:3:3355 -7757:0:4365 -7758:2:1752 -7759:0:4365 -7760:3:3354 -7761:0:4365 -7762:2:1754 -7763:0:4365 -7764:3:3355 -7765:0:4365 -7766:2:1755 -7767:2:1759 -7768:2:1760 -7769:2:1768 -7770:2:1769 -7771:2:1773 -7772:2:1774 -7773:2:1768 -7774:2:1769 -7775:2:1773 -7776:2:1774 -7777:2:1782 -7778:2:1787 -7779:2:1791 -7780:2:1792 -7781:2:1799 -7782:2:1800 -7783:2:1811 -7784:2:1812 -7785:2:1813 -7786:2:1811 -7787:2:1812 -7788:2:1813 -7789:2:1824 -7790:2:1829 -7791:2:1830 -7792:0:4365 -7793:2:1842 -7794:0:4365 -7795:3:3354 -7796:0:4365 -7797:2:1844 -7798:0:4365 -7799:3:3355 -7800:0:4365 -7801:2:1845 -7802:2:1849 -7803:2:1850 -7804:2:1858 -7805:2:1859 -7806:2:1863 -7807:2:1864 -7808:2:1858 -7809:2:1859 -7810:2:1863 -7811:2:1864 -7812:2:1872 -7813:2:1877 -7814:2:1881 -7815:2:1882 -7816:2:1889 -7817:2:1890 -7818:2:1901 -7819:2:1902 -7820:2:1903 -7821:2:1901 -7822:2:1902 -7823:2:1903 -7824:2:1914 -7825:2:1919 -7826:2:1920 -7827:0:4365 -7828:2:1932 -7829:0:4365 -7830:3:3354 -7831:0:4365 -7832:2:1934 -7833:0:4365 -7834:3:3355 -7835:0:4365 -7836:2:1935 -7837:0:4365 -7838:2:1936 -7839:0:4365 -7840:2:2129 -7841:0:4365 -7842:2:2130 -7843:0:4365 -7844:2:2134 -7845:0:4365 -7846:3:3354 -7847:0:4365 -7848:2:2136 -7849:0:4365 -7850:3:3355 -7851:0:4365 -7852:2:2137 -7853:2:2141 -7854:2:2142 -7855:2:2150 -7856:2:2151 -7857:2:2155 -7858:2:2156 -7859:2:2150 -7860:2:2151 -7861:2:2155 -7862:2:2156 -7863:2:2164 -7864:2:2169 -7865:2:2173 -7866:2:2174 -7867:2:2181 -7868:2:2182 -7869:2:2193 -7870:2:2194 -7871:2:2195 -7872:2:2193 -7873:2:2194 -7874:2:2195 -7875:2:2206 -7876:2:2211 -7877:2:2212 -7878:0:4365 -7879:2:2224 -7880:0:4365 -7881:3:3354 -7882:0:4365 -7883:2:2226 -7884:0:4365 -7885:3:3355 -7886:0:4365 -7887:2:2230 -7888:0:4365 -7889:3:3354 -7890:0:4365 -7891:2:2235 -7892:2:2239 -7893:2:2240 -7894:2:2248 -7895:2:2249 -7896:2:2253 -7897:2:2254 -7898:2:2248 -7899:2:2249 -7900:2:2250 -7901:2:2262 -7902:2:2267 -7903:2:2271 -7904:2:2272 -7905:2:2279 -7906:2:2280 -7907:2:2291 -7908:2:2292 -7909:2:2293 -7910:2:2291 -7911:2:2292 -7912:2:2293 -7913:2:2304 -7914:2:2309 -7915:2:2310 -7916:0:4365 -7917:3:3355 -7918:0:4365 -7919:2:2322 -7920:0:4365 -7921:2:1169 -7922:0:4365 -7923:3:3354 -7924:0:4365 -7925:2:1170 -7926:0:4365 -7927:3:3355 -7928:0:4365 -7929:3:3356 -7930:0:4365 -7931:3:3366 -7932:0:4365 -7933:3:2951 -7934:0:4365 -7935:3:2952 -7936:0:4365 -7937:3:2953 -7938:0:4365 -7939:3:2954 -7940:3:2958 -7941:3:2959 -7942:3:2967 -7943:3:2968 -7944:3:2972 -7945:3:2973 -7946:3:2967 -7947:3:2968 -7948:3:2972 -7949:3:2973 -7950:3:2981 -7951:3:2986 -7952:3:2990 -7953:3:2991 -7954:3:2998 -7955:3:2999 -7956:3:3010 -7957:3:3011 -7958:3:3012 -7959:3:3010 -7960:3:3011 -7961:3:3012 -7962:3:3023 -7963:3:3028 -7964:3:3029 -7965:0:4365 -7966:3:3041 -7967:0:4365 -7968:3:3042 -7969:0:4365 -7970:2:1173 -7971:0:4365 -7972:3:3043 -7973:0:4365 -7974:2:1179 -7975:0:4365 -7976:2:1180 -7977:0:4365 -7978:3:3042 -7979:0:4365 -7980:2:1181 -7981:2:1185 -7982:2:1186 -7983:2:1194 -7984:2:1195 -7985:2:1199 -7986:2:1200 -7987:2:1194 -7988:2:1195 -7989:2:1199 -7990:2:1200 -7991:2:1208 -7992:2:1213 -7993:2:1217 -7994:2:1218 -7995:2:1225 -7996:2:1226 -7997:2:1237 -7998:2:1238 -7999:2:1239 -8000:2:1237 -8001:2:1238 -8002:2:1239 -8003:2:1250 -8004:2:1255 -8005:2:1256 -8006:0:4365 -8007:3:3043 -8008:0:4365 -8009:2:1268 -8010:0:4365 -8011:3:3042 -8012:0:4365 -8013:2:1270 -8014:0:4365 -8015:3:3043 -8016:0:4365 -8017:2:1271 -8018:2:1275 -8019:2:1276 -8020:2:1284 -8021:2:1285 -8022:2:1289 -8023:2:1290 -8024:2:1284 -8025:2:1285 -8026:2:1289 -8027:2:1290 -8028:2:1298 -8029:2:1303 -8030:2:1307 -8031:2:1308 -8032:2:1315 -8033:2:1316 -8034:2:1327 -8035:2:1328 -8036:2:1329 -8037:2:1327 -8038:2:1328 -8039:2:1329 -8040:2:1340 -8041:2:1345 -8042:2:1346 -8043:0:4365 -8044:2:1358 -8045:0:4365 -8046:2:1360 -8047:0:4365 -8048:3:3042 -8049:0:4365 -8050:2:1361 -8051:0:4365 -8052:3:3043 -8053:0:4365 -8054:2:1362 -8055:2:1366 -8056:2:1367 -8057:2:1375 -8058:2:1376 -8059:2:1380 -8060:2:1381 -8061:2:1375 -8062:2:1376 -8063:2:1380 -8064:2:1381 -8065:2:1389 -8066:2:1394 -8067:2:1398 -8068:2:1399 -8069:2:1406 -8070:2:1407 -8071:2:1418 -8072:2:1419 -8073:2:1420 -8074:2:1418 -8075:2:1419 -8076:2:1420 -8077:2:1431 -8078:2:1436 -8079:2:1437 -8080:0:4365 -8081:2:1449 -8082:0:4365 -8083:3:3042 -8084:0:4365 -8085:2:1451 -8086:0:4365 -8087:3:3043 -8088:0:4365 -8089:2:1652 -8090:0:4365 -8091:2:1653 -8092:0:4365 -8093:2:1657 -8094:0:4365 -8095:2:1660 -8096:0:4365 -8097:3:3042 -8098:0:4365 -8099:2:1665 -8100:2:1669 -8101:2:1670 -8102:2:1678 -8103:2:1679 -8104:2:1683 -8105:2:1684 -8106:2:1678 -8107:2:1679 -8108:2:1680 -8109:2:1692 -8110:2:1697 -8111:2:1701 -8112:2:1702 -8113:2:1709 -8114:2:1710 -8115:2:1721 -8116:2:1722 -8117:2:1723 -8118:2:1721 -8119:2:1722 -8120:2:1723 -8121:2:1734 -8122:2:1739 -8123:2:1740 -8124:0:4365 -8125:3:3043 -8126:0:4365 -8127:2:1752 -8128:0:4365 -8129:3:3042 -8130:0:4365 -8131:2:1754 -8132:0:4365 -8133:3:3043 -8134:0:4365 -8135:2:1755 -8136:2:1759 -8137:2:1760 -8138:2:1768 -8139:2:1769 -8140:2:1773 -8141:2:1774 -8142:2:1768 -8143:2:1769 -8144:2:1773 -8145:2:1774 -8146:2:1782 -8147:2:1787 -8148:2:1791 -8149:2:1792 -8150:2:1799 -8151:2:1800 -8152:2:1811 -8153:2:1812 -8154:2:1813 -8155:2:1811 -8156:2:1812 -8157:2:1813 -8158:2:1824 -8159:2:1829 -8160:2:1830 -8161:0:4365 -8162:2:1842 -8163:0:4365 -8164:3:3042 -8165:0:4365 -8166:2:1844 -8167:0:4365 -8168:3:3043 -8169:0:4365 -8170:2:1845 -8171:2:1849 -8172:2:1850 -8173:2:1858 -8174:2:1859 -8175:2:1863 -8176:2:1864 -8177:2:1858 -8178:2:1859 -8179:2:1863 -8180:2:1864 -8181:2:1872 -8182:2:1877 -8183:2:1881 -8184:2:1882 -8185:2:1889 -8186:2:1890 -8187:2:1901 -8188:2:1902 -8189:2:1903 -8190:2:1901 -8191:2:1902 -8192:2:1903 -8193:2:1914 -8194:2:1919 -8195:2:1920 -8196:0:4365 -8197:2:1932 -8198:0:4365 -8199:3:3042 -8200:0:4365 -8201:2:1934 -8202:0:4365 -8203:3:3043 -8204:0:4365 -8205:2:1935 -8206:0:4365 -8207:2:1936 -8208:0:4365 -8209:2:2129 -8210:0:4365 -8211:2:2130 -8212:0:4365 -8213:2:2134 -8214:0:4365 -8215:3:3042 -8216:0:4365 -8217:2:2136 -8218:0:4365 -8219:3:3043 -8220:0:4365 -8221:2:2137 -8222:2:2141 -8223:2:2142 -8224:2:2150 -8225:2:2151 -8226:2:2155 -8227:2:2156 -8228:2:2150 -8229:2:2151 -8230:2:2155 -8231:2:2156 -8232:2:2164 -8233:2:2169 -8234:2:2173 -8235:2:2174 -8236:2:2181 -8237:2:2182 -8238:2:2193 -8239:2:2194 -8240:2:2195 -8241:2:2193 -8242:2:2194 -8243:2:2195 -8244:2:2206 -8245:2:2211 -8246:2:2212 -8247:0:4365 -8248:2:2224 -8249:0:4365 -8250:3:3042 -8251:0:4365 -8252:2:2226 -8253:0:4365 -8254:3:3043 -8255:0:4365 -8256:2:2230 -8257:0:4365 -8258:3:3042 -8259:0:4365 -8260:2:2235 -8261:2:2239 -8262:2:2240 -8263:2:2248 -8264:2:2249 -8265:2:2253 -8266:2:2254 -8267:2:2248 -8268:2:2249 -8269:2:2250 -8270:2:2262 -8271:2:2267 -8272:2:2271 -8273:2:2272 -8274:2:2279 -8275:2:2280 -8276:2:2291 -8277:2:2292 -8278:2:2293 -8279:2:2291 -8280:2:2292 -8281:2:2293 -8282:2:2304 -8283:2:2309 -8284:2:2310 -8285:0:4365 -8286:3:3043 -8287:0:4365 -8288:2:2322 -8289:0:4365 -8290:2:1169 -8291:0:4365 -8292:3:3042 -8293:0:4365 -8294:2:1170 -8295:0:4365 -8296:3:3043 -8297:0:4365 -8298:3:3044 -8299:0:4365 -8300:3:3257 -8301:0:4365 -8302:3:3362 -8303:0:4365 -8304:3:3363 -8305:0:4365 -8306:3:3367 -8307:0:4365 -8308:3:3373 -8309:3:3377 -8310:3:3378 -8311:3:3386 -8312:3:3387 -8313:3:3391 -8314:3:3392 -8315:3:3386 -8316:3:3387 -8317:3:3391 -8318:3:3392 -8319:3:3400 -8320:3:3405 -8321:3:3409 -8322:3:3410 -8323:3:3417 -8324:3:3418 -8325:3:3429 -8326:3:3430 -8327:3:3431 -8328:3:3429 -8329:3:3430 -8330:3:3431 -8331:3:3442 -8332:3:3447 -8333:3:3448 -8334:0:4365 -8335:3:3460 -8336:0:4365 -8337:3:3461 -8338:0:4365 -8339:2:1173 -8340:0:4365 -8341:3:3462 -8342:0:4365 -8343:2:1179 -8344:0:4365 -8345:2:1180 -8346:0:4365 -8347:3:3461 -8348:0:4365 -8349:2:1181 -8350:2:1185 -8351:2:1186 -8352:2:1194 -8353:2:1195 -8354:2:1199 -8355:2:1200 -8356:2:1194 -8357:2:1195 -8358:2:1199 -8359:2:1200 -8360:2:1208 -8361:2:1213 -8362:2:1217 -8363:2:1218 -8364:2:1225 -8365:2:1226 -8366:2:1237 -8367:2:1238 -8368:2:1239 -8369:2:1237 -8370:2:1238 -8371:2:1239 -8372:2:1250 -8373:2:1255 -8374:2:1256 -8375:0:4365 -8376:3:3462 -8377:0:4365 -8378:2:1268 -8379:0:4365 -8380:3:3461 -8381:0:4365 -8382:2:1270 -8383:0:4365 -8384:3:3462 -8385:0:4365 -8386:2:1271 -8387:2:1275 -8388:2:1276 -8389:2:1284 -8390:2:1285 -8391:2:1289 -8392:2:1290 -8393:2:1284 -8394:2:1285 -8395:2:1289 -8396:2:1290 -8397:2:1298 -8398:2:1303 -8399:2:1307 -8400:2:1308 -8401:2:1315 -8402:2:1316 -8403:2:1327 -8404:2:1328 -8405:2:1329 -8406:2:1327 -8407:2:1328 -8408:2:1329 -8409:2:1340 -8410:2:1345 -8411:2:1346 -8412:0:4365 -8413:2:1358 -8414:0:4365 -8415:2:1360 -8416:0:4365 -8417:3:3461 -8418:0:4365 -8419:2:1361 -8420:0:4365 -8421:3:3462 -8422:0:4365 -8423:2:1362 -8424:2:1366 -8425:2:1367 -8426:2:1375 -8427:2:1376 -8428:2:1380 -8429:2:1381 -8430:2:1375 -8431:2:1376 -8432:2:1380 -8433:2:1381 -8434:2:1389 -8435:2:1394 -8436:2:1398 -8437:2:1399 -8438:2:1406 -8439:2:1407 -8440:2:1418 -8441:2:1419 -8442:2:1420 -8443:2:1418 -8444:2:1419 -8445:2:1420 -8446:2:1431 -8447:2:1436 -8448:2:1437 -8449:0:4365 -8450:2:1449 -8451:0:4365 -8452:3:3461 -8453:0:4365 -8454:2:1451 -8455:0:4365 -8456:3:3462 -8457:0:4365 -8458:2:1652 -8459:0:4365 -8460:2:1653 -8461:0:4365 -8462:2:1657 -8463:0:4365 -8464:2:1660 -8465:0:4365 -8466:3:3461 -8467:0:4365 -8468:2:1665 -8469:2:1669 -8470:2:1670 -8471:2:1678 -8472:2:1679 -8473:2:1683 -8474:2:1684 -8475:2:1678 -8476:2:1679 -8477:2:1680 -8478:2:1692 -8479:2:1697 -8480:2:1701 -8481:2:1702 -8482:2:1709 -8483:2:1710 -8484:2:1721 -8485:2:1722 -8486:2:1723 -8487:2:1721 -8488:2:1722 -8489:2:1723 -8490:2:1734 -8491:2:1739 -8492:2:1740 -8493:0:4365 -8494:3:3462 -8495:0:4365 -8496:2:1752 -8497:0:4365 -8498:3:3461 -8499:0:4365 -8500:2:1754 -8501:0:4365 -8502:3:3462 -8503:0:4365 -8504:2:1755 -8505:2:1759 -8506:2:1760 -8507:2:1768 -8508:2:1769 -8509:2:1773 -8510:2:1774 -8511:2:1768 -8512:2:1769 -8513:2:1773 -8514:2:1774 -8515:2:1782 -8516:2:1787 -8517:2:1791 -8518:2:1792 -8519:2:1799 -8520:2:1800 -8521:2:1811 -8522:2:1812 -8523:2:1813 -8524:2:1811 -8525:2:1812 -8526:2:1813 -8527:2:1824 -8528:2:1829 -8529:2:1830 -8530:0:4365 -8531:2:1842 -8532:0:4365 -8533:3:3461 -8534:0:4365 -8535:2:1844 -8536:0:4365 -8537:3:3462 -8538:0:4365 -8539:2:1845 -8540:2:1849 -8541:2:1850 -8542:2:1858 -8543:2:1859 -8544:2:1863 -8545:2:1864 -8546:2:1858 -8547:2:1859 -8548:2:1863 -8549:2:1864 -8550:2:1872 -8551:2:1877 -8552:2:1881 -8553:2:1882 -8554:2:1889 -8555:2:1890 -8556:2:1901 -8557:2:1902 -8558:2:1903 -8559:2:1901 -8560:2:1902 -8561:2:1903 -8562:2:1914 -8563:2:1919 -8564:2:1920 -8565:0:4365 -8566:2:1932 -8567:0:4365 -8568:3:3461 -8569:0:4365 -8570:2:1934 -8571:0:4365 -8572:3:3462 -8573:0:4365 -8574:2:1935 -8575:0:4365 -8576:2:1936 -8577:0:4365 -8578:2:2129 -8579:0:4365 -8580:2:2130 -8581:0:4365 -8582:2:2134 -8583:0:4365 -8584:3:3461 -8585:0:4365 -8586:2:2136 -8587:0:4365 -8588:3:3462 -8589:0:4365 -8590:2:2137 -8591:2:2141 -8592:2:2142 -8593:2:2150 -8594:2:2151 -8595:2:2155 -8596:2:2156 -8597:2:2150 -8598:2:2151 -8599:2:2155 -8600:2:2156 -8601:2:2164 -8602:2:2169 -8603:2:2173 -8604:2:2174 -8605:2:2181 -8606:2:2182 -8607:2:2193 -8608:2:2194 -8609:2:2195 -8610:2:2193 -8611:2:2194 -8612:2:2195 -8613:2:2206 -8614:2:2211 -8615:2:2212 -8616:0:4365 -8617:2:2224 -8618:0:4365 -8619:3:3461 -8620:0:4365 -8621:2:2226 -8622:0:4365 -8623:3:3462 -8624:0:4365 -8625:2:2230 -8626:0:4365 -8627:3:3461 -8628:0:4365 -8629:2:2235 -8630:2:2239 -8631:2:2240 -8632:2:2248 -8633:2:2249 -8634:2:2253 -8635:2:2254 -8636:2:2248 -8637:2:2249 -8638:2:2250 -8639:2:2262 -8640:2:2267 -8641:2:2271 -8642:2:2272 -8643:2:2279 -8644:2:2280 -8645:2:2291 -8646:2:2292 -8647:2:2293 -8648:2:2291 -8649:2:2292 -8650:2:2293 -8651:2:2304 -8652:2:2309 -8653:2:2310 -8654:0:4365 -8655:3:3462 -8656:0:4365 -8657:2:2322 -8658:0:4365 -8659:2:1169 -8660:0:4365 -8661:3:3461 -8662:0:4365 -8663:2:1170 -8664:0:4365 -8665:3:3462 -8666:0:4365 -8667:3:3463 -8668:0:4365 -8669:3:3469 -8670:0:4365 -8671:3:3470 -8672:3:3474 -8673:3:3475 -8674:3:3483 -8675:3:3484 -8676:3:3488 -8677:3:3489 -8678:3:3483 -8679:3:3484 -8680:3:3488 -8681:3:3489 -8682:3:3497 -8683:3:3502 -8684:3:3506 -8685:3:3507 -8686:3:3514 -8687:3:3515 -8688:3:3526 -8689:3:3527 -8690:3:3528 -8691:3:3526 -8692:3:3527 -8693:3:3528 -8694:3:3539 -8695:3:3544 -8696:3:3545 -8697:0:4365 -8698:3:3557 -8699:0:4365 -8700:3:3558 -8701:0:4365 -8702:2:1173 -8703:0:4365 -8704:3:3559 -8705:0:4365 -8706:2:1179 -8707:0:4365 -8708:2:1180 -8709:0:4365 -8710:3:3558 -8711:0:4365 -8712:2:1181 -8713:2:1185 -8714:2:1186 -8715:2:1194 -8716:2:1195 -8717:2:1199 -8718:2:1200 -8719:2:1194 -8720:2:1195 -8721:2:1199 -8722:2:1200 -8723:2:1208 -8724:2:1213 -8725:2:1217 -8726:2:1218 -8727:2:1225 -8728:2:1226 -8729:2:1237 -8730:2:1238 -8731:2:1239 -8732:2:1237 -8733:2:1238 -8734:2:1239 -8735:2:1250 -8736:2:1255 -8737:2:1256 -8738:0:4365 -8739:3:3559 -8740:0:4365 -8741:2:1268 -8742:0:4365 -8743:3:3558 -8744:0:4365 -8745:2:1270 -8746:0:4365 -8747:3:3559 -8748:0:4365 -8749:2:1271 -8750:2:1275 -8751:2:1276 -8752:2:1284 -8753:2:1285 -8754:2:1289 -8755:2:1290 -8756:2:1284 -8757:2:1285 -8758:2:1289 -8759:2:1290 -8760:2:1298 -8761:2:1303 -8762:2:1307 -8763:2:1308 -8764:2:1315 -8765:2:1316 -8766:2:1327 -8767:2:1328 -8768:2:1329 -8769:2:1327 -8770:2:1328 -8771:2:1329 -8772:2:1340 -8773:2:1345 -8774:2:1346 -8775:0:4365 -8776:2:1358 -8777:0:4365 -8778:2:1360 -8779:0:4365 -8780:3:3558 -8781:0:4365 -8782:2:1361 -8783:0:4365 -8784:3:3559 -8785:0:4365 -8786:2:1362 -8787:2:1366 -8788:2:1367 -8789:2:1375 -8790:2:1376 -8791:2:1380 -8792:2:1381 -8793:2:1375 -8794:2:1376 -8795:2:1380 -8796:2:1381 -8797:2:1389 -8798:2:1394 -8799:2:1398 -8800:2:1399 -8801:2:1406 -8802:2:1407 -8803:2:1418 -8804:2:1419 -8805:2:1420 -8806:2:1418 -8807:2:1419 -8808:2:1420 -8809:2:1431 -8810:2:1436 -8811:2:1437 -8812:0:4365 -8813:2:1449 -8814:0:4365 -8815:3:3558 -8816:0:4365 -8817:2:1451 -8818:0:4365 -8819:3:3559 -8820:0:4365 -8821:2:1652 -8822:0:4365 -8823:2:1653 -8824:0:4365 -8825:2:1657 -8826:0:4365 -8827:2:1660 -8828:0:4365 -8829:3:3558 -8830:0:4365 -8831:2:1665 -8832:2:1669 -8833:2:1670 -8834:2:1678 -8835:2:1679 -8836:2:1683 -8837:2:1684 -8838:2:1678 -8839:2:1679 -8840:2:1680 -8841:2:1692 -8842:2:1697 -8843:2:1701 -8844:2:1702 -8845:2:1709 -8846:2:1710 -8847:2:1721 -8848:2:1722 -8849:2:1723 -8850:2:1721 -8851:2:1722 -8852:2:1723 -8853:2:1734 -8854:2:1739 -8855:2:1740 -8856:0:4365 -8857:3:3559 -8858:0:4365 -8859:2:1752 -8860:0:4365 -8861:3:3558 -8862:0:4365 -8863:2:1754 -8864:0:4365 -8865:3:3559 -8866:0:4365 -8867:2:1755 -8868:2:1759 -8869:2:1760 -8870:2:1768 -8871:2:1769 -8872:2:1773 -8873:2:1774 -8874:2:1768 -8875:2:1769 -8876:2:1773 -8877:2:1774 -8878:2:1782 -8879:2:1787 -8880:2:1791 -8881:2:1792 -8882:2:1799 -8883:2:1800 -8884:2:1811 -8885:2:1812 -8886:2:1813 -8887:2:1811 -8888:2:1812 -8889:2:1813 -8890:2:1824 -8891:2:1829 -8892:2:1830 -8893:0:4365 -8894:2:1842 -8895:0:4365 -8896:3:3558 -8897:0:4365 -8898:2:1844 -8899:0:4365 -8900:3:3559 -8901:0:4365 -8902:2:1845 -8903:2:1849 -8904:2:1850 -8905:2:1858 -8906:2:1859 -8907:2:1863 -8908:2:1864 -8909:2:1858 -8910:2:1859 -8911:2:1863 -8912:2:1864 -8913:2:1872 -8914:2:1877 -8915:2:1881 -8916:2:1882 -8917:2:1889 -8918:2:1890 -8919:2:1901 -8920:2:1902 -8921:2:1903 -8922:2:1901 -8923:2:1902 -8924:2:1903 -8925:2:1914 -8926:2:1919 -8927:2:1920 -8928:0:4365 -8929:2:1932 -8930:0:4365 -8931:3:3558 -8932:0:4365 -8933:2:1934 -8934:0:4365 -8935:3:3559 -8936:0:4365 -8937:2:1935 -8938:0:4365 -8939:2:1936 -8940:0:4365 -8941:2:2129 -8942:0:4365 -8943:2:2130 -8944:0:4365 -8945:2:2134 -8946:0:4365 -8947:3:3558 -8948:0:4365 -8949:2:2136 -8950:0:4365 -8951:3:3559 -8952:0:4365 -8953:2:2137 -8954:2:2141 -8955:2:2142 -8956:2:2150 -8957:2:2151 -8958:2:2155 -8959:2:2156 -8960:2:2150 -8961:2:2151 -8962:2:2155 -8963:2:2156 -8964:2:2164 -8965:2:2169 -8966:2:2173 -8967:2:2174 -8968:2:2181 -8969:2:2182 -8970:2:2193 -8971:2:2194 -8972:2:2195 -8973:2:2193 -8974:2:2194 -8975:2:2195 -8976:2:2206 -8977:2:2211 -8978:2:2212 -8979:0:4365 -8980:2:2224 -8981:0:4365 -8982:3:3558 -8983:0:4365 -8984:2:2226 -8985:0:4365 -8986:3:3559 -8987:0:4365 -8988:2:2230 -8989:0:4365 -8990:3:3558 -8991:0:4365 -8992:2:2235 -8993:2:2239 -8994:2:2240 -8995:2:2248 -8996:2:2249 -8997:2:2253 -8998:2:2254 -8999:2:2248 -9000:2:2249 -9001:2:2250 -9002:2:2262 -9003:2:2267 -9004:2:2271 -9005:2:2272 -9006:2:2279 -9007:2:2280 -9008:2:2291 -9009:2:2292 -9010:2:2293 -9011:2:2291 -9012:2:2292 -9013:2:2293 -9014:2:2304 -9015:2:2309 -9016:2:2310 -9017:0:4365 -9018:3:3559 -9019:0:4365 -9020:2:2322 -9021:0:4365 -9022:2:1169 -9023:0:4365 -9024:3:3558 -9025:0:4365 -9026:2:1170 -9027:0:4365 -9028:3:3559 -9029:0:4365 -9030:3:3560 -9031:0:4365 -9032:3:3566 -9033:0:4365 -9034:3:3569 -9035:3:3570 -9036:3:3582 -9037:3:3583 -9038:3:3587 -9039:3:3588 -9040:3:3582 -9041:3:3583 -9042:3:3587 -9043:3:3588 -9044:3:3596 -9045:3:3601 -9046:3:3605 -9047:3:3606 -9048:3:3613 -9049:3:3614 -9050:3:3625 -9051:3:3626 -9052:3:3627 -9053:3:3625 -9054:3:3626 -9055:3:3627 -9056:3:3638 -9057:3:3643 -9058:3:3644 -9059:0:4365 -9060:3:3656 -9061:0:4365 -9062:3:3657 -9063:0:4365 -9064:2:1173 -9065:0:4365 -9066:3:3658 -9067:0:4365 -9068:2:1179 -9069:0:4365 -9070:2:1180 -9071:0:4365 -9072:3:3657 -9073:0:4365 -9074:2:1181 -9075:2:1185 -9076:2:1186 -9077:2:1194 -9078:2:1195 -9079:2:1199 -9080:2:1200 -9081:2:1194 -9082:2:1195 -9083:2:1199 -9084:2:1200 -9085:2:1208 -9086:2:1213 -9087:2:1217 -9088:2:1218 -9089:2:1225 -9090:2:1226 -9091:2:1237 -9092:2:1238 -9093:2:1239 -9094:2:1237 -9095:2:1238 -9096:2:1239 -9097:2:1250 -9098:2:1255 -9099:2:1256 -9100:0:4365 -9101:3:3658 -9102:0:4365 -9103:2:1268 -9104:0:4365 -9105:3:3657 -9106:0:4365 -9107:2:1270 -9108:0:4365 -9109:3:3658 -9110:0:4365 -9111:2:1271 -9112:2:1275 -9113:2:1276 -9114:2:1284 -9115:2:1285 -9116:2:1289 -9117:2:1290 -9118:2:1284 -9119:2:1285 -9120:2:1289 -9121:2:1290 -9122:2:1298 -9123:2:1303 -9124:2:1307 -9125:2:1308 -9126:2:1315 -9127:2:1316 -9128:2:1327 -9129:2:1328 -9130:2:1329 -9131:2:1327 -9132:2:1328 -9133:2:1329 -9134:2:1340 -9135:2:1345 -9136:2:1346 -9137:0:4365 -9138:2:1358 -9139:0:4365 -9140:2:1360 -9141:0:4365 -9142:3:3657 -9143:0:4365 -9144:2:1361 -9145:0:4365 -9146:3:3658 -9147:0:4365 -9148:2:1362 -9149:2:1366 -9150:2:1367 -9151:2:1375 -9152:2:1376 -9153:2:1380 -9154:2:1381 -9155:2:1375 -9156:2:1376 -9157:2:1380 -9158:2:1381 -9159:2:1389 -9160:2:1394 -9161:2:1398 -9162:2:1399 -9163:2:1406 -9164:2:1407 -9165:2:1418 -9166:2:1419 -9167:2:1420 -9168:2:1418 -9169:2:1419 -9170:2:1420 -9171:2:1431 -9172:2:1436 -9173:2:1437 -9174:0:4365 -9175:2:1449 -9176:0:4365 -9177:3:3657 -9178:0:4365 -9179:2:1451 -9180:0:4365 -9181:3:3658 -9182:0:4365 -9183:2:1652 -9184:0:4365 -9185:2:1653 -9186:0:4365 -9187:2:1657 -9188:0:4365 -9189:2:1660 -9190:0:4365 -9191:3:3657 -9192:0:4365 -9193:2:1665 -9194:2:1669 -9195:2:1670 -9196:2:1678 -9197:2:1679 -9198:2:1683 -9199:2:1684 -9200:2:1678 -9201:2:1679 -9202:2:1680 -9203:2:1692 -9204:2:1697 -9205:2:1701 -9206:2:1702 -9207:2:1709 -9208:2:1710 -9209:2:1721 -9210:2:1722 -9211:2:1723 -9212:2:1721 -9213:2:1722 -9214:2:1723 -9215:2:1734 -9216:2:1739 -9217:2:1740 -9218:0:4365 -9219:3:3658 -9220:0:4365 -9221:2:1752 -9222:0:4365 -9223:3:3657 -9224:0:4365 -9225:2:1754 -9226:0:4365 -9227:3:3658 -9228:0:4365 -9229:2:1755 -9230:2:1759 -9231:2:1760 -9232:2:1768 -9233:2:1769 -9234:2:1773 -9235:2:1774 -9236:2:1768 -9237:2:1769 -9238:2:1773 -9239:2:1774 -9240:2:1782 -9241:2:1787 -9242:2:1791 -9243:2:1792 -9244:2:1799 -9245:2:1800 -9246:2:1811 -9247:2:1812 -9248:2:1813 -9249:2:1811 -9250:2:1812 -9251:2:1813 -9252:2:1824 -9253:2:1829 -9254:2:1830 -9255:0:4365 -9256:2:1842 -9257:0:4365 -9258:3:3657 -9259:0:4365 -9260:2:1844 -9261:0:4365 -9262:3:3658 -9263:0:4365 -9264:2:1845 -9265:2:1849 -9266:2:1850 -9267:2:1858 -9268:2:1859 -9269:2:1863 -9270:2:1864 -9271:2:1858 -9272:2:1859 -9273:2:1863 -9274:2:1864 -9275:2:1872 -9276:2:1877 -9277:2:1881 -9278:2:1882 -9279:2:1889 -9280:2:1890 -9281:2:1901 -9282:2:1902 -9283:2:1903 -9284:2:1901 -9285:2:1902 -9286:2:1903 -9287:2:1914 -9288:2:1919 -9289:2:1920 -9290:0:4365 -9291:2:1932 -9292:0:4365 -9293:3:3657 -9294:0:4365 -9295:2:1934 -9296:0:4365 -9297:3:3658 -9298:0:4365 -9299:2:1935 -9300:0:4365 -9301:2:1936 -9302:0:4365 -9303:2:2129 -9304:0:4365 -9305:2:2130 -9306:0:4365 -9307:2:2134 -9308:0:4365 -9309:3:3657 -9310:0:4365 -9311:2:2136 -9312:0:4365 -9313:3:3658 -9314:0:4365 -9315:2:2137 -9316:2:2141 -9317:2:2142 -9318:2:2150 -9319:2:2151 -9320:2:2155 -9321:2:2156 -9322:2:2150 -9323:2:2151 -9324:2:2155 -9325:2:2156 -9326:2:2164 -9327:2:2169 -9328:2:2173 -9329:2:2174 -9330:2:2181 -9331:2:2182 -9332:2:2193 -9333:2:2194 -9334:2:2195 -9335:2:2193 -9336:2:2194 -9337:2:2195 -9338:2:2206 -9339:2:2211 -9340:2:2212 -9341:0:4365 -9342:2:2224 -9343:0:4365 -9344:3:3657 -9345:0:4365 -9346:2:2226 -9347:0:4365 -9348:3:3658 -9349:0:4365 -9350:2:2230 -9351:0:4365 -9352:3:3657 -9353:0:4365 -9354:2:2235 -9355:2:2239 -9356:2:2240 -9357:2:2248 -9358:2:2249 -9359:2:2253 -9360:2:2254 -9361:2:2248 -9362:2:2249 -9363:2:2250 -9364:2:2262 -9365:2:2267 -9366:2:2271 -9367:2:2272 -9368:2:2279 -9369:2:2280 -9370:2:2291 -9371:2:2292 -9372:2:2293 -9373:2:2291 -9374:2:2292 -9375:2:2293 -9376:2:2304 -9377:2:2309 -9378:2:2310 -9379:0:4365 -9380:3:3658 -9381:0:4365 -9382:2:2322 -9383:0:4365 -9384:2:1169 -9385:0:4365 -9386:3:3657 -9387:0:4365 -9388:2:1170 -9389:0:4365 -9390:3:3658 -9391:0:4365 -9392:3:3659 -9393:0:4365 -9394:3:3665 -9395:0:4365 -9396:3:3666 -9397:0:4365 -9398:3:3667 -9399:0:4365 -9400:3:3668 -9401:0:4365 -9402:3:3669 -9403:3:3673 -9404:3:3674 -9405:3:3682 -9406:3:3683 -9407:3:3687 -9408:3:3688 -9409:3:3682 -9410:3:3683 -9411:3:3687 -9412:3:3688 -9413:3:3696 -9414:3:3701 -9415:3:3705 -9416:3:3706 -9417:3:3713 -9418:3:3714 -9419:3:3725 -9420:3:3726 -9421:3:3727 -9422:3:3725 -9423:3:3726 -9424:3:3727 -9425:3:3738 -9426:3:3743 -9427:3:3744 -9428:0:4365 -9429:3:3756 -9430:0:4365 -9431:3:3757 -9432:0:4365 -9433:2:1173 -9434:0:4365 -9435:3:3758 -9436:0:4365 -9437:2:1179 -9438:0:4365 -9439:2:1180 -9440:0:4365 -9441:3:3757 -9442:0:4365 -9443:2:1181 -9444:2:1185 -9445:2:1186 -9446:2:1194 -9447:2:1195 -9448:2:1199 -9449:2:1200 -9450:2:1194 -9451:2:1195 -9452:2:1199 -9453:2:1200 -9454:2:1208 -9455:2:1213 -9456:2:1217 -9457:2:1218 -9458:2:1225 -9459:2:1226 -9460:2:1237 -9461:2:1238 -9462:2:1239 -9463:2:1237 -9464:2:1238 -9465:2:1239 -9466:2:1250 -9467:2:1255 -9468:2:1256 -9469:0:4365 -9470:3:3758 -9471:0:4365 -9472:2:1268 -9473:0:4365 -9474:3:3757 -9475:0:4365 -9476:2:1270 -9477:0:4365 -9478:3:3758 -9479:0:4365 -9480:2:1271 -9481:2:1275 -9482:2:1276 -9483:2:1284 -9484:2:1285 -9485:2:1289 -9486:2:1290 -9487:2:1284 -9488:2:1285 -9489:2:1289 -9490:2:1290 -9491:2:1298 -9492:2:1303 -9493:2:1307 -9494:2:1308 -9495:2:1315 -9496:2:1316 -9497:2:1327 -9498:2:1328 -9499:2:1329 -9500:2:1327 -9501:2:1328 -9502:2:1329 -9503:2:1340 -9504:2:1345 -9505:2:1346 -9506:0:4365 -9507:2:1358 -9508:0:4365 -9509:2:1360 -9510:0:4365 -9511:3:3757 -9512:0:4365 -9513:2:1361 -9514:0:4365 -9515:3:3758 -9516:0:4365 -9517:2:1362 -9518:2:1366 -9519:2:1367 -9520:2:1375 -9521:2:1376 -9522:2:1380 -9523:2:1381 -9524:2:1375 -9525:2:1376 -9526:2:1380 -9527:2:1381 -9528:2:1389 -9529:2:1394 -9530:2:1398 -9531:2:1399 -9532:2:1406 -9533:2:1407 -9534:2:1418 -9535:2:1419 -9536:2:1420 -9537:2:1418 -9538:2:1419 -9539:2:1420 -9540:2:1431 -9541:2:1436 -9542:2:1437 -9543:0:4365 -9544:2:1449 -9545:0:4365 -9546:3:3757 -9547:0:4365 -9548:2:1451 -9549:0:4365 -9550:3:3758 -9551:0:4365 -9552:2:1652 -9553:0:4365 -9554:2:1653 -9555:0:4365 -9556:2:1657 -9557:0:4365 -9558:2:1660 -9559:0:4365 -9560:3:3757 -9561:0:4365 -9562:2:1665 -9563:2:1669 -9564:2:1670 -9565:2:1678 -9566:2:1679 -9567:2:1683 -9568:2:1684 -9569:2:1678 -9570:2:1679 -9571:2:1680 -9572:2:1692 -9573:2:1697 -9574:2:1701 -9575:2:1702 -9576:2:1709 -9577:2:1710 -9578:2:1721 -9579:2:1722 -9580:2:1723 -9581:2:1721 -9582:2:1722 -9583:2:1723 -9584:2:1734 -9585:2:1739 -9586:2:1740 -9587:0:4365 -9588:3:3758 -9589:0:4365 -9590:2:1752 -9591:0:4365 -9592:3:3757 -9593:0:4365 -9594:2:1754 -9595:0:4365 -9596:3:3758 -9597:0:4365 -9598:2:1755 -9599:2:1759 -9600:2:1760 -9601:2:1768 -9602:2:1769 -9603:2:1773 -9604:2:1774 -9605:2:1768 -9606:2:1769 -9607:2:1773 -9608:2:1774 -9609:2:1782 -9610:2:1787 -9611:2:1791 -9612:2:1792 -9613:2:1799 -9614:2:1800 -9615:2:1811 -9616:2:1812 -9617:2:1813 -9618:2:1811 -9619:2:1812 -9620:2:1813 -9621:2:1824 -9622:2:1829 -9623:2:1830 -9624:0:4365 -9625:2:1842 -9626:0:4365 -9627:3:3757 -9628:0:4365 -9629:2:1844 -9630:0:4365 -9631:3:3758 -9632:0:4365 -9633:2:1845 -9634:2:1849 -9635:2:1850 -9636:2:1858 -9637:2:1859 -9638:2:1863 -9639:2:1864 -9640:2:1858 -9641:2:1859 -9642:2:1863 -9643:2:1864 -9644:2:1872 -9645:2:1877 -9646:2:1881 -9647:2:1882 -9648:2:1889 -9649:2:1890 -9650:2:1901 -9651:2:1902 -9652:2:1903 -9653:2:1901 -9654:2:1902 -9655:2:1903 -9656:2:1914 -9657:2:1919 -9658:2:1920 -9659:0:4365 -9660:2:1932 -9661:0:4365 -9662:3:3757 -9663:0:4365 -9664:2:1934 -9665:0:4365 -9666:3:3758 -9667:0:4365 -9668:2:1935 -9669:0:4365 -9670:2:1936 -9671:0:4365 -9672:2:2129 -9673:0:4365 -9674:2:2130 -9675:0:4365 -9676:2:2134 -9677:0:4365 -9678:3:3757 -9679:0:4365 -9680:2:2136 -9681:0:4365 -9682:3:3758 -9683:0:4365 -9684:2:2137 -9685:2:2141 -9686:2:2142 -9687:2:2150 -9688:2:2151 -9689:2:2155 -9690:2:2156 -9691:2:2150 -9692:2:2151 -9693:2:2155 -9694:2:2156 -9695:2:2164 -9696:2:2169 -9697:2:2173 -9698:2:2174 -9699:2:2181 -9700:2:2182 -9701:2:2193 -9702:2:2194 -9703:2:2195 -9704:2:2193 -9705:2:2194 -9706:2:2195 -9707:2:2206 -9708:2:2211 -9709:2:2212 -9710:0:4365 -9711:2:2224 -9712:0:4365 -9713:3:3757 -9714:0:4365 -9715:2:2226 -9716:0:4365 -9717:3:3758 -9718:0:4365 -9719:2:2230 -9720:0:4365 -9721:3:3757 -9722:0:4365 -9723:2:2235 -9724:2:2239 -9725:2:2240 -9726:2:2248 -9727:2:2249 -9728:2:2253 -9729:2:2254 -9730:2:2248 -9731:2:2249 -9732:2:2250 -9733:2:2262 -9734:2:2267 -9735:2:2271 -9736:2:2272 -9737:2:2279 -9738:2:2280 -9739:2:2291 -9740:2:2292 -9741:2:2293 -9742:2:2291 -9743:2:2292 -9744:2:2293 -9745:2:2304 -9746:2:2309 -9747:2:2310 -9748:0:4365 -9749:3:3758 -9750:0:4365 -9751:2:2322 -9752:0:4365 -9753:2:1169 -9754:0:4365 -9755:3:3757 -9756:0:4365 -9757:2:1170 -9758:0:4365 -9759:3:3758 -9760:0:4365 -9761:3:3759 -9762:0:4365 -9763:3:3972 -9764:0:4365 -9765:3:3980 -9766:0:4365 -9767:3:3981 -9768:3:3985 -9769:3:3986 -9770:3:3994 -9771:3:3995 -9772:3:3999 -9773:3:4000 -9774:3:3994 -9775:3:3995 -9776:3:3999 -9777:3:4000 -9778:3:4008 -9779:3:4013 -9780:3:4017 -9781:3:4018 -9782:3:4025 -9783:3:4026 -9784:3:4037 -9785:3:4038 -9786:3:4039 -9787:3:4037 -9788:3:4038 -9789:3:4039 -9790:3:4050 -9791:3:4055 -9792:3:4056 -9793:0:4365 -9794:3:4068 -9795:0:4365 -9796:3:4069 -9797:0:4365 -9798:2:1173 -9799:0:4365 -9800:3:4070 -9801:0:4365 -9802:2:1179 -9803:0:4365 -9804:2:1180 -9805:0:4365 -9806:3:4069 -9807:0:4365 -9808:2:1181 -9809:2:1185 -9810:2:1186 -9811:2:1194 -9812:2:1195 -9813:2:1199 -9814:2:1200 -9815:2:1194 -9816:2:1195 -9817:2:1199 -9818:2:1200 -9819:2:1208 -9820:2:1213 -9821:2:1217 -9822:2:1218 -9823:2:1225 -9824:2:1226 -9825:2:1237 -9826:2:1238 -9827:2:1239 -9828:2:1237 -9829:2:1238 -9830:2:1239 -9831:2:1250 -9832:2:1255 -9833:2:1256 -9834:0:4365 -9835:3:4070 -9836:0:4365 -9837:2:1268 -9838:0:4365 -9839:3:4069 -9840:0:4365 -9841:2:1270 -9842:0:4365 -9843:3:4070 -9844:0:4365 -9845:2:1271 -9846:2:1275 -9847:2:1276 -9848:2:1284 -9849:2:1285 -9850:2:1289 -9851:2:1290 -9852:2:1284 -9853:2:1285 -9854:2:1289 -9855:2:1290 -9856:2:1298 -9857:2:1303 -9858:2:1307 -9859:2:1308 -9860:2:1315 -9861:2:1316 -9862:2:1327 -9863:2:1328 -9864:2:1329 -9865:2:1327 -9866:2:1328 -9867:2:1329 -9868:2:1340 -9869:2:1345 -9870:2:1346 -9871:0:4365 -9872:2:1358 -9873:0:4365 -9874:2:1360 -9875:0:4365 -9876:3:4069 -9877:0:4365 -9878:2:1361 -9879:0:4365 -9880:3:4070 -9881:0:4365 -9882:2:1362 -9883:2:1366 -9884:2:1367 -9885:2:1375 -9886:2:1376 -9887:2:1380 -9888:2:1381 -9889:2:1375 -9890:2:1376 -9891:2:1380 -9892:2:1381 -9893:2:1389 -9894:2:1394 -9895:2:1398 -9896:2:1399 -9897:2:1406 -9898:2:1407 -9899:2:1418 -9900:2:1419 -9901:2:1420 -9902:2:1418 -9903:2:1419 -9904:2:1420 -9905:2:1431 -9906:2:1436 -9907:2:1437 -9908:0:4365 -9909:2:1449 -9910:0:4365 -9911:3:4069 -9912:0:4365 -9913:2:1451 -9914:0:4365 -9915:3:4070 -9916:0:4365 -9917:2:1652 -9918:0:4365 -9919:2:1653 -9920:0:4365 -9921:2:1657 -9922:0:4365 -9923:2:1660 -9924:0:4365 -9925:3:4069 -9926:0:4365 -9927:2:1665 -9928:2:1669 -9929:2:1670 -9930:2:1678 -9931:2:1679 -9932:2:1683 -9933:2:1684 -9934:2:1678 -9935:2:1679 -9936:2:1680 -9937:2:1692 -9938:2:1697 -9939:2:1701 -9940:2:1702 -9941:2:1709 -9942:2:1710 -9943:2:1721 -9944:2:1722 -9945:2:1723 -9946:2:1721 -9947:2:1722 -9948:2:1723 -9949:2:1734 -9950:2:1739 -9951:2:1740 -9952:0:4365 -9953:3:4070 -9954:0:4365 -9955:2:1752 -9956:0:4365 -9957:3:4069 -9958:0:4365 -9959:2:1754 -9960:0:4365 -9961:3:4070 -9962:0:4365 -9963:2:1755 -9964:2:1759 -9965:2:1760 -9966:2:1768 -9967:2:1769 -9968:2:1773 -9969:2:1774 -9970:2:1768 -9971:2:1769 -9972:2:1773 -9973:2:1774 -9974:2:1782 -9975:2:1787 -9976:2:1791 -9977:2:1792 -9978:2:1799 -9979:2:1800 -9980:2:1811 -9981:2:1812 -9982:2:1813 -9983:2:1811 -9984:2:1812 -9985:2:1813 -9986:2:1824 -9987:2:1829 -9988:2:1830 -9989:0:4365 -9990:2:1842 -9991:0:4365 -9992:3:4069 -9993:0:4365 -9994:2:1844 -9995:0:4365 -9996:3:4070 -9997:0:4365 -9998:2:1845 -9999:2:1849 -10000:2:1850 -10001:2:1858 -10002:2:1859 -10003:2:1863 -10004:2:1864 -10005:2:1858 -10006:2:1859 -10007:2:1863 -10008:2:1864 -10009:2:1872 -10010:2:1877 -10011:2:1881 -10012:2:1882 -10013:2:1889 -10014:2:1890 -10015:2:1901 -10016:2:1902 -10017:2:1903 -10018:2:1901 -10019:2:1902 -10020:2:1903 -10021:2:1914 -10022:2:1919 -10023:2:1920 -10024:0:4365 -10025:2:1932 -10026:0:4365 -10027:3:4069 -10028:0:4365 -10029:2:1934 -10030:0:4365 -10031:3:4070 -10032:0:4365 -10033:2:1935 -10034:0:4365 -10035:2:1936 -10036:0:4365 -10037:2:2129 -10038:0:4365 -10039:2:2130 -10040:0:4365 -10041:2:2134 -10042:0:4365 -10043:3:4069 -10044:0:4365 -10045:2:2136 -10046:0:4365 -10047:3:4070 -10048:0:4365 -10049:2:2137 -10050:2:2141 -10051:2:2142 -10052:2:2150 -10053:2:2151 -10054:2:2155 -10055:2:2156 -10056:2:2150 -10057:2:2151 -10058:2:2155 -10059:2:2156 -10060:2:2164 -10061:2:2169 -10062:2:2173 -10063:2:2174 -10064:2:2181 -10065:2:2182 -10066:2:2193 -10067:2:2194 -10068:2:2195 -10069:2:2193 -10070:2:2194 -10071:2:2195 -10072:2:2206 -10073:2:2211 -10074:2:2212 -10075:0:4365 -10076:2:2224 -10077:0:4365 -10078:3:4069 -10079:0:4365 -10080:2:2226 -10081:0:4365 -10082:3:4070 -10083:0:4365 -10084:2:2230 -10085:0:4365 -10086:3:4069 -10087:0:4365 -10088:2:2235 -10089:2:2239 -10090:2:2240 -10091:2:2248 -10092:2:2249 -10093:2:2253 -10094:2:2254 -10095:2:2248 -10096:2:2249 -10097:2:2250 -10098:2:2262 -10099:2:2267 -10100:2:2271 -10101:2:2272 -10102:2:2279 -10103:2:2280 -10104:2:2291 -10105:2:2292 -10106:2:2293 -10107:2:2291 -10108:2:2292 -10109:2:2293 -10110:2:2304 -10111:2:2309 -10112:2:2310 -10113:0:4365 -10114:3:4070 -10115:0:4365 -10116:2:2322 -10117:0:4365 -10118:2:1169 -10119:0:4365 -10120:3:4069 -10121:0:4365 -10122:2:1170 -10123:0:4365 -10124:3:4070 -10125:0:4365 -10126:3:4071 -10127:0:4365 -10128:3:4081 -10129:0:4365 -10130:3:3666 -10131:0:4365 -10132:3:3667 -10133:0:4365 -10134:3:3668 -10135:0:4365 -10136:3:3669 -10137:3:3673 -10138:3:3674 -10139:3:3682 -10140:3:3683 -10141:3:3687 -10142:3:3688 -10143:3:3682 -10144:3:3683 -10145:3:3687 -10146:3:3688 -10147:3:3696 -10148:3:3701 -10149:3:3705 -10150:3:3706 -10151:3:3713 -10152:3:3714 -10153:3:3725 -10154:3:3726 -10155:3:3727 -10156:3:3725 -10157:3:3726 -10158:3:3727 -10159:3:3738 -10160:3:3743 -10161:3:3744 -10162:0:4365 -10163:3:3756 -10164:0:4365 -10165:3:3757 -10166:0:4365 -10167:2:1173 -10168:0:4365 -10169:3:3758 -10170:0:4365 -10171:2:1179 -10172:0:4365 -10173:2:1180 -10174:0:4365 -10175:3:3757 -10176:0:4365 -10177:2:1181 -10178:2:1185 -10179:2:1186 -10180:2:1194 -10181:2:1195 -10182:2:1199 -10183:2:1200 -10184:2:1194 -10185:2:1195 -10186:2:1199 -10187:2:1200 -10188:2:1208 -10189:2:1213 -10190:2:1217 -10191:2:1218 -10192:2:1225 -10193:2:1226 -10194:2:1237 -10195:2:1238 -10196:2:1239 -10197:2:1237 -10198:2:1238 -10199:2:1239 -10200:2:1250 -10201:2:1255 -10202:2:1256 -10203:0:4365 -10204:3:3758 -10205:0:4365 -10206:2:1268 -10207:0:4365 -10208:3:3757 -10209:0:4365 -10210:2:1270 -10211:0:4365 -10212:3:3758 -10213:0:4365 -10214:2:1271 -10215:2:1275 -10216:2:1276 -10217:2:1284 -10218:2:1285 -10219:2:1289 -10220:2:1290 -10221:2:1284 -10222:2:1285 -10223:2:1289 -10224:2:1290 -10225:2:1298 -10226:2:1303 -10227:2:1307 -10228:2:1308 -10229:2:1315 -10230:2:1316 -10231:2:1327 -10232:2:1328 -10233:2:1329 -10234:2:1327 -10235:2:1328 -10236:2:1329 -10237:2:1340 -10238:2:1345 -10239:2:1346 -10240:0:4365 -10241:2:1358 -10242:0:4365 -10243:2:1360 -10244:0:4365 -10245:3:3757 -10246:0:4365 -10247:2:1361 -10248:0:4365 -10249:3:3758 -10250:0:4365 -10251:2:1362 -10252:2:1366 -10253:2:1367 -10254:2:1375 -10255:2:1376 -10256:2:1380 -10257:2:1381 -10258:2:1375 -10259:2:1376 -10260:2:1380 -10261:2:1381 -10262:2:1389 -10263:2:1394 -10264:2:1398 -10265:2:1399 -10266:2:1406 -10267:2:1407 -10268:2:1418 -10269:2:1419 -10270:2:1420 -10271:2:1418 -10272:2:1419 -10273:2:1420 -10274:2:1431 -10275:2:1436 -10276:2:1437 -10277:0:4365 -10278:2:1449 -10279:0:4365 -10280:3:3757 -10281:0:4365 -10282:2:1451 -10283:0:4365 -10284:3:3758 -10285:0:4365 -10286:2:1652 -10287:0:4365 -10288:2:1653 -10289:0:4365 -10290:2:1657 -10291:0:4365 -10292:2:1660 -10293:0:4365 -10294:3:3757 -10295:0:4365 -10296:2:1665 -10297:2:1669 -10298:2:1670 -10299:2:1678 -10300:2:1679 -10301:2:1683 -10302:2:1684 -10303:2:1678 -10304:2:1679 -10305:2:1680 -10306:2:1692 -10307:2:1697 -10308:2:1701 -10309:2:1702 -10310:2:1709 -10311:2:1710 -10312:2:1721 -10313:2:1722 -10314:2:1723 -10315:2:1721 -10316:2:1722 -10317:2:1723 -10318:2:1734 -10319:2:1739 -10320:2:1740 -10321:0:4365 -10322:3:3758 -10323:0:4365 -10324:2:1752 -10325:0:4365 -10326:3:3757 -10327:0:4365 -10328:2:1754 -10329:0:4365 -10330:3:3758 -10331:0:4365 -10332:2:1755 -10333:2:1759 -10334:2:1760 -10335:2:1768 -10336:2:1769 -10337:2:1773 -10338:2:1774 -10339:2:1768 -10340:2:1769 -10341:2:1773 -10342:2:1774 -10343:2:1782 -10344:2:1787 -10345:2:1791 -10346:2:1792 -10347:2:1799 -10348:2:1800 -10349:2:1811 -10350:2:1812 -10351:2:1813 -10352:2:1811 -10353:2:1812 -10354:2:1813 -10355:2:1824 -10356:2:1829 -10357:2:1830 -10358:0:4365 -10359:2:1842 -10360:0:4365 -10361:3:3757 -10362:0:4365 -10363:2:1844 -10364:0:4365 -10365:3:3758 -10366:0:4365 -10367:2:1845 -10368:2:1849 -10369:2:1850 -10370:2:1858 -10371:2:1859 -10372:2:1863 -10373:2:1864 -10374:2:1858 -10375:2:1859 -10376:2:1863 -10377:2:1864 -10378:2:1872 -10379:2:1877 -10380:2:1881 -10381:2:1882 -10382:2:1889 -10383:2:1890 -10384:2:1901 -10385:2:1902 -10386:2:1903 -10387:2:1901 -10388:2:1902 -10389:2:1903 -10390:2:1914 -10391:2:1919 -10392:2:1920 -10393:0:4365 -10394:2:1932 -10395:0:4365 -10396:3:3757 -10397:0:4365 -10398:2:1934 -10399:0:4365 -10400:3:3758 -10401:0:4365 -10402:2:1935 -10403:0:4365 -10404:2:1936 -10405:0:4365 -10406:2:2129 -10407:0:4365 -10408:2:2130 -10409:0:4365 -10410:2:2134 -10411:0:4365 -10412:3:3757 -10413:0:4365 -10414:2:2136 -10415:0:4365 -10416:3:3758 -10417:0:4365 -10418:2:2137 -10419:2:2141 -10420:2:2142 -10421:2:2150 -10422:2:2151 -10423:2:2155 -10424:2:2156 -10425:2:2150 -10426:2:2151 -10427:2:2155 -10428:2:2156 -10429:2:2164 -10430:2:2169 -10431:2:2173 -10432:2:2174 -10433:2:2181 -10434:2:2182 -10435:2:2193 -10436:2:2194 -10437:2:2195 -10438:2:2193 -10439:2:2194 -10440:2:2195 -10441:2:2206 -10442:2:2211 -10443:2:2212 -10444:0:4365 -10445:2:2224 -10446:0:4365 -10447:3:3757 -10448:0:4365 -10449:2:2226 -10450:0:4365 -10451:3:3758 -10452:0:4365 -10453:2:2230 -10454:0:4365 -10455:3:3757 -10456:0:4365 -10457:2:2235 -10458:2:2239 -10459:2:2240 -10460:2:2248 -10461:2:2249 -10462:2:2253 -10463:2:2254 -10464:2:2248 -10465:2:2249 -10466:2:2250 -10467:2:2262 -10468:2:2267 -10469:2:2271 -10470:2:2272 -10471:2:2279 -10472:2:2280 -10473:2:2291 -10474:2:2292 -10475:2:2293 -10476:2:2291 -10477:2:2292 -10478:2:2293 -10479:2:2304 -10480:2:2309 -10481:2:2310 -10482:0:4365 -10483:3:3758 -10484:0:4365 -10485:2:2322 -10486:0:4365 -10487:2:1169 -10488:0:4365 -10489:3:3757 -10490:0:4365 -10491:2:1170 -10492:0:4365 -10493:3:3758 -10494:0:4365 -10495:3:3759 -10496:0:4365 -10497:3:3972 -10498:0:4365 -10499:3:4077 -10500:0:4365 -10501:3:4078 -10502:0:4365 -10503:3:4082 -10504:0:4365 -10505:3:4088 -10506:0:4365 -10507:3:4092 -10508:3:4093 -10509:3:4097 -10510:3:4101 -10511:3:4102 -10512:3:4097 -10513:3:4101 -10514:3:4102 -10515:3:4106 -10516:3:4114 -10517:3:4115 -10518:3:4120 -10519:3:4127 -10520:3:4128 -10521:3:4127 -10522:3:4128 -10523:3:4135 -10524:3:4140 -10525:0:4365 -10526:3:4151 -10527:0:4365 -10528:3:4155 -10529:3:4156 -10530:3:4160 -10531:3:4164 -10532:3:4165 -10533:3:4160 -10534:3:4164 -10535:3:4165 -10536:3:4169 -10537:3:4177 -10538:3:4178 -10539:3:4183 -10540:3:4190 -10541:3:4191 -10542:3:4190 -10543:3:4191 -10544:3:4198 -10545:3:4203 -10546:0:4365 -10547:3:4151 -10548:0:4365 -10549:3:4155 -10550:3:4156 -10551:3:4160 -10552:3:4164 -10553:3:4165 -10554:3:4160 -10555:3:4164 -10556:3:4165 -10557:3:4169 -10558:3:4177 -10559:3:4178 -10560:3:4183 -10561:3:4190 -10562:3:4191 -10563:3:4190 -10564:3:4191 -10565:3:4198 -10566:3:4203 -10567:0:4365 -10568:3:4214 -10569:0:4365 -10570:3:4222 -10571:3:4223 -10572:3:4227 -10573:3:4231 -10574:3:4232 -10575:3:4227 -10576:3:4231 -10577:3:4232 -10578:3:4236 -10579:3:4244 -10580:3:4245 -10581:3:4250 -10582:3:4257 -10583:3:4258 -10584:3:4257 -10585:3:4258 -10586:3:4265 -10587:3:4270 -10588:0:4365 -10589:3:4285 -10590:0:4365 -10591:3:4286 -10592:0:4365 -10593:2:1173 -10594:0:4365 -10595:3:4287 -10596:0:4365 -10597:2:1179 -10598:0:4365 -10599:2:1180 -10600:0:4365 -10601:3:4286 -10602:0:4365 -10603:2:1181 -10604:2:1185 -10605:2:1186 -10606:2:1194 -10607:2:1195 -10608:2:1199 -10609:2:1200 -10610:2:1194 -10611:2:1195 -10612:2:1199 -10613:2:1200 -10614:2:1208 -10615:2:1213 -10616:2:1217 -10617:2:1218 -10618:2:1225 -10619:2:1226 -10620:2:1237 -10621:2:1238 -10622:2:1239 -10623:2:1237 -10624:2:1238 -10625:2:1239 -10626:2:1250 -10627:2:1255 -10628:2:1256 -10629:0:4365 -10630:3:4287 -10631:0:4365 -10632:2:1268 -10633:0:4365 -10634:3:4286 -10635:0:4365 -10636:2:1270 -10637:0:4365 -10638:3:4287 -10639:0:4365 -10640:2:1271 -10641:2:1275 -10642:2:1276 -10643:2:1284 -10644:2:1285 -10645:2:1289 -10646:2:1290 -10647:2:1284 -10648:2:1285 -10649:2:1289 -10650:2:1290 -10651:2:1298 -10652:2:1303 -10653:2:1307 -10654:2:1308 -10655:2:1315 -10656:2:1316 -10657:2:1327 -10658:2:1328 -10659:2:1329 -10660:2:1327 -10661:2:1328 -10662:2:1329 -10663:2:1340 -10664:2:1345 -10665:2:1346 -10666:0:4365 -10667:2:1358 -10668:0:4365 -10669:2:1360 -10670:0:4365 -10671:3:4286 -10672:0:4365 -10673:2:1361 -10674:0:4365 -10675:3:4287 -10676:0:4365 -10677:2:1362 -10678:2:1366 -10679:2:1367 -10680:2:1375 -10681:2:1376 -10682:2:1380 -10683:2:1381 -10684:2:1375 -10685:2:1376 -10686:2:1380 -10687:2:1381 -10688:2:1389 -10689:2:1394 -10690:2:1398 -10691:2:1399 -10692:2:1406 -10693:2:1407 -10694:2:1418 -10695:2:1419 -10696:2:1420 -10697:2:1418 -10698:2:1419 -10699:2:1420 -10700:2:1431 -10701:2:1436 -10702:2:1437 -10703:0:4365 -10704:2:1449 -10705:0:4365 -10706:3:4286 -10707:0:4365 -10708:2:1451 -10709:0:4365 -10710:3:4287 -10711:0:4365 -10712:2:1652 -10713:0:4365 -10714:2:1653 -10715:0:4365 -10716:2:1657 -10717:0:4365 -10718:2:1660 -10719:0:4365 -10720:3:4286 -10721:0:4365 -10722:2:1665 -10723:2:1669 -10724:2:1670 -10725:2:1678 -10726:2:1679 -10727:2:1683 -10728:2:1684 -10729:2:1678 -10730:2:1679 -10731:2:1680 -10732:2:1692 -10733:2:1697 -10734:2:1701 -10735:2:1702 -10736:2:1709 -10737:2:1710 -10738:2:1721 -10739:2:1722 -10740:2:1723 -10741:2:1721 -10742:2:1722 -10743:2:1723 -10744:2:1734 -10745:2:1739 -10746:2:1740 -10747:0:4365 -10748:3:4287 -10749:0:4365 -10750:2:1752 -10751:0:4365 -10752:3:4286 -10753:0:4365 -10754:2:1754 -10755:0:4365 -10756:3:4287 -10757:0:4365 -10758:2:1755 -10759:2:1759 -10760:2:1760 -10761:2:1768 -10762:2:1769 -10763:2:1773 -10764:2:1774 -10765:2:1768 -10766:2:1769 -10767:2:1773 -10768:2:1774 -10769:2:1782 -10770:2:1787 -10771:2:1791 -10772:2:1792 -10773:2:1799 -10774:2:1800 -10775:2:1811 -10776:2:1812 -10777:2:1813 -10778:2:1811 -10779:2:1812 -10780:2:1813 -10781:2:1824 -10782:2:1829 -10783:2:1830 -10784:0:4365 -10785:2:1842 -10786:0:4365 -10787:3:4286 -10788:0:4365 -10789:2:1844 -10790:0:4365 -10791:3:4287 -10792:0:4365 -10793:2:1845 -10794:2:1849 -10795:2:1850 -10796:2:1858 -10797:2:1859 -10798:2:1863 -10799:2:1864 -10800:2:1858 -10801:2:1859 -10802:2:1863 -10803:2:1864 -10804:2:1872 -10805:2:1877 -10806:2:1881 -10807:2:1882 -10808:2:1889 -10809:2:1890 -10810:2:1901 -10811:2:1902 -10812:2:1903 -10813:2:1901 -10814:2:1902 -10815:2:1903 -10816:2:1914 -10817:2:1919 -10818:2:1920 -10819:0:4365 -10820:2:1932 -10821:0:4365 -10822:3:4286 -10823:0:4365 -10824:2:1934 -10825:0:4365 -10826:3:4287 -10827:0:4365 -10828:2:1935 -10829:0:4365 -10830:2:1936 -10831:0:4365 -10832:2:2129 -10833:0:4365 -10834:2:2130 -10835:0:4365 -10836:2:2134 -10837:0:4365 -10838:3:4286 -10839:0:4365 -10840:2:2136 -10841:0:4365 -10842:3:4287 -10843:0:4365 -10844:2:2137 -10845:2:2141 -10846:2:2142 -10847:2:2150 -10848:2:2151 -10849:2:2155 -10850:2:2156 -10851:2:2150 -10852:2:2151 -10853:2:2155 -10854:2:2156 -10855:2:2164 -10856:2:2169 -10857:2:2173 -10858:2:2174 -10859:2:2181 -10860:2:2182 -10861:2:2193 -10862:2:2194 -10863:2:2195 -10864:2:2193 -10865:2:2194 -10866:2:2195 -10867:2:2206 -10868:2:2211 -10869:2:2212 -10870:0:4365 -10871:2:2224 -10872:0:4365 -10873:3:4286 -10874:0:4365 -10875:2:2226 -10876:0:4365 -10877:3:4287 -10878:0:4365 -10879:2:2230 -10880:0:4365 -10881:3:4286 -10882:0:4365 -10883:2:2235 -10884:2:2239 -10885:2:2240 -10886:2:2248 -10887:2:2249 -10888:2:2253 -10889:2:2254 -10890:2:2248 -10891:2:2249 -10892:2:2250 -10893:2:2262 -10894:2:2267 -10895:2:2271 -10896:2:2272 -10897:2:2279 -10898:2:2280 -10899:2:2291 -10900:2:2292 -10901:2:2293 -10902:2:2291 -10903:2:2292 -10904:2:2293 -10905:2:2304 -10906:2:2309 -10907:2:2310 -10908:0:4365 -10909:3:4287 -10910:0:4365 -10911:2:2322 -10912:0:4365 -10913:2:1169 -10914:0:4365 -10915:3:4286 -10916:0:4365 -10917:2:1170 -10918:0:4365 -10919:3:4287 -10920:0:4365 -10921:3:4288 -10922:0:4365 -10923:3:4294 -10924:0:4365 -10925:3:4295 -10926:0:4365 -10927:3:2338 -10928:0:4365 -10929:3:2339 -10930:3:2343 -10931:3:2344 -10932:3:2352 -10933:3:2353 -10934:3:2357 -10935:3:2358 -10936:3:2352 -10937:3:2353 -10938:3:2357 -10939:3:2358 -10940:3:2366 -10941:3:2371 -10942:3:2375 -10943:3:2376 -10944:3:2383 -10945:3:2384 -10946:3:2395 -10947:3:2396 -10948:3:2397 -10949:3:2395 -10950:3:2396 -10951:3:2397 -10952:3:2408 -10953:3:2413 -10954:3:2414 -10955:0:4365 -10956:3:2426 -10957:0:4365 -10958:3:2427 -10959:0:4365 -10960:2:1173 -10961:0:4365 -10962:3:2428 -10963:0:4365 -10964:2:1179 -10965:0:4365 -10966:2:1180 -10967:0:4365 -10968:3:2427 -10969:0:4365 -10970:2:1181 -10971:2:1185 -10972:2:1186 -10973:2:1194 -10974:2:1195 -10975:2:1199 -10976:2:1200 -10977:2:1194 -10978:2:1195 -10979:2:1199 -10980:2:1200 -10981:2:1208 -10982:2:1213 -10983:2:1217 -10984:2:1218 -10985:2:1225 -10986:2:1226 -10987:2:1237 -10988:2:1238 -10989:2:1239 -10990:2:1237 -10991:2:1238 -10992:2:1239 -10993:2:1250 -10994:2:1255 -10995:2:1256 -10996:0:4365 -10997:3:2428 -10998:0:4365 -10999:2:1268 -11000:0:4365 -11001:3:2427 -11002:0:4365 -11003:2:1270 -11004:0:4365 -11005:3:2428 -11006:0:4365 -11007:2:1271 -11008:2:1275 -11009:2:1276 -11010:2:1284 -11011:2:1285 -11012:2:1289 -11013:2:1290 -11014:2:1284 -11015:2:1285 -11016:2:1289 -11017:2:1290 -11018:2:1298 -11019:2:1303 -11020:2:1307 -11021:2:1308 -11022:2:1315 -11023:2:1316 -11024:2:1327 -11025:2:1328 -11026:2:1329 -11027:2:1327 -11028:2:1328 -11029:2:1329 -11030:2:1340 -11031:2:1345 -11032:2:1346 -11033:0:4365 -11034:2:1358 -11035:0:4365 -11036:2:1360 -11037:0:4365 -11038:3:2427 -11039:0:4365 -11040:2:1361 -11041:0:4365 -11042:3:2428 -11043:0:4365 -11044:2:1362 -11045:2:1366 -11046:2:1367 -11047:2:1375 -11048:2:1376 -11049:2:1380 -11050:2:1381 -11051:2:1375 -11052:2:1376 -11053:2:1380 -11054:2:1381 -11055:2:1389 -11056:2:1394 -11057:2:1398 -11058:2:1399 -11059:2:1406 -11060:2:1407 -11061:2:1418 -11062:2:1419 -11063:2:1420 -11064:2:1418 -11065:2:1419 -11066:2:1420 -11067:2:1431 -11068:2:1436 -11069:2:1437 -11070:0:4365 -11071:2:1449 -11072:0:4365 -11073:3:2427 -11074:0:4365 -11075:2:1451 -11076:0:4365 -11077:3:2428 -11078:0:4365 -11079:2:1652 -11080:0:4365 -11081:2:1653 -11082:0:4365 -11083:2:1657 -11084:0:4365 -11085:2:1660 -11086:0:4365 -11087:3:2427 -11088:0:4365 -11089:2:1665 -11090:2:1669 -11091:2:1670 -11092:2:1678 -11093:2:1679 -11094:2:1683 -11095:2:1684 -11096:2:1678 -11097:2:1679 -11098:2:1680 -11099:2:1692 -11100:2:1697 -11101:2:1701 -11102:2:1702 -11103:2:1709 -11104:2:1710 -11105:2:1721 -11106:2:1722 -11107:2:1723 -11108:2:1721 -11109:2:1722 -11110:2:1723 -11111:2:1734 -11112:2:1739 -11113:2:1740 -11114:0:4365 -11115:3:2428 -11116:0:4365 -11117:2:1752 -11118:0:4365 -11119:3:2427 -11120:0:4365 -11121:2:1754 -11122:0:4365 -11123:3:2428 -11124:0:4365 -11125:2:1755 -11126:2:1759 -11127:2:1760 -11128:2:1768 -11129:2:1769 -11130:2:1773 -11131:2:1774 -11132:2:1768 -11133:2:1769 -11134:2:1773 -11135:2:1774 -11136:2:1782 -11137:2:1787 -11138:2:1791 -11139:2:1792 -11140:2:1799 -11141:2:1800 -11142:2:1811 -11143:2:1812 -11144:2:1813 -11145:2:1811 -11146:2:1812 -11147:2:1813 -11148:2:1824 -11149:2:1829 -11150:2:1830 -11151:0:4365 -11152:2:1842 -11153:0:4365 -11154:3:2427 -11155:0:4365 -11156:2:1844 -11157:0:4363 -11158:3:2428 -11159:0:4369 diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_mb.define b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_mb.define deleted file mode 100644 index 136ef67..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_mb.define +++ /dev/null @@ -1,2 +0,0 @@ -#define NO_RMB -#define NO_WMB diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_mb.log b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_mb.log deleted file mode 100644 index 27a963a..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_mb.log +++ /dev/null @@ -1,267 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_mb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 745) -Depth= 11386 States= 1e+06 Transitions= 1.56e+07 Memory= 527.287 t= 12.8 R= 8e+04 -pan: claim violated! (at depth 2146) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 72 byte, depth reached 11386, errors: 1 - 1223588 states, stored - 17987399 states, matched - 19210987 transitions (= stored+matched) - 70012127 atomic steps -hash conflicts: 4173157 (resolved) - -Stats on memory usage (in Megabytes): - 116.690 equivalent memory usage for states (stored*(State-vector + overhead)) - 75.177 actual memory usage for states (compression: 64.42%) - state-vector as stored = 36 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 540.861 total actual memory usage - -unreached in proctype urcu_reader - line 400, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 61, "(1)" - line 419, "pan.___", state 91, "(1)" - line 400, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 151, "(1)" - line 419, "pan.___", state 181, "(1)" - line 400, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 242, "(1)" - line 419, "pan.___", state 272, "(1)" - line 400, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 331, "(1)" - line 409, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 360, "(1)" - line 419, "pan.___", state 390, "(1)" - line 541, "pan.___", state 414, "-end-" - (18 of 414 states) -unreached in proctype urcu_writer - line 400, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 20, "(1)" - line 404, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 34, "(1)" - line 404, "pan.___", state 35, "(1)" - line 404, "pan.___", state 35, "(1)" - line 402, "pan.___", state 40, "((i<1))" - line 402, "pan.___", state 40, "((i>=1))" - line 409, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 59, "(1)" - line 410, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 60, "else" - line 410, "pan.___", state 63, "(1)" - line 410, "pan.___", state 64, "(1)" - line 410, "pan.___", state 64, "(1)" - line 414, "pan.___", state 72, "(1)" - line 414, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 73, "else" - line 414, "pan.___", state 76, "(1)" - line 414, "pan.___", state 77, "(1)" - line 414, "pan.___", state 77, "(1)" - line 412, "pan.___", state 82, "((i<1))" - line 412, "pan.___", state 82, "((i>=1))" - line 419, "pan.___", state 89, "(1)" - line 419, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 90, "else" - line 419, "pan.___", state 93, "(1)" - line 419, "pan.___", state 94, "(1)" - line 419, "pan.___", state 94, "(1)" - line 421, "pan.___", state 97, "(1)" - line 421, "pan.___", state 97, "(1)" - line 370, "pan.___", state 99, "(1)" - line 640, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" - line 638, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" - line 400, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 114, "(1)" - line 404, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 128, "(1)" - line 404, "pan.___", state 129, "(1)" - line 404, "pan.___", state 129, "(1)" - line 410, "pan.___", state 153, "(1)" - line 414, "pan.___", state 166, "(1)" - line 421, "pan.___", state 191, "(1)" - line 421, "pan.___", state 191, "(1)" - line 653, "pan.___", state 199, "(1)" - line 400, "pan.___", state 209, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 223, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 254, "(1)" - line 414, "pan.___", state 267, "(1)" - line 400, "pan.___", state 300, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 314, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 345, "(1)" - line 414, "pan.___", state 358, "(1)" - line 400, "pan.___", state 395, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 409, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 440, "(1)" - line 414, "pan.___", state 453, "(1)" - line 400, "pan.___", state 488, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 502, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 533, "(1)" - line 414, "pan.___", state 546, "(1)" - line 400, "pan.___", state 582, "(1)" - line 404, "pan.___", state 594, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 638, "(1)" - line 404, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 731, "(1)" - line 404, "pan.___", state 777, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 795, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 821, "(1)" - line 419, "pan.___", state 838, "(1)" - line 404, "pan.___", state 868, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 886, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 912, "(1)" - line 419, "pan.___", state 929, "(1)" - line 404, "pan.___", state 963, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 981, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1007, "(1)" - line 419, "pan.___", state 1024, "(1)" - line 400, "pan.___", state 1050, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 1052, "(1)" - line 400, "pan.___", state 1053, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 1053, "else" - line 400, "pan.___", state 1056, "(1)" - line 404, "pan.___", state 1064, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 1066, "(1)" - line 404, "pan.___", state 1067, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 404, "pan.___", state 1067, "else" - line 404, "pan.___", state 1070, "(1)" - line 404, "pan.___", state 1071, "(1)" - line 404, "pan.___", state 1071, "(1)" - line 402, "pan.___", state 1076, "((i<1))" - line 402, "pan.___", state 1076, "((i>=1))" - line 409, "pan.___", state 1082, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 1095, "(1)" - line 410, "pan.___", state 1096, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 1096, "else" - line 410, "pan.___", state 1099, "(1)" - line 410, "pan.___", state 1100, "(1)" - line 410, "pan.___", state 1100, "(1)" - line 414, "pan.___", state 1108, "(1)" - line 414, "pan.___", state 1109, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 1109, "else" - line 414, "pan.___", state 1112, "(1)" - line 414, "pan.___", state 1113, "(1)" - line 414, "pan.___", state 1113, "(1)" - line 412, "pan.___", state 1118, "((i<1))" - line 412, "pan.___", state 1118, "((i>=1))" - line 419, "pan.___", state 1125, "(1)" - line 419, "pan.___", state 1126, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 1126, "else" - line 419, "pan.___", state 1129, "(1)" - line 419, "pan.___", state 1130, "(1)" - line 419, "pan.___", state 1130, "(1)" - line 421, "pan.___", state 1133, "(1)" - line 421, "pan.___", state 1133, "(1)" - line 404, "pan.___", state 1164, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1208, "(1)" - line 404, "pan.___", state 1254, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1298, "(1)" - line 400, "pan.___", state 1334, "(1)" - line 404, "pan.___", state 1346, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1390, "(1)" - line 404, "pan.___", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1483, "(1)" - line 404, "pan.___", state 1529, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1547, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1573, "(1)" - line 419, "pan.___", state 1590, "(1)" - line 404, "pan.___", state 1620, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1638, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1664, "(1)" - line 419, "pan.___", state 1681, "(1)" - line 404, "pan.___", state 1715, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1733, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1759, "(1)" - line 419, "pan.___", state 1776, "(1)" - line 400, "pan.___", state 1802, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 1804, "(1)" - line 400, "pan.___", state 1805, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 1805, "else" - line 400, "pan.___", state 1808, "(1)" - line 404, "pan.___", state 1816, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 1818, "(1)" - line 404, "pan.___", state 1819, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 404, "pan.___", state 1819, "else" - line 404, "pan.___", state 1822, "(1)" - line 404, "pan.___", state 1823, "(1)" - line 404, "pan.___", state 1823, "(1)" - line 402, "pan.___", state 1828, "((i<1))" - line 402, "pan.___", state 1828, "((i>=1))" - line 409, "pan.___", state 1834, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 1847, "(1)" - line 410, "pan.___", state 1848, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 1848, "else" - line 410, "pan.___", state 1851, "(1)" - line 410, "pan.___", state 1852, "(1)" - line 410, "pan.___", state 1852, "(1)" - line 414, "pan.___", state 1860, "(1)" - line 414, "pan.___", state 1861, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 1861, "else" - line 414, "pan.___", state 1864, "(1)" - line 414, "pan.___", state 1865, "(1)" - line 414, "pan.___", state 1865, "(1)" - line 412, "pan.___", state 1870, "((i<1))" - line 412, "pan.___", state 1870, "((i>=1))" - line 419, "pan.___", state 1877, "(1)" - line 419, "pan.___", state 1878, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 1878, "else" - line 419, "pan.___", state 1881, "(1)" - line 419, "pan.___", state 1882, "(1)" - line 419, "pan.___", state 1882, "(1)" - line 421, "pan.___", state 1885, "(1)" - line 421, "pan.___", state 1885, "(1)" - line 404, "pan.___", state 1916, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1960, "(1)" - line 404, "pan.___", state 2007, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 2051, "(1)" - line 404, "pan.___", state 2102, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 2146, "(1)" - line 703, "pan.___", state 2192, "-end-" - (144 of 2192 states) -unreached in proctype :init: - line 710, "pan.___", state 9, "((j<2))" - line 710, "pan.___", state 9, "((j>=2))" - line 711, "pan.___", state 20, "((j<2))" - line 711, "pan.___", state 20, "((j>=2))" - line 716, "pan.___", state 33, "((j<2))" - line 716, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 750, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 15.9 seconds -pan: rate 77100.693 states/second -pan: avg transition delay 8.2609e-07 usec -cp .input.spin urcu_free_no_mb.spin.input -cp .input.spin.trail urcu_free_no_mb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_mb.spin.input b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_mb.spin.input deleted file mode 100644 index 927df3f..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_mb.spin.input +++ /dev/null @@ -1,724 +0,0 @@ -#define NO_RMB -#define NO_WMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -//#define READER_NEST_LEVEL 1 -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_mb.spin.input.trail b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_mb.spin.input.trail deleted file mode 100644 index 04e7425..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_mb.spin.input.trail +++ /dev/null @@ -1,2149 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2654 -2:3:2606 -3:3:2609 -4:3:2609 -5:3:2612 -6:3:2620 -7:3:2620 -8:3:2623 -9:3:2629 -10:3:2633 -11:3:2633 -12:3:2636 -13:3:2644 -14:3:2648 -15:3:2649 -16:0:2654 -17:3:2651 -18:0:2654 -19:2:416 -20:0:2654 -21:2:422 -22:0:2654 -23:2:423 -24:0:2654 -25:2:424 -26:2:428 -27:2:429 -28:2:437 -29:2:438 -30:2:442 -31:2:443 -32:2:451 -33:2:456 -34:2:460 -35:2:461 -36:2:468 -37:2:469 -38:2:480 -39:2:481 -40:2:482 -41:2:493 -42:2:498 -43:2:499 -44:0:2654 -45:2:511 -46:0:2654 -47:2:513 -48:2:514 -49:0:2654 -50:2:518 -51:2:522 -52:2:523 -53:2:531 -54:2:532 -55:2:536 -56:2:537 -57:2:545 -58:2:550 -59:2:551 -60:2:562 -61:2:563 -62:2:574 -63:2:575 -64:2:576 -65:2:587 -66:2:592 -67:2:593 -68:0:2654 -69:2:605 -70:0:2654 -71:2:607 -72:0:2654 -73:2:608 -74:0:2654 -75:2:618 -76:0:2654 -77:2:619 -78:2:623 -79:2:624 -80:2:632 -81:2:633 -82:2:637 -83:2:638 -84:2:646 -85:2:651 -86:2:655 -87:2:656 -88:2:663 -89:2:664 -90:2:675 -91:2:676 -92:2:677 -93:2:688 -94:2:693 -95:2:694 -96:0:2654 -97:2:709 -98:0:2654 -99:2:710 -100:2:714 -101:2:715 -102:2:723 -103:2:724 -104:2:728 -105:2:729 -106:2:737 -107:2:742 -108:2:746 -109:2:747 -110:2:754 -111:2:755 -112:2:766 -113:2:767 -114:2:768 -115:2:779 -116:2:784 -117:2:785 -118:0:2654 -119:2:800 -120:0:2654 -121:2:805 -122:2:809 -123:2:810 -124:2:818 -125:2:819 -126:2:823 -127:2:824 -128:2:832 -129:2:837 -130:2:841 -131:2:842 -132:2:849 -133:2:850 -134:2:861 -135:2:862 -136:2:863 -137:2:874 -138:2:879 -139:2:880 -140:0:2654 -141:2:895 -142:0:2654 -143:2:897 -144:0:2654 -145:2:898 -146:2:902 -147:2:903 -148:2:911 -149:2:912 -150:2:916 -151:2:917 -152:2:925 -153:2:930 -154:2:934 -155:2:935 -156:2:942 -157:2:943 -158:2:954 -159:2:955 -160:2:956 -161:2:967 -162:2:972 -163:2:973 -164:0:2654 -165:2:985 -166:0:2654 -167:2:987 -168:0:2654 -169:2:990 -170:2:991 -171:2:1003 -172:2:1004 -173:2:1008 -174:2:1009 -175:2:1017 -176:2:1022 -177:2:1026 -178:2:1027 -179:2:1034 -180:2:1035 -181:2:1046 -182:2:1047 -183:2:1048 -184:2:1059 -185:2:1064 -186:2:1065 -187:0:2654 -188:2:1077 -189:0:2654 -190:2:1079 -191:0:2654 -192:2:1080 -193:0:2654 -194:2:1081 -195:0:2654 -196:2:1082 -197:0:2654 -198:2:1083 -199:2:1087 -200:2:1088 -201:2:1096 -202:2:1097 -203:2:1101 -204:2:1102 -205:2:1110 -206:2:1115 -207:2:1119 -208:2:1120 -209:2:1127 -210:2:1128 -211:2:1139 -212:2:1140 -213:2:1141 -214:2:1152 -215:2:1157 -216:2:1158 -217:0:2654 -218:2:1170 -219:0:2654 -220:2:1451 -221:0:2654 -222:2:1549 -223:0:2654 -224:2:1550 -225:0:2654 -226:2:1554 -227:0:2654 -228:2:1560 -229:2:1564 -230:2:1565 -231:2:1573 -232:2:1574 -233:2:1578 -234:2:1579 -235:2:1587 -236:2:1592 -237:2:1596 -238:2:1597 -239:2:1604 -240:2:1605 -241:2:1616 -242:2:1617 -243:2:1618 -244:2:1629 -245:2:1634 -246:2:1635 -247:0:2654 -248:2:1647 -249:0:2654 -250:2:1649 -251:0:2654 -252:2:1650 -253:2:1654 -254:2:1655 -255:2:1663 -256:2:1664 -257:2:1668 -258:2:1669 -259:2:1677 -260:2:1682 -261:2:1686 -262:2:1687 -263:2:1694 -264:2:1695 -265:2:1706 -266:2:1707 -267:2:1708 -268:2:1719 -269:2:1724 -270:2:1725 -271:0:2654 -272:2:1737 -273:0:2654 -274:2:1739 -275:0:2654 -276:2:1742 -277:2:1743 -278:2:1755 -279:2:1756 -280:2:1760 -281:2:1761 -282:2:1769 -283:2:1774 -284:2:1778 -285:2:1779 -286:2:1786 -287:2:1787 -288:2:1798 -289:2:1799 -290:2:1800 -291:2:1811 -292:2:1816 -293:2:1817 -294:0:2654 -295:2:1829 -296:0:2654 -297:2:1831 -298:0:2654 -299:2:1832 -300:0:2654 -301:2:1833 -302:0:2654 -303:2:1834 -304:0:2654 -305:2:1835 -306:2:1839 -307:2:1840 -308:2:1848 -309:2:1849 -310:2:1853 -311:2:1854 -312:2:1862 -313:2:1867 -314:2:1871 -315:2:1872 -316:2:1879 -317:2:1880 -318:2:1891 -319:2:1892 -320:2:1893 -321:2:1904 -322:2:1909 -323:2:1910 -324:0:2654 -325:2:1922 -326:0:2654 -327:2:2203 -328:0:2654 -329:2:2301 -330:0:2654 -331:2:2302 -332:0:2654 -333:2:2306 -334:0:2654 -335:2:2312 -336:2:2316 -337:2:2317 -338:2:2325 -339:2:2326 -340:2:2330 -341:2:2331 -342:2:2339 -343:2:2344 -344:2:2348 -345:2:2349 -346:2:2356 -347:2:2357 -348:2:2368 -349:2:2369 -350:2:2370 -351:2:2381 -352:2:2386 -353:2:2387 -354:0:2654 -355:2:2402 -356:0:2654 -357:2:2403 -358:2:2407 -359:2:2408 -360:2:2416 -361:2:2417 -362:2:2421 -363:2:2422 -364:2:2430 -365:2:2435 -366:2:2439 -367:2:2440 -368:2:2447 -369:2:2448 -370:2:2459 -371:2:2460 -372:2:2461 -373:2:2472 -374:2:2477 -375:2:2478 -376:0:2654 -377:2:2493 -378:0:2654 -379:2:2498 -380:2:2502 -381:2:2503 -382:2:2511 -383:2:2512 -384:2:2516 -385:2:2517 -386:2:2525 -387:2:2530 -388:2:2534 -389:2:2535 -390:2:2542 -391:2:2543 -392:2:2554 -393:2:2555 -394:2:2556 -395:2:2567 -396:2:2572 -397:2:2573 -398:0:2654 -399:2:2588 -400:0:2654 -401:2:2590 -402:0:2654 -403:2:2591 -404:0:2654 -405:2:423 -406:0:2654 -407:2:424 -408:2:428 -409:2:429 -410:2:437 -411:2:438 -412:2:442 -413:2:443 -414:2:451 -415:2:456 -416:2:460 -417:2:461 -418:2:468 -419:2:469 -420:2:480 -421:2:481 -422:2:482 -423:2:493 -424:2:498 -425:2:499 -426:0:2654 -427:2:511 -428:0:2654 -429:2:513 -430:2:514 -431:0:2654 -432:2:518 -433:2:522 -434:2:523 -435:2:531 -436:2:532 -437:2:536 -438:2:537 -439:2:545 -440:2:550 -441:2:551 -442:2:562 -443:2:563 -444:2:574 -445:2:575 -446:2:576 -447:2:587 -448:2:592 -449:2:593 -450:0:2654 -451:2:605 -452:0:2654 -453:2:607 -454:0:2654 -455:2:608 -456:0:2654 -457:2:618 -458:0:2654 -459:2:619 -460:2:623 -461:2:624 -462:2:632 -463:2:633 -464:2:637 -465:2:638 -466:2:646 -467:2:651 -468:2:655 -469:2:656 -470:2:663 -471:2:664 -472:2:675 -473:2:676 -474:2:677 -475:2:688 -476:2:693 -477:2:694 -478:0:2654 -479:2:709 -480:0:2654 -481:2:710 -482:2:714 -483:2:715 -484:2:723 -485:2:724 -486:2:728 -487:2:729 -488:2:737 -489:2:742 -490:2:746 -491:2:747 -492:2:754 -493:2:755 -494:2:766 -495:2:767 -496:2:768 -497:2:779 -498:2:784 -499:2:785 -500:0:2654 -501:2:800 -502:0:2654 -503:2:805 -504:2:809 -505:2:810 -506:2:818 -507:2:819 -508:2:823 -509:2:824 -510:2:832 -511:2:837 -512:2:841 -513:2:842 -514:2:849 -515:2:850 -516:2:861 -517:2:862 -518:2:863 -519:2:874 -520:2:879 -521:2:880 -522:0:2654 -523:2:895 -524:0:2654 -525:2:897 -526:0:2654 -527:2:898 -528:2:902 -529:2:903 -530:2:911 -531:2:912 -532:2:916 -533:2:917 -534:2:925 -535:2:930 -536:2:934 -537:2:935 -538:2:942 -539:2:943 -540:2:954 -541:2:955 -542:2:956 -543:2:967 -544:2:972 -545:2:973 -546:0:2654 -547:2:985 -548:0:2654 -549:2:987 -550:0:2654 -551:2:990 -552:2:991 -553:2:1003 -554:2:1004 -555:2:1008 -556:2:1009 -557:2:1017 -558:2:1022 -559:2:1026 -560:2:1027 -561:2:1034 -562:2:1035 -563:2:1046 -564:2:1047 -565:2:1048 -566:2:1059 -567:2:1064 -568:2:1065 -569:0:2654 -570:2:1077 -571:0:2654 -572:2:1079 -573:0:2654 -574:2:1080 -575:0:2654 -576:2:1081 -577:0:2654 -578:2:1082 -579:0:2654 -580:2:1083 -581:2:1087 -582:2:1088 -583:2:1096 -584:2:1097 -585:2:1101 -586:2:1102 -587:2:1110 -588:2:1115 -589:2:1119 -590:2:1120 -591:2:1127 -592:2:1128 -593:2:1139 -594:2:1140 -595:2:1141 -596:2:1152 -597:2:1157 -598:2:1158 -599:0:2654 -600:2:1170 -601:0:2654 -602:2:1451 -603:0:2654 -604:2:1549 -605:0:2654 -606:2:1550 -607:0:2654 -608:2:1554 -609:0:2654 -610:2:1560 -611:2:1564 -612:2:1565 -613:2:1573 -614:2:1574 -615:2:1578 -616:2:1579 -617:2:1587 -618:2:1592 -619:2:1596 -620:2:1597 -621:2:1604 -622:2:1605 -623:2:1616 -624:2:1617 -625:2:1618 -626:2:1629 -627:2:1634 -628:2:1635 -629:0:2654 -630:2:1647 -631:0:2654 -632:2:1649 -633:0:2654 -634:2:1650 -635:2:1654 -636:2:1655 -637:2:1663 -638:2:1664 -639:2:1668 -640:2:1669 -641:2:1677 -642:2:1682 -643:2:1686 -644:2:1687 -645:2:1694 -646:2:1695 -647:2:1706 -648:2:1707 -649:2:1708 -650:2:1719 -651:2:1724 -652:2:1725 -653:0:2654 -654:2:1737 -655:0:2654 -656:2:1739 -657:0:2654 -658:2:1742 -659:2:1743 -660:2:1755 -661:2:1756 -662:2:1760 -663:2:1761 -664:2:1769 -665:2:1774 -666:2:1778 -667:2:1779 -668:2:1786 -669:2:1787 -670:2:1798 -671:2:1799 -672:2:1800 -673:2:1811 -674:2:1816 -675:2:1817 -676:0:2654 -677:2:1829 -678:0:2654 -679:2:1831 -680:0:2654 -681:2:1832 -682:0:2654 -683:2:1833 -684:0:2654 -685:2:1834 -686:0:2654 -687:2:1835 -688:2:1839 -689:2:1840 -690:2:1848 -691:2:1849 -692:2:1853 -693:2:1854 -694:2:1862 -695:2:1867 -696:2:1871 -697:2:1872 -698:2:1879 -699:2:1880 -700:2:1891 -701:2:1892 -702:2:1893 -703:2:1904 -704:2:1909 -705:2:1910 -706:0:2654 -707:2:1922 -708:0:2654 -709:2:2203 -710:0:2654 -711:2:2301 -712:0:2654 -713:2:2302 -714:0:2654 -715:2:2306 -716:0:2654 -717:2:2312 -718:2:2316 -719:2:2317 -720:2:2325 -721:2:2326 -722:2:2330 -723:2:2331 -724:2:2339 -725:2:2344 -726:2:2348 -727:2:2349 -728:2:2356 -729:2:2357 -730:2:2368 -731:2:2369 -732:2:2370 -733:2:2381 -734:2:2386 -735:2:2387 -736:0:2654 -737:2:2402 -738:0:2654 -739:2:2403 -740:2:2407 -741:2:2408 -742:2:2416 -743:2:2417 -744:2:2421 -745:2:2422 -746:2:2430 -747:2:2435 -748:2:2439 -749:2:2440 -750:2:2447 -751:2:2448 -752:2:2459 -753:2:2460 -754:2:2461 -755:2:2472 -756:2:2477 -757:2:2478 -758:0:2654 -759:2:2493 -760:0:2654 -761:2:2498 -762:2:2502 -763:2:2503 -764:2:2511 -765:2:2512 -766:2:2516 -767:2:2517 -768:2:2525 -769:2:2530 -770:2:2534 -771:2:2535 -772:2:2542 -773:2:2543 -774:2:2554 -775:2:2555 -776:2:2556 -777:2:2567 -778:2:2572 -779:2:2573 -780:0:2654 -781:2:2588 -782:0:2654 -783:2:2590 -784:0:2654 -785:2:2591 -786:0:2654 -787:2:423 -788:0:2654 -789:2:424 -790:2:428 -791:2:429 -792:2:437 -793:2:438 -794:2:442 -795:2:443 -796:2:451 -797:2:456 -798:2:460 -799:2:461 -800:2:468 -801:2:469 -802:2:480 -803:2:481 -804:2:482 -805:2:493 -806:2:498 -807:2:499 -808:0:2654 -809:2:511 -810:0:2654 -811:2:513 -812:2:514 -813:0:2654 -814:2:518 -815:2:522 -816:2:523 -817:2:531 -818:2:532 -819:2:536 -820:2:537 -821:2:545 -822:2:550 -823:2:551 -824:2:562 -825:2:563 -826:2:574 -827:2:575 -828:2:576 -829:2:587 -830:2:592 -831:2:593 -832:0:2654 -833:2:605 -834:0:2654 -835:2:607 -836:0:2654 -837:2:608 -838:0:2654 -839:2:618 -840:0:2654 -841:2:619 -842:2:623 -843:2:624 -844:2:632 -845:2:633 -846:2:637 -847:2:638 -848:2:646 -849:2:651 -850:2:655 -851:2:656 -852:2:663 -853:2:664 -854:2:675 -855:2:676 -856:2:677 -857:2:688 -858:2:693 -859:2:694 -860:0:2654 -861:2:709 -862:0:2654 -863:2:710 -864:2:714 -865:2:715 -866:2:723 -867:2:724 -868:2:728 -869:2:729 -870:2:737 -871:2:742 -872:2:746 -873:2:747 -874:2:754 -875:2:755 -876:2:766 -877:2:767 -878:2:768 -879:2:779 -880:2:784 -881:2:785 -882:0:2654 -883:2:800 -884:0:2654 -885:2:805 -886:2:809 -887:2:810 -888:2:818 -889:2:819 -890:2:823 -891:2:824 -892:2:832 -893:2:837 -894:2:841 -895:2:842 -896:2:849 -897:2:850 -898:2:861 -899:2:862 -900:2:863 -901:2:874 -902:2:879 -903:2:880 -904:0:2654 -905:2:895 -906:0:2654 -907:2:897 -908:0:2654 -909:2:898 -910:2:902 -911:2:903 -912:2:911 -913:2:912 -914:2:916 -915:2:917 -916:2:925 -917:2:930 -918:2:934 -919:2:935 -920:2:942 -921:2:943 -922:2:954 -923:2:955 -924:2:956 -925:2:967 -926:2:972 -927:2:973 -928:0:2654 -929:2:985 -930:0:2654 -931:2:987 -932:0:2654 -933:2:990 -934:2:991 -935:2:1003 -936:2:1004 -937:2:1008 -938:2:1009 -939:2:1017 -940:2:1022 -941:2:1026 -942:2:1027 -943:2:1034 -944:2:1035 -945:2:1046 -946:2:1047 -947:2:1048 -948:2:1059 -949:2:1064 -950:2:1065 -951:0:2654 -952:2:1077 -953:0:2654 -954:2:1079 -955:0:2654 -956:2:1080 -957:0:2654 -958:2:1081 -959:0:2654 -960:2:1082 -961:0:2654 -962:2:1083 -963:2:1087 -964:2:1088 -965:2:1096 -966:2:1097 -967:2:1101 -968:2:1102 -969:2:1110 -970:2:1115 -971:2:1119 -972:2:1120 -973:2:1127 -974:2:1128 -975:2:1139 -976:2:1140 -977:2:1141 -978:2:1152 -979:2:1157 -980:2:1158 -981:0:2654 -982:2:1170 -983:0:2654 -984:2:1451 -985:0:2654 -986:2:1549 -987:0:2654 -988:2:1550 -989:0:2654 -990:2:1554 -991:0:2654 -992:2:1560 -993:2:1564 -994:2:1565 -995:2:1573 -996:2:1574 -997:2:1578 -998:2:1579 -999:2:1587 -1000:2:1592 -1001:2:1596 -1002:2:1597 -1003:2:1604 -1004:2:1605 -1005:2:1616 -1006:2:1617 -1007:2:1618 -1008:2:1629 -1009:2:1634 -1010:2:1635 -1011:0:2654 -1012:2:1647 -1013:0:2654 -1014:2:1649 -1015:0:2654 -1016:2:1650 -1017:2:1654 -1018:2:1655 -1019:2:1663 -1020:2:1664 -1021:2:1668 -1022:2:1669 -1023:2:1677 -1024:2:1682 -1025:2:1686 -1026:2:1687 -1027:2:1694 -1028:2:1695 -1029:2:1706 -1030:2:1707 -1031:2:1708 -1032:2:1719 -1033:2:1724 -1034:2:1725 -1035:0:2654 -1036:2:1737 -1037:0:2654 -1038:2:1739 -1039:0:2654 -1040:2:1742 -1041:2:1743 -1042:2:1755 -1043:2:1756 -1044:2:1760 -1045:2:1761 -1046:2:1769 -1047:2:1774 -1048:2:1778 -1049:2:1779 -1050:2:1786 -1051:2:1787 -1052:2:1798 -1053:2:1799 -1054:2:1800 -1055:2:1811 -1056:2:1816 -1057:2:1817 -1058:0:2654 -1059:2:1829 -1060:0:2654 -1061:2:1831 -1062:0:2654 -1063:2:1832 -1064:0:2654 -1065:2:1833 -1066:0:2654 -1067:2:1834 -1068:0:2654 -1069:2:1835 -1070:2:1839 -1071:2:1840 -1072:2:1848 -1073:2:1849 -1074:2:1853 -1075:2:1854 -1076:2:1862 -1077:2:1867 -1078:2:1871 -1079:2:1872 -1080:2:1879 -1081:2:1880 -1082:2:1891 -1083:2:1892 -1084:2:1893 -1085:2:1904 -1086:2:1909 -1087:2:1910 -1088:0:2654 -1089:2:1922 -1090:0:2654 -1091:2:2203 -1092:0:2654 -1093:2:2301 -1094:0:2654 -1095:2:2302 -1096:0:2654 -1097:2:2306 -1098:0:2654 -1099:2:2312 -1100:2:2316 -1101:2:2317 -1102:2:2325 -1103:2:2326 -1104:2:2330 -1105:2:2331 -1106:2:2339 -1107:2:2344 -1108:2:2348 -1109:2:2349 -1110:2:2356 -1111:2:2357 -1112:2:2368 -1113:2:2369 -1114:2:2370 -1115:2:2381 -1116:2:2386 -1117:2:2387 -1118:0:2654 -1119:2:2402 -1120:0:2654 -1121:2:2403 -1122:2:2407 -1123:2:2408 -1124:2:2416 -1125:2:2417 -1126:2:2421 -1127:2:2422 -1128:2:2430 -1129:2:2435 -1130:2:2439 -1131:2:2440 -1132:2:2447 -1133:2:2448 -1134:2:2459 -1135:2:2460 -1136:2:2461 -1137:2:2472 -1138:2:2477 -1139:2:2478 -1140:0:2654 -1141:2:2493 -1142:0:2654 -1143:2:2498 -1144:2:2502 -1145:2:2503 -1146:2:2511 -1147:2:2512 -1148:2:2516 -1149:2:2517 -1150:2:2525 -1151:2:2530 -1152:2:2534 -1153:2:2535 -1154:2:2542 -1155:2:2543 -1156:2:2554 -1157:2:2555 -1158:2:2556 -1159:2:2567 -1160:2:2572 -1161:2:2573 -1162:0:2654 -1163:2:2588 -1164:0:2654 -1165:2:2590 -1166:0:2654 -1167:2:2591 -1168:0:2654 -1169:2:423 -1170:0:2654 -1171:2:424 -1172:2:428 -1173:2:429 -1174:2:437 -1175:2:438 -1176:2:442 -1177:2:443 -1178:2:451 -1179:2:456 -1180:2:460 -1181:2:461 -1182:2:468 -1183:2:469 -1184:2:480 -1185:2:481 -1186:2:482 -1187:2:493 -1188:2:498 -1189:2:499 -1190:0:2654 -1191:2:511 -1192:0:2654 -1193:2:513 -1194:2:514 -1195:0:2654 -1196:2:518 -1197:2:522 -1198:2:523 -1199:2:531 -1200:2:532 -1201:2:536 -1202:2:537 -1203:2:545 -1204:2:550 -1205:2:551 -1206:2:562 -1207:2:563 -1208:2:574 -1209:2:575 -1210:2:576 -1211:2:587 -1212:2:592 -1213:2:593 -1214:0:2654 -1215:2:605 -1216:0:2654 -1217:2:607 -1218:0:2654 -1219:2:608 -1220:0:2654 -1221:2:618 -1222:0:2654 -1223:2:619 -1224:2:623 -1225:2:624 -1226:2:632 -1227:2:633 -1228:2:637 -1229:2:638 -1230:2:646 -1231:2:651 -1232:2:655 -1233:2:656 -1234:2:663 -1235:2:664 -1236:2:675 -1237:2:676 -1238:2:677 -1239:2:688 -1240:2:693 -1241:2:694 -1242:0:2654 -1243:2:709 -1244:0:2654 -1245:2:710 -1246:2:714 -1247:2:715 -1248:2:723 -1249:2:724 -1250:2:728 -1251:2:729 -1252:2:737 -1253:2:742 -1254:2:746 -1255:2:747 -1256:2:754 -1257:2:755 -1258:2:766 -1259:2:767 -1260:2:768 -1261:2:779 -1262:2:784 -1263:2:785 -1264:0:2654 -1265:2:800 -1266:0:2654 -1267:2:805 -1268:2:809 -1269:2:810 -1270:2:818 -1271:2:819 -1272:2:823 -1273:2:824 -1274:2:832 -1275:2:837 -1276:2:841 -1277:2:842 -1278:2:849 -1279:2:850 -1280:2:861 -1281:2:862 -1282:2:863 -1283:2:874 -1284:2:879 -1285:2:880 -1286:0:2654 -1287:2:895 -1288:0:2654 -1289:2:897 -1290:0:2654 -1291:2:898 -1292:2:902 -1293:2:903 -1294:2:911 -1295:2:912 -1296:2:916 -1297:2:917 -1298:2:925 -1299:2:930 -1300:2:934 -1301:2:935 -1302:2:942 -1303:2:943 -1304:2:954 -1305:2:955 -1306:2:956 -1307:2:967 -1308:2:972 -1309:2:973 -1310:0:2654 -1311:2:985 -1312:0:2654 -1313:2:987 -1314:0:2654 -1315:2:990 -1316:2:991 -1317:2:1003 -1318:2:1004 -1319:2:1008 -1320:2:1009 -1321:2:1017 -1322:2:1022 -1323:2:1026 -1324:2:1027 -1325:2:1034 -1326:2:1035 -1327:2:1046 -1328:2:1047 -1329:2:1048 -1330:2:1059 -1331:2:1064 -1332:2:1065 -1333:0:2654 -1334:2:1077 -1335:0:2654 -1336:2:1079 -1337:0:2654 -1338:2:1080 -1339:0:2654 -1340:2:1081 -1341:0:2654 -1342:2:1082 -1343:0:2654 -1344:2:1083 -1345:2:1087 -1346:2:1088 -1347:2:1096 -1348:2:1097 -1349:2:1101 -1350:2:1102 -1351:2:1110 -1352:2:1115 -1353:2:1119 -1354:2:1120 -1355:2:1127 -1356:2:1128 -1357:2:1139 -1358:2:1140 -1359:2:1141 -1360:2:1152 -1361:2:1157 -1362:2:1158 -1363:0:2654 -1364:2:1170 -1365:0:2654 -1366:2:1451 -1367:0:2654 -1368:2:1549 -1369:0:2654 -1370:2:1550 -1371:0:2654 -1372:2:1554 -1373:0:2654 -1374:2:1560 -1375:2:1564 -1376:2:1565 -1377:2:1573 -1378:2:1574 -1379:2:1578 -1380:2:1579 -1381:2:1587 -1382:2:1592 -1383:2:1596 -1384:2:1597 -1385:2:1604 -1386:2:1605 -1387:2:1616 -1388:2:1617 -1389:2:1618 -1390:2:1629 -1391:2:1634 -1392:2:1635 -1393:0:2654 -1394:2:1647 -1395:0:2654 -1396:2:1649 -1397:0:2654 -1398:2:1650 -1399:2:1654 -1400:2:1655 -1401:2:1663 -1402:2:1664 -1403:2:1668 -1404:2:1669 -1405:2:1677 -1406:2:1682 -1407:2:1686 -1408:2:1687 -1409:2:1694 -1410:2:1695 -1411:2:1706 -1412:2:1707 -1413:2:1708 -1414:2:1719 -1415:2:1724 -1416:2:1725 -1417:0:2654 -1418:2:1737 -1419:0:2654 -1420:2:1739 -1421:0:2654 -1422:2:1742 -1423:2:1743 -1424:2:1755 -1425:2:1756 -1426:2:1760 -1427:2:1761 -1428:2:1769 -1429:2:1774 -1430:2:1778 -1431:2:1779 -1432:2:1786 -1433:2:1787 -1434:2:1798 -1435:2:1799 -1436:2:1800 -1437:2:1811 -1438:2:1816 -1439:2:1817 -1440:0:2654 -1441:2:1829 -1442:0:2654 -1443:2:1831 -1444:0:2654 -1445:2:1832 -1446:0:2654 -1447:2:1833 -1448:0:2654 -1449:2:1834 -1450:0:2654 -1451:2:1835 -1452:2:1839 -1453:2:1840 -1454:2:1848 -1455:2:1849 -1456:2:1853 -1457:2:1854 -1458:2:1862 -1459:2:1867 -1460:2:1871 -1461:2:1872 -1462:2:1879 -1463:2:1880 -1464:2:1891 -1465:2:1892 -1466:2:1893 -1467:2:1904 -1468:2:1909 -1469:2:1910 -1470:0:2654 -1471:2:1922 -1472:0:2654 -1473:2:2203 -1474:0:2654 -1475:2:2301 -1476:0:2654 -1477:2:2302 -1478:0:2654 -1479:2:2306 -1480:0:2654 -1481:2:2312 -1482:2:2316 -1483:2:2317 -1484:2:2325 -1485:2:2326 -1486:2:2330 -1487:2:2331 -1488:2:2339 -1489:2:2344 -1490:2:2348 -1491:2:2349 -1492:2:2356 -1493:2:2357 -1494:2:2368 -1495:2:2369 -1496:2:2370 -1497:2:2381 -1498:2:2386 -1499:2:2387 -1500:0:2654 -1501:2:2402 -1502:0:2654 -1503:2:2403 -1504:2:2407 -1505:2:2408 -1506:2:2416 -1507:2:2417 -1508:2:2421 -1509:2:2422 -1510:2:2430 -1511:2:2435 -1512:2:2439 -1513:2:2440 -1514:2:2447 -1515:2:2448 -1516:2:2459 -1517:2:2460 -1518:2:2461 -1519:2:2472 -1520:2:2477 -1521:2:2478 -1522:0:2654 -1523:2:2493 -1524:0:2654 -1525:2:2498 -1526:2:2502 -1527:2:2503 -1528:2:2511 -1529:2:2512 -1530:2:2516 -1531:2:2517 -1532:2:2525 -1533:2:2530 -1534:2:2534 -1535:2:2535 -1536:2:2542 -1537:2:2543 -1538:2:2554 -1539:2:2555 -1540:2:2556 -1541:2:2567 -1542:2:2572 -1543:2:2573 -1544:0:2654 -1545:2:2588 -1546:0:2654 -1547:2:2590 -1548:0:2654 -1549:2:2591 -1550:0:2654 -1551:2:423 -1552:0:2654 -1553:2:424 -1554:2:428 -1555:2:429 -1556:2:437 -1557:2:438 -1558:2:442 -1559:2:443 -1560:2:451 -1561:2:456 -1562:2:460 -1563:2:461 -1564:2:468 -1565:2:469 -1566:2:480 -1567:2:481 -1568:2:482 -1569:2:493 -1570:2:498 -1571:2:499 -1572:0:2654 -1573:2:511 -1574:0:2654 -1575:2:513 -1576:2:514 -1577:0:2654 -1578:2:518 -1579:2:522 -1580:2:523 -1581:2:531 -1582:2:532 -1583:2:536 -1584:2:537 -1585:2:545 -1586:2:558 -1587:2:559 -1588:2:562 -1589:2:563 -1590:2:574 -1591:2:575 -1592:2:576 -1593:2:587 -1594:2:592 -1595:2:595 -1596:2:596 -1597:0:2654 -1598:2:605 -1599:0:2654 -1600:2:607 -1601:0:2654 -1602:2:608 -1603:0:2654 -1604:2:618 -1605:0:2654 -1606:2:619 -1607:2:623 -1608:2:624 -1609:2:632 -1610:2:633 -1611:2:637 -1612:2:638 -1613:2:646 -1614:2:659 -1615:2:660 -1616:2:663 -1617:2:664 -1618:2:675 -1619:2:676 -1620:2:677 -1621:2:688 -1622:2:693 -1623:2:696 -1624:2:697 -1625:0:2654 -1626:2:709 -1627:0:2654 -1628:2:710 -1629:2:714 -1630:2:715 -1631:2:723 -1632:2:724 -1633:2:728 -1634:2:729 -1635:2:737 -1636:2:750 -1637:2:751 -1638:2:754 -1639:2:755 -1640:2:766 -1641:2:767 -1642:2:768 -1643:2:779 -1644:2:784 -1645:2:787 -1646:2:788 -1647:0:2654 -1648:2:800 -1649:0:2654 -1650:2:805 -1651:2:809 -1652:2:810 -1653:2:818 -1654:2:819 -1655:2:823 -1656:2:824 -1657:2:832 -1658:2:845 -1659:2:846 -1660:2:849 -1661:2:850 -1662:2:861 -1663:2:862 -1664:2:863 -1665:2:874 -1666:2:879 -1667:2:882 -1668:2:883 -1669:0:2654 -1670:2:895 -1671:0:2654 -1672:2:897 -1673:0:2654 -1674:2:898 -1675:2:902 -1676:2:903 -1677:2:911 -1678:2:912 -1679:2:916 -1680:2:917 -1681:2:925 -1682:2:938 -1683:2:939 -1684:2:942 -1685:2:943 -1686:2:954 -1687:2:955 -1688:2:956 -1689:2:967 -1690:2:972 -1691:2:975 -1692:2:976 -1693:0:2654 -1694:2:985 -1695:0:2654 -1696:2:987 -1697:0:2654 -1698:2:990 -1699:2:991 -1700:2:1003 -1701:2:1004 -1702:2:1008 -1703:2:1009 -1704:2:1017 -1705:2:1030 -1706:2:1031 -1707:2:1034 -1708:2:1035 -1709:2:1046 -1710:2:1047 -1711:2:1048 -1712:2:1059 -1713:2:1064 -1714:2:1067 -1715:2:1068 -1716:0:2654 -1717:2:1077 -1718:0:2654 -1719:2:1079 -1720:0:2654 -1721:2:1080 -1722:0:2654 -1723:2:1081 -1724:0:2654 -1725:2:1082 -1726:0:2654 -1727:2:1083 -1728:2:1087 -1729:2:1088 -1730:2:1096 -1731:2:1097 -1732:2:1101 -1733:2:1102 -1734:2:1110 -1735:2:1123 -1736:2:1124 -1737:2:1127 -1738:2:1128 -1739:2:1139 -1740:2:1140 -1741:2:1141 -1742:2:1152 -1743:2:1157 -1744:2:1160 -1745:2:1161 -1746:0:2654 -1747:2:1170 -1748:0:2654 -1749:2:1451 -1750:0:2654 -1751:2:1549 -1752:0:2654 -1753:2:1550 -1754:0:2654 -1755:2:1554 -1756:0:2654 -1757:2:1560 -1758:2:1564 -1759:2:1565 -1760:2:1573 -1761:2:1574 -1762:2:1578 -1763:2:1579 -1764:2:1587 -1765:2:1600 -1766:2:1601 -1767:2:1604 -1768:2:1605 -1769:2:1616 -1770:2:1617 -1771:2:1618 -1772:2:1629 -1773:2:1634 -1774:2:1637 -1775:2:1638 -1776:0:2654 -1777:2:1647 -1778:0:2654 -1779:2:1649 -1780:0:2654 -1781:2:1650 -1782:2:1654 -1783:2:1655 -1784:2:1663 -1785:2:1664 -1786:2:1668 -1787:2:1669 -1788:2:1677 -1789:2:1690 -1790:2:1691 -1791:2:1694 -1792:2:1695 -1793:2:1706 -1794:2:1707 -1795:2:1708 -1796:2:1719 -1797:2:1724 -1798:2:1727 -1799:2:1728 -1800:0:2654 -1801:2:1737 -1802:0:2654 -1803:2:1739 -1804:0:2654 -1805:2:1742 -1806:2:1743 -1807:2:1755 -1808:2:1756 -1809:2:1760 -1810:2:1761 -1811:2:1769 -1812:2:1782 -1813:2:1783 -1814:2:1786 -1815:2:1787 -1816:2:1798 -1817:2:1799 -1818:2:1800 -1819:2:1811 -1820:2:1816 -1821:2:1819 -1822:2:1820 -1823:0:2654 -1824:2:1829 -1825:0:2654 -1826:2:1831 -1827:0:2654 -1828:2:1832 -1829:0:2654 -1830:2:1833 -1831:0:2654 -1832:2:1834 -1833:0:2654 -1834:2:1835 -1835:2:1839 -1836:2:1840 -1837:2:1848 -1838:2:1849 -1839:2:1853 -1840:2:1854 -1841:2:1862 -1842:2:1875 -1843:2:1876 -1844:2:1879 -1845:2:1880 -1846:2:1891 -1847:2:1892 -1848:2:1893 -1849:2:1904 -1850:2:1909 -1851:2:1912 -1852:2:1913 -1853:0:2654 -1854:2:1922 -1855:0:2654 -1856:2:2203 -1857:0:2654 -1858:2:2301 -1859:0:2654 -1860:2:2302 -1861:0:2654 -1862:2:2306 -1863:0:2654 -1864:2:2312 -1865:2:2316 -1866:2:2317 -1867:2:2325 -1868:2:2326 -1869:2:2330 -1870:2:2331 -1871:2:2339 -1872:2:2352 -1873:2:2353 -1874:2:2356 -1875:2:2357 -1876:2:2368 -1877:2:2369 -1878:2:2370 -1879:2:2381 -1880:2:2386 -1881:2:2389 -1882:2:2390 -1883:0:2654 -1884:2:2402 -1885:0:2654 -1886:2:2403 -1887:2:2407 -1888:2:2408 -1889:2:2416 -1890:2:2417 -1891:2:2421 -1892:2:2422 -1893:2:2430 -1894:2:2443 -1895:2:2444 -1896:2:2447 -1897:2:2448 -1898:2:2459 -1899:2:2460 -1900:2:2461 -1901:2:2472 -1902:2:2477 -1903:2:2480 -1904:2:2481 -1905:0:2654 -1906:2:2493 -1907:0:2654 -1908:2:2498 -1909:2:2502 -1910:2:2503 -1911:2:2511 -1912:2:2512 -1913:2:2516 -1914:2:2517 -1915:2:2525 -1916:2:2538 -1917:2:2539 -1918:2:2542 -1919:2:2543 -1920:2:2554 -1921:2:2555 -1922:2:2556 -1923:2:2567 -1924:2:2572 -1925:2:2575 -1926:2:2576 -1927:0:2654 -1928:2:2588 -1929:0:2654 -1930:2:2590 -1931:0:2654 -1932:2:2591 -1933:0:2654 -1934:2:2594 -1935:0:2654 -1936:2:2599 -1937:0:2654 -1938:1:2 -1939:0:2654 -1940:2:2600 -1941:0:2654 -1942:1:8 -1943:0:2654 -1944:2:2599 -1945:0:2654 -1946:1:9 -1947:0:2654 -1948:2:2600 -1949:0:2654 -1950:1:10 -1951:0:2654 -1952:2:2599 -1953:0:2654 -1954:1:11 -1955:0:2654 -1956:2:2600 -1957:0:2654 -1958:1:12 -1959:1:16 -1960:1:17 -1961:1:25 -1962:1:26 -1963:1:30 -1964:1:31 -1965:1:39 -1966:1:44 -1967:1:48 -1968:1:49 -1969:1:56 -1970:1:57 -1971:1:68 -1972:1:69 -1973:1:70 -1974:1:81 -1975:1:86 -1976:1:87 -1977:0:2654 -1978:2:2599 -1979:0:2654 -1980:1:99 -1981:0:2654 -1982:2:2600 -1983:0:2654 -1984:1:101 -1985:0:2654 -1986:2:2599 -1987:0:2654 -1988:1:102 -1989:1:106 -1990:1:107 -1991:1:115 -1992:1:116 -1993:1:120 -1994:1:121 -1995:1:129 -1996:1:134 -1997:1:138 -1998:1:139 -1999:1:146 -2000:1:147 -2001:1:158 -2002:1:159 -2003:1:160 -2004:1:171 -2005:1:176 -2006:1:177 -2007:0:2654 -2008:2:2600 -2009:0:2654 -2010:1:189 -2011:0:2654 -2012:2:2599 -2013:0:2654 -2014:1:191 -2015:0:2654 -2016:2:2600 -2017:0:2654 -2018:1:192 -2019:0:2654 -2020:2:2599 -2021:0:2654 -2022:1:193 -2023:1:197 -2024:1:198 -2025:1:206 -2026:1:207 -2027:1:211 -2028:1:212 -2029:1:220 -2030:1:225 -2031:1:229 -2032:1:230 -2033:1:237 -2034:1:238 -2035:1:249 -2036:1:250 -2037:1:251 -2038:1:262 -2039:1:267 -2040:1:268 -2041:0:2654 -2042:2:2600 -2043:0:2654 -2044:1:280 -2045:0:2654 -2046:2:2599 -2047:0:2654 -2048:1:282 -2049:0:2654 -2050:2:2600 -2051:0:2654 -2052:1:291 -2053:0:2654 -2054:2:2599 -2055:0:2654 -2056:1:293 -2057:0:2654 -2058:2:2600 -2059:0:2654 -2060:1:11 -2061:0:2654 -2062:2:2599 -2063:0:2654 -2064:1:12 -2065:1:16 -2066:1:17 -2067:1:25 -2068:1:26 -2069:1:27 -2070:1:39 -2071:1:44 -2072:1:48 -2073:1:49 -2074:1:56 -2075:1:57 -2076:1:68 -2077:1:69 -2078:1:70 -2079:1:81 -2080:1:86 -2081:1:87 -2082:0:2654 -2083:2:2600 -2084:0:2654 -2085:1:99 -2086:0:2654 -2087:2:2599 -2088:0:2654 -2089:1:101 -2090:0:2654 -2091:2:2600 -2092:0:2654 -2093:1:102 -2094:1:106 -2095:1:107 -2096:1:115 -2097:1:116 -2098:1:120 -2099:1:121 -2100:1:129 -2101:1:134 -2102:1:138 -2103:1:139 -2104:1:146 -2105:1:147 -2106:1:158 -2107:1:159 -2108:1:160 -2109:1:171 -2110:1:176 -2111:1:177 -2112:0:2654 -2113:2:2599 -2114:0:2654 -2115:1:189 -2116:0:2654 -2117:2:2600 -2118:0:2654 -2119:1:285 -2120:0:2654 -2121:2:2599 -2122:0:2654 -2123:1:286 -2124:0:2654 -2125:2:2600 -2126:0:2654 -2127:1:291 -2128:0:2654 -2129:2:2599 -2130:0:2654 -2131:1:293 -2132:0:2654 -2133:2:2600 -2134:0:2654 -2135:1:296 -2136:0:2654 -2137:2:2599 -2138:0:2654 -2139:1:301 -2140:0:2654 -2141:2:2600 -2142:0:2654 -2143:1:302 -2144:0:2652 -2145:2:2599 -2146:0:2658 -2147:2:779 diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_rmb.define b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_rmb.log b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_rmb.log deleted file mode 100644 index b7f3b80..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_rmb.log +++ /dev/null @@ -1,266 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_rmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -Depth= 5439 States= 1e+06 Transitions= 1.03e+07 Memory= 527.190 t= 8.16 R= 1e+05 -pan: claim violated! (at depth 1801) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 5439, errors: 1 - 1006552 states, stored - 9396280 states, matched - 10402832 transitions (= stored+matched) - 36844262 atomic steps -hash conflicts: 1832712 (resolved) - -Stats on memory usage (in Megabytes): - 80.634 equivalent memory usage for states (stored*(State-vector + overhead)) - 61.871 actual memory usage for states (compression: 76.73%) - state-vector as stored = 36 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 527.580 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 151, "(1)" - line 418, "pan.___", state 181, "(1)" - line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 242, "(1)" - line 418, "pan.___", state 272, "(1)" - line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 360, "(1)" - line 418, "pan.___", state 390, "(1)" - line 540, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 20, "(1)" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 34, "(1)" - line 403, "pan.___", state 35, "(1)" - line 403, "pan.___", state 35, "(1)" - line 401, "pan.___", state 40, "((i<1))" - line 401, "pan.___", state 40, "((i>=1))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 59, "(1)" - line 409, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 60, "else" - line 409, "pan.___", state 63, "(1)" - line 409, "pan.___", state 64, "(1)" - line 409, "pan.___", state 64, "(1)" - line 413, "pan.___", state 72, "(1)" - line 413, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 73, "else" - line 413, "pan.___", state 76, "(1)" - line 413, "pan.___", state 77, "(1)" - line 413, "pan.___", state 77, "(1)" - line 411, "pan.___", state 82, "((i<1))" - line 411, "pan.___", state 82, "((i>=1))" - line 418, "pan.___", state 89, "(1)" - line 418, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 90, "else" - line 418, "pan.___", state 93, "(1)" - line 418, "pan.___", state 94, "(1)" - line 418, "pan.___", state 94, "(1)" - line 420, "pan.___", state 97, "(1)" - line 420, "pan.___", state 97, "(1)" - line 369, "pan.___", state 99, "(1)" - line 639, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" - line 637, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 114, "(1)" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 128, "(1)" - line 403, "pan.___", state 129, "(1)" - line 403, "pan.___", state 129, "(1)" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 420, "pan.___", state 191, "(1)" - line 420, "pan.___", state 191, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 175, "pan.___", state 243, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 746, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 759, "(1)" - line 409, "pan.___", state 760, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 760, "else" - line 409, "pan.___", state 763, "(1)" - line 409, "pan.___", state 764, "(1)" - line 409, "pan.___", state 764, "(1)" - line 413, "pan.___", state 772, "(1)" - line 413, "pan.___", state 773, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 773, "else" - line 413, "pan.___", state 776, "(1)" - line 413, "pan.___", state 777, "(1)" - line 413, "pan.___", state 777, "(1)" - line 411, "pan.___", state 782, "((i<1))" - line 411, "pan.___", state 782, "((i>=1))" - line 418, "pan.___", state 789, "(1)" - line 418, "pan.___", state 790, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 790, "else" - line 418, "pan.___", state 793, "(1)" - line 418, "pan.___", state 794, "(1)" - line 418, "pan.___", state 794, "(1)" - line 420, "pan.___", state 797, "(1)" - line 420, "pan.___", state 797, "(1)" - line 403, "pan.___", state 828, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 846, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 872, "(1)" - line 418, "pan.___", state 889, "(1)" - line 403, "pan.___", state 918, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 936, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 962, "(1)" - line 418, "pan.___", state 979, "(1)" - line 399, "pan.___", state 998, "(1)" - line 403, "pan.___", state 1010, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1028, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1054, "(1)" - line 418, "pan.___", state 1071, "(1)" - line 403, "pan.___", state 1103, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1121, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1147, "(1)" - line 418, "pan.___", state 1164, "(1)" - line 179, "pan.___", state 1187, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1200, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 175, "pan.___", state 1213, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 1330, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1343, "(1)" - line 409, "pan.___", state 1344, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 1344, "else" - line 409, "pan.___", state 1347, "(1)" - line 409, "pan.___", state 1348, "(1)" - line 409, "pan.___", state 1348, "(1)" - line 413, "pan.___", state 1356, "(1)" - line 413, "pan.___", state 1357, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 1357, "else" - line 413, "pan.___", state 1360, "(1)" - line 413, "pan.___", state 1361, "(1)" - line 413, "pan.___", state 1361, "(1)" - line 411, "pan.___", state 1366, "((i<1))" - line 411, "pan.___", state 1366, "((i>=1))" - line 418, "pan.___", state 1373, "(1)" - line 418, "pan.___", state 1374, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 1374, "else" - line 418, "pan.___", state 1377, "(1)" - line 418, "pan.___", state 1378, "(1)" - line 418, "pan.___", state 1378, "(1)" - line 420, "pan.___", state 1381, "(1)" - line 420, "pan.___", state 1381, "(1)" - line 179, "pan.___", state 1406, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1419, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 175, "pan.___", state 1432, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=2))" - line 710, "pan.___", state 20, "((j<2))" - line 710, "pan.___", state 20, "((j>=2))" - line 715, "pan.___", state 33, "((j<2))" - line 715, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 749, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 8.24 seconds -pan: rate 122154.37 states/second -pan: avg transition delay 7.9209e-07 usec -cp .input.spin urcu_free_no_rmb.spin.input -cp .input.spin.trail urcu_free_no_rmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_rmb.spin.input b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_rmb.spin.input deleted file mode 100644 index 6dea6e1..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_rmb.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define NO_RMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -//#define READER_NEST_LEVEL 1 -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_rmb.spin.input.trail b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_rmb.spin.input.trail deleted file mode 100644 index 071a19e..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_rmb.spin.input.trail +++ /dev/null @@ -1,1804 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:1982 -2:3:1934 -3:3:1937 -4:3:1937 -5:3:1940 -6:3:1948 -7:3:1948 -8:3:1951 -9:3:1957 -10:3:1961 -11:3:1961 -12:3:1964 -13:3:1972 -14:3:1976 -15:3:1977 -16:0:1982 -17:3:1979 -18:0:1982 -19:2:416 -20:0:1982 -21:2:422 -22:0:1982 -23:2:423 -24:0:1982 -25:2:424 -26:2:428 -27:2:429 -28:2:437 -29:2:438 -30:2:442 -31:2:443 -32:2:451 -33:2:456 -34:2:460 -35:2:461 -36:2:468 -37:2:469 -38:2:480 -39:2:481 -40:2:482 -41:2:493 -42:2:498 -43:2:499 -44:0:1982 -45:2:511 -46:0:1982 -47:2:513 -48:2:514 -49:0:1982 -50:2:518 -51:2:522 -52:2:523 -53:2:531 -54:2:532 -55:2:536 -56:2:537 -57:2:545 -58:2:550 -59:2:551 -60:2:562 -61:2:563 -62:2:574 -63:2:575 -64:2:576 -65:2:587 -66:2:592 -67:2:593 -68:0:1982 -69:2:605 -70:0:1982 -71:2:607 -72:0:1982 -73:2:608 -74:0:1982 -75:2:618 -76:0:1982 -77:2:622 -78:2:623 -79:2:627 -80:2:631 -81:2:632 -82:2:636 -83:2:644 -84:2:645 -85:0:1982 -86:2:653 -87:0:1982 -88:2:657 -89:2:658 -90:2:662 -91:2:666 -92:2:667 -93:2:671 -94:2:679 -95:2:680 -96:0:1982 -97:2:688 -98:0:1982 -99:2:696 -100:2:697 -101:2:701 -102:2:705 -103:2:706 -104:2:710 -105:2:718 -106:2:719 -107:0:1982 -108:2:727 -109:0:1982 -110:2:729 -111:0:1982 -112:2:730 -113:2:734 -114:2:735 -115:2:743 -116:2:744 -117:2:748 -118:2:749 -119:2:757 -120:2:762 -121:2:766 -122:2:767 -123:2:774 -124:2:775 -125:2:786 -126:2:787 -127:2:788 -128:2:799 -129:2:804 -130:2:805 -131:0:1982 -132:2:817 -133:0:1982 -134:2:819 -135:0:1982 -136:2:822 -137:2:823 -138:2:835 -139:2:836 -140:2:840 -141:2:841 -142:2:849 -143:2:854 -144:2:858 -145:2:859 -146:2:866 -147:2:867 -148:2:878 -149:2:879 -150:2:880 -151:2:891 -152:2:896 -153:2:897 -154:0:1982 -155:2:909 -156:0:1982 -157:2:911 -158:0:1982 -159:2:912 -160:0:1982 -161:2:913 -162:0:1982 -163:2:914 -164:0:1982 -165:2:915 -166:2:919 -167:2:920 -168:2:928 -169:2:929 -170:2:933 -171:2:934 -172:2:942 -173:2:947 -174:2:951 -175:2:952 -176:2:959 -177:2:960 -178:2:971 -179:2:972 -180:2:973 -181:2:984 -182:2:989 -183:2:990 -184:0:1982 -185:2:1002 -186:0:1982 -187:2:1115 -188:0:1982 -189:2:1213 -190:0:1982 -191:2:1214 -192:0:1982 -193:2:1218 -194:0:1982 -195:2:1224 -196:2:1228 -197:2:1229 -198:2:1237 -199:2:1238 -200:2:1242 -201:2:1243 -202:2:1251 -203:2:1256 -204:2:1260 -205:2:1261 -206:2:1268 -207:2:1269 -208:2:1280 -209:2:1281 -210:2:1282 -211:2:1293 -212:2:1298 -213:2:1299 -214:0:1982 -215:2:1311 -216:0:1982 -217:2:1313 -218:0:1982 -219:2:1314 -220:2:1318 -221:2:1319 -222:2:1327 -223:2:1328 -224:2:1332 -225:2:1333 -226:2:1341 -227:2:1346 -228:2:1350 -229:2:1351 -230:2:1358 -231:2:1359 -232:2:1370 -233:2:1371 -234:2:1372 -235:2:1383 -236:2:1388 -237:2:1389 -238:0:1982 -239:2:1401 -240:0:1982 -241:2:1403 -242:0:1982 -243:2:1406 -244:2:1407 -245:2:1419 -246:2:1420 -247:2:1424 -248:2:1425 -249:2:1433 -250:2:1438 -251:2:1442 -252:2:1443 -253:2:1450 -254:2:1451 -255:2:1462 -256:2:1463 -257:2:1464 -258:2:1475 -259:2:1480 -260:2:1481 -261:0:1982 -262:2:1493 -263:0:1982 -264:2:1495 -265:0:1982 -266:2:1496 -267:0:1982 -268:2:1497 -269:0:1982 -270:2:1498 -271:0:1982 -272:2:1499 -273:2:1503 -274:2:1504 -275:2:1512 -276:2:1513 -277:2:1517 -278:2:1518 -279:2:1526 -280:2:1531 -281:2:1535 -282:2:1536 -283:2:1543 -284:2:1544 -285:2:1555 -286:2:1556 -287:2:1557 -288:2:1568 -289:2:1573 -290:2:1574 -291:0:1982 -292:2:1586 -293:0:1982 -294:2:1699 -295:0:1982 -296:2:1797 -297:0:1982 -298:2:1798 -299:0:1982 -300:2:1802 -301:0:1982 -302:2:1811 -303:2:1812 -304:2:1816 -305:2:1820 -306:2:1821 -307:2:1825 -308:2:1833 -309:2:1834 -310:0:1982 -311:2:1842 -312:0:1982 -313:2:1846 -314:2:1847 -315:2:1851 -316:2:1855 -317:2:1856 -318:2:1860 -319:2:1868 -320:2:1869 -321:0:1982 -322:2:1877 -323:0:1982 -324:2:1885 -325:2:1886 -326:2:1890 -327:2:1894 -328:2:1895 -329:2:1899 -330:2:1907 -331:2:1908 -332:0:1982 -333:2:1916 -334:0:1982 -335:2:1918 -336:0:1982 -337:2:1919 -338:0:1982 -339:2:423 -340:0:1982 -341:2:424 -342:2:428 -343:2:429 -344:2:437 -345:2:438 -346:2:442 -347:2:443 -348:2:451 -349:2:456 -350:2:460 -351:2:461 -352:2:468 -353:2:469 -354:2:480 -355:2:481 -356:2:482 -357:2:493 -358:2:498 -359:2:499 -360:0:1982 -361:2:511 -362:0:1982 -363:2:513 -364:2:514 -365:0:1982 -366:2:518 -367:2:522 -368:2:523 -369:2:531 -370:2:532 -371:2:536 -372:2:537 -373:2:545 -374:2:550 -375:2:551 -376:2:562 -377:2:563 -378:2:574 -379:2:575 -380:2:576 -381:2:587 -382:2:592 -383:2:593 -384:0:1982 -385:2:605 -386:0:1982 -387:2:607 -388:0:1982 -389:2:608 -390:0:1982 -391:2:618 -392:0:1982 -393:2:622 -394:2:623 -395:2:627 -396:2:631 -397:2:632 -398:2:636 -399:2:644 -400:2:645 -401:0:1982 -402:2:653 -403:0:1982 -404:2:657 -405:2:658 -406:2:662 -407:2:666 -408:2:667 -409:2:671 -410:2:679 -411:2:680 -412:0:1982 -413:2:688 -414:0:1982 -415:2:696 -416:2:697 -417:2:701 -418:2:705 -419:2:706 -420:2:710 -421:2:718 -422:2:719 -423:0:1982 -424:2:727 -425:0:1982 -426:2:729 -427:0:1982 -428:2:730 -429:2:734 -430:2:735 -431:2:743 -432:2:744 -433:2:748 -434:2:749 -435:2:757 -436:2:762 -437:2:766 -438:2:767 -439:2:774 -440:2:775 -441:2:786 -442:2:787 -443:2:788 -444:2:799 -445:2:804 -446:2:805 -447:0:1982 -448:2:817 -449:0:1982 -450:2:819 -451:0:1982 -452:2:822 -453:2:823 -454:2:835 -455:2:836 -456:2:840 -457:2:841 -458:2:849 -459:2:854 -460:2:858 -461:2:859 -462:2:866 -463:2:867 -464:2:878 -465:2:879 -466:2:880 -467:2:891 -468:2:896 -469:2:897 -470:0:1982 -471:2:909 -472:0:1982 -473:2:911 -474:0:1982 -475:2:912 -476:0:1982 -477:2:913 -478:0:1982 -479:2:914 -480:0:1982 -481:2:915 -482:2:919 -483:2:920 -484:2:928 -485:2:929 -486:2:933 -487:2:934 -488:2:942 -489:2:947 -490:2:951 -491:2:952 -492:2:959 -493:2:960 -494:2:971 -495:2:972 -496:2:973 -497:2:984 -498:2:989 -499:2:990 -500:0:1982 -501:2:1002 -502:0:1982 -503:2:1115 -504:0:1982 -505:2:1213 -506:0:1982 -507:2:1214 -508:0:1982 -509:2:1218 -510:0:1982 -511:2:1224 -512:2:1228 -513:2:1229 -514:2:1237 -515:2:1238 -516:2:1242 -517:2:1243 -518:2:1251 -519:2:1256 -520:2:1260 -521:2:1261 -522:2:1268 -523:2:1269 -524:2:1280 -525:2:1281 -526:2:1282 -527:2:1293 -528:2:1298 -529:2:1299 -530:0:1982 -531:2:1311 -532:0:1982 -533:2:1313 -534:0:1982 -535:2:1314 -536:2:1318 -537:2:1319 -538:2:1327 -539:2:1328 -540:2:1332 -541:2:1333 -542:2:1341 -543:2:1346 -544:2:1350 -545:2:1351 -546:2:1358 -547:2:1359 -548:2:1370 -549:2:1371 -550:2:1372 -551:2:1383 -552:2:1388 -553:2:1389 -554:0:1982 -555:2:1401 -556:0:1982 -557:2:1403 -558:0:1982 -559:2:1406 -560:2:1407 -561:2:1419 -562:2:1420 -563:2:1424 -564:2:1425 -565:2:1433 -566:2:1438 -567:2:1442 -568:2:1443 -569:2:1450 -570:2:1451 -571:2:1462 -572:2:1463 -573:2:1464 -574:2:1475 -575:2:1480 -576:2:1481 -577:0:1982 -578:2:1493 -579:0:1982 -580:2:1495 -581:0:1982 -582:2:1496 -583:0:1982 -584:2:1497 -585:0:1982 -586:2:1498 -587:0:1982 -588:2:1499 -589:2:1503 -590:2:1504 -591:2:1512 -592:2:1513 -593:2:1517 -594:2:1518 -595:2:1526 -596:2:1531 -597:2:1535 -598:2:1536 -599:2:1543 -600:2:1544 -601:2:1555 -602:2:1556 -603:2:1557 -604:2:1568 -605:2:1573 -606:2:1574 -607:0:1982 -608:2:1586 -609:0:1982 -610:2:1699 -611:0:1982 -612:2:1797 -613:0:1982 -614:2:1798 -615:0:1982 -616:2:1802 -617:0:1982 -618:2:1811 -619:2:1812 -620:2:1816 -621:2:1820 -622:2:1821 -623:2:1825 -624:2:1833 -625:2:1834 -626:0:1982 -627:2:1842 -628:0:1982 -629:2:1846 -630:2:1847 -631:2:1851 -632:2:1855 -633:2:1856 -634:2:1860 -635:2:1868 -636:2:1869 -637:0:1982 -638:2:1877 -639:0:1982 -640:2:1885 -641:2:1886 -642:2:1890 -643:2:1894 -644:2:1895 -645:2:1899 -646:2:1907 -647:2:1908 -648:0:1982 -649:2:1916 -650:0:1982 -651:2:1918 -652:0:1982 -653:2:1919 -654:0:1982 -655:2:423 -656:0:1982 -657:2:424 -658:2:428 -659:2:429 -660:2:437 -661:2:438 -662:2:442 -663:2:443 -664:2:451 -665:2:456 -666:2:460 -667:2:461 -668:2:468 -669:2:469 -670:2:480 -671:2:481 -672:2:482 -673:2:493 -674:2:498 -675:2:499 -676:0:1982 -677:2:511 -678:0:1982 -679:2:513 -680:2:514 -681:0:1982 -682:2:518 -683:2:522 -684:2:523 -685:2:531 -686:2:532 -687:2:536 -688:2:537 -689:2:545 -690:2:550 -691:2:551 -692:2:562 -693:2:563 -694:2:574 -695:2:575 -696:2:576 -697:2:587 -698:2:592 -699:2:593 -700:0:1982 -701:2:605 -702:0:1982 -703:2:607 -704:0:1982 -705:2:608 -706:0:1982 -707:2:618 -708:0:1982 -709:2:622 -710:2:623 -711:2:627 -712:2:631 -713:2:632 -714:2:636 -715:2:644 -716:2:645 -717:0:1982 -718:2:653 -719:0:1982 -720:2:657 -721:2:658 -722:2:662 -723:2:666 -724:2:667 -725:2:671 -726:2:679 -727:2:680 -728:0:1982 -729:2:688 -730:0:1982 -731:2:696 -732:2:697 -733:2:701 -734:2:705 -735:2:706 -736:2:710 -737:2:718 -738:2:719 -739:0:1982 -740:2:727 -741:0:1982 -742:2:729 -743:0:1982 -744:2:730 -745:2:734 -746:2:735 -747:2:743 -748:2:744 -749:2:748 -750:2:749 -751:2:757 -752:2:762 -753:2:766 -754:2:767 -755:2:774 -756:2:775 -757:2:786 -758:2:787 -759:2:788 -760:2:799 -761:2:804 -762:2:805 -763:0:1982 -764:2:817 -765:0:1982 -766:2:819 -767:0:1982 -768:2:822 -769:2:823 -770:2:835 -771:2:836 -772:2:840 -773:2:841 -774:2:849 -775:2:854 -776:2:858 -777:2:859 -778:2:866 -779:2:867 -780:2:878 -781:2:879 -782:2:880 -783:2:891 -784:2:896 -785:2:897 -786:0:1982 -787:2:909 -788:0:1982 -789:2:911 -790:0:1982 -791:2:912 -792:0:1982 -793:2:913 -794:0:1982 -795:2:914 -796:0:1982 -797:2:915 -798:2:919 -799:2:920 -800:2:928 -801:2:929 -802:2:933 -803:2:934 -804:2:942 -805:2:947 -806:2:951 -807:2:952 -808:2:959 -809:2:960 -810:2:971 -811:2:972 -812:2:973 -813:2:984 -814:2:989 -815:2:990 -816:0:1982 -817:2:1002 -818:0:1982 -819:2:1115 -820:0:1982 -821:2:1213 -822:0:1982 -823:2:1214 -824:0:1982 -825:2:1218 -826:0:1982 -827:2:1224 -828:2:1228 -829:2:1229 -830:2:1237 -831:2:1238 -832:2:1242 -833:2:1243 -834:2:1251 -835:2:1256 -836:2:1260 -837:2:1261 -838:2:1268 -839:2:1269 -840:2:1280 -841:2:1281 -842:2:1282 -843:2:1293 -844:2:1298 -845:2:1299 -846:0:1982 -847:2:1311 -848:0:1982 -849:2:1313 -850:0:1982 -851:2:1314 -852:2:1318 -853:2:1319 -854:2:1327 -855:2:1328 -856:2:1332 -857:2:1333 -858:2:1341 -859:2:1346 -860:2:1350 -861:2:1351 -862:2:1358 -863:2:1359 -864:2:1370 -865:2:1371 -866:2:1372 -867:2:1383 -868:2:1388 -869:2:1389 -870:0:1982 -871:2:1401 -872:0:1982 -873:2:1403 -874:0:1982 -875:2:1406 -876:2:1407 -877:2:1419 -878:2:1420 -879:2:1424 -880:2:1425 -881:2:1433 -882:2:1438 -883:2:1442 -884:2:1443 -885:2:1450 -886:2:1451 -887:2:1462 -888:2:1463 -889:2:1464 -890:2:1475 -891:2:1480 -892:2:1481 -893:0:1982 -894:2:1493 -895:0:1982 -896:2:1495 -897:0:1982 -898:2:1496 -899:0:1982 -900:2:1497 -901:0:1982 -902:2:1498 -903:0:1982 -904:2:1499 -905:2:1503 -906:2:1504 -907:2:1512 -908:2:1513 -909:2:1517 -910:2:1518 -911:2:1526 -912:2:1531 -913:2:1535 -914:2:1536 -915:2:1543 -916:2:1544 -917:2:1555 -918:2:1556 -919:2:1557 -920:2:1568 -921:2:1573 -922:2:1574 -923:0:1982 -924:2:1586 -925:0:1982 -926:2:1699 -927:0:1982 -928:2:1797 -929:0:1982 -930:2:1798 -931:0:1982 -932:2:1802 -933:0:1982 -934:2:1811 -935:2:1812 -936:2:1816 -937:2:1820 -938:2:1821 -939:2:1825 -940:2:1833 -941:2:1834 -942:0:1982 -943:2:1842 -944:0:1982 -945:2:1846 -946:2:1847 -947:2:1851 -948:2:1855 -949:2:1856 -950:2:1860 -951:2:1868 -952:2:1869 -953:0:1982 -954:2:1877 -955:0:1982 -956:2:1885 -957:2:1886 -958:2:1890 -959:2:1894 -960:2:1895 -961:2:1899 -962:2:1907 -963:2:1908 -964:0:1982 -965:2:1916 -966:0:1982 -967:2:1918 -968:0:1982 -969:2:1919 -970:0:1982 -971:2:423 -972:0:1982 -973:2:424 -974:2:428 -975:2:429 -976:2:437 -977:2:438 -978:2:442 -979:2:443 -980:2:451 -981:2:456 -982:2:460 -983:2:461 -984:2:468 -985:2:469 -986:2:480 -987:2:481 -988:2:482 -989:2:493 -990:2:498 -991:2:499 -992:0:1982 -993:2:511 -994:0:1982 -995:2:513 -996:2:514 -997:0:1982 -998:2:518 -999:2:522 -1000:2:523 -1001:2:531 -1002:2:532 -1003:2:536 -1004:2:537 -1005:2:545 -1006:2:550 -1007:2:551 -1008:2:562 -1009:2:563 -1010:2:574 -1011:2:575 -1012:2:576 -1013:2:587 -1014:2:592 -1015:2:593 -1016:0:1982 -1017:2:605 -1018:0:1982 -1019:2:607 -1020:0:1982 -1021:2:608 -1022:0:1982 -1023:2:618 -1024:0:1982 -1025:2:622 -1026:2:623 -1027:2:627 -1028:2:631 -1029:2:632 -1030:2:636 -1031:2:644 -1032:2:645 -1033:0:1982 -1034:2:653 -1035:0:1982 -1036:2:657 -1037:2:658 -1038:2:662 -1039:2:666 -1040:2:667 -1041:2:671 -1042:2:679 -1043:2:680 -1044:0:1982 -1045:2:688 -1046:0:1982 -1047:2:696 -1048:2:697 -1049:2:701 -1050:2:705 -1051:2:706 -1052:2:710 -1053:2:718 -1054:2:719 -1055:0:1982 -1056:2:727 -1057:0:1982 -1058:2:729 -1059:0:1982 -1060:2:730 -1061:2:734 -1062:2:735 -1063:2:743 -1064:2:744 -1065:2:748 -1066:2:749 -1067:2:757 -1068:2:762 -1069:2:766 -1070:2:767 -1071:2:774 -1072:2:775 -1073:2:786 -1074:2:787 -1075:2:788 -1076:2:799 -1077:2:804 -1078:2:805 -1079:0:1982 -1080:2:817 -1081:0:1982 -1082:2:819 -1083:0:1982 -1084:2:822 -1085:2:823 -1086:2:835 -1087:2:836 -1088:2:840 -1089:2:841 -1090:2:849 -1091:2:854 -1092:2:858 -1093:2:859 -1094:2:866 -1095:2:867 -1096:2:878 -1097:2:879 -1098:2:880 -1099:2:891 -1100:2:896 -1101:2:897 -1102:0:1982 -1103:2:909 -1104:0:1982 -1105:2:911 -1106:0:1982 -1107:2:912 -1108:0:1982 -1109:2:913 -1110:0:1982 -1111:2:914 -1112:0:1982 -1113:2:915 -1114:2:919 -1115:2:920 -1116:2:928 -1117:2:929 -1118:2:933 -1119:2:934 -1120:2:942 -1121:2:947 -1122:2:951 -1123:2:952 -1124:2:959 -1125:2:960 -1126:2:971 -1127:2:972 -1128:2:973 -1129:2:984 -1130:2:989 -1131:2:990 -1132:0:1982 -1133:2:1002 -1134:0:1982 -1135:2:1115 -1136:0:1982 -1137:2:1213 -1138:0:1982 -1139:2:1214 -1140:0:1982 -1141:2:1218 -1142:0:1982 -1143:2:1224 -1144:2:1228 -1145:2:1229 -1146:2:1237 -1147:2:1238 -1148:2:1242 -1149:2:1243 -1150:2:1251 -1151:2:1256 -1152:2:1260 -1153:2:1261 -1154:2:1268 -1155:2:1269 -1156:2:1280 -1157:2:1281 -1158:2:1282 -1159:2:1293 -1160:2:1298 -1161:2:1299 -1162:0:1982 -1163:2:1311 -1164:0:1982 -1165:2:1313 -1166:0:1982 -1167:2:1314 -1168:2:1318 -1169:2:1319 -1170:2:1327 -1171:2:1328 -1172:2:1332 -1173:2:1333 -1174:2:1341 -1175:2:1346 -1176:2:1350 -1177:2:1351 -1178:2:1358 -1179:2:1359 -1180:2:1370 -1181:2:1371 -1182:2:1372 -1183:2:1383 -1184:2:1388 -1185:2:1389 -1186:0:1982 -1187:2:1401 -1188:0:1982 -1189:2:1403 -1190:0:1982 -1191:2:1406 -1192:2:1407 -1193:2:1419 -1194:2:1420 -1195:2:1424 -1196:2:1425 -1197:2:1433 -1198:2:1438 -1199:2:1442 -1200:2:1443 -1201:2:1450 -1202:2:1451 -1203:2:1462 -1204:2:1463 -1205:2:1464 -1206:2:1475 -1207:2:1480 -1208:2:1481 -1209:0:1982 -1210:2:1493 -1211:0:1982 -1212:2:1495 -1213:0:1982 -1214:2:1496 -1215:0:1982 -1216:2:1497 -1217:0:1982 -1218:2:1498 -1219:0:1982 -1220:2:1499 -1221:2:1503 -1222:2:1504 -1223:2:1512 -1224:2:1513 -1225:2:1517 -1226:2:1518 -1227:2:1526 -1228:2:1531 -1229:2:1535 -1230:2:1536 -1231:2:1543 -1232:2:1544 -1233:2:1555 -1234:2:1556 -1235:2:1557 -1236:2:1568 -1237:2:1573 -1238:2:1574 -1239:0:1982 -1240:2:1586 -1241:0:1982 -1242:2:1699 -1243:0:1982 -1244:2:1797 -1245:0:1982 -1246:2:1798 -1247:0:1982 -1248:2:1802 -1249:0:1982 -1250:2:1811 -1251:2:1812 -1252:2:1816 -1253:2:1820 -1254:2:1821 -1255:2:1825 -1256:2:1833 -1257:2:1834 -1258:0:1982 -1259:2:1842 -1260:0:1982 -1261:2:1846 -1262:2:1847 -1263:2:1851 -1264:2:1855 -1265:2:1856 -1266:2:1860 -1267:2:1868 -1268:2:1869 -1269:0:1982 -1270:2:1877 -1271:0:1982 -1272:2:1885 -1273:2:1886 -1274:2:1890 -1275:2:1894 -1276:2:1895 -1277:2:1899 -1278:2:1907 -1279:2:1908 -1280:0:1982 -1281:2:1916 -1282:0:1982 -1283:2:1918 -1284:0:1982 -1285:2:1919 -1286:0:1982 -1287:2:423 -1288:0:1982 -1289:2:424 -1290:2:428 -1291:2:429 -1292:2:437 -1293:2:438 -1294:2:442 -1295:2:443 -1296:2:451 -1297:2:456 -1298:2:460 -1299:2:461 -1300:2:468 -1301:2:469 -1302:2:480 -1303:2:481 -1304:2:482 -1305:2:493 -1306:2:498 -1307:2:499 -1308:0:1982 -1309:2:511 -1310:0:1982 -1311:2:513 -1312:2:514 -1313:0:1982 -1314:2:518 -1315:2:522 -1316:2:523 -1317:2:531 -1318:2:532 -1319:2:536 -1320:2:537 -1321:2:545 -1322:2:558 -1323:2:559 -1324:2:562 -1325:2:563 -1326:2:574 -1327:2:575 -1328:2:576 -1329:2:587 -1330:2:592 -1331:2:595 -1332:2:596 -1333:0:1982 -1334:2:605 -1335:0:1982 -1336:2:607 -1337:0:1982 -1338:2:608 -1339:0:1982 -1340:2:618 -1341:0:1982 -1342:1:2 -1343:0:1982 -1344:1:8 -1345:0:1982 -1346:1:9 -1347:0:1982 -1348:1:10 -1349:0:1982 -1350:1:11 -1351:0:1982 -1352:1:12 -1353:1:16 -1354:1:17 -1355:1:25 -1356:1:26 -1357:1:30 -1358:1:31 -1359:1:39 -1360:1:44 -1361:1:48 -1362:1:49 -1363:1:56 -1364:1:57 -1365:1:68 -1366:1:69 -1367:1:70 -1368:1:81 -1369:1:86 -1370:1:87 -1371:0:1982 -1372:1:99 -1373:0:1982 -1374:2:622 -1375:2:623 -1376:2:627 -1377:2:631 -1378:2:632 -1379:2:636 -1380:2:641 -1381:0:1982 -1382:2:653 -1383:0:1982 -1384:2:657 -1385:2:658 -1386:2:662 -1387:2:666 -1388:2:667 -1389:2:671 -1390:2:679 -1391:2:680 -1392:0:1982 -1393:2:688 -1394:0:1982 -1395:2:696 -1396:2:697 -1397:2:701 -1398:2:705 -1399:2:706 -1400:2:710 -1401:2:718 -1402:2:719 -1403:0:1982 -1404:2:727 -1405:0:1982 -1406:2:729 -1407:0:1982 -1408:2:730 -1409:2:734 -1410:2:735 -1411:2:743 -1412:2:744 -1413:2:748 -1414:2:749 -1415:2:757 -1416:2:762 -1417:2:766 -1418:2:767 -1419:2:774 -1420:2:775 -1421:2:786 -1422:2:787 -1423:2:788 -1424:2:799 -1425:2:804 -1426:2:805 -1427:0:1982 -1428:2:817 -1429:0:1982 -1430:2:819 -1431:0:1982 -1432:2:822 -1433:2:823 -1434:2:835 -1435:2:836 -1436:2:840 -1437:2:841 -1438:2:849 -1439:2:854 -1440:2:858 -1441:2:859 -1442:2:866 -1443:2:867 -1444:2:878 -1445:2:879 -1446:2:880 -1447:2:891 -1448:2:896 -1449:2:897 -1450:0:1982 -1451:2:909 -1452:0:1982 -1453:2:911 -1454:0:1982 -1455:2:912 -1456:0:1982 -1457:2:913 -1458:0:1982 -1459:2:914 -1460:0:1982 -1461:2:915 -1462:2:919 -1463:2:920 -1464:2:928 -1465:2:929 -1466:2:933 -1467:2:934 -1468:2:942 -1469:2:947 -1470:2:951 -1471:2:952 -1472:2:959 -1473:2:960 -1474:2:971 -1475:2:972 -1476:2:973 -1477:2:984 -1478:2:989 -1479:2:990 -1480:0:1982 -1481:2:1002 -1482:0:1982 -1483:2:1115 -1484:0:1982 -1485:2:1213 -1486:0:1982 -1487:2:1214 -1488:0:1982 -1489:2:1218 -1490:0:1982 -1491:2:1224 -1492:2:1228 -1493:2:1229 -1494:2:1237 -1495:2:1238 -1496:2:1242 -1497:2:1243 -1498:2:1251 -1499:2:1256 -1500:2:1260 -1501:2:1261 -1502:2:1268 -1503:2:1269 -1504:2:1280 -1505:2:1281 -1506:2:1282 -1507:2:1293 -1508:2:1298 -1509:2:1299 -1510:0:1982 -1511:2:1311 -1512:0:1982 -1513:2:1313 -1514:0:1982 -1515:2:1314 -1516:2:1318 -1517:2:1319 -1518:2:1327 -1519:2:1328 -1520:2:1332 -1521:2:1333 -1522:2:1341 -1523:2:1346 -1524:2:1350 -1525:2:1351 -1526:2:1358 -1527:2:1359 -1528:2:1370 -1529:2:1371 -1530:2:1372 -1531:2:1383 -1532:2:1388 -1533:2:1389 -1534:0:1982 -1535:2:1401 -1536:0:1982 -1537:2:1403 -1538:0:1982 -1539:2:1406 -1540:2:1407 -1541:2:1419 -1542:2:1420 -1543:2:1424 -1544:2:1425 -1545:2:1433 -1546:2:1438 -1547:2:1442 -1548:2:1443 -1549:2:1450 -1550:2:1451 -1551:2:1462 -1552:2:1463 -1553:2:1464 -1554:2:1475 -1555:2:1480 -1556:2:1481 -1557:0:1982 -1558:2:1493 -1559:0:1982 -1560:2:1495 -1561:0:1982 -1562:2:1496 -1563:0:1982 -1564:2:1497 -1565:0:1982 -1566:2:1498 -1567:0:1982 -1568:2:1499 -1569:2:1503 -1570:2:1504 -1571:2:1512 -1572:2:1513 -1573:2:1517 -1574:2:1518 -1575:2:1526 -1576:2:1531 -1577:2:1535 -1578:2:1536 -1579:2:1543 -1580:2:1544 -1581:2:1555 -1582:2:1556 -1583:2:1557 -1584:2:1568 -1585:2:1573 -1586:2:1574 -1587:0:1982 -1588:2:1586 -1589:0:1982 -1590:2:1699 -1591:0:1982 -1592:2:1797 -1593:0:1982 -1594:2:1798 -1595:0:1982 -1596:2:1802 -1597:0:1982 -1598:2:1811 -1599:2:1812 -1600:2:1816 -1601:2:1820 -1602:2:1821 -1603:2:1825 -1604:2:1833 -1605:2:1834 -1606:0:1982 -1607:2:1842 -1608:0:1982 -1609:2:1846 -1610:2:1847 -1611:2:1851 -1612:2:1855 -1613:2:1856 -1614:2:1860 -1615:2:1868 -1616:2:1869 -1617:0:1982 -1618:2:1877 -1619:0:1982 -1620:2:1885 -1621:2:1886 -1622:2:1890 -1623:2:1894 -1624:2:1895 -1625:2:1899 -1626:2:1907 -1627:2:1908 -1628:0:1982 -1629:2:1916 -1630:0:1982 -1631:2:1918 -1632:0:1982 -1633:2:1919 -1634:0:1982 -1635:2:1922 -1636:0:1982 -1637:2:1927 -1638:0:1982 -1639:1:101 -1640:0:1982 -1641:2:1928 -1642:0:1982 -1643:1:102 -1644:1:106 -1645:1:107 -1646:1:115 -1647:1:116 -1648:1:120 -1649:1:121 -1650:1:129 -1651:1:134 -1652:1:138 -1653:1:139 -1654:1:146 -1655:1:147 -1656:1:158 -1657:1:159 -1658:1:160 -1659:1:171 -1660:1:183 -1661:1:184 -1662:0:1982 -1663:2:1927 -1664:0:1982 -1665:1:189 -1666:0:1982 -1667:2:1928 -1668:0:1982 -1669:1:191 -1670:0:1982 -1671:2:1927 -1672:0:1982 -1673:1:192 -1674:0:1982 -1675:2:1928 -1676:0:1982 -1677:1:193 -1678:1:197 -1679:1:198 -1680:1:206 -1681:1:207 -1682:1:211 -1683:1:212 -1684:1:220 -1685:1:225 -1686:1:229 -1687:1:230 -1688:1:237 -1689:1:238 -1690:1:249 -1691:1:250 -1692:1:251 -1693:1:262 -1694:1:274 -1695:1:275 -1696:0:1982 -1697:2:1927 -1698:0:1982 -1699:1:280 -1700:0:1982 -1701:2:1928 -1702:0:1982 -1703:1:282 -1704:0:1982 -1705:2:1927 -1706:0:1982 -1707:1:291 -1708:0:1982 -1709:2:1928 -1710:0:1982 -1711:1:293 -1712:0:1982 -1713:2:1927 -1714:0:1982 -1715:1:11 -1716:0:1982 -1717:2:1928 -1718:0:1982 -1719:1:12 -1720:1:16 -1721:1:17 -1722:1:25 -1723:1:26 -1724:1:27 -1725:1:39 -1726:1:44 -1727:1:48 -1728:1:49 -1729:1:56 -1730:1:57 -1731:1:68 -1732:1:69 -1733:1:70 -1734:1:81 -1735:1:93 -1736:1:94 -1737:0:1982 -1738:2:1927 -1739:0:1982 -1740:1:99 -1741:0:1982 -1742:2:1928 -1743:0:1982 -1744:1:101 -1745:0:1982 -1746:2:1927 -1747:0:1982 -1748:1:102 -1749:1:106 -1750:1:107 -1751:1:115 -1752:1:116 -1753:1:120 -1754:1:121 -1755:1:129 -1756:1:134 -1757:1:138 -1758:1:139 -1759:1:146 -1760:1:147 -1761:1:158 -1762:1:159 -1763:1:160 -1764:1:171 -1765:1:183 -1766:1:184 -1767:0:1982 -1768:2:1928 -1769:0:1982 -1770:1:189 -1771:0:1982 -1772:2:1927 -1773:0:1982 -1774:1:285 -1775:0:1982 -1776:2:1928 -1777:0:1982 -1778:1:286 -1779:0:1982 -1780:2:1927 -1781:0:1982 -1782:1:291 -1783:0:1982 -1784:2:1928 -1785:0:1982 -1786:1:293 -1787:0:1982 -1788:2:1927 -1789:0:1982 -1790:1:296 -1791:0:1982 -1792:2:1928 -1793:0:1982 -1794:1:301 -1795:0:1982 -1796:2:1927 -1797:0:1982 -1798:1:302 -1799:0:1980 -1800:2:1928 -1801:0:1986 -1802:1:124 diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_wmb.define b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_wmb.log b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_wmb.log deleted file mode 100644 index 4dd3892..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_wmb.log +++ /dev/null @@ -1,294 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_wmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -pan: claim violated! (at depth 1882) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 4174, errors: 1 - 367189 states, stored - 3431533 states, matched - 3798722 transitions (= stored+matched) - 13407384 atomic steps -hash conflicts: 253700 (resolved) - -Stats on memory usage (in Megabytes): - 29.415 equivalent memory usage for states (stored*(State-vector + overhead)) - 22.811 actual memory usage for states (compression: 77.55%) - state-vector as stored = 37 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 488.518 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 151, "(1)" - line 418, "pan.___", state 181, "(1)" - line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 242, "(1)" - line 418, "pan.___", state 272, "(1)" - line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 331, "(1)" - line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 360, "(1)" - line 418, "pan.___", state 390, "(1)" - line 540, "pan.___", state 414, "-end-" - (18 of 414 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 20, "(1)" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 34, "(1)" - line 403, "pan.___", state 35, "(1)" - line 403, "pan.___", state 35, "(1)" - line 401, "pan.___", state 40, "((i<1))" - line 401, "pan.___", state 40, "((i>=1))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 59, "(1)" - line 409, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 60, "else" - line 409, "pan.___", state 63, "(1)" - line 409, "pan.___", state 64, "(1)" - line 409, "pan.___", state 64, "(1)" - line 413, "pan.___", state 72, "(1)" - line 413, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 73, "else" - line 413, "pan.___", state 76, "(1)" - line 413, "pan.___", state 77, "(1)" - line 413, "pan.___", state 77, "(1)" - line 411, "pan.___", state 82, "((i<1))" - line 411, "pan.___", state 82, "((i>=1))" - line 418, "pan.___", state 89, "(1)" - line 418, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 90, "else" - line 418, "pan.___", state 93, "(1)" - line 418, "pan.___", state 94, "(1)" - line 418, "pan.___", state 94, "(1)" - line 420, "pan.___", state 97, "(1)" - line 420, "pan.___", state 97, "(1)" - line 369, "pan.___", state 99, "(1)" - line 639, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" - line 637, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 114, "(1)" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 128, "(1)" - line 403, "pan.___", state 129, "(1)" - line 403, "pan.___", state 129, "(1)" - line 401, "pan.___", state 134, "((i<1))" - line 401, "pan.___", state 134, "((i>=1))" - line 409, "pan.___", state 153, "(1)" - line 409, "pan.___", state 154, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 154, "else" - line 409, "pan.___", state 157, "(1)" - line 409, "pan.___", state 158, "(1)" - line 409, "pan.___", state 158, "(1)" - line 413, "pan.___", state 166, "(1)" - line 413, "pan.___", state 167, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 167, "else" - line 413, "pan.___", state 170, "(1)" - line 413, "pan.___", state 171, "(1)" - line 413, "pan.___", state 171, "(1)" - line 411, "pan.___", state 176, "((i<1))" - line 411, "pan.___", state 176, "((i>=1))" - line 418, "pan.___", state 183, "(1)" - line 418, "pan.___", state 184, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 184, "else" - line 418, "pan.___", state 187, "(1)" - line 418, "pan.___", state 188, "(1)" - line 418, "pan.___", state 188, "(1)" - line 420, "pan.___", state 191, "(1)" - line 420, "pan.___", state 191, "(1)" - line 369, "pan.___", state 193, "(1)" - line 652, "pan.___", state 199, "(1)" - line 646, "pan.___", state 202, "((write_lock==0))" - line 646, "pan.___", state 202, "else" - line 644, "pan.___", state 203, "(1)" - line 160, "pan.___", state 209, "(1)" - line 164, "pan.___", state 217, "(1)" - line 164, "pan.___", state 218, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 164, "pan.___", state 218, "else" - line 162, "pan.___", state 223, "((j<1))" - line 162, "pan.___", state 223, "((j>=1))" - line 168, "pan.___", state 229, "(1)" - line 168, "pan.___", state 230, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 168, "pan.___", state 230, "else" - line 160, "pan.___", state 241, "(1)" - line 168, "pan.___", state 261, "(1)" - line 160, "pan.___", state 277, "(1)" - line 164, "pan.___", state 285, "(1)" - line 168, "pan.___", state 297, "(1)" - line 399, "pan.___", state 311, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 325, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 343, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 356, "(1)" - line 413, "pan.___", state 369, "(1)" - line 418, "pan.___", state 386, "(1)" - line 399, "pan.___", state 405, "(1)" - line 403, "pan.___", state 417, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 435, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 461, "(1)" - line 418, "pan.___", state 478, "(1)" - line 403, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 554, "(1)" - line 418, "pan.___", state 571, "(1)" - line 164, "pan.___", state 594, "(1)" - line 168, "pan.___", state 606, "(1)" - line 160, "pan.___", state 618, "(1)" - line 168, "pan.___", state 638, "(1)" - line 164, "pan.___", state 662, "(1)" - line 168, "pan.___", state 674, "(1)" - line 399, "pan.___", state 696, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 698, "(1)" - line 399, "pan.___", state 699, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 399, "pan.___", state 699, "else" - line 399, "pan.___", state 702, "(1)" - line 403, "pan.___", state 710, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 712, "(1)" - line 403, "pan.___", state 713, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 403, "pan.___", state 713, "else" - line 403, "pan.___", state 716, "(1)" - line 403, "pan.___", state 717, "(1)" - line 403, "pan.___", state 717, "(1)" - line 401, "pan.___", state 722, "((i<1))" - line 401, "pan.___", state 722, "((i>=1))" - line 408, "pan.___", state 728, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 741, "(1)" - line 409, "pan.___", state 742, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 742, "else" - line 409, "pan.___", state 745, "(1)" - line 409, "pan.___", state 746, "(1)" - line 409, "pan.___", state 746, "(1)" - line 413, "pan.___", state 754, "(1)" - line 413, "pan.___", state 755, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 755, "else" - line 413, "pan.___", state 758, "(1)" - line 413, "pan.___", state 759, "(1)" - line 413, "pan.___", state 759, "(1)" - line 411, "pan.___", state 764, "((i<1))" - line 411, "pan.___", state 764, "((i>=1))" - line 418, "pan.___", state 771, "(1)" - line 418, "pan.___", state 772, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 772, "else" - line 418, "pan.___", state 775, "(1)" - line 418, "pan.___", state 776, "(1)" - line 418, "pan.___", state 776, "(1)" - line 420, "pan.___", state 779, "(1)" - line 420, "pan.___", state 779, "(1)" - line 403, "pan.___", state 810, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 828, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 854, "(1)" - line 418, "pan.___", state 871, "(1)" - line 403, "pan.___", state 900, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 918, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 944, "(1)" - line 418, "pan.___", state 961, "(1)" - line 399, "pan.___", state 980, "(1)" - line 403, "pan.___", state 992, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1010, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1036, "(1)" - line 418, "pan.___", state 1053, "(1)" - line 403, "pan.___", state 1085, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1103, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1129, "(1)" - line 418, "pan.___", state 1146, "(1)" - line 164, "pan.___", state 1169, "(1)" - line 168, "pan.___", state 1181, "(1)" - line 160, "pan.___", state 1193, "(1)" - line 168, "pan.___", state 1213, "(1)" - line 164, "pan.___", state 1237, "(1)" - line 168, "pan.___", state 1249, "(1)" - line 399, "pan.___", state 1271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 1273, "(1)" - line 399, "pan.___", state 1274, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 399, "pan.___", state 1274, "else" - line 399, "pan.___", state 1277, "(1)" - line 403, "pan.___", state 1285, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 1287, "(1)" - line 403, "pan.___", state 1288, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 403, "pan.___", state 1288, "else" - line 403, "pan.___", state 1291, "(1)" - line 403, "pan.___", state 1292, "(1)" - line 403, "pan.___", state 1292, "(1)" - line 401, "pan.___", state 1297, "((i<1))" - line 401, "pan.___", state 1297, "((i>=1))" - line 408, "pan.___", state 1303, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1316, "(1)" - line 409, "pan.___", state 1317, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 1317, "else" - line 409, "pan.___", state 1320, "(1)" - line 409, "pan.___", state 1321, "(1)" - line 409, "pan.___", state 1321, "(1)" - line 413, "pan.___", state 1329, "(1)" - line 413, "pan.___", state 1330, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 1330, "else" - line 413, "pan.___", state 1333, "(1)" - line 413, "pan.___", state 1334, "(1)" - line 413, "pan.___", state 1334, "(1)" - line 411, "pan.___", state 1339, "((i<1))" - line 411, "pan.___", state 1339, "((i>=1))" - line 418, "pan.___", state 1346, "(1)" - line 418, "pan.___", state 1347, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 1347, "else" - line 418, "pan.___", state 1350, "(1)" - line 418, "pan.___", state 1351, "(1)" - line 418, "pan.___", state 1351, "(1)" - line 420, "pan.___", state 1354, "(1)" - line 420, "pan.___", state 1354, "(1)" - line 164, "pan.___", state 1379, "(1)" - line 168, "pan.___", state 1391, "(1)" - line 160, "pan.___", state 1403, "(1)" - line 168, "pan.___", state 1423, "(1)" - line 164, "pan.___", state 1447, "(1)" - line 168, "pan.___", state 1459, "(1)" - line 702, "pan.___", state 1484, "-end-" - (160 of 1484 states) -unreached in proctype :init: - line 709, "pan.___", state 9, "((j<2))" - line 709, "pan.___", state 9, "((j>=2))" - line 710, "pan.___", state 20, "((j<2))" - line 710, "pan.___", state 20, "((j>=2))" - line 715, "pan.___", state 33, "((j<2))" - line 715, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 749, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 2.96 seconds -pan: rate 124050.34 states/second -pan: avg transition delay 7.7921e-07 usec -cp .input.spin urcu_free_no_wmb.spin.input -cp .input.spin.trail urcu_free_no_wmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_wmb.spin.input b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_wmb.spin.input deleted file mode 100644 index f4d8acb..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_wmb.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define NO_WMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -//#define READER_NEST_LEVEL 1 -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_wmb.spin.input.trail deleted file mode 100644 index f73a838..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_no_wmb.spin.input.trail +++ /dev/null @@ -1,1885 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:1946 -2:3:1898 -3:3:1901 -4:3:1901 -5:3:1904 -6:3:1912 -7:3:1912 -8:3:1915 -9:3:1921 -10:3:1925 -11:3:1925 -12:3:1928 -13:3:1936 -14:3:1940 -15:3:1941 -16:0:1946 -17:3:1943 -18:0:1946 -19:2:416 -20:0:1946 -21:2:422 -22:0:1946 -23:2:423 -24:0:1946 -25:2:424 -26:2:428 -27:2:429 -28:2:437 -29:2:438 -30:2:442 -31:2:443 -32:2:451 -33:2:456 -34:2:460 -35:2:461 -36:2:468 -37:2:469 -38:2:480 -39:2:481 -40:2:482 -41:2:493 -42:2:498 -43:2:499 -44:0:1946 -45:2:511 -46:0:1946 -47:2:513 -48:2:514 -49:0:1946 -50:2:518 -51:2:522 -52:2:523 -53:2:531 -54:2:532 -55:2:536 -56:2:537 -57:2:545 -58:2:550 -59:2:551 -60:2:562 -61:2:563 -62:2:574 -63:2:575 -64:2:576 -65:2:587 -66:2:592 -67:2:593 -68:0:1946 -69:2:605 -70:0:1946 -71:2:607 -72:0:1946 -73:2:608 -74:0:1946 -75:2:618 -76:0:1946 -77:2:619 -78:2:626 -79:2:627 -80:2:634 -81:2:639 -82:0:1946 -83:2:650 -84:0:1946 -85:2:651 -86:2:658 -87:2:659 -88:2:666 -89:2:671 -90:0:1946 -91:2:682 -92:0:1946 -93:2:687 -94:2:694 -95:2:695 -96:2:702 -97:2:707 -98:0:1946 -99:2:718 -100:0:1946 -101:2:720 -102:0:1946 -103:2:721 -104:2:725 -105:2:726 -106:2:734 -107:2:735 -108:2:739 -109:2:740 -110:2:748 -111:2:753 -112:2:757 -113:2:758 -114:2:765 -115:2:766 -116:2:777 -117:2:778 -118:2:779 -119:2:790 -120:2:795 -121:2:796 -122:0:1946 -123:2:808 -124:0:1946 -125:2:810 -126:0:1946 -127:2:813 -128:2:814 -129:2:826 -130:2:827 -131:2:831 -132:2:832 -133:2:840 -134:2:845 -135:2:849 -136:2:850 -137:2:857 -138:2:858 -139:2:869 -140:2:870 -141:2:871 -142:2:882 -143:2:887 -144:2:888 -145:0:1946 -146:2:900 -147:0:1946 -148:2:902 -149:0:1946 -150:2:903 -151:0:1946 -152:2:904 -153:0:1946 -154:2:905 -155:0:1946 -156:2:906 -157:2:910 -158:2:911 -159:2:919 -160:2:920 -161:2:924 -162:2:925 -163:2:933 -164:2:938 -165:2:942 -166:2:943 -167:2:950 -168:2:951 -169:2:962 -170:2:963 -171:2:964 -172:2:975 -173:2:980 -174:2:981 -175:0:1946 -176:2:993 -177:0:1946 -178:2:1097 -179:0:1946 -180:2:1195 -181:0:1946 -182:2:1196 -183:0:1946 -184:2:1200 -185:0:1946 -186:2:1206 -187:2:1210 -188:2:1211 -189:2:1219 -190:2:1220 -191:2:1224 -192:2:1225 -193:2:1233 -194:2:1238 -195:2:1242 -196:2:1243 -197:2:1250 -198:2:1251 -199:2:1262 -200:2:1263 -201:2:1264 -202:2:1275 -203:2:1280 -204:2:1281 -205:0:1946 -206:2:1293 -207:0:1946 -208:2:1295 -209:0:1946 -210:2:1296 -211:2:1300 -212:2:1301 -213:2:1309 -214:2:1310 -215:2:1314 -216:2:1315 -217:2:1323 -218:2:1328 -219:2:1332 -220:2:1333 -221:2:1340 -222:2:1341 -223:2:1352 -224:2:1353 -225:2:1354 -226:2:1365 -227:2:1370 -228:2:1371 -229:0:1946 -230:2:1383 -231:0:1946 -232:2:1385 -233:0:1946 -234:2:1388 -235:2:1389 -236:2:1401 -237:2:1402 -238:2:1406 -239:2:1407 -240:2:1415 -241:2:1420 -242:2:1424 -243:2:1425 -244:2:1432 -245:2:1433 -246:2:1444 -247:2:1445 -248:2:1446 -249:2:1457 -250:2:1462 -251:2:1463 -252:0:1946 -253:2:1475 -254:0:1946 -255:2:1477 -256:0:1946 -257:2:1478 -258:0:1946 -259:2:1479 -260:0:1946 -261:2:1480 -262:0:1946 -263:2:1481 -264:2:1485 -265:2:1486 -266:2:1494 -267:2:1495 -268:2:1499 -269:2:1500 -270:2:1508 -271:2:1513 -272:2:1517 -273:2:1518 -274:2:1525 -275:2:1526 -276:2:1537 -277:2:1538 -278:2:1539 -279:2:1550 -280:2:1555 -281:2:1556 -282:0:1946 -283:2:1568 -284:0:1946 -285:2:1672 -286:0:1946 -287:2:1770 -288:0:1946 -289:2:1771 -290:0:1946 -291:2:1775 -292:0:1946 -293:2:1781 -294:2:1788 -295:2:1789 -296:2:1796 -297:2:1801 -298:0:1946 -299:2:1812 -300:0:1946 -301:2:1813 -302:2:1820 -303:2:1821 -304:2:1828 -305:2:1833 -306:0:1946 -307:2:1844 -308:0:1946 -309:2:1849 -310:2:1856 -311:2:1857 -312:2:1864 -313:2:1869 -314:0:1946 -315:2:1880 -316:0:1946 -317:2:1882 -318:0:1946 -319:2:1883 -320:0:1946 -321:2:423 -322:0:1946 -323:2:424 -324:2:428 -325:2:429 -326:2:437 -327:2:438 -328:2:442 -329:2:443 -330:2:451 -331:2:456 -332:2:460 -333:2:461 -334:2:468 -335:2:469 -336:2:480 -337:2:481 -338:2:482 -339:2:493 -340:2:498 -341:2:499 -342:0:1946 -343:2:511 -344:0:1946 -345:2:513 -346:2:514 -347:0:1946 -348:2:518 -349:2:522 -350:2:523 -351:2:531 -352:2:532 -353:2:536 -354:2:537 -355:2:545 -356:2:550 -357:2:551 -358:2:562 -359:2:563 -360:2:574 -361:2:575 -362:2:576 -363:2:587 -364:2:592 -365:2:593 -366:0:1946 -367:2:605 -368:0:1946 -369:2:607 -370:0:1946 -371:2:608 -372:0:1946 -373:2:618 -374:0:1946 -375:2:619 -376:2:626 -377:2:627 -378:2:634 -379:2:639 -380:0:1946 -381:2:650 -382:0:1946 -383:2:651 -384:2:658 -385:2:659 -386:2:666 -387:2:671 -388:0:1946 -389:2:682 -390:0:1946 -391:2:687 -392:2:694 -393:2:695 -394:2:702 -395:2:707 -396:0:1946 -397:2:718 -398:0:1946 -399:2:720 -400:0:1946 -401:2:721 -402:2:725 -403:2:726 -404:2:734 -405:2:735 -406:2:739 -407:2:740 -408:2:748 -409:2:753 -410:2:757 -411:2:758 -412:2:765 -413:2:766 -414:2:777 -415:2:778 -416:2:779 -417:2:790 -418:2:795 -419:2:796 -420:0:1946 -421:2:808 -422:0:1946 -423:2:810 -424:0:1946 -425:2:813 -426:2:814 -427:2:826 -428:2:827 -429:2:831 -430:2:832 -431:2:840 -432:2:845 -433:2:849 -434:2:850 -435:2:857 -436:2:858 -437:2:869 -438:2:870 -439:2:871 -440:2:882 -441:2:887 -442:2:888 -443:0:1946 -444:2:900 -445:0:1946 -446:2:902 -447:0:1946 -448:2:903 -449:0:1946 -450:2:904 -451:0:1946 -452:2:905 -453:0:1946 -454:2:906 -455:2:910 -456:2:911 -457:2:919 -458:2:920 -459:2:924 -460:2:925 -461:2:933 -462:2:938 -463:2:942 -464:2:943 -465:2:950 -466:2:951 -467:2:962 -468:2:963 -469:2:964 -470:2:975 -471:2:980 -472:2:981 -473:0:1946 -474:2:993 -475:0:1946 -476:2:1097 -477:0:1946 -478:2:1195 -479:0:1946 -480:2:1196 -481:0:1946 -482:2:1200 -483:0:1946 -484:2:1206 -485:2:1210 -486:2:1211 -487:2:1219 -488:2:1220 -489:2:1224 -490:2:1225 -491:2:1233 -492:2:1238 -493:2:1242 -494:2:1243 -495:2:1250 -496:2:1251 -497:2:1262 -498:2:1263 -499:2:1264 -500:2:1275 -501:2:1280 -502:2:1281 -503:0:1946 -504:2:1293 -505:0:1946 -506:2:1295 -507:0:1946 -508:2:1296 -509:2:1300 -510:2:1301 -511:2:1309 -512:2:1310 -513:2:1314 -514:2:1315 -515:2:1323 -516:2:1328 -517:2:1332 -518:2:1333 -519:2:1340 -520:2:1341 -521:2:1352 -522:2:1353 -523:2:1354 -524:2:1365 -525:2:1370 -526:2:1371 -527:0:1946 -528:2:1383 -529:0:1946 -530:2:1385 -531:0:1946 -532:2:1388 -533:2:1389 -534:2:1401 -535:2:1402 -536:2:1406 -537:2:1407 -538:2:1415 -539:2:1420 -540:2:1424 -541:2:1425 -542:2:1432 -543:2:1433 -544:2:1444 -545:2:1445 -546:2:1446 -547:2:1457 -548:2:1462 -549:2:1463 -550:0:1946 -551:2:1475 -552:0:1946 -553:2:1477 -554:0:1946 -555:2:1478 -556:0:1946 -557:2:1479 -558:0:1946 -559:2:1480 -560:0:1946 -561:2:1481 -562:2:1485 -563:2:1486 -564:2:1494 -565:2:1495 -566:2:1499 -567:2:1500 -568:2:1508 -569:2:1513 -570:2:1517 -571:2:1518 -572:2:1525 -573:2:1526 -574:2:1537 -575:2:1538 -576:2:1539 -577:2:1550 -578:2:1555 -579:2:1556 -580:0:1946 -581:2:1568 -582:0:1946 -583:2:1672 -584:0:1946 -585:2:1770 -586:0:1946 -587:2:1771 -588:0:1946 -589:2:1775 -590:0:1946 -591:2:1781 -592:2:1788 -593:2:1789 -594:2:1796 -595:2:1801 -596:0:1946 -597:2:1812 -598:0:1946 -599:2:1813 -600:2:1820 -601:2:1821 -602:2:1828 -603:2:1833 -604:0:1946 -605:2:1844 -606:0:1946 -607:2:1849 -608:2:1856 -609:2:1857 -610:2:1864 -611:2:1869 -612:0:1946 -613:2:1880 -614:0:1946 -615:2:1882 -616:0:1946 -617:2:1883 -618:0:1946 -619:2:423 -620:0:1946 -621:2:424 -622:2:428 -623:2:429 -624:2:437 -625:2:438 -626:2:442 -627:2:443 -628:2:451 -629:2:456 -630:2:460 -631:2:461 -632:2:468 -633:2:469 -634:2:480 -635:2:481 -636:2:482 -637:2:493 -638:2:498 -639:2:499 -640:0:1946 -641:2:511 -642:0:1946 -643:2:513 -644:2:514 -645:0:1946 -646:2:518 -647:2:522 -648:2:523 -649:2:531 -650:2:532 -651:2:536 -652:2:537 -653:2:545 -654:2:550 -655:2:551 -656:2:562 -657:2:563 -658:2:574 -659:2:575 -660:2:576 -661:2:587 -662:2:592 -663:2:593 -664:0:1946 -665:2:605 -666:0:1946 -667:2:607 -668:0:1946 -669:2:608 -670:0:1946 -671:2:618 -672:0:1946 -673:2:619 -674:2:626 -675:2:627 -676:2:634 -677:2:639 -678:0:1946 -679:2:650 -680:0:1946 -681:2:651 -682:2:658 -683:2:659 -684:2:666 -685:2:671 -686:0:1946 -687:2:682 -688:0:1946 -689:2:687 -690:2:694 -691:2:695 -692:2:702 -693:2:707 -694:0:1946 -695:2:718 -696:0:1946 -697:2:720 -698:0:1946 -699:2:721 -700:2:725 -701:2:726 -702:2:734 -703:2:735 -704:2:739 -705:2:740 -706:2:748 -707:2:753 -708:2:757 -709:2:758 -710:2:765 -711:2:766 -712:2:777 -713:2:778 -714:2:779 -715:2:790 -716:2:795 -717:2:796 -718:0:1946 -719:2:808 -720:0:1946 -721:2:810 -722:0:1946 -723:2:813 -724:2:814 -725:2:826 -726:2:827 -727:2:831 -728:2:832 -729:2:840 -730:2:845 -731:2:849 -732:2:850 -733:2:857 -734:2:858 -735:2:869 -736:2:870 -737:2:871 -738:2:882 -739:2:887 -740:2:888 -741:0:1946 -742:2:900 -743:0:1946 -744:2:902 -745:0:1946 -746:2:903 -747:0:1946 -748:2:904 -749:0:1946 -750:2:905 -751:0:1946 -752:2:906 -753:2:910 -754:2:911 -755:2:919 -756:2:920 -757:2:924 -758:2:925 -759:2:933 -760:2:938 -761:2:942 -762:2:943 -763:2:950 -764:2:951 -765:2:962 -766:2:963 -767:2:964 -768:2:975 -769:2:980 -770:2:981 -771:0:1946 -772:2:993 -773:0:1946 -774:2:1097 -775:0:1946 -776:2:1195 -777:0:1946 -778:2:1196 -779:0:1946 -780:2:1200 -781:0:1946 -782:2:1206 -783:2:1210 -784:2:1211 -785:2:1219 -786:2:1220 -787:2:1224 -788:2:1225 -789:2:1233 -790:2:1238 -791:2:1242 -792:2:1243 -793:2:1250 -794:2:1251 -795:2:1262 -796:2:1263 -797:2:1264 -798:2:1275 -799:2:1280 -800:2:1281 -801:0:1946 -802:2:1293 -803:0:1946 -804:2:1295 -805:0:1946 -806:2:1296 -807:2:1300 -808:2:1301 -809:2:1309 -810:2:1310 -811:2:1314 -812:2:1315 -813:2:1323 -814:2:1328 -815:2:1332 -816:2:1333 -817:2:1340 -818:2:1341 -819:2:1352 -820:2:1353 -821:2:1354 -822:2:1365 -823:2:1370 -824:2:1371 -825:0:1946 -826:2:1383 -827:0:1946 -828:2:1385 -829:0:1946 -830:2:1388 -831:2:1389 -832:2:1401 -833:2:1402 -834:2:1406 -835:2:1407 -836:2:1415 -837:2:1420 -838:2:1424 -839:2:1425 -840:2:1432 -841:2:1433 -842:2:1444 -843:2:1445 -844:2:1446 -845:2:1457 -846:2:1462 -847:2:1463 -848:0:1946 -849:2:1475 -850:0:1946 -851:2:1477 -852:0:1946 -853:2:1478 -854:0:1946 -855:2:1479 -856:0:1946 -857:2:1480 -858:0:1946 -859:2:1481 -860:2:1485 -861:2:1486 -862:2:1494 -863:2:1495 -864:2:1499 -865:2:1500 -866:2:1508 -867:2:1513 -868:2:1517 -869:2:1518 -870:2:1525 -871:2:1526 -872:2:1537 -873:2:1538 -874:2:1539 -875:2:1550 -876:2:1555 -877:2:1556 -878:0:1946 -879:2:1568 -880:0:1946 -881:2:1672 -882:0:1946 -883:2:1770 -884:0:1946 -885:2:1771 -886:0:1946 -887:2:1775 -888:0:1946 -889:2:1781 -890:2:1788 -891:2:1789 -892:2:1796 -893:2:1801 -894:0:1946 -895:2:1812 -896:0:1946 -897:2:1813 -898:2:1820 -899:2:1821 -900:2:1828 -901:2:1833 -902:0:1946 -903:2:1844 -904:0:1946 -905:2:1849 -906:2:1856 -907:2:1857 -908:2:1864 -909:2:1869 -910:0:1946 -911:2:1880 -912:0:1946 -913:2:1882 -914:0:1946 -915:2:1883 -916:0:1946 -917:2:423 -918:0:1946 -919:2:424 -920:2:428 -921:2:429 -922:2:437 -923:2:438 -924:2:442 -925:2:443 -926:2:451 -927:2:456 -928:2:460 -929:2:461 -930:2:468 -931:2:469 -932:2:480 -933:2:481 -934:2:482 -935:2:493 -936:2:498 -937:2:499 -938:0:1946 -939:2:511 -940:0:1946 -941:2:513 -942:2:514 -943:0:1946 -944:2:518 -945:2:522 -946:2:523 -947:2:531 -948:2:532 -949:2:536 -950:2:537 -951:2:545 -952:2:550 -953:2:551 -954:2:562 -955:2:563 -956:2:574 -957:2:575 -958:2:576 -959:2:587 -960:2:592 -961:2:593 -962:0:1946 -963:2:605 -964:0:1946 -965:2:607 -966:0:1946 -967:2:608 -968:0:1946 -969:2:618 -970:0:1946 -971:2:619 -972:2:626 -973:2:627 -974:2:634 -975:2:639 -976:0:1946 -977:2:650 -978:0:1946 -979:2:651 -980:2:658 -981:2:659 -982:2:666 -983:2:671 -984:0:1946 -985:2:682 -986:0:1946 -987:2:687 -988:2:694 -989:2:695 -990:2:702 -991:2:707 -992:0:1946 -993:2:718 -994:0:1946 -995:2:720 -996:0:1946 -997:2:721 -998:2:725 -999:2:726 -1000:2:734 -1001:2:735 -1002:2:739 -1003:2:740 -1004:2:748 -1005:2:753 -1006:2:757 -1007:2:758 -1008:2:765 -1009:2:766 -1010:2:777 -1011:2:778 -1012:2:779 -1013:2:790 -1014:2:795 -1015:2:796 -1016:0:1946 -1017:2:808 -1018:0:1946 -1019:2:810 -1020:0:1946 -1021:2:813 -1022:2:814 -1023:2:826 -1024:2:827 -1025:2:831 -1026:2:832 -1027:2:840 -1028:2:845 -1029:2:849 -1030:2:850 -1031:2:857 -1032:2:858 -1033:2:869 -1034:2:870 -1035:2:871 -1036:2:882 -1037:2:887 -1038:2:888 -1039:0:1946 -1040:2:900 -1041:0:1946 -1042:2:902 -1043:0:1946 -1044:2:903 -1045:0:1946 -1046:2:904 -1047:0:1946 -1048:2:905 -1049:0:1946 -1050:2:906 -1051:2:910 -1052:2:911 -1053:2:919 -1054:2:920 -1055:2:924 -1056:2:925 -1057:2:933 -1058:2:938 -1059:2:942 -1060:2:943 -1061:2:950 -1062:2:951 -1063:2:962 -1064:2:963 -1065:2:964 -1066:2:975 -1067:2:980 -1068:2:981 -1069:0:1946 -1070:2:993 -1071:0:1946 -1072:2:1097 -1073:0:1946 -1074:2:1195 -1075:0:1946 -1076:2:1196 -1077:0:1946 -1078:2:1200 -1079:0:1946 -1080:2:1206 -1081:2:1210 -1082:2:1211 -1083:2:1219 -1084:2:1220 -1085:2:1224 -1086:2:1225 -1087:2:1233 -1088:2:1238 -1089:2:1242 -1090:2:1243 -1091:2:1250 -1092:2:1251 -1093:2:1262 -1094:2:1263 -1095:2:1264 -1096:2:1275 -1097:2:1280 -1098:2:1281 -1099:0:1946 -1100:2:1293 -1101:0:1946 -1102:2:1295 -1103:0:1946 -1104:2:1296 -1105:2:1300 -1106:2:1301 -1107:2:1309 -1108:2:1310 -1109:2:1314 -1110:2:1315 -1111:2:1323 -1112:2:1328 -1113:2:1332 -1114:2:1333 -1115:2:1340 -1116:2:1341 -1117:2:1352 -1118:2:1353 -1119:2:1354 -1120:2:1365 -1121:2:1370 -1122:2:1371 -1123:0:1946 -1124:2:1383 -1125:0:1946 -1126:2:1385 -1127:0:1946 -1128:2:1388 -1129:2:1389 -1130:2:1401 -1131:2:1402 -1132:2:1406 -1133:2:1407 -1134:2:1415 -1135:2:1420 -1136:2:1424 -1137:2:1425 -1138:2:1432 -1139:2:1433 -1140:2:1444 -1141:2:1445 -1142:2:1446 -1143:2:1457 -1144:2:1462 -1145:2:1463 -1146:0:1946 -1147:2:1475 -1148:0:1946 -1149:2:1477 -1150:0:1946 -1151:2:1478 -1152:0:1946 -1153:2:1479 -1154:0:1946 -1155:2:1480 -1156:0:1946 -1157:2:1481 -1158:2:1485 -1159:2:1486 -1160:2:1494 -1161:2:1495 -1162:2:1499 -1163:2:1500 -1164:2:1508 -1165:2:1513 -1166:2:1517 -1167:2:1518 -1168:2:1525 -1169:2:1526 -1170:2:1537 -1171:2:1538 -1172:2:1539 -1173:2:1550 -1174:2:1555 -1175:2:1556 -1176:0:1946 -1177:2:1568 -1178:0:1946 -1179:2:1672 -1180:0:1946 -1181:2:1770 -1182:0:1946 -1183:2:1771 -1184:0:1946 -1185:2:1775 -1186:0:1946 -1187:2:1781 -1188:2:1788 -1189:2:1789 -1190:2:1796 -1191:2:1801 -1192:0:1946 -1193:2:1812 -1194:0:1946 -1195:2:1813 -1196:2:1820 -1197:2:1821 -1198:2:1828 -1199:2:1833 -1200:0:1946 -1201:2:1844 -1202:0:1946 -1203:2:1849 -1204:2:1856 -1205:2:1857 -1206:2:1864 -1207:2:1869 -1208:0:1946 -1209:2:1880 -1210:0:1946 -1211:2:1882 -1212:0:1946 -1213:2:1883 -1214:0:1946 -1215:2:423 -1216:0:1946 -1217:2:424 -1218:2:428 -1219:2:429 -1220:2:437 -1221:2:438 -1222:2:442 -1223:2:443 -1224:2:451 -1225:2:456 -1226:2:460 -1227:2:461 -1228:2:468 -1229:2:469 -1230:2:480 -1231:2:481 -1232:2:482 -1233:2:493 -1234:2:498 -1235:2:499 -1236:0:1946 -1237:2:511 -1238:0:1946 -1239:2:513 -1240:2:514 -1241:0:1946 -1242:2:518 -1243:2:522 -1244:2:523 -1245:2:531 -1246:2:532 -1247:2:536 -1248:2:537 -1249:2:545 -1250:2:550 -1251:2:551 -1252:2:562 -1253:2:563 -1254:2:574 -1255:2:575 -1256:2:576 -1257:2:587 -1258:2:592 -1259:2:593 -1260:0:1946 -1261:2:605 -1262:0:1946 -1263:2:607 -1264:0:1946 -1265:2:608 -1266:0:1946 -1267:2:618 -1268:0:1946 -1269:2:619 -1270:2:626 -1271:2:627 -1272:2:634 -1273:2:639 -1274:0:1946 -1275:2:650 -1276:0:1946 -1277:1:2 -1278:0:1946 -1279:1:8 -1280:0:1946 -1281:1:9 -1282:0:1946 -1283:1:10 -1284:0:1946 -1285:1:11 -1286:0:1946 -1287:1:12 -1288:1:16 -1289:1:17 -1290:1:25 -1291:1:26 -1292:1:30 -1293:1:31 -1294:1:39 -1295:1:44 -1296:1:48 -1297:1:49 -1298:1:56 -1299:1:57 -1300:1:68 -1301:1:69 -1302:1:70 -1303:1:81 -1304:1:93 -1305:1:94 -1306:0:1946 -1307:1:99 -1308:0:1946 -1309:1:101 -1310:0:1946 -1311:1:102 -1312:1:106 -1313:1:107 -1314:1:115 -1315:1:116 -1316:1:120 -1317:1:121 -1318:1:129 -1319:1:134 -1320:1:138 -1321:1:139 -1322:1:146 -1323:1:147 -1324:1:158 -1325:1:159 -1326:1:160 -1327:1:171 -1328:1:183 -1329:1:184 -1330:0:1946 -1331:1:189 -1332:0:1946 -1333:1:191 -1334:0:1946 -1335:1:192 -1336:0:1946 -1337:1:193 -1338:1:197 -1339:1:198 -1340:1:206 -1341:1:207 -1342:1:211 -1343:1:212 -1344:1:220 -1345:1:225 -1346:1:229 -1347:1:230 -1348:1:237 -1349:1:238 -1350:1:249 -1351:1:250 -1352:1:251 -1353:1:262 -1354:1:274 -1355:1:275 -1356:0:1946 -1357:1:280 -1358:0:1946 -1359:1:282 -1360:0:1946 -1361:1:291 -1362:0:1946 -1363:1:293 -1364:0:1946 -1365:1:11 -1366:0:1946 -1367:1:12 -1368:1:16 -1369:1:17 -1370:1:25 -1371:1:26 -1372:1:27 -1373:1:39 -1374:1:44 -1375:1:48 -1376:1:49 -1377:1:56 -1378:1:57 -1379:1:68 -1380:1:69 -1381:1:70 -1382:1:81 -1383:1:93 -1384:1:94 -1385:0:1946 -1386:1:99 -1387:0:1946 -1388:1:101 -1389:0:1946 -1390:1:102 -1391:1:106 -1392:1:107 -1393:1:115 -1394:1:116 -1395:1:120 -1396:1:121 -1397:1:129 -1398:1:134 -1399:1:138 -1400:1:139 -1401:1:146 -1402:1:147 -1403:1:158 -1404:1:159 -1405:1:160 -1406:1:171 -1407:1:183 -1408:1:184 -1409:0:1946 -1410:1:189 -1411:0:1946 -1412:1:285 -1413:0:1946 -1414:1:286 -1415:0:1946 -1416:1:291 -1417:0:1946 -1418:1:293 -1419:0:1946 -1420:1:296 -1421:0:1946 -1422:1:301 -1423:0:1946 -1424:1:302 -1425:0:1946 -1426:1:303 -1427:0:1946 -1428:1:304 -1429:0:1946 -1430:1:305 -1431:0:1946 -1432:1:306 -1433:0:1946 -1434:1:308 -1435:0:1946 -1436:1:310 -1437:0:1946 -1438:1:311 -1439:1:315 -1440:1:316 -1441:1:324 -1442:1:325 -1443:1:326 -1444:1:338 -1445:1:343 -1446:1:347 -1447:1:348 -1448:1:355 -1449:1:356 -1450:1:367 -1451:1:368 -1452:1:369 -1453:1:380 -1454:1:392 -1455:1:393 -1456:0:1946 -1457:1:398 -1458:0:1946 -1459:1:400 -1460:0:1946 -1461:1:305 -1462:0:1946 -1463:1:306 -1464:0:1946 -1465:1:308 -1466:0:1946 -1467:1:310 -1468:0:1946 -1469:1:311 -1470:1:315 -1471:1:316 -1472:1:324 -1473:1:325 -1474:1:326 -1475:1:338 -1476:1:343 -1477:1:347 -1478:1:348 -1479:1:355 -1480:1:356 -1481:1:367 -1482:1:368 -1483:1:369 -1484:1:380 -1485:1:392 -1486:1:393 -1487:0:1946 -1488:1:398 -1489:0:1946 -1490:1:400 -1491:0:1946 -1492:1:404 -1493:0:1946 -1494:1:9 -1495:0:1946 -1496:1:10 -1497:0:1946 -1498:1:11 -1499:0:1946 -1500:1:12 -1501:1:16 -1502:1:17 -1503:1:25 -1504:1:26 -1505:1:27 -1506:1:39 -1507:1:44 -1508:1:48 -1509:1:49 -1510:1:56 -1511:1:57 -1512:1:68 -1513:1:69 -1514:1:70 -1515:1:81 -1516:1:93 -1517:1:94 -1518:0:1946 -1519:1:99 -1520:0:1946 -1521:1:101 -1522:0:1946 -1523:1:102 -1524:1:106 -1525:1:107 -1526:1:115 -1527:1:116 -1528:1:120 -1529:1:121 -1530:1:129 -1531:1:134 -1532:1:138 -1533:1:139 -1534:1:146 -1535:1:147 -1536:1:158 -1537:1:159 -1538:1:160 -1539:1:171 -1540:1:183 -1541:1:184 -1542:0:1946 -1543:1:189 -1544:0:1946 -1545:1:191 -1546:0:1946 -1547:1:192 -1548:0:1946 -1549:1:193 -1550:1:197 -1551:1:198 -1552:1:206 -1553:1:207 -1554:1:211 -1555:1:212 -1556:1:220 -1557:1:225 -1558:1:229 -1559:1:230 -1560:1:237 -1561:1:238 -1562:1:249 -1563:1:250 -1564:1:251 -1565:1:262 -1566:1:274 -1567:1:275 -1568:0:1946 -1569:1:280 -1570:0:1946 -1571:1:282 -1572:0:1946 -1573:1:291 -1574:0:1946 -1575:1:293 -1576:0:1946 -1577:1:11 -1578:0:1946 -1579:1:12 -1580:1:16 -1581:1:17 -1582:1:25 -1583:1:34 -1584:1:35 -1585:1:39 -1586:1:44 -1587:1:48 -1588:1:49 -1589:1:56 -1590:1:57 -1591:1:68 -1592:1:69 -1593:1:72 -1594:1:73 -1595:1:81 -1596:1:93 -1597:1:94 -1598:0:1946 -1599:1:99 -1600:0:1946 -1601:1:101 -1602:0:1946 -1603:1:102 -1604:1:106 -1605:1:107 -1606:1:115 -1607:1:124 -1608:1:125 -1609:1:129 -1610:1:134 -1611:1:138 -1612:1:139 -1613:1:146 -1614:1:147 -1615:1:158 -1616:1:159 -1617:1:162 -1618:1:163 -1619:1:171 -1620:1:183 -1621:1:184 -1622:0:1946 -1623:1:189 -1624:0:1946 -1625:1:285 -1626:0:1946 -1627:1:286 -1628:0:1946 -1629:1:291 -1630:0:1946 -1631:1:293 -1632:0:1946 -1633:1:296 -1634:0:1946 -1635:1:301 -1636:0:1946 -1637:2:651 -1638:2:658 -1639:2:661 -1640:2:662 -1641:2:666 -1642:2:671 -1643:0:1946 -1644:2:682 -1645:0:1946 -1646:2:687 -1647:2:694 -1648:2:695 -1649:2:702 -1650:2:707 -1651:0:1946 -1652:2:718 -1653:0:1946 -1654:2:720 -1655:0:1946 -1656:2:721 -1657:2:725 -1658:2:726 -1659:2:734 -1660:2:735 -1661:2:739 -1662:2:740 -1663:2:748 -1664:2:753 -1665:2:757 -1666:2:758 -1667:2:765 -1668:2:766 -1669:2:777 -1670:2:778 -1671:2:779 -1672:2:790 -1673:2:795 -1674:2:796 -1675:0:1946 -1676:2:808 -1677:0:1946 -1678:2:810 -1679:0:1946 -1680:2:813 -1681:2:814 -1682:2:826 -1683:2:827 -1684:2:831 -1685:2:832 -1686:2:840 -1687:2:845 -1688:2:849 -1689:2:850 -1690:2:857 -1691:2:858 -1692:2:869 -1693:2:870 -1694:2:871 -1695:2:882 -1696:2:887 -1697:2:888 -1698:0:1946 -1699:2:900 -1700:0:1946 -1701:2:902 -1702:0:1946 -1703:2:903 -1704:0:1946 -1705:2:904 -1706:0:1946 -1707:2:905 -1708:0:1946 -1709:2:906 -1710:2:910 -1711:2:911 -1712:2:919 -1713:2:920 -1714:2:924 -1715:2:925 -1716:2:933 -1717:2:938 -1718:2:942 -1719:2:943 -1720:2:950 -1721:2:951 -1722:2:962 -1723:2:963 -1724:2:964 -1725:2:975 -1726:2:980 -1727:2:981 -1728:0:1946 -1729:2:993 -1730:0:1946 -1731:2:1097 -1732:0:1946 -1733:2:1195 -1734:0:1946 -1735:2:1196 -1736:0:1946 -1737:2:1200 -1738:0:1946 -1739:2:1206 -1740:2:1210 -1741:2:1211 -1742:2:1219 -1743:2:1220 -1744:2:1224 -1745:2:1225 -1746:2:1233 -1747:2:1238 -1748:2:1242 -1749:2:1243 -1750:2:1250 -1751:2:1251 -1752:2:1262 -1753:2:1263 -1754:2:1264 -1755:2:1275 -1756:2:1280 -1757:2:1281 -1758:0:1946 -1759:2:1293 -1760:0:1946 -1761:2:1295 -1762:0:1946 -1763:2:1296 -1764:2:1300 -1765:2:1301 -1766:2:1309 -1767:2:1310 -1768:2:1314 -1769:2:1315 -1770:2:1323 -1771:2:1328 -1772:2:1332 -1773:2:1333 -1774:2:1340 -1775:2:1341 -1776:2:1352 -1777:2:1353 -1778:2:1354 -1779:2:1365 -1780:2:1370 -1781:2:1371 -1782:0:1946 -1783:2:1383 -1784:0:1946 -1785:2:1385 -1786:0:1946 -1787:2:1388 -1788:2:1389 -1789:2:1401 -1790:2:1402 -1791:2:1406 -1792:2:1407 -1793:2:1415 -1794:2:1420 -1795:2:1424 -1796:2:1425 -1797:2:1432 -1798:2:1433 -1799:2:1444 -1800:2:1445 -1801:2:1446 -1802:2:1457 -1803:2:1462 -1804:2:1463 -1805:0:1946 -1806:2:1475 -1807:0:1946 -1808:2:1477 -1809:0:1946 -1810:2:1478 -1811:0:1946 -1812:2:1479 -1813:0:1946 -1814:2:1480 -1815:0:1946 -1816:2:1481 -1817:2:1485 -1818:2:1486 -1819:2:1494 -1820:2:1495 -1821:2:1499 -1822:2:1500 -1823:2:1508 -1824:2:1513 -1825:2:1517 -1826:2:1518 -1827:2:1525 -1828:2:1526 -1829:2:1537 -1830:2:1538 -1831:2:1539 -1832:2:1550 -1833:2:1555 -1834:2:1556 -1835:0:1946 -1836:2:1568 -1837:0:1946 -1838:2:1672 -1839:0:1946 -1840:2:1770 -1841:0:1946 -1842:2:1771 -1843:0:1946 -1844:2:1775 -1845:0:1946 -1846:2:1781 -1847:2:1788 -1848:2:1789 -1849:2:1796 -1850:2:1801 -1851:0:1946 -1852:2:1812 -1853:0:1946 -1854:2:1813 -1855:2:1820 -1856:2:1823 -1857:2:1824 -1858:2:1828 -1859:2:1833 -1860:0:1946 -1861:2:1844 -1862:0:1946 -1863:2:1849 -1864:2:1856 -1865:2:1857 -1866:2:1864 -1867:2:1869 -1868:0:1946 -1869:2:1880 -1870:0:1946 -1871:2:1882 -1872:0:1946 -1873:2:1883 -1874:0:1946 -1875:2:1886 -1876:0:1946 -1877:2:1891 -1878:0:1946 -1879:1:302 -1880:0:1944 -1881:2:1892 -1882:0:1950 -1883:1:143 diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_single_flip.define b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_single_flip.log b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_single_flip.log deleted file mode 100644 index 2a80112..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_single_flip.log +++ /dev/null @@ -1,197 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_single_flip.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -pan: claim violated! (at depth 1371) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 3387, errors: 1 - 206295 states, stored - 1902753 states, matched - 2109048 transitions (= stored+matched) - 7663223 atomic steps -hash conflicts: 101109 (resolved) - -Stats on memory usage (in Megabytes): - 16.526 equivalent memory usage for states (stored*(State-vector + overhead)) - 13.080 actual memory usage for states (compression: 79.15%) - state-vector as stored = 38 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 478.752 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 151, "(1)" - line 418, "pan.___", state 181, "(1)" - line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 242, "(1)" - line 418, "pan.___", state 272, "(1)" - line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 360, "(1)" - line 418, "pan.___", state 390, "(1)" - line 540, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 59, "(1)" - line 413, "pan.___", state 72, "(1)" - line 418, "pan.___", state 89, "(1)" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 240, "(1)" - line 164, "pan.___", state 248, "(1)" - line 168, "pan.___", state 260, "(1)" - line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 927, "(1)" - line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 928, "else" - line 409, "pan.___", state 931, "(1)" - line 409, "pan.___", state 932, "(1)" - line 409, "pan.___", state 932, "(1)" - line 413, "pan.___", state 940, "(1)" - line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 941, "else" - line 413, "pan.___", state 944, "(1)" - line 413, "pan.___", state 945, "(1)" - line 413, "pan.___", state 945, "(1)" - line 411, "pan.___", state 950, "((i<1))" - line 411, "pan.___", state 950, "((i>=1))" - line 418, "pan.___", state 957, "(1)" - line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 958, "else" - line 418, "pan.___", state 961, "(1)" - line 418, "pan.___", state 962, "(1)" - line 418, "pan.___", state 962, "(1)" - line 420, "pan.___", state 965, "(1)" - line 420, "pan.___", state 965, "(1)" - line 179, "pan.___", state 990, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1003, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 1013, "(1)" - line 164, "pan.___", state 1021, "(1)" - line 168, "pan.___", state 1033, "(1)" - line 175, "pan.___", state 1044, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=2))" - line 710, "pan.___", state 20, "((j<2))" - line 710, "pan.___", state 20, "((j>=2))" - line 715, "pan.___", state 33, "((j<2))" - line 715, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 749, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 1.66 seconds -pan: rate 124274.1 states/second -pan: avg transition delay 7.8708e-07 usec -cp .input.spin urcu_free_single_flip.spin.input -cp .input.spin.trail urcu_free_single_flip.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_single_flip.spin.input b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_single_flip.spin.input deleted file mode 100644 index 93aae44..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_single_flip.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define SINGLE_FLIP - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -//#define READER_NEST_LEVEL 1 -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_single_flip.spin.input.trail b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_single_flip.spin.input.trail deleted file mode 100644 index 73c1400..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_free_single_flip.spin.input.trail +++ /dev/null @@ -1,1374 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:1650 -2:3:1602 -3:3:1605 -4:3:1605 -5:3:1608 -6:3:1616 -7:3:1616 -8:3:1619 -9:3:1625 -10:3:1629 -11:3:1629 -12:3:1632 -13:3:1640 -14:3:1644 -15:3:1645 -16:0:1650 -17:3:1647 -18:0:1650 -19:2:416 -20:0:1650 -21:2:422 -22:0:1650 -23:2:423 -24:0:1650 -25:2:424 -26:2:428 -27:2:429 -28:2:437 -29:2:438 -30:2:442 -31:2:443 -32:2:451 -33:2:456 -34:2:460 -35:2:461 -36:2:468 -37:2:469 -38:2:480 -39:2:481 -40:2:482 -41:2:493 -42:2:498 -43:2:499 -44:0:1650 -45:2:511 -46:0:1650 -47:2:513 -48:2:514 -49:0:1650 -50:2:518 -51:2:522 -52:2:523 -53:2:531 -54:2:532 -55:2:536 -56:2:537 -57:2:545 -58:2:550 -59:2:551 -60:2:562 -61:2:563 -62:2:574 -63:2:575 -64:2:576 -65:2:587 -66:2:592 -67:2:593 -68:0:1650 -69:2:605 -70:0:1650 -71:2:607 -72:0:1650 -73:2:608 -74:0:1650 -75:2:618 -76:0:1650 -77:2:622 -78:2:623 -79:2:627 -80:2:631 -81:2:632 -82:2:636 -83:2:644 -84:2:645 -85:2:650 -86:2:657 -87:2:658 -88:2:665 -89:2:670 -90:0:1650 -91:2:681 -92:0:1650 -93:2:685 -94:2:686 -95:2:690 -96:2:694 -97:2:695 -98:2:699 -99:2:707 -100:2:708 -101:2:713 -102:2:720 -103:2:721 -104:2:728 -105:2:733 -106:0:1650 -107:2:744 -108:0:1650 -109:2:752 -110:2:753 -111:2:757 -112:2:761 -113:2:762 -114:2:766 -115:2:774 -116:2:775 -117:2:780 -118:2:787 -119:2:788 -120:2:795 -121:2:800 -122:0:1650 -123:2:811 -124:0:1650 -125:2:813 -126:0:1650 -127:2:814 -128:2:818 -129:2:819 -130:2:827 -131:2:828 -132:2:832 -133:2:833 -134:2:841 -135:2:846 -136:2:850 -137:2:851 -138:2:858 -139:2:859 -140:2:870 -141:2:871 -142:2:872 -143:2:883 -144:2:888 -145:2:889 -146:0:1650 -147:2:901 -148:0:1650 -149:2:903 -150:0:1650 -151:2:906 -152:2:907 -153:2:919 -154:2:920 -155:2:924 -156:2:925 -157:2:933 -158:2:938 -159:2:942 -160:2:943 -161:2:950 -162:2:951 -163:2:962 -164:2:963 -165:2:964 -166:2:975 -167:2:980 -168:2:981 -169:0:1650 -170:2:993 -171:0:1650 -172:2:995 -173:0:1650 -174:2:996 -175:0:1650 -176:2:997 -177:0:1650 -178:2:998 -179:0:1650 -180:2:999 -181:2:1003 -182:2:1004 -183:2:1012 -184:2:1013 -185:2:1017 -186:2:1018 -187:2:1026 -188:2:1031 -189:2:1035 -190:2:1036 -191:2:1043 -192:2:1044 -193:2:1055 -194:2:1056 -195:2:1057 -196:2:1068 -197:2:1073 -198:2:1074 -199:0:1650 -200:2:1086 -201:0:1650 -202:2:1283 -203:0:1650 -204:2:1381 -205:0:1650 -206:2:1382 -207:0:1650 -208:2:1386 -209:0:1650 -210:2:1395 -211:2:1396 -212:2:1400 -213:2:1404 -214:2:1405 -215:2:1409 -216:2:1417 -217:2:1418 -218:2:1423 -219:2:1430 -220:2:1431 -221:2:1438 -222:2:1443 -223:0:1650 -224:2:1454 -225:0:1650 -226:2:1458 -227:2:1459 -228:2:1463 -229:2:1467 -230:2:1468 -231:2:1472 -232:2:1480 -233:2:1481 -234:2:1486 -235:2:1493 -236:2:1494 -237:2:1501 -238:2:1506 -239:0:1650 -240:2:1517 -241:0:1650 -242:2:1525 -243:2:1526 -244:2:1530 -245:2:1534 -246:2:1535 -247:2:1539 -248:2:1547 -249:2:1548 -250:2:1553 -251:2:1560 -252:2:1561 -253:2:1568 -254:2:1573 -255:0:1650 -256:2:1584 -257:0:1650 -258:2:1586 -259:0:1650 -260:2:1587 -261:0:1650 -262:2:423 -263:0:1650 -264:2:424 -265:2:428 -266:2:429 -267:2:437 -268:2:438 -269:2:442 -270:2:443 -271:2:451 -272:2:456 -273:2:460 -274:2:461 -275:2:468 -276:2:469 -277:2:480 -278:2:481 -279:2:482 -280:2:493 -281:2:498 -282:2:499 -283:0:1650 -284:2:511 -285:0:1650 -286:2:513 -287:2:514 -288:0:1650 -289:2:518 -290:2:522 -291:2:523 -292:2:531 -293:2:532 -294:2:536 -295:2:537 -296:2:545 -297:2:550 -298:2:551 -299:2:562 -300:2:563 -301:2:574 -302:2:575 -303:2:576 -304:2:587 -305:2:592 -306:2:593 -307:0:1650 -308:2:605 -309:0:1650 -310:2:607 -311:0:1650 -312:2:608 -313:0:1650 -314:2:618 -315:0:1650 -316:2:622 -317:2:623 -318:2:627 -319:2:631 -320:2:632 -321:2:636 -322:2:644 -323:2:645 -324:2:650 -325:2:657 -326:2:658 -327:2:665 -328:2:670 -329:0:1650 -330:2:681 -331:0:1650 -332:2:685 -333:2:686 -334:2:690 -335:2:694 -336:2:695 -337:2:699 -338:2:707 -339:2:708 -340:2:713 -341:2:720 -342:2:721 -343:2:728 -344:2:733 -345:0:1650 -346:2:744 -347:0:1650 -348:2:752 -349:2:753 -350:2:757 -351:2:761 -352:2:762 -353:2:766 -354:2:774 -355:2:775 -356:2:780 -357:2:787 -358:2:788 -359:2:795 -360:2:800 -361:0:1650 -362:2:811 -363:0:1650 -364:2:813 -365:0:1650 -366:2:814 -367:2:818 -368:2:819 -369:2:827 -370:2:828 -371:2:832 -372:2:833 -373:2:841 -374:2:846 -375:2:850 -376:2:851 -377:2:858 -378:2:859 -379:2:870 -380:2:871 -381:2:872 -382:2:883 -383:2:888 -384:2:889 -385:0:1650 -386:2:901 -387:0:1650 -388:2:903 -389:0:1650 -390:2:906 -391:2:907 -392:2:919 -393:2:920 -394:2:924 -395:2:925 -396:2:933 -397:2:938 -398:2:942 -399:2:943 -400:2:950 -401:2:951 -402:2:962 -403:2:963 -404:2:964 -405:2:975 -406:2:980 -407:2:981 -408:0:1650 -409:2:993 -410:0:1650 -411:2:995 -412:0:1650 -413:2:996 -414:0:1650 -415:2:997 -416:0:1650 -417:2:998 -418:0:1650 -419:2:999 -420:2:1003 -421:2:1004 -422:2:1012 -423:2:1013 -424:2:1017 -425:2:1018 -426:2:1026 -427:2:1031 -428:2:1035 -429:2:1036 -430:2:1043 -431:2:1044 -432:2:1055 -433:2:1056 -434:2:1057 -435:2:1068 -436:2:1073 -437:2:1074 -438:0:1650 -439:2:1086 -440:0:1650 -441:2:1283 -442:0:1650 -443:2:1381 -444:0:1650 -445:2:1382 -446:0:1650 -447:2:1386 -448:0:1650 -449:2:1395 -450:2:1396 -451:2:1400 -452:2:1404 -453:2:1405 -454:2:1409 -455:2:1417 -456:2:1418 -457:2:1423 -458:2:1430 -459:2:1431 -460:2:1438 -461:2:1443 -462:0:1650 -463:2:1454 -464:0:1650 -465:2:1458 -466:2:1459 -467:2:1463 -468:2:1467 -469:2:1468 -470:2:1472 -471:2:1480 -472:2:1481 -473:2:1486 -474:2:1493 -475:2:1494 -476:2:1501 -477:2:1506 -478:0:1650 -479:2:1517 -480:0:1650 -481:2:1525 -482:2:1526 -483:2:1530 -484:2:1534 -485:2:1535 -486:2:1539 -487:2:1547 -488:2:1548 -489:2:1553 -490:2:1560 -491:2:1561 -492:2:1568 -493:2:1573 -494:0:1650 -495:2:1584 -496:0:1650 -497:2:1586 -498:0:1650 -499:2:1587 -500:0:1650 -501:2:423 -502:0:1650 -503:2:424 -504:2:428 -505:2:429 -506:2:437 -507:2:438 -508:2:442 -509:2:443 -510:2:451 -511:2:456 -512:2:460 -513:2:461 -514:2:468 -515:2:469 -516:2:480 -517:2:481 -518:2:482 -519:2:493 -520:2:498 -521:2:499 -522:0:1650 -523:2:511 -524:0:1650 -525:2:513 -526:2:514 -527:0:1650 -528:2:518 -529:2:522 -530:2:523 -531:2:531 -532:2:532 -533:2:536 -534:2:537 -535:2:545 -536:2:550 -537:2:551 -538:2:562 -539:2:563 -540:2:574 -541:2:575 -542:2:576 -543:2:587 -544:2:592 -545:2:593 -546:0:1650 -547:2:605 -548:0:1650 -549:2:607 -550:0:1650 -551:2:608 -552:0:1650 -553:2:618 -554:0:1650 -555:2:622 -556:2:623 -557:2:627 -558:2:631 -559:2:632 -560:2:636 -561:2:644 -562:2:645 -563:2:650 -564:2:657 -565:2:658 -566:2:665 -567:2:670 -568:0:1650 -569:2:681 -570:0:1650 -571:2:685 -572:2:686 -573:2:690 -574:2:694 -575:2:695 -576:2:699 -577:2:707 -578:2:708 -579:2:713 -580:2:720 -581:2:721 -582:2:728 -583:2:733 -584:0:1650 -585:2:744 -586:0:1650 -587:2:752 -588:2:753 -589:2:757 -590:2:761 -591:2:762 -592:2:766 -593:2:774 -594:2:775 -595:2:780 -596:2:787 -597:2:788 -598:2:795 -599:2:800 -600:0:1650 -601:2:811 -602:0:1650 -603:2:813 -604:0:1650 -605:2:814 -606:2:818 -607:2:819 -608:2:827 -609:2:828 -610:2:832 -611:2:833 -612:2:841 -613:2:846 -614:2:850 -615:2:851 -616:2:858 -617:2:859 -618:2:870 -619:2:871 -620:2:872 -621:2:883 -622:2:888 -623:2:889 -624:0:1650 -625:2:901 -626:0:1650 -627:2:903 -628:0:1650 -629:2:906 -630:2:907 -631:2:919 -632:2:920 -633:2:924 -634:2:925 -635:2:933 -636:2:938 -637:2:942 -638:2:943 -639:2:950 -640:2:951 -641:2:962 -642:2:963 -643:2:964 -644:2:975 -645:2:980 -646:2:981 -647:0:1650 -648:2:993 -649:0:1650 -650:2:995 -651:0:1650 -652:2:996 -653:0:1650 -654:2:997 -655:0:1650 -656:2:998 -657:0:1650 -658:2:999 -659:2:1003 -660:2:1004 -661:2:1012 -662:2:1013 -663:2:1017 -664:2:1018 -665:2:1026 -666:2:1031 -667:2:1035 -668:2:1036 -669:2:1043 -670:2:1044 -671:2:1055 -672:2:1056 -673:2:1057 -674:2:1068 -675:2:1073 -676:2:1074 -677:0:1650 -678:2:1086 -679:0:1650 -680:2:1283 -681:0:1650 -682:2:1381 -683:0:1650 -684:2:1382 -685:0:1650 -686:2:1386 -687:0:1650 -688:2:1395 -689:2:1396 -690:2:1400 -691:2:1404 -692:2:1405 -693:2:1409 -694:2:1417 -695:2:1418 -696:2:1423 -697:2:1430 -698:2:1431 -699:2:1438 -700:2:1443 -701:0:1650 -702:2:1454 -703:0:1650 -704:2:1458 -705:2:1459 -706:2:1463 -707:2:1467 -708:2:1468 -709:2:1472 -710:2:1480 -711:2:1481 -712:2:1486 -713:2:1493 -714:2:1494 -715:2:1501 -716:2:1506 -717:0:1650 -718:2:1517 -719:0:1650 -720:2:1525 -721:2:1526 -722:2:1530 -723:2:1534 -724:2:1535 -725:2:1539 -726:2:1547 -727:2:1548 -728:2:1553 -729:2:1560 -730:2:1561 -731:2:1568 -732:2:1573 -733:0:1650 -734:2:1584 -735:0:1650 -736:2:1586 -737:0:1650 -738:2:1587 -739:0:1650 -740:2:423 -741:0:1650 -742:2:424 -743:2:428 -744:2:429 -745:2:437 -746:2:438 -747:2:442 -748:2:443 -749:2:451 -750:2:456 -751:2:460 -752:2:461 -753:2:468 -754:2:469 -755:2:480 -756:2:481 -757:2:482 -758:2:493 -759:2:498 -760:2:499 -761:0:1650 -762:2:511 -763:0:1650 -764:2:513 -765:2:514 -766:0:1650 -767:2:518 -768:2:522 -769:2:523 -770:2:531 -771:2:532 -772:2:536 -773:2:537 -774:2:545 -775:2:550 -776:2:551 -777:2:562 -778:2:563 -779:2:574 -780:2:575 -781:2:576 -782:2:587 -783:2:592 -784:2:593 -785:0:1650 -786:2:605 -787:0:1650 -788:2:607 -789:0:1650 -790:2:608 -791:0:1650 -792:2:618 -793:0:1650 -794:2:622 -795:2:623 -796:2:627 -797:2:631 -798:2:632 -799:2:636 -800:2:644 -801:2:645 -802:2:650 -803:2:657 -804:2:658 -805:2:665 -806:2:670 -807:0:1650 -808:2:681 -809:0:1650 -810:2:685 -811:2:686 -812:2:690 -813:2:694 -814:2:695 -815:2:699 -816:2:707 -817:2:708 -818:2:713 -819:2:720 -820:2:721 -821:2:728 -822:2:733 -823:0:1650 -824:2:744 -825:0:1650 -826:2:752 -827:2:753 -828:2:757 -829:2:761 -830:2:762 -831:2:766 -832:2:774 -833:2:775 -834:2:780 -835:2:787 -836:2:788 -837:2:795 -838:2:800 -839:0:1650 -840:2:811 -841:0:1650 -842:2:813 -843:0:1650 -844:2:814 -845:2:818 -846:2:819 -847:2:827 -848:2:828 -849:2:832 -850:2:833 -851:2:841 -852:2:846 -853:2:850 -854:2:851 -855:2:858 -856:2:859 -857:2:870 -858:2:871 -859:2:872 -860:2:883 -861:2:888 -862:2:889 -863:0:1650 -864:2:901 -865:0:1650 -866:2:903 -867:0:1650 -868:2:906 -869:2:907 -870:2:919 -871:2:920 -872:2:924 -873:2:925 -874:2:933 -875:2:938 -876:2:942 -877:2:943 -878:2:950 -879:2:951 -880:2:962 -881:2:963 -882:2:964 -883:2:975 -884:2:980 -885:2:981 -886:0:1650 -887:2:993 -888:0:1650 -889:2:995 -890:0:1650 -891:2:996 -892:0:1650 -893:2:997 -894:0:1650 -895:2:998 -896:0:1650 -897:2:999 -898:2:1003 -899:2:1004 -900:2:1012 -901:2:1013 -902:2:1017 -903:2:1018 -904:2:1026 -905:2:1031 -906:2:1035 -907:2:1036 -908:2:1043 -909:2:1044 -910:2:1055 -911:2:1056 -912:2:1057 -913:2:1068 -914:2:1073 -915:2:1074 -916:0:1650 -917:2:1086 -918:0:1650 -919:2:1283 -920:0:1650 -921:2:1381 -922:0:1650 -923:2:1382 -924:0:1650 -925:2:1386 -926:0:1650 -927:2:1395 -928:2:1396 -929:2:1400 -930:2:1404 -931:2:1405 -932:2:1409 -933:2:1417 -934:2:1418 -935:2:1423 -936:2:1430 -937:2:1431 -938:2:1438 -939:2:1443 -940:0:1650 -941:2:1454 -942:0:1650 -943:1:2 -944:0:1650 -945:1:8 -946:0:1650 -947:1:9 -948:0:1650 -949:1:10 -950:0:1650 -951:1:11 -952:0:1650 -953:1:12 -954:1:16 -955:1:17 -956:1:25 -957:1:26 -958:1:30 -959:1:31 -960:1:39 -961:1:44 -962:1:48 -963:1:49 -964:1:63 -965:1:64 -966:1:68 -967:1:69 -968:1:70 -969:1:81 -970:1:86 -971:1:87 -972:0:1650 -973:1:99 -974:0:1650 -975:1:101 -976:0:1650 -977:1:102 -978:1:106 -979:1:107 -980:1:115 -981:1:116 -982:1:120 -983:1:121 -984:1:129 -985:1:134 -986:1:138 -987:1:139 -988:1:153 -989:1:154 -990:1:158 -991:1:159 -992:1:160 -993:1:171 -994:1:176 -995:1:177 -996:0:1650 -997:1:189 -998:0:1650 -999:1:191 -1000:0:1650 -1001:1:192 -1002:0:1650 -1003:2:1458 -1004:2:1459 -1005:2:1463 -1006:2:1467 -1007:2:1468 -1008:2:1472 -1009:2:1480 -1010:2:1481 -1011:2:1486 -1012:2:1493 -1013:2:1494 -1014:2:1501 -1015:2:1506 -1016:0:1650 -1017:2:1517 -1018:0:1650 -1019:2:1525 -1020:2:1526 -1021:2:1530 -1022:2:1534 -1023:2:1535 -1024:2:1539 -1025:2:1547 -1026:2:1548 -1027:2:1553 -1028:2:1560 -1029:2:1561 -1030:2:1568 -1031:2:1573 -1032:0:1650 -1033:2:1584 -1034:0:1650 -1035:2:1586 -1036:0:1650 -1037:2:1587 -1038:0:1650 -1039:2:423 -1040:0:1650 -1041:2:424 -1042:2:428 -1043:2:429 -1044:2:437 -1045:2:438 -1046:2:442 -1047:2:443 -1048:2:451 -1049:2:456 -1050:2:460 -1051:2:461 -1052:2:468 -1053:2:469 -1054:2:480 -1055:2:481 -1056:2:482 -1057:2:493 -1058:2:498 -1059:2:499 -1060:0:1650 -1061:2:511 -1062:0:1650 -1063:2:513 -1064:2:514 -1065:0:1650 -1066:2:518 -1067:2:522 -1068:2:523 -1069:2:531 -1070:2:532 -1071:2:536 -1072:2:537 -1073:2:545 -1074:2:550 -1075:2:551 -1076:2:562 -1077:2:563 -1078:2:574 -1079:2:575 -1080:2:576 -1081:2:587 -1082:2:592 -1083:2:593 -1084:0:1650 -1085:2:605 -1086:0:1650 -1087:2:607 -1088:0:1650 -1089:2:608 -1090:0:1650 -1091:2:618 -1092:0:1650 -1093:2:622 -1094:2:623 -1095:2:627 -1096:2:631 -1097:2:632 -1098:2:636 -1099:2:644 -1100:2:645 -1101:2:650 -1102:2:657 -1103:2:658 -1104:2:665 -1105:2:670 -1106:0:1650 -1107:2:681 -1108:0:1650 -1109:1:193 -1110:1:197 -1111:1:198 -1112:1:206 -1113:1:207 -1114:1:211 -1115:1:212 -1116:1:220 -1117:1:225 -1118:1:229 -1119:1:230 -1120:1:237 -1121:1:238 -1122:1:249 -1123:1:250 -1124:1:251 -1125:1:262 -1126:1:274 -1127:1:275 -1128:0:1650 -1129:1:280 -1130:0:1650 -1131:1:282 -1132:0:1650 -1133:1:291 -1134:0:1650 -1135:1:293 -1136:0:1650 -1137:1:11 -1138:0:1650 -1139:1:12 -1140:1:16 -1141:1:17 -1142:1:25 -1143:1:26 -1144:1:27 -1145:1:39 -1146:1:44 -1147:1:48 -1148:1:49 -1149:1:56 -1150:1:57 -1151:1:68 -1152:1:69 -1153:1:70 -1154:1:81 -1155:1:93 -1156:1:94 -1157:0:1650 -1158:1:99 -1159:0:1650 -1160:1:101 -1161:0:1650 -1162:1:102 -1163:1:106 -1164:1:107 -1165:1:115 -1166:1:116 -1167:1:120 -1168:1:121 -1169:1:129 -1170:1:134 -1171:1:138 -1172:1:139 -1173:1:146 -1174:1:147 -1175:1:158 -1176:1:159 -1177:1:160 -1178:1:171 -1179:1:183 -1180:1:184 -1181:0:1650 -1182:1:189 -1183:0:1650 -1184:1:285 -1185:0:1650 -1186:1:286 -1187:0:1650 -1188:1:291 -1189:0:1650 -1190:1:293 -1191:0:1650 -1192:1:296 -1193:0:1650 -1194:1:301 -1195:0:1650 -1196:2:685 -1197:2:686 -1198:2:690 -1199:2:691 -1200:2:699 -1201:2:707 -1202:2:708 -1203:2:713 -1204:2:720 -1205:2:721 -1206:2:728 -1207:2:733 -1208:0:1650 -1209:2:744 -1210:0:1650 -1211:2:752 -1212:2:753 -1213:2:757 -1214:2:761 -1215:2:762 -1216:2:766 -1217:2:774 -1218:2:775 -1219:2:780 -1220:2:787 -1221:2:788 -1222:2:795 -1223:2:800 -1224:0:1650 -1225:2:811 -1226:0:1650 -1227:2:813 -1228:0:1650 -1229:2:814 -1230:2:818 -1231:2:819 -1232:2:827 -1233:2:828 -1234:2:832 -1235:2:833 -1236:2:841 -1237:2:846 -1238:2:850 -1239:2:851 -1240:2:858 -1241:2:859 -1242:2:870 -1243:2:871 -1244:2:872 -1245:2:883 -1246:2:888 -1247:2:889 -1248:0:1650 -1249:2:901 -1250:0:1650 -1251:2:903 -1252:0:1650 -1253:2:906 -1254:2:907 -1255:2:919 -1256:2:920 -1257:2:924 -1258:2:925 -1259:2:933 -1260:2:938 -1261:2:942 -1262:2:943 -1263:2:950 -1264:2:951 -1265:2:962 -1266:2:963 -1267:2:964 -1268:2:975 -1269:2:980 -1270:2:981 -1271:0:1650 -1272:2:993 -1273:0:1650 -1274:2:995 -1275:0:1650 -1276:2:996 -1277:0:1650 -1278:2:997 -1279:0:1650 -1280:2:998 -1281:0:1650 -1282:2:999 -1283:2:1003 -1284:2:1004 -1285:2:1012 -1286:2:1013 -1287:2:1017 -1288:2:1018 -1289:2:1026 -1290:2:1031 -1291:2:1035 -1292:2:1036 -1293:2:1043 -1294:2:1044 -1295:2:1055 -1296:2:1056 -1297:2:1057 -1298:2:1068 -1299:2:1073 -1300:2:1074 -1301:0:1650 -1302:2:1086 -1303:0:1650 -1304:2:1283 -1305:0:1650 -1306:2:1381 -1307:0:1650 -1308:2:1382 -1309:0:1650 -1310:2:1386 -1311:0:1650 -1312:2:1395 -1313:2:1396 -1314:2:1400 -1315:2:1404 -1316:2:1405 -1317:2:1409 -1318:2:1417 -1319:2:1418 -1320:2:1423 -1321:2:1430 -1322:2:1431 -1323:2:1438 -1324:2:1443 -1325:0:1650 -1326:2:1454 -1327:0:1650 -1328:2:1458 -1329:2:1459 -1330:2:1463 -1331:2:1467 -1332:2:1468 -1333:2:1472 -1334:2:1480 -1335:2:1481 -1336:2:1486 -1337:2:1493 -1338:2:1494 -1339:2:1501 -1340:2:1506 -1341:0:1650 -1342:2:1517 -1343:0:1650 -1344:2:1525 -1345:2:1526 -1346:2:1530 -1347:2:1534 -1348:2:1535 -1349:2:1539 -1350:2:1547 -1351:2:1548 -1352:2:1553 -1353:2:1560 -1354:2:1561 -1355:2:1568 -1356:2:1573 -1357:0:1650 -1358:2:1584 -1359:0:1650 -1360:2:1586 -1361:0:1650 -1362:2:1587 -1363:0:1650 -1364:2:1590 -1365:0:1650 -1366:2:1595 -1367:0:1650 -1368:1:302 -1369:0:1648 -1370:2:1596 -1371:0:1654 -1372:0:1650 diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress.ltl b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_reader.define b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_reader.log b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_reader.log deleted file mode 100644 index 9e98b9f..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_reader.log +++ /dev/null @@ -1,275 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_reader.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -depth 15: Claim reached state 9 (line 749) -depth 1767: Claim reached state 9 (line 748) -Depth= 3880 States= 1e+06 Transitions= 1.71e+07 Memory= 499.651 t= 14.5 R= 7e+04 -Depth= 3880 States= 2e+06 Transitions= 3.79e+07 Memory= 532.365 t= 32.3 R= 6e+04 -Depth= 3880 States= 3e+06 Transitions= 5.83e+07 Memory= 564.983 t= 50.2 R= 6e+04 -pan: resizing hashtable to -w22.. done -Depth= 3880 States= 4e+06 Transitions= 7.76e+07 Memory= 629.307 t= 67 R= 6e+04 -Depth= 3880 States= 5e+06 Transitions= 9.78e+07 Memory= 662.315 t= 84.2 R= 6e+04 -Depth= 3880 States= 6e+06 Transitions= 1.19e+08 Memory= 694.736 t= 102 R= 6e+04 -Depth= 3880 States= 7e+06 Transitions= 1.38e+08 Memory= 727.842 t= 119 R= 6e+04 -Depth= 3880 States= 8e+06 Transitions= 1.59e+08 Memory= 760.752 t= 137 R= 6e+04 -Depth= 3880 States= 9e+06 Transitions= 1.79e+08 Memory= 793.174 t= 155 R= 6e+04 -pan: resizing hashtable to -w24.. done -Depth= 3880 States= 1e+07 Transitions= 1.98e+08 Memory= 950.568 t= 172 R= 6e+04 -Depth= 3880 States= 1.1e+07 Transitions= 2.19e+08 Memory= 983.479 t= 189 R= 6e+04 -Depth= 3880 States= 1.2e+07 Transitions= 2.4e+08 Memory= 1015.901 t= 207 R= 6e+04 -Depth= 3880 States= 1.3e+07 Transitions= 2.58e+08 Memory= 1049.397 t= 223 R= 6e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 3880, errors: 0 - 7197860 states, stored (1.33457e+07 visited) -2.5266654e+08 states, matched -2.6601223e+08 transitions (= visited+matched) -9.9067284e+08 atomic steps -hash conflicts: 87783920 (resolved) - -Stats on memory usage (in Megabytes): - 576.611 equivalent memory usage for states (stored*(State-vector + overhead)) - 474.839 actual memory usage for states (compression: 82.35%) - state-vector as stored = 41 byte + 28 byte overhead - 128.000 memory used for hash table (-w24) - 457.764 memory used for DFS stack (-m10000000) - 1060.529 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 151, "(1)" - line 418, "pan.___", state 181, "(1)" - line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 242, "(1)" - line 418, "pan.___", state 272, "(1)" - line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 360, "(1)" - line 418, "pan.___", state 390, "(1)" - line 540, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 59, "(1)" - line 413, "pan.___", state 72, "(1)" - line 418, "pan.___", state 89, "(1)" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 240, "(1)" - line 164, "pan.___", state 248, "(1)" - line 168, "pan.___", state 260, "(1)" - line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 927, "(1)" - line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 928, "else" - line 409, "pan.___", state 931, "(1)" - line 409, "pan.___", state 932, "(1)" - line 409, "pan.___", state 932, "(1)" - line 413, "pan.___", state 940, "(1)" - line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 941, "else" - line 413, "pan.___", state 944, "(1)" - line 413, "pan.___", state 945, "(1)" - line 413, "pan.___", state 945, "(1)" - line 411, "pan.___", state 950, "((i<1))" - line 411, "pan.___", state 950, "((i>=1))" - line 418, "pan.___", state 957, "(1)" - line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 958, "else" - line 418, "pan.___", state 961, "(1)" - line 418, "pan.___", state 962, "(1)" - line 418, "pan.___", state 962, "(1)" - line 420, "pan.___", state 965, "(1)" - line 420, "pan.___", state 965, "(1)" - line 403, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1040, "(1)" - line 418, "pan.___", state 1057, "(1)" - line 403, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1130, "(1)" - line 418, "pan.___", state 1147, "(1)" - line 399, "pan.___", state 1166, "(1)" - line 403, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1222, "(1)" - line 418, "pan.___", state 1239, "(1)" - line 403, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1315, "(1)" - line 418, "pan.___", state 1332, "(1)" - line 179, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 1378, "(1)" - line 164, "pan.___", state 1386, "(1)" - line 168, "pan.___", state 1398, "(1)" - line 175, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1595, "(1)" - line 409, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 1596, "else" - line 409, "pan.___", state 1599, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 413, "pan.___", state 1608, "(1)" - line 413, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 1609, "else" - line 413, "pan.___", state 1612, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 411, "pan.___", state 1618, "((i<1))" - line 411, "pan.___", state 1618, "((i>=1))" - line 418, "pan.___", state 1625, "(1)" - line 418, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 1626, "else" - line 418, "pan.___", state 1629, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 179, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 1681, "(1)" - line 164, "pan.___", state 1689, "(1)" - line 168, "pan.___", state 1701, "(1)" - line 175, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_reader.spin.input.trail b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_reader.spin.input.trail deleted file mode 100644 index 7c42af1..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_reader.spin.input.trail +++ /dev/null @@ -1,1270 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4401 -2:4:4353 -3:4:4356 -4:4:4356 -5:4:4359 -6:4:4367 -7:4:4367 -8:4:4370 -9:4:4376 -10:4:4380 -11:4:4380 -12:4:4383 -13:4:4391 -14:4:4395 -15:4:4396 -16:0:4401 -17:4:4398 -18:0:4401 -19:3:2479 -20:0:4401 -21:3:2485 -22:0:4401 -23:3:2486 -24:0:4401 -25:3:2487 -26:3:2491 -27:3:2492 -28:3:2500 -29:3:2501 -30:3:2505 -31:3:2506 -32:3:2514 -33:3:2519 -34:3:2523 -35:3:2524 -36:3:2531 -37:3:2532 -38:3:2543 -39:3:2544 -40:3:2545 -41:3:2556 -42:3:2561 -43:3:2562 -44:0:4401 -45:3:2574 -46:0:4401 -47:3:2576 -48:3:2577 -49:0:4401 -50:3:2581 -51:3:2585 -52:3:2586 -53:3:2594 -54:3:2595 -55:3:2599 -56:3:2600 -57:3:2608 -58:3:2613 -59:3:2614 -60:3:2625 -61:3:2626 -62:3:2637 -63:3:2638 -64:3:2639 -65:3:2650 -66:3:2655 -67:3:2656 -68:0:4401 -69:3:2668 -70:0:4401 -71:3:2670 -72:0:4401 -73:3:2671 -74:0:4401 -75:3:2681 -76:0:4401 -77:3:2682 -78:0:4401 -79:3:2686 -80:3:2687 -81:3:2691 -82:3:2695 -83:3:2696 -84:3:2700 -85:3:2708 -86:3:2709 -87:3:2714 -88:3:2721 -89:3:2722 -90:3:2729 -91:3:2734 -92:0:4401 -93:3:2745 -94:0:4401 -95:3:2749 -96:3:2750 -97:3:2754 -98:3:2758 -99:3:2759 -100:3:2763 -101:3:2771 -102:3:2772 -103:3:2777 -104:3:2784 -105:3:2785 -106:3:2792 -107:3:2797 -108:0:4401 -109:3:2808 -110:0:4401 -111:3:2816 -112:3:2817 -113:3:2821 -114:3:2825 -115:3:2826 -116:3:2830 -117:3:2838 -118:3:2839 -119:3:2844 -120:3:2851 -121:3:2852 -122:3:2859 -123:3:2864 -124:0:4401 -125:3:2879 -126:0:4401 -127:3:2881 -128:0:4401 -129:3:2882 -130:3:2886 -131:3:2887 -132:3:2895 -133:3:2896 -134:3:2900 -135:3:2901 -136:3:2909 -137:3:2914 -138:3:2918 -139:3:2919 -140:3:2926 -141:3:2927 -142:3:2938 -143:3:2939 -144:3:2940 -145:3:2951 -146:3:2956 -147:3:2957 -148:0:4401 -149:3:2969 -150:0:4401 -151:3:2971 -152:0:4401 -153:3:2974 -154:3:2975 -155:3:2987 -156:3:2988 -157:3:2992 -158:3:2993 -159:3:3001 -160:3:3006 -161:3:3010 -162:3:3011 -163:3:3018 -164:3:3019 -165:3:3030 -166:3:3031 -167:3:3032 -168:3:3043 -169:3:3048 -170:3:3049 -171:0:4401 -172:3:3061 -173:0:4401 -174:3:3063 -175:0:4401 -176:3:3064 -177:0:4401 -178:3:3065 -179:0:4401 -180:3:3066 -181:0:4401 -182:3:3067 -183:3:3071 -184:3:3072 -185:3:3080 -186:3:3081 -187:3:3085 -188:3:3086 -189:3:3094 -190:3:3099 -191:3:3103 -192:3:3104 -193:3:3111 -194:3:3112 -195:3:3123 -196:3:3124 -197:3:3125 -198:3:3136 -199:3:3141 -200:3:3142 -201:0:4401 -202:3:3154 -203:0:4401 -204:3:3356 -205:0:4401 -206:3:3454 -207:0:4401 -208:3:3455 -209:0:4401 -210:3:3459 -211:0:4401 -212:3:3465 -213:3:3469 -214:3:3470 -215:3:3478 -216:3:3479 -217:3:3483 -218:3:3484 -219:3:3492 -220:3:3497 -221:3:3501 -222:3:3502 -223:3:3509 -224:3:3510 -225:3:3521 -226:3:3522 -227:3:3523 -228:3:3534 -229:3:3539 -230:3:3540 -231:0:4401 -232:3:3552 -233:0:4401 -234:3:3554 -235:0:4401 -236:3:3555 -237:3:3559 -238:3:3560 -239:3:3568 -240:3:3569 -241:3:3573 -242:3:3574 -243:3:3582 -244:3:3587 -245:3:3591 -246:3:3592 -247:3:3599 -248:3:3600 -249:3:3611 -250:3:3612 -251:3:3613 -252:3:3624 -253:3:3629 -254:3:3630 -255:0:4401 -256:3:3642 -257:0:4401 -258:3:3644 -259:0:4401 -260:3:3647 -261:3:3648 -262:3:3660 -263:3:3661 -264:3:3665 -265:3:3666 -266:3:3674 -267:3:3679 -268:3:3683 -269:3:3684 -270:3:3691 -271:3:3692 -272:3:3703 -273:3:3704 -274:3:3705 -275:3:3716 -276:3:3721 -277:3:3722 -278:0:4401 -279:3:3734 -280:0:4401 -281:3:3736 -282:0:4401 -283:3:3737 -284:0:4401 -285:3:3738 -286:0:4401 -287:3:3739 -288:0:4401 -289:3:3740 -290:3:3744 -291:3:3745 -292:3:3753 -293:3:3754 -294:3:3758 -295:3:3759 -296:3:3767 -297:3:3772 -298:3:3776 -299:3:3777 -300:3:3784 -301:3:3785 -302:3:3796 -303:3:3797 -304:3:3798 -305:3:3809 -306:3:3814 -307:3:3815 -308:0:4401 -309:3:3827 -310:0:4401 -311:3:4029 -312:0:4401 -313:3:4127 -314:0:4401 -315:3:4128 -316:0:4401 -317:3:4132 -318:0:4401 -319:3:4138 -320:0:4401 -321:3:4142 -322:3:4143 -323:3:4147 -324:3:4151 -325:3:4152 -326:3:4156 -327:3:4164 -328:3:4165 -329:3:4170 -330:3:4177 -331:3:4178 -332:3:4185 -333:3:4190 -334:0:4401 -335:3:4201 -336:0:4401 -337:3:4205 -338:3:4206 -339:3:4210 -340:3:4214 -341:3:4215 -342:3:4219 -343:3:4227 -344:3:4228 -345:3:4233 -346:3:4240 -347:3:4241 -348:3:4248 -349:3:4253 -350:0:4401 -351:3:4264 -352:0:4401 -353:3:4272 -354:3:4273 -355:3:4277 -356:3:4281 -357:3:4282 -358:3:4286 -359:3:4294 -360:3:4295 -361:3:4300 -362:3:4307 -363:3:4308 -364:3:4315 -365:3:4320 -366:0:4401 -367:3:4335 -368:0:4401 -369:3:4337 -370:0:4401 -371:3:4338 -372:0:4401 -373:3:2486 -374:0:4401 -375:3:2487 -376:3:2491 -377:3:2492 -378:3:2500 -379:3:2501 -380:3:2505 -381:3:2506 -382:3:2514 -383:3:2519 -384:3:2523 -385:3:2524 -386:3:2531 -387:3:2532 -388:3:2543 -389:3:2544 -390:3:2545 -391:3:2556 -392:3:2561 -393:3:2562 -394:0:4401 -395:3:2574 -396:0:4401 -397:3:2576 -398:3:2577 -399:0:4401 -400:3:2581 -401:3:2585 -402:3:2586 -403:3:2594 -404:3:2595 -405:3:2599 -406:3:2600 -407:3:2608 -408:3:2613 -409:3:2614 -410:3:2625 -411:3:2626 -412:3:2637 -413:3:2638 -414:3:2639 -415:3:2650 -416:3:2655 -417:3:2656 -418:0:4401 -419:3:2668 -420:0:4401 -421:3:2670 -422:0:4401 -423:3:2671 -424:0:4401 -425:3:2681 -426:0:4401 -427:3:2682 -428:0:4401 -429:3:2686 -430:3:2687 -431:3:2691 -432:3:2695 -433:3:2696 -434:3:2700 -435:3:2708 -436:3:2709 -437:3:2714 -438:3:2721 -439:3:2722 -440:3:2729 -441:3:2734 -442:0:4401 -443:3:2745 -444:0:4401 -445:3:2749 -446:3:2750 -447:3:2754 -448:3:2758 -449:3:2759 -450:3:2763 -451:3:2771 -452:3:2772 -453:3:2777 -454:3:2784 -455:3:2785 -456:3:2792 -457:3:2797 -458:0:4401 -459:3:2808 -460:0:4401 -461:3:2816 -462:3:2817 -463:3:2821 -464:3:2825 -465:3:2826 -466:3:2830 -467:3:2838 -468:3:2839 -469:3:2844 -470:3:2851 -471:3:2852 -472:3:2859 -473:3:2864 -474:0:4401 -475:3:2879 -476:0:4401 -477:3:2881 -478:0:4401 -479:3:2882 -480:3:2886 -481:3:2887 -482:3:2895 -483:3:2896 -484:3:2900 -485:3:2901 -486:3:2909 -487:3:2914 -488:3:2918 -489:3:2919 -490:3:2926 -491:3:2927 -492:3:2938 -493:3:2939 -494:3:2940 -495:3:2951 -496:3:2956 -497:3:2957 -498:0:4401 -499:3:2969 -500:0:4401 -501:3:2971 -502:0:4401 -503:3:2974 -504:3:2975 -505:3:2987 -506:3:2988 -507:3:2992 -508:3:2993 -509:3:3001 -510:3:3006 -511:3:3010 -512:3:3011 -513:3:3018 -514:3:3019 -515:3:3030 -516:3:3031 -517:3:3032 -518:3:3043 -519:3:3048 -520:3:3049 -521:0:4401 -522:3:3061 -523:0:4401 -524:3:3063 -525:0:4401 -526:3:3064 -527:0:4401 -528:3:3065 -529:0:4401 -530:3:3066 -531:0:4401 -532:3:3067 -533:3:3071 -534:3:3072 -535:3:3080 -536:3:3081 -537:3:3085 -538:3:3086 -539:3:3094 -540:3:3099 -541:3:3103 -542:3:3104 -543:3:3111 -544:3:3112 -545:3:3123 -546:3:3124 -547:3:3125 -548:3:3136 -549:3:3141 -550:3:3142 -551:0:4401 -552:3:3154 -553:0:4401 -554:3:3356 -555:0:4401 -556:3:3454 -557:0:4401 -558:3:3455 -559:0:4401 -560:3:3459 -561:0:4401 -562:3:3465 -563:3:3469 -564:3:3470 -565:3:3478 -566:3:3479 -567:3:3483 -568:3:3484 -569:3:3492 -570:3:3497 -571:3:3501 -572:3:3502 -573:3:3509 -574:3:3510 -575:3:3521 -576:3:3522 -577:3:3523 -578:3:3534 -579:3:3539 -580:3:3540 -581:0:4401 -582:3:3552 -583:0:4401 -584:3:3554 -585:0:4401 -586:3:3555 -587:3:3559 -588:3:3560 -589:3:3568 -590:3:3569 -591:3:3573 -592:3:3574 -593:3:3582 -594:3:3587 -595:3:3591 -596:3:3592 -597:3:3599 -598:3:3600 -599:3:3611 -600:3:3612 -601:3:3613 -602:3:3624 -603:3:3629 -604:3:3630 -605:0:4401 -606:3:3642 -607:0:4401 -608:3:3644 -609:0:4401 -610:3:3647 -611:3:3648 -612:3:3660 -613:3:3661 -614:3:3665 -615:3:3666 -616:3:3674 -617:3:3679 -618:3:3683 -619:3:3684 -620:3:3691 -621:3:3692 -622:3:3703 -623:3:3704 -624:3:3705 -625:3:3716 -626:3:3721 -627:3:3722 -628:0:4401 -629:3:3734 -630:0:4401 -631:3:3736 -632:0:4401 -633:3:3737 -634:0:4401 -635:3:3738 -636:0:4401 -637:3:3739 -638:0:4401 -639:3:3740 -640:3:3744 -641:3:3745 -642:3:3753 -643:3:3754 -644:3:3758 -645:3:3759 -646:3:3767 -647:3:3772 -648:3:3776 -649:3:3777 -650:3:3784 -651:3:3785 -652:3:3796 -653:3:3797 -654:3:3798 -655:3:3809 -656:3:3814 -657:3:3815 -658:0:4401 -659:3:3827 -660:0:4401 -661:3:4029 -662:0:4401 -663:3:4127 -664:0:4401 -665:3:4128 -666:0:4401 -667:3:4132 -668:0:4401 -669:3:4138 -670:0:4401 -671:3:4142 -672:3:4143 -673:3:4147 -674:3:4151 -675:3:4152 -676:3:4156 -677:3:4164 -678:3:4165 -679:3:4170 -680:3:4177 -681:3:4178 -682:3:4185 -683:3:4190 -684:0:4401 -685:3:4201 -686:0:4401 -687:3:4205 -688:3:4206 -689:3:4210 -690:3:4214 -691:3:4215 -692:3:4219 -693:3:4227 -694:3:4228 -695:3:4233 -696:3:4240 -697:3:4241 -698:3:4248 -699:3:4253 -700:0:4401 -701:3:4264 -702:0:4401 -703:3:4272 -704:3:4273 -705:3:4277 -706:3:4281 -707:3:4282 -708:3:4286 -709:3:4294 -710:3:4295 -711:3:4300 -712:3:4307 -713:3:4308 -714:3:4315 -715:3:4320 -716:0:4401 -717:3:4335 -718:0:4401 -719:3:4337 -720:0:4401 -721:3:4338 -722:0:4401 -723:3:2486 -724:0:4401 -725:3:2487 -726:3:2491 -727:3:2492 -728:3:2500 -729:3:2501 -730:3:2505 -731:3:2506 -732:3:2514 -733:3:2519 -734:3:2523 -735:3:2524 -736:3:2531 -737:3:2532 -738:3:2543 -739:3:2544 -740:3:2545 -741:3:2556 -742:3:2561 -743:3:2562 -744:0:4401 -745:3:2574 -746:0:4401 -747:3:2576 -748:3:2577 -749:0:4401 -750:3:2581 -751:3:2585 -752:3:2586 -753:3:2594 -754:3:2595 -755:3:2599 -756:3:2600 -757:3:2608 -758:3:2613 -759:3:2614 -760:3:2625 -761:3:2626 -762:3:2637 -763:3:2638 -764:3:2639 -765:3:2650 -766:3:2655 -767:3:2656 -768:0:4401 -769:3:2668 -770:0:4401 -771:3:2670 -772:0:4401 -773:3:2671 -774:0:4401 -775:3:2681 -776:0:4401 -777:3:2682 -778:0:4401 -779:3:2686 -780:3:2687 -781:3:2691 -782:3:2695 -783:3:2696 -784:3:2700 -785:3:2708 -786:3:2709 -787:3:2714 -788:3:2721 -789:3:2722 -790:3:2729 -791:3:2734 -792:0:4401 -793:3:2745 -794:0:4401 -795:3:2749 -796:3:2750 -797:3:2754 -798:3:2758 -799:3:2759 -800:3:2763 -801:3:2771 -802:3:2772 -803:3:2777 -804:3:2784 -805:3:2785 -806:3:2792 -807:3:2797 -808:0:4401 -809:3:2808 -810:0:4401 -811:3:2816 -812:3:2817 -813:3:2821 -814:3:2825 -815:3:2826 -816:3:2830 -817:3:2838 -818:3:2839 -819:3:2844 -820:3:2851 -821:3:2852 -822:3:2859 -823:3:2864 -824:0:4401 -825:3:2879 -826:0:4401 -827:3:2881 -828:0:4401 -829:3:2882 -830:3:2886 -831:3:2887 -832:3:2895 -833:3:2896 -834:3:2900 -835:3:2901 -836:3:2909 -837:3:2914 -838:3:2918 -839:3:2919 -840:3:2926 -841:3:2927 -842:3:2938 -843:3:2939 -844:3:2940 -845:3:2951 -846:3:2956 -847:3:2957 -848:0:4401 -849:3:2969 -850:0:4401 -851:3:2971 -852:0:4401 -853:3:2974 -854:3:2975 -855:3:2987 -856:3:2988 -857:3:2992 -858:3:2993 -859:3:3001 -860:3:3006 -861:3:3010 -862:3:3011 -863:3:3018 -864:3:3019 -865:3:3030 -866:3:3031 -867:3:3032 -868:3:3043 -869:3:3048 -870:3:3049 -871:0:4401 -872:3:3061 -873:0:4401 -874:3:3063 -875:0:4401 -876:3:3064 -877:0:4401 -878:3:3065 -879:0:4401 -880:3:3066 -881:0:4401 -882:3:3067 -883:3:3071 -884:3:3072 -885:3:3080 -886:3:3081 -887:3:3085 -888:3:3086 -889:3:3094 -890:3:3099 -891:3:3103 -892:3:3104 -893:3:3111 -894:3:3112 -895:3:3123 -896:3:3124 -897:3:3125 -898:3:3136 -899:3:3141 -900:3:3142 -901:0:4401 -902:3:3154 -903:0:4401 -904:3:3356 -905:0:4401 -906:3:3454 -907:0:4401 -908:3:3455 -909:0:4401 -910:3:3459 -911:0:4401 -912:3:3465 -913:3:3469 -914:3:3470 -915:3:3478 -916:3:3479 -917:3:3483 -918:3:3484 -919:3:3492 -920:3:3497 -921:3:3501 -922:3:3502 -923:3:3509 -924:3:3510 -925:3:3521 -926:3:3522 -927:3:3523 -928:3:3534 -929:3:3539 -930:3:3540 -931:0:4401 -932:3:3552 -933:0:4401 -934:3:3554 -935:0:4401 -936:3:3555 -937:3:3559 -938:3:3560 -939:3:3568 -940:3:3569 -941:3:3573 -942:3:3574 -943:3:3582 -944:3:3587 -945:3:3591 -946:3:3592 -947:3:3599 -948:3:3600 -949:3:3611 -950:3:3612 -951:3:3613 -952:3:3624 -953:3:3629 -954:3:3630 -955:0:4401 -956:3:3642 -957:0:4401 -958:3:3644 -959:0:4401 -960:3:3647 -961:3:3648 -962:3:3660 -963:3:3661 -964:3:3665 -965:3:3666 -966:3:3674 -967:3:3679 -968:3:3683 -969:3:3684 -970:3:3691 -971:3:3692 -972:3:3703 -973:3:3704 -974:3:3705 -975:3:3716 -976:3:3721 -977:3:3722 -978:0:4401 -979:3:3734 -980:0:4401 -981:3:3736 -982:0:4401 -983:3:3737 -984:0:4401 -985:3:3738 -986:0:4401 -987:3:3739 -988:0:4401 -989:3:3740 -990:3:3744 -991:3:3745 -992:3:3753 -993:3:3754 -994:3:3758 -995:3:3759 -996:3:3767 -997:3:3772 -998:3:3776 -999:3:3777 -1000:3:3784 -1001:3:3785 -1002:3:3796 -1003:3:3797 -1004:3:3798 -1005:3:3809 -1006:3:3814 -1007:3:3815 -1008:0:4401 -1009:3:3827 -1010:0:4401 -1011:3:4029 -1012:0:4401 -1013:3:4127 -1014:0:4401 -1015:3:4128 -1016:0:4401 -1017:3:4132 -1018:0:4401 -1019:3:4138 -1020:0:4401 -1021:3:4142 -1022:3:4143 -1023:3:4147 -1024:3:4151 -1025:3:4152 -1026:3:4156 -1027:3:4164 -1028:3:4165 -1029:3:4170 -1030:3:4177 -1031:3:4178 -1032:3:4185 -1033:3:4190 -1034:0:4401 -1035:3:4201 -1036:0:4401 -1037:3:4205 -1038:3:4206 -1039:3:4210 -1040:3:4214 -1041:3:4215 -1042:3:4219 -1043:3:4227 -1044:3:4228 -1045:3:4233 -1046:3:4240 -1047:3:4241 -1048:3:4248 -1049:3:4253 -1050:0:4401 -1051:3:4264 -1052:0:4401 -1053:3:4272 -1054:3:4273 -1055:3:4277 -1056:3:4281 -1057:3:4282 -1058:3:4286 -1059:3:4294 -1060:3:4295 -1061:3:4300 -1062:3:4307 -1063:3:4308 -1064:3:4315 -1065:3:4320 -1066:0:4401 -1067:3:4335 -1068:0:4401 -1069:3:4337 -1070:0:4401 -1071:3:4338 -1072:0:4401 -1073:3:4341 -1074:0:4401 -1075:3:4346 -1076:0:4401 -1077:2:1236 -1078:0:4401 -1079:3:4347 -1080:0:4401 -1081:2:1242 -1082:0:4401 -1083:3:4346 -1084:0:4401 -1085:2:1243 -1086:0:4401 -1087:3:4347 -1088:0:4401 -1089:2:1244 -1090:0:4401 -1091:3:4346 -1092:0:4401 -1093:2:1245 -1094:0:4401 -1095:3:4347 -1096:0:4401 -1097:1:2 -1098:0:4401 -1099:3:4346 -1100:0:4401 -1101:2:1246 -1102:0:4401 -1103:3:4347 -1104:0:4401 -1105:1:8 -1106:0:4401 -1107:3:4346 -1108:0:4401 -1109:2:1245 -1110:0:4401 -1111:3:4347 -1112:0:4401 -1113:1:9 -1114:0:4401 -1115:3:4346 -1116:0:4401 -1117:2:1246 -1118:0:4401 -1119:3:4347 -1120:0:4401 -1121:1:10 -1122:0:4401 -1123:3:4346 -1124:0:4401 -1125:2:1245 -1126:0:4401 -1127:3:4347 -1128:0:4401 -1129:1:11 -1130:0:4401 -1131:3:4346 -1132:0:4401 -1133:2:1246 -1134:0:4401 -1135:3:4347 -1136:0:4401 -1137:1:14 -1138:0:4401 -1139:3:4346 -1140:0:4401 -1141:2:1245 -1142:0:4401 -1143:3:4347 -1144:0:4401 -1145:1:15 -1146:0:4401 -1147:3:4346 -1148:0:4401 -1149:2:1246 -1150:0:4401 -1151:3:4347 -1152:0:4401 -1153:1:16 -1154:1:20 -1155:1:21 -1156:1:29 -1157:1:30 -1158:1:34 -1159:1:35 -1160:1:43 -1161:1:48 -1162:1:52 -1163:1:53 -1164:1:60 -1165:1:61 -1166:1:72 -1167:1:73 -1168:1:74 -1169:1:85 -1170:1:90 -1171:1:91 -1172:0:4401 -1173:3:4346 -1174:0:4401 -1175:2:1245 -1176:0:4401 -1177:3:4347 -1178:0:4401 -1179:1:103 -1180:0:4401 -1181:3:4346 -1182:0:4401 -1183:2:1246 -1184:0:4401 -1185:3:4347 -1186:0:4401 -1187:2:1247 -1188:0:4401 -1189:3:4346 -1190:0:4401 -1191:2:1253 -1192:0:4401 -1193:3:4347 -1194:0:4401 -1195:2:1254 -1196:0:4399 -1197:3:4346 -1198:0:4405 -1199:3:4347 -1200:0:4405 -1201:2:1257 -1202:0:4405 -1203:3:4346 -1204:0:4405 -1205:2:1258 -1206:0:4405 -1207:3:4347 -1208:0:4405 -1209:2:1259 -1210:2:1263 -1211:2:1264 -1212:2:1272 -1213:2:1273 -1214:2:1277 -1215:2:1278 -1216:2:1286 -1217:2:1291 -1218:2:1295 -1219:2:1296 -1220:2:1303 -1221:2:1304 -1222:2:1315 -1223:2:1316 -1224:2:1317 -1225:2:1328 -1226:2:1333 -1227:2:1334 -1228:0:4405 -1229:3:4346 -1230:0:4405 -1231:2:1346 -1232:0:4405 -1233:3:4347 -1234:0:4405 -1235:2:1347 -1236:0:4405 -1237:3:4346 -1238:0:4405 -1239:1:104 --1:-1:-1 -1240:0:4405 -1241:3:4347 -1242:0:4405 -1243:3:4346 -1244:0:4405 -1245:2:1348 -1246:0:4405 -1247:3:4347 -1248:0:4405 -1249:2:1347 -1250:0:4405 -1251:3:4346 -1252:0:4405 -1253:1:105 -1254:0:4405 -1255:3:4347 -1256:0:4405 -1257:3:4346 -1258:0:4405 -1259:2:1348 -1260:0:4405 -1261:3:4347 -1262:0:4405 -1263:2:1347 -1264:0:4405 -1265:3:4346 -1266:0:4405 -1267:1:104 diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer.define b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer.log b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer.log deleted file mode 100644 index 434151a..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer.log +++ /dev/null @@ -1,275 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -depth 15: Claim reached state 9 (line 749) -depth 291: Claim reached state 9 (line 748) -Depth= 2677 States= 1e+06 Transitions= 1.57e+07 Memory= 487.932 t= 13.4 R= 7e+04 -Depth= 3023 States= 2e+06 Transitions= 3.19e+07 Memory= 509.709 t= 27.3 R= 7e+04 -Depth= 3610 States= 3e+06 Transitions= 4.84e+07 Memory= 531.486 t= 41.6 R= 7e+04 -pan: resizing hashtable to -w22.. done -Depth= 3956 States= 4e+06 Transitions= 6.63e+07 Memory= 595.029 t= 57 R= 7e+04 -Depth= 3956 States= 5e+06 Transitions= 8.67e+07 Memory= 617.783 t= 74.5 R= 7e+04 -Depth= 3956 States= 6e+06 Transitions= 1.08e+08 Memory= 660.850 t= 93 R= 6e+04 -Depth= 3956 States= 7e+06 Transitions= 1.28e+08 Memory= 690.928 t= 110 R= 6e+04 -Depth= 3956 States= 8e+06 Transitions= 1.51e+08 Memory= 729.600 t= 129 R= 6e+04 -Depth= 3956 States= 9e+06 Transitions= 1.7e+08 Memory= 765.830 t= 146 R= 6e+04 -pan: resizing hashtable to -w24.. done -Depth= 3956 States= 1e+07 Transitions= 1.92e+08 Memory= 919.611 t= 166 R= 6e+04 -Depth= 3956 States= 1.1e+07 Transitions= 2.13e+08 Memory= 958.576 t= 183 R= 6e+04 -Depth= 3956 States= 1.2e+07 Transitions= 2.33e+08 Memory= 985.627 t= 201 R= 6e+04 -Depth= 3956 States= 1.3e+07 Transitions= 2.55e+08 Memory= 1027.033 t= 220 R= 6e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 3956, errors: 0 - 7045896 states, stored (1.35792e+07 visited) -2.5326206e+08 states, matched -2.668413e+08 transitions (= visited+matched) -9.9425626e+08 atomic steps -hash conflicts: 65494104 (resolved) - -Stats on memory usage (in Megabytes): - 564.437 equivalent memory usage for states (stored*(State-vector + overhead)) - 465.758 actual memory usage for states (compression: 82.52%) - state-vector as stored = 41 byte + 28 byte overhead - 128.000 memory used for hash table (-w24) - 457.764 memory used for DFS stack (-m10000000) - 1051.350 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 151, "(1)" - line 418, "pan.___", state 181, "(1)" - line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 242, "(1)" - line 418, "pan.___", state 272, "(1)" - line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 360, "(1)" - line 418, "pan.___", state 390, "(1)" - line 540, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 59, "(1)" - line 413, "pan.___", state 72, "(1)" - line 418, "pan.___", state 89, "(1)" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 240, "(1)" - line 164, "pan.___", state 248, "(1)" - line 168, "pan.___", state 260, "(1)" - line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 927, "(1)" - line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 928, "else" - line 409, "pan.___", state 931, "(1)" - line 409, "pan.___", state 932, "(1)" - line 409, "pan.___", state 932, "(1)" - line 413, "pan.___", state 940, "(1)" - line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 941, "else" - line 413, "pan.___", state 944, "(1)" - line 413, "pan.___", state 945, "(1)" - line 413, "pan.___", state 945, "(1)" - line 411, "pan.___", state 950, "((i<1))" - line 411, "pan.___", state 950, "((i>=1))" - line 418, "pan.___", state 957, "(1)" - line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 958, "else" - line 418, "pan.___", state 961, "(1)" - line 418, "pan.___", state 962, "(1)" - line 418, "pan.___", state 962, "(1)" - line 420, "pan.___", state 965, "(1)" - line 420, "pan.___", state 965, "(1)" - line 403, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1040, "(1)" - line 418, "pan.___", state 1057, "(1)" - line 403, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1130, "(1)" - line 418, "pan.___", state 1147, "(1)" - line 399, "pan.___", state 1166, "(1)" - line 403, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1222, "(1)" - line 418, "pan.___", state 1239, "(1)" - line 403, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1315, "(1)" - line 418, "pan.___", state 1332, "(1)" - line 179, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 1378, "(1)" - line 164, "pan.___", state 1386, "(1)" - line 168, "pan.___", state 1398, "(1)" - line 175, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1595, "(1)" - line 409, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 1596, "else" - line 409, "pan.___", state 1599, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 413, "pan.___", state 1608, "(1)" - line 413, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 1609, "else" - line 413, "pan.___", state 1612, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 411, "pan.___", state 1618, "((i<1))" - line 411, "pan.___", state 1618, "((i>=1))" - line 418, "pan.___", state 1625, "(1)" - line 418, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 1626, "else" - line 418, "pan.___", state 1629, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 179, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 1681, "(1)" - line 164, "pan.___", state 1689, "(1)" - line 168, "pan.___", state 1701, "(1)" - line 175, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer.spin.input.trail b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer.spin.input.trail deleted file mode 100644 index e65d663..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer.spin.input.trail +++ /dev/null @@ -1,9 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2679 -2:1:2673 -3:1:2674 -4:1:2675 -5:1:2676 -6:0:2685 -7:5:1129 diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer_error.define b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer_error.log b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer_error.log deleted file mode 100644 index 7fafb9e..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer_error.log +++ /dev/null @@ -1,514 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer_error.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 745) -depth 15: Claim reached state 9 (line 750) -depth 291: Claim reached state 9 (line 749) -pan: acceptance cycle (at depth 4308) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 4820, errors: 1 - 62091 states, stored (169917 visited) - 2179326 states, matched - 2349243 transitions (= visited+matched) - 8805349 atomic steps -hash conflicts: 50953 (resolved) - -Stats on memory usage (in Megabytes): - 4.974 equivalent memory usage for states (stored*(State-vector + overhead)) - 4.145 actual memory usage for states (compression: 83.33%) - state-vector as stored = 42 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 469.865 total actual memory usage - -unreached in proctype urcu_reader - line 400, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 61, "(1)" - line 419, "pan.___", state 91, "(1)" - line 400, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 151, "(1)" - line 419, "pan.___", state 181, "(1)" - line 400, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 242, "(1)" - line 419, "pan.___", state 272, "(1)" - line 400, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 360, "(1)" - line 419, "pan.___", state 390, "(1)" - line 541, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 400, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 20, "(1)" - line 404, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 34, "(1)" - line 404, "pan.___", state 35, "(1)" - line 404, "pan.___", state 35, "(1)" - line 402, "pan.___", state 40, "((i<1))" - line 402, "pan.___", state 40, "((i>=1))" - line 409, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 59, "(1)" - line 410, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 60, "else" - line 410, "pan.___", state 63, "(1)" - line 410, "pan.___", state 64, "(1)" - line 410, "pan.___", state 64, "(1)" - line 414, "pan.___", state 72, "(1)" - line 414, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 73, "else" - line 414, "pan.___", state 76, "(1)" - line 414, "pan.___", state 77, "(1)" - line 414, "pan.___", state 77, "(1)" - line 412, "pan.___", state 82, "((i<1))" - line 412, "pan.___", state 82, "((i>=1))" - line 419, "pan.___", state 89, "(1)" - line 419, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 90, "else" - line 419, "pan.___", state 93, "(1)" - line 419, "pan.___", state 94, "(1)" - line 419, "pan.___", state 94, "(1)" - line 370, "pan.___", state 99, "(1)" - line 640, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" - line 638, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" - line 400, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 114, "(1)" - line 404, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 128, "(1)" - line 404, "pan.___", state 129, "(1)" - line 404, "pan.___", state 129, "(1)" - line 402, "pan.___", state 134, "((i<1))" - line 402, "pan.___", state 134, "((i>=1))" - line 410, "pan.___", state 153, "(1)" - line 410, "pan.___", state 154, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 154, "else" - line 410, "pan.___", state 157, "(1)" - line 410, "pan.___", state 158, "(1)" - line 410, "pan.___", state 158, "(1)" - line 414, "pan.___", state 166, "(1)" - line 414, "pan.___", state 167, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 167, "else" - line 414, "pan.___", state 170, "(1)" - line 414, "pan.___", state 171, "(1)" - line 414, "pan.___", state 171, "(1)" - line 412, "pan.___", state 176, "((i<1))" - line 412, "pan.___", state 176, "((i>=1))" - line 419, "pan.___", state 183, "(1)" - line 419, "pan.___", state 184, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 184, "else" - line 419, "pan.___", state 187, "(1)" - line 419, "pan.___", state 188, "(1)" - line 419, "pan.___", state 188, "(1)" - line 421, "pan.___", state 191, "(1)" - line 421, "pan.___", state 191, "(1)" - line 370, "pan.___", state 193, "(1)" - line 653, "pan.___", state 199, "(1)" - line 647, "pan.___", state 202, "((write_lock==0))" - line 647, "pan.___", state 202, "else" - line 645, "pan.___", state 203, "(1)" - line 176, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 180, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 178, "pan.___", state 225, "((j<1))" - line 178, "pan.___", state 225, "((j>=1))" - line 184, "pan.___", state 230, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 161, "pan.___", state 240, "(1)" - line 165, "pan.___", state 248, "(1)" - line 165, "pan.___", state 249, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 165, "pan.___", state 249, "else" - line 163, "pan.___", state 254, "((j<1))" - line 163, "pan.___", state 254, "((j>=1))" - line 169, "pan.___", state 260, "(1)" - line 169, "pan.___", state 261, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 169, "pan.___", state 261, "else" - line 171, "pan.___", state 264, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 171, "pan.___", state 264, "else" - line 176, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 184, "pan.___", state 293, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 169, "pan.___", state 323, "(1)" - line 169, "pan.___", state 324, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 176, "pan.___", state 338, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 180, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 178, "pan.___", state 355, "((j<1))" - line 178, "pan.___", state 355, "((j>=1))" - line 184, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 161, "pan.___", state 370, "(1)" - line 165, "pan.___", state 378, "(1)" - line 165, "pan.___", state 379, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 165, "pan.___", state 379, "else" - line 163, "pan.___", state 384, "((j<1))" - line 163, "pan.___", state 384, "((j>=1))" - line 169, "pan.___", state 390, "(1)" - line 169, "pan.___", state 391, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 169, "pan.___", state 391, "else" - line 171, "pan.___", state 394, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 171, "pan.___", state 394, "else" - line 400, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 410, "(1)" - line 404, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 424, "(1)" - line 404, "pan.___", state 425, "(1)" - line 404, "pan.___", state 425, "(1)" - line 402, "pan.___", state 430, "((i<1))" - line 402, "pan.___", state 430, "((i>=1))" - line 409, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 449, "(1)" - line 410, "pan.___", state 450, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 450, "else" - line 410, "pan.___", state 453, "(1)" - line 410, "pan.___", state 454, "(1)" - line 410, "pan.___", state 454, "(1)" - line 414, "pan.___", state 462, "(1)" - line 414, "pan.___", state 463, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 463, "else" - line 414, "pan.___", state 466, "(1)" - line 414, "pan.___", state 467, "(1)" - line 414, "pan.___", state 467, "(1)" - line 412, "pan.___", state 472, "((i<1))" - line 412, "pan.___", state 472, "((i>=1))" - line 419, "pan.___", state 479, "(1)" - line 419, "pan.___", state 480, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 480, "else" - line 419, "pan.___", state 483, "(1)" - line 419, "pan.___", state 484, "(1)" - line 419, "pan.___", state 484, "(1)" - line 421, "pan.___", state 487, "(1)" - line 421, "pan.___", state 487, "(1)" - line 370, "pan.___", state 489, "(1)" - line 662, "pan.___", state 492, "cached_urcu_gp_ctr.val[_pid] = (tmp^(1<<7))" - line 400, "pan.___", state 498, "(1)" - line 400, "pan.___", state 499, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 499, "else" - line 400, "pan.___", state 502, "(1)" - line 404, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 516, "(1)" - line 404, "pan.___", state 517, "(1)" - line 404, "pan.___", state 517, "(1)" - line 402, "pan.___", state 522, "((i<1))" - line 402, "pan.___", state 522, "((i>=1))" - line 409, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 541, "(1)" - line 410, "pan.___", state 542, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 542, "else" - line 410, "pan.___", state 545, "(1)" - line 410, "pan.___", state 546, "(1)" - line 410, "pan.___", state 546, "(1)" - line 414, "pan.___", state 554, "(1)" - line 414, "pan.___", state 555, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 555, "else" - line 414, "pan.___", state 558, "(1)" - line 414, "pan.___", state 559, "(1)" - line 414, "pan.___", state 559, "(1)" - line 412, "pan.___", state 564, "((i<1))" - line 412, "pan.___", state 564, "((i>=1))" - line 419, "pan.___", state 571, "(1)" - line 419, "pan.___", state 572, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 572, "else" - line 419, "pan.___", state 575, "(1)" - line 419, "pan.___", state 576, "(1)" - line 419, "pan.___", state 576, "(1)" - line 421, "pan.___", state 579, "(1)" - line 421, "pan.___", state 579, "(1)" - line 370, "pan.___", state 581, "(1)" - line 400, "pan.___", state 589, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 595, "(1)" - line 404, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 609, "(1)" - line 404, "pan.___", state 610, "(1)" - line 404, "pan.___", state 610, "(1)" - line 402, "pan.___", state 615, "((i<1))" - line 402, "pan.___", state 615, "((i>=1))" - line 409, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 634, "(1)" - line 410, "pan.___", state 635, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 635, "else" - line 410, "pan.___", state 638, "(1)" - line 410, "pan.___", state 639, "(1)" - line 410, "pan.___", state 639, "(1)" - line 414, "pan.___", state 647, "(1)" - line 414, "pan.___", state 648, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 648, "else" - line 414, "pan.___", state 651, "(1)" - line 414, "pan.___", state 652, "(1)" - line 414, "pan.___", state 652, "(1)" - line 412, "pan.___", state 657, "((i<1))" - line 412, "pan.___", state 657, "((i>=1))" - line 419, "pan.___", state 664, "(1)" - line 419, "pan.___", state 665, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 665, "else" - line 419, "pan.___", state 668, "(1)" - line 419, "pan.___", state 669, "(1)" - line 419, "pan.___", state 669, "(1)" - line 421, "pan.___", state 672, "(1)" - line 421, "pan.___", state 672, "(1)" - line 370, "pan.___", state 674, "(1)" - line 400, "pan.___", state 679, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 681, "(1)" - line 400, "pan.___", state 682, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 682, "else" - line 400, "pan.___", state 685, "(1)" - line 404, "pan.___", state 693, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 695, "(1)" - line 404, "pan.___", state 696, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 404, "pan.___", state 696, "else" - line 404, "pan.___", state 699, "(1)" - line 404, "pan.___", state 700, "(1)" - line 404, "pan.___", state 700, "(1)" - line 402, "pan.___", state 705, "((i<1))" - line 402, "pan.___", state 705, "((i>=1))" - line 409, "pan.___", state 711, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 724, "(1)" - line 410, "pan.___", state 725, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 725, "else" - line 410, "pan.___", state 728, "(1)" - line 410, "pan.___", state 729, "(1)" - line 410, "pan.___", state 729, "(1)" - line 414, "pan.___", state 737, "(1)" - line 414, "pan.___", state 738, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 738, "else" - line 414, "pan.___", state 741, "(1)" - line 414, "pan.___", state 742, "(1)" - line 414, "pan.___", state 742, "(1)" - line 412, "pan.___", state 747, "((i<1))" - line 412, "pan.___", state 747, "((i>=1))" - line 419, "pan.___", state 754, "(1)" - line 419, "pan.___", state 755, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 755, "else" - line 419, "pan.___", state 758, "(1)" - line 419, "pan.___", state 759, "(1)" - line 419, "pan.___", state 759, "(1)" - line 421, "pan.___", state 762, "(1)" - line 421, "pan.___", state 762, "(1)" - line 370, "pan.___", state 764, "(1)" - line 430, "pan.___", state 767, "(((tmp2&((1<<7)-1))&&((tmp2^cached_urcu_gp_ctr.val[_pid])&(1<<7))))" - line 430, "pan.___", state 767, "else" - line 400, "pan.___", state 777, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 779, "(1)" - line 400, "pan.___", state 780, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 780, "else" - line 400, "pan.___", state 783, "(1)" - line 404, "pan.___", state 791, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 793, "(1)" - line 404, "pan.___", state 794, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 404, "pan.___", state 794, "else" - line 404, "pan.___", state 797, "(1)" - line 404, "pan.___", state 798, "(1)" - line 404, "pan.___", state 798, "(1)" - line 402, "pan.___", state 803, "((i<1))" - line 402, "pan.___", state 803, "((i>=1))" - line 409, "pan.___", state 809, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 822, "(1)" - line 410, "pan.___", state 823, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 823, "else" - line 410, "pan.___", state 826, "(1)" - line 410, "pan.___", state 827, "(1)" - line 410, "pan.___", state 827, "(1)" - line 414, "pan.___", state 835, "(1)" - line 414, "pan.___", state 836, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 836, "else" - line 414, "pan.___", state 839, "(1)" - line 414, "pan.___", state 840, "(1)" - line 414, "pan.___", state 840, "(1)" - line 412, "pan.___", state 845, "((i<1))" - line 412, "pan.___", state 845, "((i>=1))" - line 419, "pan.___", state 852, "(1)" - line 419, "pan.___", state 853, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 853, "else" - line 419, "pan.___", state 856, "(1)" - line 419, "pan.___", state 857, "(1)" - line 419, "pan.___", state 857, "(1)" - line 421, "pan.___", state 860, "(1)" - line 421, "pan.___", state 860, "(1)" - line 370, "pan.___", state 862, "(1)" - line 449, "pan.___", state 870, "((tmp<1))" - line 449, "pan.___", state 870, "((tmp>=1))" - line 462, "pan.___", state 873, "tmp = 0" - line 400, "pan.___", state 877, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 883, "(1)" - line 404, "pan.___", state 891, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 897, "(1)" - line 404, "pan.___", state 898, "(1)" - line 404, "pan.___", state 898, "(1)" - line 402, "pan.___", state 903, "((i<1))" - line 402, "pan.___", state 903, "((i>=1))" - line 409, "pan.___", state 909, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 922, "(1)" - line 410, "pan.___", state 923, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 923, "else" - line 410, "pan.___", state 926, "(1)" - line 410, "pan.___", state 927, "(1)" - line 410, "pan.___", state 927, "(1)" - line 414, "pan.___", state 935, "(1)" - line 414, "pan.___", state 936, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 936, "else" - line 414, "pan.___", state 939, "(1)" - line 414, "pan.___", state 940, "(1)" - line 414, "pan.___", state 940, "(1)" - line 412, "pan.___", state 945, "((i<1))" - line 412, "pan.___", state 945, "((i>=1))" - line 419, "pan.___", state 952, "(1)" - line 419, "pan.___", state 953, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 953, "else" - line 419, "pan.___", state 956, "(1)" - line 419, "pan.___", state 957, "(1)" - line 419, "pan.___", state 957, "(1)" - line 421, "pan.___", state 960, "(1)" - line 421, "pan.___", state 960, "(1)" - line 370, "pan.___", state 962, "(1)" - line 671, "pan.___", state 963, "tmp = cached_urcu_gp_ctr.val[_pid]" - line 400, "pan.___", state 967, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 973, "(1)" - line 404, "pan.___", state 981, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 987, "(1)" - line 404, "pan.___", state 988, "(1)" - line 404, "pan.___", state 988, "(1)" - line 402, "pan.___", state 993, "((i<1))" - line 402, "pan.___", state 993, "((i>=1))" - line 409, "pan.___", state 999, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 1012, "(1)" - line 410, "pan.___", state 1013, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 1013, "else" - line 410, "pan.___", state 1016, "(1)" - line 410, "pan.___", state 1017, "(1)" - line 410, "pan.___", state 1017, "(1)" - line 414, "pan.___", state 1025, "(1)" - line 414, "pan.___", state 1026, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 1026, "else" - line 414, "pan.___", state 1029, "(1)" - line 414, "pan.___", state 1030, "(1)" - line 414, "pan.___", state 1030, "(1)" - line 412, "pan.___", state 1035, "((i<1))" - line 412, "pan.___", state 1035, "((i>=1))" - line 419, "pan.___", state 1042, "(1)" - line 419, "pan.___", state 1043, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 1043, "else" - line 419, "pan.___", state 1046, "(1)" - line 419, "pan.___", state 1047, "(1)" - line 419, "pan.___", state 1047, "(1)" - line 421, "pan.___", state 1050, "(1)" - line 421, "pan.___", state 1050, "(1)" - line 370, "pan.___", state 1052, "(1)" - line 400, "pan.___", state 1061, "(1)" - line 404, "pan.___", state 1073, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1091, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1117, "(1)" - line 419, "pan.___", state 1134, "(1)" - line 404, "pan.___", state 1166, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1184, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1210, "(1)" - line 419, "pan.___", state 1227, "(1)" - line 400, "pan.___", state 1242, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 1256, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1274, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 1287, "(1)" - line 414, "pan.___", state 1300, "(1)" - line 419, "pan.___", state 1317, "(1)" - line 400, "pan.___", state 1340, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 1342, "(1)" - line 400, "pan.___", state 1343, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 1343, "else" - line 400, "pan.___", state 1346, "(1)" - line 404, "pan.___", state 1354, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 1356, "(1)" - line 404, "pan.___", state 1357, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 404, "pan.___", state 1357, "else" - line 404, "pan.___", state 1360, "(1)" - line 404, "pan.___", state 1361, "(1)" - line 404, "pan.___", state 1361, "(1)" - line 402, "pan.___", state 1366, "((i<1))" - line 402, "pan.___", state 1366, "((i>=1))" - line 409, "pan.___", state 1372, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 1385, "(1)" - line 410, "pan.___", state 1386, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 1386, "else" - line 410, "pan.___", state 1389, "(1)" - line 410, "pan.___", state 1390, "(1)" - line 410, "pan.___", state 1390, "(1)" - line 414, "pan.___", state 1398, "(1)" - line 414, "pan.___", state 1399, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 1399, "else" - line 414, "pan.___", state 1402, "(1)" - line 414, "pan.___", state 1403, "(1)" - line 414, "pan.___", state 1403, "(1)" - line 412, "pan.___", state 1408, "((i<1))" - line 412, "pan.___", state 1408, "((i>=1))" - line 419, "pan.___", state 1415, "(1)" - line 419, "pan.___", state 1416, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 1416, "else" - line 419, "pan.___", state 1419, "(1)" - line 419, "pan.___", state 1420, "(1)" - line 419, "pan.___", state 1420, "(1)" - line 421, "pan.___", state 1423, "(1)" - line 421, "pan.___", state 1423, "(1)" - line 180, "pan.___", state 1448, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 184, "pan.___", state 1461, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 161, "pan.___", state 1471, "(1)" - line 165, "pan.___", state 1479, "(1)" - line 169, "pan.___", state 1491, "(1)" - line 176, "pan.___", state 1502, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer_error.spin.input.trail deleted file mode 100644 index 5bb8316..0000000 --- a/formal-model/urcu-nosched-model/result-standard-execution-nest/urcu_progress_writer_error.spin.input.trail +++ /dev/null @@ -1,4823 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2108 -2:3:2060 -3:3:2063 -4:3:2063 -5:3:2066 -6:3:2074 -7:3:2074 -8:3:2077 -9:3:2083 -10:3:2087 -11:3:2087 -12:3:2090 -13:3:2098 -14:3:2102 -15:3:2103 -16:0:2108 -17:3:2105 -18:0:2108 -19:2:416 -20:0:2108 -21:2:422 -22:0:2108 -23:2:423 -24:0:2108 -25:2:424 -26:2:428 -27:2:429 -28:2:437 -29:2:438 -30:2:442 -31:2:443 -32:2:451 -33:2:456 -34:2:460 -35:2:461 -36:2:468 -37:2:469 -38:2:480 -39:2:481 -40:2:482 -41:2:493 -42:2:498 -43:2:499 -44:0:2106 -45:2:511 -46:0:2112 -47:2:513 -48:2:514 -49:0:2112 -50:2:518 -51:2:522 -52:2:523 -53:2:531 -54:2:532 -55:2:536 -56:2:537 -57:2:545 -58:2:550 -59:2:551 -60:2:562 -61:2:563 -62:2:574 -63:2:575 -64:2:576 -65:2:587 -66:2:592 -67:2:593 -68:0:2112 -69:2:605 -70:0:2112 -71:2:607 -72:0:2112 -73:2:608 -74:0:2112 -75:2:618 -76:0:2112 -77:2:622 -78:2:623 -79:2:627 -80:2:631 -81:2:632 -82:2:636 -83:2:644 -84:2:645 -85:2:650 -86:2:657 -87:2:658 -88:2:665 -89:2:670 -90:0:2112 -91:2:681 -92:0:2112 -93:2:685 -94:2:686 -95:2:690 -96:2:694 -97:2:695 -98:2:699 -99:2:707 -100:2:708 -101:2:713 -102:2:720 -103:2:721 -104:2:728 -105:2:733 -106:0:2112 -107:2:744 -108:0:2112 -109:2:752 -110:2:753 -111:2:757 -112:2:761 -113:2:762 -114:2:766 -115:2:774 -116:2:775 -117:2:780 -118:2:787 -119:2:788 -120:2:795 -121:2:800 -122:0:2112 -123:2:811 -124:0:2112 -125:2:813 -126:0:2112 -127:2:814 -128:2:818 -129:2:819 -130:2:827 -131:2:828 -132:2:832 -133:2:833 -134:2:841 -135:2:846 -136:2:850 -137:2:851 -138:2:858 -139:2:859 -140:2:870 -141:2:871 -142:2:872 -143:2:883 -144:2:888 -145:2:889 -146:0:2112 -147:2:901 -148:0:2112 -149:2:903 -150:0:2112 -151:2:906 -152:2:907 -153:2:919 -154:2:920 -155:2:924 -156:2:925 -157:2:933 -158:2:938 -159:2:942 -160:2:943 -161:2:950 -162:2:951 -163:2:962 -164:2:963 -165:2:964 -166:2:975 -167:2:980 -168:2:981 -169:0:2112 -170:2:993 -171:0:2112 -172:2:995 -173:0:2112 -174:2:996 -175:0:2112 -176:2:997 -177:0:2112 -178:2:998 -179:0:2112 -180:2:999 -181:2:1003 -182:2:1004 -183:2:1012 -184:2:1013 -185:2:1017 -186:2:1018 -187:2:1026 -188:2:1031 -189:2:1035 -190:2:1036 -191:2:1043 -192:2:1044 -193:2:1055 -194:2:1056 -195:2:1057 -196:2:1068 -197:2:1073 -198:2:1074 -199:0:2112 -200:2:1086 -201:0:2112 -202:2:1178 -203:0:2112 -204:2:1276 -205:0:2112 -206:2:1277 -207:0:2112 -208:2:1281 -209:0:2112 -210:2:1287 -211:2:1291 -212:2:1292 -213:2:1300 -214:2:1301 -215:2:1305 -216:2:1306 -217:2:1314 -218:2:1319 -219:2:1323 -220:2:1324 -221:2:1331 -222:2:1332 -223:2:1343 -224:2:1344 -225:2:1345 -226:2:1356 -227:2:1361 -228:2:1362 -229:0:2112 -230:2:1374 -231:0:2112 -232:2:1376 -233:0:2112 -234:2:1377 -235:2:1381 -236:2:1382 -237:2:1390 -238:2:1391 -239:2:1395 -240:2:1396 -241:2:1404 -242:2:1409 -243:2:1413 -244:2:1414 -245:2:1421 -246:2:1422 -247:2:1433 -248:2:1434 -249:2:1435 -250:2:1446 -251:2:1451 -252:2:1452 -253:0:2112 -254:2:1464 -255:0:2112 -256:2:1466 -257:0:2112 -258:1:2 -259:0:2112 -260:1:8 -261:0:2112 -262:1:9 -263:0:2112 -264:1:10 -265:0:2112 -266:1:11 -267:0:2112 -268:1:12 -269:1:16 -270:1:17 -271:1:25 -272:1:26 -273:1:30 -274:1:31 -275:1:39 -276:1:44 -277:1:48 -278:1:49 -279:1:56 -280:1:57 -281:1:68 -282:1:69 -283:1:70 -284:1:81 -285:1:86 -286:1:87 -287:0:2112 -288:1:99 -289:0:2112 -290:1:101 -291:0:2112 -292:1:102 -293:1:106 -294:1:107 -295:1:115 -296:1:116 -297:1:120 -298:1:121 -299:1:129 -300:1:134 -301:1:138 -302:1:139 -303:1:146 -304:1:147 -305:1:158 -306:1:159 -307:1:160 -308:1:171 -309:1:176 -310:1:177 -311:0:2112 -312:1:189 -313:0:2112 -314:1:191 -315:0:2112 -316:1:192 -317:0:2112 -318:1:193 -319:1:197 -320:1:198 -321:1:206 -322:1:207 -323:1:211 -324:1:212 -325:1:220 -326:1:225 -327:1:229 -328:1:230 -329:1:237 -330:1:238 -331:1:249 -332:1:250 -333:1:251 -334:1:262 -335:1:267 -336:1:268 -337:0:2112 -338:1:280 -339:0:2112 -340:1:282 -341:0:2112 -342:1:291 -343:0:2112 -344:1:293 -345:0:2112 -346:1:11 -347:0:2112 -348:1:12 -349:1:16 -350:1:17 -351:1:25 -352:1:26 -353:1:27 -354:1:39 -355:1:44 -356:1:48 -357:1:49 -358:1:56 -359:1:57 -360:1:68 -361:1:69 -362:1:70 -363:1:81 -364:1:86 -365:1:87 -366:0:2112 -367:1:99 -368:0:2112 -369:2:1469 -370:2:1470 -371:2:1482 -372:2:1483 -373:2:1487 -374:2:1488 -375:2:1496 -376:2:1501 -377:2:1505 -378:2:1506 -379:2:1513 -380:2:1514 -381:2:1525 -382:2:1526 -383:2:1527 -384:2:1538 -385:2:1543 -386:2:1544 -387:0:2112 -388:2:1556 -389:0:2112 -390:2:1558 -391:0:2112 -392:2:1559 -393:0:2112 -394:2:1560 -395:0:2112 -396:2:1561 -397:0:2112 -398:2:1562 -399:2:1566 -400:2:1567 -401:2:1575 -402:2:1576 -403:2:1580 -404:2:1581 -405:2:1589 -406:2:1594 -407:2:1598 -408:2:1599 -409:2:1606 -410:2:1607 -411:2:1618 -412:2:1619 -413:2:1620 -414:2:1631 -415:2:1636 -416:2:1637 -417:0:2112 -418:2:1649 -419:0:2112 -420:2:1651 -421:0:2112 -422:2:1652 -423:2:1656 -424:2:1657 -425:2:1665 -426:2:1666 -427:2:1670 -428:2:1671 -429:2:1679 -430:2:1684 -431:2:1688 -432:2:1689 -433:2:1696 -434:2:1697 -435:2:1708 -436:2:1709 -437:2:1710 -438:2:1721 -439:2:1726 -440:2:1727 -441:0:2112 -442:2:1739 -443:0:2112 -444:1:101 -445:0:2112 -446:2:1560 -447:0:2112 -448:2:1561 -449:0:2112 -450:2:1562 -451:2:1566 -452:2:1567 -453:2:1575 -454:2:1576 -455:2:1580 -456:2:1581 -457:2:1589 -458:2:1594 -459:2:1598 -460:2:1599 -461:2:1606 -462:2:1607 -463:2:1618 -464:2:1619 -465:2:1620 -466:2:1631 -467:2:1636 -468:2:1637 -469:0:2112 -470:2:1649 -471:0:2112 -472:2:1651 -473:0:2112 -474:2:1652 -475:2:1656 -476:2:1657 -477:2:1665 -478:2:1666 -479:2:1670 -480:2:1671 -481:2:1679 -482:2:1684 -483:2:1688 -484:2:1689 -485:2:1696 -486:2:1697 -487:2:1708 -488:2:1709 -489:2:1710 -490:2:1721 -491:2:1726 -492:2:1727 -493:0:2112 -494:2:1739 -495:0:2112 -496:1:102 -497:1:106 -498:1:107 -499:1:115 -500:1:116 -501:1:120 -502:1:121 -503:1:129 -504:1:134 -505:1:138 -506:1:139 -507:1:146 -508:1:147 -509:1:158 -510:1:159 -511:1:160 -512:1:171 -513:1:176 -514:1:177 -515:0:2112 -516:2:1560 -517:0:2112 -518:1:189 -519:0:2112 -520:1:285 -521:0:2112 -522:2:1561 -523:0:2112 -524:2:1562 -525:2:1566 -526:2:1567 -527:2:1575 -528:2:1576 -529:2:1580 -530:2:1581 -531:2:1589 -532:2:1594 -533:2:1598 -534:2:1599 -535:2:1606 -536:2:1607 -537:2:1618 -538:2:1619 -539:2:1620 -540:2:1631 -541:2:1636 -542:2:1637 -543:0:2112 -544:2:1649 -545:0:2112 -546:2:1651 -547:0:2112 -548:2:1652 -549:2:1656 -550:2:1657 -551:2:1665 -552:2:1666 -553:2:1670 -554:2:1671 -555:2:1679 -556:2:1684 -557:2:1688 -558:2:1689 -559:2:1696 -560:2:1697 -561:2:1708 -562:2:1709 -563:2:1710 -564:2:1721 -565:2:1726 -566:2:1727 -567:0:2112 -568:2:1739 -569:0:2112 -570:2:1560 -571:0:2112 -572:1:286 -573:0:2112 -574:1:291 -575:0:2112 -576:1:293 -577:0:2112 -578:1:296 -579:0:2112 -580:2:1561 -581:0:2112 -582:2:1562 -583:2:1566 -584:2:1567 -585:2:1575 -586:2:1576 -587:2:1580 -588:2:1581 -589:2:1589 -590:2:1594 -591:2:1598 -592:2:1599 -593:2:1606 -594:2:1607 -595:2:1618 -596:2:1619 -597:2:1620 -598:2:1631 -599:2:1636 -600:2:1637 -601:0:2112 -602:2:1649 -603:0:2112 -604:2:1651 -605:0:2112 -606:2:1652 -607:2:1656 -608:2:1657 -609:2:1665 -610:2:1666 -611:2:1670 -612:2:1671 -613:2:1679 -614:2:1684 -615:2:1688 -616:2:1689 -617:2:1696 -618:2:1697 -619:2:1708 -620:2:1709 -621:2:1710 -622:2:1721 -623:2:1726 -624:2:1727 -625:0:2112 -626:2:1739 -627:0:2112 -628:2:1560 -629:0:2112 -630:1:301 -631:0:2112 -632:2:1561 -633:0:2112 -634:2:1562 -635:2:1566 -636:2:1567 -637:2:1575 -638:2:1576 -639:2:1580 -640:2:1581 -641:2:1589 -642:2:1594 -643:2:1598 -644:2:1599 -645:2:1606 -646:2:1607 -647:2:1618 -648:2:1619 -649:2:1620 -650:2:1631 -651:2:1636 -652:2:1637 -653:0:2112 -654:2:1649 -655:0:2112 -656:2:1651 -657:0:2112 -658:2:1652 -659:2:1656 -660:2:1657 -661:2:1665 -662:2:1666 -663:2:1670 -664:2:1671 -665:2:1679 -666:2:1684 -667:2:1688 -668:2:1689 -669:2:1696 -670:2:1697 -671:2:1708 -672:2:1709 -673:2:1710 -674:2:1721 -675:2:1726 -676:2:1727 -677:0:2112 -678:2:1739 -679:0:2112 -680:2:1560 -681:0:2112 -682:1:302 -683:0:2112 -684:2:1561 -685:0:2112 -686:2:1562 -687:2:1566 -688:2:1567 -689:2:1575 -690:2:1576 -691:2:1580 -692:2:1581 -693:2:1589 -694:2:1594 -695:2:1598 -696:2:1599 -697:2:1606 -698:2:1607 -699:2:1618 -700:2:1619 -701:2:1620 -702:2:1631 -703:2:1636 -704:2:1637 -705:0:2112 -706:2:1649 -707:0:2112 -708:2:1651 -709:0:2112 -710:2:1652 -711:2:1656 -712:2:1657 -713:2:1665 -714:2:1666 -715:2:1670 -716:2:1671 -717:2:1679 -718:2:1684 -719:2:1688 -720:2:1689 -721:2:1696 -722:2:1697 -723:2:1708 -724:2:1709 -725:2:1710 -726:2:1721 -727:2:1726 -728:2:1727 -729:0:2112 -730:2:1739 -731:0:2112 -732:2:1560 -733:0:2112 -734:1:303 -735:0:2112 -736:1:304 -737:0:2112 -738:1:305 -739:0:2112 -740:1:306 -741:0:2112 -742:1:308 -743:0:2112 -744:2:1561 -745:0:2112 -746:2:1562 -747:2:1566 -748:2:1567 -749:2:1575 -750:2:1576 -751:2:1580 -752:2:1581 -753:2:1589 -754:2:1594 -755:2:1598 -756:2:1599 -757:2:1606 -758:2:1607 -759:2:1618 -760:2:1619 -761:2:1620 -762:2:1631 -763:2:1636 -764:2:1637 -765:0:2112 -766:2:1649 -767:0:2112 -768:2:1651 -769:0:2112 -770:2:1652 -771:2:1656 -772:2:1657 -773:2:1665 -774:2:1666 -775:2:1670 -776:2:1671 -777:2:1679 -778:2:1684 -779:2:1688 -780:2:1689 -781:2:1696 -782:2:1697 -783:2:1708 -784:2:1709 -785:2:1710 -786:2:1721 -787:2:1726 -788:2:1727 -789:0:2112 -790:2:1739 -791:0:2112 -792:2:1560 -793:0:2112 -794:1:310 -795:0:2112 -796:2:1561 -797:0:2112 -798:2:1562 -799:2:1566 -800:2:1567 -801:2:1575 -802:2:1576 -803:2:1580 -804:2:1581 -805:2:1589 -806:2:1594 -807:2:1598 -808:2:1599 -809:2:1606 -810:2:1607 -811:2:1618 -812:2:1619 -813:2:1620 -814:2:1631 -815:2:1636 -816:2:1637 -817:0:2112 -818:2:1649 -819:0:2112 -820:2:1651 -821:0:2112 -822:2:1652 -823:2:1656 -824:2:1657 -825:2:1665 -826:2:1666 -827:2:1670 -828:2:1671 -829:2:1679 -830:2:1684 -831:2:1688 -832:2:1689 -833:2:1696 -834:2:1697 -835:2:1708 -836:2:1709 -837:2:1710 -838:2:1721 -839:2:1726 -840:2:1727 -841:0:2112 -842:2:1739 -843:0:2112 -844:2:1560 -845:0:2112 -846:1:311 -847:1:315 -848:1:316 -849:1:324 -850:1:325 -851:1:326 -852:1:338 -853:1:343 -854:1:347 -855:1:348 -856:1:355 -857:1:356 -858:1:367 -859:1:368 -860:1:369 -861:1:380 -862:1:385 -863:1:386 -864:0:2112 -865:1:398 -866:0:2112 -867:2:1561 -868:0:2112 -869:2:1562 -870:2:1566 -871:2:1567 -872:2:1575 -873:2:1576 -874:2:1580 -875:2:1581 -876:2:1589 -877:2:1594 -878:2:1598 -879:2:1599 -880:2:1606 -881:2:1607 -882:2:1618 -883:2:1619 -884:2:1620 -885:2:1631 -886:2:1636 -887:2:1637 -888:0:2112 -889:2:1649 -890:0:2112 -891:2:1651 -892:0:2112 -893:2:1652 -894:2:1656 -895:2:1657 -896:2:1665 -897:2:1666 -898:2:1670 -899:2:1671 -900:2:1679 -901:2:1684 -902:2:1688 -903:2:1689 -904:2:1696 -905:2:1697 -906:2:1708 -907:2:1709 -908:2:1710 -909:2:1721 -910:2:1726 -911:2:1727 -912:0:2112 -913:2:1739 -914:0:2112 -915:2:1560 -916:0:2112 -917:2:1561 -918:0:2112 -919:2:1562 -920:2:1566 -921:2:1567 -922:2:1575 -923:2:1576 -924:2:1580 -925:2:1581 -926:2:1589 -927:2:1594 -928:2:1598 -929:2:1599 -930:2:1606 -931:2:1607 -932:2:1618 -933:2:1619 -934:2:1620 -935:2:1631 -936:2:1636 -937:2:1637 -938:0:2112 -939:2:1649 -940:0:2112 -941:1:400 -942:0:2112 -943:1:305 -944:0:2112 -945:1:306 -946:0:2112 -947:1:308 -948:0:2112 -949:2:1651 -950:0:2112 -951:2:1652 -952:2:1656 -953:2:1657 -954:2:1665 -955:2:1666 -956:2:1670 -957:2:1671 -958:2:1679 -959:2:1684 -960:2:1688 -961:2:1689 -962:2:1696 -963:2:1697 -964:2:1708 -965:2:1709 -966:2:1710 -967:2:1721 -968:2:1726 -969:2:1727 -970:0:2112 -971:2:1739 -972:0:2112 -973:2:1560 -974:0:2112 -975:2:1561 -976:0:2112 -977:2:1562 -978:2:1566 -979:2:1567 -980:2:1575 -981:2:1576 -982:2:1580 -983:2:1581 -984:2:1589 -985:2:1594 -986:2:1598 -987:2:1599 -988:2:1606 -989:2:1607 -990:2:1618 -991:2:1619 -992:2:1620 -993:2:1631 -994:2:1636 -995:2:1637 -996:0:2112 -997:2:1649 -998:0:2112 -999:1:310 -1000:0:2112 -1001:2:1651 -1002:0:2112 -1003:2:1652 -1004:2:1656 -1005:2:1657 -1006:2:1665 -1007:2:1666 -1008:2:1670 -1009:2:1671 -1010:2:1679 -1011:2:1684 -1012:2:1688 -1013:2:1689 -1014:2:1696 -1015:2:1697 -1016:2:1708 -1017:2:1709 -1018:2:1710 -1019:2:1721 -1020:2:1726 -1021:2:1727 -1022:0:2112 -1023:2:1739 -1024:0:2112 -1025:2:1560 -1026:0:2112 -1027:2:1561 -1028:0:2112 -1029:2:1562 -1030:2:1566 -1031:2:1567 -1032:2:1575 -1033:2:1576 -1034:2:1580 -1035:2:1581 -1036:2:1589 -1037:2:1594 -1038:2:1598 -1039:2:1599 -1040:2:1606 -1041:2:1607 -1042:2:1618 -1043:2:1619 -1044:2:1620 -1045:2:1631 -1046:2:1636 -1047:2:1637 -1048:0:2112 -1049:2:1649 -1050:0:2112 -1051:1:311 -1052:1:315 -1053:1:316 -1054:1:324 -1055:1:325 -1056:1:326 -1057:1:338 -1058:1:343 -1059:1:347 -1060:1:348 -1061:1:355 -1062:1:356 -1063:1:367 -1064:1:368 -1065:1:369 -1066:1:380 -1067:1:385 -1068:1:386 -1069:0:2112 -1070:1:398 -1071:0:2112 -1072:2:1651 -1073:0:2112 -1074:2:1652 -1075:2:1656 -1076:2:1657 -1077:2:1665 -1078:2:1666 -1079:2:1670 -1080:2:1671 -1081:2:1679 -1082:2:1684 -1083:2:1688 -1084:2:1689 -1085:2:1696 -1086:2:1697 -1087:2:1708 -1088:2:1709 -1089:2:1710 -1090:2:1721 -1091:2:1726 -1092:2:1727 -1093:0:2112 -1094:2:1739 -1095:0:2112 -1096:2:1560 -1097:0:2112 -1098:2:1561 -1099:0:2112 -1100:2:1562 -1101:2:1566 -1102:2:1567 -1103:2:1575 -1104:2:1576 -1105:2:1580 -1106:2:1581 -1107:2:1589 -1108:2:1594 -1109:2:1598 -1110:2:1599 -1111:2:1606 -1112:2:1607 -1113:2:1618 -1114:2:1619 -1115:2:1620 -1116:2:1631 -1117:2:1636 -1118:2:1637 -1119:0:2112 -1120:2:1649 -1121:0:2112 -1122:2:1651 -1123:0:2112 -1124:1:400 -1125:0:2112 -1126:1:404 -1127:0:2112 -1128:1:9 -1129:0:2112 -1130:1:10 -1131:0:2112 -1132:1:11 -1133:0:2112 -1134:2:1652 -1135:2:1656 -1136:2:1657 -1137:2:1665 -1138:2:1666 -1139:2:1670 -1140:2:1671 -1141:2:1679 -1142:2:1684 -1143:2:1688 -1144:2:1689 -1145:2:1696 -1146:2:1697 -1147:2:1708 -1148:2:1709 -1149:2:1710 -1150:2:1721 -1151:2:1726 -1152:2:1727 -1153:0:2112 -1154:2:1739 -1155:0:2112 -1156:2:1560 -1157:0:2112 -1158:2:1561 -1159:0:2112 -1160:2:1562 -1161:2:1566 -1162:2:1567 -1163:2:1575 -1164:2:1576 -1165:2:1580 -1166:2:1581 -1167:2:1589 -1168:2:1594 -1169:2:1598 -1170:2:1599 -1171:2:1606 -1172:2:1607 -1173:2:1618 -1174:2:1619 -1175:2:1620 -1176:2:1631 -1177:2:1636 -1178:2:1637 -1179:0:2112 -1180:2:1649 -1181:0:2112 -1182:2:1651 -1183:0:2112 -1184:1:12 -1185:1:16 -1186:1:17 -1187:1:25 -1188:1:26 -1189:1:27 -1190:1:39 -1191:1:44 -1192:1:48 -1193:1:49 -1194:1:56 -1195:1:57 -1196:1:68 -1197:1:69 -1198:1:70 -1199:1:81 -1200:1:86 -1201:1:87 -1202:0:2112 -1203:1:99 -1204:0:2112 -1205:2:1652 -1206:2:1656 -1207:2:1657 -1208:2:1665 -1209:2:1666 -1210:2:1670 -1211:2:1671 -1212:2:1679 -1213:2:1684 -1214:2:1688 -1215:2:1689 -1216:2:1696 -1217:2:1697 -1218:2:1708 -1219:2:1716 -1220:2:1717 -1221:2:1721 -1222:2:1726 -1223:2:1727 -1224:0:2112 -1225:2:1739 -1226:0:2112 -1227:2:1560 -1228:0:2112 -1229:2:1561 -1230:0:2112 -1231:2:1562 -1232:2:1566 -1233:2:1567 -1234:2:1575 -1235:2:1576 -1236:2:1580 -1237:2:1581 -1238:2:1589 -1239:2:1594 -1240:2:1598 -1241:2:1599 -1242:2:1606 -1243:2:1607 -1244:2:1618 -1245:2:1626 -1246:2:1627 -1247:2:1631 -1248:2:1636 -1249:2:1637 -1250:0:2112 -1251:2:1649 -1252:0:2112 -1253:2:1651 -1254:0:2112 -1255:1:101 -1256:0:2112 -1257:2:1652 -1258:2:1656 -1259:2:1657 -1260:2:1665 -1261:2:1666 -1262:2:1670 -1263:2:1671 -1264:2:1679 -1265:2:1684 -1266:2:1688 -1267:2:1689 -1268:2:1696 -1269:2:1697 -1270:2:1708 -1271:2:1716 -1272:2:1717 -1273:2:1721 -1274:2:1726 -1275:2:1727 -1276:0:2112 -1277:2:1739 -1278:0:2112 -1279:2:1560 -1280:0:2112 -1281:2:1561 -1282:0:2112 -1283:2:1562 -1284:2:1566 -1285:2:1567 -1286:2:1575 -1287:2:1576 -1288:2:1580 -1289:2:1581 -1290:2:1589 -1291:2:1594 -1292:2:1598 -1293:2:1599 -1294:2:1606 -1295:2:1607 -1296:2:1618 -1297:2:1626 -1298:2:1627 -1299:2:1631 -1300:2:1636 -1301:2:1637 -1302:0:2112 -1303:2:1649 -1304:0:2112 -1305:2:1651 -1306:0:2112 -1307:1:102 -1308:1:106 -1309:1:107 -1310:1:115 -1311:1:116 -1312:1:120 -1313:1:121 -1314:1:129 -1315:1:134 -1316:1:138 -1317:1:139 -1318:1:146 -1319:1:147 -1320:1:158 -1321:1:159 -1322:1:160 -1323:1:171 -1324:1:176 -1325:1:177 -1326:0:2112 -1327:1:189 -1328:0:2112 -1329:1:191 -1330:0:2112 -1331:2:1652 -1332:2:1656 -1333:2:1657 -1334:2:1665 -1335:2:1666 -1336:2:1670 -1337:2:1671 -1338:2:1679 -1339:2:1684 -1340:2:1688 -1341:2:1689 -1342:2:1696 -1343:2:1697 -1344:2:1708 -1345:2:1716 -1346:2:1717 -1347:2:1721 -1348:2:1726 -1349:2:1727 -1350:0:2112 -1351:2:1739 -1352:0:2112 -1353:2:1560 -1354:0:2112 -1355:2:1561 -1356:0:2112 -1357:2:1562 -1358:2:1566 -1359:2:1567 -1360:2:1575 -1361:2:1576 -1362:2:1580 -1363:2:1581 -1364:2:1589 -1365:2:1594 -1366:2:1598 -1367:2:1599 -1368:2:1606 -1369:2:1607 -1370:2:1618 -1371:2:1626 -1372:2:1627 -1373:2:1631 -1374:2:1636 -1375:2:1637 -1376:0:2112 -1377:2:1649 -1378:0:2112 -1379:2:1651 -1380:0:2112 -1381:1:192 -1382:0:2112 -1383:2:1652 -1384:2:1656 -1385:2:1657 -1386:2:1665 -1387:2:1666 -1388:2:1670 -1389:2:1671 -1390:2:1679 -1391:2:1684 -1392:2:1688 -1393:2:1689 -1394:2:1696 -1395:2:1697 -1396:2:1708 -1397:2:1716 -1398:2:1717 -1399:2:1721 -1400:2:1726 -1401:2:1727 -1402:0:2112 -1403:2:1739 -1404:0:2112 -1405:2:1560 -1406:0:2112 -1407:2:1561 -1408:0:2112 -1409:2:1562 -1410:2:1566 -1411:2:1567 -1412:2:1575 -1413:2:1576 -1414:2:1580 -1415:2:1581 -1416:2:1589 -1417:2:1594 -1418:2:1598 -1419:2:1599 -1420:2:1606 -1421:2:1607 -1422:2:1618 -1423:2:1626 -1424:2:1627 -1425:2:1631 -1426:2:1636 -1427:2:1637 -1428:0:2112 -1429:2:1649 -1430:0:2112 -1431:2:1651 -1432:0:2112 -1433:1:193 -1434:1:197 -1435:1:198 -1436:1:206 -1437:1:207 -1438:1:211 -1439:1:212 -1440:1:220 -1441:1:225 -1442:1:229 -1443:1:230 -1444:1:237 -1445:1:238 -1446:1:249 -1447:1:250 -1448:1:251 -1449:1:262 -1450:1:267 -1451:1:268 -1452:0:2112 -1453:1:280 -1454:0:2112 -1455:2:1652 -1456:2:1656 -1457:2:1657 -1458:2:1665 -1459:2:1666 -1460:2:1670 -1461:2:1671 -1462:2:1679 -1463:2:1684 -1464:2:1688 -1465:2:1689 -1466:2:1696 -1467:2:1697 -1468:2:1708 -1469:2:1716 -1470:2:1717 -1471:2:1721 -1472:2:1726 -1473:2:1727 -1474:0:2112 -1475:2:1739 -1476:0:2112 -1477:2:1560 -1478:0:2112 -1479:2:1561 -1480:0:2112 -1481:2:1562 -1482:2:1566 -1483:2:1567 -1484:2:1575 -1485:2:1576 -1486:2:1580 -1487:2:1581 -1488:2:1589 -1489:2:1594 -1490:2:1598 -1491:2:1599 -1492:2:1606 -1493:2:1607 -1494:2:1618 -1495:2:1626 -1496:2:1627 -1497:2:1631 -1498:2:1636 -1499:2:1637 -1500:0:2112 -1501:2:1649 -1502:0:2112 -1503:2:1651 -1504:0:2112 -1505:1:282 -1506:0:2112 -1507:1:291 -1508:0:2112 -1509:1:293 -1510:0:2112 -1511:1:11 -1512:0:2112 -1513:2:1652 -1514:2:1656 -1515:2:1657 -1516:2:1665 -1517:2:1666 -1518:2:1670 -1519:2:1671 -1520:2:1679 -1521:2:1684 -1522:2:1688 -1523:2:1689 -1524:2:1696 -1525:2:1697 -1526:2:1708 -1527:2:1716 -1528:2:1717 -1529:2:1721 -1530:2:1726 -1531:2:1727 -1532:0:2112 -1533:2:1739 -1534:0:2112 -1535:2:1560 -1536:0:2112 -1537:2:1561 -1538:0:2112 -1539:2:1562 -1540:2:1566 -1541:2:1567 -1542:2:1575 -1543:2:1576 -1544:2:1580 -1545:2:1581 -1546:2:1589 -1547:2:1594 -1548:2:1598 -1549:2:1599 -1550:2:1606 -1551:2:1607 -1552:2:1618 -1553:2:1626 -1554:2:1627 -1555:2:1631 -1556:2:1636 -1557:2:1637 -1558:0:2112 -1559:2:1649 -1560:0:2112 -1561:2:1651 -1562:0:2112 -1563:1:12 -1564:1:16 -1565:1:17 -1566:1:25 -1567:1:26 -1568:1:27 -1569:1:39 -1570:1:44 -1571:1:48 -1572:1:49 -1573:1:56 -1574:1:57 -1575:1:68 -1576:1:69 -1577:1:70 -1578:1:81 -1579:1:86 -1580:1:87 -1581:0:2112 -1582:1:99 -1583:0:2112 -1584:2:1652 -1585:2:1656 -1586:2:1657 -1587:2:1665 -1588:2:1666 -1589:2:1670 -1590:2:1671 -1591:2:1679 -1592:2:1684 -1593:2:1688 -1594:2:1689 -1595:2:1696 -1596:2:1697 -1597:2:1708 -1598:2:1716 -1599:2:1717 -1600:2:1721 -1601:2:1726 -1602:2:1727 -1603:0:2112 -1604:2:1739 -1605:0:2112 -1606:2:1560 -1607:0:2112 -1608:2:1561 -1609:0:2112 -1610:2:1562 -1611:2:1566 -1612:2:1567 -1613:2:1575 -1614:2:1576 -1615:2:1580 -1616:2:1581 -1617:2:1589 -1618:2:1594 -1619:2:1598 -1620:2:1599 -1621:2:1606 -1622:2:1607 -1623:2:1618 -1624:2:1626 -1625:2:1627 -1626:2:1631 -1627:2:1636 -1628:2:1637 -1629:0:2112 -1630:2:1649 -1631:0:2112 -1632:2:1651 -1633:0:2112 -1634:1:101 -1635:0:2112 -1636:2:1652 -1637:2:1656 -1638:2:1657 -1639:2:1665 -1640:2:1666 -1641:2:1670 -1642:2:1671 -1643:2:1679 -1644:2:1684 -1645:2:1688 -1646:2:1689 -1647:2:1696 -1648:2:1697 -1649:2:1708 -1650:2:1716 -1651:2:1717 -1652:2:1721 -1653:2:1726 -1654:2:1727 -1655:0:2112 -1656:2:1739 -1657:0:2112 -1658:2:1560 -1659:0:2112 -1660:2:1561 -1661:0:2112 -1662:2:1562 -1663:2:1566 -1664:2:1567 -1665:2:1575 -1666:2:1576 -1667:2:1580 -1668:2:1581 -1669:2:1589 -1670:2:1594 -1671:2:1598 -1672:2:1599 -1673:2:1606 -1674:2:1607 -1675:2:1618 -1676:2:1626 -1677:2:1627 -1678:2:1631 -1679:2:1636 -1680:2:1637 -1681:0:2112 -1682:2:1649 -1683:0:2112 -1684:2:1651 -1685:0:2112 -1686:1:102 -1687:1:106 -1688:1:107 -1689:1:115 -1690:1:116 -1691:1:120 -1692:1:121 -1693:1:129 -1694:1:134 -1695:1:138 -1696:1:139 -1697:1:146 -1698:1:147 -1699:1:158 -1700:1:159 -1701:1:160 -1702:1:171 -1703:1:176 -1704:1:177 -1705:0:2112 -1706:1:189 -1707:0:2112 -1708:1:285 -1709:0:2112 -1710:2:1652 -1711:2:1656 -1712:2:1657 -1713:2:1665 -1714:2:1666 -1715:2:1670 -1716:2:1671 -1717:2:1679 -1718:2:1684 -1719:2:1688 -1720:2:1689 -1721:2:1696 -1722:2:1697 -1723:2:1708 -1724:2:1716 -1725:2:1717 -1726:2:1721 -1727:2:1726 -1728:2:1727 -1729:0:2112 -1730:2:1739 -1731:0:2112 -1732:2:1560 -1733:0:2112 -1734:2:1561 -1735:0:2112 -1736:2:1562 -1737:2:1566 -1738:2:1567 -1739:2:1575 -1740:2:1576 -1741:2:1580 -1742:2:1581 -1743:2:1589 -1744:2:1594 -1745:2:1598 -1746:2:1599 -1747:2:1606 -1748:2:1607 -1749:2:1618 -1750:2:1626 -1751:2:1627 -1752:2:1631 -1753:2:1636 -1754:2:1637 -1755:0:2112 -1756:2:1649 -1757:0:2112 -1758:2:1651 -1759:0:2112 -1760:1:286 -1761:0:2112 -1762:1:291 -1763:0:2112 -1764:1:293 -1765:0:2112 -1766:1:296 -1767:0:2112 -1768:2:1652 -1769:2:1656 -1770:2:1657 -1771:2:1665 -1772:2:1666 -1773:2:1670 -1774:2:1671 -1775:2:1679 -1776:2:1684 -1777:2:1688 -1778:2:1689 -1779:2:1696 -1780:2:1697 -1781:2:1708 -1782:2:1716 -1783:2:1717 -1784:2:1721 -1785:2:1726 -1786:2:1727 -1787:0:2112 -1788:2:1739 -1789:0:2112 -1790:2:1560 -1791:0:2112 -1792:2:1561 -1793:0:2112 -1794:2:1562 -1795:2:1566 -1796:2:1567 -1797:2:1575 -1798:2:1576 -1799:2:1580 -1800:2:1581 -1801:2:1589 -1802:2:1594 -1803:2:1598 -1804:2:1599 -1805:2:1606 -1806:2:1607 -1807:2:1618 -1808:2:1626 -1809:2:1627 -1810:2:1631 -1811:2:1636 -1812:2:1637 -1813:0:2112 -1814:2:1649 -1815:0:2112 -1816:2:1651 -1817:0:2112 -1818:1:301 -1819:0:2112 -1820:2:1652 -1821:2:1656 -1822:2:1657 -1823:2:1665 -1824:2:1666 -1825:2:1670 -1826:2:1671 -1827:2:1679 -1828:2:1684 -1829:2:1688 -1830:2:1689 -1831:2:1696 -1832:2:1697 -1833:2:1708 -1834:2:1716 -1835:2:1717 -1836:2:1721 -1837:2:1726 -1838:2:1727 -1839:0:2112 -1840:2:1739 -1841:0:2112 -1842:2:1560 -1843:0:2112 -1844:2:1561 -1845:0:2112 -1846:2:1562 -1847:2:1566 -1848:2:1567 -1849:2:1575 -1850:2:1576 -1851:2:1580 -1852:2:1581 -1853:2:1589 -1854:2:1594 -1855:2:1598 -1856:2:1599 -1857:2:1606 -1858:2:1607 -1859:2:1618 -1860:2:1626 -1861:2:1627 -1862:2:1631 -1863:2:1636 -1864:2:1637 -1865:0:2112 -1866:2:1649 -1867:0:2112 -1868:2:1651 -1869:0:2112 -1870:1:302 -1871:0:2112 -1872:2:1652 -1873:2:1656 -1874:2:1657 -1875:2:1665 -1876:2:1666 -1877:2:1670 -1878:2:1671 -1879:2:1679 -1880:2:1684 -1881:2:1688 -1882:2:1689 -1883:2:1696 -1884:2:1697 -1885:2:1708 -1886:2:1716 -1887:2:1717 -1888:2:1721 -1889:2:1726 -1890:2:1727 -1891:0:2112 -1892:2:1739 -1893:0:2112 -1894:2:1560 -1895:0:2112 -1896:2:1561 -1897:0:2112 -1898:2:1562 -1899:2:1566 -1900:2:1567 -1901:2:1575 -1902:2:1576 -1903:2:1580 -1904:2:1581 -1905:2:1589 -1906:2:1594 -1907:2:1598 -1908:2:1599 -1909:2:1606 -1910:2:1607 -1911:2:1618 -1912:2:1626 -1913:2:1627 -1914:2:1631 -1915:2:1636 -1916:2:1637 -1917:0:2112 -1918:2:1649 -1919:0:2112 -1920:2:1651 -1921:0:2112 -1922:1:303 -1923:0:2112 -1924:1:304 -1925:0:2112 -1926:1:305 -1927:0:2112 -1928:1:306 -1929:0:2112 -1930:1:308 -1931:0:2112 -1932:2:1652 -1933:2:1656 -1934:2:1657 -1935:2:1665 -1936:2:1666 -1937:2:1670 -1938:2:1671 -1939:2:1679 -1940:2:1684 -1941:2:1688 -1942:2:1689 -1943:2:1696 -1944:2:1697 -1945:2:1708 -1946:2:1716 -1947:2:1717 -1948:2:1721 -1949:2:1726 -1950:2:1727 -1951:0:2112 -1952:2:1739 -1953:0:2112 -1954:2:1560 -1955:0:2112 -1956:2:1561 -1957:0:2112 -1958:2:1562 -1959:2:1566 -1960:2:1567 -1961:2:1575 -1962:2:1576 -1963:2:1580 -1964:2:1581 -1965:2:1589 -1966:2:1594 -1967:2:1598 -1968:2:1599 -1969:2:1606 -1970:2:1607 -1971:2:1618 -1972:2:1626 -1973:2:1627 -1974:2:1631 -1975:2:1636 -1976:2:1637 -1977:0:2112 -1978:2:1649 -1979:0:2112 -1980:2:1651 -1981:0:2112 -1982:1:310 -1983:0:2112 -1984:2:1652 -1985:2:1656 -1986:2:1657 -1987:2:1665 -1988:2:1666 -1989:2:1670 -1990:2:1671 -1991:2:1679 -1992:2:1684 -1993:2:1688 -1994:2:1689 -1995:2:1696 -1996:2:1697 -1997:2:1708 -1998:2:1716 -1999:2:1717 -2000:2:1721 -2001:2:1726 -2002:2:1727 -2003:0:2112 -2004:2:1739 -2005:0:2112 -2006:2:1560 -2007:0:2112 -2008:2:1561 -2009:0:2112 -2010:2:1562 -2011:2:1566 -2012:2:1567 -2013:2:1575 -2014:2:1576 -2015:2:1580 -2016:2:1581 -2017:2:1589 -2018:2:1594 -2019:2:1598 -2020:2:1599 -2021:2:1606 -2022:2:1607 -2023:2:1618 -2024:2:1626 -2025:2:1627 -2026:2:1631 -2027:2:1636 -2028:2:1637 -2029:0:2112 -2030:2:1649 -2031:0:2112 -2032:2:1651 -2033:0:2112 -2034:1:311 -2035:1:315 -2036:1:316 -2037:1:324 -2038:1:325 -2039:1:326 -2040:1:338 -2041:1:343 -2042:1:347 -2043:1:348 -2044:1:355 -2045:1:356 -2046:1:367 -2047:1:368 -2048:1:369 -2049:1:380 -2050:1:385 -2051:1:386 -2052:0:2112 -2053:1:398 -2054:0:2112 -2055:2:1652 -2056:2:1656 -2057:2:1657 -2058:2:1665 -2059:2:1666 -2060:2:1670 -2061:2:1671 -2062:2:1679 -2063:2:1684 -2064:2:1688 -2065:2:1689 -2066:2:1696 -2067:2:1697 -2068:2:1708 -2069:2:1716 -2070:2:1717 -2071:2:1721 -2072:2:1726 -2073:2:1727 -2074:0:2112 -2075:2:1739 -2076:0:2112 -2077:2:1560 -2078:0:2112 -2079:2:1561 -2080:0:2112 -2081:2:1562 -2082:2:1566 -2083:2:1567 -2084:2:1575 -2085:2:1576 -2086:2:1580 -2087:2:1581 -2088:2:1589 -2089:2:1594 -2090:2:1598 -2091:2:1599 -2092:2:1606 -2093:2:1607 -2094:2:1618 -2095:2:1626 -2096:2:1627 -2097:2:1631 -2098:2:1636 -2099:2:1637 -2100:0:2112 -2101:2:1649 -2102:0:2112 -2103:2:1651 -2104:0:2112 -2105:1:400 -2106:0:2112 -2107:1:305 -2108:0:2112 -2109:1:306 -2110:0:2112 -2111:1:308 -2112:0:2112 -2113:2:1652 -2114:2:1656 -2115:2:1657 -2116:2:1665 -2117:2:1666 -2118:2:1670 -2119:2:1671 -2120:2:1679 -2121:2:1684 -2122:2:1688 -2123:2:1689 -2124:2:1696 -2125:2:1697 -2126:2:1708 -2127:2:1716 -2128:2:1717 -2129:2:1721 -2130:2:1726 -2131:2:1727 -2132:0:2112 -2133:2:1739 -2134:0:2112 -2135:2:1560 -2136:0:2112 -2137:2:1561 -2138:0:2112 -2139:2:1562 -2140:2:1566 -2141:2:1567 -2142:2:1575 -2143:2:1576 -2144:2:1580 -2145:2:1581 -2146:2:1589 -2147:2:1594 -2148:2:1598 -2149:2:1599 -2150:2:1606 -2151:2:1607 -2152:2:1618 -2153:2:1626 -2154:2:1627 -2155:2:1631 -2156:2:1636 -2157:2:1637 -2158:0:2112 -2159:2:1649 -2160:0:2112 -2161:2:1651 -2162:0:2112 -2163:1:310 -2164:0:2112 -2165:2:1652 -2166:2:1656 -2167:2:1657 -2168:2:1665 -2169:2:1666 -2170:2:1670 -2171:2:1671 -2172:2:1679 -2173:2:1684 -2174:2:1688 -2175:2:1689 -2176:2:1696 -2177:2:1697 -2178:2:1708 -2179:2:1716 -2180:2:1717 -2181:2:1721 -2182:2:1726 -2183:2:1727 -2184:0:2112 -2185:2:1739 -2186:0:2112 -2187:2:1560 -2188:0:2112 -2189:2:1561 -2190:0:2112 -2191:2:1562 -2192:2:1566 -2193:2:1567 -2194:2:1575 -2195:2:1576 -2196:2:1580 -2197:2:1581 -2198:2:1589 -2199:2:1594 -2200:2:1598 -2201:2:1599 -2202:2:1606 -2203:2:1607 -2204:2:1618 -2205:2:1626 -2206:2:1627 -2207:2:1631 -2208:2:1636 -2209:2:1637 -2210:0:2112 -2211:2:1649 -2212:0:2112 -2213:2:1651 -2214:0:2112 -2215:1:311 -2216:1:315 -2217:1:316 -2218:1:324 -2219:1:325 -2220:1:326 -2221:1:338 -2222:1:343 -2223:1:347 -2224:1:348 -2225:1:355 -2226:1:356 -2227:1:367 -2228:1:368 -2229:1:369 -2230:1:380 -2231:1:385 -2232:1:386 -2233:0:2112 -2234:1:398 -2235:0:2112 -2236:2:1652 -2237:2:1656 -2238:2:1657 -2239:2:1665 -2240:2:1666 -2241:2:1670 -2242:2:1671 -2243:2:1679 -2244:2:1684 -2245:2:1688 -2246:2:1689 -2247:2:1696 -2248:2:1697 -2249:2:1708 -2250:2:1716 -2251:2:1717 -2252:2:1721 -2253:2:1726 -2254:2:1727 -2255:0:2112 -2256:2:1739 -2257:0:2112 -2258:2:1560 -2259:0:2112 -2260:2:1561 -2261:0:2112 -2262:2:1562 -2263:2:1566 -2264:2:1567 -2265:2:1575 -2266:2:1576 -2267:2:1580 -2268:2:1581 -2269:2:1589 -2270:2:1594 -2271:2:1598 -2272:2:1599 -2273:2:1606 -2274:2:1607 -2275:2:1618 -2276:2:1626 -2277:2:1627 -2278:2:1631 -2279:2:1636 -2280:2:1637 -2281:0:2112 -2282:2:1649 -2283:0:2112 -2284:2:1651 -2285:0:2112 -2286:1:400 -2287:0:2112 -2288:1:404 -2289:0:2112 -2290:1:9 -2291:0:2112 -2292:1:10 -2293:0:2112 -2294:1:11 -2295:0:2112 -2296:2:1652 -2297:2:1656 -2298:2:1657 -2299:2:1665 -2300:2:1666 -2301:2:1670 -2302:2:1671 -2303:2:1679 -2304:2:1684 -2305:2:1688 -2306:2:1689 -2307:2:1696 -2308:2:1697 -2309:2:1708 -2310:2:1716 -2311:2:1717 -2312:2:1721 -2313:2:1726 -2314:2:1727 -2315:0:2112 -2316:2:1739 -2317:0:2112 -2318:2:1560 -2319:0:2112 -2320:2:1561 -2321:0:2112 -2322:2:1562 -2323:2:1566 -2324:2:1567 -2325:2:1575 -2326:2:1576 -2327:2:1580 -2328:2:1581 -2329:2:1589 -2330:2:1594 -2331:2:1598 -2332:2:1599 -2333:2:1606 -2334:2:1607 -2335:2:1618 -2336:2:1626 -2337:2:1627 -2338:2:1631 -2339:2:1636 -2340:2:1637 -2341:0:2112 -2342:2:1649 -2343:0:2112 -2344:2:1651 -2345:0:2112 -2346:1:12 -2347:1:16 -2348:1:17 -2349:1:25 -2350:1:26 -2351:1:27 -2352:1:39 -2353:1:44 -2354:1:48 -2355:1:49 -2356:1:56 -2357:1:57 -2358:1:68 -2359:1:69 -2360:1:70 -2361:1:81 -2362:1:86 -2363:1:87 -2364:0:2112 -2365:1:99 -2366:0:2112 -2367:2:1652 -2368:2:1656 -2369:2:1657 -2370:2:1665 -2371:2:1666 -2372:2:1670 -2373:2:1671 -2374:2:1679 -2375:2:1684 -2376:2:1688 -2377:2:1689 -2378:2:1696 -2379:2:1697 -2380:2:1708 -2381:2:1716 -2382:2:1717 -2383:2:1721 -2384:2:1726 -2385:2:1727 -2386:0:2112 -2387:2:1739 -2388:0:2112 -2389:2:1560 -2390:0:2112 -2391:2:1561 -2392:0:2112 -2393:2:1562 -2394:2:1566 -2395:2:1567 -2396:2:1575 -2397:2:1576 -2398:2:1580 -2399:2:1581 -2400:2:1589 -2401:2:1594 -2402:2:1598 -2403:2:1599 -2404:2:1606 -2405:2:1607 -2406:2:1618 -2407:2:1626 -2408:2:1627 -2409:2:1631 -2410:2:1636 -2411:2:1637 -2412:0:2112 -2413:2:1649 -2414:0:2112 -2415:2:1651 -2416:0:2112 -2417:1:101 -2418:0:2112 -2419:2:1652 -2420:2:1656 -2421:2:1657 -2422:2:1665 -2423:2:1666 -2424:2:1670 -2425:2:1671 -2426:2:1679 -2427:2:1684 -2428:2:1688 -2429:2:1689 -2430:2:1696 -2431:2:1697 -2432:2:1708 -2433:2:1716 -2434:2:1717 -2435:2:1721 -2436:2:1726 -2437:2:1727 -2438:0:2112 -2439:2:1739 -2440:0:2112 -2441:2:1560 -2442:0:2112 -2443:2:1561 -2444:0:2112 -2445:2:1562 -2446:2:1566 -2447:2:1567 -2448:2:1575 -2449:2:1576 -2450:2:1580 -2451:2:1581 -2452:2:1589 -2453:2:1594 -2454:2:1598 -2455:2:1599 -2456:2:1606 -2457:2:1607 -2458:2:1618 -2459:2:1626 -2460:2:1627 -2461:2:1631 -2462:2:1636 -2463:2:1637 -2464:0:2112 -2465:2:1649 -2466:0:2112 -2467:2:1651 -2468:0:2112 -2469:1:102 -2470:1:106 -2471:1:107 -2472:1:115 -2473:1:116 -2474:1:120 -2475:1:121 -2476:1:129 -2477:1:134 -2478:1:138 -2479:1:139 -2480:1:146 -2481:1:147 -2482:1:158 -2483:1:159 -2484:1:160 -2485:1:171 -2486:1:176 -2487:1:177 -2488:0:2112 -2489:1:189 -2490:0:2112 -2491:1:191 -2492:0:2112 -2493:2:1652 -2494:2:1656 -2495:2:1657 -2496:2:1665 -2497:2:1666 -2498:2:1670 -2499:2:1671 -2500:2:1679 -2501:2:1684 -2502:2:1688 -2503:2:1689 -2504:2:1696 -2505:2:1697 -2506:2:1708 -2507:2:1716 -2508:2:1717 -2509:2:1721 -2510:2:1726 -2511:2:1727 -2512:0:2112 -2513:2:1739 -2514:0:2112 -2515:2:1560 -2516:0:2112 -2517:2:1561 -2518:0:2112 -2519:2:1562 -2520:2:1566 -2521:2:1567 -2522:2:1575 -2523:2:1576 -2524:2:1580 -2525:2:1581 -2526:2:1589 -2527:2:1594 -2528:2:1598 -2529:2:1599 -2530:2:1606 -2531:2:1607 -2532:2:1618 -2533:2:1626 -2534:2:1627 -2535:2:1631 -2536:2:1636 -2537:2:1637 -2538:0:2112 -2539:2:1649 -2540:0:2112 -2541:2:1651 -2542:0:2112 -2543:1:192 -2544:0:2112 -2545:2:1652 -2546:2:1656 -2547:2:1657 -2548:2:1665 -2549:2:1666 -2550:2:1670 -2551:2:1671 -2552:2:1679 -2553:2:1684 -2554:2:1688 -2555:2:1689 -2556:2:1696 -2557:2:1697 -2558:2:1708 -2559:2:1716 -2560:2:1717 -2561:2:1721 -2562:2:1726 -2563:2:1727 -2564:0:2112 -2565:2:1739 -2566:0:2112 -2567:2:1560 -2568:0:2112 -2569:2:1561 -2570:0:2112 -2571:2:1562 -2572:2:1566 -2573:2:1567 -2574:2:1575 -2575:2:1576 -2576:2:1580 -2577:2:1581 -2578:2:1589 -2579:2:1594 -2580:2:1598 -2581:2:1599 -2582:2:1606 -2583:2:1607 -2584:2:1618 -2585:2:1626 -2586:2:1627 -2587:2:1631 -2588:2:1636 -2589:2:1637 -2590:0:2112 -2591:2:1649 -2592:0:2112 -2593:2:1651 -2594:0:2112 -2595:1:193 -2596:1:197 -2597:1:198 -2598:1:206 -2599:1:207 -2600:1:211 -2601:1:212 -2602:1:220 -2603:1:225 -2604:1:229 -2605:1:230 -2606:1:237 -2607:1:238 -2608:1:249 -2609:1:250 -2610:1:251 -2611:1:262 -2612:1:267 -2613:1:268 -2614:0:2112 -2615:1:280 -2616:0:2112 -2617:2:1652 -2618:2:1656 -2619:2:1657 -2620:2:1665 -2621:2:1666 -2622:2:1670 -2623:2:1671 -2624:2:1679 -2625:2:1684 -2626:2:1688 -2627:2:1689 -2628:2:1696 -2629:2:1697 -2630:2:1708 -2631:2:1716 -2632:2:1717 -2633:2:1721 -2634:2:1726 -2635:2:1727 -2636:0:2112 -2637:2:1739 -2638:0:2112 -2639:2:1560 -2640:0:2112 -2641:2:1561 -2642:0:2112 -2643:2:1562 -2644:2:1566 -2645:2:1567 -2646:2:1575 -2647:2:1576 -2648:2:1580 -2649:2:1581 -2650:2:1589 -2651:2:1594 -2652:2:1598 -2653:2:1599 -2654:2:1606 -2655:2:1607 -2656:2:1618 -2657:2:1626 -2658:2:1627 -2659:2:1631 -2660:2:1636 -2661:2:1637 -2662:0:2112 -2663:2:1649 -2664:0:2112 -2665:2:1651 -2666:0:2112 -2667:1:282 -2668:0:2112 -2669:1:291 -2670:0:2112 -2671:1:293 -2672:0:2112 -2673:1:11 -2674:0:2112 -2675:2:1652 -2676:2:1656 -2677:2:1657 -2678:2:1665 -2679:2:1666 -2680:2:1670 -2681:2:1671 -2682:2:1679 -2683:2:1684 -2684:2:1688 -2685:2:1689 -2686:2:1696 -2687:2:1697 -2688:2:1708 -2689:2:1716 -2690:2:1717 -2691:2:1721 -2692:2:1726 -2693:2:1727 -2694:0:2112 -2695:2:1739 -2696:0:2112 -2697:2:1560 -2698:0:2112 -2699:2:1561 -2700:0:2112 -2701:2:1562 -2702:2:1566 -2703:2:1567 -2704:2:1575 -2705:2:1576 -2706:2:1580 -2707:2:1581 -2708:2:1589 -2709:2:1594 -2710:2:1598 -2711:2:1599 -2712:2:1606 -2713:2:1607 -2714:2:1618 -2715:2:1626 -2716:2:1627 -2717:2:1631 -2718:2:1636 -2719:2:1637 -2720:0:2112 -2721:2:1649 -2722:0:2112 -2723:2:1651 -2724:0:2112 -2725:1:12 -2726:1:16 -2727:1:17 -2728:1:25 -2729:1:34 -2730:1:35 -2731:1:39 -2732:1:44 -2733:1:48 -2734:1:49 -2735:1:56 -2736:1:57 -2737:1:68 -2738:1:69 -2739:1:72 -2740:1:73 -2741:1:81 -2742:1:86 -2743:1:87 -2744:0:2112 -2745:1:99 -2746:0:2112 -2747:2:1652 -2748:2:1656 -2749:2:1657 -2750:2:1665 -2751:2:1666 -2752:2:1670 -2753:2:1671 -2754:2:1679 -2755:2:1684 -2756:2:1688 -2757:2:1689 -2758:2:1696 -2759:2:1697 -2760:2:1708 -2761:2:1716 -2762:2:1717 -2763:2:1721 -2764:2:1726 -2765:2:1727 -2766:0:2112 -2767:2:1739 -2768:0:2112 -2769:2:1560 -2770:0:2112 -2771:2:1561 -2772:0:2112 -2773:2:1562 -2774:2:1566 -2775:2:1567 -2776:2:1575 -2777:2:1576 -2778:2:1580 -2779:2:1581 -2780:2:1589 -2781:2:1594 -2782:2:1598 -2783:2:1599 -2784:2:1606 -2785:2:1607 -2786:2:1618 -2787:2:1626 -2788:2:1627 -2789:2:1631 -2790:2:1636 -2791:2:1637 -2792:0:2112 -2793:2:1649 -2794:0:2112 -2795:2:1651 -2796:0:2112 -2797:1:101 -2798:0:2112 -2799:2:1652 -2800:2:1656 -2801:2:1657 -2802:2:1665 -2803:2:1666 -2804:2:1670 -2805:2:1671 -2806:2:1679 -2807:2:1684 -2808:2:1688 -2809:2:1689 -2810:2:1696 -2811:2:1697 -2812:2:1708 -2813:2:1716 -2814:2:1717 -2815:2:1721 -2816:2:1726 -2817:2:1727 -2818:0:2112 -2819:2:1739 -2820:0:2112 -2821:2:1560 -2822:0:2112 -2823:2:1561 -2824:0:2112 -2825:2:1562 -2826:2:1566 -2827:2:1567 -2828:2:1575 -2829:2:1576 -2830:2:1580 -2831:2:1581 -2832:2:1589 -2833:2:1594 -2834:2:1598 -2835:2:1599 -2836:2:1606 -2837:2:1607 -2838:2:1618 -2839:2:1626 -2840:2:1627 -2841:2:1631 -2842:2:1636 -2843:2:1637 -2844:0:2112 -2845:2:1649 -2846:0:2112 -2847:2:1651 -2848:0:2112 -2849:1:102 -2850:1:106 -2851:1:107 -2852:1:115 -2853:1:124 -2854:1:125 -2855:1:129 -2856:1:134 -2857:1:138 -2858:1:139 -2859:1:146 -2860:1:147 -2861:1:158 -2862:1:159 -2863:1:162 -2864:1:163 -2865:1:171 -2866:1:176 -2867:1:177 -2868:0:2112 -2869:1:189 -2870:0:2112 -2871:1:285 -2872:0:2112 -2873:2:1652 -2874:2:1656 -2875:2:1657 -2876:2:1665 -2877:2:1666 -2878:2:1670 -2879:2:1671 -2880:2:1679 -2881:2:1684 -2882:2:1688 -2883:2:1689 -2884:2:1696 -2885:2:1697 -2886:2:1708 -2887:2:1716 -2888:2:1717 -2889:2:1721 -2890:2:1726 -2891:2:1727 -2892:0:2112 -2893:2:1739 -2894:0:2112 -2895:2:1560 -2896:0:2112 -2897:2:1561 -2898:0:2112 -2899:2:1562 -2900:2:1566 -2901:2:1567 -2902:2:1575 -2903:2:1576 -2904:2:1580 -2905:2:1581 -2906:2:1589 -2907:2:1594 -2908:2:1598 -2909:2:1599 -2910:2:1606 -2911:2:1607 -2912:2:1618 -2913:2:1626 -2914:2:1627 -2915:2:1631 -2916:2:1636 -2917:2:1637 -2918:0:2112 -2919:2:1649 -2920:0:2112 -2921:2:1651 -2922:0:2112 -2923:1:286 -2924:0:2112 -2925:1:291 -2926:0:2112 -2927:1:293 -2928:0:2112 -2929:1:296 -2930:0:2112 -2931:2:1652 -2932:2:1656 -2933:2:1657 -2934:2:1665 -2935:2:1666 -2936:2:1670 -2937:2:1671 -2938:2:1679 -2939:2:1684 -2940:2:1688 -2941:2:1689 -2942:2:1696 -2943:2:1697 -2944:2:1708 -2945:2:1716 -2946:2:1717 -2947:2:1721 -2948:2:1726 -2949:2:1727 -2950:0:2112 -2951:2:1739 -2952:0:2112 -2953:2:1560 -2954:0:2112 -2955:2:1561 -2956:0:2112 -2957:2:1562 -2958:2:1566 -2959:2:1567 -2960:2:1575 -2961:2:1576 -2962:2:1580 -2963:2:1581 -2964:2:1589 -2965:2:1594 -2966:2:1598 -2967:2:1599 -2968:2:1606 -2969:2:1607 -2970:2:1618 -2971:2:1626 -2972:2:1627 -2973:2:1631 -2974:2:1636 -2975:2:1637 -2976:0:2112 -2977:2:1649 -2978:0:2112 -2979:2:1651 -2980:0:2112 -2981:1:301 -2982:0:2112 -2983:2:1652 -2984:2:1656 -2985:2:1657 -2986:2:1665 -2987:2:1666 -2988:2:1670 -2989:2:1671 -2990:2:1679 -2991:2:1684 -2992:2:1688 -2993:2:1689 -2994:2:1696 -2995:2:1697 -2996:2:1708 -2997:2:1716 -2998:2:1717 -2999:2:1721 -3000:2:1726 -3001:2:1727 -3002:0:2112 -3003:2:1739 -3004:0:2112 -3005:2:1560 -3006:0:2112 -3007:2:1561 -3008:0:2112 -3009:2:1562 -3010:2:1566 -3011:2:1567 -3012:2:1575 -3013:2:1576 -3014:2:1580 -3015:2:1581 -3016:2:1589 -3017:2:1594 -3018:2:1598 -3019:2:1599 -3020:2:1606 -3021:2:1607 -3022:2:1618 -3023:2:1626 -3024:2:1627 -3025:2:1631 -3026:2:1636 -3027:2:1637 -3028:0:2112 -3029:2:1649 -3030:0:2112 -3031:2:1651 -3032:0:2112 -3033:1:302 -3034:0:2112 -3035:2:1652 -3036:2:1656 -3037:2:1657 -3038:2:1665 -3039:2:1666 -3040:2:1670 -3041:2:1671 -3042:2:1679 -3043:2:1684 -3044:2:1688 -3045:2:1689 -3046:2:1696 -3047:2:1697 -3048:2:1708 -3049:2:1716 -3050:2:1717 -3051:2:1721 -3052:2:1726 -3053:2:1727 -3054:0:2112 -3055:2:1739 -3056:0:2112 -3057:2:1560 -3058:0:2112 -3059:2:1561 -3060:0:2112 -3061:2:1562 -3062:2:1566 -3063:2:1567 -3064:2:1575 -3065:2:1576 -3066:2:1580 -3067:2:1581 -3068:2:1589 -3069:2:1594 -3070:2:1598 -3071:2:1599 -3072:2:1606 -3073:2:1607 -3074:2:1618 -3075:2:1626 -3076:2:1627 -3077:2:1631 -3078:2:1636 -3079:2:1637 -3080:0:2112 -3081:2:1649 -3082:0:2112 -3083:2:1651 -3084:0:2112 -3085:1:303 -3086:0:2112 -3087:1:304 -3088:0:2112 -3089:1:305 -3090:0:2112 -3091:1:306 -3092:0:2112 -3093:1:308 -3094:0:2112 -3095:2:1652 -3096:2:1656 -3097:2:1657 -3098:2:1665 -3099:2:1666 -3100:2:1670 -3101:2:1671 -3102:2:1679 -3103:2:1684 -3104:2:1688 -3105:2:1689 -3106:2:1696 -3107:2:1697 -3108:2:1708 -3109:2:1716 -3110:2:1717 -3111:2:1721 -3112:2:1726 -3113:2:1727 -3114:0:2112 -3115:2:1739 -3116:0:2112 -3117:2:1560 -3118:0:2112 -3119:2:1561 -3120:0:2112 -3121:2:1562 -3122:2:1566 -3123:2:1567 -3124:2:1575 -3125:2:1576 -3126:2:1580 -3127:2:1581 -3128:2:1589 -3129:2:1594 -3130:2:1598 -3131:2:1599 -3132:2:1606 -3133:2:1607 -3134:2:1618 -3135:2:1626 -3136:2:1627 -3137:2:1631 -3138:2:1636 -3139:2:1637 -3140:0:2112 -3141:2:1649 -3142:0:2112 -3143:2:1651 -3144:0:2112 -3145:1:310 -3146:0:2112 -3147:2:1652 -3148:2:1656 -3149:2:1657 -3150:2:1665 -3151:2:1666 -3152:2:1670 -3153:2:1671 -3154:2:1679 -3155:2:1684 -3156:2:1688 -3157:2:1689 -3158:2:1696 -3159:2:1697 -3160:2:1708 -3161:2:1716 -3162:2:1717 -3163:2:1721 -3164:2:1726 -3165:2:1727 -3166:0:2112 -3167:2:1739 -3168:0:2112 -3169:2:1560 -3170:0:2112 -3171:2:1561 -3172:0:2112 -3173:2:1562 -3174:2:1566 -3175:2:1567 -3176:2:1575 -3177:2:1576 -3178:2:1580 -3179:2:1581 -3180:2:1589 -3181:2:1594 -3182:2:1598 -3183:2:1599 -3184:2:1606 -3185:2:1607 -3186:2:1618 -3187:2:1626 -3188:2:1627 -3189:2:1631 -3190:2:1636 -3191:2:1637 -3192:0:2112 -3193:2:1649 -3194:0:2112 -3195:2:1651 -3196:0:2112 -3197:1:311 -3198:1:315 -3199:1:316 -3200:1:324 -3201:1:333 -3202:1:334 -3203:1:338 -3204:1:343 -3205:1:347 -3206:1:348 -3207:1:355 -3208:1:356 -3209:1:367 -3210:1:368 -3211:1:371 -3212:1:372 -3213:1:380 -3214:1:385 -3215:1:386 -3216:0:2112 -3217:1:398 -3218:0:2112 -3219:2:1652 -3220:2:1656 -3221:2:1657 -3222:2:1665 -3223:2:1666 -3224:2:1670 -3225:2:1671 -3226:2:1679 -3227:2:1684 -3228:2:1688 -3229:2:1689 -3230:2:1696 -3231:2:1697 -3232:2:1708 -3233:2:1716 -3234:2:1717 -3235:2:1721 -3236:2:1726 -3237:2:1727 -3238:0:2112 -3239:2:1739 -3240:0:2112 -3241:2:1560 -3242:0:2112 -3243:2:1561 -3244:0:2112 -3245:2:1562 -3246:2:1566 -3247:2:1567 -3248:2:1575 -3249:2:1576 -3250:2:1580 -3251:2:1581 -3252:2:1589 -3253:2:1594 -3254:2:1598 -3255:2:1599 -3256:2:1606 -3257:2:1607 -3258:2:1618 -3259:2:1626 -3260:2:1627 -3261:2:1631 -3262:2:1636 -3263:2:1637 -3264:0:2112 -3265:2:1649 -3266:0:2112 -3267:2:1651 -3268:0:2112 -3269:1:400 -3270:0:2112 -3271:1:305 -3272:0:2112 -3273:1:306 -3274:0:2112 -3275:1:308 -3276:0:2112 -3277:2:1652 -3278:2:1656 -3279:2:1657 -3280:2:1665 -3281:2:1666 -3282:2:1670 -3283:2:1671 -3284:2:1679 -3285:2:1684 -3286:2:1688 -3287:2:1689 -3288:2:1696 -3289:2:1697 -3290:2:1708 -3291:2:1716 -3292:2:1717 -3293:2:1721 -3294:2:1726 -3295:2:1727 -3296:0:2112 -3297:2:1739 -3298:0:2112 -3299:2:1560 -3300:0:2112 -3301:2:1561 -3302:0:2112 -3303:2:1562 -3304:2:1566 -3305:2:1567 -3306:2:1575 -3307:2:1576 -3308:2:1580 -3309:2:1581 -3310:2:1589 -3311:2:1594 -3312:2:1598 -3313:2:1599 -3314:2:1606 -3315:2:1607 -3316:2:1618 -3317:2:1626 -3318:2:1627 -3319:2:1631 -3320:2:1636 -3321:2:1637 -3322:0:2112 -3323:2:1649 -3324:0:2112 -3325:2:1651 -3326:0:2112 -3327:1:310 -3328:0:2112 -3329:2:1652 -3330:2:1656 -3331:2:1657 -3332:2:1665 -3333:2:1666 -3334:2:1670 -3335:2:1671 -3336:2:1679 -3337:2:1684 -3338:2:1688 -3339:2:1689 -3340:2:1696 -3341:2:1697 -3342:2:1708 -3343:2:1716 -3344:2:1717 -3345:2:1721 -3346:2:1726 -3347:2:1727 -3348:0:2112 -3349:2:1739 -3350:0:2112 -3351:2:1560 -3352:0:2112 -3353:2:1561 -3354:0:2112 -3355:2:1562 -3356:2:1566 -3357:2:1567 -3358:2:1575 -3359:2:1576 -3360:2:1580 -3361:2:1581 -3362:2:1589 -3363:2:1594 -3364:2:1598 -3365:2:1599 -3366:2:1606 -3367:2:1607 -3368:2:1618 -3369:2:1626 -3370:2:1627 -3371:2:1631 -3372:2:1636 -3373:2:1637 -3374:0:2112 -3375:2:1649 -3376:0:2112 -3377:2:1651 -3378:0:2112 -3379:1:311 -3380:1:315 -3381:1:316 -3382:1:324 -3383:1:333 -3384:1:334 -3385:1:338 -3386:1:343 -3387:1:347 -3388:1:348 -3389:1:355 -3390:1:356 -3391:1:367 -3392:1:368 -3393:1:371 -3394:1:372 -3395:1:380 -3396:1:385 -3397:1:386 -3398:0:2112 -3399:1:398 -3400:0:2112 -3401:2:1652 -3402:2:1656 -3403:2:1657 -3404:2:1665 -3405:2:1666 -3406:2:1670 -3407:2:1671 -3408:2:1679 -3409:2:1684 -3410:2:1688 -3411:2:1689 -3412:2:1696 -3413:2:1697 -3414:2:1708 -3415:2:1716 -3416:2:1717 -3417:2:1721 -3418:2:1726 -3419:2:1727 -3420:0:2112 -3421:2:1739 -3422:0:2112 -3423:2:1560 -3424:0:2112 -3425:2:1561 -3426:0:2112 -3427:2:1562 -3428:2:1566 -3429:2:1567 -3430:2:1575 -3431:2:1576 -3432:2:1580 -3433:2:1581 -3434:2:1589 -3435:2:1594 -3436:2:1598 -3437:2:1599 -3438:2:1606 -3439:2:1607 -3440:2:1618 -3441:2:1626 -3442:2:1627 -3443:2:1631 -3444:2:1636 -3445:2:1637 -3446:0:2112 -3447:2:1649 -3448:0:2112 -3449:2:1651 -3450:0:2112 -3451:1:400 -3452:0:2112 -3453:1:404 -3454:0:2112 -3455:1:9 -3456:0:2112 -3457:1:10 -3458:0:2112 -3459:1:11 -3460:0:2112 -3461:2:1652 -3462:2:1656 -3463:2:1657 -3464:2:1665 -3465:2:1666 -3466:2:1670 -3467:2:1671 -3468:2:1679 -3469:2:1684 -3470:2:1688 -3471:2:1689 -3472:2:1696 -3473:2:1697 -3474:2:1708 -3475:2:1716 -3476:2:1717 -3477:2:1721 -3478:2:1726 -3479:2:1727 -3480:0:2112 -3481:2:1739 -3482:0:2112 -3483:2:1560 -3484:0:2112 -3485:2:1561 -3486:0:2112 -3487:2:1562 -3488:2:1566 -3489:2:1567 -3490:2:1575 -3491:2:1576 -3492:2:1580 -3493:2:1581 -3494:2:1589 -3495:2:1594 -3496:2:1598 -3497:2:1599 -3498:2:1606 -3499:2:1607 -3500:2:1618 -3501:2:1626 -3502:2:1627 -3503:2:1631 -3504:2:1636 -3505:2:1637 -3506:0:2112 -3507:2:1649 -3508:0:2112 -3509:2:1651 -3510:0:2112 -3511:1:12 -3512:1:16 -3513:1:17 -3514:1:25 -3515:1:34 -3516:1:35 -3517:1:39 -3518:1:44 -3519:1:48 -3520:1:49 -3521:1:56 -3522:1:57 -3523:1:68 -3524:1:69 -3525:1:72 -3526:1:73 -3527:1:81 -3528:1:86 -3529:1:87 -3530:0:2112 -3531:1:99 -3532:0:2112 -3533:2:1652 -3534:2:1656 -3535:2:1657 -3536:2:1665 -3537:2:1666 -3538:2:1670 -3539:2:1671 -3540:2:1679 -3541:2:1684 -3542:2:1688 -3543:2:1689 -3544:2:1696 -3545:2:1697 -3546:2:1708 -3547:2:1716 -3548:2:1717 -3549:2:1721 -3550:2:1726 -3551:2:1727 -3552:0:2112 -3553:2:1739 -3554:0:2112 -3555:2:1560 -3556:0:2112 -3557:2:1561 -3558:0:2112 -3559:2:1562 -3560:2:1566 -3561:2:1567 -3562:2:1575 -3563:2:1576 -3564:2:1580 -3565:2:1581 -3566:2:1589 -3567:2:1594 -3568:2:1598 -3569:2:1599 -3570:2:1606 -3571:2:1607 -3572:2:1618 -3573:2:1626 -3574:2:1627 -3575:2:1631 -3576:2:1636 -3577:2:1637 -3578:0:2112 -3579:2:1649 -3580:0:2112 -3581:2:1651 -3582:0:2112 -3583:1:101 -3584:0:2112 -3585:2:1652 -3586:2:1656 -3587:2:1657 -3588:2:1665 -3589:2:1666 -3590:2:1670 -3591:2:1671 -3592:2:1679 -3593:2:1684 -3594:2:1688 -3595:2:1689 -3596:2:1696 -3597:2:1697 -3598:2:1708 -3599:2:1716 -3600:2:1717 -3601:2:1721 -3602:2:1726 -3603:2:1727 -3604:0:2112 -3605:2:1739 -3606:0:2112 -3607:2:1560 -3608:0:2112 -3609:2:1561 -3610:0:2112 -3611:2:1562 -3612:2:1566 -3613:2:1567 -3614:2:1575 -3615:2:1576 -3616:2:1580 -3617:2:1581 -3618:2:1589 -3619:2:1594 -3620:2:1598 -3621:2:1599 -3622:2:1606 -3623:2:1607 -3624:2:1618 -3625:2:1626 -3626:2:1627 -3627:2:1631 -3628:2:1636 -3629:2:1637 -3630:0:2112 -3631:2:1649 -3632:0:2112 -3633:2:1651 -3634:0:2112 -3635:1:102 -3636:1:106 -3637:1:107 -3638:1:115 -3639:1:124 -3640:1:125 -3641:1:129 -3642:1:134 -3643:1:138 -3644:1:139 -3645:1:146 -3646:1:147 -3647:1:158 -3648:1:159 -3649:1:162 -3650:1:163 -3651:1:171 -3652:1:176 -3653:1:177 -3654:0:2112 -3655:1:189 -3656:0:2112 -3657:1:191 -3658:0:2112 -3659:2:1652 -3660:2:1656 -3661:2:1657 -3662:2:1665 -3663:2:1666 -3664:2:1670 -3665:2:1671 -3666:2:1679 -3667:2:1684 -3668:2:1688 -3669:2:1689 -3670:2:1696 -3671:2:1697 -3672:2:1708 -3673:2:1716 -3674:2:1717 -3675:2:1721 -3676:2:1726 -3677:2:1727 -3678:0:2112 -3679:2:1739 -3680:0:2112 -3681:2:1560 -3682:0:2112 -3683:2:1561 -3684:0:2112 -3685:2:1562 -3686:2:1566 -3687:2:1567 -3688:2:1575 -3689:2:1576 -3690:2:1580 -3691:2:1581 -3692:2:1589 -3693:2:1594 -3694:2:1598 -3695:2:1599 -3696:2:1606 -3697:2:1607 -3698:2:1618 -3699:2:1626 -3700:2:1627 -3701:2:1631 -3702:2:1636 -3703:2:1637 -3704:0:2112 -3705:2:1649 -3706:0:2112 -3707:2:1651 -3708:0:2112 -3709:1:192 -3710:0:2112 -3711:2:1652 -3712:2:1656 -3713:2:1657 -3714:2:1665 -3715:2:1666 -3716:2:1670 -3717:2:1671 -3718:2:1679 -3719:2:1684 -3720:2:1688 -3721:2:1689 -3722:2:1696 -3723:2:1697 -3724:2:1708 -3725:2:1716 -3726:2:1717 -3727:2:1721 -3728:2:1726 -3729:2:1727 -3730:0:2112 -3731:2:1739 -3732:0:2112 -3733:2:1560 -3734:0:2112 -3735:2:1561 -3736:0:2112 -3737:2:1562 -3738:2:1566 -3739:2:1567 -3740:2:1575 -3741:2:1576 -3742:2:1580 -3743:2:1581 -3744:2:1589 -3745:2:1594 -3746:2:1598 -3747:2:1599 -3748:2:1606 -3749:2:1607 -3750:2:1618 -3751:2:1626 -3752:2:1627 -3753:2:1631 -3754:2:1636 -3755:2:1637 -3756:0:2112 -3757:2:1649 -3758:0:2112 -3759:2:1651 -3760:0:2112 -3761:1:193 -3762:1:197 -3763:1:198 -3764:1:206 -3765:1:215 -3766:1:216 -3767:1:220 -3768:1:225 -3769:1:229 -3770:1:230 -3771:1:237 -3772:1:238 -3773:1:249 -3774:1:250 -3775:1:253 -3776:1:254 -3777:1:262 -3778:1:267 -3779:1:268 -3780:0:2112 -3781:1:280 -3782:0:2112 -3783:2:1652 -3784:2:1656 -3785:2:1657 -3786:2:1665 -3787:2:1666 -3788:2:1670 -3789:2:1671 -3790:2:1679 -3791:2:1684 -3792:2:1688 -3793:2:1689 -3794:2:1696 -3795:2:1697 -3796:2:1708 -3797:2:1716 -3798:2:1717 -3799:2:1721 -3800:2:1726 -3801:2:1727 -3802:0:2112 -3803:2:1739 -3804:0:2112 -3805:2:1560 -3806:0:2112 -3807:2:1561 -3808:0:2112 -3809:2:1562 -3810:2:1566 -3811:2:1567 -3812:2:1575 -3813:2:1576 -3814:2:1580 -3815:2:1581 -3816:2:1589 -3817:2:1594 -3818:2:1598 -3819:2:1599 -3820:2:1606 -3821:2:1607 -3822:2:1618 -3823:2:1626 -3824:2:1627 -3825:2:1631 -3826:2:1636 -3827:2:1637 -3828:0:2112 -3829:2:1649 -3830:0:2112 -3831:1:282 -3832:0:2112 -3833:1:291 -3834:0:2112 -3835:1:293 -3836:0:2112 -3837:1:11 -3838:0:2112 -3839:1:12 -3840:1:16 -3841:1:17 -3842:1:25 -3843:1:26 -3844:1:27 -3845:1:39 -3846:1:44 -3847:1:48 -3848:1:49 -3849:1:56 -3850:1:57 -3851:1:68 -3852:1:69 -3853:1:70 -3854:1:81 -3855:1:86 -3856:1:87 -3857:0:2112 -3858:1:99 -3859:0:2112 -3860:1:101 -3861:0:2112 -3862:1:102 -3863:1:106 -3864:1:107 -3865:1:115 -3866:1:116 -3867:1:120 -3868:1:121 -3869:1:129 -3870:1:134 -3871:1:138 -3872:1:139 -3873:1:146 -3874:1:147 -3875:1:158 -3876:1:159 -3877:1:160 -3878:1:171 -3879:1:176 -3880:1:177 -3881:0:2112 -3882:1:189 -3883:0:2112 -3884:1:285 -3885:0:2112 -3886:1:286 -3887:0:2112 -3888:1:291 -3889:0:2112 -3890:1:293 -3891:0:2112 -3892:1:296 -3893:0:2112 -3894:1:301 -3895:0:2112 -3896:1:302 -3897:0:2112 -3898:1:303 -3899:0:2112 -3900:1:304 -3901:0:2112 -3902:1:305 -3903:0:2112 -3904:1:306 -3905:0:2112 -3906:1:308 -3907:0:2112 -3908:1:310 -3909:0:2112 -3910:1:311 -3911:1:315 -3912:1:316 -3913:1:324 -3914:1:325 -3915:1:326 -3916:1:338 -3917:1:343 -3918:1:347 -3919:1:348 -3920:1:355 -3921:1:356 -3922:1:367 -3923:1:368 -3924:1:369 -3925:1:380 -3926:1:385 -3927:1:386 -3928:0:2112 -3929:1:398 -3930:0:2112 -3931:1:400 -3932:0:2112 -3933:1:305 -3934:0:2112 -3935:1:306 -3936:0:2112 -3937:1:308 -3938:0:2112 -3939:1:310 -3940:0:2112 -3941:1:311 -3942:1:315 -3943:1:316 -3944:1:324 -3945:1:325 -3946:1:326 -3947:1:338 -3948:1:343 -3949:1:347 -3950:1:348 -3951:1:355 -3952:1:356 -3953:1:367 -3954:1:368 -3955:1:369 -3956:1:380 -3957:1:385 -3958:1:386 -3959:0:2112 -3960:1:398 -3961:0:2112 -3962:1:400 -3963:0:2112 -3964:1:404 -3965:0:2112 -3966:1:9 -3967:0:2112 -3968:1:10 -3969:0:2112 -3970:1:11 -3971:0:2112 -3972:1:12 -3973:1:16 -3974:1:17 -3975:1:25 -3976:1:26 -3977:1:27 -3978:1:39 -3979:1:44 -3980:1:48 -3981:1:49 -3982:1:56 -3983:1:57 -3984:1:68 -3985:1:69 -3986:1:70 -3987:1:81 -3988:1:86 -3989:1:87 -3990:0:2112 -3991:1:99 -3992:0:2112 -3993:1:101 -3994:0:2112 -3995:1:102 -3996:1:106 -3997:1:107 -3998:1:115 -3999:1:116 -4000:1:120 -4001:1:121 -4002:1:129 -4003:1:134 -4004:1:138 -4005:1:139 -4006:1:146 -4007:1:147 -4008:1:158 -4009:1:159 -4010:1:160 -4011:1:171 -4012:1:176 -4013:1:177 -4014:0:2112 -4015:1:189 -4016:0:2112 -4017:1:191 -4018:0:2112 -4019:1:192 -4020:0:2112 -4021:1:193 -4022:1:197 -4023:1:198 -4024:1:206 -4025:1:207 -4026:1:211 -4027:1:212 -4028:1:220 -4029:1:225 -4030:1:229 -4031:1:230 -4032:1:237 -4033:1:238 -4034:1:249 -4035:1:250 -4036:1:251 -4037:1:262 -4038:1:267 -4039:1:268 -4040:0:2112 -4041:1:280 -4042:0:2112 -4043:1:282 -4044:0:2112 -4045:2:1651 -4046:0:2112 -4047:1:291 -4048:0:2112 -4049:2:1652 -4050:2:1656 -4051:2:1657 -4052:2:1665 -4053:2:1666 -4054:2:1670 -4055:2:1671 -4056:2:1679 -4057:2:1684 -4058:2:1688 -4059:2:1689 -4060:2:1696 -4061:2:1697 -4062:2:1708 -4063:2:1716 -4064:2:1717 -4065:2:1721 -4066:2:1726 -4067:2:1727 -4068:0:2112 -4069:2:1739 -4070:0:2112 -4071:2:1560 -4072:0:2112 -4073:1:293 -4074:0:2112 -4075:1:11 -4076:0:2112 -4077:1:12 -4078:1:16 -4079:1:17 -4080:1:25 -4081:1:26 -4082:1:27 -4083:1:39 -4084:1:44 -4085:1:48 -4086:1:49 -4087:1:56 -4088:1:57 -4089:1:68 -4090:1:69 -4091:1:70 -4092:1:81 -4093:1:86 -4094:1:87 -4095:0:2112 -4096:1:99 -4097:0:2112 -4098:1:101 -4099:0:2112 -4100:1:102 -4101:1:106 -4102:1:107 -4103:1:115 -4104:1:116 -4105:1:120 -4106:1:121 -4107:1:129 -4108:1:134 -4109:1:138 -4110:1:139 -4111:1:146 -4112:1:147 -4113:1:158 -4114:1:159 -4115:1:160 -4116:1:171 -4117:1:176 -4118:1:177 -4119:0:2112 -4120:1:189 -4121:0:2112 -4122:1:285 -4123:0:2112 -4124:1:286 -4125:0:2112 -4126:1:291 -4127:0:2112 -4128:1:293 -4129:0:2112 -4130:1:296 -4131:0:2112 -4132:1:301 -4133:0:2112 -4134:1:302 -4135:0:2112 -4136:1:303 -4137:0:2112 -4138:1:304 -4139:0:2112 -4140:1:305 -4141:0:2112 -4142:1:306 -4143:0:2112 -4144:1:308 -4145:0:2112 -4146:1:310 -4147:0:2112 -4148:1:311 -4149:1:315 -4150:1:316 -4151:1:324 -4152:1:325 -4153:1:326 -4154:1:338 -4155:1:343 -4156:1:347 -4157:1:348 -4158:1:355 -4159:1:356 -4160:1:367 -4161:1:368 -4162:1:369 -4163:1:380 -4164:1:385 -4165:1:386 -4166:0:2112 -4167:1:398 -4168:0:2112 -4169:1:400 -4170:0:2112 -4171:1:305 -4172:0:2112 -4173:1:306 -4174:0:2112 -4175:1:308 -4176:0:2112 -4177:1:310 -4178:0:2112 -4179:1:311 -4180:1:315 -4181:1:316 -4182:1:324 -4183:1:325 -4184:1:326 -4185:1:338 -4186:1:343 -4187:1:347 -4188:1:348 -4189:1:355 -4190:1:356 -4191:1:367 -4192:1:368 -4193:1:369 -4194:1:380 -4195:1:385 -4196:1:386 -4197:0:2112 -4198:1:398 -4199:0:2112 -4200:1:400 -4201:0:2112 -4202:1:404 -4203:0:2112 -4204:1:9 -4205:0:2112 -4206:1:10 -4207:0:2112 -4208:1:11 -4209:0:2112 -4210:1:12 -4211:1:16 -4212:1:17 -4213:1:25 -4214:1:26 -4215:1:27 -4216:1:39 -4217:1:44 -4218:1:48 -4219:1:49 -4220:1:56 -4221:1:57 -4222:1:68 -4223:1:69 -4224:1:70 -4225:1:81 -4226:1:86 -4227:1:87 -4228:0:2112 -4229:1:99 -4230:0:2112 -4231:1:101 -4232:0:2112 -4233:1:102 -4234:1:106 -4235:1:107 -4236:1:115 -4237:1:116 -4238:1:120 -4239:1:121 -4240:1:129 -4241:1:134 -4242:1:138 -4243:1:139 -4244:1:146 -4245:1:147 -4246:1:158 -4247:1:159 -4248:1:160 -4249:1:171 -4250:1:176 -4251:1:177 -4252:0:2112 -4253:1:189 -4254:0:2112 -4255:1:191 -4256:0:2112 -4257:1:192 -4258:0:2112 -4259:1:193 -4260:1:197 -4261:1:198 -4262:1:206 -4263:1:207 -4264:1:211 -4265:1:212 -4266:1:220 -4267:1:225 -4268:1:229 -4269:1:230 -4270:1:237 -4271:1:238 -4272:1:249 -4273:1:250 -4274:1:251 -4275:1:262 -4276:1:267 -4277:1:268 -4278:0:2112 -4279:1:280 -4280:0:2112 -4281:1:282 -4282:0:2112 -4283:1:291 -4284:0:2112 -4285:1:293 -4286:0:2112 -4287:2:1561 -4288:0:2112 -4289:1:11 -4290:0:2112 -4291:1:12 -4292:1:16 -4293:1:17 -4294:1:25 -4295:1:26 -4296:1:27 -4297:1:39 -4298:1:44 -4299:1:48 -4300:1:49 -4301:1:56 -4302:1:57 -4303:1:68 -4304:1:69 -4305:1:70 -4306:1:81 -4307:1:86 -4308:1:87 --1:-1:-1 -4309:0:2112 -4310:1:99 -4311:0:2112 -4312:1:101 -4313:0:2112 -4314:1:102 -4315:1:106 -4316:1:107 -4317:1:115 -4318:1:116 -4319:1:120 -4320:1:121 -4321:1:129 -4322:1:134 -4323:1:138 -4324:1:139 -4325:1:146 -4326:1:147 -4327:1:158 -4328:1:159 -4329:1:160 -4330:1:171 -4331:1:176 -4332:1:177 -4333:0:2112 -4334:1:189 -4335:0:2112 -4336:1:285 -4337:0:2112 -4338:1:286 -4339:0:2112 -4340:1:291 -4341:0:2112 -4342:1:293 -4343:0:2112 -4344:1:296 -4345:0:2112 -4346:1:301 -4347:0:2112 -4348:1:302 -4349:0:2112 -4350:1:303 -4351:0:2112 -4352:1:304 -4353:0:2112 -4354:1:305 -4355:0:2112 -4356:1:306 -4357:0:2112 -4358:1:308 -4359:0:2112 -4360:1:310 -4361:0:2112 -4362:1:311 -4363:1:315 -4364:1:316 -4365:1:324 -4366:1:325 -4367:1:326 -4368:1:338 -4369:1:343 -4370:1:347 -4371:1:348 -4372:1:355 -4373:1:356 -4374:1:367 -4375:1:368 -4376:1:369 -4377:1:380 -4378:1:385 -4379:1:386 -4380:0:2112 -4381:1:398 -4382:0:2112 -4383:1:400 -4384:0:2112 -4385:1:305 -4386:0:2112 -4387:1:306 -4388:0:2112 -4389:1:308 -4390:0:2112 -4391:1:310 -4392:0:2112 -4393:1:311 -4394:1:315 -4395:1:316 -4396:1:324 -4397:1:325 -4398:1:326 -4399:1:338 -4400:1:343 -4401:1:347 -4402:1:348 -4403:1:355 -4404:1:356 -4405:1:367 -4406:1:368 -4407:1:369 -4408:1:380 -4409:1:385 -4410:1:386 -4411:0:2112 -4412:1:398 -4413:0:2112 -4414:1:400 -4415:0:2112 -4416:1:404 -4417:0:2112 -4418:1:9 -4419:0:2112 -4420:1:10 -4421:0:2112 -4422:1:11 -4423:0:2112 -4424:1:12 -4425:1:16 -4426:1:17 -4427:1:25 -4428:1:34 -4429:1:35 -4430:1:39 -4431:1:44 -4432:1:48 -4433:1:49 -4434:1:56 -4435:1:57 -4436:1:68 -4437:1:69 -4438:1:72 -4439:1:73 -4440:1:81 -4441:1:86 -4442:1:87 -4443:0:2112 -4444:1:99 -4445:0:2112 -4446:2:1562 -4447:2:1566 -4448:2:1567 -4449:2:1575 -4450:2:1576 -4451:2:1580 -4452:2:1581 -4453:2:1589 -4454:2:1594 -4455:2:1598 -4456:2:1599 -4457:2:1606 -4458:2:1607 -4459:2:1618 -4460:2:1626 -4461:2:1627 -4462:2:1631 -4463:2:1636 -4464:2:1637 -4465:0:2112 -4466:2:1649 -4467:0:2112 -4468:2:1651 -4469:0:2112 -4470:2:1652 -4471:2:1656 -4472:2:1657 -4473:2:1665 -4474:2:1666 -4475:2:1670 -4476:2:1671 -4477:2:1679 -4478:2:1684 -4479:2:1688 -4480:2:1689 -4481:2:1696 -4482:2:1697 -4483:2:1708 -4484:2:1716 -4485:2:1717 -4486:2:1721 -4487:2:1726 -4488:2:1727 -4489:0:2112 -4490:2:1739 -4491:0:2112 -4492:2:1560 -4493:0:2112 -4494:2:1561 -4495:0:2112 -4496:1:101 -4497:0:2112 -4498:2:1562 -4499:2:1566 -4500:2:1567 -4501:2:1575 -4502:2:1576 -4503:2:1580 -4504:2:1581 -4505:2:1589 -4506:2:1594 -4507:2:1598 -4508:2:1599 -4509:2:1606 -4510:2:1607 -4511:2:1618 -4512:2:1626 -4513:2:1627 -4514:2:1631 -4515:2:1636 -4516:2:1637 -4517:0:2112 -4518:2:1649 -4519:0:2112 -4520:2:1651 -4521:0:2112 -4522:2:1652 -4523:2:1656 -4524:2:1657 -4525:2:1665 -4526:2:1666 -4527:2:1670 -4528:2:1671 -4529:2:1679 -4530:2:1684 -4531:2:1688 -4532:2:1689 -4533:2:1696 -4534:2:1697 -4535:2:1708 -4536:2:1716 -4537:2:1717 -4538:2:1721 -4539:2:1726 -4540:2:1727 -4541:0:2112 -4542:2:1739 -4543:0:2112 -4544:2:1560 -4545:0:2112 -4546:2:1561 -4547:0:2112 -4548:1:102 -4549:1:106 -4550:1:107 -4551:1:115 -4552:1:116 -4553:1:117 -4554:1:129 -4555:1:134 -4556:1:138 -4557:1:139 -4558:1:146 -4559:1:147 -4560:1:158 -4561:1:159 -4562:1:160 -4563:1:171 -4564:1:176 -4565:1:177 -4566:0:2112 -4567:1:189 -4568:0:2112 -4569:1:191 -4570:0:2112 -4571:2:1562 -4572:2:1566 -4573:2:1567 -4574:2:1575 -4575:2:1576 -4576:2:1580 -4577:2:1581 -4578:2:1589 -4579:2:1594 -4580:2:1598 -4581:2:1599 -4582:2:1606 -4583:2:1607 -4584:2:1618 -4585:2:1626 -4586:2:1627 -4587:2:1631 -4588:2:1636 -4589:2:1637 -4590:0:2112 -4591:2:1649 -4592:0:2112 -4593:2:1651 -4594:0:2112 -4595:2:1652 -4596:2:1656 -4597:2:1657 -4598:2:1665 -4599:2:1666 -4600:2:1670 -4601:2:1671 -4602:2:1679 -4603:2:1684 -4604:2:1688 -4605:2:1689 -4606:2:1696 -4607:2:1697 -4608:2:1708 -4609:2:1716 -4610:2:1717 -4611:2:1721 -4612:2:1726 -4613:2:1727 -4614:0:2112 -4615:2:1739 -4616:0:2112 -4617:2:1560 -4618:0:2112 -4619:2:1561 -4620:0:2112 -4621:1:192 -4622:0:2112 -4623:2:1562 -4624:2:1566 -4625:2:1567 -4626:2:1575 -4627:2:1576 -4628:2:1580 -4629:2:1581 -4630:2:1589 -4631:2:1594 -4632:2:1598 -4633:2:1599 -4634:2:1606 -4635:2:1607 -4636:2:1618 -4637:2:1626 -4638:2:1627 -4639:2:1631 -4640:2:1636 -4641:2:1637 -4642:0:2112 -4643:2:1649 -4644:0:2112 -4645:2:1651 -4646:0:2112 -4647:2:1652 -4648:2:1656 -4649:2:1657 -4650:2:1665 -4651:2:1666 -4652:2:1670 -4653:2:1671 -4654:2:1679 -4655:2:1684 -4656:2:1688 -4657:2:1689 -4658:2:1696 -4659:2:1697 -4660:2:1708 -4661:2:1716 -4662:2:1717 -4663:2:1721 -4664:2:1726 -4665:2:1727 -4666:0:2112 -4667:2:1739 -4668:0:2112 -4669:2:1560 -4670:0:2112 -4671:2:1561 -4672:0:2112 -4673:1:193 -4674:1:197 -4675:1:198 -4676:1:206 -4677:1:207 -4678:1:211 -4679:1:212 -4680:1:220 -4681:1:225 -4682:1:229 -4683:1:230 -4684:1:237 -4685:1:238 -4686:1:249 -4687:1:250 -4688:1:251 -4689:1:262 -4690:1:267 -4691:1:268 -4692:0:2112 -4693:1:280 -4694:0:2112 -4695:2:1562 -4696:2:1566 -4697:2:1567 -4698:2:1575 -4699:2:1576 -4700:2:1580 -4701:2:1581 -4702:2:1589 -4703:2:1594 -4704:2:1598 -4705:2:1599 -4706:2:1606 -4707:2:1607 -4708:2:1618 -4709:2:1626 -4710:2:1627 -4711:2:1631 -4712:2:1636 -4713:2:1637 -4714:0:2112 -4715:2:1649 -4716:0:2112 -4717:2:1651 -4718:0:2112 -4719:2:1652 -4720:2:1656 -4721:2:1657 -4722:2:1665 -4723:2:1666 -4724:2:1670 -4725:2:1671 -4726:2:1679 -4727:2:1684 -4728:2:1688 -4729:2:1689 -4730:2:1696 -4731:2:1697 -4732:2:1708 -4733:2:1716 -4734:2:1717 -4735:2:1721 -4736:2:1726 -4737:2:1727 -4738:0:2112 -4739:2:1739 -4740:0:2112 -4741:2:1560 -4742:0:2112 -4743:2:1561 -4744:0:2112 -4745:1:282 -4746:0:2112 -4747:1:291 -4748:0:2112 -4749:1:293 -4750:0:2112 -4751:1:11 -4752:0:2112 -4753:2:1562 -4754:2:1566 -4755:2:1567 -4756:2:1575 -4757:2:1576 -4758:2:1580 -4759:2:1581 -4760:2:1589 -4761:2:1594 -4762:2:1598 -4763:2:1599 -4764:2:1606 -4765:2:1607 -4766:2:1618 -4767:2:1626 -4768:2:1627 -4769:2:1631 -4770:2:1636 -4771:2:1637 -4772:0:2112 -4773:2:1649 -4774:0:2112 -4775:2:1651 -4776:0:2112 -4777:2:1652 -4778:2:1656 -4779:2:1657 -4780:2:1665 -4781:2:1666 -4782:2:1670 -4783:2:1671 -4784:2:1679 -4785:2:1684 -4786:2:1688 -4787:2:1689 -4788:2:1696 -4789:2:1697 -4790:2:1708 -4791:2:1716 -4792:2:1717 -4793:2:1721 -4794:2:1726 -4795:2:1727 -4796:0:2112 -4797:2:1739 -4798:0:2112 -4799:2:1560 -4800:0:2112 -4801:2:1561 -4802:0:2112 -4803:1:12 -4804:1:16 -4805:1:17 -4806:1:25 -4807:1:26 -4808:1:27 -4809:1:39 -4810:1:44 -4811:1:48 -4812:1:49 -4813:1:56 -4814:1:57 -4815:1:68 -4816:1:69 -4817:1:70 -4818:1:81 -4819:1:86 -4820:1:87 diff --git a/formal-model/urcu-paulmck/.gitignore b/formal-model/urcu-paulmck/.gitignore deleted file mode 100644 index d62f4bb..0000000 --- a/formal-model/urcu-paulmck/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -pan* -*.trail diff --git a/formal-model/urcu-paulmck/urcu-paulmck.spin b/formal-model/urcu-paulmck/urcu-paulmck.spin deleted file mode 100644 index 15338de..0000000 --- a/formal-model/urcu-paulmck/urcu-paulmck.spin +++ /dev/null @@ -1,375 +0,0 @@ -/* - * urcu_mbmin.spin: Promela code to validate urcu. See commit number - * 3a9e6e9df706b8d39af94d2f027210e2e7d4106e of Mathieu Desnoyer's - * git archive at git://lttng.org/userspace-rcu.git, but with - * memory barriers removed. - * - * This validates a single reader against a single updater. The - * updater is assumed to have smp_mb() barriers between each pair - * of operations, and this model validates that a signal-mediated - * broadcast barrier is required only at the beginning and end of - * the synchronize_rcu(). - * - * Note that the second half of a prior synchronize_rcu() is modelled - * as well as the current synchronize_rcu(). - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Paul E. McKenney, IBM Corporation. - */ - -/* Promela validation variables. */ - -bit removed = 0; /* Has RCU removal happened, e.g., list_del_rcu()? */ -bit free = 0; /* Has RCU reclamation happened, e.g., kfree()? */ -bit need_mb = 0; /* =1 says need reader mb, =0 for reader response. */ -byte reader_progress[4]; /* Count of read-side statement executions. */ -bit reader_done = 0; /* =0 says reader still running, =1 says done. */ -bit updater_done = 0; /* =0 says updater still running, =1 says done. */ - -/* Broadcast memory barriers to enable, prior synchronize_rcu() instance. */ - -/* #define MB_A */ /* Not required for correctness. */ -/* #define MB_B */ /* Not required for correctness. */ -/* #define MB_C */ /* Not required for correctness. */ - -/* Broadcast memory barriers to enable, current synchronize_rcu() instance. */ - -#define MB_D /* First broadcast barrier in synchronize_rcu(). */ -/* #define MB_E */ /* Not required for correctness. */ -/* #define MB_F */ /* Not required for correctness. */ -#define MB_G /* Last broadcast barrier in synchronize_rcu(). */ - -/* urcu definitions and variables, taken straight from the algorithm. */ - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -byte urcu_gp_ctr = 1; -byte urcu_active_readers = 0; - -/* Model the RCU read-side critical section. */ - -proctype urcu_reader() -{ - bit done = 0; - bit mbok; - byte tmp; - byte tmp_removed; - byte tmp_free; - - /* Absorb any early requests for memory barriers. */ - do - :: need_mb == 1 -> - need_mb = 0; - :: 1 -> break; - od; - - /* - * Each pass through this loop executes one read-side statement - * from the following code fragment: - * - * rcu_read_lock(); [0a] - * rcu_read_lock(); [0b] - * p = rcu_dereference(global_p); [1] - * x = p->data; [2] - * rcu_read_unlock(); [3b] - * rcu_read_unlock(); [3a] - * - * Because we are modeling a weak-memory machine, these statements - * can be seen in any order, the only restriction being that - * rcu_read_unlock() cannot precede the corresponding rcu_read_lock(). - * The placement of the inner rcu_read_lock() and rcu_read_unlock() - * is non-deterministic, the above is but one possible placement. - * Intestingly enough, this model validates all possible placements - * of the inner rcu_read_lock() and rcu_read_unlock() statements, - * with the only constraint being that the rcu_read_lock() must - * precede the rcu_read_unlock(). - * - * We also respond to memory-barrier requests, but only if our - * execution happens to be ordered. If the current state is - * misordered, we ignore memory-barrier requests. - */ - do - :: 1 -> - if - :: reader_progress[0] < 2 -> /* [0a and 0b] */ - tmp = urcu_active_readers; - if - :: (tmp & RCU_GP_CTR_NEST_MASK) == 0 -> - tmp = urcu_gp_ctr; - do - :: (reader_progress[1] + - reader_progress[2] + - reader_progress[3] == 0) && need_mb == 1 -> - need_mb = 0; - :: need_mb == 0 && !updater_done -> skip; - :: 1 -> break; - od; - urcu_active_readers = tmp; - :: else -> - urcu_active_readers = tmp + 1; - fi; - reader_progress[0] = reader_progress[0] + 1; - :: reader_progress[1] == 0 -> /* [1] */ - tmp_removed = removed; - reader_progress[1] = 1; - :: reader_progress[2] == 0 -> /* [2] */ - tmp_free = free; - reader_progress[2] = 1; - :: ((reader_progress[0] > reader_progress[3]) && - (reader_progress[3] < 2)) -> /* [3a and 3b] */ - tmp = urcu_active_readers - 1; - urcu_active_readers = tmp; - reader_progress[3] = reader_progress[3] + 1; - :: else -> break; - fi; - - /* Process memory-barrier requests, if it is safe to do so. */ - atomic { - mbok = 0; - tmp = 0; - do - :: tmp < 4 && reader_progress[tmp] == 0 -> - tmp = tmp + 1; - break; - :: tmp < 4 && reader_progress[tmp] != 0 -> - tmp = tmp + 1; - :: tmp >= 4 && - reader_progress[0] == reader_progress[3] -> - done = 1; - break; - :: tmp >= 4 && - reader_progress[0] != reader_progress[3] -> - break; - od; - do - :: tmp < 4 && reader_progress[tmp] == 0 -> - tmp = tmp + 1; - :: tmp < 4 && reader_progress[tmp] != 0 -> - break; - :: tmp >= 4 -> - mbok = 1; - break; - od - - } - - if - :: mbok == 1 -> - /* We get here if mb processing is safe. */ - do - :: need_mb == 1 -> - need_mb = 0; - :: 1 -> break; - od; - :: else -> skip; - fi; - - /* - * Check to see if we have modeled the entire RCU read-side - * critical section, and leave if so. - */ - if - :: done == 1 -> break; - :: else -> skip; - fi - od; - assert((tmp_free == 0) || (tmp_removed == 1)); - - /* Reader has completed. */ - reader_done = 1; - - /* - * Process any late-arriving memory-barrier requests, and - * in addition create a progress cycle. - */ - reader_done = 1; - - do - :: need_mb == 1 -> - need_mb = 0; - :: 1 -> -progress_reader: - skip; - :: 1 -> break; - od; -} - -/* Model the RCU update process. */ - -proctype urcu_updater() -{ - byte tmp; - - /* - * ---------------------------------------------------------------- - * prior synchronize_rcu(). - */ - - /* prior synchronize_rcu(), second counter flip. */ -#ifdef MB_A - need_mb = 1; /* mb() A (analogous to omitted barrier between E and F) */ - do - :: need_mb == 1 && !reader_done -> skip; - :: need_mb == 0 || reader_done -> break; - od; -#endif /* #ifdef MB_A */ - urcu_gp_ctr = urcu_gp_ctr + RCU_GP_CTR_BIT; -#ifdef MB_B - need_mb = 1; /* mb() B (analogous to F) */ - do - :: need_mb == 1 && !reader_done -> skip; - :: need_mb == 0 || reader_done -> break; - od; -#endif /* #ifdef MB_B */ - do - :: 1 -> - if - :: (urcu_active_readers & RCU_GP_CTR_NEST_MASK) != 0 && - (urcu_active_readers & ~RCU_GP_CTR_NEST_MASK) != - (urcu_gp_ctr & ~RCU_GP_CTR_NEST_MASK) -> - skip; - :: else -> break; - fi - od; -#ifdef MB_C - need_mb = 1; /* mb() C absolutely required by analogy with G */ - do - :: need_mb == 1 && !reader_done -> skip; - :: need_mb == 0 || reader_done -> break; - od; -#endif /* #ifdef MB_C */ - - /* Removal statement, e.g., list_del_rcu(). */ - removed = 1; - - /* - * prior synchronize_rcu(). - * ---------------------------------------------------------------- - */ - - /* - * ---------------------------------------------------------------- - * current synchronize_rcu(). - */ - - /* current synchronize_rcu(), first counter flip. */ -#ifdef MB_D - need_mb = 1; /* mb() D suggested */ - do - :: need_mb == 1 && !reader_done -> skip; - :: need_mb == 0 || reader_done -> break; - od; -#endif /* #ifdef MB_D */ - urcu_gp_ctr = urcu_gp_ctr + RCU_GP_CTR_BIT; -#ifdef MB_E - need_mb = 1; /* mb() E required if D not present */ - do - :: need_mb == 1 && !reader_done -> skip; - :: need_mb == 0 || reader_done -> break; - od; -#endif /* #ifdef MB_E */ - - /* current synchronize_rcu(), first-flip check plus second flip. */ - if - :: 1 -> - do - :: 1 -> - if - :: (urcu_active_readers & RCU_GP_CTR_NEST_MASK) != 0 && - (urcu_active_readers & ~RCU_GP_CTR_NEST_MASK) != - (urcu_gp_ctr & ~RCU_GP_CTR_NEST_MASK) -> - skip; - :: else -> break; - fi; - od; - urcu_gp_ctr = urcu_gp_ctr + RCU_GP_CTR_BIT; - :: 1 -> - tmp = urcu_gp_ctr; - urcu_gp_ctr = urcu_gp_ctr + RCU_GP_CTR_BIT; - do - :: 1 -> - if - :: (urcu_active_readers & RCU_GP_CTR_NEST_MASK) != 0 && - (urcu_active_readers & ~RCU_GP_CTR_NEST_MASK) != - (tmp & ~RCU_GP_CTR_NEST_MASK) -> - skip; - :: else -> break; - fi; - od; - fi; - - /* current synchronize_rcu(), second counter flip check. */ -#ifdef MB_F - need_mb = 1; /* mb() F not required */ - do - :: need_mb == 1 && !reader_done -> skip; - :: need_mb == 0 || reader_done -> break; - od; -#endif /* #ifdef MB_F */ - do - :: 1 -> - if - :: (urcu_active_readers & RCU_GP_CTR_NEST_MASK) != 0 && - (urcu_active_readers & ~RCU_GP_CTR_NEST_MASK) != - (urcu_gp_ctr & ~RCU_GP_CTR_NEST_MASK) -> - skip; - :: else -> break; - fi; - od; -#ifdef MB_G - need_mb = 1; /* mb() G absolutely required */ - do - :: need_mb == 1 && !reader_done -> skip; - :: need_mb == 0 || reader_done -> break; - od; -#endif /* #ifdef MB_G */ - - /* - * current synchronize_rcu(). - * ---------------------------------------------------------------- - */ - - /* free-up step, e.g., kfree(). */ - free = 1; - - /* We are done, so kill all the infinite loops in the reader. */ - updater_done = 1; - - /* Create a progress cycle. Correctness requires we get here. */ - do - :: 1 -> -progress_updater: - skip; - :: 1 -> break; - od; -} - -/* - * Initialize the array, spawn a reader and an updater. Because readers - * are independent of each other, only one reader is needed. - */ - -init { - atomic { - reader_progress[0] = 0; - reader_progress[1] = 0; - reader_progress[2] = 0; - reader_progress[3] = 0; - run urcu_reader(); - run urcu_updater(); - } -} diff --git a/formal-model/urcu-paulmck/urcu.sh b/formal-model/urcu-paulmck/urcu.sh deleted file mode 100644 index 0c5e492..0000000 --- a/formal-model/urcu-paulmck/urcu.sh +++ /dev/null @@ -1,3 +0,0 @@ -spin -a urcu-paulmck.spin -cc -DNP -o pan pan.c -./pan -f -l diff --git a/formal-model/urcu.sh b/formal-model/urcu.sh deleted file mode 100644 index b76c764..0000000 --- a/formal-model/urcu.sh +++ /dev/null @@ -1,3 +0,0 @@ -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan diff --git a/formal-model/urcu.spin b/formal-model/urcu.spin deleted file mode 100644 index 3e18457..0000000 --- a/formal-model/urcu.spin +++ /dev/null @@ -1,301 +0,0 @@ -/* - * urcu.spin: Promela code to validate urcu. See commit number - * 3a9e6e9df706b8d39af94d2f027210e2e7d4106e of Mathieu Desnoyer's - * git archive at git://lttng.org/userspace-rcu.git - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Paul E. McKenney, IBM Corporation. - */ - -/* Promela validation variables. */ - -bit removed = 0; /* Has RCU removal happened, e.g., list_del_rcu()? */ -bit free = 0; /* Has RCU reclamation happened, e.g., kfree()? */ -bit need_mb = 0; /* =1 says need reader mb, =0 for reader response. */ -byte reader_progress[4]; - /* Count of read-side statement executions. */ -bit reader_done = 0; - /* =0 says reader still running, =1 says done. */ -bit updater_done = 0; - /* =0 says updater still running, =1 says done. */ - -/* urcu definitions and variables, taken straight from the algorithm. */ - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -byte urcu_gp_ctr = 1; -byte urcu_active_readers = 0; - -/* Model the RCU read-side critical section. */ - -proctype urcu_reader() -{ - bit done = 0; - bit mbok; - byte tmp; - byte tmp_removed; - byte tmp_free; - - /* Absorb any early requests for memory barriers. */ - do - :: need_mb == 1 -> - need_mb = 0; - :: !updater_done -> skip; - :: 1 -> break; - od; - - /* - * Each pass through this loop executes one read-side statement - * from the following code fragment: - * - * rcu_read_lock(); [0a] - * rcu_read_lock(); [0b] - * p = rcu_dereference(global_p); [1] - * x = p->data; [2] - * rcu_read_unlock(); [3b] - * rcu_read_unlock(); [3a] - * - * Because we are modeling a weak-memory machine, these statements - * can be seen in any order, the only restriction being that - * rcu_read_unlock() cannot precede the corresponding rcu_read_lock(). - * The placement of the inner rcu_read_lock() and rcu_read_unlock() - * is non-deterministic, the above is but one possible placement. - * Intestingly enough, this model validates all possible placements - * of the inner rcu_read_lock() and rcu_read_unlock() statements, - * with the only constraint being that the rcu_read_lock() must - * precede the rcu_read_unlock(). - * - * We also respond to memory-barrier requests, but only if our - * execution happens to be ordered. If the current state is - * misordered, we ignore memory-barrier requests. - */ - do - :: 1 -> - if - :: reader_progress[0] < 2 -> /* [0a and 0b] */ - tmp = urcu_active_readers; - if - :: (tmp & RCU_GP_CTR_NEST_MASK) == 0 -> - tmp = urcu_gp_ctr; - do - :: (reader_progress[1] + - reader_progress[2] + - reader_progress[3] == 0) && need_mb == 1 -> - need_mb = 0; - :: !updater_done -> skip; - :: 1 -> break; - od; - urcu_active_readers = tmp; - :: else -> - urcu_active_readers = tmp + 1; - fi; - reader_progress[0] = reader_progress[0] + 1; - :: reader_progress[1] == 0 -> /* [1] */ - tmp_removed = removed; - reader_progress[1] = 1; - :: reader_progress[2] == 0 -> /* [2] */ - tmp_free = free; - reader_progress[2] = 1; - :: ((reader_progress[0] > reader_progress[3]) && - (reader_progress[3] < 2)) -> /* [3a and 3b] */ - tmp = urcu_active_readers - 1; - urcu_active_readers = tmp; - reader_progress[3] = reader_progress[3] + 1; - :: else -> break; - fi; - - /* Process memory-barrier requests, if it is safe to do so. */ - atomic { - mbok = 0; - tmp = 0; - do - :: tmp < 4 && reader_progress[tmp] == 0 -> - tmp = tmp + 1; - break; - :: tmp < 4 && reader_progress[tmp] != 0 -> - tmp = tmp + 1; - :: tmp >= 4 && - reader_progress[0] == reader_progress[3] -> - done = 1; - break; - :: tmp >= 4 && - reader_progress[0] != reader_progress[3] -> - break; - od; - do - :: tmp < 4 && reader_progress[tmp] == 0 -> - tmp = tmp + 1; - :: tmp < 4 && reader_progress[tmp] != 0 -> - break; - :: tmp >= 4 -> - mbok = 1; - break; - od - - } - - if - :: mbok == 1 -> - /* We get here if mb processing is safe. */ - do - :: need_mb == 1 -> - need_mb = 0; - :: !updater_done -> skip; - :: 1 -> break; - od; - :: else -> skip; - fi; - - /* - * Check to see if we have modeled the entire RCU read-side - * critical section, and leave if so. - */ - if - :: done == 1 -> break; - :: else -> skip; - fi - od; - assert((tmp_free == 0) || (tmp_removed == 1)); - - /* Reader has completed. */ - reader_done = 1; - - /* Process any late-arriving memory-barrier requests. */ - do - :: need_mb == 1 -> - need_mb = 0; - :: !updater_done -> skip; - :: 1 -> break; - od; -} - -/* Model the RCU update process. */ - -proctype urcu_updater() -{ - /* prior synchronize_rcu(), second counter flip. */ - need_mb = 1; - do - :: need_mb == 1 -> skip; - :: need_mb == 0 -> break; - od; - urcu_gp_ctr = urcu_gp_ctr + RCU_GP_CTR_BIT; - need_mb = 1; - do - :: need_mb == 1 -> skip; - :: need_mb == 0 -> break; - od; - do - :: 1 -> - if - :: (urcu_active_readers & RCU_GP_CTR_NEST_MASK) != 0 && - (urcu_active_readers & ~RCU_GP_CTR_NEST_MASK) != - (urcu_gp_ctr & ~RCU_GP_CTR_NEST_MASK) -> - skip; - :: else -> break; - fi; - od; - need_mb = 1; - do - :: need_mb == 1 -> skip; - :: need_mb == 0 -> break; - od; - - /* Removal statement, e.g., list_del_rcu(). */ - removed = 1; - - /* current synchronize_rcu(), first counter flip. */ - need_mb = 1; - do - :: need_mb == 1 -> skip; - :: need_mb == 0 -> break; - od; - urcu_gp_ctr = urcu_gp_ctr + RCU_GP_CTR_BIT; - need_mb = 1; - do - :: need_mb == 1 -> skip; - :: need_mb == 0 -> break; - od; - do - :: 1 -> - if - :: (urcu_active_readers & RCU_GP_CTR_NEST_MASK) != 0 && - (urcu_active_readers & ~RCU_GP_CTR_NEST_MASK) != - (urcu_gp_ctr & ~RCU_GP_CTR_NEST_MASK) -> - skip; - :: else -> break; - fi; - od; - need_mb = 1; - do - :: need_mb == 1 -> skip; - :: need_mb == 0 -> break; - od; - - /* current synchronize_rcu(), second counter flip. */ - need_mb = 1; - do - :: need_mb == 1 -> skip; - :: need_mb == 0 -> break; - od; - urcu_gp_ctr = urcu_gp_ctr + RCU_GP_CTR_BIT; - need_mb = 1; - do - :: need_mb == 1 -> skip; - :: need_mb == 0 -> break; - od; - do - :: 1 -> - if - :: (urcu_active_readers & RCU_GP_CTR_NEST_MASK) != 0 && - (urcu_active_readers & ~RCU_GP_CTR_NEST_MASK) != - (urcu_gp_ctr & ~RCU_GP_CTR_NEST_MASK) -> - skip; - :: else -> break; - fi; - od; - need_mb = 1; - do - :: need_mb == 1 -> skip; - :: need_mb == 0 -> break; - od; - - /* free-up step, e.g., kfree(). */ - free = 1; - - /* - * Signal updater done, ending any otherwise-infinite loops - * in the reading process. - */ - updater_done = 1; -} - -/* - * Initialize the array, spawn a reader and an updater. Because readers - * are independent of each other, only one reader is needed. - */ - -init { - atomic { - reader_progress[0] = 0; - reader_progress[1] = 0; - reader_progress[2] = 0; - reader_progress[3] = 0; - run urcu_reader(); - run urcu_updater(); - } -} diff --git a/formal-model/urcu/DEFINES b/formal-model/urcu/DEFINES deleted file mode 100644 index 5d5147e..0000000 --- a/formal-model/urcu/DEFINES +++ /dev/null @@ -1,17 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS diff --git a/formal-model/urcu/Makefile b/formal-model/urcu/Makefile deleted file mode 100644 index 8af320d..0000000 --- a/formal-model/urcu/Makefile +++ /dev/null @@ -1,172 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - #nested useless with signal test. - #make urcu_free_nested | tee urcu_free_nested.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu/references.txt b/formal-model/urcu/references.txt deleted file mode 100644 index 72c67a2..0000000 --- a/formal-model/urcu/references.txt +++ /dev/null @@ -1,13 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html - -LTL vs CTL : - -http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 -http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf - (downloaded) diff --git a/formal-model/urcu/result-signal-over-reader/DEFINES b/formal-model/urcu/result-signal-over-reader/DEFINES deleted file mode 100644 index 2fcb038..0000000 --- a/formal-model/urcu/result-signal-over-reader/DEFINES +++ /dev/null @@ -1,17 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS diff --git a/formal-model/urcu/result-signal-over-reader/Makefile b/formal-model/urcu/result-signal-over-reader/Makefile deleted file mode 100644 index 8af320d..0000000 --- a/formal-model/urcu/result-signal-over-reader/Makefile +++ /dev/null @@ -1,172 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - #nested useless with signal test. - #make urcu_free_nested | tee urcu_free_nested.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu/result-signal-over-reader/asserts.log b/formal-model/urcu/result-signal-over-reader/asserts.log deleted file mode 100644 index d317f57..0000000 --- a/formal-model/urcu/result-signal-over-reader/asserts.log +++ /dev/null @@ -1,312 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -cat DEFINES > .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w20 -Depth= 4926 States= 1e+06 Transitions= 9.03e+06 Memory= 527.287 t= 5.98 R= 2e+05 -Depth= 7228 States= 2e+06 Transitions= 1.88e+07 Memory= 588.322 t= 12.9 R= 2e+05 -Depth= 7228 States= 3e+06 Transitions= 3.14e+07 Memory= 649.358 t= 21.9 R= 1e+05 -pan: resizing hashtable to -w22.. done -Depth= 7228 States= 4e+06 Transitions= 4.3e+07 Memory= 741.416 t= 30.3 R= 1e+05 -Depth= 7228 States= 5e+06 Transitions= 5.65e+07 Memory= 802.451 t= 39.6 R= 1e+05 -Depth= 7228 States= 6e+06 Transitions= 6.78e+07 Memory= 863.486 t= 47.5 R= 1e+05 -Depth= 7228 States= 7e+06 Transitions= 8.05e+07 Memory= 924.522 t= 56.5 R= 1e+05 -Depth= 7228 States= 8e+06 Transitions= 9.49e+07 Memory= 985.557 t= 66.8 R= 1e+05 -Depth= 7228 States= 9e+06 Transitions= 1.06e+08 Memory= 1046.592 t= 74.7 R= 1e+05 -pan: resizing hashtable to -w24.. done -Depth= 7228 States= 1e+07 Transitions= 1.18e+08 Memory= 1231.721 t= 84.9 R= 1e+05 -Depth= 7228 States= 1.1e+07 Transitions= 1.29e+08 Memory= 1292.756 t= 92.8 R= 1e+05 -Depth= 7228 States= 1.2e+07 Transitions= 1.4e+08 Memory= 1353.791 t= 100 R= 1e+05 -Depth= 7228 States= 1.3e+07 Transitions= 1.53e+08 Memory= 1414.826 t= 109 R= 1e+05 -Depth= 7228 States= 1.4e+07 Transitions= 1.65e+08 Memory= 1475.861 t= 117 R= 1e+05 -Depth= 7228 States= 1.5e+07 Transitions= 1.77e+08 Memory= 1536.897 t= 126 R= 1e+05 -Depth= 7228 States= 1.6e+07 Transitions= 1.89e+08 Memory= 1597.932 t= 134 R= 1e+05 -Depth= 7228 States= 1.7e+07 Transitions= 2.02e+08 Memory= 1658.967 t= 143 R= 1e+05 -Depth= 7228 States= 1.8e+07 Transitions= 2.16e+08 Memory= 1720.002 t= 153 R= 1e+05 -Depth= 7228 States= 1.9e+07 Transitions= 2.27e+08 Memory= 1781.037 t= 160 R= 1e+05 -Depth= 7228 States= 2e+07 Transitions= 2.39e+08 Memory= 1842.072 t= 169 R= 1e+05 -Depth= 7228 States= 2.1e+07 Transitions= 2.51e+08 Memory= 1903.108 t= 177 R= 1e+05 -Depth= 7228 States= 2.2e+07 Transitions= 2.62e+08 Memory= 1964.143 t= 185 R= 1e+05 -Depth= 7228 States= 2.3e+07 Transitions= 2.74e+08 Memory= 2025.178 t= 194 R= 1e+05 -Depth= 7228 States= 2.4e+07 Transitions= 2.86e+08 Memory= 2086.213 t= 203 R= 1e+05 -Depth= 7228 States= 2.5e+07 Transitions= 2.99e+08 Memory= 2147.248 t= 212 R= 1e+05 -Depth= 7228 States= 2.6e+07 Transitions= 3.1e+08 Memory= 2208.283 t= 220 R= 1e+05 -Depth= 7228 States= 2.7e+07 Transitions= 3.24e+08 Memory= 2269.318 t= 230 R= 1e+05 -Depth= 7228 States= 2.8e+07 Transitions= 3.37e+08 Memory= 2330.354 t= 239 R= 1e+05 -Depth= 7228 States= 2.9e+07 Transitions= 3.49e+08 Memory= 2391.389 t= 248 R= 1e+05 -Depth= 7228 States= 3e+07 Transitions= 3.6e+08 Memory= 2452.424 t= 256 R= 1e+05 -Depth= 7228 States= 3.1e+07 Transitions= 3.72e+08 Memory= 2513.459 t= 265 R= 1e+05 -Depth= 7228 States= 3.2e+07 Transitions= 3.83e+08 Memory= 2574.494 t= 273 R= 1e+05 -Depth= 7228 States= 3.3e+07 Transitions= 3.95e+08 Memory= 2635.529 t= 282 R= 1e+05 -Depth= 7228 States= 3.4e+07 Transitions= 4.07e+08 Memory= 2696.565 t= 291 R= 1e+05 -pan: resizing hashtable to -w26.. done -Depth= 7228 States= 3.5e+07 Transitions= 4.2e+08 Memory= 3253.682 t= 308 R= 1e+05 -Depth= 7228 States= 3.6e+07 Transitions= 4.32e+08 Memory= 3314.717 t= 316 R= 1e+05 -Depth= 7228 States= 3.7e+07 Transitions= 4.45e+08 Memory= 3375.752 t= 325 R= 1e+05 -Depth= 7228 States= 3.8e+07 Transitions= 4.58e+08 Memory= 3436.787 t= 334 R= 1e+05 -Depth= 7228 States= 3.9e+07 Transitions= 4.71e+08 Memory= 3497.822 t= 343 R= 1e+05 -Depth= 7228 States= 4e+07 Transitions= 4.82e+08 Memory= 3558.858 t= 350 R= 1e+05 -Depth= 7228 States= 4.1e+07 Transitions= 4.94e+08 Memory= 3619.893 t= 359 R= 1e+05 -Depth= 7228 States= 4.2e+07 Transitions= 5.04e+08 Memory= 3680.928 t= 366 R= 1e+05 -Depth= 7228 States= 4.3e+07 Transitions= 5.16e+08 Memory= 3741.963 t= 374 R= 1e+05 -Depth= 7228 States= 4.4e+07 Transitions= 5.29e+08 Memory= 3802.998 t= 383 R= 1e+05 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim - (none specified) - assertion violations + - cycle checks - (disabled by -DSAFETY) - invalid end states + - -State-vector 56 byte, depth reached 7228, errors: 0 - 44157204 states, stored -4.8641845e+08 states, matched -5.3057565e+08 transitions (= stored+matched) -1.8453582e+09 atomic steps -hash conflicts: 2.8837553e+08 (resolved) - -Stats on memory usage (in Megabytes): - 3537.374 equivalent memory usage for states (stored*(State-vector + overhead)) - 2843.050 actual memory usage for states (compression: 80.37%) - state-vector as stored = 40 byte + 28 byte overhead - 512.000 memory used for hash table (-w26) - 457.764 memory used for DFS stack (-m10000000) - 3812.568 total actual memory usage - -unreached in proctype urcu_reader - line 398, ".input.spin", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 61, "(1)" - line 417, ".input.spin", state 91, "(1)" - line 398, ".input.spin", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 158, "(1)" - line 417, ".input.spin", state 188, "(1)" - line 398, ".input.spin", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 256, "(1)" - line 417, ".input.spin", state 286, "(1)" - line 398, ".input.spin", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 395, "(1)" - line 417, ".input.spin", state 425, "(1)" - line 539, ".input.spin", state 456, "-end-" - (17 of 456 states) -unreached in proctype urcu_reader_sig - line 398, ".input.spin", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 70, "(1)" - line 417, ".input.spin", state 100, "(1)" - line 398, ".input.spin", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 158, "(1)" - line 417, ".input.spin", state 188, "(1)" - line 398, ".input.spin", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 247, "(1)" - line 417, ".input.spin", state 277, "(1)" - line 398, ".input.spin", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 359, "(1)" - line 417, ".input.spin", state 389, "(1)" - line 613, ".input.spin", state 411, "-end-" - (17 of 411 states) -unreached in proctype urcu_writer - line 398, ".input.spin", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, ".input.spin", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 59, "(1)" - line 412, ".input.spin", state 72, "(1)" - line 417, ".input.spin", state 89, "(1)" - line 398, ".input.spin", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, ".input.spin", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 153, "(1)" - line 412, ".input.spin", state 166, "(1)" - line 651, ".input.spin", state 199, "(1)" - line 174, ".input.spin", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 178, ".input.spin", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, ".input.spin", state 240, "(1)" - line 163, ".input.spin", state 248, "(1)" - line 167, ".input.spin", state 260, "(1)" - line 174, ".input.spin", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 178, ".input.spin", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, ".input.spin", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, ".input.spin", state 370, "(1)" - line 163, ".input.spin", state 378, "(1)" - line 167, ".input.spin", state 390, "(1)" - line 398, ".input.spin", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, ".input.spin", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 449, "(1)" - line 412, ".input.spin", state 462, "(1)" - line 417, ".input.spin", state 479, "(1)" - line 398, ".input.spin", state 498, "(1)" - line 402, ".input.spin", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, ".input.spin", state 554, "(1)" - line 417, ".input.spin", state 571, "(1)" - line 402, ".input.spin", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, ".input.spin", state 647, "(1)" - line 417, ".input.spin", state 664, "(1)" - line 178, ".input.spin", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, ".input.spin", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, ".input.spin", state 710, "(1)" - line 163, ".input.spin", state 718, "(1)" - line 167, ".input.spin", state 730, "(1)" - line 174, ".input.spin", state 741, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 178, ".input.spin", state 817, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, ".input.spin", state 830, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, ".input.spin", state 840, "(1)" - line 163, ".input.spin", state 848, "(1)" - line 167, ".input.spin", state 860, "(1)" - line 398, ".input.spin", state 882, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 398, ".input.spin", state 884, "(1)" - line 398, ".input.spin", state 885, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 398, ".input.spin", state 885, "else" - line 398, ".input.spin", state 888, "(1)" - line 402, ".input.spin", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, ".input.spin", state 898, "(1)" - line 402, ".input.spin", state 899, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, ".input.spin", state 899, "else" - line 402, ".input.spin", state 902, "(1)" - line 402, ".input.spin", state 903, "(1)" - line 402, ".input.spin", state 903, "(1)" - line 400, ".input.spin", state 908, "((i<1))" - line 400, ".input.spin", state 908, "((i>=1))" - line 407, ".input.spin", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 927, "(1)" - line 408, ".input.spin", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 408, ".input.spin", state 928, "else" - line 408, ".input.spin", state 931, "(1)" - line 408, ".input.spin", state 932, "(1)" - line 408, ".input.spin", state 932, "(1)" - line 412, ".input.spin", state 940, "(1)" - line 412, ".input.spin", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 412, ".input.spin", state 941, "else" - line 412, ".input.spin", state 944, "(1)" - line 412, ".input.spin", state 945, "(1)" - line 412, ".input.spin", state 945, "(1)" - line 410, ".input.spin", state 950, "((i<1))" - line 410, ".input.spin", state 950, "((i>=1))" - line 417, ".input.spin", state 957, "(1)" - line 417, ".input.spin", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 417, ".input.spin", state 958, "else" - line 417, ".input.spin", state 961, "(1)" - line 417, ".input.spin", state 962, "(1)" - line 417, ".input.spin", state 962, "(1)" - line 419, ".input.spin", state 965, "(1)" - line 419, ".input.spin", state 965, "(1)" - line 402, ".input.spin", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, ".input.spin", state 1040, "(1)" - line 417, ".input.spin", state 1057, "(1)" - line 402, ".input.spin", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, ".input.spin", state 1130, "(1)" - line 417, ".input.spin", state 1147, "(1)" - line 398, ".input.spin", state 1166, "(1)" - line 402, ".input.spin", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, ".input.spin", state 1222, "(1)" - line 417, ".input.spin", state 1239, "(1)" - line 402, ".input.spin", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, ".input.spin", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, ".input.spin", state 1315, "(1)" - line 417, ".input.spin", state 1332, "(1)" - line 178, ".input.spin", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, ".input.spin", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, ".input.spin", state 1378, "(1)" - line 163, ".input.spin", state 1386, "(1)" - line 167, ".input.spin", state 1398, "(1)" - line 174, ".input.spin", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 178, ".input.spin", state 1485, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, ".input.spin", state 1498, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, ".input.spin", state 1508, "(1)" - line 163, ".input.spin", state 1516, "(1)" - line 167, ".input.spin", state 1528, "(1)" - line 398, ".input.spin", state 1550, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 398, ".input.spin", state 1552, "(1)" - line 398, ".input.spin", state 1553, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 398, ".input.spin", state 1553, "else" - line 398, ".input.spin", state 1556, "(1)" - line 402, ".input.spin", state 1564, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, ".input.spin", state 1566, "(1)" - line 402, ".input.spin", state 1567, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, ".input.spin", state 1567, "else" - line 402, ".input.spin", state 1570, "(1)" - line 402, ".input.spin", state 1571, "(1)" - line 402, ".input.spin", state 1571, "(1)" - line 400, ".input.spin", state 1576, "((i<1))" - line 400, ".input.spin", state 1576, "((i>=1))" - line 407, ".input.spin", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, ".input.spin", state 1595, "(1)" - line 408, ".input.spin", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 408, ".input.spin", state 1596, "else" - line 408, ".input.spin", state 1599, "(1)" - line 408, ".input.spin", state 1600, "(1)" - line 408, ".input.spin", state 1600, "(1)" - line 412, ".input.spin", state 1608, "(1)" - line 412, ".input.spin", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 412, ".input.spin", state 1609, "else" - line 412, ".input.spin", state 1612, "(1)" - line 412, ".input.spin", state 1613, "(1)" - line 412, ".input.spin", state 1613, "(1)" - line 410, ".input.spin", state 1618, "((i<1))" - line 410, ".input.spin", state 1618, "((i>=1))" - line 417, ".input.spin", state 1625, "(1)" - line 417, ".input.spin", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 417, ".input.spin", state 1626, "else" - line 417, ".input.spin", state 1629, "(1)" - line 417, ".input.spin", state 1630, "(1)" - line 417, ".input.spin", state 1630, "(1)" - line 419, ".input.spin", state 1633, "(1)" - line 419, ".input.spin", state 1633, "(1)" - line 178, ".input.spin", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, ".input.spin", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, ".input.spin", state 1681, "(1)" - line 163, ".input.spin", state 1689, "(1)" - line 167, ".input.spin", state 1701, "(1)" - line 174, ".input.spin", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 178, ".input.spin", state 1788, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, ".input.spin", state 1801, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, ".input.spin", state 1811, "(1)" - line 163, ".input.spin", state 1819, "(1)" - line 167, ".input.spin", state 1831, "(1)" - line 701, ".input.spin", state 1856, "-end-" - (158 of 1856 states) -unreached in proctype :init: - (0 of 46 states) - -pan: elapsed time 384 seconds -pan: rate 114968.77 states/second -pan: avg transition delay 7.2389e-07 usec -cp .input.spin asserts.spin.input -cp .input.spin.trail asserts.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/asserts.spin.input b/formal-model/urcu/result-signal-over-reader/asserts.spin.input deleted file mode 100644 index 2d7f62d..0000000 --- a/formal-model/urcu/result-signal-over-reader/asserts.spin.input +++ /dev/null @@ -1,722 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-reader/asserts.spin.input.trail b/formal-model/urcu/result-signal-over-reader/asserts.spin.input.trail deleted file mode 100644 index 287e52a..0000000 --- a/formal-model/urcu/result-signal-over-reader/asserts.spin.input.trail +++ /dev/null @@ -1,6 +0,0 @@ --4:-4:-4 -1:0:2673 -2:0:2674 -3:0:2675 -4:0:2676 -5:4:1129 diff --git a/formal-model/urcu/result-signal-over-reader/urcu.sh b/formal-model/urcu/result-signal-over-reader/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu/result-signal-over-reader/urcu.spin b/formal-model/urcu/result-signal-over-reader/urcu.spin deleted file mode 100644 index 2cfcb70..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu.spin +++ /dev/null @@ -1,705 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free.log b/formal-model/urcu/result-signal-over-reader/urcu_free.log deleted file mode 100644 index a6ab537..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free.log +++ /dev/null @@ -1,326 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 743) -Depth= 6837 States= 1e+06 Transitions= 9.03e+06 Memory= 534.904 t= 7.74 R= 1e+05 -Depth= 8887 States= 2e+06 Transitions= 1.88e+07 Memory= 603.557 t= 16.6 R= 1e+05 -Depth= 8887 States= 3e+06 Transitions= 3.14e+07 Memory= 672.209 t= 28 R= 1e+05 -pan: resizing hashtable to -w22.. done -Depth= 8887 States= 4e+06 Transitions= 4.33e+07 Memory= 771.885 t= 39.1 R= 1e+05 -Depth= 8887 States= 5e+06 Transitions= 5.65e+07 Memory= 840.635 t= 50.7 R= 1e+05 -Depth= 8887 States= 6e+06 Transitions= 6.79e+07 Memory= 909.287 t= 61 R= 1e+05 -Depth= 8887 States= 7e+06 Transitions= 8.08e+07 Memory= 977.940 t= 72.6 R= 1e+05 -Depth= 8887 States= 8e+06 Transitions= 9.5e+07 Memory= 1046.592 t= 85.5 R= 9e+04 -Depth= 8887 States= 9e+06 Transitions= 1.07e+08 Memory= 1115.342 t= 96.7 R= 9e+04 -pan: resizing hashtable to -w24.. done -Depth= 8887 States= 1e+07 Transitions= 1.18e+08 Memory= 1308.088 t= 108 R= 9e+04 -Depth= 8887 States= 1.1e+07 Transitions= 1.3e+08 Memory= 1376.740 t= 119 R= 9e+04 -Depth= 8887 States= 1.2e+07 Transitions= 1.41e+08 Memory= 1445.393 t= 128 R= 9e+04 -Depth= 8887 States= 1.3e+07 Transitions= 1.51e+08 Memory= 1514.045 t= 138 R= 9e+04 -Depth= 8887 States= 1.4e+07 Transitions= 1.64e+08 Memory= 1582.795 t= 149 R= 9e+04 -Depth= 8887 States= 1.5e+07 Transitions= 1.77e+08 Memory= 1651.447 t= 160 R= 9e+04 -Depth= 8887 States= 1.6e+07 Transitions= 1.9e+08 Memory= 1720.100 t= 172 R= 9e+04 -Depth= 8887 States= 1.7e+07 Transitions= 2.02e+08 Memory= 1788.752 t= 183 R= 9e+04 -Depth= 8887 States= 1.8e+07 Transitions= 2.15e+08 Memory= 1857.502 t= 194 R= 9e+04 -Depth= 8887 States= 1.9e+07 Transitions= 2.29e+08 Memory= 1926.154 t= 207 R= 9e+04 -Depth= 8887 States= 2e+07 Transitions= 2.4e+08 Memory= 1994.807 t= 217 R= 9e+04 -Depth= 8887 States= 2.1e+07 Transitions= 2.51e+08 Memory= 2063.459 t= 227 R= 9e+04 -Depth= 8887 States= 2.2e+07 Transitions= 2.63e+08 Memory= 2132.209 t= 238 R= 9e+04 -Depth= 8887 States= 2.3e+07 Transitions= 2.74e+08 Memory= 2200.861 t= 248 R= 9e+04 -Depth= 8887 States= 2.4e+07 Transitions= 2.86e+08 Memory= 2269.514 t= 259 R= 9e+04 -Depth= 8887 States= 2.5e+07 Transitions= 2.98e+08 Memory= 2338.166 t= 270 R= 9e+04 -Depth= 8887 States= 2.6e+07 Transitions= 3.1e+08 Memory= 2406.916 t= 281 R= 9e+04 -Depth= 8887 States= 2.7e+07 Transitions= 3.24e+08 Memory= 2475.568 t= 294 R= 9e+04 -Depth= 8887 States= 2.8e+07 Transitions= 3.36e+08 Memory= 2544.221 t= 305 R= 9e+04 -Depth= 8887 States= 2.9e+07 Transitions= 3.49e+08 Memory= 2612.873 t= 317 R= 9e+04 -Depth= 8887 States= 3e+07 Transitions= 3.63e+08 Memory= 2681.526 t= 329 R= 9e+04 -Depth= 8887 States= 3.1e+07 Transitions= 3.73e+08 Memory= 2750.276 t= 339 R= 9e+04 -Depth= 8887 States= 3.2e+07 Transitions= 3.85e+08 Memory= 2818.928 t= 351 R= 9e+04 -Depth= 8887 States= 3.3e+07 Transitions= 3.97e+08 Memory= 2887.580 t= 362 R= 9e+04 -Depth= 8887 States= 3.4e+07 Transitions= 4.08e+08 Memory= 2956.233 t= 373 R= 9e+04 -pan: resizing hashtable to -w26.. done -Depth= 8887 States= 3.5e+07 Transitions= 4.2e+08 Memory= 3520.967 t= 391 R= 9e+04 -Depth= 8887 States= 3.6e+07 Transitions= 4.32e+08 Memory= 3589.619 t= 402 R= 9e+04 -Depth= 8887 States= 3.7e+07 Transitions= 4.44e+08 Memory= 3658.272 t= 413 R= 9e+04 -Depth= 8887 States= 3.8e+07 Transitions= 4.58e+08 Memory= 3727.022 t= 425 R= 9e+04 -Depth= 8887 States= 3.9e+07 Transitions= 4.7e+08 Memory= 3795.674 t= 435 R= 9e+04 -Depth= 8887 States= 4e+07 Transitions= 4.83e+08 Memory= 3864.326 t= 447 R= 9e+04 -Depth= 8887 States= 4.1e+07 Transitions= 4.97e+08 Memory= 3932.979 t= 459 R= 9e+04 -Depth= 8887 States= 4.2e+07 Transitions= 5.07e+08 Memory= 4001.729 t= 468 R= 9e+04 -Depth= 8887 States= 4.3e+07 Transitions= 5.19e+08 Memory= 4070.381 t= 479 R= 9e+04 -Depth= 8887 States= 4.4e+07 Transitions= 5.31e+08 Memory= 4139.033 t= 489 R= 9e+04 -Depth= 8887 States= 4.5e+07 Transitions= 5.42e+08 Memory= 4207.686 t= 499 R= 9e+04 -Depth= 8887 States= 4.6e+07 Transitions= 5.54e+08 Memory= 4276.338 t= 510 R= 9e+04 -Depth= 8887 States= 4.7e+07 Transitions= 5.67e+08 Memory= 4345.088 t= 521 R= 9e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 64 byte, depth reached 8887, errors: 0 - 47143033 states, stored -5.2129161e+08 states, matched -5.6843464e+08 transitions (= stored+matched) -1.9783052e+09 atomic steps -hash conflicts: 3.1395137e+08 (resolved) - -Stats on memory usage (in Megabytes): - 4136.237 equivalent memory usage for states (stored*(State-vector + overhead)) - 3385.741 actual memory usage for states (compression: 81.86%) - state-vector as stored = 47 byte + 28 byte overhead - 512.000 memory used for hash table (-w26) - 457.764 memory used for DFS stack (-m10000000) - 4354.854 total actual memory usage - -unreached in proctype urcu_reader - line 398, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 61, "(1)" - line 417, "pan.___", state 91, "(1)" - line 398, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 158, "(1)" - line 417, "pan.___", state 188, "(1)" - line 398, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 256, "(1)" - line 417, "pan.___", state 286, "(1)" - line 398, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 395, "(1)" - line 417, "pan.___", state 425, "(1)" - line 539, "pan.___", state 456, "-end-" - (17 of 456 states) -unreached in proctype urcu_reader_sig - line 398, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 70, "(1)" - line 417, "pan.___", state 100, "(1)" - line 398, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 158, "(1)" - line 417, "pan.___", state 188, "(1)" - line 398, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 247, "(1)" - line 417, "pan.___", state 277, "(1)" - line 398, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 359, "(1)" - line 417, "pan.___", state 389, "(1)" - line 613, "pan.___", state 411, "-end-" - (17 of 411 states) -unreached in proctype urcu_writer - line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 59, "(1)" - line 412, "pan.___", state 72, "(1)" - line 417, "pan.___", state 89, "(1)" - line 398, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 153, "(1)" - line 412, "pan.___", state 166, "(1)" - line 651, "pan.___", state 199, "(1)" - line 174, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 178, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, "pan.___", state 240, "(1)" - line 163, "pan.___", state 248, "(1)" - line 167, "pan.___", state 260, "(1)" - line 174, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 178, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, "pan.___", state 370, "(1)" - line 163, "pan.___", state 378, "(1)" - line 167, "pan.___", state 390, "(1)" - line 398, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 449, "(1)" - line 412, "pan.___", state 462, "(1)" - line 417, "pan.___", state 479, "(1)" - line 398, "pan.___", state 498, "(1)" - line 402, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, "pan.___", state 554, "(1)" - line 417, "pan.___", state 571, "(1)" - line 402, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, "pan.___", state 647, "(1)" - line 417, "pan.___", state 664, "(1)" - line 178, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, "pan.___", state 710, "(1)" - line 163, "pan.___", state 718, "(1)" - line 167, "pan.___", state 730, "(1)" - line 174, "pan.___", state 741, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 178, "pan.___", state 817, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, "pan.___", state 830, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, "pan.___", state 840, "(1)" - line 163, "pan.___", state 848, "(1)" - line 167, "pan.___", state 860, "(1)" - line 398, "pan.___", state 882, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 398, "pan.___", state 884, "(1)" - line 398, "pan.___", state 885, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 398, "pan.___", state 885, "else" - line 398, "pan.___", state 888, "(1)" - line 402, "pan.___", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, "pan.___", state 898, "(1)" - line 402, "pan.___", state 899, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, "pan.___", state 899, "else" - line 402, "pan.___", state 902, "(1)" - line 402, "pan.___", state 903, "(1)" - line 402, "pan.___", state 903, "(1)" - line 400, "pan.___", state 908, "((i<1))" - line 400, "pan.___", state 908, "((i>=1))" - line 407, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 927, "(1)" - line 408, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 408, "pan.___", state 928, "else" - line 408, "pan.___", state 931, "(1)" - line 408, "pan.___", state 932, "(1)" - line 408, "pan.___", state 932, "(1)" - line 412, "pan.___", state 940, "(1)" - line 412, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 412, "pan.___", state 941, "else" - line 412, "pan.___", state 944, "(1)" - line 412, "pan.___", state 945, "(1)" - line 412, "pan.___", state 945, "(1)" - line 410, "pan.___", state 950, "((i<1))" - line 410, "pan.___", state 950, "((i>=1))" - line 417, "pan.___", state 957, "(1)" - line 417, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 417, "pan.___", state 958, "else" - line 417, "pan.___", state 961, "(1)" - line 417, "pan.___", state 962, "(1)" - line 417, "pan.___", state 962, "(1)" - line 419, "pan.___", state 965, "(1)" - line 419, "pan.___", state 965, "(1)" - line 402, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, "pan.___", state 1040, "(1)" - line 417, "pan.___", state 1057, "(1)" - line 402, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, "pan.___", state 1130, "(1)" - line 417, "pan.___", state 1147, "(1)" - line 398, "pan.___", state 1166, "(1)" - line 402, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, "pan.___", state 1222, "(1)" - line 417, "pan.___", state 1239, "(1)" - line 402, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 407, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 412, "pan.___", state 1315, "(1)" - line 417, "pan.___", state 1332, "(1)" - line 178, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, "pan.___", state 1378, "(1)" - line 163, "pan.___", state 1386, "(1)" - line 167, "pan.___", state 1398, "(1)" - line 174, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 178, "pan.___", state 1485, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, "pan.___", state 1498, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, "pan.___", state 1508, "(1)" - line 163, "pan.___", state 1516, "(1)" - line 167, "pan.___", state 1528, "(1)" - line 398, "pan.___", state 1550, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 398, "pan.___", state 1552, "(1)" - line 398, "pan.___", state 1553, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 398, "pan.___", state 1553, "else" - line 398, "pan.___", state 1556, "(1)" - line 402, "pan.___", state 1564, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, "pan.___", state 1566, "(1)" - line 402, "pan.___", state 1567, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 402, "pan.___", state 1567, "else" - line 402, "pan.___", state 1570, "(1)" - line 402, "pan.___", state 1571, "(1)" - line 402, "pan.___", state 1571, "(1)" - line 400, "pan.___", state 1576, "((i<1))" - line 400, "pan.___", state 1576, "((i>=1))" - line 407, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1595, "(1)" - line 408, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 408, "pan.___", state 1596, "else" - line 408, "pan.___", state 1599, "(1)" - line 408, "pan.___", state 1600, "(1)" - line 408, "pan.___", state 1600, "(1)" - line 412, "pan.___", state 1608, "(1)" - line 412, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 412, "pan.___", state 1609, "else" - line 412, "pan.___", state 1612, "(1)" - line 412, "pan.___", state 1613, "(1)" - line 412, "pan.___", state 1613, "(1)" - line 410, "pan.___", state 1618, "((i<1))" - line 410, "pan.___", state 1618, "((i>=1))" - line 417, "pan.___", state 1625, "(1)" - line 417, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 417, "pan.___", state 1626, "else" - line 417, "pan.___", state 1629, "(1)" - line 417, "pan.___", state 1630, "(1)" - line 417, "pan.___", state 1630, "(1)" - line 419, "pan.___", state 1633, "(1)" - line 419, "pan.___", state 1633, "(1)" - line 178, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, "pan.___", state 1681, "(1)" - line 163, "pan.___", state 1689, "(1)" - line 167, "pan.___", state 1701, "(1)" - line 174, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 178, "pan.___", state 1788, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 182, "pan.___", state 1801, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 159, "pan.___", state 1811, "(1)" - line 163, "pan.___", state 1819, "(1)" - line 167, "pan.___", state 1831, "(1)" - line 701, "pan.___", state 1856, "-end-" - (158 of 1856 states) -unreached in proctype :init: - (0 of 46 states) -unreached in proctype :never: - line 748, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 523 seconds -pan: rate 90149.985 states/second -pan: avg transition delay 9.1997e-07 usec -cp .input.spin urcu_free.spin.input -cp .input.spin.trail urcu_free.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free.ltl b/formal-model/urcu/result-signal-over-reader/urcu_free.ltl deleted file mode 100644 index 1954414..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free.ltl +++ /dev/null @@ -1 +0,0 @@ -[] (read_free -> !read_free_race) diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free.spin.input b/formal-model/urcu/result-signal-over-reader/urcu_free.spin.input deleted file mode 100644 index 2d7f62d..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free.spin.input +++ /dev/null @@ -1,722 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free.spin.input.trail b/formal-model/urcu/result-signal-over-reader/urcu_free.spin.input.trail deleted file mode 100644 index 837f3d9..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free.spin.input.trail +++ /dev/null @@ -1,15043 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4365 -2:4:4317 -3:4:4320 -4:4:4320 -5:4:4320 -6:4:4323 -7:4:4331 -8:4:4331 -9:4:4331 -10:4:4334 -11:4:4340 -12:4:4344 -13:4:4344 -14:4:4344 -15:4:4347 -16:4:4340 -17:4:4344 -18:4:4344 -19:4:4344 -20:4:4347 -21:4:4355 -22:4:4359 -23:4:4360 -24:0:4365 -25:4:4362 -26:0:4365 -27:3:2331 -28:0:4365 -29:3:2337 -30:0:4365 -31:3:2338 -32:0:4365 -33:3:2339 -34:3:2343 -35:3:2344 -36:3:2352 -37:3:2353 -38:3:2357 -39:3:2358 -40:3:2352 -41:3:2353 -42:3:2357 -43:3:2358 -44:3:2366 -45:3:2371 -46:3:2375 -47:3:2376 -48:3:2383 -49:3:2384 -50:3:2395 -51:3:2396 -52:3:2397 -53:3:2395 -54:3:2396 -55:3:2397 -56:3:2408 -57:3:2413 -58:3:2414 -59:0:4365 -60:3:2426 -61:0:4365 -62:3:2427 -63:0:4365 -64:2:1162 -65:0:4365 -66:3:2428 -67:0:4365 -68:2:1168 -69:0:4365 -70:2:1169 -71:0:4365 -72:3:2427 -73:0:4365 -74:2:1170 -75:0:4365 -76:3:2428 -77:0:4365 -78:3:2429 -79:0:4365 -80:3:2435 -81:3:2436 -82:0:4365 -83:3:2440 -84:3:2444 -85:3:2445 -86:3:2453 -87:3:2454 -88:3:2458 -89:3:2459 -90:3:2453 -91:3:2454 -92:3:2458 -93:3:2459 -94:3:2467 -95:3:2472 -96:3:2473 -97:3:2484 -98:3:2485 -99:3:2496 -100:3:2497 -101:3:2498 -102:3:2496 -103:3:2497 -104:3:2498 -105:3:2509 -106:3:2514 -107:3:2515 -108:0:4365 -109:3:2527 -110:0:4365 -111:3:2528 -112:0:4365 -113:2:1173 -114:0:4365 -115:3:2529 -116:0:4365 -117:2:1179 -118:0:4365 -119:2:1180 -120:0:4365 -121:3:2528 -122:0:4365 -123:2:1181 -124:2:1185 -125:2:1186 -126:2:1194 -127:2:1195 -128:2:1199 -129:2:1200 -130:2:1194 -131:2:1195 -132:2:1199 -133:2:1200 -134:2:1208 -135:2:1213 -136:2:1217 -137:2:1218 -138:2:1225 -139:2:1226 -140:2:1237 -141:2:1238 -142:2:1239 -143:2:1237 -144:2:1238 -145:2:1239 -146:2:1250 -147:2:1255 -148:2:1256 -149:0:4365 -150:3:2529 -151:0:4365 -152:2:1268 -153:0:4365 -154:3:2528 -155:0:4365 -156:2:1270 -157:0:4365 -158:3:2529 -159:0:4365 -160:2:1271 -161:2:1275 -162:2:1276 -163:2:1284 -164:2:1285 -165:2:1289 -166:2:1290 -167:2:1284 -168:2:1285 -169:2:1289 -170:2:1290 -171:2:1298 -172:2:1303 -173:2:1307 -174:2:1308 -175:2:1315 -176:2:1316 -177:2:1327 -178:2:1328 -179:2:1329 -180:2:1327 -181:2:1328 -182:2:1329 -183:2:1340 -184:2:1345 -185:2:1346 -186:0:4365 -187:2:1358 -188:0:4365 -189:2:1360 -190:0:4365 -191:3:2528 -192:0:4365 -193:2:1361 -194:0:4365 -195:3:2529 -196:0:4365 -197:2:1362 -198:2:1366 -199:2:1367 -200:2:1375 -201:2:1376 -202:2:1380 -203:2:1381 -204:2:1375 -205:2:1376 -206:2:1380 -207:2:1381 -208:2:1389 -209:2:1394 -210:2:1398 -211:2:1399 -212:2:1406 -213:2:1407 -214:2:1418 -215:2:1419 -216:2:1420 -217:2:1418 -218:2:1419 -219:2:1420 -220:2:1431 -221:2:1436 -222:2:1437 -223:0:4365 -224:2:1449 -225:0:4365 -226:3:2528 -227:0:4365 -228:2:1451 -229:0:4365 -230:3:2529 -231:0:4365 -232:2:1652 -233:0:4365 -234:2:1653 -235:0:4365 -236:2:1657 -237:0:4365 -238:2:1180 -239:0:4365 -240:3:2528 -241:0:4365 -242:2:1181 -243:2:1185 -244:2:1186 -245:2:1194 -246:2:1195 -247:2:1199 -248:2:1200 -249:2:1194 -250:2:1195 -251:2:1196 -252:2:1208 -253:2:1213 -254:2:1217 -255:2:1218 -256:2:1225 -257:2:1226 -258:2:1237 -259:2:1238 -260:2:1239 -261:2:1237 -262:2:1238 -263:2:1239 -264:2:1250 -265:2:1255 -266:2:1256 -267:0:4365 -268:3:2529 -269:0:4365 -270:2:1268 -271:0:4365 -272:3:2528 -273:0:4365 -274:2:1270 -275:0:4365 -276:3:2529 -277:0:4365 -278:2:1271 -279:2:1275 -280:2:1276 -281:2:1284 -282:2:1285 -283:2:1289 -284:2:1290 -285:2:1284 -286:2:1285 -287:2:1289 -288:2:1290 -289:2:1298 -290:2:1303 -291:2:1307 -292:2:1308 -293:2:1315 -294:2:1316 -295:2:1327 -296:2:1328 -297:2:1329 -298:2:1327 -299:2:1328 -300:2:1329 -301:2:1340 -302:2:1345 -303:2:1346 -304:0:4365 -305:2:1358 -306:0:4365 -307:2:1454 -308:0:4365 -309:3:2528 -310:0:4365 -311:2:1455 -312:0:4365 -313:3:2529 -314:0:4365 -315:2:1652 -316:0:4365 -317:2:1653 -318:0:4365 -319:2:1657 -320:0:4365 -321:2:1660 -322:0:4365 -323:3:2528 -324:0:4365 -325:2:1665 -326:2:1669 -327:2:1670 -328:2:1678 -329:2:1679 -330:2:1683 -331:2:1684 -332:2:1678 -333:2:1679 -334:2:1680 -335:2:1692 -336:2:1697 -337:2:1701 -338:2:1702 -339:2:1709 -340:2:1710 -341:2:1721 -342:2:1722 -343:2:1723 -344:2:1721 -345:2:1722 -346:2:1723 -347:2:1734 -348:2:1739 -349:2:1740 -350:0:4365 -351:3:2529 -352:0:4365 -353:2:1752 -354:0:4365 -355:3:2528 -356:0:4365 -357:2:1754 -358:0:4365 -359:3:2529 -360:0:4365 -361:2:1755 -362:2:1759 -363:2:1760 -364:2:1768 -365:2:1769 -366:2:1773 -367:2:1774 -368:2:1768 -369:2:1769 -370:2:1773 -371:2:1774 -372:2:1782 -373:2:1787 -374:2:1791 -375:2:1792 -376:2:1799 -377:2:1800 -378:2:1811 -379:2:1812 -380:2:1813 -381:2:1811 -382:2:1812 -383:2:1813 -384:2:1824 -385:2:1829 -386:2:1830 -387:0:4365 -388:2:1842 -389:0:4365 -390:3:2528 -391:0:4365 -392:2:1844 -393:0:4365 -394:3:2529 -395:0:4365 -396:2:1845 -397:2:1849 -398:2:1850 -399:2:1858 -400:2:1859 -401:2:1863 -402:2:1864 -403:2:1858 -404:2:1859 -405:2:1863 -406:2:1864 -407:2:1872 -408:2:1877 -409:2:1881 -410:2:1882 -411:2:1889 -412:2:1890 -413:2:1901 -414:2:1902 -415:2:1903 -416:2:1901 -417:2:1902 -418:2:1903 -419:2:1914 -420:2:1919 -421:2:1920 -422:0:4365 -423:2:1932 -424:0:4365 -425:3:2528 -426:0:4365 -427:2:1934 -428:0:4365 -429:3:2529 -430:0:4365 -431:2:1935 -432:0:4365 -433:2:1936 -434:0:4365 -435:2:2129 -436:0:4365 -437:2:2130 -438:0:4365 -439:2:2134 -440:0:4365 -441:3:2528 -442:0:4365 -443:2:2136 -444:0:4365 -445:3:2529 -446:0:4365 -447:2:2137 -448:2:2141 -449:2:2142 -450:2:2150 -451:2:2151 -452:2:2155 -453:2:2156 -454:2:2150 -455:2:2151 -456:2:2155 -457:2:2156 -458:2:2164 -459:2:2169 -460:2:2173 -461:2:2174 -462:2:2181 -463:2:2182 -464:2:2193 -465:2:2194 -466:2:2195 -467:2:2193 -468:2:2194 -469:2:2195 -470:2:2206 -471:2:2211 -472:2:2212 -473:0:4365 -474:2:2224 -475:0:4365 -476:3:2528 -477:0:4365 -478:2:2226 -479:0:4365 -480:3:2529 -481:0:4365 -482:2:1936 -483:0:4365 -484:2:2129 -485:0:4365 -486:2:2130 -487:0:4365 -488:2:2134 -489:0:4365 -490:3:2528 -491:0:4365 -492:2:2136 -493:0:4365 -494:3:2529 -495:0:4365 -496:2:2137 -497:2:2141 -498:2:2142 -499:2:2150 -500:2:2151 -501:2:2155 -502:2:2156 -503:2:2150 -504:2:2151 -505:2:2152 -506:2:2164 -507:2:2169 -508:2:2173 -509:2:2174 -510:2:2181 -511:2:2182 -512:2:2193 -513:2:2194 -514:2:2195 -515:2:2193 -516:2:2194 -517:2:2195 -518:2:2206 -519:2:2211 -520:2:2212 -521:0:4365 -522:2:2224 -523:0:4365 -524:3:2528 -525:0:4365 -526:2:2226 -527:0:4365 -528:3:2529 -529:0:4365 -530:2:2230 -531:0:4365 -532:3:2528 -533:0:4365 -534:2:2235 -535:2:2239 -536:2:2240 -537:2:2248 -538:2:2249 -539:2:2253 -540:2:2254 -541:2:2248 -542:2:2249 -543:2:2250 -544:2:2262 -545:2:2267 -546:2:2271 -547:2:2272 -548:2:2279 -549:2:2280 -550:2:2291 -551:2:2292 -552:2:2293 -553:2:2291 -554:2:2292 -555:2:2293 -556:2:2304 -557:2:2309 -558:2:2310 -559:0:4365 -560:3:2529 -561:0:4365 -562:2:2322 -563:0:4365 -564:2:1169 -565:0:4365 -566:3:2528 -567:0:4365 -568:2:1170 -569:0:4365 -570:3:2529 -571:0:4365 -572:3:2530 -573:0:4365 -574:3:2536 -575:0:4365 -576:3:2537 -577:0:4365 -578:3:2547 -579:0:4365 -580:3:2548 -581:0:4365 -582:3:2552 -583:3:2553 -584:3:2557 -585:3:2561 -586:3:2562 -587:3:2557 -588:3:2561 -589:3:2562 -590:3:2566 -591:3:2574 -592:3:2575 -593:3:2580 -594:3:2587 -595:3:2588 -596:3:2587 -597:3:2588 -598:3:2595 -599:3:2600 -600:0:4365 -601:3:2611 -602:0:4365 -603:3:2615 -604:3:2616 -605:3:2620 -606:3:2624 -607:3:2625 -608:3:2620 -609:3:2624 -610:3:2625 -611:3:2629 -612:3:2637 -613:3:2638 -614:3:2643 -615:3:2650 -616:3:2651 -617:3:2650 -618:3:2651 -619:3:2658 -620:3:2663 -621:0:4365 -622:3:2611 -623:0:4365 -624:3:2615 -625:3:2616 -626:3:2620 -627:3:2624 -628:3:2625 -629:3:2620 -630:3:2624 -631:3:2625 -632:3:2629 -633:3:2637 -634:3:2638 -635:3:2643 -636:3:2650 -637:3:2651 -638:3:2650 -639:3:2651 -640:3:2658 -641:3:2663 -642:0:4365 -643:3:2674 -644:0:4365 -645:3:2682 -646:3:2683 -647:3:2687 -648:3:2691 -649:3:2692 -650:3:2687 -651:3:2691 -652:3:2692 -653:3:2696 -654:3:2704 -655:3:2705 -656:3:2710 -657:3:2717 -658:3:2718 -659:3:2717 -660:3:2718 -661:3:2725 -662:3:2730 -663:0:4365 -664:3:2745 -665:0:4365 -666:3:2746 -667:0:4365 -668:2:1173 -669:0:4365 -670:3:2747 -671:0:4365 -672:2:1179 -673:0:4365 -674:2:1180 -675:0:4365 -676:3:2746 -677:0:4365 -678:2:1181 -679:2:1185 -680:2:1186 -681:2:1194 -682:2:1195 -683:2:1199 -684:2:1200 -685:2:1194 -686:2:1195 -687:2:1199 -688:2:1200 -689:2:1208 -690:2:1213 -691:2:1217 -692:2:1218 -693:2:1225 -694:2:1226 -695:2:1237 -696:2:1238 -697:2:1239 -698:2:1237 -699:2:1238 -700:2:1239 -701:2:1250 -702:2:1255 -703:2:1256 -704:0:4365 -705:3:2747 -706:0:4365 -707:2:1268 -708:0:4365 -709:3:2746 -710:0:4365 -711:2:1270 -712:0:4365 -713:3:2747 -714:0:4365 -715:2:1271 -716:2:1275 -717:2:1276 -718:2:1284 -719:2:1285 -720:2:1289 -721:2:1290 -722:2:1284 -723:2:1285 -724:2:1289 -725:2:1290 -726:2:1298 -727:2:1303 -728:2:1307 -729:2:1308 -730:2:1315 -731:2:1316 -732:2:1327 -733:2:1328 -734:2:1329 -735:2:1327 -736:2:1328 -737:2:1329 -738:2:1340 -739:2:1345 -740:2:1346 -741:0:4365 -742:2:1358 -743:0:4365 -744:2:1360 -745:0:4365 -746:3:2746 -747:0:4365 -748:2:1361 -749:0:4365 -750:3:2747 -751:0:4365 -752:2:1362 -753:2:1366 -754:2:1367 -755:2:1375 -756:2:1376 -757:2:1380 -758:2:1381 -759:2:1375 -760:2:1376 -761:2:1380 -762:2:1381 -763:2:1389 -764:2:1394 -765:2:1398 -766:2:1399 -767:2:1406 -768:2:1407 -769:2:1418 -770:2:1419 -771:2:1420 -772:2:1418 -773:2:1419 -774:2:1420 -775:2:1431 -776:2:1436 -777:2:1437 -778:0:4365 -779:2:1449 -780:0:4365 -781:3:2746 -782:0:4365 -783:2:1451 -784:0:4365 -785:3:2747 -786:0:4365 -787:2:1652 -788:0:4365 -789:2:1653 -790:0:4365 -791:2:1657 -792:0:4365 -793:2:1180 -794:0:4365 -795:3:2746 -796:0:4365 -797:2:1181 -798:2:1185 -799:2:1186 -800:2:1194 -801:2:1195 -802:2:1199 -803:2:1200 -804:2:1194 -805:2:1195 -806:2:1196 -807:2:1208 -808:2:1213 -809:2:1217 -810:2:1218 -811:2:1225 -812:2:1226 -813:2:1237 -814:2:1238 -815:2:1239 -816:2:1237 -817:2:1238 -818:2:1239 -819:2:1250 -820:2:1255 -821:2:1256 -822:0:4365 -823:3:2747 -824:0:4365 -825:2:1268 -826:0:4365 -827:3:2746 -828:0:4365 -829:2:1270 -830:0:4365 -831:3:2747 -832:0:4365 -833:2:1271 -834:2:1275 -835:2:1276 -836:2:1284 -837:2:1285 -838:2:1289 -839:2:1290 -840:2:1284 -841:2:1285 -842:2:1289 -843:2:1290 -844:2:1298 -845:2:1303 -846:2:1307 -847:2:1308 -848:2:1315 -849:2:1316 -850:2:1327 -851:2:1328 -852:2:1329 -853:2:1327 -854:2:1328 -855:2:1329 -856:2:1340 -857:2:1345 -858:2:1346 -859:0:4365 -860:2:1358 -861:0:4365 -862:2:1454 -863:0:4365 -864:3:2746 -865:0:4365 -866:2:1455 -867:0:4365 -868:3:2747 -869:0:4365 -870:2:1652 -871:0:4365 -872:2:1653 -873:0:4365 -874:2:1657 -875:0:4365 -876:2:1660 -877:0:4365 -878:3:2746 -879:0:4365 -880:2:1665 -881:2:1669 -882:2:1670 -883:2:1678 -884:2:1679 -885:2:1683 -886:2:1684 -887:2:1678 -888:2:1679 -889:2:1680 -890:2:1692 -891:2:1697 -892:2:1701 -893:2:1702 -894:2:1709 -895:2:1710 -896:2:1721 -897:2:1722 -898:2:1723 -899:2:1721 -900:2:1722 -901:2:1723 -902:2:1734 -903:2:1739 -904:2:1740 -905:0:4365 -906:3:2747 -907:0:4365 -908:2:1752 -909:0:4365 -910:3:2746 -911:0:4365 -912:2:1754 -913:0:4365 -914:3:2747 -915:0:4365 -916:2:1755 -917:2:1759 -918:2:1760 -919:2:1768 -920:2:1769 -921:2:1773 -922:2:1774 -923:2:1768 -924:2:1769 -925:2:1773 -926:2:1774 -927:2:1782 -928:2:1787 -929:2:1791 -930:2:1792 -931:2:1799 -932:2:1800 -933:2:1811 -934:2:1812 -935:2:1813 -936:2:1811 -937:2:1812 -938:2:1813 -939:2:1824 -940:2:1829 -941:2:1830 -942:0:4365 -943:2:1842 -944:0:4365 -945:3:2746 -946:0:4365 -947:2:1844 -948:0:4365 -949:3:2747 -950:0:4365 -951:2:1845 -952:2:1849 -953:2:1850 -954:2:1858 -955:2:1859 -956:2:1863 -957:2:1864 -958:2:1858 -959:2:1859 -960:2:1863 -961:2:1864 -962:2:1872 -963:2:1877 -964:2:1881 -965:2:1882 -966:2:1889 -967:2:1890 -968:2:1901 -969:2:1902 -970:2:1903 -971:2:1901 -972:2:1902 -973:2:1903 -974:2:1914 -975:2:1919 -976:2:1920 -977:0:4365 -978:2:1932 -979:0:4365 -980:3:2746 -981:0:4365 -982:2:1934 -983:0:4365 -984:3:2747 -985:0:4365 -986:2:1935 -987:0:4365 -988:2:1936 -989:0:4365 -990:2:2129 -991:0:4365 -992:2:2130 -993:0:4365 -994:2:2134 -995:0:4365 -996:3:2746 -997:0:4365 -998:2:2136 -999:0:4365 -1000:3:2747 -1001:0:4365 -1002:2:2137 -1003:2:2141 -1004:2:2142 -1005:2:2150 -1006:2:2151 -1007:2:2155 -1008:2:2156 -1009:2:2150 -1010:2:2151 -1011:2:2155 -1012:2:2156 -1013:2:2164 -1014:2:2169 -1015:2:2173 -1016:2:2174 -1017:2:2181 -1018:2:2182 -1019:2:2193 -1020:2:2194 -1021:2:2195 -1022:2:2193 -1023:2:2194 -1024:2:2195 -1025:2:2206 -1026:2:2211 -1027:2:2212 -1028:0:4365 -1029:2:2224 -1030:0:4365 -1031:3:2746 -1032:0:4365 -1033:2:2226 -1034:0:4365 -1035:3:2747 -1036:0:4365 -1037:2:1936 -1038:0:4365 -1039:2:2129 -1040:0:4365 -1041:2:2130 -1042:0:4365 -1043:2:2134 -1044:0:4365 -1045:3:2746 -1046:0:4365 -1047:2:2136 -1048:0:4365 -1049:3:2747 -1050:0:4365 -1051:2:2137 -1052:2:2141 -1053:2:2142 -1054:2:2150 -1055:2:2151 -1056:2:2155 -1057:2:2156 -1058:2:2150 -1059:2:2151 -1060:2:2152 -1061:2:2164 -1062:2:2169 -1063:2:2173 -1064:2:2174 -1065:2:2181 -1066:2:2182 -1067:2:2193 -1068:2:2194 -1069:2:2195 -1070:2:2193 -1071:2:2194 -1072:2:2195 -1073:2:2206 -1074:2:2211 -1075:2:2212 -1076:0:4365 -1077:2:2224 -1078:0:4365 -1079:3:2746 -1080:0:4365 -1081:2:2226 -1082:0:4365 -1083:3:2747 -1084:0:4365 -1085:2:2230 -1086:0:4365 -1087:3:2746 -1088:0:4365 -1089:2:2235 -1090:2:2239 -1091:2:2240 -1092:2:2248 -1093:2:2249 -1094:2:2253 -1095:2:2254 -1096:2:2248 -1097:2:2249 -1098:2:2250 -1099:2:2262 -1100:2:2267 -1101:2:2271 -1102:2:2272 -1103:2:2279 -1104:2:2280 -1105:2:2291 -1106:2:2292 -1107:2:2293 -1108:2:2291 -1109:2:2292 -1110:2:2293 -1111:2:2304 -1112:2:2309 -1113:2:2310 -1114:0:4365 -1115:3:2747 -1116:0:4365 -1117:2:2322 -1118:0:4365 -1119:2:1169 -1120:0:4365 -1121:3:2746 -1122:0:4365 -1123:2:1170 -1124:0:4365 -1125:3:2747 -1126:0:4365 -1127:3:2748 -1128:0:4365 -1129:3:2754 -1130:0:4365 -1131:3:2755 -1132:3:2759 -1133:3:2760 -1134:3:2768 -1135:3:2769 -1136:3:2773 -1137:3:2774 -1138:3:2768 -1139:3:2769 -1140:3:2773 -1141:3:2774 -1142:3:2782 -1143:3:2787 -1144:3:2791 -1145:3:2792 -1146:3:2799 -1147:3:2800 -1148:3:2811 -1149:3:2812 -1150:3:2813 -1151:3:2811 -1152:3:2812 -1153:3:2813 -1154:3:2824 -1155:3:2829 -1156:3:2830 -1157:0:4365 -1158:3:2842 -1159:0:4365 -1160:3:2843 -1161:0:4365 -1162:2:1173 -1163:0:4365 -1164:3:2844 -1165:0:4365 -1166:2:1179 -1167:0:4365 -1168:2:1180 -1169:0:4365 -1170:3:2843 -1171:0:4365 -1172:2:1181 -1173:2:1185 -1174:2:1186 -1175:2:1194 -1176:2:1195 -1177:2:1199 -1178:2:1200 -1179:2:1194 -1180:2:1195 -1181:2:1199 -1182:2:1200 -1183:2:1208 -1184:2:1213 -1185:2:1217 -1186:2:1218 -1187:2:1225 -1188:2:1226 -1189:2:1237 -1190:2:1238 -1191:2:1239 -1192:2:1237 -1193:2:1238 -1194:2:1239 -1195:2:1250 -1196:2:1255 -1197:2:1256 -1198:0:4365 -1199:3:2844 -1200:0:4365 -1201:2:1268 -1202:0:4365 -1203:3:2843 -1204:0:4365 -1205:2:1270 -1206:0:4365 -1207:3:2844 -1208:0:4365 -1209:2:1271 -1210:2:1275 -1211:2:1276 -1212:2:1284 -1213:2:1285 -1214:2:1289 -1215:2:1290 -1216:2:1284 -1217:2:1285 -1218:2:1289 -1219:2:1290 -1220:2:1298 -1221:2:1303 -1222:2:1307 -1223:2:1308 -1224:2:1315 -1225:2:1316 -1226:2:1327 -1227:2:1328 -1228:2:1329 -1229:2:1327 -1230:2:1328 -1231:2:1329 -1232:2:1340 -1233:2:1345 -1234:2:1346 -1235:0:4365 -1236:2:1358 -1237:0:4365 -1238:2:1360 -1239:0:4365 -1240:3:2843 -1241:0:4365 -1242:2:1361 -1243:0:4365 -1244:3:2844 -1245:0:4365 -1246:2:1362 -1247:2:1366 -1248:2:1367 -1249:2:1375 -1250:2:1376 -1251:2:1380 -1252:2:1381 -1253:2:1375 -1254:2:1376 -1255:2:1380 -1256:2:1381 -1257:2:1389 -1258:2:1394 -1259:2:1398 -1260:2:1399 -1261:2:1406 -1262:2:1407 -1263:2:1418 -1264:2:1419 -1265:2:1420 -1266:2:1418 -1267:2:1419 -1268:2:1420 -1269:2:1431 -1270:2:1436 -1271:2:1437 -1272:0:4365 -1273:2:1449 -1274:0:4365 -1275:3:2843 -1276:0:4365 -1277:2:1451 -1278:0:4365 -1279:3:2844 -1280:0:4365 -1281:2:1652 -1282:0:4365 -1283:2:1653 -1284:0:4365 -1285:2:1657 -1286:0:4365 -1287:2:1180 -1288:0:4365 -1289:3:2843 -1290:0:4365 -1291:2:1181 -1292:2:1185 -1293:2:1186 -1294:2:1194 -1295:2:1195 -1296:2:1199 -1297:2:1200 -1298:2:1194 -1299:2:1195 -1300:2:1196 -1301:2:1208 -1302:2:1213 -1303:2:1217 -1304:2:1218 -1305:2:1225 -1306:2:1226 -1307:2:1237 -1308:2:1238 -1309:2:1239 -1310:2:1237 -1311:2:1238 -1312:2:1239 -1313:2:1250 -1314:2:1255 -1315:2:1256 -1316:0:4365 -1317:3:2844 -1318:0:4365 -1319:2:1268 -1320:0:4365 -1321:3:2843 -1322:0:4365 -1323:2:1270 -1324:0:4365 -1325:3:2844 -1326:0:4365 -1327:2:1271 -1328:2:1275 -1329:2:1276 -1330:2:1284 -1331:2:1285 -1332:2:1289 -1333:2:1290 -1334:2:1284 -1335:2:1285 -1336:2:1289 -1337:2:1290 -1338:2:1298 -1339:2:1303 -1340:2:1307 -1341:2:1308 -1342:2:1315 -1343:2:1316 -1344:2:1327 -1345:2:1328 -1346:2:1329 -1347:2:1327 -1348:2:1328 -1349:2:1329 -1350:2:1340 -1351:2:1345 -1352:2:1346 -1353:0:4365 -1354:2:1358 -1355:0:4365 -1356:2:1454 -1357:0:4365 -1358:3:2843 -1359:0:4365 -1360:2:1455 -1361:0:4365 -1362:3:2844 -1363:0:4365 -1364:2:1652 -1365:0:4365 -1366:2:1653 -1367:0:4365 -1368:2:1657 -1369:0:4365 -1370:2:1660 -1371:0:4365 -1372:3:2843 -1373:0:4365 -1374:2:1665 -1375:2:1669 -1376:2:1670 -1377:2:1678 -1378:2:1679 -1379:2:1683 -1380:2:1684 -1381:2:1678 -1382:2:1679 -1383:2:1680 -1384:2:1692 -1385:2:1697 -1386:2:1701 -1387:2:1702 -1388:2:1709 -1389:2:1710 -1390:2:1721 -1391:2:1722 -1392:2:1723 -1393:2:1721 -1394:2:1722 -1395:2:1723 -1396:2:1734 -1397:2:1739 -1398:2:1740 -1399:0:4365 -1400:3:2844 -1401:0:4365 -1402:2:1752 -1403:0:4365 -1404:3:2843 -1405:0:4365 -1406:2:1754 -1407:0:4365 -1408:3:2844 -1409:0:4365 -1410:2:1755 -1411:2:1759 -1412:2:1760 -1413:2:1768 -1414:2:1769 -1415:2:1773 -1416:2:1774 -1417:2:1768 -1418:2:1769 -1419:2:1773 -1420:2:1774 -1421:2:1782 -1422:2:1787 -1423:2:1791 -1424:2:1792 -1425:2:1799 -1426:2:1800 -1427:2:1811 -1428:2:1812 -1429:2:1813 -1430:2:1811 -1431:2:1812 -1432:2:1813 -1433:2:1824 -1434:2:1829 -1435:2:1830 -1436:0:4365 -1437:2:1842 -1438:0:4365 -1439:3:2843 -1440:0:4365 -1441:2:1844 -1442:0:4365 -1443:3:2844 -1444:0:4365 -1445:2:1845 -1446:2:1849 -1447:2:1850 -1448:2:1858 -1449:2:1859 -1450:2:1863 -1451:2:1864 -1452:2:1858 -1453:2:1859 -1454:2:1863 -1455:2:1864 -1456:2:1872 -1457:2:1877 -1458:2:1881 -1459:2:1882 -1460:2:1889 -1461:2:1890 -1462:2:1901 -1463:2:1902 -1464:2:1903 -1465:2:1901 -1466:2:1902 -1467:2:1903 -1468:2:1914 -1469:2:1919 -1470:2:1920 -1471:0:4365 -1472:2:1932 -1473:0:4365 -1474:3:2843 -1475:0:4365 -1476:2:1934 -1477:0:4365 -1478:3:2844 -1479:0:4365 -1480:2:1935 -1481:0:4365 -1482:2:1936 -1483:0:4365 -1484:2:2129 -1485:0:4365 -1486:2:2130 -1487:0:4365 -1488:2:2134 -1489:0:4365 -1490:3:2843 -1491:0:4365 -1492:2:2136 -1493:0:4365 -1494:3:2844 -1495:0:4365 -1496:2:2137 -1497:2:2141 -1498:2:2142 -1499:2:2150 -1500:2:2151 -1501:2:2155 -1502:2:2156 -1503:2:2150 -1504:2:2151 -1505:2:2155 -1506:2:2156 -1507:2:2164 -1508:2:2169 -1509:2:2173 -1510:2:2174 -1511:2:2181 -1512:2:2182 -1513:2:2193 -1514:2:2194 -1515:2:2195 -1516:2:2193 -1517:2:2194 -1518:2:2195 -1519:2:2206 -1520:2:2211 -1521:2:2212 -1522:0:4365 -1523:2:2224 -1524:0:4365 -1525:3:2843 -1526:0:4365 -1527:2:2226 -1528:0:4365 -1529:3:2844 -1530:0:4365 -1531:2:1936 -1532:0:4365 -1533:2:2129 -1534:0:4365 -1535:2:2130 -1536:0:4365 -1537:2:2134 -1538:0:4365 -1539:3:2843 -1540:0:4365 -1541:2:2136 -1542:0:4365 -1543:3:2844 -1544:0:4365 -1545:2:2137 -1546:2:2141 -1547:2:2142 -1548:2:2150 -1549:2:2151 -1550:2:2155 -1551:2:2156 -1552:2:2150 -1553:2:2151 -1554:2:2152 -1555:2:2164 -1556:2:2169 -1557:2:2173 -1558:2:2174 -1559:2:2181 -1560:2:2182 -1561:2:2193 -1562:2:2194 -1563:2:2195 -1564:2:2193 -1565:2:2194 -1566:2:2195 -1567:2:2206 -1568:2:2211 -1569:2:2212 -1570:0:4365 -1571:2:2224 -1572:0:4365 -1573:3:2843 -1574:0:4365 -1575:2:2226 -1576:0:4365 -1577:3:2844 -1578:0:4365 -1579:2:2230 -1580:0:4365 -1581:3:2843 -1582:0:4365 -1583:2:2235 -1584:2:2239 -1585:2:2240 -1586:2:2248 -1587:2:2249 -1588:2:2253 -1589:2:2254 -1590:2:2248 -1591:2:2249 -1592:2:2250 -1593:2:2262 -1594:2:2267 -1595:2:2271 -1596:2:2272 -1597:2:2279 -1598:2:2280 -1599:2:2291 -1600:2:2292 -1601:2:2293 -1602:2:2291 -1603:2:2292 -1604:2:2293 -1605:2:2304 -1606:2:2309 -1607:2:2310 -1608:0:4365 -1609:3:2844 -1610:0:4365 -1611:2:2322 -1612:0:4365 -1613:2:1169 -1614:0:4365 -1615:3:2843 -1616:0:4365 -1617:2:1170 -1618:0:4365 -1619:3:2844 -1620:0:4365 -1621:3:2845 -1622:0:4365 -1623:3:2851 -1624:0:4365 -1625:3:2854 -1626:3:2855 -1627:3:2867 -1628:3:2868 -1629:3:2872 -1630:3:2873 -1631:3:2867 -1632:3:2868 -1633:3:2872 -1634:3:2873 -1635:3:2881 -1636:3:2886 -1637:3:2890 -1638:3:2891 -1639:3:2898 -1640:3:2899 -1641:3:2910 -1642:3:2911 -1643:3:2912 -1644:3:2910 -1645:3:2911 -1646:3:2912 -1647:3:2923 -1648:3:2928 -1649:3:2929 -1650:0:4365 -1651:3:2941 -1652:0:4365 -1653:3:2942 -1654:0:4365 -1655:2:1173 -1656:0:4365 -1657:3:2943 -1658:0:4365 -1659:2:1179 -1660:0:4365 -1661:2:1180 -1662:0:4365 -1663:3:2942 -1664:0:4365 -1665:2:1181 -1666:2:1185 -1667:2:1186 -1668:2:1194 -1669:2:1195 -1670:2:1199 -1671:2:1200 -1672:2:1194 -1673:2:1195 -1674:2:1199 -1675:2:1200 -1676:2:1208 -1677:2:1213 -1678:2:1217 -1679:2:1218 -1680:2:1225 -1681:2:1226 -1682:2:1237 -1683:2:1238 -1684:2:1239 -1685:2:1237 -1686:2:1238 -1687:2:1239 -1688:2:1250 -1689:2:1255 -1690:2:1256 -1691:0:4365 -1692:3:2943 -1693:0:4365 -1694:2:1268 -1695:0:4365 -1696:3:2942 -1697:0:4365 -1698:2:1270 -1699:0:4365 -1700:3:2943 -1701:0:4365 -1702:2:1271 -1703:2:1275 -1704:2:1276 -1705:2:1284 -1706:2:1285 -1707:2:1289 -1708:2:1290 -1709:2:1284 -1710:2:1285 -1711:2:1289 -1712:2:1290 -1713:2:1298 -1714:2:1303 -1715:2:1307 -1716:2:1308 -1717:2:1315 -1718:2:1316 -1719:2:1327 -1720:2:1328 -1721:2:1329 -1722:2:1327 -1723:2:1328 -1724:2:1329 -1725:2:1340 -1726:2:1345 -1727:2:1346 -1728:0:4365 -1729:2:1358 -1730:0:4365 -1731:2:1360 -1732:0:4365 -1733:3:2942 -1734:0:4365 -1735:2:1361 -1736:0:4365 -1737:3:2943 -1738:0:4365 -1739:2:1362 -1740:2:1366 -1741:2:1367 -1742:2:1375 -1743:2:1376 -1744:2:1380 -1745:2:1381 -1746:2:1375 -1747:2:1376 -1748:2:1380 -1749:2:1381 -1750:2:1389 -1751:2:1394 -1752:2:1398 -1753:2:1399 -1754:2:1406 -1755:2:1407 -1756:2:1418 -1757:2:1419 -1758:2:1420 -1759:2:1418 -1760:2:1419 -1761:2:1420 -1762:2:1431 -1763:2:1436 -1764:2:1437 -1765:0:4365 -1766:2:1449 -1767:0:4365 -1768:3:2942 -1769:0:4365 -1770:2:1451 -1771:0:4365 -1772:3:2943 -1773:0:4365 -1774:2:1652 -1775:0:4365 -1776:2:1653 -1777:0:4365 -1778:2:1657 -1779:0:4365 -1780:2:1180 -1781:0:4365 -1782:3:2942 -1783:0:4365 -1784:2:1181 -1785:2:1185 -1786:2:1186 -1787:2:1194 -1788:2:1195 -1789:2:1199 -1790:2:1200 -1791:2:1194 -1792:2:1195 -1793:2:1196 -1794:2:1208 -1795:2:1213 -1796:2:1217 -1797:2:1218 -1798:2:1225 -1799:2:1226 -1800:2:1237 -1801:2:1238 -1802:2:1239 -1803:2:1237 -1804:2:1238 -1805:2:1239 -1806:2:1250 -1807:2:1255 -1808:2:1256 -1809:0:4365 -1810:3:2943 -1811:0:4365 -1812:2:1268 -1813:0:4365 -1814:3:2942 -1815:0:4365 -1816:2:1270 -1817:0:4365 -1818:3:2943 -1819:0:4365 -1820:2:1271 -1821:2:1275 -1822:2:1276 -1823:2:1284 -1824:2:1285 -1825:2:1289 -1826:2:1290 -1827:2:1284 -1828:2:1285 -1829:2:1289 -1830:2:1290 -1831:2:1298 -1832:2:1303 -1833:2:1307 -1834:2:1308 -1835:2:1315 -1836:2:1316 -1837:2:1327 -1838:2:1328 -1839:2:1329 -1840:2:1327 -1841:2:1328 -1842:2:1329 -1843:2:1340 -1844:2:1345 -1845:2:1346 -1846:0:4365 -1847:2:1358 -1848:0:4365 -1849:2:1454 -1850:0:4365 -1851:3:2942 -1852:0:4365 -1853:2:1455 -1854:0:4365 -1855:3:2943 -1856:0:4365 -1857:2:1652 -1858:0:4365 -1859:2:1653 -1860:0:4365 -1861:2:1657 -1862:0:4365 -1863:2:1660 -1864:0:4365 -1865:3:2942 -1866:0:4365 -1867:2:1665 -1868:2:1669 -1869:2:1670 -1870:2:1678 -1871:2:1679 -1872:2:1683 -1873:2:1684 -1874:2:1678 -1875:2:1679 -1876:2:1680 -1877:2:1692 -1878:2:1697 -1879:2:1701 -1880:2:1702 -1881:2:1709 -1882:2:1710 -1883:2:1721 -1884:2:1722 -1885:2:1723 -1886:2:1721 -1887:2:1722 -1888:2:1723 -1889:2:1734 -1890:2:1739 -1891:2:1740 -1892:0:4365 -1893:3:2943 -1894:0:4365 -1895:2:1752 -1896:0:4365 -1897:3:2942 -1898:0:4365 -1899:2:1754 -1900:0:4365 -1901:3:2943 -1902:0:4365 -1903:2:1755 -1904:2:1759 -1905:2:1760 -1906:2:1768 -1907:2:1769 -1908:2:1773 -1909:2:1774 -1910:2:1768 -1911:2:1769 -1912:2:1773 -1913:2:1774 -1914:2:1782 -1915:2:1787 -1916:2:1791 -1917:2:1792 -1918:2:1799 -1919:2:1800 -1920:2:1811 -1921:2:1812 -1922:2:1813 -1923:2:1811 -1924:2:1812 -1925:2:1813 -1926:2:1824 -1927:2:1829 -1928:2:1830 -1929:0:4365 -1930:2:1842 -1931:0:4365 -1932:3:2942 -1933:0:4365 -1934:2:1844 -1935:0:4365 -1936:3:2943 -1937:0:4365 -1938:2:1845 -1939:2:1849 -1940:2:1850 -1941:2:1858 -1942:2:1859 -1943:2:1863 -1944:2:1864 -1945:2:1858 -1946:2:1859 -1947:2:1863 -1948:2:1864 -1949:2:1872 -1950:2:1877 -1951:2:1881 -1952:2:1882 -1953:2:1889 -1954:2:1890 -1955:2:1901 -1956:2:1902 -1957:2:1903 -1958:2:1901 -1959:2:1902 -1960:2:1903 -1961:2:1914 -1962:2:1919 -1963:2:1920 -1964:0:4365 -1965:2:1932 -1966:0:4365 -1967:3:2942 -1968:0:4365 -1969:2:1934 -1970:0:4365 -1971:3:2943 -1972:0:4365 -1973:2:1935 -1974:0:4365 -1975:2:1936 -1976:0:4365 -1977:2:2129 -1978:0:4365 -1979:2:2130 -1980:0:4365 -1981:2:2134 -1982:0:4365 -1983:3:2942 -1984:0:4365 -1985:2:2136 -1986:0:4365 -1987:3:2943 -1988:0:4365 -1989:2:2137 -1990:2:2141 -1991:2:2142 -1992:2:2150 -1993:2:2151 -1994:2:2155 -1995:2:2156 -1996:2:2150 -1997:2:2151 -1998:2:2155 -1999:2:2156 -2000:2:2164 -2001:2:2169 -2002:2:2173 -2003:2:2174 -2004:2:2181 -2005:2:2182 -2006:2:2193 -2007:2:2194 -2008:2:2195 -2009:2:2193 -2010:2:2194 -2011:2:2195 -2012:2:2206 -2013:2:2211 -2014:2:2212 -2015:0:4365 -2016:2:2224 -2017:0:4365 -2018:3:2942 -2019:0:4365 -2020:2:2226 -2021:0:4365 -2022:3:2943 -2023:0:4365 -2024:2:1936 -2025:0:4365 -2026:2:2129 -2027:0:4365 -2028:2:2130 -2029:0:4365 -2030:2:2134 -2031:0:4365 -2032:3:2942 -2033:0:4365 -2034:2:2136 -2035:0:4365 -2036:3:2943 -2037:0:4365 -2038:2:2137 -2039:2:2141 -2040:2:2142 -2041:2:2150 -2042:2:2151 -2043:2:2155 -2044:2:2156 -2045:2:2150 -2046:2:2151 -2047:2:2152 -2048:2:2164 -2049:2:2169 -2050:2:2173 -2051:2:2174 -2052:2:2181 -2053:2:2182 -2054:2:2193 -2055:2:2194 -2056:2:2195 -2057:2:2193 -2058:2:2194 -2059:2:2195 -2060:2:2206 -2061:2:2211 -2062:2:2212 -2063:0:4365 -2064:2:2224 -2065:0:4365 -2066:3:2942 -2067:0:4365 -2068:2:2226 -2069:0:4365 -2070:3:2943 -2071:0:4365 -2072:2:2230 -2073:0:4365 -2074:3:2942 -2075:0:4365 -2076:2:2235 -2077:2:2239 -2078:2:2240 -2079:2:2248 -2080:2:2249 -2081:2:2253 -2082:2:2254 -2083:2:2248 -2084:2:2249 -2085:2:2250 -2086:2:2262 -2087:2:2267 -2088:2:2271 -2089:2:2272 -2090:2:2279 -2091:2:2280 -2092:2:2291 -2093:2:2292 -2094:2:2293 -2095:2:2291 -2096:2:2292 -2097:2:2293 -2098:2:2304 -2099:2:2309 -2100:2:2310 -2101:0:4365 -2102:3:2943 -2103:0:4365 -2104:2:2322 -2105:0:4365 -2106:2:1169 -2107:0:4365 -2108:3:2942 -2109:0:4365 -2110:2:1170 -2111:0:4365 -2112:3:2943 -2113:0:4365 -2114:3:2944 -2115:0:4365 -2116:3:2950 -2117:0:4365 -2118:3:2951 -2119:0:4365 -2120:3:2952 -2121:0:4365 -2122:3:2953 -2123:0:4365 -2124:3:2954 -2125:3:2958 -2126:3:2959 -2127:3:2967 -2128:3:2968 -2129:3:2972 -2130:3:2973 -2131:3:2967 -2132:3:2968 -2133:3:2972 -2134:3:2973 -2135:3:2981 -2136:3:2986 -2137:3:2990 -2138:3:2991 -2139:3:2998 -2140:3:2999 -2141:3:3010 -2142:3:3011 -2143:3:3012 -2144:3:3010 -2145:3:3011 -2146:3:3012 -2147:3:3023 -2148:3:3028 -2149:3:3029 -2150:0:4365 -2151:3:3041 -2152:0:4365 -2153:3:3042 -2154:0:4365 -2155:2:1173 -2156:0:4365 -2157:3:3043 -2158:0:4365 -2159:2:1179 -2160:0:4365 -2161:2:1180 -2162:0:4365 -2163:3:3042 -2164:0:4365 -2165:2:1181 -2166:2:1185 -2167:2:1186 -2168:2:1194 -2169:2:1195 -2170:2:1199 -2171:2:1200 -2172:2:1194 -2173:2:1195 -2174:2:1199 -2175:2:1200 -2176:2:1208 -2177:2:1213 -2178:2:1217 -2179:2:1218 -2180:2:1225 -2181:2:1226 -2182:2:1237 -2183:2:1238 -2184:2:1239 -2185:2:1237 -2186:2:1238 -2187:2:1239 -2188:2:1250 -2189:2:1255 -2190:2:1256 -2191:0:4365 -2192:3:3043 -2193:0:4365 -2194:2:1268 -2195:0:4365 -2196:3:3042 -2197:0:4365 -2198:2:1270 -2199:0:4365 -2200:3:3043 -2201:0:4365 -2202:2:1271 -2203:2:1275 -2204:2:1276 -2205:2:1284 -2206:2:1285 -2207:2:1289 -2208:2:1290 -2209:2:1284 -2210:2:1285 -2211:2:1289 -2212:2:1290 -2213:2:1298 -2214:2:1303 -2215:2:1307 -2216:2:1308 -2217:2:1315 -2218:2:1316 -2219:2:1327 -2220:2:1328 -2221:2:1329 -2222:2:1327 -2223:2:1328 -2224:2:1329 -2225:2:1340 -2226:2:1345 -2227:2:1346 -2228:0:4365 -2229:2:1358 -2230:0:4365 -2231:2:1360 -2232:0:4365 -2233:3:3042 -2234:0:4365 -2235:2:1361 -2236:0:4365 -2237:3:3043 -2238:0:4365 -2239:2:1362 -2240:2:1366 -2241:2:1367 -2242:2:1375 -2243:2:1376 -2244:2:1380 -2245:2:1381 -2246:2:1375 -2247:2:1376 -2248:2:1380 -2249:2:1381 -2250:2:1389 -2251:2:1394 -2252:2:1398 -2253:2:1399 -2254:2:1406 -2255:2:1407 -2256:2:1418 -2257:2:1419 -2258:2:1420 -2259:2:1418 -2260:2:1419 -2261:2:1420 -2262:2:1431 -2263:2:1436 -2264:2:1437 -2265:0:4365 -2266:2:1449 -2267:0:4365 -2268:3:3042 -2269:0:4365 -2270:2:1451 -2271:0:4365 -2272:3:3043 -2273:0:4365 -2274:2:1652 -2275:0:4365 -2276:2:1653 -2277:0:4365 -2278:2:1657 -2279:0:4365 -2280:2:1180 -2281:0:4365 -2282:3:3042 -2283:0:4365 -2284:2:1181 -2285:2:1185 -2286:2:1186 -2287:2:1194 -2288:2:1195 -2289:2:1199 -2290:2:1200 -2291:2:1194 -2292:2:1195 -2293:2:1196 -2294:2:1208 -2295:2:1213 -2296:2:1217 -2297:2:1218 -2298:2:1225 -2299:2:1226 -2300:2:1237 -2301:2:1238 -2302:2:1239 -2303:2:1237 -2304:2:1238 -2305:2:1239 -2306:2:1250 -2307:2:1255 -2308:2:1256 -2309:0:4365 -2310:3:3043 -2311:0:4365 -2312:2:1268 -2313:0:4365 -2314:3:3042 -2315:0:4365 -2316:2:1270 -2317:0:4365 -2318:3:3043 -2319:0:4365 -2320:2:1271 -2321:2:1275 -2322:2:1276 -2323:2:1284 -2324:2:1285 -2325:2:1289 -2326:2:1290 -2327:2:1284 -2328:2:1285 -2329:2:1289 -2330:2:1290 -2331:2:1298 -2332:2:1303 -2333:2:1307 -2334:2:1308 -2335:2:1315 -2336:2:1316 -2337:2:1327 -2338:2:1328 -2339:2:1329 -2340:2:1327 -2341:2:1328 -2342:2:1329 -2343:2:1340 -2344:2:1345 -2345:2:1346 -2346:0:4365 -2347:2:1358 -2348:0:4365 -2349:2:1454 -2350:0:4365 -2351:3:3042 -2352:0:4365 -2353:2:1455 -2354:0:4365 -2355:3:3043 -2356:0:4365 -2357:2:1652 -2358:0:4365 -2359:2:1653 -2360:0:4365 -2361:2:1657 -2362:0:4365 -2363:2:1660 -2364:0:4365 -2365:3:3042 -2366:0:4365 -2367:2:1665 -2368:2:1669 -2369:2:1670 -2370:2:1678 -2371:2:1679 -2372:2:1683 -2373:2:1684 -2374:2:1678 -2375:2:1679 -2376:2:1680 -2377:2:1692 -2378:2:1697 -2379:2:1701 -2380:2:1702 -2381:2:1709 -2382:2:1710 -2383:2:1721 -2384:2:1722 -2385:2:1723 -2386:2:1721 -2387:2:1722 -2388:2:1723 -2389:2:1734 -2390:2:1739 -2391:2:1740 -2392:0:4365 -2393:3:3043 -2394:0:4365 -2395:2:1752 -2396:0:4365 -2397:3:3042 -2398:0:4365 -2399:2:1754 -2400:0:4365 -2401:3:3043 -2402:0:4365 -2403:2:1755 -2404:2:1759 -2405:2:1760 -2406:2:1768 -2407:2:1769 -2408:2:1773 -2409:2:1774 -2410:2:1768 -2411:2:1769 -2412:2:1773 -2413:2:1774 -2414:2:1782 -2415:2:1787 -2416:2:1791 -2417:2:1792 -2418:2:1799 -2419:2:1800 -2420:2:1811 -2421:2:1812 -2422:2:1813 -2423:2:1811 -2424:2:1812 -2425:2:1813 -2426:2:1824 -2427:2:1829 -2428:2:1830 -2429:0:4365 -2430:2:1842 -2431:0:4365 -2432:3:3042 -2433:0:4365 -2434:2:1844 -2435:0:4365 -2436:3:3043 -2437:0:4365 -2438:2:1845 -2439:2:1849 -2440:2:1850 -2441:2:1858 -2442:2:1859 -2443:2:1863 -2444:2:1864 -2445:2:1858 -2446:2:1859 -2447:2:1863 -2448:2:1864 -2449:2:1872 -2450:2:1877 -2451:2:1881 -2452:2:1882 -2453:2:1889 -2454:2:1890 -2455:2:1901 -2456:2:1902 -2457:2:1903 -2458:2:1901 -2459:2:1902 -2460:2:1903 -2461:2:1914 -2462:2:1919 -2463:2:1920 -2464:0:4365 -2465:2:1932 -2466:0:4365 -2467:3:3042 -2468:0:4365 -2469:2:1934 -2470:0:4365 -2471:3:3043 -2472:0:4365 -2473:2:1935 -2474:0:4365 -2475:2:1936 -2476:0:4365 -2477:2:2129 -2478:0:4365 -2479:2:2130 -2480:0:4365 -2481:2:2134 -2482:0:4365 -2483:3:3042 -2484:0:4365 -2485:2:2136 -2486:0:4365 -2487:3:3043 -2488:0:4365 -2489:2:2137 -2490:2:2141 -2491:2:2142 -2492:2:2150 -2493:2:2151 -2494:2:2155 -2495:2:2156 -2496:2:2150 -2497:2:2151 -2498:2:2155 -2499:2:2156 -2500:2:2164 -2501:2:2169 -2502:2:2173 -2503:2:2174 -2504:2:2181 -2505:2:2182 -2506:2:2193 -2507:2:2194 -2508:2:2195 -2509:2:2193 -2510:2:2194 -2511:2:2195 -2512:2:2206 -2513:2:2211 -2514:2:2212 -2515:0:4365 -2516:2:2224 -2517:0:4365 -2518:3:3042 -2519:0:4365 -2520:2:2226 -2521:0:4365 -2522:3:3043 -2523:0:4365 -2524:2:1936 -2525:0:4365 -2526:2:2129 -2527:0:4365 -2528:2:2130 -2529:0:4365 -2530:2:2134 -2531:0:4365 -2532:3:3042 -2533:0:4365 -2534:2:2136 -2535:0:4365 -2536:3:3043 -2537:0:4365 -2538:2:2137 -2539:2:2141 -2540:2:2142 -2541:2:2150 -2542:2:2151 -2543:2:2155 -2544:2:2156 -2545:2:2150 -2546:2:2151 -2547:2:2152 -2548:2:2164 -2549:2:2169 -2550:2:2173 -2551:2:2174 -2552:2:2181 -2553:2:2182 -2554:2:2193 -2555:2:2194 -2556:2:2195 -2557:2:2193 -2558:2:2194 -2559:2:2195 -2560:2:2206 -2561:2:2211 -2562:2:2212 -2563:0:4365 -2564:2:2224 -2565:0:4365 -2566:3:3042 -2567:0:4365 -2568:2:2226 -2569:0:4365 -2570:3:3043 -2571:0:4365 -2572:2:2230 -2573:0:4365 -2574:3:3042 -2575:0:4365 -2576:2:2235 -2577:2:2239 -2578:2:2240 -2579:2:2248 -2580:2:2249 -2581:2:2253 -2582:2:2254 -2583:2:2248 -2584:2:2249 -2585:2:2250 -2586:2:2262 -2587:2:2267 -2588:2:2271 -2589:2:2272 -2590:2:2279 -2591:2:2280 -2592:2:2291 -2593:2:2292 -2594:2:2293 -2595:2:2291 -2596:2:2292 -2597:2:2293 -2598:2:2304 -2599:2:2309 -2600:2:2310 -2601:0:4365 -2602:3:3043 -2603:0:4365 -2604:2:2322 -2605:0:4365 -2606:2:1169 -2607:0:4365 -2608:3:3042 -2609:0:4365 -2610:2:1170 -2611:0:4365 -2612:3:3043 -2613:0:4365 -2614:3:3044 -2615:0:4365 -2616:3:3257 -2617:0:4365 -2618:3:3265 -2619:0:4365 -2620:3:3266 -2621:3:3270 -2622:3:3271 -2623:3:3279 -2624:3:3280 -2625:3:3284 -2626:3:3285 -2627:3:3279 -2628:3:3280 -2629:3:3284 -2630:3:3285 -2631:3:3293 -2632:3:3298 -2633:3:3302 -2634:3:3303 -2635:3:3310 -2636:3:3311 -2637:3:3322 -2638:3:3323 -2639:3:3324 -2640:3:3322 -2641:3:3323 -2642:3:3324 -2643:3:3335 -2644:3:3340 -2645:3:3341 -2646:0:4365 -2647:3:3353 -2648:0:4365 -2649:3:3354 -2650:0:4365 -2651:2:1173 -2652:0:4365 -2653:3:3355 -2654:0:4365 -2655:2:1179 -2656:0:4365 -2657:2:1180 -2658:0:4365 -2659:3:3354 -2660:0:4365 -2661:2:1181 -2662:2:1185 -2663:2:1186 -2664:2:1194 -2665:2:1195 -2666:2:1199 -2667:2:1200 -2668:2:1194 -2669:2:1195 -2670:2:1199 -2671:2:1200 -2672:2:1208 -2673:2:1213 -2674:2:1217 -2675:2:1218 -2676:2:1225 -2677:2:1226 -2678:2:1237 -2679:2:1238 -2680:2:1239 -2681:2:1237 -2682:2:1238 -2683:2:1239 -2684:2:1250 -2685:2:1255 -2686:2:1256 -2687:0:4365 -2688:3:3355 -2689:0:4365 -2690:2:1268 -2691:0:4365 -2692:3:3354 -2693:0:4365 -2694:2:1270 -2695:0:4365 -2696:3:3355 -2697:0:4365 -2698:2:1271 -2699:2:1275 -2700:2:1276 -2701:2:1284 -2702:2:1285 -2703:2:1289 -2704:2:1290 -2705:2:1284 -2706:2:1285 -2707:2:1289 -2708:2:1290 -2709:2:1298 -2710:2:1303 -2711:2:1307 -2712:2:1308 -2713:2:1315 -2714:2:1316 -2715:2:1327 -2716:2:1328 -2717:2:1329 -2718:2:1327 -2719:2:1328 -2720:2:1329 -2721:2:1340 -2722:2:1345 -2723:2:1346 -2724:0:4365 -2725:2:1358 -2726:0:4365 -2727:2:1360 -2728:0:4365 -2729:3:3354 -2730:0:4365 -2731:2:1361 -2732:0:4365 -2733:3:3355 -2734:0:4365 -2735:2:1362 -2736:2:1366 -2737:2:1367 -2738:2:1375 -2739:2:1376 -2740:2:1380 -2741:2:1381 -2742:2:1375 -2743:2:1376 -2744:2:1380 -2745:2:1381 -2746:2:1389 -2747:2:1394 -2748:2:1398 -2749:2:1399 -2750:2:1406 -2751:2:1407 -2752:2:1418 -2753:2:1419 -2754:2:1420 -2755:2:1418 -2756:2:1419 -2757:2:1420 -2758:2:1431 -2759:2:1436 -2760:2:1437 -2761:0:4365 -2762:2:1449 -2763:0:4365 -2764:3:3354 -2765:0:4365 -2766:2:1451 -2767:0:4365 -2768:3:3355 -2769:0:4365 -2770:2:1652 -2771:0:4365 -2772:2:1653 -2773:0:4365 -2774:2:1657 -2775:0:4365 -2776:2:1180 -2777:0:4365 -2778:3:3354 -2779:0:4365 -2780:2:1181 -2781:2:1185 -2782:2:1186 -2783:2:1194 -2784:2:1195 -2785:2:1199 -2786:2:1200 -2787:2:1194 -2788:2:1195 -2789:2:1196 -2790:2:1208 -2791:2:1213 -2792:2:1217 -2793:2:1218 -2794:2:1225 -2795:2:1226 -2796:2:1237 -2797:2:1238 -2798:2:1239 -2799:2:1237 -2800:2:1238 -2801:2:1239 -2802:2:1250 -2803:2:1255 -2804:2:1256 -2805:0:4365 -2806:3:3355 -2807:0:4365 -2808:2:1268 -2809:0:4365 -2810:3:3354 -2811:0:4365 -2812:2:1270 -2813:0:4365 -2814:3:3355 -2815:0:4365 -2816:2:1271 -2817:2:1275 -2818:2:1276 -2819:2:1284 -2820:2:1285 -2821:2:1289 -2822:2:1290 -2823:2:1284 -2824:2:1285 -2825:2:1289 -2826:2:1290 -2827:2:1298 -2828:2:1303 -2829:2:1307 -2830:2:1308 -2831:2:1315 -2832:2:1316 -2833:2:1327 -2834:2:1328 -2835:2:1329 -2836:2:1327 -2837:2:1328 -2838:2:1329 -2839:2:1340 -2840:2:1345 -2841:2:1346 -2842:0:4365 -2843:2:1358 -2844:0:4365 -2845:2:1454 -2846:0:4365 -2847:3:3354 -2848:0:4365 -2849:2:1455 -2850:0:4365 -2851:3:3355 -2852:0:4365 -2853:2:1652 -2854:0:4365 -2855:2:1653 -2856:0:4365 -2857:2:1657 -2858:0:4365 -2859:2:1660 -2860:0:4365 -2861:3:3354 -2862:0:4365 -2863:2:1665 -2864:2:1669 -2865:2:1670 -2866:2:1678 -2867:2:1679 -2868:2:1683 -2869:2:1684 -2870:2:1678 -2871:2:1679 -2872:2:1680 -2873:2:1692 -2874:2:1697 -2875:2:1701 -2876:2:1702 -2877:2:1709 -2878:2:1710 -2879:2:1721 -2880:2:1722 -2881:2:1723 -2882:2:1721 -2883:2:1722 -2884:2:1723 -2885:2:1734 -2886:2:1739 -2887:2:1740 -2888:0:4365 -2889:3:3355 -2890:0:4365 -2891:2:1752 -2892:0:4365 -2893:3:3354 -2894:0:4365 -2895:2:1754 -2896:0:4365 -2897:3:3355 -2898:0:4365 -2899:2:1755 -2900:2:1759 -2901:2:1760 -2902:2:1768 -2903:2:1769 -2904:2:1773 -2905:2:1774 -2906:2:1768 -2907:2:1769 -2908:2:1773 -2909:2:1774 -2910:2:1782 -2911:2:1787 -2912:2:1791 -2913:2:1792 -2914:2:1799 -2915:2:1800 -2916:2:1811 -2917:2:1812 -2918:2:1813 -2919:2:1811 -2920:2:1812 -2921:2:1813 -2922:2:1824 -2923:2:1829 -2924:2:1830 -2925:0:4365 -2926:2:1842 -2927:0:4365 -2928:3:3354 -2929:0:4365 -2930:2:1844 -2931:0:4365 -2932:3:3355 -2933:0:4365 -2934:2:1845 -2935:2:1849 -2936:2:1850 -2937:2:1858 -2938:2:1859 -2939:2:1863 -2940:2:1864 -2941:2:1858 -2942:2:1859 -2943:2:1863 -2944:2:1864 -2945:2:1872 -2946:2:1877 -2947:2:1881 -2948:2:1882 -2949:2:1889 -2950:2:1890 -2951:2:1901 -2952:2:1902 -2953:2:1903 -2954:2:1901 -2955:2:1902 -2956:2:1903 -2957:2:1914 -2958:2:1919 -2959:2:1920 -2960:0:4365 -2961:2:1932 -2962:0:4365 -2963:3:3354 -2964:0:4365 -2965:2:1934 -2966:0:4365 -2967:3:3355 -2968:0:4365 -2969:2:1935 -2970:0:4365 -2971:2:1936 -2972:0:4365 -2973:2:2129 -2974:0:4365 -2975:2:2130 -2976:0:4365 -2977:2:2134 -2978:0:4365 -2979:3:3354 -2980:0:4365 -2981:2:2136 -2982:0:4365 -2983:3:3355 -2984:0:4365 -2985:2:2137 -2986:2:2141 -2987:2:2142 -2988:2:2150 -2989:2:2151 -2990:2:2155 -2991:2:2156 -2992:2:2150 -2993:2:2151 -2994:2:2155 -2995:2:2156 -2996:2:2164 -2997:2:2169 -2998:2:2173 -2999:2:2174 -3000:2:2181 -3001:2:2182 -3002:2:2193 -3003:2:2194 -3004:2:2195 -3005:2:2193 -3006:2:2194 -3007:2:2195 -3008:2:2206 -3009:2:2211 -3010:2:2212 -3011:0:4365 -3012:2:2224 -3013:0:4365 -3014:3:3354 -3015:0:4365 -3016:2:2226 -3017:0:4365 -3018:3:3355 -3019:0:4365 -3020:2:1936 -3021:0:4365 -3022:2:2129 -3023:0:4365 -3024:2:2130 -3025:0:4365 -3026:2:2134 -3027:0:4365 -3028:3:3354 -3029:0:4365 -3030:2:2136 -3031:0:4365 -3032:3:3355 -3033:0:4365 -3034:2:2137 -3035:2:2141 -3036:2:2142 -3037:2:2150 -3038:2:2151 -3039:2:2155 -3040:2:2156 -3041:2:2150 -3042:2:2151 -3043:2:2152 -3044:2:2164 -3045:2:2169 -3046:2:2173 -3047:2:2174 -3048:2:2181 -3049:2:2182 -3050:2:2193 -3051:2:2194 -3052:2:2195 -3053:2:2193 -3054:2:2194 -3055:2:2195 -3056:2:2206 -3057:2:2211 -3058:2:2212 -3059:0:4365 -3060:2:2224 -3061:0:4365 -3062:3:3354 -3063:0:4365 -3064:2:2226 -3065:0:4365 -3066:3:3355 -3067:0:4365 -3068:2:2230 -3069:0:4365 -3070:3:3354 -3071:0:4365 -3072:2:2235 -3073:2:2239 -3074:2:2240 -3075:2:2248 -3076:2:2249 -3077:2:2253 -3078:2:2254 -3079:2:2248 -3080:2:2249 -3081:2:2250 -3082:2:2262 -3083:2:2267 -3084:2:2271 -3085:2:2272 -3086:2:2279 -3087:2:2280 -3088:2:2291 -3089:2:2292 -3090:2:2293 -3091:2:2291 -3092:2:2292 -3093:2:2293 -3094:2:2304 -3095:2:2309 -3096:2:2310 -3097:0:4365 -3098:3:3355 -3099:0:4365 -3100:2:2322 -3101:0:4365 -3102:2:1169 -3103:0:4365 -3104:3:3354 -3105:0:4365 -3106:2:1170 -3107:0:4365 -3108:3:3355 -3109:0:4365 -3110:3:3356 -3111:0:4365 -3112:3:3366 -3113:0:4365 -3114:3:2951 -3115:0:4365 -3116:3:2952 -3117:0:4365 -3118:3:2953 -3119:0:4365 -3120:3:2954 -3121:3:2958 -3122:3:2959 -3123:3:2967 -3124:3:2968 -3125:3:2972 -3126:3:2973 -3127:3:2967 -3128:3:2968 -3129:3:2972 -3130:3:2973 -3131:3:2981 -3132:3:2986 -3133:3:2990 -3134:3:2991 -3135:3:2998 -3136:3:2999 -3137:3:3010 -3138:3:3011 -3139:3:3012 -3140:3:3010 -3141:3:3011 -3142:3:3012 -3143:3:3023 -3144:3:3028 -3145:3:3029 -3146:0:4365 -3147:3:3041 -3148:0:4365 -3149:3:3042 -3150:0:4365 -3151:2:1173 -3152:0:4365 -3153:3:3043 -3154:0:4365 -3155:2:1179 -3156:0:4365 -3157:2:1180 -3158:0:4365 -3159:3:3042 -3160:0:4365 -3161:2:1181 -3162:2:1185 -3163:2:1186 -3164:2:1194 -3165:2:1195 -3166:2:1199 -3167:2:1200 -3168:2:1194 -3169:2:1195 -3170:2:1199 -3171:2:1200 -3172:2:1208 -3173:2:1213 -3174:2:1217 -3175:2:1218 -3176:2:1225 -3177:2:1226 -3178:2:1237 -3179:2:1238 -3180:2:1239 -3181:2:1237 -3182:2:1238 -3183:2:1239 -3184:2:1250 -3185:2:1255 -3186:2:1256 -3187:0:4365 -3188:3:3043 -3189:0:4365 -3190:2:1268 -3191:0:4365 -3192:3:3042 -3193:0:4365 -3194:2:1270 -3195:0:4365 -3196:3:3043 -3197:0:4365 -3198:2:1271 -3199:2:1275 -3200:2:1276 -3201:2:1284 -3202:2:1285 -3203:2:1289 -3204:2:1290 -3205:2:1284 -3206:2:1285 -3207:2:1289 -3208:2:1290 -3209:2:1298 -3210:2:1303 -3211:2:1307 -3212:2:1308 -3213:2:1315 -3214:2:1316 -3215:2:1327 -3216:2:1328 -3217:2:1329 -3218:2:1327 -3219:2:1328 -3220:2:1329 -3221:2:1340 -3222:2:1345 -3223:2:1346 -3224:0:4365 -3225:2:1358 -3226:0:4365 -3227:2:1360 -3228:0:4365 -3229:3:3042 -3230:0:4365 -3231:2:1361 -3232:0:4365 -3233:3:3043 -3234:0:4365 -3235:2:1362 -3236:2:1366 -3237:2:1367 -3238:2:1375 -3239:2:1376 -3240:2:1380 -3241:2:1381 -3242:2:1375 -3243:2:1376 -3244:2:1380 -3245:2:1381 -3246:2:1389 -3247:2:1394 -3248:2:1398 -3249:2:1399 -3250:2:1406 -3251:2:1407 -3252:2:1418 -3253:2:1419 -3254:2:1420 -3255:2:1418 -3256:2:1419 -3257:2:1420 -3258:2:1431 -3259:2:1436 -3260:2:1437 -3261:0:4365 -3262:2:1449 -3263:0:4365 -3264:3:3042 -3265:0:4365 -3266:2:1451 -3267:0:4365 -3268:3:3043 -3269:0:4365 -3270:2:1652 -3271:0:4365 -3272:2:1653 -3273:0:4365 -3274:2:1657 -3275:0:4365 -3276:2:1180 -3277:0:4365 -3278:3:3042 -3279:0:4365 -3280:2:1181 -3281:2:1185 -3282:2:1186 -3283:2:1194 -3284:2:1195 -3285:2:1199 -3286:2:1200 -3287:2:1194 -3288:2:1195 -3289:2:1196 -3290:2:1208 -3291:2:1213 -3292:2:1217 -3293:2:1218 -3294:2:1225 -3295:2:1226 -3296:2:1237 -3297:2:1238 -3298:2:1239 -3299:2:1237 -3300:2:1238 -3301:2:1239 -3302:2:1250 -3303:2:1255 -3304:2:1256 -3305:0:4365 -3306:3:3043 -3307:0:4365 -3308:2:1268 -3309:0:4365 -3310:3:3042 -3311:0:4365 -3312:2:1270 -3313:0:4365 -3314:3:3043 -3315:0:4365 -3316:2:1271 -3317:2:1275 -3318:2:1276 -3319:2:1284 -3320:2:1285 -3321:2:1289 -3322:2:1290 -3323:2:1284 -3324:2:1285 -3325:2:1289 -3326:2:1290 -3327:2:1298 -3328:2:1303 -3329:2:1307 -3330:2:1308 -3331:2:1315 -3332:2:1316 -3333:2:1327 -3334:2:1328 -3335:2:1329 -3336:2:1327 -3337:2:1328 -3338:2:1329 -3339:2:1340 -3340:2:1345 -3341:2:1346 -3342:0:4365 -3343:2:1358 -3344:0:4365 -3345:2:1454 -3346:0:4365 -3347:3:3042 -3348:0:4365 -3349:2:1455 -3350:0:4365 -3351:3:3043 -3352:0:4365 -3353:2:1652 -3354:0:4365 -3355:2:1653 -3356:0:4365 -3357:2:1657 -3358:0:4365 -3359:2:1660 -3360:0:4365 -3361:3:3042 -3362:0:4365 -3363:2:1665 -3364:2:1669 -3365:2:1670 -3366:2:1678 -3367:2:1679 -3368:2:1683 -3369:2:1684 -3370:2:1678 -3371:2:1679 -3372:2:1680 -3373:2:1692 -3374:2:1697 -3375:2:1701 -3376:2:1702 -3377:2:1709 -3378:2:1710 -3379:2:1721 -3380:2:1722 -3381:2:1723 -3382:2:1721 -3383:2:1722 -3384:2:1723 -3385:2:1734 -3386:2:1739 -3387:2:1740 -3388:0:4365 -3389:3:3043 -3390:0:4365 -3391:2:1752 -3392:0:4365 -3393:3:3042 -3394:0:4365 -3395:2:1754 -3396:0:4365 -3397:3:3043 -3398:0:4365 -3399:2:1755 -3400:2:1759 -3401:2:1760 -3402:2:1768 -3403:2:1769 -3404:2:1773 -3405:2:1774 -3406:2:1768 -3407:2:1769 -3408:2:1773 -3409:2:1774 -3410:2:1782 -3411:2:1787 -3412:2:1791 -3413:2:1792 -3414:2:1799 -3415:2:1800 -3416:2:1811 -3417:2:1812 -3418:2:1813 -3419:2:1811 -3420:2:1812 -3421:2:1813 -3422:2:1824 -3423:2:1829 -3424:2:1830 -3425:0:4365 -3426:2:1842 -3427:0:4365 -3428:3:3042 -3429:0:4365 -3430:2:1844 -3431:0:4365 -3432:3:3043 -3433:0:4365 -3434:2:1845 -3435:2:1849 -3436:2:1850 -3437:2:1858 -3438:2:1859 -3439:2:1863 -3440:2:1864 -3441:2:1858 -3442:2:1859 -3443:2:1863 -3444:2:1864 -3445:2:1872 -3446:2:1877 -3447:2:1881 -3448:2:1882 -3449:2:1889 -3450:2:1890 -3451:2:1901 -3452:2:1902 -3453:2:1903 -3454:2:1901 -3455:2:1902 -3456:2:1903 -3457:2:1914 -3458:2:1919 -3459:2:1920 -3460:0:4365 -3461:2:1932 -3462:0:4365 -3463:3:3042 -3464:0:4365 -3465:2:1934 -3466:0:4365 -3467:3:3043 -3468:0:4365 -3469:2:1935 -3470:0:4365 -3471:2:1936 -3472:0:4365 -3473:2:2129 -3474:0:4365 -3475:2:2130 -3476:0:4365 -3477:2:2134 -3478:0:4365 -3479:3:3042 -3480:0:4365 -3481:2:2136 -3482:0:4365 -3483:3:3043 -3484:0:4365 -3485:2:2137 -3486:2:2141 -3487:2:2142 -3488:2:2150 -3489:2:2151 -3490:2:2155 -3491:2:2156 -3492:2:2150 -3493:2:2151 -3494:2:2155 -3495:2:2156 -3496:2:2164 -3497:2:2169 -3498:2:2173 -3499:2:2174 -3500:2:2181 -3501:2:2182 -3502:2:2193 -3503:2:2194 -3504:2:2195 -3505:2:2193 -3506:2:2194 -3507:2:2195 -3508:2:2206 -3509:2:2211 -3510:2:2212 -3511:0:4365 -3512:2:2224 -3513:0:4365 -3514:3:3042 -3515:0:4365 -3516:2:2226 -3517:0:4365 -3518:3:3043 -3519:0:4365 -3520:2:1936 -3521:0:4365 -3522:2:2129 -3523:0:4365 -3524:2:2130 -3525:0:4365 -3526:2:2134 -3527:0:4365 -3528:3:3042 -3529:0:4365 -3530:2:2136 -3531:0:4365 -3532:3:3043 -3533:0:4365 -3534:2:2137 -3535:2:2141 -3536:2:2142 -3537:2:2150 -3538:2:2151 -3539:2:2155 -3540:2:2156 -3541:2:2150 -3542:2:2151 -3543:2:2152 -3544:2:2164 -3545:2:2169 -3546:2:2173 -3547:2:2174 -3548:2:2181 -3549:2:2182 -3550:2:2193 -3551:2:2194 -3552:2:2195 -3553:2:2193 -3554:2:2194 -3555:2:2195 -3556:2:2206 -3557:2:2211 -3558:2:2212 -3559:0:4365 -3560:2:2224 -3561:0:4365 -3562:3:3042 -3563:0:4365 -3564:2:2226 -3565:0:4365 -3566:3:3043 -3567:0:4365 -3568:2:2230 -3569:0:4365 -3570:3:3042 -3571:0:4365 -3572:2:2235 -3573:2:2239 -3574:2:2240 -3575:2:2248 -3576:2:2249 -3577:2:2253 -3578:2:2254 -3579:2:2248 -3580:2:2249 -3581:2:2250 -3582:2:2262 -3583:2:2267 -3584:2:2271 -3585:2:2272 -3586:2:2279 -3587:2:2280 -3588:2:2291 -3589:2:2292 -3590:2:2293 -3591:2:2291 -3592:2:2292 -3593:2:2293 -3594:2:2304 -3595:2:2309 -3596:2:2310 -3597:0:4365 -3598:3:3043 -3599:0:4365 -3600:2:2322 -3601:0:4365 -3602:2:1169 -3603:0:4365 -3604:3:3042 -3605:0:4365 -3606:2:1170 -3607:0:4365 -3608:3:3043 -3609:0:4365 -3610:3:3044 -3611:0:4365 -3612:3:3257 -3613:0:4365 -3614:3:3362 -3615:0:4365 -3616:3:3363 -3617:0:4365 -3618:3:3367 -3619:0:4365 -3620:3:3373 -3621:3:3377 -3622:3:3378 -3623:3:3386 -3624:3:3387 -3625:3:3391 -3626:3:3392 -3627:3:3386 -3628:3:3387 -3629:3:3391 -3630:3:3392 -3631:3:3400 -3632:3:3405 -3633:3:3409 -3634:3:3410 -3635:3:3417 -3636:3:3418 -3637:3:3429 -3638:3:3430 -3639:3:3431 -3640:3:3429 -3641:3:3430 -3642:3:3431 -3643:3:3442 -3644:3:3447 -3645:3:3448 -3646:0:4365 -3647:3:3460 -3648:0:4365 -3649:3:3461 -3650:0:4365 -3651:2:1173 -3652:0:4365 -3653:3:3462 -3654:0:4365 -3655:2:1179 -3656:0:4365 -3657:2:1180 -3658:0:4365 -3659:3:3461 -3660:0:4365 -3661:2:1181 -3662:2:1185 -3663:2:1186 -3664:2:1194 -3665:2:1195 -3666:2:1199 -3667:2:1200 -3668:2:1194 -3669:2:1195 -3670:2:1199 -3671:2:1200 -3672:2:1208 -3673:2:1213 -3674:2:1217 -3675:2:1218 -3676:2:1225 -3677:2:1226 -3678:2:1237 -3679:2:1238 -3680:2:1239 -3681:2:1237 -3682:2:1238 -3683:2:1239 -3684:2:1250 -3685:2:1255 -3686:2:1256 -3687:0:4365 -3688:3:3462 -3689:0:4365 -3690:2:1268 -3691:0:4365 -3692:3:3461 -3693:0:4365 -3694:2:1270 -3695:0:4365 -3696:3:3462 -3697:0:4365 -3698:2:1271 -3699:2:1275 -3700:2:1276 -3701:2:1284 -3702:2:1285 -3703:2:1289 -3704:2:1290 -3705:2:1284 -3706:2:1285 -3707:2:1289 -3708:2:1290 -3709:2:1298 -3710:2:1303 -3711:2:1307 -3712:2:1308 -3713:2:1315 -3714:2:1316 -3715:2:1327 -3716:2:1328 -3717:2:1329 -3718:2:1327 -3719:2:1328 -3720:2:1329 -3721:2:1340 -3722:2:1345 -3723:2:1346 -3724:0:4365 -3725:2:1358 -3726:0:4365 -3727:2:1360 -3728:0:4365 -3729:3:3461 -3730:0:4365 -3731:2:1361 -3732:0:4365 -3733:3:3462 -3734:0:4365 -3735:2:1362 -3736:2:1366 -3737:2:1367 -3738:2:1375 -3739:2:1376 -3740:2:1380 -3741:2:1381 -3742:2:1375 -3743:2:1376 -3744:2:1380 -3745:2:1381 -3746:2:1389 -3747:2:1394 -3748:2:1398 -3749:2:1399 -3750:2:1406 -3751:2:1407 -3752:2:1418 -3753:2:1419 -3754:2:1420 -3755:2:1418 -3756:2:1419 -3757:2:1420 -3758:2:1431 -3759:2:1436 -3760:2:1437 -3761:0:4365 -3762:2:1449 -3763:0:4365 -3764:3:3461 -3765:0:4365 -3766:2:1451 -3767:0:4365 -3768:3:3462 -3769:0:4365 -3770:2:1652 -3771:0:4365 -3772:2:1653 -3773:0:4365 -3774:2:1657 -3775:0:4365 -3776:2:1180 -3777:0:4365 -3778:3:3461 -3779:0:4365 -3780:2:1181 -3781:2:1185 -3782:2:1186 -3783:2:1194 -3784:2:1195 -3785:2:1199 -3786:2:1200 -3787:2:1194 -3788:2:1195 -3789:2:1196 -3790:2:1208 -3791:2:1213 -3792:2:1217 -3793:2:1218 -3794:2:1225 -3795:2:1226 -3796:2:1237 -3797:2:1238 -3798:2:1239 -3799:2:1237 -3800:2:1238 -3801:2:1239 -3802:2:1250 -3803:2:1255 -3804:2:1256 -3805:0:4365 -3806:3:3462 -3807:0:4365 -3808:2:1268 -3809:0:4365 -3810:3:3461 -3811:0:4365 -3812:2:1270 -3813:0:4365 -3814:3:3462 -3815:0:4365 -3816:2:1271 -3817:2:1275 -3818:2:1276 -3819:2:1284 -3820:2:1285 -3821:2:1289 -3822:2:1290 -3823:2:1284 -3824:2:1285 -3825:2:1289 -3826:2:1290 -3827:2:1298 -3828:2:1303 -3829:2:1307 -3830:2:1308 -3831:2:1315 -3832:2:1316 -3833:2:1327 -3834:2:1328 -3835:2:1329 -3836:2:1327 -3837:2:1328 -3838:2:1329 -3839:2:1340 -3840:2:1345 -3841:2:1346 -3842:0:4365 -3843:2:1358 -3844:0:4365 -3845:2:1454 -3846:0:4365 -3847:3:3461 -3848:0:4365 -3849:2:1455 -3850:0:4365 -3851:3:3462 -3852:0:4365 -3853:2:1652 -3854:0:4365 -3855:2:1653 -3856:0:4365 -3857:2:1657 -3858:0:4365 -3859:2:1660 -3860:0:4365 -3861:3:3461 -3862:0:4365 -3863:2:1665 -3864:2:1669 -3865:2:1670 -3866:2:1678 -3867:2:1679 -3868:2:1683 -3869:2:1684 -3870:2:1678 -3871:2:1679 -3872:2:1680 -3873:2:1692 -3874:2:1697 -3875:2:1701 -3876:2:1702 -3877:2:1709 -3878:2:1710 -3879:2:1721 -3880:2:1722 -3881:2:1723 -3882:2:1721 -3883:2:1722 -3884:2:1723 -3885:2:1734 -3886:2:1739 -3887:2:1740 -3888:0:4365 -3889:3:3462 -3890:0:4365 -3891:2:1752 -3892:0:4365 -3893:3:3461 -3894:0:4365 -3895:2:1754 -3896:0:4365 -3897:3:3462 -3898:0:4365 -3899:2:1755 -3900:2:1759 -3901:2:1760 -3902:2:1768 -3903:2:1769 -3904:2:1773 -3905:2:1774 -3906:2:1768 -3907:2:1769 -3908:2:1773 -3909:2:1774 -3910:2:1782 -3911:2:1787 -3912:2:1791 -3913:2:1792 -3914:2:1799 -3915:2:1800 -3916:2:1811 -3917:2:1812 -3918:2:1813 -3919:2:1811 -3920:2:1812 -3921:2:1813 -3922:2:1824 -3923:2:1829 -3924:2:1830 -3925:0:4365 -3926:2:1842 -3927:0:4365 -3928:3:3461 -3929:0:4365 -3930:2:1844 -3931:0:4365 -3932:3:3462 -3933:0:4365 -3934:2:1845 -3935:2:1849 -3936:2:1850 -3937:2:1858 -3938:2:1859 -3939:2:1863 -3940:2:1864 -3941:2:1858 -3942:2:1859 -3943:2:1863 -3944:2:1864 -3945:2:1872 -3946:2:1877 -3947:2:1881 -3948:2:1882 -3949:2:1889 -3950:2:1890 -3951:2:1901 -3952:2:1902 -3953:2:1903 -3954:2:1901 -3955:2:1902 -3956:2:1903 -3957:2:1914 -3958:2:1919 -3959:2:1920 -3960:0:4365 -3961:2:1932 -3962:0:4365 -3963:3:3461 -3964:0:4365 -3965:2:1934 -3966:0:4365 -3967:3:3462 -3968:0:4365 -3969:2:1935 -3970:0:4365 -3971:2:1936 -3972:0:4365 -3973:2:2129 -3974:0:4365 -3975:2:2130 -3976:0:4365 -3977:2:2134 -3978:0:4365 -3979:3:3461 -3980:0:4365 -3981:2:2136 -3982:0:4365 -3983:3:3462 -3984:0:4365 -3985:2:2137 -3986:2:2141 -3987:2:2142 -3988:2:2150 -3989:2:2151 -3990:2:2155 -3991:2:2156 -3992:2:2150 -3993:2:2151 -3994:2:2155 -3995:2:2156 -3996:2:2164 -3997:2:2169 -3998:2:2173 -3999:2:2174 -4000:2:2181 -4001:2:2182 -4002:2:2193 -4003:2:2194 -4004:2:2195 -4005:2:2193 -4006:2:2194 -4007:2:2195 -4008:2:2206 -4009:2:2211 -4010:2:2212 -4011:0:4365 -4012:2:2224 -4013:0:4365 -4014:3:3461 -4015:0:4365 -4016:2:2226 -4017:0:4365 -4018:3:3462 -4019:0:4365 -4020:2:1936 -4021:0:4365 -4022:2:2129 -4023:0:4365 -4024:2:2130 -4025:0:4365 -4026:2:2134 -4027:0:4365 -4028:3:3461 -4029:0:4365 -4030:2:2136 -4031:0:4365 -4032:3:3462 -4033:0:4365 -4034:2:2137 -4035:2:2141 -4036:2:2142 -4037:2:2150 -4038:2:2151 -4039:2:2155 -4040:2:2156 -4041:2:2150 -4042:2:2151 -4043:2:2152 -4044:2:2164 -4045:2:2169 -4046:2:2173 -4047:2:2174 -4048:2:2181 -4049:2:2182 -4050:2:2193 -4051:2:2194 -4052:2:2195 -4053:2:2193 -4054:2:2194 -4055:2:2195 -4056:2:2206 -4057:2:2211 -4058:2:2212 -4059:0:4365 -4060:2:2224 -4061:0:4365 -4062:3:3461 -4063:0:4365 -4064:2:2226 -4065:0:4365 -4066:3:3462 -4067:0:4365 -4068:2:2230 -4069:0:4365 -4070:3:3461 -4071:0:4365 -4072:2:2235 -4073:2:2239 -4074:2:2240 -4075:2:2248 -4076:2:2249 -4077:2:2253 -4078:2:2254 -4079:2:2248 -4080:2:2249 -4081:2:2250 -4082:2:2262 -4083:2:2267 -4084:2:2271 -4085:2:2272 -4086:2:2279 -4087:2:2280 -4088:2:2291 -4089:2:2292 -4090:2:2293 -4091:2:2291 -4092:2:2292 -4093:2:2293 -4094:2:2304 -4095:2:2309 -4096:2:2310 -4097:0:4365 -4098:3:3462 -4099:0:4365 -4100:2:2322 -4101:0:4365 -4102:2:1169 -4103:0:4365 -4104:3:3461 -4105:0:4365 -4106:2:1170 -4107:0:4365 -4108:3:3462 -4109:0:4365 -4110:3:3463 -4111:0:4365 -4112:3:3469 -4113:0:4365 -4114:3:3470 -4115:3:3474 -4116:3:3475 -4117:3:3483 -4118:3:3484 -4119:3:3488 -4120:3:3489 -4121:3:3483 -4122:3:3484 -4123:3:3488 -4124:3:3489 -4125:3:3497 -4126:3:3502 -4127:3:3506 -4128:3:3507 -4129:3:3514 -4130:3:3515 -4131:3:3526 -4132:3:3527 -4133:3:3528 -4134:3:3526 -4135:3:3527 -4136:3:3528 -4137:3:3539 -4138:3:3544 -4139:3:3545 -4140:0:4365 -4141:3:3557 -4142:0:4365 -4143:3:3558 -4144:0:4365 -4145:2:1173 -4146:0:4365 -4147:3:3559 -4148:0:4365 -4149:2:1179 -4150:0:4365 -4151:2:1180 -4152:0:4365 -4153:3:3558 -4154:0:4365 -4155:2:1181 -4156:2:1185 -4157:2:1186 -4158:2:1194 -4159:2:1195 -4160:2:1199 -4161:2:1200 -4162:2:1194 -4163:2:1195 -4164:2:1199 -4165:2:1200 -4166:2:1208 -4167:2:1213 -4168:2:1217 -4169:2:1218 -4170:2:1225 -4171:2:1226 -4172:2:1237 -4173:2:1238 -4174:2:1239 -4175:2:1237 -4176:2:1238 -4177:2:1239 -4178:2:1250 -4179:2:1255 -4180:2:1256 -4181:0:4365 -4182:3:3559 -4183:0:4365 -4184:2:1268 -4185:0:4365 -4186:3:3558 -4187:0:4365 -4188:2:1270 -4189:0:4365 -4190:3:3559 -4191:0:4365 -4192:2:1271 -4193:2:1275 -4194:2:1276 -4195:2:1284 -4196:2:1285 -4197:2:1289 -4198:2:1290 -4199:2:1284 -4200:2:1285 -4201:2:1289 -4202:2:1290 -4203:2:1298 -4204:2:1303 -4205:2:1307 -4206:2:1308 -4207:2:1315 -4208:2:1316 -4209:2:1327 -4210:2:1328 -4211:2:1329 -4212:2:1327 -4213:2:1328 -4214:2:1329 -4215:2:1340 -4216:2:1345 -4217:2:1346 -4218:0:4365 -4219:2:1358 -4220:0:4365 -4221:2:1360 -4222:0:4365 -4223:3:3558 -4224:0:4365 -4225:2:1361 -4226:0:4365 -4227:3:3559 -4228:0:4365 -4229:2:1362 -4230:2:1366 -4231:2:1367 -4232:2:1375 -4233:2:1376 -4234:2:1380 -4235:2:1381 -4236:2:1375 -4237:2:1376 -4238:2:1380 -4239:2:1381 -4240:2:1389 -4241:2:1394 -4242:2:1398 -4243:2:1399 -4244:2:1406 -4245:2:1407 -4246:2:1418 -4247:2:1419 -4248:2:1420 -4249:2:1418 -4250:2:1419 -4251:2:1420 -4252:2:1431 -4253:2:1436 -4254:2:1437 -4255:0:4365 -4256:2:1449 -4257:0:4365 -4258:3:3558 -4259:0:4365 -4260:2:1451 -4261:0:4365 -4262:3:3559 -4263:0:4365 -4264:2:1652 -4265:0:4365 -4266:2:1653 -4267:0:4365 -4268:2:1657 -4269:0:4365 -4270:2:1180 -4271:0:4365 -4272:3:3558 -4273:0:4365 -4274:2:1181 -4275:2:1185 -4276:2:1186 -4277:2:1194 -4278:2:1195 -4279:2:1199 -4280:2:1200 -4281:2:1194 -4282:2:1195 -4283:2:1196 -4284:2:1208 -4285:2:1213 -4286:2:1217 -4287:2:1218 -4288:2:1225 -4289:2:1226 -4290:2:1237 -4291:2:1238 -4292:2:1239 -4293:2:1237 -4294:2:1238 -4295:2:1239 -4296:2:1250 -4297:2:1255 -4298:2:1256 -4299:0:4365 -4300:3:3559 -4301:0:4365 -4302:2:1268 -4303:0:4365 -4304:3:3558 -4305:0:4365 -4306:2:1270 -4307:0:4365 -4308:3:3559 -4309:0:4365 -4310:2:1271 -4311:2:1275 -4312:2:1276 -4313:2:1284 -4314:2:1285 -4315:2:1289 -4316:2:1290 -4317:2:1284 -4318:2:1285 -4319:2:1289 -4320:2:1290 -4321:2:1298 -4322:2:1303 -4323:2:1307 -4324:2:1308 -4325:2:1315 -4326:2:1316 -4327:2:1327 -4328:2:1328 -4329:2:1329 -4330:2:1327 -4331:2:1328 -4332:2:1329 -4333:2:1340 -4334:2:1345 -4335:2:1346 -4336:0:4365 -4337:2:1358 -4338:0:4365 -4339:2:1454 -4340:0:4365 -4341:3:3558 -4342:0:4365 -4343:2:1455 -4344:0:4365 -4345:3:3559 -4346:0:4365 -4347:2:1652 -4348:0:4365 -4349:2:1653 -4350:0:4365 -4351:2:1657 -4352:0:4365 -4353:2:1660 -4354:0:4365 -4355:3:3558 -4356:0:4365 -4357:2:1665 -4358:2:1669 -4359:2:1670 -4360:2:1678 -4361:2:1679 -4362:2:1683 -4363:2:1684 -4364:2:1678 -4365:2:1679 -4366:2:1680 -4367:2:1692 -4368:2:1697 -4369:2:1701 -4370:2:1702 -4371:2:1709 -4372:2:1710 -4373:2:1721 -4374:2:1722 -4375:2:1723 -4376:2:1721 -4377:2:1722 -4378:2:1723 -4379:2:1734 -4380:2:1739 -4381:2:1740 -4382:0:4365 -4383:3:3559 -4384:0:4365 -4385:2:1752 -4386:0:4365 -4387:3:3558 -4388:0:4365 -4389:2:1754 -4390:0:4365 -4391:3:3559 -4392:0:4365 -4393:2:1755 -4394:2:1759 -4395:2:1760 -4396:2:1768 -4397:2:1769 -4398:2:1773 -4399:2:1774 -4400:2:1768 -4401:2:1769 -4402:2:1773 -4403:2:1774 -4404:2:1782 -4405:2:1787 -4406:2:1791 -4407:2:1792 -4408:2:1799 -4409:2:1800 -4410:2:1811 -4411:2:1812 -4412:2:1813 -4413:2:1811 -4414:2:1812 -4415:2:1813 -4416:2:1824 -4417:2:1829 -4418:2:1830 -4419:0:4365 -4420:2:1842 -4421:0:4365 -4422:3:3558 -4423:0:4365 -4424:2:1844 -4425:0:4365 -4426:3:3559 -4427:0:4365 -4428:2:1845 -4429:2:1849 -4430:2:1850 -4431:2:1858 -4432:2:1859 -4433:2:1863 -4434:2:1864 -4435:2:1858 -4436:2:1859 -4437:2:1863 -4438:2:1864 -4439:2:1872 -4440:2:1877 -4441:2:1881 -4442:2:1882 -4443:2:1889 -4444:2:1890 -4445:2:1901 -4446:2:1902 -4447:2:1903 -4448:2:1901 -4449:2:1902 -4450:2:1903 -4451:2:1914 -4452:2:1919 -4453:2:1920 -4454:0:4365 -4455:2:1932 -4456:0:4365 -4457:3:3558 -4458:0:4365 -4459:2:1934 -4460:0:4365 -4461:3:3559 -4462:0:4365 -4463:2:1935 -4464:0:4365 -4465:2:1936 -4466:0:4365 -4467:2:2129 -4468:0:4365 -4469:2:2130 -4470:0:4365 -4471:2:2134 -4472:0:4365 -4473:3:3558 -4474:0:4365 -4475:2:2136 -4476:0:4365 -4477:3:3559 -4478:0:4365 -4479:2:2137 -4480:2:2141 -4481:2:2142 -4482:2:2150 -4483:2:2151 -4484:2:2155 -4485:2:2156 -4486:2:2150 -4487:2:2151 -4488:2:2155 -4489:2:2156 -4490:2:2164 -4491:2:2169 -4492:2:2173 -4493:2:2174 -4494:2:2181 -4495:2:2182 -4496:2:2193 -4497:2:2194 -4498:2:2195 -4499:2:2193 -4500:2:2194 -4501:2:2195 -4502:2:2206 -4503:2:2211 -4504:2:2212 -4505:0:4365 -4506:2:2224 -4507:0:4365 -4508:3:3558 -4509:0:4365 -4510:2:2226 -4511:0:4365 -4512:3:3559 -4513:0:4365 -4514:2:1936 -4515:0:4365 -4516:2:2129 -4517:0:4365 -4518:2:2130 -4519:0:4365 -4520:2:2134 -4521:0:4365 -4522:3:3558 -4523:0:4365 -4524:2:2136 -4525:0:4365 -4526:3:3559 -4527:0:4365 -4528:2:2137 -4529:2:2141 -4530:2:2142 -4531:2:2150 -4532:2:2151 -4533:2:2155 -4534:2:2156 -4535:2:2150 -4536:2:2151 -4537:2:2152 -4538:2:2164 -4539:2:2169 -4540:2:2173 -4541:2:2174 -4542:2:2181 -4543:2:2182 -4544:2:2193 -4545:2:2194 -4546:2:2195 -4547:2:2193 -4548:2:2194 -4549:2:2195 -4550:2:2206 -4551:2:2211 -4552:2:2212 -4553:0:4365 -4554:2:2224 -4555:0:4365 -4556:3:3558 -4557:0:4365 -4558:2:2226 -4559:0:4365 -4560:3:3559 -4561:0:4365 -4562:2:2230 -4563:0:4365 -4564:3:3558 -4565:0:4365 -4566:2:2235 -4567:2:2239 -4568:2:2240 -4569:2:2248 -4570:2:2249 -4571:2:2253 -4572:2:2254 -4573:2:2248 -4574:2:2249 -4575:2:2250 -4576:2:2262 -4577:2:2267 -4578:2:2271 -4579:2:2272 -4580:2:2279 -4581:2:2280 -4582:2:2291 -4583:2:2292 -4584:2:2293 -4585:2:2291 -4586:2:2292 -4587:2:2293 -4588:2:2304 -4589:2:2309 -4590:2:2310 -4591:0:4365 -4592:3:3559 -4593:0:4365 -4594:2:2322 -4595:0:4365 -4596:2:1169 -4597:0:4365 -4598:3:3558 -4599:0:4365 -4600:2:1170 -4601:0:4365 -4602:3:3559 -4603:0:4365 -4604:3:3560 -4605:0:4365 -4606:3:3566 -4607:0:4365 -4608:3:3569 -4609:3:3570 -4610:3:3582 -4611:3:3583 -4612:3:3587 -4613:3:3588 -4614:3:3582 -4615:3:3583 -4616:3:3587 -4617:3:3588 -4618:3:3596 -4619:3:3601 -4620:3:3605 -4621:3:3606 -4622:3:3613 -4623:3:3614 -4624:3:3625 -4625:3:3626 -4626:3:3627 -4627:3:3625 -4628:3:3626 -4629:3:3627 -4630:3:3638 -4631:3:3643 -4632:3:3644 -4633:0:4365 -4634:3:3656 -4635:0:4365 -4636:3:3657 -4637:0:4365 -4638:2:1173 -4639:0:4365 -4640:3:3658 -4641:0:4365 -4642:2:1179 -4643:0:4365 -4644:2:1180 -4645:0:4365 -4646:3:3657 -4647:0:4365 -4648:2:1181 -4649:2:1185 -4650:2:1186 -4651:2:1194 -4652:2:1195 -4653:2:1199 -4654:2:1200 -4655:2:1194 -4656:2:1195 -4657:2:1199 -4658:2:1200 -4659:2:1208 -4660:2:1213 -4661:2:1217 -4662:2:1218 -4663:2:1225 -4664:2:1226 -4665:2:1237 -4666:2:1238 -4667:2:1239 -4668:2:1237 -4669:2:1238 -4670:2:1239 -4671:2:1250 -4672:2:1255 -4673:2:1256 -4674:0:4365 -4675:3:3658 -4676:0:4365 -4677:2:1268 -4678:0:4365 -4679:3:3657 -4680:0:4365 -4681:2:1270 -4682:0:4365 -4683:3:3658 -4684:0:4365 -4685:2:1271 -4686:2:1275 -4687:2:1276 -4688:2:1284 -4689:2:1285 -4690:2:1289 -4691:2:1290 -4692:2:1284 -4693:2:1285 -4694:2:1289 -4695:2:1290 -4696:2:1298 -4697:2:1303 -4698:2:1307 -4699:2:1308 -4700:2:1315 -4701:2:1316 -4702:2:1327 -4703:2:1328 -4704:2:1329 -4705:2:1327 -4706:2:1328 -4707:2:1329 -4708:2:1340 -4709:2:1345 -4710:2:1346 -4711:0:4365 -4712:2:1358 -4713:0:4365 -4714:2:1360 -4715:0:4365 -4716:3:3657 -4717:0:4365 -4718:2:1361 -4719:0:4365 -4720:3:3658 -4721:0:4365 -4722:2:1362 -4723:2:1366 -4724:2:1367 -4725:2:1375 -4726:2:1376 -4727:2:1380 -4728:2:1381 -4729:2:1375 -4730:2:1376 -4731:2:1380 -4732:2:1381 -4733:2:1389 -4734:2:1394 -4735:2:1398 -4736:2:1399 -4737:2:1406 -4738:2:1407 -4739:2:1418 -4740:2:1419 -4741:2:1420 -4742:2:1418 -4743:2:1419 -4744:2:1420 -4745:2:1431 -4746:2:1436 -4747:2:1437 -4748:0:4365 -4749:2:1449 -4750:0:4365 -4751:3:3657 -4752:0:4365 -4753:2:1451 -4754:0:4365 -4755:3:3658 -4756:0:4365 -4757:2:1652 -4758:0:4365 -4759:2:1653 -4760:0:4365 -4761:2:1657 -4762:0:4365 -4763:2:1180 -4764:0:4365 -4765:3:3657 -4766:0:4365 -4767:2:1181 -4768:2:1185 -4769:2:1186 -4770:2:1194 -4771:2:1195 -4772:2:1199 -4773:2:1200 -4774:2:1194 -4775:2:1195 -4776:2:1196 -4777:2:1208 -4778:2:1213 -4779:2:1217 -4780:2:1218 -4781:2:1225 -4782:2:1226 -4783:2:1237 -4784:2:1238 -4785:2:1239 -4786:2:1237 -4787:2:1238 -4788:2:1239 -4789:2:1250 -4790:2:1255 -4791:2:1256 -4792:0:4365 -4793:3:3658 -4794:0:4365 -4795:2:1268 -4796:0:4365 -4797:3:3657 -4798:0:4365 -4799:2:1270 -4800:0:4365 -4801:3:3658 -4802:0:4365 -4803:2:1271 -4804:2:1275 -4805:2:1276 -4806:2:1284 -4807:2:1285 -4808:2:1289 -4809:2:1290 -4810:2:1284 -4811:2:1285 -4812:2:1289 -4813:2:1290 -4814:2:1298 -4815:2:1303 -4816:2:1307 -4817:2:1308 -4818:2:1315 -4819:2:1316 -4820:2:1327 -4821:2:1328 -4822:2:1329 -4823:2:1327 -4824:2:1328 -4825:2:1329 -4826:2:1340 -4827:2:1345 -4828:2:1346 -4829:0:4365 -4830:2:1358 -4831:0:4365 -4832:2:1454 -4833:0:4365 -4834:3:3657 -4835:0:4365 -4836:2:1455 -4837:0:4365 -4838:3:3658 -4839:0:4365 -4840:2:1652 -4841:0:4365 -4842:2:1653 -4843:0:4365 -4844:2:1657 -4845:0:4365 -4846:2:1660 -4847:0:4365 -4848:3:3657 -4849:0:4365 -4850:2:1665 -4851:2:1669 -4852:2:1670 -4853:2:1678 -4854:2:1679 -4855:2:1683 -4856:2:1684 -4857:2:1678 -4858:2:1679 -4859:2:1680 -4860:2:1692 -4861:2:1697 -4862:2:1701 -4863:2:1702 -4864:2:1709 -4865:2:1710 -4866:2:1721 -4867:2:1722 -4868:2:1723 -4869:2:1721 -4870:2:1722 -4871:2:1723 -4872:2:1734 -4873:2:1739 -4874:2:1740 -4875:0:4365 -4876:3:3658 -4877:0:4365 -4878:2:1752 -4879:0:4365 -4880:3:3657 -4881:0:4365 -4882:2:1754 -4883:0:4365 -4884:3:3658 -4885:0:4365 -4886:2:1755 -4887:2:1759 -4888:2:1760 -4889:2:1768 -4890:2:1769 -4891:2:1773 -4892:2:1774 -4893:2:1768 -4894:2:1769 -4895:2:1773 -4896:2:1774 -4897:2:1782 -4898:2:1787 -4899:2:1791 -4900:2:1792 -4901:2:1799 -4902:2:1800 -4903:2:1811 -4904:2:1812 -4905:2:1813 -4906:2:1811 -4907:2:1812 -4908:2:1813 -4909:2:1824 -4910:2:1829 -4911:2:1830 -4912:0:4365 -4913:2:1842 -4914:0:4365 -4915:3:3657 -4916:0:4365 -4917:2:1844 -4918:0:4365 -4919:3:3658 -4920:0:4365 -4921:2:1845 -4922:2:1849 -4923:2:1850 -4924:2:1858 -4925:2:1859 -4926:2:1863 -4927:2:1864 -4928:2:1858 -4929:2:1859 -4930:2:1863 -4931:2:1864 -4932:2:1872 -4933:2:1877 -4934:2:1881 -4935:2:1882 -4936:2:1889 -4937:2:1890 -4938:2:1901 -4939:2:1902 -4940:2:1903 -4941:2:1901 -4942:2:1902 -4943:2:1903 -4944:2:1914 -4945:2:1919 -4946:2:1920 -4947:0:4365 -4948:2:1932 -4949:0:4365 -4950:3:3657 -4951:0:4365 -4952:2:1934 -4953:0:4365 -4954:3:3658 -4955:0:4365 -4956:2:1935 -4957:0:4365 -4958:2:1936 -4959:0:4365 -4960:2:2129 -4961:0:4365 -4962:2:2130 -4963:0:4365 -4964:2:2134 -4965:0:4365 -4966:3:3657 -4967:0:4365 -4968:2:2136 -4969:0:4365 -4970:3:3658 -4971:0:4365 -4972:2:2137 -4973:2:2141 -4974:2:2142 -4975:2:2150 -4976:2:2151 -4977:2:2155 -4978:2:2156 -4979:2:2150 -4980:2:2151 -4981:2:2155 -4982:2:2156 -4983:2:2164 -4984:2:2169 -4985:2:2173 -4986:2:2174 -4987:2:2181 -4988:2:2182 -4989:2:2193 -4990:2:2194 -4991:2:2195 -4992:2:2193 -4993:2:2194 -4994:2:2195 -4995:2:2206 -4996:2:2211 -4997:2:2212 -4998:0:4365 -4999:2:2224 -5000:0:4365 -5001:3:3657 -5002:0:4365 -5003:2:2226 -5004:0:4365 -5005:3:3658 -5006:0:4365 -5007:2:1936 -5008:0:4365 -5009:2:2129 -5010:0:4365 -5011:2:2130 -5012:0:4365 -5013:2:2134 -5014:0:4365 -5015:3:3657 -5016:0:4365 -5017:2:2136 -5018:0:4365 -5019:3:3658 -5020:0:4365 -5021:2:2137 -5022:2:2141 -5023:2:2142 -5024:2:2150 -5025:2:2151 -5026:2:2155 -5027:2:2156 -5028:2:2150 -5029:2:2151 -5030:2:2152 -5031:2:2164 -5032:2:2169 -5033:2:2173 -5034:2:2174 -5035:2:2181 -5036:2:2182 -5037:2:2193 -5038:2:2194 -5039:2:2195 -5040:2:2193 -5041:2:2194 -5042:2:2195 -5043:2:2206 -5044:2:2211 -5045:2:2212 -5046:0:4365 -5047:2:2224 -5048:0:4365 -5049:3:3657 -5050:0:4365 -5051:2:2226 -5052:0:4365 -5053:3:3658 -5054:0:4365 -5055:2:2230 -5056:0:4365 -5057:3:3657 -5058:0:4365 -5059:2:2235 -5060:2:2239 -5061:2:2240 -5062:2:2248 -5063:2:2249 -5064:2:2253 -5065:2:2254 -5066:2:2248 -5067:2:2249 -5068:2:2250 -5069:2:2262 -5070:2:2267 -5071:2:2271 -5072:2:2272 -5073:2:2279 -5074:2:2280 -5075:2:2291 -5076:2:2292 -5077:2:2293 -5078:2:2291 -5079:2:2292 -5080:2:2293 -5081:2:2304 -5082:2:2309 -5083:2:2310 -5084:0:4365 -5085:3:3658 -5086:0:4365 -5087:2:2322 -5088:0:4365 -5089:2:1169 -5090:0:4365 -5091:3:3657 -5092:0:4365 -5093:2:1170 -5094:0:4365 -5095:3:3658 -5096:0:4365 -5097:3:3659 -5098:0:4365 -5099:3:3665 -5100:0:4365 -5101:3:3666 -5102:0:4365 -5103:3:3667 -5104:0:4365 -5105:3:3668 -5106:0:4365 -5107:3:3669 -5108:3:3673 -5109:3:3674 -5110:3:3682 -5111:3:3683 -5112:3:3687 -5113:3:3688 -5114:3:3682 -5115:3:3683 -5116:3:3687 -5117:3:3688 -5118:3:3696 -5119:3:3701 -5120:3:3705 -5121:3:3706 -5122:3:3713 -5123:3:3714 -5124:3:3725 -5125:3:3726 -5126:3:3727 -5127:3:3725 -5128:3:3726 -5129:3:3727 -5130:3:3738 -5131:3:3743 -5132:3:3744 -5133:0:4365 -5134:3:3756 -5135:0:4365 -5136:3:3757 -5137:0:4365 -5138:2:1173 -5139:0:4365 -5140:3:3758 -5141:0:4365 -5142:2:1179 -5143:0:4365 -5144:2:1180 -5145:0:4365 -5146:3:3757 -5147:0:4365 -5148:2:1181 -5149:2:1185 -5150:2:1186 -5151:2:1194 -5152:2:1195 -5153:2:1199 -5154:2:1200 -5155:2:1194 -5156:2:1195 -5157:2:1199 -5158:2:1200 -5159:2:1208 -5160:2:1213 -5161:2:1217 -5162:2:1218 -5163:2:1225 -5164:2:1226 -5165:2:1237 -5166:2:1238 -5167:2:1239 -5168:2:1237 -5169:2:1238 -5170:2:1239 -5171:2:1250 -5172:2:1255 -5173:2:1256 -5174:0:4365 -5175:3:3758 -5176:0:4365 -5177:2:1268 -5178:0:4365 -5179:3:3757 -5180:0:4365 -5181:2:1270 -5182:0:4365 -5183:3:3758 -5184:0:4365 -5185:2:1271 -5186:2:1275 -5187:2:1276 -5188:2:1284 -5189:2:1285 -5190:2:1289 -5191:2:1290 -5192:2:1284 -5193:2:1285 -5194:2:1289 -5195:2:1290 -5196:2:1298 -5197:2:1303 -5198:2:1307 -5199:2:1308 -5200:2:1315 -5201:2:1316 -5202:2:1327 -5203:2:1328 -5204:2:1329 -5205:2:1327 -5206:2:1328 -5207:2:1329 -5208:2:1340 -5209:2:1345 -5210:2:1346 -5211:0:4365 -5212:2:1358 -5213:0:4365 -5214:2:1360 -5215:0:4365 -5216:3:3757 -5217:0:4365 -5218:2:1361 -5219:0:4365 -5220:3:3758 -5221:0:4365 -5222:2:1362 -5223:2:1366 -5224:2:1367 -5225:2:1375 -5226:2:1376 -5227:2:1380 -5228:2:1381 -5229:2:1375 -5230:2:1376 -5231:2:1380 -5232:2:1381 -5233:2:1389 -5234:2:1394 -5235:2:1398 -5236:2:1399 -5237:2:1406 -5238:2:1407 -5239:2:1418 -5240:2:1419 -5241:2:1420 -5242:2:1418 -5243:2:1419 -5244:2:1420 -5245:2:1431 -5246:2:1436 -5247:2:1437 -5248:0:4365 -5249:2:1449 -5250:0:4365 -5251:3:3757 -5252:0:4365 -5253:2:1451 -5254:0:4365 -5255:3:3758 -5256:0:4365 -5257:2:1652 -5258:0:4365 -5259:2:1653 -5260:0:4365 -5261:2:1657 -5262:0:4365 -5263:2:1180 -5264:0:4365 -5265:3:3757 -5266:0:4365 -5267:2:1181 -5268:2:1185 -5269:2:1186 -5270:2:1194 -5271:2:1195 -5272:2:1199 -5273:2:1200 -5274:2:1194 -5275:2:1195 -5276:2:1196 -5277:2:1208 -5278:2:1213 -5279:2:1217 -5280:2:1218 -5281:2:1225 -5282:2:1226 -5283:2:1237 -5284:2:1238 -5285:2:1239 -5286:2:1237 -5287:2:1238 -5288:2:1239 -5289:2:1250 -5290:2:1255 -5291:2:1256 -5292:0:4365 -5293:3:3758 -5294:0:4365 -5295:2:1268 -5296:0:4365 -5297:3:3757 -5298:0:4365 -5299:2:1270 -5300:0:4365 -5301:3:3758 -5302:0:4365 -5303:2:1271 -5304:2:1275 -5305:2:1276 -5306:2:1284 -5307:2:1285 -5308:2:1289 -5309:2:1290 -5310:2:1284 -5311:2:1285 -5312:2:1289 -5313:2:1290 -5314:2:1298 -5315:2:1303 -5316:2:1307 -5317:2:1308 -5318:2:1315 -5319:2:1316 -5320:2:1327 -5321:2:1328 -5322:2:1329 -5323:2:1327 -5324:2:1328 -5325:2:1329 -5326:2:1340 -5327:2:1345 -5328:2:1346 -5329:0:4365 -5330:2:1358 -5331:0:4365 -5332:2:1454 -5333:0:4365 -5334:3:3757 -5335:0:4365 -5336:2:1455 -5337:0:4365 -5338:3:3758 -5339:0:4365 -5340:2:1652 -5341:0:4365 -5342:2:1653 -5343:0:4365 -5344:2:1657 -5345:0:4365 -5346:2:1660 -5347:0:4365 -5348:3:3757 -5349:0:4365 -5350:2:1665 -5351:2:1669 -5352:2:1670 -5353:2:1678 -5354:2:1679 -5355:2:1683 -5356:2:1684 -5357:2:1678 -5358:2:1679 -5359:2:1680 -5360:2:1692 -5361:2:1697 -5362:2:1701 -5363:2:1702 -5364:2:1709 -5365:2:1710 -5366:2:1721 -5367:2:1722 -5368:2:1723 -5369:2:1721 -5370:2:1722 -5371:2:1723 -5372:2:1734 -5373:2:1739 -5374:2:1740 -5375:0:4365 -5376:3:3758 -5377:0:4365 -5378:2:1752 -5379:0:4365 -5380:3:3757 -5381:0:4365 -5382:2:1754 -5383:0:4365 -5384:3:3758 -5385:0:4365 -5386:2:1755 -5387:2:1759 -5388:2:1760 -5389:2:1768 -5390:2:1769 -5391:2:1773 -5392:2:1774 -5393:2:1768 -5394:2:1769 -5395:2:1773 -5396:2:1774 -5397:2:1782 -5398:2:1787 -5399:2:1791 -5400:2:1792 -5401:2:1799 -5402:2:1800 -5403:2:1811 -5404:2:1812 -5405:2:1813 -5406:2:1811 -5407:2:1812 -5408:2:1813 -5409:2:1824 -5410:2:1829 -5411:2:1830 -5412:0:4365 -5413:2:1842 -5414:0:4365 -5415:3:3757 -5416:0:4365 -5417:2:1844 -5418:0:4365 -5419:3:3758 -5420:0:4365 -5421:2:1845 -5422:2:1849 -5423:2:1850 -5424:2:1858 -5425:2:1859 -5426:2:1863 -5427:2:1864 -5428:2:1858 -5429:2:1859 -5430:2:1863 -5431:2:1864 -5432:2:1872 -5433:2:1877 -5434:2:1881 -5435:2:1882 -5436:2:1889 -5437:2:1890 -5438:2:1901 -5439:2:1902 -5440:2:1903 -5441:2:1901 -5442:2:1902 -5443:2:1903 -5444:2:1914 -5445:2:1919 -5446:2:1920 -5447:0:4365 -5448:2:1932 -5449:0:4365 -5450:3:3757 -5451:0:4365 -5452:2:1934 -5453:0:4365 -5454:3:3758 -5455:0:4365 -5456:2:1935 -5457:0:4365 -5458:2:1936 -5459:0:4365 -5460:2:2129 -5461:0:4365 -5462:2:2130 -5463:0:4365 -5464:2:2134 -5465:0:4365 -5466:3:3757 -5467:0:4365 -5468:2:2136 -5469:0:4365 -5470:3:3758 -5471:0:4365 -5472:2:2137 -5473:2:2141 -5474:2:2142 -5475:2:2150 -5476:2:2151 -5477:2:2155 -5478:2:2156 -5479:2:2150 -5480:2:2151 -5481:2:2155 -5482:2:2156 -5483:2:2164 -5484:2:2169 -5485:2:2173 -5486:2:2174 -5487:2:2181 -5488:2:2182 -5489:2:2193 -5490:2:2194 -5491:2:2195 -5492:2:2193 -5493:2:2194 -5494:2:2195 -5495:2:2206 -5496:2:2211 -5497:2:2212 -5498:0:4365 -5499:2:2224 -5500:0:4365 -5501:3:3757 -5502:0:4365 -5503:2:2226 -5504:0:4365 -5505:3:3758 -5506:0:4365 -5507:2:1936 -5508:0:4365 -5509:2:2129 -5510:0:4365 -5511:2:2130 -5512:0:4365 -5513:2:2134 -5514:0:4365 -5515:3:3757 -5516:0:4365 -5517:2:2136 -5518:0:4365 -5519:3:3758 -5520:0:4365 -5521:2:2137 -5522:2:2141 -5523:2:2142 -5524:2:2150 -5525:2:2151 -5526:2:2155 -5527:2:2156 -5528:2:2150 -5529:2:2151 -5530:2:2152 -5531:2:2164 -5532:2:2169 -5533:2:2173 -5534:2:2174 -5535:2:2181 -5536:2:2182 -5537:2:2193 -5538:2:2194 -5539:2:2195 -5540:2:2193 -5541:2:2194 -5542:2:2195 -5543:2:2206 -5544:2:2211 -5545:2:2212 -5546:0:4365 -5547:2:2224 -5548:0:4365 -5549:3:3757 -5550:0:4365 -5551:2:2226 -5552:0:4365 -5553:3:3758 -5554:0:4365 -5555:2:2230 -5556:0:4365 -5557:3:3757 -5558:0:4365 -5559:2:2235 -5560:2:2239 -5561:2:2240 -5562:2:2248 -5563:2:2249 -5564:2:2253 -5565:2:2254 -5566:2:2248 -5567:2:2249 -5568:2:2250 -5569:2:2262 -5570:2:2267 -5571:2:2271 -5572:2:2272 -5573:2:2279 -5574:2:2280 -5575:2:2291 -5576:2:2292 -5577:2:2293 -5578:2:2291 -5579:2:2292 -5580:2:2293 -5581:2:2304 -5582:2:2309 -5583:2:2310 -5584:0:4365 -5585:3:3758 -5586:0:4365 -5587:2:2322 -5588:0:4365 -5589:2:1169 -5590:0:4365 -5591:3:3757 -5592:0:4365 -5593:2:1170 -5594:0:4365 -5595:3:3758 -5596:0:4365 -5597:3:3759 -5598:0:4365 -5599:3:3972 -5600:0:4365 -5601:3:3980 -5602:0:4365 -5603:3:3981 -5604:3:3985 -5605:3:3986 -5606:3:3994 -5607:3:3995 -5608:3:3999 -5609:3:4000 -5610:3:3994 -5611:3:3995 -5612:3:3999 -5613:3:4000 -5614:3:4008 -5615:3:4013 -5616:3:4017 -5617:3:4018 -5618:3:4025 -5619:3:4026 -5620:3:4037 -5621:3:4038 -5622:3:4039 -5623:3:4037 -5624:3:4038 -5625:3:4039 -5626:3:4050 -5627:3:4055 -5628:3:4056 -5629:0:4365 -5630:3:4068 -5631:0:4365 -5632:3:4069 -5633:0:4365 -5634:2:1173 -5635:0:4365 -5636:3:4070 -5637:0:4365 -5638:2:1179 -5639:0:4365 -5640:2:1180 -5641:0:4365 -5642:3:4069 -5643:0:4365 -5644:2:1181 -5645:2:1185 -5646:2:1186 -5647:2:1194 -5648:2:1195 -5649:2:1199 -5650:2:1200 -5651:2:1194 -5652:2:1195 -5653:2:1199 -5654:2:1200 -5655:2:1208 -5656:2:1213 -5657:2:1217 -5658:2:1218 -5659:2:1225 -5660:2:1226 -5661:2:1237 -5662:2:1238 -5663:2:1239 -5664:2:1237 -5665:2:1238 -5666:2:1239 -5667:2:1250 -5668:2:1255 -5669:2:1256 -5670:0:4365 -5671:3:4070 -5672:0:4365 -5673:2:1268 -5674:0:4365 -5675:3:4069 -5676:0:4365 -5677:2:1270 -5678:0:4365 -5679:3:4070 -5680:0:4365 -5681:2:1271 -5682:2:1275 -5683:2:1276 -5684:2:1284 -5685:2:1285 -5686:2:1289 -5687:2:1290 -5688:2:1284 -5689:2:1285 -5690:2:1289 -5691:2:1290 -5692:2:1298 -5693:2:1303 -5694:2:1307 -5695:2:1308 -5696:2:1315 -5697:2:1316 -5698:2:1327 -5699:2:1328 -5700:2:1329 -5701:2:1327 -5702:2:1328 -5703:2:1329 -5704:2:1340 -5705:2:1345 -5706:2:1346 -5707:0:4365 -5708:2:1358 -5709:0:4365 -5710:2:1360 -5711:0:4365 -5712:3:4069 -5713:0:4365 -5714:2:1361 -5715:0:4365 -5716:3:4070 -5717:0:4365 -5718:2:1362 -5719:2:1366 -5720:2:1367 -5721:2:1375 -5722:2:1376 -5723:2:1380 -5724:2:1381 -5725:2:1375 -5726:2:1376 -5727:2:1380 -5728:2:1381 -5729:2:1389 -5730:2:1394 -5731:2:1398 -5732:2:1399 -5733:2:1406 -5734:2:1407 -5735:2:1418 -5736:2:1419 -5737:2:1420 -5738:2:1418 -5739:2:1419 -5740:2:1420 -5741:2:1431 -5742:2:1436 -5743:2:1437 -5744:0:4365 -5745:2:1449 -5746:0:4365 -5747:3:4069 -5748:0:4365 -5749:2:1451 -5750:0:4365 -5751:3:4070 -5752:0:4365 -5753:2:1652 -5754:0:4365 -5755:2:1653 -5756:0:4365 -5757:2:1657 -5758:0:4365 -5759:2:1180 -5760:0:4365 -5761:3:4069 -5762:0:4365 -5763:2:1181 -5764:2:1185 -5765:2:1186 -5766:2:1194 -5767:2:1195 -5768:2:1199 -5769:2:1200 -5770:2:1194 -5771:2:1195 -5772:2:1196 -5773:2:1208 -5774:2:1213 -5775:2:1217 -5776:2:1218 -5777:2:1225 -5778:2:1226 -5779:2:1237 -5780:2:1238 -5781:2:1239 -5782:2:1237 -5783:2:1238 -5784:2:1239 -5785:2:1250 -5786:2:1255 -5787:2:1256 -5788:0:4365 -5789:3:4070 -5790:0:4365 -5791:2:1268 -5792:0:4365 -5793:3:4069 -5794:0:4365 -5795:2:1270 -5796:0:4365 -5797:3:4070 -5798:0:4365 -5799:2:1271 -5800:2:1275 -5801:2:1276 -5802:2:1284 -5803:2:1285 -5804:2:1289 -5805:2:1290 -5806:2:1284 -5807:2:1285 -5808:2:1289 -5809:2:1290 -5810:2:1298 -5811:2:1303 -5812:2:1307 -5813:2:1308 -5814:2:1315 -5815:2:1316 -5816:2:1327 -5817:2:1328 -5818:2:1329 -5819:2:1327 -5820:2:1328 -5821:2:1329 -5822:2:1340 -5823:2:1345 -5824:2:1346 -5825:0:4365 -5826:2:1358 -5827:0:4365 -5828:2:1454 -5829:0:4365 -5830:3:4069 -5831:0:4365 -5832:2:1455 -5833:0:4365 -5834:3:4070 -5835:0:4365 -5836:2:1652 -5837:0:4365 -5838:2:1653 -5839:0:4365 -5840:2:1657 -5841:0:4365 -5842:2:1660 -5843:0:4365 -5844:3:4069 -5845:0:4365 -5846:2:1665 -5847:2:1669 -5848:2:1670 -5849:2:1678 -5850:2:1679 -5851:2:1683 -5852:2:1684 -5853:2:1678 -5854:2:1679 -5855:2:1680 -5856:2:1692 -5857:2:1697 -5858:2:1701 -5859:2:1702 -5860:2:1709 -5861:2:1710 -5862:2:1721 -5863:2:1722 -5864:2:1723 -5865:2:1721 -5866:2:1722 -5867:2:1723 -5868:2:1734 -5869:2:1739 -5870:2:1740 -5871:0:4365 -5872:3:4070 -5873:0:4365 -5874:2:1752 -5875:0:4365 -5876:3:4069 -5877:0:4365 -5878:2:1754 -5879:0:4365 -5880:3:4070 -5881:0:4365 -5882:2:1755 -5883:2:1759 -5884:2:1760 -5885:2:1768 -5886:2:1769 -5887:2:1773 -5888:2:1774 -5889:2:1768 -5890:2:1769 -5891:2:1773 -5892:2:1774 -5893:2:1782 -5894:2:1787 -5895:2:1791 -5896:2:1792 -5897:2:1799 -5898:2:1800 -5899:2:1811 -5900:2:1812 -5901:2:1813 -5902:2:1811 -5903:2:1812 -5904:2:1813 -5905:2:1824 -5906:2:1829 -5907:2:1830 -5908:0:4365 -5909:2:1842 -5910:0:4365 -5911:3:4069 -5912:0:4365 -5913:2:1844 -5914:0:4365 -5915:3:4070 -5916:0:4365 -5917:2:1845 -5918:2:1849 -5919:2:1850 -5920:2:1858 -5921:2:1859 -5922:2:1863 -5923:2:1864 -5924:2:1858 -5925:2:1859 -5926:2:1863 -5927:2:1864 -5928:2:1872 -5929:2:1877 -5930:2:1881 -5931:2:1882 -5932:2:1889 -5933:2:1890 -5934:2:1901 -5935:2:1902 -5936:2:1903 -5937:2:1901 -5938:2:1902 -5939:2:1903 -5940:2:1914 -5941:2:1919 -5942:2:1920 -5943:0:4365 -5944:2:1932 -5945:0:4365 -5946:3:4069 -5947:0:4365 -5948:2:1934 -5949:0:4365 -5950:3:4070 -5951:0:4365 -5952:2:1935 -5953:0:4365 -5954:2:1936 -5955:0:4365 -5956:2:2129 -5957:0:4365 -5958:2:2130 -5959:0:4365 -5960:2:2134 -5961:0:4365 -5962:3:4069 -5963:0:4365 -5964:2:2136 -5965:0:4365 -5966:3:4070 -5967:0:4365 -5968:2:2137 -5969:2:2141 -5970:2:2142 -5971:2:2150 -5972:2:2151 -5973:2:2155 -5974:2:2156 -5975:2:2150 -5976:2:2151 -5977:2:2155 -5978:2:2156 -5979:2:2164 -5980:2:2169 -5981:2:2173 -5982:2:2174 -5983:2:2181 -5984:2:2182 -5985:2:2193 -5986:2:2194 -5987:2:2195 -5988:2:2193 -5989:2:2194 -5990:2:2195 -5991:2:2206 -5992:2:2211 -5993:2:2212 -5994:0:4365 -5995:2:2224 -5996:0:4365 -5997:3:4069 -5998:0:4365 -5999:2:2226 -6000:0:4365 -6001:3:4070 -6002:0:4365 -6003:2:1936 -6004:0:4365 -6005:2:2129 -6006:0:4365 -6007:2:2130 -6008:0:4365 -6009:2:2134 -6010:0:4365 -6011:3:4069 -6012:0:4365 -6013:2:2136 -6014:0:4365 -6015:3:4070 -6016:0:4365 -6017:2:2137 -6018:2:2141 -6019:2:2142 -6020:2:2150 -6021:2:2151 -6022:2:2155 -6023:2:2156 -6024:2:2150 -6025:2:2151 -6026:2:2152 -6027:2:2164 -6028:2:2169 -6029:2:2173 -6030:2:2174 -6031:2:2181 -6032:2:2182 -6033:2:2193 -6034:2:2194 -6035:2:2195 -6036:2:2193 -6037:2:2194 -6038:2:2195 -6039:2:2206 -6040:2:2211 -6041:2:2212 -6042:0:4365 -6043:2:2224 -6044:0:4365 -6045:3:4069 -6046:0:4365 -6047:2:2226 -6048:0:4365 -6049:3:4070 -6050:0:4365 -6051:2:2230 -6052:0:4365 -6053:3:4069 -6054:0:4365 -6055:2:2235 -6056:2:2239 -6057:2:2240 -6058:2:2248 -6059:2:2249 -6060:2:2253 -6061:2:2254 -6062:2:2248 -6063:2:2249 -6064:2:2250 -6065:2:2262 -6066:2:2267 -6067:2:2271 -6068:2:2272 -6069:2:2279 -6070:2:2280 -6071:2:2291 -6072:2:2292 -6073:2:2293 -6074:2:2291 -6075:2:2292 -6076:2:2293 -6077:2:2304 -6078:2:2309 -6079:2:2310 -6080:0:4365 -6081:3:4070 -6082:0:4365 -6083:2:2322 -6084:0:4365 -6085:2:1169 -6086:0:4365 -6087:3:4069 -6088:0:4365 -6089:2:1170 -6090:0:4365 -6091:3:4070 -6092:0:4365 -6093:3:4071 -6094:0:4365 -6095:3:4081 -6096:0:4365 -6097:3:3666 -6098:0:4365 -6099:3:3667 -6100:0:4365 -6101:3:3668 -6102:0:4365 -6103:3:3669 -6104:3:3673 -6105:3:3674 -6106:3:3682 -6107:3:3683 -6108:3:3687 -6109:3:3688 -6110:3:3682 -6111:3:3683 -6112:3:3687 -6113:3:3688 -6114:3:3696 -6115:3:3701 -6116:3:3705 -6117:3:3706 -6118:3:3713 -6119:3:3714 -6120:3:3725 -6121:3:3726 -6122:3:3727 -6123:3:3725 -6124:3:3726 -6125:3:3727 -6126:3:3738 -6127:3:3743 -6128:3:3744 -6129:0:4365 -6130:3:3756 -6131:0:4365 -6132:3:3757 -6133:0:4365 -6134:2:1173 -6135:0:4365 -6136:3:3758 -6137:0:4365 -6138:2:1179 -6139:0:4365 -6140:2:1180 -6141:0:4365 -6142:3:3757 -6143:0:4365 -6144:2:1181 -6145:2:1185 -6146:2:1186 -6147:2:1194 -6148:2:1195 -6149:2:1199 -6150:2:1200 -6151:2:1194 -6152:2:1195 -6153:2:1199 -6154:2:1200 -6155:2:1208 -6156:2:1213 -6157:2:1217 -6158:2:1218 -6159:2:1225 -6160:2:1226 -6161:2:1237 -6162:2:1238 -6163:2:1239 -6164:2:1237 -6165:2:1238 -6166:2:1239 -6167:2:1250 -6168:2:1255 -6169:2:1256 -6170:0:4365 -6171:3:3758 -6172:0:4365 -6173:2:1268 -6174:0:4365 -6175:3:3757 -6176:0:4365 -6177:2:1270 -6178:0:4365 -6179:3:3758 -6180:0:4365 -6181:2:1271 -6182:2:1275 -6183:2:1276 -6184:2:1284 -6185:2:1285 -6186:2:1289 -6187:2:1290 -6188:2:1284 -6189:2:1285 -6190:2:1289 -6191:2:1290 -6192:2:1298 -6193:2:1303 -6194:2:1307 -6195:2:1308 -6196:2:1315 -6197:2:1316 -6198:2:1327 -6199:2:1328 -6200:2:1329 -6201:2:1327 -6202:2:1328 -6203:2:1329 -6204:2:1340 -6205:2:1345 -6206:2:1346 -6207:0:4365 -6208:2:1358 -6209:0:4365 -6210:2:1360 -6211:0:4365 -6212:3:3757 -6213:0:4365 -6214:2:1361 -6215:0:4365 -6216:3:3758 -6217:0:4365 -6218:2:1362 -6219:2:1366 -6220:2:1367 -6221:2:1375 -6222:2:1376 -6223:2:1380 -6224:2:1381 -6225:2:1375 -6226:2:1376 -6227:2:1380 -6228:2:1381 -6229:2:1389 -6230:2:1394 -6231:2:1398 -6232:2:1399 -6233:2:1406 -6234:2:1407 -6235:2:1418 -6236:2:1419 -6237:2:1420 -6238:2:1418 -6239:2:1419 -6240:2:1420 -6241:2:1431 -6242:2:1436 -6243:2:1437 -6244:0:4365 -6245:2:1449 -6246:0:4365 -6247:3:3757 -6248:0:4365 -6249:2:1451 -6250:0:4365 -6251:3:3758 -6252:0:4365 -6253:2:1652 -6254:0:4365 -6255:2:1653 -6256:0:4365 -6257:2:1657 -6258:0:4365 -6259:2:1180 -6260:0:4365 -6261:3:3757 -6262:0:4365 -6263:2:1181 -6264:2:1185 -6265:2:1186 -6266:2:1194 -6267:2:1195 -6268:2:1199 -6269:2:1200 -6270:2:1194 -6271:2:1195 -6272:2:1196 -6273:2:1208 -6274:2:1213 -6275:2:1217 -6276:2:1218 -6277:2:1225 -6278:2:1226 -6279:2:1237 -6280:2:1238 -6281:2:1239 -6282:2:1237 -6283:2:1238 -6284:2:1239 -6285:2:1250 -6286:2:1255 -6287:2:1256 -6288:0:4365 -6289:3:3758 -6290:0:4365 -6291:2:1268 -6292:0:4365 -6293:3:3757 -6294:0:4365 -6295:2:1270 -6296:0:4365 -6297:3:3758 -6298:0:4365 -6299:2:1271 -6300:2:1275 -6301:2:1276 -6302:2:1284 -6303:2:1285 -6304:2:1289 -6305:2:1290 -6306:2:1284 -6307:2:1285 -6308:2:1289 -6309:2:1290 -6310:2:1298 -6311:2:1303 -6312:2:1307 -6313:2:1308 -6314:2:1315 -6315:2:1316 -6316:2:1327 -6317:2:1328 -6318:2:1329 -6319:2:1327 -6320:2:1328 -6321:2:1329 -6322:2:1340 -6323:2:1345 -6324:2:1346 -6325:0:4365 -6326:2:1358 -6327:0:4365 -6328:2:1454 -6329:0:4365 -6330:3:3757 -6331:0:4365 -6332:2:1455 -6333:0:4365 -6334:3:3758 -6335:0:4365 -6336:2:1652 -6337:0:4365 -6338:2:1653 -6339:0:4365 -6340:2:1657 -6341:0:4365 -6342:2:1660 -6343:0:4365 -6344:3:3757 -6345:0:4365 -6346:2:1665 -6347:2:1669 -6348:2:1670 -6349:2:1678 -6350:2:1679 -6351:2:1683 -6352:2:1684 -6353:2:1678 -6354:2:1679 -6355:2:1680 -6356:2:1692 -6357:2:1697 -6358:2:1701 -6359:2:1702 -6360:2:1709 -6361:2:1710 -6362:2:1721 -6363:2:1722 -6364:2:1723 -6365:2:1721 -6366:2:1722 -6367:2:1723 -6368:2:1734 -6369:2:1739 -6370:2:1740 -6371:0:4365 -6372:3:3758 -6373:0:4365 -6374:2:1752 -6375:0:4365 -6376:3:3757 -6377:0:4365 -6378:2:1754 -6379:0:4365 -6380:3:3758 -6381:0:4365 -6382:2:1755 -6383:2:1759 -6384:2:1760 -6385:2:1768 -6386:2:1769 -6387:2:1773 -6388:2:1774 -6389:2:1768 -6390:2:1769 -6391:2:1773 -6392:2:1774 -6393:2:1782 -6394:2:1787 -6395:2:1791 -6396:2:1792 -6397:2:1799 -6398:2:1800 -6399:2:1811 -6400:2:1812 -6401:2:1813 -6402:2:1811 -6403:2:1812 -6404:2:1813 -6405:2:1824 -6406:2:1829 -6407:2:1830 -6408:0:4365 -6409:2:1842 -6410:0:4365 -6411:3:3757 -6412:0:4365 -6413:2:1844 -6414:0:4365 -6415:3:3758 -6416:0:4365 -6417:2:1845 -6418:2:1849 -6419:2:1850 -6420:2:1858 -6421:2:1859 -6422:2:1863 -6423:2:1864 -6424:2:1858 -6425:2:1859 -6426:2:1863 -6427:2:1864 -6428:2:1872 -6429:2:1877 -6430:2:1881 -6431:2:1882 -6432:2:1889 -6433:2:1890 -6434:2:1901 -6435:2:1902 -6436:2:1903 -6437:2:1901 -6438:2:1902 -6439:2:1903 -6440:2:1914 -6441:2:1919 -6442:2:1920 -6443:0:4365 -6444:2:1932 -6445:0:4365 -6446:3:3757 -6447:0:4365 -6448:2:1934 -6449:0:4365 -6450:3:3758 -6451:0:4365 -6452:2:1935 -6453:0:4365 -6454:2:1936 -6455:0:4365 -6456:2:2129 -6457:0:4365 -6458:2:2130 -6459:0:4365 -6460:2:2134 -6461:0:4365 -6462:3:3757 -6463:0:4365 -6464:2:2136 -6465:0:4365 -6466:3:3758 -6467:0:4365 -6468:2:2137 -6469:2:2141 -6470:2:2142 -6471:2:2150 -6472:2:2151 -6473:2:2155 -6474:2:2156 -6475:2:2150 -6476:2:2151 -6477:2:2155 -6478:2:2156 -6479:2:2164 -6480:2:2169 -6481:2:2173 -6482:2:2174 -6483:2:2181 -6484:2:2182 -6485:2:2193 -6486:2:2194 -6487:2:2195 -6488:2:2193 -6489:2:2194 -6490:2:2195 -6491:2:2206 -6492:2:2211 -6493:2:2212 -6494:0:4365 -6495:2:2224 -6496:0:4365 -6497:3:3757 -6498:0:4365 -6499:2:2226 -6500:0:4365 -6501:3:3758 -6502:0:4365 -6503:2:1936 -6504:0:4365 -6505:2:2129 -6506:0:4365 -6507:2:2130 -6508:0:4365 -6509:2:2134 -6510:0:4365 -6511:3:3757 -6512:0:4365 -6513:2:2136 -6514:0:4365 -6515:3:3758 -6516:0:4365 -6517:2:2137 -6518:2:2141 -6519:2:2142 -6520:2:2150 -6521:2:2151 -6522:2:2155 -6523:2:2156 -6524:2:2150 -6525:2:2151 -6526:2:2152 -6527:2:2164 -6528:2:2169 -6529:2:2173 -6530:2:2174 -6531:2:2181 -6532:2:2182 -6533:2:2193 -6534:2:2194 -6535:2:2195 -6536:2:2193 -6537:2:2194 -6538:2:2195 -6539:2:2206 -6540:2:2211 -6541:2:2212 -6542:0:4365 -6543:2:2224 -6544:0:4365 -6545:3:3757 -6546:0:4365 -6547:2:2226 -6548:0:4365 -6549:3:3758 -6550:0:4365 -6551:2:2230 -6552:0:4365 -6553:3:3757 -6554:0:4365 -6555:2:2235 -6556:2:2239 -6557:2:2240 -6558:2:2248 -6559:2:2249 -6560:2:2253 -6561:2:2254 -6562:2:2248 -6563:2:2249 -6564:2:2250 -6565:2:2262 -6566:2:2267 -6567:2:2271 -6568:2:2272 -6569:2:2279 -6570:2:2280 -6571:2:2291 -6572:2:2292 -6573:2:2293 -6574:2:2291 -6575:2:2292 -6576:2:2293 -6577:2:2304 -6578:2:2309 -6579:2:2310 -6580:0:4365 -6581:3:3758 -6582:0:4365 -6583:2:2322 -6584:0:4365 -6585:2:1169 -6586:0:4365 -6587:3:3757 -6588:0:4365 -6589:2:1170 -6590:0:4365 -6591:3:3758 -6592:0:4365 -6593:3:3759 -6594:0:4365 -6595:3:3972 -6596:0:4365 -6597:3:4077 -6598:0:4365 -6599:3:4078 -6600:0:4365 -6601:3:4082 -6602:0:4365 -6603:3:4088 -6604:0:4365 -6605:3:4092 -6606:3:4093 -6607:3:4097 -6608:3:4101 -6609:3:4102 -6610:3:4097 -6611:3:4101 -6612:3:4102 -6613:3:4106 -6614:3:4114 -6615:3:4115 -6616:3:4120 -6617:3:4127 -6618:3:4128 -6619:3:4127 -6620:3:4128 -6621:3:4135 -6622:3:4140 -6623:0:4365 -6624:3:4151 -6625:0:4365 -6626:3:4155 -6627:3:4156 -6628:3:4160 -6629:3:4164 -6630:3:4165 -6631:3:4160 -6632:3:4164 -6633:3:4165 -6634:3:4169 -6635:3:4177 -6636:3:4178 -6637:3:4183 -6638:3:4190 -6639:3:4191 -6640:3:4190 -6641:3:4191 -6642:3:4198 -6643:3:4203 -6644:0:4365 -6645:3:4151 -6646:0:4365 -6647:3:4155 -6648:3:4156 -6649:3:4160 -6650:3:4164 -6651:3:4165 -6652:3:4160 -6653:3:4164 -6654:3:4165 -6655:3:4169 -6656:3:4177 -6657:3:4178 -6658:3:4183 -6659:3:4190 -6660:3:4191 -6661:3:4190 -6662:3:4191 -6663:3:4198 -6664:3:4203 -6665:0:4365 -6666:3:4214 -6667:0:4365 -6668:3:4222 -6669:3:4223 -6670:3:4227 -6671:3:4231 -6672:3:4232 -6673:3:4227 -6674:3:4231 -6675:3:4232 -6676:3:4236 -6677:3:4244 -6678:3:4245 -6679:3:4250 -6680:3:4257 -6681:3:4258 -6682:3:4257 -6683:3:4258 -6684:3:4265 -6685:3:4270 -6686:0:4365 -6687:3:4285 -6688:0:4365 -6689:3:4286 -6690:0:4365 -6691:2:1173 -6692:0:4365 -6693:3:4287 -6694:0:4365 -6695:2:1179 -6696:0:4365 -6697:2:1180 -6698:0:4365 -6699:3:4286 -6700:0:4365 -6701:2:1181 -6702:2:1185 -6703:2:1186 -6704:2:1194 -6705:2:1195 -6706:2:1199 -6707:2:1200 -6708:2:1194 -6709:2:1195 -6710:2:1199 -6711:2:1200 -6712:2:1208 -6713:2:1213 -6714:2:1217 -6715:2:1218 -6716:2:1225 -6717:2:1226 -6718:2:1237 -6719:2:1238 -6720:2:1239 -6721:2:1237 -6722:2:1238 -6723:2:1239 -6724:2:1250 -6725:2:1255 -6726:2:1256 -6727:0:4365 -6728:3:4287 -6729:0:4365 -6730:2:1268 -6731:0:4365 -6732:3:4286 -6733:0:4365 -6734:2:1270 -6735:0:4365 -6736:3:4287 -6737:0:4365 -6738:2:1271 -6739:2:1275 -6740:2:1276 -6741:2:1284 -6742:2:1285 -6743:2:1289 -6744:2:1290 -6745:2:1284 -6746:2:1285 -6747:2:1289 -6748:2:1290 -6749:2:1298 -6750:2:1303 -6751:2:1307 -6752:2:1308 -6753:2:1315 -6754:2:1316 -6755:2:1327 -6756:2:1328 -6757:2:1329 -6758:2:1327 -6759:2:1328 -6760:2:1329 -6761:2:1340 -6762:2:1345 -6763:2:1346 -6764:0:4365 -6765:2:1358 -6766:0:4365 -6767:2:1360 -6768:0:4365 -6769:3:4286 -6770:0:4365 -6771:2:1361 -6772:0:4365 -6773:3:4287 -6774:0:4365 -6775:2:1362 -6776:2:1366 -6777:2:1367 -6778:2:1375 -6779:2:1376 -6780:2:1380 -6781:2:1381 -6782:2:1375 -6783:2:1376 -6784:2:1380 -6785:2:1381 -6786:2:1389 -6787:2:1394 -6788:2:1398 -6789:2:1399 -6790:2:1406 -6791:2:1407 -6792:2:1418 -6793:2:1419 -6794:2:1420 -6795:2:1418 -6796:2:1419 -6797:2:1420 -6798:2:1431 -6799:2:1436 -6800:2:1437 -6801:0:4365 -6802:2:1449 -6803:0:4365 -6804:3:4286 -6805:0:4365 -6806:2:1451 -6807:0:4365 -6808:3:4287 -6809:0:4365 -6810:2:1652 -6811:0:4365 -6812:2:1653 -6813:0:4365 -6814:2:1657 -6815:0:4365 -6816:2:1180 -6817:0:4365 -6818:3:4286 -6819:0:4365 -6820:2:1181 -6821:2:1185 -6822:2:1186 -6823:2:1194 -6824:2:1195 -6825:2:1199 -6826:2:1200 -6827:2:1194 -6828:2:1195 -6829:2:1196 -6830:2:1208 -6831:2:1213 -6832:2:1217 -6833:2:1218 -6834:2:1225 -6835:2:1226 -6836:2:1237 -6837:2:1238 -6838:2:1239 -6839:2:1237 -6840:2:1238 -6841:2:1239 -6842:2:1250 -6843:2:1255 -6844:2:1256 -6845:0:4365 -6846:3:4287 -6847:0:4365 -6848:2:1268 -6849:0:4365 -6850:3:4286 -6851:0:4365 -6852:2:1270 -6853:0:4365 -6854:3:4287 -6855:0:4365 -6856:2:1271 -6857:2:1275 -6858:2:1276 -6859:2:1284 -6860:2:1285 -6861:2:1289 -6862:2:1290 -6863:2:1284 -6864:2:1285 -6865:2:1289 -6866:2:1290 -6867:2:1298 -6868:2:1303 -6869:2:1307 -6870:2:1308 -6871:2:1315 -6872:2:1316 -6873:2:1327 -6874:2:1328 -6875:2:1329 -6876:2:1327 -6877:2:1328 -6878:2:1329 -6879:2:1340 -6880:2:1345 -6881:2:1346 -6882:0:4365 -6883:2:1358 -6884:0:4365 -6885:2:1454 -6886:0:4365 -6887:3:4286 -6888:0:4365 -6889:2:1455 -6890:0:4365 -6891:3:4287 -6892:0:4365 -6893:2:1652 -6894:0:4365 -6895:2:1653 -6896:0:4365 -6897:2:1657 -6898:0:4365 -6899:2:1660 -6900:0:4365 -6901:3:4286 -6902:0:4365 -6903:2:1665 -6904:2:1669 -6905:2:1670 -6906:2:1678 -6907:2:1679 -6908:2:1683 -6909:2:1684 -6910:2:1678 -6911:2:1679 -6912:2:1680 -6913:2:1692 -6914:2:1697 -6915:2:1701 -6916:2:1702 -6917:2:1709 -6918:2:1710 -6919:2:1721 -6920:2:1722 -6921:2:1723 -6922:2:1721 -6923:2:1722 -6924:2:1723 -6925:2:1734 -6926:2:1739 -6927:2:1740 -6928:0:4365 -6929:3:4287 -6930:0:4365 -6931:2:1752 -6932:0:4365 -6933:3:4286 -6934:0:4365 -6935:2:1754 -6936:0:4365 -6937:3:4287 -6938:0:4365 -6939:2:1755 -6940:2:1759 -6941:2:1760 -6942:2:1768 -6943:2:1769 -6944:2:1773 -6945:2:1774 -6946:2:1768 -6947:2:1769 -6948:2:1773 -6949:2:1774 -6950:2:1782 -6951:2:1787 -6952:2:1791 -6953:2:1792 -6954:2:1799 -6955:2:1800 -6956:2:1811 -6957:2:1812 -6958:2:1813 -6959:2:1811 -6960:2:1812 -6961:2:1813 -6962:2:1824 -6963:2:1829 -6964:2:1830 -6965:0:4365 -6966:2:1842 -6967:0:4365 -6968:3:4286 -6969:0:4365 -6970:2:1844 -6971:0:4365 -6972:3:4287 -6973:0:4365 -6974:2:1845 -6975:2:1849 -6976:2:1850 -6977:2:1858 -6978:2:1859 -6979:2:1863 -6980:2:1864 -6981:2:1858 -6982:2:1859 -6983:2:1863 -6984:2:1864 -6985:2:1872 -6986:2:1877 -6987:2:1881 -6988:2:1882 -6989:2:1889 -6990:2:1890 -6991:2:1901 -6992:2:1902 -6993:2:1903 -6994:2:1901 -6995:2:1902 -6996:2:1903 -6997:2:1914 -6998:2:1919 -6999:2:1920 -7000:0:4365 -7001:2:1932 -7002:0:4365 -7003:3:4286 -7004:0:4365 -7005:2:1934 -7006:0:4365 -7007:3:4287 -7008:0:4365 -7009:2:1935 -7010:0:4365 -7011:2:1936 -7012:0:4365 -7013:2:2129 -7014:0:4365 -7015:2:2130 -7016:0:4365 -7017:2:2134 -7018:0:4365 -7019:3:4286 -7020:0:4365 -7021:2:2136 -7022:0:4365 -7023:3:4287 -7024:0:4365 -7025:2:2137 -7026:2:2141 -7027:2:2142 -7028:2:2150 -7029:2:2151 -7030:2:2155 -7031:2:2156 -7032:2:2150 -7033:2:2151 -7034:2:2155 -7035:2:2156 -7036:2:2164 -7037:2:2169 -7038:2:2173 -7039:2:2174 -7040:2:2181 -7041:2:2182 -7042:2:2193 -7043:2:2194 -7044:2:2195 -7045:2:2193 -7046:2:2194 -7047:2:2195 -7048:2:2206 -7049:2:2211 -7050:2:2212 -7051:0:4365 -7052:2:2224 -7053:0:4365 -7054:3:4286 -7055:0:4365 -7056:2:2226 -7057:0:4365 -7058:3:4287 -7059:0:4365 -7060:2:1936 -7061:0:4365 -7062:2:2129 -7063:0:4365 -7064:2:2130 -7065:0:4365 -7066:2:2134 -7067:0:4365 -7068:3:4286 -7069:0:4365 -7070:2:2136 -7071:0:4365 -7072:3:4287 -7073:0:4365 -7074:2:2137 -7075:2:2141 -7076:2:2142 -7077:2:2150 -7078:2:2151 -7079:2:2155 -7080:2:2156 -7081:2:2150 -7082:2:2151 -7083:2:2152 -7084:2:2164 -7085:2:2169 -7086:2:2173 -7087:2:2174 -7088:2:2181 -7089:2:2182 -7090:2:2193 -7091:2:2194 -7092:2:2195 -7093:2:2193 -7094:2:2194 -7095:2:2195 -7096:2:2206 -7097:2:2211 -7098:2:2212 -7099:0:4365 -7100:2:2224 -7101:0:4365 -7102:3:4286 -7103:0:4365 -7104:2:2226 -7105:0:4365 -7106:3:4287 -7107:0:4365 -7108:2:2230 -7109:0:4365 -7110:3:4286 -7111:0:4365 -7112:2:2235 -7113:2:2239 -7114:2:2240 -7115:2:2248 -7116:2:2249 -7117:2:2253 -7118:2:2254 -7119:2:2248 -7120:2:2249 -7121:2:2250 -7122:2:2262 -7123:2:2267 -7124:2:2271 -7125:2:2272 -7126:2:2279 -7127:2:2280 -7128:2:2291 -7129:2:2292 -7130:2:2293 -7131:2:2291 -7132:2:2292 -7133:2:2293 -7134:2:2304 -7135:2:2309 -7136:2:2310 -7137:0:4365 -7138:3:4287 -7139:0:4365 -7140:2:2322 -7141:0:4365 -7142:2:1169 -7143:0:4365 -7144:3:4286 -7145:0:4365 -7146:2:1170 -7147:0:4365 -7148:3:4287 -7149:0:4365 -7150:3:4288 -7151:0:4365 -7152:3:4294 -7153:0:4365 -7154:3:4295 -7155:0:4365 -7156:3:2338 -7157:0:4365 -7158:3:2339 -7159:3:2343 -7160:3:2344 -7161:3:2352 -7162:3:2353 -7163:3:2357 -7164:3:2358 -7165:3:2352 -7166:3:2353 -7167:3:2357 -7168:3:2358 -7169:3:2366 -7170:3:2371 -7171:3:2375 -7172:3:2376 -7173:3:2383 -7174:3:2384 -7175:3:2395 -7176:3:2396 -7177:3:2397 -7178:3:2395 -7179:3:2396 -7180:3:2397 -7181:3:2408 -7182:3:2413 -7183:3:2414 -7184:0:4365 -7185:3:2426 -7186:0:4365 -7187:3:2427 -7188:0:4365 -7189:2:1173 -7190:0:4365 -7191:3:2428 -7192:0:4365 -7193:2:1179 -7194:0:4365 -7195:2:1180 -7196:0:4365 -7197:3:2427 -7198:0:4365 -7199:2:1181 -7200:2:1185 -7201:2:1186 -7202:2:1194 -7203:2:1195 -7204:2:1199 -7205:2:1200 -7206:2:1194 -7207:2:1195 -7208:2:1199 -7209:2:1200 -7210:2:1208 -7211:2:1213 -7212:2:1217 -7213:2:1218 -7214:2:1225 -7215:2:1226 -7216:2:1237 -7217:2:1238 -7218:2:1239 -7219:2:1237 -7220:2:1238 -7221:2:1239 -7222:2:1250 -7223:2:1255 -7224:2:1256 -7225:0:4365 -7226:3:2428 -7227:0:4365 -7228:2:1268 -7229:0:4365 -7230:3:2427 -7231:0:4365 -7232:2:1270 -7233:0:4365 -7234:3:2428 -7235:0:4365 -7236:2:1271 -7237:2:1275 -7238:2:1276 -7239:2:1284 -7240:2:1285 -7241:2:1289 -7242:2:1290 -7243:2:1284 -7244:2:1285 -7245:2:1289 -7246:2:1290 -7247:2:1298 -7248:2:1303 -7249:2:1307 -7250:2:1308 -7251:2:1315 -7252:2:1316 -7253:2:1327 -7254:2:1328 -7255:2:1329 -7256:2:1327 -7257:2:1328 -7258:2:1329 -7259:2:1340 -7260:2:1345 -7261:2:1346 -7262:0:4365 -7263:2:1358 -7264:0:4365 -7265:2:1360 -7266:0:4365 -7267:3:2427 -7268:0:4365 -7269:2:1361 -7270:0:4365 -7271:3:2428 -7272:0:4365 -7273:2:1362 -7274:2:1366 -7275:2:1367 -7276:2:1375 -7277:2:1376 -7278:2:1380 -7279:2:1381 -7280:2:1375 -7281:2:1376 -7282:2:1380 -7283:2:1381 -7284:2:1389 -7285:2:1394 -7286:2:1398 -7287:2:1399 -7288:2:1406 -7289:2:1407 -7290:2:1418 -7291:2:1419 -7292:2:1420 -7293:2:1418 -7294:2:1419 -7295:2:1420 -7296:2:1431 -7297:2:1436 -7298:2:1437 -7299:0:4365 -7300:2:1449 -7301:0:4365 -7302:3:2427 -7303:0:4365 -7304:2:1451 -7305:0:4365 -7306:3:2428 -7307:0:4365 -7308:2:1652 -7309:0:4365 -7310:2:1653 -7311:0:4365 -7312:2:1657 -7313:0:4365 -7314:2:1180 -7315:0:4365 -7316:3:2427 -7317:0:4365 -7318:2:1181 -7319:2:1185 -7320:2:1186 -7321:2:1194 -7322:2:1195 -7323:2:1199 -7324:2:1200 -7325:2:1194 -7326:2:1195 -7327:2:1196 -7328:2:1208 -7329:2:1213 -7330:2:1217 -7331:2:1218 -7332:2:1225 -7333:2:1226 -7334:2:1237 -7335:2:1238 -7336:2:1239 -7337:2:1237 -7338:2:1238 -7339:2:1239 -7340:2:1250 -7341:2:1255 -7342:2:1256 -7343:0:4365 -7344:3:2428 -7345:0:4365 -7346:2:1268 -7347:0:4365 -7348:3:2427 -7349:0:4365 -7350:2:1270 -7351:0:4365 -7352:3:2428 -7353:0:4365 -7354:2:1271 -7355:2:1275 -7356:2:1276 -7357:2:1284 -7358:2:1285 -7359:2:1289 -7360:2:1290 -7361:2:1284 -7362:2:1285 -7363:2:1289 -7364:2:1290 -7365:2:1298 -7366:2:1303 -7367:2:1307 -7368:2:1308 -7369:2:1315 -7370:2:1316 -7371:2:1327 -7372:2:1328 -7373:2:1329 -7374:2:1327 -7375:2:1328 -7376:2:1329 -7377:2:1340 -7378:2:1345 -7379:2:1346 -7380:0:4365 -7381:2:1358 -7382:0:4365 -7383:2:1454 -7384:0:4365 -7385:3:2427 -7386:0:4365 -7387:2:1455 -7388:0:4365 -7389:3:2428 -7390:0:4365 -7391:2:1652 -7392:0:4365 -7393:2:1653 -7394:0:4365 -7395:2:1657 -7396:0:4365 -7397:2:1660 -7398:0:4365 -7399:3:2427 -7400:0:4365 -7401:2:1665 -7402:2:1669 -7403:2:1670 -7404:2:1678 -7405:2:1679 -7406:2:1683 -7407:2:1684 -7408:2:1678 -7409:2:1679 -7410:2:1680 -7411:2:1692 -7412:2:1697 -7413:2:1701 -7414:2:1702 -7415:2:1709 -7416:2:1710 -7417:2:1721 -7418:2:1722 -7419:2:1723 -7420:2:1721 -7421:2:1722 -7422:2:1723 -7423:2:1734 -7424:2:1739 -7425:2:1740 -7426:0:4365 -7427:3:2428 -7428:0:4365 -7429:2:1752 -7430:0:4365 -7431:3:2427 -7432:0:4365 -7433:2:1754 -7434:0:4365 -7435:3:2428 -7436:0:4365 -7437:2:1755 -7438:2:1759 -7439:2:1760 -7440:2:1768 -7441:2:1769 -7442:2:1773 -7443:2:1774 -7444:2:1768 -7445:2:1769 -7446:2:1773 -7447:2:1774 -7448:2:1782 -7449:2:1787 -7450:2:1791 -7451:2:1792 -7452:2:1799 -7453:2:1800 -7454:2:1811 -7455:2:1812 -7456:2:1813 -7457:2:1811 -7458:2:1812 -7459:2:1813 -7460:2:1824 -7461:2:1829 -7462:2:1830 -7463:0:4365 -7464:2:1842 -7465:0:4365 -7466:3:2427 -7467:0:4365 -7468:2:1844 -7469:0:4365 -7470:3:2428 -7471:0:4365 -7472:2:1845 -7473:2:1849 -7474:2:1850 -7475:2:1858 -7476:2:1859 -7477:2:1863 -7478:2:1864 -7479:2:1858 -7480:2:1859 -7481:2:1863 -7482:2:1864 -7483:2:1872 -7484:2:1877 -7485:2:1881 -7486:2:1882 -7487:2:1889 -7488:2:1890 -7489:2:1901 -7490:2:1902 -7491:2:1903 -7492:2:1901 -7493:2:1902 -7494:2:1903 -7495:2:1914 -7496:2:1919 -7497:2:1920 -7498:0:4365 -7499:2:1932 -7500:0:4365 -7501:3:2427 -7502:0:4365 -7503:2:1934 -7504:0:4365 -7505:3:2428 -7506:0:4365 -7507:2:1935 -7508:0:4365 -7509:2:1936 -7510:0:4365 -7511:2:2129 -7512:0:4365 -7513:2:2130 -7514:0:4365 -7515:2:2134 -7516:0:4365 -7517:3:2427 -7518:0:4365 -7519:2:2136 -7520:0:4365 -7521:3:2428 -7522:0:4365 -7523:2:2137 -7524:2:2141 -7525:2:2142 -7526:2:2150 -7527:2:2151 -7528:2:2155 -7529:2:2156 -7530:2:2150 -7531:2:2151 -7532:2:2155 -7533:2:2156 -7534:2:2164 -7535:2:2169 -7536:2:2173 -7537:2:2174 -7538:2:2181 -7539:2:2182 -7540:2:2193 -7541:2:2194 -7542:2:2195 -7543:2:2193 -7544:2:2194 -7545:2:2195 -7546:2:2206 -7547:2:2211 -7548:2:2212 -7549:0:4365 -7550:2:2224 -7551:0:4365 -7552:3:2427 -7553:0:4365 -7554:2:2226 -7555:0:4365 -7556:3:2428 -7557:0:4365 -7558:2:1936 -7559:0:4365 -7560:2:2129 -7561:0:4365 -7562:2:2130 -7563:0:4365 -7564:2:2134 -7565:0:4365 -7566:3:2427 -7567:0:4365 -7568:2:2136 -7569:0:4365 -7570:3:2428 -7571:0:4365 -7572:2:2137 -7573:2:2141 -7574:2:2142 -7575:2:2150 -7576:2:2151 -7577:2:2155 -7578:2:2156 -7579:2:2150 -7580:2:2151 -7581:2:2152 -7582:2:2164 -7583:2:2169 -7584:2:2173 -7585:2:2174 -7586:2:2181 -7587:2:2182 -7588:2:2193 -7589:2:2194 -7590:2:2195 -7591:2:2193 -7592:2:2194 -7593:2:2195 -7594:2:2206 -7595:2:2211 -7596:2:2212 -7597:0:4365 -7598:2:2224 -7599:0:4365 -7600:3:2427 -7601:0:4365 -7602:2:2226 -7603:0:4365 -7604:3:2428 -7605:0:4365 -7606:2:2230 -7607:0:4365 -7608:3:2427 -7609:0:4365 -7610:2:2235 -7611:2:2239 -7612:2:2240 -7613:2:2248 -7614:2:2249 -7615:2:2253 -7616:2:2254 -7617:2:2248 -7618:2:2249 -7619:2:2250 -7620:2:2262 -7621:2:2267 -7622:2:2271 -7623:2:2272 -7624:2:2279 -7625:2:2280 -7626:2:2291 -7627:2:2292 -7628:2:2293 -7629:2:2291 -7630:2:2292 -7631:2:2293 -7632:2:2304 -7633:2:2309 -7634:2:2310 -7635:0:4365 -7636:3:2428 -7637:0:4365 -7638:2:2322 -7639:0:4365 -7640:2:1169 -7641:0:4365 -7642:3:2427 -7643:0:4365 -7644:2:1170 -7645:0:4365 -7646:3:2428 -7647:0:4365 -7648:3:2429 -7649:0:4365 -7650:3:2435 -7651:3:2436 -7652:0:4365 -7653:3:2440 -7654:3:2444 -7655:3:2445 -7656:3:2453 -7657:3:2454 -7658:3:2458 -7659:3:2459 -7660:3:2453 -7661:3:2454 -7662:3:2458 -7663:3:2459 -7664:3:2467 -7665:3:2472 -7666:3:2473 -7667:3:2484 -7668:3:2485 -7669:3:2496 -7670:3:2497 -7671:3:2498 -7672:3:2496 -7673:3:2497 -7674:3:2498 -7675:3:2509 -7676:3:2514 -7677:3:2515 -7678:0:4365 -7679:3:2527 -7680:0:4365 -7681:3:2528 -7682:0:4365 -7683:2:1173 -7684:0:4365 -7685:3:2529 -7686:0:4365 -7687:2:1179 -7688:0:4365 -7689:2:1180 -7690:0:4365 -7691:3:2528 -7692:0:4365 -7693:2:1181 -7694:2:1185 -7695:2:1186 -7696:2:1194 -7697:2:1195 -7698:2:1199 -7699:2:1200 -7700:2:1194 -7701:2:1195 -7702:2:1199 -7703:2:1200 -7704:2:1208 -7705:2:1213 -7706:2:1217 -7707:2:1218 -7708:2:1225 -7709:2:1226 -7710:2:1237 -7711:2:1238 -7712:2:1239 -7713:2:1237 -7714:2:1238 -7715:2:1239 -7716:2:1250 -7717:2:1255 -7718:2:1256 -7719:0:4365 -7720:3:2529 -7721:0:4365 -7722:2:1268 -7723:0:4365 -7724:3:2528 -7725:0:4365 -7726:2:1270 -7727:0:4365 -7728:3:2529 -7729:0:4365 -7730:2:1271 -7731:2:1275 -7732:2:1276 -7733:2:1284 -7734:2:1285 -7735:2:1289 -7736:2:1290 -7737:2:1284 -7738:2:1285 -7739:2:1289 -7740:2:1290 -7741:2:1298 -7742:2:1303 -7743:2:1307 -7744:2:1308 -7745:2:1315 -7746:2:1316 -7747:2:1327 -7748:2:1328 -7749:2:1329 -7750:2:1327 -7751:2:1328 -7752:2:1329 -7753:2:1340 -7754:2:1345 -7755:2:1346 -7756:0:4365 -7757:2:1358 -7758:0:4365 -7759:2:1360 -7760:0:4365 -7761:3:2528 -7762:0:4365 -7763:2:1361 -7764:0:4365 -7765:3:2529 -7766:0:4365 -7767:2:1362 -7768:2:1366 -7769:2:1367 -7770:2:1375 -7771:2:1376 -7772:2:1380 -7773:2:1381 -7774:2:1375 -7775:2:1376 -7776:2:1380 -7777:2:1381 -7778:2:1389 -7779:2:1394 -7780:2:1398 -7781:2:1399 -7782:2:1406 -7783:2:1407 -7784:2:1418 -7785:2:1419 -7786:2:1420 -7787:2:1418 -7788:2:1419 -7789:2:1420 -7790:2:1431 -7791:2:1436 -7792:2:1437 -7793:0:4365 -7794:2:1449 -7795:0:4365 -7796:3:2528 -7797:0:4365 -7798:2:1451 -7799:0:4365 -7800:3:2529 -7801:0:4365 -7802:2:1652 -7803:0:4365 -7804:2:1653 -7805:0:4365 -7806:2:1657 -7807:0:4365 -7808:2:1180 -7809:0:4365 -7810:3:2528 -7811:0:4365 -7812:2:1181 -7813:2:1185 -7814:2:1186 -7815:2:1194 -7816:2:1195 -7817:2:1199 -7818:2:1200 -7819:2:1194 -7820:2:1195 -7821:2:1196 -7822:2:1208 -7823:2:1213 -7824:2:1217 -7825:2:1218 -7826:2:1225 -7827:2:1226 -7828:2:1237 -7829:2:1238 -7830:2:1239 -7831:2:1237 -7832:2:1238 -7833:2:1239 -7834:2:1250 -7835:2:1255 -7836:2:1256 -7837:0:4365 -7838:3:2529 -7839:0:4365 -7840:2:1268 -7841:0:4365 -7842:3:2528 -7843:0:4365 -7844:2:1270 -7845:0:4365 -7846:3:2529 -7847:0:4365 -7848:2:1271 -7849:2:1275 -7850:2:1276 -7851:2:1284 -7852:2:1285 -7853:2:1289 -7854:2:1290 -7855:2:1284 -7856:2:1285 -7857:2:1289 -7858:2:1290 -7859:2:1298 -7860:2:1303 -7861:2:1307 -7862:2:1308 -7863:2:1315 -7864:2:1316 -7865:2:1327 -7866:2:1328 -7867:2:1329 -7868:2:1327 -7869:2:1328 -7870:2:1329 -7871:2:1340 -7872:2:1345 -7873:2:1346 -7874:0:4365 -7875:2:1358 -7876:0:4365 -7877:2:1454 -7878:0:4365 -7879:3:2528 -7880:0:4365 -7881:2:1455 -7882:0:4365 -7883:3:2529 -7884:0:4365 -7885:2:1652 -7886:0:4365 -7887:2:1653 -7888:0:4365 -7889:2:1657 -7890:0:4365 -7891:2:1660 -7892:0:4365 -7893:3:2528 -7894:0:4365 -7895:2:1665 -7896:2:1669 -7897:2:1670 -7898:2:1678 -7899:2:1679 -7900:2:1683 -7901:2:1684 -7902:2:1678 -7903:2:1679 -7904:2:1680 -7905:2:1692 -7906:2:1697 -7907:2:1701 -7908:2:1702 -7909:2:1709 -7910:2:1710 -7911:2:1721 -7912:2:1722 -7913:2:1723 -7914:2:1721 -7915:2:1722 -7916:2:1723 -7917:2:1734 -7918:2:1739 -7919:2:1740 -7920:0:4365 -7921:3:2529 -7922:0:4365 -7923:2:1752 -7924:0:4365 -7925:3:2528 -7926:0:4365 -7927:2:1754 -7928:0:4365 -7929:3:2529 -7930:0:4365 -7931:2:1755 -7932:2:1759 -7933:2:1760 -7934:2:1768 -7935:2:1769 -7936:2:1773 -7937:2:1774 -7938:2:1768 -7939:2:1769 -7940:2:1773 -7941:2:1774 -7942:2:1782 -7943:2:1787 -7944:2:1791 -7945:2:1792 -7946:2:1799 -7947:2:1800 -7948:2:1811 -7949:2:1812 -7950:2:1813 -7951:2:1811 -7952:2:1812 -7953:2:1813 -7954:2:1824 -7955:2:1829 -7956:2:1830 -7957:0:4365 -7958:2:1842 -7959:0:4365 -7960:3:2528 -7961:0:4365 -7962:2:1844 -7963:0:4365 -7964:3:2529 -7965:0:4365 -7966:2:1845 -7967:2:1849 -7968:2:1850 -7969:2:1858 -7970:2:1859 -7971:2:1863 -7972:2:1864 -7973:2:1858 -7974:2:1859 -7975:2:1863 -7976:2:1864 -7977:2:1872 -7978:2:1877 -7979:2:1881 -7980:2:1882 -7981:2:1889 -7982:2:1890 -7983:2:1901 -7984:2:1902 -7985:2:1903 -7986:2:1901 -7987:2:1902 -7988:2:1903 -7989:2:1914 -7990:2:1919 -7991:2:1920 -7992:0:4365 -7993:2:1932 -7994:0:4365 -7995:3:2528 -7996:0:4365 -7997:2:1934 -7998:0:4365 -7999:3:2529 -8000:0:4365 -8001:2:1935 -8002:0:4365 -8003:2:1936 -8004:0:4365 -8005:2:2129 -8006:0:4365 -8007:2:2130 -8008:0:4365 -8009:2:2134 -8010:0:4365 -8011:3:2528 -8012:0:4365 -8013:2:2136 -8014:0:4365 -8015:3:2529 -8016:0:4365 -8017:2:2137 -8018:2:2141 -8019:2:2142 -8020:2:2150 -8021:2:2151 -8022:2:2155 -8023:2:2156 -8024:2:2150 -8025:2:2151 -8026:2:2155 -8027:2:2156 -8028:2:2164 -8029:2:2169 -8030:2:2173 -8031:2:2174 -8032:2:2181 -8033:2:2182 -8034:2:2193 -8035:2:2194 -8036:2:2195 -8037:2:2193 -8038:2:2194 -8039:2:2195 -8040:2:2206 -8041:2:2211 -8042:2:2212 -8043:0:4365 -8044:2:2224 -8045:0:4365 -8046:3:2528 -8047:0:4365 -8048:2:2226 -8049:0:4365 -8050:3:2529 -8051:0:4365 -8052:2:1936 -8053:0:4365 -8054:2:2129 -8055:0:4365 -8056:2:2130 -8057:0:4365 -8058:2:2134 -8059:0:4365 -8060:3:2528 -8061:0:4365 -8062:2:2136 -8063:0:4365 -8064:3:2529 -8065:0:4365 -8066:2:2137 -8067:2:2141 -8068:2:2142 -8069:2:2150 -8070:2:2151 -8071:2:2155 -8072:2:2156 -8073:2:2150 -8074:2:2151 -8075:2:2152 -8076:2:2164 -8077:2:2169 -8078:2:2173 -8079:2:2174 -8080:2:2181 -8081:2:2182 -8082:2:2193 -8083:2:2194 -8084:2:2195 -8085:2:2193 -8086:2:2194 -8087:2:2195 -8088:2:2206 -8089:2:2211 -8090:2:2212 -8091:0:4365 -8092:2:2224 -8093:0:4365 -8094:3:2528 -8095:0:4365 -8096:2:2226 -8097:0:4365 -8098:3:2529 -8099:0:4365 -8100:2:2230 -8101:0:4365 -8102:3:2528 -8103:0:4365 -8104:2:2235 -8105:2:2239 -8106:2:2240 -8107:2:2248 -8108:2:2249 -8109:2:2253 -8110:2:2254 -8111:2:2248 -8112:2:2249 -8113:2:2250 -8114:2:2262 -8115:2:2267 -8116:2:2271 -8117:2:2272 -8118:2:2279 -8119:2:2280 -8120:2:2291 -8121:2:2292 -8122:2:2293 -8123:2:2291 -8124:2:2292 -8125:2:2293 -8126:2:2304 -8127:2:2309 -8128:2:2310 -8129:0:4365 -8130:3:2529 -8131:0:4365 -8132:2:2322 -8133:0:4365 -8134:2:1169 -8135:0:4365 -8136:3:2528 -8137:0:4365 -8138:2:1170 -8139:0:4365 -8140:3:2529 -8141:0:4365 -8142:3:2530 -8143:0:4365 -8144:3:2536 -8145:0:4365 -8146:3:2537 -8147:0:4365 -8148:3:2547 -8149:0:4365 -8150:3:2548 -8151:0:4365 -8152:3:2552 -8153:3:2553 -8154:3:2557 -8155:3:2561 -8156:3:2562 -8157:3:2557 -8158:3:2561 -8159:3:2562 -8160:3:2566 -8161:3:2574 -8162:3:2575 -8163:3:2580 -8164:3:2587 -8165:3:2588 -8166:3:2587 -8167:3:2588 -8168:3:2595 -8169:3:2600 -8170:0:4365 -8171:3:2611 -8172:0:4365 -8173:3:2615 -8174:3:2616 -8175:3:2620 -8176:3:2624 -8177:3:2625 -8178:3:2620 -8179:3:2624 -8180:3:2625 -8181:3:2629 -8182:3:2637 -8183:3:2638 -8184:3:2643 -8185:3:2650 -8186:3:2651 -8187:3:2650 -8188:3:2651 -8189:3:2658 -8190:3:2663 -8191:0:4365 -8192:3:2611 -8193:0:4365 -8194:3:2615 -8195:3:2616 -8196:3:2620 -8197:3:2624 -8198:3:2625 -8199:3:2620 -8200:3:2624 -8201:3:2625 -8202:3:2629 -8203:3:2637 -8204:3:2638 -8205:3:2643 -8206:3:2650 -8207:3:2651 -8208:3:2650 -8209:3:2651 -8210:3:2658 -8211:3:2663 -8212:0:4365 -8213:3:2674 -8214:0:4365 -8215:3:2682 -8216:3:2683 -8217:3:2687 -8218:3:2691 -8219:3:2692 -8220:3:2687 -8221:3:2691 -8222:3:2692 -8223:3:2696 -8224:3:2704 -8225:3:2705 -8226:3:2710 -8227:3:2717 -8228:3:2718 -8229:3:2717 -8230:3:2718 -8231:3:2725 -8232:3:2730 -8233:0:4365 -8234:3:2745 -8235:0:4365 -8236:3:2746 -8237:0:4365 -8238:2:1173 -8239:0:4365 -8240:3:2747 -8241:0:4365 -8242:2:1179 -8243:0:4365 -8244:2:1180 -8245:0:4365 -8246:3:2746 -8247:0:4365 -8248:2:1181 -8249:2:1185 -8250:2:1186 -8251:2:1194 -8252:2:1195 -8253:2:1199 -8254:2:1200 -8255:2:1194 -8256:2:1195 -8257:2:1199 -8258:2:1200 -8259:2:1208 -8260:2:1213 -8261:2:1217 -8262:2:1218 -8263:2:1225 -8264:2:1226 -8265:2:1237 -8266:2:1238 -8267:2:1239 -8268:2:1237 -8269:2:1238 -8270:2:1239 -8271:2:1250 -8272:2:1255 -8273:2:1256 -8274:0:4365 -8275:3:2747 -8276:0:4365 -8277:2:1268 -8278:0:4365 -8279:3:2746 -8280:0:4365 -8281:2:1270 -8282:0:4365 -8283:3:2747 -8284:0:4365 -8285:2:1271 -8286:2:1275 -8287:2:1276 -8288:2:1284 -8289:2:1285 -8290:2:1289 -8291:2:1290 -8292:2:1284 -8293:2:1285 -8294:2:1289 -8295:2:1290 -8296:2:1298 -8297:2:1303 -8298:2:1307 -8299:2:1308 -8300:2:1315 -8301:2:1316 -8302:2:1327 -8303:2:1328 -8304:2:1329 -8305:2:1327 -8306:2:1328 -8307:2:1329 -8308:2:1340 -8309:2:1345 -8310:2:1346 -8311:0:4365 -8312:2:1358 -8313:0:4365 -8314:2:1360 -8315:0:4365 -8316:3:2746 -8317:0:4365 -8318:2:1361 -8319:0:4365 -8320:3:2747 -8321:0:4365 -8322:2:1362 -8323:2:1366 -8324:2:1367 -8325:2:1375 -8326:2:1376 -8327:2:1380 -8328:2:1381 -8329:2:1375 -8330:2:1376 -8331:2:1380 -8332:2:1381 -8333:2:1389 -8334:2:1394 -8335:2:1398 -8336:2:1399 -8337:2:1406 -8338:2:1407 -8339:2:1418 -8340:2:1419 -8341:2:1420 -8342:2:1418 -8343:2:1419 -8344:2:1420 -8345:2:1431 -8346:2:1436 -8347:2:1437 -8348:0:4365 -8349:2:1449 -8350:0:4365 -8351:3:2746 -8352:0:4365 -8353:2:1451 -8354:0:4365 -8355:3:2747 -8356:0:4365 -8357:2:1652 -8358:0:4365 -8359:2:1653 -8360:0:4365 -8361:2:1657 -8362:0:4365 -8363:2:1180 -8364:0:4365 -8365:3:2746 -8366:0:4365 -8367:2:1181 -8368:2:1185 -8369:2:1186 -8370:2:1194 -8371:2:1195 -8372:2:1199 -8373:2:1200 -8374:2:1194 -8375:2:1195 -8376:2:1196 -8377:2:1208 -8378:2:1213 -8379:2:1217 -8380:2:1218 -8381:2:1225 -8382:2:1226 -8383:2:1237 -8384:2:1238 -8385:2:1239 -8386:2:1237 -8387:2:1238 -8388:2:1239 -8389:2:1250 -8390:2:1255 -8391:2:1256 -8392:0:4365 -8393:3:2747 -8394:0:4365 -8395:2:1268 -8396:0:4365 -8397:3:2746 -8398:0:4365 -8399:2:1270 -8400:0:4365 -8401:3:2747 -8402:0:4365 -8403:2:1271 -8404:2:1275 -8405:2:1276 -8406:2:1284 -8407:2:1285 -8408:2:1289 -8409:2:1290 -8410:2:1284 -8411:2:1285 -8412:2:1289 -8413:2:1290 -8414:2:1298 -8415:2:1303 -8416:2:1307 -8417:2:1308 -8418:2:1315 -8419:2:1316 -8420:2:1327 -8421:2:1328 -8422:2:1329 -8423:2:1327 -8424:2:1328 -8425:2:1329 -8426:2:1340 -8427:2:1345 -8428:2:1346 -8429:0:4365 -8430:2:1358 -8431:0:4365 -8432:2:1454 -8433:0:4365 -8434:3:2746 -8435:0:4365 -8436:2:1455 -8437:0:4365 -8438:3:2747 -8439:0:4365 -8440:2:1652 -8441:0:4365 -8442:2:1653 -8443:0:4365 -8444:2:1657 -8445:0:4365 -8446:2:1660 -8447:0:4365 -8448:3:2746 -8449:0:4365 -8450:2:1665 -8451:2:1669 -8452:2:1670 -8453:2:1678 -8454:2:1679 -8455:2:1683 -8456:2:1684 -8457:2:1678 -8458:2:1679 -8459:2:1680 -8460:2:1692 -8461:2:1697 -8462:2:1701 -8463:2:1702 -8464:2:1709 -8465:2:1710 -8466:2:1721 -8467:2:1722 -8468:2:1723 -8469:2:1721 -8470:2:1722 -8471:2:1723 -8472:2:1734 -8473:2:1739 -8474:2:1740 -8475:0:4365 -8476:3:2747 -8477:0:4365 -8478:2:1752 -8479:0:4365 -8480:3:2746 -8481:0:4365 -8482:2:1754 -8483:0:4365 -8484:3:2747 -8485:0:4365 -8486:2:1755 -8487:2:1759 -8488:2:1760 -8489:2:1768 -8490:2:1769 -8491:2:1773 -8492:2:1774 -8493:2:1768 -8494:2:1769 -8495:2:1773 -8496:2:1774 -8497:2:1782 -8498:2:1787 -8499:2:1791 -8500:2:1792 -8501:2:1799 -8502:2:1800 -8503:2:1811 -8504:2:1812 -8505:2:1813 -8506:2:1811 -8507:2:1812 -8508:2:1813 -8509:2:1824 -8510:2:1829 -8511:2:1830 -8512:0:4365 -8513:2:1842 -8514:0:4365 -8515:3:2746 -8516:0:4365 -8517:2:1844 -8518:0:4365 -8519:3:2747 -8520:0:4365 -8521:2:1845 -8522:2:1849 -8523:2:1850 -8524:2:1858 -8525:2:1859 -8526:2:1863 -8527:2:1864 -8528:2:1858 -8529:2:1859 -8530:2:1863 -8531:2:1864 -8532:2:1872 -8533:2:1877 -8534:2:1881 -8535:2:1882 -8536:2:1889 -8537:2:1890 -8538:2:1901 -8539:2:1902 -8540:2:1903 -8541:2:1901 -8542:2:1902 -8543:2:1903 -8544:2:1914 -8545:2:1919 -8546:2:1920 -8547:0:4365 -8548:2:1932 -8549:0:4365 -8550:3:2746 -8551:0:4365 -8552:2:1934 -8553:0:4365 -8554:3:2747 -8555:0:4365 -8556:2:1935 -8557:0:4365 -8558:2:1936 -8559:0:4365 -8560:2:2129 -8561:0:4365 -8562:2:2130 -8563:0:4365 -8564:2:2134 -8565:0:4365 -8566:3:2746 -8567:0:4365 -8568:2:2136 -8569:0:4365 -8570:3:2747 -8571:0:4365 -8572:2:2137 -8573:2:2141 -8574:2:2142 -8575:2:2150 -8576:2:2151 -8577:2:2155 -8578:2:2156 -8579:2:2150 -8580:2:2151 -8581:2:2155 -8582:2:2156 -8583:2:2164 -8584:2:2169 -8585:2:2173 -8586:2:2174 -8587:2:2181 -8588:2:2182 -8589:2:2193 -8590:2:2194 -8591:2:2195 -8592:2:2193 -8593:2:2194 -8594:2:2195 -8595:2:2206 -8596:2:2211 -8597:2:2212 -8598:0:4365 -8599:2:2224 -8600:0:4365 -8601:3:2746 -8602:0:4365 -8603:2:2226 -8604:0:4365 -8605:3:2747 -8606:0:4365 -8607:2:1936 -8608:0:4365 -8609:2:2129 -8610:0:4365 -8611:2:2130 -8612:0:4365 -8613:2:2134 -8614:0:4365 -8615:3:2746 -8616:0:4365 -8617:2:2136 -8618:0:4365 -8619:3:2747 -8620:0:4365 -8621:2:2137 -8622:2:2141 -8623:2:2142 -8624:2:2150 -8625:2:2151 -8626:2:2155 -8627:2:2156 -8628:2:2150 -8629:2:2151 -8630:2:2152 -8631:2:2164 -8632:2:2169 -8633:2:2173 -8634:2:2174 -8635:2:2181 -8636:2:2182 -8637:2:2193 -8638:2:2194 -8639:2:2195 -8640:2:2193 -8641:2:2194 -8642:2:2195 -8643:2:2206 -8644:2:2211 -8645:2:2212 -8646:0:4365 -8647:2:2224 -8648:0:4365 -8649:3:2746 -8650:0:4365 -8651:2:2226 -8652:0:4365 -8653:3:2747 -8654:0:4365 -8655:2:2230 -8656:0:4365 -8657:3:2746 -8658:0:4365 -8659:2:2235 -8660:2:2239 -8661:2:2240 -8662:2:2248 -8663:2:2249 -8664:2:2253 -8665:2:2254 -8666:2:2248 -8667:2:2249 -8668:2:2250 -8669:2:2262 -8670:2:2267 -8671:2:2271 -8672:2:2272 -8673:2:2279 -8674:2:2280 -8675:2:2291 -8676:2:2292 -8677:2:2293 -8678:2:2291 -8679:2:2292 -8680:2:2293 -8681:2:2304 -8682:2:2309 -8683:2:2310 -8684:0:4365 -8685:3:2747 -8686:0:4365 -8687:2:2322 -8688:0:4365 -8689:2:1169 -8690:0:4365 -8691:3:2746 -8692:0:4365 -8693:2:1170 -8694:0:4365 -8695:3:2747 -8696:0:4365 -8697:3:2748 -8698:0:4365 -8699:3:2754 -8700:0:4365 -8701:3:2755 -8702:3:2759 -8703:3:2760 -8704:3:2768 -8705:3:2769 -8706:3:2773 -8707:3:2774 -8708:3:2768 -8709:3:2769 -8710:3:2773 -8711:3:2774 -8712:3:2782 -8713:3:2787 -8714:3:2791 -8715:3:2792 -8716:3:2799 -8717:3:2800 -8718:3:2811 -8719:3:2812 -8720:3:2813 -8721:3:2811 -8722:3:2812 -8723:3:2813 -8724:3:2824 -8725:3:2829 -8726:3:2830 -8727:0:4365 -8728:3:2842 -8729:0:4365 -8730:3:2843 -8731:0:4365 -8732:2:1173 -8733:0:4365 -8734:3:2844 -8735:0:4365 -8736:2:1179 -8737:0:4365 -8738:2:1180 -8739:0:4365 -8740:3:2843 -8741:0:4365 -8742:2:1181 -8743:2:1185 -8744:2:1186 -8745:2:1194 -8746:2:1195 -8747:2:1199 -8748:2:1200 -8749:2:1194 -8750:2:1195 -8751:2:1199 -8752:2:1200 -8753:2:1208 -8754:2:1213 -8755:2:1217 -8756:2:1218 -8757:2:1225 -8758:2:1226 -8759:2:1237 -8760:2:1238 -8761:2:1239 -8762:2:1237 -8763:2:1238 -8764:2:1239 -8765:2:1250 -8766:2:1255 -8767:2:1256 -8768:0:4365 -8769:3:2844 -8770:0:4365 -8771:2:1268 -8772:0:4365 -8773:3:2843 -8774:0:4365 -8775:2:1270 -8776:0:4365 -8777:3:2844 -8778:0:4365 -8779:2:1271 -8780:2:1275 -8781:2:1276 -8782:2:1284 -8783:2:1285 -8784:2:1289 -8785:2:1290 -8786:2:1284 -8787:2:1285 -8788:2:1289 -8789:2:1290 -8790:2:1298 -8791:2:1303 -8792:2:1307 -8793:2:1308 -8794:2:1315 -8795:2:1316 -8796:2:1327 -8797:2:1328 -8798:2:1329 -8799:2:1327 -8800:2:1328 -8801:2:1329 -8802:2:1340 -8803:2:1345 -8804:2:1346 -8805:0:4365 -8806:2:1358 -8807:0:4365 -8808:2:1360 -8809:0:4365 -8810:3:2843 -8811:0:4365 -8812:2:1361 -8813:0:4365 -8814:3:2844 -8815:0:4365 -8816:2:1362 -8817:2:1366 -8818:2:1367 -8819:2:1375 -8820:2:1376 -8821:2:1380 -8822:2:1381 -8823:2:1375 -8824:2:1376 -8825:2:1380 -8826:2:1381 -8827:2:1389 -8828:2:1394 -8829:2:1398 -8830:2:1399 -8831:2:1406 -8832:2:1407 -8833:2:1418 -8834:2:1419 -8835:2:1420 -8836:2:1418 -8837:2:1419 -8838:2:1420 -8839:2:1431 -8840:2:1436 -8841:2:1437 -8842:0:4365 -8843:2:1449 -8844:0:4365 -8845:3:2843 -8846:0:4365 -8847:2:1451 -8848:0:4365 -8849:3:2844 -8850:0:4365 -8851:2:1652 -8852:0:4365 -8853:2:1653 -8854:0:4365 -8855:2:1657 -8856:0:4365 -8857:2:1180 -8858:0:4365 -8859:3:2843 -8860:0:4365 -8861:2:1181 -8862:2:1185 -8863:2:1186 -8864:2:1194 -8865:2:1195 -8866:2:1199 -8867:2:1200 -8868:2:1194 -8869:2:1195 -8870:2:1196 -8871:2:1208 -8872:2:1213 -8873:2:1217 -8874:2:1218 -8875:2:1225 -8876:2:1226 -8877:2:1237 -8878:2:1238 -8879:2:1239 -8880:2:1237 -8881:2:1238 -8882:2:1239 -8883:2:1250 -8884:2:1255 -8885:2:1256 -8886:0:4365 -8887:3:2844 -8888:0:4365 -8889:2:1268 -8890:0:4365 -8891:3:2843 -8892:0:4365 -8893:2:1270 -8894:0:4365 -8895:3:2844 -8896:0:4365 -8897:2:1271 -8898:2:1275 -8899:2:1276 -8900:2:1284 -8901:2:1285 -8902:2:1289 -8903:2:1290 -8904:2:1284 -8905:2:1285 -8906:2:1289 -8907:2:1290 -8908:2:1298 -8909:2:1303 -8910:2:1307 -8911:2:1308 -8912:2:1315 -8913:2:1316 -8914:2:1327 -8915:2:1328 -8916:2:1329 -8917:2:1327 -8918:2:1328 -8919:2:1329 -8920:2:1340 -8921:2:1345 -8922:2:1346 -8923:0:4365 -8924:2:1358 -8925:0:4365 -8926:2:1454 -8927:0:4365 -8928:3:2843 -8929:0:4365 -8930:2:1455 -8931:0:4365 -8932:3:2844 -8933:0:4365 -8934:2:1652 -8935:0:4365 -8936:2:1653 -8937:0:4365 -8938:2:1657 -8939:0:4365 -8940:2:1660 -8941:0:4365 -8942:3:2843 -8943:0:4365 -8944:2:1665 -8945:2:1669 -8946:2:1670 -8947:2:1678 -8948:2:1679 -8949:2:1683 -8950:2:1684 -8951:2:1678 -8952:2:1679 -8953:2:1680 -8954:2:1692 -8955:2:1697 -8956:2:1701 -8957:2:1702 -8958:2:1709 -8959:2:1710 -8960:2:1721 -8961:2:1722 -8962:2:1723 -8963:2:1721 -8964:2:1722 -8965:2:1723 -8966:2:1734 -8967:2:1739 -8968:2:1740 -8969:0:4365 -8970:3:2844 -8971:0:4365 -8972:2:1752 -8973:0:4365 -8974:3:2843 -8975:0:4365 -8976:2:1754 -8977:0:4365 -8978:3:2844 -8979:0:4365 -8980:2:1755 -8981:2:1759 -8982:2:1760 -8983:2:1768 -8984:2:1769 -8985:2:1773 -8986:2:1774 -8987:2:1768 -8988:2:1769 -8989:2:1773 -8990:2:1774 -8991:2:1782 -8992:2:1787 -8993:2:1791 -8994:2:1792 -8995:2:1799 -8996:2:1800 -8997:2:1811 -8998:2:1812 -8999:2:1813 -9000:2:1811 -9001:2:1812 -9002:2:1813 -9003:2:1824 -9004:2:1829 -9005:2:1830 -9006:0:4365 -9007:2:1842 -9008:0:4365 -9009:3:2843 -9010:0:4365 -9011:2:1844 -9012:0:4365 -9013:3:2844 -9014:0:4365 -9015:2:1845 -9016:2:1849 -9017:2:1850 -9018:2:1858 -9019:2:1859 -9020:2:1863 -9021:2:1864 -9022:2:1858 -9023:2:1859 -9024:2:1863 -9025:2:1864 -9026:2:1872 -9027:2:1877 -9028:2:1881 -9029:2:1882 -9030:2:1889 -9031:2:1890 -9032:2:1901 -9033:2:1902 -9034:2:1903 -9035:2:1901 -9036:2:1902 -9037:2:1903 -9038:2:1914 -9039:2:1919 -9040:2:1920 -9041:0:4365 -9042:2:1932 -9043:0:4365 -9044:3:2843 -9045:0:4365 -9046:2:1934 -9047:0:4365 -9048:3:2844 -9049:0:4365 -9050:2:1935 -9051:0:4365 -9052:2:1936 -9053:0:4365 -9054:2:2129 -9055:0:4365 -9056:2:2130 -9057:0:4365 -9058:2:2134 -9059:0:4365 -9060:3:2843 -9061:0:4365 -9062:2:2136 -9063:0:4365 -9064:3:2844 -9065:0:4365 -9066:2:2137 -9067:2:2141 -9068:2:2142 -9069:2:2150 -9070:2:2151 -9071:2:2155 -9072:2:2156 -9073:2:2150 -9074:2:2151 -9075:2:2155 -9076:2:2156 -9077:2:2164 -9078:2:2169 -9079:2:2173 -9080:2:2174 -9081:2:2181 -9082:2:2182 -9083:2:2193 -9084:2:2194 -9085:2:2195 -9086:2:2193 -9087:2:2194 -9088:2:2195 -9089:2:2206 -9090:2:2211 -9091:2:2212 -9092:0:4365 -9093:2:2224 -9094:0:4365 -9095:3:2843 -9096:0:4365 -9097:2:2226 -9098:0:4365 -9099:3:2844 -9100:0:4365 -9101:2:1936 -9102:0:4365 -9103:2:2129 -9104:0:4365 -9105:2:2130 -9106:0:4365 -9107:2:2134 -9108:0:4365 -9109:3:2843 -9110:0:4365 -9111:2:2136 -9112:0:4365 -9113:3:2844 -9114:0:4365 -9115:2:2137 -9116:2:2141 -9117:2:2142 -9118:2:2150 -9119:2:2151 -9120:2:2155 -9121:2:2156 -9122:2:2150 -9123:2:2151 -9124:2:2152 -9125:2:2164 -9126:2:2169 -9127:2:2173 -9128:2:2174 -9129:2:2181 -9130:2:2182 -9131:2:2193 -9132:2:2194 -9133:2:2195 -9134:2:2193 -9135:2:2194 -9136:2:2195 -9137:2:2206 -9138:2:2211 -9139:2:2212 -9140:0:4365 -9141:2:2224 -9142:0:4365 -9143:3:2843 -9144:0:4365 -9145:2:2226 -9146:0:4365 -9147:3:2844 -9148:0:4365 -9149:2:2230 -9150:0:4365 -9151:3:2843 -9152:0:4365 -9153:2:2235 -9154:2:2239 -9155:2:2240 -9156:2:2248 -9157:2:2249 -9158:2:2253 -9159:2:2254 -9160:2:2248 -9161:2:2249 -9162:2:2250 -9163:2:2262 -9164:2:2267 -9165:2:2271 -9166:2:2272 -9167:2:2279 -9168:2:2280 -9169:2:2291 -9170:2:2292 -9171:2:2293 -9172:2:2291 -9173:2:2292 -9174:2:2293 -9175:2:2304 -9176:2:2309 -9177:2:2310 -9178:0:4365 -9179:3:2844 -9180:0:4365 -9181:2:2322 -9182:0:4365 -9183:2:1169 -9184:0:4365 -9185:3:2843 -9186:0:4365 -9187:2:1170 -9188:0:4365 -9189:3:2844 -9190:0:4365 -9191:3:2845 -9192:0:4365 -9193:3:2851 -9194:0:4365 -9195:3:2854 -9196:3:2855 -9197:3:2867 -9198:3:2868 -9199:3:2872 -9200:3:2873 -9201:3:2867 -9202:3:2868 -9203:3:2872 -9204:3:2873 -9205:3:2881 -9206:3:2886 -9207:3:2890 -9208:3:2891 -9209:3:2898 -9210:3:2899 -9211:3:2910 -9212:3:2911 -9213:3:2912 -9214:3:2910 -9215:3:2911 -9216:3:2912 -9217:3:2923 -9218:3:2928 -9219:3:2929 -9220:0:4365 -9221:3:2941 -9222:0:4365 -9223:3:2942 -9224:0:4365 -9225:2:1173 -9226:0:4365 -9227:3:2943 -9228:0:4365 -9229:2:1179 -9230:0:4365 -9231:2:1180 -9232:0:4365 -9233:3:2942 -9234:0:4365 -9235:2:1181 -9236:2:1185 -9237:2:1186 -9238:2:1194 -9239:2:1195 -9240:2:1199 -9241:2:1200 -9242:2:1194 -9243:2:1195 -9244:2:1199 -9245:2:1200 -9246:2:1208 -9247:2:1213 -9248:2:1217 -9249:2:1218 -9250:2:1225 -9251:2:1226 -9252:2:1237 -9253:2:1238 -9254:2:1239 -9255:2:1237 -9256:2:1238 -9257:2:1239 -9258:2:1250 -9259:2:1255 -9260:2:1256 -9261:0:4365 -9262:3:2943 -9263:0:4365 -9264:2:1268 -9265:0:4365 -9266:3:2942 -9267:0:4365 -9268:2:1270 -9269:0:4365 -9270:3:2943 -9271:0:4365 -9272:2:1271 -9273:2:1275 -9274:2:1276 -9275:2:1284 -9276:2:1285 -9277:2:1289 -9278:2:1290 -9279:2:1284 -9280:2:1285 -9281:2:1289 -9282:2:1290 -9283:2:1298 -9284:2:1303 -9285:2:1307 -9286:2:1308 -9287:2:1315 -9288:2:1316 -9289:2:1327 -9290:2:1328 -9291:2:1329 -9292:2:1327 -9293:2:1328 -9294:2:1329 -9295:2:1340 -9296:2:1345 -9297:2:1346 -9298:0:4365 -9299:2:1358 -9300:0:4365 -9301:2:1360 -9302:0:4365 -9303:3:2942 -9304:0:4365 -9305:2:1361 -9306:0:4365 -9307:3:2943 -9308:0:4365 -9309:2:1362 -9310:2:1366 -9311:2:1367 -9312:2:1375 -9313:2:1376 -9314:2:1380 -9315:2:1381 -9316:2:1375 -9317:2:1376 -9318:2:1380 -9319:2:1381 -9320:2:1389 -9321:2:1394 -9322:2:1398 -9323:2:1399 -9324:2:1406 -9325:2:1407 -9326:2:1418 -9327:2:1419 -9328:2:1420 -9329:2:1418 -9330:2:1419 -9331:2:1420 -9332:2:1431 -9333:2:1436 -9334:2:1437 -9335:0:4365 -9336:2:1449 -9337:0:4365 -9338:3:2942 -9339:0:4365 -9340:2:1451 -9341:0:4365 -9342:3:2943 -9343:0:4365 -9344:2:1652 -9345:0:4365 -9346:2:1653 -9347:0:4365 -9348:2:1657 -9349:0:4365 -9350:2:1180 -9351:0:4365 -9352:3:2942 -9353:0:4365 -9354:2:1181 -9355:2:1185 -9356:2:1186 -9357:2:1194 -9358:2:1195 -9359:2:1199 -9360:2:1200 -9361:2:1194 -9362:2:1195 -9363:2:1196 -9364:2:1208 -9365:2:1213 -9366:2:1217 -9367:2:1218 -9368:2:1225 -9369:2:1226 -9370:2:1237 -9371:2:1238 -9372:2:1239 -9373:2:1237 -9374:2:1238 -9375:2:1239 -9376:2:1250 -9377:2:1255 -9378:2:1256 -9379:0:4365 -9380:3:2943 -9381:0:4365 -9382:2:1268 -9383:0:4365 -9384:3:2942 -9385:0:4365 -9386:2:1270 -9387:0:4365 -9388:3:2943 -9389:0:4365 -9390:2:1271 -9391:2:1275 -9392:2:1276 -9393:2:1284 -9394:2:1285 -9395:2:1289 -9396:2:1290 -9397:2:1284 -9398:2:1285 -9399:2:1289 -9400:2:1290 -9401:2:1298 -9402:2:1303 -9403:2:1307 -9404:2:1308 -9405:2:1315 -9406:2:1316 -9407:2:1327 -9408:2:1328 -9409:2:1329 -9410:2:1327 -9411:2:1328 -9412:2:1329 -9413:2:1340 -9414:2:1345 -9415:2:1346 -9416:0:4365 -9417:2:1358 -9418:0:4365 -9419:2:1454 -9420:0:4365 -9421:3:2942 -9422:0:4365 -9423:2:1455 -9424:0:4365 -9425:3:2943 -9426:0:4365 -9427:2:1652 -9428:0:4365 -9429:2:1653 -9430:0:4365 -9431:2:1657 -9432:0:4365 -9433:2:1660 -9434:0:4365 -9435:3:2942 -9436:0:4365 -9437:2:1665 -9438:2:1669 -9439:2:1670 -9440:2:1678 -9441:2:1679 -9442:2:1683 -9443:2:1684 -9444:2:1678 -9445:2:1679 -9446:2:1680 -9447:2:1692 -9448:2:1697 -9449:2:1701 -9450:2:1702 -9451:2:1709 -9452:2:1710 -9453:2:1721 -9454:2:1722 -9455:2:1723 -9456:2:1721 -9457:2:1722 -9458:2:1723 -9459:2:1734 -9460:2:1739 -9461:2:1740 -9462:0:4365 -9463:3:2943 -9464:0:4365 -9465:2:1752 -9466:0:4365 -9467:3:2942 -9468:0:4365 -9469:2:1754 -9470:0:4365 -9471:3:2943 -9472:0:4365 -9473:2:1755 -9474:2:1759 -9475:2:1760 -9476:2:1768 -9477:2:1769 -9478:2:1773 -9479:2:1774 -9480:2:1768 -9481:2:1769 -9482:2:1773 -9483:2:1774 -9484:2:1782 -9485:2:1787 -9486:2:1791 -9487:2:1792 -9488:2:1799 -9489:2:1800 -9490:2:1811 -9491:2:1812 -9492:2:1813 -9493:2:1811 -9494:2:1812 -9495:2:1813 -9496:2:1824 -9497:2:1829 -9498:2:1830 -9499:0:4365 -9500:2:1842 -9501:0:4365 -9502:3:2942 -9503:0:4365 -9504:2:1844 -9505:0:4365 -9506:3:2943 -9507:0:4365 -9508:2:1845 -9509:2:1849 -9510:2:1850 -9511:2:1858 -9512:2:1859 -9513:2:1863 -9514:2:1864 -9515:2:1858 -9516:2:1859 -9517:2:1863 -9518:2:1864 -9519:2:1872 -9520:2:1877 -9521:2:1881 -9522:2:1882 -9523:2:1889 -9524:2:1890 -9525:2:1901 -9526:2:1902 -9527:2:1903 -9528:2:1901 -9529:2:1902 -9530:2:1903 -9531:2:1914 -9532:2:1919 -9533:2:1920 -9534:0:4365 -9535:2:1932 -9536:0:4365 -9537:3:2942 -9538:0:4365 -9539:2:1934 -9540:0:4365 -9541:3:2943 -9542:0:4365 -9543:2:1935 -9544:0:4365 -9545:2:1936 -9546:0:4365 -9547:2:2129 -9548:0:4365 -9549:2:2130 -9550:0:4365 -9551:2:2134 -9552:0:4365 -9553:3:2942 -9554:0:4365 -9555:2:2136 -9556:0:4365 -9557:3:2943 -9558:0:4365 -9559:2:2137 -9560:2:2141 -9561:2:2142 -9562:2:2150 -9563:2:2151 -9564:2:2155 -9565:2:2156 -9566:2:2150 -9567:2:2151 -9568:2:2155 -9569:2:2156 -9570:2:2164 -9571:2:2169 -9572:2:2173 -9573:2:2174 -9574:2:2181 -9575:2:2182 -9576:2:2193 -9577:2:2194 -9578:2:2195 -9579:2:2193 -9580:2:2194 -9581:2:2195 -9582:2:2206 -9583:2:2211 -9584:2:2212 -9585:0:4365 -9586:2:2224 -9587:0:4365 -9588:3:2942 -9589:0:4365 -9590:2:2226 -9591:0:4365 -9592:3:2943 -9593:0:4365 -9594:2:1936 -9595:0:4365 -9596:2:2129 -9597:0:4365 -9598:2:2130 -9599:0:4365 -9600:2:2134 -9601:0:4365 -9602:3:2942 -9603:0:4365 -9604:2:2136 -9605:0:4365 -9606:3:2943 -9607:0:4365 -9608:2:2137 -9609:2:2141 -9610:2:2142 -9611:2:2150 -9612:2:2151 -9613:2:2155 -9614:2:2156 -9615:2:2150 -9616:2:2151 -9617:2:2152 -9618:2:2164 -9619:2:2169 -9620:2:2173 -9621:2:2174 -9622:2:2181 -9623:2:2182 -9624:2:2193 -9625:2:2194 -9626:2:2195 -9627:2:2193 -9628:2:2194 -9629:2:2195 -9630:2:2206 -9631:2:2211 -9632:2:2212 -9633:0:4365 -9634:2:2224 -9635:0:4365 -9636:3:2942 -9637:0:4365 -9638:2:2226 -9639:0:4365 -9640:3:2943 -9641:0:4365 -9642:2:2230 -9643:0:4365 -9644:3:2942 -9645:0:4365 -9646:2:2235 -9647:2:2239 -9648:2:2240 -9649:2:2248 -9650:2:2249 -9651:2:2253 -9652:2:2254 -9653:2:2248 -9654:2:2249 -9655:2:2250 -9656:2:2262 -9657:2:2267 -9658:2:2271 -9659:2:2272 -9660:2:2279 -9661:2:2280 -9662:2:2291 -9663:2:2292 -9664:2:2293 -9665:2:2291 -9666:2:2292 -9667:2:2293 -9668:2:2304 -9669:2:2309 -9670:2:2310 -9671:0:4365 -9672:3:2943 -9673:0:4365 -9674:2:2322 -9675:0:4365 -9676:2:1169 -9677:0:4365 -9678:3:2942 -9679:0:4365 -9680:2:1170 -9681:0:4365 -9682:3:2943 -9683:0:4365 -9684:3:2944 -9685:0:4365 -9686:3:2950 -9687:0:4365 -9688:3:2951 -9689:0:4365 -9690:3:2952 -9691:0:4365 -9692:3:2953 -9693:0:4365 -9694:3:2954 -9695:3:2958 -9696:3:2959 -9697:3:2967 -9698:3:2968 -9699:3:2972 -9700:3:2973 -9701:3:2967 -9702:3:2968 -9703:3:2972 -9704:3:2973 -9705:3:2981 -9706:3:2986 -9707:3:2990 -9708:3:2991 -9709:3:2998 -9710:3:2999 -9711:3:3010 -9712:3:3011 -9713:3:3012 -9714:3:3010 -9715:3:3011 -9716:3:3012 -9717:3:3023 -9718:3:3028 -9719:3:3029 -9720:0:4365 -9721:3:3041 -9722:0:4365 -9723:3:3042 -9724:0:4365 -9725:2:1173 -9726:0:4365 -9727:3:3043 -9728:0:4365 -9729:2:1179 -9730:0:4365 -9731:2:1180 -9732:0:4365 -9733:3:3042 -9734:0:4365 -9735:2:1181 -9736:2:1185 -9737:2:1186 -9738:2:1194 -9739:2:1195 -9740:2:1199 -9741:2:1200 -9742:2:1194 -9743:2:1195 -9744:2:1199 -9745:2:1200 -9746:2:1208 -9747:2:1213 -9748:2:1217 -9749:2:1218 -9750:2:1225 -9751:2:1226 -9752:2:1237 -9753:2:1238 -9754:2:1239 -9755:2:1237 -9756:2:1238 -9757:2:1239 -9758:2:1250 -9759:2:1255 -9760:2:1256 -9761:0:4365 -9762:3:3043 -9763:0:4365 -9764:2:1268 -9765:0:4365 -9766:3:3042 -9767:0:4365 -9768:2:1270 -9769:0:4365 -9770:3:3043 -9771:0:4365 -9772:2:1271 -9773:2:1275 -9774:2:1276 -9775:2:1284 -9776:2:1285 -9777:2:1289 -9778:2:1290 -9779:2:1284 -9780:2:1285 -9781:2:1289 -9782:2:1290 -9783:2:1298 -9784:2:1303 -9785:2:1307 -9786:2:1308 -9787:2:1315 -9788:2:1316 -9789:2:1327 -9790:2:1328 -9791:2:1329 -9792:2:1327 -9793:2:1328 -9794:2:1329 -9795:2:1340 -9796:2:1345 -9797:2:1346 -9798:0:4365 -9799:2:1358 -9800:0:4365 -9801:2:1360 -9802:0:4365 -9803:3:3042 -9804:0:4365 -9805:2:1361 -9806:0:4365 -9807:3:3043 -9808:0:4365 -9809:2:1362 -9810:2:1366 -9811:2:1367 -9812:2:1375 -9813:2:1376 -9814:2:1380 -9815:2:1381 -9816:2:1375 -9817:2:1376 -9818:2:1380 -9819:2:1381 -9820:2:1389 -9821:2:1394 -9822:2:1398 -9823:2:1399 -9824:2:1406 -9825:2:1407 -9826:2:1418 -9827:2:1419 -9828:2:1420 -9829:2:1418 -9830:2:1419 -9831:2:1420 -9832:2:1431 -9833:2:1436 -9834:2:1437 -9835:0:4365 -9836:2:1449 -9837:0:4365 -9838:3:3042 -9839:0:4365 -9840:2:1451 -9841:0:4365 -9842:3:3043 -9843:0:4365 -9844:2:1652 -9845:0:4365 -9846:2:1653 -9847:0:4365 -9848:2:1657 -9849:0:4365 -9850:2:1180 -9851:0:4365 -9852:3:3042 -9853:0:4365 -9854:2:1181 -9855:2:1185 -9856:2:1186 -9857:2:1194 -9858:2:1195 -9859:2:1199 -9860:2:1200 -9861:2:1194 -9862:2:1195 -9863:2:1196 -9864:2:1208 -9865:2:1213 -9866:2:1217 -9867:2:1218 -9868:2:1225 -9869:2:1226 -9870:2:1237 -9871:2:1238 -9872:2:1239 -9873:2:1237 -9874:2:1238 -9875:2:1239 -9876:2:1250 -9877:2:1255 -9878:2:1256 -9879:0:4365 -9880:3:3043 -9881:0:4365 -9882:2:1268 -9883:0:4365 -9884:3:3042 -9885:0:4365 -9886:2:1270 -9887:0:4365 -9888:3:3043 -9889:0:4365 -9890:2:1271 -9891:2:1275 -9892:2:1276 -9893:2:1284 -9894:2:1285 -9895:2:1289 -9896:2:1290 -9897:2:1284 -9898:2:1285 -9899:2:1289 -9900:2:1290 -9901:2:1298 -9902:2:1303 -9903:2:1307 -9904:2:1308 -9905:2:1315 -9906:2:1316 -9907:2:1327 -9908:2:1328 -9909:2:1329 -9910:2:1327 -9911:2:1328 -9912:2:1329 -9913:2:1340 -9914:2:1345 -9915:2:1346 -9916:0:4365 -9917:2:1358 -9918:0:4365 -9919:2:1454 -9920:0:4365 -9921:3:3042 -9922:0:4365 -9923:2:1455 -9924:0:4365 -9925:3:3043 -9926:0:4365 -9927:2:1652 -9928:0:4365 -9929:2:1653 -9930:0:4365 -9931:2:1657 -9932:0:4365 -9933:2:1660 -9934:0:4365 -9935:3:3042 -9936:0:4365 -9937:2:1665 -9938:2:1669 -9939:2:1670 -9940:2:1678 -9941:2:1679 -9942:2:1683 -9943:2:1684 -9944:2:1678 -9945:2:1679 -9946:2:1680 -9947:2:1692 -9948:2:1697 -9949:2:1701 -9950:2:1702 -9951:2:1709 -9952:2:1710 -9953:2:1721 -9954:2:1722 -9955:2:1723 -9956:2:1721 -9957:2:1722 -9958:2:1723 -9959:2:1734 -9960:2:1739 -9961:2:1740 -9962:0:4365 -9963:3:3043 -9964:0:4365 -9965:2:1752 -9966:0:4365 -9967:3:3042 -9968:0:4365 -9969:2:1754 -9970:0:4365 -9971:3:3043 -9972:0:4365 -9973:2:1755 -9974:2:1759 -9975:2:1760 -9976:2:1768 -9977:2:1769 -9978:2:1773 -9979:2:1774 -9980:2:1768 -9981:2:1769 -9982:2:1773 -9983:2:1774 -9984:2:1782 -9985:2:1787 -9986:2:1791 -9987:2:1792 -9988:2:1799 -9989:2:1800 -9990:2:1811 -9991:2:1812 -9992:2:1813 -9993:2:1811 -9994:2:1812 -9995:2:1813 -9996:2:1824 -9997:2:1829 -9998:2:1830 -9999:0:4365 -10000:2:1842 -10001:0:4365 -10002:3:3042 -10003:0:4365 -10004:2:1844 -10005:0:4365 -10006:3:3043 -10007:0:4365 -10008:2:1845 -10009:2:1849 -10010:2:1850 -10011:2:1858 -10012:2:1859 -10013:2:1863 -10014:2:1864 -10015:2:1858 -10016:2:1859 -10017:2:1863 -10018:2:1864 -10019:2:1872 -10020:2:1877 -10021:2:1881 -10022:2:1882 -10023:2:1889 -10024:2:1890 -10025:2:1901 -10026:2:1902 -10027:2:1903 -10028:2:1901 -10029:2:1902 -10030:2:1903 -10031:2:1914 -10032:2:1919 -10033:2:1920 -10034:0:4365 -10035:2:1932 -10036:0:4365 -10037:3:3042 -10038:0:4365 -10039:2:1934 -10040:0:4365 -10041:3:3043 -10042:0:4365 -10043:2:1935 -10044:0:4365 -10045:2:1936 -10046:0:4365 -10047:2:2129 -10048:0:4365 -10049:2:2130 -10050:0:4365 -10051:2:2134 -10052:0:4365 -10053:3:3042 -10054:0:4365 -10055:2:2136 -10056:0:4365 -10057:3:3043 -10058:0:4365 -10059:2:2137 -10060:2:2141 -10061:2:2142 -10062:2:2150 -10063:2:2151 -10064:2:2155 -10065:2:2156 -10066:2:2150 -10067:2:2151 -10068:2:2155 -10069:2:2156 -10070:2:2164 -10071:2:2169 -10072:2:2173 -10073:2:2174 -10074:2:2181 -10075:2:2182 -10076:2:2193 -10077:2:2194 -10078:2:2195 -10079:2:2193 -10080:2:2194 -10081:2:2195 -10082:2:2206 -10083:2:2211 -10084:2:2212 -10085:0:4365 -10086:2:2224 -10087:0:4365 -10088:3:3042 -10089:0:4365 -10090:2:2226 -10091:0:4365 -10092:3:3043 -10093:0:4365 -10094:2:1936 -10095:0:4365 -10096:2:2129 -10097:0:4365 -10098:2:2130 -10099:0:4365 -10100:2:2134 -10101:0:4365 -10102:3:3042 -10103:0:4365 -10104:2:2136 -10105:0:4365 -10106:3:3043 -10107:0:4365 -10108:2:2137 -10109:2:2141 -10110:2:2142 -10111:2:2150 -10112:2:2151 -10113:2:2155 -10114:2:2156 -10115:2:2150 -10116:2:2151 -10117:2:2152 -10118:2:2164 -10119:2:2169 -10120:2:2173 -10121:2:2174 -10122:2:2181 -10123:2:2182 -10124:2:2193 -10125:2:2194 -10126:2:2195 -10127:2:2193 -10128:2:2194 -10129:2:2195 -10130:2:2206 -10131:2:2211 -10132:2:2212 -10133:0:4365 -10134:2:2224 -10135:0:4365 -10136:3:3042 -10137:0:4365 -10138:2:2226 -10139:0:4365 -10140:3:3043 -10141:0:4365 -10142:2:2230 -10143:0:4365 -10144:3:3042 -10145:0:4365 -10146:2:2235 -10147:2:2239 -10148:2:2240 -10149:2:2248 -10150:2:2249 -10151:2:2253 -10152:2:2254 -10153:2:2248 -10154:2:2249 -10155:2:2250 -10156:2:2262 -10157:2:2267 -10158:2:2271 -10159:2:2272 -10160:2:2279 -10161:2:2280 -10162:2:2291 -10163:2:2292 -10164:2:2293 -10165:2:2291 -10166:2:2292 -10167:2:2293 -10168:2:2304 -10169:2:2309 -10170:2:2310 -10171:0:4365 -10172:3:3043 -10173:0:4365 -10174:2:2322 -10175:0:4365 -10176:2:1169 -10177:0:4365 -10178:3:3042 -10179:0:4365 -10180:2:1170 -10181:0:4365 -10182:3:3043 -10183:0:4365 -10184:3:3044 -10185:0:4365 -10186:3:3257 -10187:0:4365 -10188:3:3265 -10189:0:4365 -10190:3:3266 -10191:3:3270 -10192:3:3271 -10193:3:3279 -10194:3:3280 -10195:3:3284 -10196:3:3285 -10197:3:3279 -10198:3:3280 -10199:3:3284 -10200:3:3285 -10201:3:3293 -10202:3:3298 -10203:3:3302 -10204:3:3303 -10205:3:3310 -10206:3:3311 -10207:3:3322 -10208:3:3323 -10209:3:3324 -10210:3:3322 -10211:3:3323 -10212:3:3324 -10213:3:3335 -10214:3:3340 -10215:3:3341 -10216:0:4365 -10217:3:3353 -10218:0:4365 -10219:3:3354 -10220:0:4365 -10221:2:1173 -10222:0:4365 -10223:3:3355 -10224:0:4365 -10225:2:1179 -10226:0:4365 -10227:2:1180 -10228:0:4365 -10229:3:3354 -10230:0:4365 -10231:2:1181 -10232:2:1185 -10233:2:1186 -10234:2:1194 -10235:2:1195 -10236:2:1199 -10237:2:1200 -10238:2:1194 -10239:2:1195 -10240:2:1199 -10241:2:1200 -10242:2:1208 -10243:2:1213 -10244:2:1217 -10245:2:1218 -10246:2:1225 -10247:2:1226 -10248:2:1237 -10249:2:1238 -10250:2:1239 -10251:2:1237 -10252:2:1238 -10253:2:1239 -10254:2:1250 -10255:2:1255 -10256:2:1256 -10257:0:4365 -10258:3:3355 -10259:0:4365 -10260:2:1268 -10261:0:4365 -10262:3:3354 -10263:0:4365 -10264:2:1270 -10265:0:4365 -10266:3:3355 -10267:0:4365 -10268:2:1271 -10269:2:1275 -10270:2:1276 -10271:2:1284 -10272:2:1285 -10273:2:1289 -10274:2:1290 -10275:2:1284 -10276:2:1285 -10277:2:1289 -10278:2:1290 -10279:2:1298 -10280:2:1303 -10281:2:1307 -10282:2:1308 -10283:2:1315 -10284:2:1316 -10285:2:1327 -10286:2:1328 -10287:2:1329 -10288:2:1327 -10289:2:1328 -10290:2:1329 -10291:2:1340 -10292:2:1345 -10293:2:1346 -10294:0:4365 -10295:2:1358 -10296:0:4365 -10297:2:1360 -10298:0:4365 -10299:3:3354 -10300:0:4365 -10301:2:1361 -10302:0:4365 -10303:3:3355 -10304:0:4365 -10305:2:1362 -10306:2:1366 -10307:2:1367 -10308:2:1375 -10309:2:1376 -10310:2:1380 -10311:2:1381 -10312:2:1375 -10313:2:1376 -10314:2:1380 -10315:2:1381 -10316:2:1389 -10317:2:1394 -10318:2:1398 -10319:2:1399 -10320:2:1406 -10321:2:1407 -10322:2:1418 -10323:2:1419 -10324:2:1420 -10325:2:1418 -10326:2:1419 -10327:2:1420 -10328:2:1431 -10329:2:1436 -10330:2:1437 -10331:0:4365 -10332:2:1449 -10333:0:4365 -10334:3:3354 -10335:0:4365 -10336:2:1451 -10337:0:4365 -10338:3:3355 -10339:0:4365 -10340:2:1652 -10341:0:4365 -10342:2:1653 -10343:0:4365 -10344:2:1657 -10345:0:4365 -10346:2:1180 -10347:0:4365 -10348:3:3354 -10349:0:4365 -10350:2:1181 -10351:2:1185 -10352:2:1186 -10353:2:1194 -10354:2:1195 -10355:2:1199 -10356:2:1200 -10357:2:1194 -10358:2:1195 -10359:2:1196 -10360:2:1208 -10361:2:1213 -10362:2:1217 -10363:2:1218 -10364:2:1225 -10365:2:1226 -10366:2:1237 -10367:2:1238 -10368:2:1239 -10369:2:1237 -10370:2:1238 -10371:2:1239 -10372:2:1250 -10373:2:1255 -10374:2:1256 -10375:0:4365 -10376:3:3355 -10377:0:4365 -10378:2:1268 -10379:0:4365 -10380:3:3354 -10381:0:4365 -10382:2:1270 -10383:0:4365 -10384:3:3355 -10385:0:4365 -10386:2:1271 -10387:2:1275 -10388:2:1276 -10389:2:1284 -10390:2:1285 -10391:2:1289 -10392:2:1290 -10393:2:1284 -10394:2:1285 -10395:2:1289 -10396:2:1290 -10397:2:1298 -10398:2:1303 -10399:2:1307 -10400:2:1308 -10401:2:1315 -10402:2:1316 -10403:2:1327 -10404:2:1328 -10405:2:1329 -10406:2:1327 -10407:2:1328 -10408:2:1329 -10409:2:1340 -10410:2:1345 -10411:2:1346 -10412:0:4365 -10413:2:1358 -10414:0:4365 -10415:2:1454 -10416:0:4365 -10417:3:3354 -10418:0:4365 -10419:2:1455 -10420:0:4365 -10421:3:3355 -10422:0:4365 -10423:2:1652 -10424:0:4365 -10425:2:1653 -10426:0:4365 -10427:2:1657 -10428:0:4365 -10429:2:1660 -10430:0:4365 -10431:3:3354 -10432:0:4365 -10433:2:1665 -10434:2:1669 -10435:2:1670 -10436:2:1678 -10437:2:1679 -10438:2:1683 -10439:2:1684 -10440:2:1678 -10441:2:1679 -10442:2:1680 -10443:2:1692 -10444:2:1697 -10445:2:1701 -10446:2:1702 -10447:2:1709 -10448:2:1710 -10449:2:1721 -10450:2:1722 -10451:2:1723 -10452:2:1721 -10453:2:1722 -10454:2:1723 -10455:2:1734 -10456:2:1739 -10457:2:1740 -10458:0:4365 -10459:3:3355 -10460:0:4365 -10461:2:1752 -10462:0:4365 -10463:3:3354 -10464:0:4365 -10465:2:1754 -10466:0:4365 -10467:3:3355 -10468:0:4365 -10469:2:1755 -10470:2:1759 -10471:2:1760 -10472:2:1768 -10473:2:1769 -10474:2:1773 -10475:2:1774 -10476:2:1768 -10477:2:1769 -10478:2:1773 -10479:2:1774 -10480:2:1782 -10481:2:1787 -10482:2:1791 -10483:2:1792 -10484:2:1799 -10485:2:1800 -10486:2:1811 -10487:2:1812 -10488:2:1813 -10489:2:1811 -10490:2:1812 -10491:2:1813 -10492:2:1824 -10493:2:1829 -10494:2:1830 -10495:0:4365 -10496:2:1842 -10497:0:4365 -10498:3:3354 -10499:0:4365 -10500:2:1844 -10501:0:4365 -10502:3:3355 -10503:0:4365 -10504:2:1845 -10505:2:1849 -10506:2:1850 -10507:2:1858 -10508:2:1859 -10509:2:1863 -10510:2:1864 -10511:2:1858 -10512:2:1859 -10513:2:1863 -10514:2:1864 -10515:2:1872 -10516:2:1877 -10517:2:1881 -10518:2:1882 -10519:2:1889 -10520:2:1890 -10521:2:1901 -10522:2:1902 -10523:2:1903 -10524:2:1901 -10525:2:1902 -10526:2:1903 -10527:2:1914 -10528:2:1919 -10529:2:1920 -10530:0:4365 -10531:2:1932 -10532:0:4365 -10533:3:3354 -10534:0:4365 -10535:2:1934 -10536:0:4365 -10537:3:3355 -10538:0:4365 -10539:2:1935 -10540:0:4365 -10541:2:1936 -10542:0:4365 -10543:2:2129 -10544:0:4365 -10545:2:2130 -10546:0:4365 -10547:2:2134 -10548:0:4365 -10549:3:3354 -10550:0:4365 -10551:2:2136 -10552:0:4365 -10553:3:3355 -10554:0:4365 -10555:2:2137 -10556:2:2141 -10557:2:2142 -10558:2:2150 -10559:2:2151 -10560:2:2155 -10561:2:2156 -10562:2:2150 -10563:2:2151 -10564:2:2155 -10565:2:2156 -10566:2:2164 -10567:2:2169 -10568:2:2173 -10569:2:2174 -10570:2:2181 -10571:2:2182 -10572:2:2193 -10573:2:2194 -10574:2:2195 -10575:2:2193 -10576:2:2194 -10577:2:2195 -10578:2:2206 -10579:2:2211 -10580:2:2212 -10581:0:4365 -10582:2:2224 -10583:0:4365 -10584:3:3354 -10585:0:4365 -10586:2:2226 -10587:0:4365 -10588:3:3355 -10589:0:4365 -10590:2:1936 -10591:0:4365 -10592:2:2129 -10593:0:4365 -10594:2:2130 -10595:0:4365 -10596:2:2134 -10597:0:4365 -10598:3:3354 -10599:0:4365 -10600:2:2136 -10601:0:4365 -10602:3:3355 -10603:0:4365 -10604:2:2137 -10605:2:2141 -10606:2:2142 -10607:2:2150 -10608:2:2151 -10609:2:2155 -10610:2:2156 -10611:2:2150 -10612:2:2151 -10613:2:2152 -10614:2:2164 -10615:2:2169 -10616:2:2173 -10617:2:2174 -10618:2:2181 -10619:2:2182 -10620:2:2193 -10621:2:2194 -10622:2:2195 -10623:2:2193 -10624:2:2194 -10625:2:2195 -10626:2:2206 -10627:2:2211 -10628:2:2212 -10629:0:4365 -10630:2:2224 -10631:0:4365 -10632:3:3354 -10633:0:4365 -10634:2:2226 -10635:0:4365 -10636:3:3355 -10637:0:4365 -10638:2:2230 -10639:0:4365 -10640:3:3354 -10641:0:4365 -10642:2:2235 -10643:2:2239 -10644:2:2240 -10645:2:2248 -10646:2:2249 -10647:2:2253 -10648:2:2254 -10649:2:2248 -10650:2:2249 -10651:2:2250 -10652:2:2262 -10653:2:2267 -10654:2:2271 -10655:2:2272 -10656:2:2279 -10657:2:2280 -10658:2:2291 -10659:2:2292 -10660:2:2293 -10661:2:2291 -10662:2:2292 -10663:2:2293 -10664:2:2304 -10665:2:2309 -10666:2:2310 -10667:0:4365 -10668:3:3355 -10669:0:4365 -10670:2:2322 -10671:0:4365 -10672:2:1169 -10673:0:4365 -10674:3:3354 -10675:0:4365 -10676:2:1170 -10677:0:4365 -10678:3:3355 -10679:0:4365 -10680:3:3356 -10681:0:4365 -10682:3:3366 -10683:0:4365 -10684:3:2951 -10685:0:4365 -10686:3:2952 -10687:0:4365 -10688:3:2953 -10689:0:4365 -10690:3:2954 -10691:3:2958 -10692:3:2959 -10693:3:2967 -10694:3:2968 -10695:3:2972 -10696:3:2973 -10697:3:2967 -10698:3:2968 -10699:3:2972 -10700:3:2973 -10701:3:2981 -10702:3:2986 -10703:3:2990 -10704:3:2991 -10705:3:2998 -10706:3:2999 -10707:3:3010 -10708:3:3011 -10709:3:3012 -10710:3:3010 -10711:3:3011 -10712:3:3012 -10713:3:3023 -10714:3:3028 -10715:3:3029 -10716:0:4365 -10717:3:3041 -10718:0:4365 -10719:3:3042 -10720:0:4365 -10721:2:1173 -10722:0:4365 -10723:3:3043 -10724:0:4365 -10725:2:1179 -10726:0:4365 -10727:2:1180 -10728:0:4365 -10729:3:3042 -10730:0:4365 -10731:2:1181 -10732:2:1185 -10733:2:1186 -10734:2:1194 -10735:2:1195 -10736:2:1199 -10737:2:1200 -10738:2:1194 -10739:2:1195 -10740:2:1199 -10741:2:1200 -10742:2:1208 -10743:2:1213 -10744:2:1217 -10745:2:1218 -10746:2:1225 -10747:2:1226 -10748:2:1237 -10749:2:1238 -10750:2:1239 -10751:2:1237 -10752:2:1238 -10753:2:1239 -10754:2:1250 -10755:2:1255 -10756:2:1256 -10757:0:4365 -10758:3:3043 -10759:0:4365 -10760:2:1268 -10761:0:4365 -10762:3:3042 -10763:0:4365 -10764:2:1270 -10765:0:4365 -10766:3:3043 -10767:0:4365 -10768:2:1271 -10769:2:1275 -10770:2:1276 -10771:2:1284 -10772:2:1285 -10773:2:1289 -10774:2:1290 -10775:2:1284 -10776:2:1285 -10777:2:1289 -10778:2:1290 -10779:2:1298 -10780:2:1303 -10781:2:1307 -10782:2:1308 -10783:2:1315 -10784:2:1316 -10785:2:1327 -10786:2:1328 -10787:2:1329 -10788:2:1327 -10789:2:1328 -10790:2:1329 -10791:2:1340 -10792:2:1345 -10793:2:1346 -10794:0:4365 -10795:2:1358 -10796:0:4365 -10797:2:1360 -10798:0:4365 -10799:3:3042 -10800:0:4365 -10801:2:1361 -10802:0:4365 -10803:3:3043 -10804:0:4365 -10805:2:1362 -10806:2:1366 -10807:2:1367 -10808:2:1375 -10809:2:1376 -10810:2:1380 -10811:2:1381 -10812:2:1375 -10813:2:1376 -10814:2:1380 -10815:2:1381 -10816:2:1389 -10817:2:1394 -10818:2:1398 -10819:2:1399 -10820:2:1406 -10821:2:1407 -10822:2:1418 -10823:2:1419 -10824:2:1420 -10825:2:1418 -10826:2:1419 -10827:2:1420 -10828:2:1431 -10829:2:1436 -10830:2:1437 -10831:0:4365 -10832:2:1449 -10833:0:4365 -10834:3:3042 -10835:0:4365 -10836:2:1451 -10837:0:4365 -10838:3:3043 -10839:0:4365 -10840:2:1652 -10841:0:4365 -10842:2:1653 -10843:0:4365 -10844:2:1657 -10845:0:4365 -10846:2:1180 -10847:0:4365 -10848:3:3042 -10849:0:4365 -10850:2:1181 -10851:2:1185 -10852:2:1186 -10853:2:1194 -10854:2:1195 -10855:2:1199 -10856:2:1200 -10857:2:1194 -10858:2:1195 -10859:2:1196 -10860:2:1208 -10861:2:1213 -10862:2:1217 -10863:2:1218 -10864:2:1225 -10865:2:1226 -10866:2:1237 -10867:2:1238 -10868:2:1239 -10869:2:1237 -10870:2:1238 -10871:2:1239 -10872:2:1250 -10873:2:1255 -10874:2:1256 -10875:0:4365 -10876:3:3043 -10877:0:4365 -10878:2:1268 -10879:0:4365 -10880:3:3042 -10881:0:4365 -10882:2:1270 -10883:0:4365 -10884:3:3043 -10885:0:4365 -10886:2:1271 -10887:2:1275 -10888:2:1276 -10889:2:1284 -10890:2:1285 -10891:2:1289 -10892:2:1290 -10893:2:1284 -10894:2:1285 -10895:2:1289 -10896:2:1290 -10897:2:1298 -10898:2:1303 -10899:2:1307 -10900:2:1308 -10901:2:1315 -10902:2:1316 -10903:2:1327 -10904:2:1328 -10905:2:1329 -10906:2:1327 -10907:2:1328 -10908:2:1329 -10909:2:1340 -10910:2:1345 -10911:2:1346 -10912:0:4365 -10913:2:1358 -10914:0:4365 -10915:2:1454 -10916:0:4365 -10917:3:3042 -10918:0:4365 -10919:2:1455 -10920:0:4365 -10921:3:3043 -10922:0:4365 -10923:2:1652 -10924:0:4365 -10925:2:1653 -10926:0:4365 -10927:2:1657 -10928:0:4365 -10929:2:1660 -10930:0:4365 -10931:3:3042 -10932:0:4365 -10933:2:1665 -10934:2:1669 -10935:2:1670 -10936:2:1678 -10937:2:1679 -10938:2:1683 -10939:2:1684 -10940:2:1678 -10941:2:1679 -10942:2:1680 -10943:2:1692 -10944:2:1697 -10945:2:1701 -10946:2:1702 -10947:2:1709 -10948:2:1710 -10949:2:1721 -10950:2:1722 -10951:2:1723 -10952:2:1721 -10953:2:1722 -10954:2:1723 -10955:2:1734 -10956:2:1739 -10957:2:1740 -10958:0:4365 -10959:3:3043 -10960:0:4365 -10961:2:1752 -10962:0:4365 -10963:3:3042 -10964:0:4365 -10965:2:1754 -10966:0:4365 -10967:3:3043 -10968:0:4365 -10969:2:1755 -10970:2:1759 -10971:2:1760 -10972:2:1768 -10973:2:1769 -10974:2:1773 -10975:2:1774 -10976:2:1768 -10977:2:1769 -10978:2:1773 -10979:2:1774 -10980:2:1782 -10981:2:1787 -10982:2:1791 -10983:2:1792 -10984:2:1799 -10985:2:1800 -10986:2:1811 -10987:2:1812 -10988:2:1813 -10989:2:1811 -10990:2:1812 -10991:2:1813 -10992:2:1824 -10993:2:1829 -10994:2:1830 -10995:0:4365 -10996:2:1842 -10997:0:4365 -10998:3:3042 -10999:0:4365 -11000:2:1844 -11001:0:4365 -11002:3:3043 -11003:0:4365 -11004:2:1845 -11005:2:1849 -11006:2:1850 -11007:2:1858 -11008:2:1859 -11009:2:1863 -11010:2:1864 -11011:2:1858 -11012:2:1859 -11013:2:1863 -11014:2:1864 -11015:2:1872 -11016:2:1877 -11017:2:1881 -11018:2:1882 -11019:2:1889 -11020:2:1890 -11021:2:1901 -11022:2:1902 -11023:2:1903 -11024:2:1901 -11025:2:1902 -11026:2:1903 -11027:2:1914 -11028:2:1919 -11029:2:1920 -11030:0:4365 -11031:2:1932 -11032:0:4365 -11033:3:3042 -11034:0:4365 -11035:2:1934 -11036:0:4365 -11037:3:3043 -11038:0:4365 -11039:2:1935 -11040:0:4365 -11041:2:1936 -11042:0:4365 -11043:2:2129 -11044:0:4365 -11045:2:2130 -11046:0:4365 -11047:2:2134 -11048:0:4365 -11049:3:3042 -11050:0:4365 -11051:2:2136 -11052:0:4365 -11053:3:3043 -11054:0:4365 -11055:2:2137 -11056:2:2141 -11057:2:2142 -11058:2:2150 -11059:2:2151 -11060:2:2155 -11061:2:2156 -11062:2:2150 -11063:2:2151 -11064:2:2155 -11065:2:2156 -11066:2:2164 -11067:2:2169 -11068:2:2173 -11069:2:2174 -11070:2:2181 -11071:2:2182 -11072:2:2193 -11073:2:2194 -11074:2:2195 -11075:2:2193 -11076:2:2194 -11077:2:2195 -11078:2:2206 -11079:2:2211 -11080:2:2212 -11081:0:4365 -11082:2:2224 -11083:0:4365 -11084:3:3042 -11085:0:4365 -11086:2:2226 -11087:0:4365 -11088:3:3043 -11089:0:4365 -11090:2:1936 -11091:0:4365 -11092:2:2129 -11093:0:4365 -11094:2:2130 -11095:0:4365 -11096:2:2134 -11097:0:4365 -11098:3:3042 -11099:0:4365 -11100:2:2136 -11101:0:4365 -11102:3:3043 -11103:0:4365 -11104:2:2137 -11105:2:2141 -11106:2:2142 -11107:2:2150 -11108:2:2151 -11109:2:2155 -11110:2:2156 -11111:2:2150 -11112:2:2151 -11113:2:2152 -11114:2:2164 -11115:2:2169 -11116:2:2173 -11117:2:2174 -11118:2:2181 -11119:2:2182 -11120:2:2193 -11121:2:2194 -11122:2:2195 -11123:2:2193 -11124:2:2194 -11125:2:2195 -11126:2:2206 -11127:2:2211 -11128:2:2212 -11129:0:4365 -11130:2:2224 -11131:0:4365 -11132:3:3042 -11133:0:4365 -11134:2:2226 -11135:0:4365 -11136:3:3043 -11137:0:4365 -11138:2:2230 -11139:0:4365 -11140:3:3042 -11141:0:4365 -11142:2:2235 -11143:2:2239 -11144:2:2240 -11145:2:2248 -11146:2:2249 -11147:2:2253 -11148:2:2254 -11149:2:2248 -11150:2:2249 -11151:2:2250 -11152:2:2262 -11153:2:2267 -11154:2:2271 -11155:2:2272 -11156:2:2279 -11157:2:2280 -11158:2:2291 -11159:2:2292 -11160:2:2293 -11161:2:2291 -11162:2:2292 -11163:2:2293 -11164:2:2304 -11165:2:2309 -11166:2:2310 -11167:0:4365 -11168:3:3043 -11169:0:4365 -11170:2:2322 -11171:0:4365 -11172:2:1169 -11173:0:4365 -11174:3:3042 -11175:0:4365 -11176:2:1170 -11177:0:4365 -11178:3:3043 -11179:0:4365 -11180:3:3044 -11181:0:4365 -11182:3:3257 -11183:0:4365 -11184:3:3362 -11185:0:4365 -11186:3:3363 -11187:0:4365 -11188:3:3367 -11189:0:4365 -11190:3:3373 -11191:3:3377 -11192:3:3378 -11193:3:3386 -11194:3:3387 -11195:3:3391 -11196:3:3392 -11197:3:3386 -11198:3:3387 -11199:3:3391 -11200:3:3392 -11201:3:3400 -11202:3:3405 -11203:3:3409 -11204:3:3410 -11205:3:3417 -11206:3:3418 -11207:3:3429 -11208:3:3430 -11209:3:3431 -11210:3:3429 -11211:3:3430 -11212:3:3431 -11213:3:3442 -11214:3:3447 -11215:3:3448 -11216:0:4365 -11217:3:3460 -11218:0:4365 -11219:3:3461 -11220:0:4365 -11221:2:1173 -11222:0:4365 -11223:3:3462 -11224:0:4365 -11225:2:1179 -11226:0:4365 -11227:2:1180 -11228:0:4365 -11229:3:3461 -11230:0:4365 -11231:2:1181 -11232:2:1185 -11233:2:1186 -11234:2:1194 -11235:2:1195 -11236:2:1199 -11237:2:1200 -11238:2:1194 -11239:2:1195 -11240:2:1199 -11241:2:1200 -11242:2:1208 -11243:2:1213 -11244:2:1217 -11245:2:1218 -11246:2:1225 -11247:2:1226 -11248:2:1237 -11249:2:1238 -11250:2:1239 -11251:2:1237 -11252:2:1238 -11253:2:1239 -11254:2:1250 -11255:2:1255 -11256:2:1256 -11257:0:4365 -11258:3:3462 -11259:0:4365 -11260:2:1268 -11261:0:4365 -11262:3:3461 -11263:0:4365 -11264:2:1270 -11265:0:4365 -11266:3:3462 -11267:0:4365 -11268:2:1271 -11269:2:1275 -11270:2:1276 -11271:2:1284 -11272:2:1285 -11273:2:1289 -11274:2:1290 -11275:2:1284 -11276:2:1285 -11277:2:1289 -11278:2:1290 -11279:2:1298 -11280:2:1303 -11281:2:1307 -11282:2:1308 -11283:2:1315 -11284:2:1316 -11285:2:1327 -11286:2:1328 -11287:2:1329 -11288:2:1327 -11289:2:1328 -11290:2:1329 -11291:2:1340 -11292:2:1345 -11293:2:1346 -11294:0:4365 -11295:2:1358 -11296:0:4365 -11297:2:1360 -11298:0:4365 -11299:3:3461 -11300:0:4365 -11301:2:1361 -11302:0:4365 -11303:3:3462 -11304:0:4365 -11305:2:1362 -11306:2:1366 -11307:2:1367 -11308:2:1375 -11309:2:1376 -11310:2:1380 -11311:2:1381 -11312:2:1375 -11313:2:1376 -11314:2:1380 -11315:2:1381 -11316:2:1389 -11317:2:1394 -11318:2:1398 -11319:2:1399 -11320:2:1406 -11321:2:1407 -11322:2:1418 -11323:2:1419 -11324:2:1420 -11325:2:1418 -11326:2:1419 -11327:2:1420 -11328:2:1431 -11329:2:1436 -11330:2:1437 -11331:0:4365 -11332:2:1449 -11333:0:4365 -11334:3:3461 -11335:0:4365 -11336:2:1451 -11337:0:4365 -11338:3:3462 -11339:0:4365 -11340:2:1652 -11341:0:4365 -11342:2:1653 -11343:0:4365 -11344:2:1657 -11345:0:4365 -11346:2:1180 -11347:0:4365 -11348:3:3461 -11349:0:4365 -11350:2:1181 -11351:2:1185 -11352:2:1186 -11353:2:1194 -11354:2:1195 -11355:2:1199 -11356:2:1200 -11357:2:1194 -11358:2:1195 -11359:2:1196 -11360:2:1208 -11361:2:1213 -11362:2:1217 -11363:2:1218 -11364:2:1225 -11365:2:1226 -11366:2:1237 -11367:2:1238 -11368:2:1239 -11369:2:1237 -11370:2:1238 -11371:2:1239 -11372:2:1250 -11373:2:1255 -11374:2:1256 -11375:0:4365 -11376:3:3462 -11377:0:4365 -11378:2:1268 -11379:0:4365 -11380:3:3461 -11381:0:4365 -11382:2:1270 -11383:0:4365 -11384:3:3462 -11385:0:4365 -11386:2:1271 -11387:2:1275 -11388:2:1276 -11389:2:1284 -11390:2:1285 -11391:2:1289 -11392:2:1290 -11393:2:1284 -11394:2:1285 -11395:2:1289 -11396:2:1290 -11397:2:1298 -11398:2:1303 -11399:2:1307 -11400:2:1308 -11401:2:1315 -11402:2:1316 -11403:2:1327 -11404:2:1328 -11405:2:1329 -11406:2:1327 -11407:2:1328 -11408:2:1329 -11409:2:1340 -11410:2:1345 -11411:2:1346 -11412:0:4365 -11413:2:1358 -11414:0:4365 -11415:2:1454 -11416:0:4365 -11417:3:3461 -11418:0:4365 -11419:2:1455 -11420:0:4365 -11421:3:3462 -11422:0:4365 -11423:2:1652 -11424:0:4365 -11425:2:1653 -11426:0:4365 -11427:2:1657 -11428:0:4365 -11429:2:1660 -11430:0:4365 -11431:3:3461 -11432:0:4365 -11433:2:1665 -11434:2:1669 -11435:2:1670 -11436:2:1678 -11437:2:1679 -11438:2:1683 -11439:2:1684 -11440:2:1678 -11441:2:1679 -11442:2:1680 -11443:2:1692 -11444:2:1697 -11445:2:1701 -11446:2:1702 -11447:2:1709 -11448:2:1710 -11449:2:1721 -11450:2:1722 -11451:2:1723 -11452:2:1721 -11453:2:1722 -11454:2:1723 -11455:2:1734 -11456:2:1739 -11457:2:1740 -11458:0:4365 -11459:3:3462 -11460:0:4365 -11461:2:1752 -11462:0:4365 -11463:3:3461 -11464:0:4365 -11465:2:1754 -11466:0:4365 -11467:3:3462 -11468:0:4365 -11469:2:1755 -11470:2:1759 -11471:2:1760 -11472:2:1768 -11473:2:1769 -11474:2:1773 -11475:2:1774 -11476:2:1768 -11477:2:1769 -11478:2:1773 -11479:2:1774 -11480:2:1782 -11481:2:1787 -11482:2:1791 -11483:2:1792 -11484:2:1799 -11485:2:1800 -11486:2:1811 -11487:2:1812 -11488:2:1813 -11489:2:1811 -11490:2:1812 -11491:2:1813 -11492:2:1824 -11493:2:1829 -11494:2:1830 -11495:0:4365 -11496:2:1842 -11497:0:4365 -11498:3:3461 -11499:0:4365 -11500:2:1844 -11501:0:4365 -11502:3:3462 -11503:0:4365 -11504:2:1845 -11505:2:1849 -11506:2:1850 -11507:2:1858 -11508:2:1859 -11509:2:1863 -11510:2:1864 -11511:2:1858 -11512:2:1859 -11513:2:1863 -11514:2:1864 -11515:2:1872 -11516:2:1877 -11517:2:1881 -11518:2:1882 -11519:2:1889 -11520:2:1890 -11521:2:1901 -11522:2:1902 -11523:2:1903 -11524:2:1901 -11525:2:1902 -11526:2:1903 -11527:2:1914 -11528:2:1919 -11529:2:1920 -11530:0:4365 -11531:2:1932 -11532:0:4365 -11533:3:3461 -11534:0:4365 -11535:2:1934 -11536:0:4365 -11537:3:3462 -11538:0:4365 -11539:2:1935 -11540:0:4365 -11541:2:1936 -11542:0:4365 -11543:2:2129 -11544:0:4365 -11545:2:2130 -11546:0:4365 -11547:2:2134 -11548:0:4365 -11549:3:3461 -11550:0:4365 -11551:2:2136 -11552:0:4365 -11553:3:3462 -11554:0:4365 -11555:2:2137 -11556:2:2141 -11557:2:2142 -11558:2:2150 -11559:2:2151 -11560:2:2155 -11561:2:2156 -11562:2:2150 -11563:2:2151 -11564:2:2155 -11565:2:2156 -11566:2:2164 -11567:2:2169 -11568:2:2173 -11569:2:2174 -11570:2:2181 -11571:2:2182 -11572:2:2193 -11573:2:2194 -11574:2:2195 -11575:2:2193 -11576:2:2194 -11577:2:2195 -11578:2:2206 -11579:2:2211 -11580:2:2212 -11581:0:4365 -11582:2:2224 -11583:0:4365 -11584:3:3461 -11585:0:4365 -11586:2:2226 -11587:0:4365 -11588:3:3462 -11589:0:4365 -11590:2:1936 -11591:0:4365 -11592:2:2129 -11593:0:4365 -11594:2:2130 -11595:0:4365 -11596:2:2134 -11597:0:4365 -11598:3:3461 -11599:0:4365 -11600:2:2136 -11601:0:4365 -11602:3:3462 -11603:0:4365 -11604:2:2137 -11605:2:2141 -11606:2:2142 -11607:2:2150 -11608:2:2151 -11609:2:2155 -11610:2:2156 -11611:2:2150 -11612:2:2151 -11613:2:2152 -11614:2:2164 -11615:2:2169 -11616:2:2173 -11617:2:2174 -11618:2:2181 -11619:2:2182 -11620:2:2193 -11621:2:2194 -11622:2:2195 -11623:2:2193 -11624:2:2194 -11625:2:2195 -11626:2:2206 -11627:2:2211 -11628:2:2212 -11629:0:4365 -11630:2:2224 -11631:0:4365 -11632:3:3461 -11633:0:4365 -11634:2:2226 -11635:0:4365 -11636:3:3462 -11637:0:4365 -11638:2:2230 -11639:0:4365 -11640:3:3461 -11641:0:4365 -11642:2:2235 -11643:2:2239 -11644:2:2240 -11645:2:2248 -11646:2:2249 -11647:2:2253 -11648:2:2254 -11649:2:2248 -11650:2:2249 -11651:2:2250 -11652:2:2262 -11653:2:2267 -11654:2:2271 -11655:2:2272 -11656:2:2279 -11657:2:2280 -11658:2:2291 -11659:2:2292 -11660:2:2293 -11661:2:2291 -11662:2:2292 -11663:2:2293 -11664:2:2304 -11665:2:2309 -11666:2:2310 -11667:0:4365 -11668:3:3462 -11669:0:4365 -11670:2:2322 -11671:0:4365 -11672:2:1169 -11673:0:4365 -11674:3:3461 -11675:0:4365 -11676:2:1170 -11677:0:4365 -11678:3:3462 -11679:0:4365 -11680:3:3463 -11681:0:4365 -11682:3:3469 -11683:0:4365 -11684:3:3470 -11685:3:3474 -11686:3:3475 -11687:3:3483 -11688:3:3484 -11689:3:3488 -11690:3:3489 -11691:3:3483 -11692:3:3484 -11693:3:3488 -11694:3:3489 -11695:3:3497 -11696:3:3502 -11697:3:3506 -11698:3:3507 -11699:3:3514 -11700:3:3515 -11701:3:3526 -11702:3:3527 -11703:3:3528 -11704:3:3526 -11705:3:3527 -11706:3:3528 -11707:3:3539 -11708:3:3544 -11709:3:3545 -11710:0:4365 -11711:3:3557 -11712:0:4365 -11713:3:3558 -11714:0:4365 -11715:2:1173 -11716:0:4365 -11717:3:3559 -11718:0:4365 -11719:2:1179 -11720:0:4365 -11721:2:1180 -11722:0:4365 -11723:3:3558 -11724:0:4365 -11725:2:1181 -11726:2:1185 -11727:2:1186 -11728:2:1194 -11729:2:1195 -11730:2:1199 -11731:2:1200 -11732:2:1194 -11733:2:1195 -11734:2:1199 -11735:2:1200 -11736:2:1208 -11737:2:1213 -11738:2:1217 -11739:2:1218 -11740:2:1225 -11741:2:1226 -11742:2:1237 -11743:2:1238 -11744:2:1239 -11745:2:1237 -11746:2:1238 -11747:2:1239 -11748:2:1250 -11749:2:1255 -11750:2:1256 -11751:0:4365 -11752:3:3559 -11753:0:4365 -11754:2:1268 -11755:0:4365 -11756:3:3558 -11757:0:4365 -11758:2:1270 -11759:0:4365 -11760:3:3559 -11761:0:4365 -11762:2:1271 -11763:2:1275 -11764:2:1276 -11765:2:1284 -11766:2:1285 -11767:2:1289 -11768:2:1290 -11769:2:1284 -11770:2:1285 -11771:2:1289 -11772:2:1290 -11773:2:1298 -11774:2:1303 -11775:2:1307 -11776:2:1308 -11777:2:1315 -11778:2:1316 -11779:2:1327 -11780:2:1328 -11781:2:1329 -11782:2:1327 -11783:2:1328 -11784:2:1329 -11785:2:1340 -11786:2:1345 -11787:2:1346 -11788:0:4365 -11789:2:1358 -11790:0:4365 -11791:2:1360 -11792:0:4365 -11793:3:3558 -11794:0:4365 -11795:2:1361 -11796:0:4365 -11797:3:3559 -11798:0:4365 -11799:2:1362 -11800:2:1366 -11801:2:1367 -11802:2:1375 -11803:2:1376 -11804:2:1380 -11805:2:1381 -11806:2:1375 -11807:2:1376 -11808:2:1380 -11809:2:1381 -11810:2:1389 -11811:2:1394 -11812:2:1398 -11813:2:1399 -11814:2:1406 -11815:2:1407 -11816:2:1418 -11817:2:1419 -11818:2:1420 -11819:2:1418 -11820:2:1419 -11821:2:1420 -11822:2:1431 -11823:2:1436 -11824:2:1437 -11825:0:4365 -11826:2:1449 -11827:0:4365 -11828:3:3558 -11829:0:4365 -11830:2:1451 -11831:0:4365 -11832:3:3559 -11833:0:4365 -11834:2:1652 -11835:0:4365 -11836:2:1653 -11837:0:4365 -11838:2:1657 -11839:0:4365 -11840:2:1180 -11841:0:4365 -11842:3:3558 -11843:0:4365 -11844:2:1181 -11845:2:1185 -11846:2:1186 -11847:2:1194 -11848:2:1195 -11849:2:1199 -11850:2:1200 -11851:2:1194 -11852:2:1195 -11853:2:1196 -11854:2:1208 -11855:2:1213 -11856:2:1217 -11857:2:1218 -11858:2:1225 -11859:2:1226 -11860:2:1237 -11861:2:1238 -11862:2:1239 -11863:2:1237 -11864:2:1238 -11865:2:1239 -11866:2:1250 -11867:2:1255 -11868:2:1256 -11869:0:4365 -11870:3:3559 -11871:0:4365 -11872:2:1268 -11873:0:4365 -11874:3:3558 -11875:0:4365 -11876:2:1270 -11877:0:4365 -11878:3:3559 -11879:0:4365 -11880:2:1271 -11881:2:1275 -11882:2:1276 -11883:2:1284 -11884:2:1285 -11885:2:1289 -11886:2:1290 -11887:2:1284 -11888:2:1285 -11889:2:1289 -11890:2:1290 -11891:2:1298 -11892:2:1303 -11893:2:1307 -11894:2:1308 -11895:2:1315 -11896:2:1316 -11897:2:1327 -11898:2:1328 -11899:2:1329 -11900:2:1327 -11901:2:1328 -11902:2:1329 -11903:2:1340 -11904:2:1345 -11905:2:1346 -11906:0:4365 -11907:2:1358 -11908:0:4365 -11909:2:1454 -11910:0:4365 -11911:3:3558 -11912:0:4365 -11913:2:1455 -11914:0:4365 -11915:3:3559 -11916:0:4365 -11917:2:1652 -11918:0:4365 -11919:2:1653 -11920:0:4365 -11921:2:1657 -11922:0:4365 -11923:2:1660 -11924:0:4365 -11925:3:3558 -11926:0:4365 -11927:2:1665 -11928:2:1669 -11929:2:1670 -11930:2:1678 -11931:2:1679 -11932:2:1683 -11933:2:1684 -11934:2:1678 -11935:2:1679 -11936:2:1680 -11937:2:1692 -11938:2:1697 -11939:2:1701 -11940:2:1702 -11941:2:1709 -11942:2:1710 -11943:2:1721 -11944:2:1722 -11945:2:1723 -11946:2:1721 -11947:2:1722 -11948:2:1723 -11949:2:1734 -11950:2:1739 -11951:2:1740 -11952:0:4365 -11953:3:3559 -11954:0:4365 -11955:2:1752 -11956:0:4365 -11957:3:3558 -11958:0:4365 -11959:2:1754 -11960:0:4365 -11961:3:3559 -11962:0:4365 -11963:2:1755 -11964:2:1759 -11965:2:1760 -11966:2:1768 -11967:2:1769 -11968:2:1773 -11969:2:1774 -11970:2:1768 -11971:2:1769 -11972:2:1773 -11973:2:1774 -11974:2:1782 -11975:2:1787 -11976:2:1791 -11977:2:1792 -11978:2:1799 -11979:2:1800 -11980:2:1811 -11981:2:1812 -11982:2:1813 -11983:2:1811 -11984:2:1812 -11985:2:1813 -11986:2:1824 -11987:2:1829 -11988:2:1830 -11989:0:4365 -11990:2:1842 -11991:0:4365 -11992:3:3558 -11993:0:4365 -11994:2:1844 -11995:0:4365 -11996:3:3559 -11997:0:4365 -11998:2:1845 -11999:2:1849 -12000:2:1850 -12001:2:1858 -12002:2:1859 -12003:2:1863 -12004:2:1864 -12005:2:1858 -12006:2:1859 -12007:2:1863 -12008:2:1864 -12009:2:1872 -12010:2:1877 -12011:2:1881 -12012:2:1882 -12013:2:1889 -12014:2:1890 -12015:2:1901 -12016:2:1902 -12017:2:1903 -12018:2:1901 -12019:2:1902 -12020:2:1903 -12021:2:1914 -12022:2:1919 -12023:2:1920 -12024:0:4365 -12025:2:1932 -12026:0:4365 -12027:3:3558 -12028:0:4365 -12029:2:1934 -12030:0:4365 -12031:3:3559 -12032:0:4365 -12033:2:1935 -12034:0:4365 -12035:2:1936 -12036:0:4365 -12037:2:2129 -12038:0:4365 -12039:2:2130 -12040:0:4365 -12041:2:2134 -12042:0:4365 -12043:3:3558 -12044:0:4365 -12045:2:2136 -12046:0:4365 -12047:3:3559 -12048:0:4365 -12049:2:2137 -12050:2:2141 -12051:2:2142 -12052:2:2150 -12053:2:2151 -12054:2:2155 -12055:2:2156 -12056:2:2150 -12057:2:2151 -12058:2:2155 -12059:2:2156 -12060:2:2164 -12061:2:2169 -12062:2:2173 -12063:2:2174 -12064:2:2181 -12065:2:2182 -12066:2:2193 -12067:2:2194 -12068:2:2195 -12069:2:2193 -12070:2:2194 -12071:2:2195 -12072:2:2206 -12073:2:2211 -12074:2:2212 -12075:0:4365 -12076:2:2224 -12077:0:4365 -12078:3:3558 -12079:0:4365 -12080:2:2226 -12081:0:4365 -12082:3:3559 -12083:0:4365 -12084:2:1936 -12085:0:4365 -12086:2:2129 -12087:0:4365 -12088:2:2130 -12089:0:4365 -12090:2:2134 -12091:0:4365 -12092:3:3558 -12093:0:4365 -12094:2:2136 -12095:0:4365 -12096:3:3559 -12097:0:4365 -12098:2:2137 -12099:2:2141 -12100:2:2142 -12101:2:2150 -12102:2:2151 -12103:2:2155 -12104:2:2156 -12105:2:2150 -12106:2:2151 -12107:2:2152 -12108:2:2164 -12109:2:2169 -12110:2:2173 -12111:2:2174 -12112:2:2181 -12113:2:2182 -12114:2:2193 -12115:2:2194 -12116:2:2195 -12117:2:2193 -12118:2:2194 -12119:2:2195 -12120:2:2206 -12121:2:2211 -12122:2:2212 -12123:0:4365 -12124:2:2224 -12125:0:4365 -12126:3:3558 -12127:0:4365 -12128:2:2226 -12129:0:4365 -12130:3:3559 -12131:0:4365 -12132:2:2230 -12133:0:4365 -12134:3:3558 -12135:0:4365 -12136:2:2235 -12137:2:2239 -12138:2:2240 -12139:2:2248 -12140:2:2249 -12141:2:2253 -12142:2:2254 -12143:2:2248 -12144:2:2249 -12145:2:2250 -12146:2:2262 -12147:2:2267 -12148:2:2271 -12149:2:2272 -12150:2:2279 -12151:2:2280 -12152:2:2291 -12153:2:2292 -12154:2:2293 -12155:2:2291 -12156:2:2292 -12157:2:2293 -12158:2:2304 -12159:2:2309 -12160:2:2310 -12161:0:4365 -12162:3:3559 -12163:0:4365 -12164:2:2322 -12165:0:4365 -12166:2:1169 -12167:0:4365 -12168:3:3558 -12169:0:4365 -12170:2:1170 -12171:0:4365 -12172:3:3559 -12173:0:4365 -12174:3:3560 -12175:0:4365 -12176:3:3566 -12177:0:4365 -12178:3:3569 -12179:3:3570 -12180:3:3582 -12181:3:3583 -12182:3:3587 -12183:3:3588 -12184:3:3582 -12185:3:3583 -12186:3:3587 -12187:3:3588 -12188:3:3596 -12189:3:3601 -12190:3:3605 -12191:3:3606 -12192:3:3613 -12193:3:3614 -12194:3:3625 -12195:3:3626 -12196:3:3627 -12197:3:3625 -12198:3:3626 -12199:3:3627 -12200:3:3638 -12201:3:3643 -12202:3:3644 -12203:0:4365 -12204:3:3656 -12205:0:4365 -12206:3:3657 -12207:0:4365 -12208:2:1173 -12209:0:4365 -12210:3:3658 -12211:0:4365 -12212:2:1179 -12213:0:4365 -12214:2:1180 -12215:0:4365 -12216:3:3657 -12217:0:4365 -12218:2:1181 -12219:2:1185 -12220:2:1186 -12221:2:1194 -12222:2:1195 -12223:2:1199 -12224:2:1200 -12225:2:1194 -12226:2:1195 -12227:2:1199 -12228:2:1200 -12229:2:1208 -12230:2:1213 -12231:2:1217 -12232:2:1218 -12233:2:1225 -12234:2:1226 -12235:2:1237 -12236:2:1238 -12237:2:1239 -12238:2:1237 -12239:2:1238 -12240:2:1239 -12241:2:1250 -12242:2:1255 -12243:2:1256 -12244:0:4365 -12245:3:3658 -12246:0:4365 -12247:2:1268 -12248:0:4365 -12249:3:3657 -12250:0:4365 -12251:2:1270 -12252:0:4365 -12253:3:3658 -12254:0:4365 -12255:2:1271 -12256:2:1275 -12257:2:1276 -12258:2:1284 -12259:2:1285 -12260:2:1289 -12261:2:1290 -12262:2:1284 -12263:2:1285 -12264:2:1289 -12265:2:1290 -12266:2:1298 -12267:2:1303 -12268:2:1307 -12269:2:1308 -12270:2:1315 -12271:2:1316 -12272:2:1327 -12273:2:1328 -12274:2:1329 -12275:2:1327 -12276:2:1328 -12277:2:1329 -12278:2:1340 -12279:2:1345 -12280:2:1346 -12281:0:4365 -12282:2:1358 -12283:0:4365 -12284:2:1360 -12285:0:4365 -12286:3:3657 -12287:0:4365 -12288:2:1361 -12289:0:4365 -12290:3:3658 -12291:0:4365 -12292:2:1362 -12293:2:1366 -12294:2:1367 -12295:2:1375 -12296:2:1376 -12297:2:1380 -12298:2:1381 -12299:2:1375 -12300:2:1376 -12301:2:1380 -12302:2:1381 -12303:2:1389 -12304:2:1394 -12305:2:1398 -12306:2:1399 -12307:2:1406 -12308:2:1407 -12309:2:1418 -12310:2:1419 -12311:2:1420 -12312:2:1418 -12313:2:1419 -12314:2:1420 -12315:2:1431 -12316:2:1436 -12317:2:1437 -12318:0:4365 -12319:2:1449 -12320:0:4365 -12321:3:3657 -12322:0:4365 -12323:2:1451 -12324:0:4365 -12325:3:3658 -12326:0:4365 -12327:2:1652 -12328:0:4365 -12329:2:1653 -12330:0:4365 -12331:2:1657 -12332:0:4365 -12333:2:1180 -12334:0:4365 -12335:3:3657 -12336:0:4365 -12337:2:1181 -12338:2:1185 -12339:2:1186 -12340:2:1194 -12341:2:1195 -12342:2:1199 -12343:2:1200 -12344:2:1194 -12345:2:1195 -12346:2:1196 -12347:2:1208 -12348:2:1213 -12349:2:1217 -12350:2:1218 -12351:2:1225 -12352:2:1226 -12353:2:1237 -12354:2:1238 -12355:2:1239 -12356:2:1237 -12357:2:1238 -12358:2:1239 -12359:2:1250 -12360:2:1255 -12361:2:1256 -12362:0:4365 -12363:3:3658 -12364:0:4365 -12365:2:1268 -12366:0:4365 -12367:3:3657 -12368:0:4365 -12369:2:1270 -12370:0:4365 -12371:3:3658 -12372:0:4365 -12373:2:1271 -12374:2:1275 -12375:2:1276 -12376:2:1284 -12377:2:1285 -12378:2:1289 -12379:2:1290 -12380:2:1284 -12381:2:1285 -12382:2:1289 -12383:2:1290 -12384:2:1298 -12385:2:1303 -12386:2:1307 -12387:2:1308 -12388:2:1315 -12389:2:1316 -12390:2:1327 -12391:2:1328 -12392:2:1329 -12393:2:1327 -12394:2:1328 -12395:2:1329 -12396:2:1340 -12397:2:1345 -12398:2:1346 -12399:0:4365 -12400:2:1358 -12401:0:4365 -12402:2:1454 -12403:0:4365 -12404:3:3657 -12405:0:4365 -12406:2:1455 -12407:0:4365 -12408:3:3658 -12409:0:4365 -12410:2:1652 -12411:0:4365 -12412:2:1653 -12413:0:4365 -12414:2:1657 -12415:0:4365 -12416:2:1660 -12417:0:4365 -12418:3:3657 -12419:0:4365 -12420:2:1665 -12421:2:1669 -12422:2:1670 -12423:2:1678 -12424:2:1679 -12425:2:1683 -12426:2:1684 -12427:2:1678 -12428:2:1679 -12429:2:1680 -12430:2:1692 -12431:2:1697 -12432:2:1701 -12433:2:1702 -12434:2:1709 -12435:2:1710 -12436:2:1721 -12437:2:1722 -12438:2:1723 -12439:2:1721 -12440:2:1722 -12441:2:1723 -12442:2:1734 -12443:2:1739 -12444:2:1740 -12445:0:4365 -12446:3:3658 -12447:0:4365 -12448:2:1752 -12449:0:4365 -12450:3:3657 -12451:0:4365 -12452:2:1754 -12453:0:4365 -12454:3:3658 -12455:0:4365 -12456:2:1755 -12457:2:1759 -12458:2:1760 -12459:2:1768 -12460:2:1769 -12461:2:1773 -12462:2:1774 -12463:2:1768 -12464:2:1769 -12465:2:1773 -12466:2:1774 -12467:2:1782 -12468:2:1787 -12469:2:1791 -12470:2:1792 -12471:2:1799 -12472:2:1800 -12473:2:1811 -12474:2:1812 -12475:2:1813 -12476:2:1811 -12477:2:1812 -12478:2:1813 -12479:2:1824 -12480:2:1829 -12481:2:1830 -12482:0:4365 -12483:2:1842 -12484:0:4365 -12485:3:3657 -12486:0:4365 -12487:2:1844 -12488:0:4365 -12489:3:3658 -12490:0:4365 -12491:2:1845 -12492:2:1849 -12493:2:1850 -12494:2:1858 -12495:2:1859 -12496:2:1863 -12497:2:1864 -12498:2:1858 -12499:2:1859 -12500:2:1863 -12501:2:1864 -12502:2:1872 -12503:2:1877 -12504:2:1881 -12505:2:1882 -12506:2:1889 -12507:2:1890 -12508:2:1901 -12509:2:1902 -12510:2:1903 -12511:2:1901 -12512:2:1902 -12513:2:1903 -12514:2:1914 -12515:2:1919 -12516:2:1920 -12517:0:4365 -12518:2:1932 -12519:0:4365 -12520:3:3657 -12521:0:4365 -12522:2:1934 -12523:0:4365 -12524:3:3658 -12525:0:4365 -12526:2:1935 -12527:0:4365 -12528:2:1936 -12529:0:4365 -12530:2:2129 -12531:0:4365 -12532:2:2130 -12533:0:4365 -12534:2:2134 -12535:0:4365 -12536:3:3657 -12537:0:4365 -12538:2:2136 -12539:0:4365 -12540:3:3658 -12541:0:4365 -12542:2:2137 -12543:2:2141 -12544:2:2142 -12545:2:2150 -12546:2:2151 -12547:2:2155 -12548:2:2156 -12549:2:2150 -12550:2:2151 -12551:2:2155 -12552:2:2156 -12553:2:2164 -12554:2:2169 -12555:2:2173 -12556:2:2174 -12557:2:2181 -12558:2:2182 -12559:2:2193 -12560:2:2194 -12561:2:2195 -12562:2:2193 -12563:2:2194 -12564:2:2195 -12565:2:2206 -12566:2:2211 -12567:2:2212 -12568:0:4365 -12569:2:2224 -12570:0:4365 -12571:3:3657 -12572:0:4365 -12573:2:2226 -12574:0:4365 -12575:3:3658 -12576:0:4365 -12577:2:1936 -12578:0:4365 -12579:2:2129 -12580:0:4365 -12581:2:2130 -12582:0:4365 -12583:2:2134 -12584:0:4365 -12585:3:3657 -12586:0:4365 -12587:2:2136 -12588:0:4365 -12589:3:3658 -12590:0:4365 -12591:2:2137 -12592:2:2141 -12593:2:2142 -12594:2:2150 -12595:2:2151 -12596:2:2155 -12597:2:2156 -12598:2:2150 -12599:2:2151 -12600:2:2152 -12601:2:2164 -12602:2:2169 -12603:2:2173 -12604:2:2174 -12605:2:2181 -12606:2:2182 -12607:2:2193 -12608:2:2194 -12609:2:2195 -12610:2:2193 -12611:2:2194 -12612:2:2195 -12613:2:2206 -12614:2:2211 -12615:2:2212 -12616:0:4365 -12617:2:2224 -12618:0:4365 -12619:3:3657 -12620:0:4365 -12621:2:2226 -12622:0:4365 -12623:3:3658 -12624:0:4365 -12625:2:2230 -12626:0:4365 -12627:3:3657 -12628:0:4365 -12629:2:2235 -12630:2:2239 -12631:2:2240 -12632:2:2248 -12633:2:2249 -12634:2:2253 -12635:2:2254 -12636:2:2248 -12637:2:2249 -12638:2:2250 -12639:2:2262 -12640:2:2267 -12641:2:2271 -12642:2:2272 -12643:2:2279 -12644:2:2280 -12645:2:2291 -12646:2:2292 -12647:2:2293 -12648:2:2291 -12649:2:2292 -12650:2:2293 -12651:2:2304 -12652:2:2309 -12653:2:2310 -12654:0:4365 -12655:3:3658 -12656:0:4365 -12657:2:2322 -12658:0:4365 -12659:2:1169 -12660:0:4365 -12661:3:3657 -12662:0:4365 -12663:2:1170 -12664:0:4365 -12665:3:3658 -12666:0:4365 -12667:3:3659 -12668:0:4365 -12669:3:3665 -12670:0:4365 -12671:3:3666 -12672:0:4365 -12673:3:3667 -12674:0:4365 -12675:3:3668 -12676:0:4365 -12677:3:3669 -12678:3:3673 -12679:3:3674 -12680:3:3682 -12681:3:3683 -12682:3:3687 -12683:3:3688 -12684:3:3682 -12685:3:3683 -12686:3:3687 -12687:3:3688 -12688:3:3696 -12689:3:3701 -12690:3:3705 -12691:3:3706 -12692:3:3713 -12693:3:3714 -12694:3:3725 -12695:3:3726 -12696:3:3727 -12697:3:3725 -12698:3:3726 -12699:3:3727 -12700:3:3738 -12701:3:3743 -12702:3:3744 -12703:0:4365 -12704:3:3756 -12705:0:4365 -12706:3:3757 -12707:0:4365 -12708:2:1173 -12709:0:4365 -12710:3:3758 -12711:0:4365 -12712:2:1179 -12713:0:4365 -12714:2:1180 -12715:0:4365 -12716:3:3757 -12717:0:4365 -12718:2:1181 -12719:2:1185 -12720:2:1186 -12721:2:1194 -12722:2:1195 -12723:2:1199 -12724:2:1200 -12725:2:1194 -12726:2:1195 -12727:2:1199 -12728:2:1200 -12729:2:1208 -12730:2:1213 -12731:2:1217 -12732:2:1218 -12733:2:1225 -12734:2:1226 -12735:2:1237 -12736:2:1238 -12737:2:1239 -12738:2:1237 -12739:2:1238 -12740:2:1239 -12741:2:1250 -12742:2:1255 -12743:2:1256 -12744:0:4365 -12745:3:3758 -12746:0:4365 -12747:2:1268 -12748:0:4365 -12749:3:3757 -12750:0:4365 -12751:2:1270 -12752:0:4365 -12753:3:3758 -12754:0:4365 -12755:2:1271 -12756:2:1275 -12757:2:1276 -12758:2:1284 -12759:2:1285 -12760:2:1289 -12761:2:1290 -12762:2:1284 -12763:2:1285 -12764:2:1289 -12765:2:1290 -12766:2:1298 -12767:2:1303 -12768:2:1307 -12769:2:1308 -12770:2:1315 -12771:2:1316 -12772:2:1327 -12773:2:1328 -12774:2:1329 -12775:2:1327 -12776:2:1328 -12777:2:1329 -12778:2:1340 -12779:2:1345 -12780:2:1346 -12781:0:4365 -12782:2:1358 -12783:0:4365 -12784:2:1360 -12785:0:4365 -12786:3:3757 -12787:0:4365 -12788:2:1361 -12789:0:4365 -12790:3:3758 -12791:0:4365 -12792:2:1362 -12793:2:1366 -12794:2:1367 -12795:2:1375 -12796:2:1376 -12797:2:1380 -12798:2:1381 -12799:2:1375 -12800:2:1376 -12801:2:1380 -12802:2:1381 -12803:2:1389 -12804:2:1394 -12805:2:1398 -12806:2:1399 -12807:2:1406 -12808:2:1407 -12809:2:1418 -12810:2:1419 -12811:2:1420 -12812:2:1418 -12813:2:1419 -12814:2:1420 -12815:2:1431 -12816:2:1436 -12817:2:1437 -12818:0:4365 -12819:2:1449 -12820:0:4365 -12821:3:3757 -12822:0:4365 -12823:2:1451 -12824:0:4365 -12825:3:3758 -12826:0:4365 -12827:2:1652 -12828:0:4365 -12829:2:1653 -12830:0:4365 -12831:2:1657 -12832:0:4365 -12833:2:1180 -12834:0:4365 -12835:3:3757 -12836:0:4365 -12837:2:1181 -12838:2:1185 -12839:2:1186 -12840:2:1194 -12841:2:1195 -12842:2:1199 -12843:2:1200 -12844:2:1194 -12845:2:1195 -12846:2:1196 -12847:2:1208 -12848:2:1213 -12849:2:1217 -12850:2:1218 -12851:2:1225 -12852:2:1226 -12853:2:1237 -12854:2:1238 -12855:2:1239 -12856:2:1237 -12857:2:1238 -12858:2:1239 -12859:2:1250 -12860:2:1255 -12861:2:1256 -12862:0:4365 -12863:3:3758 -12864:0:4365 -12865:2:1268 -12866:0:4365 -12867:3:3757 -12868:0:4365 -12869:2:1270 -12870:0:4365 -12871:3:3758 -12872:0:4365 -12873:2:1271 -12874:2:1275 -12875:2:1276 -12876:2:1284 -12877:2:1285 -12878:2:1289 -12879:2:1290 -12880:2:1284 -12881:2:1285 -12882:2:1289 -12883:2:1290 -12884:2:1298 -12885:2:1303 -12886:2:1307 -12887:2:1308 -12888:2:1315 -12889:2:1316 -12890:2:1327 -12891:2:1328 -12892:2:1329 -12893:2:1327 -12894:2:1328 -12895:2:1329 -12896:2:1340 -12897:2:1345 -12898:2:1346 -12899:0:4365 -12900:2:1358 -12901:0:4365 -12902:2:1454 -12903:0:4365 -12904:3:3757 -12905:0:4365 -12906:2:1455 -12907:0:4365 -12908:3:3758 -12909:0:4365 -12910:2:1652 -12911:0:4365 -12912:2:1653 -12913:0:4365 -12914:2:1657 -12915:0:4365 -12916:2:1660 -12917:0:4365 -12918:3:3757 -12919:0:4365 -12920:2:1665 -12921:2:1669 -12922:2:1670 -12923:2:1678 -12924:2:1679 -12925:2:1683 -12926:2:1684 -12927:2:1678 -12928:2:1679 -12929:2:1680 -12930:2:1692 -12931:2:1697 -12932:2:1701 -12933:2:1702 -12934:2:1709 -12935:2:1710 -12936:2:1721 -12937:2:1722 -12938:2:1723 -12939:2:1721 -12940:2:1722 -12941:2:1723 -12942:2:1734 -12943:2:1739 -12944:2:1740 -12945:0:4365 -12946:3:3758 -12947:0:4365 -12948:2:1752 -12949:0:4365 -12950:3:3757 -12951:0:4365 -12952:2:1754 -12953:0:4365 -12954:3:3758 -12955:0:4365 -12956:2:1755 -12957:2:1759 -12958:2:1760 -12959:2:1768 -12960:2:1769 -12961:2:1773 -12962:2:1774 -12963:2:1768 -12964:2:1769 -12965:2:1773 -12966:2:1774 -12967:2:1782 -12968:2:1787 -12969:2:1791 -12970:2:1792 -12971:2:1799 -12972:2:1800 -12973:2:1811 -12974:2:1812 -12975:2:1813 -12976:2:1811 -12977:2:1812 -12978:2:1813 -12979:2:1824 -12980:2:1829 -12981:2:1830 -12982:0:4365 -12983:2:1842 -12984:0:4365 -12985:3:3757 -12986:0:4365 -12987:2:1844 -12988:0:4365 -12989:3:3758 -12990:0:4365 -12991:2:1845 -12992:2:1849 -12993:2:1850 -12994:2:1858 -12995:2:1859 -12996:2:1863 -12997:2:1864 -12998:2:1858 -12999:2:1859 -13000:2:1863 -13001:2:1864 -13002:2:1872 -13003:2:1877 -13004:2:1881 -13005:2:1882 -13006:2:1889 -13007:2:1890 -13008:2:1901 -13009:2:1902 -13010:2:1903 -13011:2:1901 -13012:2:1902 -13013:2:1903 -13014:2:1914 -13015:2:1919 -13016:2:1920 -13017:0:4365 -13018:2:1932 -13019:0:4365 -13020:3:3757 -13021:0:4365 -13022:2:1934 -13023:0:4365 -13024:3:3758 -13025:0:4365 -13026:2:1935 -13027:0:4365 -13028:2:1936 -13029:0:4365 -13030:2:2129 -13031:0:4365 -13032:2:2130 -13033:0:4365 -13034:2:2134 -13035:0:4365 -13036:3:3757 -13037:0:4365 -13038:2:2136 -13039:0:4365 -13040:3:3758 -13041:0:4365 -13042:2:2137 -13043:2:2141 -13044:2:2142 -13045:2:2150 -13046:2:2151 -13047:2:2155 -13048:2:2156 -13049:2:2150 -13050:2:2151 -13051:2:2155 -13052:2:2156 -13053:2:2164 -13054:2:2169 -13055:2:2173 -13056:2:2174 -13057:2:2181 -13058:2:2182 -13059:2:2193 -13060:2:2194 -13061:2:2195 -13062:2:2193 -13063:2:2194 -13064:2:2195 -13065:2:2206 -13066:2:2211 -13067:2:2212 -13068:0:4365 -13069:2:2224 -13070:0:4365 -13071:3:3757 -13072:0:4365 -13073:2:2226 -13074:0:4365 -13075:3:3758 -13076:0:4365 -13077:2:1936 -13078:0:4365 -13079:2:2129 -13080:0:4365 -13081:2:2130 -13082:0:4365 -13083:2:2134 -13084:0:4365 -13085:3:3757 -13086:0:4365 -13087:2:2136 -13088:0:4365 -13089:3:3758 -13090:0:4365 -13091:2:2137 -13092:2:2141 -13093:2:2142 -13094:2:2150 -13095:2:2151 -13096:2:2155 -13097:2:2156 -13098:2:2150 -13099:2:2151 -13100:2:2152 -13101:2:2164 -13102:2:2169 -13103:2:2173 -13104:2:2174 -13105:2:2181 -13106:2:2182 -13107:2:2193 -13108:2:2194 -13109:2:2195 -13110:2:2193 -13111:2:2194 -13112:2:2195 -13113:2:2206 -13114:2:2211 -13115:2:2212 -13116:0:4365 -13117:2:2224 -13118:0:4365 -13119:3:3757 -13120:0:4365 -13121:2:2226 -13122:0:4365 -13123:3:3758 -13124:0:4365 -13125:2:2230 -13126:0:4365 -13127:3:3757 -13128:0:4365 -13129:2:2235 -13130:2:2239 -13131:2:2240 -13132:2:2248 -13133:2:2249 -13134:2:2253 -13135:2:2254 -13136:2:2248 -13137:2:2249 -13138:2:2250 -13139:2:2262 -13140:2:2267 -13141:2:2271 -13142:2:2272 -13143:2:2279 -13144:2:2280 -13145:2:2291 -13146:2:2292 -13147:2:2293 -13148:2:2291 -13149:2:2292 -13150:2:2293 -13151:2:2304 -13152:2:2309 -13153:2:2310 -13154:0:4365 -13155:3:3758 -13156:0:4365 -13157:2:2322 -13158:0:4365 -13159:2:1169 -13160:0:4365 -13161:3:3757 -13162:0:4365 -13163:2:1170 -13164:0:4365 -13165:3:3758 -13166:0:4365 -13167:3:3759 -13168:0:4365 -13169:3:3972 -13170:0:4365 -13171:3:3980 -13172:0:4365 -13173:3:3981 -13174:3:3985 -13175:3:3986 -13176:3:3994 -13177:3:3995 -13178:3:3999 -13179:3:4000 -13180:3:3994 -13181:3:3995 -13182:3:3999 -13183:3:4000 -13184:3:4008 -13185:3:4013 -13186:3:4017 -13187:3:4018 -13188:3:4025 -13189:3:4026 -13190:3:4037 -13191:3:4038 -13192:3:4039 -13193:3:4037 -13194:3:4038 -13195:3:4039 -13196:3:4050 -13197:3:4055 -13198:3:4056 -13199:0:4365 -13200:3:4068 -13201:0:4365 -13202:3:4069 -13203:0:4365 -13204:2:1173 -13205:0:4365 -13206:3:4070 -13207:0:4365 -13208:2:1179 -13209:0:4365 -13210:2:1180 -13211:0:4365 -13212:3:4069 -13213:0:4365 -13214:2:1181 -13215:2:1185 -13216:2:1186 -13217:2:1194 -13218:2:1195 -13219:2:1199 -13220:2:1200 -13221:2:1194 -13222:2:1195 -13223:2:1199 -13224:2:1200 -13225:2:1208 -13226:2:1213 -13227:2:1217 -13228:2:1218 -13229:2:1225 -13230:2:1226 -13231:2:1237 -13232:2:1238 -13233:2:1239 -13234:2:1237 -13235:2:1238 -13236:2:1239 -13237:2:1250 -13238:2:1255 -13239:2:1256 -13240:0:4365 -13241:3:4070 -13242:0:4365 -13243:2:1268 -13244:0:4365 -13245:3:4069 -13246:0:4365 -13247:2:1270 -13248:0:4365 -13249:3:4070 -13250:0:4365 -13251:2:1271 -13252:2:1275 -13253:2:1276 -13254:2:1284 -13255:2:1285 -13256:2:1289 -13257:2:1290 -13258:2:1284 -13259:2:1285 -13260:2:1289 -13261:2:1290 -13262:2:1298 -13263:2:1303 -13264:2:1307 -13265:2:1308 -13266:2:1315 -13267:2:1316 -13268:2:1327 -13269:2:1328 -13270:2:1329 -13271:2:1327 -13272:2:1328 -13273:2:1329 -13274:2:1340 -13275:2:1345 -13276:2:1346 -13277:0:4365 -13278:2:1358 -13279:0:4365 -13280:2:1360 -13281:0:4365 -13282:3:4069 -13283:0:4365 -13284:2:1361 -13285:0:4365 -13286:3:4070 -13287:0:4365 -13288:2:1362 -13289:2:1366 -13290:2:1367 -13291:2:1375 -13292:2:1376 -13293:2:1380 -13294:2:1381 -13295:2:1375 -13296:2:1376 -13297:2:1380 -13298:2:1381 -13299:2:1389 -13300:2:1394 -13301:2:1398 -13302:2:1399 -13303:2:1406 -13304:2:1407 -13305:2:1418 -13306:2:1419 -13307:2:1420 -13308:2:1418 -13309:2:1419 -13310:2:1420 -13311:2:1431 -13312:2:1436 -13313:2:1437 -13314:0:4365 -13315:2:1449 -13316:0:4365 -13317:3:4069 -13318:0:4365 -13319:2:1451 -13320:0:4365 -13321:3:4070 -13322:0:4365 -13323:2:1652 -13324:0:4365 -13325:2:1653 -13326:0:4365 -13327:2:1657 -13328:0:4365 -13329:2:1180 -13330:0:4365 -13331:3:4069 -13332:0:4365 -13333:2:1181 -13334:2:1185 -13335:2:1186 -13336:2:1194 -13337:2:1195 -13338:2:1199 -13339:2:1200 -13340:2:1194 -13341:2:1195 -13342:2:1196 -13343:2:1208 -13344:2:1213 -13345:2:1217 -13346:2:1218 -13347:2:1225 -13348:2:1226 -13349:2:1237 -13350:2:1238 -13351:2:1239 -13352:2:1237 -13353:2:1238 -13354:2:1239 -13355:2:1250 -13356:2:1255 -13357:2:1256 -13358:0:4365 -13359:3:4070 -13360:0:4365 -13361:2:1268 -13362:0:4365 -13363:3:4069 -13364:0:4365 -13365:2:1270 -13366:0:4365 -13367:3:4070 -13368:0:4365 -13369:2:1271 -13370:2:1275 -13371:2:1276 -13372:2:1284 -13373:2:1285 -13374:2:1289 -13375:2:1290 -13376:2:1284 -13377:2:1285 -13378:2:1289 -13379:2:1290 -13380:2:1298 -13381:2:1303 -13382:2:1307 -13383:2:1308 -13384:2:1315 -13385:2:1316 -13386:2:1327 -13387:2:1328 -13388:2:1329 -13389:2:1327 -13390:2:1328 -13391:2:1329 -13392:2:1340 -13393:2:1345 -13394:2:1346 -13395:0:4365 -13396:2:1358 -13397:0:4365 -13398:2:1454 -13399:0:4365 -13400:3:4069 -13401:0:4365 -13402:2:1455 -13403:0:4365 -13404:3:4070 -13405:0:4365 -13406:2:1652 -13407:0:4365 -13408:2:1653 -13409:0:4365 -13410:2:1657 -13411:0:4365 -13412:2:1660 -13413:0:4365 -13414:3:4069 -13415:0:4365 -13416:2:1665 -13417:2:1669 -13418:2:1670 -13419:2:1678 -13420:2:1679 -13421:2:1683 -13422:2:1684 -13423:2:1678 -13424:2:1679 -13425:2:1680 -13426:2:1692 -13427:2:1697 -13428:2:1701 -13429:2:1702 -13430:2:1709 -13431:2:1710 -13432:2:1721 -13433:2:1722 -13434:2:1723 -13435:2:1721 -13436:2:1722 -13437:2:1723 -13438:2:1734 -13439:2:1739 -13440:2:1740 -13441:0:4365 -13442:3:4070 -13443:0:4365 -13444:2:1752 -13445:0:4365 -13446:3:4069 -13447:0:4365 -13448:2:1754 -13449:0:4365 -13450:3:4070 -13451:0:4365 -13452:2:1755 -13453:2:1759 -13454:2:1760 -13455:2:1768 -13456:2:1769 -13457:2:1773 -13458:2:1774 -13459:2:1768 -13460:2:1769 -13461:2:1773 -13462:2:1774 -13463:2:1782 -13464:2:1787 -13465:2:1791 -13466:2:1792 -13467:2:1799 -13468:2:1800 -13469:2:1811 -13470:2:1812 -13471:2:1813 -13472:2:1811 -13473:2:1812 -13474:2:1813 -13475:2:1824 -13476:2:1829 -13477:2:1830 -13478:0:4365 -13479:2:1842 -13480:0:4365 -13481:3:4069 -13482:0:4365 -13483:2:1844 -13484:0:4365 -13485:3:4070 -13486:0:4365 -13487:2:1845 -13488:2:1849 -13489:2:1850 -13490:2:1858 -13491:2:1859 -13492:2:1863 -13493:2:1864 -13494:2:1858 -13495:2:1859 -13496:2:1863 -13497:2:1864 -13498:2:1872 -13499:2:1877 -13500:2:1881 -13501:2:1882 -13502:2:1889 -13503:2:1890 -13504:2:1901 -13505:2:1902 -13506:2:1903 -13507:2:1901 -13508:2:1902 -13509:2:1903 -13510:2:1914 -13511:2:1919 -13512:2:1920 -13513:0:4365 -13514:2:1932 -13515:0:4365 -13516:3:4069 -13517:0:4365 -13518:2:1934 -13519:0:4365 -13520:3:4070 -13521:0:4365 -13522:2:1935 -13523:0:4365 -13524:2:1936 -13525:0:4365 -13526:2:2129 -13527:0:4365 -13528:2:2130 -13529:0:4365 -13530:2:2134 -13531:0:4365 -13532:3:4069 -13533:0:4365 -13534:2:2136 -13535:0:4365 -13536:3:4070 -13537:0:4365 -13538:2:2137 -13539:2:2141 -13540:2:2142 -13541:2:2150 -13542:2:2151 -13543:2:2155 -13544:2:2156 -13545:2:2150 -13546:2:2151 -13547:2:2155 -13548:2:2156 -13549:2:2164 -13550:2:2169 -13551:2:2173 -13552:2:2174 -13553:2:2181 -13554:2:2182 -13555:2:2193 -13556:2:2194 -13557:2:2195 -13558:2:2193 -13559:2:2194 -13560:2:2195 -13561:2:2206 -13562:2:2211 -13563:2:2212 -13564:0:4365 -13565:2:2224 -13566:0:4365 -13567:3:4069 -13568:0:4365 -13569:2:2226 -13570:0:4365 -13571:3:4070 -13572:0:4365 -13573:2:1936 -13574:0:4365 -13575:2:2129 -13576:0:4365 -13577:2:2130 -13578:0:4365 -13579:2:2134 -13580:0:4365 -13581:3:4069 -13582:0:4365 -13583:2:2136 -13584:0:4365 -13585:3:4070 -13586:0:4365 -13587:2:2137 -13588:2:2141 -13589:2:2142 -13590:2:2150 -13591:2:2151 -13592:2:2155 -13593:2:2156 -13594:2:2150 -13595:2:2151 -13596:2:2152 -13597:2:2164 -13598:2:2169 -13599:2:2173 -13600:2:2174 -13601:2:2181 -13602:2:2182 -13603:2:2193 -13604:2:2194 -13605:2:2195 -13606:2:2193 -13607:2:2194 -13608:2:2195 -13609:2:2206 -13610:2:2211 -13611:2:2212 -13612:0:4365 -13613:2:2224 -13614:0:4365 -13615:3:4069 -13616:0:4365 -13617:2:2226 -13618:0:4365 -13619:3:4070 -13620:0:4365 -13621:2:2230 -13622:0:4365 -13623:3:4069 -13624:0:4365 -13625:2:2235 -13626:2:2239 -13627:2:2240 -13628:2:2248 -13629:2:2249 -13630:2:2253 -13631:2:2254 -13632:2:2248 -13633:2:2249 -13634:2:2250 -13635:2:2262 -13636:2:2267 -13637:2:2271 -13638:2:2272 -13639:2:2279 -13640:2:2280 -13641:2:2291 -13642:2:2292 -13643:2:2293 -13644:2:2291 -13645:2:2292 -13646:2:2293 -13647:2:2304 -13648:2:2309 -13649:2:2310 -13650:0:4365 -13651:3:4070 -13652:0:4365 -13653:2:2322 -13654:0:4365 -13655:2:1169 -13656:0:4365 -13657:3:4069 -13658:0:4365 -13659:2:1170 -13660:0:4365 -13661:3:4070 -13662:0:4365 -13663:3:4071 -13664:0:4365 -13665:3:4081 -13666:0:4365 -13667:3:3666 -13668:0:4365 -13669:3:3667 -13670:0:4365 -13671:3:3668 -13672:0:4365 -13673:3:3669 -13674:3:3673 -13675:3:3674 -13676:3:3682 -13677:3:3683 -13678:3:3687 -13679:3:3688 -13680:3:3682 -13681:3:3683 -13682:3:3687 -13683:3:3688 -13684:3:3696 -13685:3:3701 -13686:3:3705 -13687:3:3706 -13688:3:3713 -13689:3:3714 -13690:3:3725 -13691:3:3726 -13692:3:3727 -13693:3:3725 -13694:3:3726 -13695:3:3727 -13696:3:3738 -13697:3:3743 -13698:3:3744 -13699:0:4365 -13700:3:3756 -13701:0:4365 -13702:3:3757 -13703:0:4365 -13704:2:1173 -13705:0:4365 -13706:3:3758 -13707:0:4365 -13708:2:1179 -13709:0:4365 -13710:2:1180 -13711:0:4365 -13712:3:3757 -13713:0:4365 -13714:2:1181 -13715:2:1185 -13716:2:1186 -13717:2:1194 -13718:2:1195 -13719:2:1199 -13720:2:1200 -13721:2:1194 -13722:2:1195 -13723:2:1199 -13724:2:1200 -13725:2:1208 -13726:2:1213 -13727:2:1217 -13728:2:1218 -13729:2:1225 -13730:2:1226 -13731:2:1237 -13732:2:1238 -13733:2:1239 -13734:2:1237 -13735:2:1238 -13736:2:1239 -13737:2:1250 -13738:2:1255 -13739:2:1256 -13740:0:4365 -13741:3:3758 -13742:0:4365 -13743:2:1268 -13744:0:4365 -13745:3:3757 -13746:0:4365 -13747:2:1270 -13748:0:4365 -13749:3:3758 -13750:0:4365 -13751:2:1271 -13752:2:1275 -13753:2:1276 -13754:2:1284 -13755:2:1285 -13756:2:1289 -13757:2:1290 -13758:2:1284 -13759:2:1285 -13760:2:1289 -13761:2:1290 -13762:2:1298 -13763:2:1303 -13764:2:1307 -13765:2:1308 -13766:2:1315 -13767:2:1316 -13768:2:1327 -13769:2:1328 -13770:2:1329 -13771:2:1327 -13772:2:1328 -13773:2:1329 -13774:2:1340 -13775:2:1345 -13776:2:1346 -13777:0:4365 -13778:2:1358 -13779:0:4365 -13780:2:1360 -13781:0:4365 -13782:3:3757 -13783:0:4365 -13784:2:1361 -13785:0:4365 -13786:3:3758 -13787:0:4365 -13788:2:1362 -13789:2:1366 -13790:2:1367 -13791:2:1375 -13792:2:1376 -13793:2:1380 -13794:2:1381 -13795:2:1375 -13796:2:1376 -13797:2:1380 -13798:2:1381 -13799:2:1389 -13800:2:1394 -13801:2:1398 -13802:2:1399 -13803:2:1406 -13804:2:1407 -13805:2:1418 -13806:2:1419 -13807:2:1420 -13808:2:1418 -13809:2:1419 -13810:2:1420 -13811:2:1431 -13812:2:1436 -13813:2:1437 -13814:0:4365 -13815:2:1449 -13816:0:4365 -13817:3:3757 -13818:0:4365 -13819:2:1451 -13820:0:4365 -13821:3:3758 -13822:0:4365 -13823:2:1652 -13824:0:4365 -13825:2:1653 -13826:0:4365 -13827:2:1657 -13828:0:4365 -13829:2:1180 -13830:0:4365 -13831:3:3757 -13832:0:4365 -13833:2:1181 -13834:2:1185 -13835:2:1186 -13836:2:1194 -13837:2:1195 -13838:2:1199 -13839:2:1200 -13840:2:1194 -13841:2:1195 -13842:2:1196 -13843:2:1208 -13844:2:1213 -13845:2:1217 -13846:2:1218 -13847:2:1225 -13848:2:1226 -13849:2:1237 -13850:2:1238 -13851:2:1239 -13852:2:1237 -13853:2:1238 -13854:2:1239 -13855:2:1250 -13856:2:1255 -13857:2:1256 -13858:0:4365 -13859:3:3758 -13860:0:4365 -13861:2:1268 -13862:0:4365 -13863:3:3757 -13864:0:4365 -13865:2:1270 -13866:0:4365 -13867:3:3758 -13868:0:4365 -13869:2:1271 -13870:2:1275 -13871:2:1276 -13872:2:1284 -13873:2:1285 -13874:2:1289 -13875:2:1290 -13876:2:1284 -13877:2:1285 -13878:2:1289 -13879:2:1290 -13880:2:1298 -13881:2:1303 -13882:2:1307 -13883:2:1308 -13884:2:1315 -13885:2:1316 -13886:2:1327 -13887:2:1328 -13888:2:1329 -13889:2:1327 -13890:2:1328 -13891:2:1329 -13892:2:1340 -13893:2:1345 -13894:2:1346 -13895:0:4365 -13896:2:1358 -13897:0:4365 -13898:2:1454 -13899:0:4365 -13900:3:3757 -13901:0:4365 -13902:2:1455 -13903:0:4365 -13904:3:3758 -13905:0:4365 -13906:2:1652 -13907:0:4365 -13908:2:1653 -13909:0:4365 -13910:2:1657 -13911:0:4365 -13912:2:1660 -13913:0:4365 -13914:3:3757 -13915:0:4365 -13916:2:1665 -13917:2:1669 -13918:2:1670 -13919:2:1678 -13920:2:1679 -13921:2:1683 -13922:2:1684 -13923:2:1678 -13924:2:1679 -13925:2:1680 -13926:2:1692 -13927:2:1697 -13928:2:1701 -13929:2:1702 -13930:2:1709 -13931:2:1710 -13932:2:1721 -13933:2:1722 -13934:2:1723 -13935:2:1721 -13936:2:1722 -13937:2:1723 -13938:2:1734 -13939:2:1739 -13940:2:1740 -13941:0:4365 -13942:3:3758 -13943:0:4365 -13944:2:1752 -13945:0:4365 -13946:3:3757 -13947:0:4365 -13948:2:1754 -13949:0:4365 -13950:3:3758 -13951:0:4365 -13952:2:1755 -13953:2:1759 -13954:2:1760 -13955:2:1768 -13956:2:1769 -13957:2:1773 -13958:2:1774 -13959:2:1768 -13960:2:1769 -13961:2:1773 -13962:2:1774 -13963:2:1782 -13964:2:1787 -13965:2:1791 -13966:2:1792 -13967:2:1799 -13968:2:1800 -13969:2:1811 -13970:2:1812 -13971:2:1813 -13972:2:1811 -13973:2:1812 -13974:2:1813 -13975:2:1824 -13976:2:1829 -13977:2:1830 -13978:0:4365 -13979:2:1842 -13980:0:4365 -13981:3:3757 -13982:0:4365 -13983:2:1844 -13984:0:4365 -13985:3:3758 -13986:0:4365 -13987:2:1845 -13988:2:1849 -13989:2:1850 -13990:2:1858 -13991:2:1859 -13992:2:1863 -13993:2:1864 -13994:2:1858 -13995:2:1859 -13996:2:1863 -13997:2:1864 -13998:2:1872 -13999:2:1877 -14000:2:1881 -14001:2:1882 -14002:2:1889 -14003:2:1890 -14004:2:1901 -14005:2:1902 -14006:2:1903 -14007:2:1901 -14008:2:1902 -14009:2:1903 -14010:2:1914 -14011:2:1919 -14012:2:1920 -14013:0:4365 -14014:2:1932 -14015:0:4365 -14016:3:3757 -14017:0:4365 -14018:2:1934 -14019:0:4365 -14020:3:3758 -14021:0:4365 -14022:2:1935 -14023:0:4365 -14024:2:1936 -14025:0:4365 -14026:2:2129 -14027:0:4365 -14028:2:2130 -14029:0:4365 -14030:2:2134 -14031:0:4365 -14032:3:3757 -14033:0:4365 -14034:2:2136 -14035:0:4365 -14036:3:3758 -14037:0:4365 -14038:2:2137 -14039:2:2141 -14040:2:2142 -14041:2:2150 -14042:2:2151 -14043:2:2155 -14044:2:2156 -14045:2:2150 -14046:2:2151 -14047:2:2155 -14048:2:2156 -14049:2:2164 -14050:2:2169 -14051:2:2173 -14052:2:2174 -14053:2:2181 -14054:2:2182 -14055:2:2193 -14056:2:2194 -14057:2:2195 -14058:2:2193 -14059:2:2194 -14060:2:2195 -14061:2:2206 -14062:2:2211 -14063:2:2212 -14064:0:4365 -14065:2:2224 -14066:0:4365 -14067:3:3757 -14068:0:4365 -14069:2:2226 -14070:0:4365 -14071:3:3758 -14072:0:4365 -14073:2:1936 -14074:0:4365 -14075:2:2129 -14076:0:4365 -14077:2:2130 -14078:0:4365 -14079:2:2134 -14080:0:4365 -14081:3:3757 -14082:0:4365 -14083:2:2136 -14084:0:4365 -14085:3:3758 -14086:0:4365 -14087:2:2137 -14088:2:2141 -14089:2:2142 -14090:2:2150 -14091:2:2151 -14092:2:2155 -14093:2:2156 -14094:2:2150 -14095:2:2151 -14096:2:2152 -14097:2:2164 -14098:2:2169 -14099:2:2173 -14100:2:2174 -14101:2:2181 -14102:2:2182 -14103:2:2193 -14104:2:2194 -14105:2:2195 -14106:2:2193 -14107:2:2194 -14108:2:2195 -14109:2:2206 -14110:2:2211 -14111:2:2212 -14112:0:4365 -14113:2:2224 -14114:0:4365 -14115:3:3757 -14116:0:4365 -14117:2:2226 -14118:0:4365 -14119:3:3758 -14120:0:4365 -14121:2:2230 -14122:0:4365 -14123:3:3757 -14124:0:4365 -14125:2:2235 -14126:2:2239 -14127:2:2240 -14128:2:2248 -14129:2:2249 -14130:2:2253 -14131:2:2254 -14132:2:2248 -14133:2:2249 -14134:2:2250 -14135:2:2262 -14136:2:2267 -14137:2:2271 -14138:2:2272 -14139:2:2279 -14140:2:2280 -14141:2:2291 -14142:2:2292 -14143:2:2293 -14144:2:2291 -14145:2:2292 -14146:2:2293 -14147:2:2304 -14148:2:2309 -14149:2:2310 -14150:0:4365 -14151:3:3758 -14152:0:4365 -14153:2:2322 -14154:0:4365 -14155:2:1169 -14156:0:4365 -14157:3:3757 -14158:0:4365 -14159:2:1170 -14160:0:4365 -14161:3:3758 -14162:0:4365 -14163:3:3759 -14164:0:4365 -14165:3:3972 -14166:0:4365 -14167:3:4077 -14168:0:4365 -14169:3:4078 -14170:0:4365 -14171:3:4082 -14172:0:4365 -14173:3:4088 -14174:0:4365 -14175:3:4092 -14176:3:4093 -14177:3:4097 -14178:3:4101 -14179:3:4102 -14180:3:4097 -14181:3:4101 -14182:3:4102 -14183:3:4106 -14184:3:4114 -14185:3:4115 -14186:3:4120 -14187:3:4127 -14188:3:4128 -14189:3:4127 -14190:3:4128 -14191:3:4135 -14192:3:4140 -14193:0:4365 -14194:3:4151 -14195:0:4365 -14196:3:4155 -14197:3:4156 -14198:3:4160 -14199:3:4164 -14200:3:4165 -14201:3:4160 -14202:3:4164 -14203:3:4165 -14204:3:4169 -14205:3:4177 -14206:3:4178 -14207:3:4183 -14208:3:4190 -14209:3:4191 -14210:3:4190 -14211:3:4191 -14212:3:4198 -14213:3:4203 -14214:0:4365 -14215:3:4151 -14216:0:4365 -14217:3:4155 -14218:3:4156 -14219:3:4160 -14220:3:4164 -14221:3:4165 -14222:3:4160 -14223:3:4164 -14224:3:4165 -14225:3:4169 -14226:3:4177 -14227:3:4178 -14228:3:4183 -14229:3:4190 -14230:3:4191 -14231:3:4190 -14232:3:4191 -14233:3:4198 -14234:3:4203 -14235:0:4365 -14236:3:4214 -14237:0:4365 -14238:3:4222 -14239:3:4223 -14240:3:4227 -14241:3:4231 -14242:3:4232 -14243:3:4227 -14244:3:4231 -14245:3:4232 -14246:3:4236 -14247:3:4244 -14248:3:4245 -14249:3:4250 -14250:3:4257 -14251:3:4258 -14252:3:4257 -14253:3:4258 -14254:3:4265 -14255:3:4270 -14256:0:4365 -14257:3:4285 -14258:0:4365 -14259:3:4286 -14260:0:4365 -14261:2:1173 -14262:0:4365 -14263:3:4287 -14264:0:4365 -14265:2:1179 -14266:0:4365 -14267:2:1180 -14268:0:4365 -14269:3:4286 -14270:0:4365 -14271:2:1181 -14272:2:1185 -14273:2:1186 -14274:2:1194 -14275:2:1195 -14276:2:1199 -14277:2:1200 -14278:2:1194 -14279:2:1195 -14280:2:1199 -14281:2:1200 -14282:2:1208 -14283:2:1213 -14284:2:1217 -14285:2:1218 -14286:2:1225 -14287:2:1226 -14288:2:1237 -14289:2:1238 -14290:2:1239 -14291:2:1237 -14292:2:1238 -14293:2:1239 -14294:2:1250 -14295:2:1255 -14296:2:1256 -14297:0:4365 -14298:3:4287 -14299:0:4365 -14300:2:1268 -14301:0:4365 -14302:3:4286 -14303:0:4365 -14304:2:1270 -14305:0:4365 -14306:3:4287 -14307:0:4365 -14308:2:1271 -14309:2:1275 -14310:2:1276 -14311:2:1284 -14312:2:1285 -14313:2:1289 -14314:2:1290 -14315:2:1284 -14316:2:1285 -14317:2:1289 -14318:2:1290 -14319:2:1298 -14320:2:1303 -14321:2:1307 -14322:2:1308 -14323:2:1315 -14324:2:1316 -14325:2:1327 -14326:2:1328 -14327:2:1329 -14328:2:1327 -14329:2:1328 -14330:2:1329 -14331:2:1340 -14332:2:1345 -14333:2:1346 -14334:0:4365 -14335:2:1358 -14336:0:4365 -14337:2:1360 -14338:0:4365 -14339:3:4286 -14340:0:4365 -14341:2:1361 -14342:0:4365 -14343:3:4287 -14344:0:4365 -14345:2:1362 -14346:2:1366 -14347:2:1367 -14348:2:1375 -14349:2:1376 -14350:2:1380 -14351:2:1381 -14352:2:1375 -14353:2:1376 -14354:2:1380 -14355:2:1381 -14356:2:1389 -14357:2:1394 -14358:2:1398 -14359:2:1399 -14360:2:1406 -14361:2:1407 -14362:2:1418 -14363:2:1419 -14364:2:1420 -14365:2:1418 -14366:2:1419 -14367:2:1420 -14368:2:1431 -14369:2:1436 -14370:2:1437 -14371:0:4365 -14372:2:1449 -14373:0:4365 -14374:3:4286 -14375:0:4365 -14376:2:1451 -14377:0:4365 -14378:3:4287 -14379:0:4365 -14380:2:1652 -14381:0:4365 -14382:2:1653 -14383:0:4365 -14384:2:1657 -14385:0:4365 -14386:2:1180 -14387:0:4365 -14388:3:4286 -14389:0:4365 -14390:2:1181 -14391:2:1185 -14392:2:1186 -14393:2:1194 -14394:2:1195 -14395:2:1199 -14396:2:1200 -14397:2:1194 -14398:2:1195 -14399:2:1196 -14400:2:1208 -14401:2:1213 -14402:2:1217 -14403:2:1218 -14404:2:1225 -14405:2:1226 -14406:2:1237 -14407:2:1238 -14408:2:1239 -14409:2:1237 -14410:2:1238 -14411:2:1239 -14412:2:1250 -14413:2:1255 -14414:2:1256 -14415:0:4365 -14416:3:4287 -14417:0:4365 -14418:2:1268 -14419:0:4365 -14420:3:4286 -14421:0:4365 -14422:2:1270 -14423:0:4365 -14424:3:4287 -14425:0:4365 -14426:2:1271 -14427:2:1275 -14428:2:1276 -14429:2:1284 -14430:2:1285 -14431:2:1289 -14432:2:1290 -14433:2:1284 -14434:2:1285 -14435:2:1289 -14436:2:1290 -14437:2:1298 -14438:2:1303 -14439:2:1307 -14440:2:1308 -14441:2:1315 -14442:2:1316 -14443:2:1327 -14444:2:1328 -14445:2:1329 -14446:2:1327 -14447:2:1328 -14448:2:1329 -14449:2:1340 -14450:2:1345 -14451:2:1346 -14452:0:4365 -14453:2:1358 -14454:0:4365 -14455:2:1454 -14456:0:4365 -14457:3:4286 -14458:0:4365 -14459:2:1455 -14460:0:4365 -14461:3:4287 -14462:0:4365 -14463:2:1652 -14464:0:4365 -14465:2:1653 -14466:0:4365 -14467:2:1657 -14468:0:4365 -14469:2:1660 -14470:0:4365 -14471:3:4286 -14472:0:4365 -14473:2:1665 -14474:2:1669 -14475:2:1670 -14476:2:1678 -14477:2:1679 -14478:2:1683 -14479:2:1684 -14480:2:1678 -14481:2:1679 -14482:2:1680 -14483:2:1692 -14484:2:1697 -14485:2:1701 -14486:2:1702 -14487:2:1709 -14488:2:1710 -14489:2:1721 -14490:2:1722 -14491:2:1723 -14492:2:1721 -14493:2:1722 -14494:2:1723 -14495:2:1734 -14496:2:1739 -14497:2:1740 -14498:0:4365 -14499:3:4287 -14500:0:4365 -14501:2:1752 -14502:0:4365 -14503:3:4286 -14504:0:4365 -14505:2:1754 -14506:0:4365 -14507:3:4287 -14508:0:4365 -14509:2:1755 -14510:2:1759 -14511:2:1760 -14512:2:1768 -14513:2:1769 -14514:2:1773 -14515:2:1774 -14516:2:1768 -14517:2:1769 -14518:2:1773 -14519:2:1774 -14520:2:1782 -14521:2:1787 -14522:2:1791 -14523:2:1792 -14524:2:1799 -14525:2:1800 -14526:2:1811 -14527:2:1812 -14528:2:1813 -14529:2:1811 -14530:2:1812 -14531:2:1813 -14532:2:1824 -14533:2:1829 -14534:2:1830 -14535:0:4365 -14536:2:1842 -14537:0:4365 -14538:3:4286 -14539:0:4365 -14540:2:1844 -14541:0:4365 -14542:3:4287 -14543:0:4365 -14544:2:1845 -14545:2:1849 -14546:2:1850 -14547:2:1858 -14548:2:1859 -14549:2:1863 -14550:2:1864 -14551:2:1858 -14552:2:1859 -14553:2:1863 -14554:2:1864 -14555:2:1872 -14556:2:1877 -14557:2:1881 -14558:2:1882 -14559:2:1889 -14560:2:1890 -14561:2:1901 -14562:2:1902 -14563:2:1903 -14564:2:1901 -14565:2:1902 -14566:2:1903 -14567:2:1914 -14568:2:1919 -14569:2:1920 -14570:0:4365 -14571:2:1932 -14572:0:4365 -14573:3:4286 -14574:0:4365 -14575:2:1934 -14576:0:4365 -14577:3:4287 -14578:0:4365 -14579:2:1935 -14580:0:4365 -14581:2:1936 -14582:0:4365 -14583:2:2129 -14584:0:4365 -14585:2:2130 -14586:0:4365 -14587:2:2134 -14588:0:4365 -14589:3:4286 -14590:0:4365 -14591:2:2136 -14592:0:4365 -14593:3:4287 -14594:0:4365 -14595:2:2137 -14596:2:2141 -14597:2:2142 -14598:2:2150 -14599:2:2151 -14600:2:2155 -14601:2:2156 -14602:2:2150 -14603:2:2151 -14604:2:2155 -14605:2:2156 -14606:2:2164 -14607:2:2169 -14608:2:2173 -14609:2:2174 -14610:2:2181 -14611:2:2182 -14612:2:2193 -14613:2:2194 -14614:2:2195 -14615:2:2193 -14616:2:2194 -14617:2:2195 -14618:2:2206 -14619:2:2211 -14620:2:2212 -14621:0:4365 -14622:2:2224 -14623:0:4365 -14624:3:4286 -14625:0:4365 -14626:2:2226 -14627:0:4365 -14628:3:4287 -14629:0:4365 -14630:2:1936 -14631:0:4365 -14632:2:2129 -14633:0:4365 -14634:2:2130 -14635:0:4365 -14636:2:2134 -14637:0:4365 -14638:3:4286 -14639:0:4365 -14640:2:2136 -14641:0:4365 -14642:3:4287 -14643:0:4365 -14644:2:2137 -14645:2:2141 -14646:2:2142 -14647:2:2150 -14648:2:2151 -14649:2:2155 -14650:2:2156 -14651:2:2150 -14652:2:2151 -14653:2:2152 -14654:2:2164 -14655:2:2169 -14656:2:2173 -14657:2:2174 -14658:2:2181 -14659:2:2182 -14660:2:2193 -14661:2:2194 -14662:2:2195 -14663:2:2193 -14664:2:2194 -14665:2:2195 -14666:2:2206 -14667:2:2211 -14668:2:2212 -14669:0:4365 -14670:2:2224 -14671:0:4365 -14672:3:4286 -14673:0:4365 -14674:2:2226 -14675:0:4365 -14676:3:4287 -14677:0:4365 -14678:2:2230 -14679:0:4365 -14680:3:4286 -14681:0:4365 -14682:2:2235 -14683:2:2239 -14684:2:2240 -14685:2:2248 -14686:2:2249 -14687:2:2253 -14688:2:2254 -14689:2:2248 -14690:2:2249 -14691:2:2250 -14692:2:2262 -14693:2:2267 -14694:2:2271 -14695:2:2272 -14696:2:2279 -14697:2:2280 -14698:2:2291 -14699:2:2292 -14700:2:2293 -14701:2:2291 -14702:2:2292 -14703:2:2293 -14704:2:2304 -14705:2:2309 -14706:2:2310 -14707:0:4365 -14708:3:4287 -14709:0:4365 -14710:2:2322 -14711:0:4365 -14712:2:1169 -14713:0:4365 -14714:3:4286 -14715:0:4365 -14716:2:1170 -14717:0:4365 -14718:3:4287 -14719:0:4365 -14720:3:4288 -14721:0:4365 -14722:3:4294 -14723:0:4365 -14724:3:4295 -14725:0:4365 -14726:3:2338 -14727:0:4365 -14728:3:2339 -14729:3:2343 -14730:3:2344 -14731:3:2352 -14732:3:2353 -14733:3:2357 -14734:3:2358 -14735:3:2352 -14736:3:2353 -14737:3:2357 -14738:3:2358 -14739:3:2366 -14740:3:2371 -14741:3:2375 -14742:3:2376 -14743:3:2383 -14744:3:2384 -14745:3:2395 -14746:3:2396 -14747:3:2397 -14748:3:2395 -14749:3:2396 -14750:3:2397 -14751:3:2408 -14752:3:2413 -14753:3:2414 -14754:0:4365 -14755:3:2426 -14756:0:4365 -14757:3:2427 -14758:0:4365 -14759:2:1173 -14760:0:4365 -14761:3:2428 -14762:0:4365 -14763:2:1179 -14764:0:4365 -14765:2:1180 -14766:0:4365 -14767:3:2427 -14768:0:4365 -14769:2:1181 -14770:2:1185 -14771:2:1186 -14772:2:1194 -14773:2:1195 -14774:2:1199 -14775:2:1200 -14776:2:1194 -14777:2:1195 -14778:2:1199 -14779:2:1200 -14780:2:1208 -14781:2:1213 -14782:2:1217 -14783:2:1218 -14784:2:1225 -14785:2:1226 -14786:2:1237 -14787:2:1238 -14788:2:1239 -14789:2:1237 -14790:2:1238 -14791:2:1239 -14792:2:1250 -14793:2:1255 -14794:2:1256 -14795:0:4365 -14796:3:2428 -14797:0:4365 -14798:2:1268 -14799:0:4365 -14800:3:2427 -14801:0:4365 -14802:2:1270 -14803:0:4365 -14804:3:2428 -14805:0:4365 -14806:2:1271 -14807:2:1275 -14808:2:1276 -14809:2:1284 -14810:2:1285 -14811:2:1289 -14812:2:1290 -14813:2:1284 -14814:2:1285 -14815:2:1289 -14816:2:1290 -14817:2:1298 -14818:2:1303 -14819:2:1307 -14820:2:1308 -14821:2:1315 -14822:2:1316 -14823:2:1327 -14824:2:1328 -14825:2:1329 -14826:2:1327 -14827:2:1328 -14828:2:1329 -14829:2:1340 -14830:2:1345 -14831:2:1346 -14832:0:4365 -14833:2:1358 -14834:0:4365 -14835:2:1360 -14836:0:4365 -14837:3:2427 -14838:0:4365 -14839:2:1361 -14840:0:4365 -14841:3:2428 -14842:0:4365 -14843:2:1362 -14844:2:1366 -14845:2:1367 -14846:2:1375 -14847:2:1376 -14848:2:1380 -14849:2:1381 -14850:2:1375 -14851:2:1376 -14852:2:1380 -14853:2:1381 -14854:2:1389 -14855:2:1394 -14856:2:1398 -14857:2:1399 -14858:2:1406 -14859:2:1407 -14860:2:1418 -14861:2:1419 -14862:2:1420 -14863:2:1418 -14864:2:1419 -14865:2:1420 -14866:2:1431 -14867:2:1436 -14868:2:1437 -14869:0:4365 -14870:2:1449 -14871:0:4365 -14872:3:2427 -14873:0:4365 -14874:2:1451 -14875:0:4365 -14876:3:2428 -14877:0:4365 -14878:2:1652 -14879:0:4365 -14880:2:1653 -14881:0:4365 -14882:2:1657 -14883:0:4365 -14884:2:1180 -14885:0:4365 -14886:3:2427 -14887:0:4365 -14888:2:1181 -14889:2:1185 -14890:2:1186 -14891:2:1194 -14892:2:1195 -14893:2:1199 -14894:2:1200 -14895:2:1194 -14896:2:1195 -14897:2:1196 -14898:2:1208 -14899:2:1213 -14900:2:1217 -14901:2:1218 -14902:2:1225 -14903:2:1226 -14904:2:1237 -14905:2:1238 -14906:2:1239 -14907:2:1237 -14908:2:1238 -14909:2:1239 -14910:2:1250 -14911:2:1255 -14912:2:1256 -14913:0:4365 -14914:3:2428 -14915:0:4365 -14916:2:1268 -14917:0:4365 -14918:3:2427 -14919:0:4365 -14920:2:1270 -14921:0:4365 -14922:3:2428 -14923:0:4365 -14924:2:1271 -14925:2:1275 -14926:2:1276 -14927:2:1284 -14928:2:1285 -14929:2:1289 -14930:2:1290 -14931:2:1284 -14932:2:1285 -14933:2:1289 -14934:2:1290 -14935:2:1298 -14936:2:1303 -14937:2:1307 -14938:2:1308 -14939:2:1315 -14940:2:1316 -14941:2:1327 -14942:2:1328 -14943:2:1329 -14944:2:1327 -14945:2:1328 -14946:2:1329 -14947:2:1340 -14948:2:1345 -14949:2:1346 -14950:0:4365 -14951:2:1358 -14952:0:4365 -14953:2:1454 -14954:0:4365 -14955:3:2427 -14956:0:4365 -14957:2:1455 -14958:0:4365 -14959:3:2428 -14960:0:4365 -14961:2:1652 -14962:0:4365 -14963:2:1653 -14964:0:4365 -14965:2:1657 -14966:0:4365 -14967:2:1660 -14968:0:4365 -14969:3:2427 -14970:0:4365 -14971:2:1665 -14972:2:1669 -14973:2:1670 -14974:2:1678 -14975:2:1679 -14976:2:1683 -14977:2:1684 -14978:2:1678 -14979:2:1679 -14980:2:1680 -14981:2:1692 -14982:2:1697 -14983:2:1701 -14984:2:1702 -14985:2:1709 -14986:2:1710 -14987:2:1721 -14988:2:1722 -14989:2:1723 -14990:2:1721 -14991:2:1722 -14992:2:1723 -14993:2:1734 -14994:2:1739 -14995:2:1740 -14996:0:4365 -14997:3:2428 -14998:0:4365 -14999:2:1752 -15000:0:4365 -15001:3:2427 -15002:0:4365 -15003:2:1754 -15004:0:4365 -15005:3:2428 -15006:0:4365 -15007:2:1755 -15008:2:1759 -15009:2:1760 -15010:2:1768 -15011:2:1769 -15012:2:1773 -15013:2:1774 -15014:2:1768 -15015:2:1769 -15016:2:1773 -15017:2:1774 -15018:2:1782 -15019:2:1787 -15020:2:1791 -15021:2:1792 -15022:2:1799 -15023:2:1800 -15024:2:1811 -15025:2:1812 -15026:2:1813 -15027:2:1811 -15028:2:1812 -15029:2:1813 -15030:2:1824 -15031:2:1829 -15032:2:1830 -15033:0:4365 -15034:2:1842 -15035:0:4365 -15036:3:2427 -15037:0:4365 -15038:2:1844 -15039:0:4363 -15040:3:2428 -15041:0:4369 diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.define b/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.define deleted file mode 100644 index 136ef67..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.define +++ /dev/null @@ -1,2 +0,0 @@ -#define NO_RMB -#define NO_WMB diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.log b/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.log deleted file mode 100644 index 3afaead..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.log +++ /dev/null @@ -1,303 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_mb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 745) -Depth= 6009 States= 1e+06 Transitions= 1.08e+07 Memory= 534.904 t= 9.22 R= 1e+05 -Depth= 6009 States= 2e+06 Transitions= 3.4e+07 Memory= 603.557 t= 31.1 R= 6e+04 -Depth= 7527 States= 3e+06 Transitions= 4.91e+07 Memory= 672.209 t= 45.6 R= 7e+04 -pan: resizing hashtable to -w22.. done -Depth= 68651 States= 4e+06 Transitions= 6.74e+07 Memory= 772.080 t= 62.9 R= 6e+04 -Depth= 68651 States= 5e+06 Transitions= 8.62e+07 Memory= 840.733 t= 80.2 R= 6e+04 -Depth= 68651 States= 6e+06 Transitions= 1.03e+08 Memory= 909.385 t= 95.7 R= 6e+04 -Depth= 68651 States= 7e+06 Transitions= 1.21e+08 Memory= 978.037 t= 112 R= 6e+04 -Depth= 68651 States= 8e+06 Transitions= 1.37e+08 Memory= 1046.690 t= 128 R= 6e+04 -Depth= 68651 States= 9e+06 Transitions= 1.52e+08 Memory= 1115.440 t= 143 R= 6e+04 -pan: resizing hashtable to -w24.. done -Depth= 68651 States= 1e+07 Transitions= 1.72e+08 Memory= 1308.186 t= 163 R= 6e+04 -Depth= 68651 States= 1.1e+07 Transitions= 1.89e+08 Memory= 1376.838 t= 178 R= 6e+04 -Depth= 68651 States= 1.2e+07 Transitions= 2.05e+08 Memory= 1445.490 t= 193 R= 6e+04 -Depth= 68651 States= 1.3e+07 Transitions= 2.22e+08 Memory= 1514.143 t= 208 R= 6e+04 -Depth= 68651 States= 1.4e+07 Transitions= 2.39e+08 Memory= 1582.893 t= 224 R= 6e+04 -pan: claim violated! (at depth 2141) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 88 byte, depth reached 68651, errors: 1 - 14155711 states, stored -2.2815817e+08 states, matched -2.4231388e+08 transitions (= stored+matched) -8.5461256e+08 atomic steps -hash conflicts: 1.1483359e+08 (resolved) - -Stats on memory usage (in Megabytes): - 1565.993 equivalent memory usage for states (stored*(State-vector + overhead)) - 1008.042 actual memory usage for states (compression: 64.37%) - state-vector as stored = 47 byte + 28 byte overhead - 128.000 memory used for hash table (-w24) - 457.764 memory used for DFS stack (-m10000000) - 1593.537 total actual memory usage - -unreached in proctype urcu_reader - line 400, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 61, "(1)" - line 419, "pan.___", state 91, "(1)" - line 400, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 158, "(1)" - line 419, "pan.___", state 188, "(1)" - line 400, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 227, "(1)" - line 409, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 256, "(1)" - line 419, "pan.___", state 286, "(1)" - line 400, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 366, "(1)" - line 409, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 395, "(1)" - line 419, "pan.___", state 425, "(1)" - line 541, "pan.___", state 456, "-end-" - (19 of 456 states) -unreached in proctype urcu_reader_sig - line 400, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 70, "(1)" - line 419, "pan.___", state 100, "(1)" - line 400, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 158, "(1)" - line 419, "pan.___", state 188, "(1)" - line 400, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 247, "(1)" - line 419, "pan.___", state 277, "(1)" - line 400, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 330, "(1)" - line 409, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 359, "(1)" - line 419, "pan.___", state 389, "(1)" - line 615, "pan.___", state 411, "-end-" - (18 of 411 states) -unreached in proctype urcu_writer - line 400, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 20, "(1)" - line 404, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 34, "(1)" - line 404, "pan.___", state 35, "(1)" - line 404, "pan.___", state 35, "(1)" - line 402, "pan.___", state 40, "((i<1))" - line 402, "pan.___", state 40, "((i>=1))" - line 409, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 59, "(1)" - line 410, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 60, "else" - line 410, "pan.___", state 63, "(1)" - line 410, "pan.___", state 64, "(1)" - line 410, "pan.___", state 64, "(1)" - line 414, "pan.___", state 72, "(1)" - line 414, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 73, "else" - line 414, "pan.___", state 76, "(1)" - line 414, "pan.___", state 77, "(1)" - line 414, "pan.___", state 77, "(1)" - line 412, "pan.___", state 82, "((i<1))" - line 412, "pan.___", state 82, "((i>=1))" - line 419, "pan.___", state 89, "(1)" - line 419, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 90, "else" - line 419, "pan.___", state 93, "(1)" - line 419, "pan.___", state 94, "(1)" - line 419, "pan.___", state 94, "(1)" - line 421, "pan.___", state 97, "(1)" - line 421, "pan.___", state 97, "(1)" - line 370, "pan.___", state 99, "(1)" - line 640, "pan.___", state 103, "cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )] = (old_gen+1)" - line 638, "pan.___", state 104, "old_gen = cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )]" - line 400, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 114, "(1)" - line 404, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 128, "(1)" - line 404, "pan.___", state 129, "(1)" - line 404, "pan.___", state 129, "(1)" - line 410, "pan.___", state 153, "(1)" - line 414, "pan.___", state 166, "(1)" - line 421, "pan.___", state 191, "(1)" - line 421, "pan.___", state 191, "(1)" - line 653, "pan.___", state 199, "(1)" - line 400, "pan.___", state 209, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 223, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 254, "(1)" - line 414, "pan.___", state 267, "(1)" - line 400, "pan.___", state 300, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 314, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 345, "(1)" - line 414, "pan.___", state 358, "(1)" - line 400, "pan.___", state 395, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 409, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 440, "(1)" - line 414, "pan.___", state 453, "(1)" - line 400, "pan.___", state 488, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 502, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 533, "(1)" - line 414, "pan.___", state 546, "(1)" - line 400, "pan.___", state 582, "(1)" - line 404, "pan.___", state 594, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 638, "(1)" - line 404, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 731, "(1)" - line 404, "pan.___", state 777, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 795, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 821, "(1)" - line 419, "pan.___", state 838, "(1)" - line 404, "pan.___", state 868, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 886, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 912, "(1)" - line 419, "pan.___", state 929, "(1)" - line 404, "pan.___", state 963, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 981, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1007, "(1)" - line 419, "pan.___", state 1024, "(1)" - line 400, "pan.___", state 1050, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 1052, "(1)" - line 400, "pan.___", state 1053, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 1053, "else" - line 400, "pan.___", state 1056, "(1)" - line 404, "pan.___", state 1064, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 1066, "(1)" - line 404, "pan.___", state 1067, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 1067, "else" - line 404, "pan.___", state 1070, "(1)" - line 404, "pan.___", state 1071, "(1)" - line 404, "pan.___", state 1071, "(1)" - line 402, "pan.___", state 1076, "((i<1))" - line 402, "pan.___", state 1076, "((i>=1))" - line 409, "pan.___", state 1082, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 1095, "(1)" - line 410, "pan.___", state 1096, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 1096, "else" - line 410, "pan.___", state 1099, "(1)" - line 410, "pan.___", state 1100, "(1)" - line 410, "pan.___", state 1100, "(1)" - line 414, "pan.___", state 1108, "(1)" - line 414, "pan.___", state 1109, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 1109, "else" - line 414, "pan.___", state 1112, "(1)" - line 414, "pan.___", state 1113, "(1)" - line 414, "pan.___", state 1113, "(1)" - line 412, "pan.___", state 1118, "((i<1))" - line 412, "pan.___", state 1118, "((i>=1))" - line 419, "pan.___", state 1125, "(1)" - line 419, "pan.___", state 1126, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 1126, "else" - line 419, "pan.___", state 1129, "(1)" - line 419, "pan.___", state 1130, "(1)" - line 419, "pan.___", state 1130, "(1)" - line 421, "pan.___", state 1133, "(1)" - line 421, "pan.___", state 1133, "(1)" - line 404, "pan.___", state 1164, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1208, "(1)" - line 404, "pan.___", state 1254, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1298, "(1)" - line 400, "pan.___", state 1334, "(1)" - line 404, "pan.___", state 1346, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1390, "(1)" - line 404, "pan.___", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1483, "(1)" - line 404, "pan.___", state 1529, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1547, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1573, "(1)" - line 419, "pan.___", state 1590, "(1)" - line 404, "pan.___", state 1620, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1638, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1664, "(1)" - line 419, "pan.___", state 1681, "(1)" - line 404, "pan.___", state 1715, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1733, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1759, "(1)" - line 419, "pan.___", state 1776, "(1)" - line 400, "pan.___", state 1802, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 1804, "(1)" - line 400, "pan.___", state 1805, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 1805, "else" - line 400, "pan.___", state 1808, "(1)" - line 404, "pan.___", state 1816, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 1818, "(1)" - line 404, "pan.___", state 1819, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 1819, "else" - line 404, "pan.___", state 1822, "(1)" - line 404, "pan.___", state 1823, "(1)" - line 404, "pan.___", state 1823, "(1)" - line 402, "pan.___", state 1828, "((i<1))" - line 402, "pan.___", state 1828, "((i>=1))" - line 409, "pan.___", state 1834, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 1847, "(1)" - line 410, "pan.___", state 1848, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 1848, "else" - line 410, "pan.___", state 1851, "(1)" - line 410, "pan.___", state 1852, "(1)" - line 410, "pan.___", state 1852, "(1)" - line 414, "pan.___", state 1860, "(1)" - line 414, "pan.___", state 1861, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 1861, "else" - line 414, "pan.___", state 1864, "(1)" - line 414, "pan.___", state 1865, "(1)" - line 414, "pan.___", state 1865, "(1)" - line 412, "pan.___", state 1870, "((i<1))" - line 412, "pan.___", state 1870, "((i>=1))" - line 419, "pan.___", state 1877, "(1)" - line 419, "pan.___", state 1878, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 1878, "else" - line 419, "pan.___", state 1881, "(1)" - line 419, "pan.___", state 1882, "(1)" - line 419, "pan.___", state 1882, "(1)" - line 421, "pan.___", state 1885, "(1)" - line 421, "pan.___", state 1885, "(1)" - line 404, "pan.___", state 1916, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1960, "(1)" - line 404, "pan.___", state 2007, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 2051, "(1)" - line 404, "pan.___", state 2102, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 2146, "(1)" - line 703, "pan.___", state 2192, "-end-" - (144 of 2192 states) -unreached in proctype :init: - line 710, "pan.___", state 9, "((j<2))" - line 710, "pan.___", state 9, "((j>=2))" - line 711, "pan.___", state 20, "((j<2))" - line 711, "pan.___", state 20, "((j>=2))" - line 716, "pan.___", state 33, "((j<2))" - line 716, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 750, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 227 seconds -pan: rate 62472.797 states/second -pan: avg transition delay 9.3511e-07 usec -cp .input.spin urcu_free_no_mb.spin.input -cp .input.spin.trail urcu_free_no_mb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.spin.input b/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.spin.input deleted file mode 100644 index 5de16b8..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.spin.input +++ /dev/null @@ -1,724 +0,0 @@ -#define NO_RMB -#define NO_WMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.spin.input.trail b/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.spin.input.trail deleted file mode 100644 index d437aad..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free_no_mb.spin.input.trail +++ /dev/null @@ -1,2144 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:3107 -2:4:3059 -3:4:3062 -4:4:3062 -5:4:3065 -6:4:3073 -7:4:3073 -8:4:3076 -9:4:3082 -10:4:3086 -11:4:3086 -12:4:3089 -13:4:3097 -14:4:3101 -15:4:3102 -16:0:3107 -17:4:3104 -18:0:3107 -19:3:869 -20:0:3107 -21:3:875 -22:0:3107 -23:3:876 -24:0:3107 -25:3:877 -26:3:881 -27:3:882 -28:3:890 -29:3:891 -30:3:895 -31:3:896 -32:3:904 -33:3:909 -34:3:913 -35:3:914 -36:3:921 -37:3:922 -38:3:933 -39:3:934 -40:3:935 -41:3:946 -42:3:951 -43:3:952 -44:0:3107 -45:3:964 -46:0:3107 -47:3:966 -48:3:967 -49:0:3107 -50:3:971 -51:3:975 -52:3:976 -53:3:984 -54:3:985 -55:3:989 -56:3:990 -57:3:998 -58:3:1003 -59:3:1004 -60:3:1015 -61:3:1016 -62:3:1027 -63:3:1028 -64:3:1029 -65:3:1040 -66:3:1045 -67:3:1046 -68:0:3107 -69:3:1058 -70:0:3107 -71:3:1060 -72:0:3107 -73:3:1061 -74:0:3107 -75:3:1071 -76:0:3107 -77:3:1072 -78:3:1076 -79:3:1077 -80:3:1085 -81:3:1086 -82:3:1090 -83:3:1091 -84:3:1099 -85:3:1104 -86:3:1108 -87:3:1109 -88:3:1116 -89:3:1117 -90:3:1128 -91:3:1129 -92:3:1130 -93:3:1141 -94:3:1146 -95:3:1147 -96:0:3107 -97:3:1162 -98:0:3107 -99:3:1163 -100:3:1167 -101:3:1168 -102:3:1176 -103:3:1177 -104:3:1181 -105:3:1182 -106:3:1190 -107:3:1195 -108:3:1199 -109:3:1200 -110:3:1207 -111:3:1208 -112:3:1219 -113:3:1220 -114:3:1221 -115:3:1232 -116:3:1237 -117:3:1238 -118:0:3107 -119:3:1253 -120:0:3107 -121:3:1258 -122:3:1262 -123:3:1263 -124:3:1271 -125:3:1272 -126:3:1276 -127:3:1277 -128:3:1285 -129:3:1290 -130:3:1294 -131:3:1295 -132:3:1302 -133:3:1303 -134:3:1314 -135:3:1315 -136:3:1316 -137:3:1327 -138:3:1332 -139:3:1333 -140:0:3107 -141:3:1348 -142:0:3107 -143:3:1350 -144:0:3107 -145:3:1351 -146:3:1355 -147:3:1356 -148:3:1364 -149:3:1365 -150:3:1369 -151:3:1370 -152:3:1378 -153:3:1383 -154:3:1387 -155:3:1388 -156:3:1395 -157:3:1396 -158:3:1407 -159:3:1408 -160:3:1409 -161:3:1420 -162:3:1425 -163:3:1426 -164:0:3107 -165:3:1438 -166:0:3107 -167:3:1440 -168:0:3107 -169:3:1443 -170:3:1444 -171:3:1456 -172:3:1457 -173:3:1461 -174:3:1462 -175:3:1470 -176:3:1475 -177:3:1479 -178:3:1480 -179:3:1487 -180:3:1488 -181:3:1499 -182:3:1500 -183:3:1501 -184:3:1512 -185:3:1517 -186:3:1518 -187:0:3107 -188:3:1530 -189:0:3107 -190:3:1532 -191:0:3107 -192:3:1533 -193:0:3107 -194:3:1534 -195:0:3107 -196:3:1535 -197:0:3107 -198:3:1536 -199:3:1540 -200:3:1541 -201:3:1549 -202:3:1550 -203:3:1554 -204:3:1555 -205:3:1563 -206:3:1568 -207:3:1572 -208:3:1573 -209:3:1580 -210:3:1581 -211:3:1592 -212:3:1593 -213:3:1594 -214:3:1605 -215:3:1610 -216:3:1611 -217:0:3107 -218:3:1623 -219:0:3107 -220:3:1904 -221:0:3107 -222:3:2002 -223:0:3107 -224:3:2003 -225:0:3107 -226:3:2007 -227:0:3107 -228:3:2013 -229:3:2017 -230:3:2018 -231:3:2026 -232:3:2027 -233:3:2031 -234:3:2032 -235:3:2040 -236:3:2045 -237:3:2049 -238:3:2050 -239:3:2057 -240:3:2058 -241:3:2069 -242:3:2070 -243:3:2071 -244:3:2082 -245:3:2087 -246:3:2088 -247:0:3107 -248:3:2100 -249:0:3107 -250:3:2102 -251:0:3107 -252:3:2103 -253:3:2107 -254:3:2108 -255:3:2116 -256:3:2117 -257:3:2121 -258:3:2122 -259:3:2130 -260:3:2135 -261:3:2139 -262:3:2140 -263:3:2147 -264:3:2148 -265:3:2159 -266:3:2160 -267:3:2161 -268:3:2172 -269:3:2177 -270:3:2178 -271:0:3107 -272:3:2190 -273:0:3107 -274:3:2192 -275:0:3107 -276:3:2195 -277:3:2196 -278:3:2208 -279:3:2209 -280:3:2213 -281:3:2214 -282:3:2222 -283:3:2227 -284:3:2231 -285:3:2232 -286:3:2239 -287:3:2240 -288:3:2251 -289:3:2252 -290:3:2253 -291:3:2264 -292:3:2269 -293:3:2270 -294:0:3107 -295:3:2282 -296:0:3107 -297:3:2284 -298:0:3107 -299:3:2285 -300:0:3107 -301:3:2286 -302:0:3107 -303:3:2287 -304:0:3107 -305:3:2288 -306:3:2292 -307:3:2293 -308:3:2301 -309:3:2302 -310:3:2306 -311:3:2307 -312:3:2315 -313:3:2320 -314:3:2324 -315:3:2325 -316:3:2332 -317:3:2333 -318:3:2344 -319:3:2345 -320:3:2346 -321:3:2357 -322:3:2362 -323:3:2363 -324:0:3107 -325:3:2375 -326:0:3107 -327:3:2656 -328:0:3107 -329:3:2754 -330:0:3107 -331:3:2755 -332:0:3107 -333:3:2759 -334:0:3107 -335:3:2765 -336:3:2769 -337:3:2770 -338:3:2778 -339:3:2779 -340:3:2783 -341:3:2784 -342:3:2792 -343:3:2797 -344:3:2801 -345:3:2802 -346:3:2809 -347:3:2810 -348:3:2821 -349:3:2822 -350:3:2823 -351:3:2834 -352:3:2839 -353:3:2840 -354:0:3107 -355:3:2855 -356:0:3107 -357:3:2856 -358:3:2860 -359:3:2861 -360:3:2869 -361:3:2870 -362:3:2874 -363:3:2875 -364:3:2883 -365:3:2888 -366:3:2892 -367:3:2893 -368:3:2900 -369:3:2901 -370:3:2912 -371:3:2913 -372:3:2914 -373:3:2925 -374:3:2930 -375:3:2931 -376:0:3107 -377:3:2946 -378:0:3107 -379:3:2951 -380:3:2955 -381:3:2956 -382:3:2964 -383:3:2965 -384:3:2969 -385:3:2970 -386:3:2978 -387:3:2983 -388:3:2987 -389:3:2988 -390:3:2995 -391:3:2996 -392:3:3007 -393:3:3008 -394:3:3009 -395:3:3020 -396:3:3025 -397:3:3026 -398:0:3107 -399:3:3041 -400:0:3107 -401:3:3043 -402:0:3107 -403:3:3044 -404:0:3107 -405:3:876 -406:0:3107 -407:3:877 -408:3:881 -409:3:882 -410:3:890 -411:3:891 -412:3:895 -413:3:896 -414:3:904 -415:3:909 -416:3:913 -417:3:914 -418:3:921 -419:3:922 -420:3:933 -421:3:934 -422:3:935 -423:3:946 -424:3:951 -425:3:952 -426:0:3107 -427:3:964 -428:0:3107 -429:3:966 -430:3:967 -431:0:3107 -432:3:971 -433:3:975 -434:3:976 -435:3:984 -436:3:985 -437:3:989 -438:3:990 -439:3:998 -440:3:1003 -441:3:1004 -442:3:1015 -443:3:1016 -444:3:1027 -445:3:1028 -446:3:1029 -447:3:1040 -448:3:1045 -449:3:1046 -450:0:3107 -451:3:1058 -452:0:3107 -453:3:1060 -454:0:3107 -455:3:1061 -456:0:3107 -457:3:1071 -458:0:3107 -459:3:1072 -460:3:1076 -461:3:1077 -462:3:1085 -463:3:1086 -464:3:1090 -465:3:1091 -466:3:1099 -467:3:1104 -468:3:1108 -469:3:1109 -470:3:1116 -471:3:1117 -472:3:1128 -473:3:1129 -474:3:1130 -475:3:1141 -476:3:1146 -477:3:1147 -478:0:3107 -479:3:1162 -480:0:3107 -481:3:1163 -482:3:1167 -483:3:1168 -484:3:1176 -485:3:1177 -486:3:1181 -487:3:1182 -488:3:1190 -489:3:1195 -490:3:1199 -491:3:1200 -492:3:1207 -493:3:1208 -494:3:1219 -495:3:1220 -496:3:1221 -497:3:1232 -498:3:1237 -499:3:1238 -500:0:3107 -501:3:1253 -502:0:3107 -503:3:1258 -504:3:1262 -505:3:1263 -506:3:1271 -507:3:1272 -508:3:1276 -509:3:1277 -510:3:1285 -511:3:1290 -512:3:1294 -513:3:1295 -514:3:1302 -515:3:1303 -516:3:1314 -517:3:1315 -518:3:1316 -519:3:1327 -520:3:1332 -521:3:1333 -522:0:3107 -523:3:1348 -524:0:3107 -525:3:1350 -526:0:3107 -527:3:1351 -528:3:1355 -529:3:1356 -530:3:1364 -531:3:1365 -532:3:1369 -533:3:1370 -534:3:1378 -535:3:1383 -536:3:1387 -537:3:1388 -538:3:1395 -539:3:1396 -540:3:1407 -541:3:1408 -542:3:1409 -543:3:1420 -544:3:1425 -545:3:1426 -546:0:3107 -547:3:1438 -548:0:3107 -549:3:1440 -550:0:3107 -551:3:1443 -552:3:1444 -553:3:1456 -554:3:1457 -555:3:1461 -556:3:1462 -557:3:1470 -558:3:1475 -559:3:1479 -560:3:1480 -561:3:1487 -562:3:1488 -563:3:1499 -564:3:1500 -565:3:1501 -566:3:1512 -567:3:1517 -568:3:1518 -569:0:3107 -570:3:1530 -571:0:3107 -572:3:1532 -573:0:3107 -574:3:1533 -575:0:3107 -576:3:1534 -577:0:3107 -578:3:1535 -579:0:3107 -580:3:1536 -581:3:1540 -582:3:1541 -583:3:1549 -584:3:1550 -585:3:1554 -586:3:1555 -587:3:1563 -588:3:1568 -589:3:1572 -590:3:1573 -591:3:1580 -592:3:1581 -593:3:1592 -594:3:1593 -595:3:1594 -596:3:1605 -597:3:1610 -598:3:1611 -599:0:3107 -600:3:1623 -601:0:3107 -602:3:1904 -603:0:3107 -604:3:2002 -605:0:3107 -606:3:2003 -607:0:3107 -608:3:2007 -609:0:3107 -610:3:2013 -611:3:2017 -612:3:2018 -613:3:2026 -614:3:2027 -615:3:2031 -616:3:2032 -617:3:2040 -618:3:2045 -619:3:2049 -620:3:2050 -621:3:2057 -622:3:2058 -623:3:2069 -624:3:2070 -625:3:2071 -626:3:2082 -627:3:2087 -628:3:2088 -629:0:3107 -630:3:2100 -631:0:3107 -632:3:2102 -633:0:3107 -634:3:2103 -635:3:2107 -636:3:2108 -637:3:2116 -638:3:2117 -639:3:2121 -640:3:2122 -641:3:2130 -642:3:2135 -643:3:2139 -644:3:2140 -645:3:2147 -646:3:2148 -647:3:2159 -648:3:2160 -649:3:2161 -650:3:2172 -651:3:2177 -652:3:2178 -653:0:3107 -654:3:2190 -655:0:3107 -656:3:2192 -657:0:3107 -658:3:2195 -659:3:2196 -660:3:2208 -661:3:2209 -662:3:2213 -663:3:2214 -664:3:2222 -665:3:2227 -666:3:2231 -667:3:2232 -668:3:2239 -669:3:2240 -670:3:2251 -671:3:2252 -672:3:2253 -673:3:2264 -674:3:2269 -675:3:2270 -676:0:3107 -677:3:2282 -678:0:3107 -679:3:2284 -680:0:3107 -681:3:2285 -682:0:3107 -683:3:2286 -684:0:3107 -685:3:2287 -686:0:3107 -687:3:2288 -688:3:2292 -689:3:2293 -690:3:2301 -691:3:2302 -692:3:2306 -693:3:2307 -694:3:2315 -695:3:2320 -696:3:2324 -697:3:2325 -698:3:2332 -699:3:2333 -700:3:2344 -701:3:2345 -702:3:2346 -703:3:2357 -704:3:2362 -705:3:2363 -706:0:3107 -707:3:2375 -708:0:3107 -709:3:2656 -710:0:3107 -711:3:2754 -712:0:3107 -713:3:2755 -714:0:3107 -715:3:2759 -716:0:3107 -717:3:2765 -718:3:2769 -719:3:2770 -720:3:2778 -721:3:2779 -722:3:2783 -723:3:2784 -724:3:2792 -725:3:2797 -726:3:2801 -727:3:2802 -728:3:2809 -729:3:2810 -730:3:2821 -731:3:2822 -732:3:2823 -733:3:2834 -734:3:2839 -735:3:2840 -736:0:3107 -737:3:2855 -738:0:3107 -739:3:2856 -740:3:2860 -741:3:2861 -742:3:2869 -743:3:2870 -744:3:2874 -745:3:2875 -746:3:2883 -747:3:2888 -748:3:2892 -749:3:2893 -750:3:2900 -751:3:2901 -752:3:2912 -753:3:2913 -754:3:2914 -755:3:2925 -756:3:2930 -757:3:2931 -758:0:3107 -759:3:2946 -760:0:3107 -761:3:2951 -762:3:2955 -763:3:2956 -764:3:2964 -765:3:2965 -766:3:2969 -767:3:2970 -768:3:2978 -769:3:2983 -770:3:2987 -771:3:2988 -772:3:2995 -773:3:2996 -774:3:3007 -775:3:3008 -776:3:3009 -777:3:3020 -778:3:3025 -779:3:3026 -780:0:3107 -781:3:3041 -782:0:3107 -783:3:3043 -784:0:3107 -785:3:3044 -786:0:3107 -787:3:876 -788:0:3107 -789:3:877 -790:3:881 -791:3:882 -792:3:890 -793:3:891 -794:3:895 -795:3:896 -796:3:904 -797:3:909 -798:3:913 -799:3:914 -800:3:921 -801:3:922 -802:3:933 -803:3:934 -804:3:935 -805:3:946 -806:3:951 -807:3:952 -808:0:3107 -809:3:964 -810:0:3107 -811:3:966 -812:3:967 -813:0:3107 -814:3:971 -815:3:975 -816:3:976 -817:3:984 -818:3:985 -819:3:989 -820:3:990 -821:3:998 -822:3:1003 -823:3:1004 -824:3:1015 -825:3:1016 -826:3:1027 -827:3:1028 -828:3:1029 -829:3:1040 -830:3:1045 -831:3:1046 -832:0:3107 -833:3:1058 -834:0:3107 -835:3:1060 -836:0:3107 -837:3:1061 -838:0:3107 -839:3:1071 -840:0:3107 -841:3:1072 -842:3:1076 -843:3:1077 -844:3:1085 -845:3:1086 -846:3:1090 -847:3:1091 -848:3:1099 -849:3:1104 -850:3:1108 -851:3:1109 -852:3:1116 -853:3:1117 -854:3:1128 -855:3:1129 -856:3:1130 -857:3:1141 -858:3:1146 -859:3:1147 -860:0:3107 -861:3:1162 -862:0:3107 -863:3:1163 -864:3:1167 -865:3:1168 -866:3:1176 -867:3:1177 -868:3:1181 -869:3:1182 -870:3:1190 -871:3:1195 -872:3:1199 -873:3:1200 -874:3:1207 -875:3:1208 -876:3:1219 -877:3:1220 -878:3:1221 -879:3:1232 -880:3:1237 -881:3:1238 -882:0:3107 -883:3:1253 -884:0:3107 -885:3:1258 -886:3:1262 -887:3:1263 -888:3:1271 -889:3:1272 -890:3:1276 -891:3:1277 -892:3:1285 -893:3:1290 -894:3:1294 -895:3:1295 -896:3:1302 -897:3:1303 -898:3:1314 -899:3:1315 -900:3:1316 -901:3:1327 -902:3:1332 -903:3:1333 -904:0:3107 -905:3:1348 -906:0:3107 -907:3:1350 -908:0:3107 -909:3:1351 -910:3:1355 -911:3:1356 -912:3:1364 -913:3:1365 -914:3:1369 -915:3:1370 -916:3:1378 -917:3:1383 -918:3:1387 -919:3:1388 -920:3:1395 -921:3:1396 -922:3:1407 -923:3:1408 -924:3:1409 -925:3:1420 -926:3:1425 -927:3:1426 -928:0:3107 -929:3:1438 -930:0:3107 -931:3:1440 -932:0:3107 -933:3:1443 -934:3:1444 -935:3:1456 -936:3:1457 -937:3:1461 -938:3:1462 -939:3:1470 -940:3:1475 -941:3:1479 -942:3:1480 -943:3:1487 -944:3:1488 -945:3:1499 -946:3:1500 -947:3:1501 -948:3:1512 -949:3:1517 -950:3:1518 -951:0:3107 -952:3:1530 -953:0:3107 -954:3:1532 -955:0:3107 -956:3:1533 -957:0:3107 -958:3:1534 -959:0:3107 -960:3:1535 -961:0:3107 -962:3:1536 -963:3:1540 -964:3:1541 -965:3:1549 -966:3:1550 -967:3:1554 -968:3:1555 -969:3:1563 -970:3:1568 -971:3:1572 -972:3:1573 -973:3:1580 -974:3:1581 -975:3:1592 -976:3:1593 -977:3:1594 -978:3:1605 -979:3:1610 -980:3:1611 -981:0:3107 -982:3:1623 -983:0:3107 -984:3:1904 -985:0:3107 -986:3:2002 -987:0:3107 -988:3:2003 -989:0:3107 -990:3:2007 -991:0:3107 -992:3:2013 -993:3:2017 -994:3:2018 -995:3:2026 -996:3:2027 -997:3:2031 -998:3:2032 -999:3:2040 -1000:3:2045 -1001:3:2049 -1002:3:2050 -1003:3:2057 -1004:3:2058 -1005:3:2069 -1006:3:2070 -1007:3:2071 -1008:3:2082 -1009:3:2087 -1010:3:2088 -1011:0:3107 -1012:3:2100 -1013:0:3107 -1014:3:2102 -1015:0:3107 -1016:3:2103 -1017:3:2107 -1018:3:2108 -1019:3:2116 -1020:3:2117 -1021:3:2121 -1022:3:2122 -1023:3:2130 -1024:3:2135 -1025:3:2139 -1026:3:2140 -1027:3:2147 -1028:3:2148 -1029:3:2159 -1030:3:2160 -1031:3:2161 -1032:3:2172 -1033:3:2177 -1034:3:2178 -1035:0:3107 -1036:3:2190 -1037:0:3107 -1038:3:2192 -1039:0:3107 -1040:3:2195 -1041:3:2196 -1042:3:2208 -1043:3:2209 -1044:3:2213 -1045:3:2214 -1046:3:2222 -1047:3:2227 -1048:3:2231 -1049:3:2232 -1050:3:2239 -1051:3:2240 -1052:3:2251 -1053:3:2252 -1054:3:2253 -1055:3:2264 -1056:3:2269 -1057:3:2270 -1058:0:3107 -1059:3:2282 -1060:0:3107 -1061:3:2284 -1062:0:3107 -1063:3:2285 -1064:0:3107 -1065:3:2286 -1066:0:3107 -1067:3:2287 -1068:0:3107 -1069:3:2288 -1070:3:2292 -1071:3:2293 -1072:3:2301 -1073:3:2302 -1074:3:2306 -1075:3:2307 -1076:3:2315 -1077:3:2320 -1078:3:2324 -1079:3:2325 -1080:3:2332 -1081:3:2333 -1082:3:2344 -1083:3:2345 -1084:3:2346 -1085:3:2357 -1086:3:2362 -1087:3:2363 -1088:0:3107 -1089:3:2375 -1090:0:3107 -1091:3:2656 -1092:0:3107 -1093:3:2754 -1094:0:3107 -1095:3:2755 -1096:0:3107 -1097:3:2759 -1098:0:3107 -1099:3:2765 -1100:3:2769 -1101:3:2770 -1102:3:2778 -1103:3:2779 -1104:3:2783 -1105:3:2784 -1106:3:2792 -1107:3:2797 -1108:3:2801 -1109:3:2802 -1110:3:2809 -1111:3:2810 -1112:3:2821 -1113:3:2822 -1114:3:2823 -1115:3:2834 -1116:3:2839 -1117:3:2840 -1118:0:3107 -1119:3:2855 -1120:0:3107 -1121:3:2856 -1122:3:2860 -1123:3:2861 -1124:3:2869 -1125:3:2870 -1126:3:2874 -1127:3:2875 -1128:3:2883 -1129:3:2888 -1130:3:2892 -1131:3:2893 -1132:3:2900 -1133:3:2901 -1134:3:2912 -1135:3:2913 -1136:3:2914 -1137:3:2925 -1138:3:2930 -1139:3:2931 -1140:0:3107 -1141:3:2946 -1142:0:3107 -1143:3:2951 -1144:3:2955 -1145:3:2956 -1146:3:2964 -1147:3:2965 -1148:3:2969 -1149:3:2970 -1150:3:2978 -1151:3:2983 -1152:3:2987 -1153:3:2988 -1154:3:2995 -1155:3:2996 -1156:3:3007 -1157:3:3008 -1158:3:3009 -1159:3:3020 -1160:3:3025 -1161:3:3026 -1162:0:3107 -1163:3:3041 -1164:0:3107 -1165:3:3043 -1166:0:3107 -1167:3:3044 -1168:0:3107 -1169:3:876 -1170:0:3107 -1171:3:877 -1172:3:881 -1173:3:882 -1174:3:890 -1175:3:891 -1176:3:895 -1177:3:896 -1178:3:904 -1179:3:909 -1180:3:913 -1181:3:914 -1182:3:921 -1183:3:922 -1184:3:933 -1185:3:934 -1186:3:935 -1187:3:946 -1188:3:951 -1189:3:952 -1190:0:3107 -1191:3:964 -1192:0:3107 -1193:3:966 -1194:3:967 -1195:0:3107 -1196:3:971 -1197:3:975 -1198:3:976 -1199:3:984 -1200:3:985 -1201:3:989 -1202:3:990 -1203:3:998 -1204:3:1003 -1205:3:1004 -1206:3:1015 -1207:3:1016 -1208:3:1027 -1209:3:1028 -1210:3:1029 -1211:3:1040 -1212:3:1045 -1213:3:1046 -1214:0:3107 -1215:3:1058 -1216:0:3107 -1217:3:1060 -1218:0:3107 -1219:3:1061 -1220:0:3107 -1221:3:1071 -1222:0:3107 -1223:3:1072 -1224:3:1076 -1225:3:1077 -1226:3:1085 -1227:3:1086 -1228:3:1090 -1229:3:1091 -1230:3:1099 -1231:3:1104 -1232:3:1108 -1233:3:1109 -1234:3:1116 -1235:3:1117 -1236:3:1128 -1237:3:1129 -1238:3:1130 -1239:3:1141 -1240:3:1146 -1241:3:1147 -1242:0:3107 -1243:3:1162 -1244:0:3107 -1245:3:1163 -1246:3:1167 -1247:3:1168 -1248:3:1176 -1249:3:1177 -1250:3:1181 -1251:3:1182 -1252:3:1190 -1253:3:1195 -1254:3:1199 -1255:3:1200 -1256:3:1207 -1257:3:1208 -1258:3:1219 -1259:3:1220 -1260:3:1221 -1261:3:1232 -1262:3:1237 -1263:3:1238 -1264:0:3107 -1265:3:1253 -1266:0:3107 -1267:3:1258 -1268:3:1262 -1269:3:1263 -1270:3:1271 -1271:3:1272 -1272:3:1276 -1273:3:1277 -1274:3:1285 -1275:3:1290 -1276:3:1294 -1277:3:1295 -1278:3:1302 -1279:3:1303 -1280:3:1314 -1281:3:1315 -1282:3:1316 -1283:3:1327 -1284:3:1332 -1285:3:1333 -1286:0:3107 -1287:3:1348 -1288:0:3107 -1289:3:1350 -1290:0:3107 -1291:3:1351 -1292:3:1355 -1293:3:1356 -1294:3:1364 -1295:3:1365 -1296:3:1369 -1297:3:1370 -1298:3:1378 -1299:3:1383 -1300:3:1387 -1301:3:1388 -1302:3:1395 -1303:3:1396 -1304:3:1407 -1305:3:1408 -1306:3:1409 -1307:3:1420 -1308:3:1425 -1309:3:1426 -1310:0:3107 -1311:3:1438 -1312:0:3107 -1313:3:1440 -1314:0:3107 -1315:3:1443 -1316:3:1444 -1317:3:1456 -1318:3:1457 -1319:3:1461 -1320:3:1462 -1321:3:1470 -1322:3:1475 -1323:3:1479 -1324:3:1480 -1325:3:1487 -1326:3:1488 -1327:3:1499 -1328:3:1500 -1329:3:1501 -1330:3:1512 -1331:3:1517 -1332:3:1518 -1333:0:3107 -1334:3:1530 -1335:0:3107 -1336:3:1532 -1337:0:3107 -1338:3:1533 -1339:0:3107 -1340:3:1534 -1341:0:3107 -1342:3:1535 -1343:0:3107 -1344:3:1536 -1345:3:1540 -1346:3:1541 -1347:3:1549 -1348:3:1550 -1349:3:1554 -1350:3:1555 -1351:3:1563 -1352:3:1568 -1353:3:1572 -1354:3:1573 -1355:3:1580 -1356:3:1581 -1357:3:1592 -1358:3:1593 -1359:3:1594 -1360:3:1605 -1361:3:1610 -1362:3:1611 -1363:0:3107 -1364:3:1623 -1365:0:3107 -1366:3:1904 -1367:0:3107 -1368:3:2002 -1369:0:3107 -1370:3:2003 -1371:0:3107 -1372:3:2007 -1373:0:3107 -1374:3:2013 -1375:3:2017 -1376:3:2018 -1377:3:2026 -1378:3:2027 -1379:3:2031 -1380:3:2032 -1381:3:2040 -1382:3:2045 -1383:3:2049 -1384:3:2050 -1385:3:2057 -1386:3:2058 -1387:3:2069 -1388:3:2070 -1389:3:2071 -1390:3:2082 -1391:3:2087 -1392:3:2088 -1393:0:3107 -1394:3:2100 -1395:0:3107 -1396:3:2102 -1397:0:3107 -1398:3:2103 -1399:3:2107 -1400:3:2108 -1401:3:2116 -1402:3:2117 -1403:3:2121 -1404:3:2122 -1405:3:2130 -1406:3:2135 -1407:3:2139 -1408:3:2140 -1409:3:2147 -1410:3:2148 -1411:3:2159 -1412:3:2160 -1413:3:2161 -1414:3:2172 -1415:3:2177 -1416:3:2178 -1417:0:3107 -1418:3:2190 -1419:0:3107 -1420:3:2192 -1421:0:3107 -1422:3:2195 -1423:3:2196 -1424:3:2208 -1425:3:2209 -1426:3:2213 -1427:3:2214 -1428:3:2222 -1429:3:2227 -1430:3:2231 -1431:3:2232 -1432:3:2239 -1433:3:2240 -1434:3:2251 -1435:3:2252 -1436:3:2253 -1437:3:2264 -1438:3:2269 -1439:3:2270 -1440:0:3107 -1441:3:2282 -1442:0:3107 -1443:3:2284 -1444:0:3107 -1445:3:2285 -1446:0:3107 -1447:3:2286 -1448:0:3107 -1449:3:2287 -1450:0:3107 -1451:3:2288 -1452:3:2292 -1453:3:2293 -1454:3:2301 -1455:3:2302 -1456:3:2306 -1457:3:2307 -1458:3:2315 -1459:3:2320 -1460:3:2324 -1461:3:2325 -1462:3:2332 -1463:3:2333 -1464:3:2344 -1465:3:2345 -1466:3:2346 -1467:3:2357 -1468:3:2362 -1469:3:2363 -1470:0:3107 -1471:3:2375 -1472:0:3107 -1473:3:2656 -1474:0:3107 -1475:3:2754 -1476:0:3107 -1477:3:2755 -1478:0:3107 -1479:3:2759 -1480:0:3107 -1481:3:2765 -1482:3:2769 -1483:3:2770 -1484:3:2778 -1485:3:2779 -1486:3:2783 -1487:3:2784 -1488:3:2792 -1489:3:2797 -1490:3:2801 -1491:3:2802 -1492:3:2809 -1493:3:2810 -1494:3:2821 -1495:3:2822 -1496:3:2823 -1497:3:2834 -1498:3:2839 -1499:3:2840 -1500:0:3107 -1501:3:2855 -1502:0:3107 -1503:3:2856 -1504:3:2860 -1505:3:2861 -1506:3:2869 -1507:3:2870 -1508:3:2874 -1509:3:2875 -1510:3:2883 -1511:3:2888 -1512:3:2892 -1513:3:2893 -1514:3:2900 -1515:3:2901 -1516:3:2912 -1517:3:2913 -1518:3:2914 -1519:3:2925 -1520:3:2930 -1521:3:2931 -1522:0:3107 -1523:3:2946 -1524:0:3107 -1525:3:2951 -1526:3:2955 -1527:3:2956 -1528:3:2964 -1529:3:2965 -1530:3:2969 -1531:3:2970 -1532:3:2978 -1533:3:2983 -1534:3:2987 -1535:3:2988 -1536:3:2995 -1537:3:2996 -1538:3:3007 -1539:3:3008 -1540:3:3009 -1541:3:3020 -1542:3:3025 -1543:3:3026 -1544:0:3107 -1545:3:3041 -1546:0:3107 -1547:3:3043 -1548:0:3107 -1549:3:3044 -1550:0:3107 -1551:3:876 -1552:0:3107 -1553:3:877 -1554:3:881 -1555:3:882 -1556:3:890 -1557:3:891 -1558:3:895 -1559:3:896 -1560:3:904 -1561:3:909 -1562:3:913 -1563:3:914 -1564:3:921 -1565:3:922 -1566:3:933 -1567:3:934 -1568:3:935 -1569:3:946 -1570:3:951 -1571:3:952 -1572:0:3107 -1573:3:964 -1574:0:3107 -1575:3:966 -1576:3:967 -1577:0:3107 -1578:3:971 -1579:3:975 -1580:3:976 -1581:3:984 -1582:3:985 -1583:3:989 -1584:3:990 -1585:3:998 -1586:3:1011 -1587:3:1012 -1588:3:1015 -1589:3:1016 -1590:3:1027 -1591:3:1028 -1592:3:1029 -1593:3:1040 -1594:3:1045 -1595:3:1048 -1596:3:1049 -1597:0:3107 -1598:3:1058 -1599:0:3107 -1600:3:1060 -1601:0:3107 -1602:3:1061 -1603:0:3107 -1604:3:1071 -1605:0:3107 -1606:3:1072 -1607:3:1076 -1608:3:1077 -1609:3:1085 -1610:3:1086 -1611:3:1090 -1612:3:1091 -1613:3:1099 -1614:3:1112 -1615:3:1113 -1616:3:1116 -1617:3:1117 -1618:3:1128 -1619:3:1129 -1620:3:1130 -1621:3:1141 -1622:3:1146 -1623:3:1149 -1624:3:1150 -1625:0:3107 -1626:3:1162 -1627:0:3107 -1628:3:1163 -1629:3:1167 -1630:3:1168 -1631:3:1176 -1632:3:1177 -1633:3:1181 -1634:3:1182 -1635:3:1190 -1636:3:1203 -1637:3:1204 -1638:3:1207 -1639:3:1208 -1640:3:1219 -1641:3:1220 -1642:3:1221 -1643:3:1232 -1644:3:1237 -1645:3:1240 -1646:3:1241 -1647:0:3107 -1648:3:1253 -1649:0:3107 -1650:3:1258 -1651:3:1262 -1652:3:1263 -1653:3:1271 -1654:3:1272 -1655:3:1276 -1656:3:1277 -1657:3:1285 -1658:3:1298 -1659:3:1299 -1660:3:1302 -1661:3:1303 -1662:3:1314 -1663:3:1315 -1664:3:1316 -1665:3:1327 -1666:3:1332 -1667:3:1335 -1668:3:1336 -1669:0:3107 -1670:3:1348 -1671:0:3107 -1672:3:1350 -1673:0:3107 -1674:3:1351 -1675:3:1355 -1676:3:1356 -1677:3:1364 -1678:3:1365 -1679:3:1369 -1680:3:1370 -1681:3:1378 -1682:3:1391 -1683:3:1392 -1684:3:1395 -1685:3:1396 -1686:3:1407 -1687:3:1408 -1688:3:1409 -1689:3:1420 -1690:3:1425 -1691:3:1428 -1692:3:1429 -1693:0:3107 -1694:3:1438 -1695:0:3107 -1696:3:1440 -1697:0:3107 -1698:3:1443 -1699:3:1444 -1700:3:1456 -1701:3:1457 -1702:3:1461 -1703:3:1462 -1704:3:1470 -1705:3:1483 -1706:3:1484 -1707:3:1487 -1708:3:1488 -1709:3:1499 -1710:3:1500 -1711:3:1501 -1712:3:1512 -1713:3:1517 -1714:3:1520 -1715:3:1521 -1716:0:3107 -1717:3:1530 -1718:0:3107 -1719:3:1532 -1720:0:3107 -1721:3:1533 -1722:0:3107 -1723:3:1534 -1724:0:3107 -1725:3:1535 -1726:0:3107 -1727:3:1536 -1728:3:1540 -1729:3:1541 -1730:3:1549 -1731:3:1550 -1732:3:1554 -1733:3:1555 -1734:3:1563 -1735:3:1576 -1736:3:1577 -1737:3:1580 -1738:3:1581 -1739:3:1592 -1740:3:1593 -1741:3:1594 -1742:3:1605 -1743:3:1610 -1744:3:1613 -1745:3:1614 -1746:0:3107 -1747:3:1623 -1748:0:3107 -1749:3:1904 -1750:0:3107 -1751:3:2002 -1752:0:3107 -1753:3:2003 -1754:0:3107 -1755:3:2007 -1756:0:3107 -1757:3:2013 -1758:3:2017 -1759:3:2018 -1760:3:2026 -1761:3:2027 -1762:3:2031 -1763:3:2032 -1764:3:2040 -1765:3:2053 -1766:3:2054 -1767:3:2057 -1768:3:2058 -1769:3:2069 -1770:3:2070 -1771:3:2071 -1772:3:2082 -1773:3:2087 -1774:3:2090 -1775:3:2091 -1776:0:3107 -1777:3:2100 -1778:0:3107 -1779:3:2102 -1780:0:3107 -1781:3:2103 -1782:3:2107 -1783:3:2108 -1784:3:2116 -1785:3:2117 -1786:3:2121 -1787:3:2122 -1788:3:2130 -1789:3:2143 -1790:3:2144 -1791:3:2147 -1792:3:2148 -1793:3:2159 -1794:3:2160 -1795:3:2161 -1796:3:2172 -1797:3:2177 -1798:3:2180 -1799:3:2181 -1800:0:3107 -1801:3:2190 -1802:0:3107 -1803:3:2192 -1804:0:3107 -1805:3:2195 -1806:3:2196 -1807:3:2208 -1808:3:2209 -1809:3:2213 -1810:3:2214 -1811:3:2222 -1812:3:2235 -1813:3:2236 -1814:3:2239 -1815:3:2240 -1816:3:2251 -1817:3:2252 -1818:3:2253 -1819:3:2264 -1820:3:2269 -1821:3:2272 -1822:3:2273 -1823:0:3107 -1824:3:2282 -1825:0:3107 -1826:3:2284 -1827:0:3107 -1828:3:2285 -1829:0:3107 -1830:3:2286 -1831:0:3107 -1832:3:2287 -1833:0:3107 -1834:3:2288 -1835:3:2292 -1836:3:2293 -1837:3:2301 -1838:3:2302 -1839:3:2306 -1840:3:2307 -1841:3:2315 -1842:3:2328 -1843:3:2329 -1844:3:2332 -1845:3:2333 -1846:3:2344 -1847:3:2345 -1848:3:2346 -1849:3:2357 -1850:3:2362 -1851:3:2365 -1852:3:2366 -1853:0:3107 -1854:3:2375 -1855:0:3107 -1856:3:2656 -1857:0:3107 -1858:3:2754 -1859:0:3107 -1860:3:2755 -1861:0:3107 -1862:3:2759 -1863:0:3107 -1864:3:2765 -1865:3:2769 -1866:3:2770 -1867:3:2778 -1868:3:2779 -1869:3:2783 -1870:3:2784 -1871:3:2792 -1872:3:2805 -1873:3:2806 -1874:3:2809 -1875:3:2810 -1876:3:2821 -1877:3:2822 -1878:3:2823 -1879:3:2834 -1880:3:2839 -1881:3:2842 -1882:3:2843 -1883:0:3107 -1884:3:2855 -1885:0:3107 -1886:3:2856 -1887:3:2860 -1888:3:2861 -1889:3:2869 -1890:3:2870 -1891:3:2874 -1892:3:2875 -1893:3:2883 -1894:3:2896 -1895:3:2897 -1896:3:2900 -1897:3:2901 -1898:3:2912 -1899:3:2913 -1900:3:2914 -1901:3:2925 -1902:3:2930 -1903:3:2933 -1904:3:2934 -1905:0:3107 -1906:3:2946 -1907:0:3107 -1908:3:2951 -1909:3:2955 -1910:3:2956 -1911:3:2964 -1912:3:2965 -1913:3:2969 -1914:3:2970 -1915:3:2978 -1916:3:2991 -1917:3:2992 -1918:3:2995 -1919:3:2996 -1920:3:3007 -1921:3:3008 -1922:3:3009 -1923:3:3020 -1924:3:3025 -1925:3:3028 -1926:3:3029 -1927:0:3107 -1928:3:3041 -1929:0:3107 -1930:3:3043 -1931:0:3107 -1932:3:3044 -1933:0:3107 -1934:3:3047 -1935:0:3107 -1936:3:3052 -1937:0:3107 -1938:2:458 -1939:0:3107 -1940:3:3053 -1941:0:3107 -1942:2:464 -1943:0:3107 -1944:3:3052 -1945:0:3107 -1946:2:465 -1947:0:3107 -1948:3:3053 -1949:0:3107 -1950:2:466 -1951:0:3107 -1952:3:3052 -1953:0:3107 -1954:2:467 -1955:0:3107 -1956:3:3053 -1957:0:3107 -1958:1:2 -1959:0:3107 -1960:3:3052 -1961:0:3107 -1962:2:468 -1963:0:3107 -1964:3:3053 -1965:0:3107 -1966:1:8 -1967:0:3107 -1968:3:3052 -1969:0:3107 -1970:2:467 -1971:0:3107 -1972:3:3053 -1973:0:3107 -1974:1:9 -1975:0:3107 -1976:3:3052 -1977:0:3107 -1978:2:468 -1979:0:3107 -1980:3:3053 -1981:0:3107 -1982:1:10 -1983:0:3107 -1984:3:3052 -1985:0:3107 -1986:2:467 -1987:0:3107 -1988:3:3053 -1989:0:3107 -1990:1:11 -1991:0:3107 -1992:3:3052 -1993:0:3107 -1994:2:468 -1995:0:3107 -1996:3:3053 -1997:0:3107 -1998:1:12 -1999:1:16 -2000:1:17 -2001:1:25 -2002:1:26 -2003:1:30 -2004:1:31 -2005:1:39 -2006:1:44 -2007:1:48 -2008:1:49 -2009:1:56 -2010:1:57 -2011:1:68 -2012:1:69 -2013:1:70 -2014:1:81 -2015:1:86 -2016:1:87 -2017:0:3107 -2018:3:3052 -2019:0:3107 -2020:2:467 -2021:0:3107 -2022:3:3053 -2023:0:3107 -2024:1:99 -2025:0:3107 -2026:3:3052 -2027:0:3107 -2028:2:468 -2029:0:3107 -2030:3:3053 -2031:0:3107 -2032:2:469 -2033:0:3107 -2034:3:3052 -2035:0:3107 -2036:2:475 -2037:0:3107 -2038:3:3053 -2039:0:3107 -2040:2:476 -2041:0:3107 -2042:3:3052 -2043:0:3107 -2044:2:477 -2045:2:481 -2046:2:482 -2047:2:490 -2048:2:491 -2049:2:495 -2050:2:496 -2051:2:504 -2052:2:509 -2053:2:513 -2054:2:514 -2055:2:521 -2056:2:522 -2057:2:533 -2058:2:534 -2059:2:535 -2060:2:546 -2061:2:551 -2062:2:552 -2063:0:3107 -2064:3:3053 -2065:0:3107 -2066:2:564 -2067:0:3107 -2068:3:3052 -2069:0:3107 -2070:2:565 -2071:2:569 -2072:2:570 -2073:2:578 -2074:2:579 -2075:2:583 -2076:2:584 -2077:2:592 -2078:2:597 -2079:2:601 -2080:2:602 -2081:2:609 -2082:2:610 -2083:2:621 -2084:2:622 -2085:2:623 -2086:2:634 -2087:2:639 -2088:2:640 -2089:0:3107 -2090:3:3053 -2091:0:3107 -2092:2:652 -2093:0:3107 -2094:3:3052 -2095:0:3107 -2096:2:653 -2097:0:3107 -2098:3:3053 -2099:0:3107 -2100:2:654 -2101:2:658 -2102:2:659 -2103:2:667 -2104:2:668 -2105:2:672 -2106:2:673 -2107:2:681 -2108:2:686 -2109:2:690 -2110:2:691 -2111:2:698 -2112:2:699 -2113:2:710 -2114:2:711 -2115:2:712 -2116:2:723 -2117:2:728 -2118:2:729 -2119:0:3107 -2120:3:3052 -2121:0:3107 -2122:2:741 -2123:0:3107 -2124:3:3053 -2125:0:3107 -2126:2:750 -2127:0:3107 -2128:3:3052 -2129:0:3107 -2130:2:753 -2131:0:3107 -2132:3:3053 -2133:0:3107 -2134:2:758 -2135:0:3107 -2136:3:3052 -2137:0:3107 -2138:2:759 -2139:0:3105 -2140:3:3053 -2141:0:3111 -2142:2:647 diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.define b/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.log b/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.log deleted file mode 100644 index 5bcef22..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.log +++ /dev/null @@ -1,300 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_rmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -Depth= 5678 States= 1e+06 Transitions= 8.21e+06 Memory= 534.904 t= 6.72 R= 1e+05 -Depth= 5678 States= 2e+06 Transitions= 1.6e+07 Memory= 603.557 t= 13.4 R= 1e+05 -Depth= 16003 States= 3e+06 Transitions= 2.49e+07 Memory= 672.209 t= 21.5 R= 1e+05 -pan: resizing hashtable to -w22.. done -Depth= 31043 States= 4e+06 Transitions= 3.44e+07 Memory= 771.983 t= 30.1 R= 1e+05 -Depth= 31043 States= 5e+06 Transitions= 4.41e+07 Memory= 840.635 t= 38.4 R= 1e+05 -Depth= 31043 States= 6e+06 Transitions= 5.25e+07 Memory= 909.287 t= 45.7 R= 1e+05 -Depth= 31043 States= 7e+06 Transitions= 6.12e+07 Memory= 977.940 t= 53.4 R= 1e+05 -Depth= 31043 States= 8e+06 Transitions= 6.95e+07 Memory= 1046.690 t= 60.8 R= 1e+05 -Depth= 31043 States= 9e+06 Transitions= 7.78e+07 Memory= 1115.342 t= 68.5 R= 1e+05 -pan: resizing hashtable to -w24.. done -Depth= 31043 States= 1e+07 Transitions= 8.68e+07 Memory= 1308.088 t= 77.9 R= 1e+05 -Depth= 31043 States= 1.1e+07 Transitions= 1.01e+08 Memory= 1376.740 t= 90.1 R= 1e+05 -Depth= 31043 States= 1.2e+07 Transitions= 1.13e+08 Memory= 1445.393 t= 101 R= 1e+05 -Depth= 31043 States= 1.3e+07 Transitions= 1.25e+08 Memory= 1514.045 t= 111 R= 1e+05 -Depth= 31043 States= 1.4e+07 Transitions= 1.38e+08 Memory= 1582.795 t= 122 R= 1e+05 -pan: claim violated! (at depth 1774) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 64 byte, depth reached 31043, errors: 1 - 14288659 states, stored -1.2755714e+08 states, matched -1.418458e+08 transitions (= stored+matched) -4.6616273e+08 atomic steps -hash conflicts: 65726574 (resolved) - -Stats on memory usage (in Megabytes): - 1253.659 equivalent memory usage for states (stored*(State-vector + overhead)) - 1017.191 actual memory usage for states (compression: 81.14%) - state-vector as stored = 47 byte + 28 byte overhead - 128.000 memory used for hash table (-w24) - 457.764 memory used for DFS stack (-m10000000) - 1602.619 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 256, "(1)" - line 418, "pan.___", state 286, "(1)" - line 399, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 395, "(1)" - line 418, "pan.___", state 425, "(1)" - line 540, "pan.___", state 456, "-end-" - (17 of 456 states) -unreached in proctype urcu_reader_sig - line 399, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 70, "(1)" - line 418, "pan.___", state 100, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 247, "(1)" - line 418, "pan.___", state 277, "(1)" - line 399, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 359, "(1)" - line 418, "pan.___", state 389, "(1)" - line 614, "pan.___", state 411, "-end-" - (17 of 411 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 20, "(1)" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 34, "(1)" - line 403, "pan.___", state 35, "(1)" - line 403, "pan.___", state 35, "(1)" - line 401, "pan.___", state 40, "((i<1))" - line 401, "pan.___", state 40, "((i>=1))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 59, "(1)" - line 409, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 60, "else" - line 409, "pan.___", state 63, "(1)" - line 409, "pan.___", state 64, "(1)" - line 409, "pan.___", state 64, "(1)" - line 413, "pan.___", state 72, "(1)" - line 413, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 73, "else" - line 413, "pan.___", state 76, "(1)" - line 413, "pan.___", state 77, "(1)" - line 413, "pan.___", state 77, "(1)" - line 411, "pan.___", state 82, "((i<1))" - line 411, "pan.___", state 82, "((i>=1))" - line 418, "pan.___", state 89, "(1)" - line 418, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 90, "else" - line 418, "pan.___", state 93, "(1)" - line 418, "pan.___", state 94, "(1)" - line 418, "pan.___", state 94, "(1)" - line 420, "pan.___", state 97, "(1)" - line 420, "pan.___", state 97, "(1)" - line 369, "pan.___", state 99, "(1)" - line 639, "pan.___", state 103, "cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )] = (old_gen+1)" - line 637, "pan.___", state 104, "old_gen = cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )]" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 114, "(1)" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 128, "(1)" - line 403, "pan.___", state 129, "(1)" - line 403, "pan.___", state 129, "(1)" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 420, "pan.___", state 191, "(1)" - line 420, "pan.___", state 191, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 175, "pan.___", state 243, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 291, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 304, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 320, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 334, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 352, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 365, "(1)" - line 413, "pan.___", state 378, "(1)" - line 418, "pan.___", state 395, "(1)" - line 399, "pan.___", state 414, "(1)" - line 403, "pan.___", state 426, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 444, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 470, "(1)" - line 418, "pan.___", state 487, "(1)" - line 403, "pan.___", state 519, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 537, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 563, "(1)" - line 418, "pan.___", state 580, "(1)" - line 179, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 616, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 175, "pan.___", state 629, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 677, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 690, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 714, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 716, "(1)" - line 399, "pan.___", state 717, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 717, "else" - line 399, "pan.___", state 720, "(1)" - line 403, "pan.___", state 728, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 730, "(1)" - line 403, "pan.___", state 731, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 731, "else" - line 403, "pan.___", state 734, "(1)" - line 403, "pan.___", state 735, "(1)" - line 403, "pan.___", state 735, "(1)" - line 401, "pan.___", state 740, "((i<1))" - line 401, "pan.___", state 740, "((i>=1))" - line 408, "pan.___", state 746, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 759, "(1)" - line 409, "pan.___", state 760, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 760, "else" - line 409, "pan.___", state 763, "(1)" - line 409, "pan.___", state 764, "(1)" - line 409, "pan.___", state 764, "(1)" - line 413, "pan.___", state 772, "(1)" - line 413, "pan.___", state 773, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 773, "else" - line 413, "pan.___", state 776, "(1)" - line 413, "pan.___", state 777, "(1)" - line 413, "pan.___", state 777, "(1)" - line 411, "pan.___", state 782, "((i<1))" - line 411, "pan.___", state 782, "((i>=1))" - line 418, "pan.___", state 789, "(1)" - line 418, "pan.___", state 790, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 790, "else" - line 418, "pan.___", state 793, "(1)" - line 418, "pan.___", state 794, "(1)" - line 418, "pan.___", state 794, "(1)" - line 420, "pan.___", state 797, "(1)" - line 420, "pan.___", state 797, "(1)" - line 403, "pan.___", state 828, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 846, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 872, "(1)" - line 418, "pan.___", state 889, "(1)" - line 403, "pan.___", state 918, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 936, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 962, "(1)" - line 418, "pan.___", state 979, "(1)" - line 399, "pan.___", state 998, "(1)" - line 403, "pan.___", state 1010, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1028, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1054, "(1)" - line 418, "pan.___", state 1071, "(1)" - line 403, "pan.___", state 1103, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1121, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1147, "(1)" - line 418, "pan.___", state 1164, "(1)" - line 179, "pan.___", state 1187, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1200, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 175, "pan.___", state 1213, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 1261, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1274, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1298, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1300, "(1)" - line 399, "pan.___", state 1301, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1301, "else" - line 399, "pan.___", state 1304, "(1)" - line 403, "pan.___", state 1312, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 1314, "(1)" - line 403, "pan.___", state 1315, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 1315, "else" - line 403, "pan.___", state 1318, "(1)" - line 403, "pan.___", state 1319, "(1)" - line 403, "pan.___", state 1319, "(1)" - line 401, "pan.___", state 1324, "((i<1))" - line 401, "pan.___", state 1324, "((i>=1))" - line 408, "pan.___", state 1330, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1343, "(1)" - line 409, "pan.___", state 1344, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 1344, "else" - line 409, "pan.___", state 1347, "(1)" - line 409, "pan.___", state 1348, "(1)" - line 409, "pan.___", state 1348, "(1)" - line 413, "pan.___", state 1356, "(1)" - line 413, "pan.___", state 1357, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 1357, "else" - line 413, "pan.___", state 1360, "(1)" - line 413, "pan.___", state 1361, "(1)" - line 413, "pan.___", state 1361, "(1)" - line 411, "pan.___", state 1366, "((i<1))" - line 411, "pan.___", state 1366, "((i>=1))" - line 418, "pan.___", state 1373, "(1)" - line 418, "pan.___", state 1374, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 1374, "else" - line 418, "pan.___", state 1377, "(1)" - line 418, "pan.___", state 1378, "(1)" - line 418, "pan.___", state 1378, "(1)" - line 420, "pan.___", state 1381, "(1)" - line 420, "pan.___", state 1381, "(1)" - line 179, "pan.___", state 1406, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1419, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 175, "pan.___", state 1432, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 1480, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1493, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 702, "pan.___", state 1520, "-end-" - (144 of 1520 states) -unreached in proctype :init: - line 709, "pan.___", state 9, "((j<2))" - line 709, "pan.___", state 9, "((j>=2))" - line 710, "pan.___", state 20, "((j<2))" - line 710, "pan.___", state 20, "((j>=2))" - line 715, "pan.___", state 33, "((j<2))" - line 715, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 749, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 125 seconds -pan: rate 114108.44 states/second -pan: avg transition delay 8.8279e-07 usec -cp .input.spin urcu_free_no_rmb.spin.input -cp .input.spin.trail urcu_free_no_rmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.spin.input b/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.spin.input deleted file mode 100644 index ccf5f5c..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define NO_RMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.spin.input.trail b/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.spin.input.trail deleted file mode 100644 index 1e5e132..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free_no_rmb.spin.input.trail +++ /dev/null @@ -1,1777 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:2435 -2:4:2387 -3:4:2390 -4:4:2390 -5:4:2393 -6:4:2401 -7:4:2401 -8:4:2404 -9:4:2410 -10:4:2414 -11:4:2414 -12:4:2417 -13:4:2425 -14:4:2429 -15:4:2430 -16:0:2435 -17:4:2432 -18:0:2435 -19:3:869 -20:0:2435 -21:3:875 -22:0:2435 -23:3:876 -24:0:2435 -25:3:877 -26:3:881 -27:3:882 -28:3:890 -29:3:891 -30:3:895 -31:3:896 -32:3:904 -33:3:909 -34:3:913 -35:3:914 -36:3:921 -37:3:922 -38:3:933 -39:3:934 -40:3:935 -41:3:946 -42:3:951 -43:3:952 -44:0:2435 -45:3:964 -46:0:2435 -47:3:966 -48:3:967 -49:0:2435 -50:3:971 -51:3:975 -52:3:976 -53:3:984 -54:3:985 -55:3:989 -56:3:990 -57:3:998 -58:3:1003 -59:3:1004 -60:3:1015 -61:3:1016 -62:3:1027 -63:3:1028 -64:3:1029 -65:3:1040 -66:3:1045 -67:3:1046 -68:0:2435 -69:3:1058 -70:0:2435 -71:3:1060 -72:0:2435 -73:3:1061 -74:0:2435 -75:3:1071 -76:0:2435 -77:3:1075 -78:3:1076 -79:3:1080 -80:3:1084 -81:3:1085 -82:3:1089 -83:3:1097 -84:3:1098 -85:0:2435 -86:3:1106 -87:0:2435 -88:3:1110 -89:3:1111 -90:3:1115 -91:3:1119 -92:3:1120 -93:3:1124 -94:3:1132 -95:3:1133 -96:0:2435 -97:3:1141 -98:0:2435 -99:3:1149 -100:3:1150 -101:3:1154 -102:3:1158 -103:3:1159 -104:3:1163 -105:3:1171 -106:3:1172 -107:0:2435 -108:3:1180 -109:0:2435 -110:3:1182 -111:0:2435 -112:3:1183 -113:3:1187 -114:3:1188 -115:3:1196 -116:3:1197 -117:3:1201 -118:3:1202 -119:3:1210 -120:3:1215 -121:3:1219 -122:3:1220 -123:3:1227 -124:3:1228 -125:3:1239 -126:3:1240 -127:3:1241 -128:3:1252 -129:3:1257 -130:3:1258 -131:0:2435 -132:3:1270 -133:0:2435 -134:3:1272 -135:0:2435 -136:3:1275 -137:3:1276 -138:3:1288 -139:3:1289 -140:3:1293 -141:3:1294 -142:3:1302 -143:3:1307 -144:3:1311 -145:3:1312 -146:3:1319 -147:3:1320 -148:3:1331 -149:3:1332 -150:3:1333 -151:3:1344 -152:3:1349 -153:3:1350 -154:0:2435 -155:3:1362 -156:0:2435 -157:3:1364 -158:0:2435 -159:3:1365 -160:0:2435 -161:3:1366 -162:0:2435 -163:3:1367 -164:0:2435 -165:3:1368 -166:3:1372 -167:3:1373 -168:3:1381 -169:3:1382 -170:3:1386 -171:3:1387 -172:3:1395 -173:3:1400 -174:3:1404 -175:3:1405 -176:3:1412 -177:3:1413 -178:3:1424 -179:3:1425 -180:3:1426 -181:3:1437 -182:3:1442 -183:3:1443 -184:0:2435 -185:3:1455 -186:0:2435 -187:3:1568 -188:0:2435 -189:3:1666 -190:0:2435 -191:3:1667 -192:0:2435 -193:3:1671 -194:0:2435 -195:3:1677 -196:3:1681 -197:3:1682 -198:3:1690 -199:3:1691 -200:3:1695 -201:3:1696 -202:3:1704 -203:3:1709 -204:3:1713 -205:3:1714 -206:3:1721 -207:3:1722 -208:3:1733 -209:3:1734 -210:3:1735 -211:3:1746 -212:3:1751 -213:3:1752 -214:0:2435 -215:3:1764 -216:0:2435 -217:3:1766 -218:0:2435 -219:3:1767 -220:3:1771 -221:3:1772 -222:3:1780 -223:3:1781 -224:3:1785 -225:3:1786 -226:3:1794 -227:3:1799 -228:3:1803 -229:3:1804 -230:3:1811 -231:3:1812 -232:3:1823 -233:3:1824 -234:3:1825 -235:3:1836 -236:3:1841 -237:3:1842 -238:0:2435 -239:3:1854 -240:0:2435 -241:3:1856 -242:0:2435 -243:3:1859 -244:3:1860 -245:3:1872 -246:3:1873 -247:3:1877 -248:3:1878 -249:3:1886 -250:3:1891 -251:3:1895 -252:3:1896 -253:3:1903 -254:3:1904 -255:3:1915 -256:3:1916 -257:3:1917 -258:3:1928 -259:3:1933 -260:3:1934 -261:0:2435 -262:3:1946 -263:0:2435 -264:3:1948 -265:0:2435 -266:3:1949 -267:0:2435 -268:3:1950 -269:0:2435 -270:3:1951 -271:0:2435 -272:3:1952 -273:3:1956 -274:3:1957 -275:3:1965 -276:3:1966 -277:3:1970 -278:3:1971 -279:3:1979 -280:3:1984 -281:3:1988 -282:3:1989 -283:3:1996 -284:3:1997 -285:3:2008 -286:3:2009 -287:3:2010 -288:3:2021 -289:3:2026 -290:3:2027 -291:0:2435 -292:3:2039 -293:0:2435 -294:3:2152 -295:0:2435 -296:3:2250 -297:0:2435 -298:3:2251 -299:0:2435 -300:3:2255 -301:0:2435 -302:3:2264 -303:3:2265 -304:3:2269 -305:3:2273 -306:3:2274 -307:3:2278 -308:3:2286 -309:3:2287 -310:0:2435 -311:3:2295 -312:0:2435 -313:3:2299 -314:3:2300 -315:3:2304 -316:3:2308 -317:3:2309 -318:3:2313 -319:3:2321 -320:3:2322 -321:0:2435 -322:3:2330 -323:0:2435 -324:3:2338 -325:3:2339 -326:3:2343 -327:3:2347 -328:3:2348 -329:3:2352 -330:3:2360 -331:3:2361 -332:0:2435 -333:3:2369 -334:0:2435 -335:3:2371 -336:0:2435 -337:3:2372 -338:0:2435 -339:3:876 -340:0:2435 -341:3:877 -342:3:881 -343:3:882 -344:3:890 -345:3:891 -346:3:895 -347:3:896 -348:3:904 -349:3:909 -350:3:913 -351:3:914 -352:3:921 -353:3:922 -354:3:933 -355:3:934 -356:3:935 -357:3:946 -358:3:951 -359:3:952 -360:0:2435 -361:3:964 -362:0:2435 -363:3:966 -364:3:967 -365:0:2435 -366:3:971 -367:3:975 -368:3:976 -369:3:984 -370:3:985 -371:3:989 -372:3:990 -373:3:998 -374:3:1003 -375:3:1004 -376:3:1015 -377:3:1016 -378:3:1027 -379:3:1028 -380:3:1029 -381:3:1040 -382:3:1045 -383:3:1046 -384:0:2435 -385:3:1058 -386:0:2435 -387:3:1060 -388:0:2435 -389:3:1061 -390:0:2435 -391:3:1071 -392:0:2435 -393:3:1075 -394:3:1076 -395:3:1080 -396:3:1084 -397:3:1085 -398:3:1089 -399:3:1097 -400:3:1098 -401:0:2435 -402:3:1106 -403:0:2435 -404:3:1110 -405:3:1111 -406:3:1115 -407:3:1119 -408:3:1120 -409:3:1124 -410:3:1132 -411:3:1133 -412:0:2435 -413:3:1141 -414:0:2435 -415:3:1149 -416:3:1150 -417:3:1154 -418:3:1158 -419:3:1159 -420:3:1163 -421:3:1171 -422:3:1172 -423:0:2435 -424:3:1180 -425:0:2435 -426:3:1182 -427:0:2435 -428:3:1183 -429:3:1187 -430:3:1188 -431:3:1196 -432:3:1197 -433:3:1201 -434:3:1202 -435:3:1210 -436:3:1215 -437:3:1219 -438:3:1220 -439:3:1227 -440:3:1228 -441:3:1239 -442:3:1240 -443:3:1241 -444:3:1252 -445:3:1257 -446:3:1258 -447:0:2435 -448:3:1270 -449:0:2435 -450:3:1272 -451:0:2435 -452:3:1275 -453:3:1276 -454:3:1288 -455:3:1289 -456:3:1293 -457:3:1294 -458:3:1302 -459:3:1307 -460:3:1311 -461:3:1312 -462:3:1319 -463:3:1320 -464:3:1331 -465:3:1332 -466:3:1333 -467:3:1344 -468:3:1349 -469:3:1350 -470:0:2435 -471:3:1362 -472:0:2435 -473:3:1364 -474:0:2435 -475:3:1365 -476:0:2435 -477:3:1366 -478:0:2435 -479:3:1367 -480:0:2435 -481:3:1368 -482:3:1372 -483:3:1373 -484:3:1381 -485:3:1382 -486:3:1386 -487:3:1387 -488:3:1395 -489:3:1400 -490:3:1404 -491:3:1405 -492:3:1412 -493:3:1413 -494:3:1424 -495:3:1425 -496:3:1426 -497:3:1437 -498:3:1442 -499:3:1443 -500:0:2435 -501:3:1455 -502:0:2435 -503:3:1568 -504:0:2435 -505:3:1666 -506:0:2435 -507:3:1667 -508:0:2435 -509:3:1671 -510:0:2435 -511:3:1677 -512:3:1681 -513:3:1682 -514:3:1690 -515:3:1691 -516:3:1695 -517:3:1696 -518:3:1704 -519:3:1709 -520:3:1713 -521:3:1714 -522:3:1721 -523:3:1722 -524:3:1733 -525:3:1734 -526:3:1735 -527:3:1746 -528:3:1751 -529:3:1752 -530:0:2435 -531:3:1764 -532:0:2435 -533:3:1766 -534:0:2435 -535:3:1767 -536:3:1771 -537:3:1772 -538:3:1780 -539:3:1781 -540:3:1785 -541:3:1786 -542:3:1794 -543:3:1799 -544:3:1803 -545:3:1804 -546:3:1811 -547:3:1812 -548:3:1823 -549:3:1824 -550:3:1825 -551:3:1836 -552:3:1841 -553:3:1842 -554:0:2435 -555:3:1854 -556:0:2435 -557:3:1856 -558:0:2435 -559:3:1859 -560:3:1860 -561:3:1872 -562:3:1873 -563:3:1877 -564:3:1878 -565:3:1886 -566:3:1891 -567:3:1895 -568:3:1896 -569:3:1903 -570:3:1904 -571:3:1915 -572:3:1916 -573:3:1917 -574:3:1928 -575:3:1933 -576:3:1934 -577:0:2435 -578:3:1946 -579:0:2435 -580:3:1948 -581:0:2435 -582:3:1949 -583:0:2435 -584:3:1950 -585:0:2435 -586:3:1951 -587:0:2435 -588:3:1952 -589:3:1956 -590:3:1957 -591:3:1965 -592:3:1966 -593:3:1970 -594:3:1971 -595:3:1979 -596:3:1984 -597:3:1988 -598:3:1989 -599:3:1996 -600:3:1997 -601:3:2008 -602:3:2009 -603:3:2010 -604:3:2021 -605:3:2026 -606:3:2027 -607:0:2435 -608:3:2039 -609:0:2435 -610:3:2152 -611:0:2435 -612:3:2250 -613:0:2435 -614:3:2251 -615:0:2435 -616:3:2255 -617:0:2435 -618:3:2264 -619:3:2265 -620:3:2269 -621:3:2273 -622:3:2274 -623:3:2278 -624:3:2286 -625:3:2287 -626:0:2435 -627:3:2295 -628:0:2435 -629:3:2299 -630:3:2300 -631:3:2304 -632:3:2308 -633:3:2309 -634:3:2313 -635:3:2321 -636:3:2322 -637:0:2435 -638:3:2330 -639:0:2435 -640:3:2338 -641:3:2339 -642:3:2343 -643:3:2347 -644:3:2348 -645:3:2352 -646:3:2360 -647:3:2361 -648:0:2435 -649:3:2369 -650:0:2435 -651:3:2371 -652:0:2435 -653:3:2372 -654:0:2435 -655:3:876 -656:0:2435 -657:3:877 -658:3:881 -659:3:882 -660:3:890 -661:3:891 -662:3:895 -663:3:896 -664:3:904 -665:3:909 -666:3:913 -667:3:914 -668:3:921 -669:3:922 -670:3:933 -671:3:934 -672:3:935 -673:3:946 -674:3:951 -675:3:952 -676:0:2435 -677:3:964 -678:0:2435 -679:3:966 -680:3:967 -681:0:2435 -682:3:971 -683:3:975 -684:3:976 -685:3:984 -686:3:985 -687:3:989 -688:3:990 -689:3:998 -690:3:1003 -691:3:1004 -692:3:1015 -693:3:1016 -694:3:1027 -695:3:1028 -696:3:1029 -697:3:1040 -698:3:1045 -699:3:1046 -700:0:2435 -701:3:1058 -702:0:2435 -703:3:1060 -704:0:2435 -705:3:1061 -706:0:2435 -707:3:1071 -708:0:2435 -709:3:1075 -710:3:1076 -711:3:1080 -712:3:1084 -713:3:1085 -714:3:1089 -715:3:1097 -716:3:1098 -717:0:2435 -718:3:1106 -719:0:2435 -720:3:1110 -721:3:1111 -722:3:1115 -723:3:1119 -724:3:1120 -725:3:1124 -726:3:1132 -727:3:1133 -728:0:2435 -729:3:1141 -730:0:2435 -731:3:1149 -732:3:1150 -733:3:1154 -734:3:1158 -735:3:1159 -736:3:1163 -737:3:1171 -738:3:1172 -739:0:2435 -740:3:1180 -741:0:2435 -742:3:1182 -743:0:2435 -744:3:1183 -745:3:1187 -746:3:1188 -747:3:1196 -748:3:1197 -749:3:1201 -750:3:1202 -751:3:1210 -752:3:1215 -753:3:1219 -754:3:1220 -755:3:1227 -756:3:1228 -757:3:1239 -758:3:1240 -759:3:1241 -760:3:1252 -761:3:1257 -762:3:1258 -763:0:2435 -764:3:1270 -765:0:2435 -766:3:1272 -767:0:2435 -768:3:1275 -769:3:1276 -770:3:1288 -771:3:1289 -772:3:1293 -773:3:1294 -774:3:1302 -775:3:1307 -776:3:1311 -777:3:1312 -778:3:1319 -779:3:1320 -780:3:1331 -781:3:1332 -782:3:1333 -783:3:1344 -784:3:1349 -785:3:1350 -786:0:2435 -787:3:1362 -788:0:2435 -789:3:1364 -790:0:2435 -791:3:1365 -792:0:2435 -793:3:1366 -794:0:2435 -795:3:1367 -796:0:2435 -797:3:1368 -798:3:1372 -799:3:1373 -800:3:1381 -801:3:1382 -802:3:1386 -803:3:1387 -804:3:1395 -805:3:1400 -806:3:1404 -807:3:1405 -808:3:1412 -809:3:1413 -810:3:1424 -811:3:1425 -812:3:1426 -813:3:1437 -814:3:1442 -815:3:1443 -816:0:2435 -817:3:1455 -818:0:2435 -819:3:1568 -820:0:2435 -821:3:1666 -822:0:2435 -823:3:1667 -824:0:2435 -825:3:1671 -826:0:2435 -827:3:1677 -828:3:1681 -829:3:1682 -830:3:1690 -831:3:1691 -832:3:1695 -833:3:1696 -834:3:1704 -835:3:1709 -836:3:1713 -837:3:1714 -838:3:1721 -839:3:1722 -840:3:1733 -841:3:1734 -842:3:1735 -843:3:1746 -844:3:1751 -845:3:1752 -846:0:2435 -847:3:1764 -848:0:2435 -849:3:1766 -850:0:2435 -851:3:1767 -852:3:1771 -853:3:1772 -854:3:1780 -855:3:1781 -856:3:1785 -857:3:1786 -858:3:1794 -859:3:1799 -860:3:1803 -861:3:1804 -862:3:1811 -863:3:1812 -864:3:1823 -865:3:1824 -866:3:1825 -867:3:1836 -868:3:1841 -869:3:1842 -870:0:2435 -871:3:1854 -872:0:2435 -873:3:1856 -874:0:2435 -875:3:1859 -876:3:1860 -877:3:1872 -878:3:1873 -879:3:1877 -880:3:1878 -881:3:1886 -882:3:1891 -883:3:1895 -884:3:1896 -885:3:1903 -886:3:1904 -887:3:1915 -888:3:1916 -889:3:1917 -890:3:1928 -891:3:1933 -892:3:1934 -893:0:2435 -894:3:1946 -895:0:2435 -896:3:1948 -897:0:2435 -898:3:1949 -899:0:2435 -900:3:1950 -901:0:2435 -902:3:1951 -903:0:2435 -904:3:1952 -905:3:1956 -906:3:1957 -907:3:1965 -908:3:1966 -909:3:1970 -910:3:1971 -911:3:1979 -912:3:1984 -913:3:1988 -914:3:1989 -915:3:1996 -916:3:1997 -917:3:2008 -918:3:2009 -919:3:2010 -920:3:2021 -921:3:2026 -922:3:2027 -923:0:2435 -924:3:2039 -925:0:2435 -926:3:2152 -927:0:2435 -928:3:2250 -929:0:2435 -930:3:2251 -931:0:2435 -932:3:2255 -933:0:2435 -934:3:2264 -935:3:2265 -936:3:2269 -937:3:2273 -938:3:2274 -939:3:2278 -940:3:2286 -941:3:2287 -942:0:2435 -943:3:2295 -944:0:2435 -945:3:2299 -946:3:2300 -947:3:2304 -948:3:2308 -949:3:2309 -950:3:2313 -951:3:2321 -952:3:2322 -953:0:2435 -954:3:2330 -955:0:2435 -956:3:2338 -957:3:2339 -958:3:2343 -959:3:2347 -960:3:2348 -961:3:2352 -962:3:2360 -963:3:2361 -964:0:2435 -965:3:2369 -966:0:2435 -967:3:2371 -968:0:2435 -969:3:2372 -970:0:2435 -971:3:876 -972:0:2435 -973:3:877 -974:3:881 -975:3:882 -976:3:890 -977:3:891 -978:3:895 -979:3:896 -980:3:904 -981:3:909 -982:3:913 -983:3:914 -984:3:921 -985:3:922 -986:3:933 -987:3:934 -988:3:935 -989:3:946 -990:3:951 -991:3:952 -992:0:2435 -993:3:964 -994:0:2435 -995:3:966 -996:3:967 -997:0:2435 -998:3:971 -999:3:975 -1000:3:976 -1001:3:984 -1002:3:985 -1003:3:989 -1004:3:990 -1005:3:998 -1006:3:1003 -1007:3:1004 -1008:3:1015 -1009:3:1016 -1010:3:1027 -1011:3:1028 -1012:3:1029 -1013:3:1040 -1014:3:1045 -1015:3:1046 -1016:0:2435 -1017:3:1058 -1018:0:2435 -1019:3:1060 -1020:0:2435 -1021:3:1061 -1022:0:2435 -1023:3:1071 -1024:0:2435 -1025:3:1075 -1026:3:1076 -1027:3:1080 -1028:3:1084 -1029:3:1085 -1030:3:1089 -1031:3:1097 -1032:3:1098 -1033:0:2435 -1034:3:1106 -1035:0:2435 -1036:3:1110 -1037:3:1111 -1038:3:1115 -1039:3:1119 -1040:3:1120 -1041:3:1124 -1042:3:1132 -1043:3:1133 -1044:0:2435 -1045:3:1141 -1046:0:2435 -1047:3:1149 -1048:3:1150 -1049:3:1154 -1050:3:1158 -1051:3:1159 -1052:3:1163 -1053:3:1171 -1054:3:1172 -1055:0:2435 -1056:3:1180 -1057:0:2435 -1058:3:1182 -1059:0:2435 -1060:3:1183 -1061:3:1187 -1062:3:1188 -1063:3:1196 -1064:3:1197 -1065:3:1201 -1066:3:1202 -1067:3:1210 -1068:3:1215 -1069:3:1219 -1070:3:1220 -1071:3:1227 -1072:3:1228 -1073:3:1239 -1074:3:1240 -1075:3:1241 -1076:3:1252 -1077:3:1257 -1078:3:1258 -1079:0:2435 -1080:3:1270 -1081:0:2435 -1082:3:1272 -1083:0:2435 -1084:3:1275 -1085:3:1276 -1086:3:1288 -1087:3:1289 -1088:3:1293 -1089:3:1294 -1090:3:1302 -1091:3:1307 -1092:3:1311 -1093:3:1312 -1094:3:1319 -1095:3:1320 -1096:3:1331 -1097:3:1332 -1098:3:1333 -1099:3:1344 -1100:3:1349 -1101:3:1350 -1102:0:2435 -1103:3:1362 -1104:0:2435 -1105:3:1364 -1106:0:2435 -1107:3:1365 -1108:0:2435 -1109:3:1366 -1110:0:2435 -1111:3:1367 -1112:0:2435 -1113:3:1368 -1114:3:1372 -1115:3:1373 -1116:3:1381 -1117:3:1382 -1118:3:1386 -1119:3:1387 -1120:3:1395 -1121:3:1400 -1122:3:1404 -1123:3:1405 -1124:3:1412 -1125:3:1413 -1126:3:1424 -1127:3:1425 -1128:3:1426 -1129:3:1437 -1130:3:1442 -1131:3:1443 -1132:0:2435 -1133:3:1455 -1134:0:2435 -1135:3:1568 -1136:0:2435 -1137:3:1666 -1138:0:2435 -1139:3:1667 -1140:0:2435 -1141:3:1671 -1142:0:2435 -1143:3:1677 -1144:3:1681 -1145:3:1682 -1146:3:1690 -1147:3:1691 -1148:3:1695 -1149:3:1696 -1150:3:1704 -1151:3:1709 -1152:3:1713 -1153:3:1714 -1154:3:1721 -1155:3:1722 -1156:3:1733 -1157:3:1734 -1158:3:1735 -1159:3:1746 -1160:3:1751 -1161:3:1752 -1162:0:2435 -1163:3:1764 -1164:0:2435 -1165:3:1766 -1166:0:2435 -1167:3:1767 -1168:3:1771 -1169:3:1772 -1170:3:1780 -1171:3:1781 -1172:3:1785 -1173:3:1786 -1174:3:1794 -1175:3:1799 -1176:3:1803 -1177:3:1804 -1178:3:1811 -1179:3:1812 -1180:3:1823 -1181:3:1824 -1182:3:1825 -1183:3:1836 -1184:3:1841 -1185:3:1842 -1186:0:2435 -1187:3:1854 -1188:0:2435 -1189:3:1856 -1190:0:2435 -1191:3:1859 -1192:3:1860 -1193:3:1872 -1194:3:1873 -1195:3:1877 -1196:3:1878 -1197:3:1886 -1198:3:1891 -1199:3:1895 -1200:3:1896 -1201:3:1903 -1202:3:1904 -1203:3:1915 -1204:3:1916 -1205:3:1917 -1206:3:1928 -1207:3:1933 -1208:3:1934 -1209:0:2435 -1210:3:1946 -1211:0:2435 -1212:3:1948 -1213:0:2435 -1214:3:1949 -1215:0:2435 -1216:3:1950 -1217:0:2435 -1218:3:1951 -1219:0:2435 -1220:3:1952 -1221:3:1956 -1222:3:1957 -1223:3:1965 -1224:3:1966 -1225:3:1970 -1226:3:1971 -1227:3:1979 -1228:3:1984 -1229:3:1988 -1230:3:1989 -1231:3:1996 -1232:3:1997 -1233:3:2008 -1234:3:2009 -1235:3:2010 -1236:3:2021 -1237:3:2026 -1238:3:2027 -1239:0:2435 -1240:3:2039 -1241:0:2435 -1242:3:2152 -1243:0:2435 -1244:3:2250 -1245:0:2435 -1246:3:2251 -1247:0:2435 -1248:3:2255 -1249:0:2435 -1250:3:2264 -1251:3:2265 -1252:3:2269 -1253:3:2273 -1254:3:2274 -1255:3:2278 -1256:3:2286 -1257:3:2287 -1258:0:2435 -1259:3:2295 -1260:0:2435 -1261:3:2299 -1262:3:2300 -1263:3:2304 -1264:3:2308 -1265:3:2309 -1266:3:2313 -1267:3:2321 -1268:3:2322 -1269:0:2435 -1270:3:2330 -1271:0:2435 -1272:3:2338 -1273:3:2339 -1274:3:2343 -1275:3:2347 -1276:3:2348 -1277:3:2352 -1278:3:2360 -1279:3:2361 -1280:0:2435 -1281:3:2369 -1282:0:2435 -1283:3:2371 -1284:0:2435 -1285:3:2372 -1286:0:2435 -1287:3:876 -1288:0:2435 -1289:3:877 -1290:3:881 -1291:3:882 -1292:3:890 -1293:3:891 -1294:3:895 -1295:3:896 -1296:3:904 -1297:3:909 -1298:3:913 -1299:3:914 -1300:3:921 -1301:3:922 -1302:3:933 -1303:3:934 -1304:3:935 -1305:3:946 -1306:3:951 -1307:3:952 -1308:0:2435 -1309:3:964 -1310:0:2435 -1311:3:966 -1312:3:967 -1313:0:2435 -1314:3:971 -1315:3:975 -1316:3:976 -1317:3:984 -1318:3:985 -1319:3:989 -1320:3:990 -1321:3:998 -1322:3:1011 -1323:3:1012 -1324:3:1015 -1325:3:1016 -1326:3:1027 -1327:3:1028 -1328:3:1029 -1329:3:1040 -1330:3:1045 -1331:3:1048 -1332:3:1049 -1333:0:2435 -1334:3:1058 -1335:0:2435 -1336:3:1060 -1337:0:2435 -1338:3:1061 -1339:0:2435 -1340:3:1071 -1341:0:2435 -1342:2:458 -1343:0:2435 -1344:2:464 -1345:0:2435 -1346:2:465 -1347:0:2435 -1348:2:466 -1349:0:2435 -1350:2:467 -1351:0:2435 -1352:1:2 -1353:0:2435 -1354:2:468 -1355:0:2435 -1356:1:8 -1357:0:2435 -1358:1:9 -1359:0:2435 -1360:1:10 -1361:0:2435 -1362:1:11 -1363:0:2435 -1364:2:467 -1365:0:2435 -1366:1:12 -1367:1:16 -1368:1:17 -1369:1:25 -1370:1:26 -1371:1:30 -1372:1:31 -1373:1:39 -1374:1:44 -1375:1:48 -1376:1:49 -1377:1:56 -1378:1:57 -1379:1:68 -1380:1:69 -1381:1:70 -1382:1:81 -1383:1:86 -1384:1:87 -1385:0:2435 -1386:2:468 -1387:0:2435 -1388:3:1075 -1389:3:1076 -1390:3:1080 -1391:3:1084 -1392:3:1085 -1393:3:1089 -1394:3:1094 -1395:0:2435 -1396:3:1106 -1397:0:2435 -1398:3:1110 -1399:3:1111 -1400:3:1115 -1401:3:1119 -1402:3:1120 -1403:3:1124 -1404:3:1132 -1405:3:1133 -1406:0:2435 -1407:3:1141 -1408:0:2435 -1409:3:1149 -1410:3:1150 -1411:3:1154 -1412:3:1158 -1413:3:1159 -1414:3:1163 -1415:3:1171 -1416:3:1172 -1417:0:2435 -1418:3:1180 -1419:0:2435 -1420:3:1182 -1421:0:2435 -1422:3:1183 -1423:3:1187 -1424:3:1188 -1425:3:1196 -1426:3:1197 -1427:3:1201 -1428:3:1202 -1429:3:1210 -1430:3:1215 -1431:3:1219 -1432:3:1220 -1433:3:1227 -1434:3:1228 -1435:3:1239 -1436:3:1240 -1437:3:1241 -1438:3:1252 -1439:3:1257 -1440:3:1258 -1441:0:2435 -1442:3:1270 -1443:0:2435 -1444:3:1272 -1445:0:2435 -1446:3:1275 -1447:3:1276 -1448:3:1288 -1449:3:1289 -1450:3:1293 -1451:3:1294 -1452:3:1302 -1453:3:1307 -1454:3:1311 -1455:3:1312 -1456:3:1319 -1457:3:1320 -1458:3:1331 -1459:3:1332 -1460:3:1333 -1461:3:1344 -1462:3:1349 -1463:3:1350 -1464:0:2435 -1465:3:1362 -1466:0:2435 -1467:3:1364 -1468:0:2435 -1469:3:1365 -1470:0:2435 -1471:3:1366 -1472:0:2435 -1473:3:1367 -1474:0:2435 -1475:3:1368 -1476:3:1372 -1477:3:1373 -1478:3:1381 -1479:3:1382 -1480:3:1386 -1481:3:1387 -1482:3:1395 -1483:3:1400 -1484:3:1404 -1485:3:1405 -1486:3:1412 -1487:3:1413 -1488:3:1424 -1489:3:1425 -1490:3:1426 -1491:3:1437 -1492:3:1442 -1493:3:1443 -1494:0:2435 -1495:3:1455 -1496:0:2435 -1497:3:1568 -1498:0:2435 -1499:3:1666 -1500:0:2435 -1501:3:1667 -1502:0:2435 -1503:3:1671 -1504:0:2435 -1505:3:1677 -1506:3:1681 -1507:3:1682 -1508:3:1690 -1509:3:1691 -1510:3:1695 -1511:3:1696 -1512:3:1704 -1513:3:1709 -1514:3:1713 -1515:3:1714 -1516:3:1721 -1517:3:1722 -1518:3:1733 -1519:3:1734 -1520:3:1735 -1521:3:1746 -1522:3:1751 -1523:3:1752 -1524:0:2435 -1525:3:1764 -1526:0:2435 -1527:3:1766 -1528:0:2435 -1529:3:1767 -1530:3:1771 -1531:3:1772 -1532:3:1780 -1533:3:1781 -1534:3:1785 -1535:3:1786 -1536:3:1794 -1537:3:1799 -1538:3:1803 -1539:3:1804 -1540:3:1811 -1541:3:1812 -1542:3:1823 -1543:3:1824 -1544:3:1825 -1545:3:1836 -1546:3:1841 -1547:3:1842 -1548:0:2435 -1549:3:1854 -1550:0:2435 -1551:3:1856 -1552:0:2435 -1553:3:1859 -1554:3:1860 -1555:3:1872 -1556:3:1873 -1557:3:1877 -1558:3:1878 -1559:3:1886 -1560:3:1891 -1561:3:1895 -1562:3:1896 -1563:3:1903 -1564:3:1904 -1565:3:1915 -1566:3:1916 -1567:3:1917 -1568:3:1928 -1569:3:1933 -1570:3:1934 -1571:0:2435 -1572:3:1946 -1573:0:2435 -1574:3:1948 -1575:0:2435 -1576:3:1949 -1577:0:2435 -1578:3:1950 -1579:0:2435 -1580:3:1951 -1581:0:2435 -1582:3:1952 -1583:3:1956 -1584:3:1957 -1585:3:1965 -1586:3:1966 -1587:3:1970 -1588:3:1971 -1589:3:1979 -1590:3:1984 -1591:3:1988 -1592:3:1989 -1593:3:1996 -1594:3:1997 -1595:3:2008 -1596:3:2009 -1597:3:2010 -1598:3:2021 -1599:3:2026 -1600:3:2027 -1601:0:2435 -1602:3:2039 -1603:0:2435 -1604:3:2152 -1605:0:2435 -1606:3:2250 -1607:0:2435 -1608:3:2251 -1609:0:2435 -1610:3:2255 -1611:0:2435 -1612:3:2264 -1613:3:2265 -1614:3:2269 -1615:3:2273 -1616:3:2274 -1617:3:2278 -1618:3:2286 -1619:3:2287 -1620:0:2435 -1621:3:2295 -1622:0:2435 -1623:3:2299 -1624:3:2300 -1625:3:2304 -1626:3:2308 -1627:3:2309 -1628:3:2313 -1629:3:2321 -1630:3:2322 -1631:0:2435 -1632:3:2330 -1633:0:2435 -1634:3:2338 -1635:3:2339 -1636:3:2343 -1637:3:2347 -1638:3:2348 -1639:3:2352 -1640:3:2360 -1641:3:2361 -1642:0:2435 -1643:3:2369 -1644:0:2435 -1645:3:2371 -1646:0:2435 -1647:3:2372 -1648:0:2435 -1649:3:2375 -1650:0:2435 -1651:3:2380 -1652:0:2435 -1653:2:467 -1654:0:2435 -1655:3:2381 -1656:0:2435 -1657:1:99 -1658:0:2435 -1659:3:2380 -1660:0:2435 -1661:2:468 -1662:0:2435 -1663:3:2381 -1664:0:2435 -1665:2:469 -1666:0:2435 -1667:3:2380 -1668:0:2435 -1669:2:475 -1670:0:2435 -1671:3:2381 -1672:0:2435 -1673:2:476 -1674:0:2435 -1675:3:2380 -1676:0:2435 -1677:2:477 -1678:2:481 -1679:2:482 -1680:2:490 -1681:2:491 -1682:2:495 -1683:2:496 -1684:2:504 -1685:2:509 -1686:2:513 -1687:2:514 -1688:2:521 -1689:2:522 -1690:2:533 -1691:2:534 -1692:2:535 -1693:2:546 -1694:2:558 -1695:2:559 -1696:0:2435 -1697:3:2381 -1698:0:2435 -1699:2:564 -1700:0:2435 -1701:3:2380 -1702:0:2435 -1703:2:565 -1704:2:569 -1705:2:570 -1706:2:578 -1707:2:579 -1708:2:583 -1709:2:584 -1710:2:592 -1711:2:597 -1712:2:601 -1713:2:602 -1714:2:609 -1715:2:610 -1716:2:621 -1717:2:622 -1718:2:623 -1719:2:634 -1720:2:646 -1721:2:647 -1722:0:2435 -1723:3:2381 -1724:0:2435 -1725:2:652 -1726:0:2435 -1727:3:2380 -1728:0:2435 -1729:2:653 -1730:0:2435 -1731:3:2381 -1732:0:2435 -1733:2:654 -1734:2:658 -1735:2:659 -1736:2:667 -1737:2:668 -1738:2:672 -1739:2:673 -1740:2:681 -1741:2:686 -1742:2:690 -1743:2:691 -1744:2:698 -1745:2:699 -1746:2:710 -1747:2:711 -1748:2:712 -1749:2:723 -1750:2:735 -1751:2:736 -1752:0:2435 -1753:3:2380 -1754:0:2435 -1755:2:741 -1756:0:2435 -1757:3:2381 -1758:0:2435 -1759:2:750 -1760:0:2435 -1761:3:2380 -1762:0:2435 -1763:2:753 -1764:0:2435 -1765:3:2381 -1766:0:2435 -1767:2:758 -1768:0:2435 -1769:3:2380 -1770:0:2435 -1771:2:759 -1772:0:2433 -1773:3:2381 -1774:0:2439 -1775:0:2435 diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.define b/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.log b/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.log deleted file mode 100644 index 0423ec5..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.log +++ /dev/null @@ -1,320 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_wmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -Depth= 10656 States= 1e+06 Transitions= 8.86e+06 Memory= 534.807 t= 7.38 R= 1e+05 -Depth= 35214 States= 2e+06 Transitions= 1.82e+07 Memory= 603.557 t= 15.5 R= 1e+05 -Depth= 35214 States= 3e+06 Transitions= 2.73e+07 Memory= 672.209 t= 23.8 R= 1e+05 -pan: resizing hashtable to -w22.. done -Depth= 35214 States= 4e+06 Transitions= 4.08e+07 Memory= 771.885 t= 35.9 R= 1e+05 -pan: claim violated! (at depth 1650) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 64 byte, depth reached 35214, errors: 1 - 4154272 states, stored - 38595853 states, matched - 42750125 transitions (= stored+matched) -1.4058824e+08 atomic steps -hash conflicts: 21492325 (resolved) - -Stats on memory usage (in Megabytes): - 364.488 equivalent memory usage for states (stored*(State-vector + overhead)) - 292.863 actual memory usage for states (compression: 80.35%) - state-vector as stored = 46 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 782.529 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 227, "(1)" - line 408, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 256, "(1)" - line 418, "pan.___", state 286, "(1)" - line 399, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 366, "(1)" - line 408, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 395, "(1)" - line 418, "pan.___", state 425, "(1)" - line 540, "pan.___", state 456, "-end-" - (19 of 456 states) -unreached in proctype urcu_reader_sig - line 399, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 70, "(1)" - line 418, "pan.___", state 100, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 247, "(1)" - line 418, "pan.___", state 277, "(1)" - line 399, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 330, "(1)" - line 408, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 359, "(1)" - line 418, "pan.___", state 389, "(1)" - line 614, "pan.___", state 411, "-end-" - (18 of 411 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 20, "(1)" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 34, "(1)" - line 403, "pan.___", state 35, "(1)" - line 403, "pan.___", state 35, "(1)" - line 401, "pan.___", state 40, "((i<1))" - line 401, "pan.___", state 40, "((i>=1))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 59, "(1)" - line 409, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 60, "else" - line 409, "pan.___", state 63, "(1)" - line 409, "pan.___", state 64, "(1)" - line 409, "pan.___", state 64, "(1)" - line 413, "pan.___", state 72, "(1)" - line 413, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 73, "else" - line 413, "pan.___", state 76, "(1)" - line 413, "pan.___", state 77, "(1)" - line 413, "pan.___", state 77, "(1)" - line 411, "pan.___", state 82, "((i<1))" - line 411, "pan.___", state 82, "((i>=1))" - line 418, "pan.___", state 89, "(1)" - line 418, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 90, "else" - line 418, "pan.___", state 93, "(1)" - line 418, "pan.___", state 94, "(1)" - line 418, "pan.___", state 94, "(1)" - line 420, "pan.___", state 97, "(1)" - line 420, "pan.___", state 97, "(1)" - line 369, "pan.___", state 99, "(1)" - line 639, "pan.___", state 103, "cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )] = (old_gen+1)" - line 637, "pan.___", state 104, "old_gen = cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )]" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 114, "(1)" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 128, "(1)" - line 403, "pan.___", state 129, "(1)" - line 403, "pan.___", state 129, "(1)" - line 401, "pan.___", state 134, "((i<1))" - line 401, "pan.___", state 134, "((i>=1))" - line 409, "pan.___", state 153, "(1)" - line 409, "pan.___", state 154, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 154, "else" - line 409, "pan.___", state 157, "(1)" - line 409, "pan.___", state 158, "(1)" - line 409, "pan.___", state 158, "(1)" - line 413, "pan.___", state 166, "(1)" - line 413, "pan.___", state 167, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 167, "else" - line 413, "pan.___", state 170, "(1)" - line 413, "pan.___", state 171, "(1)" - line 413, "pan.___", state 171, "(1)" - line 411, "pan.___", state 176, "((i<1))" - line 411, "pan.___", state 176, "((i>=1))" - line 418, "pan.___", state 183, "(1)" - line 418, "pan.___", state 184, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 184, "else" - line 418, "pan.___", state 187, "(1)" - line 418, "pan.___", state 188, "(1)" - line 418, "pan.___", state 188, "(1)" - line 420, "pan.___", state 191, "(1)" - line 420, "pan.___", state 191, "(1)" - line 369, "pan.___", state 193, "(1)" - line 652, "pan.___", state 199, "(1)" - line 646, "pan.___", state 202, "((write_lock==0))" - line 646, "pan.___", state 202, "else" - line 644, "pan.___", state 203, "(1)" - line 160, "pan.___", state 209, "(1)" - line 164, "pan.___", state 217, "(1)" - line 164, "pan.___", state 218, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 164, "pan.___", state 218, "else" - line 162, "pan.___", state 223, "((j<1))" - line 162, "pan.___", state 223, "((j>=1))" - line 168, "pan.___", state 229, "(1)" - line 168, "pan.___", state 230, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 168, "pan.___", state 230, "else" - line 160, "pan.___", state 241, "(1)" - line 168, "pan.___", state 261, "(1)" - line 160, "pan.___", state 277, "(1)" - line 164, "pan.___", state 285, "(1)" - line 168, "pan.___", state 297, "(1)" - line 399, "pan.___", state 311, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 325, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 343, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 356, "(1)" - line 413, "pan.___", state 369, "(1)" - line 418, "pan.___", state 386, "(1)" - line 399, "pan.___", state 405, "(1)" - line 403, "pan.___", state 417, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 435, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 461, "(1)" - line 418, "pan.___", state 478, "(1)" - line 403, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 554, "(1)" - line 418, "pan.___", state 571, "(1)" - line 164, "pan.___", state 594, "(1)" - line 168, "pan.___", state 606, "(1)" - line 160, "pan.___", state 618, "(1)" - line 168, "pan.___", state 638, "(1)" - line 164, "pan.___", state 662, "(1)" - line 168, "pan.___", state 674, "(1)" - line 399, "pan.___", state 696, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 698, "(1)" - line 399, "pan.___", state 699, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 699, "else" - line 399, "pan.___", state 702, "(1)" - line 403, "pan.___", state 710, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 712, "(1)" - line 403, "pan.___", state 713, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 713, "else" - line 403, "pan.___", state 716, "(1)" - line 403, "pan.___", state 717, "(1)" - line 403, "pan.___", state 717, "(1)" - line 401, "pan.___", state 722, "((i<1))" - line 401, "pan.___", state 722, "((i>=1))" - line 408, "pan.___", state 728, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 741, "(1)" - line 409, "pan.___", state 742, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 742, "else" - line 409, "pan.___", state 745, "(1)" - line 409, "pan.___", state 746, "(1)" - line 409, "pan.___", state 746, "(1)" - line 413, "pan.___", state 754, "(1)" - line 413, "pan.___", state 755, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 755, "else" - line 413, "pan.___", state 758, "(1)" - line 413, "pan.___", state 759, "(1)" - line 413, "pan.___", state 759, "(1)" - line 411, "pan.___", state 764, "((i<1))" - line 411, "pan.___", state 764, "((i>=1))" - line 418, "pan.___", state 771, "(1)" - line 418, "pan.___", state 772, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 772, "else" - line 418, "pan.___", state 775, "(1)" - line 418, "pan.___", state 776, "(1)" - line 418, "pan.___", state 776, "(1)" - line 420, "pan.___", state 779, "(1)" - line 420, "pan.___", state 779, "(1)" - line 403, "pan.___", state 810, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 828, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 854, "(1)" - line 418, "pan.___", state 871, "(1)" - line 403, "pan.___", state 900, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 918, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 944, "(1)" - line 418, "pan.___", state 961, "(1)" - line 399, "pan.___", state 980, "(1)" - line 403, "pan.___", state 992, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1010, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1036, "(1)" - line 418, "pan.___", state 1053, "(1)" - line 403, "pan.___", state 1085, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1103, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1129, "(1)" - line 418, "pan.___", state 1146, "(1)" - line 164, "pan.___", state 1169, "(1)" - line 168, "pan.___", state 1181, "(1)" - line 160, "pan.___", state 1193, "(1)" - line 168, "pan.___", state 1213, "(1)" - line 164, "pan.___", state 1237, "(1)" - line 168, "pan.___", state 1249, "(1)" - line 399, "pan.___", state 1271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1273, "(1)" - line 399, "pan.___", state 1274, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1274, "else" - line 399, "pan.___", state 1277, "(1)" - line 403, "pan.___", state 1285, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 1287, "(1)" - line 403, "pan.___", state 1288, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 1288, "else" - line 403, "pan.___", state 1291, "(1)" - line 403, "pan.___", state 1292, "(1)" - line 403, "pan.___", state 1292, "(1)" - line 401, "pan.___", state 1297, "((i<1))" - line 401, "pan.___", state 1297, "((i>=1))" - line 408, "pan.___", state 1303, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1316, "(1)" - line 409, "pan.___", state 1317, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 1317, "else" - line 409, "pan.___", state 1320, "(1)" - line 409, "pan.___", state 1321, "(1)" - line 409, "pan.___", state 1321, "(1)" - line 413, "pan.___", state 1329, "(1)" - line 413, "pan.___", state 1330, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 1330, "else" - line 413, "pan.___", state 1333, "(1)" - line 413, "pan.___", state 1334, "(1)" - line 413, "pan.___", state 1334, "(1)" - line 411, "pan.___", state 1339, "((i<1))" - line 411, "pan.___", state 1339, "((i>=1))" - line 418, "pan.___", state 1346, "(1)" - line 418, "pan.___", state 1347, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 1347, "else" - line 418, "pan.___", state 1350, "(1)" - line 418, "pan.___", state 1351, "(1)" - line 418, "pan.___", state 1351, "(1)" - line 420, "pan.___", state 1354, "(1)" - line 420, "pan.___", state 1354, "(1)" - line 164, "pan.___", state 1379, "(1)" - line 168, "pan.___", state 1391, "(1)" - line 160, "pan.___", state 1403, "(1)" - line 168, "pan.___", state 1423, "(1)" - line 164, "pan.___", state 1447, "(1)" - line 168, "pan.___", state 1459, "(1)" - line 702, "pan.___", state 1484, "-end-" - (160 of 1484 states) -unreached in proctype :init: - line 709, "pan.___", state 9, "((j<2))" - line 709, "pan.___", state 9, "((j>=2))" - line 710, "pan.___", state 20, "((j<2))" - line 710, "pan.___", state 20, "((j>=2))" - line 715, "pan.___", state 33, "((j<2))" - line 715, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 749, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 37.6 seconds -pan: rate 110515.35 states/second -pan: avg transition delay 8.793e-07 usec -cp .input.spin urcu_free_no_wmb.spin.input -cp .input.spin.trail urcu_free_no_wmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.spin.input b/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.spin.input deleted file mode 100644 index d5d174d..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define NO_WMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.spin.input.trail deleted file mode 100644 index f2ce974..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free_no_wmb.spin.input.trail +++ /dev/null @@ -1,1653 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:2399 -2:4:2351 -3:4:2354 -4:4:2354 -5:4:2357 -6:4:2365 -7:4:2365 -8:4:2368 -9:4:2374 -10:4:2378 -11:4:2378 -12:4:2381 -13:4:2389 -14:4:2393 -15:4:2394 -16:0:2399 -17:4:2396 -18:0:2399 -19:3:869 -20:0:2399 -21:3:875 -22:0:2399 -23:3:876 -24:0:2399 -25:3:877 -26:3:881 -27:3:882 -28:3:890 -29:3:891 -30:3:895 -31:3:896 -32:3:904 -33:3:909 -34:3:913 -35:3:914 -36:3:921 -37:3:922 -38:3:933 -39:3:934 -40:3:935 -41:3:946 -42:3:951 -43:3:952 -44:0:2399 -45:3:964 -46:0:2399 -47:3:966 -48:3:967 -49:0:2399 -50:3:971 -51:3:975 -52:3:976 -53:3:984 -54:3:985 -55:3:989 -56:3:990 -57:3:998 -58:3:1003 -59:3:1004 -60:3:1015 -61:3:1016 -62:3:1027 -63:3:1028 -64:3:1029 -65:3:1040 -66:3:1045 -67:3:1046 -68:0:2399 -69:3:1058 -70:0:2399 -71:3:1060 -72:0:2399 -73:3:1061 -74:0:2399 -75:3:1071 -76:0:2399 -77:3:1072 -78:3:1079 -79:3:1080 -80:3:1087 -81:3:1092 -82:0:2399 -83:3:1103 -84:0:2399 -85:3:1104 -86:3:1111 -87:3:1112 -88:3:1119 -89:3:1124 -90:0:2399 -91:3:1135 -92:0:2399 -93:3:1140 -94:3:1147 -95:3:1148 -96:3:1155 -97:3:1160 -98:0:2399 -99:3:1171 -100:0:2399 -101:3:1173 -102:0:2399 -103:3:1174 -104:3:1178 -105:3:1179 -106:3:1187 -107:3:1188 -108:3:1192 -109:3:1193 -110:3:1201 -111:3:1206 -112:3:1210 -113:3:1211 -114:3:1218 -115:3:1219 -116:3:1230 -117:3:1231 -118:3:1232 -119:3:1243 -120:3:1248 -121:3:1249 -122:0:2399 -123:3:1261 -124:0:2399 -125:3:1263 -126:0:2399 -127:3:1266 -128:3:1267 -129:3:1279 -130:3:1280 -131:3:1284 -132:3:1285 -133:3:1293 -134:3:1298 -135:3:1302 -136:3:1303 -137:3:1310 -138:3:1311 -139:3:1322 -140:3:1323 -141:3:1324 -142:3:1335 -143:3:1340 -144:3:1341 -145:0:2399 -146:3:1353 -147:0:2399 -148:3:1355 -149:0:2399 -150:3:1356 -151:0:2399 -152:3:1357 -153:0:2399 -154:3:1358 -155:0:2399 -156:3:1359 -157:3:1363 -158:3:1364 -159:3:1372 -160:3:1373 -161:3:1377 -162:3:1378 -163:3:1386 -164:3:1391 -165:3:1395 -166:3:1396 -167:3:1403 -168:3:1404 -169:3:1415 -170:3:1416 -171:3:1417 -172:3:1428 -173:3:1433 -174:3:1434 -175:0:2399 -176:3:1446 -177:0:2399 -178:3:1550 -179:0:2399 -180:3:1648 -181:0:2399 -182:3:1649 -183:0:2399 -184:3:1653 -185:0:2399 -186:3:1659 -187:3:1663 -188:3:1664 -189:3:1672 -190:3:1673 -191:3:1677 -192:3:1678 -193:3:1686 -194:3:1691 -195:3:1695 -196:3:1696 -197:3:1703 -198:3:1704 -199:3:1715 -200:3:1716 -201:3:1717 -202:3:1728 -203:3:1733 -204:3:1734 -205:0:2399 -206:3:1746 -207:0:2399 -208:3:1748 -209:0:2399 -210:3:1749 -211:3:1753 -212:3:1754 -213:3:1762 -214:3:1763 -215:3:1767 -216:3:1768 -217:3:1776 -218:3:1781 -219:3:1785 -220:3:1786 -221:3:1793 -222:3:1794 -223:3:1805 -224:3:1806 -225:3:1807 -226:3:1818 -227:3:1823 -228:3:1824 -229:0:2399 -230:3:1836 -231:0:2399 -232:3:1838 -233:0:2399 -234:3:1841 -235:3:1842 -236:3:1854 -237:3:1855 -238:3:1859 -239:3:1860 -240:3:1868 -241:3:1873 -242:3:1877 -243:3:1878 -244:3:1885 -245:3:1886 -246:3:1897 -247:3:1898 -248:3:1899 -249:3:1910 -250:3:1915 -251:3:1916 -252:0:2399 -253:3:1928 -254:0:2399 -255:3:1930 -256:0:2399 -257:3:1931 -258:0:2399 -259:3:1932 -260:0:2399 -261:3:1933 -262:0:2399 -263:3:1934 -264:3:1938 -265:3:1939 -266:3:1947 -267:3:1948 -268:3:1952 -269:3:1953 -270:3:1961 -271:3:1966 -272:3:1970 -273:3:1971 -274:3:1978 -275:3:1979 -276:3:1990 -277:3:1991 -278:3:1992 -279:3:2003 -280:3:2008 -281:3:2009 -282:0:2399 -283:3:2021 -284:0:2399 -285:3:2125 -286:0:2399 -287:3:2223 -288:0:2399 -289:3:2224 -290:0:2399 -291:3:2228 -292:0:2399 -293:3:2234 -294:3:2241 -295:3:2242 -296:3:2249 -297:3:2254 -298:0:2399 -299:3:2265 -300:0:2399 -301:3:2266 -302:3:2273 -303:3:2274 -304:3:2281 -305:3:2286 -306:0:2399 -307:3:2297 -308:0:2399 -309:3:2302 -310:3:2309 -311:3:2310 -312:3:2317 -313:3:2322 -314:0:2399 -315:3:2333 -316:0:2399 -317:3:2335 -318:0:2399 -319:3:2336 -320:0:2399 -321:3:876 -322:0:2399 -323:3:877 -324:3:881 -325:3:882 -326:3:890 -327:3:891 -328:3:895 -329:3:896 -330:3:904 -331:3:909 -332:3:913 -333:3:914 -334:3:921 -335:3:922 -336:3:933 -337:3:934 -338:3:935 -339:3:946 -340:3:951 -341:3:952 -342:0:2399 -343:3:964 -344:0:2399 -345:3:966 -346:3:967 -347:0:2399 -348:3:971 -349:3:975 -350:3:976 -351:3:984 -352:3:985 -353:3:989 -354:3:990 -355:3:998 -356:3:1003 -357:3:1004 -358:3:1015 -359:3:1016 -360:3:1027 -361:3:1028 -362:3:1029 -363:3:1040 -364:3:1045 -365:3:1046 -366:0:2399 -367:3:1058 -368:0:2399 -369:3:1060 -370:0:2399 -371:3:1061 -372:0:2399 -373:3:1071 -374:0:2399 -375:3:1072 -376:3:1079 -377:3:1080 -378:3:1087 -379:3:1092 -380:0:2399 -381:3:1103 -382:0:2399 -383:3:1104 -384:3:1111 -385:3:1112 -386:3:1119 -387:3:1124 -388:0:2399 -389:3:1135 -390:0:2399 -391:3:1140 -392:3:1147 -393:3:1148 -394:3:1155 -395:3:1160 -396:0:2399 -397:3:1171 -398:0:2399 -399:3:1173 -400:0:2399 -401:3:1174 -402:3:1178 -403:3:1179 -404:3:1187 -405:3:1188 -406:3:1192 -407:3:1193 -408:3:1201 -409:3:1206 -410:3:1210 -411:3:1211 -412:3:1218 -413:3:1219 -414:3:1230 -415:3:1231 -416:3:1232 -417:3:1243 -418:3:1248 -419:3:1249 -420:0:2399 -421:3:1261 -422:0:2399 -423:3:1263 -424:0:2399 -425:3:1266 -426:3:1267 -427:3:1279 -428:3:1280 -429:3:1284 -430:3:1285 -431:3:1293 -432:3:1298 -433:3:1302 -434:3:1303 -435:3:1310 -436:3:1311 -437:3:1322 -438:3:1323 -439:3:1324 -440:3:1335 -441:3:1340 -442:3:1341 -443:0:2399 -444:3:1353 -445:0:2399 -446:3:1355 -447:0:2399 -448:3:1356 -449:0:2399 -450:3:1357 -451:0:2399 -452:3:1358 -453:0:2399 -454:3:1359 -455:3:1363 -456:3:1364 -457:3:1372 -458:3:1373 -459:3:1377 -460:3:1378 -461:3:1386 -462:3:1391 -463:3:1395 -464:3:1396 -465:3:1403 -466:3:1404 -467:3:1415 -468:3:1416 -469:3:1417 -470:3:1428 -471:3:1433 -472:3:1434 -473:0:2399 -474:3:1446 -475:0:2399 -476:3:1550 -477:0:2399 -478:3:1648 -479:0:2399 -480:3:1649 -481:0:2399 -482:3:1653 -483:0:2399 -484:3:1659 -485:3:1663 -486:3:1664 -487:3:1672 -488:3:1673 -489:3:1677 -490:3:1678 -491:3:1686 -492:3:1691 -493:3:1695 -494:3:1696 -495:3:1703 -496:3:1704 -497:3:1715 -498:3:1716 -499:3:1717 -500:3:1728 -501:3:1733 -502:3:1734 -503:0:2399 -504:3:1746 -505:0:2399 -506:3:1748 -507:0:2399 -508:3:1749 -509:3:1753 -510:3:1754 -511:3:1762 -512:3:1763 -513:3:1767 -514:3:1768 -515:3:1776 -516:3:1781 -517:3:1785 -518:3:1786 -519:3:1793 -520:3:1794 -521:3:1805 -522:3:1806 -523:3:1807 -524:3:1818 -525:3:1823 -526:3:1824 -527:0:2399 -528:3:1836 -529:0:2399 -530:3:1838 -531:0:2399 -532:3:1841 -533:3:1842 -534:3:1854 -535:3:1855 -536:3:1859 -537:3:1860 -538:3:1868 -539:3:1873 -540:3:1877 -541:3:1878 -542:3:1885 -543:3:1886 -544:3:1897 -545:3:1898 -546:3:1899 -547:3:1910 -548:3:1915 -549:3:1916 -550:0:2399 -551:3:1928 -552:0:2399 -553:3:1930 -554:0:2399 -555:3:1931 -556:0:2399 -557:3:1932 -558:0:2399 -559:3:1933 -560:0:2399 -561:3:1934 -562:3:1938 -563:3:1939 -564:3:1947 -565:3:1948 -566:3:1952 -567:3:1953 -568:3:1961 -569:3:1966 -570:3:1970 -571:3:1971 -572:3:1978 -573:3:1979 -574:3:1990 -575:3:1991 -576:3:1992 -577:3:2003 -578:3:2008 -579:3:2009 -580:0:2399 -581:3:2021 -582:0:2399 -583:3:2125 -584:0:2399 -585:3:2223 -586:0:2399 -587:3:2224 -588:0:2399 -589:3:2228 -590:0:2399 -591:3:2234 -592:3:2241 -593:3:2242 -594:3:2249 -595:3:2254 -596:0:2399 -597:3:2265 -598:0:2399 -599:3:2266 -600:3:2273 -601:3:2274 -602:3:2281 -603:3:2286 -604:0:2399 -605:3:2297 -606:0:2399 -607:3:2302 -608:3:2309 -609:3:2310 -610:3:2317 -611:3:2322 -612:0:2399 -613:3:2333 -614:0:2399 -615:3:2335 -616:0:2399 -617:3:2336 -618:0:2399 -619:3:876 -620:0:2399 -621:3:877 -622:3:881 -623:3:882 -624:3:890 -625:3:891 -626:3:895 -627:3:896 -628:3:904 -629:3:909 -630:3:913 -631:3:914 -632:3:921 -633:3:922 -634:3:933 -635:3:934 -636:3:935 -637:3:946 -638:3:951 -639:3:952 -640:0:2399 -641:3:964 -642:0:2399 -643:3:966 -644:3:967 -645:0:2399 -646:3:971 -647:3:975 -648:3:976 -649:3:984 -650:3:985 -651:3:989 -652:3:990 -653:3:998 -654:3:1003 -655:3:1004 -656:3:1015 -657:3:1016 -658:3:1027 -659:3:1028 -660:3:1029 -661:3:1040 -662:3:1045 -663:3:1046 -664:0:2399 -665:3:1058 -666:0:2399 -667:3:1060 -668:0:2399 -669:3:1061 -670:0:2399 -671:3:1071 -672:0:2399 -673:3:1072 -674:3:1079 -675:3:1080 -676:3:1087 -677:3:1092 -678:0:2399 -679:3:1103 -680:0:2399 -681:3:1104 -682:3:1111 -683:3:1112 -684:3:1119 -685:3:1124 -686:0:2399 -687:3:1135 -688:0:2399 -689:3:1140 -690:3:1147 -691:3:1148 -692:3:1155 -693:3:1160 -694:0:2399 -695:3:1171 -696:0:2399 -697:3:1173 -698:0:2399 -699:3:1174 -700:3:1178 -701:3:1179 -702:3:1187 -703:3:1188 -704:3:1192 -705:3:1193 -706:3:1201 -707:3:1206 -708:3:1210 -709:3:1211 -710:3:1218 -711:3:1219 -712:3:1230 -713:3:1231 -714:3:1232 -715:3:1243 -716:3:1248 -717:3:1249 -718:0:2399 -719:3:1261 -720:0:2399 -721:3:1263 -722:0:2399 -723:3:1266 -724:3:1267 -725:3:1279 -726:3:1280 -727:3:1284 -728:3:1285 -729:3:1293 -730:3:1298 -731:3:1302 -732:3:1303 -733:3:1310 -734:3:1311 -735:3:1322 -736:3:1323 -737:3:1324 -738:3:1335 -739:3:1340 -740:3:1341 -741:0:2399 -742:3:1353 -743:0:2399 -744:3:1355 -745:0:2399 -746:3:1356 -747:0:2399 -748:3:1357 -749:0:2399 -750:3:1358 -751:0:2399 -752:3:1359 -753:3:1363 -754:3:1364 -755:3:1372 -756:3:1373 -757:3:1377 -758:3:1378 -759:3:1386 -760:3:1391 -761:3:1395 -762:3:1396 -763:3:1403 -764:3:1404 -765:3:1415 -766:3:1416 -767:3:1417 -768:3:1428 -769:3:1433 -770:3:1434 -771:0:2399 -772:3:1446 -773:0:2399 -774:3:1550 -775:0:2399 -776:3:1648 -777:0:2399 -778:3:1649 -779:0:2399 -780:3:1653 -781:0:2399 -782:3:1659 -783:3:1663 -784:3:1664 -785:3:1672 -786:3:1673 -787:3:1677 -788:3:1678 -789:3:1686 -790:3:1691 -791:3:1695 -792:3:1696 -793:3:1703 -794:3:1704 -795:3:1715 -796:3:1716 -797:3:1717 -798:3:1728 -799:3:1733 -800:3:1734 -801:0:2399 -802:3:1746 -803:0:2399 -804:3:1748 -805:0:2399 -806:3:1749 -807:3:1753 -808:3:1754 -809:3:1762 -810:3:1763 -811:3:1767 -812:3:1768 -813:3:1776 -814:3:1781 -815:3:1785 -816:3:1786 -817:3:1793 -818:3:1794 -819:3:1805 -820:3:1806 -821:3:1807 -822:3:1818 -823:3:1823 -824:3:1824 -825:0:2399 -826:3:1836 -827:0:2399 -828:3:1838 -829:0:2399 -830:3:1841 -831:3:1842 -832:3:1854 -833:3:1855 -834:3:1859 -835:3:1860 -836:3:1868 -837:3:1873 -838:3:1877 -839:3:1878 -840:3:1885 -841:3:1886 -842:3:1897 -843:3:1898 -844:3:1899 -845:3:1910 -846:3:1915 -847:3:1916 -848:0:2399 -849:3:1928 -850:0:2399 -851:3:1930 -852:0:2399 -853:3:1931 -854:0:2399 -855:3:1932 -856:0:2399 -857:3:1933 -858:0:2399 -859:3:1934 -860:3:1938 -861:3:1939 -862:3:1947 -863:3:1948 -864:3:1952 -865:3:1953 -866:3:1961 -867:3:1966 -868:3:1970 -869:3:1971 -870:3:1978 -871:3:1979 -872:3:1990 -873:3:1991 -874:3:1992 -875:3:2003 -876:3:2008 -877:3:2009 -878:0:2399 -879:3:2021 -880:0:2399 -881:3:2125 -882:0:2399 -883:3:2223 -884:0:2399 -885:3:2224 -886:0:2399 -887:3:2228 -888:0:2399 -889:3:2234 -890:3:2241 -891:3:2242 -892:3:2249 -893:3:2254 -894:0:2399 -895:3:2265 -896:0:2399 -897:3:2266 -898:3:2273 -899:3:2274 -900:3:2281 -901:3:2286 -902:0:2399 -903:3:2297 -904:0:2399 -905:3:2302 -906:3:2309 -907:3:2310 -908:3:2317 -909:3:2322 -910:0:2399 -911:3:2333 -912:0:2399 -913:3:2335 -914:0:2399 -915:3:2336 -916:0:2399 -917:3:876 -918:0:2399 -919:3:877 -920:3:881 -921:3:882 -922:3:890 -923:3:891 -924:3:895 -925:3:896 -926:3:904 -927:3:909 -928:3:913 -929:3:914 -930:3:921 -931:3:922 -932:3:933 -933:3:934 -934:3:935 -935:3:946 -936:3:951 -937:3:952 -938:0:2399 -939:3:964 -940:0:2399 -941:3:966 -942:3:967 -943:0:2399 -944:3:971 -945:3:975 -946:3:976 -947:3:984 -948:3:985 -949:3:989 -950:3:990 -951:3:998 -952:3:1003 -953:3:1004 -954:3:1015 -955:3:1016 -956:3:1027 -957:3:1028 -958:3:1029 -959:3:1040 -960:3:1045 -961:3:1046 -962:0:2399 -963:3:1058 -964:0:2399 -965:3:1060 -966:0:2399 -967:3:1061 -968:0:2399 -969:3:1071 -970:0:2399 -971:3:1072 -972:3:1079 -973:3:1080 -974:3:1087 -975:3:1092 -976:0:2399 -977:3:1103 -978:0:2399 -979:3:1104 -980:3:1111 -981:3:1112 -982:3:1119 -983:3:1124 -984:0:2399 -985:3:1135 -986:0:2399 -987:3:1140 -988:3:1147 -989:3:1148 -990:3:1155 -991:3:1160 -992:0:2399 -993:3:1171 -994:0:2399 -995:3:1173 -996:0:2399 -997:3:1174 -998:3:1178 -999:3:1179 -1000:3:1187 -1001:3:1188 -1002:3:1192 -1003:3:1193 -1004:3:1201 -1005:3:1206 -1006:3:1210 -1007:3:1211 -1008:3:1218 -1009:3:1219 -1010:3:1230 -1011:3:1231 -1012:3:1232 -1013:3:1243 -1014:3:1248 -1015:3:1249 -1016:0:2399 -1017:3:1261 -1018:0:2399 -1019:3:1263 -1020:0:2399 -1021:3:1266 -1022:3:1267 -1023:3:1279 -1024:3:1280 -1025:3:1284 -1026:3:1285 -1027:3:1293 -1028:3:1298 -1029:3:1302 -1030:3:1303 -1031:3:1310 -1032:3:1311 -1033:3:1322 -1034:3:1323 -1035:3:1324 -1036:3:1335 -1037:3:1340 -1038:3:1341 -1039:0:2399 -1040:3:1353 -1041:0:2399 -1042:3:1355 -1043:0:2399 -1044:3:1356 -1045:0:2399 -1046:3:1357 -1047:0:2399 -1048:3:1358 -1049:0:2399 -1050:3:1359 -1051:3:1363 -1052:3:1364 -1053:3:1372 -1054:3:1373 -1055:3:1377 -1056:3:1378 -1057:3:1386 -1058:3:1391 -1059:3:1395 -1060:3:1396 -1061:3:1403 -1062:3:1404 -1063:3:1415 -1064:3:1416 -1065:3:1417 -1066:3:1428 -1067:3:1433 -1068:3:1434 -1069:0:2399 -1070:3:1446 -1071:0:2399 -1072:3:1550 -1073:0:2399 -1074:3:1648 -1075:0:2399 -1076:3:1649 -1077:0:2399 -1078:3:1653 -1079:0:2399 -1080:3:1659 -1081:3:1663 -1082:3:1664 -1083:3:1672 -1084:3:1673 -1085:3:1677 -1086:3:1678 -1087:3:1686 -1088:3:1691 -1089:3:1695 -1090:3:1696 -1091:3:1703 -1092:3:1704 -1093:3:1715 -1094:3:1716 -1095:3:1717 -1096:3:1728 -1097:3:1733 -1098:3:1734 -1099:0:2399 -1100:3:1746 -1101:0:2399 -1102:3:1748 -1103:0:2399 -1104:3:1749 -1105:3:1753 -1106:3:1754 -1107:3:1762 -1108:3:1763 -1109:3:1767 -1110:3:1768 -1111:3:1776 -1112:3:1781 -1113:3:1785 -1114:3:1786 -1115:3:1793 -1116:3:1794 -1117:3:1805 -1118:3:1806 -1119:3:1807 -1120:3:1818 -1121:3:1823 -1122:3:1824 -1123:0:2399 -1124:3:1836 -1125:0:2399 -1126:3:1838 -1127:0:2399 -1128:3:1841 -1129:3:1842 -1130:3:1854 -1131:3:1855 -1132:3:1859 -1133:3:1860 -1134:3:1868 -1135:3:1873 -1136:3:1877 -1137:3:1878 -1138:3:1885 -1139:3:1886 -1140:3:1897 -1141:3:1898 -1142:3:1899 -1143:3:1910 -1144:3:1915 -1145:3:1916 -1146:0:2399 -1147:3:1928 -1148:0:2399 -1149:3:1930 -1150:0:2399 -1151:3:1931 -1152:0:2399 -1153:3:1932 -1154:0:2399 -1155:3:1933 -1156:0:2399 -1157:3:1934 -1158:3:1938 -1159:3:1939 -1160:3:1947 -1161:3:1948 -1162:3:1952 -1163:3:1953 -1164:3:1961 -1165:3:1966 -1166:3:1970 -1167:3:1971 -1168:3:1978 -1169:3:1979 -1170:3:1990 -1171:3:1991 -1172:3:1992 -1173:3:2003 -1174:3:2008 -1175:3:2009 -1176:0:2399 -1177:3:2021 -1178:0:2399 -1179:3:2125 -1180:0:2399 -1181:3:2223 -1182:0:2399 -1183:3:2224 -1184:0:2399 -1185:3:2228 -1186:0:2399 -1187:3:2234 -1188:3:2241 -1189:3:2242 -1190:3:2249 -1191:3:2254 -1192:0:2399 -1193:3:2265 -1194:0:2399 -1195:3:2266 -1196:3:2273 -1197:3:2274 -1198:3:2281 -1199:3:2286 -1200:0:2399 -1201:3:2297 -1202:0:2399 -1203:3:2302 -1204:3:2309 -1205:3:2310 -1206:3:2317 -1207:3:2322 -1208:0:2399 -1209:3:2333 -1210:0:2399 -1211:3:2335 -1212:0:2399 -1213:3:2336 -1214:0:2399 -1215:3:876 -1216:0:2399 -1217:3:877 -1218:3:881 -1219:3:882 -1220:3:890 -1221:3:891 -1222:3:895 -1223:3:896 -1224:3:904 -1225:3:909 -1226:3:913 -1227:3:914 -1228:3:921 -1229:3:922 -1230:3:933 -1231:3:934 -1232:3:935 -1233:3:946 -1234:3:951 -1235:3:952 -1236:0:2399 -1237:3:964 -1238:0:2399 -1239:3:966 -1240:3:967 -1241:0:2399 -1242:3:971 -1243:3:975 -1244:3:976 -1245:3:984 -1246:3:985 -1247:3:989 -1248:3:990 -1249:3:998 -1250:3:1003 -1251:3:1004 -1252:3:1015 -1253:3:1016 -1254:3:1027 -1255:3:1028 -1256:3:1029 -1257:3:1040 -1258:3:1045 -1259:3:1046 -1260:0:2399 -1261:3:1058 -1262:0:2399 -1263:3:1060 -1264:0:2399 -1265:3:1061 -1266:0:2399 -1267:3:1071 -1268:0:2399 -1269:3:1072 -1270:3:1079 -1271:3:1080 -1272:3:1087 -1273:3:1092 -1274:0:2399 -1275:3:1103 -1276:0:2399 -1277:2:458 -1278:0:2399 -1279:2:464 -1280:0:2399 -1281:2:465 -1282:0:2399 -1283:2:466 -1284:0:2399 -1285:2:467 -1286:0:2399 -1287:1:2 -1288:0:2399 -1289:2:468 -1290:0:2399 -1291:1:8 -1292:0:2399 -1293:1:9 -1294:0:2399 -1295:1:10 -1296:0:2399 -1297:1:11 -1298:0:2399 -1299:2:467 -1300:0:2399 -1301:1:12 -1302:1:16 -1303:1:17 -1304:1:25 -1305:1:26 -1306:1:30 -1307:1:31 -1308:1:39 -1309:1:44 -1310:1:48 -1311:1:49 -1312:1:56 -1313:1:57 -1314:1:68 -1315:1:69 -1316:1:70 -1317:1:81 -1318:1:93 -1319:1:94 -1320:0:2399 -1321:2:468 -1322:0:2399 -1323:1:99 -1324:0:2399 -1325:2:469 -1326:0:2399 -1327:2:475 -1328:0:2399 -1329:2:476 -1330:0:2399 -1331:2:477 -1332:2:481 -1333:2:482 -1334:2:490 -1335:2:491 -1336:2:495 -1337:2:496 -1338:2:504 -1339:2:509 -1340:2:513 -1341:2:514 -1342:2:521 -1343:2:522 -1344:2:533 -1345:2:534 -1346:2:535 -1347:2:546 -1348:2:558 -1349:2:559 -1350:0:2399 -1351:2:564 -1352:0:2399 -1353:2:565 -1354:2:569 -1355:2:570 -1356:2:578 -1357:2:579 -1358:2:583 -1359:2:584 -1360:2:592 -1361:2:597 -1362:2:601 -1363:2:602 -1364:2:609 -1365:2:610 -1366:2:621 -1367:2:622 -1368:2:623 -1369:2:634 -1370:2:646 -1371:2:647 -1372:0:2399 -1373:2:652 -1374:0:2399 -1375:2:653 -1376:0:2399 -1377:2:654 -1378:2:658 -1379:2:659 -1380:2:667 -1381:2:668 -1382:2:672 -1383:2:673 -1384:2:681 -1385:2:686 -1386:2:690 -1387:2:691 -1388:2:698 -1389:2:699 -1390:2:710 -1391:2:711 -1392:2:712 -1393:2:723 -1394:2:735 -1395:2:736 -1396:0:2399 -1397:2:741 -1398:0:2399 -1399:2:750 -1400:0:2399 -1401:2:753 -1402:0:2399 -1403:2:758 -1404:0:2399 -1405:3:1104 -1406:3:1111 -1407:3:1114 -1408:3:1115 -1409:3:1119 -1410:3:1124 -1411:0:2399 -1412:3:1135 -1413:0:2399 -1414:3:1140 -1415:3:1147 -1416:3:1148 -1417:3:1155 -1418:3:1160 -1419:0:2399 -1420:3:1171 -1421:0:2399 -1422:3:1173 -1423:0:2399 -1424:3:1174 -1425:3:1178 -1426:3:1179 -1427:3:1187 -1428:3:1188 -1429:3:1192 -1430:3:1193 -1431:3:1201 -1432:3:1206 -1433:3:1210 -1434:3:1211 -1435:3:1218 -1436:3:1219 -1437:3:1230 -1438:3:1231 -1439:3:1232 -1440:3:1243 -1441:3:1248 -1442:3:1249 -1443:0:2399 -1444:3:1261 -1445:0:2399 -1446:3:1263 -1447:0:2399 -1448:3:1266 -1449:3:1267 -1450:3:1279 -1451:3:1280 -1452:3:1284 -1453:3:1285 -1454:3:1293 -1455:3:1298 -1456:3:1302 -1457:3:1303 -1458:3:1310 -1459:3:1311 -1460:3:1322 -1461:3:1323 -1462:3:1324 -1463:3:1335 -1464:3:1340 -1465:3:1341 -1466:0:2399 -1467:3:1353 -1468:0:2399 -1469:3:1355 -1470:0:2399 -1471:3:1356 -1472:0:2399 -1473:3:1357 -1474:0:2399 -1475:3:1358 -1476:0:2399 -1477:3:1359 -1478:3:1363 -1479:3:1364 -1480:3:1372 -1481:3:1373 -1482:3:1377 -1483:3:1378 -1484:3:1386 -1485:3:1391 -1486:3:1395 -1487:3:1396 -1488:3:1403 -1489:3:1404 -1490:3:1415 -1491:3:1416 -1492:3:1417 -1493:3:1428 -1494:3:1433 -1495:3:1434 -1496:0:2399 -1497:3:1446 -1498:0:2399 -1499:3:1550 -1500:0:2399 -1501:3:1648 -1502:0:2399 -1503:3:1649 -1504:0:2399 -1505:3:1653 -1506:0:2399 -1507:3:1659 -1508:3:1663 -1509:3:1664 -1510:3:1672 -1511:3:1673 -1512:3:1677 -1513:3:1678 -1514:3:1686 -1515:3:1691 -1516:3:1695 -1517:3:1696 -1518:3:1703 -1519:3:1704 -1520:3:1715 -1521:3:1716 -1522:3:1717 -1523:3:1728 -1524:3:1733 -1525:3:1734 -1526:0:2399 -1527:3:1746 -1528:0:2399 -1529:3:1748 -1530:0:2399 -1531:3:1749 -1532:3:1753 -1533:3:1754 -1534:3:1762 -1535:3:1763 -1536:3:1767 -1537:3:1768 -1538:3:1776 -1539:3:1781 -1540:3:1785 -1541:3:1786 -1542:3:1793 -1543:3:1794 -1544:3:1805 -1545:3:1806 -1546:3:1807 -1547:3:1818 -1548:3:1823 -1549:3:1824 -1550:0:2399 -1551:3:1836 -1552:0:2399 -1553:3:1838 -1554:0:2399 -1555:3:1841 -1556:3:1842 -1557:3:1854 -1558:3:1855 -1559:3:1859 -1560:3:1860 -1561:3:1868 -1562:3:1873 -1563:3:1877 -1564:3:1878 -1565:3:1885 -1566:3:1886 -1567:3:1897 -1568:3:1898 -1569:3:1899 -1570:3:1910 -1571:3:1915 -1572:3:1916 -1573:0:2399 -1574:3:1928 -1575:0:2399 -1576:3:1930 -1577:0:2399 -1578:3:1931 -1579:0:2399 -1580:3:1932 -1581:0:2399 -1582:3:1933 -1583:0:2399 -1584:3:1934 -1585:3:1938 -1586:3:1939 -1587:3:1947 -1588:3:1948 -1589:3:1952 -1590:3:1953 -1591:3:1961 -1592:3:1966 -1593:3:1970 -1594:3:1971 -1595:3:1978 -1596:3:1979 -1597:3:1990 -1598:3:1991 -1599:3:1992 -1600:3:2003 -1601:3:2008 -1602:3:2009 -1603:0:2399 -1604:3:2021 -1605:0:2399 -1606:3:2125 -1607:0:2399 -1608:3:2223 -1609:0:2399 -1610:3:2224 -1611:0:2399 -1612:3:2228 -1613:0:2399 -1614:3:2234 -1615:3:2241 -1616:3:2242 -1617:3:2249 -1618:3:2254 -1619:0:2399 -1620:3:2265 -1621:0:2399 -1622:3:2266 -1623:3:2273 -1624:3:2276 -1625:3:2277 -1626:3:2281 -1627:3:2286 -1628:0:2399 -1629:3:2297 -1630:0:2399 -1631:3:2302 -1632:3:2309 -1633:3:2310 -1634:3:2317 -1635:3:2322 -1636:0:2399 -1637:3:2333 -1638:0:2399 -1639:3:2335 -1640:0:2399 -1641:3:2336 -1642:0:2399 -1643:3:2339 -1644:0:2399 -1645:3:2344 -1646:0:2399 -1647:2:759 -1648:0:2397 -1649:3:2345 -1650:0:2403 -1651:2:518 diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.define b/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.log b/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.log deleted file mode 100644 index 5d7d35c..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.log +++ /dev/null @@ -1,217 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_single_flip.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -Depth= 8352 States= 1e+06 Transitions= 1.05e+07 Memory= 534.807 t= 8.93 R= 1e+05 -pan: claim violated! (at depth 1352) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 64 byte, depth reached 8352, errors: 1 - 1456373 states, stored - 13442538 states, matched - 14898911 transitions (= stored+matched) - 50580660 atomic steps -hash conflicts: 5166006 (resolved) - -Stats on memory usage (in Megabytes): - 127.779 equivalent memory usage for states (stored*(State-vector + overhead)) - 100.443 actual memory usage for states (compression: 78.61%) - state-vector as stored = 44 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 566.154 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 256, "(1)" - line 418, "pan.___", state 286, "(1)" - line 399, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 395, "(1)" - line 418, "pan.___", state 425, "(1)" - line 540, "pan.___", state 456, "-end-" - (17 of 456 states) -unreached in proctype urcu_reader_sig - line 399, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 70, "(1)" - line 418, "pan.___", state 100, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 247, "(1)" - line 418, "pan.___", state 277, "(1)" - line 399, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 359, "(1)" - line 418, "pan.___", state 389, "(1)" - line 614, "pan.___", state 411, "-end-" - (17 of 411 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 59, "(1)" - line 413, "pan.___", state 72, "(1)" - line 418, "pan.___", state 89, "(1)" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 240, "(1)" - line 164, "pan.___", state 248, "(1)" - line 168, "pan.___", state 260, "(1)" - line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 370, "(1)" - line 164, "pan.___", state 378, "(1)" - line 168, "pan.___", state 390, "(1)" - line 399, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 449, "(1)" - line 413, "pan.___", state 462, "(1)" - line 418, "pan.___", state 479, "(1)" - line 399, "pan.___", state 498, "(1)" - line 403, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 554, "(1)" - line 418, "pan.___", state 571, "(1)" - line 403, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 647, "(1)" - line 418, "pan.___", state 664, "(1)" - line 179, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 710, "(1)" - line 164, "pan.___", state 718, "(1)" - line 168, "pan.___", state 730, "(1)" - line 175, "pan.___", state 741, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 817, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 830, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 840, "(1)" - line 164, "pan.___", state 848, "(1)" - line 168, "pan.___", state 860, "(1)" - line 399, "pan.___", state 882, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 884, "(1)" - line 399, "pan.___", state 885, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 885, "else" - line 399, "pan.___", state 888, "(1)" - line 403, "pan.___", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 898, "(1)" - line 403, "pan.___", state 899, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 899, "else" - line 403, "pan.___", state 902, "(1)" - line 403, "pan.___", state 903, "(1)" - line 403, "pan.___", state 903, "(1)" - line 401, "pan.___", state 908, "((i<1))" - line 401, "pan.___", state 908, "((i>=1))" - line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 927, "(1)" - line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 928, "else" - line 409, "pan.___", state 931, "(1)" - line 409, "pan.___", state 932, "(1)" - line 409, "pan.___", state 932, "(1)" - line 413, "pan.___", state 940, "(1)" - line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 941, "else" - line 413, "pan.___", state 944, "(1)" - line 413, "pan.___", state 945, "(1)" - line 413, "pan.___", state 945, "(1)" - line 411, "pan.___", state 950, "((i<1))" - line 411, "pan.___", state 950, "((i>=1))" - line 418, "pan.___", state 957, "(1)" - line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 958, "else" - line 418, "pan.___", state 961, "(1)" - line 418, "pan.___", state 962, "(1)" - line 418, "pan.___", state 962, "(1)" - line 420, "pan.___", state 965, "(1)" - line 420, "pan.___", state 965, "(1)" - line 179, "pan.___", state 990, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1003, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1013, "(1)" - line 164, "pan.___", state 1021, "(1)" - line 168, "pan.___", state 1033, "(1)" - line 175, "pan.___", state 1044, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 1120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1133, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1143, "(1)" - line 164, "pan.___", state 1151, "(1)" - line 168, "pan.___", state 1163, "(1)" - line 702, "pan.___", state 1188, "-end-" - (100 of 1188 states) -unreached in proctype :init: - line 709, "pan.___", state 9, "((j<2))" - line 709, "pan.___", state 9, "((j>=2))" - line 710, "pan.___", state 20, "((j<2))" - line 710, "pan.___", state 20, "((j>=2))" - line 715, "pan.___", state 33, "((j<2))" - line 715, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 749, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 12.8 seconds -pan: rate 113424.69 states/second -pan: avg transition delay 8.6181e-07 usec -cp .input.spin urcu_free_single_flip.spin.input -cp .input.spin.trail urcu_free_single_flip.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.spin.input b/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.spin.input deleted file mode 100644 index 103464e..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define SINGLE_FLIP - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.spin.input.trail b/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.spin.input.trail deleted file mode 100644 index e81c46c..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_free_single_flip.spin.input.trail +++ /dev/null @@ -1,1355 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:2103 -2:4:2055 -3:4:2058 -4:4:2058 -5:4:2061 -6:4:2069 -7:4:2069 -8:4:2072 -9:4:2078 -10:4:2082 -11:4:2082 -12:4:2085 -13:4:2093 -14:4:2097 -15:4:2098 -16:0:2103 -17:4:2100 -18:0:2103 -19:3:869 -20:0:2103 -21:3:875 -22:0:2103 -23:3:876 -24:0:2103 -25:3:877 -26:3:881 -27:3:882 -28:3:890 -29:3:891 -30:3:895 -31:3:896 -32:3:904 -33:3:909 -34:3:913 -35:3:914 -36:3:921 -37:3:922 -38:3:933 -39:3:934 -40:3:935 -41:3:946 -42:3:951 -43:3:952 -44:0:2103 -45:3:964 -46:0:2103 -47:3:966 -48:3:967 -49:0:2103 -50:3:971 -51:3:975 -52:3:976 -53:3:984 -54:3:985 -55:3:989 -56:3:990 -57:3:998 -58:3:1003 -59:3:1004 -60:3:1015 -61:3:1016 -62:3:1027 -63:3:1028 -64:3:1029 -65:3:1040 -66:3:1045 -67:3:1046 -68:0:2103 -69:3:1058 -70:0:2103 -71:3:1060 -72:0:2103 -73:3:1061 -74:0:2103 -75:3:1071 -76:0:2103 -77:3:1075 -78:3:1076 -79:3:1080 -80:3:1084 -81:3:1085 -82:3:1089 -83:3:1097 -84:3:1098 -85:3:1103 -86:3:1110 -87:3:1111 -88:3:1118 -89:3:1123 -90:0:2103 -91:3:1134 -92:0:2103 -93:3:1138 -94:3:1139 -95:3:1143 -96:3:1147 -97:3:1148 -98:3:1152 -99:3:1160 -100:3:1161 -101:3:1166 -102:3:1173 -103:3:1174 -104:3:1181 -105:3:1186 -106:0:2103 -107:3:1197 -108:0:2103 -109:3:1205 -110:3:1206 -111:3:1210 -112:3:1214 -113:3:1215 -114:3:1219 -115:3:1227 -116:3:1228 -117:3:1233 -118:3:1240 -119:3:1241 -120:3:1248 -121:3:1253 -122:0:2103 -123:3:1264 -124:0:2103 -125:3:1266 -126:0:2103 -127:3:1267 -128:3:1271 -129:3:1272 -130:3:1280 -131:3:1281 -132:3:1285 -133:3:1286 -134:3:1294 -135:3:1299 -136:3:1303 -137:3:1304 -138:3:1311 -139:3:1312 -140:3:1323 -141:3:1324 -142:3:1325 -143:3:1336 -144:3:1341 -145:3:1342 -146:0:2103 -147:3:1354 -148:0:2103 -149:3:1356 -150:0:2103 -151:3:1359 -152:3:1360 -153:3:1372 -154:3:1373 -155:3:1377 -156:3:1378 -157:3:1386 -158:3:1391 -159:3:1395 -160:3:1396 -161:3:1403 -162:3:1404 -163:3:1415 -164:3:1416 -165:3:1417 -166:3:1428 -167:3:1433 -168:3:1434 -169:0:2103 -170:3:1446 -171:0:2103 -172:3:1448 -173:0:2103 -174:3:1449 -175:0:2103 -176:3:1450 -177:0:2103 -178:3:1451 -179:0:2103 -180:3:1452 -181:3:1456 -182:3:1457 -183:3:1465 -184:3:1466 -185:3:1470 -186:3:1471 -187:3:1479 -188:3:1484 -189:3:1488 -190:3:1489 -191:3:1496 -192:3:1497 -193:3:1508 -194:3:1509 -195:3:1510 -196:3:1521 -197:3:1526 -198:3:1527 -199:0:2103 -200:3:1539 -201:0:2103 -202:3:1736 -203:0:2103 -204:3:1834 -205:0:2103 -206:3:1835 -207:0:2103 -208:3:1839 -209:0:2103 -210:3:1848 -211:3:1849 -212:3:1853 -213:3:1857 -214:3:1858 -215:3:1862 -216:3:1870 -217:3:1871 -218:3:1876 -219:3:1883 -220:3:1884 -221:3:1891 -222:3:1896 -223:0:2103 -224:3:1907 -225:0:2103 -226:3:1911 -227:3:1912 -228:3:1916 -229:3:1920 -230:3:1921 -231:3:1925 -232:3:1933 -233:3:1934 -234:3:1939 -235:3:1946 -236:3:1947 -237:3:1954 -238:3:1959 -239:0:2103 -240:3:1970 -241:0:2103 -242:3:1978 -243:3:1979 -244:3:1983 -245:3:1987 -246:3:1988 -247:3:1992 -248:3:2000 -249:3:2001 -250:3:2006 -251:3:2013 -252:3:2014 -253:3:2021 -254:3:2026 -255:0:2103 -256:3:2037 -257:0:2103 -258:3:2039 -259:0:2103 -260:3:2040 -261:0:2103 -262:3:876 -263:0:2103 -264:3:877 -265:3:881 -266:3:882 -267:3:890 -268:3:891 -269:3:895 -270:3:896 -271:3:904 -272:3:909 -273:3:913 -274:3:914 -275:3:921 -276:3:922 -277:3:933 -278:3:934 -279:3:935 -280:3:946 -281:3:951 -282:3:952 -283:0:2103 -284:3:964 -285:0:2103 -286:3:966 -287:3:967 -288:0:2103 -289:3:971 -290:3:975 -291:3:976 -292:3:984 -293:3:985 -294:3:989 -295:3:990 -296:3:998 -297:3:1003 -298:3:1004 -299:3:1015 -300:3:1016 -301:3:1027 -302:3:1028 -303:3:1029 -304:3:1040 -305:3:1045 -306:3:1046 -307:0:2103 -308:3:1058 -309:0:2103 -310:3:1060 -311:0:2103 -312:3:1061 -313:0:2103 -314:3:1071 -315:0:2103 -316:3:1075 -317:3:1076 -318:3:1080 -319:3:1084 -320:3:1085 -321:3:1089 -322:3:1097 -323:3:1098 -324:3:1103 -325:3:1110 -326:3:1111 -327:3:1118 -328:3:1123 -329:0:2103 -330:3:1134 -331:0:2103 -332:3:1138 -333:3:1139 -334:3:1143 -335:3:1147 -336:3:1148 -337:3:1152 -338:3:1160 -339:3:1161 -340:3:1166 -341:3:1173 -342:3:1174 -343:3:1181 -344:3:1186 -345:0:2103 -346:3:1197 -347:0:2103 -348:3:1205 -349:3:1206 -350:3:1210 -351:3:1214 -352:3:1215 -353:3:1219 -354:3:1227 -355:3:1228 -356:3:1233 -357:3:1240 -358:3:1241 -359:3:1248 -360:3:1253 -361:0:2103 -362:3:1264 -363:0:2103 -364:3:1266 -365:0:2103 -366:3:1267 -367:3:1271 -368:3:1272 -369:3:1280 -370:3:1281 -371:3:1285 -372:3:1286 -373:3:1294 -374:3:1299 -375:3:1303 -376:3:1304 -377:3:1311 -378:3:1312 -379:3:1323 -380:3:1324 -381:3:1325 -382:3:1336 -383:3:1341 -384:3:1342 -385:0:2103 -386:3:1354 -387:0:2103 -388:3:1356 -389:0:2103 -390:3:1359 -391:3:1360 -392:3:1372 -393:3:1373 -394:3:1377 -395:3:1378 -396:3:1386 -397:3:1391 -398:3:1395 -399:3:1396 -400:3:1403 -401:3:1404 -402:3:1415 -403:3:1416 -404:3:1417 -405:3:1428 -406:3:1433 -407:3:1434 -408:0:2103 -409:3:1446 -410:0:2103 -411:3:1448 -412:0:2103 -413:3:1449 -414:0:2103 -415:3:1450 -416:0:2103 -417:3:1451 -418:0:2103 -419:3:1452 -420:3:1456 -421:3:1457 -422:3:1465 -423:3:1466 -424:3:1470 -425:3:1471 -426:3:1479 -427:3:1484 -428:3:1488 -429:3:1489 -430:3:1496 -431:3:1497 -432:3:1508 -433:3:1509 -434:3:1510 -435:3:1521 -436:3:1526 -437:3:1527 -438:0:2103 -439:3:1539 -440:0:2103 -441:3:1736 -442:0:2103 -443:3:1834 -444:0:2103 -445:3:1835 -446:0:2103 -447:3:1839 -448:0:2103 -449:3:1848 -450:3:1849 -451:3:1853 -452:3:1857 -453:3:1858 -454:3:1862 -455:3:1870 -456:3:1871 -457:3:1876 -458:3:1883 -459:3:1884 -460:3:1891 -461:3:1896 -462:0:2103 -463:3:1907 -464:0:2103 -465:3:1911 -466:3:1912 -467:3:1916 -468:3:1920 -469:3:1921 -470:3:1925 -471:3:1933 -472:3:1934 -473:3:1939 -474:3:1946 -475:3:1947 -476:3:1954 -477:3:1959 -478:0:2103 -479:3:1970 -480:0:2103 -481:3:1978 -482:3:1979 -483:3:1983 -484:3:1987 -485:3:1988 -486:3:1992 -487:3:2000 -488:3:2001 -489:3:2006 -490:3:2013 -491:3:2014 -492:3:2021 -493:3:2026 -494:0:2103 -495:3:2037 -496:0:2103 -497:3:2039 -498:0:2103 -499:3:2040 -500:0:2103 -501:3:876 -502:0:2103 -503:3:877 -504:3:881 -505:3:882 -506:3:890 -507:3:891 -508:3:895 -509:3:896 -510:3:904 -511:3:909 -512:3:913 -513:3:914 -514:3:921 -515:3:922 -516:3:933 -517:3:934 -518:3:935 -519:3:946 -520:3:951 -521:3:952 -522:0:2103 -523:3:964 -524:0:2103 -525:3:966 -526:3:967 -527:0:2103 -528:3:971 -529:3:975 -530:3:976 -531:3:984 -532:3:985 -533:3:989 -534:3:990 -535:3:998 -536:3:1003 -537:3:1004 -538:3:1015 -539:3:1016 -540:3:1027 -541:3:1028 -542:3:1029 -543:3:1040 -544:3:1045 -545:3:1046 -546:0:2103 -547:3:1058 -548:0:2103 -549:3:1060 -550:0:2103 -551:3:1061 -552:0:2103 -553:3:1071 -554:0:2103 -555:3:1075 -556:3:1076 -557:3:1080 -558:3:1084 -559:3:1085 -560:3:1089 -561:3:1097 -562:3:1098 -563:3:1103 -564:3:1110 -565:3:1111 -566:3:1118 -567:3:1123 -568:0:2103 -569:3:1134 -570:0:2103 -571:3:1138 -572:3:1139 -573:3:1143 -574:3:1147 -575:3:1148 -576:3:1152 -577:3:1160 -578:3:1161 -579:3:1166 -580:3:1173 -581:3:1174 -582:3:1181 -583:3:1186 -584:0:2103 -585:3:1197 -586:0:2103 -587:3:1205 -588:3:1206 -589:3:1210 -590:3:1214 -591:3:1215 -592:3:1219 -593:3:1227 -594:3:1228 -595:3:1233 -596:3:1240 -597:3:1241 -598:3:1248 -599:3:1253 -600:0:2103 -601:3:1264 -602:0:2103 -603:3:1266 -604:0:2103 -605:3:1267 -606:3:1271 -607:3:1272 -608:3:1280 -609:3:1281 -610:3:1285 -611:3:1286 -612:3:1294 -613:3:1299 -614:3:1303 -615:3:1304 -616:3:1311 -617:3:1312 -618:3:1323 -619:3:1324 -620:3:1325 -621:3:1336 -622:3:1341 -623:3:1342 -624:0:2103 -625:3:1354 -626:0:2103 -627:3:1356 -628:0:2103 -629:3:1359 -630:3:1360 -631:3:1372 -632:3:1373 -633:3:1377 -634:3:1378 -635:3:1386 -636:3:1391 -637:3:1395 -638:3:1396 -639:3:1403 -640:3:1404 -641:3:1415 -642:3:1416 -643:3:1417 -644:3:1428 -645:3:1433 -646:3:1434 -647:0:2103 -648:3:1446 -649:0:2103 -650:3:1448 -651:0:2103 -652:3:1449 -653:0:2103 -654:3:1450 -655:0:2103 -656:3:1451 -657:0:2103 -658:3:1452 -659:3:1456 -660:3:1457 -661:3:1465 -662:3:1466 -663:3:1470 -664:3:1471 -665:3:1479 -666:3:1484 -667:3:1488 -668:3:1489 -669:3:1496 -670:3:1497 -671:3:1508 -672:3:1509 -673:3:1510 -674:3:1521 -675:3:1526 -676:3:1527 -677:0:2103 -678:3:1539 -679:0:2103 -680:3:1736 -681:0:2103 -682:3:1834 -683:0:2103 -684:3:1835 -685:0:2103 -686:3:1839 -687:0:2103 -688:3:1848 -689:3:1849 -690:3:1853 -691:3:1857 -692:3:1858 -693:3:1862 -694:3:1870 -695:3:1871 -696:3:1876 -697:3:1883 -698:3:1884 -699:3:1891 -700:3:1896 -701:0:2103 -702:3:1907 -703:0:2103 -704:3:1911 -705:3:1912 -706:3:1916 -707:3:1920 -708:3:1921 -709:3:1925 -710:3:1933 -711:3:1934 -712:3:1939 -713:3:1946 -714:3:1947 -715:3:1954 -716:3:1959 -717:0:2103 -718:3:1970 -719:0:2103 -720:3:1978 -721:3:1979 -722:3:1983 -723:3:1987 -724:3:1988 -725:3:1992 -726:3:2000 -727:3:2001 -728:3:2006 -729:3:2013 -730:3:2014 -731:3:2021 -732:3:2026 -733:0:2103 -734:3:2037 -735:0:2103 -736:3:2039 -737:0:2103 -738:3:2040 -739:0:2103 -740:3:876 -741:0:2103 -742:3:877 -743:3:881 -744:3:882 -745:3:890 -746:3:891 -747:3:895 -748:3:896 -749:3:904 -750:3:909 -751:3:913 -752:3:914 -753:3:921 -754:3:922 -755:3:933 -756:3:934 -757:3:935 -758:3:946 -759:3:951 -760:3:952 -761:0:2103 -762:3:964 -763:0:2103 -764:3:966 -765:3:967 -766:0:2103 -767:3:971 -768:3:975 -769:3:976 -770:3:984 -771:3:985 -772:3:989 -773:3:990 -774:3:998 -775:3:1003 -776:3:1004 -777:3:1015 -778:3:1016 -779:3:1027 -780:3:1028 -781:3:1029 -782:3:1040 -783:3:1045 -784:3:1046 -785:0:2103 -786:3:1058 -787:0:2103 -788:3:1060 -789:0:2103 -790:3:1061 -791:0:2103 -792:3:1071 -793:0:2103 -794:3:1075 -795:3:1076 -796:3:1080 -797:3:1084 -798:3:1085 -799:3:1089 -800:3:1097 -801:3:1098 -802:3:1103 -803:3:1110 -804:3:1111 -805:3:1118 -806:3:1123 -807:0:2103 -808:3:1134 -809:0:2103 -810:3:1138 -811:3:1139 -812:3:1143 -813:3:1147 -814:3:1148 -815:3:1152 -816:3:1160 -817:3:1161 -818:3:1166 -819:3:1173 -820:3:1174 -821:3:1181 -822:3:1186 -823:0:2103 -824:3:1197 -825:0:2103 -826:3:1205 -827:3:1206 -828:3:1210 -829:3:1214 -830:3:1215 -831:3:1219 -832:3:1227 -833:3:1228 -834:3:1233 -835:3:1240 -836:3:1241 -837:3:1248 -838:3:1253 -839:0:2103 -840:3:1264 -841:0:2103 -842:3:1266 -843:0:2103 -844:3:1267 -845:3:1271 -846:3:1272 -847:3:1280 -848:3:1281 -849:3:1285 -850:3:1286 -851:3:1294 -852:3:1299 -853:3:1303 -854:3:1304 -855:3:1311 -856:3:1312 -857:3:1323 -858:3:1324 -859:3:1325 -860:3:1336 -861:3:1341 -862:3:1342 -863:0:2103 -864:3:1354 -865:0:2103 -866:3:1356 -867:0:2103 -868:3:1359 -869:3:1360 -870:3:1372 -871:3:1373 -872:3:1377 -873:3:1378 -874:3:1386 -875:3:1391 -876:3:1395 -877:3:1396 -878:3:1403 -879:3:1404 -880:3:1415 -881:3:1416 -882:3:1417 -883:3:1428 -884:3:1433 -885:3:1434 -886:0:2103 -887:3:1446 -888:0:2103 -889:3:1448 -890:0:2103 -891:3:1449 -892:0:2103 -893:3:1450 -894:0:2103 -895:3:1451 -896:0:2103 -897:3:1452 -898:3:1456 -899:3:1457 -900:3:1465 -901:3:1466 -902:3:1470 -903:3:1471 -904:3:1479 -905:3:1484 -906:3:1488 -907:3:1489 -908:3:1496 -909:3:1497 -910:3:1508 -911:3:1509 -912:3:1510 -913:3:1521 -914:3:1526 -915:3:1527 -916:0:2103 -917:3:1539 -918:0:2103 -919:3:1736 -920:0:2103 -921:3:1834 -922:0:2103 -923:3:1835 -924:0:2103 -925:3:1839 -926:0:2103 -927:3:1848 -928:3:1849 -929:3:1853 -930:3:1857 -931:3:1858 -932:3:1862 -933:3:1870 -934:3:1871 -935:3:1876 -936:3:1883 -937:3:1884 -938:3:1891 -939:3:1896 -940:0:2103 -941:3:1907 -942:0:2103 -943:2:458 -944:0:2103 -945:2:464 -946:0:2103 -947:2:465 -948:0:2103 -949:2:466 -950:0:2103 -951:2:467 -952:0:2103 -953:1:2 -954:0:2103 -955:2:468 -956:0:2103 -957:1:8 -958:0:2103 -959:1:9 -960:0:2103 -961:1:10 -962:0:2103 -963:1:11 -964:0:2103 -965:2:467 -966:0:2103 -967:1:12 -968:1:16 -969:1:17 -970:1:25 -971:1:26 -972:1:30 -973:1:31 -974:1:39 -975:1:44 -976:1:48 -977:1:49 -978:1:63 -979:1:64 -980:1:68 -981:1:69 -982:1:70 -983:1:81 -984:1:86 -985:1:87 -986:0:2103 -987:2:468 -988:0:2103 -989:1:99 -990:0:2103 -991:2:469 -992:0:2103 -993:2:475 -994:0:2103 -995:2:476 -996:0:2103 -997:2:477 -998:2:481 -999:2:482 -1000:2:490 -1001:2:491 -1002:2:495 -1003:2:496 -1004:2:504 -1005:2:509 -1006:2:513 -1007:2:514 -1008:2:528 -1009:2:529 -1010:2:533 -1011:2:534 -1012:2:535 -1013:2:546 -1014:2:551 -1015:2:552 -1016:0:2103 -1017:2:564 -1018:0:2103 -1019:2:565 -1020:2:569 -1021:2:570 -1022:2:578 -1023:2:579 -1024:2:583 -1025:2:584 -1026:2:592 -1027:2:597 -1028:2:601 -1029:2:602 -1030:2:616 -1031:2:617 -1032:2:621 -1033:2:622 -1034:2:623 -1035:2:634 -1036:2:639 -1037:2:640 -1038:0:2103 -1039:2:652 -1040:0:2103 -1041:2:653 -1042:0:2103 -1043:3:1911 -1044:3:1912 -1045:3:1916 -1046:3:1920 -1047:3:1921 -1048:3:1925 -1049:3:1933 -1050:3:1934 -1051:3:1939 -1052:3:1946 -1053:3:1947 -1054:3:1954 -1055:3:1959 -1056:0:2103 -1057:3:1970 -1058:0:2103 -1059:3:1978 -1060:3:1979 -1061:3:1983 -1062:3:1987 -1063:3:1988 -1064:3:1992 -1065:3:2000 -1066:3:2001 -1067:3:2006 -1068:3:2013 -1069:3:2014 -1070:3:2021 -1071:3:2026 -1072:0:2103 -1073:3:2037 -1074:0:2103 -1075:3:2039 -1076:0:2103 -1077:3:2040 -1078:0:2103 -1079:3:876 -1080:0:2103 -1081:3:877 -1082:3:881 -1083:3:882 -1084:3:890 -1085:3:891 -1086:3:895 -1087:3:896 -1088:3:904 -1089:3:909 -1090:3:913 -1091:3:914 -1092:3:921 -1093:3:922 -1094:3:933 -1095:3:934 -1096:3:935 -1097:3:946 -1098:3:951 -1099:3:952 -1100:0:2103 -1101:3:964 -1102:0:2103 -1103:3:966 -1104:3:967 -1105:0:2103 -1106:3:971 -1107:3:975 -1108:3:976 -1109:3:984 -1110:3:985 -1111:3:989 -1112:3:990 -1113:3:998 -1114:3:1003 -1115:3:1004 -1116:3:1015 -1117:3:1016 -1118:3:1027 -1119:3:1028 -1120:3:1029 -1121:3:1040 -1122:3:1045 -1123:3:1046 -1124:0:2103 -1125:3:1058 -1126:0:2103 -1127:3:1060 -1128:0:2103 -1129:3:1061 -1130:0:2103 -1131:3:1071 -1132:0:2103 -1133:3:1075 -1134:3:1076 -1135:3:1080 -1136:3:1084 -1137:3:1085 -1138:3:1089 -1139:3:1097 -1140:3:1098 -1141:3:1103 -1142:3:1110 -1143:3:1111 -1144:3:1118 -1145:3:1123 -1146:0:2103 -1147:3:1134 -1148:0:2103 -1149:2:654 -1150:2:658 -1151:2:659 -1152:2:667 -1153:2:668 -1154:2:672 -1155:2:673 -1156:2:681 -1157:2:686 -1158:2:690 -1159:2:691 -1160:2:698 -1161:2:699 -1162:2:710 -1163:2:711 -1164:2:712 -1165:2:723 -1166:2:735 -1167:2:736 -1168:0:2103 -1169:2:741 -1170:0:2103 -1171:2:750 -1172:0:2103 -1173:2:753 -1174:0:2103 -1175:2:758 -1176:0:2103 -1177:3:1138 -1178:3:1139 -1179:3:1143 -1180:3:1144 -1181:3:1152 -1182:3:1160 -1183:3:1161 -1184:3:1166 -1185:3:1173 -1186:3:1174 -1187:3:1181 -1188:3:1186 -1189:0:2103 -1190:3:1197 -1191:0:2103 -1192:3:1205 -1193:3:1206 -1194:3:1210 -1195:3:1214 -1196:3:1215 -1197:3:1219 -1198:3:1227 -1199:3:1228 -1200:3:1233 -1201:3:1240 -1202:3:1241 -1203:3:1248 -1204:3:1253 -1205:0:2103 -1206:3:1264 -1207:0:2103 -1208:3:1266 -1209:0:2103 -1210:3:1267 -1211:3:1271 -1212:3:1272 -1213:3:1280 -1214:3:1281 -1215:3:1285 -1216:3:1286 -1217:3:1294 -1218:3:1299 -1219:3:1303 -1220:3:1304 -1221:3:1311 -1222:3:1312 -1223:3:1323 -1224:3:1324 -1225:3:1325 -1226:3:1336 -1227:3:1341 -1228:3:1342 -1229:0:2103 -1230:3:1354 -1231:0:2103 -1232:3:1356 -1233:0:2103 -1234:3:1359 -1235:3:1360 -1236:3:1372 -1237:3:1373 -1238:3:1377 -1239:3:1378 -1240:3:1386 -1241:3:1391 -1242:3:1395 -1243:3:1396 -1244:3:1403 -1245:3:1404 -1246:3:1415 -1247:3:1416 -1248:3:1417 -1249:3:1428 -1250:3:1433 -1251:3:1434 -1252:0:2103 -1253:3:1446 -1254:0:2103 -1255:3:1448 -1256:0:2103 -1257:3:1449 -1258:0:2103 -1259:3:1450 -1260:0:2103 -1261:3:1451 -1262:0:2103 -1263:3:1452 -1264:3:1456 -1265:3:1457 -1266:3:1465 -1267:3:1466 -1268:3:1470 -1269:3:1471 -1270:3:1479 -1271:3:1484 -1272:3:1488 -1273:3:1489 -1274:3:1496 -1275:3:1497 -1276:3:1508 -1277:3:1509 -1278:3:1510 -1279:3:1521 -1280:3:1526 -1281:3:1527 -1282:0:2103 -1283:3:1539 -1284:0:2103 -1285:3:1736 -1286:0:2103 -1287:3:1834 -1288:0:2103 -1289:3:1835 -1290:0:2103 -1291:3:1839 -1292:0:2103 -1293:3:1848 -1294:3:1849 -1295:3:1853 -1296:3:1857 -1297:3:1858 -1298:3:1862 -1299:3:1870 -1300:3:1871 -1301:3:1876 -1302:3:1883 -1303:3:1884 -1304:3:1891 -1305:3:1896 -1306:0:2103 -1307:3:1907 -1308:0:2103 -1309:3:1911 -1310:3:1912 -1311:3:1916 -1312:3:1920 -1313:3:1921 -1314:3:1925 -1315:3:1933 -1316:3:1934 -1317:3:1939 -1318:3:1946 -1319:3:1947 -1320:3:1954 -1321:3:1959 -1322:0:2103 -1323:3:1970 -1324:0:2103 -1325:3:1978 -1326:3:1979 -1327:3:1983 -1328:3:1987 -1329:3:1988 -1330:3:1992 -1331:3:2000 -1332:3:2001 -1333:3:2006 -1334:3:2013 -1335:3:2014 -1336:3:2021 -1337:3:2026 -1338:0:2103 -1339:3:2037 -1340:0:2103 -1341:3:2039 -1342:0:2103 -1343:3:2040 -1344:0:2103 -1345:3:2043 -1346:0:2103 -1347:3:2048 -1348:0:2103 -1349:2:759 -1350:0:2101 -1351:3:2049 -1352:0:2107 -1353:3:1181 diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress.ltl b/formal-model/urcu/result-signal-over-reader/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.define b/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.log b/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.log deleted file mode 100644 index e3ec127..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.log +++ /dev/null @@ -1,506 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_reader.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -depth 15: Claim reached state 9 (line 749) -depth 1803: Claim reached state 9 (line 748) -Depth= 5838 States= 1e+06 Transitions= 1.06e+07 Memory= 494.865 t= 9.24 R= 1e+05 -Depth= 5838 States= 2e+06 Transitions= 1.97e+07 Memory= 532.658 t= 17.7 R= 1e+05 -Depth= 5838 States= 3e+06 Transitions= 3.15e+07 Memory= 555.315 t= 28.4 R= 1e+05 -pan: resizing hashtable to -w22.. done -Depth= 6855 States= 4e+06 Transitions= 4.32e+07 Memory= 613.096 t= 39.1 R= 1e+05 -Depth= 9059 States= 5e+06 Transitions= 5.48e+07 Memory= 642.295 t= 49.5 R= 1e+05 -Depth= 9059 States= 6e+06 Transitions= 6.91e+07 Memory= 672.178 t= 62.5 R= 1e+05 -Depth= 9059 States= 7e+06 Transitions= 7.99e+07 Memory= 706.455 t= 72.5 R= 1e+05 -Depth= 9059 States= 8e+06 Transitions= 9.23e+07 Memory= 735.752 t= 84 R= 1e+05 -Depth= 9059 States= 9e+06 Transitions= 1.04e+08 Memory= 766.318 t= 94.5 R= 1e+05 -pan: resizing hashtable to -w24.. done -Depth= 9059 States= 1e+07 Transitions= 1.16e+08 Memory= 920.002 t= 106 R= 9e+04 -Depth= 9059 States= 1.1e+07 Transitions= 1.3e+08 Memory= 945.002 t= 119 R= 9e+04 -Depth= 9059 States= 1.2e+07 Transitions= 1.54e+08 Memory= 967.756 t= 140 R= 9e+04 -Depth= 9059 States= 1.3e+07 Transitions= 1.72e+08 Memory= 995.002 t= 157 R= 8e+04 -Depth= 9059 States= 1.4e+07 Transitions= 1.92e+08 Memory= 1022.736 t= 175 R= 8e+04 -Depth= 9059 States= 1.5e+07 Transitions= 2.1e+08 Memory= 1050.080 t= 191 R= 8e+04 -Depth= 9059 States= 1.6e+07 Transitions= 2.22e+08 Memory= 1082.502 t= 203 R= 8e+04 -Depth= 9059 States= 1.7e+07 Transitions= 2.41e+08 Memory= 1108.479 t= 219 R= 8e+04 -Depth= 9059 States= 1.8e+07 Transitions= 2.58e+08 Memory= 1134.455 t= 235 R= 8e+04 -Depth= 9059 States= 1.9e+07 Transitions= 2.7e+08 Memory= 1164.533 t= 246 R= 8e+04 -Depth= 9059 States= 2e+07 Transitions= 2.83e+08 Memory= 1193.830 t= 258 R= 8e+04 -Depth= 9059 States= 2.1e+07 Transitions= 3.03e+08 Memory= 1219.026 t= 276 R= 8e+04 -Depth= 9059 States= 2.2e+07 Transitions= 3.19e+08 Memory= 1248.420 t= 291 R= 8e+04 -Depth= 9059 States= 2.3e+07 Transitions= 3.42e+08 Memory= 1271.858 t= 312 R= 7e+04 -Depth= 9059 States= 2.4e+07 Transitions= 3.6e+08 Memory= 1298.908 t= 328 R= 7e+04 -Depth= 9059 States= 2.5e+07 Transitions= 3.84e+08 Memory= 1323.127 t= 350 R= 7e+04 -Depth= 9059 States= 2.6e+07 Transitions= 4e+08 Memory= 1348.518 t= 365 R= 7e+04 -Depth= 9059 States= 2.7e+07 Transitions= 4.16e+08 Memory= 1379.865 t= 380 R= 7e+04 -Depth= 9059 States= 2.8e+07 Transitions= 4.26e+08 Memory= 1411.115 t= 389 R= 7e+04 -Depth= 9059 States= 2.9e+07 Transitions= 4.42e+08 Memory= 1439.631 t= 404 R= 7e+04 -Depth= 9059 States= 3e+07 Transitions= 4.64e+08 Memory= 1462.385 t= 423 R= 7e+04 -Depth= 9059 States= 3.1e+07 Transitions= 4.82e+08 Memory= 1490.998 t= 439 R= 7e+04 -Depth= 9059 States= 3.2e+07 Transitions= 4.99e+08 Memory= 1519.514 t= 456 R= 7e+04 -Depth= 9059 States= 3.3e+07 Transitions= 5.18e+08 Memory= 1545.393 t= 473 R= 7e+04 -Depth= 9059 States= 3.4e+07 Transitions= 5.33e+08 Memory= 1578.108 t= 486 R= 7e+04 -pan: resizing hashtable to -w26.. done -Depth= 9059 States= 3.5e+07 Transitions= 5.49e+08 Memory= 2098.994 t= 504 R= 7e+04 -Depth= 9059 States= 3.6e+07 Transitions= 5.74e+08 Memory= 2121.651 t= 528 R= 7e+04 -Depth= 9059 States= 3.7e+07 Transitions= 5.96e+08 Memory= 2147.334 t= 547 R= 7e+04 -Depth= 9059 States= 3.8e+07 Transitions= 6.17e+08 Memory= 2170.186 t= 567 R= 7e+04 -Depth= 9059 States= 3.9e+07 Transitions= 6.3e+08 Memory= 2199.776 t= 578 R= 7e+04 -Depth= 9059 States= 4e+07 Transitions= 6.53e+08 Memory= 2225.459 t= 599 R= 7e+04 -Depth= 9059 States= 4.1e+07 Transitions= 6.69e+08 Memory= 2250.361 t= 614 R= 7e+04 -Depth= 9059 States= 4.2e+07 Transitions= 6.85e+08 Memory= 2279.268 t= 628 R= 7e+04 -Depth= 9059 States= 4.3e+07 Transitions= 7.03e+08 Memory= 2304.463 t= 644 R= 7e+04 -Depth= 9059 States= 4.4e+07 Transitions= 7.13e+08 Memory= 2338.252 t= 654 R= 7e+04 -Depth= 9059 States= 4.5e+07 Transitions= 7.25e+08 Memory= 2366.768 t= 665 R= 7e+04 -Depth= 9059 States= 4.6e+07 Transitions= 7.41e+08 Memory= 2393.330 t= 679 R= 7e+04 -Depth= 9059 States= 4.7e+07 Transitions= 7.57e+08 Memory= 2420.381 t= 694 R= 7e+04 -Depth= 9059 States= 4.8e+07 Transitions= 7.72e+08 Memory= 2447.041 t= 708 R= 7e+04 -Depth= 9059 States= 4.9e+07 Transitions= 7.88e+08 Memory= 2476.143 t= 722 R= 7e+04 -Depth= 9059 States= 5e+07 Transitions= 8.04e+08 Memory= 2501.045 t= 737 R= 7e+04 -Depth= 9059 States= 5.1e+07 Transitions= 8.2e+08 Memory= 2530.440 t= 752 R= 7e+04 -Depth= 9059 States= 5.2e+07 Transitions= 8.37e+08 Memory= 2554.854 t= 766 R= 7e+04 -Depth= 9059 States= 5.3e+07 Transitions= 8.5e+08 Memory= 2583.467 t= 779 R= 7e+04 -Depth= 9059 States= 5.4e+07 Transitions= 8.66e+08 Memory= 2611.299 t= 794 R= 7e+04 -Depth= 9059 States= 5.5e+07 Transitions= 8.79e+08 Memory= 2640.791 t= 805 R= 7e+04 -Depth= 9059 States= 5.6e+07 Transitions= 8.9e+08 Memory= 2672.139 t= 815 R= 7e+04 -Depth= 9059 States= 5.7e+07 Transitions= 9.05e+08 Memory= 2702.705 t= 829 R= 7e+04 -Depth= 9059 States= 5.8e+07 Transitions= 9.22e+08 Memory= 2727.998 t= 845 R= 7e+04 -Depth= 9059 States= 5.9e+07 Transitions= 9.38e+08 Memory= 2754.463 t= 859 R= 7e+04 -Depth= 9059 States= 6e+07 Transitions= 9.49e+08 Memory= 2789.717 t= 870 R= 7e+04 -Depth= 9059 States= 6.1e+07 Transitions= 9.62e+08 Memory= 2817.744 t= 881 R= 7e+04 -Depth= 9059 States= 6.2e+07 Transitions= 9.79e+08 Memory= 2838.447 t= 896 R= 7e+04 -Depth= 9059 States= 6.3e+07 Transitions= 1e+09 Memory= 2863.154 t= 919 R= 7e+04 -Depth= 9059 States= 6.4e+07 Transitions= 1.02e+09 Memory= 2889.131 t= 936 R= 7e+04 -Depth= 9059 States= 6.5e+07 Transitions= 1.04e+09 Memory= 2919.502 t= 952 R= 7e+04 -Depth= 9059 States= 6.6e+07 Transitions= 1.06e+09 Memory= 2943.916 t= 968 R= 7e+04 -Depth= 9059 States= 6.7e+07 Transitions= 1.07e+09 Memory= 2978.975 t= 979 R= 7e+04 -Depth= 9059 States= 6.8e+07 Transitions= 1.09e+09 Memory= 3003.877 t= 996 R= 7e+04 -Depth= 9059 States= 6.9e+07 Transitions= 1.11e+09 Memory= 3028.584 t= 1.01e+03 R= 7e+04 -Depth= 9059 States= 7e+07 Transitions= 1.12e+09 Memory= 3058.174 t= 1.02e+03 R= 7e+04 -Depth= 9059 States= 7.1e+07 Transitions= 1.13e+09 Memory= 3088.350 t= 1.04e+03 R= 7e+04 -Depth= 9059 States= 7.2e+07 Transitions= 1.15e+09 Memory= 3113.350 t= 1.05e+03 R= 7e+04 -Depth= 9059 States= 7.3e+07 Transitions= 1.17e+09 Memory= 3142.158 t= 1.07e+03 R= 7e+04 -Depth= 9059 States= 7.4e+07 Transitions= 1.19e+09 Memory= 3166.279 t= 1.09e+03 R= 7e+04 -Depth= 9059 States= 7.5e+07 Transitions= 1.21e+09 Memory= 3192.744 t= 1.11e+03 R= 7e+04 -Depth= 9059 States= 7.6e+07 Transitions= 1.23e+09 Memory= 3217.256 t= 1.13e+03 R= 7e+04 -Depth= 9059 States= 7.7e+07 Transitions= 1.25e+09 Memory= 3242.549 t= 1.14e+03 R= 7e+04 -Depth= 9059 States= 7.8e+07 Transitions= 1.26e+09 Memory= 3273.115 t= 1.16e+03 R= 7e+04 -Depth= 9059 States= 7.9e+07 Transitions= 1.27e+09 Memory= 3303.975 t= 1.17e+03 R= 7e+04 -Depth= 9059 States= 8e+07 Transitions= 1.29e+09 Memory= 3334.541 t= 1.18e+03 R= 7e+04 -Depth= 9059 States= 8.1e+07 Transitions= 1.31e+09 Memory= 3356.221 t= 1.2e+03 R= 7e+04 -Depth= 9059 States= 8.2e+07 Transitions= 1.33e+09 Memory= 3385.127 t= 1.22e+03 R= 7e+04 -Depth= 9059 States= 8.3e+07 Transitions= 1.35e+09 Memory= 3412.959 t= 1.23e+03 R= 7e+04 -Depth= 9059 States= 8.4e+07 Transitions= 1.37e+09 Memory= 3438.936 t= 1.25e+03 R= 7e+04 -Depth= 9059 States= 8.5e+07 Transitions= 1.38e+09 Memory= 3471.455 t= 1.26e+03 R= 7e+04 -Depth= 9059 States= 8.6e+07 Transitions= 1.4e+09 Memory= 3498.115 t= 1.28e+03 R= 7e+04 -Depth= 9059 States= 8.7e+07 Transitions= 1.42e+09 Memory= 3519.014 t= 1.3e+03 R= 7e+04 -Depth= 9059 States= 8.8e+07 Transitions= 1.44e+09 Memory= 3546.162 t= 1.32e+03 R= 7e+04 -Depth= 9059 States= 8.9e+07 Transitions= 1.46e+09 Memory= 3567.842 t= 1.34e+03 R= 7e+04 -Depth= 9059 States= 9e+07 Transitions= 1.48e+09 Memory= 3598.799 t= 1.35e+03 R= 7e+04 -Depth= 9059 States= 9.1e+07 Transitions= 1.5e+09 Memory= 3622.920 t= 1.37e+03 R= 7e+04 -Depth= 9059 States= 9.2e+07 Transitions= 1.52e+09 Memory= 3648.701 t= 1.39e+03 R= 7e+04 -Depth= 9059 States= 9.3e+07 Transitions= 1.53e+09 Memory= 3676.045 t= 1.4e+03 R= 7e+04 -Depth= 9059 States= 9.4e+07 Transitions= 1.55e+09 Memory= 3702.412 t= 1.42e+03 R= 7e+04 -Depth= 9059 States= 9.5e+07 Transitions= 1.56e+09 Memory= 3735.713 t= 1.43e+03 R= 7e+04 -Depth= 9059 States= 9.6e+07 Transitions= 1.57e+09 Memory= 3764.522 t= 1.44e+03 R= 7e+04 -Depth= 9059 States= 9.7e+07 Transitions= 1.59e+09 Memory= 3790.693 t= 1.45e+03 R= 7e+04 -Depth= 9059 States= 9.8e+07 Transitions= 1.61e+09 Memory= 3817.940 t= 1.47e+03 R= 7e+04 -Depth= 9059 States= 9.9e+07 Transitions= 1.62e+09 Memory= 3845.283 t= 1.48e+03 R= 7e+04 -Depth= 9059 States= 1e+08 Transitions= 1.64e+09 Memory= 3873.213 t= 1.5e+03 R= 7e+04 -Depth= 9059 States= 1.01e+08 Transitions= 1.65e+09 Memory= 3897.920 t= 1.51e+03 R= 7e+04 -Depth= 9059 States= 1.02e+08 Transitions= 1.67e+09 Memory= 3926.631 t= 1.53e+03 R= 7e+04 -Depth= 9059 States= 1.03e+08 Transitions= 1.68e+09 Memory= 3952.315 t= 1.54e+03 R= 7e+04 -Depth= 9059 States= 1.04e+08 Transitions= 1.7e+09 Memory= 3981.026 t= 1.56e+03 R= 7e+04 -Depth= 9059 States= 1.05e+08 Transitions= 1.71e+09 Memory= 4010.029 t= 1.57e+03 R= 7e+04 -Depth= 9059 States= 1.06e+08 Transitions= 1.73e+09 Memory= 4038.838 t= 1.58e+03 R= 7e+04 -Depth= 9059 States= 1.07e+08 Transitions= 1.74e+09 Memory= 4070.381 t= 1.59e+03 R= 7e+04 -Depth= 9059 States= 1.08e+08 Transitions= 1.75e+09 Memory= 4099.385 t= 1.61e+03 R= 7e+04 -Depth= 9059 States= 1.09e+08 Transitions= 1.77e+09 Memory= 4126.338 t= 1.62e+03 R= 7e+04 -Depth= 9059 States= 1.1e+08 Transitions= 1.79e+09 Memory= 4151.924 t= 1.64e+03 R= 7e+04 -Depth= 9059 States= 1.11e+08 Transitions= 1.8e+09 Memory= 4187.276 t= 1.65e+03 R= 7e+04 -Depth= 9059 States= 1.12e+08 Transitions= 1.81e+09 Memory= 4214.326 t= 1.66e+03 R= 7e+04 -Depth= 9059 States= 1.13e+08 Transitions= 1.83e+09 Memory= 4237.471 t= 1.67e+03 R= 7e+04 -Depth= 9059 States= 1.14e+08 Transitions= 1.85e+09 Memory= 4261.104 t= 1.7e+03 R= 7e+04 -Depth= 9059 States= 1.15e+08 Transitions= 1.87e+09 Memory= 4286.690 t= 1.71e+03 R= 7e+04 -Depth= 9059 States= 1.16e+08 Transitions= 1.89e+09 Memory= 4314.619 t= 1.73e+03 R= 7e+04 -Depth= 9059 States= 1.17e+08 Transitions= 1.91e+09 Memory= 4341.768 t= 1.75e+03 R= 7e+04 -Depth= 9059 States= 1.18e+08 Transitions= 1.92e+09 Memory= 4375.166 t= 1.76e+03 R= 7e+04 -Depth= 9059 States= 1.19e+08 Transitions= 1.94e+09 Memory= 4401.338 t= 1.78e+03 R= 7e+04 -Depth= 9059 States= 1.2e+08 Transitions= 1.95e+09 Memory= 4426.436 t= 1.79e+03 R= 7e+04 -Depth= 9059 States= 1.21e+08 Transitions= 1.97e+09 Memory= 4456.807 t= 1.8e+03 R= 7e+04 -Depth= 9059 States= 1.22e+08 Transitions= 1.98e+09 Memory= 4486.592 t= 1.82e+03 R= 7e+04 -Depth= 9059 States= 1.23e+08 Transitions= 2e+09 Memory= 4511.787 t= 1.83e+03 R= 7e+04 -Depth= 9059 States= 1.24e+08 Transitions= 2.02e+09 Memory= 4540.108 t= 1.85e+03 R= 7e+04 -Depth= 9059 States= 1.25e+08 Transitions= 2.04e+09 Memory= 4564.033 t= 1.87e+03 R= 7e+04 -Depth= 9059 States= 1.26e+08 Transitions= 2.06e+09 Memory= 4591.865 t= 1.89e+03 R= 7e+04 -Depth= 9059 States= 1.27e+08 Transitions= 2.08e+09 Memory= 4615.889 t= 1.91e+03 R= 7e+04 -Depth= 9059 States= 1.28e+08 Transitions= 2.1e+09 Memory= 4640.303 t= 1.92e+03 R= 7e+04 -Depth= 9059 States= 1.29e+08 Transitions= 2.11e+09 Memory= 4670.479 t= 1.94e+03 R= 7e+04 -Depth= 9059 States= 1.3e+08 Transitions= 2.12e+09 Memory= 4702.998 t= 1.95e+03 R= 7e+04 -Depth= 9059 States= 1.31e+08 Transitions= 2.14e+09 Memory= 4732.393 t= 1.96e+03 R= 7e+04 -Depth= 9059 States= 1.32e+08 Transitions= 2.16e+09 Memory= 4754.756 t= 1.98e+03 R= 7e+04 -Depth= 9059 States= 1.33e+08 Transitions= 2.18e+09 Memory= 4783.174 t= 2e+03 R= 7e+04 -Depth= 9059 States= 1.34e+08 Transitions= 2.19e+09 Memory= 4810.518 t= 2.01e+03 R= 7e+04 -Depth= 9059 States= 1.35e+08 Transitions= 2.21e+09 Memory= 4837.568 t= 2.03e+03 R= 7e+04 -pan: resizing hashtable to -w28.. done -Depth= 9059 States= 1.36e+08 Transitions= 2.23e+09 Memory= 6885.568 t= 2.06e+03 R= 7e+04 -Depth= 9059 States= 1.37e+08 Transitions= 2.24e+09 Memory= 6885.568 t= 2.08e+03 R= 7e+04 -Depth= 9059 States= 1.38e+08 Transitions= 2.27e+09 Memory= 6900.412 t= 2.1e+03 R= 7e+04 -Depth= 9059 States= 1.39e+08 Transitions= 2.29e+09 Memory= 6927.658 t= 2.12e+03 R= 7e+04 -Depth= 9059 States= 1.4e+08 Transitions= 2.31e+09 Memory= 6950.315 t= 2.14e+03 R= 7e+04 -Depth= 9059 States= 1.41e+08 Transitions= 2.33e+09 Memory= 6981.858 t= 2.15e+03 R= 7e+04 -Depth= 9059 States= 1.42e+08 Transitions= 2.35e+09 Memory= 7005.295 t= 2.17e+03 R= 7e+04 -Depth= 9059 States= 1.43e+08 Transitions= 2.36e+09 Memory= 7031.076 t= 2.18e+03 R= 7e+04 -Depth= 9059 States= 1.44e+08 Transitions= 2.38e+09 Memory= 7056.955 t= 2.2e+03 R= 7e+04 -Depth= 9059 States= 1.45e+08 Transitions= 2.4e+09 Memory= 7084.494 t= 2.22e+03 R= 7e+04 -Depth= 9059 States= 1.46e+08 Transitions= 2.41e+09 Memory= 7115.744 t= 2.23e+03 R= 7e+04 -Depth= 9059 States= 1.47e+08 Transitions= 2.42e+09 Memory= 7146.604 t= 2.24e+03 R= 7e+04 -Depth= 9059 States= 1.48e+08 Transitions= 2.44e+09 Memory= 7172.287 t= 2.25e+03 R= 7e+04 -Depth= 9059 States= 1.49e+08 Transitions= 2.45e+09 Memory= 7200.315 t= 2.26e+03 R= 7e+04 -Depth= 9059 States= 1.5e+08 Transitions= 2.47e+09 Memory= 7226.389 t= 2.28e+03 R= 7e+04 -Depth= 9059 States= 1.51e+08 Transitions= 2.48e+09 Memory= 7253.733 t= 2.29e+03 R= 7e+04 -Depth= 9059 States= 1.52e+08 Transitions= 2.5e+09 Memory= 7279.709 t= 2.31e+03 R= 7e+04 -Depth= 9059 States= 1.53e+08 Transitions= 2.52e+09 Memory= 7309.104 t= 2.32e+03 R= 7e+04 -Depth= 9059 States= 1.54e+08 Transitions= 2.53e+09 Memory= 7334.592 t= 2.34e+03 R= 7e+04 -Depth= 9059 States= 1.55e+08 Transitions= 2.55e+09 Memory= 7362.229 t= 2.35e+03 R= 7e+04 -Depth= 9059 States= 1.56e+08 Transitions= 2.56e+09 Memory= 7391.135 t= 2.36e+03 R= 7e+04 -Depth= 9059 States= 1.57e+08 Transitions= 2.57e+09 Memory= 7420.822 t= 2.38e+03 R= 7e+04 -Depth= 9059 States= 1.58e+08 Transitions= 2.59e+09 Memory= 7452.854 t= 2.39e+03 R= 7e+04 -Depth= 9059 States= 1.59e+08 Transitions= 2.6e+09 Memory= 7481.760 t= 2.4e+03 R= 7e+04 -Depth= 9059 States= 1.6e+08 Transitions= 2.62e+09 Memory= 7509.299 t= 2.41e+03 R= 7e+04 -Depth= 9059 States= 1.61e+08 Transitions= 2.63e+09 Memory= 7534.201 t= 2.43e+03 R= 7e+04 -Depth= 9059 States= 1.62e+08 Transitions= 2.65e+09 Memory= 7567.600 t= 2.44e+03 R= 7e+04 -Depth= 9059 States= 1.63e+08 Transitions= 2.66e+09 Memory= 7594.846 t= 2.45e+03 R= 7e+04 -Depth= 9059 States= 1.64e+08 Transitions= 2.67e+09 Memory= 7619.455 t= 2.47e+03 R= 7e+04 -Depth= 9059 States= 1.65e+08 Transitions= 2.7e+09 Memory= 7642.502 t= 2.49e+03 R= 7e+04 -Depth= 9059 States= 1.66e+08 Transitions= 2.72e+09 Memory= 7669.260 t= 2.51e+03 R= 7e+04 -Depth= 9059 States= 1.67e+08 Transitions= 2.73e+09 Memory= 7696.799 t= 2.52e+03 R= 7e+04 -Depth= 9059 States= 1.68e+08 Transitions= 2.75e+09 Memory= 7723.850 t= 2.54e+03 R= 7e+04 -Depth= 9059 States= 1.69e+08 Transitions= 2.77e+09 Memory= 7757.053 t= 2.55e+03 R= 7e+04 -Depth= 9059 States= 1.7e+08 Transitions= 2.78e+09 Memory= 7782.346 t= 2.57e+03 R= 7e+04 -Depth= 9059 States= 1.71e+08 Transitions= 2.8e+09 Memory= 7808.908 t= 2.58e+03 R= 7e+04 -Depth= 9059 States= 1.72e+08 Transitions= 2.81e+09 Memory= 7838.791 t= 2.59e+03 R= 7e+04 -Depth= 9059 States= 1.73e+08 Transitions= 2.83e+09 Memory= 7867.893 t= 2.61e+03 R= 7e+04 -Depth= 9059 States= 1.74e+08 Transitions= 2.85e+09 Memory= 7892.990 t= 2.62e+03 R= 7e+04 -Depth= 9059 States= 1.75e+08 Transitions= 2.86e+09 Memory= 7922.190 t= 2.64e+03 R= 7e+04 -Depth= 9059 States= 1.76e+08 Transitions= 2.89e+09 Memory= 7945.627 t= 2.66e+03 R= 7e+04 -Depth= 9059 States= 1.77e+08 Transitions= 2.9e+09 Memory= 7973.947 t= 2.68e+03 R= 7e+04 -Depth= 9059 States= 1.78e+08 Transitions= 2.93e+09 Memory= 7997.483 t= 2.7e+03 R= 7e+04 -Depth= 9059 States= 1.79e+08 Transitions= 2.94e+09 Memory= 8020.920 t= 2.71e+03 R= 7e+04 -Depth= 9059 States= 1.8e+08 Transitions= 2.96e+09 Memory= 8050.412 t= 2.73e+03 R= 7e+04 -Depth= 9059 States= 1.81e+08 Transitions= 2.97e+09 Memory= 8085.666 t= 2.74e+03 R= 7e+04 -Depth= 9059 States= 1.82e+08 Transitions= 2.98e+09 Memory= 8114.279 t= 2.75e+03 R= 7e+04 -Depth= 9059 States= 1.83e+08 Transitions= 3e+09 Memory= 8137.131 t= 2.77e+03 R= 7e+04 -Depth= 9059 States= 1.84e+08 Transitions= 3.02e+09 Memory= 8165.451 t= 2.79e+03 R= 7e+04 -Depth= 9059 States= 1.85e+08 Transitions= 3.04e+09 Memory= 8193.186 t= 2.8e+03 R= 7e+04 -Depth= 9059 States= 1.86e+08 Transitions= 3.06e+09 Memory= 8218.674 t= 2.82e+03 R= 7e+04 -Depth= 9059 States= 1.87e+08 Transitions= 3.08e+09 Memory= 8255.100 t= 2.83e+03 R= 7e+04 -Depth= 9059 States= 1.88e+08 Transitions= 3.09e+09 Memory= 8279.221 t= 2.85e+03 R= 7e+04 -Depth= 9059 States= 1.89e+08 Transitions= 3.12e+09 Memory= 8298.264 t= 2.87e+03 R= 7e+04 -Depth= 9059 States= 1.9e+08 Transitions= 3.14e+09 Memory= 8325.998 t= 2.89e+03 R= 7e+04 -Depth= 9059 States= 1.91e+08 Transitions= 3.16e+09 Memory= 8349.338 t= 2.91e+03 R= 7e+04 -Depth= 9059 States= 1.92e+08 Transitions= 3.17e+09 Memory= 8379.221 t= 2.92e+03 R= 7e+04 -Depth= 9059 States= 1.93e+08 Transitions= 3.19e+09 Memory= 8403.440 t= 2.94e+03 R= 7e+04 -Depth= 9059 States= 1.94e+08 Transitions= 3.21e+09 Memory= 8430.100 t= 2.96e+03 R= 7e+04 -Depth= 9059 States= 1.95e+08 Transitions= 3.23e+09 Memory= 8455.295 t= 2.97e+03 R= 7e+04 -Depth= 9059 States= 1.96e+08 Transitions= 3.25e+09 Memory= 8482.932 t= 2.99e+03 R= 7e+04 -Depth= 9059 States= 1.97e+08 Transitions= 3.26e+09 Memory= 8515.256 t= 3e+03 R= 7e+04 -Depth= 9059 States= 1.98e+08 Transitions= 3.27e+09 Memory= 8542.502 t= 3.01e+03 R= 7e+04 -Depth= 9059 States= 1.99e+08 Transitions= 3.29e+09 Memory= 8569.260 t= 3.02e+03 R= 7e+04 -Depth= 9059 States= 2e+08 Transitions= 3.3e+09 Memory= 8598.459 t= 3.04e+03 R= 7e+04 -Depth= 9059 States= 2.01e+08 Transitions= 3.32e+09 Memory= 8624.631 t= 3.05e+03 R= 7e+04 -Depth= 9059 States= 2.02e+08 Transitions= 3.33e+09 Memory= 8652.365 t= 3.07e+03 R= 7e+04 -Depth= 9059 States= 2.03e+08 Transitions= 3.35e+09 Memory= 8678.440 t= 3.08e+03 R= 7e+04 -Depth= 9059 States= 2.04e+08 Transitions= 3.36e+09 Memory= 8706.369 t= 3.1e+03 R= 7e+04 -Depth= 9059 States= 2.05e+08 Transitions= 3.38e+09 Memory= 8732.932 t= 3.11e+03 R= 7e+04 -Depth= 9059 States= 2.06e+08 Transitions= 3.39e+09 Memory= 8760.276 t= 3.12e+03 R= 7e+04 -Depth= 9059 States= 2.07e+08 Transitions= 3.41e+09 Memory= 8789.475 t= 3.14e+03 R= 7e+04 -Depth= 9059 States= 2.08e+08 Transitions= 3.42e+09 Memory= 8819.455 t= 3.15e+03 R= 7e+04 -Depth= 9059 States= 2.09e+08 Transitions= 3.43e+09 Memory= 8851.779 t= 3.16e+03 R= 7e+04 -Depth= 9059 States= 2.1e+08 Transitions= 3.45e+09 Memory= 8880.100 t= 3.17e+03 R= 7e+04 -Depth= 9059 States= 2.11e+08 Transitions= 3.46e+09 Memory= 8907.053 t= 3.19e+03 R= 7e+04 -Depth= 9059 States= 2.12e+08 Transitions= 3.48e+09 Memory= 8932.639 t= 3.2e+03 R= 7e+04 -Depth= 9059 States= 2.13e+08 Transitions= 3.49e+09 Memory= 8964.572 t= 3.22e+03 R= 7e+04 -Depth= 9059 States= 2.14e+08 Transitions= 3.51e+09 Memory= 8991.526 t= 3.23e+03 R= 7e+04 -Depth= 9059 States= 2.15e+08 Transitions= 3.52e+09 Memory= 9018.088 t= 3.24e+03 R= 7e+04 -Depth= 9059 States= 2.16e+08 Transitions= 3.54e+09 Memory= 9039.865 t= 3.26e+03 R= 7e+04 -Depth= 9059 States= 2.17e+08 Transitions= 3.56e+09 Memory= 9067.600 t= 3.28e+03 R= 7e+04 -Depth= 9059 States= 2.18e+08 Transitions= 3.58e+09 Memory= 9094.260 t= 3.3e+03 R= 7e+04 -Depth= 9059 States= 2.19e+08 Transitions= 3.6e+09 Memory= 9122.483 t= 3.31e+03 R= 7e+04 -Depth= 9059 States= 2.2e+08 Transitions= 3.61e+09 Memory= 9153.635 t= 3.32e+03 R= 7e+04 -Depth= 9059 States= 2.21e+08 Transitions= 3.63e+09 Memory= 9181.272 t= 3.34e+03 R= 7e+04 -Depth= 9059 States= 2.22e+08 Transitions= 3.65e+09 Memory= 9207.639 t= 3.36e+03 R= 7e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 64 byte, depth reached 9059, errors: 0 - 88961904 states, stored (2.22145e+08 visited) -3.4291111e+09 states, matched -3.6512561e+09 transitions (= visited+matched) -1.2885947e+10 atomic steps -hash conflicts: 7.2188776e+08 (resolved) - -Stats on memory usage (in Megabytes): - 7805.343 equivalent memory usage for states (stored*(State-vector + overhead)) - 6706.219 actual memory usage for states (compression: 85.92%) - state-vector as stored = 51 byte + 28 byte overhead - 2048.000 memory used for hash table (-w28) - 457.764 memory used for DFS stack (-m10000000) - 1.122 memory lost to fragmentation - 9210.861 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 256, "(1)" - line 418, "pan.___", state 286, "(1)" - line 399, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 395, "(1)" - line 418, "pan.___", state 425, "(1)" - line 540, "pan.___", state 456, "-end-" - (17 of 456 states) -unreached in proctype urcu_reader_sig - line 399, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 70, "(1)" - line 418, "pan.___", state 100, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 247, "(1)" - line 418, "pan.___", state 277, "(1)" - line 399, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 359, "(1)" - line 418, "pan.___", state 389, "(1)" - line 614, "pan.___", state 411, "-end-" - (17 of 411 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 59, "(1)" - line 413, "pan.___", state 72, "(1)" - line 418, "pan.___", state 89, "(1)" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 240, "(1)" - line 164, "pan.___", state 248, "(1)" - line 168, "pan.___", state 260, "(1)" - line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 370, "(1)" - line 164, "pan.___", state 378, "(1)" - line 168, "pan.___", state 390, "(1)" - line 399, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 449, "(1)" - line 413, "pan.___", state 462, "(1)" - line 418, "pan.___", state 479, "(1)" - line 399, "pan.___", state 498, "(1)" - line 403, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 554, "(1)" - line 418, "pan.___", state 571, "(1)" - line 403, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 647, "(1)" - line 418, "pan.___", state 664, "(1)" - line 179, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 710, "(1)" - line 164, "pan.___", state 718, "(1)" - line 168, "pan.___", state 730, "(1)" - line 175, "pan.___", state 741, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 817, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 830, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 840, "(1)" - line 164, "pan.___", state 848, "(1)" - line 168, "pan.___", state 860, "(1)" - line 399, "pan.___", state 882, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 884, "(1)" - line 399, "pan.___", state 885, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 885, "else" - line 399, "pan.___", state 888, "(1)" - line 403, "pan.___", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 898, "(1)" - line 403, "pan.___", state 899, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 899, "else" - line 403, "pan.___", state 902, "(1)" - line 403, "pan.___", state 903, "(1)" - line 403, "pan.___", state 903, "(1)" - line 401, "pan.___", state 908, "((i<1))" - line 401, "pan.___", state 908, "((i>=1))" - line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 927, "(1)" - line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 928, "else" - line 409, "pan.___", state 931, "(1)" - line 409, "pan.___", state 932, "(1)" - line 409, "pan.___", state 932, "(1)" - line 413, "pan.___", state 940, "(1)" - line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 941, "else" - line 413, "pan.___", state 944, "(1)" - line 413, "pan.___", state 945, "(1)" - line 413, "pan.___", state 945, "(1)" - line 411, "pan.___", state 950, "((i<1))" - line 411, "pan.___", state 950, "((i>=1))" - line 418, "pan.___", state 957, "(1)" - line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 958, "else" - line 418, "pan.___", state 961, "(1)" - line 418, "pan.___", state 962, "(1)" - line 418, "pan.___", state 962, "(1)" - line 420, "pan.___", state 965, "(1)" - line 420, "pan.___", state 965, "(1)" - line 403, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1040, "(1)" - line 418, "pan.___", state 1057, "(1)" - line 403, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1130, "(1)" - line 418, "pan.___", state 1147, "(1)" - line 399, "pan.___", state 1166, "(1)" - line 403, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1222, "(1)" - line 418, "pan.___", state 1239, "(1)" - line 403, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1315, "(1)" - line 418, "pan.___", state 1332, "(1)" - line 179, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1378, "(1)" - line 164, "pan.___", state 1386, "(1)" - line 168, "pan.___", state 1398, "(1)" - line 175, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 1485, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1498, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1508, "(1)" - line 164, "pan.___", state 1516, "(1)" - line 168, "pan.___", state 1528, "(1)" - line 399, "pan.___", state 1550, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1552, "(1)" - line 399, "pan.___", state 1553, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1553, "else" - line 399, "pan.___", state 1556, "(1)" - line 403, "pan.___", state 1564, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 1566, "(1)" - line 403, "pan.___", state 1567, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 1567, "else" - line 403, "pan.___", state 1570, "(1)" - line 403, "pan.___", state 1571, "(1)" - line 403, "pan.___", state 1571, "(1)" - line 401, "pan.___", state 1576, "((i<1))" - line 401, "pan.___", state 1576, "((i>=1))" - line 408, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1595, "(1)" - line 409, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 1596, "else" - line 409, "pan.___", state 1599, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 413, "pan.___", state 1608, "(1)" - line 413, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 1609, "else" - line 413, "pan.___", state 1612, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 411, "pan.___", state 1618, "((i<1))" - line 411, "pan.___", state 1618, "((i>=1))" - line 418, "pan.___", state 1625, "(1)" - line 418, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 1626, "else" - line 418, "pan.___", state 1629, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 179, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1681, "(1)" - line 164, "pan.___", state 1689, "(1)" - line 168, "pan.___", state 1701, "(1)" - line 175, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 1788, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1801, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1811, "(1)" - line 164, "pan.___", state 1819, "(1)" - line 168, "pan.___", state 1831, "(1)" - line 702, "pan.___", state 1856, "-end-" - (158 of 1856 states) -unreached in proctype :init: - (0 of 46 states) -unreached in proctype :never: - line 751, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 3.36e+03 seconds -pan: rate 66138.803 states/second -pan: avg transition delay 9.1989e-07 usec -cp .input.spin urcu_progress_reader.spin.input -cp .input.spin.trail urcu_progress_reader.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.spin.input b/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.spin.input deleted file mode 100644 index 91b1126..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define READER_PROGRESS - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.spin.input.trail b/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.spin.input.trail deleted file mode 100644 index 7c42af1..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_progress_reader.spin.input.trail +++ /dev/null @@ -1,1270 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4401 -2:4:4353 -3:4:4356 -4:4:4356 -5:4:4359 -6:4:4367 -7:4:4367 -8:4:4370 -9:4:4376 -10:4:4380 -11:4:4380 -12:4:4383 -13:4:4391 -14:4:4395 -15:4:4396 -16:0:4401 -17:4:4398 -18:0:4401 -19:3:2479 -20:0:4401 -21:3:2485 -22:0:4401 -23:3:2486 -24:0:4401 -25:3:2487 -26:3:2491 -27:3:2492 -28:3:2500 -29:3:2501 -30:3:2505 -31:3:2506 -32:3:2514 -33:3:2519 -34:3:2523 -35:3:2524 -36:3:2531 -37:3:2532 -38:3:2543 -39:3:2544 -40:3:2545 -41:3:2556 -42:3:2561 -43:3:2562 -44:0:4401 -45:3:2574 -46:0:4401 -47:3:2576 -48:3:2577 -49:0:4401 -50:3:2581 -51:3:2585 -52:3:2586 -53:3:2594 -54:3:2595 -55:3:2599 -56:3:2600 -57:3:2608 -58:3:2613 -59:3:2614 -60:3:2625 -61:3:2626 -62:3:2637 -63:3:2638 -64:3:2639 -65:3:2650 -66:3:2655 -67:3:2656 -68:0:4401 -69:3:2668 -70:0:4401 -71:3:2670 -72:0:4401 -73:3:2671 -74:0:4401 -75:3:2681 -76:0:4401 -77:3:2682 -78:0:4401 -79:3:2686 -80:3:2687 -81:3:2691 -82:3:2695 -83:3:2696 -84:3:2700 -85:3:2708 -86:3:2709 -87:3:2714 -88:3:2721 -89:3:2722 -90:3:2729 -91:3:2734 -92:0:4401 -93:3:2745 -94:0:4401 -95:3:2749 -96:3:2750 -97:3:2754 -98:3:2758 -99:3:2759 -100:3:2763 -101:3:2771 -102:3:2772 -103:3:2777 -104:3:2784 -105:3:2785 -106:3:2792 -107:3:2797 -108:0:4401 -109:3:2808 -110:0:4401 -111:3:2816 -112:3:2817 -113:3:2821 -114:3:2825 -115:3:2826 -116:3:2830 -117:3:2838 -118:3:2839 -119:3:2844 -120:3:2851 -121:3:2852 -122:3:2859 -123:3:2864 -124:0:4401 -125:3:2879 -126:0:4401 -127:3:2881 -128:0:4401 -129:3:2882 -130:3:2886 -131:3:2887 -132:3:2895 -133:3:2896 -134:3:2900 -135:3:2901 -136:3:2909 -137:3:2914 -138:3:2918 -139:3:2919 -140:3:2926 -141:3:2927 -142:3:2938 -143:3:2939 -144:3:2940 -145:3:2951 -146:3:2956 -147:3:2957 -148:0:4401 -149:3:2969 -150:0:4401 -151:3:2971 -152:0:4401 -153:3:2974 -154:3:2975 -155:3:2987 -156:3:2988 -157:3:2992 -158:3:2993 -159:3:3001 -160:3:3006 -161:3:3010 -162:3:3011 -163:3:3018 -164:3:3019 -165:3:3030 -166:3:3031 -167:3:3032 -168:3:3043 -169:3:3048 -170:3:3049 -171:0:4401 -172:3:3061 -173:0:4401 -174:3:3063 -175:0:4401 -176:3:3064 -177:0:4401 -178:3:3065 -179:0:4401 -180:3:3066 -181:0:4401 -182:3:3067 -183:3:3071 -184:3:3072 -185:3:3080 -186:3:3081 -187:3:3085 -188:3:3086 -189:3:3094 -190:3:3099 -191:3:3103 -192:3:3104 -193:3:3111 -194:3:3112 -195:3:3123 -196:3:3124 -197:3:3125 -198:3:3136 -199:3:3141 -200:3:3142 -201:0:4401 -202:3:3154 -203:0:4401 -204:3:3356 -205:0:4401 -206:3:3454 -207:0:4401 -208:3:3455 -209:0:4401 -210:3:3459 -211:0:4401 -212:3:3465 -213:3:3469 -214:3:3470 -215:3:3478 -216:3:3479 -217:3:3483 -218:3:3484 -219:3:3492 -220:3:3497 -221:3:3501 -222:3:3502 -223:3:3509 -224:3:3510 -225:3:3521 -226:3:3522 -227:3:3523 -228:3:3534 -229:3:3539 -230:3:3540 -231:0:4401 -232:3:3552 -233:0:4401 -234:3:3554 -235:0:4401 -236:3:3555 -237:3:3559 -238:3:3560 -239:3:3568 -240:3:3569 -241:3:3573 -242:3:3574 -243:3:3582 -244:3:3587 -245:3:3591 -246:3:3592 -247:3:3599 -248:3:3600 -249:3:3611 -250:3:3612 -251:3:3613 -252:3:3624 -253:3:3629 -254:3:3630 -255:0:4401 -256:3:3642 -257:0:4401 -258:3:3644 -259:0:4401 -260:3:3647 -261:3:3648 -262:3:3660 -263:3:3661 -264:3:3665 -265:3:3666 -266:3:3674 -267:3:3679 -268:3:3683 -269:3:3684 -270:3:3691 -271:3:3692 -272:3:3703 -273:3:3704 -274:3:3705 -275:3:3716 -276:3:3721 -277:3:3722 -278:0:4401 -279:3:3734 -280:0:4401 -281:3:3736 -282:0:4401 -283:3:3737 -284:0:4401 -285:3:3738 -286:0:4401 -287:3:3739 -288:0:4401 -289:3:3740 -290:3:3744 -291:3:3745 -292:3:3753 -293:3:3754 -294:3:3758 -295:3:3759 -296:3:3767 -297:3:3772 -298:3:3776 -299:3:3777 -300:3:3784 -301:3:3785 -302:3:3796 -303:3:3797 -304:3:3798 -305:3:3809 -306:3:3814 -307:3:3815 -308:0:4401 -309:3:3827 -310:0:4401 -311:3:4029 -312:0:4401 -313:3:4127 -314:0:4401 -315:3:4128 -316:0:4401 -317:3:4132 -318:0:4401 -319:3:4138 -320:0:4401 -321:3:4142 -322:3:4143 -323:3:4147 -324:3:4151 -325:3:4152 -326:3:4156 -327:3:4164 -328:3:4165 -329:3:4170 -330:3:4177 -331:3:4178 -332:3:4185 -333:3:4190 -334:0:4401 -335:3:4201 -336:0:4401 -337:3:4205 -338:3:4206 -339:3:4210 -340:3:4214 -341:3:4215 -342:3:4219 -343:3:4227 -344:3:4228 -345:3:4233 -346:3:4240 -347:3:4241 -348:3:4248 -349:3:4253 -350:0:4401 -351:3:4264 -352:0:4401 -353:3:4272 -354:3:4273 -355:3:4277 -356:3:4281 -357:3:4282 -358:3:4286 -359:3:4294 -360:3:4295 -361:3:4300 -362:3:4307 -363:3:4308 -364:3:4315 -365:3:4320 -366:0:4401 -367:3:4335 -368:0:4401 -369:3:4337 -370:0:4401 -371:3:4338 -372:0:4401 -373:3:2486 -374:0:4401 -375:3:2487 -376:3:2491 -377:3:2492 -378:3:2500 -379:3:2501 -380:3:2505 -381:3:2506 -382:3:2514 -383:3:2519 -384:3:2523 -385:3:2524 -386:3:2531 -387:3:2532 -388:3:2543 -389:3:2544 -390:3:2545 -391:3:2556 -392:3:2561 -393:3:2562 -394:0:4401 -395:3:2574 -396:0:4401 -397:3:2576 -398:3:2577 -399:0:4401 -400:3:2581 -401:3:2585 -402:3:2586 -403:3:2594 -404:3:2595 -405:3:2599 -406:3:2600 -407:3:2608 -408:3:2613 -409:3:2614 -410:3:2625 -411:3:2626 -412:3:2637 -413:3:2638 -414:3:2639 -415:3:2650 -416:3:2655 -417:3:2656 -418:0:4401 -419:3:2668 -420:0:4401 -421:3:2670 -422:0:4401 -423:3:2671 -424:0:4401 -425:3:2681 -426:0:4401 -427:3:2682 -428:0:4401 -429:3:2686 -430:3:2687 -431:3:2691 -432:3:2695 -433:3:2696 -434:3:2700 -435:3:2708 -436:3:2709 -437:3:2714 -438:3:2721 -439:3:2722 -440:3:2729 -441:3:2734 -442:0:4401 -443:3:2745 -444:0:4401 -445:3:2749 -446:3:2750 -447:3:2754 -448:3:2758 -449:3:2759 -450:3:2763 -451:3:2771 -452:3:2772 -453:3:2777 -454:3:2784 -455:3:2785 -456:3:2792 -457:3:2797 -458:0:4401 -459:3:2808 -460:0:4401 -461:3:2816 -462:3:2817 -463:3:2821 -464:3:2825 -465:3:2826 -466:3:2830 -467:3:2838 -468:3:2839 -469:3:2844 -470:3:2851 -471:3:2852 -472:3:2859 -473:3:2864 -474:0:4401 -475:3:2879 -476:0:4401 -477:3:2881 -478:0:4401 -479:3:2882 -480:3:2886 -481:3:2887 -482:3:2895 -483:3:2896 -484:3:2900 -485:3:2901 -486:3:2909 -487:3:2914 -488:3:2918 -489:3:2919 -490:3:2926 -491:3:2927 -492:3:2938 -493:3:2939 -494:3:2940 -495:3:2951 -496:3:2956 -497:3:2957 -498:0:4401 -499:3:2969 -500:0:4401 -501:3:2971 -502:0:4401 -503:3:2974 -504:3:2975 -505:3:2987 -506:3:2988 -507:3:2992 -508:3:2993 -509:3:3001 -510:3:3006 -511:3:3010 -512:3:3011 -513:3:3018 -514:3:3019 -515:3:3030 -516:3:3031 -517:3:3032 -518:3:3043 -519:3:3048 -520:3:3049 -521:0:4401 -522:3:3061 -523:0:4401 -524:3:3063 -525:0:4401 -526:3:3064 -527:0:4401 -528:3:3065 -529:0:4401 -530:3:3066 -531:0:4401 -532:3:3067 -533:3:3071 -534:3:3072 -535:3:3080 -536:3:3081 -537:3:3085 -538:3:3086 -539:3:3094 -540:3:3099 -541:3:3103 -542:3:3104 -543:3:3111 -544:3:3112 -545:3:3123 -546:3:3124 -547:3:3125 -548:3:3136 -549:3:3141 -550:3:3142 -551:0:4401 -552:3:3154 -553:0:4401 -554:3:3356 -555:0:4401 -556:3:3454 -557:0:4401 -558:3:3455 -559:0:4401 -560:3:3459 -561:0:4401 -562:3:3465 -563:3:3469 -564:3:3470 -565:3:3478 -566:3:3479 -567:3:3483 -568:3:3484 -569:3:3492 -570:3:3497 -571:3:3501 -572:3:3502 -573:3:3509 -574:3:3510 -575:3:3521 -576:3:3522 -577:3:3523 -578:3:3534 -579:3:3539 -580:3:3540 -581:0:4401 -582:3:3552 -583:0:4401 -584:3:3554 -585:0:4401 -586:3:3555 -587:3:3559 -588:3:3560 -589:3:3568 -590:3:3569 -591:3:3573 -592:3:3574 -593:3:3582 -594:3:3587 -595:3:3591 -596:3:3592 -597:3:3599 -598:3:3600 -599:3:3611 -600:3:3612 -601:3:3613 -602:3:3624 -603:3:3629 -604:3:3630 -605:0:4401 -606:3:3642 -607:0:4401 -608:3:3644 -609:0:4401 -610:3:3647 -611:3:3648 -612:3:3660 -613:3:3661 -614:3:3665 -615:3:3666 -616:3:3674 -617:3:3679 -618:3:3683 -619:3:3684 -620:3:3691 -621:3:3692 -622:3:3703 -623:3:3704 -624:3:3705 -625:3:3716 -626:3:3721 -627:3:3722 -628:0:4401 -629:3:3734 -630:0:4401 -631:3:3736 -632:0:4401 -633:3:3737 -634:0:4401 -635:3:3738 -636:0:4401 -637:3:3739 -638:0:4401 -639:3:3740 -640:3:3744 -641:3:3745 -642:3:3753 -643:3:3754 -644:3:3758 -645:3:3759 -646:3:3767 -647:3:3772 -648:3:3776 -649:3:3777 -650:3:3784 -651:3:3785 -652:3:3796 -653:3:3797 -654:3:3798 -655:3:3809 -656:3:3814 -657:3:3815 -658:0:4401 -659:3:3827 -660:0:4401 -661:3:4029 -662:0:4401 -663:3:4127 -664:0:4401 -665:3:4128 -666:0:4401 -667:3:4132 -668:0:4401 -669:3:4138 -670:0:4401 -671:3:4142 -672:3:4143 -673:3:4147 -674:3:4151 -675:3:4152 -676:3:4156 -677:3:4164 -678:3:4165 -679:3:4170 -680:3:4177 -681:3:4178 -682:3:4185 -683:3:4190 -684:0:4401 -685:3:4201 -686:0:4401 -687:3:4205 -688:3:4206 -689:3:4210 -690:3:4214 -691:3:4215 -692:3:4219 -693:3:4227 -694:3:4228 -695:3:4233 -696:3:4240 -697:3:4241 -698:3:4248 -699:3:4253 -700:0:4401 -701:3:4264 -702:0:4401 -703:3:4272 -704:3:4273 -705:3:4277 -706:3:4281 -707:3:4282 -708:3:4286 -709:3:4294 -710:3:4295 -711:3:4300 -712:3:4307 -713:3:4308 -714:3:4315 -715:3:4320 -716:0:4401 -717:3:4335 -718:0:4401 -719:3:4337 -720:0:4401 -721:3:4338 -722:0:4401 -723:3:2486 -724:0:4401 -725:3:2487 -726:3:2491 -727:3:2492 -728:3:2500 -729:3:2501 -730:3:2505 -731:3:2506 -732:3:2514 -733:3:2519 -734:3:2523 -735:3:2524 -736:3:2531 -737:3:2532 -738:3:2543 -739:3:2544 -740:3:2545 -741:3:2556 -742:3:2561 -743:3:2562 -744:0:4401 -745:3:2574 -746:0:4401 -747:3:2576 -748:3:2577 -749:0:4401 -750:3:2581 -751:3:2585 -752:3:2586 -753:3:2594 -754:3:2595 -755:3:2599 -756:3:2600 -757:3:2608 -758:3:2613 -759:3:2614 -760:3:2625 -761:3:2626 -762:3:2637 -763:3:2638 -764:3:2639 -765:3:2650 -766:3:2655 -767:3:2656 -768:0:4401 -769:3:2668 -770:0:4401 -771:3:2670 -772:0:4401 -773:3:2671 -774:0:4401 -775:3:2681 -776:0:4401 -777:3:2682 -778:0:4401 -779:3:2686 -780:3:2687 -781:3:2691 -782:3:2695 -783:3:2696 -784:3:2700 -785:3:2708 -786:3:2709 -787:3:2714 -788:3:2721 -789:3:2722 -790:3:2729 -791:3:2734 -792:0:4401 -793:3:2745 -794:0:4401 -795:3:2749 -796:3:2750 -797:3:2754 -798:3:2758 -799:3:2759 -800:3:2763 -801:3:2771 -802:3:2772 -803:3:2777 -804:3:2784 -805:3:2785 -806:3:2792 -807:3:2797 -808:0:4401 -809:3:2808 -810:0:4401 -811:3:2816 -812:3:2817 -813:3:2821 -814:3:2825 -815:3:2826 -816:3:2830 -817:3:2838 -818:3:2839 -819:3:2844 -820:3:2851 -821:3:2852 -822:3:2859 -823:3:2864 -824:0:4401 -825:3:2879 -826:0:4401 -827:3:2881 -828:0:4401 -829:3:2882 -830:3:2886 -831:3:2887 -832:3:2895 -833:3:2896 -834:3:2900 -835:3:2901 -836:3:2909 -837:3:2914 -838:3:2918 -839:3:2919 -840:3:2926 -841:3:2927 -842:3:2938 -843:3:2939 -844:3:2940 -845:3:2951 -846:3:2956 -847:3:2957 -848:0:4401 -849:3:2969 -850:0:4401 -851:3:2971 -852:0:4401 -853:3:2974 -854:3:2975 -855:3:2987 -856:3:2988 -857:3:2992 -858:3:2993 -859:3:3001 -860:3:3006 -861:3:3010 -862:3:3011 -863:3:3018 -864:3:3019 -865:3:3030 -866:3:3031 -867:3:3032 -868:3:3043 -869:3:3048 -870:3:3049 -871:0:4401 -872:3:3061 -873:0:4401 -874:3:3063 -875:0:4401 -876:3:3064 -877:0:4401 -878:3:3065 -879:0:4401 -880:3:3066 -881:0:4401 -882:3:3067 -883:3:3071 -884:3:3072 -885:3:3080 -886:3:3081 -887:3:3085 -888:3:3086 -889:3:3094 -890:3:3099 -891:3:3103 -892:3:3104 -893:3:3111 -894:3:3112 -895:3:3123 -896:3:3124 -897:3:3125 -898:3:3136 -899:3:3141 -900:3:3142 -901:0:4401 -902:3:3154 -903:0:4401 -904:3:3356 -905:0:4401 -906:3:3454 -907:0:4401 -908:3:3455 -909:0:4401 -910:3:3459 -911:0:4401 -912:3:3465 -913:3:3469 -914:3:3470 -915:3:3478 -916:3:3479 -917:3:3483 -918:3:3484 -919:3:3492 -920:3:3497 -921:3:3501 -922:3:3502 -923:3:3509 -924:3:3510 -925:3:3521 -926:3:3522 -927:3:3523 -928:3:3534 -929:3:3539 -930:3:3540 -931:0:4401 -932:3:3552 -933:0:4401 -934:3:3554 -935:0:4401 -936:3:3555 -937:3:3559 -938:3:3560 -939:3:3568 -940:3:3569 -941:3:3573 -942:3:3574 -943:3:3582 -944:3:3587 -945:3:3591 -946:3:3592 -947:3:3599 -948:3:3600 -949:3:3611 -950:3:3612 -951:3:3613 -952:3:3624 -953:3:3629 -954:3:3630 -955:0:4401 -956:3:3642 -957:0:4401 -958:3:3644 -959:0:4401 -960:3:3647 -961:3:3648 -962:3:3660 -963:3:3661 -964:3:3665 -965:3:3666 -966:3:3674 -967:3:3679 -968:3:3683 -969:3:3684 -970:3:3691 -971:3:3692 -972:3:3703 -973:3:3704 -974:3:3705 -975:3:3716 -976:3:3721 -977:3:3722 -978:0:4401 -979:3:3734 -980:0:4401 -981:3:3736 -982:0:4401 -983:3:3737 -984:0:4401 -985:3:3738 -986:0:4401 -987:3:3739 -988:0:4401 -989:3:3740 -990:3:3744 -991:3:3745 -992:3:3753 -993:3:3754 -994:3:3758 -995:3:3759 -996:3:3767 -997:3:3772 -998:3:3776 -999:3:3777 -1000:3:3784 -1001:3:3785 -1002:3:3796 -1003:3:3797 -1004:3:3798 -1005:3:3809 -1006:3:3814 -1007:3:3815 -1008:0:4401 -1009:3:3827 -1010:0:4401 -1011:3:4029 -1012:0:4401 -1013:3:4127 -1014:0:4401 -1015:3:4128 -1016:0:4401 -1017:3:4132 -1018:0:4401 -1019:3:4138 -1020:0:4401 -1021:3:4142 -1022:3:4143 -1023:3:4147 -1024:3:4151 -1025:3:4152 -1026:3:4156 -1027:3:4164 -1028:3:4165 -1029:3:4170 -1030:3:4177 -1031:3:4178 -1032:3:4185 -1033:3:4190 -1034:0:4401 -1035:3:4201 -1036:0:4401 -1037:3:4205 -1038:3:4206 -1039:3:4210 -1040:3:4214 -1041:3:4215 -1042:3:4219 -1043:3:4227 -1044:3:4228 -1045:3:4233 -1046:3:4240 -1047:3:4241 -1048:3:4248 -1049:3:4253 -1050:0:4401 -1051:3:4264 -1052:0:4401 -1053:3:4272 -1054:3:4273 -1055:3:4277 -1056:3:4281 -1057:3:4282 -1058:3:4286 -1059:3:4294 -1060:3:4295 -1061:3:4300 -1062:3:4307 -1063:3:4308 -1064:3:4315 -1065:3:4320 -1066:0:4401 -1067:3:4335 -1068:0:4401 -1069:3:4337 -1070:0:4401 -1071:3:4338 -1072:0:4401 -1073:3:4341 -1074:0:4401 -1075:3:4346 -1076:0:4401 -1077:2:1236 -1078:0:4401 -1079:3:4347 -1080:0:4401 -1081:2:1242 -1082:0:4401 -1083:3:4346 -1084:0:4401 -1085:2:1243 -1086:0:4401 -1087:3:4347 -1088:0:4401 -1089:2:1244 -1090:0:4401 -1091:3:4346 -1092:0:4401 -1093:2:1245 -1094:0:4401 -1095:3:4347 -1096:0:4401 -1097:1:2 -1098:0:4401 -1099:3:4346 -1100:0:4401 -1101:2:1246 -1102:0:4401 -1103:3:4347 -1104:0:4401 -1105:1:8 -1106:0:4401 -1107:3:4346 -1108:0:4401 -1109:2:1245 -1110:0:4401 -1111:3:4347 -1112:0:4401 -1113:1:9 -1114:0:4401 -1115:3:4346 -1116:0:4401 -1117:2:1246 -1118:0:4401 -1119:3:4347 -1120:0:4401 -1121:1:10 -1122:0:4401 -1123:3:4346 -1124:0:4401 -1125:2:1245 -1126:0:4401 -1127:3:4347 -1128:0:4401 -1129:1:11 -1130:0:4401 -1131:3:4346 -1132:0:4401 -1133:2:1246 -1134:0:4401 -1135:3:4347 -1136:0:4401 -1137:1:14 -1138:0:4401 -1139:3:4346 -1140:0:4401 -1141:2:1245 -1142:0:4401 -1143:3:4347 -1144:0:4401 -1145:1:15 -1146:0:4401 -1147:3:4346 -1148:0:4401 -1149:2:1246 -1150:0:4401 -1151:3:4347 -1152:0:4401 -1153:1:16 -1154:1:20 -1155:1:21 -1156:1:29 -1157:1:30 -1158:1:34 -1159:1:35 -1160:1:43 -1161:1:48 -1162:1:52 -1163:1:53 -1164:1:60 -1165:1:61 -1166:1:72 -1167:1:73 -1168:1:74 -1169:1:85 -1170:1:90 -1171:1:91 -1172:0:4401 -1173:3:4346 -1174:0:4401 -1175:2:1245 -1176:0:4401 -1177:3:4347 -1178:0:4401 -1179:1:103 -1180:0:4401 -1181:3:4346 -1182:0:4401 -1183:2:1246 -1184:0:4401 -1185:3:4347 -1186:0:4401 -1187:2:1247 -1188:0:4401 -1189:3:4346 -1190:0:4401 -1191:2:1253 -1192:0:4401 -1193:3:4347 -1194:0:4401 -1195:2:1254 -1196:0:4399 -1197:3:4346 -1198:0:4405 -1199:3:4347 -1200:0:4405 -1201:2:1257 -1202:0:4405 -1203:3:4346 -1204:0:4405 -1205:2:1258 -1206:0:4405 -1207:3:4347 -1208:0:4405 -1209:2:1259 -1210:2:1263 -1211:2:1264 -1212:2:1272 -1213:2:1273 -1214:2:1277 -1215:2:1278 -1216:2:1286 -1217:2:1291 -1218:2:1295 -1219:2:1296 -1220:2:1303 -1221:2:1304 -1222:2:1315 -1223:2:1316 -1224:2:1317 -1225:2:1328 -1226:2:1333 -1227:2:1334 -1228:0:4405 -1229:3:4346 -1230:0:4405 -1231:2:1346 -1232:0:4405 -1233:3:4347 -1234:0:4405 -1235:2:1347 -1236:0:4405 -1237:3:4346 -1238:0:4405 -1239:1:104 --1:-1:-1 -1240:0:4405 -1241:3:4347 -1242:0:4405 -1243:3:4346 -1244:0:4405 -1245:2:1348 -1246:0:4405 -1247:3:4347 -1248:0:4405 -1249:2:1347 -1250:0:4405 -1251:3:4346 -1252:0:4405 -1253:1:105 -1254:0:4405 -1255:3:4347 -1256:0:4405 -1257:3:4346 -1258:0:4405 -1259:2:1348 -1260:0:4405 -1261:3:4347 -1262:0:4405 -1263:2:1347 -1264:0:4405 -1265:3:4346 -1266:0:4405 -1267:1:104 diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.define b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.log b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.log deleted file mode 100644 index fc83245..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.log +++ /dev/null @@ -1,524 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -depth 15: Claim reached state 9 (line 749) -depth 1194: Claim reached state 9 (line 748) -Depth= 3253 States= 1e+06 Transitions= 1.06e+07 Memory= 484.416 t= 9.64 R= 1e+05 -Depth= 3253 States= 2e+06 Transitions= 2.04e+07 Memory= 501.311 t= 18.6 R= 1e+05 -Depth= 3253 States= 3e+06 Transitions= 3.44e+07 Memory= 516.252 t= 31.6 R= 9e+04 -pan: resizing hashtable to -w22.. done -Depth= 7995 States= 4e+06 Transitions= 4.66e+07 Memory= 563.486 t= 42.8 R= 9e+04 -Depth= 7995 States= 5e+06 Transitions= 6.05e+07 Memory= 580.674 t= 55.6 R= 9e+04 -Depth= 7995 States= 6e+06 Transitions= 7.12e+07 Memory= 599.229 t= 65.5 R= 9e+04 -Depth= 7995 States= 7e+06 Transitions= 8.58e+07 Memory= 613.975 t= 78.9 R= 9e+04 -Depth= 7995 States= 8e+06 Transitions= 9.62e+07 Memory= 631.846 t= 88.7 R= 9e+04 -Depth= 7995 States= 9e+06 Transitions= 1.1e+08 Memory= 646.592 t= 101 R= 9e+04 -pan: resizing hashtable to -w24.. done -Depth= 7995 States= 1e+07 Transitions= 1.32e+08 Memory= 783.869 t= 122 R= 8e+04 -Depth= 7995 States= 1.1e+07 Transitions= 1.52e+08 Memory= 799.104 t= 140 R= 8e+04 -Depth= 7995 States= 1.2e+07 Transitions= 1.71e+08 Memory= 814.533 t= 157 R= 8e+04 -Depth= 7995 States= 1.3e+07 Transitions= 1.9e+08 Memory= 829.670 t= 174 R= 7e+04 -Depth= 7995 States= 1.4e+07 Transitions= 2.01e+08 Memory= 848.029 t= 185 R= 8e+04 -Depth= 7995 States= 1.5e+07 Transitions= 2.21e+08 Memory= 862.287 t= 203 R= 7e+04 -Depth= 7995 States= 1.6e+07 Transitions= 2.35e+08 Memory= 877.815 t= 215 R= 7e+04 -Depth= 7995 States= 1.7e+07 Transitions= 2.44e+08 Memory= 897.736 t= 223 R= 8e+04 -Depth= 7995 States= 1.8e+07 Transitions= 2.57e+08 Memory= 911.115 t= 235 R= 8e+04 -Depth= 7995 States= 1.9e+07 Transitions= 2.69e+08 Memory= 927.033 t= 246 R= 8e+04 -Depth= 8341 States= 2e+07 Transitions= 2.83e+08 Memory= 943.440 t= 259 R= 8e+04 -Depth= 8341 States= 2.1e+07 Transitions= 2.96e+08 Memory= 961.604 t= 271 R= 8e+04 -Depth= 8341 States= 2.2e+07 Transitions= 3.07e+08 Memory= 978.791 t= 281 R= 8e+04 -Depth= 8341 States= 2.3e+07 Transitions= 3.2e+08 Memory= 996.369 t= 293 R= 8e+04 -Depth= 8341 States= 2.4e+07 Transitions= 3.32e+08 Memory= 1013.264 t= 304 R= 8e+04 -Depth= 8341 States= 2.5e+07 Transitions= 3.48e+08 Memory= 1024.885 t= 319 R= 8e+04 -Depth= 8341 States= 2.6e+07 Transitions= 3.72e+08 Memory= 1038.947 t= 341 R= 8e+04 -Depth= 8341 States= 2.7e+07 Transitions= 3.91e+08 Memory= 1055.158 t= 358 R= 8e+04 -Depth= 8341 States= 2.8e+07 Transitions= 4.09e+08 Memory= 1069.904 t= 374 R= 7e+04 -Depth= 8341 States= 2.9e+07 Transitions= 4.25e+08 Memory= 1086.701 t= 389 R= 7e+04 -Depth= 8341 States= 3e+07 Transitions= 4.43e+08 Memory= 1102.131 t= 405 R= 7e+04 -Depth= 8341 States= 3.1e+07 Transitions= 4.58e+08 Memory= 1117.268 t= 419 R= 7e+04 -Depth= 8341 States= 3.2e+07 Transitions= 4.68e+08 Memory= 1136.213 t= 429 R= 7e+04 -Depth= 8341 States= 3.3e+07 Transitions= 4.8e+08 Memory= 1151.154 t= 440 R= 8e+04 -Depth= 8341 States= 3.4e+07 Transitions= 4.92e+08 Memory= 1166.779 t= 451 R= 8e+04 -pan: resizing hashtable to -w26.. done -Depth= 8687 States= 3.5e+07 Transitions= 5.05e+08 Memory= 1679.658 t= 464 R= 8e+04 -Depth= 8687 States= 3.6e+07 Transitions= 5.18e+08 Memory= 1697.432 t= 477 R= 8e+04 -Depth= 8687 States= 3.7e+07 Transitions= 5.29e+08 Memory= 1714.326 t= 487 R= 8e+04 -Depth= 8687 States= 3.8e+07 Transitions= 5.44e+08 Memory= 1730.244 t= 500 R= 8e+04 -Depth= 8687 States= 3.9e+07 Transitions= 5.55e+08 Memory= 1747.920 t= 511 R= 8e+04 -Depth= 8687 States= 4e+07 Transitions= 5.69e+08 Memory= 1761.885 t= 523 R= 8e+04 -Depth= 8687 States= 4.1e+07 Transitions= 5.92e+08 Memory= 1775.850 t= 544 R= 8e+04 -Depth= 8687 States= 4.2e+07 Transitions= 6.12e+08 Memory= 1790.498 t= 562 R= 7e+04 -Depth= 8687 States= 4.3e+07 Transitions= 6.29e+08 Memory= 1807.783 t= 578 R= 7e+04 -Depth= 8687 States= 4.4e+07 Transitions= 6.48e+08 Memory= 1822.432 t= 595 R= 7e+04 -Depth= 8687 States= 4.5e+07 Transitions= 6.61e+08 Memory= 1838.838 t= 606 R= 7e+04 -Depth= 8687 States= 4.6e+07 Transitions= 6.81e+08 Memory= 1853.291 t= 625 R= 7e+04 -Depth= 8687 States= 4.7e+07 Transitions= 6.93e+08 Memory= 1870.772 t= 635 R= 7e+04 -Depth= 8687 States= 4.8e+07 Transitions= 7.02e+08 Memory= 1889.912 t= 644 R= 7e+04 -Depth= 8687 States= 4.9e+07 Transitions= 7.15e+08 Memory= 1902.998 t= 656 R= 7e+04 -Depth= 8687 States= 5e+07 Transitions= 7.27e+08 Memory= 1919.600 t= 667 R= 7e+04 -Depth= 9033 States= 5.1e+07 Transitions= 7.42e+08 Memory= 1935.518 t= 681 R= 7e+04 -Depth= 9033 States= 5.2e+07 Transitions= 7.53e+08 Memory= 1954.170 t= 691 R= 8e+04 -Depth= 9033 States= 5.3e+07 Transitions= 7.66e+08 Memory= 1969.990 t= 703 R= 8e+04 -Depth= 9033 States= 5.4e+07 Transitions= 7.77e+08 Memory= 1988.545 t= 713 R= 8e+04 -Depth= 9033 States= 5.5e+07 Transitions= 7.9e+08 Memory= 2004.756 t= 725 R= 8e+04 -Depth= 9033 States= 5.6e+07 Transitions= 8.1e+08 Memory= 2016.084 t= 743 R= 8e+04 -Depth= 9033 States= 5.7e+07 Transitions= 8.32e+08 Memory= 2030.440 t= 763 R= 7e+04 -Depth= 9033 States= 5.8e+07 Transitions= 8.51e+08 Memory= 2046.260 t= 781 R= 7e+04 -Depth= 9033 States= 5.9e+07 Transitions= 8.7e+08 Memory= 2061.592 t= 797 R= 7e+04 -Depth= 9033 States= 6e+07 Transitions= 8.83e+08 Memory= 2078.779 t= 809 R= 7e+04 -Depth= 9033 States= 6.1e+07 Transitions= 9.01e+08 Memory= 2094.014 t= 826 R= 7e+04 -Depth= 9033 States= 6.2e+07 Transitions= 9.16e+08 Memory= 2108.467 t= 840 R= 7e+04 -Depth= 9033 States= 6.3e+07 Transitions= 9.26e+08 Memory= 2126.924 t= 849 R= 7e+04 -Depth= 9033 States= 6.4e+07 Transitions= 9.38e+08 Memory= 2142.158 t= 860 R= 7e+04 -Depth= 9033 States= 6.5e+07 Transitions= 9.51e+08 Memory= 2157.295 t= 871 R= 7e+04 -Depth= 9379 States= 6.6e+07 Transitions= 9.63e+08 Memory= 2173.115 t= 883 R= 7e+04 -Depth= 9379 States= 6.7e+07 Transitions= 9.77e+08 Memory= 2190.401 t= 895 R= 7e+04 -Depth= 9379 States= 6.8e+07 Transitions= 9.88e+08 Memory= 2208.955 t= 905 R= 8e+04 -Depth= 9379 States= 6.9e+07 Transitions= 1e+09 Memory= 2223.311 t= 919 R= 8e+04 -Depth= 9379 States= 7e+07 Transitions= 1.01e+09 Memory= 2242.256 t= 928 R= 8e+04 -Depth= 9379 States= 7.1e+07 Transitions= 1.03e+09 Memory= 2257.295 t= 940 R= 8e+04 -Depth= 9379 States= 7.2e+07 Transitions= 1.05e+09 Memory= 2269.307 t= 960 R= 8e+04 -Depth= 9379 States= 7.3e+07 Transitions= 1.07e+09 Memory= 2283.760 t= 979 R= 7e+04 -Depth= 9379 States= 7.4e+07 Transitions= 1.09e+09 Memory= 2299.385 t= 996 R= 7e+04 -Depth= 9379 States= 7.5e+07 Transitions= 1.11e+09 Memory= 2314.619 t= 1.01e+03 R= 7e+04 -Depth= 9379 States= 7.6e+07 Transitions= 1.12e+09 Memory= 2333.369 t= 1.02e+03 R= 7e+04 -Depth= 9379 States= 7.7e+07 Transitions= 1.14e+09 Memory= 2347.139 t= 1.04e+03 R= 7e+04 -Depth= 9379 States= 7.8e+07 Transitions= 1.15e+09 Memory= 2385.029 t= 1.06e+03 R= 7e+04 -Depth= 9379 States= 7.9e+07 Transitions= 1.17e+09 Memory= 2453.682 t= 1.07e+03 R= 7e+04 -Depth= 9379 States= 8e+07 Transitions= 1.18e+09 Memory= 2522.236 t= 1.08e+03 R= 7e+04 -Depth= 9379 States= 8.1e+07 Transitions= 1.2e+09 Memory= 2590.889 t= 1.1e+03 R= 7e+04 -Depth= 9379 States= 8.2e+07 Transitions= 1.22e+09 Memory= 2624.287 t= 1.12e+03 R= 7e+04 -Depth= 9379 States= 8.3e+07 Transitions= 1.23e+09 Memory= 2640.303 t= 1.13e+03 R= 7e+04 -Depth= 9379 States= 8.4e+07 Transitions= 1.25e+09 Memory= 2654.170 t= 1.15e+03 R= 7e+04 -Depth= 9379 States= 8.5e+07 Transitions= 1.27e+09 Memory= 2669.111 t= 1.16e+03 R= 7e+04 -Depth= 9379 States= 8.6e+07 Transitions= 1.29e+09 Memory= 2684.053 t= 1.18e+03 R= 7e+04 -Depth= 9379 States= 8.7e+07 Transitions= 1.31e+09 Memory= 2698.604 t= 1.2e+03 R= 7e+04 -Depth= 9379 States= 8.8e+07 Transitions= 1.33e+09 Memory= 2719.697 t= 1.22e+03 R= 7e+04 -Depth= 9379 States= 8.9e+07 Transitions= 1.35e+09 Memory= 2788.350 t= 1.24e+03 R= 7e+04 -Depth= 9379 States= 9e+07 Transitions= 1.37e+09 Memory= 2819.990 t= 1.26e+03 R= 7e+04 -Depth= 9379 States= 9.1e+07 Transitions= 1.39e+09 Memory= 2846.553 t= 1.27e+03 R= 7e+04 -Depth= 9379 States= 9.2e+07 Transitions= 1.4e+09 Memory= 2864.912 t= 1.28e+03 R= 7e+04 -Depth= 9379 States= 9.3e+07 Transitions= 1.41e+09 Memory= 2877.901 t= 1.3e+03 R= 7e+04 -Depth= 9379 States= 9.4e+07 Transitions= 1.44e+09 Memory= 2892.842 t= 1.31e+03 R= 7e+04 -Depth= 9379 States= 9.5e+07 Transitions= 1.45e+09 Memory= 2908.076 t= 1.33e+03 R= 7e+04 -Depth= 9379 States= 9.6e+07 Transitions= 1.47e+09 Memory= 2922.627 t= 1.35e+03 R= 7e+04 -Depth= 9379 States= 9.7e+07 Transitions= 1.49e+09 Memory= 2940.693 t= 1.36e+03 R= 7e+04 -Depth= 9379 States= 9.8e+07 Transitions= 1.51e+09 Memory= 2953.291 t= 1.38e+03 R= 7e+04 -Depth= 9379 States= 9.9e+07 Transitions= 1.53e+09 Memory= 2968.526 t= 1.4e+03 R= 7e+04 -Depth= 9379 States= 1e+08 Transitions= 1.56e+09 Memory= 2981.709 t= 1.42e+03 R= 7e+04 -Depth= 9379 States= 1.01e+08 Transitions= 1.57e+09 Memory= 2997.236 t= 1.44e+03 R= 7e+04 -Depth= 9379 States= 1.02e+08 Transitions= 1.59e+09 Memory= 3011.592 t= 1.46e+03 R= 7e+04 -Depth= 9379 States= 1.03e+08 Transitions= 1.61e+09 Memory= 3037.861 t= 1.47e+03 R= 7e+04 -Depth= 9379 States= 1.04e+08 Transitions= 1.63e+09 Memory= 3106.514 t= 1.49e+03 R= 7e+04 -Depth= 9379 States= 1.05e+08 Transitions= 1.65e+09 Memory= 3175.166 t= 1.51e+03 R= 7e+04 -Depth= 9379 States= 1.06e+08 Transitions= 1.67e+09 Memory= 3223.897 t= 1.52e+03 R= 7e+04 -Depth= 9379 States= 1.07e+08 Transitions= 1.68e+09 Memory= 3246.846 t= 1.54e+03 R= 7e+04 -Depth= 9379 States= 1.08e+08 Transitions= 1.7e+09 Memory= 3283.467 t= 1.56e+03 R= 7e+04 -Depth= 9379 States= 1.09e+08 Transitions= 1.72e+09 Memory= 3316.670 t= 1.57e+03 R= 7e+04 -Depth= 9379 States= 1.1e+08 Transitions= 1.73e+09 Memory= 3344.209 t= 1.59e+03 R= 7e+04 -Depth= 9379 States= 1.11e+08 Transitions= 1.75e+09 Memory= 3376.338 t= 1.6e+03 R= 7e+04 -Depth= 9379 States= 1.12e+08 Transitions= 1.76e+09 Memory= 3396.943 t= 1.62e+03 R= 7e+04 -Depth= 9379 States= 1.13e+08 Transitions= 1.78e+09 Memory= 3426.143 t= 1.63e+03 R= 7e+04 -Depth= 9379 States= 1.14e+08 Transitions= 1.8e+09 Memory= 3452.705 t= 1.65e+03 R= 7e+04 -Depth= 9379 States= 1.15e+08 Transitions= 1.81e+09 Memory= 3493.818 t= 1.66e+03 R= 7e+04 -Depth= 9379 States= 1.16e+08 Transitions= 1.83e+09 Memory= 3533.369 t= 1.67e+03 R= 7e+04 -Depth= 9379 States= 1.17e+08 Transitions= 1.84e+09 Memory= 3566.182 t= 1.69e+03 R= 7e+04 -Depth= 9379 States= 1.18e+08 Transitions= 1.86e+09 Memory= 3582.881 t= 1.7e+03 R= 7e+04 -Depth= 9379 States= 1.19e+08 Transitions= 1.88e+09 Memory= 3630.830 t= 1.72e+03 R= 7e+04 -Depth= 9379 States= 1.2e+08 Transitions= 1.89e+09 Memory= 3692.744 t= 1.74e+03 R= 7e+04 -Depth= 9379 States= 1.21e+08 Transitions= 1.91e+09 Memory= 3750.361 t= 1.75e+03 R= 7e+04 -Depth= 9379 States= 1.22e+08 Transitions= 1.92e+09 Memory= 3767.354 t= 1.76e+03 R= 7e+04 -Depth= 9379 States= 1.23e+08 Transitions= 1.94e+09 Memory= 3781.904 t= 1.78e+03 R= 7e+04 -Depth= 9379 States= 1.24e+08 Transitions= 1.96e+09 Memory= 3797.529 t= 1.8e+03 R= 7e+04 -Depth= 9379 States= 1.25e+08 Transitions= 1.98e+09 Memory= 3810.908 t= 1.82e+03 R= 7e+04 -Depth= 9379 States= 1.26e+08 Transitions= 2e+09 Memory= 3826.143 t= 1.83e+03 R= 7e+04 -Depth= 9379 States= 1.27e+08 Transitions= 2.02e+09 Memory= 3839.717 t= 1.86e+03 R= 7e+04 -Depth= 9379 States= 1.28e+08 Transitions= 2.04e+09 Memory= 3881.709 t= 1.87e+03 R= 7e+04 -Depth= 9379 States= 1.29e+08 Transitions= 2.06e+09 Memory= 3946.553 t= 1.89e+03 R= 7e+04 -Depth= 9379 States= 1.3e+08 Transitions= 2.08e+09 Memory= 3970.479 t= 1.91e+03 R= 7e+04 -Depth= 9379 States= 1.31e+08 Transitions= 2.09e+09 Memory= 3991.768 t= 1.92e+03 R= 7e+04 -Depth= 9379 States= 1.32e+08 Transitions= 2.1e+09 Memory= 4007.490 t= 1.93e+03 R= 7e+04 -Depth= 9379 States= 1.33e+08 Transitions= 2.13e+09 Memory= 4020.772 t= 1.95e+03 R= 7e+04 -Depth= 9379 States= 1.34e+08 Transitions= 2.14e+09 Memory= 4036.201 t= 1.97e+03 R= 7e+04 -Depth= 9379 States= 1.35e+08 Transitions= 2.16e+09 Memory= 4051.924 t= 1.98e+03 R= 7e+04 -pan: resizing hashtable to -w28.. done -Depth= 9379 States= 1.36e+08 Transitions= 2.18e+09 Memory= 6099.924 t= 2.02e+03 R= 7e+04 -Depth= 9379 States= 1.37e+08 Transitions= 2.2e+09 Memory= 6099.924 t= 2.03e+03 R= 7e+04 -Depth= 9379 States= 1.38e+08 Transitions= 2.22e+09 Memory= 6099.924 t= 2.05e+03 R= 7e+04 -Depth= 9379 States= 1.39e+08 Transitions= 2.24e+09 Memory= 6099.924 t= 2.07e+03 R= 7e+04 -Depth= 9379 States= 1.4e+08 Transitions= 2.26e+09 Memory= 6108.518 t= 2.09e+03 R= 7e+04 -Depth= 9379 States= 1.41e+08 Transitions= 2.28e+09 Memory= 6124.729 t= 2.1e+03 R= 7e+04 -Depth= 9379 States= 1.42e+08 Transitions= 2.3e+09 Memory= 6138.889 t= 2.12e+03 R= 7e+04 -Depth= 9379 States= 1.43e+08 Transitions= 2.31e+09 Memory= 6178.928 t= 2.13e+03 R= 7e+04 -Depth= 9379 States= 1.44e+08 Transitions= 2.33e+09 Memory= 6247.483 t= 2.15e+03 R= 7e+04 -Depth= 9379 States= 1.45e+08 Transitions= 2.35e+09 Memory= 6316.135 t= 2.17e+03 R= 7e+04 -Depth= 9379 States= 1.46e+08 Transitions= 2.37e+09 Memory= 6353.440 t= 2.19e+03 R= 7e+04 -Depth= 9379 States= 1.47e+08 Transitions= 2.39e+09 Memory= 6381.662 t= 2.21e+03 R= 7e+04 -Depth= 9379 States= 1.48e+08 Transitions= 2.41e+09 Memory= 6422.190 t= 2.22e+03 R= 7e+04 -Depth= 9379 States= 1.49e+08 Transitions= 2.42e+09 Memory= 6449.143 t= 2.23e+03 R= 7e+04 -Depth= 9379 States= 1.5e+08 Transitions= 2.44e+09 Memory= 6472.580 t= 2.25e+03 R= 7e+04 -Depth= 9379 States= 1.51e+08 Transitions= 2.45e+09 Memory= 6503.733 t= 2.26e+03 R= 7e+04 -Depth= 9379 States= 1.52e+08 Transitions= 2.47e+09 Memory= 6531.369 t= 2.28e+03 R= 7e+04 -Depth= 9379 States= 1.53e+08 Transitions= 2.49e+09 Memory= 6554.123 t= 2.29e+03 R= 7e+04 -Depth= 9379 States= 1.54e+08 Transitions= 2.5e+09 Memory= 6585.373 t= 2.31e+03 R= 7e+04 -Depth= 9379 States= 1.55e+08 Transitions= 2.52e+09 Memory= 6622.776 t= 2.32e+03 R= 7e+04 -Depth= 9379 States= 1.56e+08 Transitions= 2.54e+09 Memory= 6671.213 t= 2.34e+03 R= 7e+04 -Depth= 9379 States= 1.57e+08 Transitions= 2.55e+09 Memory= 6696.115 t= 2.35e+03 R= 7e+04 -Depth= 9379 States= 1.58e+08 Transitions= 2.57e+09 Memory= 6722.776 t= 2.37e+03 R= 7e+04 -Depth= 9379 States= 1.59e+08 Transitions= 2.58e+09 Memory= 6764.572 t= 2.38e+03 R= 7e+04 -Depth= 9379 States= 1.6e+08 Transitions= 2.6e+09 Memory= 6830.490 t= 2.4e+03 R= 7e+04 -Depth= 9379 States= 1.61e+08 Transitions= 2.62e+09 Memory= 6879.026 t= 2.41e+03 R= 7e+04 -Depth= 9379 States= 1.62e+08 Transitions= 2.63e+09 Memory= 6895.432 t= 2.42e+03 R= 7e+04 -Depth= 9379 States= 1.63e+08 Transitions= 2.65e+09 Memory= 6909.787 t= 2.44e+03 R= 7e+04 -Depth= 9379 States= 1.64e+08 Transitions= 2.67e+09 Memory= 6925.217 t= 2.46e+03 R= 7e+04 -Depth= 9379 States= 1.65e+08 Transitions= 2.69e+09 Memory= 6938.986 t= 2.48e+03 R= 7e+04 -Depth= 9379 States= 1.66e+08 Transitions= 2.71e+09 Memory= 6953.537 t= 2.5e+03 R= 7e+04 -Depth= 9379 States= 1.67e+08 Transitions= 2.73e+09 Memory= 6967.893 t= 2.52e+03 R= 7e+04 -Depth= 9379 States= 1.68e+08 Transitions= 2.75e+09 Memory= 7022.190 t= 2.53e+03 R= 7e+04 -Depth= 9379 States= 1.69e+08 Transitions= 2.77e+09 Memory= 7076.779 t= 2.55e+03 R= 7e+04 -Depth= 9379 States= 1.7e+08 Transitions= 2.79e+09 Memory= 7102.365 t= 2.57e+03 R= 7e+04 -Depth= 9379 States= 1.71e+08 Transitions= 2.8e+09 Memory= 7119.162 t= 2.58e+03 R= 7e+04 -Depth= 9379 States= 1.72e+08 Transitions= 2.81e+09 Memory= 7135.178 t= 2.59e+03 R= 7e+04 -Depth= 9379 States= 1.73e+08 Transitions= 2.84e+09 Memory= 7150.022 t= 2.61e+03 R= 7e+04 -Depth= 9379 States= 1.74e+08 Transitions= 2.85e+09 Memory= 7164.475 t= 2.63e+03 R= 7e+04 -Depth= 9379 States= 1.75e+08 Transitions= 2.87e+09 Memory= 7180.295 t= 2.64e+03 R= 7e+04 -Depth= 9379 States= 1.76e+08 Transitions= 2.89e+09 Memory= 7198.264 t= 2.66e+03 R= 7e+04 -Depth= 9379 States= 1.77e+08 Transitions= 2.9e+09 Memory= 7211.447 t= 2.67e+03 R= 7e+04 -Depth= 9379 States= 1.78e+08 Transitions= 2.93e+09 Memory= 7224.338 t= 2.7e+03 R= 7e+04 -Depth= 9379 States= 1.79e+08 Transitions= 2.95e+09 Memory= 7239.084 t= 2.72e+03 R= 7e+04 -Depth= 9379 States= 1.8e+08 Transitions= 2.97e+09 Memory= 7253.342 t= 2.74e+03 R= 7e+04 -Depth= 9379 States= 1.81e+08 Transitions= 2.99e+09 Memory= 7268.283 t= 2.75e+03 R= 7e+04 -Depth= 9379 States= 1.82e+08 Transitions= 3.01e+09 Memory= 7283.615 t= 2.77e+03 R= 7e+04 -Depth= 9379 States= 1.83e+08 Transitions= 3.02e+09 Memory= 7335.276 t= 2.78e+03 R= 7e+04 -Depth= 9379 States= 1.84e+08 Transitions= 3.04e+09 Memory= 7403.928 t= 2.8e+03 R= 7e+04 -Depth= 9379 States= 1.85e+08 Transitions= 3.06e+09 Memory= 7472.580 t= 2.82e+03 R= 7e+04 -Depth= 9379 States= 1.86e+08 Transitions= 3.08e+09 Memory= 7501.877 t= 2.84e+03 R= 7e+04 -Depth= 9379 States= 1.87e+08 Transitions= 3.1e+09 Memory= 7528.147 t= 2.85e+03 R= 7e+04 -Depth= 9379 States= 1.88e+08 Transitions= 3.11e+09 Memory= 7566.135 t= 2.87e+03 R= 7e+04 -Depth= 9379 States= 1.89e+08 Transitions= 3.13e+09 Memory= 7593.479 t= 2.88e+03 R= 7e+04 -Depth= 9379 States= 1.9e+08 Transitions= 3.15e+09 Memory= 7625.119 t= 2.9e+03 R= 7e+04 -Depth= 9379 States= 1.91e+08 Transitions= 3.16e+09 Memory= 7647.483 t= 2.91e+03 R= 7e+04 -Depth= 9379 States= 1.92e+08 Transitions= 3.18e+09 Memory= 7677.951 t= 2.93e+03 R= 7e+04 -Depth= 9379 States= 1.93e+08 Transitions= 3.2e+09 Memory= 7698.947 t= 2.94e+03 R= 7e+04 -Depth= 9379 States= 1.94e+08 Transitions= 3.21e+09 Memory= 7732.443 t= 2.96e+03 R= 7e+04 -Depth= 9379 States= 1.95e+08 Transitions= 3.23e+09 Memory= 7772.092 t= 2.97e+03 R= 7e+04 -Depth= 9379 States= 1.96e+08 Transitions= 3.24e+09 Memory= 7815.451 t= 2.98e+03 R= 7e+04 -Depth= 9379 States= 1.97e+08 Transitions= 3.26e+09 Memory= 7839.865 t= 3e+03 R= 7e+04 -Depth= 9379 States= 1.98e+08 Transitions= 3.28e+09 Memory= 7869.651 t= 3.01e+03 R= 7e+04 -Depth= 9379 States= 1.99e+08 Transitions= 3.29e+09 Memory= 7921.018 t= 3.03e+03 R= 7e+04 -Depth= 9379 States= 2e+08 Transitions= 3.31e+09 Memory= 7986.740 t= 3.05e+03 R= 7e+04 -Depth= 9379 States= 2.01e+08 Transitions= 3.33e+09 Memory= 8023.752 t= 3.06e+03 R= 7e+04 -Depth= 9379 States= 2.02e+08 Transitions= 3.34e+09 Memory= 8039.768 t= 3.07e+03 R= 7e+04 -Depth= 9379 States= 2.03e+08 Transitions= 3.36e+09 Memory= 8053.830 t= 3.09e+03 R= 7e+04 -Depth= 9379 States= 2.04e+08 Transitions= 3.38e+09 Memory= 8068.772 t= 3.11e+03 R= 7e+04 -Depth= 9379 States= 2.05e+08 Transitions= 3.4e+09 Memory= 8083.127 t= 3.13e+03 R= 7e+04 -Depth= 9379 States= 2.06e+08 Transitions= 3.42e+09 Memory= 8098.068 t= 3.15e+03 R= 7e+04 -Depth= 9379 States= 2.07e+08 Transitions= 3.44e+09 Memory= 8115.744 t= 3.16e+03 R= 7e+04 -Depth= 9379 States= 2.08e+08 Transitions= 3.46e+09 Memory= 8178.537 t= 3.18e+03 R= 7e+04 -Depth= 9379 States= 2.09e+08 Transitions= 3.48e+09 Memory= 8220.627 t= 3.2e+03 R= 7e+04 -Depth= 9379 States= 2.1e+08 Transitions= 3.49e+09 Memory= 8246.799 t= 3.21e+03 R= 7e+04 -Depth= 9379 States= 2.11e+08 Transitions= 3.5e+09 Memory= 8263.791 t= 3.22e+03 R= 7e+04 -Depth= 9379 States= 2.12e+08 Transitions= 3.52e+09 Memory= 8279.514 t= 3.24e+03 R= 7e+04 -Depth= 9379 States= 2.13e+08 Transitions= 3.54e+09 Memory= 8293.772 t= 3.26e+03 R= 7e+04 -Depth= 9379 States= 2.14e+08 Transitions= 3.56e+09 Memory= 8309.201 t= 3.28e+03 R= 7e+04 -Depth= 9379 States= 2.15e+08 Transitions= 3.58e+09 Memory= 8323.752 t= 3.29e+03 R= 7e+04 -Depth= 9379 States= 2.16e+08 Transitions= 3.6e+09 Memory= 8342.990 t= 3.31e+03 R= 7e+04 -Depth= 9379 States= 2.17e+08 Transitions= 3.61e+09 Memory= 8355.197 t= 3.32e+03 R= 7e+04 -Depth= 9379 States= 2.18e+08 Transitions= 3.64e+09 Memory= 8368.674 t= 3.35e+03 R= 7e+04 -Depth= 9379 States= 2.19e+08 Transitions= 3.66e+09 Memory= 8382.932 t= 3.37e+03 R= 7e+04 -Depth= 9379 States= 2.2e+08 Transitions= 3.68e+09 Memory= 8398.459 t= 3.38e+03 R= 7e+04 -Depth= 9379 States= 2.21e+08 Transitions= 3.7e+09 Memory= 8412.912 t= 3.4e+03 R= 6e+04 -Depth= 9379 States= 2.22e+08 Transitions= 3.71e+09 Memory= 8428.244 t= 3.42e+03 R= 6e+04 -Depth= 9379 States= 2.23e+08 Transitions= 3.73e+09 Memory= 8491.721 t= 3.43e+03 R= 6e+04 -Depth= 9379 States= 2.24e+08 Transitions= 3.75e+09 Memory= 8560.373 t= 3.45e+03 R= 6e+04 -Depth= 9379 States= 2.25e+08 Transitions= 3.77e+09 Memory= 8621.604 t= 3.47e+03 R= 6e+04 -Depth= 9379 States= 2.26e+08 Transitions= 3.79e+09 Memory= 8648.850 t= 3.48e+03 R= 6e+04 -Depth= 9379 States= 2.27e+08 Transitions= 3.81e+09 Memory= 8671.994 t= 3.5e+03 R= 6e+04 -Depth= 9379 States= 2.28e+08 Transitions= 3.82e+09 Memory= 8710.861 t= 3.51e+03 R= 6e+04 -Depth= 9379 States= 2.29e+08 Transitions= 3.84e+09 Memory= 8742.893 t= 3.53e+03 R= 6e+04 -Depth= 9379 States= 2.3e+08 Transitions= 3.85e+09 Memory= 8771.799 t= 3.54e+03 R= 6e+04 -Depth= 9379 States= 2.31e+08 Transitions= 3.87e+09 Memory= 8792.600 t= 3.56e+03 R= 6e+04 -Depth= 9379 States= 2.32e+08 Transitions= 3.89e+09 Memory= 8828.733 t= 3.57e+03 R= 6e+04 -Depth= 9379 States= 2.33e+08 Transitions= 3.9e+09 Memory= 8843.869 t= 3.59e+03 R= 6e+04 -Depth= 9379 States= 2.34e+08 Transitions= 3.92e+09 Memory= 8884.787 t= 3.6e+03 R= 6e+04 -Depth= 9379 States= 2.35e+08 Transitions= 3.93e+09 Memory= 8924.240 t= 3.62e+03 R= 6e+04 -Depth= 9379 States= 2.36e+08 Transitions= 3.95e+09 Memory= 8960.276 t= 3.63e+03 R= 6e+04 -Depth= 9379 States= 2.37e+08 Transitions= 3.97e+09 Memory= 8984.494 t= 3.65e+03 R= 6e+04 -Depth= 9379 States= 2.38e+08 Transitions= 3.98e+09 Memory= 9016.428 t= 3.66e+03 R= 6e+04 -Depth= 9379 States= 2.39e+08 Transitions= 4e+09 Memory= 9077.365 t= 3.68e+03 R= 6e+04 -Depth= 9379 States= 2.4e+08 Transitions= 4.02e+09 Memory= 9143.088 t= 3.7e+03 R= 6e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 64 byte, depth reached 9379, errors: 0 - 88114592 states, stored (2.40192e+08 visited) -3.782223e+09 states, matched -4.0224152e+09 transitions (= visited+matched) -1.4282782e+10 atomic steps -hash conflicts: 5.384059e+08 (resolved) - -Stats on memory usage (in Megabytes): - 7731.001 equivalent memory usage for states (stored*(State-vector + overhead)) - 6648.180 actual memory usage for states (compression: 85.99%) - state-vector as stored = 51 byte + 28 byte overhead - 2048.000 memory used for hash table (-w28) - 457.764 memory used for DFS stack (-m10000000) - 1.188 memory lost to fragmentation - 9152.756 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 256, "(1)" - line 418, "pan.___", state 286, "(1)" - line 399, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 395, "(1)" - line 418, "pan.___", state 425, "(1)" - line 540, "pan.___", state 456, "-end-" - (17 of 456 states) -unreached in proctype urcu_reader_sig - line 399, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 70, "(1)" - line 418, "pan.___", state 100, "(1)" - line 399, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 158, "(1)" - line 418, "pan.___", state 188, "(1)" - line 399, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 247, "(1)" - line 418, "pan.___", state 277, "(1)" - line 399, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 359, "(1)" - line 418, "pan.___", state 389, "(1)" - line 614, "pan.___", state 411, "-end-" - (17 of 411 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 59, "(1)" - line 413, "pan.___", state 72, "(1)" - line 418, "pan.___", state 89, "(1)" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 240, "(1)" - line 164, "pan.___", state 248, "(1)" - line 168, "pan.___", state 260, "(1)" - line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 370, "(1)" - line 164, "pan.___", state 378, "(1)" - line 168, "pan.___", state 390, "(1)" - line 399, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 449, "(1)" - line 413, "pan.___", state 462, "(1)" - line 418, "pan.___", state 479, "(1)" - line 399, "pan.___", state 498, "(1)" - line 403, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 554, "(1)" - line 418, "pan.___", state 571, "(1)" - line 403, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 647, "(1)" - line 418, "pan.___", state 664, "(1)" - line 179, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 710, "(1)" - line 164, "pan.___", state 718, "(1)" - line 168, "pan.___", state 730, "(1)" - line 175, "pan.___", state 741, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 817, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 830, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 840, "(1)" - line 164, "pan.___", state 848, "(1)" - line 168, "pan.___", state 860, "(1)" - line 399, "pan.___", state 882, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 884, "(1)" - line 399, "pan.___", state 885, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 885, "else" - line 399, "pan.___", state 888, "(1)" - line 403, "pan.___", state 896, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 898, "(1)" - line 403, "pan.___", state 899, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 899, "else" - line 403, "pan.___", state 902, "(1)" - line 403, "pan.___", state 903, "(1)" - line 403, "pan.___", state 903, "(1)" - line 401, "pan.___", state 908, "((i<1))" - line 401, "pan.___", state 908, "((i>=1))" - line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 927, "(1)" - line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 928, "else" - line 409, "pan.___", state 931, "(1)" - line 409, "pan.___", state 932, "(1)" - line 409, "pan.___", state 932, "(1)" - line 413, "pan.___", state 940, "(1)" - line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 941, "else" - line 413, "pan.___", state 944, "(1)" - line 413, "pan.___", state 945, "(1)" - line 413, "pan.___", state 945, "(1)" - line 411, "pan.___", state 950, "((i<1))" - line 411, "pan.___", state 950, "((i>=1))" - line 418, "pan.___", state 957, "(1)" - line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 958, "else" - line 418, "pan.___", state 961, "(1)" - line 418, "pan.___", state 962, "(1)" - line 418, "pan.___", state 962, "(1)" - line 420, "pan.___", state 965, "(1)" - line 420, "pan.___", state 965, "(1)" - line 403, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1040, "(1)" - line 418, "pan.___", state 1057, "(1)" - line 403, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1130, "(1)" - line 418, "pan.___", state 1147, "(1)" - line 399, "pan.___", state 1166, "(1)" - line 403, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1222, "(1)" - line 418, "pan.___", state 1239, "(1)" - line 403, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 408, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 413, "pan.___", state 1315, "(1)" - line 418, "pan.___", state 1332, "(1)" - line 179, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1378, "(1)" - line 164, "pan.___", state 1386, "(1)" - line 168, "pan.___", state 1398, "(1)" - line 175, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 1485, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1498, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1508, "(1)" - line 164, "pan.___", state 1516, "(1)" - line 168, "pan.___", state 1528, "(1)" - line 399, "pan.___", state 1550, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1552, "(1)" - line 399, "pan.___", state 1553, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 399, "pan.___", state 1553, "else" - line 399, "pan.___", state 1556, "(1)" - line 403, "pan.___", state 1564, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 1566, "(1)" - line 403, "pan.___", state 1567, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 403, "pan.___", state 1567, "else" - line 403, "pan.___", state 1570, "(1)" - line 403, "pan.___", state 1571, "(1)" - line 403, "pan.___", state 1571, "(1)" - line 401, "pan.___", state 1576, "((i<1))" - line 401, "pan.___", state 1576, "((i>=1))" - line 408, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1595, "(1)" - line 409, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 409, "pan.___", state 1596, "else" - line 409, "pan.___", state 1599, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 413, "pan.___", state 1608, "(1)" - line 413, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 413, "pan.___", state 1609, "else" - line 413, "pan.___", state 1612, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 411, "pan.___", state 1618, "((i<1))" - line 411, "pan.___", state 1618, "((i>=1))" - line 418, "pan.___", state 1625, "(1)" - line 418, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 418, "pan.___", state 1626, "else" - line 418, "pan.___", state 1629, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 179, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1681, "(1)" - line 164, "pan.___", state 1689, "(1)" - line 168, "pan.___", state 1701, "(1)" - line 175, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 179, "pan.___", state 1788, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 183, "pan.___", state 1801, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 160, "pan.___", state 1811, "(1)" - line 164, "pan.___", state 1819, "(1)" - line 168, "pan.___", state 1831, "(1)" - line 702, "pan.___", state 1856, "-end-" - (158 of 1856 states) -unreached in proctype :init: - (0 of 46 states) -unreached in proctype :never: - line 751, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 3.7e+03 seconds -pan: rate 64918.749 states/second -pan: avg transition delay 9.1982e-07 usec -cp .input.spin urcu_progress_writer.spin.input -cp .input.spin.trail urcu_progress_writer.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.spin.input b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.spin.input deleted file mode 100644 index 43221e7..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define WRITER_PROGRESS - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.spin.input.trail b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.spin.input.trail deleted file mode 100644 index e65d663..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer.spin.input.trail +++ /dev/null @@ -1,9 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2679 -2:1:2673 -3:1:2674 -4:1:2675 -5:1:2676 -6:0:2685 -7:5:1129 diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.define b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.log b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.log deleted file mode 100644 index f870a6e..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.log +++ /dev/null @@ -1,535 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer_error.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 745) -depth 15: Claim reached state 9 (line 750) -depth 1194: Claim reached state 9 (line 749) -Depth= 3253 States= 1e+06 Transitions= 1.06e+07 Memory= 484.416 t= 9.57 R= 1e+05 -Depth= 3253 States= 2e+06 Transitions= 2.04e+07 Memory= 501.311 t= 18.5 R= 1e+05 -pan: acceptance cycle (at depth 1938) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 64 byte, depth reached 23684, errors: 1 - 682672 states, stored (2.81536e+06 visited) - 30226122 states, matched - 33041487 transitions (= visited+matched) -1.1631626e+08 atomic steps -hash conflicts: 6056013 (resolved) - -Stats on memory usage (in Megabytes): - 59.896 equivalent memory usage for states (stored*(State-vector + overhead)) - 47.456 actual memory usage for states (compression: 79.23%) - state-vector as stored = 45 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 513.127 total actual memory usage - -unreached in proctype urcu_reader - line 400, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 61, "(1)" - line 419, "pan.___", state 91, "(1)" - line 400, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 158, "(1)" - line 419, "pan.___", state 188, "(1)" - line 400, "pan.___", state 211, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 243, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 256, "(1)" - line 419, "pan.___", state 286, "(1)" - line 400, "pan.___", state 350, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 382, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 395, "(1)" - line 419, "pan.___", state 425, "(1)" - line 541, "pan.___", state 456, "-end-" - (17 of 456 states) -unreached in proctype urcu_reader_sig - line 400, "pan.___", state 25, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 57, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 70, "(1)" - line 419, "pan.___", state 100, "(1)" - line 400, "pan.___", state 113, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 145, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 158, "(1)" - line 419, "pan.___", state 188, "(1)" - line 400, "pan.___", state 202, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 234, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 247, "(1)" - line 419, "pan.___", state 277, "(1)" - line 400, "pan.___", state 314, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 359, "(1)" - line 419, "pan.___", state 389, "(1)" - line 615, "pan.___", state 411, "-end-" - (17 of 411 states) -unreached in proctype urcu_writer - line 400, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 20, "(1)" - line 404, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 34, "(1)" - line 404, "pan.___", state 35, "(1)" - line 404, "pan.___", state 35, "(1)" - line 402, "pan.___", state 40, "((i<1))" - line 402, "pan.___", state 40, "((i>=1))" - line 409, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 59, "(1)" - line 410, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 60, "else" - line 410, "pan.___", state 63, "(1)" - line 410, "pan.___", state 64, "(1)" - line 410, "pan.___", state 64, "(1)" - line 414, "pan.___", state 72, "(1)" - line 414, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 73, "else" - line 414, "pan.___", state 76, "(1)" - line 414, "pan.___", state 77, "(1)" - line 414, "pan.___", state 77, "(1)" - line 412, "pan.___", state 82, "((i<1))" - line 412, "pan.___", state 82, "((i>=1))" - line 419, "pan.___", state 89, "(1)" - line 419, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 90, "else" - line 419, "pan.___", state 93, "(1)" - line 419, "pan.___", state 94, "(1)" - line 419, "pan.___", state 94, "(1)" - line 370, "pan.___", state 99, "(1)" - line 640, "pan.___", state 103, "cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )] = (old_gen+1)" - line 638, "pan.___", state 104, "old_gen = cached_generation_ptr.val[( ((_pid<2)) ? (0) : (1) )]" - line 400, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 114, "(1)" - line 404, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 128, "(1)" - line 404, "pan.___", state 129, "(1)" - line 404, "pan.___", state 129, "(1)" - line 402, "pan.___", state 134, "((i<1))" - line 402, "pan.___", state 134, "((i>=1))" - line 410, "pan.___", state 153, "(1)" - line 410, "pan.___", state 154, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 154, "else" - line 410, "pan.___", state 157, "(1)" - line 410, "pan.___", state 158, "(1)" - line 410, "pan.___", state 158, "(1)" - line 414, "pan.___", state 166, "(1)" - line 414, "pan.___", state 167, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 167, "else" - line 414, "pan.___", state 170, "(1)" - line 414, "pan.___", state 171, "(1)" - line 414, "pan.___", state 171, "(1)" - line 412, "pan.___", state 176, "((i<1))" - line 412, "pan.___", state 176, "((i>=1))" - line 419, "pan.___", state 183, "(1)" - line 419, "pan.___", state 184, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 184, "else" - line 419, "pan.___", state 187, "(1)" - line 419, "pan.___", state 188, "(1)" - line 419, "pan.___", state 188, "(1)" - line 421, "pan.___", state 191, "(1)" - line 421, "pan.___", state 191, "(1)" - line 370, "pan.___", state 193, "(1)" - line 653, "pan.___", state 199, "(1)" - line 647, "pan.___", state 202, "((write_lock==0))" - line 647, "pan.___", state 202, "else" - line 645, "pan.___", state 203, "(1)" - line 176, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 180, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 178, "pan.___", state 225, "((j<1))" - line 178, "pan.___", state 225, "((j>=1))" - line 184, "pan.___", state 230, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 161, "pan.___", state 240, "(1)" - line 165, "pan.___", state 248, "(1)" - line 165, "pan.___", state 249, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 165, "pan.___", state 249, "else" - line 163, "pan.___", state 254, "((j<1))" - line 163, "pan.___", state 254, "((j>=1))" - line 169, "pan.___", state 260, "(1)" - line 169, "pan.___", state 261, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 169, "pan.___", state 261, "else" - line 171, "pan.___", state 264, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 171, "pan.___", state 264, "else" - line 176, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 184, "pan.___", state 293, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 169, "pan.___", state 323, "(1)" - line 169, "pan.___", state 324, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 176, "pan.___", state 338, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 180, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 178, "pan.___", state 355, "((j<1))" - line 178, "pan.___", state 355, "((j>=1))" - line 184, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 161, "pan.___", state 370, "(1)" - line 165, "pan.___", state 378, "(1)" - line 165, "pan.___", state 379, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 165, "pan.___", state 379, "else" - line 163, "pan.___", state 384, "((j<1))" - line 163, "pan.___", state 384, "((j>=1))" - line 169, "pan.___", state 390, "(1)" - line 169, "pan.___", state 391, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 169, "pan.___", state 391, "else" - line 171, "pan.___", state 394, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 171, "pan.___", state 394, "else" - line 400, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 410, "(1)" - line 404, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 424, "(1)" - line 404, "pan.___", state 425, "(1)" - line 404, "pan.___", state 425, "(1)" - line 402, "pan.___", state 430, "((i<1))" - line 402, "pan.___", state 430, "((i>=1))" - line 409, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 449, "(1)" - line 410, "pan.___", state 450, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 450, "else" - line 410, "pan.___", state 453, "(1)" - line 410, "pan.___", state 454, "(1)" - line 410, "pan.___", state 454, "(1)" - line 414, "pan.___", state 462, "(1)" - line 414, "pan.___", state 463, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 463, "else" - line 414, "pan.___", state 466, "(1)" - line 414, "pan.___", state 467, "(1)" - line 414, "pan.___", state 467, "(1)" - line 412, "pan.___", state 472, "((i<1))" - line 412, "pan.___", state 472, "((i>=1))" - line 419, "pan.___", state 479, "(1)" - line 419, "pan.___", state 480, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 480, "else" - line 419, "pan.___", state 483, "(1)" - line 419, "pan.___", state 484, "(1)" - line 419, "pan.___", state 484, "(1)" - line 421, "pan.___", state 487, "(1)" - line 421, "pan.___", state 487, "(1)" - line 370, "pan.___", state 489, "(1)" - line 662, "pan.___", state 492, "cached_urcu_gp_ctr.val[( ((_pid<2)) ? (0) : (1) )] = (tmp^(1<<7))" - line 400, "pan.___", state 498, "(1)" - line 400, "pan.___", state 499, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 499, "else" - line 400, "pan.___", state 502, "(1)" - line 404, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 516, "(1)" - line 404, "pan.___", state 517, "(1)" - line 404, "pan.___", state 517, "(1)" - line 402, "pan.___", state 522, "((i<1))" - line 402, "pan.___", state 522, "((i>=1))" - line 409, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 541, "(1)" - line 410, "pan.___", state 542, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 542, "else" - line 410, "pan.___", state 545, "(1)" - line 410, "pan.___", state 546, "(1)" - line 410, "pan.___", state 546, "(1)" - line 414, "pan.___", state 554, "(1)" - line 414, "pan.___", state 555, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 555, "else" - line 414, "pan.___", state 558, "(1)" - line 414, "pan.___", state 559, "(1)" - line 414, "pan.___", state 559, "(1)" - line 412, "pan.___", state 564, "((i<1))" - line 412, "pan.___", state 564, "((i>=1))" - line 419, "pan.___", state 571, "(1)" - line 419, "pan.___", state 572, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 572, "else" - line 419, "pan.___", state 575, "(1)" - line 419, "pan.___", state 576, "(1)" - line 419, "pan.___", state 576, "(1)" - line 421, "pan.___", state 579, "(1)" - line 421, "pan.___", state 579, "(1)" - line 370, "pan.___", state 581, "(1)" - line 400, "pan.___", state 589, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 595, "(1)" - line 404, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 609, "(1)" - line 404, "pan.___", state 610, "(1)" - line 404, "pan.___", state 610, "(1)" - line 402, "pan.___", state 615, "((i<1))" - line 402, "pan.___", state 615, "((i>=1))" - line 409, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 634, "(1)" - line 410, "pan.___", state 635, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 635, "else" - line 410, "pan.___", state 638, "(1)" - line 410, "pan.___", state 639, "(1)" - line 410, "pan.___", state 639, "(1)" - line 414, "pan.___", state 647, "(1)" - line 414, "pan.___", state 648, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 648, "else" - line 414, "pan.___", state 651, "(1)" - line 414, "pan.___", state 652, "(1)" - line 414, "pan.___", state 652, "(1)" - line 412, "pan.___", state 657, "((i<1))" - line 412, "pan.___", state 657, "((i>=1))" - line 419, "pan.___", state 664, "(1)" - line 419, "pan.___", state 665, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 665, "else" - line 419, "pan.___", state 668, "(1)" - line 419, "pan.___", state 669, "(1)" - line 419, "pan.___", state 669, "(1)" - line 421, "pan.___", state 672, "(1)" - line 421, "pan.___", state 672, "(1)" - line 370, "pan.___", state 674, "(1)" - line 400, "pan.___", state 679, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 681, "(1)" - line 400, "pan.___", state 682, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 682, "else" - line 400, "pan.___", state 685, "(1)" - line 404, "pan.___", state 693, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 695, "(1)" - line 404, "pan.___", state 696, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 696, "else" - line 404, "pan.___", state 699, "(1)" - line 404, "pan.___", state 700, "(1)" - line 404, "pan.___", state 700, "(1)" - line 402, "pan.___", state 705, "((i<1))" - line 402, "pan.___", state 705, "((i>=1))" - line 409, "pan.___", state 711, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 724, "(1)" - line 410, "pan.___", state 725, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 725, "else" - line 410, "pan.___", state 728, "(1)" - line 410, "pan.___", state 729, "(1)" - line 410, "pan.___", state 729, "(1)" - line 414, "pan.___", state 737, "(1)" - line 414, "pan.___", state 738, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 738, "else" - line 414, "pan.___", state 741, "(1)" - line 414, "pan.___", state 742, "(1)" - line 414, "pan.___", state 742, "(1)" - line 412, "pan.___", state 747, "((i<1))" - line 412, "pan.___", state 747, "((i>=1))" - line 419, "pan.___", state 754, "(1)" - line 419, "pan.___", state 755, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 755, "else" - line 419, "pan.___", state 758, "(1)" - line 419, "pan.___", state 759, "(1)" - line 419, "pan.___", state 759, "(1)" - line 421, "pan.___", state 762, "(1)" - line 421, "pan.___", state 762, "(1)" - line 370, "pan.___", state 764, "(1)" - line 430, "pan.___", state 767, "(((tmp2&((1<<7)-1))&&((tmp2^cached_urcu_gp_ctr.val[( ((_pid<2)) ? (0) : (1) )])&(1<<7))))" - line 430, "pan.___", state 767, "else" - line 400, "pan.___", state 777, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 779, "(1)" - line 400, "pan.___", state 780, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 780, "else" - line 400, "pan.___", state 783, "(1)" - line 404, "pan.___", state 791, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 793, "(1)" - line 404, "pan.___", state 794, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 794, "else" - line 404, "pan.___", state 797, "(1)" - line 404, "pan.___", state 798, "(1)" - line 404, "pan.___", state 798, "(1)" - line 402, "pan.___", state 803, "((i<1))" - line 402, "pan.___", state 803, "((i>=1))" - line 409, "pan.___", state 809, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 822, "(1)" - line 410, "pan.___", state 823, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 823, "else" - line 410, "pan.___", state 826, "(1)" - line 410, "pan.___", state 827, "(1)" - line 410, "pan.___", state 827, "(1)" - line 414, "pan.___", state 835, "(1)" - line 414, "pan.___", state 836, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 836, "else" - line 414, "pan.___", state 839, "(1)" - line 414, "pan.___", state 840, "(1)" - line 414, "pan.___", state 840, "(1)" - line 412, "pan.___", state 845, "((i<1))" - line 412, "pan.___", state 845, "((i>=1))" - line 419, "pan.___", state 852, "(1)" - line 419, "pan.___", state 853, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 853, "else" - line 419, "pan.___", state 856, "(1)" - line 419, "pan.___", state 857, "(1)" - line 419, "pan.___", state 857, "(1)" - line 421, "pan.___", state 860, "(1)" - line 421, "pan.___", state 860, "(1)" - line 370, "pan.___", state 862, "(1)" - line 449, "pan.___", state 870, "((tmp<1))" - line 449, "pan.___", state 870, "((tmp>=1))" - line 462, "pan.___", state 873, "tmp = 0" - line 400, "pan.___", state 877, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 883, "(1)" - line 404, "pan.___", state 891, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 897, "(1)" - line 404, "pan.___", state 898, "(1)" - line 404, "pan.___", state 898, "(1)" - line 402, "pan.___", state 903, "((i<1))" - line 402, "pan.___", state 903, "((i>=1))" - line 409, "pan.___", state 909, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 922, "(1)" - line 410, "pan.___", state 923, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 923, "else" - line 410, "pan.___", state 926, "(1)" - line 410, "pan.___", state 927, "(1)" - line 410, "pan.___", state 927, "(1)" - line 414, "pan.___", state 935, "(1)" - line 414, "pan.___", state 936, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 936, "else" - line 414, "pan.___", state 939, "(1)" - line 414, "pan.___", state 940, "(1)" - line 414, "pan.___", state 940, "(1)" - line 412, "pan.___", state 945, "((i<1))" - line 412, "pan.___", state 945, "((i>=1))" - line 419, "pan.___", state 952, "(1)" - line 419, "pan.___", state 953, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 953, "else" - line 419, "pan.___", state 956, "(1)" - line 419, "pan.___", state 957, "(1)" - line 419, "pan.___", state 957, "(1)" - line 421, "pan.___", state 960, "(1)" - line 421, "pan.___", state 960, "(1)" - line 370, "pan.___", state 962, "(1)" - line 671, "pan.___", state 963, "tmp = cached_urcu_gp_ctr.val[( ((_pid<2)) ? (0) : (1) )]" - line 400, "pan.___", state 967, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 973, "(1)" - line 404, "pan.___", state 981, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 987, "(1)" - line 404, "pan.___", state 988, "(1)" - line 404, "pan.___", state 988, "(1)" - line 402, "pan.___", state 993, "((i<1))" - line 402, "pan.___", state 993, "((i>=1))" - line 409, "pan.___", state 999, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 1012, "(1)" - line 410, "pan.___", state 1013, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 1013, "else" - line 410, "pan.___", state 1016, "(1)" - line 410, "pan.___", state 1017, "(1)" - line 410, "pan.___", state 1017, "(1)" - line 414, "pan.___", state 1025, "(1)" - line 414, "pan.___", state 1026, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 1026, "else" - line 414, "pan.___", state 1029, "(1)" - line 414, "pan.___", state 1030, "(1)" - line 414, "pan.___", state 1030, "(1)" - line 412, "pan.___", state 1035, "((i<1))" - line 412, "pan.___", state 1035, "((i>=1))" - line 419, "pan.___", state 1042, "(1)" - line 419, "pan.___", state 1043, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 1043, "else" - line 419, "pan.___", state 1046, "(1)" - line 419, "pan.___", state 1047, "(1)" - line 419, "pan.___", state 1047, "(1)" - line 421, "pan.___", state 1050, "(1)" - line 421, "pan.___", state 1050, "(1)" - line 370, "pan.___", state 1052, "(1)" - line 400, "pan.___", state 1061, "(1)" - line 404, "pan.___", state 1073, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1091, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1117, "(1)" - line 419, "pan.___", state 1134, "(1)" - line 404, "pan.___", state 1166, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1184, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 414, "pan.___", state 1210, "(1)" - line 419, "pan.___", state 1227, "(1)" - line 400, "pan.___", state 1242, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 1256, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 409, "pan.___", state 1274, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 1287, "(1)" - line 414, "pan.___", state 1300, "(1)" - line 419, "pan.___", state 1317, "(1)" - line 400, "pan.___", state 1340, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 1342, "(1)" - line 400, "pan.___", state 1343, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 400, "pan.___", state 1343, "else" - line 400, "pan.___", state 1346, "(1)" - line 404, "pan.___", state 1354, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 1356, "(1)" - line 404, "pan.___", state 1357, "((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) ))))" - line 404, "pan.___", state 1357, "else" - line 404, "pan.___", state 1360, "(1)" - line 404, "pan.___", state 1361, "(1)" - line 404, "pan.___", state 1361, "(1)" - line 402, "pan.___", state 1366, "((i<1))" - line 402, "pan.___", state 1366, "((i>=1))" - line 409, "pan.___", state 1372, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 410, "pan.___", state 1385, "(1)" - line 410, "pan.___", state 1386, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 410, "pan.___", state 1386, "else" - line 410, "pan.___", state 1389, "(1)" - line 410, "pan.___", state 1390, "(1)" - line 410, "pan.___", state 1390, "(1)" - line 414, "pan.___", state 1398, "(1)" - line 414, "pan.___", state 1399, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 414, "pan.___", state 1399, "else" - line 414, "pan.___", state 1402, "(1)" - line 414, "pan.___", state 1403, "(1)" - line 414, "pan.___", state 1403, "(1)" - line 412, "pan.___", state 1408, "((i<1))" - line 412, "pan.___", state 1408, "((i>=1))" - line 419, "pan.___", state 1415, "(1)" - line 419, "pan.___", state 1416, "(!((cache_dirty_generation_ptr.bitfield&(1<<( ((_pid<2)) -> (0) : (1) )))))" - line 419, "pan.___", state 1416, "else" - line 419, "pan.___", state 1419, "(1)" - line 419, "pan.___", state 1420, "(1)" - line 419, "pan.___", state 1420, "(1)" - line 421, "pan.___", state 1423, "(1)" - line 421, "pan.___", state 1423, "(1)" - line 180, "pan.___", state 1448, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 184, "pan.___", state 1461, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 161, "pan.___", state 1471, "(1)" - line 165, "pan.___", state 1479, "(1)" - line 169, "pan.___", state 1491, "(1)" - line 176, "pan.___", state 1502, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< (0) : (1) ))))" - line 180, "pan.___", state 1578, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 184, "pan.___", state 1591, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<( ((_pid<2)) -> (0) : (1) ))))" - line 161, "pan.___", state 1601, "(1)" - line 165, "pan.___", state 1609, "(1)" - line 169, "pan.___", state 1621, "(1)" - line 370, "pan.___", state 1642, "(1)" - line 696, "pan.___", state 1643, "(1)" - line 703, "pan.___", state 1646, "-end-" - (308 of 1646 states) -unreached in proctype :init: - (0 of 46 states) -unreached in proctype :never: - line 752, "pan.___", state 11, "-end-" - (1 of 11 states) - -pan: elapsed time 30.2 seconds -pan: rate 93347.646 states/second -pan: avg transition delay 9.1279e-07 usec -cp .input.spin urcu_progress_writer_error.spin.input -cp .input.spin.trail urcu_progress_writer_error.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.spin.input b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.spin.input deleted file mode 100644 index eb1d4e6..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.spin.input +++ /dev/null @@ -1,724 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.spin.input.trail deleted file mode 100644 index c5a6fbf..0000000 --- a/formal-model/urcu/result-signal-over-reader/urcu_progress_writer_error.spin.input.trail +++ /dev/null @@ -1,23572 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:2561 -2:4:2513 -3:4:2516 -4:4:2516 -5:4:2519 -6:4:2527 -7:4:2527 -8:4:2530 -9:4:2536 -10:4:2540 -11:4:2540 -12:4:2543 -13:4:2551 -14:4:2555 -15:4:2556 -16:0:2561 -17:4:2558 -18:0:2561 -19:3:869 -20:0:2561 -21:3:875 -22:0:2561 -23:3:876 -24:0:2561 -25:3:877 -26:3:881 -27:3:882 -28:3:890 -29:3:891 -30:3:895 -31:3:896 -32:3:904 -33:3:909 -34:3:913 -35:3:914 -36:3:921 -37:3:922 -38:3:933 -39:3:934 -40:3:935 -41:3:946 -42:3:951 -43:3:952 -44:0:2559 -45:3:964 -46:0:2565 -47:3:966 -48:3:967 -49:0:2565 -50:3:971 -51:3:975 -52:3:976 -53:3:984 -54:3:985 -55:3:989 -56:3:990 -57:3:998 -58:3:1003 -59:3:1004 -60:3:1015 -61:3:1016 -62:3:1027 -63:3:1028 -64:3:1029 -65:3:1040 -66:3:1045 -67:3:1046 -68:0:2565 -69:3:1058 -70:0:2565 -71:3:1060 -72:0:2565 -73:3:1061 -74:0:2565 -75:3:1071 -76:0:2565 -77:3:1075 -78:3:1076 -79:3:1080 -80:3:1084 -81:3:1085 -82:3:1089 -83:3:1097 -84:3:1098 -85:3:1103 -86:3:1110 -87:3:1111 -88:3:1118 -89:3:1123 -90:0:2565 -91:3:1134 -92:0:2565 -93:3:1138 -94:3:1139 -95:3:1143 -96:3:1147 -97:3:1148 -98:3:1152 -99:3:1160 -100:3:1161 -101:3:1166 -102:3:1173 -103:3:1174 -104:3:1181 -105:3:1186 -106:0:2565 -107:3:1197 -108:0:2565 -109:3:1205 -110:3:1206 -111:3:1210 -112:3:1214 -113:3:1215 -114:3:1219 -115:3:1227 -116:3:1228 -117:3:1233 -118:3:1240 -119:3:1241 -120:3:1248 -121:3:1253 -122:0:2565 -123:3:1264 -124:0:2565 -125:3:1266 -126:0:2565 -127:3:1267 -128:3:1271 -129:3:1272 -130:3:1280 -131:3:1281 -132:3:1285 -133:3:1286 -134:3:1294 -135:3:1299 -136:3:1303 -137:3:1304 -138:3:1311 -139:3:1312 -140:3:1323 -141:3:1324 -142:3:1325 -143:3:1336 -144:3:1341 -145:3:1342 -146:0:2565 -147:3:1354 -148:0:2565 -149:3:1356 -150:0:2565 -151:3:1359 -152:3:1360 -153:3:1372 -154:3:1373 -155:3:1377 -156:3:1378 -157:3:1386 -158:3:1391 -159:3:1395 -160:3:1396 -161:3:1403 -162:3:1404 -163:3:1415 -164:3:1416 -165:3:1417 -166:3:1428 -167:3:1433 -168:3:1434 -169:0:2565 -170:3:1446 -171:0:2565 -172:3:1448 -173:0:2565 -174:3:1449 -175:0:2565 -176:3:1450 -177:0:2565 -178:3:1451 -179:0:2565 -180:3:1452 -181:3:1456 -182:3:1457 -183:3:1465 -184:3:1466 -185:3:1470 -186:3:1471 -187:3:1479 -188:3:1484 -189:3:1488 -190:3:1489 -191:3:1496 -192:3:1497 -193:3:1508 -194:3:1509 -195:3:1510 -196:3:1521 -197:3:1526 -198:3:1527 -199:0:2565 -200:3:1539 -201:0:2565 -202:3:1631 -203:0:2565 -204:3:1729 -205:0:2565 -206:3:1730 -207:0:2565 -208:3:1734 -209:0:2565 -210:3:1740 -211:3:1744 -212:3:1745 -213:3:1753 -214:3:1754 -215:3:1758 -216:3:1759 -217:3:1767 -218:3:1772 -219:3:1776 -220:3:1777 -221:3:1784 -222:3:1785 -223:3:1796 -224:3:1797 -225:3:1798 -226:3:1809 -227:3:1814 -228:3:1815 -229:0:2565 -230:3:1827 -231:0:2565 -232:3:1829 -233:0:2565 -234:3:1830 -235:3:1834 -236:3:1835 -237:3:1843 -238:3:1844 -239:3:1848 -240:3:1849 -241:3:1857 -242:3:1862 -243:3:1866 -244:3:1867 -245:3:1874 -246:3:1875 -247:3:1886 -248:3:1887 -249:3:1888 -250:3:1899 -251:3:1904 -252:3:1905 -253:0:2565 -254:3:1917 -255:0:2565 -256:3:1919 -257:0:2565 -258:2:458 -259:0:2565 -260:2:464 -261:0:2565 -262:2:465 -263:0:2565 -264:2:466 -265:0:2565 -266:2:467 -267:0:2565 -268:1:2 -269:0:2565 -270:2:468 -271:0:2565 -272:1:8 -273:0:2565 -274:1:9 -275:0:2565 -276:1:10 -277:0:2565 -278:1:11 -279:0:2565 -280:2:467 -281:0:2565 -282:1:12 -283:1:16 -284:1:17 -285:1:25 -286:1:26 -287:1:30 -288:1:31 -289:1:39 -290:1:44 -291:1:48 -292:1:49 -293:1:56 -294:1:57 -295:1:68 -296:1:69 -297:1:70 -298:1:81 -299:1:86 -300:1:87 -301:0:2565 -302:2:468 -303:0:2565 -304:1:99 -305:0:2565 -306:2:469 -307:0:2565 -308:2:475 -309:0:2565 -310:2:476 -311:0:2565 -312:2:477 -313:2:481 -314:2:482 -315:2:490 -316:2:491 -317:2:495 -318:2:496 -319:2:504 -320:2:509 -321:2:513 -322:2:514 -323:2:521 -324:2:522 -325:2:533 -326:2:534 -327:2:535 -328:2:546 -329:2:551 -330:2:552 -331:0:2565 -332:2:564 -333:0:2565 -334:2:565 -335:2:569 -336:2:570 -337:2:578 -338:2:579 -339:2:583 -340:2:584 -341:2:592 -342:2:597 -343:2:601 -344:2:602 -345:2:609 -346:2:610 -347:2:621 -348:2:622 -349:2:623 -350:2:634 -351:2:639 -352:2:640 -353:0:2565 -354:2:652 -355:0:2565 -356:2:653 -357:0:2565 -358:2:654 -359:2:658 -360:2:659 -361:2:667 -362:2:668 -363:2:672 -364:2:673 -365:2:681 -366:2:686 -367:2:690 -368:2:691 -369:2:698 -370:2:699 -371:2:710 -372:2:711 -373:2:712 -374:2:723 -375:2:728 -376:2:729 -377:0:2565 -378:2:741 -379:0:2565 -380:2:750 -381:0:2565 -382:2:753 -383:0:2565 -384:2:758 -385:0:2565 -386:2:759 -387:0:2565 -388:2:760 -389:0:2565 -390:2:761 -391:0:2565 -392:2:762 -393:0:2565 -394:2:763 -395:0:2565 -396:2:765 -397:0:2565 -398:2:766 -399:2:770 -400:2:771 -401:2:779 -402:2:780 -403:2:781 -404:2:793 -405:2:798 -406:2:802 -407:2:803 -408:2:810 -409:2:811 -410:2:822 -411:2:823 -412:2:824 -413:2:835 -414:2:840 -415:2:841 -416:0:2565 -417:3:1922 -418:3:1923 -419:3:1935 -420:3:1936 -421:3:1940 -422:3:1941 -423:3:1949 -424:3:1954 -425:3:1958 -426:3:1959 -427:3:1966 -428:3:1967 -429:3:1978 -430:3:1979 -431:3:1980 -432:3:1991 -433:3:1996 -434:3:1997 -435:0:2565 -436:3:2009 -437:0:2565 -438:3:2011 -439:0:2565 -440:3:2012 -441:0:2565 -442:3:2013 -443:0:2565 -444:3:2014 -445:0:2565 -446:3:2015 -447:3:2019 -448:3:2020 -449:3:2028 -450:3:2029 -451:3:2033 -452:3:2034 -453:3:2042 -454:3:2047 -455:3:2051 -456:3:2052 -457:3:2059 -458:3:2060 -459:3:2071 -460:3:2072 -461:3:2073 -462:3:2084 -463:3:2089 -464:3:2090 -465:0:2565 -466:3:2102 -467:0:2565 -468:3:2104 -469:0:2565 -470:3:2105 -471:3:2109 -472:3:2110 -473:3:2118 -474:3:2119 -475:3:2123 -476:3:2124 -477:3:2132 -478:3:2137 -479:3:2141 -480:3:2142 -481:3:2149 -482:3:2150 -483:3:2161 -484:3:2162 -485:3:2163 -486:3:2174 -487:3:2179 -488:3:2180 -489:0:2565 -490:3:2192 -491:0:2565 -492:2:853 -493:0:2565 -494:3:2013 -495:0:2565 -496:2:857 -497:0:2565 -498:2:465 -499:0:2565 -500:3:2014 -501:0:2565 -502:3:2015 -503:3:2019 -504:3:2020 -505:3:2028 -506:3:2029 -507:3:2033 -508:3:2034 -509:3:2042 -510:3:2047 -511:3:2051 -512:3:2052 -513:3:2059 -514:3:2060 -515:3:2071 -516:3:2072 -517:3:2073 -518:3:2084 -519:3:2089 -520:3:2090 -521:0:2565 -522:3:2102 -523:0:2565 -524:3:2104 -525:0:2565 -526:3:2105 -527:3:2109 -528:3:2110 -529:3:2118 -530:3:2119 -531:3:2123 -532:3:2124 -533:3:2132 -534:3:2137 -535:3:2141 -536:3:2142 -537:3:2149 -538:3:2150 -539:3:2161 -540:3:2162 -541:3:2163 -542:3:2174 -543:3:2179 -544:3:2180 -545:0:2565 -546:3:2192 -547:0:2565 -548:2:466 -549:0:2565 -550:3:2013 -551:0:2565 -552:3:2014 -553:0:2565 -554:3:2015 -555:3:2019 -556:3:2020 -557:3:2028 -558:3:2029 -559:3:2033 -560:3:2034 -561:3:2042 -562:3:2047 -563:3:2051 -564:3:2052 -565:3:2059 -566:3:2060 -567:3:2071 -568:3:2072 -569:3:2073 -570:3:2084 -571:3:2089 -572:3:2090 -573:0:2565 -574:3:2102 -575:0:2565 -576:3:2104 -577:0:2565 -578:3:2105 -579:3:2109 -580:3:2110 -581:3:2118 -582:3:2119 -583:3:2123 -584:3:2124 -585:3:2132 -586:3:2137 -587:3:2141 -588:3:2142 -589:3:2149 -590:3:2150 -591:3:2161 -592:3:2162 -593:3:2163 -594:3:2174 -595:3:2179 -596:3:2180 -597:0:2565 -598:2:467 -599:0:2565 -600:3:2192 -601:0:2565 -602:3:2013 -603:0:2565 -604:3:2014 -605:0:2565 -606:3:2015 -607:3:2019 -608:3:2020 -609:3:2028 -610:3:2029 -611:3:2033 -612:3:2034 -613:3:2042 -614:3:2047 -615:3:2051 -616:3:2052 -617:3:2059 -618:3:2060 -619:3:2071 -620:3:2072 -621:3:2073 -622:3:2084 -623:3:2089 -624:3:2090 -625:0:2565 -626:3:2102 -627:0:2565 -628:3:2104 -629:0:2565 -630:1:102 -631:0:2565 -632:2:468 -633:0:2565 -634:3:2105 -635:3:2109 -636:3:2110 -637:3:2118 -638:3:2119 -639:3:2123 -640:3:2124 -641:3:2132 -642:3:2137 -643:3:2141 -644:3:2142 -645:3:2149 -646:3:2150 -647:3:2161 -648:3:2162 -649:3:2163 -650:3:2174 -651:3:2179 -652:3:2180 -653:0:2565 -654:3:2192 -655:0:2565 -656:3:2013 -657:0:2565 -658:3:2014 -659:0:2565 -660:3:2015 -661:3:2019 -662:3:2020 -663:3:2028 -664:3:2029 -665:3:2033 -666:3:2034 -667:3:2042 -668:3:2047 -669:3:2051 -670:3:2052 -671:3:2059 -672:3:2060 -673:3:2071 -674:3:2072 -675:3:2073 -676:3:2084 -677:3:2089 -678:3:2090 -679:0:2565 -680:3:2102 -681:0:2565 -682:3:2104 -683:0:2565 -684:2:467 -685:0:2565 -686:2:468 -687:0:2565 -688:3:2105 -689:3:2109 -690:3:2110 -691:3:2118 -692:3:2119 -693:3:2123 -694:3:2124 -695:3:2132 -696:3:2137 -697:3:2141 -698:3:2142 -699:3:2149 -700:3:2150 -701:3:2161 -702:3:2162 -703:3:2163 -704:3:2174 -705:3:2179 -706:3:2180 -707:0:2565 -708:3:2192 -709:0:2565 -710:3:2013 -711:0:2565 -712:3:2014 -713:0:2565 -714:3:2015 -715:3:2019 -716:3:2020 -717:3:2028 -718:3:2029 -719:3:2033 -720:3:2034 -721:3:2042 -722:3:2047 -723:3:2051 -724:3:2052 -725:3:2059 -726:3:2060 -727:3:2071 -728:3:2072 -729:3:2073 -730:3:2084 -731:3:2089 -732:3:2090 -733:0:2565 -734:3:2102 -735:0:2565 -736:2:467 -737:0:2565 -738:1:108 -739:0:2565 -740:2:468 -741:0:2565 -742:3:2104 -743:0:2565 -744:3:2105 -745:3:2109 -746:3:2110 -747:3:2118 -748:3:2119 -749:3:2123 -750:3:2124 -751:3:2132 -752:3:2137 -753:3:2141 -754:3:2142 -755:3:2149 -756:3:2150 -757:3:2161 -758:3:2162 -759:3:2163 -760:3:2174 -761:3:2179 -762:3:2180 -763:0:2565 -764:3:2192 -765:0:2565 -766:3:2013 -767:0:2565 -768:3:2014 -769:0:2565 -770:3:2015 -771:3:2019 -772:3:2020 -773:3:2028 -774:3:2029 -775:3:2033 -776:3:2034 -777:3:2042 -778:3:2047 -779:3:2051 -780:3:2052 -781:3:2059 -782:3:2060 -783:3:2071 -784:3:2072 -785:3:2073 -786:3:2084 -787:3:2089 -788:3:2090 -789:0:2565 -790:3:2102 -791:0:2565 -792:2:467 -793:0:2565 -794:2:468 -795:0:2565 -796:3:2104 -797:0:2565 -798:3:2105 -799:3:2109 -800:3:2110 -801:3:2118 -802:3:2119 -803:3:2123 -804:3:2124 -805:3:2132 -806:3:2137 -807:3:2141 -808:3:2142 -809:3:2149 -810:3:2150 -811:3:2161 -812:3:2162 -813:3:2163 -814:3:2174 -815:3:2179 -816:3:2180 -817:0:2565 -818:3:2192 -819:0:2565 -820:3:2013 -821:0:2565 -822:3:2014 -823:0:2565 -824:3:2015 -825:3:2019 -826:3:2020 -827:3:2028 -828:3:2029 -829:3:2033 -830:3:2034 -831:3:2042 -832:3:2047 -833:3:2051 -834:3:2052 -835:3:2059 -836:3:2060 -837:3:2071 -838:3:2072 -839:3:2073 -840:3:2084 -841:3:2089 -842:3:2090 -843:0:2565 -844:2:467 -845:0:2565 -846:1:109 -847:1:113 -848:1:114 -849:1:122 -850:1:123 -851:1:124 -852:1:136 -853:1:141 -854:1:145 -855:1:146 -856:1:153 -857:1:154 -858:1:165 -859:1:166 -860:1:167 -861:1:178 -862:1:183 -863:1:184 -864:0:2565 -865:3:2102 -866:0:2565 -867:2:468 -868:0:2565 -869:3:2104 -870:0:2565 -871:3:2105 -872:3:2109 -873:3:2110 -874:3:2118 -875:3:2119 -876:3:2123 -877:3:2124 -878:3:2132 -879:3:2137 -880:3:2141 -881:3:2142 -882:3:2149 -883:3:2150 -884:3:2161 -885:3:2169 -886:3:2170 -887:3:2174 -888:3:2179 -889:3:2180 -890:0:2565 -891:3:2192 -892:0:2565 -893:3:2013 -894:0:2565 -895:3:2014 -896:0:2565 -897:3:2015 -898:3:2019 -899:3:2020 -900:3:2028 -901:3:2029 -902:3:2033 -903:3:2034 -904:3:2042 -905:3:2047 -906:3:2051 -907:3:2052 -908:3:2059 -909:3:2060 -910:3:2071 -911:3:2079 -912:3:2080 -913:3:2084 -914:3:2089 -915:3:2090 -916:0:2565 -917:2:467 -918:0:2565 -919:3:2102 -920:0:2565 -921:3:2104 -922:0:2565 -923:3:2105 -924:3:2109 -925:3:2110 -926:3:2118 -927:3:2119 -928:3:2123 -929:3:2124 -930:3:2132 -931:3:2137 -932:3:2141 -933:3:2142 -934:3:2149 -935:3:2150 -936:3:2161 -937:3:2169 -938:3:2170 -939:3:2174 -940:3:2179 -941:3:2180 -942:0:2565 -943:3:2192 -944:0:2565 -945:3:2013 -946:0:2565 -947:3:2014 -948:0:2565 -949:1:196 -950:0:2565 -951:2:468 -952:0:2565 -953:3:2015 -954:3:2019 -955:3:2020 -956:3:2028 -957:3:2029 -958:3:2033 -959:3:2034 -960:3:2042 -961:3:2047 -962:3:2051 -963:3:2052 -964:3:2059 -965:3:2060 -966:3:2071 -967:3:2079 -968:3:2080 -969:3:2084 -970:3:2089 -971:3:2090 -972:0:2565 -973:3:2102 -974:0:2565 -975:3:2104 -976:0:2565 -977:3:2105 -978:3:2109 -979:3:2110 -980:3:2118 -981:3:2119 -982:3:2123 -983:3:2124 -984:3:2132 -985:3:2137 -986:3:2141 -987:3:2142 -988:3:2149 -989:3:2150 -990:3:2161 -991:3:2169 -992:3:2170 -993:3:2174 -994:3:2179 -995:3:2180 -996:0:2565 -997:3:2192 -998:0:2565 -999:3:2013 -1000:0:2565 -1001:3:2014 -1002:0:2565 -1003:2:469 -1004:0:2565 -1005:2:475 -1006:0:2565 -1007:2:476 -1008:0:2565 -1009:3:2015 -1010:3:2019 -1011:3:2020 -1012:3:2028 -1013:3:2029 -1014:3:2033 -1015:3:2034 -1016:3:2042 -1017:3:2047 -1018:3:2051 -1019:3:2052 -1020:3:2059 -1021:3:2060 -1022:3:2071 -1023:3:2079 -1024:3:2080 -1025:3:2084 -1026:3:2089 -1027:3:2090 -1028:0:2565 -1029:3:2102 -1030:0:2565 -1031:3:2104 -1032:0:2565 -1033:3:2105 -1034:3:2109 -1035:3:2110 -1036:3:2118 -1037:3:2119 -1038:3:2123 -1039:3:2124 -1040:3:2132 -1041:3:2137 -1042:3:2141 -1043:3:2142 -1044:3:2149 -1045:3:2150 -1046:3:2161 -1047:3:2169 -1048:3:2170 -1049:3:2174 -1050:3:2179 -1051:3:2180 -1052:0:2565 -1053:3:2192 -1054:0:2565 -1055:3:2013 -1056:0:2565 -1057:2:477 -1058:2:481 -1059:2:482 -1060:2:490 -1061:2:491 -1062:2:495 -1063:2:496 -1064:2:504 -1065:2:509 -1066:2:513 -1067:2:514 -1068:2:521 -1069:2:522 -1070:2:533 -1071:2:534 -1072:2:535 -1073:2:546 -1074:2:551 -1075:2:552 -1076:0:2565 -1077:3:2014 -1078:0:2565 -1079:3:2015 -1080:3:2019 -1081:3:2020 -1082:3:2028 -1083:3:2029 -1084:3:2033 -1085:3:2034 -1086:3:2042 -1087:3:2047 -1088:3:2051 -1089:3:2052 -1090:3:2059 -1091:3:2060 -1092:3:2071 -1093:3:2079 -1094:3:2080 -1095:3:2084 -1096:3:2089 -1097:3:2090 -1098:0:2565 -1099:3:2102 -1100:0:2565 -1101:3:2104 -1102:0:2565 -1103:3:2105 -1104:3:2109 -1105:3:2110 -1106:3:2118 -1107:3:2119 -1108:3:2123 -1109:3:2124 -1110:3:2132 -1111:3:2137 -1112:3:2141 -1113:3:2142 -1114:3:2149 -1115:3:2150 -1116:3:2161 -1117:3:2169 -1118:3:2170 -1119:3:2174 -1120:3:2179 -1121:3:2180 -1122:0:2565 -1123:3:2192 -1124:0:2565 -1125:2:564 -1126:0:2565 -1127:3:2013 -1128:0:2565 -1129:3:2014 -1130:0:2565 -1131:3:2015 -1132:3:2019 -1133:3:2020 -1134:3:2028 -1135:3:2029 -1136:3:2033 -1137:3:2034 -1138:3:2042 -1139:3:2047 -1140:3:2051 -1141:3:2052 -1142:3:2059 -1143:3:2060 -1144:3:2071 -1145:3:2079 -1146:3:2080 -1147:3:2084 -1148:3:2089 -1149:3:2090 -1150:0:2565 -1151:3:2102 -1152:0:2565 -1153:3:2104 -1154:0:2565 -1155:3:2105 -1156:3:2109 -1157:3:2110 -1158:3:2118 -1159:3:2119 -1160:3:2123 -1161:3:2124 -1162:3:2132 -1163:3:2137 -1164:3:2141 -1165:3:2142 -1166:3:2149 -1167:3:2150 -1168:3:2161 -1169:3:2169 -1170:3:2170 -1171:3:2174 -1172:3:2179 -1173:3:2180 -1174:0:2565 -1175:2:565 -1176:2:569 -1177:2:570 -1178:2:578 -1179:2:579 -1180:2:583 -1181:2:584 -1182:2:592 -1183:2:597 -1184:2:601 -1185:2:602 -1186:2:609 -1187:2:610 -1188:2:621 -1189:2:622 -1190:2:623 -1191:2:634 -1192:2:639 -1193:2:640 -1194:0:2565 -1195:3:2192 -1196:0:2565 -1197:3:2013 -1198:0:2565 -1199:2:652 -1200:0:2565 -1201:3:2014 -1202:0:2565 -1203:3:2015 -1204:3:2019 -1205:3:2020 -1206:3:2028 -1207:3:2029 -1208:3:2033 -1209:3:2034 -1210:3:2042 -1211:3:2047 -1212:3:2051 -1213:3:2052 -1214:3:2059 -1215:3:2060 -1216:3:2071 -1217:3:2079 -1218:3:2080 -1219:3:2084 -1220:3:2089 -1221:3:2090 -1222:0:2565 -1223:3:2102 -1224:0:2565 -1225:3:2104 -1226:0:2565 -1227:3:2105 -1228:3:2109 -1229:3:2110 -1230:3:2118 -1231:3:2119 -1232:3:2123 -1233:3:2124 -1234:3:2132 -1235:3:2137 -1236:3:2141 -1237:3:2142 -1238:3:2149 -1239:3:2150 -1240:3:2161 -1241:3:2169 -1242:3:2170 -1243:3:2174 -1244:3:2179 -1245:3:2180 -1246:0:2565 -1247:3:2192 -1248:0:2565 -1249:2:653 -1250:0:2565 -1251:3:2013 -1252:0:2565 -1253:3:2014 -1254:0:2565 -1255:3:2015 -1256:3:2019 -1257:3:2020 -1258:3:2028 -1259:3:2029 -1260:3:2033 -1261:3:2034 -1262:3:2042 -1263:3:2047 -1264:3:2051 -1265:3:2052 -1266:3:2059 -1267:3:2060 -1268:3:2071 -1269:3:2079 -1270:3:2080 -1271:3:2084 -1272:3:2089 -1273:3:2090 -1274:0:2565 -1275:3:2102 -1276:0:2565 -1277:3:2104 -1278:0:2565 -1279:3:2105 -1280:3:2109 -1281:3:2110 -1282:3:2118 -1283:3:2119 -1284:3:2123 -1285:3:2124 -1286:3:2132 -1287:3:2137 -1288:3:2141 -1289:3:2142 -1290:3:2149 -1291:3:2150 -1292:3:2161 -1293:3:2169 -1294:3:2170 -1295:3:2174 -1296:3:2179 -1297:3:2180 -1298:0:2565 -1299:2:654 -1300:2:658 -1301:2:659 -1302:2:667 -1303:2:668 -1304:2:672 -1305:2:673 -1306:2:681 -1307:2:686 -1308:2:690 -1309:2:691 -1310:2:698 -1311:2:699 -1312:2:710 -1313:2:711 -1314:2:712 -1315:2:723 -1316:2:728 -1317:2:729 -1318:0:2565 -1319:3:2192 -1320:0:2565 -1321:3:2013 -1322:0:2565 -1323:3:2014 -1324:0:2565 -1325:3:2015 -1326:3:2019 -1327:3:2020 -1328:3:2028 -1329:3:2029 -1330:3:2033 -1331:3:2034 -1332:3:2042 -1333:3:2047 -1334:3:2051 -1335:3:2052 -1336:3:2059 -1337:3:2060 -1338:3:2071 -1339:3:2079 -1340:3:2080 -1341:3:2084 -1342:3:2089 -1343:3:2090 -1344:0:2565 -1345:3:2102 -1346:0:2565 -1347:3:2104 -1348:0:2565 -1349:2:741 -1350:0:2565 -1351:2:750 -1352:0:2565 -1353:2:753 -1354:0:2565 -1355:3:2105 -1356:3:2109 -1357:3:2110 -1358:3:2118 -1359:3:2119 -1360:3:2123 -1361:3:2124 -1362:3:2132 -1363:3:2137 -1364:3:2141 -1365:3:2142 -1366:3:2149 -1367:3:2150 -1368:3:2161 -1369:3:2169 -1370:3:2170 -1371:3:2174 -1372:3:2179 -1373:3:2180 -1374:0:2565 -1375:3:2192 -1376:0:2565 -1377:3:2013 -1378:0:2565 -1379:3:2014 -1380:0:2565 -1381:3:2015 -1382:3:2019 -1383:3:2020 -1384:3:2028 -1385:3:2029 -1386:3:2033 -1387:3:2034 -1388:3:2042 -1389:3:2047 -1390:3:2051 -1391:3:2052 -1392:3:2059 -1393:3:2060 -1394:3:2071 -1395:3:2079 -1396:3:2080 -1397:3:2084 -1398:3:2089 -1399:3:2090 -1400:0:2565 -1401:3:2102 -1402:0:2565 -1403:2:758 -1404:0:2565 -1405:3:2104 -1406:0:2565 -1407:3:2105 -1408:3:2109 -1409:3:2110 -1410:3:2118 -1411:3:2119 -1412:3:2123 -1413:3:2124 -1414:3:2132 -1415:3:2137 -1416:3:2141 -1417:3:2142 -1418:3:2149 -1419:3:2150 -1420:3:2161 -1421:3:2169 -1422:3:2170 -1423:3:2174 -1424:3:2179 -1425:3:2180 -1426:0:2565 -1427:3:2192 -1428:0:2565 -1429:3:2013 -1430:0:2565 -1431:3:2014 -1432:0:2565 -1433:3:2015 -1434:3:2019 -1435:3:2020 -1436:3:2028 -1437:3:2029 -1438:3:2033 -1439:3:2034 -1440:3:2042 -1441:3:2047 -1442:3:2051 -1443:3:2052 -1444:3:2059 -1445:3:2060 -1446:3:2071 -1447:3:2079 -1448:3:2080 -1449:3:2084 -1450:3:2089 -1451:3:2090 -1452:0:2565 -1453:2:759 -1454:0:2565 -1455:3:2102 -1456:0:2565 -1457:3:2104 -1458:0:2565 -1459:3:2105 -1460:3:2109 -1461:3:2110 -1462:3:2118 -1463:3:2119 -1464:3:2123 -1465:3:2124 -1466:3:2132 -1467:3:2137 -1468:3:2141 -1469:3:2142 -1470:3:2149 -1471:3:2150 -1472:3:2161 -1473:3:2169 -1474:3:2170 -1475:3:2174 -1476:3:2179 -1477:3:2180 -1478:0:2565 -1479:3:2192 -1480:0:2565 -1481:3:2013 -1482:0:2565 -1483:3:2014 -1484:0:2565 -1485:2:760 -1486:0:2565 -1487:2:761 -1488:0:2565 -1489:2:762 -1490:0:2565 -1491:2:763 -1492:0:2565 -1493:3:2015 -1494:3:2019 -1495:3:2020 -1496:3:2028 -1497:3:2029 -1498:3:2033 -1499:3:2034 -1500:3:2042 -1501:3:2047 -1502:3:2051 -1503:3:2052 -1504:3:2059 -1505:3:2060 -1506:3:2071 -1507:3:2079 -1508:3:2080 -1509:3:2084 -1510:3:2089 -1511:3:2090 -1512:0:2565 -1513:3:2102 -1514:0:2565 -1515:3:2104 -1516:0:2565 -1517:3:2105 -1518:3:2109 -1519:3:2110 -1520:3:2118 -1521:3:2119 -1522:3:2123 -1523:3:2124 -1524:3:2132 -1525:3:2137 -1526:3:2141 -1527:3:2142 -1528:3:2149 -1529:3:2150 -1530:3:2161 -1531:3:2169 -1532:3:2170 -1533:3:2174 -1534:3:2179 -1535:3:2180 -1536:0:2565 -1537:3:2192 -1538:0:2565 -1539:3:2013 -1540:0:2565 -1541:2:765 -1542:0:2565 -1543:3:2014 -1544:0:2565 -1545:3:2015 -1546:3:2019 -1547:3:2020 -1548:3:2028 -1549:3:2029 -1550:3:2033 -1551:3:2034 -1552:3:2042 -1553:3:2047 -1554:3:2051 -1555:3:2052 -1556:3:2059 -1557:3:2060 -1558:3:2071 -1559:3:2079 -1560:3:2080 -1561:3:2084 -1562:3:2089 -1563:3:2090 -1564:0:2565 -1565:3:2102 -1566:0:2565 -1567:3:2104 -1568:0:2565 -1569:3:2105 -1570:3:2109 -1571:3:2110 -1572:3:2118 -1573:3:2119 -1574:3:2123 -1575:3:2124 -1576:3:2132 -1577:3:2137 -1578:3:2141 -1579:3:2142 -1580:3:2149 -1581:3:2150 -1582:3:2161 -1583:3:2169 -1584:3:2170 -1585:3:2174 -1586:3:2179 -1587:3:2180 -1588:0:2565 -1589:3:2192 -1590:0:2565 -1591:2:766 -1592:2:770 -1593:2:771 -1594:2:779 -1595:2:780 -1596:2:781 -1597:2:793 -1598:2:798 -1599:2:802 -1600:2:803 -1601:2:810 -1602:2:811 -1603:2:822 -1604:2:823 -1605:2:824 -1606:2:835 -1607:2:840 -1608:2:841 -1609:0:2565 -1610:3:2013 -1611:0:2565 -1612:3:2014 -1613:0:2565 -1614:3:2015 -1615:3:2019 -1616:3:2020 -1617:3:2028 -1618:3:2029 -1619:3:2033 -1620:3:2034 -1621:3:2042 -1622:3:2047 -1623:3:2051 -1624:3:2052 -1625:3:2059 -1626:3:2060 -1627:3:2071 -1628:3:2079 -1629:3:2080 -1630:3:2084 -1631:3:2089 -1632:3:2090 -1633:0:2565 -1634:3:2102 -1635:0:2565 -1636:3:2104 -1637:0:2565 -1638:3:2105 -1639:3:2109 -1640:3:2110 -1641:3:2118 -1642:3:2119 -1643:3:2123 -1644:3:2124 -1645:3:2132 -1646:3:2137 -1647:3:2141 -1648:3:2142 -1649:3:2149 -1650:3:2150 -1651:3:2161 -1652:3:2169 -1653:3:2170 -1654:3:2174 -1655:3:2179 -1656:3:2180 -1657:0:2565 -1658:2:853 -1659:0:2565 -1660:3:2192 -1661:0:2565 -1662:3:2013 -1663:0:2565 -1664:2:857 -1665:0:2565 -1666:2:465 -1667:0:2565 -1668:3:2014 -1669:0:2565 -1670:3:2015 -1671:3:2019 -1672:3:2020 -1673:3:2028 -1674:3:2029 -1675:3:2033 -1676:3:2034 -1677:3:2042 -1678:3:2047 -1679:3:2051 -1680:3:2052 -1681:3:2059 -1682:3:2060 -1683:3:2071 -1684:3:2079 -1685:3:2080 -1686:3:2084 -1687:3:2089 -1688:3:2090 -1689:0:2565 -1690:3:2102 -1691:0:2565 -1692:3:2104 -1693:0:2565 -1694:3:2105 -1695:3:2109 -1696:3:2110 -1697:3:2118 -1698:3:2119 -1699:3:2123 -1700:3:2124 -1701:3:2132 -1702:3:2137 -1703:3:2141 -1704:3:2142 -1705:3:2149 -1706:3:2150 -1707:3:2161 -1708:3:2169 -1709:3:2170 -1710:3:2174 -1711:3:2179 -1712:3:2180 -1713:0:2565 -1714:3:2192 -1715:0:2565 -1716:2:466 -1717:0:2565 -1718:3:2013 -1719:0:2565 -1720:3:2014 -1721:0:2565 -1722:3:2015 -1723:3:2019 -1724:3:2020 -1725:3:2028 -1726:3:2029 -1727:3:2033 -1728:3:2034 -1729:3:2042 -1730:3:2047 -1731:3:2051 -1732:3:2052 -1733:3:2059 -1734:3:2060 -1735:3:2071 -1736:3:2079 -1737:3:2080 -1738:3:2084 -1739:3:2089 -1740:3:2090 -1741:0:2565 -1742:3:2102 -1743:0:2565 -1744:3:2104 -1745:0:2565 -1746:3:2105 -1747:3:2109 -1748:3:2110 -1749:3:2118 -1750:3:2119 -1751:3:2123 -1752:3:2124 -1753:3:2132 -1754:3:2137 -1755:3:2141 -1756:3:2142 -1757:3:2149 -1758:3:2150 -1759:3:2161 -1760:3:2169 -1761:3:2170 -1762:3:2174 -1763:3:2179 -1764:3:2180 -1765:0:2565 -1766:2:467 -1767:0:2565 -1768:3:2192 -1769:0:2565 -1770:3:2013 -1771:0:2565 -1772:3:2014 -1773:0:2565 -1774:3:2015 -1775:3:2019 -1776:3:2020 -1777:3:2028 -1778:3:2029 -1779:3:2033 -1780:3:2034 -1781:3:2042 -1782:3:2047 -1783:3:2051 -1784:3:2052 -1785:3:2059 -1786:3:2060 -1787:3:2071 -1788:3:2079 -1789:3:2080 -1790:3:2084 -1791:3:2089 -1792:3:2090 -1793:0:2565 -1794:3:2102 -1795:0:2565 -1796:3:2104 -1797:0:2565 -1798:1:199 -1799:0:2565 -1800:2:468 -1801:0:2565 -1802:1:205 -1803:0:2565 -1804:3:2105 -1805:3:2109 -1806:3:2110 -1807:3:2118 -1808:3:2119 -1809:3:2123 -1810:3:2124 -1811:3:2132 -1812:3:2137 -1813:3:2141 -1814:3:2142 -1815:3:2149 -1816:3:2150 -1817:3:2161 -1818:3:2169 -1819:3:2170 -1820:3:2174 -1821:3:2179 -1822:3:2180 -1823:0:2565 -1824:3:2192 -1825:0:2565 -1826:3:2013 -1827:0:2565 -1828:3:2014 -1829:0:2565 -1830:3:2015 -1831:3:2019 -1832:3:2020 -1833:3:2028 -1834:3:2029 -1835:3:2033 -1836:3:2034 -1837:3:2042 -1838:3:2047 -1839:3:2051 -1840:3:2052 -1841:3:2059 -1842:3:2060 -1843:3:2071 -1844:3:2079 -1845:3:2080 -1846:3:2084 -1847:3:2089 -1848:3:2090 -1849:0:2565 -1850:3:2102 -1851:0:2565 -1852:3:2104 -1853:0:2565 -1854:2:467 -1855:0:2565 -1856:2:468 -1857:0:2565 -1858:3:2105 -1859:3:2109 -1860:3:2110 -1861:3:2118 -1862:3:2119 -1863:3:2123 -1864:3:2124 -1865:3:2132 -1866:3:2137 -1867:3:2141 -1868:3:2142 -1869:3:2149 -1870:3:2150 -1871:3:2161 -1872:3:2169 -1873:3:2170 -1874:3:2174 -1875:3:2179 -1876:3:2180 -1877:0:2565 -1878:3:2192 -1879:0:2565 -1880:3:2013 -1881:0:2565 -1882:3:2014 -1883:0:2565 -1884:3:2015 -1885:3:2019 -1886:3:2020 -1887:3:2028 -1888:3:2029 -1889:3:2033 -1890:3:2034 -1891:3:2042 -1892:3:2047 -1893:3:2051 -1894:3:2052 -1895:3:2059 -1896:3:2060 -1897:3:2071 -1898:3:2079 -1899:3:2080 -1900:3:2084 -1901:3:2089 -1902:3:2090 -1903:0:2565 -1904:3:2102 -1905:0:2565 -1906:2:467 -1907:0:2565 -1908:1:206 -1909:0:2565 -1910:2:468 -1911:0:2565 -1912:3:2104 -1913:0:2565 -1914:3:2105 -1915:3:2109 -1916:3:2110 -1917:3:2118 -1918:3:2119 -1919:3:2123 -1920:3:2124 -1921:3:2132 -1922:3:2137 -1923:3:2141 -1924:3:2142 -1925:3:2149 -1926:3:2150 -1927:3:2161 -1928:3:2169 -1929:3:2170 -1930:3:2174 -1931:3:2179 -1932:3:2180 -1933:0:2565 -1934:3:2192 -1935:0:2565 -1936:3:2013 -1937:0:2565 -1938:3:2014 --1:-1:-1 -1939:0:2565 -1940:3:2015 -1941:3:2019 -1942:3:2020 -1943:3:2028 -1944:3:2029 -1945:3:2033 -1946:3:2034 -1947:3:2042 -1948:3:2047 -1949:3:2051 -1950:3:2052 -1951:3:2059 -1952:3:2060 -1953:3:2071 -1954:3:2079 -1955:3:2080 -1956:3:2084 -1957:3:2089 -1958:3:2090 -1959:0:2565 -1960:3:2102 -1961:0:2565 -1962:2:467 -1963:0:2565 -1964:2:468 -1965:0:2565 -1966:3:2104 -1967:0:2565 -1968:3:2105 -1969:3:2109 -1970:3:2110 -1971:3:2118 -1972:3:2119 -1973:3:2123 -1974:3:2124 -1975:3:2132 -1976:3:2137 -1977:3:2141 -1978:3:2142 -1979:3:2149 -1980:3:2150 -1981:3:2161 -1982:3:2169 -1983:3:2170 -1984:3:2174 -1985:3:2179 -1986:3:2180 -1987:0:2565 -1988:3:2192 -1989:0:2565 -1990:3:2013 -1991:0:2565 -1992:3:2014 -1993:0:2565 -1994:3:2015 -1995:3:2019 -1996:3:2020 -1997:3:2028 -1998:3:2029 -1999:3:2033 -2000:3:2034 -2001:3:2042 -2002:3:2047 -2003:3:2051 -2004:3:2052 -2005:3:2059 -2006:3:2060 -2007:3:2071 -2008:3:2079 -2009:3:2080 -2010:3:2084 -2011:3:2089 -2012:3:2090 -2013:0:2565 -2014:2:467 -2015:0:2565 -2016:1:207 -2017:1:211 -2018:1:212 -2019:1:220 -2020:1:221 -2021:1:222 -2022:1:234 -2023:1:239 -2024:1:243 -2025:1:244 -2026:1:251 -2027:1:252 -2028:1:263 -2029:1:264 -2030:1:265 -2031:1:276 -2032:1:281 -2033:1:282 -2034:0:2565 -2035:3:2102 -2036:0:2565 -2037:2:468 -2038:0:2565 -2039:3:2104 -2040:0:2565 -2041:3:2105 -2042:3:2109 -2043:3:2110 -2044:3:2118 -2045:3:2119 -2046:3:2123 -2047:3:2124 -2048:3:2132 -2049:3:2137 -2050:3:2141 -2051:3:2142 -2052:3:2149 -2053:3:2150 -2054:3:2161 -2055:3:2169 -2056:3:2170 -2057:3:2174 -2058:3:2179 -2059:3:2180 -2060:0:2565 -2061:3:2192 -2062:0:2565 -2063:3:2013 -2064:0:2565 -2065:3:2014 -2066:0:2565 -2067:3:2015 -2068:3:2019 -2069:3:2020 -2070:3:2028 -2071:3:2029 -2072:3:2033 -2073:3:2034 -2074:3:2042 -2075:3:2047 -2076:3:2051 -2077:3:2052 -2078:3:2059 -2079:3:2060 -2080:3:2071 -2081:3:2079 -2082:3:2080 -2083:3:2084 -2084:3:2089 -2085:3:2090 -2086:0:2565 -2087:2:467 -2088:0:2565 -2089:3:2102 -2090:0:2565 -2091:3:2104 -2092:0:2565 -2093:3:2105 -2094:3:2109 -2095:3:2110 -2096:3:2118 -2097:3:2119 -2098:3:2123 -2099:3:2124 -2100:3:2132 -2101:3:2137 -2102:3:2141 -2103:3:2142 -2104:3:2149 -2105:3:2150 -2106:3:2161 -2107:3:2169 -2108:3:2170 -2109:3:2174 -2110:3:2179 -2111:3:2180 -2112:0:2565 -2113:3:2192 -2114:0:2565 -2115:3:2013 -2116:0:2565 -2117:3:2014 -2118:0:2565 -2119:1:294 -2120:0:2565 -2121:2:468 -2122:0:2565 -2123:3:2015 -2124:3:2019 -2125:3:2020 -2126:3:2028 -2127:3:2029 -2128:3:2033 -2129:3:2034 -2130:3:2042 -2131:3:2047 -2132:3:2051 -2133:3:2052 -2134:3:2059 -2135:3:2060 -2136:3:2071 -2137:3:2079 -2138:3:2080 -2139:3:2084 -2140:3:2089 -2141:3:2090 -2142:0:2565 -2143:3:2102 -2144:0:2565 -2145:3:2104 -2146:0:2565 -2147:3:2105 -2148:3:2109 -2149:3:2110 -2150:3:2118 -2151:3:2119 -2152:3:2123 -2153:3:2124 -2154:3:2132 -2155:3:2137 -2156:3:2141 -2157:3:2142 -2158:3:2149 -2159:3:2150 -2160:3:2161 -2161:3:2169 -2162:3:2170 -2163:3:2174 -2164:3:2179 -2165:3:2180 -2166:0:2565 -2167:3:2192 -2168:0:2565 -2169:3:2013 -2170:0:2565 -2171:3:2014 -2172:0:2565 -2173:2:469 -2174:0:2565 -2175:2:475 -2176:0:2565 -2177:2:476 -2178:0:2565 -2179:3:2015 -2180:3:2019 -2181:3:2020 -2182:3:2028 -2183:3:2029 -2184:3:2033 -2185:3:2034 -2186:3:2042 -2187:3:2047 -2188:3:2051 -2189:3:2052 -2190:3:2059 -2191:3:2060 -2192:3:2071 -2193:3:2079 -2194:3:2080 -2195:3:2084 -2196:3:2089 -2197:3:2090 -2198:0:2565 -2199:3:2102 -2200:0:2565 -2201:3:2104 -2202:0:2565 -2203:3:2105 -2204:3:2109 -2205:3:2110 -2206:3:2118 -2207:3:2119 -2208:3:2123 -2209:3:2124 -2210:3:2132 -2211:3:2137 -2212:3:2141 -2213:3:2142 -2214:3:2149 -2215:3:2150 -2216:3:2161 -2217:3:2169 -2218:3:2170 -2219:3:2174 -2220:3:2179 -2221:3:2180 -2222:0:2565 -2223:3:2192 -2224:0:2565 -2225:3:2013 -2226:0:2565 -2227:2:477 -2228:2:481 -2229:2:482 -2230:2:490 -2231:2:491 -2232:2:495 -2233:2:496 -2234:2:504 -2235:2:509 -2236:2:513 -2237:2:514 -2238:2:521 -2239:2:522 -2240:2:533 -2241:2:534 -2242:2:535 -2243:2:546 -2244:2:551 -2245:2:552 -2246:0:2565 -2247:3:2014 -2248:0:2565 -2249:3:2015 -2250:3:2019 -2251:3:2020 -2252:3:2028 -2253:3:2029 -2254:3:2033 -2255:3:2034 -2256:3:2042 -2257:3:2047 -2258:3:2051 -2259:3:2052 -2260:3:2059 -2261:3:2060 -2262:3:2071 -2263:3:2079 -2264:3:2080 -2265:3:2084 -2266:3:2089 -2267:3:2090 -2268:0:2565 -2269:3:2102 -2270:0:2565 -2271:3:2104 -2272:0:2565 -2273:3:2105 -2274:3:2109 -2275:3:2110 -2276:3:2118 -2277:3:2119 -2278:3:2123 -2279:3:2124 -2280:3:2132 -2281:3:2137 -2282:3:2141 -2283:3:2142 -2284:3:2149 -2285:3:2150 -2286:3:2161 -2287:3:2169 -2288:3:2170 -2289:3:2174 -2290:3:2179 -2291:3:2180 -2292:0:2565 -2293:3:2192 -2294:0:2565 -2295:2:564 -2296:0:2565 -2297:3:2013 -2298:0:2565 -2299:3:2014 -2300:0:2565 -2301:3:2015 -2302:3:2019 -2303:3:2020 -2304:3:2028 -2305:3:2029 -2306:3:2033 -2307:3:2034 -2308:3:2042 -2309:3:2047 -2310:3:2051 -2311:3:2052 -2312:3:2059 -2313:3:2060 -2314:3:2071 -2315:3:2079 -2316:3:2080 -2317:3:2084 -2318:3:2089 -2319:3:2090 -2320:0:2565 -2321:3:2102 -2322:0:2565 -2323:3:2104 -2324:0:2565 -2325:3:2105 -2326:3:2109 -2327:3:2110 -2328:3:2118 -2329:3:2119 -2330:3:2123 -2331:3:2124 -2332:3:2132 -2333:3:2137 -2334:3:2141 -2335:3:2142 -2336:3:2149 -2337:3:2150 -2338:3:2161 -2339:3:2169 -2340:3:2170 -2341:3:2174 -2342:3:2179 -2343:3:2180 -2344:0:2565 -2345:2:565 -2346:2:569 -2347:2:570 -2348:2:578 -2349:2:579 -2350:2:583 -2351:2:584 -2352:2:592 -2353:2:597 -2354:2:601 -2355:2:602 -2356:2:609 -2357:2:610 -2358:2:621 -2359:2:622 -2360:2:623 -2361:2:634 -2362:2:639 -2363:2:640 -2364:0:2565 -2365:3:2192 -2366:0:2565 -2367:3:2013 -2368:0:2565 -2369:2:652 -2370:0:2565 -2371:3:2014 -2372:0:2565 -2373:3:2015 -2374:3:2019 -2375:3:2020 -2376:3:2028 -2377:3:2029 -2378:3:2033 -2379:3:2034 -2380:3:2042 -2381:3:2047 -2382:3:2051 -2383:3:2052 -2384:3:2059 -2385:3:2060 -2386:3:2071 -2387:3:2079 -2388:3:2080 -2389:3:2084 -2390:3:2089 -2391:3:2090 -2392:0:2565 -2393:3:2102 -2394:0:2565 -2395:3:2104 -2396:0:2565 -2397:3:2105 -2398:3:2109 -2399:3:2110 -2400:3:2118 -2401:3:2119 -2402:3:2123 -2403:3:2124 -2404:3:2132 -2405:3:2137 -2406:3:2141 -2407:3:2142 -2408:3:2149 -2409:3:2150 -2410:3:2161 -2411:3:2169 -2412:3:2170 -2413:3:2174 -2414:3:2179 -2415:3:2180 -2416:0:2565 -2417:3:2192 -2418:0:2565 -2419:2:653 -2420:0:2565 -2421:3:2013 -2422:0:2565 -2423:3:2014 -2424:0:2565 -2425:3:2015 -2426:3:2019 -2427:3:2020 -2428:3:2028 -2429:3:2029 -2430:3:2033 -2431:3:2034 -2432:3:2042 -2433:3:2047 -2434:3:2051 -2435:3:2052 -2436:3:2059 -2437:3:2060 -2438:3:2071 -2439:3:2079 -2440:3:2080 -2441:3:2084 -2442:3:2089 -2443:3:2090 -2444:0:2565 -2445:3:2102 -2446:0:2565 -2447:3:2104 -2448:0:2565 -2449:3:2105 -2450:3:2109 -2451:3:2110 -2452:3:2118 -2453:3:2119 -2454:3:2123 -2455:3:2124 -2456:3:2132 -2457:3:2137 -2458:3:2141 -2459:3:2142 -2460:3:2149 -2461:3:2150 -2462:3:2161 -2463:3:2169 -2464:3:2170 -2465:3:2174 -2466:3:2179 -2467:3:2180 -2468:0:2565 -2469:2:654 -2470:2:658 -2471:2:659 -2472:2:667 -2473:2:668 -2474:2:672 -2475:2:673 -2476:2:681 -2477:2:686 -2478:2:690 -2479:2:691 -2480:2:698 -2481:2:699 -2482:2:710 -2483:2:711 -2484:2:712 -2485:2:723 -2486:2:728 -2487:2:729 -2488:0:2565 -2489:3:2192 -2490:0:2565 -2491:3:2013 -2492:0:2565 -2493:3:2014 -2494:0:2565 -2495:3:2015 -2496:3:2019 -2497:3:2020 -2498:3:2028 -2499:3:2029 -2500:3:2033 -2501:3:2034 -2502:3:2042 -2503:3:2047 -2504:3:2051 -2505:3:2052 -2506:3:2059 -2507:3:2060 -2508:3:2071 -2509:3:2079 -2510:3:2080 -2511:3:2084 -2512:3:2089 -2513:3:2090 -2514:0:2565 -2515:3:2102 -2516:0:2565 -2517:3:2104 -2518:0:2565 -2519:2:741 -2520:0:2565 -2521:2:750 -2522:0:2565 -2523:2:753 -2524:0:2565 -2525:3:2105 -2526:3:2109 -2527:3:2110 -2528:3:2118 -2529:3:2119 -2530:3:2123 -2531:3:2124 -2532:3:2132 -2533:3:2137 -2534:3:2141 -2535:3:2142 -2536:3:2149 -2537:3:2150 -2538:3:2161 -2539:3:2169 -2540:3:2170 -2541:3:2174 -2542:3:2179 -2543:3:2180 -2544:0:2565 -2545:3:2192 -2546:0:2565 -2547:3:2013 -2548:0:2565 -2549:3:2014 -2550:0:2565 -2551:3:2015 -2552:3:2019 -2553:3:2020 -2554:3:2028 -2555:3:2029 -2556:3:2033 -2557:3:2034 -2558:3:2042 -2559:3:2047 -2560:3:2051 -2561:3:2052 -2562:3:2059 -2563:3:2060 -2564:3:2071 -2565:3:2079 -2566:3:2080 -2567:3:2084 -2568:3:2089 -2569:3:2090 -2570:0:2565 -2571:3:2102 -2572:0:2565 -2573:2:758 -2574:0:2565 -2575:3:2104 -2576:0:2565 -2577:3:2105 -2578:3:2109 -2579:3:2110 -2580:3:2118 -2581:3:2119 -2582:3:2123 -2583:3:2124 -2584:3:2132 -2585:3:2137 -2586:3:2141 -2587:3:2142 -2588:3:2149 -2589:3:2150 -2590:3:2161 -2591:3:2169 -2592:3:2170 -2593:3:2174 -2594:3:2179 -2595:3:2180 -2596:0:2565 -2597:3:2192 -2598:0:2565 -2599:3:2013 -2600:0:2565 -2601:3:2014 -2602:0:2565 -2603:3:2015 -2604:3:2019 -2605:3:2020 -2606:3:2028 -2607:3:2029 -2608:3:2033 -2609:3:2034 -2610:3:2042 -2611:3:2047 -2612:3:2051 -2613:3:2052 -2614:3:2059 -2615:3:2060 -2616:3:2071 -2617:3:2079 -2618:3:2080 -2619:3:2084 -2620:3:2089 -2621:3:2090 -2622:0:2565 -2623:2:759 -2624:0:2565 -2625:3:2102 -2626:0:2565 -2627:3:2104 -2628:0:2565 -2629:3:2105 -2630:3:2109 -2631:3:2110 -2632:3:2118 -2633:3:2119 -2634:3:2123 -2635:3:2124 -2636:3:2132 -2637:3:2137 -2638:3:2141 -2639:3:2142 -2640:3:2149 -2641:3:2150 -2642:3:2161 -2643:3:2169 -2644:3:2170 -2645:3:2174 -2646:3:2179 -2647:3:2180 -2648:0:2565 -2649:3:2192 -2650:0:2565 -2651:3:2013 -2652:0:2565 -2653:3:2014 -2654:0:2565 -2655:2:760 -2656:0:2565 -2657:2:761 -2658:0:2565 -2659:2:762 -2660:0:2565 -2661:2:763 -2662:0:2565 -2663:3:2015 -2664:3:2019 -2665:3:2020 -2666:3:2028 -2667:3:2029 -2668:3:2033 -2669:3:2034 -2670:3:2042 -2671:3:2047 -2672:3:2051 -2673:3:2052 -2674:3:2059 -2675:3:2060 -2676:3:2071 -2677:3:2079 -2678:3:2080 -2679:3:2084 -2680:3:2089 -2681:3:2090 -2682:0:2565 -2683:3:2102 -2684:0:2565 -2685:3:2104 -2686:0:2565 -2687:3:2105 -2688:3:2109 -2689:3:2110 -2690:3:2118 -2691:3:2119 -2692:3:2123 -2693:3:2124 -2694:3:2132 -2695:3:2137 -2696:3:2141 -2697:3:2142 -2698:3:2149 -2699:3:2150 -2700:3:2161 -2701:3:2169 -2702:3:2170 -2703:3:2174 -2704:3:2179 -2705:3:2180 -2706:0:2565 -2707:3:2192 -2708:0:2565 -2709:3:2013 -2710:0:2565 -2711:2:765 -2712:0:2565 -2713:3:2014 -2714:0:2565 -2715:3:2015 -2716:3:2019 -2717:3:2020 -2718:3:2028 -2719:3:2029 -2720:3:2033 -2721:3:2034 -2722:3:2042 -2723:3:2047 -2724:3:2051 -2725:3:2052 -2726:3:2059 -2727:3:2060 -2728:3:2071 -2729:3:2079 -2730:3:2080 -2731:3:2084 -2732:3:2089 -2733:3:2090 -2734:0:2565 -2735:3:2102 -2736:0:2565 -2737:3:2104 -2738:0:2565 -2739:3:2105 -2740:3:2109 -2741:3:2110 -2742:3:2118 -2743:3:2119 -2744:3:2123 -2745:3:2124 -2746:3:2132 -2747:3:2137 -2748:3:2141 -2749:3:2142 -2750:3:2149 -2751:3:2150 -2752:3:2161 -2753:3:2169 -2754:3:2170 -2755:3:2174 -2756:3:2179 -2757:3:2180 -2758:0:2565 -2759:3:2192 -2760:0:2565 -2761:2:766 -2762:2:770 -2763:2:771 -2764:2:779 -2765:2:780 -2766:2:781 -2767:2:793 -2768:2:798 -2769:2:802 -2770:2:803 -2771:2:810 -2772:2:811 -2773:2:822 -2774:2:823 -2775:2:824 -2776:2:835 -2777:2:840 -2778:2:841 -2779:0:2565 -2780:3:2013 -2781:0:2565 -2782:3:2014 -2783:0:2565 -2784:3:2015 -2785:3:2019 -2786:3:2020 -2787:3:2028 -2788:3:2029 -2789:3:2033 -2790:3:2034 -2791:3:2042 -2792:3:2047 -2793:3:2051 -2794:3:2052 -2795:3:2059 -2796:3:2060 -2797:3:2071 -2798:3:2079 -2799:3:2080 -2800:3:2084 -2801:3:2089 -2802:3:2090 -2803:0:2565 -2804:3:2102 -2805:0:2565 -2806:3:2104 -2807:0:2565 -2808:3:2105 -2809:3:2109 -2810:3:2110 -2811:3:2118 -2812:3:2119 -2813:3:2123 -2814:3:2124 -2815:3:2132 -2816:3:2137 -2817:3:2141 -2818:3:2142 -2819:3:2149 -2820:3:2150 -2821:3:2161 -2822:3:2169 -2823:3:2170 -2824:3:2174 -2825:3:2179 -2826:3:2180 -2827:0:2565 -2828:2:853 -2829:0:2565 -2830:3:2192 -2831:0:2565 -2832:3:2013 -2833:0:2565 -2834:2:857 -2835:0:2565 -2836:2:465 -2837:0:2565 -2838:3:2014 -2839:0:2565 -2840:3:2015 -2841:3:2019 -2842:3:2020 -2843:3:2028 -2844:3:2029 -2845:3:2033 -2846:3:2034 -2847:3:2042 -2848:3:2047 -2849:3:2051 -2850:3:2052 -2851:3:2059 -2852:3:2060 -2853:3:2071 -2854:3:2079 -2855:3:2080 -2856:3:2084 -2857:3:2089 -2858:3:2090 -2859:0:2565 -2860:3:2102 -2861:0:2565 -2862:3:2104 -2863:0:2565 -2864:3:2105 -2865:3:2109 -2866:3:2110 -2867:3:2118 -2868:3:2119 -2869:3:2123 -2870:3:2124 -2871:3:2132 -2872:3:2137 -2873:3:2141 -2874:3:2142 -2875:3:2149 -2876:3:2150 -2877:3:2161 -2878:3:2169 -2879:3:2170 -2880:3:2174 -2881:3:2179 -2882:3:2180 -2883:0:2565 -2884:3:2192 -2885:0:2565 -2886:2:466 -2887:0:2565 -2888:3:2013 -2889:0:2565 -2890:3:2014 -2891:0:2565 -2892:3:2015 -2893:3:2019 -2894:3:2020 -2895:3:2028 -2896:3:2029 -2897:3:2033 -2898:3:2034 -2899:3:2042 -2900:3:2047 -2901:3:2051 -2902:3:2052 -2903:3:2059 -2904:3:2060 -2905:3:2071 -2906:3:2079 -2907:3:2080 -2908:3:2084 -2909:3:2089 -2910:3:2090 -2911:0:2565 -2912:3:2102 -2913:0:2565 -2914:3:2104 -2915:0:2565 -2916:3:2105 -2917:3:2109 -2918:3:2110 -2919:3:2118 -2920:3:2119 -2921:3:2123 -2922:3:2124 -2923:3:2132 -2924:3:2137 -2925:3:2141 -2926:3:2142 -2927:3:2149 -2928:3:2150 -2929:3:2161 -2930:3:2169 -2931:3:2170 -2932:3:2174 -2933:3:2179 -2934:3:2180 -2935:0:2565 -2936:2:467 -2937:0:2565 -2938:3:2192 -2939:0:2565 -2940:3:2013 -2941:0:2565 -2942:3:2014 -2943:0:2565 -2944:3:2015 -2945:3:2019 -2946:3:2020 -2947:3:2028 -2948:3:2029 -2949:3:2033 -2950:3:2034 -2951:3:2042 -2952:3:2047 -2953:3:2051 -2954:3:2052 -2955:3:2059 -2956:3:2060 -2957:3:2071 -2958:3:2079 -2959:3:2080 -2960:3:2084 -2961:3:2089 -2962:3:2090 -2963:0:2565 -2964:3:2102 -2965:0:2565 -2966:3:2104 -2967:0:2565 -2968:1:297 -2969:0:2565 -2970:2:468 -2971:0:2565 -2972:3:2105 -2973:3:2109 -2974:3:2110 -2975:3:2118 -2976:3:2119 -2977:3:2123 -2978:3:2124 -2979:3:2132 -2980:3:2137 -2981:3:2141 -2982:3:2142 -2983:3:2149 -2984:3:2150 -2985:3:2161 -2986:3:2169 -2987:3:2170 -2988:3:2174 -2989:3:2179 -2990:3:2180 -2991:0:2565 -2992:3:2192 -2993:0:2565 -2994:3:2013 -2995:0:2565 -2996:3:2014 -2997:0:2565 -2998:3:2015 -2999:3:2019 -3000:3:2020 -3001:3:2028 -3002:3:2029 -3003:3:2033 -3004:3:2034 -3005:3:2042 -3006:3:2047 -3007:3:2051 -3008:3:2052 -3009:3:2059 -3010:3:2060 -3011:3:2071 -3012:3:2079 -3013:3:2080 -3014:3:2084 -3015:3:2089 -3016:3:2090 -3017:0:2565 -3018:3:2102 -3019:0:2565 -3020:3:2104 -3021:0:2565 -3022:2:467 -3023:0:2565 -3024:2:468 -3025:0:2565 -3026:3:2105 -3027:3:2109 -3028:3:2110 -3029:3:2118 -3030:3:2119 -3031:3:2123 -3032:3:2124 -3033:3:2132 -3034:3:2137 -3035:3:2141 -3036:3:2142 -3037:3:2149 -3038:3:2150 -3039:3:2161 -3040:3:2169 -3041:3:2170 -3042:3:2174 -3043:3:2179 -3044:3:2180 -3045:0:2565 -3046:3:2192 -3047:0:2565 -3048:3:2013 -3049:0:2565 -3050:3:2014 -3051:0:2565 -3052:3:2015 -3053:3:2019 -3054:3:2020 -3055:3:2028 -3056:3:2029 -3057:3:2033 -3058:3:2034 -3059:3:2042 -3060:3:2047 -3061:3:2051 -3062:3:2052 -3063:3:2059 -3064:3:2060 -3065:3:2071 -3066:3:2079 -3067:3:2080 -3068:3:2084 -3069:3:2089 -3070:3:2090 -3071:0:2565 -3072:3:2102 -3073:0:2565 -3074:2:467 -3075:0:2565 -3076:1:303 -3077:0:2565 -3078:2:468 -3079:0:2565 -3080:1:312 -3081:0:2565 -3082:3:2104 -3083:0:2565 -3084:3:2105 -3085:3:2109 -3086:3:2110 -3087:3:2118 -3088:3:2119 -3089:3:2123 -3090:3:2124 -3091:3:2132 -3092:3:2137 -3093:3:2141 -3094:3:2142 -3095:3:2149 -3096:3:2150 -3097:3:2161 -3098:3:2169 -3099:3:2170 -3100:3:2174 -3101:3:2179 -3102:3:2180 -3103:0:2565 -3104:3:2192 -3105:0:2565 -3106:3:2013 -3107:0:2565 -3108:3:2014 -3109:0:2565 -3110:3:2015 -3111:3:2019 -3112:3:2020 -3113:3:2028 -3114:3:2029 -3115:3:2033 -3116:3:2034 -3117:3:2042 -3118:3:2047 -3119:3:2051 -3120:3:2052 -3121:3:2059 -3122:3:2060 -3123:3:2071 -3124:3:2079 -3125:3:2080 -3126:3:2084 -3127:3:2089 -3128:3:2090 -3129:0:2565 -3130:3:2102 -3131:0:2565 -3132:2:467 -3133:0:2565 -3134:2:468 -3135:0:2565 -3136:3:2104 -3137:0:2565 -3138:3:2105 -3139:3:2109 -3140:3:2110 -3141:3:2118 -3142:3:2119 -3143:3:2123 -3144:3:2124 -3145:3:2132 -3146:3:2137 -3147:3:2141 -3148:3:2142 -3149:3:2149 -3150:3:2150 -3151:3:2161 -3152:3:2169 -3153:3:2170 -3154:3:2174 -3155:3:2179 -3156:3:2180 -3157:0:2565 -3158:3:2192 -3159:0:2565 -3160:3:2013 -3161:0:2565 -3162:3:2014 -3163:0:2565 -3164:3:2015 -3165:3:2019 -3166:3:2020 -3167:3:2028 -3168:3:2029 -3169:3:2033 -3170:3:2034 -3171:3:2042 -3172:3:2047 -3173:3:2051 -3174:3:2052 -3175:3:2059 -3176:3:2060 -3177:3:2071 -3178:3:2079 -3179:3:2080 -3180:3:2084 -3181:3:2089 -3182:3:2090 -3183:0:2565 -3184:2:467 -3185:0:2565 -3186:1:314 -3187:0:2565 -3188:3:2102 -3189:0:2565 -3190:2:468 -3191:0:2565 -3192:3:2104 -3193:0:2565 -3194:3:2105 -3195:3:2109 -3196:3:2110 -3197:3:2118 -3198:3:2119 -3199:3:2123 -3200:3:2124 -3201:3:2132 -3202:3:2137 -3203:3:2141 -3204:3:2142 -3205:3:2149 -3206:3:2150 -3207:3:2161 -3208:3:2169 -3209:3:2170 -3210:3:2174 -3211:3:2179 -3212:3:2180 -3213:0:2565 -3214:3:2192 -3215:0:2565 -3216:3:2013 -3217:0:2565 -3218:3:2014 -3219:0:2565 -3220:3:2015 -3221:3:2019 -3222:3:2020 -3223:3:2028 -3224:3:2029 -3225:3:2033 -3226:3:2034 -3227:3:2042 -3228:3:2047 -3229:3:2051 -3230:3:2052 -3231:3:2059 -3232:3:2060 -3233:3:2071 -3234:3:2079 -3235:3:2080 -3236:3:2084 -3237:3:2089 -3238:3:2090 -3239:0:2565 -3240:2:469 -3241:0:2565 -3242:3:2102 -3243:0:2565 -3244:2:475 -3245:0:2565 -3246:2:476 -3247:0:2565 -3248:3:2104 -3249:0:2565 -3250:3:2105 -3251:3:2109 -3252:3:2110 -3253:3:2118 -3254:3:2119 -3255:3:2123 -3256:3:2124 -3257:3:2132 -3258:3:2137 -3259:3:2141 -3260:3:2142 -3261:3:2149 -3262:3:2150 -3263:3:2161 -3264:3:2169 -3265:3:2170 -3266:3:2174 -3267:3:2179 -3268:3:2180 -3269:0:2565 -3270:3:2192 -3271:0:2565 -3272:3:2013 -3273:0:2565 -3274:3:2014 -3275:0:2565 -3276:3:2015 -3277:3:2019 -3278:3:2020 -3279:3:2028 -3280:3:2029 -3281:3:2033 -3282:3:2034 -3283:3:2042 -3284:3:2047 -3285:3:2051 -3286:3:2052 -3287:3:2059 -3288:3:2060 -3289:3:2071 -3290:3:2079 -3291:3:2080 -3292:3:2084 -3293:3:2089 -3294:3:2090 -3295:0:2565 -3296:2:477 -3297:2:481 -3298:2:482 -3299:2:490 -3300:2:491 -3301:2:492 -3302:2:504 -3303:2:509 -3304:2:513 -3305:2:514 -3306:2:521 -3307:2:522 -3308:2:533 -3309:2:534 -3310:2:535 -3311:2:546 -3312:2:551 -3313:2:552 -3314:0:2565 -3315:3:2102 -3316:0:2565 -3317:3:2104 -3318:0:2565 -3319:3:2105 -3320:3:2109 -3321:3:2110 -3322:3:2118 -3323:3:2119 -3324:3:2123 -3325:3:2124 -3326:3:2132 -3327:3:2137 -3328:3:2141 -3329:3:2142 -3330:3:2149 -3331:3:2150 -3332:3:2161 -3333:3:2169 -3334:3:2170 -3335:3:2174 -3336:3:2179 -3337:3:2180 -3338:0:2565 -3339:3:2192 -3340:0:2565 -3341:3:2013 -3342:0:2565 -3343:3:2014 -3344:0:2565 -3345:2:564 -3346:0:2565 -3347:3:2015 -3348:3:2019 -3349:3:2020 -3350:3:2028 -3351:3:2029 -3352:3:2033 -3353:3:2034 -3354:3:2042 -3355:3:2047 -3356:3:2051 -3357:3:2052 -3358:3:2059 -3359:3:2060 -3360:3:2071 -3361:3:2079 -3362:3:2080 -3363:3:2084 -3364:3:2089 -3365:3:2090 -3366:0:2565 -3367:3:2102 -3368:0:2565 -3369:3:2104 -3370:0:2565 -3371:3:2105 -3372:3:2109 -3373:3:2110 -3374:3:2118 -3375:3:2119 -3376:3:2123 -3377:3:2124 -3378:3:2132 -3379:3:2137 -3380:3:2141 -3381:3:2142 -3382:3:2149 -3383:3:2150 -3384:3:2161 -3385:3:2169 -3386:3:2170 -3387:3:2174 -3388:3:2179 -3389:3:2180 -3390:0:2565 -3391:3:2192 -3392:0:2565 -3393:3:2013 -3394:0:2565 -3395:2:565 -3396:2:569 -3397:2:570 -3398:2:578 -3399:2:579 -3400:2:583 -3401:2:584 -3402:2:592 -3403:2:597 -3404:2:601 -3405:2:602 -3406:2:609 -3407:2:610 -3408:2:621 -3409:2:622 -3410:2:623 -3411:2:634 -3412:2:639 -3413:2:640 -3414:0:2565 -3415:2:744 -3416:0:2565 -3417:3:2014 -3418:0:2565 -3419:3:2015 -3420:3:2019 -3421:3:2020 -3422:3:2028 -3423:3:2029 -3424:3:2033 -3425:3:2034 -3426:3:2042 -3427:3:2047 -3428:3:2051 -3429:3:2052 -3430:3:2059 -3431:3:2060 -3432:3:2071 -3433:3:2079 -3434:3:2080 -3435:3:2084 -3436:3:2089 -3437:3:2090 -3438:0:2565 -3439:3:2102 -3440:0:2565 -3441:3:2104 -3442:0:2565 -3443:3:2105 -3444:3:2109 -3445:3:2110 -3446:3:2118 -3447:3:2119 -3448:3:2123 -3449:3:2124 -3450:3:2132 -3451:3:2137 -3452:3:2141 -3453:3:2142 -3454:3:2149 -3455:3:2150 -3456:3:2161 -3457:3:2169 -3458:3:2170 -3459:3:2174 -3460:3:2179 -3461:3:2180 -3462:0:2565 -3463:3:2192 -3464:0:2565 -3465:2:745 -3466:0:2565 -3467:3:2013 -3468:0:2565 -3469:2:750 -3470:0:2565 -3471:2:753 -3472:0:2565 -3473:3:2014 -3474:0:2565 -3475:3:2015 -3476:3:2019 -3477:3:2020 -3478:3:2028 -3479:3:2029 -3480:3:2033 -3481:3:2034 -3482:3:2042 -3483:3:2047 -3484:3:2051 -3485:3:2052 -3486:3:2059 -3487:3:2060 -3488:3:2071 -3489:3:2079 -3490:3:2080 -3491:3:2084 -3492:3:2089 -3493:3:2090 -3494:0:2565 -3495:3:2102 -3496:0:2565 -3497:3:2104 -3498:0:2565 -3499:3:2105 -3500:3:2109 -3501:3:2110 -3502:3:2118 -3503:3:2119 -3504:3:2123 -3505:3:2124 -3506:3:2132 -3507:3:2137 -3508:3:2141 -3509:3:2142 -3510:3:2149 -3511:3:2150 -3512:3:2161 -3513:3:2169 -3514:3:2170 -3515:3:2174 -3516:3:2179 -3517:3:2180 -3518:0:2565 -3519:3:2192 -3520:0:2565 -3521:2:758 -3522:0:2565 -3523:3:2013 -3524:0:2565 -3525:3:2014 -3526:0:2565 -3527:3:2015 -3528:3:2019 -3529:3:2020 -3530:3:2028 -3531:3:2029 -3532:3:2033 -3533:3:2034 -3534:3:2042 -3535:3:2047 -3536:3:2051 -3537:3:2052 -3538:3:2059 -3539:3:2060 -3540:3:2071 -3541:3:2079 -3542:3:2080 -3543:3:2084 -3544:3:2089 -3545:3:2090 -3546:0:2565 -3547:3:2102 -3548:0:2565 -3549:3:2104 -3550:0:2565 -3551:3:2105 -3552:3:2109 -3553:3:2110 -3554:3:2118 -3555:3:2119 -3556:3:2123 -3557:3:2124 -3558:3:2132 -3559:3:2137 -3560:3:2141 -3561:3:2142 -3562:3:2149 -3563:3:2150 -3564:3:2161 -3565:3:2169 -3566:3:2170 -3567:3:2174 -3568:3:2179 -3569:3:2180 -3570:0:2565 -3571:2:759 -3572:0:2565 -3573:3:2192 -3574:0:2565 -3575:3:2013 -3576:0:2565 -3577:3:2014 -3578:0:2565 -3579:3:2015 -3580:3:2019 -3581:3:2020 -3582:3:2028 -3583:3:2029 -3584:3:2033 -3585:3:2034 -3586:3:2042 -3587:3:2047 -3588:3:2051 -3589:3:2052 -3590:3:2059 -3591:3:2060 -3592:3:2071 -3593:3:2079 -3594:3:2080 -3595:3:2084 -3596:3:2089 -3597:3:2090 -3598:0:2565 -3599:3:2102 -3600:0:2565 -3601:3:2104 -3602:0:2565 -3603:2:760 -3604:0:2565 -3605:2:761 -3606:0:2565 -3607:2:762 -3608:0:2565 -3609:2:763 -3610:0:2565 -3611:3:2105 -3612:3:2109 -3613:3:2110 -3614:3:2118 -3615:3:2119 -3616:3:2123 -3617:3:2124 -3618:3:2132 -3619:3:2137 -3620:3:2141 -3621:3:2142 -3622:3:2149 -3623:3:2150 -3624:3:2161 -3625:3:2169 -3626:3:2170 -3627:3:2174 -3628:3:2179 -3629:3:2180 -3630:0:2565 -3631:3:2192 -3632:0:2565 -3633:3:2013 -3634:0:2565 -3635:3:2014 -3636:0:2565 -3637:3:2015 -3638:3:2019 -3639:3:2020 -3640:3:2028 -3641:3:2029 -3642:3:2033 -3643:3:2034 -3644:3:2042 -3645:3:2047 -3646:3:2051 -3647:3:2052 -3648:3:2059 -3649:3:2060 -3650:3:2071 -3651:3:2079 -3652:3:2080 -3653:3:2084 -3654:3:2089 -3655:3:2090 -3656:0:2565 -3657:3:2102 -3658:0:2565 -3659:2:765 -3660:0:2565 -3661:3:2104 -3662:0:2565 -3663:3:2105 -3664:3:2109 -3665:3:2110 -3666:3:2118 -3667:3:2119 -3668:3:2123 -3669:3:2124 -3670:3:2132 -3671:3:2137 -3672:3:2141 -3673:3:2142 -3674:3:2149 -3675:3:2150 -3676:3:2161 -3677:3:2169 -3678:3:2170 -3679:3:2174 -3680:3:2179 -3681:3:2180 -3682:0:2565 -3683:3:2192 -3684:0:2565 -3685:3:2013 -3686:0:2565 -3687:3:2014 -3688:0:2565 -3689:3:2015 -3690:3:2019 -3691:3:2020 -3692:3:2028 -3693:3:2029 -3694:3:2033 -3695:3:2034 -3696:3:2042 -3697:3:2047 -3698:3:2051 -3699:3:2052 -3700:3:2059 -3701:3:2060 -3702:3:2071 -3703:3:2079 -3704:3:2080 -3705:3:2084 -3706:3:2089 -3707:3:2090 -3708:0:2565 -3709:2:766 -3710:2:770 -3711:2:771 -3712:2:779 -3713:2:780 -3714:2:781 -3715:2:793 -3716:2:798 -3717:2:802 -3718:2:803 -3719:2:810 -3720:2:811 -3721:2:822 -3722:2:823 -3723:2:824 -3724:2:835 -3725:2:840 -3726:2:841 -3727:0:2565 -3728:3:2102 -3729:0:2565 -3730:3:2104 -3731:0:2565 -3732:3:2105 -3733:3:2109 -3734:3:2110 -3735:3:2118 -3736:3:2119 -3737:3:2123 -3738:3:2124 -3739:3:2132 -3740:3:2137 -3741:3:2141 -3742:3:2142 -3743:3:2149 -3744:3:2150 -3745:3:2161 -3746:3:2169 -3747:3:2170 -3748:3:2174 -3749:3:2179 -3750:3:2180 -3751:0:2565 -3752:3:2192 -3753:0:2565 -3754:3:2013 -3755:0:2565 -3756:3:2014 -3757:0:2565 -3758:2:853 -3759:0:2565 -3760:2:857 -3761:0:2565 -3762:2:465 -3763:0:2565 -3764:3:2015 -3765:3:2019 -3766:3:2020 -3767:3:2028 -3768:3:2029 -3769:3:2033 -3770:3:2034 -3771:3:2042 -3772:3:2047 -3773:3:2051 -3774:3:2052 -3775:3:2059 -3776:3:2060 -3777:3:2071 -3778:3:2079 -3779:3:2080 -3780:3:2084 -3781:3:2089 -3782:3:2090 -3783:0:2565 -3784:3:2102 -3785:0:2565 -3786:3:2104 -3787:0:2565 -3788:3:2105 -3789:3:2109 -3790:3:2110 -3791:3:2118 -3792:3:2119 -3793:3:2123 -3794:3:2124 -3795:3:2132 -3796:3:2137 -3797:3:2141 -3798:3:2142 -3799:3:2149 -3800:3:2150 -3801:3:2161 -3802:3:2169 -3803:3:2170 -3804:3:2174 -3805:3:2179 -3806:3:2180 -3807:0:2565 -3808:3:2192 -3809:0:2565 -3810:3:2013 -3811:0:2565 -3812:2:466 -3813:0:2565 -3814:3:2014 -3815:0:2565 -3816:3:2015 -3817:3:2019 -3818:3:2020 -3819:3:2028 -3820:3:2029 -3821:3:2033 -3822:3:2034 -3823:3:2042 -3824:3:2047 -3825:3:2051 -3826:3:2052 -3827:3:2059 -3828:3:2060 -3829:3:2071 -3830:3:2079 -3831:3:2080 -3832:3:2084 -3833:3:2089 -3834:3:2090 -3835:0:2565 -3836:3:2102 -3837:0:2565 -3838:3:2104 -3839:0:2565 -3840:3:2105 -3841:3:2109 -3842:3:2110 -3843:3:2118 -3844:3:2119 -3845:3:2123 -3846:3:2124 -3847:3:2132 -3848:3:2137 -3849:3:2141 -3850:3:2142 -3851:3:2149 -3852:3:2150 -3853:3:2161 -3854:3:2169 -3855:3:2170 -3856:3:2174 -3857:3:2179 -3858:3:2180 -3859:0:2565 -3860:3:2192 -3861:0:2565 -3862:2:467 -3863:0:2565 -3864:3:2013 -3865:0:2565 -3866:3:2014 -3867:0:2565 -3868:3:2015 -3869:3:2019 -3870:3:2020 -3871:3:2028 -3872:3:2029 -3873:3:2033 -3874:3:2034 -3875:3:2042 -3876:3:2047 -3877:3:2051 -3878:3:2052 -3879:3:2059 -3880:3:2060 -3881:3:2071 -3882:3:2079 -3883:3:2080 -3884:3:2084 -3885:3:2089 -3886:3:2090 -3887:0:2565 -3888:3:2102 -3889:0:2565 -3890:3:2104 -3891:0:2565 -3892:3:2105 -3893:3:2109 -3894:3:2110 -3895:3:2118 -3896:3:2119 -3897:3:2123 -3898:3:2124 -3899:3:2132 -3900:3:2137 -3901:3:2141 -3902:3:2142 -3903:3:2149 -3904:3:2150 -3905:3:2161 -3906:3:2169 -3907:3:2170 -3908:3:2174 -3909:3:2179 -3910:3:2180 -3911:0:2565 -3912:1:317 -3913:0:2565 -3914:3:2192 -3915:0:2565 -3916:3:2013 -3917:0:2565 -3918:2:468 -3919:0:2565 -3920:1:323 -3921:0:2565 -3922:1:324 -3923:0:2565 -3924:3:2014 -3925:0:2565 -3926:3:2015 -3927:3:2019 -3928:3:2020 -3929:3:2028 -3930:3:2029 -3931:3:2033 -3932:3:2034 -3933:3:2042 -3934:3:2047 -3935:3:2051 -3936:3:2052 -3937:3:2059 -3938:3:2060 -3939:3:2071 -3940:3:2079 -3941:3:2080 -3942:3:2084 -3943:3:2089 -3944:3:2090 -3945:0:2565 -3946:3:2102 -3947:0:2565 -3948:3:2104 -3949:0:2565 -3950:3:2105 -3951:3:2109 -3952:3:2110 -3953:3:2118 -3954:3:2119 -3955:3:2123 -3956:3:2124 -3957:3:2132 -3958:3:2137 -3959:3:2141 -3960:3:2142 -3961:3:2149 -3962:3:2150 -3963:3:2161 -3964:3:2169 -3965:3:2170 -3966:3:2174 -3967:3:2179 -3968:3:2180 -3969:0:2565 -3970:3:2192 -3971:0:2565 -3972:3:2013 -3973:0:2565 -3974:2:467 -3975:0:2565 -3976:2:468 -3977:0:2565 -3978:3:2014 -3979:0:2565 -3980:3:2015 -3981:3:2019 -3982:3:2020 -3983:3:2028 -3984:3:2029 -3985:3:2033 -3986:3:2034 -3987:3:2042 -3988:3:2047 -3989:3:2051 -3990:3:2052 -3991:3:2059 -3992:3:2060 -3993:3:2071 -3994:3:2079 -3995:3:2080 -3996:3:2084 -3997:3:2089 -3998:3:2090 -3999:0:2565 -4000:3:2102 -4001:0:2565 -4002:3:2104 -4003:0:2565 -4004:3:2105 -4005:3:2109 -4006:3:2110 -4007:3:2118 -4008:3:2119 -4009:3:2123 -4010:3:2124 -4011:3:2132 -4012:3:2137 -4013:3:2141 -4014:3:2142 -4015:3:2149 -4016:3:2150 -4017:3:2161 -4018:3:2169 -4019:3:2170 -4020:3:2174 -4021:3:2179 -4022:3:2180 -4023:0:2565 -4024:3:2192 -4025:0:2565 -4026:2:467 -4027:0:2565 -4028:1:329 -4029:0:2565 -4030:3:2013 -4031:0:2565 -4032:2:468 -4033:0:2565 -4034:3:2014 -4035:0:2565 -4036:3:2015 -4037:3:2019 -4038:3:2020 -4039:3:2028 -4040:3:2029 -4041:3:2033 -4042:3:2034 -4043:3:2042 -4044:3:2047 -4045:3:2051 -4046:3:2052 -4047:3:2059 -4048:3:2060 -4049:3:2071 -4050:3:2079 -4051:3:2080 -4052:3:2084 -4053:3:2089 -4054:3:2090 -4055:0:2565 -4056:3:2102 -4057:0:2565 -4058:3:2104 -4059:0:2565 -4060:3:2105 -4061:3:2109 -4062:3:2110 -4063:3:2118 -4064:3:2119 -4065:3:2123 -4066:3:2124 -4067:3:2132 -4068:3:2137 -4069:3:2141 -4070:3:2142 -4071:3:2149 -4072:3:2150 -4073:3:2161 -4074:3:2169 -4075:3:2170 -4076:3:2174 -4077:3:2179 -4078:3:2180 -4079:0:2565 -4080:3:2192 -4081:0:2565 -4082:2:467 -4083:0:2565 -4084:3:2013 -4085:0:2565 -4086:3:2014 -4087:0:2565 -4088:3:2015 -4089:3:2019 -4090:3:2020 -4091:3:2028 -4092:3:2029 -4093:3:2033 -4094:3:2034 -4095:3:2042 -4096:3:2047 -4097:3:2051 -4098:3:2052 -4099:3:2059 -4100:3:2060 -4101:3:2071 -4102:3:2079 -4103:3:2080 -4104:3:2084 -4105:3:2089 -4106:3:2090 -4107:0:2565 -4108:3:2102 -4109:0:2565 -4110:3:2104 -4111:0:2565 -4112:3:2105 -4113:3:2109 -4114:3:2110 -4115:3:2118 -4116:3:2119 -4117:3:2123 -4118:3:2124 -4119:3:2132 -4120:3:2137 -4121:3:2141 -4122:3:2142 -4123:3:2149 -4124:3:2150 -4125:3:2161 -4126:3:2169 -4127:3:2170 -4128:3:2174 -4129:3:2179 -4130:3:2180 -4131:0:2565 -4132:1:330 -4133:0:2565 -4134:3:2192 -4135:0:2565 -4136:3:2013 -4137:0:2565 -4138:2:468 -4139:0:2565 -4140:3:2014 -4141:0:2565 -4142:3:2015 -4143:3:2019 -4144:3:2020 -4145:3:2028 -4146:3:2029 -4147:3:2033 -4148:3:2034 -4149:3:2042 -4150:3:2047 -4151:3:2051 -4152:3:2052 -4153:3:2059 -4154:3:2060 -4155:3:2071 -4156:3:2079 -4157:3:2080 -4158:3:2084 -4159:3:2089 -4160:3:2090 -4161:0:2565 -4162:3:2102 -4163:0:2565 -4164:3:2104 -4165:0:2565 -4166:3:2105 -4167:3:2109 -4168:3:2110 -4169:3:2118 -4170:3:2119 -4171:3:2123 -4172:3:2124 -4173:3:2132 -4174:3:2137 -4175:3:2141 -4176:3:2142 -4177:3:2149 -4178:3:2150 -4179:3:2161 -4180:3:2169 -4181:3:2170 -4182:3:2174 -4183:3:2179 -4184:3:2180 -4185:0:2565 -4186:3:2192 -4187:0:2565 -4188:2:467 -4189:0:2565 -4190:3:2013 -4191:0:2565 -4192:3:2014 -4193:0:2565 -4194:3:2015 -4195:3:2019 -4196:3:2020 -4197:3:2028 -4198:3:2029 -4199:3:2033 -4200:3:2034 -4201:3:2042 -4202:3:2047 -4203:3:2051 -4204:3:2052 -4205:3:2059 -4206:3:2060 -4207:3:2071 -4208:3:2079 -4209:3:2080 -4210:3:2084 -4211:3:2089 -4212:3:2090 -4213:0:2565 -4214:3:2102 -4215:0:2565 -4216:3:2104 -4217:0:2565 -4218:3:2105 -4219:3:2109 -4220:3:2110 -4221:3:2118 -4222:3:2119 -4223:3:2123 -4224:3:2124 -4225:3:2132 -4226:3:2137 -4227:3:2141 -4228:3:2142 -4229:3:2149 -4230:3:2150 -4231:3:2161 -4232:3:2169 -4233:3:2170 -4234:3:2174 -4235:3:2179 -4236:3:2180 -4237:0:2565 -4238:1:331 -4239:0:2565 -4240:3:2192 -4241:0:2565 -4242:3:2013 -4243:0:2565 -4244:2:468 -4245:0:2565 -4246:1:332 -4247:0:2565 -4248:1:333 -4249:0:2565 -4250:1:334 -4251:0:2565 -4252:3:2014 -4253:0:2565 -4254:3:2015 -4255:3:2019 -4256:3:2020 -4257:3:2028 -4258:3:2029 -4259:3:2033 -4260:3:2034 -4261:3:2042 -4262:3:2047 -4263:3:2051 -4264:3:2052 -4265:3:2059 -4266:3:2060 -4267:3:2071 -4268:3:2079 -4269:3:2080 -4270:3:2084 -4271:3:2089 -4272:3:2090 -4273:0:2565 -4274:3:2102 -4275:0:2565 -4276:3:2104 -4277:0:2565 -4278:3:2105 -4279:3:2109 -4280:3:2110 -4281:3:2118 -4282:3:2119 -4283:3:2123 -4284:3:2124 -4285:3:2132 -4286:3:2137 -4287:3:2141 -4288:3:2142 -4289:3:2149 -4290:3:2150 -4291:3:2161 -4292:3:2169 -4293:3:2170 -4294:3:2174 -4295:3:2179 -4296:3:2180 -4297:0:2565 -4298:3:2192 -4299:0:2565 -4300:3:2013 -4301:0:2565 -4302:2:467 -4303:0:2565 -4304:2:468 -4305:0:2565 -4306:3:2014 -4307:0:2565 -4308:3:2015 -4309:3:2019 -4310:3:2020 -4311:3:2028 -4312:3:2029 -4313:3:2033 -4314:3:2034 -4315:3:2042 -4316:3:2047 -4317:3:2051 -4318:3:2052 -4319:3:2059 -4320:3:2060 -4321:3:2071 -4322:3:2079 -4323:3:2080 -4324:3:2084 -4325:3:2089 -4326:3:2090 -4327:0:2565 -4328:3:2102 -4329:0:2565 -4330:3:2104 -4331:0:2565 -4332:3:2105 -4333:3:2109 -4334:3:2110 -4335:3:2118 -4336:3:2119 -4337:3:2123 -4338:3:2124 -4339:3:2132 -4340:3:2137 -4341:3:2141 -4342:3:2142 -4343:3:2149 -4344:3:2150 -4345:3:2161 -4346:3:2169 -4347:3:2170 -4348:3:2174 -4349:3:2179 -4350:3:2180 -4351:0:2565 -4352:3:2192 -4353:0:2565 -4354:2:467 -4355:0:2565 -4356:1:336 -4357:0:2565 -4358:3:2013 -4359:0:2565 -4360:2:468 -4361:0:2565 -4362:3:2014 -4363:0:2565 -4364:3:2015 -4365:3:2019 -4366:3:2020 -4367:3:2028 -4368:3:2029 -4369:3:2033 -4370:3:2034 -4371:3:2042 -4372:3:2047 -4373:3:2051 -4374:3:2052 -4375:3:2059 -4376:3:2060 -4377:3:2071 -4378:3:2079 -4379:3:2080 -4380:3:2084 -4381:3:2089 -4382:3:2090 -4383:0:2565 -4384:3:2102 -4385:0:2565 -4386:3:2104 -4387:0:2565 -4388:3:2105 -4389:3:2109 -4390:3:2110 -4391:3:2118 -4392:3:2119 -4393:3:2123 -4394:3:2124 -4395:3:2132 -4396:3:2137 -4397:3:2141 -4398:3:2142 -4399:3:2149 -4400:3:2150 -4401:3:2161 -4402:3:2169 -4403:3:2170 -4404:3:2174 -4405:3:2179 -4406:3:2180 -4407:0:2565 -4408:3:2192 -4409:0:2565 -4410:2:469 -4411:0:2565 -4412:3:2013 -4413:0:2565 -4414:2:475 -4415:0:2565 -4416:2:476 -4417:0:2565 -4418:3:2014 -4419:0:2565 -4420:3:2015 -4421:3:2019 -4422:3:2020 -4423:3:2028 -4424:3:2029 -4425:3:2033 -4426:3:2034 -4427:3:2042 -4428:3:2047 -4429:3:2051 -4430:3:2052 -4431:3:2059 -4432:3:2060 -4433:3:2071 -4434:3:2079 -4435:3:2080 -4436:3:2084 -4437:3:2089 -4438:3:2090 -4439:0:2565 -4440:3:2102 -4441:0:2565 -4442:3:2104 -4443:0:2565 -4444:3:2105 -4445:3:2109 -4446:3:2110 -4447:3:2118 -4448:3:2119 -4449:3:2123 -4450:3:2124 -4451:3:2132 -4452:3:2137 -4453:3:2141 -4454:3:2142 -4455:3:2149 -4456:3:2150 -4457:3:2161 -4458:3:2169 -4459:3:2170 -4460:3:2174 -4461:3:2179 -4462:3:2180 -4463:0:2565 -4464:3:2192 -4465:0:2565 -4466:2:477 -4467:2:481 -4468:2:482 -4469:2:490 -4470:2:491 -4471:2:492 -4472:2:504 -4473:2:509 -4474:2:513 -4475:2:514 -4476:2:521 -4477:2:522 -4478:2:533 -4479:2:534 -4480:2:535 -4481:2:546 -4482:2:551 -4483:2:552 -4484:0:2565 -4485:3:2013 -4486:0:2565 -4487:3:2014 -4488:0:2565 -4489:3:2015 -4490:3:2019 -4491:3:2020 -4492:3:2028 -4493:3:2029 -4494:3:2033 -4495:3:2034 -4496:3:2042 -4497:3:2047 -4498:3:2051 -4499:3:2052 -4500:3:2059 -4501:3:2060 -4502:3:2071 -4503:3:2079 -4504:3:2080 -4505:3:2084 -4506:3:2089 -4507:3:2090 -4508:0:2565 -4509:3:2102 -4510:0:2565 -4511:3:2104 -4512:0:2565 -4513:3:2105 -4514:3:2109 -4515:3:2110 -4516:3:2118 -4517:3:2119 -4518:3:2123 -4519:3:2124 -4520:3:2132 -4521:3:2137 -4522:3:2141 -4523:3:2142 -4524:3:2149 -4525:3:2150 -4526:3:2161 -4527:3:2169 -4528:3:2170 -4529:3:2174 -4530:3:2179 -4531:3:2180 -4532:0:2565 -4533:2:564 -4534:0:2565 -4535:3:2192 -4536:0:2565 -4537:3:2013 -4538:0:2565 -4539:3:2014 -4540:0:2565 -4541:3:2015 -4542:3:2019 -4543:3:2020 -4544:3:2028 -4545:3:2029 -4546:3:2033 -4547:3:2034 -4548:3:2042 -4549:3:2047 -4550:3:2051 -4551:3:2052 -4552:3:2059 -4553:3:2060 -4554:3:2071 -4555:3:2079 -4556:3:2080 -4557:3:2084 -4558:3:2089 -4559:3:2090 -4560:0:2565 -4561:3:2102 -4562:0:2565 -4563:3:2104 -4564:0:2565 -4565:2:565 -4566:2:569 -4567:2:570 -4568:2:578 -4569:2:579 -4570:2:583 -4571:2:584 -4572:2:592 -4573:2:597 -4574:2:601 -4575:2:602 -4576:2:609 -4577:2:610 -4578:2:621 -4579:2:622 -4580:2:623 -4581:2:634 -4582:2:639 -4583:2:640 -4584:0:2565 -4585:2:744 -4586:0:2565 -4587:3:2105 -4588:3:2109 -4589:3:2110 -4590:3:2118 -4591:3:2119 -4592:3:2123 -4593:3:2124 -4594:3:2132 -4595:3:2137 -4596:3:2141 -4597:3:2142 -4598:3:2149 -4599:3:2150 -4600:3:2161 -4601:3:2169 -4602:3:2170 -4603:3:2174 -4604:3:2179 -4605:3:2180 -4606:0:2565 -4607:3:2192 -4608:0:2565 -4609:3:2013 -4610:0:2565 -4611:3:2014 -4612:0:2565 -4613:3:2015 -4614:3:2019 -4615:3:2020 -4616:3:2028 -4617:3:2029 -4618:3:2033 -4619:3:2034 -4620:3:2042 -4621:3:2047 -4622:3:2051 -4623:3:2052 -4624:3:2059 -4625:3:2060 -4626:3:2071 -4627:3:2079 -4628:3:2080 -4629:3:2084 -4630:3:2089 -4631:3:2090 -4632:0:2565 -4633:3:2102 -4634:0:2565 -4635:2:745 -4636:0:2565 -4637:2:750 -4638:0:2565 -4639:2:753 -4640:0:2565 -4641:3:2104 -4642:0:2565 -4643:3:2105 -4644:3:2109 -4645:3:2110 -4646:3:2118 -4647:3:2119 -4648:3:2123 -4649:3:2124 -4650:3:2132 -4651:3:2137 -4652:3:2141 -4653:3:2142 -4654:3:2149 -4655:3:2150 -4656:3:2161 -4657:3:2169 -4658:3:2170 -4659:3:2174 -4660:3:2179 -4661:3:2180 -4662:0:2565 -4663:3:2192 -4664:0:2565 -4665:3:2013 -4666:0:2565 -4667:3:2014 -4668:0:2565 -4669:3:2015 -4670:3:2019 -4671:3:2020 -4672:3:2028 -4673:3:2029 -4674:3:2033 -4675:3:2034 -4676:3:2042 -4677:3:2047 -4678:3:2051 -4679:3:2052 -4680:3:2059 -4681:3:2060 -4682:3:2071 -4683:3:2079 -4684:3:2080 -4685:3:2084 -4686:3:2089 -4687:3:2090 -4688:0:2565 -4689:2:758 -4690:0:2565 -4691:3:2102 -4692:0:2565 -4693:3:2104 -4694:0:2565 -4695:3:2105 -4696:3:2109 -4697:3:2110 -4698:3:2118 -4699:3:2119 -4700:3:2123 -4701:3:2124 -4702:3:2132 -4703:3:2137 -4704:3:2141 -4705:3:2142 -4706:3:2149 -4707:3:2150 -4708:3:2161 -4709:3:2169 -4710:3:2170 -4711:3:2174 -4712:3:2179 -4713:3:2180 -4714:0:2565 -4715:3:2192 -4716:0:2565 -4717:3:2013 -4718:0:2565 -4719:3:2014 -4720:0:2565 -4721:2:759 -4722:0:2565 -4723:3:2015 -4724:3:2019 -4725:3:2020 -4726:3:2028 -4727:3:2029 -4728:3:2033 -4729:3:2034 -4730:3:2042 -4731:3:2047 -4732:3:2051 -4733:3:2052 -4734:3:2059 -4735:3:2060 -4736:3:2071 -4737:3:2079 -4738:3:2080 -4739:3:2084 -4740:3:2089 -4741:3:2090 -4742:0:2565 -4743:3:2102 -4744:0:2565 -4745:3:2104 -4746:0:2565 -4747:3:2105 -4748:3:2109 -4749:3:2110 -4750:3:2118 -4751:3:2119 -4752:3:2123 -4753:3:2124 -4754:3:2132 -4755:3:2137 -4756:3:2141 -4757:3:2142 -4758:3:2149 -4759:3:2150 -4760:3:2161 -4761:3:2169 -4762:3:2170 -4763:3:2174 -4764:3:2179 -4765:3:2180 -4766:0:2565 -4767:3:2192 -4768:0:2565 -4769:3:2013 -4770:0:2565 -4771:2:760 -4772:0:2565 -4773:2:761 -4774:0:2565 -4775:2:762 -4776:0:2565 -4777:2:763 -4778:0:2565 -4779:3:2014 -4780:0:2565 -4781:3:2015 -4782:3:2019 -4783:3:2020 -4784:3:2028 -4785:3:2029 -4786:3:2033 -4787:3:2034 -4788:3:2042 -4789:3:2047 -4790:3:2051 -4791:3:2052 -4792:3:2059 -4793:3:2060 -4794:3:2071 -4795:3:2079 -4796:3:2080 -4797:3:2084 -4798:3:2089 -4799:3:2090 -4800:0:2565 -4801:3:2102 -4802:0:2565 -4803:3:2104 -4804:0:2565 -4805:3:2105 -4806:3:2109 -4807:3:2110 -4808:3:2118 -4809:3:2119 -4810:3:2123 -4811:3:2124 -4812:3:2132 -4813:3:2137 -4814:3:2141 -4815:3:2142 -4816:3:2149 -4817:3:2150 -4818:3:2161 -4819:3:2169 -4820:3:2170 -4821:3:2174 -4822:3:2179 -4823:3:2180 -4824:0:2565 -4825:3:2192 -4826:0:2565 -4827:2:765 -4828:0:2565 -4829:3:2013 -4830:0:2565 -4831:3:2014 -4832:0:2565 -4833:3:2015 -4834:3:2019 -4835:3:2020 -4836:3:2028 -4837:3:2029 -4838:3:2033 -4839:3:2034 -4840:3:2042 -4841:3:2047 -4842:3:2051 -4843:3:2052 -4844:3:2059 -4845:3:2060 -4846:3:2071 -4847:3:2079 -4848:3:2080 -4849:3:2084 -4850:3:2089 -4851:3:2090 -4852:0:2565 -4853:3:2102 -4854:0:2565 -4855:3:2104 -4856:0:2565 -4857:3:2105 -4858:3:2109 -4859:3:2110 -4860:3:2118 -4861:3:2119 -4862:3:2123 -4863:3:2124 -4864:3:2132 -4865:3:2137 -4866:3:2141 -4867:3:2142 -4868:3:2149 -4869:3:2150 -4870:3:2161 -4871:3:2169 -4872:3:2170 -4873:3:2174 -4874:3:2179 -4875:3:2180 -4876:0:2565 -4877:2:766 -4878:2:770 -4879:2:771 -4880:2:779 -4881:2:780 -4882:2:781 -4883:2:793 -4884:2:798 -4885:2:802 -4886:2:803 -4887:2:810 -4888:2:811 -4889:2:822 -4890:2:823 -4891:2:824 -4892:2:835 -4893:2:840 -4894:2:841 -4895:0:2565 -4896:3:2192 -4897:0:2565 -4898:3:2013 -4899:0:2565 -4900:3:2014 -4901:0:2565 -4902:3:2015 -4903:3:2019 -4904:3:2020 -4905:3:2028 -4906:3:2029 -4907:3:2033 -4908:3:2034 -4909:3:2042 -4910:3:2047 -4911:3:2051 -4912:3:2052 -4913:3:2059 -4914:3:2060 -4915:3:2071 -4916:3:2079 -4917:3:2080 -4918:3:2084 -4919:3:2089 -4920:3:2090 -4921:0:2565 -4922:3:2102 -4923:0:2565 -4924:3:2104 -4925:0:2565 -4926:2:853 -4927:0:2565 -4928:2:857 -4929:0:2565 -4930:2:465 -4931:0:2565 -4932:3:2105 -4933:3:2109 -4934:3:2110 -4935:3:2118 -4936:3:2119 -4937:3:2123 -4938:3:2124 -4939:3:2132 -4940:3:2137 -4941:3:2141 -4942:3:2142 -4943:3:2149 -4944:3:2150 -4945:3:2161 -4946:3:2169 -4947:3:2170 -4948:3:2174 -4949:3:2179 -4950:3:2180 -4951:0:2565 -4952:3:2192 -4953:0:2565 -4954:3:2013 -4955:0:2565 -4956:3:2014 -4957:0:2565 -4958:3:2015 -4959:3:2019 -4960:3:2020 -4961:3:2028 -4962:3:2029 -4963:3:2033 -4964:3:2034 -4965:3:2042 -4966:3:2047 -4967:3:2051 -4968:3:2052 -4969:3:2059 -4970:3:2060 -4971:3:2071 -4972:3:2079 -4973:3:2080 -4974:3:2084 -4975:3:2089 -4976:3:2090 -4977:0:2565 -4978:3:2102 -4979:0:2565 -4980:2:466 -4981:0:2565 -4982:3:2104 -4983:0:2565 -4984:3:2105 -4985:3:2109 -4986:3:2110 -4987:3:2118 -4988:3:2119 -4989:3:2123 -4990:3:2124 -4991:3:2132 -4992:3:2137 -4993:3:2141 -4994:3:2142 -4995:3:2149 -4996:3:2150 -4997:3:2161 -4998:3:2169 -4999:3:2170 -5000:3:2174 -5001:3:2179 -5002:3:2180 -5003:0:2565 -5004:3:2192 -5005:0:2565 -5006:3:2013 -5007:0:2565 -5008:3:2014 -5009:0:2565 -5010:3:2015 -5011:3:2019 -5012:3:2020 -5013:3:2028 -5014:3:2029 -5015:3:2033 -5016:3:2034 -5017:3:2042 -5018:3:2047 -5019:3:2051 -5020:3:2052 -5021:3:2059 -5022:3:2060 -5023:3:2071 -5024:3:2079 -5025:3:2080 -5026:3:2084 -5027:3:2089 -5028:3:2090 -5029:0:2565 -5030:2:467 -5031:0:2565 -5032:3:2102 -5033:0:2565 -5034:3:2104 -5035:0:2565 -5036:3:2105 -5037:3:2109 -5038:3:2110 -5039:3:2118 -5040:3:2119 -5041:3:2123 -5042:3:2124 -5043:3:2132 -5044:3:2137 -5045:3:2141 -5046:3:2142 -5047:3:2149 -5048:3:2150 -5049:3:2161 -5050:3:2169 -5051:3:2170 -5052:3:2174 -5053:3:2179 -5054:3:2180 -5055:0:2565 -5056:3:2192 -5057:0:2565 -5058:3:2013 -5059:0:2565 -5060:3:2014 -5061:0:2565 -5062:1:339 -5063:0:2565 -5064:2:468 -5065:0:2565 -5066:3:2015 -5067:3:2019 -5068:3:2020 -5069:3:2028 -5070:3:2029 -5071:3:2033 -5072:3:2034 -5073:3:2042 -5074:3:2047 -5075:3:2051 -5076:3:2052 -5077:3:2059 -5078:3:2060 -5079:3:2071 -5080:3:2079 -5081:3:2080 -5082:3:2084 -5083:3:2089 -5084:3:2090 -5085:0:2565 -5086:3:2102 -5087:0:2565 -5088:3:2104 -5089:0:2565 -5090:3:2105 -5091:3:2109 -5092:3:2110 -5093:3:2118 -5094:3:2119 -5095:3:2123 -5096:3:2124 -5097:3:2132 -5098:3:2137 -5099:3:2141 -5100:3:2142 -5101:3:2149 -5102:3:2150 -5103:3:2161 -5104:3:2169 -5105:3:2170 -5106:3:2174 -5107:3:2179 -5108:3:2180 -5109:0:2565 -5110:3:2192 -5111:0:2565 -5112:3:2013 -5113:0:2565 -5114:3:2014 -5115:0:2565 -5116:2:467 -5117:0:2565 -5118:2:468 -5119:0:2565 -5120:3:2015 -5121:3:2019 -5122:3:2020 -5123:3:2028 -5124:3:2029 -5125:3:2033 -5126:3:2034 -5127:3:2042 -5128:3:2047 -5129:3:2051 -5130:3:2052 -5131:3:2059 -5132:3:2060 -5133:3:2071 -5134:3:2079 -5135:3:2080 -5136:3:2084 -5137:3:2089 -5138:3:2090 -5139:0:2565 -5140:3:2102 -5141:0:2565 -5142:3:2104 -5143:0:2565 -5144:3:2105 -5145:3:2109 -5146:3:2110 -5147:3:2118 -5148:3:2119 -5149:3:2123 -5150:3:2124 -5151:3:2132 -5152:3:2137 -5153:3:2141 -5154:3:2142 -5155:3:2149 -5156:3:2150 -5157:3:2161 -5158:3:2169 -5159:3:2170 -5160:3:2174 -5161:3:2179 -5162:3:2180 -5163:0:2565 -5164:3:2192 -5165:0:2565 -5166:3:2013 -5167:0:2565 -5168:2:467 -5169:0:2565 -5170:1:345 -5171:0:2565 -5172:2:468 -5173:0:2565 -5174:3:2014 -5175:0:2565 -5176:3:2015 -5177:3:2019 -5178:3:2020 -5179:3:2028 -5180:3:2029 -5181:3:2033 -5182:3:2034 -5183:3:2042 -5184:3:2047 -5185:3:2051 -5186:3:2052 -5187:3:2059 -5188:3:2060 -5189:3:2071 -5190:3:2079 -5191:3:2080 -5192:3:2084 -5193:3:2089 -5194:3:2090 -5195:0:2565 -5196:3:2102 -5197:0:2565 -5198:3:2104 -5199:0:2565 -5200:3:2105 -5201:3:2109 -5202:3:2110 -5203:3:2118 -5204:3:2119 -5205:3:2123 -5206:3:2124 -5207:3:2132 -5208:3:2137 -5209:3:2141 -5210:3:2142 -5211:3:2149 -5212:3:2150 -5213:3:2161 -5214:3:2169 -5215:3:2170 -5216:3:2174 -5217:3:2179 -5218:3:2180 -5219:0:2565 -5220:3:2192 -5221:0:2565 -5222:3:2013 -5223:0:2565 -5224:2:467 -5225:0:2565 -5226:2:468 -5227:0:2565 -5228:3:2014 -5229:0:2565 -5230:3:2015 -5231:3:2019 -5232:3:2020 -5233:3:2028 -5234:3:2029 -5235:3:2033 -5236:3:2034 -5237:3:2042 -5238:3:2047 -5239:3:2051 -5240:3:2052 -5241:3:2059 -5242:3:2060 -5243:3:2071 -5244:3:2079 -5245:3:2080 -5246:3:2084 -5247:3:2089 -5248:3:2090 -5249:0:2565 -5250:3:2102 -5251:0:2565 -5252:3:2104 -5253:0:2565 -5254:3:2105 -5255:3:2109 -5256:3:2110 -5257:3:2118 -5258:3:2119 -5259:3:2123 -5260:3:2124 -5261:3:2132 -5262:3:2137 -5263:3:2141 -5264:3:2142 -5265:3:2149 -5266:3:2150 -5267:3:2161 -5268:3:2169 -5269:3:2170 -5270:3:2174 -5271:3:2179 -5272:3:2180 -5273:0:2565 -5274:3:2192 -5275:0:2565 -5276:2:467 -5277:0:2565 -5278:1:346 -5279:1:350 -5280:1:351 -5281:1:359 -5282:1:360 -5283:1:361 -5284:1:373 -5285:1:378 -5286:1:382 -5287:1:383 -5288:1:390 -5289:1:391 -5290:1:402 -5291:1:403 -5292:1:404 -5293:1:415 -5294:1:420 -5295:1:421 -5296:0:2565 -5297:3:2013 -5298:0:2565 -5299:2:468 -5300:0:2565 -5301:3:2014 -5302:0:2565 -5303:3:2015 -5304:3:2019 -5305:3:2020 -5306:3:2028 -5307:3:2029 -5308:3:2033 -5309:3:2034 -5310:3:2042 -5311:3:2047 -5312:3:2051 -5313:3:2052 -5314:3:2059 -5315:3:2060 -5316:3:2071 -5317:3:2079 -5318:3:2080 -5319:3:2084 -5320:3:2089 -5321:3:2090 -5322:0:2565 -5323:3:2102 -5324:0:2565 -5325:3:2104 -5326:0:2565 -5327:3:2105 -5328:3:2109 -5329:3:2110 -5330:3:2118 -5331:3:2119 -5332:3:2123 -5333:3:2124 -5334:3:2132 -5335:3:2137 -5336:3:2141 -5337:3:2142 -5338:3:2149 -5339:3:2150 -5340:3:2161 -5341:3:2169 -5342:3:2170 -5343:3:2174 -5344:3:2179 -5345:3:2180 -5346:0:2565 -5347:3:2192 -5348:0:2565 -5349:2:467 -5350:0:2565 -5351:3:2013 -5352:0:2565 -5353:3:2014 -5354:0:2565 -5355:3:2015 -5356:3:2019 -5357:3:2020 -5358:3:2028 -5359:3:2029 -5360:3:2033 -5361:3:2034 -5362:3:2042 -5363:3:2047 -5364:3:2051 -5365:3:2052 -5366:3:2059 -5367:3:2060 -5368:3:2071 -5369:3:2079 -5370:3:2080 -5371:3:2084 -5372:3:2089 -5373:3:2090 -5374:0:2565 -5375:3:2102 -5376:0:2565 -5377:3:2104 -5378:0:2565 -5379:3:2105 -5380:3:2109 -5381:3:2110 -5382:3:2118 -5383:3:2119 -5384:3:2123 -5385:3:2124 -5386:3:2132 -5387:3:2137 -5388:3:2141 -5389:3:2142 -5390:3:2149 -5391:3:2150 -5392:3:2161 -5393:3:2169 -5394:3:2170 -5395:3:2174 -5396:3:2179 -5397:3:2180 -5398:0:2565 -5399:1:433 -5400:0:2565 -5401:3:2192 -5402:0:2565 -5403:3:2013 -5404:0:2565 -5405:2:468 -5406:0:2565 -5407:3:2014 -5408:0:2565 -5409:3:2015 -5410:3:2019 -5411:3:2020 -5412:3:2028 -5413:3:2029 -5414:3:2033 -5415:3:2034 -5416:3:2042 -5417:3:2047 -5418:3:2051 -5419:3:2052 -5420:3:2059 -5421:3:2060 -5422:3:2071 -5423:3:2079 -5424:3:2080 -5425:3:2084 -5426:3:2089 -5427:3:2090 -5428:0:2565 -5429:3:2102 -5430:0:2565 -5431:3:2104 -5432:0:2565 -5433:3:2105 -5434:3:2109 -5435:3:2110 -5436:3:2118 -5437:3:2119 -5438:3:2123 -5439:3:2124 -5440:3:2132 -5441:3:2137 -5442:3:2141 -5443:3:2142 -5444:3:2149 -5445:3:2150 -5446:3:2161 -5447:3:2169 -5448:3:2170 -5449:3:2174 -5450:3:2179 -5451:3:2180 -5452:0:2565 -5453:3:2192 -5454:0:2565 -5455:2:469 -5456:0:2565 -5457:3:2013 -5458:0:2565 -5459:2:475 -5460:0:2565 -5461:2:476 -5462:0:2565 -5463:3:2014 -5464:0:2565 -5465:3:2015 -5466:3:2019 -5467:3:2020 -5468:3:2028 -5469:3:2029 -5470:3:2033 -5471:3:2034 -5472:3:2042 -5473:3:2047 -5474:3:2051 -5475:3:2052 -5476:3:2059 -5477:3:2060 -5478:3:2071 -5479:3:2079 -5480:3:2080 -5481:3:2084 -5482:3:2089 -5483:3:2090 -5484:0:2565 -5485:3:2102 -5486:0:2565 -5487:3:2104 -5488:0:2565 -5489:3:2105 -5490:3:2109 -5491:3:2110 -5492:3:2118 -5493:3:2119 -5494:3:2123 -5495:3:2124 -5496:3:2132 -5497:3:2137 -5498:3:2141 -5499:3:2142 -5500:3:2149 -5501:3:2150 -5502:3:2161 -5503:3:2169 -5504:3:2170 -5505:3:2174 -5506:3:2179 -5507:3:2180 -5508:0:2565 -5509:3:2192 -5510:0:2565 -5511:2:477 -5512:2:481 -5513:2:482 -5514:2:490 -5515:2:491 -5516:2:495 -5517:2:496 -5518:2:504 -5519:2:509 -5520:2:513 -5521:2:514 -5522:2:521 -5523:2:522 -5524:2:533 -5525:2:534 -5526:2:535 -5527:2:546 -5528:2:551 -5529:2:552 -5530:0:2565 -5531:3:2013 -5532:0:2565 -5533:3:2014 -5534:0:2565 -5535:3:2015 -5536:3:2019 -5537:3:2020 -5538:3:2028 -5539:3:2029 -5540:3:2033 -5541:3:2034 -5542:3:2042 -5543:3:2047 -5544:3:2051 -5545:3:2052 -5546:3:2059 -5547:3:2060 -5548:3:2071 -5549:3:2079 -5550:3:2080 -5551:3:2084 -5552:3:2089 -5553:3:2090 -5554:0:2565 -5555:3:2102 -5556:0:2565 -5557:3:2104 -5558:0:2565 -5559:3:2105 -5560:3:2109 -5561:3:2110 -5562:3:2118 -5563:3:2119 -5564:3:2123 -5565:3:2124 -5566:3:2132 -5567:3:2137 -5568:3:2141 -5569:3:2142 -5570:3:2149 -5571:3:2150 -5572:3:2161 -5573:3:2169 -5574:3:2170 -5575:3:2174 -5576:3:2179 -5577:3:2180 -5578:0:2565 -5579:2:564 -5580:0:2565 -5581:3:2192 -5582:0:2565 -5583:3:2013 -5584:0:2565 -5585:3:2014 -5586:0:2565 -5587:3:2015 -5588:3:2019 -5589:3:2020 -5590:3:2028 -5591:3:2029 -5592:3:2033 -5593:3:2034 -5594:3:2042 -5595:3:2047 -5596:3:2051 -5597:3:2052 -5598:3:2059 -5599:3:2060 -5600:3:2071 -5601:3:2079 -5602:3:2080 -5603:3:2084 -5604:3:2089 -5605:3:2090 -5606:0:2565 -5607:3:2102 -5608:0:2565 -5609:3:2104 -5610:0:2565 -5611:2:565 -5612:2:569 -5613:2:570 -5614:2:578 -5615:2:579 -5616:2:583 -5617:2:584 -5618:2:592 -5619:2:597 -5620:2:601 -5621:2:602 -5622:2:609 -5623:2:610 -5624:2:621 -5625:2:622 -5626:2:623 -5627:2:634 -5628:2:639 -5629:2:640 -5630:0:2565 -5631:2:744 -5632:0:2565 -5633:3:2105 -5634:3:2109 -5635:3:2110 -5636:3:2118 -5637:3:2119 -5638:3:2123 -5639:3:2124 -5640:3:2132 -5641:3:2137 -5642:3:2141 -5643:3:2142 -5644:3:2149 -5645:3:2150 -5646:3:2161 -5647:3:2169 -5648:3:2170 -5649:3:2174 -5650:3:2179 -5651:3:2180 -5652:0:2565 -5653:3:2192 -5654:0:2565 -5655:3:2013 -5656:0:2565 -5657:3:2014 -5658:0:2565 -5659:3:2015 -5660:3:2019 -5661:3:2020 -5662:3:2028 -5663:3:2029 -5664:3:2033 -5665:3:2034 -5666:3:2042 -5667:3:2047 -5668:3:2051 -5669:3:2052 -5670:3:2059 -5671:3:2060 -5672:3:2071 -5673:3:2079 -5674:3:2080 -5675:3:2084 -5676:3:2089 -5677:3:2090 -5678:0:2565 -5679:3:2102 -5680:0:2565 -5681:2:745 -5682:0:2565 -5683:2:750 -5684:0:2565 -5685:2:753 -5686:0:2565 -5687:3:2104 -5688:0:2565 -5689:3:2105 -5690:3:2109 -5691:3:2110 -5692:3:2118 -5693:3:2119 -5694:3:2123 -5695:3:2124 -5696:3:2132 -5697:3:2137 -5698:3:2141 -5699:3:2142 -5700:3:2149 -5701:3:2150 -5702:3:2161 -5703:3:2169 -5704:3:2170 -5705:3:2174 -5706:3:2179 -5707:3:2180 -5708:0:2565 -5709:3:2192 -5710:0:2565 -5711:3:2013 -5712:0:2565 -5713:3:2014 -5714:0:2565 -5715:3:2015 -5716:3:2019 -5717:3:2020 -5718:3:2028 -5719:3:2029 -5720:3:2033 -5721:3:2034 -5722:3:2042 -5723:3:2047 -5724:3:2051 -5725:3:2052 -5726:3:2059 -5727:3:2060 -5728:3:2071 -5729:3:2079 -5730:3:2080 -5731:3:2084 -5732:3:2089 -5733:3:2090 -5734:0:2565 -5735:2:758 -5736:0:2565 -5737:3:2102 -5738:0:2565 -5739:3:2104 -5740:0:2565 -5741:3:2105 -5742:3:2109 -5743:3:2110 -5744:3:2118 -5745:3:2119 -5746:3:2123 -5747:3:2124 -5748:3:2132 -5749:3:2137 -5750:3:2141 -5751:3:2142 -5752:3:2149 -5753:3:2150 -5754:3:2161 -5755:3:2169 -5756:3:2170 -5757:3:2174 -5758:3:2179 -5759:3:2180 -5760:0:2565 -5761:3:2192 -5762:0:2565 -5763:3:2013 -5764:0:2565 -5765:3:2014 -5766:0:2565 -5767:2:759 -5768:0:2565 -5769:3:2015 -5770:3:2019 -5771:3:2020 -5772:3:2028 -5773:3:2029 -5774:3:2033 -5775:3:2034 -5776:3:2042 -5777:3:2047 -5778:3:2051 -5779:3:2052 -5780:3:2059 -5781:3:2060 -5782:3:2071 -5783:3:2079 -5784:3:2080 -5785:3:2084 -5786:3:2089 -5787:3:2090 -5788:0:2565 -5789:3:2102 -5790:0:2565 -5791:3:2104 -5792:0:2565 -5793:3:2105 -5794:3:2109 -5795:3:2110 -5796:3:2118 -5797:3:2119 -5798:3:2123 -5799:3:2124 -5800:3:2132 -5801:3:2137 -5802:3:2141 -5803:3:2142 -5804:3:2149 -5805:3:2150 -5806:3:2161 -5807:3:2169 -5808:3:2170 -5809:3:2174 -5810:3:2179 -5811:3:2180 -5812:0:2565 -5813:3:2192 -5814:0:2565 -5815:3:2013 -5816:0:2565 -5817:2:760 -5818:0:2565 -5819:2:761 -5820:0:2565 -5821:2:762 -5822:0:2565 -5823:2:763 -5824:0:2565 -5825:3:2014 -5826:0:2565 -5827:3:2015 -5828:3:2019 -5829:3:2020 -5830:3:2028 -5831:3:2029 -5832:3:2033 -5833:3:2034 -5834:3:2042 -5835:3:2047 -5836:3:2051 -5837:3:2052 -5838:3:2059 -5839:3:2060 -5840:3:2071 -5841:3:2079 -5842:3:2080 -5843:3:2084 -5844:3:2089 -5845:3:2090 -5846:0:2565 -5847:3:2102 -5848:0:2565 -5849:3:2104 -5850:0:2565 -5851:3:2105 -5852:3:2109 -5853:3:2110 -5854:3:2118 -5855:3:2119 -5856:3:2123 -5857:3:2124 -5858:3:2132 -5859:3:2137 -5860:3:2141 -5861:3:2142 -5862:3:2149 -5863:3:2150 -5864:3:2161 -5865:3:2169 -5866:3:2170 -5867:3:2174 -5868:3:2179 -5869:3:2180 -5870:0:2565 -5871:3:2192 -5872:0:2565 -5873:2:765 -5874:0:2565 -5875:3:2013 -5876:0:2565 -5877:3:2014 -5878:0:2565 -5879:3:2015 -5880:3:2019 -5881:3:2020 -5882:3:2028 -5883:3:2029 -5884:3:2033 -5885:3:2034 -5886:3:2042 -5887:3:2047 -5888:3:2051 -5889:3:2052 -5890:3:2059 -5891:3:2060 -5892:3:2071 -5893:3:2079 -5894:3:2080 -5895:3:2084 -5896:3:2089 -5897:3:2090 -5898:0:2565 -5899:3:2102 -5900:0:2565 -5901:3:2104 -5902:0:2565 -5903:3:2105 -5904:3:2109 -5905:3:2110 -5906:3:2118 -5907:3:2119 -5908:3:2123 -5909:3:2124 -5910:3:2132 -5911:3:2137 -5912:3:2141 -5913:3:2142 -5914:3:2149 -5915:3:2150 -5916:3:2161 -5917:3:2169 -5918:3:2170 -5919:3:2174 -5920:3:2179 -5921:3:2180 -5922:0:2565 -5923:2:766 -5924:2:770 -5925:2:771 -5926:2:779 -5927:2:780 -5928:2:781 -5929:2:793 -5930:2:798 -5931:2:802 -5932:2:803 -5933:2:810 -5934:2:811 -5935:2:822 -5936:2:823 -5937:2:824 -5938:2:835 -5939:2:840 -5940:2:841 -5941:0:2565 -5942:3:2192 -5943:0:2565 -5944:3:2013 -5945:0:2565 -5946:3:2014 -5947:0:2565 -5948:3:2015 -5949:3:2019 -5950:3:2020 -5951:3:2028 -5952:3:2029 -5953:3:2033 -5954:3:2034 -5955:3:2042 -5956:3:2047 -5957:3:2051 -5958:3:2052 -5959:3:2059 -5960:3:2060 -5961:3:2071 -5962:3:2079 -5963:3:2080 -5964:3:2084 -5965:3:2089 -5966:3:2090 -5967:0:2565 -5968:3:2102 -5969:0:2565 -5970:3:2104 -5971:0:2565 -5972:2:853 -5973:0:2565 -5974:2:857 -5975:0:2565 -5976:2:465 -5977:0:2565 -5978:3:2105 -5979:3:2109 -5980:3:2110 -5981:3:2118 -5982:3:2119 -5983:3:2123 -5984:3:2124 -5985:3:2132 -5986:3:2137 -5987:3:2141 -5988:3:2142 -5989:3:2149 -5990:3:2150 -5991:3:2161 -5992:3:2169 -5993:3:2170 -5994:3:2174 -5995:3:2179 -5996:3:2180 -5997:0:2565 -5998:3:2192 -5999:0:2565 -6000:3:2013 -6001:0:2565 -6002:3:2014 -6003:0:2565 -6004:3:2015 -6005:3:2019 -6006:3:2020 -6007:3:2028 -6008:3:2029 -6009:3:2033 -6010:3:2034 -6011:3:2042 -6012:3:2047 -6013:3:2051 -6014:3:2052 -6015:3:2059 -6016:3:2060 -6017:3:2071 -6018:3:2079 -6019:3:2080 -6020:3:2084 -6021:3:2089 -6022:3:2090 -6023:0:2565 -6024:3:2102 -6025:0:2565 -6026:2:466 -6027:0:2565 -6028:3:2104 -6029:0:2565 -6030:3:2105 -6031:3:2109 -6032:3:2110 -6033:3:2118 -6034:3:2119 -6035:3:2123 -6036:3:2124 -6037:3:2132 -6038:3:2137 -6039:3:2141 -6040:3:2142 -6041:3:2149 -6042:3:2150 -6043:3:2161 -6044:3:2169 -6045:3:2170 -6046:3:2174 -6047:3:2179 -6048:3:2180 -6049:0:2565 -6050:3:2192 -6051:0:2565 -6052:3:2013 -6053:0:2565 -6054:3:2014 -6055:0:2565 -6056:3:2015 -6057:3:2019 -6058:3:2020 -6059:3:2028 -6060:3:2029 -6061:3:2033 -6062:3:2034 -6063:3:2042 -6064:3:2047 -6065:3:2051 -6066:3:2052 -6067:3:2059 -6068:3:2060 -6069:3:2071 -6070:3:2079 -6071:3:2080 -6072:3:2084 -6073:3:2089 -6074:3:2090 -6075:0:2565 -6076:2:467 -6077:0:2565 -6078:3:2102 -6079:0:2565 -6080:3:2104 -6081:0:2565 -6082:3:2105 -6083:3:2109 -6084:3:2110 -6085:3:2118 -6086:3:2119 -6087:3:2123 -6088:3:2124 -6089:3:2132 -6090:3:2137 -6091:3:2141 -6092:3:2142 -6093:3:2149 -6094:3:2150 -6095:3:2161 -6096:3:2169 -6097:3:2170 -6098:3:2174 -6099:3:2179 -6100:3:2180 -6101:0:2565 -6102:3:2192 -6103:0:2565 -6104:3:2013 -6105:0:2565 -6106:3:2014 -6107:0:2565 -6108:1:436 -6109:0:2565 -6110:2:468 -6111:0:2565 -6112:3:2015 -6113:3:2019 -6114:3:2020 -6115:3:2028 -6116:3:2029 -6117:3:2033 -6118:3:2034 -6119:3:2042 -6120:3:2047 -6121:3:2051 -6122:3:2052 -6123:3:2059 -6124:3:2060 -6125:3:2071 -6126:3:2079 -6127:3:2080 -6128:3:2084 -6129:3:2089 -6130:3:2090 -6131:0:2565 -6132:3:2102 -6133:0:2565 -6134:3:2104 -6135:0:2565 -6136:3:2105 -6137:3:2109 -6138:3:2110 -6139:3:2118 -6140:3:2119 -6141:3:2123 -6142:3:2124 -6143:3:2132 -6144:3:2137 -6145:3:2141 -6146:3:2142 -6147:3:2149 -6148:3:2150 -6149:3:2161 -6150:3:2169 -6151:3:2170 -6152:3:2174 -6153:3:2179 -6154:3:2180 -6155:0:2565 -6156:3:2192 -6157:0:2565 -6158:3:2013 -6159:0:2565 -6160:3:2014 -6161:0:2565 -6162:2:467 -6163:0:2565 -6164:2:468 -6165:0:2565 -6166:3:2015 -6167:3:2019 -6168:3:2020 -6169:3:2028 -6170:3:2029 -6171:3:2033 -6172:3:2034 -6173:3:2042 -6174:3:2047 -6175:3:2051 -6176:3:2052 -6177:3:2059 -6178:3:2060 -6179:3:2071 -6180:3:2079 -6181:3:2080 -6182:3:2084 -6183:3:2089 -6184:3:2090 -6185:0:2565 -6186:3:2102 -6187:0:2565 -6188:3:2104 -6189:0:2565 -6190:3:2105 -6191:3:2109 -6192:3:2110 -6193:3:2118 -6194:3:2119 -6195:3:2123 -6196:3:2124 -6197:3:2132 -6198:3:2137 -6199:3:2141 -6200:3:2142 -6201:3:2149 -6202:3:2150 -6203:3:2161 -6204:3:2169 -6205:3:2170 -6206:3:2174 -6207:3:2179 -6208:3:2180 -6209:0:2565 -6210:3:2192 -6211:0:2565 -6212:3:2013 -6213:0:2565 -6214:2:467 -6215:0:2565 -6216:1:442 -6217:0:2565 -6218:2:468 -6219:0:2565 -6220:1:446 -6221:0:2565 -6222:1:9 -6223:0:2565 -6224:1:10 -6225:0:2565 -6226:1:11 -6227:0:2565 -6228:3:2014 -6229:0:2565 -6230:3:2015 -6231:3:2019 -6232:3:2020 -6233:3:2028 -6234:3:2029 -6235:3:2033 -6236:3:2034 -6237:3:2042 -6238:3:2047 -6239:3:2051 -6240:3:2052 -6241:3:2059 -6242:3:2060 -6243:3:2071 -6244:3:2079 -6245:3:2080 -6246:3:2084 -6247:3:2089 -6248:3:2090 -6249:0:2565 -6250:3:2102 -6251:0:2565 -6252:3:2104 -6253:0:2565 -6254:3:2105 -6255:3:2109 -6256:3:2110 -6257:3:2118 -6258:3:2119 -6259:3:2123 -6260:3:2124 -6261:3:2132 -6262:3:2137 -6263:3:2141 -6264:3:2142 -6265:3:2149 -6266:3:2150 -6267:3:2161 -6268:3:2169 -6269:3:2170 -6270:3:2174 -6271:3:2179 -6272:3:2180 -6273:0:2565 -6274:3:2192 -6275:0:2565 -6276:3:2013 -6277:0:2565 -6278:2:467 -6279:0:2565 -6280:2:468 -6281:0:2565 -6282:3:2014 -6283:0:2565 -6284:3:2015 -6285:3:2019 -6286:3:2020 -6287:3:2028 -6288:3:2029 -6289:3:2033 -6290:3:2034 -6291:3:2042 -6292:3:2047 -6293:3:2051 -6294:3:2052 -6295:3:2059 -6296:3:2060 -6297:3:2071 -6298:3:2079 -6299:3:2080 -6300:3:2084 -6301:3:2089 -6302:3:2090 -6303:0:2565 -6304:3:2102 -6305:0:2565 -6306:3:2104 -6307:0:2565 -6308:3:2105 -6309:3:2109 -6310:3:2110 -6311:3:2118 -6312:3:2119 -6313:3:2123 -6314:3:2124 -6315:3:2132 -6316:3:2137 -6317:3:2141 -6318:3:2142 -6319:3:2149 -6320:3:2150 -6321:3:2161 -6322:3:2169 -6323:3:2170 -6324:3:2174 -6325:3:2179 -6326:3:2180 -6327:0:2565 -6328:3:2192 -6329:0:2565 -6330:2:467 -6331:0:2565 -6332:1:12 -6333:1:16 -6334:1:17 -6335:1:25 -6336:1:26 -6337:1:27 -6338:1:39 -6339:1:44 -6340:1:48 -6341:1:49 -6342:1:56 -6343:1:57 -6344:1:68 -6345:1:69 -6346:1:70 -6347:1:81 -6348:1:86 -6349:1:87 -6350:0:2565 -6351:3:2013 -6352:0:2565 -6353:2:468 -6354:0:2565 -6355:3:2014 -6356:0:2565 -6357:3:2015 -6358:3:2019 -6359:3:2020 -6360:3:2028 -6361:3:2029 -6362:3:2033 -6363:3:2034 -6364:3:2042 -6365:3:2047 -6366:3:2051 -6367:3:2052 -6368:3:2059 -6369:3:2060 -6370:3:2071 -6371:3:2079 -6372:3:2080 -6373:3:2084 -6374:3:2089 -6375:3:2090 -6376:0:2565 -6377:3:2102 -6378:0:2565 -6379:3:2104 -6380:0:2565 -6381:3:2105 -6382:3:2109 -6383:3:2110 -6384:3:2118 -6385:3:2119 -6386:3:2123 -6387:3:2124 -6388:3:2132 -6389:3:2137 -6390:3:2141 -6391:3:2142 -6392:3:2149 -6393:3:2150 -6394:3:2161 -6395:3:2169 -6396:3:2170 -6397:3:2174 -6398:3:2179 -6399:3:2180 -6400:0:2565 -6401:3:2192 -6402:0:2565 -6403:2:467 -6404:0:2565 -6405:3:2013 -6406:0:2565 -6407:3:2014 -6408:0:2565 -6409:3:2015 -6410:3:2019 -6411:3:2020 -6412:3:2028 -6413:3:2029 -6414:3:2033 -6415:3:2034 -6416:3:2042 -6417:3:2047 -6418:3:2051 -6419:3:2052 -6420:3:2059 -6421:3:2060 -6422:3:2071 -6423:3:2079 -6424:3:2080 -6425:3:2084 -6426:3:2089 -6427:3:2090 -6428:0:2565 -6429:3:2102 -6430:0:2565 -6431:3:2104 -6432:0:2565 -6433:3:2105 -6434:3:2109 -6435:3:2110 -6436:3:2118 -6437:3:2119 -6438:3:2123 -6439:3:2124 -6440:3:2132 -6441:3:2137 -6442:3:2141 -6443:3:2142 -6444:3:2149 -6445:3:2150 -6446:3:2161 -6447:3:2169 -6448:3:2170 -6449:3:2174 -6450:3:2179 -6451:3:2180 -6452:0:2565 -6453:1:99 -6454:0:2565 -6455:3:2192 -6456:0:2565 -6457:3:2013 -6458:0:2565 -6459:2:468 -6460:0:2565 -6461:3:2014 -6462:0:2565 -6463:3:2015 -6464:3:2019 -6465:3:2020 -6466:3:2028 -6467:3:2029 -6468:3:2033 -6469:3:2034 -6470:3:2042 -6471:3:2047 -6472:3:2051 -6473:3:2052 -6474:3:2059 -6475:3:2060 -6476:3:2071 -6477:3:2079 -6478:3:2080 -6479:3:2084 -6480:3:2089 -6481:3:2090 -6482:0:2565 -6483:3:2102 -6484:0:2565 -6485:3:2104 -6486:0:2565 -6487:3:2105 -6488:3:2109 -6489:3:2110 -6490:3:2118 -6491:3:2119 -6492:3:2123 -6493:3:2124 -6494:3:2132 -6495:3:2137 -6496:3:2141 -6497:3:2142 -6498:3:2149 -6499:3:2150 -6500:3:2161 -6501:3:2169 -6502:3:2170 -6503:3:2174 -6504:3:2179 -6505:3:2180 -6506:0:2565 -6507:3:2192 -6508:0:2565 -6509:2:469 -6510:0:2565 -6511:3:2013 -6512:0:2565 -6513:2:475 -6514:0:2565 -6515:2:476 -6516:0:2565 -6517:3:2014 -6518:0:2565 -6519:3:2015 -6520:3:2019 -6521:3:2020 -6522:3:2028 -6523:3:2029 -6524:3:2033 -6525:3:2034 -6526:3:2042 -6527:3:2047 -6528:3:2051 -6529:3:2052 -6530:3:2059 -6531:3:2060 -6532:3:2071 -6533:3:2079 -6534:3:2080 -6535:3:2084 -6536:3:2089 -6537:3:2090 -6538:0:2565 -6539:3:2102 -6540:0:2565 -6541:3:2104 -6542:0:2565 -6543:3:2105 -6544:3:2109 -6545:3:2110 -6546:3:2118 -6547:3:2119 -6548:3:2123 -6549:3:2124 -6550:3:2132 -6551:3:2137 -6552:3:2141 -6553:3:2142 -6554:3:2149 -6555:3:2150 -6556:3:2161 -6557:3:2169 -6558:3:2170 -6559:3:2174 -6560:3:2179 -6561:3:2180 -6562:0:2565 -6563:3:2192 -6564:0:2565 -6565:2:477 -6566:2:481 -6567:2:482 -6568:2:490 -6569:2:491 -6570:2:495 -6571:2:496 -6572:2:504 -6573:2:509 -6574:2:513 -6575:2:514 -6576:2:521 -6577:2:522 -6578:2:533 -6579:2:534 -6580:2:535 -6581:2:546 -6582:2:551 -6583:2:552 -6584:0:2565 -6585:3:2013 -6586:0:2565 -6587:3:2014 -6588:0:2565 -6589:3:2015 -6590:3:2019 -6591:3:2020 -6592:3:2028 -6593:3:2029 -6594:3:2033 -6595:3:2034 -6596:3:2042 -6597:3:2047 -6598:3:2051 -6599:3:2052 -6600:3:2059 -6601:3:2060 -6602:3:2071 -6603:3:2079 -6604:3:2080 -6605:3:2084 -6606:3:2089 -6607:3:2090 -6608:0:2565 -6609:3:2102 -6610:0:2565 -6611:3:2104 -6612:0:2565 -6613:3:2105 -6614:3:2109 -6615:3:2110 -6616:3:2118 -6617:3:2119 -6618:3:2123 -6619:3:2124 -6620:3:2132 -6621:3:2137 -6622:3:2141 -6623:3:2142 -6624:3:2149 -6625:3:2150 -6626:3:2161 -6627:3:2169 -6628:3:2170 -6629:3:2174 -6630:3:2179 -6631:3:2180 -6632:0:2565 -6633:2:564 -6634:0:2565 -6635:3:2192 -6636:0:2565 -6637:3:2013 -6638:0:2565 -6639:3:2014 -6640:0:2565 -6641:3:2015 -6642:3:2019 -6643:3:2020 -6644:3:2028 -6645:3:2029 -6646:3:2033 -6647:3:2034 -6648:3:2042 -6649:3:2047 -6650:3:2051 -6651:3:2052 -6652:3:2059 -6653:3:2060 -6654:3:2071 -6655:3:2079 -6656:3:2080 -6657:3:2084 -6658:3:2089 -6659:3:2090 -6660:0:2565 -6661:3:2102 -6662:0:2565 -6663:3:2104 -6664:0:2565 -6665:2:565 -6666:2:569 -6667:2:570 -6668:2:578 -6669:2:579 -6670:2:583 -6671:2:584 -6672:2:592 -6673:2:597 -6674:2:601 -6675:2:602 -6676:2:609 -6677:2:610 -6678:2:621 -6679:2:622 -6680:2:623 -6681:2:634 -6682:2:639 -6683:2:640 -6684:0:2565 -6685:2:652 -6686:0:2565 -6687:3:2105 -6688:3:2109 -6689:3:2110 -6690:3:2118 -6691:3:2119 -6692:3:2123 -6693:3:2124 -6694:3:2132 -6695:3:2137 -6696:3:2141 -6697:3:2142 -6698:3:2149 -6699:3:2150 -6700:3:2161 -6701:3:2169 -6702:3:2170 -6703:3:2174 -6704:3:2179 -6705:3:2180 -6706:0:2565 -6707:3:2192 -6708:0:2565 -6709:3:2013 -6710:0:2565 -6711:3:2014 -6712:0:2565 -6713:3:2015 -6714:3:2019 -6715:3:2020 -6716:3:2028 -6717:3:2029 -6718:3:2033 -6719:3:2034 -6720:3:2042 -6721:3:2047 -6722:3:2051 -6723:3:2052 -6724:3:2059 -6725:3:2060 -6726:3:2071 -6727:3:2079 -6728:3:2080 -6729:3:2084 -6730:3:2089 -6731:3:2090 -6732:0:2565 -6733:3:2102 -6734:0:2565 -6735:2:653 -6736:0:2565 -6737:3:2104 -6738:0:2565 -6739:3:2105 -6740:3:2109 -6741:3:2110 -6742:3:2118 -6743:3:2119 -6744:3:2123 -6745:3:2124 -6746:3:2132 -6747:3:2137 -6748:3:2141 -6749:3:2142 -6750:3:2149 -6751:3:2150 -6752:3:2161 -6753:3:2169 -6754:3:2170 -6755:3:2174 -6756:3:2179 -6757:3:2180 -6758:0:2565 -6759:3:2192 -6760:0:2565 -6761:3:2013 -6762:0:2565 -6763:3:2014 -6764:0:2565 -6765:3:2015 -6766:3:2019 -6767:3:2020 -6768:3:2028 -6769:3:2029 -6770:3:2033 -6771:3:2034 -6772:3:2042 -6773:3:2047 -6774:3:2051 -6775:3:2052 -6776:3:2059 -6777:3:2060 -6778:3:2071 -6779:3:2079 -6780:3:2080 -6781:3:2084 -6782:3:2089 -6783:3:2090 -6784:0:2565 -6785:2:654 -6786:2:658 -6787:2:659 -6788:2:667 -6789:2:668 -6790:2:672 -6791:2:673 -6792:2:681 -6793:2:686 -6794:2:690 -6795:2:691 -6796:2:698 -6797:2:699 -6798:2:710 -6799:2:711 -6800:2:712 -6801:2:723 -6802:2:728 -6803:2:729 -6804:0:2565 -6805:3:2102 -6806:0:2565 -6807:3:2104 -6808:0:2565 -6809:3:2105 -6810:3:2109 -6811:3:2110 -6812:3:2118 -6813:3:2119 -6814:3:2123 -6815:3:2124 -6816:3:2132 -6817:3:2137 -6818:3:2141 -6819:3:2142 -6820:3:2149 -6821:3:2150 -6822:3:2161 -6823:3:2169 -6824:3:2170 -6825:3:2174 -6826:3:2179 -6827:3:2180 -6828:0:2565 -6829:3:2192 -6830:0:2565 -6831:3:2013 -6832:0:2565 -6833:3:2014 -6834:0:2565 -6835:2:741 -6836:0:2565 -6837:2:750 -6838:0:2565 -6839:2:753 -6840:0:2565 -6841:3:2015 -6842:3:2019 -6843:3:2020 -6844:3:2028 -6845:3:2029 -6846:3:2033 -6847:3:2034 -6848:3:2042 -6849:3:2047 -6850:3:2051 -6851:3:2052 -6852:3:2059 -6853:3:2060 -6854:3:2071 -6855:3:2079 -6856:3:2080 -6857:3:2084 -6858:3:2089 -6859:3:2090 -6860:0:2565 -6861:3:2102 -6862:0:2565 -6863:3:2104 -6864:0:2565 -6865:3:2105 -6866:3:2109 -6867:3:2110 -6868:3:2118 -6869:3:2119 -6870:3:2123 -6871:3:2124 -6872:3:2132 -6873:3:2137 -6874:3:2141 -6875:3:2142 -6876:3:2149 -6877:3:2150 -6878:3:2161 -6879:3:2169 -6880:3:2170 -6881:3:2174 -6882:3:2179 -6883:3:2180 -6884:0:2565 -6885:3:2192 -6886:0:2565 -6887:3:2013 -6888:0:2565 -6889:2:758 -6890:0:2565 -6891:3:2014 -6892:0:2565 -6893:3:2015 -6894:3:2019 -6895:3:2020 -6896:3:2028 -6897:3:2029 -6898:3:2033 -6899:3:2034 -6900:3:2042 -6901:3:2047 -6902:3:2051 -6903:3:2052 -6904:3:2059 -6905:3:2060 -6906:3:2071 -6907:3:2079 -6908:3:2080 -6909:3:2084 -6910:3:2089 -6911:3:2090 -6912:0:2565 -6913:3:2102 -6914:0:2565 -6915:3:2104 -6916:0:2565 -6917:3:2105 -6918:3:2109 -6919:3:2110 -6920:3:2118 -6921:3:2119 -6922:3:2123 -6923:3:2124 -6924:3:2132 -6925:3:2137 -6926:3:2141 -6927:3:2142 -6928:3:2149 -6929:3:2150 -6930:3:2161 -6931:3:2169 -6932:3:2170 -6933:3:2174 -6934:3:2179 -6935:3:2180 -6936:0:2565 -6937:3:2192 -6938:0:2565 -6939:2:759 -6940:0:2565 -6941:3:2013 -6942:0:2565 -6943:3:2014 -6944:0:2565 -6945:3:2015 -6946:3:2019 -6947:3:2020 -6948:3:2028 -6949:3:2029 -6950:3:2033 -6951:3:2034 -6952:3:2042 -6953:3:2047 -6954:3:2051 -6955:3:2052 -6956:3:2059 -6957:3:2060 -6958:3:2071 -6959:3:2079 -6960:3:2080 -6961:3:2084 -6962:3:2089 -6963:3:2090 -6964:0:2565 -6965:3:2102 -6966:0:2565 -6967:3:2104 -6968:0:2565 -6969:3:2105 -6970:3:2109 -6971:3:2110 -6972:3:2118 -6973:3:2119 -6974:3:2123 -6975:3:2124 -6976:3:2132 -6977:3:2137 -6978:3:2141 -6979:3:2142 -6980:3:2149 -6981:3:2150 -6982:3:2161 -6983:3:2169 -6984:3:2170 -6985:3:2174 -6986:3:2179 -6987:3:2180 -6988:0:2565 -6989:2:760 -6990:0:2565 -6991:3:2192 -6992:0:2565 -6993:3:2013 -6994:0:2565 -6995:2:761 -6996:0:2565 -6997:2:762 -6998:0:2565 -6999:2:763 -7000:0:2565 -7001:3:2014 -7002:0:2565 -7003:3:2015 -7004:3:2019 -7005:3:2020 -7006:3:2028 -7007:3:2029 -7008:3:2033 -7009:3:2034 -7010:3:2042 -7011:3:2047 -7012:3:2051 -7013:3:2052 -7014:3:2059 -7015:3:2060 -7016:3:2071 -7017:3:2079 -7018:3:2080 -7019:3:2084 -7020:3:2089 -7021:3:2090 -7022:0:2565 -7023:3:2102 -7024:0:2565 -7025:3:2104 -7026:0:2565 -7027:3:2105 -7028:3:2109 -7029:3:2110 -7030:3:2118 -7031:3:2119 -7032:3:2123 -7033:3:2124 -7034:3:2132 -7035:3:2137 -7036:3:2141 -7037:3:2142 -7038:3:2149 -7039:3:2150 -7040:3:2161 -7041:3:2169 -7042:3:2170 -7043:3:2174 -7044:3:2179 -7045:3:2180 -7046:0:2565 -7047:3:2192 -7048:0:2565 -7049:2:765 -7050:0:2565 -7051:3:2013 -7052:0:2565 -7053:3:2014 -7054:0:2565 -7055:3:2015 -7056:3:2019 -7057:3:2020 -7058:3:2028 -7059:3:2029 -7060:3:2033 -7061:3:2034 -7062:3:2042 -7063:3:2047 -7064:3:2051 -7065:3:2052 -7066:3:2059 -7067:3:2060 -7068:3:2071 -7069:3:2079 -7070:3:2080 -7071:3:2084 -7072:3:2089 -7073:3:2090 -7074:0:2565 -7075:3:2102 -7076:0:2565 -7077:3:2104 -7078:0:2565 -7079:3:2105 -7080:3:2109 -7081:3:2110 -7082:3:2118 -7083:3:2119 -7084:3:2123 -7085:3:2124 -7086:3:2132 -7087:3:2137 -7088:3:2141 -7089:3:2142 -7090:3:2149 -7091:3:2150 -7092:3:2161 -7093:3:2169 -7094:3:2170 -7095:3:2174 -7096:3:2179 -7097:3:2180 -7098:0:2565 -7099:2:766 -7100:2:770 -7101:2:771 -7102:2:779 -7103:2:780 -7104:2:781 -7105:2:793 -7106:2:798 -7107:2:802 -7108:2:803 -7109:2:810 -7110:2:811 -7111:2:822 -7112:2:823 -7113:2:824 -7114:2:835 -7115:2:840 -7116:2:841 -7117:0:2565 -7118:3:2192 -7119:0:2565 -7120:3:2013 -7121:0:2565 -7122:3:2014 -7123:0:2565 -7124:3:2015 -7125:3:2019 -7126:3:2020 -7127:3:2028 -7128:3:2029 -7129:3:2033 -7130:3:2034 -7131:3:2042 -7132:3:2047 -7133:3:2051 -7134:3:2052 -7135:3:2059 -7136:3:2060 -7137:3:2071 -7138:3:2079 -7139:3:2080 -7140:3:2084 -7141:3:2089 -7142:3:2090 -7143:0:2565 -7144:3:2102 -7145:0:2565 -7146:3:2104 -7147:0:2565 -7148:2:853 -7149:0:2565 -7150:2:857 -7151:0:2565 -7152:2:465 -7153:0:2565 -7154:3:2105 -7155:3:2109 -7156:3:2110 -7157:3:2118 -7158:3:2119 -7159:3:2123 -7160:3:2124 -7161:3:2132 -7162:3:2137 -7163:3:2141 -7164:3:2142 -7165:3:2149 -7166:3:2150 -7167:3:2161 -7168:3:2169 -7169:3:2170 -7170:3:2174 -7171:3:2179 -7172:3:2180 -7173:0:2565 -7174:3:2192 -7175:0:2565 -7176:3:2013 -7177:0:2565 -7178:3:2014 -7179:0:2565 -7180:3:2015 -7181:3:2019 -7182:3:2020 -7183:3:2028 -7184:3:2029 -7185:3:2033 -7186:3:2034 -7187:3:2042 -7188:3:2047 -7189:3:2051 -7190:3:2052 -7191:3:2059 -7192:3:2060 -7193:3:2071 -7194:3:2079 -7195:3:2080 -7196:3:2084 -7197:3:2089 -7198:3:2090 -7199:0:2565 -7200:3:2102 -7201:0:2565 -7202:2:466 -7203:0:2565 -7204:3:2104 -7205:0:2565 -7206:3:2105 -7207:3:2109 -7208:3:2110 -7209:3:2118 -7210:3:2119 -7211:3:2123 -7212:3:2124 -7213:3:2132 -7214:3:2137 -7215:3:2141 -7216:3:2142 -7217:3:2149 -7218:3:2150 -7219:3:2161 -7220:3:2169 -7221:3:2170 -7222:3:2174 -7223:3:2179 -7224:3:2180 -7225:0:2565 -7226:3:2192 -7227:0:2565 -7228:3:2013 -7229:0:2565 -7230:3:2014 -7231:0:2565 -7232:3:2015 -7233:3:2019 -7234:3:2020 -7235:3:2028 -7236:3:2029 -7237:3:2033 -7238:3:2034 -7239:3:2042 -7240:3:2047 -7241:3:2051 -7242:3:2052 -7243:3:2059 -7244:3:2060 -7245:3:2071 -7246:3:2079 -7247:3:2080 -7248:3:2084 -7249:3:2089 -7250:3:2090 -7251:0:2565 -7252:2:467 -7253:0:2565 -7254:3:2102 -7255:0:2565 -7256:3:2104 -7257:0:2565 -7258:3:2105 -7259:3:2109 -7260:3:2110 -7261:3:2118 -7262:3:2119 -7263:3:2123 -7264:3:2124 -7265:3:2132 -7266:3:2137 -7267:3:2141 -7268:3:2142 -7269:3:2149 -7270:3:2150 -7271:3:2161 -7272:3:2169 -7273:3:2170 -7274:3:2174 -7275:3:2179 -7276:3:2180 -7277:0:2565 -7278:3:2192 -7279:0:2565 -7280:3:2013 -7281:0:2565 -7282:3:2014 -7283:0:2565 -7284:1:102 -7285:0:2565 -7286:2:468 -7287:0:2565 -7288:3:2015 -7289:3:2019 -7290:3:2020 -7291:3:2028 -7292:3:2029 -7293:3:2033 -7294:3:2034 -7295:3:2042 -7296:3:2047 -7297:3:2051 -7298:3:2052 -7299:3:2059 -7300:3:2060 -7301:3:2071 -7302:3:2079 -7303:3:2080 -7304:3:2084 -7305:3:2089 -7306:3:2090 -7307:0:2565 -7308:3:2102 -7309:0:2565 -7310:3:2104 -7311:0:2565 -7312:3:2105 -7313:3:2109 -7314:3:2110 -7315:3:2118 -7316:3:2119 -7317:3:2123 -7318:3:2124 -7319:3:2132 -7320:3:2137 -7321:3:2141 -7322:3:2142 -7323:3:2149 -7324:3:2150 -7325:3:2161 -7326:3:2169 -7327:3:2170 -7328:3:2174 -7329:3:2179 -7330:3:2180 -7331:0:2565 -7332:3:2192 -7333:0:2565 -7334:3:2013 -7335:0:2565 -7336:3:2014 -7337:0:2565 -7338:2:467 -7339:0:2565 -7340:2:468 -7341:0:2565 -7342:3:2015 -7343:3:2019 -7344:3:2020 -7345:3:2028 -7346:3:2029 -7347:3:2033 -7348:3:2034 -7349:3:2042 -7350:3:2047 -7351:3:2051 -7352:3:2052 -7353:3:2059 -7354:3:2060 -7355:3:2071 -7356:3:2079 -7357:3:2080 -7358:3:2084 -7359:3:2089 -7360:3:2090 -7361:0:2565 -7362:3:2102 -7363:0:2565 -7364:3:2104 -7365:0:2565 -7366:3:2105 -7367:3:2109 -7368:3:2110 -7369:3:2118 -7370:3:2119 -7371:3:2123 -7372:3:2124 -7373:3:2132 -7374:3:2137 -7375:3:2141 -7376:3:2142 -7377:3:2149 -7378:3:2150 -7379:3:2161 -7380:3:2169 -7381:3:2170 -7382:3:2174 -7383:3:2179 -7384:3:2180 -7385:0:2565 -7386:3:2192 -7387:0:2565 -7388:3:2013 -7389:0:2565 -7390:2:467 -7391:0:2565 -7392:1:108 -7393:0:2565 -7394:2:468 -7395:0:2565 -7396:3:2014 -7397:0:2565 -7398:3:2015 -7399:3:2019 -7400:3:2020 -7401:3:2028 -7402:3:2029 -7403:3:2033 -7404:3:2034 -7405:3:2042 -7406:3:2047 -7407:3:2051 -7408:3:2052 -7409:3:2059 -7410:3:2060 -7411:3:2071 -7412:3:2079 -7413:3:2080 -7414:3:2084 -7415:3:2089 -7416:3:2090 -7417:0:2565 -7418:3:2102 -7419:0:2565 -7420:3:2104 -7421:0:2565 -7422:3:2105 -7423:3:2109 -7424:3:2110 -7425:3:2118 -7426:3:2119 -7427:3:2123 -7428:3:2124 -7429:3:2132 -7430:3:2137 -7431:3:2141 -7432:3:2142 -7433:3:2149 -7434:3:2150 -7435:3:2161 -7436:3:2169 -7437:3:2170 -7438:3:2174 -7439:3:2179 -7440:3:2180 -7441:0:2565 -7442:3:2192 -7443:0:2565 -7444:3:2013 -7445:0:2565 -7446:2:467 -7447:0:2565 -7448:2:468 -7449:0:2565 -7450:3:2014 -7451:0:2565 -7452:3:2015 -7453:3:2019 -7454:3:2020 -7455:3:2028 -7456:3:2029 -7457:3:2033 -7458:3:2034 -7459:3:2042 -7460:3:2047 -7461:3:2051 -7462:3:2052 -7463:3:2059 -7464:3:2060 -7465:3:2071 -7466:3:2079 -7467:3:2080 -7468:3:2084 -7469:3:2089 -7470:3:2090 -7471:0:2565 -7472:3:2102 -7473:0:2565 -7474:3:2104 -7475:0:2565 -7476:3:2105 -7477:3:2109 -7478:3:2110 -7479:3:2118 -7480:3:2119 -7481:3:2123 -7482:3:2124 -7483:3:2132 -7484:3:2137 -7485:3:2141 -7486:3:2142 -7487:3:2149 -7488:3:2150 -7489:3:2161 -7490:3:2169 -7491:3:2170 -7492:3:2174 -7493:3:2179 -7494:3:2180 -7495:0:2565 -7496:3:2192 -7497:0:2565 -7498:2:467 -7499:0:2565 -7500:1:109 -7501:1:113 -7502:1:114 -7503:1:122 -7504:1:123 -7505:1:124 -7506:1:136 -7507:1:141 -7508:1:145 -7509:1:146 -7510:1:153 -7511:1:154 -7512:1:165 -7513:1:166 -7514:1:167 -7515:1:178 -7516:1:183 -7517:1:184 -7518:0:2565 -7519:3:2013 -7520:0:2565 -7521:2:468 -7522:0:2565 -7523:3:2014 -7524:0:2565 -7525:3:2015 -7526:3:2019 -7527:3:2020 -7528:3:2028 -7529:3:2029 -7530:3:2033 -7531:3:2034 -7532:3:2042 -7533:3:2047 -7534:3:2051 -7535:3:2052 -7536:3:2059 -7537:3:2060 -7538:3:2071 -7539:3:2079 -7540:3:2080 -7541:3:2084 -7542:3:2089 -7543:3:2090 -7544:0:2565 -7545:3:2102 -7546:0:2565 -7547:3:2104 -7548:0:2565 -7549:3:2105 -7550:3:2109 -7551:3:2110 -7552:3:2118 -7553:3:2119 -7554:3:2123 -7555:3:2124 -7556:3:2132 -7557:3:2137 -7558:3:2141 -7559:3:2142 -7560:3:2149 -7561:3:2150 -7562:3:2161 -7563:3:2169 -7564:3:2170 -7565:3:2174 -7566:3:2179 -7567:3:2180 -7568:0:2565 -7569:3:2192 -7570:0:2565 -7571:2:467 -7572:0:2565 -7573:3:2013 -7574:0:2565 -7575:3:2014 -7576:0:2565 -7577:3:2015 -7578:3:2019 -7579:3:2020 -7580:3:2028 -7581:3:2029 -7582:3:2033 -7583:3:2034 -7584:3:2042 -7585:3:2047 -7586:3:2051 -7587:3:2052 -7588:3:2059 -7589:3:2060 -7590:3:2071 -7591:3:2079 -7592:3:2080 -7593:3:2084 -7594:3:2089 -7595:3:2090 -7596:0:2565 -7597:3:2102 -7598:0:2565 -7599:3:2104 -7600:0:2565 -7601:3:2105 -7602:3:2109 -7603:3:2110 -7604:3:2118 -7605:3:2119 -7606:3:2123 -7607:3:2124 -7608:3:2132 -7609:3:2137 -7610:3:2141 -7611:3:2142 -7612:3:2149 -7613:3:2150 -7614:3:2161 -7615:3:2169 -7616:3:2170 -7617:3:2174 -7618:3:2179 -7619:3:2180 -7620:0:2565 -7621:1:196 -7622:0:2565 -7623:3:2192 -7624:0:2565 -7625:3:2013 -7626:0:2565 -7627:2:468 -7628:0:2565 -7629:3:2014 -7630:0:2565 -7631:3:2015 -7632:3:2019 -7633:3:2020 -7634:3:2028 -7635:3:2029 -7636:3:2033 -7637:3:2034 -7638:3:2042 -7639:3:2047 -7640:3:2051 -7641:3:2052 -7642:3:2059 -7643:3:2060 -7644:3:2071 -7645:3:2079 -7646:3:2080 -7647:3:2084 -7648:3:2089 -7649:3:2090 -7650:0:2565 -7651:3:2102 -7652:0:2565 -7653:3:2104 -7654:0:2565 -7655:3:2105 -7656:3:2109 -7657:3:2110 -7658:3:2118 -7659:3:2119 -7660:3:2123 -7661:3:2124 -7662:3:2132 -7663:3:2137 -7664:3:2141 -7665:3:2142 -7666:3:2149 -7667:3:2150 -7668:3:2161 -7669:3:2169 -7670:3:2170 -7671:3:2174 -7672:3:2179 -7673:3:2180 -7674:0:2565 -7675:3:2192 -7676:0:2565 -7677:2:469 -7678:0:2565 -7679:3:2013 -7680:0:2565 -7681:2:475 -7682:0:2565 -7683:2:476 -7684:0:2565 -7685:3:2014 -7686:0:2565 -7687:3:2015 -7688:3:2019 -7689:3:2020 -7690:3:2028 -7691:3:2029 -7692:3:2033 -7693:3:2034 -7694:3:2042 -7695:3:2047 -7696:3:2051 -7697:3:2052 -7698:3:2059 -7699:3:2060 -7700:3:2071 -7701:3:2079 -7702:3:2080 -7703:3:2084 -7704:3:2089 -7705:3:2090 -7706:0:2565 -7707:3:2102 -7708:0:2565 -7709:3:2104 -7710:0:2565 -7711:3:2105 -7712:3:2109 -7713:3:2110 -7714:3:2118 -7715:3:2119 -7716:3:2123 -7717:3:2124 -7718:3:2132 -7719:3:2137 -7720:3:2141 -7721:3:2142 -7722:3:2149 -7723:3:2150 -7724:3:2161 -7725:3:2169 -7726:3:2170 -7727:3:2174 -7728:3:2179 -7729:3:2180 -7730:0:2565 -7731:3:2192 -7732:0:2565 -7733:2:477 -7734:2:481 -7735:2:482 -7736:2:490 -7737:2:491 -7738:2:495 -7739:2:496 -7740:2:504 -7741:2:509 -7742:2:513 -7743:2:514 -7744:2:521 -7745:2:522 -7746:2:533 -7747:2:534 -7748:2:535 -7749:2:546 -7750:2:551 -7751:2:552 -7752:0:2565 -7753:3:2013 -7754:0:2565 -7755:3:2014 -7756:0:2565 -7757:3:2015 -7758:3:2019 -7759:3:2020 -7760:3:2028 -7761:3:2029 -7762:3:2033 -7763:3:2034 -7764:3:2042 -7765:3:2047 -7766:3:2051 -7767:3:2052 -7768:3:2059 -7769:3:2060 -7770:3:2071 -7771:3:2079 -7772:3:2080 -7773:3:2084 -7774:3:2089 -7775:3:2090 -7776:0:2565 -7777:3:2102 -7778:0:2565 -7779:3:2104 -7780:0:2565 -7781:3:2105 -7782:3:2109 -7783:3:2110 -7784:3:2118 -7785:3:2119 -7786:3:2123 -7787:3:2124 -7788:3:2132 -7789:3:2137 -7790:3:2141 -7791:3:2142 -7792:3:2149 -7793:3:2150 -7794:3:2161 -7795:3:2169 -7796:3:2170 -7797:3:2174 -7798:3:2179 -7799:3:2180 -7800:0:2565 -7801:2:564 -7802:0:2565 -7803:3:2192 -7804:0:2565 -7805:3:2013 -7806:0:2565 -7807:3:2014 -7808:0:2565 -7809:3:2015 -7810:3:2019 -7811:3:2020 -7812:3:2028 -7813:3:2029 -7814:3:2033 -7815:3:2034 -7816:3:2042 -7817:3:2047 -7818:3:2051 -7819:3:2052 -7820:3:2059 -7821:3:2060 -7822:3:2071 -7823:3:2079 -7824:3:2080 -7825:3:2084 -7826:3:2089 -7827:3:2090 -7828:0:2565 -7829:3:2102 -7830:0:2565 -7831:3:2104 -7832:0:2565 -7833:2:565 -7834:2:569 -7835:2:570 -7836:2:578 -7837:2:579 -7838:2:583 -7839:2:584 -7840:2:592 -7841:2:597 -7842:2:601 -7843:2:602 -7844:2:609 -7845:2:610 -7846:2:621 -7847:2:622 -7848:2:623 -7849:2:634 -7850:2:639 -7851:2:640 -7852:0:2565 -7853:2:652 -7854:0:2565 -7855:3:2105 -7856:3:2109 -7857:3:2110 -7858:3:2118 -7859:3:2119 -7860:3:2123 -7861:3:2124 -7862:3:2132 -7863:3:2137 -7864:3:2141 -7865:3:2142 -7866:3:2149 -7867:3:2150 -7868:3:2161 -7869:3:2169 -7870:3:2170 -7871:3:2174 -7872:3:2179 -7873:3:2180 -7874:0:2565 -7875:3:2192 -7876:0:2565 -7877:3:2013 -7878:0:2565 -7879:3:2014 -7880:0:2565 -7881:3:2015 -7882:3:2019 -7883:3:2020 -7884:3:2028 -7885:3:2029 -7886:3:2033 -7887:3:2034 -7888:3:2042 -7889:3:2047 -7890:3:2051 -7891:3:2052 -7892:3:2059 -7893:3:2060 -7894:3:2071 -7895:3:2079 -7896:3:2080 -7897:3:2084 -7898:3:2089 -7899:3:2090 -7900:0:2565 -7901:3:2102 -7902:0:2565 -7903:2:653 -7904:0:2565 -7905:3:2104 -7906:0:2565 -7907:3:2105 -7908:3:2109 -7909:3:2110 -7910:3:2118 -7911:3:2119 -7912:3:2123 -7913:3:2124 -7914:3:2132 -7915:3:2137 -7916:3:2141 -7917:3:2142 -7918:3:2149 -7919:3:2150 -7920:3:2161 -7921:3:2169 -7922:3:2170 -7923:3:2174 -7924:3:2179 -7925:3:2180 -7926:0:2565 -7927:3:2192 -7928:0:2565 -7929:3:2013 -7930:0:2565 -7931:3:2014 -7932:0:2565 -7933:3:2015 -7934:3:2019 -7935:3:2020 -7936:3:2028 -7937:3:2029 -7938:3:2033 -7939:3:2034 -7940:3:2042 -7941:3:2047 -7942:3:2051 -7943:3:2052 -7944:3:2059 -7945:3:2060 -7946:3:2071 -7947:3:2079 -7948:3:2080 -7949:3:2084 -7950:3:2089 -7951:3:2090 -7952:0:2565 -7953:2:654 -7954:2:658 -7955:2:659 -7956:2:667 -7957:2:668 -7958:2:672 -7959:2:673 -7960:2:681 -7961:2:686 -7962:2:690 -7963:2:691 -7964:2:698 -7965:2:699 -7966:2:710 -7967:2:711 -7968:2:712 -7969:2:723 -7970:2:728 -7971:2:729 -7972:0:2565 -7973:3:2102 -7974:0:2565 -7975:3:2104 -7976:0:2565 -7977:3:2105 -7978:3:2109 -7979:3:2110 -7980:3:2118 -7981:3:2119 -7982:3:2123 -7983:3:2124 -7984:3:2132 -7985:3:2137 -7986:3:2141 -7987:3:2142 -7988:3:2149 -7989:3:2150 -7990:3:2161 -7991:3:2169 -7992:3:2170 -7993:3:2174 -7994:3:2179 -7995:3:2180 -7996:0:2565 -7997:3:2192 -7998:0:2565 -7999:3:2013 -8000:0:2565 -8001:3:2014 -8002:0:2565 -8003:2:741 -8004:0:2565 -8005:2:750 -8006:0:2565 -8007:2:753 -8008:0:2565 -8009:3:2015 -8010:3:2019 -8011:3:2020 -8012:3:2028 -8013:3:2029 -8014:3:2033 -8015:3:2034 -8016:3:2042 -8017:3:2047 -8018:3:2051 -8019:3:2052 -8020:3:2059 -8021:3:2060 -8022:3:2071 -8023:3:2079 -8024:3:2080 -8025:3:2084 -8026:3:2089 -8027:3:2090 -8028:0:2565 -8029:3:2102 -8030:0:2565 -8031:3:2104 -8032:0:2565 -8033:3:2105 -8034:3:2109 -8035:3:2110 -8036:3:2118 -8037:3:2119 -8038:3:2123 -8039:3:2124 -8040:3:2132 -8041:3:2137 -8042:3:2141 -8043:3:2142 -8044:3:2149 -8045:3:2150 -8046:3:2161 -8047:3:2169 -8048:3:2170 -8049:3:2174 -8050:3:2179 -8051:3:2180 -8052:0:2565 -8053:3:2192 -8054:0:2565 -8055:3:2013 -8056:0:2565 -8057:2:758 -8058:0:2565 -8059:3:2014 -8060:0:2565 -8061:3:2015 -8062:3:2019 -8063:3:2020 -8064:3:2028 -8065:3:2029 -8066:3:2033 -8067:3:2034 -8068:3:2042 -8069:3:2047 -8070:3:2051 -8071:3:2052 -8072:3:2059 -8073:3:2060 -8074:3:2071 -8075:3:2079 -8076:3:2080 -8077:3:2084 -8078:3:2089 -8079:3:2090 -8080:0:2565 -8081:3:2102 -8082:0:2565 -8083:3:2104 -8084:0:2565 -8085:3:2105 -8086:3:2109 -8087:3:2110 -8088:3:2118 -8089:3:2119 -8090:3:2123 -8091:3:2124 -8092:3:2132 -8093:3:2137 -8094:3:2141 -8095:3:2142 -8096:3:2149 -8097:3:2150 -8098:3:2161 -8099:3:2169 -8100:3:2170 -8101:3:2174 -8102:3:2179 -8103:3:2180 -8104:0:2565 -8105:3:2192 -8106:0:2565 -8107:2:759 -8108:0:2565 -8109:3:2013 -8110:0:2565 -8111:3:2014 -8112:0:2565 -8113:3:2015 -8114:3:2019 -8115:3:2020 -8116:3:2028 -8117:3:2029 -8118:3:2033 -8119:3:2034 -8120:3:2042 -8121:3:2047 -8122:3:2051 -8123:3:2052 -8124:3:2059 -8125:3:2060 -8126:3:2071 -8127:3:2079 -8128:3:2080 -8129:3:2084 -8130:3:2089 -8131:3:2090 -8132:0:2565 -8133:3:2102 -8134:0:2565 -8135:3:2104 -8136:0:2565 -8137:3:2105 -8138:3:2109 -8139:3:2110 -8140:3:2118 -8141:3:2119 -8142:3:2123 -8143:3:2124 -8144:3:2132 -8145:3:2137 -8146:3:2141 -8147:3:2142 -8148:3:2149 -8149:3:2150 -8150:3:2161 -8151:3:2169 -8152:3:2170 -8153:3:2174 -8154:3:2179 -8155:3:2180 -8156:0:2565 -8157:2:760 -8158:0:2565 -8159:3:2192 -8160:0:2565 -8161:3:2013 -8162:0:2565 -8163:2:761 -8164:0:2565 -8165:2:762 -8166:0:2565 -8167:2:763 -8168:0:2565 -8169:3:2014 -8170:0:2565 -8171:3:2015 -8172:3:2019 -8173:3:2020 -8174:3:2028 -8175:3:2029 -8176:3:2033 -8177:3:2034 -8178:3:2042 -8179:3:2047 -8180:3:2051 -8181:3:2052 -8182:3:2059 -8183:3:2060 -8184:3:2071 -8185:3:2079 -8186:3:2080 -8187:3:2084 -8188:3:2089 -8189:3:2090 -8190:0:2565 -8191:3:2102 -8192:0:2565 -8193:3:2104 -8194:0:2565 -8195:3:2105 -8196:3:2109 -8197:3:2110 -8198:3:2118 -8199:3:2119 -8200:3:2123 -8201:3:2124 -8202:3:2132 -8203:3:2137 -8204:3:2141 -8205:3:2142 -8206:3:2149 -8207:3:2150 -8208:3:2161 -8209:3:2169 -8210:3:2170 -8211:3:2174 -8212:3:2179 -8213:3:2180 -8214:0:2565 -8215:3:2192 -8216:0:2565 -8217:2:765 -8218:0:2565 -8219:3:2013 -8220:0:2565 -8221:3:2014 -8222:0:2565 -8223:3:2015 -8224:3:2019 -8225:3:2020 -8226:3:2028 -8227:3:2029 -8228:3:2033 -8229:3:2034 -8230:3:2042 -8231:3:2047 -8232:3:2051 -8233:3:2052 -8234:3:2059 -8235:3:2060 -8236:3:2071 -8237:3:2079 -8238:3:2080 -8239:3:2084 -8240:3:2089 -8241:3:2090 -8242:0:2565 -8243:3:2102 -8244:0:2565 -8245:3:2104 -8246:0:2565 -8247:3:2105 -8248:3:2109 -8249:3:2110 -8250:3:2118 -8251:3:2119 -8252:3:2123 -8253:3:2124 -8254:3:2132 -8255:3:2137 -8256:3:2141 -8257:3:2142 -8258:3:2149 -8259:3:2150 -8260:3:2161 -8261:3:2169 -8262:3:2170 -8263:3:2174 -8264:3:2179 -8265:3:2180 -8266:0:2565 -8267:2:766 -8268:2:770 -8269:2:771 -8270:2:779 -8271:2:780 -8272:2:781 -8273:2:793 -8274:2:798 -8275:2:802 -8276:2:803 -8277:2:810 -8278:2:811 -8279:2:822 -8280:2:823 -8281:2:824 -8282:2:835 -8283:2:840 -8284:2:841 -8285:0:2565 -8286:3:2192 -8287:0:2565 -8288:3:2013 -8289:0:2565 -8290:3:2014 -8291:0:2565 -8292:3:2015 -8293:3:2019 -8294:3:2020 -8295:3:2028 -8296:3:2029 -8297:3:2033 -8298:3:2034 -8299:3:2042 -8300:3:2047 -8301:3:2051 -8302:3:2052 -8303:3:2059 -8304:3:2060 -8305:3:2071 -8306:3:2079 -8307:3:2080 -8308:3:2084 -8309:3:2089 -8310:3:2090 -8311:0:2565 -8312:3:2102 -8313:0:2565 -8314:3:2104 -8315:0:2565 -8316:2:853 -8317:0:2565 -8318:2:857 -8319:0:2565 -8320:2:465 -8321:0:2565 -8322:3:2105 -8323:3:2109 -8324:3:2110 -8325:3:2118 -8326:3:2119 -8327:3:2123 -8328:3:2124 -8329:3:2132 -8330:3:2137 -8331:3:2141 -8332:3:2142 -8333:3:2149 -8334:3:2150 -8335:3:2161 -8336:3:2169 -8337:3:2170 -8338:3:2174 -8339:3:2179 -8340:3:2180 -8341:0:2565 -8342:3:2192 -8343:0:2565 -8344:3:2013 -8345:0:2565 -8346:3:2014 -8347:0:2565 -8348:3:2015 -8349:3:2019 -8350:3:2020 -8351:3:2028 -8352:3:2029 -8353:3:2033 -8354:3:2034 -8355:3:2042 -8356:3:2047 -8357:3:2051 -8358:3:2052 -8359:3:2059 -8360:3:2060 -8361:3:2071 -8362:3:2079 -8363:3:2080 -8364:3:2084 -8365:3:2089 -8366:3:2090 -8367:0:2565 -8368:3:2102 -8369:0:2565 -8370:2:466 -8371:0:2565 -8372:3:2104 -8373:0:2565 -8374:3:2105 -8375:3:2109 -8376:3:2110 -8377:3:2118 -8378:3:2119 -8379:3:2123 -8380:3:2124 -8381:3:2132 -8382:3:2137 -8383:3:2141 -8384:3:2142 -8385:3:2149 -8386:3:2150 -8387:3:2161 -8388:3:2169 -8389:3:2170 -8390:3:2174 -8391:3:2179 -8392:3:2180 -8393:0:2565 -8394:3:2192 -8395:0:2565 -8396:3:2013 -8397:0:2565 -8398:3:2014 -8399:0:2565 -8400:3:2015 -8401:3:2019 -8402:3:2020 -8403:3:2028 -8404:3:2029 -8405:3:2033 -8406:3:2034 -8407:3:2042 -8408:3:2047 -8409:3:2051 -8410:3:2052 -8411:3:2059 -8412:3:2060 -8413:3:2071 -8414:3:2079 -8415:3:2080 -8416:3:2084 -8417:3:2089 -8418:3:2090 -8419:0:2565 -8420:2:467 -8421:0:2565 -8422:3:2102 -8423:0:2565 -8424:3:2104 -8425:0:2565 -8426:3:2105 -8427:3:2109 -8428:3:2110 -8429:3:2118 -8430:3:2119 -8431:3:2123 -8432:3:2124 -8433:3:2132 -8434:3:2137 -8435:3:2141 -8436:3:2142 -8437:3:2149 -8438:3:2150 -8439:3:2161 -8440:3:2169 -8441:3:2170 -8442:3:2174 -8443:3:2179 -8444:3:2180 -8445:0:2565 -8446:3:2192 -8447:0:2565 -8448:3:2013 -8449:0:2565 -8450:3:2014 -8451:0:2565 -8452:1:199 -8453:0:2565 -8454:2:468 -8455:0:2565 -8456:1:205 -8457:0:2565 -8458:3:2015 -8459:3:2019 -8460:3:2020 -8461:3:2028 -8462:3:2029 -8463:3:2033 -8464:3:2034 -8465:3:2042 -8466:3:2047 -8467:3:2051 -8468:3:2052 -8469:3:2059 -8470:3:2060 -8471:3:2071 -8472:3:2079 -8473:3:2080 -8474:3:2084 -8475:3:2089 -8476:3:2090 -8477:0:2565 -8478:3:2102 -8479:0:2565 -8480:3:2104 -8481:0:2565 -8482:3:2105 -8483:3:2109 -8484:3:2110 -8485:3:2118 -8486:3:2119 -8487:3:2123 -8488:3:2124 -8489:3:2132 -8490:3:2137 -8491:3:2141 -8492:3:2142 -8493:3:2149 -8494:3:2150 -8495:3:2161 -8496:3:2169 -8497:3:2170 -8498:3:2174 -8499:3:2179 -8500:3:2180 -8501:0:2565 -8502:3:2192 -8503:0:2565 -8504:3:2013 -8505:0:2565 -8506:3:2014 -8507:0:2565 -8508:2:467 -8509:0:2565 -8510:2:468 -8511:0:2565 -8512:3:2015 -8513:3:2019 -8514:3:2020 -8515:3:2028 -8516:3:2029 -8517:3:2033 -8518:3:2034 -8519:3:2042 -8520:3:2047 -8521:3:2051 -8522:3:2052 -8523:3:2059 -8524:3:2060 -8525:3:2071 -8526:3:2079 -8527:3:2080 -8528:3:2084 -8529:3:2089 -8530:3:2090 -8531:0:2565 -8532:3:2102 -8533:0:2565 -8534:3:2104 -8535:0:2565 -8536:3:2105 -8537:3:2109 -8538:3:2110 -8539:3:2118 -8540:3:2119 -8541:3:2123 -8542:3:2124 -8543:3:2132 -8544:3:2137 -8545:3:2141 -8546:3:2142 -8547:3:2149 -8548:3:2150 -8549:3:2161 -8550:3:2169 -8551:3:2170 -8552:3:2174 -8553:3:2179 -8554:3:2180 -8555:0:2565 -8556:3:2192 -8557:0:2565 -8558:3:2013 -8559:0:2565 -8560:2:467 -8561:0:2565 -8562:1:206 -8563:0:2565 -8564:2:468 -8565:0:2565 -8566:2:467 -8567:0:2565 -8568:3:2014 -8569:0:2565 -8570:3:2015 -8571:3:2019 -8572:3:2020 -8573:3:2028 -8574:3:2029 -8575:3:2033 -8576:3:2034 -8577:3:2042 -8578:3:2047 -8579:3:2051 -8580:3:2052 -8581:3:2059 -8582:3:2060 -8583:3:2071 -8584:3:2079 -8585:3:2080 -8586:3:2084 -8587:3:2089 -8588:3:2090 -8589:0:2565 -8590:3:2102 -8591:0:2565 -8592:3:2104 -8593:0:2565 -8594:3:2105 -8595:3:2109 -8596:3:2110 -8597:3:2118 -8598:3:2119 -8599:3:2123 -8600:3:2124 -8601:3:2132 -8602:3:2137 -8603:3:2141 -8604:3:2142 -8605:3:2149 -8606:3:2150 -8607:3:2161 -8608:3:2169 -8609:3:2170 -8610:3:2174 -8611:3:2179 -8612:3:2180 -8613:0:2565 -8614:3:2192 -8615:0:2565 -8616:3:2013 -8617:0:2565 -8618:1:207 -8619:1:211 -8620:1:212 -8621:1:220 -8622:1:221 -8623:1:222 -8624:1:234 -8625:1:239 -8626:1:243 -8627:1:244 -8628:1:251 -8629:1:252 -8630:1:263 -8631:1:264 -8632:1:265 -8633:1:276 -8634:1:281 -8635:1:282 -8636:0:2565 -8637:3:2014 -8638:0:2565 -8639:3:2015 -8640:3:2019 -8641:3:2020 -8642:3:2028 -8643:3:2029 -8644:3:2033 -8645:3:2034 -8646:3:2042 -8647:3:2047 -8648:3:2051 -8649:3:2052 -8650:3:2059 -8651:3:2060 -8652:3:2071 -8653:3:2079 -8654:3:2080 -8655:3:2084 -8656:3:2089 -8657:3:2090 -8658:0:2565 -8659:1:294 -8660:0:2565 -8661:3:2102 -8662:0:2565 -8663:2:468 -8664:0:2565 -8665:3:2104 -8666:0:2565 -8667:3:2105 -8668:3:2109 -8669:3:2110 -8670:3:2118 -8671:3:2119 -8672:3:2123 -8673:3:2124 -8674:3:2132 -8675:3:2137 -8676:3:2141 -8677:3:2142 -8678:3:2149 -8679:3:2150 -8680:3:2161 -8681:3:2169 -8682:3:2170 -8683:3:2174 -8684:3:2179 -8685:3:2180 -8686:0:2565 -8687:3:2192 -8688:0:2565 -8689:3:2013 -8690:0:2565 -8691:3:2014 -8692:0:2565 -8693:3:2015 -8694:3:2019 -8695:3:2020 -8696:3:2028 -8697:3:2029 -8698:3:2033 -8699:3:2034 -8700:3:2042 -8701:3:2047 -8702:3:2051 -8703:3:2052 -8704:3:2059 -8705:3:2060 -8706:3:2071 -8707:3:2079 -8708:3:2080 -8709:3:2084 -8710:3:2089 -8711:3:2090 -8712:0:2565 -8713:2:469 -8714:0:2565 -8715:3:2102 -8716:0:2565 -8717:2:475 -8718:0:2565 -8719:3:2104 -8720:0:2565 -8721:3:2105 -8722:3:2109 -8723:3:2110 -8724:3:2118 -8725:3:2119 -8726:3:2123 -8727:3:2124 -8728:3:2132 -8729:3:2137 -8730:3:2141 -8731:3:2142 -8732:3:2149 -8733:3:2150 -8734:3:2161 -8735:3:2169 -8736:3:2170 -8737:3:2174 -8738:3:2179 -8739:3:2180 -8740:0:2565 -8741:3:2192 -8742:0:2565 -8743:3:2013 -8744:0:2565 -8745:1:295 -8746:0:2565 -8747:2:476 -8748:0:2565 -8749:1:296 -8750:0:2565 -8751:3:2014 -8752:0:2565 -8753:3:2015 -8754:3:2019 -8755:3:2020 -8756:3:2028 -8757:3:2029 -8758:3:2033 -8759:3:2034 -8760:3:2042 -8761:3:2047 -8762:3:2051 -8763:3:2052 -8764:3:2059 -8765:3:2060 -8766:3:2071 -8767:3:2079 -8768:3:2080 -8769:3:2084 -8770:3:2089 -8771:3:2090 -8772:0:2565 -8773:3:2102 -8774:0:2565 -8775:3:2104 -8776:0:2565 -8777:3:2105 -8778:3:2109 -8779:3:2110 -8780:3:2118 -8781:3:2119 -8782:3:2123 -8783:3:2124 -8784:3:2132 -8785:3:2137 -8786:3:2141 -8787:3:2142 -8788:3:2149 -8789:3:2150 -8790:3:2161 -8791:3:2169 -8792:3:2170 -8793:3:2174 -8794:3:2179 -8795:3:2180 -8796:0:2565 -8797:3:2192 -8798:0:2565 -8799:3:2013 -8800:0:2565 -8801:1:295 -8802:0:2565 -8803:3:2014 -8804:0:2565 -8805:3:2015 -8806:3:2019 -8807:3:2020 -8808:3:2028 -8809:3:2029 -8810:3:2033 -8811:3:2034 -8812:3:2042 -8813:3:2047 -8814:3:2051 -8815:3:2052 -8816:3:2059 -8817:3:2060 -8818:3:2071 -8819:3:2079 -8820:3:2080 -8821:3:2084 -8822:3:2089 -8823:3:2090 -8824:0:2565 -8825:3:2102 -8826:0:2565 -8827:3:2104 -8828:0:2565 -8829:3:2105 -8830:3:2109 -8831:3:2110 -8832:3:2118 -8833:3:2119 -8834:3:2123 -8835:3:2124 -8836:3:2132 -8837:3:2137 -8838:3:2141 -8839:3:2142 -8840:3:2149 -8841:3:2150 -8842:3:2161 -8843:3:2169 -8844:3:2170 -8845:3:2174 -8846:3:2179 -8847:3:2180 -8848:0:2565 -8849:3:2192 -8850:0:2565 -8851:2:477 -8852:2:481 -8853:2:482 -8854:2:490 -8855:2:491 -8856:2:495 -8857:2:496 -8858:2:504 -8859:2:509 -8860:2:513 -8861:2:514 -8862:2:521 -8863:2:522 -8864:2:533 -8865:2:534 -8866:2:535 -8867:2:546 -8868:2:551 -8869:2:552 -8870:0:2565 -8871:3:2013 -8872:0:2565 -8873:1:296 -8874:0:2565 -8875:3:2014 -8876:0:2565 -8877:3:2015 -8878:3:2019 -8879:3:2020 -8880:3:2028 -8881:3:2029 -8882:3:2033 -8883:3:2034 -8884:3:2042 -8885:3:2047 -8886:3:2051 -8887:3:2052 -8888:3:2059 -8889:3:2060 -8890:3:2071 -8891:3:2079 -8892:3:2080 -8893:3:2084 -8894:3:2089 -8895:3:2090 -8896:0:2565 -8897:3:2102 -8898:0:2565 -8899:3:2104 -8900:0:2565 -8901:3:2105 -8902:3:2109 -8903:3:2110 -8904:3:2118 -8905:3:2119 -8906:3:2123 -8907:3:2124 -8908:3:2132 -8909:3:2137 -8910:3:2141 -8911:3:2142 -8912:3:2149 -8913:3:2150 -8914:3:2161 -8915:3:2169 -8916:3:2170 -8917:3:2174 -8918:3:2179 -8919:3:2180 -8920:0:2565 -8921:3:2192 -8922:0:2565 -8923:3:2013 -8924:0:2565 -8925:1:295 -8926:0:2565 -8927:3:2014 -8928:0:2565 -8929:3:2015 -8930:3:2019 -8931:3:2020 -8932:3:2028 -8933:3:2029 -8934:3:2033 -8935:3:2034 -8936:3:2042 -8937:3:2047 -8938:3:2051 -8939:3:2052 -8940:3:2059 -8941:3:2060 -8942:3:2071 -8943:3:2079 -8944:3:2080 -8945:3:2084 -8946:3:2089 -8947:3:2090 -8948:0:2565 -8949:3:2102 -8950:0:2565 -8951:3:2104 -8952:0:2565 -8953:3:2105 -8954:3:2109 -8955:3:2110 -8956:3:2118 -8957:3:2119 -8958:3:2123 -8959:3:2124 -8960:3:2132 -8961:3:2137 -8962:3:2141 -8963:3:2142 -8964:3:2149 -8965:3:2150 -8966:3:2161 -8967:3:2169 -8968:3:2170 -8969:3:2174 -8970:3:2179 -8971:3:2180 -8972:0:2565 -8973:3:2192 -8974:0:2565 -8975:2:564 -8976:0:2565 -8977:3:2013 -8978:0:2565 -8979:1:296 -8980:0:2565 -8981:3:2014 -8982:0:2565 -8983:3:2015 -8984:3:2019 -8985:3:2020 -8986:3:2028 -8987:3:2029 -8988:3:2033 -8989:3:2034 -8990:3:2042 -8991:3:2047 -8992:3:2051 -8993:3:2052 -8994:3:2059 -8995:3:2060 -8996:3:2071 -8997:3:2079 -8998:3:2080 -8999:3:2084 -9000:3:2089 -9001:3:2090 -9002:0:2565 -9003:3:2102 -9004:0:2565 -9005:3:2104 -9006:0:2565 -9007:3:2105 -9008:3:2109 -9009:3:2110 -9010:3:2118 -9011:3:2119 -9012:3:2123 -9013:3:2124 -9014:3:2132 -9015:3:2137 -9016:3:2141 -9017:3:2142 -9018:3:2149 -9019:3:2150 -9020:3:2161 -9021:3:2169 -9022:3:2170 -9023:3:2174 -9024:3:2179 -9025:3:2180 -9026:0:2565 -9027:3:2192 -9028:0:2565 -9029:3:2013 -9030:0:2565 -9031:1:295 -9032:0:2565 -9033:3:2014 -9034:0:2565 -9035:3:2015 -9036:3:2019 -9037:3:2020 -9038:3:2028 -9039:3:2029 -9040:3:2033 -9041:3:2034 -9042:3:2042 -9043:3:2047 -9044:3:2051 -9045:3:2052 -9046:3:2059 -9047:3:2060 -9048:3:2071 -9049:3:2079 -9050:3:2080 -9051:3:2084 -9052:3:2089 -9053:3:2090 -9054:0:2565 -9055:3:2102 -9056:0:2565 -9057:3:2104 -9058:0:2565 -9059:3:2105 -9060:3:2109 -9061:3:2110 -9062:3:2118 -9063:3:2119 -9064:3:2123 -9065:3:2124 -9066:3:2132 -9067:3:2137 -9068:3:2141 -9069:3:2142 -9070:3:2149 -9071:3:2150 -9072:3:2161 -9073:3:2169 -9074:3:2170 -9075:3:2174 -9076:3:2179 -9077:3:2180 -9078:0:2565 -9079:3:2192 -9080:0:2565 -9081:2:565 -9082:2:569 -9083:2:570 -9084:2:578 -9085:2:579 -9086:2:583 -9087:2:584 -9088:2:592 -9089:2:597 -9090:2:601 -9091:2:602 -9092:2:609 -9093:2:610 -9094:2:621 -9095:2:622 -9096:2:623 -9097:2:634 -9098:2:639 -9099:2:640 -9100:0:2565 -9101:3:2013 -9102:0:2565 -9103:2:652 -9104:0:2565 -9105:1:296 -9106:0:2565 -9107:3:2014 -9108:0:2565 -9109:3:2015 -9110:3:2019 -9111:3:2020 -9112:3:2028 -9113:3:2029 -9114:3:2033 -9115:3:2034 -9116:3:2042 -9117:3:2047 -9118:3:2051 -9119:3:2052 -9120:3:2059 -9121:3:2060 -9122:3:2071 -9123:3:2079 -9124:3:2080 -9125:3:2084 -9126:3:2089 -9127:3:2090 -9128:0:2565 -9129:3:2102 -9130:0:2565 -9131:3:2104 -9132:0:2565 -9133:3:2105 -9134:3:2109 -9135:3:2110 -9136:3:2118 -9137:3:2119 -9138:3:2123 -9139:3:2124 -9140:3:2132 -9141:3:2137 -9142:3:2141 -9143:3:2142 -9144:3:2149 -9145:3:2150 -9146:3:2161 -9147:3:2169 -9148:3:2170 -9149:3:2174 -9150:3:2179 -9151:3:2180 -9152:0:2565 -9153:3:2192 -9154:0:2565 -9155:3:2013 -9156:0:2565 -9157:1:295 -9158:0:2565 -9159:3:2014 -9160:0:2565 -9161:3:2015 -9162:3:2019 -9163:3:2020 -9164:3:2028 -9165:3:2029 -9166:3:2033 -9167:3:2034 -9168:3:2042 -9169:3:2047 -9170:3:2051 -9171:3:2052 -9172:3:2059 -9173:3:2060 -9174:3:2071 -9175:3:2079 -9176:3:2080 -9177:3:2084 -9178:3:2089 -9179:3:2090 -9180:0:2565 -9181:3:2102 -9182:0:2565 -9183:3:2104 -9184:0:2565 -9185:3:2105 -9186:3:2109 -9187:3:2110 -9188:3:2118 -9189:3:2119 -9190:3:2123 -9191:3:2124 -9192:3:2132 -9193:3:2137 -9194:3:2141 -9195:3:2142 -9196:3:2149 -9197:3:2150 -9198:3:2161 -9199:3:2169 -9200:3:2170 -9201:3:2174 -9202:3:2179 -9203:3:2180 -9204:0:2565 -9205:3:2192 -9206:0:2565 -9207:2:653 -9208:0:2565 -9209:3:2013 -9210:0:2565 -9211:1:296 -9212:0:2565 -9213:3:2014 -9214:0:2565 -9215:3:2015 -9216:3:2019 -9217:3:2020 -9218:3:2028 -9219:3:2029 -9220:3:2033 -9221:3:2034 -9222:3:2042 -9223:3:2047 -9224:3:2051 -9225:3:2052 -9226:3:2059 -9227:3:2060 -9228:3:2071 -9229:3:2079 -9230:3:2080 -9231:3:2084 -9232:3:2089 -9233:3:2090 -9234:0:2565 -9235:3:2102 -9236:0:2565 -9237:3:2104 -9238:0:2565 -9239:3:2105 -9240:3:2109 -9241:3:2110 -9242:3:2118 -9243:3:2119 -9244:3:2123 -9245:3:2124 -9246:3:2132 -9247:3:2137 -9248:3:2141 -9249:3:2142 -9250:3:2149 -9251:3:2150 -9252:3:2161 -9253:3:2169 -9254:3:2170 -9255:3:2174 -9256:3:2179 -9257:3:2180 -9258:0:2565 -9259:3:2192 -9260:0:2565 -9261:3:2013 -9262:0:2565 -9263:1:295 -9264:0:2565 -9265:3:2014 -9266:0:2565 -9267:3:2015 -9268:3:2019 -9269:3:2020 -9270:3:2028 -9271:3:2029 -9272:3:2033 -9273:3:2034 -9274:3:2042 -9275:3:2047 -9276:3:2051 -9277:3:2052 -9278:3:2059 -9279:3:2060 -9280:3:2071 -9281:3:2079 -9282:3:2080 -9283:3:2084 -9284:3:2089 -9285:3:2090 -9286:0:2565 -9287:3:2102 -9288:0:2565 -9289:3:2104 -9290:0:2565 -9291:3:2105 -9292:3:2109 -9293:3:2110 -9294:3:2118 -9295:3:2119 -9296:3:2123 -9297:3:2124 -9298:3:2132 -9299:3:2137 -9300:3:2141 -9301:3:2142 -9302:3:2149 -9303:3:2150 -9304:3:2161 -9305:3:2169 -9306:3:2170 -9307:3:2174 -9308:3:2179 -9309:3:2180 -9310:0:2565 -9311:3:2192 -9312:0:2565 -9313:2:654 -9314:2:658 -9315:2:659 -9316:2:667 -9317:2:668 -9318:2:672 -9319:2:673 -9320:2:681 -9321:2:686 -9322:2:690 -9323:2:691 -9324:2:698 -9325:2:699 -9326:2:710 -9327:2:711 -9328:2:712 -9329:2:723 -9330:2:728 -9331:2:729 -9332:0:2565 -9333:3:2013 -9334:0:2565 -9335:1:296 -9336:0:2565 -9337:3:2014 -9338:0:2565 -9339:3:2015 -9340:3:2019 -9341:3:2020 -9342:3:2028 -9343:3:2029 -9344:3:2033 -9345:3:2034 -9346:3:2042 -9347:3:2047 -9348:3:2051 -9349:3:2052 -9350:3:2059 -9351:3:2060 -9352:3:2071 -9353:3:2079 -9354:3:2080 -9355:3:2084 -9356:3:2089 -9357:3:2090 -9358:0:2565 -9359:3:2102 -9360:0:2565 -9361:3:2104 -9362:0:2565 -9363:3:2105 -9364:3:2109 -9365:3:2110 -9366:3:2118 -9367:3:2119 -9368:3:2123 -9369:3:2124 -9370:3:2132 -9371:3:2137 -9372:3:2141 -9373:3:2142 -9374:3:2149 -9375:3:2150 -9376:3:2161 -9377:3:2169 -9378:3:2170 -9379:3:2174 -9380:3:2179 -9381:3:2180 -9382:0:2565 -9383:3:2192 -9384:0:2565 -9385:3:2013 -9386:0:2565 -9387:2:741 -9388:0:2565 -9389:2:750 -9390:0:2565 -9391:3:2014 -9392:0:2565 -9393:3:2015 -9394:3:2019 -9395:3:2020 -9396:3:2028 -9397:3:2029 -9398:3:2033 -9399:3:2034 -9400:3:2042 -9401:3:2047 -9402:3:2051 -9403:3:2052 -9404:3:2059 -9405:3:2060 -9406:3:2071 -9407:3:2079 -9408:3:2080 -9409:3:2084 -9410:3:2089 -9411:3:2090 -9412:0:2565 -9413:3:2102 -9414:0:2565 -9415:1:295 -9416:0:2565 -9417:2:753 -9418:0:2565 -9419:1:296 -9420:0:2565 -9421:3:2104 -9422:0:2565 -9423:3:2105 -9424:3:2109 -9425:3:2110 -9426:3:2118 -9427:3:2119 -9428:3:2123 -9429:3:2124 -9430:3:2132 -9431:3:2137 -9432:3:2141 -9433:3:2142 -9434:3:2149 -9435:3:2150 -9436:3:2161 -9437:3:2169 -9438:3:2170 -9439:3:2174 -9440:3:2179 -9441:3:2180 -9442:0:2565 -9443:3:2192 -9444:0:2565 -9445:3:2013 -9446:0:2565 -9447:3:2014 -9448:0:2565 -9449:3:2015 -9450:3:2019 -9451:3:2020 -9452:3:2028 -9453:3:2029 -9454:3:2033 -9455:3:2034 -9456:3:2042 -9457:3:2047 -9458:3:2051 -9459:3:2052 -9460:3:2059 -9461:3:2060 -9462:3:2071 -9463:3:2079 -9464:3:2080 -9465:3:2084 -9466:3:2089 -9467:3:2090 -9468:0:2565 -9469:3:2102 -9470:0:2565 -9471:1:295 -9472:0:2565 -9473:3:2104 -9474:0:2565 -9475:3:2105 -9476:3:2109 -9477:3:2110 -9478:3:2118 -9479:3:2119 -9480:3:2123 -9481:3:2124 -9482:3:2132 -9483:3:2137 -9484:3:2141 -9485:3:2142 -9486:3:2149 -9487:3:2150 -9488:3:2161 -9489:3:2169 -9490:3:2170 -9491:3:2174 -9492:3:2179 -9493:3:2180 -9494:0:2565 -9495:3:2192 -9496:0:2565 -9497:3:2013 -9498:0:2565 -9499:3:2014 -9500:0:2565 -9501:3:2015 -9502:3:2019 -9503:3:2020 -9504:3:2028 -9505:3:2029 -9506:3:2033 -9507:3:2034 -9508:3:2042 -9509:3:2047 -9510:3:2051 -9511:3:2052 -9512:3:2059 -9513:3:2060 -9514:3:2071 -9515:3:2079 -9516:3:2080 -9517:3:2084 -9518:3:2089 -9519:3:2090 -9520:0:2565 -9521:2:758 -9522:0:2565 -9523:3:2102 -9524:0:2565 -9525:1:296 -9526:0:2565 -9527:3:2104 -9528:0:2565 -9529:3:2105 -9530:3:2109 -9531:3:2110 -9532:3:2118 -9533:3:2119 -9534:3:2123 -9535:3:2124 -9536:3:2132 -9537:3:2137 -9538:3:2141 -9539:3:2142 -9540:3:2149 -9541:3:2150 -9542:3:2161 -9543:3:2169 -9544:3:2170 -9545:3:2174 -9546:3:2179 -9547:3:2180 -9548:0:2565 -9549:3:2192 -9550:0:2565 -9551:3:2013 -9552:0:2565 -9553:3:2014 -9554:0:2565 -9555:3:2015 -9556:3:2019 -9557:3:2020 -9558:3:2028 -9559:3:2029 -9560:3:2033 -9561:3:2034 -9562:3:2042 -9563:3:2047 -9564:3:2051 -9565:3:2052 -9566:3:2059 -9567:3:2060 -9568:3:2071 -9569:3:2079 -9570:3:2080 -9571:3:2084 -9572:3:2089 -9573:3:2090 -9574:0:2565 -9575:3:2102 -9576:0:2565 -9577:1:295 -9578:0:2565 -9579:3:2104 -9580:0:2565 -9581:3:2105 -9582:3:2109 -9583:3:2110 -9584:3:2118 -9585:3:2119 -9586:3:2123 -9587:3:2124 -9588:3:2132 -9589:3:2137 -9590:3:2141 -9591:3:2142 -9592:3:2149 -9593:3:2150 -9594:3:2161 -9595:3:2169 -9596:3:2170 -9597:3:2174 -9598:3:2179 -9599:3:2180 -9600:0:2565 -9601:3:2192 -9602:0:2565 -9603:3:2013 -9604:0:2565 -9605:3:2014 -9606:0:2565 -9607:3:2015 -9608:3:2019 -9609:3:2020 -9610:3:2028 -9611:3:2029 -9612:3:2033 -9613:3:2034 -9614:3:2042 -9615:3:2047 -9616:3:2051 -9617:3:2052 -9618:3:2059 -9619:3:2060 -9620:3:2071 -9621:3:2079 -9622:3:2080 -9623:3:2084 -9624:3:2089 -9625:3:2090 -9626:0:2565 -9627:2:759 -9628:0:2565 -9629:3:2102 -9630:0:2565 -9631:1:296 -9632:0:2565 -9633:3:2104 -9634:0:2565 -9635:3:2105 -9636:3:2109 -9637:3:2110 -9638:3:2118 -9639:3:2119 -9640:3:2123 -9641:3:2124 -9642:3:2132 -9643:3:2137 -9644:3:2141 -9645:3:2142 -9646:3:2149 -9647:3:2150 -9648:3:2161 -9649:3:2169 -9650:3:2170 -9651:3:2174 -9652:3:2179 -9653:3:2180 -9654:0:2565 -9655:3:2192 -9656:0:2565 -9657:3:2013 -9658:0:2565 -9659:3:2014 -9660:0:2565 -9661:3:2015 -9662:3:2019 -9663:3:2020 -9664:3:2028 -9665:3:2029 -9666:3:2033 -9667:3:2034 -9668:3:2042 -9669:3:2047 -9670:3:2051 -9671:3:2052 -9672:3:2059 -9673:3:2060 -9674:3:2071 -9675:3:2079 -9676:3:2080 -9677:3:2084 -9678:3:2089 -9679:3:2090 -9680:0:2565 -9681:3:2102 -9682:0:2565 -9683:2:760 -9684:0:2565 -9685:2:761 -9686:0:2565 -9687:2:762 -9688:0:2565 -9689:3:2104 -9690:0:2565 -9691:3:2105 -9692:3:2109 -9693:3:2110 -9694:3:2118 -9695:3:2119 -9696:3:2123 -9697:3:2124 -9698:3:2132 -9699:3:2137 -9700:3:2141 -9701:3:2142 -9702:3:2149 -9703:3:2150 -9704:3:2161 -9705:3:2169 -9706:3:2170 -9707:3:2174 -9708:3:2179 -9709:3:2180 -9710:0:2565 -9711:3:2192 -9712:0:2565 -9713:3:2013 -9714:0:2565 -9715:1:295 -9716:0:2565 -9717:2:763 -9718:0:2565 -9719:1:296 -9720:0:2565 -9721:3:2014 -9722:0:2565 -9723:3:2015 -9724:3:2019 -9725:3:2020 -9726:3:2028 -9727:3:2029 -9728:3:2033 -9729:3:2034 -9730:3:2042 -9731:3:2047 -9732:3:2051 -9733:3:2052 -9734:3:2059 -9735:3:2060 -9736:3:2071 -9737:3:2079 -9738:3:2080 -9739:3:2084 -9740:3:2089 -9741:3:2090 -9742:0:2565 -9743:3:2102 -9744:0:2565 -9745:3:2104 -9746:0:2565 -9747:3:2105 -9748:3:2109 -9749:3:2110 -9750:3:2118 -9751:3:2119 -9752:3:2123 -9753:3:2124 -9754:3:2132 -9755:3:2137 -9756:3:2141 -9757:3:2142 -9758:3:2149 -9759:3:2150 -9760:3:2161 -9761:3:2169 -9762:3:2170 -9763:3:2174 -9764:3:2179 -9765:3:2180 -9766:0:2565 -9767:3:2192 -9768:0:2565 -9769:3:2013 -9770:0:2565 -9771:1:295 -9772:0:2565 -9773:3:2014 -9774:0:2565 -9775:3:2015 -9776:3:2019 -9777:3:2020 -9778:3:2028 -9779:3:2029 -9780:3:2033 -9781:3:2034 -9782:3:2042 -9783:3:2047 -9784:3:2051 -9785:3:2052 -9786:3:2059 -9787:3:2060 -9788:3:2071 -9789:3:2079 -9790:3:2080 -9791:3:2084 -9792:3:2089 -9793:3:2090 -9794:0:2565 -9795:3:2102 -9796:0:2565 -9797:3:2104 -9798:0:2565 -9799:3:2105 -9800:3:2109 -9801:3:2110 -9802:3:2118 -9803:3:2119 -9804:3:2123 -9805:3:2124 -9806:3:2132 -9807:3:2137 -9808:3:2141 -9809:3:2142 -9810:3:2149 -9811:3:2150 -9812:3:2161 -9813:3:2169 -9814:3:2170 -9815:3:2174 -9816:3:2179 -9817:3:2180 -9818:0:2565 -9819:3:2192 -9820:0:2565 -9821:2:765 -9822:0:2565 -9823:3:2013 -9824:0:2565 -9825:1:296 -9826:0:2565 -9827:3:2014 -9828:0:2565 -9829:3:2015 -9830:3:2019 -9831:3:2020 -9832:3:2028 -9833:3:2029 -9834:3:2033 -9835:3:2034 -9836:3:2042 -9837:3:2047 -9838:3:2051 -9839:3:2052 -9840:3:2059 -9841:3:2060 -9842:3:2071 -9843:3:2079 -9844:3:2080 -9845:3:2084 -9846:3:2089 -9847:3:2090 -9848:0:2565 -9849:3:2102 -9850:0:2565 -9851:3:2104 -9852:0:2565 -9853:3:2105 -9854:3:2109 -9855:3:2110 -9856:3:2118 -9857:3:2119 -9858:3:2123 -9859:3:2124 -9860:3:2132 -9861:3:2137 -9862:3:2141 -9863:3:2142 -9864:3:2149 -9865:3:2150 -9866:3:2161 -9867:3:2169 -9868:3:2170 -9869:3:2174 -9870:3:2179 -9871:3:2180 -9872:0:2565 -9873:3:2192 -9874:0:2565 -9875:3:2013 -9876:0:2565 -9877:2:766 -9878:2:770 -9879:2:771 -9880:2:779 -9881:2:788 -9882:2:789 -9883:2:793 -9884:2:798 -9885:2:802 -9886:2:803 -9887:2:810 -9888:2:811 -9889:2:822 -9890:2:823 -9891:2:826 -9892:2:827 -9893:2:835 -9894:2:840 -9895:2:841 -9896:0:2565 -9897:3:2014 -9898:0:2565 -9899:3:2015 -9900:3:2019 -9901:3:2020 -9902:3:2028 -9903:3:2029 -9904:3:2033 -9905:3:2034 -9906:3:2042 -9907:3:2047 -9908:3:2051 -9909:3:2052 -9910:3:2059 -9911:3:2060 -9912:3:2071 -9913:3:2079 -9914:3:2080 -9915:3:2084 -9916:3:2089 -9917:3:2090 -9918:0:2565 -9919:3:2102 -9920:0:2565 -9921:3:2104 -9922:0:2565 -9923:3:2105 -9924:3:2109 -9925:3:2110 -9926:3:2118 -9927:3:2119 -9928:3:2123 -9929:3:2124 -9930:3:2132 -9931:3:2137 -9932:3:2141 -9933:3:2142 -9934:3:2149 -9935:3:2150 -9936:3:2161 -9937:3:2169 -9938:3:2170 -9939:3:2174 -9940:3:2179 -9941:3:2180 -9942:0:2565 -9943:3:2192 -9944:0:2565 -9945:2:853 -9946:0:2565 -9947:3:2013 -9948:0:2565 -9949:2:857 -9950:0:2565 -9951:2:465 -9952:0:2565 -9953:3:2014 -9954:0:2565 -9955:3:2015 -9956:3:2019 -9957:3:2020 -9958:3:2028 -9959:3:2029 -9960:3:2033 -9961:3:2034 -9962:3:2042 -9963:3:2047 -9964:3:2051 -9965:3:2052 -9966:3:2059 -9967:3:2060 -9968:3:2071 -9969:3:2079 -9970:3:2080 -9971:3:2084 -9972:3:2089 -9973:3:2090 -9974:0:2565 -9975:3:2102 -9976:0:2565 -9977:3:2104 -9978:0:2565 -9979:3:2105 -9980:3:2109 -9981:3:2110 -9982:3:2118 -9983:3:2119 -9984:3:2123 -9985:3:2124 -9986:3:2132 -9987:3:2137 -9988:3:2141 -9989:3:2142 -9990:3:2149 -9991:3:2150 -9992:3:2161 -9993:3:2169 -9994:3:2170 -9995:3:2174 -9996:3:2179 -9997:3:2180 -9998:0:2565 -9999:3:2192 -10000:0:2565 -10001:2:466 -10002:0:2565 -10003:3:2013 -10004:0:2565 -10005:3:2014 -10006:0:2565 -10007:3:2015 -10008:3:2019 -10009:3:2020 -10010:3:2028 -10011:3:2029 -10012:3:2033 -10013:3:2034 -10014:3:2042 -10015:3:2047 -10016:3:2051 -10017:3:2052 -10018:3:2059 -10019:3:2060 -10020:3:2071 -10021:3:2079 -10022:3:2080 -10023:3:2084 -10024:3:2089 -10025:3:2090 -10026:0:2565 -10027:3:2102 -10028:0:2565 -10029:3:2104 -10030:0:2565 -10031:3:2105 -10032:3:2109 -10033:3:2110 -10034:3:2118 -10035:3:2119 -10036:3:2123 -10037:3:2124 -10038:3:2132 -10039:3:2137 -10040:3:2141 -10041:3:2142 -10042:3:2149 -10043:3:2150 -10044:3:2161 -10045:3:2169 -10046:3:2170 -10047:3:2174 -10048:3:2179 -10049:3:2180 -10050:0:2565 -10051:2:467 -10052:0:2565 -10053:3:2192 -10054:0:2565 -10055:3:2013 -10056:0:2565 -10057:3:2014 -10058:0:2565 -10059:3:2015 -10060:3:2019 -10061:3:2020 -10062:3:2028 -10063:3:2029 -10064:3:2033 -10065:3:2034 -10066:3:2042 -10067:3:2047 -10068:3:2051 -10069:3:2052 -10070:3:2059 -10071:3:2060 -10072:3:2071 -10073:3:2079 -10074:3:2080 -10075:3:2084 -10076:3:2089 -10077:3:2090 -10078:0:2565 -10079:3:2102 -10080:0:2565 -10081:3:2104 -10082:0:2565 -10083:1:297 -10084:0:2565 -10085:2:468 -10086:0:2565 -10087:3:2105 -10088:3:2109 -10089:3:2110 -10090:3:2118 -10091:3:2119 -10092:3:2123 -10093:3:2124 -10094:3:2132 -10095:3:2137 -10096:3:2141 -10097:3:2142 -10098:3:2149 -10099:3:2150 -10100:3:2161 -10101:3:2169 -10102:3:2170 -10103:3:2174 -10104:3:2179 -10105:3:2180 -10106:0:2565 -10107:3:2192 -10108:0:2565 -10109:3:2013 -10110:0:2565 -10111:3:2014 -10112:0:2565 -10113:3:2015 -10114:3:2019 -10115:3:2020 -10116:3:2028 -10117:3:2029 -10118:3:2033 -10119:3:2034 -10120:3:2042 -10121:3:2047 -10122:3:2051 -10123:3:2052 -10124:3:2059 -10125:3:2060 -10126:3:2071 -10127:3:2079 -10128:3:2080 -10129:3:2084 -10130:3:2089 -10131:3:2090 -10132:0:2565 -10133:3:2102 -10134:0:2565 -10135:3:2104 -10136:0:2565 -10137:2:467 -10138:0:2565 -10139:2:468 -10140:0:2565 -10141:3:2105 -10142:3:2109 -10143:3:2110 -10144:3:2118 -10145:3:2119 -10146:3:2123 -10147:3:2124 -10148:3:2132 -10149:3:2137 -10150:3:2141 -10151:3:2142 -10152:3:2149 -10153:3:2150 -10154:3:2161 -10155:3:2169 -10156:3:2170 -10157:3:2174 -10158:3:2179 -10159:3:2180 -10160:0:2565 -10161:3:2192 -10162:0:2565 -10163:3:2013 -10164:0:2565 -10165:3:2014 -10166:0:2565 -10167:3:2015 -10168:3:2019 -10169:3:2020 -10170:3:2028 -10171:3:2029 -10172:3:2033 -10173:3:2034 -10174:3:2042 -10175:3:2047 -10176:3:2051 -10177:3:2052 -10178:3:2059 -10179:3:2060 -10180:3:2071 -10181:3:2079 -10182:3:2080 -10183:3:2084 -10184:3:2089 -10185:3:2090 -10186:0:2565 -10187:3:2102 -10188:0:2565 -10189:2:467 -10190:0:2565 -10191:1:303 -10192:0:2565 -10193:2:468 -10194:0:2565 -10195:1:312 -10196:0:2565 -10197:3:2104 -10198:0:2565 -10199:3:2105 -10200:3:2109 -10201:3:2110 -10202:3:2118 -10203:3:2119 -10204:3:2123 -10205:3:2124 -10206:3:2132 -10207:3:2137 -10208:3:2141 -10209:3:2142 -10210:3:2149 -10211:3:2150 -10212:3:2161 -10213:3:2169 -10214:3:2170 -10215:3:2174 -10216:3:2179 -10217:3:2180 -10218:0:2565 -10219:3:2192 -10220:0:2565 -10221:3:2013 -10222:0:2565 -10223:3:2014 -10224:0:2565 -10225:3:2015 -10226:3:2019 -10227:3:2020 -10228:3:2028 -10229:3:2029 -10230:3:2033 -10231:3:2034 -10232:3:2042 -10233:3:2047 -10234:3:2051 -10235:3:2052 -10236:3:2059 -10237:3:2060 -10238:3:2071 -10239:3:2079 -10240:3:2080 -10241:3:2084 -10242:3:2089 -10243:3:2090 -10244:0:2565 -10245:3:2102 -10246:0:2565 -10247:2:467 -10248:0:2565 -10249:2:468 -10250:0:2565 -10251:3:2104 -10252:0:2565 -10253:3:2105 -10254:3:2109 -10255:3:2110 -10256:3:2118 -10257:3:2119 -10258:3:2123 -10259:3:2124 -10260:3:2132 -10261:3:2137 -10262:3:2141 -10263:3:2142 -10264:3:2149 -10265:3:2150 -10266:3:2161 -10267:3:2169 -10268:3:2170 -10269:3:2174 -10270:3:2179 -10271:3:2180 -10272:0:2565 -10273:3:2192 -10274:0:2565 -10275:3:2013 -10276:0:2565 -10277:3:2014 -10278:0:2565 -10279:3:2015 -10280:3:2019 -10281:3:2020 -10282:3:2028 -10283:3:2029 -10284:3:2033 -10285:3:2034 -10286:3:2042 -10287:3:2047 -10288:3:2051 -10289:3:2052 -10290:3:2059 -10291:3:2060 -10292:3:2071 -10293:3:2079 -10294:3:2080 -10295:3:2084 -10296:3:2089 -10297:3:2090 -10298:0:2565 -10299:2:467 -10300:0:2565 -10301:1:314 -10302:0:2565 -10303:3:2102 -10304:0:2565 -10305:2:468 -10306:0:2565 -10307:3:2104 -10308:0:2565 -10309:3:2105 -10310:3:2109 -10311:3:2110 -10312:3:2118 -10313:3:2119 -10314:3:2123 -10315:3:2124 -10316:3:2132 -10317:3:2137 -10318:3:2141 -10319:3:2142 -10320:3:2149 -10321:3:2150 -10322:3:2161 -10323:3:2169 -10324:3:2170 -10325:3:2174 -10326:3:2179 -10327:3:2180 -10328:0:2565 -10329:3:2192 -10330:0:2565 -10331:3:2013 -10332:0:2565 -10333:3:2014 -10334:0:2565 -10335:3:2015 -10336:3:2019 -10337:3:2020 -10338:3:2028 -10339:3:2029 -10340:3:2033 -10341:3:2034 -10342:3:2042 -10343:3:2047 -10344:3:2051 -10345:3:2052 -10346:3:2059 -10347:3:2060 -10348:3:2071 -10349:3:2079 -10350:3:2080 -10351:3:2084 -10352:3:2089 -10353:3:2090 -10354:0:2565 -10355:2:469 -10356:0:2565 -10357:3:2102 -10358:0:2565 -10359:2:475 -10360:0:2565 -10361:2:476 -10362:0:2565 -10363:3:2104 -10364:0:2565 -10365:3:2105 -10366:3:2109 -10367:3:2110 -10368:3:2118 -10369:3:2119 -10370:3:2123 -10371:3:2124 -10372:3:2132 -10373:3:2137 -10374:3:2141 -10375:3:2142 -10376:3:2149 -10377:3:2150 -10378:3:2161 -10379:3:2169 -10380:3:2170 -10381:3:2174 -10382:3:2179 -10383:3:2180 -10384:0:2565 -10385:3:2192 -10386:0:2565 -10387:3:2013 -10388:0:2565 -10389:3:2014 -10390:0:2565 -10391:3:2015 -10392:3:2019 -10393:3:2020 -10394:3:2028 -10395:3:2029 -10396:3:2033 -10397:3:2034 -10398:3:2042 -10399:3:2047 -10400:3:2051 -10401:3:2052 -10402:3:2059 -10403:3:2060 -10404:3:2071 -10405:3:2079 -10406:3:2080 -10407:3:2084 -10408:3:2089 -10409:3:2090 -10410:0:2565 -10411:2:477 -10412:2:481 -10413:2:482 -10414:2:490 -10415:2:499 -10416:2:500 -10417:2:504 -10418:2:509 -10419:2:513 -10420:2:514 -10421:2:521 -10422:2:522 -10423:2:533 -10424:2:534 -10425:2:537 -10426:2:538 -10427:2:546 -10428:2:551 -10429:2:552 -10430:0:2565 -10431:3:2102 -10432:0:2565 -10433:3:2104 -10434:0:2565 -10435:3:2105 -10436:3:2109 -10437:3:2110 -10438:3:2118 -10439:3:2119 -10440:3:2123 -10441:3:2124 -10442:3:2132 -10443:3:2137 -10444:3:2141 -10445:3:2142 -10446:3:2149 -10447:3:2150 -10448:3:2161 -10449:3:2169 -10450:3:2170 -10451:3:2174 -10452:3:2179 -10453:3:2180 -10454:0:2565 -10455:3:2192 -10456:0:2565 -10457:3:2013 -10458:0:2565 -10459:3:2014 -10460:0:2565 -10461:2:564 -10462:0:2565 -10463:3:2015 -10464:3:2019 -10465:3:2020 -10466:3:2028 -10467:3:2029 -10468:3:2033 -10469:3:2034 -10470:3:2042 -10471:3:2047 -10472:3:2051 -10473:3:2052 -10474:3:2059 -10475:3:2060 -10476:3:2071 -10477:3:2079 -10478:3:2080 -10479:3:2084 -10480:3:2089 -10481:3:2090 -10482:0:2565 -10483:3:2102 -10484:0:2565 -10485:3:2104 -10486:0:2565 -10487:3:2105 -10488:3:2109 -10489:3:2110 -10490:3:2118 -10491:3:2119 -10492:3:2123 -10493:3:2124 -10494:3:2132 -10495:3:2137 -10496:3:2141 -10497:3:2142 -10498:3:2149 -10499:3:2150 -10500:3:2161 -10501:3:2169 -10502:3:2170 -10503:3:2174 -10504:3:2179 -10505:3:2180 -10506:0:2565 -10507:3:2192 -10508:0:2565 -10509:3:2013 -10510:0:2565 -10511:2:565 -10512:2:569 -10513:2:570 -10514:2:578 -10515:2:587 -10516:2:588 -10517:2:592 -10518:2:597 -10519:2:601 -10520:2:602 -10521:2:609 -10522:2:610 -10523:2:621 -10524:2:622 -10525:2:625 -10526:2:626 -10527:2:634 -10528:2:639 -10529:2:640 -10530:0:2565 -10531:2:744 -10532:0:2565 -10533:3:2014 -10534:0:2565 -10535:3:2015 -10536:3:2019 -10537:3:2020 -10538:3:2028 -10539:3:2029 -10540:3:2033 -10541:3:2034 -10542:3:2042 -10543:3:2047 -10544:3:2051 -10545:3:2052 -10546:3:2059 -10547:3:2060 -10548:3:2071 -10549:3:2079 -10550:3:2080 -10551:3:2084 -10552:3:2089 -10553:3:2090 -10554:0:2565 -10555:3:2102 -10556:0:2565 -10557:3:2104 -10558:0:2565 -10559:3:2105 -10560:3:2109 -10561:3:2110 -10562:3:2118 -10563:3:2119 -10564:3:2123 -10565:3:2124 -10566:3:2132 -10567:3:2137 -10568:3:2141 -10569:3:2142 -10570:3:2149 -10571:3:2150 -10572:3:2161 -10573:3:2169 -10574:3:2170 -10575:3:2174 -10576:3:2179 -10577:3:2180 -10578:0:2565 -10579:3:2192 -10580:0:2565 -10581:2:745 -10582:0:2565 -10583:3:2013 -10584:0:2565 -10585:2:750 -10586:0:2565 -10587:2:753 -10588:0:2565 -10589:3:2014 -10590:0:2565 -10591:3:2015 -10592:3:2019 -10593:3:2020 -10594:3:2028 -10595:3:2029 -10596:3:2033 -10597:3:2034 -10598:3:2042 -10599:3:2047 -10600:3:2051 -10601:3:2052 -10602:3:2059 -10603:3:2060 -10604:3:2071 -10605:3:2079 -10606:3:2080 -10607:3:2084 -10608:3:2089 -10609:3:2090 -10610:0:2565 -10611:3:2102 -10612:0:2565 -10613:3:2104 -10614:0:2565 -10615:3:2105 -10616:3:2109 -10617:3:2110 -10618:3:2118 -10619:3:2119 -10620:3:2123 -10621:3:2124 -10622:3:2132 -10623:3:2137 -10624:3:2141 -10625:3:2142 -10626:3:2149 -10627:3:2150 -10628:3:2161 -10629:3:2169 -10630:3:2170 -10631:3:2174 -10632:3:2179 -10633:3:2180 -10634:0:2565 -10635:3:2192 -10636:0:2565 -10637:2:758 -10638:0:2565 -10639:3:2013 -10640:0:2565 -10641:3:2014 -10642:0:2565 -10643:3:2015 -10644:3:2019 -10645:3:2020 -10646:3:2028 -10647:3:2029 -10648:3:2033 -10649:3:2034 -10650:3:2042 -10651:3:2047 -10652:3:2051 -10653:3:2052 -10654:3:2059 -10655:3:2060 -10656:3:2071 -10657:3:2079 -10658:3:2080 -10659:3:2084 -10660:3:2089 -10661:3:2090 -10662:0:2565 -10663:3:2102 -10664:0:2565 -10665:3:2104 -10666:0:2565 -10667:3:2105 -10668:3:2109 -10669:3:2110 -10670:3:2118 -10671:3:2119 -10672:3:2123 -10673:3:2124 -10674:3:2132 -10675:3:2137 -10676:3:2141 -10677:3:2142 -10678:3:2149 -10679:3:2150 -10680:3:2161 -10681:3:2169 -10682:3:2170 -10683:3:2174 -10684:3:2179 -10685:3:2180 -10686:0:2565 -10687:2:759 -10688:0:2565 -10689:3:2192 -10690:0:2565 -10691:3:2013 -10692:0:2565 -10693:3:2014 -10694:0:2565 -10695:3:2015 -10696:3:2019 -10697:3:2020 -10698:3:2028 -10699:3:2029 -10700:3:2033 -10701:3:2034 -10702:3:2042 -10703:3:2047 -10704:3:2051 -10705:3:2052 -10706:3:2059 -10707:3:2060 -10708:3:2071 -10709:3:2079 -10710:3:2080 -10711:3:2084 -10712:3:2089 -10713:3:2090 -10714:0:2565 -10715:3:2102 -10716:0:2565 -10717:3:2104 -10718:0:2565 -10719:2:760 -10720:0:2565 -10721:2:761 -10722:0:2565 -10723:2:762 -10724:0:2565 -10725:2:763 -10726:0:2565 -10727:3:2105 -10728:3:2109 -10729:3:2110 -10730:3:2118 -10731:3:2119 -10732:3:2123 -10733:3:2124 -10734:3:2132 -10735:3:2137 -10736:3:2141 -10737:3:2142 -10738:3:2149 -10739:3:2150 -10740:3:2161 -10741:3:2169 -10742:3:2170 -10743:3:2174 -10744:3:2179 -10745:3:2180 -10746:0:2565 -10747:3:2192 -10748:0:2565 -10749:3:2013 -10750:0:2565 -10751:3:2014 -10752:0:2565 -10753:3:2015 -10754:3:2019 -10755:3:2020 -10756:3:2028 -10757:3:2029 -10758:3:2033 -10759:3:2034 -10760:3:2042 -10761:3:2047 -10762:3:2051 -10763:3:2052 -10764:3:2059 -10765:3:2060 -10766:3:2071 -10767:3:2079 -10768:3:2080 -10769:3:2084 -10770:3:2089 -10771:3:2090 -10772:0:2565 -10773:3:2102 -10774:0:2565 -10775:2:765 -10776:0:2565 -10777:3:2104 -10778:0:2565 -10779:3:2105 -10780:3:2109 -10781:3:2110 -10782:3:2118 -10783:3:2119 -10784:3:2123 -10785:3:2124 -10786:3:2132 -10787:3:2137 -10788:3:2141 -10789:3:2142 -10790:3:2149 -10791:3:2150 -10792:3:2161 -10793:3:2169 -10794:3:2170 -10795:3:2174 -10796:3:2179 -10797:3:2180 -10798:0:2565 -10799:3:2192 -10800:0:2565 -10801:3:2013 -10802:0:2565 -10803:3:2014 -10804:0:2565 -10805:3:2015 -10806:3:2019 -10807:3:2020 -10808:3:2028 -10809:3:2029 -10810:3:2033 -10811:3:2034 -10812:3:2042 -10813:3:2047 -10814:3:2051 -10815:3:2052 -10816:3:2059 -10817:3:2060 -10818:3:2071 -10819:3:2079 -10820:3:2080 -10821:3:2084 -10822:3:2089 -10823:3:2090 -10824:0:2565 -10825:2:766 -10826:2:770 -10827:2:771 -10828:2:779 -10829:2:788 -10830:2:789 -10831:2:793 -10832:2:798 -10833:2:802 -10834:2:803 -10835:2:810 -10836:2:811 -10837:2:822 -10838:2:823 -10839:2:826 -10840:2:827 -10841:2:835 -10842:2:840 -10843:2:841 -10844:0:2565 -10845:3:2102 -10846:0:2565 -10847:3:2104 -10848:0:2565 -10849:3:2105 -10850:3:2109 -10851:3:2110 -10852:3:2118 -10853:3:2119 -10854:3:2123 -10855:3:2124 -10856:3:2132 -10857:3:2137 -10858:3:2141 -10859:3:2142 -10860:3:2149 -10861:3:2150 -10862:3:2161 -10863:3:2169 -10864:3:2170 -10865:3:2174 -10866:3:2179 -10867:3:2180 -10868:0:2565 -10869:3:2192 -10870:0:2565 -10871:3:2013 -10872:0:2565 -10873:3:2014 -10874:0:2565 -10875:2:853 -10876:0:2565 -10877:2:857 -10878:0:2565 -10879:2:465 -10880:0:2565 -10881:3:2015 -10882:3:2019 -10883:3:2020 -10884:3:2028 -10885:3:2029 -10886:3:2033 -10887:3:2034 -10888:3:2042 -10889:3:2047 -10890:3:2051 -10891:3:2052 -10892:3:2059 -10893:3:2060 -10894:3:2071 -10895:3:2079 -10896:3:2080 -10897:3:2084 -10898:3:2089 -10899:3:2090 -10900:0:2565 -10901:3:2102 -10902:0:2565 -10903:3:2104 -10904:0:2565 -10905:3:2105 -10906:3:2109 -10907:3:2110 -10908:3:2118 -10909:3:2119 -10910:3:2123 -10911:3:2124 -10912:3:2132 -10913:3:2137 -10914:3:2141 -10915:3:2142 -10916:3:2149 -10917:3:2150 -10918:3:2161 -10919:3:2169 -10920:3:2170 -10921:3:2174 -10922:3:2179 -10923:3:2180 -10924:0:2565 -10925:3:2192 -10926:0:2565 -10927:3:2013 -10928:0:2565 -10929:2:466 -10930:0:2565 -10931:3:2014 -10932:0:2565 -10933:3:2015 -10934:3:2019 -10935:3:2020 -10936:3:2028 -10937:3:2029 -10938:3:2033 -10939:3:2034 -10940:3:2042 -10941:3:2047 -10942:3:2051 -10943:3:2052 -10944:3:2059 -10945:3:2060 -10946:3:2071 -10947:3:2079 -10948:3:2080 -10949:3:2084 -10950:3:2089 -10951:3:2090 -10952:0:2565 -10953:3:2102 -10954:0:2565 -10955:3:2104 -10956:0:2565 -10957:3:2105 -10958:3:2109 -10959:3:2110 -10960:3:2118 -10961:3:2119 -10962:3:2123 -10963:3:2124 -10964:3:2132 -10965:3:2137 -10966:3:2141 -10967:3:2142 -10968:3:2149 -10969:3:2150 -10970:3:2161 -10971:3:2169 -10972:3:2170 -10973:3:2174 -10974:3:2179 -10975:3:2180 -10976:0:2565 -10977:3:2192 -10978:0:2565 -10979:2:467 -10980:0:2565 -10981:3:2013 -10982:0:2565 -10983:3:2014 -10984:0:2565 -10985:3:2015 -10986:3:2019 -10987:3:2020 -10988:3:2028 -10989:3:2029 -10990:3:2033 -10991:3:2034 -10992:3:2042 -10993:3:2047 -10994:3:2051 -10995:3:2052 -10996:3:2059 -10997:3:2060 -10998:3:2071 -10999:3:2079 -11000:3:2080 -11001:3:2084 -11002:3:2089 -11003:3:2090 -11004:0:2565 -11005:3:2102 -11006:0:2565 -11007:3:2104 -11008:0:2565 -11009:3:2105 -11010:3:2109 -11011:3:2110 -11012:3:2118 -11013:3:2119 -11014:3:2123 -11015:3:2124 -11016:3:2132 -11017:3:2137 -11018:3:2141 -11019:3:2142 -11020:3:2149 -11021:3:2150 -11022:3:2161 -11023:3:2169 -11024:3:2170 -11025:3:2174 -11026:3:2179 -11027:3:2180 -11028:0:2565 -11029:1:317 -11030:0:2565 -11031:3:2192 -11032:0:2565 -11033:3:2013 -11034:0:2565 -11035:2:468 -11036:0:2565 -11037:1:323 -11038:0:2565 -11039:1:324 -11040:0:2565 -11041:3:2014 -11042:0:2565 -11043:3:2015 -11044:3:2019 -11045:3:2020 -11046:3:2028 -11047:3:2029 -11048:3:2033 -11049:3:2034 -11050:3:2042 -11051:3:2047 -11052:3:2051 -11053:3:2052 -11054:3:2059 -11055:3:2060 -11056:3:2071 -11057:3:2079 -11058:3:2080 -11059:3:2084 -11060:3:2089 -11061:3:2090 -11062:0:2565 -11063:3:2102 -11064:0:2565 -11065:3:2104 -11066:0:2565 -11067:3:2105 -11068:3:2109 -11069:3:2110 -11070:3:2118 -11071:3:2119 -11072:3:2123 -11073:3:2124 -11074:3:2132 -11075:3:2137 -11076:3:2141 -11077:3:2142 -11078:3:2149 -11079:3:2150 -11080:3:2161 -11081:3:2169 -11082:3:2170 -11083:3:2174 -11084:3:2179 -11085:3:2180 -11086:0:2565 -11087:3:2192 -11088:0:2565 -11089:3:2013 -11090:0:2565 -11091:2:467 -11092:0:2565 -11093:2:468 -11094:0:2565 -11095:3:2014 -11096:0:2565 -11097:3:2015 -11098:3:2019 -11099:3:2020 -11100:3:2028 -11101:3:2029 -11102:3:2033 -11103:3:2034 -11104:3:2042 -11105:3:2047 -11106:3:2051 -11107:3:2052 -11108:3:2059 -11109:3:2060 -11110:3:2071 -11111:3:2079 -11112:3:2080 -11113:3:2084 -11114:3:2089 -11115:3:2090 -11116:0:2565 -11117:3:2102 -11118:0:2565 -11119:3:2104 -11120:0:2565 -11121:3:2105 -11122:3:2109 -11123:3:2110 -11124:3:2118 -11125:3:2119 -11126:3:2123 -11127:3:2124 -11128:3:2132 -11129:3:2137 -11130:3:2141 -11131:3:2142 -11132:3:2149 -11133:3:2150 -11134:3:2161 -11135:3:2169 -11136:3:2170 -11137:3:2174 -11138:3:2179 -11139:3:2180 -11140:0:2565 -11141:3:2192 -11142:0:2565 -11143:2:467 -11144:0:2565 -11145:1:329 -11146:0:2565 -11147:3:2013 -11148:0:2565 -11149:2:468 -11150:0:2565 -11151:3:2014 -11152:0:2565 -11153:3:2015 -11154:3:2019 -11155:3:2020 -11156:3:2028 -11157:3:2029 -11158:3:2033 -11159:3:2034 -11160:3:2042 -11161:3:2047 -11162:3:2051 -11163:3:2052 -11164:3:2059 -11165:3:2060 -11166:3:2071 -11167:3:2079 -11168:3:2080 -11169:3:2084 -11170:3:2089 -11171:3:2090 -11172:0:2565 -11173:3:2102 -11174:0:2565 -11175:3:2104 -11176:0:2565 -11177:3:2105 -11178:3:2109 -11179:3:2110 -11180:3:2118 -11181:3:2119 -11182:3:2123 -11183:3:2124 -11184:3:2132 -11185:3:2137 -11186:3:2141 -11187:3:2142 -11188:3:2149 -11189:3:2150 -11190:3:2161 -11191:3:2169 -11192:3:2170 -11193:3:2174 -11194:3:2179 -11195:3:2180 -11196:0:2565 -11197:3:2192 -11198:0:2565 -11199:2:467 -11200:0:2565 -11201:3:2013 -11202:0:2565 -11203:3:2014 -11204:0:2565 -11205:3:2015 -11206:3:2019 -11207:3:2020 -11208:3:2028 -11209:3:2029 -11210:3:2033 -11211:3:2034 -11212:3:2042 -11213:3:2047 -11214:3:2051 -11215:3:2052 -11216:3:2059 -11217:3:2060 -11218:3:2071 -11219:3:2079 -11220:3:2080 -11221:3:2084 -11222:3:2089 -11223:3:2090 -11224:0:2565 -11225:3:2102 -11226:0:2565 -11227:3:2104 -11228:0:2565 -11229:3:2105 -11230:3:2109 -11231:3:2110 -11232:3:2118 -11233:3:2119 -11234:3:2123 -11235:3:2124 -11236:3:2132 -11237:3:2137 -11238:3:2141 -11239:3:2142 -11240:3:2149 -11241:3:2150 -11242:3:2161 -11243:3:2169 -11244:3:2170 -11245:3:2174 -11246:3:2179 -11247:3:2180 -11248:0:2565 -11249:1:330 -11250:0:2565 -11251:3:2192 -11252:0:2565 -11253:3:2013 -11254:0:2565 -11255:2:468 -11256:0:2565 -11257:3:2014 -11258:0:2565 -11259:3:2015 -11260:3:2019 -11261:3:2020 -11262:3:2028 -11263:3:2029 -11264:3:2033 -11265:3:2034 -11266:3:2042 -11267:3:2047 -11268:3:2051 -11269:3:2052 -11270:3:2059 -11271:3:2060 -11272:3:2071 -11273:3:2079 -11274:3:2080 -11275:3:2084 -11276:3:2089 -11277:3:2090 -11278:0:2565 -11279:3:2102 -11280:0:2565 -11281:3:2104 -11282:0:2565 -11283:3:2105 -11284:3:2109 -11285:3:2110 -11286:3:2118 -11287:3:2119 -11288:3:2123 -11289:3:2124 -11290:3:2132 -11291:3:2137 -11292:3:2141 -11293:3:2142 -11294:3:2149 -11295:3:2150 -11296:3:2161 -11297:3:2169 -11298:3:2170 -11299:3:2174 -11300:3:2179 -11301:3:2180 -11302:0:2565 -11303:3:2192 -11304:0:2565 -11305:2:467 -11306:0:2565 -11307:3:2013 -11308:0:2565 -11309:3:2014 -11310:0:2565 -11311:3:2015 -11312:3:2019 -11313:3:2020 -11314:3:2028 -11315:3:2029 -11316:3:2033 -11317:3:2034 -11318:3:2042 -11319:3:2047 -11320:3:2051 -11321:3:2052 -11322:3:2059 -11323:3:2060 -11324:3:2071 -11325:3:2079 -11326:3:2080 -11327:3:2084 -11328:3:2089 -11329:3:2090 -11330:0:2565 -11331:3:2102 -11332:0:2565 -11333:3:2104 -11334:0:2565 -11335:3:2105 -11336:3:2109 -11337:3:2110 -11338:3:2118 -11339:3:2119 -11340:3:2123 -11341:3:2124 -11342:3:2132 -11343:3:2137 -11344:3:2141 -11345:3:2142 -11346:3:2149 -11347:3:2150 -11348:3:2161 -11349:3:2169 -11350:3:2170 -11351:3:2174 -11352:3:2179 -11353:3:2180 -11354:0:2565 -11355:1:331 -11356:0:2565 -11357:3:2192 -11358:0:2565 -11359:3:2013 -11360:0:2565 -11361:2:468 -11362:0:2565 -11363:1:332 -11364:0:2565 -11365:1:333 -11366:0:2565 -11367:1:334 -11368:0:2565 -11369:3:2014 -11370:0:2565 -11371:3:2015 -11372:3:2019 -11373:3:2020 -11374:3:2028 -11375:3:2029 -11376:3:2033 -11377:3:2034 -11378:3:2042 -11379:3:2047 -11380:3:2051 -11381:3:2052 -11382:3:2059 -11383:3:2060 -11384:3:2071 -11385:3:2079 -11386:3:2080 -11387:3:2084 -11388:3:2089 -11389:3:2090 -11390:0:2565 -11391:3:2102 -11392:0:2565 -11393:3:2104 -11394:0:2565 -11395:3:2105 -11396:3:2109 -11397:3:2110 -11398:3:2118 -11399:3:2119 -11400:3:2123 -11401:3:2124 -11402:3:2132 -11403:3:2137 -11404:3:2141 -11405:3:2142 -11406:3:2149 -11407:3:2150 -11408:3:2161 -11409:3:2169 -11410:3:2170 -11411:3:2174 -11412:3:2179 -11413:3:2180 -11414:0:2565 -11415:3:2192 -11416:0:2565 -11417:3:2013 -11418:0:2565 -11419:2:467 -11420:0:2565 -11421:2:468 -11422:0:2565 -11423:3:2014 -11424:0:2565 -11425:3:2015 -11426:3:2019 -11427:3:2020 -11428:3:2028 -11429:3:2029 -11430:3:2033 -11431:3:2034 -11432:3:2042 -11433:3:2047 -11434:3:2051 -11435:3:2052 -11436:3:2059 -11437:3:2060 -11438:3:2071 -11439:3:2079 -11440:3:2080 -11441:3:2084 -11442:3:2089 -11443:3:2090 -11444:0:2565 -11445:3:2102 -11446:0:2565 -11447:3:2104 -11448:0:2565 -11449:3:2105 -11450:3:2109 -11451:3:2110 -11452:3:2118 -11453:3:2119 -11454:3:2123 -11455:3:2124 -11456:3:2132 -11457:3:2137 -11458:3:2141 -11459:3:2142 -11460:3:2149 -11461:3:2150 -11462:3:2161 -11463:3:2169 -11464:3:2170 -11465:3:2174 -11466:3:2179 -11467:3:2180 -11468:0:2565 -11469:3:2192 -11470:0:2565 -11471:2:467 -11472:0:2565 -11473:1:336 -11474:0:2565 -11475:3:2013 -11476:0:2565 -11477:2:468 -11478:0:2565 -11479:3:2014 -11480:0:2565 -11481:3:2015 -11482:3:2019 -11483:3:2020 -11484:3:2028 -11485:3:2029 -11486:3:2033 -11487:3:2034 -11488:3:2042 -11489:3:2047 -11490:3:2051 -11491:3:2052 -11492:3:2059 -11493:3:2060 -11494:3:2071 -11495:3:2079 -11496:3:2080 -11497:3:2084 -11498:3:2089 -11499:3:2090 -11500:0:2565 -11501:3:2102 -11502:0:2565 -11503:3:2104 -11504:0:2565 -11505:3:2105 -11506:3:2109 -11507:3:2110 -11508:3:2118 -11509:3:2119 -11510:3:2123 -11511:3:2124 -11512:3:2132 -11513:3:2137 -11514:3:2141 -11515:3:2142 -11516:3:2149 -11517:3:2150 -11518:3:2161 -11519:3:2169 -11520:3:2170 -11521:3:2174 -11522:3:2179 -11523:3:2180 -11524:0:2565 -11525:3:2192 -11526:0:2565 -11527:2:469 -11528:0:2565 -11529:3:2013 -11530:0:2565 -11531:2:475 -11532:0:2565 -11533:2:476 -11534:0:2565 -11535:3:2014 -11536:0:2565 -11537:3:2015 -11538:3:2019 -11539:3:2020 -11540:3:2028 -11541:3:2029 -11542:3:2033 -11543:3:2034 -11544:3:2042 -11545:3:2047 -11546:3:2051 -11547:3:2052 -11548:3:2059 -11549:3:2060 -11550:3:2071 -11551:3:2079 -11552:3:2080 -11553:3:2084 -11554:3:2089 -11555:3:2090 -11556:0:2565 -11557:3:2102 -11558:0:2565 -11559:3:2104 -11560:0:2565 -11561:3:2105 -11562:3:2109 -11563:3:2110 -11564:3:2118 -11565:3:2119 -11566:3:2123 -11567:3:2124 -11568:3:2132 -11569:3:2137 -11570:3:2141 -11571:3:2142 -11572:3:2149 -11573:3:2150 -11574:3:2161 -11575:3:2169 -11576:3:2170 -11577:3:2174 -11578:3:2179 -11579:3:2180 -11580:0:2565 -11581:3:2192 -11582:0:2565 -11583:2:477 -11584:2:481 -11585:2:482 -11586:2:490 -11587:2:499 -11588:2:500 -11589:2:504 -11590:2:509 -11591:2:513 -11592:2:514 -11593:2:521 -11594:2:522 -11595:2:533 -11596:2:534 -11597:2:537 -11598:2:538 -11599:2:546 -11600:2:551 -11601:2:552 -11602:0:2565 -11603:3:2013 -11604:0:2565 -11605:3:2014 -11606:0:2565 -11607:3:2015 -11608:3:2019 -11609:3:2020 -11610:3:2028 -11611:3:2029 -11612:3:2033 -11613:3:2034 -11614:3:2042 -11615:3:2047 -11616:3:2051 -11617:3:2052 -11618:3:2059 -11619:3:2060 -11620:3:2071 -11621:3:2079 -11622:3:2080 -11623:3:2084 -11624:3:2089 -11625:3:2090 -11626:0:2565 -11627:3:2102 -11628:0:2565 -11629:3:2104 -11630:0:2565 -11631:3:2105 -11632:3:2109 -11633:3:2110 -11634:3:2118 -11635:3:2119 -11636:3:2123 -11637:3:2124 -11638:3:2132 -11639:3:2137 -11640:3:2141 -11641:3:2142 -11642:3:2149 -11643:3:2150 -11644:3:2161 -11645:3:2169 -11646:3:2170 -11647:3:2174 -11648:3:2179 -11649:3:2180 -11650:0:2565 -11651:2:564 -11652:0:2565 -11653:3:2192 -11654:0:2565 -11655:3:2013 -11656:0:2565 -11657:3:2014 -11658:0:2565 -11659:3:2015 -11660:3:2019 -11661:3:2020 -11662:3:2028 -11663:3:2029 -11664:3:2033 -11665:3:2034 -11666:3:2042 -11667:3:2047 -11668:3:2051 -11669:3:2052 -11670:3:2059 -11671:3:2060 -11672:3:2071 -11673:3:2079 -11674:3:2080 -11675:3:2084 -11676:3:2089 -11677:3:2090 -11678:0:2565 -11679:3:2102 -11680:0:2565 -11681:3:2104 -11682:0:2565 -11683:2:565 -11684:2:569 -11685:2:570 -11686:2:578 -11687:2:587 -11688:2:588 -11689:2:592 -11690:2:597 -11691:2:601 -11692:2:602 -11693:2:609 -11694:2:610 -11695:2:621 -11696:2:622 -11697:2:625 -11698:2:626 -11699:2:634 -11700:2:639 -11701:2:640 -11702:0:2565 -11703:2:744 -11704:0:2565 -11705:3:2105 -11706:3:2109 -11707:3:2110 -11708:3:2118 -11709:3:2119 -11710:3:2123 -11711:3:2124 -11712:3:2132 -11713:3:2137 -11714:3:2141 -11715:3:2142 -11716:3:2149 -11717:3:2150 -11718:3:2161 -11719:3:2169 -11720:3:2170 -11721:3:2174 -11722:3:2179 -11723:3:2180 -11724:0:2565 -11725:3:2192 -11726:0:2565 -11727:3:2013 -11728:0:2565 -11729:3:2014 -11730:0:2565 -11731:3:2015 -11732:3:2019 -11733:3:2020 -11734:3:2028 -11735:3:2029 -11736:3:2033 -11737:3:2034 -11738:3:2042 -11739:3:2047 -11740:3:2051 -11741:3:2052 -11742:3:2059 -11743:3:2060 -11744:3:2071 -11745:3:2079 -11746:3:2080 -11747:3:2084 -11748:3:2089 -11749:3:2090 -11750:0:2565 -11751:3:2102 -11752:0:2565 -11753:2:745 -11754:0:2565 -11755:2:750 -11756:0:2565 -11757:2:753 -11758:0:2565 -11759:3:2104 -11760:0:2565 -11761:3:2105 -11762:3:2109 -11763:3:2110 -11764:3:2118 -11765:3:2119 -11766:3:2123 -11767:3:2124 -11768:3:2132 -11769:3:2137 -11770:3:2141 -11771:3:2142 -11772:3:2149 -11773:3:2150 -11774:3:2161 -11775:3:2169 -11776:3:2170 -11777:3:2174 -11778:3:2179 -11779:3:2180 -11780:0:2565 -11781:3:2192 -11782:0:2565 -11783:3:2013 -11784:0:2565 -11785:3:2014 -11786:0:2565 -11787:3:2015 -11788:3:2019 -11789:3:2020 -11790:3:2028 -11791:3:2029 -11792:3:2033 -11793:3:2034 -11794:3:2042 -11795:3:2047 -11796:3:2051 -11797:3:2052 -11798:3:2059 -11799:3:2060 -11800:3:2071 -11801:3:2079 -11802:3:2080 -11803:3:2084 -11804:3:2089 -11805:3:2090 -11806:0:2565 -11807:2:758 -11808:0:2565 -11809:3:2102 -11810:0:2565 -11811:3:2104 -11812:0:2565 -11813:3:2105 -11814:3:2109 -11815:3:2110 -11816:3:2118 -11817:3:2119 -11818:3:2123 -11819:3:2124 -11820:3:2132 -11821:3:2137 -11822:3:2141 -11823:3:2142 -11824:3:2149 -11825:3:2150 -11826:3:2161 -11827:3:2169 -11828:3:2170 -11829:3:2174 -11830:3:2179 -11831:3:2180 -11832:0:2565 -11833:3:2192 -11834:0:2565 -11835:3:2013 -11836:0:2565 -11837:3:2014 -11838:0:2565 -11839:2:759 -11840:0:2565 -11841:3:2015 -11842:3:2019 -11843:3:2020 -11844:3:2028 -11845:3:2029 -11846:3:2033 -11847:3:2034 -11848:3:2042 -11849:3:2047 -11850:3:2051 -11851:3:2052 -11852:3:2059 -11853:3:2060 -11854:3:2071 -11855:3:2079 -11856:3:2080 -11857:3:2084 -11858:3:2089 -11859:3:2090 -11860:0:2565 -11861:3:2102 -11862:0:2565 -11863:3:2104 -11864:0:2565 -11865:3:2105 -11866:3:2109 -11867:3:2110 -11868:3:2118 -11869:3:2119 -11870:3:2123 -11871:3:2124 -11872:3:2132 -11873:3:2137 -11874:3:2141 -11875:3:2142 -11876:3:2149 -11877:3:2150 -11878:3:2161 -11879:3:2169 -11880:3:2170 -11881:3:2174 -11882:3:2179 -11883:3:2180 -11884:0:2565 -11885:3:2192 -11886:0:2565 -11887:3:2013 -11888:0:2565 -11889:2:760 -11890:0:2565 -11891:2:761 -11892:0:2565 -11893:2:762 -11894:0:2565 -11895:2:763 -11896:0:2565 -11897:3:2014 -11898:0:2565 -11899:3:2015 -11900:3:2019 -11901:3:2020 -11902:3:2028 -11903:3:2029 -11904:3:2033 -11905:3:2034 -11906:3:2042 -11907:3:2047 -11908:3:2051 -11909:3:2052 -11910:3:2059 -11911:3:2060 -11912:3:2071 -11913:3:2079 -11914:3:2080 -11915:3:2084 -11916:3:2089 -11917:3:2090 -11918:0:2565 -11919:3:2102 -11920:0:2565 -11921:3:2104 -11922:0:2565 -11923:3:2105 -11924:3:2109 -11925:3:2110 -11926:3:2118 -11927:3:2119 -11928:3:2123 -11929:3:2124 -11930:3:2132 -11931:3:2137 -11932:3:2141 -11933:3:2142 -11934:3:2149 -11935:3:2150 -11936:3:2161 -11937:3:2169 -11938:3:2170 -11939:3:2174 -11940:3:2179 -11941:3:2180 -11942:0:2565 -11943:3:2192 -11944:0:2565 -11945:2:765 -11946:0:2565 -11947:3:2013 -11948:0:2565 -11949:3:2014 -11950:0:2565 -11951:3:2015 -11952:3:2019 -11953:3:2020 -11954:3:2028 -11955:3:2029 -11956:3:2033 -11957:3:2034 -11958:3:2042 -11959:3:2047 -11960:3:2051 -11961:3:2052 -11962:3:2059 -11963:3:2060 -11964:3:2071 -11965:3:2079 -11966:3:2080 -11967:3:2084 -11968:3:2089 -11969:3:2090 -11970:0:2565 -11971:3:2102 -11972:0:2565 -11973:3:2104 -11974:0:2565 -11975:3:2105 -11976:3:2109 -11977:3:2110 -11978:3:2118 -11979:3:2119 -11980:3:2123 -11981:3:2124 -11982:3:2132 -11983:3:2137 -11984:3:2141 -11985:3:2142 -11986:3:2149 -11987:3:2150 -11988:3:2161 -11989:3:2169 -11990:3:2170 -11991:3:2174 -11992:3:2179 -11993:3:2180 -11994:0:2565 -11995:2:766 -11996:2:770 -11997:2:771 -11998:2:779 -11999:2:788 -12000:2:789 -12001:2:793 -12002:2:798 -12003:2:802 -12004:2:803 -12005:2:810 -12006:2:811 -12007:2:822 -12008:2:823 -12009:2:826 -12010:2:827 -12011:2:835 -12012:2:840 -12013:2:841 -12014:0:2565 -12015:3:2192 -12016:0:2565 -12017:3:2013 -12018:0:2565 -12019:3:2014 -12020:0:2565 -12021:3:2015 -12022:3:2019 -12023:3:2020 -12024:3:2028 -12025:3:2029 -12026:3:2033 -12027:3:2034 -12028:3:2042 -12029:3:2047 -12030:3:2051 -12031:3:2052 -12032:3:2059 -12033:3:2060 -12034:3:2071 -12035:3:2079 -12036:3:2080 -12037:3:2084 -12038:3:2089 -12039:3:2090 -12040:0:2565 -12041:3:2102 -12042:0:2565 -12043:3:2104 -12044:0:2565 -12045:2:853 -12046:0:2565 -12047:2:857 -12048:0:2565 -12049:2:465 -12050:0:2565 -12051:3:2105 -12052:3:2109 -12053:3:2110 -12054:3:2118 -12055:3:2119 -12056:3:2123 -12057:3:2124 -12058:3:2132 -12059:3:2137 -12060:3:2141 -12061:3:2142 -12062:3:2149 -12063:3:2150 -12064:3:2161 -12065:3:2169 -12066:3:2170 -12067:3:2174 -12068:3:2179 -12069:3:2180 -12070:0:2565 -12071:3:2192 -12072:0:2565 -12073:3:2013 -12074:0:2565 -12075:3:2014 -12076:0:2565 -12077:3:2015 -12078:3:2019 -12079:3:2020 -12080:3:2028 -12081:3:2029 -12082:3:2033 -12083:3:2034 -12084:3:2042 -12085:3:2047 -12086:3:2051 -12087:3:2052 -12088:3:2059 -12089:3:2060 -12090:3:2071 -12091:3:2079 -12092:3:2080 -12093:3:2084 -12094:3:2089 -12095:3:2090 -12096:0:2565 -12097:3:2102 -12098:0:2565 -12099:2:466 -12100:0:2565 -12101:3:2104 -12102:0:2565 -12103:3:2105 -12104:3:2109 -12105:3:2110 -12106:3:2118 -12107:3:2119 -12108:3:2123 -12109:3:2124 -12110:3:2132 -12111:3:2137 -12112:3:2141 -12113:3:2142 -12114:3:2149 -12115:3:2150 -12116:3:2161 -12117:3:2169 -12118:3:2170 -12119:3:2174 -12120:3:2179 -12121:3:2180 -12122:0:2565 -12123:3:2192 -12124:0:2565 -12125:3:2013 -12126:0:2565 -12127:3:2014 -12128:0:2565 -12129:3:2015 -12130:3:2019 -12131:3:2020 -12132:3:2028 -12133:3:2029 -12134:3:2033 -12135:3:2034 -12136:3:2042 -12137:3:2047 -12138:3:2051 -12139:3:2052 -12140:3:2059 -12141:3:2060 -12142:3:2071 -12143:3:2079 -12144:3:2080 -12145:3:2084 -12146:3:2089 -12147:3:2090 -12148:0:2565 -12149:2:467 -12150:0:2565 -12151:3:2102 -12152:0:2565 -12153:3:2104 -12154:0:2565 -12155:3:2105 -12156:3:2109 -12157:3:2110 -12158:3:2118 -12159:3:2119 -12160:3:2123 -12161:3:2124 -12162:3:2132 -12163:3:2137 -12164:3:2141 -12165:3:2142 -12166:3:2149 -12167:3:2150 -12168:3:2161 -12169:3:2169 -12170:3:2170 -12171:3:2174 -12172:3:2179 -12173:3:2180 -12174:0:2565 -12175:3:2192 -12176:0:2565 -12177:3:2013 -12178:0:2565 -12179:3:2014 -12180:0:2565 -12181:1:339 -12182:0:2565 -12183:2:468 -12184:0:2565 -12185:3:2015 -12186:3:2019 -12187:3:2020 -12188:3:2028 -12189:3:2029 -12190:3:2033 -12191:3:2034 -12192:3:2042 -12193:3:2047 -12194:3:2051 -12195:3:2052 -12196:3:2059 -12197:3:2060 -12198:3:2071 -12199:3:2079 -12200:3:2080 -12201:3:2084 -12202:3:2089 -12203:3:2090 -12204:0:2565 -12205:3:2102 -12206:0:2565 -12207:3:2104 -12208:0:2565 -12209:3:2105 -12210:3:2109 -12211:3:2110 -12212:3:2118 -12213:3:2119 -12214:3:2123 -12215:3:2124 -12216:3:2132 -12217:3:2137 -12218:3:2141 -12219:3:2142 -12220:3:2149 -12221:3:2150 -12222:3:2161 -12223:3:2169 -12224:3:2170 -12225:3:2174 -12226:3:2179 -12227:3:2180 -12228:0:2565 -12229:3:2192 -12230:0:2565 -12231:3:2013 -12232:0:2565 -12233:3:2014 -12234:0:2565 -12235:2:467 -12236:0:2565 -12237:2:468 -12238:0:2565 -12239:3:2015 -12240:3:2019 -12241:3:2020 -12242:3:2028 -12243:3:2029 -12244:3:2033 -12245:3:2034 -12246:3:2042 -12247:3:2047 -12248:3:2051 -12249:3:2052 -12250:3:2059 -12251:3:2060 -12252:3:2071 -12253:3:2079 -12254:3:2080 -12255:3:2084 -12256:3:2089 -12257:3:2090 -12258:0:2565 -12259:3:2102 -12260:0:2565 -12261:3:2104 -12262:0:2565 -12263:3:2105 -12264:3:2109 -12265:3:2110 -12266:3:2118 -12267:3:2119 -12268:3:2123 -12269:3:2124 -12270:3:2132 -12271:3:2137 -12272:3:2141 -12273:3:2142 -12274:3:2149 -12275:3:2150 -12276:3:2161 -12277:3:2169 -12278:3:2170 -12279:3:2174 -12280:3:2179 -12281:3:2180 -12282:0:2565 -12283:3:2192 -12284:0:2565 -12285:3:2013 -12286:0:2565 -12287:2:467 -12288:0:2565 -12289:1:345 -12290:0:2565 -12291:2:468 -12292:0:2565 -12293:3:2014 -12294:0:2565 -12295:3:2015 -12296:3:2019 -12297:3:2020 -12298:3:2028 -12299:3:2029 -12300:3:2033 -12301:3:2034 -12302:3:2042 -12303:3:2047 -12304:3:2051 -12305:3:2052 -12306:3:2059 -12307:3:2060 -12308:3:2071 -12309:3:2079 -12310:3:2080 -12311:3:2084 -12312:3:2089 -12313:3:2090 -12314:0:2565 -12315:3:2102 -12316:0:2565 -12317:3:2104 -12318:0:2565 -12319:3:2105 -12320:3:2109 -12321:3:2110 -12322:3:2118 -12323:3:2119 -12324:3:2123 -12325:3:2124 -12326:3:2132 -12327:3:2137 -12328:3:2141 -12329:3:2142 -12330:3:2149 -12331:3:2150 -12332:3:2161 -12333:3:2169 -12334:3:2170 -12335:3:2174 -12336:3:2179 -12337:3:2180 -12338:0:2565 -12339:3:2192 -12340:0:2565 -12341:3:2013 -12342:0:2565 -12343:2:467 -12344:0:2565 -12345:2:468 -12346:0:2565 -12347:3:2014 -12348:0:2565 -12349:3:2015 -12350:3:2019 -12351:3:2020 -12352:3:2028 -12353:3:2029 -12354:3:2033 -12355:3:2034 -12356:3:2042 -12357:3:2047 -12358:3:2051 -12359:3:2052 -12360:3:2059 -12361:3:2060 -12362:3:2071 -12363:3:2079 -12364:3:2080 -12365:3:2084 -12366:3:2089 -12367:3:2090 -12368:0:2565 -12369:3:2102 -12370:0:2565 -12371:3:2104 -12372:0:2565 -12373:3:2105 -12374:3:2109 -12375:3:2110 -12376:3:2118 -12377:3:2119 -12378:3:2123 -12379:3:2124 -12380:3:2132 -12381:3:2137 -12382:3:2141 -12383:3:2142 -12384:3:2149 -12385:3:2150 -12386:3:2161 -12387:3:2169 -12388:3:2170 -12389:3:2174 -12390:3:2179 -12391:3:2180 -12392:0:2565 -12393:3:2192 -12394:0:2565 -12395:2:467 -12396:0:2565 -12397:1:346 -12398:1:350 -12399:1:351 -12400:1:359 -12401:1:368 -12402:1:369 -12403:1:373 -12404:1:378 -12405:1:382 -12406:1:383 -12407:1:390 -12408:1:391 -12409:1:402 -12410:1:403 -12411:1:406 -12412:1:407 -12413:1:415 -12414:1:420 -12415:1:421 -12416:0:2565 -12417:3:2013 -12418:0:2565 -12419:2:468 -12420:0:2565 -12421:3:2014 -12422:0:2565 -12423:3:2015 -12424:3:2019 -12425:3:2020 -12426:3:2028 -12427:3:2029 -12428:3:2033 -12429:3:2034 -12430:3:2042 -12431:3:2047 -12432:3:2051 -12433:3:2052 -12434:3:2059 -12435:3:2060 -12436:3:2071 -12437:3:2079 -12438:3:2080 -12439:3:2084 -12440:3:2089 -12441:3:2090 -12442:0:2565 -12443:3:2102 -12444:0:2565 -12445:3:2104 -12446:0:2565 -12447:3:2105 -12448:3:2109 -12449:3:2110 -12450:3:2118 -12451:3:2119 -12452:3:2123 -12453:3:2124 -12454:3:2132 -12455:3:2137 -12456:3:2141 -12457:3:2142 -12458:3:2149 -12459:3:2150 -12460:3:2161 -12461:3:2169 -12462:3:2170 -12463:3:2174 -12464:3:2179 -12465:3:2180 -12466:0:2565 -12467:3:2192 -12468:0:2565 -12469:2:467 -12470:0:2565 -12471:3:2013 -12472:0:2565 -12473:3:2014 -12474:0:2565 -12475:3:2015 -12476:3:2019 -12477:3:2020 -12478:3:2028 -12479:3:2029 -12480:3:2033 -12481:3:2034 -12482:3:2042 -12483:3:2047 -12484:3:2051 -12485:3:2052 -12486:3:2059 -12487:3:2060 -12488:3:2071 -12489:3:2079 -12490:3:2080 -12491:3:2084 -12492:3:2089 -12493:3:2090 -12494:0:2565 -12495:3:2102 -12496:0:2565 -12497:3:2104 -12498:0:2565 -12499:3:2105 -12500:3:2109 -12501:3:2110 -12502:3:2118 -12503:3:2119 -12504:3:2123 -12505:3:2124 -12506:3:2132 -12507:3:2137 -12508:3:2141 -12509:3:2142 -12510:3:2149 -12511:3:2150 -12512:3:2161 -12513:3:2169 -12514:3:2170 -12515:3:2174 -12516:3:2179 -12517:3:2180 -12518:0:2565 -12519:1:433 -12520:0:2565 -12521:3:2192 -12522:0:2565 -12523:3:2013 -12524:0:2565 -12525:2:468 -12526:0:2565 -12527:3:2014 -12528:0:2565 -12529:3:2015 -12530:3:2019 -12531:3:2020 -12532:3:2028 -12533:3:2029 -12534:3:2033 -12535:3:2034 -12536:3:2042 -12537:3:2047 -12538:3:2051 -12539:3:2052 -12540:3:2059 -12541:3:2060 -12542:3:2071 -12543:3:2079 -12544:3:2080 -12545:3:2084 -12546:3:2089 -12547:3:2090 -12548:0:2565 -12549:3:2102 -12550:0:2565 -12551:3:2104 -12552:0:2565 -12553:3:2105 -12554:3:2109 -12555:3:2110 -12556:3:2118 -12557:3:2119 -12558:3:2123 -12559:3:2124 -12560:3:2132 -12561:3:2137 -12562:3:2141 -12563:3:2142 -12564:3:2149 -12565:3:2150 -12566:3:2161 -12567:3:2169 -12568:3:2170 -12569:3:2174 -12570:3:2179 -12571:3:2180 -12572:0:2565 -12573:3:2192 -12574:0:2565 -12575:2:469 -12576:0:2565 -12577:3:2013 -12578:0:2565 -12579:2:475 -12580:0:2565 -12581:2:476 -12582:0:2565 -12583:3:2014 -12584:0:2565 -12585:3:2015 -12586:3:2019 -12587:3:2020 -12588:3:2028 -12589:3:2029 -12590:3:2033 -12591:3:2034 -12592:3:2042 -12593:3:2047 -12594:3:2051 -12595:3:2052 -12596:3:2059 -12597:3:2060 -12598:3:2071 -12599:3:2079 -12600:3:2080 -12601:3:2084 -12602:3:2089 -12603:3:2090 -12604:0:2565 -12605:3:2102 -12606:0:2565 -12607:3:2104 -12608:0:2565 -12609:3:2105 -12610:3:2109 -12611:3:2110 -12612:3:2118 -12613:3:2119 -12614:3:2123 -12615:3:2124 -12616:3:2132 -12617:3:2137 -12618:3:2141 -12619:3:2142 -12620:3:2149 -12621:3:2150 -12622:3:2161 -12623:3:2169 -12624:3:2170 -12625:3:2174 -12626:3:2179 -12627:3:2180 -12628:0:2565 -12629:3:2192 -12630:0:2565 -12631:2:477 -12632:2:481 -12633:2:482 -12634:2:490 -12635:2:499 -12636:2:500 -12637:2:504 -12638:2:509 -12639:2:513 -12640:2:514 -12641:2:521 -12642:2:522 -12643:2:533 -12644:2:534 -12645:2:537 -12646:2:538 -12647:2:546 -12648:2:551 -12649:2:552 -12650:0:2565 -12651:3:2013 -12652:0:2565 -12653:3:2014 -12654:0:2565 -12655:3:2015 -12656:3:2019 -12657:3:2020 -12658:3:2028 -12659:3:2029 -12660:3:2033 -12661:3:2034 -12662:3:2042 -12663:3:2047 -12664:3:2051 -12665:3:2052 -12666:3:2059 -12667:3:2060 -12668:3:2071 -12669:3:2079 -12670:3:2080 -12671:3:2084 -12672:3:2089 -12673:3:2090 -12674:0:2565 -12675:3:2102 -12676:0:2565 -12677:3:2104 -12678:0:2565 -12679:3:2105 -12680:3:2109 -12681:3:2110 -12682:3:2118 -12683:3:2119 -12684:3:2123 -12685:3:2124 -12686:3:2132 -12687:3:2137 -12688:3:2141 -12689:3:2142 -12690:3:2149 -12691:3:2150 -12692:3:2161 -12693:3:2169 -12694:3:2170 -12695:3:2174 -12696:3:2179 -12697:3:2180 -12698:0:2565 -12699:2:564 -12700:0:2565 -12701:3:2192 -12702:0:2565 -12703:3:2013 -12704:0:2565 -12705:3:2014 -12706:0:2565 -12707:3:2015 -12708:3:2019 -12709:3:2020 -12710:3:2028 -12711:3:2029 -12712:3:2033 -12713:3:2034 -12714:3:2042 -12715:3:2047 -12716:3:2051 -12717:3:2052 -12718:3:2059 -12719:3:2060 -12720:3:2071 -12721:3:2079 -12722:3:2080 -12723:3:2084 -12724:3:2089 -12725:3:2090 -12726:0:2565 -12727:3:2102 -12728:0:2565 -12729:3:2104 -12730:0:2565 -12731:2:565 -12732:2:569 -12733:2:570 -12734:2:578 -12735:2:587 -12736:2:588 -12737:2:592 -12738:2:597 -12739:2:601 -12740:2:602 -12741:2:609 -12742:2:610 -12743:2:621 -12744:2:622 -12745:2:625 -12746:2:626 -12747:2:634 -12748:2:639 -12749:2:640 -12750:0:2565 -12751:2:744 -12752:0:2565 -12753:3:2105 -12754:3:2109 -12755:3:2110 -12756:3:2118 -12757:3:2119 -12758:3:2123 -12759:3:2124 -12760:3:2132 -12761:3:2137 -12762:3:2141 -12763:3:2142 -12764:3:2149 -12765:3:2150 -12766:3:2161 -12767:3:2169 -12768:3:2170 -12769:3:2174 -12770:3:2179 -12771:3:2180 -12772:0:2565 -12773:3:2192 -12774:0:2565 -12775:3:2013 -12776:0:2565 -12777:3:2014 -12778:0:2565 -12779:3:2015 -12780:3:2019 -12781:3:2020 -12782:3:2028 -12783:3:2029 -12784:3:2033 -12785:3:2034 -12786:3:2042 -12787:3:2047 -12788:3:2051 -12789:3:2052 -12790:3:2059 -12791:3:2060 -12792:3:2071 -12793:3:2079 -12794:3:2080 -12795:3:2084 -12796:3:2089 -12797:3:2090 -12798:0:2565 -12799:3:2102 -12800:0:2565 -12801:2:745 -12802:0:2565 -12803:2:750 -12804:0:2565 -12805:2:753 -12806:0:2565 -12807:3:2104 -12808:0:2565 -12809:3:2105 -12810:3:2109 -12811:3:2110 -12812:3:2118 -12813:3:2119 -12814:3:2123 -12815:3:2124 -12816:3:2132 -12817:3:2137 -12818:3:2141 -12819:3:2142 -12820:3:2149 -12821:3:2150 -12822:3:2161 -12823:3:2169 -12824:3:2170 -12825:3:2174 -12826:3:2179 -12827:3:2180 -12828:0:2565 -12829:3:2192 -12830:0:2565 -12831:3:2013 -12832:0:2565 -12833:3:2014 -12834:0:2565 -12835:3:2015 -12836:3:2019 -12837:3:2020 -12838:3:2028 -12839:3:2029 -12840:3:2033 -12841:3:2034 -12842:3:2042 -12843:3:2047 -12844:3:2051 -12845:3:2052 -12846:3:2059 -12847:3:2060 -12848:3:2071 -12849:3:2079 -12850:3:2080 -12851:3:2084 -12852:3:2089 -12853:3:2090 -12854:0:2565 -12855:2:758 -12856:0:2565 -12857:3:2102 -12858:0:2565 -12859:3:2104 -12860:0:2565 -12861:3:2105 -12862:3:2109 -12863:3:2110 -12864:3:2118 -12865:3:2119 -12866:3:2123 -12867:3:2124 -12868:3:2132 -12869:3:2137 -12870:3:2141 -12871:3:2142 -12872:3:2149 -12873:3:2150 -12874:3:2161 -12875:3:2169 -12876:3:2170 -12877:3:2174 -12878:3:2179 -12879:3:2180 -12880:0:2565 -12881:3:2192 -12882:0:2565 -12883:3:2013 -12884:0:2565 -12885:3:2014 -12886:0:2565 -12887:2:759 -12888:0:2565 -12889:3:2015 -12890:3:2019 -12891:3:2020 -12892:3:2028 -12893:3:2029 -12894:3:2033 -12895:3:2034 -12896:3:2042 -12897:3:2047 -12898:3:2051 -12899:3:2052 -12900:3:2059 -12901:3:2060 -12902:3:2071 -12903:3:2079 -12904:3:2080 -12905:3:2084 -12906:3:2089 -12907:3:2090 -12908:0:2565 -12909:3:2102 -12910:0:2565 -12911:3:2104 -12912:0:2565 -12913:3:2105 -12914:3:2109 -12915:3:2110 -12916:3:2118 -12917:3:2119 -12918:3:2123 -12919:3:2124 -12920:3:2132 -12921:3:2137 -12922:3:2141 -12923:3:2142 -12924:3:2149 -12925:3:2150 -12926:3:2161 -12927:3:2169 -12928:3:2170 -12929:3:2174 -12930:3:2179 -12931:3:2180 -12932:0:2565 -12933:3:2192 -12934:0:2565 -12935:3:2013 -12936:0:2565 -12937:2:760 -12938:0:2565 -12939:2:761 -12940:0:2565 -12941:2:762 -12942:0:2565 -12943:2:763 -12944:0:2565 -12945:3:2014 -12946:0:2565 -12947:3:2015 -12948:3:2019 -12949:3:2020 -12950:3:2028 -12951:3:2029 -12952:3:2033 -12953:3:2034 -12954:3:2042 -12955:3:2047 -12956:3:2051 -12957:3:2052 -12958:3:2059 -12959:3:2060 -12960:3:2071 -12961:3:2079 -12962:3:2080 -12963:3:2084 -12964:3:2089 -12965:3:2090 -12966:0:2565 -12967:3:2102 -12968:0:2565 -12969:3:2104 -12970:0:2565 -12971:3:2105 -12972:3:2109 -12973:3:2110 -12974:3:2118 -12975:3:2119 -12976:3:2123 -12977:3:2124 -12978:3:2132 -12979:3:2137 -12980:3:2141 -12981:3:2142 -12982:3:2149 -12983:3:2150 -12984:3:2161 -12985:3:2169 -12986:3:2170 -12987:3:2174 -12988:3:2179 -12989:3:2180 -12990:0:2565 -12991:3:2192 -12992:0:2565 -12993:2:765 -12994:0:2565 -12995:3:2013 -12996:0:2565 -12997:3:2014 -12998:0:2565 -12999:3:2015 -13000:3:2019 -13001:3:2020 -13002:3:2028 -13003:3:2029 -13004:3:2033 -13005:3:2034 -13006:3:2042 -13007:3:2047 -13008:3:2051 -13009:3:2052 -13010:3:2059 -13011:3:2060 -13012:3:2071 -13013:3:2079 -13014:3:2080 -13015:3:2084 -13016:3:2089 -13017:3:2090 -13018:0:2565 -13019:3:2102 -13020:0:2565 -13021:3:2104 -13022:0:2565 -13023:3:2105 -13024:3:2109 -13025:3:2110 -13026:3:2118 -13027:3:2119 -13028:3:2123 -13029:3:2124 -13030:3:2132 -13031:3:2137 -13032:3:2141 -13033:3:2142 -13034:3:2149 -13035:3:2150 -13036:3:2161 -13037:3:2169 -13038:3:2170 -13039:3:2174 -13040:3:2179 -13041:3:2180 -13042:0:2565 -13043:2:766 -13044:2:770 -13045:2:771 -13046:2:779 -13047:2:788 -13048:2:789 -13049:2:793 -13050:2:798 -13051:2:802 -13052:2:803 -13053:2:810 -13054:2:811 -13055:2:822 -13056:2:823 -13057:2:826 -13058:2:827 -13059:2:835 -13060:2:840 -13061:2:841 -13062:0:2565 -13063:3:2192 -13064:0:2565 -13065:3:2013 -13066:0:2565 -13067:3:2014 -13068:0:2565 -13069:3:2015 -13070:3:2019 -13071:3:2020 -13072:3:2028 -13073:3:2029 -13074:3:2033 -13075:3:2034 -13076:3:2042 -13077:3:2047 -13078:3:2051 -13079:3:2052 -13080:3:2059 -13081:3:2060 -13082:3:2071 -13083:3:2079 -13084:3:2080 -13085:3:2084 -13086:3:2089 -13087:3:2090 -13088:0:2565 -13089:3:2102 -13090:0:2565 -13091:3:2104 -13092:0:2565 -13093:2:853 -13094:0:2565 -13095:2:857 -13096:0:2565 -13097:2:465 -13098:0:2565 -13099:3:2105 -13100:3:2109 -13101:3:2110 -13102:3:2118 -13103:3:2119 -13104:3:2123 -13105:3:2124 -13106:3:2132 -13107:3:2137 -13108:3:2141 -13109:3:2142 -13110:3:2149 -13111:3:2150 -13112:3:2161 -13113:3:2169 -13114:3:2170 -13115:3:2174 -13116:3:2179 -13117:3:2180 -13118:0:2565 -13119:3:2192 -13120:0:2565 -13121:3:2013 -13122:0:2565 -13123:3:2014 -13124:0:2565 -13125:3:2015 -13126:3:2019 -13127:3:2020 -13128:3:2028 -13129:3:2029 -13130:3:2033 -13131:3:2034 -13132:3:2042 -13133:3:2047 -13134:3:2051 -13135:3:2052 -13136:3:2059 -13137:3:2060 -13138:3:2071 -13139:3:2079 -13140:3:2080 -13141:3:2084 -13142:3:2089 -13143:3:2090 -13144:0:2565 -13145:3:2102 -13146:0:2565 -13147:2:466 -13148:0:2565 -13149:3:2104 -13150:0:2565 -13151:3:2105 -13152:3:2109 -13153:3:2110 -13154:3:2118 -13155:3:2119 -13156:3:2123 -13157:3:2124 -13158:3:2132 -13159:3:2137 -13160:3:2141 -13161:3:2142 -13162:3:2149 -13163:3:2150 -13164:3:2161 -13165:3:2169 -13166:3:2170 -13167:3:2174 -13168:3:2179 -13169:3:2180 -13170:0:2565 -13171:3:2192 -13172:0:2565 -13173:3:2013 -13174:0:2565 -13175:3:2014 -13176:0:2565 -13177:3:2015 -13178:3:2019 -13179:3:2020 -13180:3:2028 -13181:3:2029 -13182:3:2033 -13183:3:2034 -13184:3:2042 -13185:3:2047 -13186:3:2051 -13187:3:2052 -13188:3:2059 -13189:3:2060 -13190:3:2071 -13191:3:2079 -13192:3:2080 -13193:3:2084 -13194:3:2089 -13195:3:2090 -13196:0:2565 -13197:2:467 -13198:0:2565 -13199:3:2102 -13200:0:2565 -13201:3:2104 -13202:0:2565 -13203:3:2105 -13204:3:2109 -13205:3:2110 -13206:3:2118 -13207:3:2119 -13208:3:2123 -13209:3:2124 -13210:3:2132 -13211:3:2137 -13212:3:2141 -13213:3:2142 -13214:3:2149 -13215:3:2150 -13216:3:2161 -13217:3:2169 -13218:3:2170 -13219:3:2174 -13220:3:2179 -13221:3:2180 -13222:0:2565 -13223:3:2192 -13224:0:2565 -13225:3:2013 -13226:0:2565 -13227:3:2014 -13228:0:2565 -13229:1:436 -13230:0:2565 -13231:2:468 -13232:0:2565 -13233:3:2015 -13234:3:2019 -13235:3:2020 -13236:3:2028 -13237:3:2029 -13238:3:2033 -13239:3:2034 -13240:3:2042 -13241:3:2047 -13242:3:2051 -13243:3:2052 -13244:3:2059 -13245:3:2060 -13246:3:2071 -13247:3:2079 -13248:3:2080 -13249:3:2084 -13250:3:2089 -13251:3:2090 -13252:0:2565 -13253:3:2102 -13254:0:2565 -13255:3:2104 -13256:0:2565 -13257:3:2105 -13258:3:2109 -13259:3:2110 -13260:3:2118 -13261:3:2119 -13262:3:2123 -13263:3:2124 -13264:3:2132 -13265:3:2137 -13266:3:2141 -13267:3:2142 -13268:3:2149 -13269:3:2150 -13270:3:2161 -13271:3:2169 -13272:3:2170 -13273:3:2174 -13274:3:2179 -13275:3:2180 -13276:0:2565 -13277:3:2192 -13278:0:2565 -13279:3:2013 -13280:0:2565 -13281:3:2014 -13282:0:2565 -13283:2:467 -13284:0:2565 -13285:2:468 -13286:0:2565 -13287:3:2015 -13288:3:2019 -13289:3:2020 -13290:3:2028 -13291:3:2029 -13292:3:2033 -13293:3:2034 -13294:3:2042 -13295:3:2047 -13296:3:2051 -13297:3:2052 -13298:3:2059 -13299:3:2060 -13300:3:2071 -13301:3:2079 -13302:3:2080 -13303:3:2084 -13304:3:2089 -13305:3:2090 -13306:0:2565 -13307:3:2102 -13308:0:2565 -13309:3:2104 -13310:0:2565 -13311:3:2105 -13312:3:2109 -13313:3:2110 -13314:3:2118 -13315:3:2119 -13316:3:2123 -13317:3:2124 -13318:3:2132 -13319:3:2137 -13320:3:2141 -13321:3:2142 -13322:3:2149 -13323:3:2150 -13324:3:2161 -13325:3:2169 -13326:3:2170 -13327:3:2174 -13328:3:2179 -13329:3:2180 -13330:0:2565 -13331:3:2192 -13332:0:2565 -13333:3:2013 -13334:0:2565 -13335:2:467 -13336:0:2565 -13337:1:442 -13338:0:2565 -13339:2:468 -13340:0:2565 -13341:1:446 -13342:0:2565 -13343:1:9 -13344:0:2565 -13345:1:10 -13346:0:2565 -13347:1:11 -13348:0:2565 -13349:3:2014 -13350:0:2565 -13351:3:2015 -13352:3:2019 -13353:3:2020 -13354:3:2028 -13355:3:2029 -13356:3:2033 -13357:3:2034 -13358:3:2042 -13359:3:2047 -13360:3:2051 -13361:3:2052 -13362:3:2059 -13363:3:2060 -13364:3:2071 -13365:3:2079 -13366:3:2080 -13367:3:2084 -13368:3:2089 -13369:3:2090 -13370:0:2565 -13371:3:2102 -13372:0:2565 -13373:3:2104 -13374:0:2565 -13375:3:2105 -13376:3:2109 -13377:3:2110 -13378:3:2118 -13379:3:2119 -13380:3:2123 -13381:3:2124 -13382:3:2132 -13383:3:2137 -13384:3:2141 -13385:3:2142 -13386:3:2149 -13387:3:2150 -13388:3:2161 -13389:3:2169 -13390:3:2170 -13391:3:2174 -13392:3:2179 -13393:3:2180 -13394:0:2565 -13395:3:2192 -13396:0:2565 -13397:3:2013 -13398:0:2565 -13399:2:467 -13400:0:2565 -13401:2:468 -13402:0:2565 -13403:3:2014 -13404:0:2565 -13405:3:2015 -13406:3:2019 -13407:3:2020 -13408:3:2028 -13409:3:2029 -13410:3:2033 -13411:3:2034 -13412:3:2042 -13413:3:2047 -13414:3:2051 -13415:3:2052 -13416:3:2059 -13417:3:2060 -13418:3:2071 -13419:3:2079 -13420:3:2080 -13421:3:2084 -13422:3:2089 -13423:3:2090 -13424:0:2565 -13425:3:2102 -13426:0:2565 -13427:3:2104 -13428:0:2565 -13429:3:2105 -13430:3:2109 -13431:3:2110 -13432:3:2118 -13433:3:2119 -13434:3:2123 -13435:3:2124 -13436:3:2132 -13437:3:2137 -13438:3:2141 -13439:3:2142 -13440:3:2149 -13441:3:2150 -13442:3:2161 -13443:3:2169 -13444:3:2170 -13445:3:2174 -13446:3:2179 -13447:3:2180 -13448:0:2565 -13449:3:2192 -13450:0:2565 -13451:2:467 -13452:0:2565 -13453:1:12 -13454:1:16 -13455:1:17 -13456:1:25 -13457:1:34 -13458:1:35 -13459:1:39 -13460:1:44 -13461:1:48 -13462:1:49 -13463:1:56 -13464:1:57 -13465:1:68 -13466:1:69 -13467:1:72 -13468:1:73 -13469:1:81 -13470:1:86 -13471:1:87 -13472:0:2565 -13473:3:2013 -13474:0:2565 -13475:2:468 -13476:0:2565 -13477:3:2014 -13478:0:2565 -13479:3:2015 -13480:3:2019 -13481:3:2020 -13482:3:2028 -13483:3:2029 -13484:3:2033 -13485:3:2034 -13486:3:2042 -13487:3:2047 -13488:3:2051 -13489:3:2052 -13490:3:2059 -13491:3:2060 -13492:3:2071 -13493:3:2079 -13494:3:2080 -13495:3:2084 -13496:3:2089 -13497:3:2090 -13498:0:2565 -13499:3:2102 -13500:0:2565 -13501:3:2104 -13502:0:2565 -13503:3:2105 -13504:3:2109 -13505:3:2110 -13506:3:2118 -13507:3:2119 -13508:3:2123 -13509:3:2124 -13510:3:2132 -13511:3:2137 -13512:3:2141 -13513:3:2142 -13514:3:2149 -13515:3:2150 -13516:3:2161 -13517:3:2169 -13518:3:2170 -13519:3:2174 -13520:3:2179 -13521:3:2180 -13522:0:2565 -13523:3:2192 -13524:0:2565 -13525:2:467 -13526:0:2565 -13527:3:2013 -13528:0:2565 -13529:3:2014 -13530:0:2565 -13531:3:2015 -13532:3:2019 -13533:3:2020 -13534:3:2028 -13535:3:2029 -13536:3:2033 -13537:3:2034 -13538:3:2042 -13539:3:2047 -13540:3:2051 -13541:3:2052 -13542:3:2059 -13543:3:2060 -13544:3:2071 -13545:3:2079 -13546:3:2080 -13547:3:2084 -13548:3:2089 -13549:3:2090 -13550:0:2565 -13551:3:2102 -13552:0:2565 -13553:3:2104 -13554:0:2565 -13555:3:2105 -13556:3:2109 -13557:3:2110 -13558:3:2118 -13559:3:2119 -13560:3:2123 -13561:3:2124 -13562:3:2132 -13563:3:2137 -13564:3:2141 -13565:3:2142 -13566:3:2149 -13567:3:2150 -13568:3:2161 -13569:3:2169 -13570:3:2170 -13571:3:2174 -13572:3:2179 -13573:3:2180 -13574:0:2565 -13575:1:99 -13576:0:2565 -13577:3:2192 -13578:0:2565 -13579:3:2013 -13580:0:2565 -13581:2:468 -13582:0:2565 -13583:3:2014 -13584:0:2565 -13585:3:2015 -13586:3:2019 -13587:3:2020 -13588:3:2028 -13589:3:2029 -13590:3:2033 -13591:3:2034 -13592:3:2042 -13593:3:2047 -13594:3:2051 -13595:3:2052 -13596:3:2059 -13597:3:2060 -13598:3:2071 -13599:3:2079 -13600:3:2080 -13601:3:2084 -13602:3:2089 -13603:3:2090 -13604:0:2565 -13605:3:2102 -13606:0:2565 -13607:3:2104 -13608:0:2565 -13609:3:2105 -13610:3:2109 -13611:3:2110 -13612:3:2118 -13613:3:2119 -13614:3:2123 -13615:3:2124 -13616:3:2132 -13617:3:2137 -13618:3:2141 -13619:3:2142 -13620:3:2149 -13621:3:2150 -13622:3:2161 -13623:3:2169 -13624:3:2170 -13625:3:2174 -13626:3:2179 -13627:3:2180 -13628:0:2565 -13629:3:2192 -13630:0:2565 -13631:2:469 -13632:0:2565 -13633:3:2013 -13634:0:2565 -13635:2:475 -13636:0:2565 -13637:2:476 -13638:0:2565 -13639:3:2014 -13640:0:2565 -13641:3:2015 -13642:3:2019 -13643:3:2020 -13644:3:2028 -13645:3:2029 -13646:3:2033 -13647:3:2034 -13648:3:2042 -13649:3:2047 -13650:3:2051 -13651:3:2052 -13652:3:2059 -13653:3:2060 -13654:3:2071 -13655:3:2079 -13656:3:2080 -13657:3:2084 -13658:3:2089 -13659:3:2090 -13660:0:2565 -13661:3:2102 -13662:0:2565 -13663:3:2104 -13664:0:2565 -13665:3:2105 -13666:3:2109 -13667:3:2110 -13668:3:2118 -13669:3:2119 -13670:3:2123 -13671:3:2124 -13672:3:2132 -13673:3:2137 -13674:3:2141 -13675:3:2142 -13676:3:2149 -13677:3:2150 -13678:3:2161 -13679:3:2169 -13680:3:2170 -13681:3:2174 -13682:3:2179 -13683:3:2180 -13684:0:2565 -13685:3:2192 -13686:0:2565 -13687:2:477 -13688:2:481 -13689:2:482 -13690:2:490 -13691:2:499 -13692:2:500 -13693:2:504 -13694:2:509 -13695:2:513 -13696:2:514 -13697:2:521 -13698:2:522 -13699:2:533 -13700:2:534 -13701:2:537 -13702:2:538 -13703:2:546 -13704:2:551 -13705:2:552 -13706:0:2565 -13707:3:2013 -13708:0:2565 -13709:3:2014 -13710:0:2565 -13711:3:2015 -13712:3:2019 -13713:3:2020 -13714:3:2028 -13715:3:2029 -13716:3:2033 -13717:3:2034 -13718:3:2042 -13719:3:2047 -13720:3:2051 -13721:3:2052 -13722:3:2059 -13723:3:2060 -13724:3:2071 -13725:3:2079 -13726:3:2080 -13727:3:2084 -13728:3:2089 -13729:3:2090 -13730:0:2565 -13731:3:2102 -13732:0:2565 -13733:3:2104 -13734:0:2565 -13735:3:2105 -13736:3:2109 -13737:3:2110 -13738:3:2118 -13739:3:2119 -13740:3:2123 -13741:3:2124 -13742:3:2132 -13743:3:2137 -13744:3:2141 -13745:3:2142 -13746:3:2149 -13747:3:2150 -13748:3:2161 -13749:3:2169 -13750:3:2170 -13751:3:2174 -13752:3:2179 -13753:3:2180 -13754:0:2565 -13755:2:564 -13756:0:2565 -13757:3:2192 -13758:0:2565 -13759:3:2013 -13760:0:2565 -13761:3:2014 -13762:0:2565 -13763:3:2015 -13764:3:2019 -13765:3:2020 -13766:3:2028 -13767:3:2029 -13768:3:2033 -13769:3:2034 -13770:3:2042 -13771:3:2047 -13772:3:2051 -13773:3:2052 -13774:3:2059 -13775:3:2060 -13776:3:2071 -13777:3:2079 -13778:3:2080 -13779:3:2084 -13780:3:2089 -13781:3:2090 -13782:0:2565 -13783:3:2102 -13784:0:2565 -13785:3:2104 -13786:0:2565 -13787:2:565 -13788:2:569 -13789:2:570 -13790:2:578 -13791:2:587 -13792:2:588 -13793:2:592 -13794:2:597 -13795:2:601 -13796:2:602 -13797:2:609 -13798:2:610 -13799:2:621 -13800:2:622 -13801:2:625 -13802:2:626 -13803:2:634 -13804:2:639 -13805:2:640 -13806:0:2565 -13807:2:652 -13808:0:2565 -13809:3:2105 -13810:3:2109 -13811:3:2110 -13812:3:2118 -13813:3:2119 -13814:3:2123 -13815:3:2124 -13816:3:2132 -13817:3:2137 -13818:3:2141 -13819:3:2142 -13820:3:2149 -13821:3:2150 -13822:3:2161 -13823:3:2169 -13824:3:2170 -13825:3:2174 -13826:3:2179 -13827:3:2180 -13828:0:2565 -13829:3:2192 -13830:0:2565 -13831:3:2013 -13832:0:2565 -13833:3:2014 -13834:0:2565 -13835:3:2015 -13836:3:2019 -13837:3:2020 -13838:3:2028 -13839:3:2029 -13840:3:2033 -13841:3:2034 -13842:3:2042 -13843:3:2047 -13844:3:2051 -13845:3:2052 -13846:3:2059 -13847:3:2060 -13848:3:2071 -13849:3:2079 -13850:3:2080 -13851:3:2084 -13852:3:2089 -13853:3:2090 -13854:0:2565 -13855:3:2102 -13856:0:2565 -13857:2:653 -13858:0:2565 -13859:3:2104 -13860:0:2565 -13861:3:2105 -13862:3:2109 -13863:3:2110 -13864:3:2118 -13865:3:2119 -13866:3:2123 -13867:3:2124 -13868:3:2132 -13869:3:2137 -13870:3:2141 -13871:3:2142 -13872:3:2149 -13873:3:2150 -13874:3:2161 -13875:3:2169 -13876:3:2170 -13877:3:2174 -13878:3:2179 -13879:3:2180 -13880:0:2565 -13881:3:2192 -13882:0:2565 -13883:3:2013 -13884:0:2565 -13885:3:2014 -13886:0:2565 -13887:3:2015 -13888:3:2019 -13889:3:2020 -13890:3:2028 -13891:3:2029 -13892:3:2033 -13893:3:2034 -13894:3:2042 -13895:3:2047 -13896:3:2051 -13897:3:2052 -13898:3:2059 -13899:3:2060 -13900:3:2071 -13901:3:2079 -13902:3:2080 -13903:3:2084 -13904:3:2089 -13905:3:2090 -13906:0:2565 -13907:2:654 -13908:2:658 -13909:2:659 -13910:2:667 -13911:2:676 -13912:2:677 -13913:2:681 -13914:2:686 -13915:2:690 -13916:2:691 -13917:2:698 -13918:2:699 -13919:2:710 -13920:2:711 -13921:2:714 -13922:2:715 -13923:2:723 -13924:2:728 -13925:2:729 -13926:0:2565 -13927:3:2102 -13928:0:2565 -13929:3:2104 -13930:0:2565 -13931:3:2105 -13932:3:2109 -13933:3:2110 -13934:3:2118 -13935:3:2119 -13936:3:2123 -13937:3:2124 -13938:3:2132 -13939:3:2137 -13940:3:2141 -13941:3:2142 -13942:3:2149 -13943:3:2150 -13944:3:2161 -13945:3:2169 -13946:3:2170 -13947:3:2174 -13948:3:2179 -13949:3:2180 -13950:0:2565 -13951:3:2192 -13952:0:2565 -13953:3:2013 -13954:0:2565 -13955:3:2014 -13956:0:2565 -13957:1:100 -13958:0:2565 -13959:1:101 -13960:0:2565 -13961:3:2015 -13962:3:2019 -13963:3:2020 -13964:3:2028 -13965:3:2029 -13966:3:2033 -13967:3:2034 -13968:3:2042 -13969:3:2047 -13970:3:2051 -13971:3:2052 -13972:3:2059 -13973:3:2060 -13974:3:2071 -13975:3:2079 -13976:3:2080 -13977:3:2084 -13978:3:2089 -13979:3:2090 -13980:0:2565 -13981:3:2102 -13982:0:2565 -13983:3:2104 -13984:0:2565 -13985:3:2105 -13986:3:2109 -13987:3:2110 -13988:3:2118 -13989:3:2119 -13990:3:2123 -13991:3:2124 -13992:3:2132 -13993:3:2137 -13994:3:2141 -13995:3:2142 -13996:3:2149 -13997:3:2150 -13998:3:2161 -13999:3:2169 -14000:3:2170 -14001:3:2174 -14002:3:2179 -14003:3:2180 -14004:0:2565 -14005:3:2192 -14006:0:2565 -14007:3:2013 -14008:0:2565 -14009:3:2014 -14010:0:2565 -14011:1:100 -14012:0:2565 -14013:3:2015 -14014:3:2019 -14015:3:2020 -14016:3:2028 -14017:3:2029 -14018:3:2033 -14019:3:2034 -14020:3:2042 -14021:3:2047 -14022:3:2051 -14023:3:2052 -14024:3:2059 -14025:3:2060 -14026:3:2071 -14027:3:2079 -14028:3:2080 -14029:3:2084 -14030:3:2089 -14031:3:2090 -14032:0:2565 -14033:3:2102 -14034:0:2565 -14035:3:2104 -14036:0:2565 -14037:3:2105 -14038:3:2109 -14039:3:2110 -14040:3:2118 -14041:3:2119 -14042:3:2123 -14043:3:2124 -14044:3:2132 -14045:3:2137 -14046:3:2141 -14047:3:2142 -14048:3:2149 -14049:3:2150 -14050:3:2161 -14051:3:2169 -14052:3:2170 -14053:3:2174 -14054:3:2179 -14055:3:2180 -14056:0:2565 -14057:3:2192 -14058:0:2565 -14059:3:2013 -14060:0:2565 -14061:2:741 -14062:0:2565 -14063:2:750 -14064:0:2565 -14065:2:753 -14066:0:2565 -14067:1:101 -14068:0:2565 -14069:3:2014 -14070:0:2565 -14071:3:2015 -14072:3:2019 -14073:3:2020 -14074:3:2028 -14075:3:2029 -14076:3:2033 -14077:3:2034 -14078:3:2042 -14079:3:2047 -14080:3:2051 -14081:3:2052 -14082:3:2059 -14083:3:2060 -14084:3:2071 -14085:3:2079 -14086:3:2080 -14087:3:2084 -14088:3:2089 -14089:3:2090 -14090:0:2565 -14091:3:2102 -14092:0:2565 -14093:3:2104 -14094:0:2565 -14095:3:2105 -14096:3:2109 -14097:3:2110 -14098:3:2118 -14099:3:2119 -14100:3:2123 -14101:3:2124 -14102:3:2132 -14103:3:2137 -14104:3:2141 -14105:3:2142 -14106:3:2149 -14107:3:2150 -14108:3:2161 -14109:3:2169 -14110:3:2170 -14111:3:2174 -14112:3:2179 -14113:3:2180 -14114:0:2565 -14115:3:2192 -14116:0:2565 -14117:3:2013 -14118:0:2565 -14119:1:100 -14120:0:2565 -14121:3:2014 -14122:0:2565 -14123:3:2015 -14124:3:2019 -14125:3:2020 -14126:3:2028 -14127:3:2029 -14128:3:2033 -14129:3:2034 -14130:3:2042 -14131:3:2047 -14132:3:2051 -14133:3:2052 -14134:3:2059 -14135:3:2060 -14136:3:2071 -14137:3:2079 -14138:3:2080 -14139:3:2084 -14140:3:2089 -14141:3:2090 -14142:0:2565 -14143:3:2102 -14144:0:2565 -14145:3:2104 -14146:0:2565 -14147:3:2105 -14148:3:2109 -14149:3:2110 -14150:3:2118 -14151:3:2119 -14152:3:2123 -14153:3:2124 -14154:3:2132 -14155:3:2137 -14156:3:2141 -14157:3:2142 -14158:3:2149 -14159:3:2150 -14160:3:2161 -14161:3:2169 -14162:3:2170 -14163:3:2174 -14164:3:2179 -14165:3:2180 -14166:0:2565 -14167:3:2192 -14168:0:2565 -14169:2:758 -14170:0:2565 -14171:3:2013 -14172:0:2565 -14173:1:101 -14174:0:2565 -14175:3:2014 -14176:0:2565 -14177:3:2015 -14178:3:2019 -14179:3:2020 -14180:3:2028 -14181:3:2029 -14182:3:2033 -14183:3:2034 -14184:3:2042 -14185:3:2047 -14186:3:2051 -14187:3:2052 -14188:3:2059 -14189:3:2060 -14190:3:2071 -14191:3:2079 -14192:3:2080 -14193:3:2084 -14194:3:2089 -14195:3:2090 -14196:0:2565 -14197:3:2102 -14198:0:2565 -14199:3:2104 -14200:0:2565 -14201:3:2105 -14202:3:2109 -14203:3:2110 -14204:3:2118 -14205:3:2119 -14206:3:2123 -14207:3:2124 -14208:3:2132 -14209:3:2137 -14210:3:2141 -14211:3:2142 -14212:3:2149 -14213:3:2150 -14214:3:2161 -14215:3:2169 -14216:3:2170 -14217:3:2174 -14218:3:2179 -14219:3:2180 -14220:0:2565 -14221:3:2192 -14222:0:2565 -14223:3:2013 -14224:0:2565 -14225:1:100 -14226:0:2565 -14227:3:2014 -14228:0:2565 -14229:3:2015 -14230:3:2019 -14231:3:2020 -14232:3:2028 -14233:3:2029 -14234:3:2033 -14235:3:2034 -14236:3:2042 -14237:3:2047 -14238:3:2051 -14239:3:2052 -14240:3:2059 -14241:3:2060 -14242:3:2071 -14243:3:2079 -14244:3:2080 -14245:3:2084 -14246:3:2089 -14247:3:2090 -14248:0:2565 -14249:3:2102 -14250:0:2565 -14251:3:2104 -14252:0:2565 -14253:3:2105 -14254:3:2109 -14255:3:2110 -14256:3:2118 -14257:3:2119 -14258:3:2123 -14259:3:2124 -14260:3:2132 -14261:3:2137 -14262:3:2141 -14263:3:2142 -14264:3:2149 -14265:3:2150 -14266:3:2161 -14267:3:2169 -14268:3:2170 -14269:3:2174 -14270:3:2179 -14271:3:2180 -14272:0:2565 -14273:3:2192 -14274:0:2565 -14275:2:759 -14276:0:2565 -14277:3:2013 -14278:0:2565 -14279:1:101 -14280:0:2565 -14281:3:2014 -14282:0:2565 -14283:3:2015 -14284:3:2019 -14285:3:2020 -14286:3:2028 -14287:3:2029 -14288:3:2033 -14289:3:2034 -14290:3:2042 -14291:3:2047 -14292:3:2051 -14293:3:2052 -14294:3:2059 -14295:3:2060 -14296:3:2071 -14297:3:2079 -14298:3:2080 -14299:3:2084 -14300:3:2089 -14301:3:2090 -14302:0:2565 -14303:3:2102 -14304:0:2565 -14305:3:2104 -14306:0:2565 -14307:3:2105 -14308:3:2109 -14309:3:2110 -14310:3:2118 -14311:3:2119 -14312:3:2123 -14313:3:2124 -14314:3:2132 -14315:3:2137 -14316:3:2141 -14317:3:2142 -14318:3:2149 -14319:3:2150 -14320:3:2161 -14321:3:2169 -14322:3:2170 -14323:3:2174 -14324:3:2179 -14325:3:2180 -14326:0:2565 -14327:3:2192 -14328:0:2565 -14329:3:2013 -14330:0:2565 -14331:1:100 -14332:0:2565 -14333:3:2014 -14334:0:2565 -14335:3:2015 -14336:3:2019 -14337:3:2020 -14338:3:2028 -14339:3:2029 -14340:3:2033 -14341:3:2034 -14342:3:2042 -14343:3:2047 -14344:3:2051 -14345:3:2052 -14346:3:2059 -14347:3:2060 -14348:3:2071 -14349:3:2079 -14350:3:2080 -14351:3:2084 -14352:3:2089 -14353:3:2090 -14354:0:2565 -14355:3:2102 -14356:0:2565 -14357:3:2104 -14358:0:2565 -14359:3:2105 -14360:3:2109 -14361:3:2110 -14362:3:2118 -14363:3:2119 -14364:3:2123 -14365:3:2124 -14366:3:2132 -14367:3:2137 -14368:3:2141 -14369:3:2142 -14370:3:2149 -14371:3:2150 -14372:3:2161 -14373:3:2169 -14374:3:2170 -14375:3:2174 -14376:3:2179 -14377:3:2180 -14378:0:2565 -14379:3:2192 -14380:0:2565 -14381:2:760 -14382:0:2565 -14383:3:2013 -14384:0:2565 -14385:2:761 -14386:0:2565 -14387:2:762 -14388:0:2565 -14389:2:763 -14390:0:2565 -14391:1:101 -14392:0:2565 -14393:3:2014 -14394:0:2565 -14395:3:2015 -14396:3:2019 -14397:3:2020 -14398:3:2028 -14399:3:2029 -14400:3:2033 -14401:3:2034 -14402:3:2042 -14403:3:2047 -14404:3:2051 -14405:3:2052 -14406:3:2059 -14407:3:2060 -14408:3:2071 -14409:3:2079 -14410:3:2080 -14411:3:2084 -14412:3:2089 -14413:3:2090 -14414:0:2565 -14415:3:2102 -14416:0:2565 -14417:3:2104 -14418:0:2565 -14419:3:2105 -14420:3:2109 -14421:3:2110 -14422:3:2118 -14423:3:2119 -14424:3:2123 -14425:3:2124 -14426:3:2132 -14427:3:2137 -14428:3:2141 -14429:3:2142 -14430:3:2149 -14431:3:2150 -14432:3:2161 -14433:3:2169 -14434:3:2170 -14435:3:2174 -14436:3:2179 -14437:3:2180 -14438:0:2565 -14439:3:2192 -14440:0:2565 -14441:3:2013 -14442:0:2565 -14443:1:100 -14444:0:2565 -14445:3:2014 -14446:0:2565 -14447:3:2015 -14448:3:2019 -14449:3:2020 -14450:3:2028 -14451:3:2029 -14452:3:2033 -14453:3:2034 -14454:3:2042 -14455:3:2047 -14456:3:2051 -14457:3:2052 -14458:3:2059 -14459:3:2060 -14460:3:2071 -14461:3:2079 -14462:3:2080 -14463:3:2084 -14464:3:2089 -14465:3:2090 -14466:0:2565 -14467:3:2102 -14468:0:2565 -14469:3:2104 -14470:0:2565 -14471:3:2105 -14472:3:2109 -14473:3:2110 -14474:3:2118 -14475:3:2119 -14476:3:2123 -14477:3:2124 -14478:3:2132 -14479:3:2137 -14480:3:2141 -14481:3:2142 -14482:3:2149 -14483:3:2150 -14484:3:2161 -14485:3:2169 -14486:3:2170 -14487:3:2174 -14488:3:2179 -14489:3:2180 -14490:0:2565 -14491:3:2192 -14492:0:2565 -14493:2:765 -14494:0:2565 -14495:3:2013 -14496:0:2565 -14497:1:101 -14498:0:2565 -14499:3:2014 -14500:0:2565 -14501:3:2015 -14502:3:2019 -14503:3:2020 -14504:3:2028 -14505:3:2029 -14506:3:2033 -14507:3:2034 -14508:3:2042 -14509:3:2047 -14510:3:2051 -14511:3:2052 -14512:3:2059 -14513:3:2060 -14514:3:2071 -14515:3:2079 -14516:3:2080 -14517:3:2084 -14518:3:2089 -14519:3:2090 -14520:0:2565 -14521:3:2102 -14522:0:2565 -14523:3:2104 -14524:0:2565 -14525:3:2105 -14526:3:2109 -14527:3:2110 -14528:3:2118 -14529:3:2119 -14530:3:2123 -14531:3:2124 -14532:3:2132 -14533:3:2137 -14534:3:2141 -14535:3:2142 -14536:3:2149 -14537:3:2150 -14538:3:2161 -14539:3:2169 -14540:3:2170 -14541:3:2174 -14542:3:2179 -14543:3:2180 -14544:0:2565 -14545:3:2192 -14546:0:2565 -14547:3:2013 -14548:0:2565 -14549:2:766 -14550:2:770 -14551:2:771 -14552:2:779 -14553:2:788 -14554:2:789 -14555:2:793 -14556:2:798 -14557:2:802 -14558:2:803 -14559:2:810 -14560:2:811 -14561:2:822 -14562:2:823 -14563:2:826 -14564:2:827 -14565:2:835 -14566:2:840 -14567:2:841 -14568:0:2565 -14569:3:2014 -14570:0:2565 -14571:3:2015 -14572:3:2019 -14573:3:2020 -14574:3:2028 -14575:3:2029 -14576:3:2033 -14577:3:2034 -14578:3:2042 -14579:3:2047 -14580:3:2051 -14581:3:2052 -14582:3:2059 -14583:3:2060 -14584:3:2071 -14585:3:2079 -14586:3:2080 -14587:3:2084 -14588:3:2089 -14589:3:2090 -14590:0:2565 -14591:3:2102 -14592:0:2565 -14593:3:2104 -14594:0:2565 -14595:3:2105 -14596:3:2109 -14597:3:2110 -14598:3:2118 -14599:3:2119 -14600:3:2123 -14601:3:2124 -14602:3:2132 -14603:3:2137 -14604:3:2141 -14605:3:2142 -14606:3:2149 -14607:3:2150 -14608:3:2161 -14609:3:2169 -14610:3:2170 -14611:3:2174 -14612:3:2179 -14613:3:2180 -14614:0:2565 -14615:3:2192 -14616:0:2565 -14617:2:853 -14618:0:2565 -14619:3:2013 -14620:0:2565 -14621:2:857 -14622:0:2565 -14623:2:465 -14624:0:2565 -14625:3:2014 -14626:0:2565 -14627:3:2015 -14628:3:2019 -14629:3:2020 -14630:3:2028 -14631:3:2029 -14632:3:2033 -14633:3:2034 -14634:3:2042 -14635:3:2047 -14636:3:2051 -14637:3:2052 -14638:3:2059 -14639:3:2060 -14640:3:2071 -14641:3:2079 -14642:3:2080 -14643:3:2084 -14644:3:2089 -14645:3:2090 -14646:0:2565 -14647:3:2102 -14648:0:2565 -14649:3:2104 -14650:0:2565 -14651:3:2105 -14652:3:2109 -14653:3:2110 -14654:3:2118 -14655:3:2119 -14656:3:2123 -14657:3:2124 -14658:3:2132 -14659:3:2137 -14660:3:2141 -14661:3:2142 -14662:3:2149 -14663:3:2150 -14664:3:2161 -14665:3:2169 -14666:3:2170 -14667:3:2174 -14668:3:2179 -14669:3:2180 -14670:0:2565 -14671:3:2192 -14672:0:2565 -14673:2:466 -14674:0:2565 -14675:3:2013 -14676:0:2565 -14677:3:2014 -14678:0:2565 -14679:3:2015 -14680:3:2019 -14681:3:2020 -14682:3:2028 -14683:3:2029 -14684:3:2033 -14685:3:2034 -14686:3:2042 -14687:3:2047 -14688:3:2051 -14689:3:2052 -14690:3:2059 -14691:3:2060 -14692:3:2071 -14693:3:2079 -14694:3:2080 -14695:3:2084 -14696:3:2089 -14697:3:2090 -14698:0:2565 -14699:3:2102 -14700:0:2565 -14701:3:2104 -14702:0:2565 -14703:3:2105 -14704:3:2109 -14705:3:2110 -14706:3:2118 -14707:3:2119 -14708:3:2123 -14709:3:2124 -14710:3:2132 -14711:3:2137 -14712:3:2141 -14713:3:2142 -14714:3:2149 -14715:3:2150 -14716:3:2161 -14717:3:2169 -14718:3:2170 -14719:3:2174 -14720:3:2179 -14721:3:2180 -14722:0:2565 -14723:2:467 -14724:0:2565 -14725:3:2192 -14726:0:2565 -14727:3:2013 -14728:0:2565 -14729:3:2014 -14730:0:2565 -14731:3:2015 -14732:3:2019 -14733:3:2020 -14734:3:2028 -14735:3:2029 -14736:3:2033 -14737:3:2034 -14738:3:2042 -14739:3:2047 -14740:3:2051 -14741:3:2052 -14742:3:2059 -14743:3:2060 -14744:3:2071 -14745:3:2079 -14746:3:2080 -14747:3:2084 -14748:3:2089 -14749:3:2090 -14750:0:2565 -14751:3:2102 -14752:0:2565 -14753:3:2104 -14754:0:2565 -14755:1:102 -14756:0:2565 -14757:2:468 -14758:0:2565 -14759:3:2105 -14760:3:2109 -14761:3:2110 -14762:3:2118 -14763:3:2119 -14764:3:2123 -14765:3:2124 -14766:3:2132 -14767:3:2137 -14768:3:2141 -14769:3:2142 -14770:3:2149 -14771:3:2150 -14772:3:2161 -14773:3:2169 -14774:3:2170 -14775:3:2174 -14776:3:2179 -14777:3:2180 -14778:0:2565 -14779:3:2192 -14780:0:2565 -14781:3:2013 -14782:0:2565 -14783:3:2014 -14784:0:2565 -14785:3:2015 -14786:3:2019 -14787:3:2020 -14788:3:2028 -14789:3:2029 -14790:3:2033 -14791:3:2034 -14792:3:2042 -14793:3:2047 -14794:3:2051 -14795:3:2052 -14796:3:2059 -14797:3:2060 -14798:3:2071 -14799:3:2079 -14800:3:2080 -14801:3:2084 -14802:3:2089 -14803:3:2090 -14804:0:2565 -14805:3:2102 -14806:0:2565 -14807:3:2104 -14808:0:2565 -14809:2:467 -14810:0:2565 -14811:2:468 -14812:0:2565 -14813:3:2105 -14814:3:2109 -14815:3:2110 -14816:3:2118 -14817:3:2119 -14818:3:2123 -14819:3:2124 -14820:3:2132 -14821:3:2137 -14822:3:2141 -14823:3:2142 -14824:3:2149 -14825:3:2150 -14826:3:2161 -14827:3:2169 -14828:3:2170 -14829:3:2174 -14830:3:2179 -14831:3:2180 -14832:0:2565 -14833:3:2192 -14834:0:2565 -14835:3:2013 -14836:0:2565 -14837:3:2014 -14838:0:2565 -14839:3:2015 -14840:3:2019 -14841:3:2020 -14842:3:2028 -14843:3:2029 -14844:3:2033 -14845:3:2034 -14846:3:2042 -14847:3:2047 -14848:3:2051 -14849:3:2052 -14850:3:2059 -14851:3:2060 -14852:3:2071 -14853:3:2079 -14854:3:2080 -14855:3:2084 -14856:3:2089 -14857:3:2090 -14858:0:2565 -14859:3:2102 -14860:0:2565 -14861:2:467 -14862:0:2565 -14863:1:108 -14864:0:2565 -14865:2:468 -14866:0:2565 -14867:3:2104 -14868:0:2565 -14869:3:2105 -14870:3:2109 -14871:3:2110 -14872:3:2118 -14873:3:2119 -14874:3:2123 -14875:3:2124 -14876:3:2132 -14877:3:2137 -14878:3:2141 -14879:3:2142 -14880:3:2149 -14881:3:2150 -14882:3:2161 -14883:3:2169 -14884:3:2170 -14885:3:2174 -14886:3:2179 -14887:3:2180 -14888:0:2565 -14889:3:2192 -14890:0:2565 -14891:3:2013 -14892:0:2565 -14893:3:2014 -14894:0:2565 -14895:3:2015 -14896:3:2019 -14897:3:2020 -14898:3:2028 -14899:3:2029 -14900:3:2033 -14901:3:2034 -14902:3:2042 -14903:3:2047 -14904:3:2051 -14905:3:2052 -14906:3:2059 -14907:3:2060 -14908:3:2071 -14909:3:2079 -14910:3:2080 -14911:3:2084 -14912:3:2089 -14913:3:2090 -14914:0:2565 -14915:3:2102 -14916:0:2565 -14917:2:467 -14918:0:2565 -14919:2:468 -14920:0:2565 -14921:3:2104 -14922:0:2565 -14923:3:2105 -14924:3:2109 -14925:3:2110 -14926:3:2118 -14927:3:2119 -14928:3:2123 -14929:3:2124 -14930:3:2132 -14931:3:2137 -14932:3:2141 -14933:3:2142 -14934:3:2149 -14935:3:2150 -14936:3:2161 -14937:3:2169 -14938:3:2170 -14939:3:2174 -14940:3:2179 -14941:3:2180 -14942:0:2565 -14943:3:2192 -14944:0:2565 -14945:3:2013 -14946:0:2565 -14947:3:2014 -14948:0:2565 -14949:3:2015 -14950:3:2019 -14951:3:2020 -14952:3:2028 -14953:3:2029 -14954:3:2033 -14955:3:2034 -14956:3:2042 -14957:3:2047 -14958:3:2051 -14959:3:2052 -14960:3:2059 -14961:3:2060 -14962:3:2071 -14963:3:2079 -14964:3:2080 -14965:3:2084 -14966:3:2089 -14967:3:2090 -14968:0:2565 -14969:2:467 -14970:0:2565 -14971:1:109 -14972:1:113 -14973:1:114 -14974:1:122 -14975:1:123 -14976:1:124 -14977:1:136 -14978:1:141 -14979:1:145 -14980:1:146 -14981:1:153 -14982:1:154 -14983:1:165 -14984:1:166 -14985:1:167 -14986:1:178 -14987:1:183 -14988:1:184 -14989:0:2565 -14990:3:2102 -14991:0:2565 -14992:3:2104 -14993:0:2565 -14994:1:196 -14995:0:2565 -14996:3:2105 -14997:3:2109 -14998:3:2110 -14999:3:2118 -15000:3:2119 -15001:3:2123 -15002:3:2124 -15003:3:2132 -15004:3:2137 -15005:3:2141 -15006:3:2142 -15007:3:2149 -15008:3:2150 -15009:3:2161 -15010:3:2169 -15011:3:2170 -15012:3:2174 -15013:3:2179 -15014:3:2180 -15015:0:2565 -15016:1:197 -15017:0:2565 -15018:3:2192 -15019:0:2565 -15020:3:2013 -15021:0:2565 -15022:2:468 -15023:0:2565 -15024:1:198 -15025:0:2565 -15026:3:2014 -15027:0:2565 -15028:3:2015 -15029:3:2019 -15030:3:2020 -15031:3:2028 -15032:3:2029 -15033:3:2033 -15034:3:2034 -15035:3:2042 -15036:3:2047 -15037:3:2051 -15038:3:2052 -15039:3:2059 -15040:3:2060 -15041:3:2071 -15042:3:2079 -15043:3:2080 -15044:3:2084 -15045:3:2089 -15046:3:2090 -15047:0:2565 -15048:3:2102 -15049:0:2565 -15050:3:2104 -15051:0:2565 -15052:3:2105 -15053:3:2109 -15054:3:2110 -15055:3:2118 -15056:3:2119 -15057:3:2123 -15058:3:2124 -15059:3:2132 -15060:3:2137 -15061:3:2141 -15062:3:2142 -15063:3:2149 -15064:3:2150 -15065:3:2161 -15066:3:2169 -15067:3:2170 -15068:3:2174 -15069:3:2179 -15070:3:2180 -15071:0:2565 -15072:3:2192 -15073:0:2565 -15074:3:2013 -15075:0:2565 -15076:1:197 -15077:0:2565 -15078:3:2014 -15079:0:2565 -15080:3:2015 -15081:3:2019 -15082:3:2020 -15083:3:2028 -15084:3:2029 -15085:3:2033 -15086:3:2034 -15087:3:2042 -15088:3:2047 -15089:3:2051 -15090:3:2052 -15091:3:2059 -15092:3:2060 -15093:3:2071 -15094:3:2079 -15095:3:2080 -15096:3:2084 -15097:3:2089 -15098:3:2090 -15099:0:2565 -15100:3:2102 -15101:0:2565 -15102:3:2104 -15103:0:2565 -15104:3:2105 -15105:3:2109 -15106:3:2110 -15107:3:2118 -15108:3:2119 -15109:3:2123 -15110:3:2124 -15111:3:2132 -15112:3:2137 -15113:3:2141 -15114:3:2142 -15115:3:2149 -15116:3:2150 -15117:3:2161 -15118:3:2169 -15119:3:2170 -15120:3:2174 -15121:3:2179 -15122:3:2180 -15123:0:2565 -15124:3:2192 -15125:0:2565 -15126:2:469 -15127:0:2565 -15128:3:2013 -15129:0:2565 -15130:2:475 -15131:0:2565 -15132:2:476 -15133:0:2565 -15134:1:198 -15135:0:2565 -15136:3:2014 -15137:0:2565 -15138:3:2015 -15139:3:2019 -15140:3:2020 -15141:3:2028 -15142:3:2029 -15143:3:2033 -15144:3:2034 -15145:3:2042 -15146:3:2047 -15147:3:2051 -15148:3:2052 -15149:3:2059 -15150:3:2060 -15151:3:2071 -15152:3:2079 -15153:3:2080 -15154:3:2084 -15155:3:2089 -15156:3:2090 -15157:0:2565 -15158:3:2102 -15159:0:2565 -15160:3:2104 -15161:0:2565 -15162:3:2105 -15163:3:2109 -15164:3:2110 -15165:3:2118 -15166:3:2119 -15167:3:2123 -15168:3:2124 -15169:3:2132 -15170:3:2137 -15171:3:2141 -15172:3:2142 -15173:3:2149 -15174:3:2150 -15175:3:2161 -15176:3:2169 -15177:3:2170 -15178:3:2174 -15179:3:2179 -15180:3:2180 -15181:0:2565 -15182:3:2192 -15183:0:2565 -15184:3:2013 -15185:0:2565 -15186:1:197 -15187:0:2565 -15188:3:2014 -15189:0:2565 -15190:3:2015 -15191:3:2019 -15192:3:2020 -15193:3:2028 -15194:3:2029 -15195:3:2033 -15196:3:2034 -15197:3:2042 -15198:3:2047 -15199:3:2051 -15200:3:2052 -15201:3:2059 -15202:3:2060 -15203:3:2071 -15204:3:2079 -15205:3:2080 -15206:3:2084 -15207:3:2089 -15208:3:2090 -15209:0:2565 -15210:3:2102 -15211:0:2565 -15212:3:2104 -15213:0:2565 -15214:3:2105 -15215:3:2109 -15216:3:2110 -15217:3:2118 -15218:3:2119 -15219:3:2123 -15220:3:2124 -15221:3:2132 -15222:3:2137 -15223:3:2141 -15224:3:2142 -15225:3:2149 -15226:3:2150 -15227:3:2161 -15228:3:2169 -15229:3:2170 -15230:3:2174 -15231:3:2179 -15232:3:2180 -15233:0:2565 -15234:3:2192 -15235:0:2565 -15236:2:477 -15237:2:481 -15238:2:482 -15239:2:490 -15240:2:491 -15241:2:495 -15242:2:496 -15243:2:504 -15244:2:509 -15245:2:513 -15246:2:514 -15247:2:521 -15248:2:522 -15249:2:533 -15250:2:534 -15251:2:535 -15252:2:546 -15253:2:551 -15254:2:552 -15255:0:2565 -15256:3:2013 -15257:0:2565 -15258:1:198 -15259:0:2565 -15260:3:2014 -15261:0:2565 -15262:3:2015 -15263:3:2019 -15264:3:2020 -15265:3:2028 -15266:3:2029 -15267:3:2033 -15268:3:2034 -15269:3:2042 -15270:3:2047 -15271:3:2051 -15272:3:2052 -15273:3:2059 -15274:3:2060 -15275:3:2071 -15276:3:2079 -15277:3:2080 -15278:3:2084 -15279:3:2089 -15280:3:2090 -15281:0:2565 -15282:3:2102 -15283:0:2565 -15284:3:2104 -15285:0:2565 -15286:3:2105 -15287:3:2109 -15288:3:2110 -15289:3:2118 -15290:3:2119 -15291:3:2123 -15292:3:2124 -15293:3:2132 -15294:3:2137 -15295:3:2141 -15296:3:2142 -15297:3:2149 -15298:3:2150 -15299:3:2161 -15300:3:2169 -15301:3:2170 -15302:3:2174 -15303:3:2179 -15304:3:2180 -15305:0:2565 -15306:3:2192 -15307:0:2565 -15308:3:2013 -15309:0:2565 -15310:1:197 -15311:0:2565 -15312:3:2014 -15313:0:2565 -15314:3:2015 -15315:3:2019 -15316:3:2020 -15317:3:2028 -15318:3:2029 -15319:3:2033 -15320:3:2034 -15321:3:2042 -15322:3:2047 -15323:3:2051 -15324:3:2052 -15325:3:2059 -15326:3:2060 -15327:3:2071 -15328:3:2079 -15329:3:2080 -15330:3:2084 -15331:3:2089 -15332:3:2090 -15333:0:2565 -15334:3:2102 -15335:0:2565 -15336:3:2104 -15337:0:2565 -15338:3:2105 -15339:3:2109 -15340:3:2110 -15341:3:2118 -15342:3:2119 -15343:3:2123 -15344:3:2124 -15345:3:2132 -15346:3:2137 -15347:3:2141 -15348:3:2142 -15349:3:2149 -15350:3:2150 -15351:3:2161 -15352:3:2169 -15353:3:2170 -15354:3:2174 -15355:3:2179 -15356:3:2180 -15357:0:2565 -15358:3:2192 -15359:0:2565 -15360:2:564 -15361:0:2565 -15362:3:2013 -15363:0:2565 -15364:1:198 -15365:0:2565 -15366:3:2014 -15367:0:2565 -15368:3:2015 -15369:3:2019 -15370:3:2020 -15371:3:2028 -15372:3:2029 -15373:3:2033 -15374:3:2034 -15375:3:2042 -15376:3:2047 -15377:3:2051 -15378:3:2052 -15379:3:2059 -15380:3:2060 -15381:3:2071 -15382:3:2079 -15383:3:2080 -15384:3:2084 -15385:3:2089 -15386:3:2090 -15387:0:2565 -15388:3:2102 -15389:0:2565 -15390:3:2104 -15391:0:2565 -15392:3:2105 -15393:3:2109 -15394:3:2110 -15395:3:2118 -15396:3:2119 -15397:3:2123 -15398:3:2124 -15399:3:2132 -15400:3:2137 -15401:3:2141 -15402:3:2142 -15403:3:2149 -15404:3:2150 -15405:3:2161 -15406:3:2169 -15407:3:2170 -15408:3:2174 -15409:3:2179 -15410:3:2180 -15411:0:2565 -15412:3:2192 -15413:0:2565 -15414:3:2013 -15415:0:2565 -15416:2:565 -15417:2:569 -15418:2:570 -15419:2:578 -15420:2:579 -15421:2:583 -15422:2:584 -15423:2:592 -15424:2:597 -15425:2:601 -15426:2:602 -15427:2:609 -15428:2:610 -15429:2:621 -15430:2:622 -15431:2:623 -15432:2:634 -15433:2:639 -15434:2:640 -15435:0:2565 -15436:3:2014 -15437:0:2565 -15438:3:2015 -15439:3:2019 -15440:3:2020 -15441:3:2028 -15442:3:2029 -15443:3:2033 -15444:3:2034 -15445:3:2042 -15446:3:2047 -15447:3:2051 -15448:3:2052 -15449:3:2059 -15450:3:2060 -15451:3:2071 -15452:3:2079 -15453:3:2080 -15454:3:2084 -15455:3:2089 -15456:3:2090 -15457:0:2565 -15458:3:2102 -15459:0:2565 -15460:1:197 -15461:0:2565 -15462:2:652 -15463:0:2565 -15464:1:198 -15465:0:2565 -15466:3:2104 -15467:0:2565 -15468:3:2105 -15469:3:2109 -15470:3:2110 -15471:3:2118 -15472:3:2119 -15473:3:2123 -15474:3:2124 -15475:3:2132 -15476:3:2137 -15477:3:2141 -15478:3:2142 -15479:3:2149 -15480:3:2150 -15481:3:2161 -15482:3:2169 -15483:3:2170 -15484:3:2174 -15485:3:2179 -15486:3:2180 -15487:0:2565 -15488:3:2192 -15489:0:2565 -15490:3:2013 -15491:0:2565 -15492:3:2014 -15493:0:2565 -15494:3:2015 -15495:3:2019 -15496:3:2020 -15497:3:2028 -15498:3:2029 -15499:3:2033 -15500:3:2034 -15501:3:2042 -15502:3:2047 -15503:3:2051 -15504:3:2052 -15505:3:2059 -15506:3:2060 -15507:3:2071 -15508:3:2079 -15509:3:2080 -15510:3:2084 -15511:3:2089 -15512:3:2090 -15513:0:2565 -15514:3:2102 -15515:0:2565 -15516:1:197 -15517:0:2565 -15518:3:2104 -15519:0:2565 -15520:3:2105 -15521:3:2109 -15522:3:2110 -15523:3:2118 -15524:3:2119 -15525:3:2123 -15526:3:2124 -15527:3:2132 -15528:3:2137 -15529:3:2141 -15530:3:2142 -15531:3:2149 -15532:3:2150 -15533:3:2161 -15534:3:2169 -15535:3:2170 -15536:3:2174 -15537:3:2179 -15538:3:2180 -15539:0:2565 -15540:3:2192 -15541:0:2565 -15542:3:2013 -15543:0:2565 -15544:3:2014 -15545:0:2565 -15546:3:2015 -15547:3:2019 -15548:3:2020 -15549:3:2028 -15550:3:2029 -15551:3:2033 -15552:3:2034 -15553:3:2042 -15554:3:2047 -15555:3:2051 -15556:3:2052 -15557:3:2059 -15558:3:2060 -15559:3:2071 -15560:3:2079 -15561:3:2080 -15562:3:2084 -15563:3:2089 -15564:3:2090 -15565:0:2565 -15566:2:653 -15567:0:2565 -15568:3:2102 -15569:0:2565 -15570:1:198 -15571:0:2565 -15572:3:2104 -15573:0:2565 -15574:3:2105 -15575:3:2109 -15576:3:2110 -15577:3:2118 -15578:3:2119 -15579:3:2123 -15580:3:2124 -15581:3:2132 -15582:3:2137 -15583:3:2141 -15584:3:2142 -15585:3:2149 -15586:3:2150 -15587:3:2161 -15588:3:2169 -15589:3:2170 -15590:3:2174 -15591:3:2179 -15592:3:2180 -15593:0:2565 -15594:3:2192 -15595:0:2565 -15596:3:2013 -15597:0:2565 -15598:3:2014 -15599:0:2565 -15600:3:2015 -15601:3:2019 -15602:3:2020 -15603:3:2028 -15604:3:2029 -15605:3:2033 -15606:3:2034 -15607:3:2042 -15608:3:2047 -15609:3:2051 -15610:3:2052 -15611:3:2059 -15612:3:2060 -15613:3:2071 -15614:3:2079 -15615:3:2080 -15616:3:2084 -15617:3:2089 -15618:3:2090 -15619:0:2565 -15620:3:2102 -15621:0:2565 -15622:1:197 -15623:0:2565 -15624:3:2104 -15625:0:2565 -15626:3:2105 -15627:3:2109 -15628:3:2110 -15629:3:2118 -15630:3:2119 -15631:3:2123 -15632:3:2124 -15633:3:2132 -15634:3:2137 -15635:3:2141 -15636:3:2142 -15637:3:2149 -15638:3:2150 -15639:3:2161 -15640:3:2169 -15641:3:2170 -15642:3:2174 -15643:3:2179 -15644:3:2180 -15645:0:2565 -15646:3:2192 -15647:0:2565 -15648:3:2013 -15649:0:2565 -15650:3:2014 -15651:0:2565 -15652:3:2015 -15653:3:2019 -15654:3:2020 -15655:3:2028 -15656:3:2029 -15657:3:2033 -15658:3:2034 -15659:3:2042 -15660:3:2047 -15661:3:2051 -15662:3:2052 -15663:3:2059 -15664:3:2060 -15665:3:2071 -15666:3:2079 -15667:3:2080 -15668:3:2084 -15669:3:2089 -15670:3:2090 -15671:0:2565 -15672:2:654 -15673:2:658 -15674:2:659 -15675:2:667 -15676:2:668 -15677:2:672 -15678:2:673 -15679:2:681 -15680:2:686 -15681:2:690 -15682:2:691 -15683:2:698 -15684:2:699 -15685:2:710 -15686:2:711 -15687:2:712 -15688:2:723 -15689:2:728 -15690:2:729 -15691:0:2565 -15692:3:2102 -15693:0:2565 -15694:1:198 -15695:0:2565 -15696:3:2104 -15697:0:2565 -15698:3:2105 -15699:3:2109 -15700:3:2110 -15701:3:2118 -15702:3:2119 -15703:3:2123 -15704:3:2124 -15705:3:2132 -15706:3:2137 -15707:3:2141 -15708:3:2142 -15709:3:2149 -15710:3:2150 -15711:3:2161 -15712:3:2169 -15713:3:2170 -15714:3:2174 -15715:3:2179 -15716:3:2180 -15717:0:2565 -15718:3:2192 -15719:0:2565 -15720:3:2013 -15721:0:2565 -15722:3:2014 -15723:0:2565 -15724:3:2015 -15725:3:2019 -15726:3:2020 -15727:3:2028 -15728:3:2029 -15729:3:2033 -15730:3:2034 -15731:3:2042 -15732:3:2047 -15733:3:2051 -15734:3:2052 -15735:3:2059 -15736:3:2060 -15737:3:2071 -15738:3:2079 -15739:3:2080 -15740:3:2084 -15741:3:2089 -15742:3:2090 -15743:0:2565 -15744:3:2102 -15745:0:2565 -15746:2:741 -15747:0:2565 -15748:2:750 -15749:0:2565 -15750:3:2104 -15751:0:2565 -15752:3:2105 -15753:3:2109 -15754:3:2110 -15755:3:2118 -15756:3:2119 -15757:3:2123 -15758:3:2124 -15759:3:2132 -15760:3:2137 -15761:3:2141 -15762:3:2142 -15763:3:2149 -15764:3:2150 -15765:3:2161 -15766:3:2169 -15767:3:2170 -15768:3:2174 -15769:3:2179 -15770:3:2180 -15771:0:2565 -15772:3:2192 -15773:0:2565 -15774:3:2013 -15775:0:2565 -15776:1:197 -15777:0:2565 -15778:2:753 -15779:0:2565 -15780:1:198 -15781:0:2565 -15782:3:2014 -15783:0:2565 -15784:3:2015 -15785:3:2019 -15786:3:2020 -15787:3:2028 -15788:3:2029 -15789:3:2033 -15790:3:2034 -15791:3:2042 -15792:3:2047 -15793:3:2051 -15794:3:2052 -15795:3:2059 -15796:3:2060 -15797:3:2071 -15798:3:2079 -15799:3:2080 -15800:3:2084 -15801:3:2089 -15802:3:2090 -15803:0:2565 -15804:3:2102 -15805:0:2565 -15806:3:2104 -15807:0:2565 -15808:3:2105 -15809:3:2109 -15810:3:2110 -15811:3:2118 -15812:3:2119 -15813:3:2123 -15814:3:2124 -15815:3:2132 -15816:3:2137 -15817:3:2141 -15818:3:2142 -15819:3:2149 -15820:3:2150 -15821:3:2161 -15822:3:2169 -15823:3:2170 -15824:3:2174 -15825:3:2179 -15826:3:2180 -15827:0:2565 -15828:3:2192 -15829:0:2565 -15830:3:2013 -15831:0:2565 -15832:1:197 -15833:0:2565 -15834:3:2014 -15835:0:2565 -15836:3:2015 -15837:3:2019 -15838:3:2020 -15839:3:2028 -15840:3:2029 -15841:3:2033 -15842:3:2034 -15843:3:2042 -15844:3:2047 -15845:3:2051 -15846:3:2052 -15847:3:2059 -15848:3:2060 -15849:3:2071 -15850:3:2079 -15851:3:2080 -15852:3:2084 -15853:3:2089 -15854:3:2090 -15855:0:2565 -15856:3:2102 -15857:0:2565 -15858:3:2104 -15859:0:2565 -15860:3:2105 -15861:3:2109 -15862:3:2110 -15863:3:2118 -15864:3:2119 -15865:3:2123 -15866:3:2124 -15867:3:2132 -15868:3:2137 -15869:3:2141 -15870:3:2142 -15871:3:2149 -15872:3:2150 -15873:3:2161 -15874:3:2169 -15875:3:2170 -15876:3:2174 -15877:3:2179 -15878:3:2180 -15879:0:2565 -15880:3:2192 -15881:0:2565 -15882:2:758 -15883:0:2565 -15884:3:2013 -15885:0:2565 -15886:1:198 -15887:0:2565 -15888:3:2014 -15889:0:2565 -15890:3:2015 -15891:3:2019 -15892:3:2020 -15893:3:2028 -15894:3:2029 -15895:3:2033 -15896:3:2034 -15897:3:2042 -15898:3:2047 -15899:3:2051 -15900:3:2052 -15901:3:2059 -15902:3:2060 -15903:3:2071 -15904:3:2079 -15905:3:2080 -15906:3:2084 -15907:3:2089 -15908:3:2090 -15909:0:2565 -15910:3:2102 -15911:0:2565 -15912:3:2104 -15913:0:2565 -15914:3:2105 -15915:3:2109 -15916:3:2110 -15917:3:2118 -15918:3:2119 -15919:3:2123 -15920:3:2124 -15921:3:2132 -15922:3:2137 -15923:3:2141 -15924:3:2142 -15925:3:2149 -15926:3:2150 -15927:3:2161 -15928:3:2169 -15929:3:2170 -15930:3:2174 -15931:3:2179 -15932:3:2180 -15933:0:2565 -15934:3:2192 -15935:0:2565 -15936:3:2013 -15937:0:2565 -15938:1:197 -15939:0:2565 -15940:3:2014 -15941:0:2565 -15942:3:2015 -15943:3:2019 -15944:3:2020 -15945:3:2028 -15946:3:2029 -15947:3:2033 -15948:3:2034 -15949:3:2042 -15950:3:2047 -15951:3:2051 -15952:3:2052 -15953:3:2059 -15954:3:2060 -15955:3:2071 -15956:3:2079 -15957:3:2080 -15958:3:2084 -15959:3:2089 -15960:3:2090 -15961:0:2565 -15962:3:2102 -15963:0:2565 -15964:3:2104 -15965:0:2565 -15966:3:2105 -15967:3:2109 -15968:3:2110 -15969:3:2118 -15970:3:2119 -15971:3:2123 -15972:3:2124 -15973:3:2132 -15974:3:2137 -15975:3:2141 -15976:3:2142 -15977:3:2149 -15978:3:2150 -15979:3:2161 -15980:3:2169 -15981:3:2170 -15982:3:2174 -15983:3:2179 -15984:3:2180 -15985:0:2565 -15986:3:2192 -15987:0:2565 -15988:2:759 -15989:0:2565 -15990:3:2013 -15991:0:2565 -15992:1:198 -15993:0:2565 -15994:3:2014 -15995:0:2565 -15996:3:2015 -15997:3:2019 -15998:3:2020 -15999:3:2028 -16000:3:2029 -16001:3:2033 -16002:3:2034 -16003:3:2042 -16004:3:2047 -16005:3:2051 -16006:3:2052 -16007:3:2059 -16008:3:2060 -16009:3:2071 -16010:3:2079 -16011:3:2080 -16012:3:2084 -16013:3:2089 -16014:3:2090 -16015:0:2565 -16016:3:2102 -16017:0:2565 -16018:3:2104 -16019:0:2565 -16020:3:2105 -16021:3:2109 -16022:3:2110 -16023:3:2118 -16024:3:2119 -16025:3:2123 -16026:3:2124 -16027:3:2132 -16028:3:2137 -16029:3:2141 -16030:3:2142 -16031:3:2149 -16032:3:2150 -16033:3:2161 -16034:3:2169 -16035:3:2170 -16036:3:2174 -16037:3:2179 -16038:3:2180 -16039:0:2565 -16040:3:2192 -16041:0:2565 -16042:3:2013 -16043:0:2565 -16044:1:197 -16045:0:2565 -16046:3:2014 -16047:0:2565 -16048:3:2015 -16049:3:2019 -16050:3:2020 -16051:3:2028 -16052:3:2029 -16053:3:2033 -16054:3:2034 -16055:3:2042 -16056:3:2047 -16057:3:2051 -16058:3:2052 -16059:3:2059 -16060:3:2060 -16061:3:2071 -16062:3:2079 -16063:3:2080 -16064:3:2084 -16065:3:2089 -16066:3:2090 -16067:0:2565 -16068:3:2102 -16069:0:2565 -16070:3:2104 -16071:0:2565 -16072:3:2105 -16073:3:2109 -16074:3:2110 -16075:3:2118 -16076:3:2119 -16077:3:2123 -16078:3:2124 -16079:3:2132 -16080:3:2137 -16081:3:2141 -16082:3:2142 -16083:3:2149 -16084:3:2150 -16085:3:2161 -16086:3:2169 -16087:3:2170 -16088:3:2174 -16089:3:2179 -16090:3:2180 -16091:0:2565 -16092:3:2192 -16093:0:2565 -16094:2:760 -16095:0:2565 -16096:3:2013 -16097:0:2565 -16098:2:761 -16099:0:2565 -16100:2:762 -16101:0:2565 -16102:2:763 -16103:0:2565 -16104:1:198 -16105:0:2565 -16106:3:2014 -16107:0:2565 -16108:3:2015 -16109:3:2019 -16110:3:2020 -16111:3:2028 -16112:3:2029 -16113:3:2033 -16114:3:2034 -16115:3:2042 -16116:3:2047 -16117:3:2051 -16118:3:2052 -16119:3:2059 -16120:3:2060 -16121:3:2071 -16122:3:2079 -16123:3:2080 -16124:3:2084 -16125:3:2089 -16126:3:2090 -16127:0:2565 -16128:3:2102 -16129:0:2565 -16130:3:2104 -16131:0:2565 -16132:3:2105 -16133:3:2109 -16134:3:2110 -16135:3:2118 -16136:3:2119 -16137:3:2123 -16138:3:2124 -16139:3:2132 -16140:3:2137 -16141:3:2141 -16142:3:2142 -16143:3:2149 -16144:3:2150 -16145:3:2161 -16146:3:2169 -16147:3:2170 -16148:3:2174 -16149:3:2179 -16150:3:2180 -16151:0:2565 -16152:3:2192 -16153:0:2565 -16154:3:2013 -16155:0:2565 -16156:1:197 -16157:0:2565 -16158:3:2014 -16159:0:2565 -16160:3:2015 -16161:3:2019 -16162:3:2020 -16163:3:2028 -16164:3:2029 -16165:3:2033 -16166:3:2034 -16167:3:2042 -16168:3:2047 -16169:3:2051 -16170:3:2052 -16171:3:2059 -16172:3:2060 -16173:3:2071 -16174:3:2079 -16175:3:2080 -16176:3:2084 -16177:3:2089 -16178:3:2090 -16179:0:2565 -16180:3:2102 -16181:0:2565 -16182:3:2104 -16183:0:2565 -16184:3:2105 -16185:3:2109 -16186:3:2110 -16187:3:2118 -16188:3:2119 -16189:3:2123 -16190:3:2124 -16191:3:2132 -16192:3:2137 -16193:3:2141 -16194:3:2142 -16195:3:2149 -16196:3:2150 -16197:3:2161 -16198:3:2169 -16199:3:2170 -16200:3:2174 -16201:3:2179 -16202:3:2180 -16203:0:2565 -16204:3:2192 -16205:0:2565 -16206:2:765 -16207:0:2565 -16208:3:2013 -16209:0:2565 -16210:1:198 -16211:0:2565 -16212:3:2014 -16213:0:2565 -16214:3:2015 -16215:3:2019 -16216:3:2020 -16217:3:2028 -16218:3:2029 -16219:3:2033 -16220:3:2034 -16221:3:2042 -16222:3:2047 -16223:3:2051 -16224:3:2052 -16225:3:2059 -16226:3:2060 -16227:3:2071 -16228:3:2079 -16229:3:2080 -16230:3:2084 -16231:3:2089 -16232:3:2090 -16233:0:2565 -16234:3:2102 -16235:0:2565 -16236:3:2104 -16237:0:2565 -16238:3:2105 -16239:3:2109 -16240:3:2110 -16241:3:2118 -16242:3:2119 -16243:3:2123 -16244:3:2124 -16245:3:2132 -16246:3:2137 -16247:3:2141 -16248:3:2142 -16249:3:2149 -16250:3:2150 -16251:3:2161 -16252:3:2169 -16253:3:2170 -16254:3:2174 -16255:3:2179 -16256:3:2180 -16257:0:2565 -16258:3:2192 -16259:0:2565 -16260:3:2013 -16261:0:2565 -16262:2:766 -16263:2:770 -16264:2:771 -16265:2:779 -16266:2:788 -16267:2:789 -16268:2:793 -16269:2:798 -16270:2:802 -16271:2:803 -16272:2:810 -16273:2:811 -16274:2:822 -16275:2:823 -16276:2:826 -16277:2:827 -16278:2:835 -16279:2:840 -16280:2:841 -16281:0:2565 -16282:3:2014 -16283:0:2565 -16284:3:2015 -16285:3:2019 -16286:3:2020 -16287:3:2028 -16288:3:2029 -16289:3:2033 -16290:3:2034 -16291:3:2042 -16292:3:2047 -16293:3:2051 -16294:3:2052 -16295:3:2059 -16296:3:2060 -16297:3:2071 -16298:3:2079 -16299:3:2080 -16300:3:2084 -16301:3:2089 -16302:3:2090 -16303:0:2565 -16304:3:2102 -16305:0:2565 -16306:3:2104 -16307:0:2565 -16308:3:2105 -16309:3:2109 -16310:3:2110 -16311:3:2118 -16312:3:2119 -16313:3:2123 -16314:3:2124 -16315:3:2132 -16316:3:2137 -16317:3:2141 -16318:3:2142 -16319:3:2149 -16320:3:2150 -16321:3:2161 -16322:3:2169 -16323:3:2170 -16324:3:2174 -16325:3:2179 -16326:3:2180 -16327:0:2565 -16328:3:2192 -16329:0:2565 -16330:2:853 -16331:0:2565 -16332:3:2013 -16333:0:2565 -16334:2:857 -16335:0:2565 -16336:2:465 -16337:0:2565 -16338:3:2014 -16339:0:2565 -16340:3:2015 -16341:3:2019 -16342:3:2020 -16343:3:2028 -16344:3:2029 -16345:3:2033 -16346:3:2034 -16347:3:2042 -16348:3:2047 -16349:3:2051 -16350:3:2052 -16351:3:2059 -16352:3:2060 -16353:3:2071 -16354:3:2079 -16355:3:2080 -16356:3:2084 -16357:3:2089 -16358:3:2090 -16359:0:2565 -16360:3:2102 -16361:0:2565 -16362:3:2104 -16363:0:2565 -16364:3:2105 -16365:3:2109 -16366:3:2110 -16367:3:2118 -16368:3:2119 -16369:3:2123 -16370:3:2124 -16371:3:2132 -16372:3:2137 -16373:3:2141 -16374:3:2142 -16375:3:2149 -16376:3:2150 -16377:3:2161 -16378:3:2169 -16379:3:2170 -16380:3:2174 -16381:3:2179 -16382:3:2180 -16383:0:2565 -16384:3:2192 -16385:0:2565 -16386:2:466 -16387:0:2565 -16388:3:2013 -16389:0:2565 -16390:3:2014 -16391:0:2565 -16392:3:2015 -16393:3:2019 -16394:3:2020 -16395:3:2028 -16396:3:2029 -16397:3:2033 -16398:3:2034 -16399:3:2042 -16400:3:2047 -16401:3:2051 -16402:3:2052 -16403:3:2059 -16404:3:2060 -16405:3:2071 -16406:3:2079 -16407:3:2080 -16408:3:2084 -16409:3:2089 -16410:3:2090 -16411:0:2565 -16412:3:2102 -16413:0:2565 -16414:3:2104 -16415:0:2565 -16416:3:2105 -16417:3:2109 -16418:3:2110 -16419:3:2118 -16420:3:2119 -16421:3:2123 -16422:3:2124 -16423:3:2132 -16424:3:2137 -16425:3:2141 -16426:3:2142 -16427:3:2149 -16428:3:2150 -16429:3:2161 -16430:3:2169 -16431:3:2170 -16432:3:2174 -16433:3:2179 -16434:3:2180 -16435:0:2565 -16436:2:467 -16437:0:2565 -16438:3:2192 -16439:0:2565 -16440:3:2013 -16441:0:2565 -16442:3:2014 -16443:0:2565 -16444:3:2015 -16445:3:2019 -16446:3:2020 -16447:3:2028 -16448:3:2029 -16449:3:2033 -16450:3:2034 -16451:3:2042 -16452:3:2047 -16453:3:2051 -16454:3:2052 -16455:3:2059 -16456:3:2060 -16457:3:2071 -16458:3:2079 -16459:3:2080 -16460:3:2084 -16461:3:2089 -16462:3:2090 -16463:0:2565 -16464:3:2102 -16465:0:2565 -16466:3:2104 -16467:0:2565 -16468:1:199 -16469:0:2565 -16470:2:468 -16471:0:2565 -16472:1:205 -16473:0:2565 -16474:3:2105 -16475:3:2109 -16476:3:2110 -16477:3:2118 -16478:3:2119 -16479:3:2123 -16480:3:2124 -16481:3:2132 -16482:3:2137 -16483:3:2141 -16484:3:2142 -16485:3:2149 -16486:3:2150 -16487:3:2161 -16488:3:2169 -16489:3:2170 -16490:3:2174 -16491:3:2179 -16492:3:2180 -16493:0:2565 -16494:3:2192 -16495:0:2565 -16496:3:2013 -16497:0:2565 -16498:3:2014 -16499:0:2565 -16500:3:2015 -16501:3:2019 -16502:3:2020 -16503:3:2028 -16504:3:2029 -16505:3:2033 -16506:3:2034 -16507:3:2042 -16508:3:2047 -16509:3:2051 -16510:3:2052 -16511:3:2059 -16512:3:2060 -16513:3:2071 -16514:3:2079 -16515:3:2080 -16516:3:2084 -16517:3:2089 -16518:3:2090 -16519:0:2565 -16520:3:2102 -16521:0:2565 -16522:3:2104 -16523:0:2565 -16524:2:467 -16525:0:2565 -16526:2:468 -16527:0:2565 -16528:3:2105 -16529:3:2109 -16530:3:2110 -16531:3:2118 -16532:3:2119 -16533:3:2123 -16534:3:2124 -16535:3:2132 -16536:3:2137 -16537:3:2141 -16538:3:2142 -16539:3:2149 -16540:3:2150 -16541:3:2161 -16542:3:2169 -16543:3:2170 -16544:3:2174 -16545:3:2179 -16546:3:2180 -16547:0:2565 -16548:3:2192 -16549:0:2565 -16550:3:2013 -16551:0:2565 -16552:3:2014 -16553:0:2565 -16554:3:2015 -16555:3:2019 -16556:3:2020 -16557:3:2028 -16558:3:2029 -16559:3:2033 -16560:3:2034 -16561:3:2042 -16562:3:2047 -16563:3:2051 -16564:3:2052 -16565:3:2059 -16566:3:2060 -16567:3:2071 -16568:3:2079 -16569:3:2080 -16570:3:2084 -16571:3:2089 -16572:3:2090 -16573:0:2565 -16574:3:2102 -16575:0:2565 -16576:2:467 -16577:0:2565 -16578:1:206 -16579:0:2565 -16580:2:468 -16581:0:2565 -16582:3:2104 -16583:0:2565 -16584:3:2105 -16585:3:2109 -16586:3:2110 -16587:3:2118 -16588:3:2119 -16589:3:2123 -16590:3:2124 -16591:3:2132 -16592:3:2137 -16593:3:2141 -16594:3:2142 -16595:3:2149 -16596:3:2150 -16597:3:2161 -16598:3:2169 -16599:3:2170 -16600:3:2174 -16601:3:2179 -16602:3:2180 -16603:0:2565 -16604:3:2192 -16605:0:2565 -16606:3:2013 -16607:0:2565 -16608:3:2014 -16609:0:2565 -16610:3:2015 -16611:3:2019 -16612:3:2020 -16613:3:2028 -16614:3:2029 -16615:3:2033 -16616:3:2034 -16617:3:2042 -16618:3:2047 -16619:3:2051 -16620:3:2052 -16621:3:2059 -16622:3:2060 -16623:3:2071 -16624:3:2079 -16625:3:2080 -16626:3:2084 -16627:3:2089 -16628:3:2090 -16629:0:2565 -16630:3:2102 -16631:0:2565 -16632:2:467 -16633:0:2565 -16634:2:468 -16635:0:2565 -16636:3:2104 -16637:0:2565 -16638:3:2105 -16639:3:2109 -16640:3:2110 -16641:3:2118 -16642:3:2119 -16643:3:2123 -16644:3:2124 -16645:3:2132 -16646:3:2137 -16647:3:2141 -16648:3:2142 -16649:3:2149 -16650:3:2150 -16651:3:2161 -16652:3:2169 -16653:3:2170 -16654:3:2174 -16655:3:2179 -16656:3:2180 -16657:0:2565 -16658:3:2192 -16659:0:2565 -16660:3:2013 -16661:0:2565 -16662:3:2014 -16663:0:2565 -16664:3:2015 -16665:3:2019 -16666:3:2020 -16667:3:2028 -16668:3:2029 -16669:3:2033 -16670:3:2034 -16671:3:2042 -16672:3:2047 -16673:3:2051 -16674:3:2052 -16675:3:2059 -16676:3:2060 -16677:3:2071 -16678:3:2079 -16679:3:2080 -16680:3:2084 -16681:3:2089 -16682:3:2090 -16683:0:2565 -16684:2:467 -16685:0:2565 -16686:1:207 -16687:1:211 -16688:1:212 -16689:1:220 -16690:1:229 -16691:1:230 -16692:1:234 -16693:1:239 -16694:1:243 -16695:1:244 -16696:1:251 -16697:1:252 -16698:1:263 -16699:1:264 -16700:1:267 -16701:1:268 -16702:1:276 -16703:1:281 -16704:1:282 -16705:0:2565 -16706:3:2102 -16707:0:2565 -16708:2:468 -16709:0:2565 -16710:3:2104 -16711:0:2565 -16712:3:2105 -16713:3:2109 -16714:3:2110 -16715:3:2118 -16716:3:2119 -16717:3:2123 -16718:3:2124 -16719:3:2132 -16720:3:2137 -16721:3:2141 -16722:3:2142 -16723:3:2149 -16724:3:2150 -16725:3:2161 -16726:3:2169 -16727:3:2170 -16728:3:2174 -16729:3:2179 -16730:3:2180 -16731:0:2565 -16732:3:2192 -16733:0:2565 -16734:3:2013 -16735:0:2565 -16736:3:2014 -16737:0:2565 -16738:3:2015 -16739:3:2019 -16740:3:2020 -16741:3:2028 -16742:3:2029 -16743:3:2033 -16744:3:2034 -16745:3:2042 -16746:3:2047 -16747:3:2051 -16748:3:2052 -16749:3:2059 -16750:3:2060 -16751:3:2071 -16752:3:2079 -16753:3:2080 -16754:3:2084 -16755:3:2089 -16756:3:2090 -16757:0:2565 -16758:2:467 -16759:0:2565 -16760:3:2102 -16761:0:2565 -16762:3:2104 -16763:0:2565 -16764:3:2105 -16765:3:2109 -16766:3:2110 -16767:3:2118 -16768:3:2119 -16769:3:2123 -16770:3:2124 -16771:3:2132 -16772:3:2137 -16773:3:2141 -16774:3:2142 -16775:3:2149 -16776:3:2150 -16777:3:2161 -16778:3:2169 -16779:3:2170 -16780:3:2174 -16781:3:2179 -16782:3:2180 -16783:0:2565 -16784:3:2192 -16785:0:2565 -16786:3:2013 -16787:0:2565 -16788:3:2014 -16789:0:2565 -16790:1:294 -16791:0:2565 -16792:2:468 -16793:0:2565 -16794:3:2015 -16795:3:2019 -16796:3:2020 -16797:3:2028 -16798:3:2029 -16799:3:2033 -16800:3:2034 -16801:3:2042 -16802:3:2047 -16803:3:2051 -16804:3:2052 -16805:3:2059 -16806:3:2060 -16807:3:2071 -16808:3:2079 -16809:3:2080 -16810:3:2084 -16811:3:2089 -16812:3:2090 -16813:0:2565 -16814:3:2102 -16815:0:2565 -16816:3:2104 -16817:0:2565 -16818:3:2105 -16819:3:2109 -16820:3:2110 -16821:3:2118 -16822:3:2119 -16823:3:2123 -16824:3:2124 -16825:3:2132 -16826:3:2137 -16827:3:2141 -16828:3:2142 -16829:3:2149 -16830:3:2150 -16831:3:2161 -16832:3:2169 -16833:3:2170 -16834:3:2174 -16835:3:2179 -16836:3:2180 -16837:0:2565 -16838:3:2192 -16839:0:2565 -16840:3:2013 -16841:0:2565 -16842:3:2014 -16843:0:2565 -16844:2:469 -16845:0:2565 -16846:2:475 -16847:0:2565 -16848:2:476 -16849:0:2565 -16850:3:2015 -16851:3:2019 -16852:3:2020 -16853:3:2028 -16854:3:2029 -16855:3:2033 -16856:3:2034 -16857:3:2042 -16858:3:2047 -16859:3:2051 -16860:3:2052 -16861:3:2059 -16862:3:2060 -16863:3:2071 -16864:3:2079 -16865:3:2080 -16866:3:2084 -16867:3:2089 -16868:3:2090 -16869:0:2565 -16870:3:2102 -16871:0:2565 -16872:3:2104 -16873:0:2565 -16874:3:2105 -16875:3:2109 -16876:3:2110 -16877:3:2118 -16878:3:2119 -16879:3:2123 -16880:3:2124 -16881:3:2132 -16882:3:2137 -16883:3:2141 -16884:3:2142 -16885:3:2149 -16886:3:2150 -16887:3:2161 -16888:3:2169 -16889:3:2170 -16890:3:2174 -16891:3:2179 -16892:3:2180 -16893:0:2565 -16894:3:2192 -16895:0:2565 -16896:3:2013 -16897:0:2565 -16898:2:477 -16899:2:481 -16900:2:482 -16901:2:490 -16902:2:499 -16903:2:500 -16904:2:504 -16905:2:509 -16906:2:513 -16907:2:514 -16908:2:521 -16909:2:522 -16910:2:533 -16911:2:534 -16912:2:537 -16913:2:538 -16914:2:546 -16915:2:551 -16916:2:552 -16917:0:2565 -16918:3:2014 -16919:0:2565 -16920:3:2015 -16921:3:2019 -16922:3:2020 -16923:3:2028 -16924:3:2029 -16925:3:2033 -16926:3:2034 -16927:3:2042 -16928:3:2047 -16929:3:2051 -16930:3:2052 -16931:3:2059 -16932:3:2060 -16933:3:2071 -16934:3:2079 -16935:3:2080 -16936:3:2084 -16937:3:2089 -16938:3:2090 -16939:0:2565 -16940:3:2102 -16941:0:2565 -16942:3:2104 -16943:0:2565 -16944:3:2105 -16945:3:2109 -16946:3:2110 -16947:3:2118 -16948:3:2119 -16949:3:2123 -16950:3:2124 -16951:3:2132 -16952:3:2137 -16953:3:2141 -16954:3:2142 -16955:3:2149 -16956:3:2150 -16957:3:2161 -16958:3:2169 -16959:3:2170 -16960:3:2174 -16961:3:2179 -16962:3:2180 -16963:0:2565 -16964:3:2192 -16965:0:2565 -16966:2:564 -16967:0:2565 -16968:3:2013 -16969:0:2565 -16970:3:2014 -16971:0:2565 -16972:3:2015 -16973:3:2019 -16974:3:2020 -16975:3:2028 -16976:3:2029 -16977:3:2033 -16978:3:2034 -16979:3:2042 -16980:3:2047 -16981:3:2051 -16982:3:2052 -16983:3:2059 -16984:3:2060 -16985:3:2071 -16986:3:2079 -16987:3:2080 -16988:3:2084 -16989:3:2089 -16990:3:2090 -16991:0:2565 -16992:3:2102 -16993:0:2565 -16994:3:2104 -16995:0:2565 -16996:3:2105 -16997:3:2109 -16998:3:2110 -16999:3:2118 -17000:3:2119 -17001:3:2123 -17002:3:2124 -17003:3:2132 -17004:3:2137 -17005:3:2141 -17006:3:2142 -17007:3:2149 -17008:3:2150 -17009:3:2161 -17010:3:2169 -17011:3:2170 -17012:3:2174 -17013:3:2179 -17014:3:2180 -17015:0:2565 -17016:2:565 -17017:2:569 -17018:2:570 -17019:2:578 -17020:2:587 -17021:2:588 -17022:2:592 -17023:2:597 -17024:2:601 -17025:2:602 -17026:2:609 -17027:2:610 -17028:2:621 -17029:2:622 -17030:2:625 -17031:2:626 -17032:2:634 -17033:2:639 -17034:2:640 -17035:0:2565 -17036:3:2192 -17037:0:2565 -17038:3:2013 -17039:0:2565 -17040:2:652 -17041:0:2565 -17042:3:2014 -17043:0:2565 -17044:3:2015 -17045:3:2019 -17046:3:2020 -17047:3:2028 -17048:3:2029 -17049:3:2033 -17050:3:2034 -17051:3:2042 -17052:3:2047 -17053:3:2051 -17054:3:2052 -17055:3:2059 -17056:3:2060 -17057:3:2071 -17058:3:2079 -17059:3:2080 -17060:3:2084 -17061:3:2089 -17062:3:2090 -17063:0:2565 -17064:3:2102 -17065:0:2565 -17066:3:2104 -17067:0:2565 -17068:3:2105 -17069:3:2109 -17070:3:2110 -17071:3:2118 -17072:3:2119 -17073:3:2123 -17074:3:2124 -17075:3:2132 -17076:3:2137 -17077:3:2141 -17078:3:2142 -17079:3:2149 -17080:3:2150 -17081:3:2161 -17082:3:2169 -17083:3:2170 -17084:3:2174 -17085:3:2179 -17086:3:2180 -17087:0:2565 -17088:3:2192 -17089:0:2565 -17090:2:653 -17091:0:2565 -17092:3:2013 -17093:0:2565 -17094:3:2014 -17095:0:2565 -17096:3:2015 -17097:3:2019 -17098:3:2020 -17099:3:2028 -17100:3:2029 -17101:3:2033 -17102:3:2034 -17103:3:2042 -17104:3:2047 -17105:3:2051 -17106:3:2052 -17107:3:2059 -17108:3:2060 -17109:3:2071 -17110:3:2079 -17111:3:2080 -17112:3:2084 -17113:3:2089 -17114:3:2090 -17115:0:2565 -17116:3:2102 -17117:0:2565 -17118:3:2104 -17119:0:2565 -17120:3:2105 -17121:3:2109 -17122:3:2110 -17123:3:2118 -17124:3:2119 -17125:3:2123 -17126:3:2124 -17127:3:2132 -17128:3:2137 -17129:3:2141 -17130:3:2142 -17131:3:2149 -17132:3:2150 -17133:3:2161 -17134:3:2169 -17135:3:2170 -17136:3:2174 -17137:3:2179 -17138:3:2180 -17139:0:2565 -17140:2:654 -17141:2:658 -17142:2:659 -17143:2:667 -17144:2:676 -17145:2:677 -17146:2:681 -17147:2:686 -17148:2:690 -17149:2:691 -17150:2:698 -17151:2:699 -17152:2:710 -17153:2:711 -17154:2:714 -17155:2:715 -17156:2:723 -17157:2:728 -17158:2:729 -17159:0:2565 -17160:3:2192 -17161:0:2565 -17162:3:2013 -17163:0:2565 -17164:3:2014 -17165:0:2565 -17166:3:2015 -17167:3:2019 -17168:3:2020 -17169:3:2028 -17170:3:2029 -17171:3:2033 -17172:3:2034 -17173:3:2042 -17174:3:2047 -17175:3:2051 -17176:3:2052 -17177:3:2059 -17178:3:2060 -17179:3:2071 -17180:3:2079 -17181:3:2080 -17182:3:2084 -17183:3:2089 -17184:3:2090 -17185:0:2565 -17186:3:2102 -17187:0:2565 -17188:3:2104 -17189:0:2565 -17190:1:295 -17191:0:2565 -17192:1:296 -17193:0:2565 -17194:3:2105 -17195:3:2109 -17196:3:2110 -17197:3:2118 -17198:3:2119 -17199:3:2123 -17200:3:2124 -17201:3:2132 -17202:3:2137 -17203:3:2141 -17204:3:2142 -17205:3:2149 -17206:3:2150 -17207:3:2161 -17208:3:2169 -17209:3:2170 -17210:3:2174 -17211:3:2179 -17212:3:2180 -17213:0:2565 -17214:3:2192 -17215:0:2565 -17216:3:2013 -17217:0:2565 -17218:3:2014 -17219:0:2565 -17220:3:2015 -17221:3:2019 -17222:3:2020 -17223:3:2028 -17224:3:2029 -17225:3:2033 -17226:3:2034 -17227:3:2042 -17228:3:2047 -17229:3:2051 -17230:3:2052 -17231:3:2059 -17232:3:2060 -17233:3:2071 -17234:3:2079 -17235:3:2080 -17236:3:2084 -17237:3:2089 -17238:3:2090 -17239:0:2565 -17240:3:2102 -17241:0:2565 -17242:3:2104 -17243:0:2565 -17244:1:295 -17245:0:2565 -17246:3:2105 -17247:3:2109 -17248:3:2110 -17249:3:2118 -17250:3:2119 -17251:3:2123 -17252:3:2124 -17253:3:2132 -17254:3:2137 -17255:3:2141 -17256:3:2142 -17257:3:2149 -17258:3:2150 -17259:3:2161 -17260:3:2169 -17261:3:2170 -17262:3:2174 -17263:3:2179 -17264:3:2180 -17265:0:2565 -17266:3:2192 -17267:0:2565 -17268:3:2013 -17269:0:2565 -17270:3:2014 -17271:0:2565 -17272:3:2015 -17273:3:2019 -17274:3:2020 -17275:3:2028 -17276:3:2029 -17277:3:2033 -17278:3:2034 -17279:3:2042 -17280:3:2047 -17281:3:2051 -17282:3:2052 -17283:3:2059 -17284:3:2060 -17285:3:2071 -17286:3:2079 -17287:3:2080 -17288:3:2084 -17289:3:2089 -17290:3:2090 -17291:0:2565 -17292:3:2102 -17293:0:2565 -17294:2:741 -17295:0:2565 -17296:2:750 -17297:0:2565 -17298:2:753 -17299:0:2565 -17300:1:296 -17301:0:2565 -17302:2:758 -17303:0:2565 -17304:2:759 -17305:0:2565 -17306:2:760 -17307:0:2565 -17308:2:761 -17309:0:2565 -17310:2:762 -17311:0:2565 -17312:2:763 -17313:0:2565 -17314:2:765 -17315:0:2565 -17316:2:766 -17317:2:770 -17318:2:771 -17319:2:779 -17320:2:780 -17321:2:781 -17322:2:793 -17323:2:798 -17324:2:802 -17325:2:803 -17326:2:810 -17327:2:811 -17328:2:822 -17329:2:823 -17330:2:824 -17331:2:835 -17332:2:840 -17333:2:841 -17334:0:2565 -17335:3:2104 -17336:0:2565 -17337:3:2105 -17338:3:2109 -17339:3:2110 -17340:3:2118 -17341:3:2119 -17342:3:2123 -17343:3:2124 -17344:3:2132 -17345:3:2137 -17346:3:2141 -17347:3:2142 -17348:3:2149 -17349:3:2150 -17350:3:2161 -17351:3:2169 -17352:3:2170 -17353:3:2174 -17354:3:2179 -17355:3:2180 -17356:0:2565 -17357:3:2192 -17358:0:2565 -17359:3:2013 -17360:0:2565 -17361:3:2014 -17362:0:2565 -17363:3:2015 -17364:3:2019 -17365:3:2020 -17366:3:2028 -17367:3:2029 -17368:3:2033 -17369:3:2034 -17370:3:2042 -17371:3:2047 -17372:3:2051 -17373:3:2052 -17374:3:2059 -17375:3:2060 -17376:3:2071 -17377:3:2079 -17378:3:2080 -17379:3:2084 -17380:3:2089 -17381:3:2090 -17382:0:2565 -17383:3:2102 -17384:0:2565 -17385:2:853 -17386:0:2565 -17387:2:857 -17388:0:2565 -17389:3:2104 -17390:0:2565 -17391:3:2105 -17392:3:2109 -17393:3:2110 -17394:3:2118 -17395:3:2119 -17396:3:2123 -17397:3:2124 -17398:3:2132 -17399:3:2137 -17400:3:2141 -17401:3:2142 -17402:3:2149 -17403:3:2150 -17404:3:2161 -17405:3:2169 -17406:3:2170 -17407:3:2174 -17408:3:2179 -17409:3:2180 -17410:0:2565 -17411:3:2192 -17412:0:2565 -17413:1:295 -17414:0:2565 -17415:3:2013 -17416:0:2565 -17417:2:465 -17418:0:2565 -17419:1:296 -17420:0:2565 -17421:3:2014 -17422:0:2565 -17423:3:2015 -17424:3:2019 -17425:3:2020 -17426:3:2028 -17427:3:2029 -17428:3:2033 -17429:3:2034 -17430:3:2042 -17431:3:2047 -17432:3:2051 -17433:3:2052 -17434:3:2059 -17435:3:2060 -17436:3:2071 -17437:3:2079 -17438:3:2080 -17439:3:2084 -17440:3:2089 -17441:3:2090 -17442:0:2565 -17443:3:2102 -17444:0:2565 -17445:3:2104 -17446:0:2565 -17447:3:2105 -17448:3:2109 -17449:3:2110 -17450:3:2118 -17451:3:2119 -17452:3:2123 -17453:3:2124 -17454:3:2132 -17455:3:2137 -17456:3:2141 -17457:3:2142 -17458:3:2149 -17459:3:2150 -17460:3:2161 -17461:3:2169 -17462:3:2170 -17463:3:2174 -17464:3:2179 -17465:3:2180 -17466:0:2565 -17467:3:2192 -17468:0:2565 -17469:3:2013 -17470:0:2565 -17471:1:295 -17472:0:2565 -17473:3:2014 -17474:0:2565 -17475:3:2015 -17476:3:2019 -17477:3:2020 -17478:3:2028 -17479:3:2029 -17480:3:2033 -17481:3:2034 -17482:3:2042 -17483:3:2047 -17484:3:2051 -17485:3:2052 -17486:3:2059 -17487:3:2060 -17488:3:2071 -17489:3:2079 -17490:3:2080 -17491:3:2084 -17492:3:2089 -17493:3:2090 -17494:0:2565 -17495:3:2102 -17496:0:2565 -17497:3:2104 -17498:0:2565 -17499:3:2105 -17500:3:2109 -17501:3:2110 -17502:3:2118 -17503:3:2119 -17504:3:2123 -17505:3:2124 -17506:3:2132 -17507:3:2137 -17508:3:2141 -17509:3:2142 -17510:3:2149 -17511:3:2150 -17512:3:2161 -17513:3:2169 -17514:3:2170 -17515:3:2174 -17516:3:2179 -17517:3:2180 -17518:0:2565 -17519:3:2192 -17520:0:2565 -17521:2:466 -17522:0:2565 -17523:3:2013 -17524:0:2565 -17525:1:296 -17526:0:2565 -17527:2:467 -17528:0:2565 -17529:2:468 -17530:0:2565 -17531:1:297 -17532:0:2565 -17533:2:467 -17534:0:2565 -17535:3:2014 -17536:0:2565 -17537:3:2015 -17538:3:2019 -17539:3:2020 -17540:3:2028 -17541:3:2029 -17542:3:2033 -17543:3:2034 -17544:3:2042 -17545:3:2047 -17546:3:2051 -17547:3:2052 -17548:3:2059 -17549:3:2060 -17550:3:2071 -17551:3:2079 -17552:3:2080 -17553:3:2084 -17554:3:2089 -17555:3:2090 -17556:0:2565 -17557:3:2102 -17558:0:2565 -17559:3:2104 -17560:0:2565 -17561:3:2105 -17562:3:2109 -17563:3:2110 -17564:3:2118 -17565:3:2119 -17566:3:2123 -17567:3:2124 -17568:3:2132 -17569:3:2137 -17570:3:2141 -17571:3:2142 -17572:3:2149 -17573:3:2150 -17574:3:2161 -17575:3:2169 -17576:3:2170 -17577:3:2174 -17578:3:2179 -17579:3:2180 -17580:0:2565 -17581:3:2192 -17582:0:2565 -17583:3:2013 -17584:0:2565 -17585:1:303 -17586:0:2565 -17587:2:468 -17588:0:2565 -17589:1:312 -17590:0:2565 -17591:2:467 -17592:0:2565 -17593:2:468 -17594:0:2565 -17595:1:314 -17596:0:2565 -17597:3:2014 -17598:0:2565 -17599:3:2015 -17600:3:2019 -17601:3:2020 -17602:3:2028 -17603:3:2029 -17604:3:2033 -17605:3:2034 -17606:3:2042 -17607:3:2047 -17608:3:2051 -17609:3:2052 -17610:3:2059 -17611:3:2060 -17612:3:2071 -17613:3:2079 -17614:3:2080 -17615:3:2084 -17616:3:2089 -17617:3:2090 -17618:0:2565 -17619:3:2102 -17620:0:2565 -17621:3:2104 -17622:0:2565 -17623:3:2105 -17624:3:2109 -17625:3:2110 -17626:3:2118 -17627:3:2119 -17628:3:2123 -17629:3:2124 -17630:3:2132 -17631:3:2137 -17632:3:2141 -17633:3:2142 -17634:3:2149 -17635:3:2150 -17636:3:2161 -17637:3:2169 -17638:3:2170 -17639:3:2174 -17640:3:2179 -17641:3:2180 -17642:0:2565 -17643:3:2192 -17644:0:2565 -17645:3:2013 -17646:0:2565 -17647:2:469 -17648:0:2565 -17649:2:475 -17650:0:2565 -17651:3:2014 -17652:0:2565 -17653:3:2015 -17654:3:2019 -17655:3:2020 -17656:3:2028 -17657:3:2029 -17658:3:2033 -17659:3:2034 -17660:3:2042 -17661:3:2047 -17662:3:2051 -17663:3:2052 -17664:3:2059 -17665:3:2060 -17666:3:2071 -17667:3:2079 -17668:3:2080 -17669:3:2084 -17670:3:2089 -17671:3:2090 -17672:0:2565 -17673:1:315 -17674:0:2565 -17675:3:2102 -17676:0:2565 -17677:2:476 -17678:0:2565 -17679:1:316 -17680:0:2565 -17681:3:2104 -17682:0:2565 -17683:3:2105 -17684:3:2109 -17685:3:2110 -17686:3:2118 -17687:3:2119 -17688:3:2123 -17689:3:2124 -17690:3:2132 -17691:3:2137 -17692:3:2141 -17693:3:2142 -17694:3:2149 -17695:3:2150 -17696:3:2161 -17697:3:2169 -17698:3:2170 -17699:3:2174 -17700:3:2179 -17701:3:2180 -17702:0:2565 -17703:3:2192 -17704:0:2565 -17705:3:2013 -17706:0:2565 -17707:3:2014 -17708:0:2565 -17709:3:2015 -17710:3:2019 -17711:3:2020 -17712:3:2028 -17713:3:2029 -17714:3:2033 -17715:3:2034 -17716:3:2042 -17717:3:2047 -17718:3:2051 -17719:3:2052 -17720:3:2059 -17721:3:2060 -17722:3:2071 -17723:3:2079 -17724:3:2080 -17725:3:2084 -17726:3:2089 -17727:3:2090 -17728:0:2565 -17729:3:2102 -17730:0:2565 -17731:2:477 -17732:2:481 -17733:2:482 -17734:2:490 -17735:2:499 -17736:2:500 -17737:2:504 -17738:2:509 -17739:2:513 -17740:2:514 -17741:2:521 -17742:2:522 -17743:2:533 -17744:2:534 -17745:2:537 -17746:2:538 -17747:2:546 -17748:2:551 -17749:2:552 -17750:0:2565 -17751:3:2104 -17752:0:2565 -17753:3:2105 -17754:3:2109 -17755:3:2110 -17756:3:2118 -17757:3:2119 -17758:3:2123 -17759:3:2124 -17760:3:2132 -17761:3:2137 -17762:3:2141 -17763:3:2142 -17764:3:2149 -17765:3:2150 -17766:3:2161 -17767:3:2169 -17768:3:2170 -17769:3:2174 -17770:3:2179 -17771:3:2180 -17772:0:2565 -17773:3:2192 -17774:0:2565 -17775:3:2013 -17776:0:2565 -17777:3:2014 -17778:0:2565 -17779:3:2015 -17780:3:2019 -17781:3:2020 -17782:3:2028 -17783:3:2029 -17784:3:2033 -17785:3:2034 -17786:3:2042 -17787:3:2047 -17788:3:2051 -17789:3:2052 -17790:3:2059 -17791:3:2060 -17792:3:2071 -17793:3:2079 -17794:3:2080 -17795:3:2084 -17796:3:2089 -17797:3:2090 -17798:0:2565 -17799:2:564 -17800:0:2565 -17801:3:2102 -17802:0:2565 -17803:3:2104 -17804:0:2565 -17805:3:2105 -17806:3:2109 -17807:3:2110 -17808:3:2118 -17809:3:2119 -17810:3:2123 -17811:3:2124 -17812:3:2132 -17813:3:2137 -17814:3:2141 -17815:3:2142 -17816:3:2149 -17817:3:2150 -17818:3:2161 -17819:3:2169 -17820:3:2170 -17821:3:2174 -17822:3:2179 -17823:3:2180 -17824:0:2565 -17825:3:2192 -17826:0:2565 -17827:3:2013 -17828:0:2565 -17829:3:2014 -17830:0:2565 -17831:2:565 -17832:2:569 -17833:2:570 -17834:2:578 -17835:2:579 -17836:2:580 -17837:2:592 -17838:2:597 -17839:2:601 -17840:2:602 -17841:2:609 -17842:2:610 -17843:2:621 -17844:2:622 -17845:2:623 -17846:2:634 -17847:2:639 -17848:2:640 -17849:0:2565 -17850:3:2015 -17851:3:2019 -17852:3:2020 -17853:3:2028 -17854:3:2029 -17855:3:2033 -17856:3:2034 -17857:3:2042 -17858:3:2047 -17859:3:2051 -17860:3:2052 -17861:3:2059 -17862:3:2060 -17863:3:2071 -17864:3:2079 -17865:3:2080 -17866:3:2084 -17867:3:2089 -17868:3:2090 -17869:0:2565 -17870:3:2102 -17871:0:2565 -17872:3:2104 -17873:0:2565 -17874:3:2105 -17875:3:2109 -17876:3:2110 -17877:3:2118 -17878:3:2119 -17879:3:2123 -17880:3:2124 -17881:3:2132 -17882:3:2137 -17883:3:2141 -17884:3:2142 -17885:3:2149 -17886:3:2150 -17887:3:2161 -17888:3:2169 -17889:3:2170 -17890:3:2174 -17891:3:2179 -17892:3:2180 -17893:0:2565 -17894:3:2192 -17895:0:2565 -17896:1:315 -17897:0:2565 -17898:3:2013 -17899:0:2565 -17900:2:744 -17901:0:2565 -17902:1:316 -17903:0:2565 -17904:3:2014 -17905:0:2565 -17906:3:2015 -17907:3:2019 -17908:3:2020 -17909:3:2028 -17910:3:2029 -17911:3:2033 -17912:3:2034 -17913:3:2042 -17914:3:2047 -17915:3:2051 -17916:3:2052 -17917:3:2059 -17918:3:2060 -17919:3:2071 -17920:3:2079 -17921:3:2080 -17922:3:2084 -17923:3:2089 -17924:3:2090 -17925:0:2565 -17926:3:2102 -17927:0:2565 -17928:3:2104 -17929:0:2565 -17930:3:2105 -17931:3:2109 -17932:3:2110 -17933:3:2118 -17934:3:2119 -17935:3:2123 -17936:3:2124 -17937:3:2132 -17938:3:2137 -17939:3:2141 -17940:3:2142 -17941:3:2149 -17942:3:2150 -17943:3:2161 -17944:3:2169 -17945:3:2170 -17946:3:2174 -17947:3:2179 -17948:3:2180 -17949:0:2565 -17950:3:2192 -17951:0:2565 -17952:3:2013 -17953:0:2565 -17954:1:315 -17955:0:2565 -17956:3:2014 -17957:0:2565 -17958:3:2015 -17959:3:2019 -17960:3:2020 -17961:3:2028 -17962:3:2029 -17963:3:2033 -17964:3:2034 -17965:3:2042 -17966:3:2047 -17967:3:2051 -17968:3:2052 -17969:3:2059 -17970:3:2060 -17971:3:2071 -17972:3:2079 -17973:3:2080 -17974:3:2084 -17975:3:2089 -17976:3:2090 -17977:0:2565 -17978:3:2102 -17979:0:2565 -17980:3:2104 -17981:0:2565 -17982:3:2105 -17983:3:2109 -17984:3:2110 -17985:3:2118 -17986:3:2119 -17987:3:2123 -17988:3:2124 -17989:3:2132 -17990:3:2137 -17991:3:2141 -17992:3:2142 -17993:3:2149 -17994:3:2150 -17995:3:2161 -17996:3:2169 -17997:3:2170 -17998:3:2174 -17999:3:2179 -18000:3:2180 -18001:0:2565 -18002:3:2192 -18003:0:2565 -18004:2:745 -18005:0:2565 -18006:3:2013 -18007:0:2565 -18008:2:750 -18009:0:2565 -18010:2:753 -18011:0:2565 -18012:1:316 -18013:0:2565 -18014:3:2014 -18015:0:2565 -18016:3:2015 -18017:3:2019 -18018:3:2020 -18019:3:2028 -18020:3:2029 -18021:3:2033 -18022:3:2034 -18023:3:2042 -18024:3:2047 -18025:3:2051 -18026:3:2052 -18027:3:2059 -18028:3:2060 -18029:3:2071 -18030:3:2079 -18031:3:2080 -18032:3:2084 -18033:3:2089 -18034:3:2090 -18035:0:2565 -18036:3:2102 -18037:0:2565 -18038:3:2104 -18039:0:2565 -18040:3:2105 -18041:3:2109 -18042:3:2110 -18043:3:2118 -18044:3:2119 -18045:3:2123 -18046:3:2124 -18047:3:2132 -18048:3:2137 -18049:3:2141 -18050:3:2142 -18051:3:2149 -18052:3:2150 -18053:3:2161 -18054:3:2169 -18055:3:2170 -18056:3:2174 -18057:3:2179 -18058:3:2180 -18059:0:2565 -18060:3:2192 -18061:0:2565 -18062:3:2013 -18063:0:2565 -18064:1:315 -18065:0:2565 -18066:3:2014 -18067:0:2565 -18068:3:2015 -18069:3:2019 -18070:3:2020 -18071:3:2028 -18072:3:2029 -18073:3:2033 -18074:3:2034 -18075:3:2042 -18076:3:2047 -18077:3:2051 -18078:3:2052 -18079:3:2059 -18080:3:2060 -18081:3:2071 -18082:3:2079 -18083:3:2080 -18084:3:2084 -18085:3:2089 -18086:3:2090 -18087:0:2565 -18088:3:2102 -18089:0:2565 -18090:3:2104 -18091:0:2565 -18092:3:2105 -18093:3:2109 -18094:3:2110 -18095:3:2118 -18096:3:2119 -18097:3:2123 -18098:3:2124 -18099:3:2132 -18100:3:2137 -18101:3:2141 -18102:3:2142 -18103:3:2149 -18104:3:2150 -18105:3:2161 -18106:3:2169 -18107:3:2170 -18108:3:2174 -18109:3:2179 -18110:3:2180 -18111:0:2565 -18112:3:2192 -18113:0:2565 -18114:2:758 -18115:0:2565 -18116:3:2013 -18117:0:2565 -18118:1:316 -18119:0:2565 -18120:3:2014 -18121:0:2565 -18122:3:2015 -18123:3:2019 -18124:3:2020 -18125:3:2028 -18126:3:2029 -18127:3:2033 -18128:3:2034 -18129:3:2042 -18130:3:2047 -18131:3:2051 -18132:3:2052 -18133:3:2059 -18134:3:2060 -18135:3:2071 -18136:3:2079 -18137:3:2080 -18138:3:2084 -18139:3:2089 -18140:3:2090 -18141:0:2565 -18142:3:2102 -18143:0:2565 -18144:3:2104 -18145:0:2565 -18146:3:2105 -18147:3:2109 -18148:3:2110 -18149:3:2118 -18150:3:2119 -18151:3:2123 -18152:3:2124 -18153:3:2132 -18154:3:2137 -18155:3:2141 -18156:3:2142 -18157:3:2149 -18158:3:2150 -18159:3:2161 -18160:3:2169 -18161:3:2170 -18162:3:2174 -18163:3:2179 -18164:3:2180 -18165:0:2565 -18166:3:2192 -18167:0:2565 -18168:3:2013 -18169:0:2565 -18170:1:315 -18171:0:2565 -18172:3:2014 -18173:0:2565 -18174:3:2015 -18175:3:2019 -18176:3:2020 -18177:3:2028 -18178:3:2029 -18179:3:2033 -18180:3:2034 -18181:3:2042 -18182:3:2047 -18183:3:2051 -18184:3:2052 -18185:3:2059 -18186:3:2060 -18187:3:2071 -18188:3:2079 -18189:3:2080 -18190:3:2084 -18191:3:2089 -18192:3:2090 -18193:0:2565 -18194:3:2102 -18195:0:2565 -18196:3:2104 -18197:0:2565 -18198:3:2105 -18199:3:2109 -18200:3:2110 -18201:3:2118 -18202:3:2119 -18203:3:2123 -18204:3:2124 -18205:3:2132 -18206:3:2137 -18207:3:2141 -18208:3:2142 -18209:3:2149 -18210:3:2150 -18211:3:2161 -18212:3:2169 -18213:3:2170 -18214:3:2174 -18215:3:2179 -18216:3:2180 -18217:0:2565 -18218:3:2192 -18219:0:2565 -18220:2:759 -18221:0:2565 -18222:3:2013 -18223:0:2565 -18224:1:316 -18225:0:2565 -18226:3:2014 -18227:0:2565 -18228:3:2015 -18229:3:2019 -18230:3:2020 -18231:3:2028 -18232:3:2029 -18233:3:2033 -18234:3:2034 -18235:3:2042 -18236:3:2047 -18237:3:2051 -18238:3:2052 -18239:3:2059 -18240:3:2060 -18241:3:2071 -18242:3:2079 -18243:3:2080 -18244:3:2084 -18245:3:2089 -18246:3:2090 -18247:0:2565 -18248:3:2102 -18249:0:2565 -18250:3:2104 -18251:0:2565 -18252:3:2105 -18253:3:2109 -18254:3:2110 -18255:3:2118 -18256:3:2119 -18257:3:2123 -18258:3:2124 -18259:3:2132 -18260:3:2137 -18261:3:2141 -18262:3:2142 -18263:3:2149 -18264:3:2150 -18265:3:2161 -18266:3:2169 -18267:3:2170 -18268:3:2174 -18269:3:2179 -18270:3:2180 -18271:0:2565 -18272:3:2192 -18273:0:2565 -18274:3:2013 -18275:0:2565 -18276:2:760 -18277:0:2565 -18278:2:761 -18279:0:2565 -18280:2:762 -18281:0:2565 -18282:3:2014 -18283:0:2565 -18284:3:2015 -18285:3:2019 -18286:3:2020 -18287:3:2028 -18288:3:2029 -18289:3:2033 -18290:3:2034 -18291:3:2042 -18292:3:2047 -18293:3:2051 -18294:3:2052 -18295:3:2059 -18296:3:2060 -18297:3:2071 -18298:3:2079 -18299:3:2080 -18300:3:2084 -18301:3:2089 -18302:3:2090 -18303:0:2565 -18304:3:2102 -18305:0:2565 -18306:1:315 -18307:0:2565 -18308:2:763 -18309:0:2565 -18310:1:316 -18311:0:2565 -18312:3:2104 -18313:0:2565 -18314:3:2105 -18315:3:2109 -18316:3:2110 -18317:3:2118 -18318:3:2119 -18319:3:2123 -18320:3:2124 -18321:3:2132 -18322:3:2137 -18323:3:2141 -18324:3:2142 -18325:3:2149 -18326:3:2150 -18327:3:2161 -18328:3:2169 -18329:3:2170 -18330:3:2174 -18331:3:2179 -18332:3:2180 -18333:0:2565 -18334:3:2192 -18335:0:2565 -18336:3:2013 -18337:0:2565 -18338:3:2014 -18339:0:2565 -18340:3:2015 -18341:3:2019 -18342:3:2020 -18343:3:2028 -18344:3:2029 -18345:3:2033 -18346:3:2034 -18347:3:2042 -18348:3:2047 -18349:3:2051 -18350:3:2052 -18351:3:2059 -18352:3:2060 -18353:3:2071 -18354:3:2079 -18355:3:2080 -18356:3:2084 -18357:3:2089 -18358:3:2090 -18359:0:2565 -18360:3:2102 -18361:0:2565 -18362:1:315 -18363:0:2565 -18364:3:2104 -18365:0:2565 -18366:3:2105 -18367:3:2109 -18368:3:2110 -18369:3:2118 -18370:3:2119 -18371:3:2123 -18372:3:2124 -18373:3:2132 -18374:3:2137 -18375:3:2141 -18376:3:2142 -18377:3:2149 -18378:3:2150 -18379:3:2161 -18380:3:2169 -18381:3:2170 -18382:3:2174 -18383:3:2179 -18384:3:2180 -18385:0:2565 -18386:3:2192 -18387:0:2565 -18388:3:2013 -18389:0:2565 -18390:3:2014 -18391:0:2565 -18392:3:2015 -18393:3:2019 -18394:3:2020 -18395:3:2028 -18396:3:2029 -18397:3:2033 -18398:3:2034 -18399:3:2042 -18400:3:2047 -18401:3:2051 -18402:3:2052 -18403:3:2059 -18404:3:2060 -18405:3:2071 -18406:3:2079 -18407:3:2080 -18408:3:2084 -18409:3:2089 -18410:3:2090 -18411:0:2565 -18412:2:765 -18413:0:2565 -18414:3:2102 -18415:0:2565 -18416:1:316 -18417:0:2565 -18418:3:2104 -18419:0:2565 -18420:3:2105 -18421:3:2109 -18422:3:2110 -18423:3:2118 -18424:3:2119 -18425:3:2123 -18426:3:2124 -18427:3:2132 -18428:3:2137 -18429:3:2141 -18430:3:2142 -18431:3:2149 -18432:3:2150 -18433:3:2161 -18434:3:2169 -18435:3:2170 -18436:3:2174 -18437:3:2179 -18438:3:2180 -18439:0:2565 -18440:3:2192 -18441:0:2565 -18442:3:2013 -18443:0:2565 -18444:3:2014 -18445:0:2565 -18446:3:2015 -18447:3:2019 -18448:3:2020 -18449:3:2028 -18450:3:2029 -18451:3:2033 -18452:3:2034 -18453:3:2042 -18454:3:2047 -18455:3:2051 -18456:3:2052 -18457:3:2059 -18458:3:2060 -18459:3:2071 -18460:3:2079 -18461:3:2080 -18462:3:2084 -18463:3:2089 -18464:3:2090 -18465:0:2565 -18466:3:2102 -18467:0:2565 -18468:2:766 -18469:2:770 -18470:2:771 -18471:2:779 -18472:2:788 -18473:2:789 -18474:2:793 -18475:2:798 -18476:2:802 -18477:2:803 -18478:2:810 -18479:2:811 -18480:2:822 -18481:2:823 -18482:2:826 -18483:2:827 -18484:2:835 -18485:2:840 -18486:2:841 -18487:0:2565 -18488:3:2104 -18489:0:2565 -18490:3:2105 -18491:3:2109 -18492:3:2110 -18493:3:2118 -18494:3:2119 -18495:3:2123 -18496:3:2124 -18497:3:2132 -18498:3:2137 -18499:3:2141 -18500:3:2142 -18501:3:2149 -18502:3:2150 -18503:3:2161 -18504:3:2169 -18505:3:2170 -18506:3:2174 -18507:3:2179 -18508:3:2180 -18509:0:2565 -18510:3:2192 -18511:0:2565 -18512:3:2013 -18513:0:2565 -18514:3:2014 -18515:0:2565 -18516:3:2015 -18517:3:2019 -18518:3:2020 -18519:3:2028 -18520:3:2029 -18521:3:2033 -18522:3:2034 -18523:3:2042 -18524:3:2047 -18525:3:2051 -18526:3:2052 -18527:3:2059 -18528:3:2060 -18529:3:2071 -18530:3:2079 -18531:3:2080 -18532:3:2084 -18533:3:2089 -18534:3:2090 -18535:0:2565 -18536:2:853 -18537:0:2565 -18538:3:2102 -18539:0:2565 -18540:2:857 -18541:0:2565 -18542:2:465 -18543:0:2565 -18544:3:2104 -18545:0:2565 -18546:3:2105 -18547:3:2109 -18548:3:2110 -18549:3:2118 -18550:3:2119 -18551:3:2123 -18552:3:2124 -18553:3:2132 -18554:3:2137 -18555:3:2141 -18556:3:2142 -18557:3:2149 -18558:3:2150 -18559:3:2161 -18560:3:2169 -18561:3:2170 -18562:3:2174 -18563:3:2179 -18564:3:2180 -18565:0:2565 -18566:3:2192 -18567:0:2565 -18568:3:2013 -18569:0:2565 -18570:3:2014 -18571:0:2565 -18572:3:2015 -18573:3:2019 -18574:3:2020 -18575:3:2028 -18576:3:2029 -18577:3:2033 -18578:3:2034 -18579:3:2042 -18580:3:2047 -18581:3:2051 -18582:3:2052 -18583:3:2059 -18584:3:2060 -18585:3:2071 -18586:3:2079 -18587:3:2080 -18588:3:2084 -18589:3:2089 -18590:3:2090 -18591:0:2565 -18592:2:466 -18593:0:2565 -18594:3:2102 -18595:0:2565 -18596:3:2104 -18597:0:2565 -18598:3:2105 -18599:3:2109 -18600:3:2110 -18601:3:2118 -18602:3:2119 -18603:3:2123 -18604:3:2124 -18605:3:2132 -18606:3:2137 -18607:3:2141 -18608:3:2142 -18609:3:2149 -18610:3:2150 -18611:3:2161 -18612:3:2169 -18613:3:2170 -18614:3:2174 -18615:3:2179 -18616:3:2180 -18617:0:2565 -18618:3:2192 -18619:0:2565 -18620:3:2013 -18621:0:2565 -18622:3:2014 -18623:0:2565 -18624:2:467 -18625:0:2565 -18626:3:2015 -18627:3:2019 -18628:3:2020 -18629:3:2028 -18630:3:2029 -18631:3:2033 -18632:3:2034 -18633:3:2042 -18634:3:2047 -18635:3:2051 -18636:3:2052 -18637:3:2059 -18638:3:2060 -18639:3:2071 -18640:3:2079 -18641:3:2080 -18642:3:2084 -18643:3:2089 -18644:3:2090 -18645:0:2565 -18646:3:2102 -18647:0:2565 -18648:3:2104 -18649:0:2565 -18650:3:2105 -18651:3:2109 -18652:3:2110 -18653:3:2118 -18654:3:2119 -18655:3:2123 -18656:3:2124 -18657:3:2132 -18658:3:2137 -18659:3:2141 -18660:3:2142 -18661:3:2149 -18662:3:2150 -18663:3:2161 -18664:3:2169 -18665:3:2170 -18666:3:2174 -18667:3:2179 -18668:3:2180 -18669:0:2565 -18670:3:2192 -18671:0:2565 -18672:3:2013 -18673:0:2565 -18674:1:317 -18675:0:2565 -18676:2:468 -18677:0:2565 -18678:1:323 -18679:0:2565 -18680:1:324 -18681:0:2565 -18682:3:2014 -18683:0:2565 -18684:3:2015 -18685:3:2019 -18686:3:2020 -18687:3:2028 -18688:3:2029 -18689:3:2033 -18690:3:2034 -18691:3:2042 -18692:3:2047 -18693:3:2051 -18694:3:2052 -18695:3:2059 -18696:3:2060 -18697:3:2071 -18698:3:2079 -18699:3:2080 -18700:3:2084 -18701:3:2089 -18702:3:2090 -18703:0:2565 -18704:3:2102 -18705:0:2565 -18706:3:2104 -18707:0:2565 -18708:3:2105 -18709:3:2109 -18710:3:2110 -18711:3:2118 -18712:3:2119 -18713:3:2123 -18714:3:2124 -18715:3:2132 -18716:3:2137 -18717:3:2141 -18718:3:2142 -18719:3:2149 -18720:3:2150 -18721:3:2161 -18722:3:2169 -18723:3:2170 -18724:3:2174 -18725:3:2179 -18726:3:2180 -18727:0:2565 -18728:3:2192 -18729:0:2565 -18730:3:2013 -18731:0:2565 -18732:2:467 -18733:0:2565 -18734:2:468 -18735:0:2565 -18736:3:2014 -18737:0:2565 -18738:3:2015 -18739:3:2019 -18740:3:2020 -18741:3:2028 -18742:3:2029 -18743:3:2033 -18744:3:2034 -18745:3:2042 -18746:3:2047 -18747:3:2051 -18748:3:2052 -18749:3:2059 -18750:3:2060 -18751:3:2071 -18752:3:2079 -18753:3:2080 -18754:3:2084 -18755:3:2089 -18756:3:2090 -18757:0:2565 -18758:3:2102 -18759:0:2565 -18760:3:2104 -18761:0:2565 -18762:3:2105 -18763:3:2109 -18764:3:2110 -18765:3:2118 -18766:3:2119 -18767:3:2123 -18768:3:2124 -18769:3:2132 -18770:3:2137 -18771:3:2141 -18772:3:2142 -18773:3:2149 -18774:3:2150 -18775:3:2161 -18776:3:2169 -18777:3:2170 -18778:3:2174 -18779:3:2179 -18780:3:2180 -18781:0:2565 -18782:3:2192 -18783:0:2565 -18784:2:467 -18785:0:2565 -18786:1:329 -18787:0:2565 -18788:3:2013 -18789:0:2565 -18790:2:468 -18791:0:2565 -18792:3:2014 -18793:0:2565 -18794:3:2015 -18795:3:2019 -18796:3:2020 -18797:3:2028 -18798:3:2029 -18799:3:2033 -18800:3:2034 -18801:3:2042 -18802:3:2047 -18803:3:2051 -18804:3:2052 -18805:3:2059 -18806:3:2060 -18807:3:2071 -18808:3:2079 -18809:3:2080 -18810:3:2084 -18811:3:2089 -18812:3:2090 -18813:0:2565 -18814:3:2102 -18815:0:2565 -18816:3:2104 -18817:0:2565 -18818:3:2105 -18819:3:2109 -18820:3:2110 -18821:3:2118 -18822:3:2119 -18823:3:2123 -18824:3:2124 -18825:3:2132 -18826:3:2137 -18827:3:2141 -18828:3:2142 -18829:3:2149 -18830:3:2150 -18831:3:2161 -18832:3:2169 -18833:3:2170 -18834:3:2174 -18835:3:2179 -18836:3:2180 -18837:0:2565 -18838:3:2192 -18839:0:2565 -18840:2:467 -18841:0:2565 -18842:3:2013 -18843:0:2565 -18844:3:2014 -18845:0:2565 -18846:3:2015 -18847:3:2019 -18848:3:2020 -18849:3:2028 -18850:3:2029 -18851:3:2033 -18852:3:2034 -18853:3:2042 -18854:3:2047 -18855:3:2051 -18856:3:2052 -18857:3:2059 -18858:3:2060 -18859:3:2071 -18860:3:2079 -18861:3:2080 -18862:3:2084 -18863:3:2089 -18864:3:2090 -18865:0:2565 -18866:3:2102 -18867:0:2565 -18868:3:2104 -18869:0:2565 -18870:3:2105 -18871:3:2109 -18872:3:2110 -18873:3:2118 -18874:3:2119 -18875:3:2123 -18876:3:2124 -18877:3:2132 -18878:3:2137 -18879:3:2141 -18880:3:2142 -18881:3:2149 -18882:3:2150 -18883:3:2161 -18884:3:2169 -18885:3:2170 -18886:3:2174 -18887:3:2179 -18888:3:2180 -18889:0:2565 -18890:1:330 -18891:0:2565 -18892:3:2192 -18893:0:2565 -18894:3:2013 -18895:0:2565 -18896:2:468 -18897:0:2565 -18898:3:2014 -18899:0:2565 -18900:3:2015 -18901:3:2019 -18902:3:2020 -18903:3:2028 -18904:3:2029 -18905:3:2033 -18906:3:2034 -18907:3:2042 -18908:3:2047 -18909:3:2051 -18910:3:2052 -18911:3:2059 -18912:3:2060 -18913:3:2071 -18914:3:2079 -18915:3:2080 -18916:3:2084 -18917:3:2089 -18918:3:2090 -18919:0:2565 -18920:3:2102 -18921:0:2565 -18922:3:2104 -18923:0:2565 -18924:3:2105 -18925:3:2109 -18926:3:2110 -18927:3:2118 -18928:3:2119 -18929:3:2123 -18930:3:2124 -18931:3:2132 -18932:3:2137 -18933:3:2141 -18934:3:2142 -18935:3:2149 -18936:3:2150 -18937:3:2161 -18938:3:2169 -18939:3:2170 -18940:3:2174 -18941:3:2179 -18942:3:2180 -18943:0:2565 -18944:3:2192 -18945:0:2565 -18946:2:467 -18947:0:2565 -18948:3:2013 -18949:0:2565 -18950:3:2014 -18951:0:2565 -18952:3:2015 -18953:3:2019 -18954:3:2020 -18955:3:2028 -18956:3:2029 -18957:3:2033 -18958:3:2034 -18959:3:2042 -18960:3:2047 -18961:3:2051 -18962:3:2052 -18963:3:2059 -18964:3:2060 -18965:3:2071 -18966:3:2079 -18967:3:2080 -18968:3:2084 -18969:3:2089 -18970:3:2090 -18971:0:2565 -18972:3:2102 -18973:0:2565 -18974:3:2104 -18975:0:2565 -18976:3:2105 -18977:3:2109 -18978:3:2110 -18979:3:2118 -18980:3:2119 -18981:3:2123 -18982:3:2124 -18983:3:2132 -18984:3:2137 -18985:3:2141 -18986:3:2142 -18987:3:2149 -18988:3:2150 -18989:3:2161 -18990:3:2169 -18991:3:2170 -18992:3:2174 -18993:3:2179 -18994:3:2180 -18995:0:2565 -18996:1:331 -18997:0:2565 -18998:3:2192 -18999:0:2565 -19000:3:2013 -19001:0:2565 -19002:2:468 -19003:0:2565 -19004:1:332 -19005:0:2565 -19006:1:333 -19007:0:2565 -19008:1:334 -19009:0:2565 -19010:3:2014 -19011:0:2565 -19012:3:2015 -19013:3:2019 -19014:3:2020 -19015:3:2028 -19016:3:2029 -19017:3:2033 -19018:3:2034 -19019:3:2042 -19020:3:2047 -19021:3:2051 -19022:3:2052 -19023:3:2059 -19024:3:2060 -19025:3:2071 -19026:3:2079 -19027:3:2080 -19028:3:2084 -19029:3:2089 -19030:3:2090 -19031:0:2565 -19032:3:2102 -19033:0:2565 -19034:3:2104 -19035:0:2565 -19036:3:2105 -19037:3:2109 -19038:3:2110 -19039:3:2118 -19040:3:2119 -19041:3:2123 -19042:3:2124 -19043:3:2132 -19044:3:2137 -19045:3:2141 -19046:3:2142 -19047:3:2149 -19048:3:2150 -19049:3:2161 -19050:3:2169 -19051:3:2170 -19052:3:2174 -19053:3:2179 -19054:3:2180 -19055:0:2565 -19056:3:2192 -19057:0:2565 -19058:3:2013 -19059:0:2565 -19060:2:467 -19061:0:2565 -19062:2:468 -19063:0:2565 -19064:3:2014 -19065:0:2565 -19066:3:2015 -19067:3:2019 -19068:3:2020 -19069:3:2028 -19070:3:2029 -19071:3:2033 -19072:3:2034 -19073:3:2042 -19074:3:2047 -19075:3:2051 -19076:3:2052 -19077:3:2059 -19078:3:2060 -19079:3:2071 -19080:3:2079 -19081:3:2080 -19082:3:2084 -19083:3:2089 -19084:3:2090 -19085:0:2565 -19086:3:2102 -19087:0:2565 -19088:3:2104 -19089:0:2565 -19090:3:2105 -19091:3:2109 -19092:3:2110 -19093:3:2118 -19094:3:2119 -19095:3:2123 -19096:3:2124 -19097:3:2132 -19098:3:2137 -19099:3:2141 -19100:3:2142 -19101:3:2149 -19102:3:2150 -19103:3:2161 -19104:3:2169 -19105:3:2170 -19106:3:2174 -19107:3:2179 -19108:3:2180 -19109:0:2565 -19110:3:2192 -19111:0:2565 -19112:2:467 -19113:0:2565 -19114:1:336 -19115:0:2565 -19116:3:2013 -19117:0:2565 -19118:2:468 -19119:0:2565 -19120:3:2014 -19121:0:2565 -19122:3:2015 -19123:3:2019 -19124:3:2020 -19125:3:2028 -19126:3:2029 -19127:3:2033 -19128:3:2034 -19129:3:2042 -19130:3:2047 -19131:3:2051 -19132:3:2052 -19133:3:2059 -19134:3:2060 -19135:3:2071 -19136:3:2079 -19137:3:2080 -19138:3:2084 -19139:3:2089 -19140:3:2090 -19141:0:2565 -19142:3:2102 -19143:0:2565 -19144:3:2104 -19145:0:2565 -19146:3:2105 -19147:3:2109 -19148:3:2110 -19149:3:2118 -19150:3:2119 -19151:3:2123 -19152:3:2124 -19153:3:2132 -19154:3:2137 -19155:3:2141 -19156:3:2142 -19157:3:2149 -19158:3:2150 -19159:3:2161 -19160:3:2169 -19161:3:2170 -19162:3:2174 -19163:3:2179 -19164:3:2180 -19165:0:2565 -19166:3:2192 -19167:0:2565 -19168:2:469 -19169:0:2565 -19170:3:2013 -19171:0:2565 -19172:2:475 -19173:0:2565 -19174:2:476 -19175:0:2565 -19176:3:2014 -19177:0:2565 -19178:3:2015 -19179:3:2019 -19180:3:2020 -19181:3:2028 -19182:3:2029 -19183:3:2033 -19184:3:2034 -19185:3:2042 -19186:3:2047 -19187:3:2051 -19188:3:2052 -19189:3:2059 -19190:3:2060 -19191:3:2071 -19192:3:2079 -19193:3:2080 -19194:3:2084 -19195:3:2089 -19196:3:2090 -19197:0:2565 -19198:3:2102 -19199:0:2565 -19200:3:2104 -19201:0:2565 -19202:3:2105 -19203:3:2109 -19204:3:2110 -19205:3:2118 -19206:3:2119 -19207:3:2123 -19208:3:2124 -19209:3:2132 -19210:3:2137 -19211:3:2141 -19212:3:2142 -19213:3:2149 -19214:3:2150 -19215:3:2161 -19216:3:2169 -19217:3:2170 -19218:3:2174 -19219:3:2179 -19220:3:2180 -19221:0:2565 -19222:3:2192 -19223:0:2565 -19224:2:477 -19225:2:481 -19226:2:482 -19227:2:490 -19228:2:499 -19229:2:500 -19230:2:504 -19231:2:509 -19232:2:513 -19233:2:514 -19234:2:521 -19235:2:522 -19236:2:533 -19237:2:534 -19238:2:537 -19239:2:538 -19240:2:546 -19241:2:551 -19242:2:552 -19243:0:2565 -19244:3:2013 -19245:0:2565 -19246:3:2014 -19247:0:2565 -19248:3:2015 -19249:3:2019 -19250:3:2020 -19251:3:2028 -19252:3:2029 -19253:3:2033 -19254:3:2034 -19255:3:2042 -19256:3:2047 -19257:3:2051 -19258:3:2052 -19259:3:2059 -19260:3:2060 -19261:3:2071 -19262:3:2079 -19263:3:2080 -19264:3:2084 -19265:3:2089 -19266:3:2090 -19267:0:2565 -19268:3:2102 -19269:0:2565 -19270:3:2104 -19271:0:2565 -19272:3:2105 -19273:3:2109 -19274:3:2110 -19275:3:2118 -19276:3:2119 -19277:3:2123 -19278:3:2124 -19279:3:2132 -19280:3:2137 -19281:3:2141 -19282:3:2142 -19283:3:2149 -19284:3:2150 -19285:3:2161 -19286:3:2169 -19287:3:2170 -19288:3:2174 -19289:3:2179 -19290:3:2180 -19291:0:2565 -19292:2:564 -19293:0:2565 -19294:3:2192 -19295:0:2565 -19296:3:2013 -19297:0:2565 -19298:3:2014 -19299:0:2565 -19300:3:2015 -19301:3:2019 -19302:3:2020 -19303:3:2028 -19304:3:2029 -19305:3:2033 -19306:3:2034 -19307:3:2042 -19308:3:2047 -19309:3:2051 -19310:3:2052 -19311:3:2059 -19312:3:2060 -19313:3:2071 -19314:3:2079 -19315:3:2080 -19316:3:2084 -19317:3:2089 -19318:3:2090 -19319:0:2565 -19320:3:2102 -19321:0:2565 -19322:3:2104 -19323:0:2565 -19324:2:565 -19325:2:569 -19326:2:570 -19327:2:578 -19328:2:587 -19329:2:588 -19330:2:592 -19331:2:597 -19332:2:601 -19333:2:602 -19334:2:609 -19335:2:610 -19336:2:621 -19337:2:622 -19338:2:625 -19339:2:626 -19340:2:634 -19341:2:639 -19342:2:640 -19343:0:2565 -19344:2:744 -19345:0:2565 -19346:3:2105 -19347:3:2109 -19348:3:2110 -19349:3:2118 -19350:3:2119 -19351:3:2123 -19352:3:2124 -19353:3:2132 -19354:3:2137 -19355:3:2141 -19356:3:2142 -19357:3:2149 -19358:3:2150 -19359:3:2161 -19360:3:2169 -19361:3:2170 -19362:3:2174 -19363:3:2179 -19364:3:2180 -19365:0:2565 -19366:3:2192 -19367:0:2565 -19368:3:2013 -19369:0:2565 -19370:3:2014 -19371:0:2565 -19372:3:2015 -19373:3:2019 -19374:3:2020 -19375:3:2028 -19376:3:2029 -19377:3:2033 -19378:3:2034 -19379:3:2042 -19380:3:2047 -19381:3:2051 -19382:3:2052 -19383:3:2059 -19384:3:2060 -19385:3:2071 -19386:3:2079 -19387:3:2080 -19388:3:2084 -19389:3:2089 -19390:3:2090 -19391:0:2565 -19392:3:2102 -19393:0:2565 -19394:1:337 -19395:0:2565 -19396:1:338 -19397:0:2565 -19398:3:2104 -19399:0:2565 -19400:3:2105 -19401:3:2109 -19402:3:2110 -19403:3:2118 -19404:3:2119 -19405:3:2123 -19406:3:2124 -19407:3:2132 -19408:3:2137 -19409:3:2141 -19410:3:2142 -19411:3:2149 -19412:3:2150 -19413:3:2161 -19414:3:2169 -19415:3:2170 -19416:3:2174 -19417:3:2179 -19418:3:2180 -19419:0:2565 -19420:3:2192 -19421:0:2565 -19422:3:2013 -19423:0:2565 -19424:3:2014 -19425:0:2565 -19426:3:2015 -19427:3:2019 -19428:3:2020 -19429:3:2028 -19430:3:2029 -19431:3:2033 -19432:3:2034 -19433:3:2042 -19434:3:2047 -19435:3:2051 -19436:3:2052 -19437:3:2059 -19438:3:2060 -19439:3:2071 -19440:3:2079 -19441:3:2080 -19442:3:2084 -19443:3:2089 -19444:3:2090 -19445:0:2565 -19446:3:2102 -19447:0:2565 -19448:1:337 -19449:0:2565 -19450:3:2104 -19451:0:2565 -19452:3:2105 -19453:3:2109 -19454:3:2110 -19455:3:2118 -19456:3:2119 -19457:3:2123 -19458:3:2124 -19459:3:2132 -19460:3:2137 -19461:3:2141 -19462:3:2142 -19463:3:2149 -19464:3:2150 -19465:3:2161 -19466:3:2169 -19467:3:2170 -19468:3:2174 -19469:3:2179 -19470:3:2180 -19471:0:2565 -19472:3:2192 -19473:0:2565 -19474:3:2013 -19475:0:2565 -19476:3:2014 -19477:0:2565 -19478:3:2015 -19479:3:2019 -19480:3:2020 -19481:3:2028 -19482:3:2029 -19483:3:2033 -19484:3:2034 -19485:3:2042 -19486:3:2047 -19487:3:2051 -19488:3:2052 -19489:3:2059 -19490:3:2060 -19491:3:2071 -19492:3:2079 -19493:3:2080 -19494:3:2084 -19495:3:2089 -19496:3:2090 -19497:0:2565 -19498:2:745 -19499:0:2565 -19500:3:2102 -19501:0:2565 -19502:2:750 -19503:0:2565 -19504:2:753 -19505:0:2565 -19506:1:338 -19507:0:2565 -19508:3:2104 -19509:0:2565 -19510:3:2105 -19511:3:2109 -19512:3:2110 -19513:3:2118 -19514:3:2119 -19515:3:2123 -19516:3:2124 -19517:3:2132 -19518:3:2137 -19519:3:2141 -19520:3:2142 -19521:3:2149 -19522:3:2150 -19523:3:2161 -19524:3:2169 -19525:3:2170 -19526:3:2174 -19527:3:2179 -19528:3:2180 -19529:0:2565 -19530:3:2192 -19531:0:2565 -19532:3:2013 -19533:0:2565 -19534:3:2014 -19535:0:2565 -19536:3:2015 -19537:3:2019 -19538:3:2020 -19539:3:2028 -19540:3:2029 -19541:3:2033 -19542:3:2034 -19543:3:2042 -19544:3:2047 -19545:3:2051 -19546:3:2052 -19547:3:2059 -19548:3:2060 -19549:3:2071 -19550:3:2079 -19551:3:2080 -19552:3:2084 -19553:3:2089 -19554:3:2090 -19555:0:2565 -19556:3:2102 -19557:0:2565 -19558:1:337 -19559:0:2565 -19560:3:2104 -19561:0:2565 -19562:3:2105 -19563:3:2109 -19564:3:2110 -19565:3:2118 -19566:3:2119 -19567:3:2123 -19568:3:2124 -19569:3:2132 -19570:3:2137 -19571:3:2141 -19572:3:2142 -19573:3:2149 -19574:3:2150 -19575:3:2161 -19576:3:2169 -19577:3:2170 -19578:3:2174 -19579:3:2179 -19580:3:2180 -19581:0:2565 -19582:3:2192 -19583:0:2565 -19584:3:2013 -19585:0:2565 -19586:3:2014 -19587:0:2565 -19588:3:2015 -19589:3:2019 -19590:3:2020 -19591:3:2028 -19592:3:2029 -19593:3:2033 -19594:3:2034 -19595:3:2042 -19596:3:2047 -19597:3:2051 -19598:3:2052 -19599:3:2059 -19600:3:2060 -19601:3:2071 -19602:3:2079 -19603:3:2080 -19604:3:2084 -19605:3:2089 -19606:3:2090 -19607:0:2565 -19608:2:758 -19609:0:2565 -19610:3:2102 -19611:0:2565 -19612:1:338 -19613:0:2565 -19614:3:2104 -19615:0:2565 -19616:3:2105 -19617:3:2109 -19618:3:2110 -19619:3:2118 -19620:3:2119 -19621:3:2123 -19622:3:2124 -19623:3:2132 -19624:3:2137 -19625:3:2141 -19626:3:2142 -19627:3:2149 -19628:3:2150 -19629:3:2161 -19630:3:2169 -19631:3:2170 -19632:3:2174 -19633:3:2179 -19634:3:2180 -19635:0:2565 -19636:3:2192 -19637:0:2565 -19638:3:2013 -19639:0:2565 -19640:3:2014 -19641:0:2565 -19642:3:2015 -19643:3:2019 -19644:3:2020 -19645:3:2028 -19646:3:2029 -19647:3:2033 -19648:3:2034 -19649:3:2042 -19650:3:2047 -19651:3:2051 -19652:3:2052 -19653:3:2059 -19654:3:2060 -19655:3:2071 -19656:3:2079 -19657:3:2080 -19658:3:2084 -19659:3:2089 -19660:3:2090 -19661:0:2565 -19662:3:2102 -19663:0:2565 -19664:1:337 -19665:0:2565 -19666:3:2104 -19667:0:2565 -19668:3:2105 -19669:3:2109 -19670:3:2110 -19671:3:2118 -19672:3:2119 -19673:3:2123 -19674:3:2124 -19675:3:2132 -19676:3:2137 -19677:3:2141 -19678:3:2142 -19679:3:2149 -19680:3:2150 -19681:3:2161 -19682:3:2169 -19683:3:2170 -19684:3:2174 -19685:3:2179 -19686:3:2180 -19687:0:2565 -19688:3:2192 -19689:0:2565 -19690:3:2013 -19691:0:2565 -19692:3:2014 -19693:0:2565 -19694:3:2015 -19695:3:2019 -19696:3:2020 -19697:3:2028 -19698:3:2029 -19699:3:2033 -19700:3:2034 -19701:3:2042 -19702:3:2047 -19703:3:2051 -19704:3:2052 -19705:3:2059 -19706:3:2060 -19707:3:2071 -19708:3:2079 -19709:3:2080 -19710:3:2084 -19711:3:2089 -19712:3:2090 -19713:0:2565 -19714:2:759 -19715:0:2565 -19716:3:2102 -19717:0:2565 -19718:1:338 -19719:0:2565 -19720:3:2104 -19721:0:2565 -19722:3:2105 -19723:3:2109 -19724:3:2110 -19725:3:2118 -19726:3:2119 -19727:3:2123 -19728:3:2124 -19729:3:2132 -19730:3:2137 -19731:3:2141 -19732:3:2142 -19733:3:2149 -19734:3:2150 -19735:3:2161 -19736:3:2169 -19737:3:2170 -19738:3:2174 -19739:3:2179 -19740:3:2180 -19741:0:2565 -19742:3:2192 -19743:0:2565 -19744:3:2013 -19745:0:2565 -19746:3:2014 -19747:0:2565 -19748:3:2015 -19749:3:2019 -19750:3:2020 -19751:3:2028 -19752:3:2029 -19753:3:2033 -19754:3:2034 -19755:3:2042 -19756:3:2047 -19757:3:2051 -19758:3:2052 -19759:3:2059 -19760:3:2060 -19761:3:2071 -19762:3:2079 -19763:3:2080 -19764:3:2084 -19765:3:2089 -19766:3:2090 -19767:0:2565 -19768:3:2102 -19769:0:2565 -19770:2:760 -19771:0:2565 -19772:2:761 -19773:0:2565 -19774:2:762 -19775:0:2565 -19776:3:2104 -19777:0:2565 -19778:3:2105 -19779:3:2109 -19780:3:2110 -19781:3:2118 -19782:3:2119 -19783:3:2123 -19784:3:2124 -19785:3:2132 -19786:3:2137 -19787:3:2141 -19788:3:2142 -19789:3:2149 -19790:3:2150 -19791:3:2161 -19792:3:2169 -19793:3:2170 -19794:3:2174 -19795:3:2179 -19796:3:2180 -19797:0:2565 -19798:3:2192 -19799:0:2565 -19800:1:337 -19801:0:2565 -19802:3:2013 -19803:0:2565 -19804:2:763 -19805:0:2565 -19806:1:338 -19807:0:2565 -19808:3:2014 -19809:0:2565 -19810:3:2015 -19811:3:2019 -19812:3:2020 -19813:3:2028 -19814:3:2029 -19815:3:2033 -19816:3:2034 -19817:3:2042 -19818:3:2047 -19819:3:2051 -19820:3:2052 -19821:3:2059 -19822:3:2060 -19823:3:2071 -19824:3:2079 -19825:3:2080 -19826:3:2084 -19827:3:2089 -19828:3:2090 -19829:0:2565 -19830:3:2102 -19831:0:2565 -19832:3:2104 -19833:0:2565 -19834:3:2105 -19835:3:2109 -19836:3:2110 -19837:3:2118 -19838:3:2119 -19839:3:2123 -19840:3:2124 -19841:3:2132 -19842:3:2137 -19843:3:2141 -19844:3:2142 -19845:3:2149 -19846:3:2150 -19847:3:2161 -19848:3:2169 -19849:3:2170 -19850:3:2174 -19851:3:2179 -19852:3:2180 -19853:0:2565 -19854:3:2192 -19855:0:2565 -19856:3:2013 -19857:0:2565 -19858:1:337 -19859:0:2565 -19860:3:2014 -19861:0:2565 -19862:3:2015 -19863:3:2019 -19864:3:2020 -19865:3:2028 -19866:3:2029 -19867:3:2033 -19868:3:2034 -19869:3:2042 -19870:3:2047 -19871:3:2051 -19872:3:2052 -19873:3:2059 -19874:3:2060 -19875:3:2071 -19876:3:2079 -19877:3:2080 -19878:3:2084 -19879:3:2089 -19880:3:2090 -19881:0:2565 -19882:3:2102 -19883:0:2565 -19884:3:2104 -19885:0:2565 -19886:3:2105 -19887:3:2109 -19888:3:2110 -19889:3:2118 -19890:3:2119 -19891:3:2123 -19892:3:2124 -19893:3:2132 -19894:3:2137 -19895:3:2141 -19896:3:2142 -19897:3:2149 -19898:3:2150 -19899:3:2161 -19900:3:2169 -19901:3:2170 -19902:3:2174 -19903:3:2179 -19904:3:2180 -19905:0:2565 -19906:3:2192 -19907:0:2565 -19908:2:765 -19909:0:2565 -19910:3:2013 -19911:0:2565 -19912:1:338 -19913:0:2565 -19914:3:2014 -19915:0:2565 -19916:3:2015 -19917:3:2019 -19918:3:2020 -19919:3:2028 -19920:3:2029 -19921:3:2033 -19922:3:2034 -19923:3:2042 -19924:3:2047 -19925:3:2051 -19926:3:2052 -19927:3:2059 -19928:3:2060 -19929:3:2071 -19930:3:2079 -19931:3:2080 -19932:3:2084 -19933:3:2089 -19934:3:2090 -19935:0:2565 -19936:3:2102 -19937:0:2565 -19938:3:2104 -19939:0:2565 -19940:3:2105 -19941:3:2109 -19942:3:2110 -19943:3:2118 -19944:3:2119 -19945:3:2123 -19946:3:2124 -19947:3:2132 -19948:3:2137 -19949:3:2141 -19950:3:2142 -19951:3:2149 -19952:3:2150 -19953:3:2161 -19954:3:2169 -19955:3:2170 -19956:3:2174 -19957:3:2179 -19958:3:2180 -19959:0:2565 -19960:3:2192 -19961:0:2565 -19962:3:2013 -19963:0:2565 -19964:2:766 -19965:2:770 -19966:2:771 -19967:2:779 -19968:2:788 -19969:2:789 -19970:2:793 -19971:2:798 -19972:2:802 -19973:2:803 -19974:2:810 -19975:2:811 -19976:2:822 -19977:2:823 -19978:2:826 -19979:2:827 -19980:2:835 -19981:2:840 -19982:2:841 -19983:0:2565 -19984:3:2014 -19985:0:2565 -19986:3:2015 -19987:3:2019 -19988:3:2020 -19989:3:2028 -19990:3:2029 -19991:3:2033 -19992:3:2034 -19993:3:2042 -19994:3:2047 -19995:3:2051 -19996:3:2052 -19997:3:2059 -19998:3:2060 -19999:3:2071 -20000:3:2079 -20001:3:2080 -20002:3:2084 -20003:3:2089 -20004:3:2090 -20005:0:2565 -20006:3:2102 -20007:0:2565 -20008:3:2104 -20009:0:2565 -20010:3:2105 -20011:3:2109 -20012:3:2110 -20013:3:2118 -20014:3:2119 -20015:3:2123 -20016:3:2124 -20017:3:2132 -20018:3:2137 -20019:3:2141 -20020:3:2142 -20021:3:2149 -20022:3:2150 -20023:3:2161 -20024:3:2169 -20025:3:2170 -20026:3:2174 -20027:3:2179 -20028:3:2180 -20029:0:2565 -20030:3:2192 -20031:0:2565 -20032:2:853 -20033:0:2565 -20034:3:2013 -20035:0:2565 -20036:2:857 -20037:0:2565 -20038:2:465 -20039:0:2565 -20040:3:2014 -20041:0:2565 -20042:3:2015 -20043:3:2019 -20044:3:2020 -20045:3:2028 -20046:3:2029 -20047:3:2033 -20048:3:2034 -20049:3:2042 -20050:3:2047 -20051:3:2051 -20052:3:2052 -20053:3:2059 -20054:3:2060 -20055:3:2071 -20056:3:2079 -20057:3:2080 -20058:3:2084 -20059:3:2089 -20060:3:2090 -20061:0:2565 -20062:3:2102 -20063:0:2565 -20064:3:2104 -20065:0:2565 -20066:3:2105 -20067:3:2109 -20068:3:2110 -20069:3:2118 -20070:3:2119 -20071:3:2123 -20072:3:2124 -20073:3:2132 -20074:3:2137 -20075:3:2141 -20076:3:2142 -20077:3:2149 -20078:3:2150 -20079:3:2161 -20080:3:2169 -20081:3:2170 -20082:3:2174 -20083:3:2179 -20084:3:2180 -20085:0:2565 -20086:3:2192 -20087:0:2565 -20088:2:466 -20089:0:2565 -20090:3:2013 -20091:0:2565 -20092:3:2014 -20093:0:2565 -20094:3:2015 -20095:3:2019 -20096:3:2020 -20097:3:2028 -20098:3:2029 -20099:3:2033 -20100:3:2034 -20101:3:2042 -20102:3:2047 -20103:3:2051 -20104:3:2052 -20105:3:2059 -20106:3:2060 -20107:3:2071 -20108:3:2079 -20109:3:2080 -20110:3:2084 -20111:3:2089 -20112:3:2090 -20113:0:2565 -20114:3:2102 -20115:0:2565 -20116:3:2104 -20117:0:2565 -20118:3:2105 -20119:3:2109 -20120:3:2110 -20121:3:2118 -20122:3:2119 -20123:3:2123 -20124:3:2124 -20125:3:2132 -20126:3:2137 -20127:3:2141 -20128:3:2142 -20129:3:2149 -20130:3:2150 -20131:3:2161 -20132:3:2169 -20133:3:2170 -20134:3:2174 -20135:3:2179 -20136:3:2180 -20137:0:2565 -20138:2:467 -20139:0:2565 -20140:3:2192 -20141:0:2565 -20142:3:2013 -20143:0:2565 -20144:3:2014 -20145:0:2565 -20146:3:2015 -20147:3:2019 -20148:3:2020 -20149:3:2028 -20150:3:2029 -20151:3:2033 -20152:3:2034 -20153:3:2042 -20154:3:2047 -20155:3:2051 -20156:3:2052 -20157:3:2059 -20158:3:2060 -20159:3:2071 -20160:3:2079 -20161:3:2080 -20162:3:2084 -20163:3:2089 -20164:3:2090 -20165:0:2565 -20166:3:2102 -20167:0:2565 -20168:3:2104 -20169:0:2565 -20170:1:339 -20171:0:2565 -20172:2:468 -20173:0:2565 -20174:3:2105 -20175:3:2109 -20176:3:2110 -20177:3:2118 -20178:3:2119 -20179:3:2123 -20180:3:2124 -20181:3:2132 -20182:3:2137 -20183:3:2141 -20184:3:2142 -20185:3:2149 -20186:3:2150 -20187:3:2161 -20188:3:2169 -20189:3:2170 -20190:3:2174 -20191:3:2179 -20192:3:2180 -20193:0:2565 -20194:3:2192 -20195:0:2565 -20196:3:2013 -20197:0:2565 -20198:3:2014 -20199:0:2565 -20200:3:2015 -20201:3:2019 -20202:3:2020 -20203:3:2028 -20204:3:2029 -20205:3:2033 -20206:3:2034 -20207:3:2042 -20208:3:2047 -20209:3:2051 -20210:3:2052 -20211:3:2059 -20212:3:2060 -20213:3:2071 -20214:3:2079 -20215:3:2080 -20216:3:2084 -20217:3:2089 -20218:3:2090 -20219:0:2565 -20220:3:2102 -20221:0:2565 -20222:3:2104 -20223:0:2565 -20224:2:467 -20225:0:2565 -20226:2:468 -20227:0:2565 -20228:3:2105 -20229:3:2109 -20230:3:2110 -20231:3:2118 -20232:3:2119 -20233:3:2123 -20234:3:2124 -20235:3:2132 -20236:3:2137 -20237:3:2141 -20238:3:2142 -20239:3:2149 -20240:3:2150 -20241:3:2161 -20242:3:2169 -20243:3:2170 -20244:3:2174 -20245:3:2179 -20246:3:2180 -20247:0:2565 -20248:3:2192 -20249:0:2565 -20250:3:2013 -20251:0:2565 -20252:3:2014 -20253:0:2565 -20254:3:2015 -20255:3:2019 -20256:3:2020 -20257:3:2028 -20258:3:2029 -20259:3:2033 -20260:3:2034 -20261:3:2042 -20262:3:2047 -20263:3:2051 -20264:3:2052 -20265:3:2059 -20266:3:2060 -20267:3:2071 -20268:3:2079 -20269:3:2080 -20270:3:2084 -20271:3:2089 -20272:3:2090 -20273:0:2565 -20274:3:2102 -20275:0:2565 -20276:2:467 -20277:0:2565 -20278:1:345 -20279:0:2565 -20280:2:468 -20281:0:2565 -20282:3:2104 -20283:0:2565 -20284:3:2105 -20285:3:2109 -20286:3:2110 -20287:3:2118 -20288:3:2119 -20289:3:2123 -20290:3:2124 -20291:3:2132 -20292:3:2137 -20293:3:2141 -20294:3:2142 -20295:3:2149 -20296:3:2150 -20297:3:2161 -20298:3:2169 -20299:3:2170 -20300:3:2174 -20301:3:2179 -20302:3:2180 -20303:0:2565 -20304:3:2192 -20305:0:2565 -20306:3:2013 -20307:0:2565 -20308:3:2014 -20309:0:2565 -20310:3:2015 -20311:3:2019 -20312:3:2020 -20313:3:2028 -20314:3:2029 -20315:3:2033 -20316:3:2034 -20317:3:2042 -20318:3:2047 -20319:3:2051 -20320:3:2052 -20321:3:2059 -20322:3:2060 -20323:3:2071 -20324:3:2079 -20325:3:2080 -20326:3:2084 -20327:3:2089 -20328:3:2090 -20329:0:2565 -20330:3:2102 -20331:0:2565 -20332:2:467 -20333:0:2565 -20334:2:468 -20335:0:2565 -20336:3:2104 -20337:0:2565 -20338:3:2105 -20339:3:2109 -20340:3:2110 -20341:3:2118 -20342:3:2119 -20343:3:2123 -20344:3:2124 -20345:3:2132 -20346:3:2137 -20347:3:2141 -20348:3:2142 -20349:3:2149 -20350:3:2150 -20351:3:2161 -20352:3:2169 -20353:3:2170 -20354:3:2174 -20355:3:2179 -20356:3:2180 -20357:0:2565 -20358:3:2192 -20359:0:2565 -20360:3:2013 -20361:0:2565 -20362:3:2014 -20363:0:2565 -20364:3:2015 -20365:3:2019 -20366:3:2020 -20367:3:2028 -20368:3:2029 -20369:3:2033 -20370:3:2034 -20371:3:2042 -20372:3:2047 -20373:3:2051 -20374:3:2052 -20375:3:2059 -20376:3:2060 -20377:3:2071 -20378:3:2079 -20379:3:2080 -20380:3:2084 -20381:3:2089 -20382:3:2090 -20383:0:2565 -20384:2:467 -20385:0:2565 -20386:1:346 -20387:1:350 -20388:1:351 -20389:1:359 -20390:1:360 -20391:1:361 -20392:1:373 -20393:1:378 -20394:1:382 -20395:1:383 -20396:1:390 -20397:1:391 -20398:1:402 -20399:1:403 -20400:1:404 -20401:1:415 -20402:1:420 -20403:1:421 -20404:0:2565 -20405:3:2102 -20406:0:2565 -20407:3:2104 -20408:0:2565 -20409:1:433 -20410:0:2565 -20411:3:2105 -20412:3:2109 -20413:3:2110 -20414:3:2118 -20415:3:2119 -20416:3:2123 -20417:3:2124 -20418:3:2132 -20419:3:2137 -20420:3:2141 -20421:3:2142 -20422:3:2149 -20423:3:2150 -20424:3:2161 -20425:3:2169 -20426:3:2170 -20427:3:2174 -20428:3:2179 -20429:3:2180 -20430:0:2565 -20431:1:434 -20432:0:2565 -20433:3:2192 -20434:0:2565 -20435:3:2013 -20436:0:2565 -20437:2:468 -20438:0:2565 -20439:1:435 -20440:0:2565 -20441:3:2014 -20442:0:2565 -20443:3:2015 -20444:3:2019 -20445:3:2020 -20446:3:2028 -20447:3:2029 -20448:3:2033 -20449:3:2034 -20450:3:2042 -20451:3:2047 -20452:3:2051 -20453:3:2052 -20454:3:2059 -20455:3:2060 -20456:3:2071 -20457:3:2079 -20458:3:2080 -20459:3:2084 -20460:3:2089 -20461:3:2090 -20462:0:2565 -20463:3:2102 -20464:0:2565 -20465:3:2104 -20466:0:2565 -20467:3:2105 -20468:3:2109 -20469:3:2110 -20470:3:2118 -20471:3:2119 -20472:3:2123 -20473:3:2124 -20474:3:2132 -20475:3:2137 -20476:3:2141 -20477:3:2142 -20478:3:2149 -20479:3:2150 -20480:3:2161 -20481:3:2169 -20482:3:2170 -20483:3:2174 -20484:3:2179 -20485:3:2180 -20486:0:2565 -20487:3:2192 -20488:0:2565 -20489:3:2013 -20490:0:2565 -20491:1:434 -20492:0:2565 -20493:3:2014 -20494:0:2565 -20495:3:2015 -20496:3:2019 -20497:3:2020 -20498:3:2028 -20499:3:2029 -20500:3:2033 -20501:3:2034 -20502:3:2042 -20503:3:2047 -20504:3:2051 -20505:3:2052 -20506:3:2059 -20507:3:2060 -20508:3:2071 -20509:3:2079 -20510:3:2080 -20511:3:2084 -20512:3:2089 -20513:3:2090 -20514:0:2565 -20515:3:2102 -20516:0:2565 -20517:3:2104 -20518:0:2565 -20519:3:2105 -20520:3:2109 -20521:3:2110 -20522:3:2118 -20523:3:2119 -20524:3:2123 -20525:3:2124 -20526:3:2132 -20527:3:2137 -20528:3:2141 -20529:3:2142 -20530:3:2149 -20531:3:2150 -20532:3:2161 -20533:3:2169 -20534:3:2170 -20535:3:2174 -20536:3:2179 -20537:3:2180 -20538:0:2565 -20539:3:2192 -20540:0:2565 -20541:2:469 -20542:0:2565 -20543:3:2013 -20544:0:2565 -20545:2:475 -20546:0:2565 -20547:2:476 -20548:0:2565 -20549:1:435 -20550:0:2565 -20551:3:2014 -20552:0:2565 -20553:3:2015 -20554:3:2019 -20555:3:2020 -20556:3:2028 -20557:3:2029 -20558:3:2033 -20559:3:2034 -20560:3:2042 -20561:3:2047 -20562:3:2051 -20563:3:2052 -20564:3:2059 -20565:3:2060 -20566:3:2071 -20567:3:2079 -20568:3:2080 -20569:3:2084 -20570:3:2089 -20571:3:2090 -20572:0:2565 -20573:3:2102 -20574:0:2565 -20575:3:2104 -20576:0:2565 -20577:3:2105 -20578:3:2109 -20579:3:2110 -20580:3:2118 -20581:3:2119 -20582:3:2123 -20583:3:2124 -20584:3:2132 -20585:3:2137 -20586:3:2141 -20587:3:2142 -20588:3:2149 -20589:3:2150 -20590:3:2161 -20591:3:2169 -20592:3:2170 -20593:3:2174 -20594:3:2179 -20595:3:2180 -20596:0:2565 -20597:3:2192 -20598:0:2565 -20599:3:2013 -20600:0:2565 -20601:1:434 -20602:0:2565 -20603:3:2014 -20604:0:2565 -20605:3:2015 -20606:3:2019 -20607:3:2020 -20608:3:2028 -20609:3:2029 -20610:3:2033 -20611:3:2034 -20612:3:2042 -20613:3:2047 -20614:3:2051 -20615:3:2052 -20616:3:2059 -20617:3:2060 -20618:3:2071 -20619:3:2079 -20620:3:2080 -20621:3:2084 -20622:3:2089 -20623:3:2090 -20624:0:2565 -20625:3:2102 -20626:0:2565 -20627:3:2104 -20628:0:2565 -20629:3:2105 -20630:3:2109 -20631:3:2110 -20632:3:2118 -20633:3:2119 -20634:3:2123 -20635:3:2124 -20636:3:2132 -20637:3:2137 -20638:3:2141 -20639:3:2142 -20640:3:2149 -20641:3:2150 -20642:3:2161 -20643:3:2169 -20644:3:2170 -20645:3:2174 -20646:3:2179 -20647:3:2180 -20648:0:2565 -20649:3:2192 -20650:0:2565 -20651:2:477 -20652:2:481 -20653:2:482 -20654:2:490 -20655:2:491 -20656:2:495 -20657:2:496 -20658:2:504 -20659:2:509 -20660:2:513 -20661:2:514 -20662:2:521 -20663:2:522 -20664:2:533 -20665:2:534 -20666:2:535 -20667:2:546 -20668:2:551 -20669:2:552 -20670:0:2565 -20671:3:2013 -20672:0:2565 -20673:1:435 -20674:0:2565 -20675:3:2014 -20676:0:2565 -20677:3:2015 -20678:3:2019 -20679:3:2020 -20680:3:2028 -20681:3:2029 -20682:3:2033 -20683:3:2034 -20684:3:2042 -20685:3:2047 -20686:3:2051 -20687:3:2052 -20688:3:2059 -20689:3:2060 -20690:3:2071 -20691:3:2079 -20692:3:2080 -20693:3:2084 -20694:3:2089 -20695:3:2090 -20696:0:2565 -20697:3:2102 -20698:0:2565 -20699:3:2104 -20700:0:2565 -20701:3:2105 -20702:3:2109 -20703:3:2110 -20704:3:2118 -20705:3:2119 -20706:3:2123 -20707:3:2124 -20708:3:2132 -20709:3:2137 -20710:3:2141 -20711:3:2142 -20712:3:2149 -20713:3:2150 -20714:3:2161 -20715:3:2169 -20716:3:2170 -20717:3:2174 -20718:3:2179 -20719:3:2180 -20720:0:2565 -20721:3:2192 -20722:0:2565 -20723:3:2013 -20724:0:2565 -20725:1:434 -20726:0:2565 -20727:3:2014 -20728:0:2565 -20729:3:2015 -20730:3:2019 -20731:3:2020 -20732:3:2028 -20733:3:2029 -20734:3:2033 -20735:3:2034 -20736:3:2042 -20737:3:2047 -20738:3:2051 -20739:3:2052 -20740:3:2059 -20741:3:2060 -20742:3:2071 -20743:3:2079 -20744:3:2080 -20745:3:2084 -20746:3:2089 -20747:3:2090 -20748:0:2565 -20749:3:2102 -20750:0:2565 -20751:3:2104 -20752:0:2565 -20753:3:2105 -20754:3:2109 -20755:3:2110 -20756:3:2118 -20757:3:2119 -20758:3:2123 -20759:3:2124 -20760:3:2132 -20761:3:2137 -20762:3:2141 -20763:3:2142 -20764:3:2149 -20765:3:2150 -20766:3:2161 -20767:3:2169 -20768:3:2170 -20769:3:2174 -20770:3:2179 -20771:3:2180 -20772:0:2565 -20773:3:2192 -20774:0:2565 -20775:2:564 -20776:0:2565 -20777:3:2013 -20778:0:2565 -20779:1:435 -20780:0:2565 -20781:3:2014 -20782:0:2565 -20783:3:2015 -20784:3:2019 -20785:3:2020 -20786:3:2028 -20787:3:2029 -20788:3:2033 -20789:3:2034 -20790:3:2042 -20791:3:2047 -20792:3:2051 -20793:3:2052 -20794:3:2059 -20795:3:2060 -20796:3:2071 -20797:3:2079 -20798:3:2080 -20799:3:2084 -20800:3:2089 -20801:3:2090 -20802:0:2565 -20803:3:2102 -20804:0:2565 -20805:3:2104 -20806:0:2565 -20807:3:2105 -20808:3:2109 -20809:3:2110 -20810:3:2118 -20811:3:2119 -20812:3:2123 -20813:3:2124 -20814:3:2132 -20815:3:2137 -20816:3:2141 -20817:3:2142 -20818:3:2149 -20819:3:2150 -20820:3:2161 -20821:3:2169 -20822:3:2170 -20823:3:2174 -20824:3:2179 -20825:3:2180 -20826:0:2565 -20827:3:2192 -20828:0:2565 -20829:3:2013 -20830:0:2565 -20831:2:565 -20832:2:569 -20833:2:570 -20834:2:578 -20835:2:579 -20836:2:583 -20837:2:584 -20838:2:592 -20839:2:597 -20840:2:601 -20841:2:602 -20842:2:609 -20843:2:610 -20844:2:621 -20845:2:622 -20846:2:623 -20847:2:634 -20848:2:639 -20849:2:640 -20850:0:2565 -20851:3:2014 -20852:0:2565 -20853:3:2015 -20854:3:2019 -20855:3:2020 -20856:3:2028 -20857:3:2029 -20858:3:2033 -20859:3:2034 -20860:3:2042 -20861:3:2047 -20862:3:2051 -20863:3:2052 -20864:3:2059 -20865:3:2060 -20866:3:2071 -20867:3:2079 -20868:3:2080 -20869:3:2084 -20870:3:2089 -20871:3:2090 -20872:0:2565 -20873:3:2102 -20874:0:2565 -20875:1:434 -20876:0:2565 -20877:2:744 -20878:0:2565 -20879:1:435 -20880:0:2565 -20881:3:2104 -20882:0:2565 -20883:3:2105 -20884:3:2109 -20885:3:2110 -20886:3:2118 -20887:3:2119 -20888:3:2123 -20889:3:2124 -20890:3:2132 -20891:3:2137 -20892:3:2141 -20893:3:2142 -20894:3:2149 -20895:3:2150 -20896:3:2161 -20897:3:2169 -20898:3:2170 -20899:3:2174 -20900:3:2179 -20901:3:2180 -20902:0:2565 -20903:3:2192 -20904:0:2565 -20905:3:2013 -20906:0:2565 -20907:3:2014 -20908:0:2565 -20909:3:2015 -20910:3:2019 -20911:3:2020 -20912:3:2028 -20913:3:2029 -20914:3:2033 -20915:3:2034 -20916:3:2042 -20917:3:2047 -20918:3:2051 -20919:3:2052 -20920:3:2059 -20921:3:2060 -20922:3:2071 -20923:3:2079 -20924:3:2080 -20925:3:2084 -20926:3:2089 -20927:3:2090 -20928:0:2565 -20929:3:2102 -20930:0:2565 -20931:1:434 -20932:0:2565 -20933:3:2104 -20934:0:2565 -20935:3:2105 -20936:3:2109 -20937:3:2110 -20938:3:2118 -20939:3:2119 -20940:3:2123 -20941:3:2124 -20942:3:2132 -20943:3:2137 -20944:3:2141 -20945:3:2142 -20946:3:2149 -20947:3:2150 -20948:3:2161 -20949:3:2169 -20950:3:2170 -20951:3:2174 -20952:3:2179 -20953:3:2180 -20954:0:2565 -20955:3:2192 -20956:0:2565 -20957:3:2013 -20958:0:2565 -20959:3:2014 -20960:0:2565 -20961:3:2015 -20962:3:2019 -20963:3:2020 -20964:3:2028 -20965:3:2029 -20966:3:2033 -20967:3:2034 -20968:3:2042 -20969:3:2047 -20970:3:2051 -20971:3:2052 -20972:3:2059 -20973:3:2060 -20974:3:2071 -20975:3:2079 -20976:3:2080 -20977:3:2084 -20978:3:2089 -20979:3:2090 -20980:0:2565 -20981:2:745 -20982:0:2565 -20983:3:2102 -20984:0:2565 -20985:2:750 -20986:0:2565 -20987:2:753 -20988:0:2565 -20989:1:435 -20990:0:2565 -20991:3:2104 -20992:0:2565 -20993:3:2105 -20994:3:2109 -20995:3:2110 -20996:3:2118 -20997:3:2119 -20998:3:2123 -20999:3:2124 -21000:3:2132 -21001:3:2137 -21002:3:2141 -21003:3:2142 -21004:3:2149 -21005:3:2150 -21006:3:2161 -21007:3:2169 -21008:3:2170 -21009:3:2174 -21010:3:2179 -21011:3:2180 -21012:0:2565 -21013:3:2192 -21014:0:2565 -21015:3:2013 -21016:0:2565 -21017:3:2014 -21018:0:2565 -21019:3:2015 -21020:3:2019 -21021:3:2020 -21022:3:2028 -21023:3:2029 -21024:3:2033 -21025:3:2034 -21026:3:2042 -21027:3:2047 -21028:3:2051 -21029:3:2052 -21030:3:2059 -21031:3:2060 -21032:3:2071 -21033:3:2079 -21034:3:2080 -21035:3:2084 -21036:3:2089 -21037:3:2090 -21038:0:2565 -21039:3:2102 -21040:0:2565 -21041:1:434 -21042:0:2565 -21043:3:2104 -21044:0:2565 -21045:3:2105 -21046:3:2109 -21047:3:2110 -21048:3:2118 -21049:3:2119 -21050:3:2123 -21051:3:2124 -21052:3:2132 -21053:3:2137 -21054:3:2141 -21055:3:2142 -21056:3:2149 -21057:3:2150 -21058:3:2161 -21059:3:2169 -21060:3:2170 -21061:3:2174 -21062:3:2179 -21063:3:2180 -21064:0:2565 -21065:3:2192 -21066:0:2565 -21067:3:2013 -21068:0:2565 -21069:3:2014 -21070:0:2565 -21071:3:2015 -21072:3:2019 -21073:3:2020 -21074:3:2028 -21075:3:2029 -21076:3:2033 -21077:3:2034 -21078:3:2042 -21079:3:2047 -21080:3:2051 -21081:3:2052 -21082:3:2059 -21083:3:2060 -21084:3:2071 -21085:3:2079 -21086:3:2080 -21087:3:2084 -21088:3:2089 -21089:3:2090 -21090:0:2565 -21091:2:758 -21092:0:2565 -21093:3:2102 -21094:0:2565 -21095:1:435 -21096:0:2565 -21097:3:2104 -21098:0:2565 -21099:3:2105 -21100:3:2109 -21101:3:2110 -21102:3:2118 -21103:3:2119 -21104:3:2123 -21105:3:2124 -21106:3:2132 -21107:3:2137 -21108:3:2141 -21109:3:2142 -21110:3:2149 -21111:3:2150 -21112:3:2161 -21113:3:2169 -21114:3:2170 -21115:3:2174 -21116:3:2179 -21117:3:2180 -21118:0:2565 -21119:3:2192 -21120:0:2565 -21121:3:2013 -21122:0:2565 -21123:3:2014 -21124:0:2565 -21125:3:2015 -21126:3:2019 -21127:3:2020 -21128:3:2028 -21129:3:2029 -21130:3:2033 -21131:3:2034 -21132:3:2042 -21133:3:2047 -21134:3:2051 -21135:3:2052 -21136:3:2059 -21137:3:2060 -21138:3:2071 -21139:3:2079 -21140:3:2080 -21141:3:2084 -21142:3:2089 -21143:3:2090 -21144:0:2565 -21145:3:2102 -21146:0:2565 -21147:1:434 -21148:0:2565 -21149:3:2104 -21150:0:2565 -21151:3:2105 -21152:3:2109 -21153:3:2110 -21154:3:2118 -21155:3:2119 -21156:3:2123 -21157:3:2124 -21158:3:2132 -21159:3:2137 -21160:3:2141 -21161:3:2142 -21162:3:2149 -21163:3:2150 -21164:3:2161 -21165:3:2169 -21166:3:2170 -21167:3:2174 -21168:3:2179 -21169:3:2180 -21170:0:2565 -21171:3:2192 -21172:0:2565 -21173:3:2013 -21174:0:2565 -21175:3:2014 -21176:0:2565 -21177:3:2015 -21178:3:2019 -21179:3:2020 -21180:3:2028 -21181:3:2029 -21182:3:2033 -21183:3:2034 -21184:3:2042 -21185:3:2047 -21186:3:2051 -21187:3:2052 -21188:3:2059 -21189:3:2060 -21190:3:2071 -21191:3:2079 -21192:3:2080 -21193:3:2084 -21194:3:2089 -21195:3:2090 -21196:0:2565 -21197:2:759 -21198:0:2565 -21199:3:2102 -21200:0:2565 -21201:1:435 -21202:0:2565 -21203:3:2104 -21204:0:2565 -21205:3:2105 -21206:3:2109 -21207:3:2110 -21208:3:2118 -21209:3:2119 -21210:3:2123 -21211:3:2124 -21212:3:2132 -21213:3:2137 -21214:3:2141 -21215:3:2142 -21216:3:2149 -21217:3:2150 -21218:3:2161 -21219:3:2169 -21220:3:2170 -21221:3:2174 -21222:3:2179 -21223:3:2180 -21224:0:2565 -21225:3:2192 -21226:0:2565 -21227:3:2013 -21228:0:2565 -21229:3:2014 -21230:0:2565 -21231:3:2015 -21232:3:2019 -21233:3:2020 -21234:3:2028 -21235:3:2029 -21236:3:2033 -21237:3:2034 -21238:3:2042 -21239:3:2047 -21240:3:2051 -21241:3:2052 -21242:3:2059 -21243:3:2060 -21244:3:2071 -21245:3:2079 -21246:3:2080 -21247:3:2084 -21248:3:2089 -21249:3:2090 -21250:0:2565 -21251:3:2102 -21252:0:2565 -21253:2:760 -21254:0:2565 -21255:2:761 -21256:0:2565 -21257:2:762 -21258:0:2565 -21259:3:2104 -21260:0:2565 -21261:3:2105 -21262:3:2109 -21263:3:2110 -21264:3:2118 -21265:3:2119 -21266:3:2123 -21267:3:2124 -21268:3:2132 -21269:3:2137 -21270:3:2141 -21271:3:2142 -21272:3:2149 -21273:3:2150 -21274:3:2161 -21275:3:2169 -21276:3:2170 -21277:3:2174 -21278:3:2179 -21279:3:2180 -21280:0:2565 -21281:3:2192 -21282:0:2565 -21283:1:434 -21284:0:2565 -21285:3:2013 -21286:0:2565 -21287:2:763 -21288:0:2565 -21289:1:435 -21290:0:2565 -21291:3:2014 -21292:0:2565 -21293:3:2015 -21294:3:2019 -21295:3:2020 -21296:3:2028 -21297:3:2029 -21298:3:2033 -21299:3:2034 -21300:3:2042 -21301:3:2047 -21302:3:2051 -21303:3:2052 -21304:3:2059 -21305:3:2060 -21306:3:2071 -21307:3:2079 -21308:3:2080 -21309:3:2084 -21310:3:2089 -21311:3:2090 -21312:0:2565 -21313:3:2102 -21314:0:2565 -21315:3:2104 -21316:0:2565 -21317:3:2105 -21318:3:2109 -21319:3:2110 -21320:3:2118 -21321:3:2119 -21322:3:2123 -21323:3:2124 -21324:3:2132 -21325:3:2137 -21326:3:2141 -21327:3:2142 -21328:3:2149 -21329:3:2150 -21330:3:2161 -21331:3:2169 -21332:3:2170 -21333:3:2174 -21334:3:2179 -21335:3:2180 -21336:0:2565 -21337:3:2192 -21338:0:2565 -21339:3:2013 -21340:0:2565 -21341:1:434 -21342:0:2565 -21343:3:2014 -21344:0:2565 -21345:3:2015 -21346:3:2019 -21347:3:2020 -21348:3:2028 -21349:3:2029 -21350:3:2033 -21351:3:2034 -21352:3:2042 -21353:3:2047 -21354:3:2051 -21355:3:2052 -21356:3:2059 -21357:3:2060 -21358:3:2071 -21359:3:2079 -21360:3:2080 -21361:3:2084 -21362:3:2089 -21363:3:2090 -21364:0:2565 -21365:3:2102 -21366:0:2565 -21367:3:2104 -21368:0:2565 -21369:3:2105 -21370:3:2109 -21371:3:2110 -21372:3:2118 -21373:3:2119 -21374:3:2123 -21375:3:2124 -21376:3:2132 -21377:3:2137 -21378:3:2141 -21379:3:2142 -21380:3:2149 -21381:3:2150 -21382:3:2161 -21383:3:2169 -21384:3:2170 -21385:3:2174 -21386:3:2179 -21387:3:2180 -21388:0:2565 -21389:3:2192 -21390:0:2565 -21391:2:765 -21392:0:2565 -21393:3:2013 -21394:0:2565 -21395:1:435 -21396:0:2565 -21397:3:2014 -21398:0:2565 -21399:3:2015 -21400:3:2019 -21401:3:2020 -21402:3:2028 -21403:3:2029 -21404:3:2033 -21405:3:2034 -21406:3:2042 -21407:3:2047 -21408:3:2051 -21409:3:2052 -21410:3:2059 -21411:3:2060 -21412:3:2071 -21413:3:2079 -21414:3:2080 -21415:3:2084 -21416:3:2089 -21417:3:2090 -21418:0:2565 -21419:3:2102 -21420:0:2565 -21421:3:2104 -21422:0:2565 -21423:3:2105 -21424:3:2109 -21425:3:2110 -21426:3:2118 -21427:3:2119 -21428:3:2123 -21429:3:2124 -21430:3:2132 -21431:3:2137 -21432:3:2141 -21433:3:2142 -21434:3:2149 -21435:3:2150 -21436:3:2161 -21437:3:2169 -21438:3:2170 -21439:3:2174 -21440:3:2179 -21441:3:2180 -21442:0:2565 -21443:3:2192 -21444:0:2565 -21445:3:2013 -21446:0:2565 -21447:2:766 -21448:2:770 -21449:2:771 -21450:2:779 -21451:2:788 -21452:2:789 -21453:2:793 -21454:2:798 -21455:2:802 -21456:2:803 -21457:2:810 -21458:2:811 -21459:2:822 -21460:2:823 -21461:2:826 -21462:2:827 -21463:2:835 -21464:2:840 -21465:2:841 -21466:0:2565 -21467:3:2014 -21468:0:2565 -21469:3:2015 -21470:3:2019 -21471:3:2020 -21472:3:2028 -21473:3:2029 -21474:3:2033 -21475:3:2034 -21476:3:2042 -21477:3:2047 -21478:3:2051 -21479:3:2052 -21480:3:2059 -21481:3:2060 -21482:3:2071 -21483:3:2079 -21484:3:2080 -21485:3:2084 -21486:3:2089 -21487:3:2090 -21488:0:2565 -21489:3:2102 -21490:0:2565 -21491:3:2104 -21492:0:2565 -21493:3:2105 -21494:3:2109 -21495:3:2110 -21496:3:2118 -21497:3:2119 -21498:3:2123 -21499:3:2124 -21500:3:2132 -21501:3:2137 -21502:3:2141 -21503:3:2142 -21504:3:2149 -21505:3:2150 -21506:3:2161 -21507:3:2169 -21508:3:2170 -21509:3:2174 -21510:3:2179 -21511:3:2180 -21512:0:2565 -21513:3:2192 -21514:0:2565 -21515:2:853 -21516:0:2565 -21517:3:2013 -21518:0:2565 -21519:2:857 -21520:0:2565 -21521:2:465 -21522:0:2565 -21523:3:2014 -21524:0:2565 -21525:3:2015 -21526:3:2019 -21527:3:2020 -21528:3:2028 -21529:3:2029 -21530:3:2033 -21531:3:2034 -21532:3:2042 -21533:3:2047 -21534:3:2051 -21535:3:2052 -21536:3:2059 -21537:3:2060 -21538:3:2071 -21539:3:2079 -21540:3:2080 -21541:3:2084 -21542:3:2089 -21543:3:2090 -21544:0:2565 -21545:3:2102 -21546:0:2565 -21547:3:2104 -21548:0:2565 -21549:3:2105 -21550:3:2109 -21551:3:2110 -21552:3:2118 -21553:3:2119 -21554:3:2123 -21555:3:2124 -21556:3:2132 -21557:3:2137 -21558:3:2141 -21559:3:2142 -21560:3:2149 -21561:3:2150 -21562:3:2161 -21563:3:2169 -21564:3:2170 -21565:3:2174 -21566:3:2179 -21567:3:2180 -21568:0:2565 -21569:3:2192 -21570:0:2565 -21571:2:466 -21572:0:2565 -21573:3:2013 -21574:0:2565 -21575:3:2014 -21576:0:2565 -21577:3:2015 -21578:3:2019 -21579:3:2020 -21580:3:2028 -21581:3:2029 -21582:3:2033 -21583:3:2034 -21584:3:2042 -21585:3:2047 -21586:3:2051 -21587:3:2052 -21588:3:2059 -21589:3:2060 -21590:3:2071 -21591:3:2079 -21592:3:2080 -21593:3:2084 -21594:3:2089 -21595:3:2090 -21596:0:2565 -21597:3:2102 -21598:0:2565 -21599:3:2104 -21600:0:2565 -21601:3:2105 -21602:3:2109 -21603:3:2110 -21604:3:2118 -21605:3:2119 -21606:3:2123 -21607:3:2124 -21608:3:2132 -21609:3:2137 -21610:3:2141 -21611:3:2142 -21612:3:2149 -21613:3:2150 -21614:3:2161 -21615:3:2169 -21616:3:2170 -21617:3:2174 -21618:3:2179 -21619:3:2180 -21620:0:2565 -21621:2:467 -21622:0:2565 -21623:3:2192 -21624:0:2565 -21625:3:2013 -21626:0:2565 -21627:3:2014 -21628:0:2565 -21629:3:2015 -21630:3:2019 -21631:3:2020 -21632:3:2028 -21633:3:2029 -21634:3:2033 -21635:3:2034 -21636:3:2042 -21637:3:2047 -21638:3:2051 -21639:3:2052 -21640:3:2059 -21641:3:2060 -21642:3:2071 -21643:3:2079 -21644:3:2080 -21645:3:2084 -21646:3:2089 -21647:3:2090 -21648:0:2565 -21649:3:2102 -21650:0:2565 -21651:3:2104 -21652:0:2565 -21653:1:436 -21654:0:2565 -21655:2:468 -21656:0:2565 -21657:3:2105 -21658:3:2109 -21659:3:2110 -21660:3:2118 -21661:3:2119 -21662:3:2123 -21663:3:2124 -21664:3:2132 -21665:3:2137 -21666:3:2141 -21667:3:2142 -21668:3:2149 -21669:3:2150 -21670:3:2161 -21671:3:2169 -21672:3:2170 -21673:3:2174 -21674:3:2179 -21675:3:2180 -21676:0:2565 -21677:3:2192 -21678:0:2565 -21679:3:2013 -21680:0:2565 -21681:3:2014 -21682:0:2565 -21683:3:2015 -21684:3:2019 -21685:3:2020 -21686:3:2028 -21687:3:2029 -21688:3:2033 -21689:3:2034 -21690:3:2042 -21691:3:2047 -21692:3:2051 -21693:3:2052 -21694:3:2059 -21695:3:2060 -21696:3:2071 -21697:3:2079 -21698:3:2080 -21699:3:2084 -21700:3:2089 -21701:3:2090 -21702:0:2565 -21703:3:2102 -21704:0:2565 -21705:3:2104 -21706:0:2565 -21707:2:467 -21708:0:2565 -21709:2:468 -21710:0:2565 -21711:3:2105 -21712:3:2109 -21713:3:2110 -21714:3:2118 -21715:3:2119 -21716:3:2123 -21717:3:2124 -21718:3:2132 -21719:3:2137 -21720:3:2141 -21721:3:2142 -21722:3:2149 -21723:3:2150 -21724:3:2161 -21725:3:2169 -21726:3:2170 -21727:3:2174 -21728:3:2179 -21729:3:2180 -21730:0:2565 -21731:3:2192 -21732:0:2565 -21733:3:2013 -21734:0:2565 -21735:3:2014 -21736:0:2565 -21737:3:2015 -21738:3:2019 -21739:3:2020 -21740:3:2028 -21741:3:2029 -21742:3:2033 -21743:3:2034 -21744:3:2042 -21745:3:2047 -21746:3:2051 -21747:3:2052 -21748:3:2059 -21749:3:2060 -21750:3:2071 -21751:3:2079 -21752:3:2080 -21753:3:2084 -21754:3:2089 -21755:3:2090 -21756:0:2565 -21757:3:2102 -21758:0:2565 -21759:2:467 -21760:0:2565 -21761:1:442 -21762:0:2565 -21763:2:468 -21764:0:2565 -21765:1:446 -21766:0:2565 -21767:1:9 -21768:0:2565 -21769:1:10 -21770:0:2565 -21771:1:11 -21772:0:2565 -21773:3:2104 -21774:0:2565 -21775:3:2105 -21776:3:2109 -21777:3:2110 -21778:3:2118 -21779:3:2119 -21780:3:2123 -21781:3:2124 -21782:3:2132 -21783:3:2137 -21784:3:2141 -21785:3:2142 -21786:3:2149 -21787:3:2150 -21788:3:2161 -21789:3:2169 -21790:3:2170 -21791:3:2174 -21792:3:2179 -21793:3:2180 -21794:0:2565 -21795:3:2192 -21796:0:2565 -21797:3:2013 -21798:0:2565 -21799:3:2014 -21800:0:2565 -21801:3:2015 -21802:3:2019 -21803:3:2020 -21804:3:2028 -21805:3:2029 -21806:3:2033 -21807:3:2034 -21808:3:2042 -21809:3:2047 -21810:3:2051 -21811:3:2052 -21812:3:2059 -21813:3:2060 -21814:3:2071 -21815:3:2079 -21816:3:2080 -21817:3:2084 -21818:3:2089 -21819:3:2090 -21820:0:2565 -21821:3:2102 -21822:0:2565 -21823:2:467 -21824:0:2565 -21825:2:468 -21826:0:2565 -21827:3:2104 -21828:0:2565 -21829:3:2105 -21830:3:2109 -21831:3:2110 -21832:3:2118 -21833:3:2119 -21834:3:2123 -21835:3:2124 -21836:3:2132 -21837:3:2137 -21838:3:2141 -21839:3:2142 -21840:3:2149 -21841:3:2150 -21842:3:2161 -21843:3:2169 -21844:3:2170 -21845:3:2174 -21846:3:2179 -21847:3:2180 -21848:0:2565 -21849:3:2192 -21850:0:2565 -21851:3:2013 -21852:0:2565 -21853:3:2014 -21854:0:2565 -21855:3:2015 -21856:3:2019 -21857:3:2020 -21858:3:2028 -21859:3:2029 -21860:3:2033 -21861:3:2034 -21862:3:2042 -21863:3:2047 -21864:3:2051 -21865:3:2052 -21866:3:2059 -21867:3:2060 -21868:3:2071 -21869:3:2079 -21870:3:2080 -21871:3:2084 -21872:3:2089 -21873:3:2090 -21874:0:2565 -21875:2:467 -21876:0:2565 -21877:1:12 -21878:1:16 -21879:1:17 -21880:1:25 -21881:1:26 -21882:1:27 -21883:1:39 -21884:1:44 -21885:1:48 -21886:1:49 -21887:1:56 -21888:1:57 -21889:1:68 -21890:1:69 -21891:1:70 -21892:1:81 -21893:1:86 -21894:1:87 -21895:0:2565 -21896:3:2102 -21897:0:2565 -21898:3:2104 -21899:0:2565 -21900:1:99 -21901:0:2565 -21902:3:2105 -21903:3:2109 -21904:3:2110 -21905:3:2118 -21906:3:2119 -21907:3:2123 -21908:3:2124 -21909:3:2132 -21910:3:2137 -21911:3:2141 -21912:3:2142 -21913:3:2149 -21914:3:2150 -21915:3:2161 -21916:3:2169 -21917:3:2170 -21918:3:2174 -21919:3:2179 -21920:3:2180 -21921:0:2565 -21922:1:100 -21923:0:2565 -21924:3:2192 -21925:0:2565 -21926:3:2013 -21927:0:2565 -21928:2:468 -21929:0:2565 -21930:1:101 -21931:0:2565 -21932:3:2014 -21933:0:2565 -21934:3:2015 -21935:3:2019 -21936:3:2020 -21937:3:2028 -21938:3:2029 -21939:3:2033 -21940:3:2034 -21941:3:2042 -21942:3:2047 -21943:3:2051 -21944:3:2052 -21945:3:2059 -21946:3:2060 -21947:3:2071 -21948:3:2079 -21949:3:2080 -21950:3:2084 -21951:3:2089 -21952:3:2090 -21953:0:2565 -21954:3:2102 -21955:0:2565 -21956:3:2104 -21957:0:2565 -21958:3:2105 -21959:3:2109 -21960:3:2110 -21961:3:2118 -21962:3:2119 -21963:3:2123 -21964:3:2124 -21965:3:2132 -21966:3:2137 -21967:3:2141 -21968:3:2142 -21969:3:2149 -21970:3:2150 -21971:3:2161 -21972:3:2169 -21973:3:2170 -21974:3:2174 -21975:3:2179 -21976:3:2180 -21977:0:2565 -21978:3:2192 -21979:0:2565 -21980:3:2013 -21981:0:2565 -21982:1:100 -21983:0:2565 -21984:3:2014 -21985:0:2565 -21986:3:2015 -21987:3:2019 -21988:3:2020 -21989:3:2028 -21990:3:2029 -21991:3:2033 -21992:3:2034 -21993:3:2042 -21994:3:2047 -21995:3:2051 -21996:3:2052 -21997:3:2059 -21998:3:2060 -21999:3:2071 -22000:3:2079 -22001:3:2080 -22002:3:2084 -22003:3:2089 -22004:3:2090 -22005:0:2565 -22006:3:2102 -22007:0:2565 -22008:3:2104 -22009:0:2565 -22010:3:2105 -22011:3:2109 -22012:3:2110 -22013:3:2118 -22014:3:2119 -22015:3:2123 -22016:3:2124 -22017:3:2132 -22018:3:2137 -22019:3:2141 -22020:3:2142 -22021:3:2149 -22022:3:2150 -22023:3:2161 -22024:3:2169 -22025:3:2170 -22026:3:2174 -22027:3:2179 -22028:3:2180 -22029:0:2565 -22030:3:2192 -22031:0:2565 -22032:2:469 -22033:0:2565 -22034:3:2013 -22035:0:2565 -22036:2:475 -22037:0:2565 -22038:2:476 -22039:0:2565 -22040:1:101 -22041:0:2565 -22042:3:2014 -22043:0:2565 -22044:3:2015 -22045:3:2019 -22046:3:2020 -22047:3:2028 -22048:3:2029 -22049:3:2033 -22050:3:2034 -22051:3:2042 -22052:3:2047 -22053:3:2051 -22054:3:2052 -22055:3:2059 -22056:3:2060 -22057:3:2071 -22058:3:2079 -22059:3:2080 -22060:3:2084 -22061:3:2089 -22062:3:2090 -22063:0:2565 -22064:3:2102 -22065:0:2565 -22066:3:2104 -22067:0:2565 -22068:3:2105 -22069:3:2109 -22070:3:2110 -22071:3:2118 -22072:3:2119 -22073:3:2123 -22074:3:2124 -22075:3:2132 -22076:3:2137 -22077:3:2141 -22078:3:2142 -22079:3:2149 -22080:3:2150 -22081:3:2161 -22082:3:2169 -22083:3:2170 -22084:3:2174 -22085:3:2179 -22086:3:2180 -22087:0:2565 -22088:3:2192 -22089:0:2565 -22090:3:2013 -22091:0:2565 -22092:1:100 -22093:0:2565 -22094:3:2014 -22095:0:2565 -22096:3:2015 -22097:3:2019 -22098:3:2020 -22099:3:2028 -22100:3:2029 -22101:3:2033 -22102:3:2034 -22103:3:2042 -22104:3:2047 -22105:3:2051 -22106:3:2052 -22107:3:2059 -22108:3:2060 -22109:3:2071 -22110:3:2079 -22111:3:2080 -22112:3:2084 -22113:3:2089 -22114:3:2090 -22115:0:2565 -22116:3:2102 -22117:0:2565 -22118:3:2104 -22119:0:2565 -22120:3:2105 -22121:3:2109 -22122:3:2110 -22123:3:2118 -22124:3:2119 -22125:3:2123 -22126:3:2124 -22127:3:2132 -22128:3:2137 -22129:3:2141 -22130:3:2142 -22131:3:2149 -22132:3:2150 -22133:3:2161 -22134:3:2169 -22135:3:2170 -22136:3:2174 -22137:3:2179 -22138:3:2180 -22139:0:2565 -22140:3:2192 -22141:0:2565 -22142:2:477 -22143:2:481 -22144:2:482 -22145:2:490 -22146:2:491 -22147:2:495 -22148:2:496 -22149:2:504 -22150:2:509 -22151:2:513 -22152:2:514 -22153:2:521 -22154:2:522 -22155:2:533 -22156:2:534 -22157:2:535 -22158:2:546 -22159:2:551 -22160:2:552 -22161:0:2565 -22162:3:2013 -22163:0:2565 -22164:1:101 -22165:0:2565 -22166:3:2014 -22167:0:2565 -22168:3:2015 -22169:3:2019 -22170:3:2020 -22171:3:2028 -22172:3:2029 -22173:3:2033 -22174:3:2034 -22175:3:2042 -22176:3:2047 -22177:3:2051 -22178:3:2052 -22179:3:2059 -22180:3:2060 -22181:3:2071 -22182:3:2079 -22183:3:2080 -22184:3:2084 -22185:3:2089 -22186:3:2090 -22187:0:2565 -22188:3:2102 -22189:0:2565 -22190:3:2104 -22191:0:2565 -22192:3:2105 -22193:3:2109 -22194:3:2110 -22195:3:2118 -22196:3:2119 -22197:3:2123 -22198:3:2124 -22199:3:2132 -22200:3:2137 -22201:3:2141 -22202:3:2142 -22203:3:2149 -22204:3:2150 -22205:3:2161 -22206:3:2169 -22207:3:2170 -22208:3:2174 -22209:3:2179 -22210:3:2180 -22211:0:2565 -22212:3:2192 -22213:0:2565 -22214:3:2013 -22215:0:2565 -22216:1:100 -22217:0:2565 -22218:3:2014 -22219:0:2565 -22220:3:2015 -22221:3:2019 -22222:3:2020 -22223:3:2028 -22224:3:2029 -22225:3:2033 -22226:3:2034 -22227:3:2042 -22228:3:2047 -22229:3:2051 -22230:3:2052 -22231:3:2059 -22232:3:2060 -22233:3:2071 -22234:3:2079 -22235:3:2080 -22236:3:2084 -22237:3:2089 -22238:3:2090 -22239:0:2565 -22240:3:2102 -22241:0:2565 -22242:3:2104 -22243:0:2565 -22244:3:2105 -22245:3:2109 -22246:3:2110 -22247:3:2118 -22248:3:2119 -22249:3:2123 -22250:3:2124 -22251:3:2132 -22252:3:2137 -22253:3:2141 -22254:3:2142 -22255:3:2149 -22256:3:2150 -22257:3:2161 -22258:3:2169 -22259:3:2170 -22260:3:2174 -22261:3:2179 -22262:3:2180 -22263:0:2565 -22264:3:2192 -22265:0:2565 -22266:2:564 -22267:0:2565 -22268:3:2013 -22269:0:2565 -22270:1:101 -22271:0:2565 -22272:3:2014 -22273:0:2565 -22274:3:2015 -22275:3:2019 -22276:3:2020 -22277:3:2028 -22278:3:2029 -22279:3:2033 -22280:3:2034 -22281:3:2042 -22282:3:2047 -22283:3:2051 -22284:3:2052 -22285:3:2059 -22286:3:2060 -22287:3:2071 -22288:3:2079 -22289:3:2080 -22290:3:2084 -22291:3:2089 -22292:3:2090 -22293:0:2565 -22294:3:2102 -22295:0:2565 -22296:3:2104 -22297:0:2565 -22298:3:2105 -22299:3:2109 -22300:3:2110 -22301:3:2118 -22302:3:2119 -22303:3:2123 -22304:3:2124 -22305:3:2132 -22306:3:2137 -22307:3:2141 -22308:3:2142 -22309:3:2149 -22310:3:2150 -22311:3:2161 -22312:3:2169 -22313:3:2170 -22314:3:2174 -22315:3:2179 -22316:3:2180 -22317:0:2565 -22318:3:2192 -22319:0:2565 -22320:3:2013 -22321:0:2565 -22322:2:565 -22323:2:569 -22324:2:570 -22325:2:578 -22326:2:579 -22327:2:583 -22328:2:584 -22329:2:592 -22330:2:597 -22331:2:601 -22332:2:602 -22333:2:609 -22334:2:610 -22335:2:621 -22336:2:622 -22337:2:623 -22338:2:634 -22339:2:639 -22340:2:640 -22341:0:2565 -22342:3:2014 -22343:0:2565 -22344:3:2015 -22345:3:2019 -22346:3:2020 -22347:3:2028 -22348:3:2029 -22349:3:2033 -22350:3:2034 -22351:3:2042 -22352:3:2047 -22353:3:2051 -22354:3:2052 -22355:3:2059 -22356:3:2060 -22357:3:2071 -22358:3:2079 -22359:3:2080 -22360:3:2084 -22361:3:2089 -22362:3:2090 -22363:0:2565 -22364:3:2102 -22365:0:2565 -22366:1:100 -22367:0:2565 -22368:2:652 -22369:0:2565 -22370:1:101 -22371:0:2565 -22372:3:2104 -22373:0:2565 -22374:3:2105 -22375:3:2109 -22376:3:2110 -22377:3:2118 -22378:3:2119 -22379:3:2123 -22380:3:2124 -22381:3:2132 -22382:3:2137 -22383:3:2141 -22384:3:2142 -22385:3:2149 -22386:3:2150 -22387:3:2161 -22388:3:2169 -22389:3:2170 -22390:3:2174 -22391:3:2179 -22392:3:2180 -22393:0:2565 -22394:3:2192 -22395:0:2565 -22396:3:2013 -22397:0:2565 -22398:3:2014 -22399:0:2565 -22400:3:2015 -22401:3:2019 -22402:3:2020 -22403:3:2028 -22404:3:2029 -22405:3:2033 -22406:3:2034 -22407:3:2042 -22408:3:2047 -22409:3:2051 -22410:3:2052 -22411:3:2059 -22412:3:2060 -22413:3:2071 -22414:3:2079 -22415:3:2080 -22416:3:2084 -22417:3:2089 -22418:3:2090 -22419:0:2565 -22420:3:2102 -22421:0:2565 -22422:1:100 -22423:0:2565 -22424:3:2104 -22425:0:2565 -22426:3:2105 -22427:3:2109 -22428:3:2110 -22429:3:2118 -22430:3:2119 -22431:3:2123 -22432:3:2124 -22433:3:2132 -22434:3:2137 -22435:3:2141 -22436:3:2142 -22437:3:2149 -22438:3:2150 -22439:3:2161 -22440:3:2169 -22441:3:2170 -22442:3:2174 -22443:3:2179 -22444:3:2180 -22445:0:2565 -22446:3:2192 -22447:0:2565 -22448:3:2013 -22449:0:2565 -22450:3:2014 -22451:0:2565 -22452:3:2015 -22453:3:2019 -22454:3:2020 -22455:3:2028 -22456:3:2029 -22457:3:2033 -22458:3:2034 -22459:3:2042 -22460:3:2047 -22461:3:2051 -22462:3:2052 -22463:3:2059 -22464:3:2060 -22465:3:2071 -22466:3:2079 -22467:3:2080 -22468:3:2084 -22469:3:2089 -22470:3:2090 -22471:0:2565 -22472:2:653 -22473:0:2565 -22474:3:2102 -22475:0:2565 -22476:1:101 -22477:0:2565 -22478:3:2104 -22479:0:2565 -22480:3:2105 -22481:3:2109 -22482:3:2110 -22483:3:2118 -22484:3:2119 -22485:3:2123 -22486:3:2124 -22487:3:2132 -22488:3:2137 -22489:3:2141 -22490:3:2142 -22491:3:2149 -22492:3:2150 -22493:3:2161 -22494:3:2169 -22495:3:2170 -22496:3:2174 -22497:3:2179 -22498:3:2180 -22499:0:2565 -22500:3:2192 -22501:0:2565 -22502:3:2013 -22503:0:2565 -22504:3:2014 -22505:0:2565 -22506:3:2015 -22507:3:2019 -22508:3:2020 -22509:3:2028 -22510:3:2029 -22511:3:2033 -22512:3:2034 -22513:3:2042 -22514:3:2047 -22515:3:2051 -22516:3:2052 -22517:3:2059 -22518:3:2060 -22519:3:2071 -22520:3:2079 -22521:3:2080 -22522:3:2084 -22523:3:2089 -22524:3:2090 -22525:0:2565 -22526:3:2102 -22527:0:2565 -22528:1:100 -22529:0:2565 -22530:3:2104 -22531:0:2565 -22532:3:2105 -22533:3:2109 -22534:3:2110 -22535:3:2118 -22536:3:2119 -22537:3:2123 -22538:3:2124 -22539:3:2132 -22540:3:2137 -22541:3:2141 -22542:3:2142 -22543:3:2149 -22544:3:2150 -22545:3:2161 -22546:3:2169 -22547:3:2170 -22548:3:2174 -22549:3:2179 -22550:3:2180 -22551:0:2565 -22552:3:2192 -22553:0:2565 -22554:3:2013 -22555:0:2565 -22556:3:2014 -22557:0:2565 -22558:3:2015 -22559:3:2019 -22560:3:2020 -22561:3:2028 -22562:3:2029 -22563:3:2033 -22564:3:2034 -22565:3:2042 -22566:3:2047 -22567:3:2051 -22568:3:2052 -22569:3:2059 -22570:3:2060 -22571:3:2071 -22572:3:2079 -22573:3:2080 -22574:3:2084 -22575:3:2089 -22576:3:2090 -22577:0:2565 -22578:2:654 -22579:2:658 -22580:2:659 -22581:2:667 -22582:2:668 -22583:2:672 -22584:2:673 -22585:2:681 -22586:2:686 -22587:2:690 -22588:2:691 -22589:2:698 -22590:2:699 -22591:2:710 -22592:2:711 -22593:2:712 -22594:2:723 -22595:2:728 -22596:2:729 -22597:0:2565 -22598:3:2102 -22599:0:2565 -22600:1:101 -22601:0:2565 -22602:3:2104 -22603:0:2565 -22604:3:2105 -22605:3:2109 -22606:3:2110 -22607:3:2118 -22608:3:2119 -22609:3:2123 -22610:3:2124 -22611:3:2132 -22612:3:2137 -22613:3:2141 -22614:3:2142 -22615:3:2149 -22616:3:2150 -22617:3:2161 -22618:3:2169 -22619:3:2170 -22620:3:2174 -22621:3:2179 -22622:3:2180 -22623:0:2565 -22624:3:2192 -22625:0:2565 -22626:3:2013 -22627:0:2565 -22628:3:2014 -22629:0:2565 -22630:3:2015 -22631:3:2019 -22632:3:2020 -22633:3:2028 -22634:3:2029 -22635:3:2033 -22636:3:2034 -22637:3:2042 -22638:3:2047 -22639:3:2051 -22640:3:2052 -22641:3:2059 -22642:3:2060 -22643:3:2071 -22644:3:2079 -22645:3:2080 -22646:3:2084 -22647:3:2089 -22648:3:2090 -22649:0:2565 -22650:3:2102 -22651:0:2565 -22652:2:741 -22653:0:2565 -22654:2:750 -22655:0:2565 -22656:3:2104 -22657:0:2565 -22658:3:2105 -22659:3:2109 -22660:3:2110 -22661:3:2118 -22662:3:2119 -22663:3:2123 -22664:3:2124 -22665:3:2132 -22666:3:2137 -22667:3:2141 -22668:3:2142 -22669:3:2149 -22670:3:2150 -22671:3:2161 -22672:3:2169 -22673:3:2170 -22674:3:2174 -22675:3:2179 -22676:3:2180 -22677:0:2565 -22678:3:2192 -22679:0:2565 -22680:3:2013 -22681:0:2565 -22682:1:100 -22683:0:2565 -22684:2:753 -22685:0:2565 -22686:1:101 -22687:0:2565 -22688:2:758 -22689:0:2565 -22690:2:759 -22691:0:2565 -22692:2:760 -22693:0:2565 -22694:2:761 -22695:0:2565 -22696:2:762 -22697:0:2565 -22698:2:763 -22699:0:2565 -22700:2:765 -22701:0:2565 -22702:2:766 -22703:2:770 -22704:2:771 -22705:2:779 -22706:2:780 -22707:2:781 -22708:2:793 -22709:2:798 -22710:2:802 -22711:2:803 -22712:2:810 -22713:2:811 -22714:2:822 -22715:2:823 -22716:2:824 -22717:2:835 -22718:2:840 -22719:2:841 -22720:0:2565 -22721:3:2014 -22722:0:2565 -22723:3:2015 -22724:3:2019 -22725:3:2020 -22726:3:2028 -22727:3:2029 -22728:3:2033 -22729:3:2034 -22730:3:2042 -22731:3:2047 -22732:3:2051 -22733:3:2052 -22734:3:2059 -22735:3:2060 -22736:3:2071 -22737:3:2079 -22738:3:2080 -22739:3:2084 -22740:3:2089 -22741:3:2090 -22742:0:2565 -22743:3:2102 -22744:0:2565 -22745:3:2104 -22746:0:2565 -22747:3:2105 -22748:3:2109 -22749:3:2110 -22750:3:2118 -22751:3:2119 -22752:3:2123 -22753:3:2124 -22754:3:2132 -22755:3:2137 -22756:3:2141 -22757:3:2142 -22758:3:2149 -22759:3:2150 -22760:3:2161 -22761:3:2169 -22762:3:2170 -22763:3:2174 -22764:3:2179 -22765:3:2180 -22766:0:2565 -22767:3:2192 -22768:0:2565 -22769:3:2013 -22770:0:2565 -22771:2:853 -22772:0:2565 -22773:2:857 -22774:0:2565 -22775:3:2014 -22776:0:2565 -22777:3:2015 -22778:3:2019 -22779:3:2020 -22780:3:2028 -22781:3:2029 -22782:3:2033 -22783:3:2034 -22784:3:2042 -22785:3:2047 -22786:3:2051 -22787:3:2052 -22788:3:2059 -22789:3:2060 -22790:3:2071 -22791:3:2079 -22792:3:2080 -22793:3:2084 -22794:3:2089 -22795:3:2090 -22796:0:2565 -22797:3:2102 -22798:0:2565 -22799:1:100 -22800:0:2565 -22801:2:465 -22802:0:2565 -22803:1:101 -22804:0:2565 -22805:3:2104 -22806:0:2565 -22807:3:2105 -22808:3:2109 -22809:3:2110 -22810:3:2118 -22811:3:2119 -22812:3:2123 -22813:3:2124 -22814:3:2132 -22815:3:2137 -22816:3:2141 -22817:3:2142 -22818:3:2149 -22819:3:2150 -22820:3:2161 -22821:3:2169 -22822:3:2170 -22823:3:2174 -22824:3:2179 -22825:3:2180 -22826:0:2565 -22827:3:2192 -22828:0:2565 -22829:3:2013 -22830:0:2565 -22831:3:2014 -22832:0:2565 -22833:3:2015 -22834:3:2019 -22835:3:2020 -22836:3:2028 -22837:3:2029 -22838:3:2033 -22839:3:2034 -22840:3:2042 -22841:3:2047 -22842:3:2051 -22843:3:2052 -22844:3:2059 -22845:3:2060 -22846:3:2071 -22847:3:2079 -22848:3:2080 -22849:3:2084 -22850:3:2089 -22851:3:2090 -22852:0:2565 -22853:3:2102 -22854:0:2565 -22855:1:100 -22856:0:2565 -22857:3:2104 -22858:0:2565 -22859:3:2105 -22860:3:2109 -22861:3:2110 -22862:3:2118 -22863:3:2119 -22864:3:2123 -22865:3:2124 -22866:3:2132 -22867:3:2137 -22868:3:2141 -22869:3:2142 -22870:3:2149 -22871:3:2150 -22872:3:2161 -22873:3:2169 -22874:3:2170 -22875:3:2174 -22876:3:2179 -22877:3:2180 -22878:0:2565 -22879:3:2192 -22880:0:2565 -22881:3:2013 -22882:0:2565 -22883:3:2014 -22884:0:2565 -22885:3:2015 -22886:3:2019 -22887:3:2020 -22888:3:2028 -22889:3:2029 -22890:3:2033 -22891:3:2034 -22892:3:2042 -22893:3:2047 -22894:3:2051 -22895:3:2052 -22896:3:2059 -22897:3:2060 -22898:3:2071 -22899:3:2079 -22900:3:2080 -22901:3:2084 -22902:3:2089 -22903:3:2090 -22904:0:2565 -22905:2:466 -22906:0:2565 -22907:3:2102 -22908:0:2565 -22909:1:101 -22910:0:2565 -22911:2:467 -22912:0:2565 -22913:2:468 -22914:0:2565 -22915:1:102 -22916:0:2565 -22917:2:467 -22918:0:2565 -22919:3:2104 -22920:0:2565 -22921:3:2105 -22922:3:2109 -22923:3:2110 -22924:3:2118 -22925:3:2119 -22926:3:2123 -22927:3:2124 -22928:3:2132 -22929:3:2137 -22930:3:2141 -22931:3:2142 -22932:3:2149 -22933:3:2150 -22934:3:2161 -22935:3:2169 -22936:3:2170 -22937:3:2174 -22938:3:2179 -22939:3:2180 -22940:0:2565 -22941:3:2192 -22942:0:2565 -22943:3:2013 -22944:0:2565 -22945:3:2014 -22946:0:2565 -22947:3:2015 -22948:3:2019 -22949:3:2020 -22950:3:2028 -22951:3:2029 -22952:3:2033 -22953:3:2034 -22954:3:2042 -22955:3:2047 -22956:3:2051 -22957:3:2052 -22958:3:2059 -22959:3:2060 -22960:3:2071 -22961:3:2079 -22962:3:2080 -22963:3:2084 -22964:3:2089 -22965:3:2090 -22966:0:2565 -22967:3:2102 -22968:0:2565 -22969:1:108 -22970:0:2565 -22971:3:2104 -22972:0:2565 -22973:3:2105 -22974:3:2109 -22975:3:2110 -22976:3:2118 -22977:3:2119 -22978:3:2123 -22979:3:2124 -22980:3:2132 -22981:3:2137 -22982:3:2141 -22983:3:2142 -22984:3:2149 -22985:3:2150 -22986:3:2161 -22987:3:2169 -22988:3:2170 -22989:3:2174 -22990:3:2179 -22991:3:2180 -22992:0:2565 -22993:3:2192 -22994:0:2565 -22995:3:2013 -22996:0:2565 -22997:3:2014 -22998:0:2565 -22999:3:2015 -23000:3:2019 -23001:3:2020 -23002:3:2028 -23003:3:2029 -23004:3:2033 -23005:3:2034 -23006:3:2042 -23007:3:2047 -23008:3:2051 -23009:3:2052 -23010:3:2059 -23011:3:2060 -23012:3:2071 -23013:3:2079 -23014:3:2080 -23015:3:2084 -23016:3:2089 -23017:3:2090 -23018:0:2565 -23019:1:109 -23020:1:113 -23021:1:114 -23022:1:122 -23023:1:123 -23024:1:124 -23025:1:136 -23026:1:141 -23027:1:145 -23028:1:146 -23029:1:153 -23030:1:154 -23031:1:165 -23032:1:166 -23033:1:167 -23034:1:178 -23035:1:183 -23036:1:184 -23037:0:2565 -23038:1:196 -23039:0:2565 -23040:3:2102 -23041:0:2565 -23042:1:197 -23043:0:2565 -23044:2:468 -23045:0:2565 -23046:1:198 -23047:0:2565 -23048:2:469 -23049:0:2565 -23050:2:475 -23051:0:2565 -23052:2:476 -23053:0:2565 -23054:2:477 -23055:2:481 -23056:2:482 -23057:2:490 -23058:2:491 -23059:2:495 -23060:2:496 -23061:2:504 -23062:2:509 -23063:2:513 -23064:2:514 -23065:2:521 -23066:2:522 -23067:2:533 -23068:2:534 -23069:2:535 -23070:2:546 -23071:2:551 -23072:2:552 -23073:0:2565 -23074:2:564 -23075:0:2565 -23076:2:565 -23077:2:569 -23078:2:570 -23079:2:578 -23080:2:579 -23081:2:583 -23082:2:584 -23083:2:592 -23084:2:597 -23085:2:601 -23086:2:602 -23087:2:609 -23088:2:610 -23089:2:621 -23090:2:622 -23091:2:623 -23092:2:634 -23093:2:639 -23094:2:640 -23095:0:2565 -23096:3:2104 -23097:0:2565 -23098:3:2105 -23099:3:2109 -23100:3:2110 -23101:3:2118 -23102:3:2119 -23103:3:2123 -23104:3:2124 -23105:3:2132 -23106:3:2137 -23107:3:2141 -23108:3:2142 -23109:3:2149 -23110:3:2150 -23111:3:2161 -23112:3:2169 -23113:3:2170 -23114:3:2174 -23115:3:2179 -23116:3:2180 -23117:0:2565 -23118:3:2192 -23119:0:2565 -23120:3:2013 -23121:0:2565 -23122:3:2014 -23123:0:2565 -23124:3:2015 -23125:3:2019 -23126:3:2020 -23127:3:2028 -23128:3:2029 -23129:3:2033 -23130:3:2034 -23131:3:2042 -23132:3:2047 -23133:3:2051 -23134:3:2052 -23135:3:2059 -23136:3:2060 -23137:3:2071 -23138:3:2079 -23139:3:2080 -23140:3:2084 -23141:3:2089 -23142:3:2090 -23143:0:2565 -23144:3:2102 -23145:0:2565 -23146:1:197 -23147:0:2565 -23148:2:652 -23149:0:2565 -23150:1:198 -23151:0:2565 -23152:2:653 -23153:0:2565 -23154:2:654 -23155:2:658 -23156:2:659 -23157:2:667 -23158:2:668 -23159:2:672 -23160:2:673 -23161:2:681 -23162:2:686 -23163:2:690 -23164:2:691 -23165:2:698 -23166:2:699 -23167:2:710 -23168:2:711 -23169:2:712 -23170:2:723 -23171:2:728 -23172:2:729 -23173:0:2565 -23174:2:741 -23175:0:2565 -23176:2:750 -23177:0:2565 -23178:2:753 -23179:0:2565 -23180:2:758 -23181:0:2565 -23182:2:759 -23183:0:2565 -23184:2:760 -23185:0:2565 -23186:2:761 -23187:0:2565 -23188:2:762 -23189:0:2565 -23190:2:763 -23191:0:2565 -23192:2:765 -23193:0:2565 -23194:2:766 -23195:2:770 -23196:2:771 -23197:2:779 -23198:2:780 -23199:2:781 -23200:2:793 -23201:2:798 -23202:2:802 -23203:2:803 -23204:2:810 -23205:2:811 -23206:2:822 -23207:2:823 -23208:2:824 -23209:2:835 -23210:2:840 -23211:2:841 -23212:0:2565 -23213:3:2104 -23214:0:2565 -23215:3:2105 -23216:3:2109 -23217:3:2110 -23218:3:2118 -23219:3:2119 -23220:3:2123 -23221:3:2124 -23222:3:2132 -23223:3:2137 -23224:3:2141 -23225:3:2142 -23226:3:2149 -23227:3:2150 -23228:3:2161 -23229:3:2169 -23230:3:2170 -23231:3:2174 -23232:3:2179 -23233:3:2180 -23234:0:2565 -23235:3:2192 -23236:0:2565 -23237:3:2013 -23238:0:2565 -23239:3:2014 -23240:0:2565 -23241:3:2015 -23242:3:2019 -23243:3:2020 -23244:3:2028 -23245:3:2029 -23246:3:2033 -23247:3:2034 -23248:3:2042 -23249:3:2047 -23250:3:2051 -23251:3:2052 -23252:3:2059 -23253:3:2060 -23254:3:2071 -23255:3:2079 -23256:3:2080 -23257:3:2084 -23258:3:2089 -23259:3:2090 -23260:0:2565 -23261:3:2102 -23262:0:2565 -23263:2:853 -23264:0:2565 -23265:2:857 -23266:0:2565 -23267:1:197 -23268:0:2565 -23269:2:465 -23270:0:2565 -23271:1:198 -23272:0:2565 -23273:3:2104 -23274:0:2565 -23275:3:2105 -23276:3:2109 -23277:3:2110 -23278:3:2118 -23279:3:2119 -23280:3:2123 -23281:3:2124 -23282:3:2132 -23283:3:2137 -23284:3:2141 -23285:3:2142 -23286:3:2149 -23287:3:2150 -23288:3:2161 -23289:3:2169 -23290:3:2170 -23291:3:2174 -23292:3:2179 -23293:3:2180 -23294:0:2565 -23295:3:2192 -23296:0:2565 -23297:3:2013 -23298:0:2565 -23299:3:2014 -23300:0:2565 -23301:3:2015 -23302:3:2019 -23303:3:2020 -23304:3:2028 -23305:3:2029 -23306:3:2033 -23307:3:2034 -23308:3:2042 -23309:3:2047 -23310:3:2051 -23311:3:2052 -23312:3:2059 -23313:3:2060 -23314:3:2071 -23315:3:2079 -23316:3:2080 -23317:3:2084 -23318:3:2089 -23319:3:2090 -23320:0:2565 -23321:3:2102 -23322:0:2565 -23323:1:197 -23324:0:2565 -23325:3:2104 -23326:0:2565 -23327:3:2105 -23328:3:2109 -23329:3:2110 -23330:3:2118 -23331:3:2119 -23332:3:2123 -23333:3:2124 -23334:3:2132 -23335:3:2137 -23336:3:2141 -23337:3:2142 -23338:3:2149 -23339:3:2150 -23340:3:2161 -23341:3:2169 -23342:3:2170 -23343:3:2174 -23344:3:2179 -23345:3:2180 -23346:0:2565 -23347:3:2192 -23348:0:2565 -23349:3:2013 -23350:0:2565 -23351:3:2014 -23352:0:2565 -23353:3:2015 -23354:3:2019 -23355:3:2020 -23356:3:2028 -23357:3:2029 -23358:3:2033 -23359:3:2034 -23360:3:2042 -23361:3:2047 -23362:3:2051 -23363:3:2052 -23364:3:2059 -23365:3:2060 -23366:3:2071 -23367:3:2079 -23368:3:2080 -23369:3:2084 -23370:3:2089 -23371:3:2090 -23372:0:2565 -23373:2:466 -23374:0:2565 -23375:3:2102 -23376:0:2565 -23377:1:198 -23378:0:2565 -23379:3:2104 -23380:0:2565 -23381:3:2105 -23382:3:2109 -23383:3:2110 -23384:3:2118 -23385:3:2119 -23386:3:2123 -23387:3:2124 -23388:3:2132 -23389:3:2137 -23390:3:2141 -23391:3:2142 -23392:3:2149 -23393:3:2150 -23394:3:2161 -23395:3:2169 -23396:3:2170 -23397:3:2174 -23398:3:2179 -23399:3:2180 -23400:0:2565 -23401:3:2192 -23402:0:2565 -23403:3:2013 -23404:0:2565 -23405:3:2014 -23406:0:2565 -23407:3:2015 -23408:3:2019 -23409:3:2020 -23410:3:2028 -23411:3:2029 -23412:3:2033 -23413:3:2034 -23414:3:2042 -23415:3:2047 -23416:3:2051 -23417:3:2052 -23418:3:2059 -23419:3:2060 -23420:3:2071 -23421:3:2079 -23422:3:2080 -23423:3:2084 -23424:3:2089 -23425:3:2090 -23426:0:2565 -23427:3:2102 -23428:0:2565 -23429:1:199 -23430:0:2565 -23431:3:2104 -23432:0:2565 -23433:3:2105 -23434:3:2109 -23435:3:2110 -23436:3:2118 -23437:3:2119 -23438:3:2123 -23439:3:2124 -23440:3:2132 -23441:3:2137 -23442:3:2141 -23443:3:2142 -23444:3:2149 -23445:3:2150 -23446:3:2161 -23447:3:2169 -23448:3:2170 -23449:3:2174 -23450:3:2179 -23451:3:2180 -23452:0:2565 -23453:3:2192 -23454:0:2565 -23455:3:2013 -23456:0:2565 -23457:3:2014 -23458:0:2565 -23459:3:2015 -23460:3:2019 -23461:3:2020 -23462:3:2028 -23463:3:2029 -23464:3:2033 -23465:3:2034 -23466:3:2042 -23467:3:2047 -23468:3:2051 -23469:3:2052 -23470:3:2059 -23471:3:2060 -23472:3:2071 -23473:3:2079 -23474:3:2080 -23475:3:2084 -23476:3:2089 -23477:3:2090 -23478:0:2565 -23479:2:467 -23480:0:2565 -23481:3:2102 -23482:0:2565 -23483:2:468 -23484:0:2565 -23485:1:205 -23486:0:2565 -23487:3:2104 -23488:0:2565 -23489:3:2105 -23490:3:2109 -23491:3:2110 -23492:3:2118 -23493:3:2119 -23494:3:2123 -23495:3:2124 -23496:3:2132 -23497:3:2137 -23498:3:2141 -23499:3:2142 -23500:3:2149 -23501:3:2150 -23502:3:2161 -23503:3:2169 -23504:3:2170 -23505:3:2174 -23506:3:2179 -23507:3:2180 -23508:0:2565 -23509:3:2192 -23510:0:2565 -23511:3:2013 -23512:0:2565 -23513:3:2014 -23514:0:2565 -23515:3:2015 -23516:3:2019 -23517:3:2020 -23518:3:2028 -23519:3:2029 -23520:3:2033 -23521:3:2034 -23522:3:2042 -23523:3:2047 -23524:3:2051 -23525:3:2052 -23526:3:2059 -23527:3:2060 -23528:3:2071 -23529:3:2079 -23530:3:2080 -23531:3:2084 -23532:3:2089 -23533:3:2090 -23534:0:2565 -23535:3:2102 -23536:0:2565 -23537:2:467 -23538:0:2565 -23539:2:468 -23540:0:2565 -23541:3:2104 -23542:0:2565 -23543:3:2105 -23544:3:2109 -23545:3:2110 -23546:3:2118 -23547:3:2119 -23548:3:2123 -23549:3:2124 -23550:3:2132 -23551:3:2137 -23552:3:2141 -23553:3:2142 -23554:3:2149 -23555:3:2150 -23556:3:2161 -23557:3:2169 -23558:3:2170 -23559:3:2174 -23560:3:2179 -23561:3:2180 -23562:0:2565 -23563:3:2192 -23564:0:2565 -23565:3:2013 -23566:0:2565 -23567:3:2014 -23568:0:2565 -23569:1:206 diff --git a/formal-model/urcu/result-signal-over-writer/DEFINES b/formal-model/urcu/result-signal-over-writer/DEFINES deleted file mode 100644 index ec600f0..0000000 --- a/formal-model/urcu/result-signal-over-writer/DEFINES +++ /dev/null @@ -1,16 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -#endif - -#define REMOTE_BARRIERS diff --git a/formal-model/urcu/result-signal-over-writer/Makefile b/formal-model/urcu/result-signal-over-writer/Makefile deleted file mode 100644 index 8af320d..0000000 --- a/formal-model/urcu/result-signal-over-writer/Makefile +++ /dev/null @@ -1,172 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - #nested useless with signal test. - #make urcu_free_nested | tee urcu_free_nested.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu/result-signal-over-writer/asserts.log b/formal-model/urcu/result-signal-over-writer/asserts.log deleted file mode 100644 index c102ffb..0000000 --- a/formal-model/urcu/result-signal-over-writer/asserts.log +++ /dev/null @@ -1,334 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -cat DEFINES > .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w20 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim - (none specified) - assertion violations + - cycle checks - (disabled by -DSAFETY) - invalid end states + - -State-vector 40 byte, depth reached 7872, errors: 0 - 20128 states, stored - 191477 states, matched - 211605 transitions (= stored+matched) - 712166 atomic steps -hash conflicts: 942 (resolved) - -Stats on memory usage (in Megabytes): - 1.305 equivalent memory usage for states (stored*(State-vector + overhead)) - 1.467 actual memory usage for states (unsuccessful compression: 112.36%) - state-vector as stored = 48 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 467.229 total actual memory usage - -unreached in proctype urcu_reader_sig - line 401, ".input.spin", state 330, "(1)" - line 612, ".input.spin", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 397, ".input.spin", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 406, ".input.spin", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, ".input.spin", state 59, "(1)" - line 416, ".input.spin", state 89, "(1)" - line 397, ".input.spin", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 407, ".input.spin", state 160, "(1)" - line 650, ".input.spin", state 213, "(1)" - line 173, ".input.spin", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 177, ".input.spin", state 233, "(1)" - line 158, ".input.spin", state 254, "(1)" - line 162, ".input.spin", state 262, "(1)" - line 166, ".input.spin", state 274, "(1)" - line 173, ".input.spin", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, ".input.spin", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 752, "(1)" - line 162, ".input.spin", state 760, "(1)" - line 162, ".input.spin", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, ".input.spin", state 761, "else" - line 160, ".input.spin", state 766, "((j<1))" - line 160, ".input.spin", state 766, "((j>=1))" - line 166, ".input.spin", state 772, "(1)" - line 166, ".input.spin", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, ".input.spin", state 773, "else" - line 168, ".input.spin", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, ".input.spin", state 776, "else" - line 173, ".input.spin", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, ".input.spin", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 166, ".input.spin", state 835, "(1)" - line 166, ".input.spin", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 173, ".input.spin", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, ".input.spin", state 852, "(1)" - line 177, ".input.spin", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, ".input.spin", state 861, "(1)" - line 177, ".input.spin", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, ".input.spin", state 862, "else" - line 175, ".input.spin", state 867, "((j<1))" - line 175, ".input.spin", state 867, "((j>=1))" - line 181, ".input.spin", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 882, "(1)" - line 162, ".input.spin", state 890, "(1)" - line 162, ".input.spin", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, ".input.spin", state 891, "else" - line 160, ".input.spin", state 896, "((j<1))" - line 160, ".input.spin", state 896, "((j>=1))" - line 166, ".input.spin", state 902, "(1)" - line 166, ".input.spin", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, ".input.spin", state 903, "else" - line 168, ".input.spin", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, ".input.spin", state 906, "else" - line 200, ".input.spin", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 200, ".input.spin", state 908, "else" - line 219, ".input.spin", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 219, ".input.spin", state 909, "else" - line 354, ".input.spin", state 915, "((sighand_exec==1))" - line 354, ".input.spin", state 915, "else" - line 360, ".input.spin", state 918, "sighand_exec = 1" - line 397, ".input.spin", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 397, ".input.spin", state 933, "(1)" - line 397, ".input.spin", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 397, ".input.spin", state 934, "else" - line 397, ".input.spin", state 937, "(1)" - line 401, ".input.spin", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 401, ".input.spin", state 947, "(1)" - line 401, ".input.spin", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 401, ".input.spin", state 948, "else" - line 401, ".input.spin", state 951, "(1)" - line 401, ".input.spin", state 952, "(1)" - line 401, ".input.spin", state 952, "(1)" - line 399, ".input.spin", state 957, "((i<1))" - line 399, ".input.spin", state 957, "((i>=1))" - line 406, ".input.spin", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, ".input.spin", state 976, "(1)" - line 407, ".input.spin", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 407, ".input.spin", state 977, "else" - line 407, ".input.spin", state 980, "(1)" - line 407, ".input.spin", state 981, "(1)" - line 407, ".input.spin", state 981, "(1)" - line 411, ".input.spin", state 989, "(1)" - line 411, ".input.spin", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 411, ".input.spin", state 990, "else" - line 411, ".input.spin", state 993, "(1)" - line 411, ".input.spin", state 994, "(1)" - line 411, ".input.spin", state 994, "(1)" - line 409, ".input.spin", state 999, "((i<1))" - line 409, ".input.spin", state 999, "((i>=1))" - line 416, ".input.spin", state 1006, "(1)" - line 416, ".input.spin", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 416, ".input.spin", state 1007, "else" - line 416, ".input.spin", state 1010, "(1)" - line 416, ".input.spin", state 1011, "(1)" - line 416, ".input.spin", state 1011, "(1)" - line 418, ".input.spin", state 1014, "(1)" - line 418, ".input.spin", state 1014, "(1)" - line 360, ".input.spin", state 1023, "sighand_exec = 1" - line 401, ".input.spin", state 1054, "(1)" - line 406, ".input.spin", state 1070, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, ".input.spin", state 1113, "(1)" - line 401, ".input.spin", state 1151, "(1)" - line 406, ".input.spin", state 1167, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, ".input.spin", state 1210, "(1)" - line 397, ".input.spin", state 1236, "(1)" - line 401, ".input.spin", state 1250, "(1)" - line 406, ".input.spin", state 1266, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, ".input.spin", state 1309, "(1)" - line 401, ".input.spin", state 1350, "(1)" - line 406, ".input.spin", state 1366, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, ".input.spin", state 1409, "(1)" - line 173, ".input.spin", state 1430, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, ".input.spin", state 1432, "(1)" - line 177, ".input.spin", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, ".input.spin", state 1441, "(1)" - line 177, ".input.spin", state 1442, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, ".input.spin", state 1442, "else" - line 175, ".input.spin", state 1447, "((j<1))" - line 175, ".input.spin", state 1447, "((j>=1))" - line 181, ".input.spin", state 1452, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 1462, "(1)" - line 162, ".input.spin", state 1470, "(1)" - line 162, ".input.spin", state 1471, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, ".input.spin", state 1471, "else" - line 160, ".input.spin", state 1476, "((j<1))" - line 160, ".input.spin", state 1476, "((j>=1))" - line 166, ".input.spin", state 1482, "(1)" - line 166, ".input.spin", state 1483, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, ".input.spin", state 1483, "else" - line 168, ".input.spin", state 1486, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, ".input.spin", state 1486, "else" - line 173, ".input.spin", state 1493, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, ".input.spin", state 1515, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 166, ".input.spin", state 1545, "(1)" - line 166, ".input.spin", state 1546, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 173, ".input.spin", state 1560, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, ".input.spin", state 1562, "(1)" - line 177, ".input.spin", state 1569, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, ".input.spin", state 1571, "(1)" - line 177, ".input.spin", state 1572, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, ".input.spin", state 1572, "else" - line 175, ".input.spin", state 1577, "((j<1))" - line 175, ".input.spin", state 1577, "((j>=1))" - line 181, ".input.spin", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 1592, "(1)" - line 162, ".input.spin", state 1600, "(1)" - line 162, ".input.spin", state 1601, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, ".input.spin", state 1601, "else" - line 160, ".input.spin", state 1606, "((j<1))" - line 160, ".input.spin", state 1606, "((j>=1))" - line 166, ".input.spin", state 1612, "(1)" - line 166, ".input.spin", state 1613, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, ".input.spin", state 1613, "else" - line 168, ".input.spin", state 1616, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, ".input.spin", state 1616, "else" - line 200, ".input.spin", state 1618, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 200, ".input.spin", state 1618, "else" - line 219, ".input.spin", state 1619, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 219, ".input.spin", state 1619, "else" - line 354, ".input.spin", state 1625, "((sighand_exec==1))" - line 354, ".input.spin", state 1625, "else" - line 360, ".input.spin", state 1628, "sighand_exec = 1" - line 397, ".input.spin", state 1641, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 397, ".input.spin", state 1643, "(1)" - line 397, ".input.spin", state 1644, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 397, ".input.spin", state 1644, "else" - line 397, ".input.spin", state 1647, "(1)" - line 401, ".input.spin", state 1655, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 401, ".input.spin", state 1657, "(1)" - line 401, ".input.spin", state 1658, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 401, ".input.spin", state 1658, "else" - line 401, ".input.spin", state 1661, "(1)" - line 401, ".input.spin", state 1662, "(1)" - line 401, ".input.spin", state 1662, "(1)" - line 399, ".input.spin", state 1667, "((i<1))" - line 399, ".input.spin", state 1667, "((i>=1))" - line 406, ".input.spin", state 1673, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, ".input.spin", state 1686, "(1)" - line 407, ".input.spin", state 1687, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 407, ".input.spin", state 1687, "else" - line 407, ".input.spin", state 1690, "(1)" - line 407, ".input.spin", state 1691, "(1)" - line 407, ".input.spin", state 1691, "(1)" - line 411, ".input.spin", state 1699, "(1)" - line 411, ".input.spin", state 1700, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 411, ".input.spin", state 1700, "else" - line 411, ".input.spin", state 1703, "(1)" - line 411, ".input.spin", state 1704, "(1)" - line 411, ".input.spin", state 1704, "(1)" - line 409, ".input.spin", state 1709, "((i<1))" - line 409, ".input.spin", state 1709, "((i>=1))" - line 416, ".input.spin", state 1716, "(1)" - line 416, ".input.spin", state 1717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 416, ".input.spin", state 1717, "else" - line 416, ".input.spin", state 1720, "(1)" - line 416, ".input.spin", state 1721, "(1)" - line 416, ".input.spin", state 1721, "(1)" - line 418, ".input.spin", state 1724, "(1)" - line 418, ".input.spin", state 1724, "(1)" - line 360, ".input.spin", state 1733, "sighand_exec = 1" - line 177, ".input.spin", state 1758, "(1)" - line 181, ".input.spin", state 1769, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 1779, "(1)" - line 162, ".input.spin", state 1787, "(1)" - line 166, ".input.spin", state 1799, "(1)" - line 173, ".input.spin", state 1810, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/asserts.spin.input.trail b/formal-model/urcu/result-signal-over-writer/asserts.spin.input.trail deleted file mode 100644 index 287e52a..0000000 --- a/formal-model/urcu/result-signal-over-writer/asserts.spin.input.trail +++ /dev/null @@ -1,6 +0,0 @@ --4:-4:-4 -1:0:2673 -2:0:2674 -3:0:2675 -4:0:2676 -5:4:1129 diff --git a/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/DEFINES b/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/DEFINES deleted file mode 100644 index ec600f0..0000000 --- a/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/DEFINES +++ /dev/null @@ -1,16 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -#endif - -#define REMOTE_BARRIERS diff --git a/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/Makefile b/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/Makefile deleted file mode 100644 index 8af320d..0000000 --- a/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/Makefile +++ /dev/null @@ -1,172 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - #nested useless with signal test. - #make urcu_free_nested | tee urcu_free_nested.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/asserts.log b/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/asserts.log deleted file mode 100644 index c102ffb..0000000 --- a/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/asserts.log +++ /dev/null @@ -1,334 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -cat DEFINES > .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w20 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim - (none specified) - assertion violations + - cycle checks - (disabled by -DSAFETY) - invalid end states + - -State-vector 40 byte, depth reached 7872, errors: 0 - 20128 states, stored - 191477 states, matched - 211605 transitions (= stored+matched) - 712166 atomic steps -hash conflicts: 942 (resolved) - -Stats on memory usage (in Megabytes): - 1.305 equivalent memory usage for states (stored*(State-vector + overhead)) - 1.467 actual memory usage for states (unsuccessful compression: 112.36%) - state-vector as stored = 48 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 467.229 total actual memory usage - -unreached in proctype urcu_reader_sig - line 401, ".input.spin", state 330, "(1)" - line 612, ".input.spin", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 397, ".input.spin", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 406, ".input.spin", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, ".input.spin", state 59, "(1)" - line 416, ".input.spin", state 89, "(1)" - line 397, ".input.spin", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 407, ".input.spin", state 160, "(1)" - line 650, ".input.spin", state 213, "(1)" - line 173, ".input.spin", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 177, ".input.spin", state 233, "(1)" - line 158, ".input.spin", state 254, "(1)" - line 162, ".input.spin", state 262, "(1)" - line 166, ".input.spin", state 274, "(1)" - line 173, ".input.spin", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, ".input.spin", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 752, "(1)" - line 162, ".input.spin", state 760, "(1)" - line 162, ".input.spin", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, ".input.spin", state 761, "else" - line 160, ".input.spin", state 766, "((j<1))" - line 160, ".input.spin", state 766, "((j>=1))" - line 166, ".input.spin", state 772, "(1)" - line 166, ".input.spin", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, ".input.spin", state 773, "else" - line 168, ".input.spin", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, ".input.spin", state 776, "else" - line 173, ".input.spin", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, ".input.spin", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 166, ".input.spin", state 835, "(1)" - line 166, ".input.spin", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 173, ".input.spin", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, ".input.spin", state 852, "(1)" - line 177, ".input.spin", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, ".input.spin", state 861, "(1)" - line 177, ".input.spin", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, ".input.spin", state 862, "else" - line 175, ".input.spin", state 867, "((j<1))" - line 175, ".input.spin", state 867, "((j>=1))" - line 181, ".input.spin", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 882, "(1)" - line 162, ".input.spin", state 890, "(1)" - line 162, ".input.spin", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, ".input.spin", state 891, "else" - line 160, ".input.spin", state 896, "((j<1))" - line 160, ".input.spin", state 896, "((j>=1))" - line 166, ".input.spin", state 902, "(1)" - line 166, ".input.spin", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, ".input.spin", state 903, "else" - line 168, ".input.spin", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, ".input.spin", state 906, "else" - line 200, ".input.spin", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 200, ".input.spin", state 908, "else" - line 219, ".input.spin", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 219, ".input.spin", state 909, "else" - line 354, ".input.spin", state 915, "((sighand_exec==1))" - line 354, ".input.spin", state 915, "else" - line 360, ".input.spin", state 918, "sighand_exec = 1" - line 397, ".input.spin", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 397, ".input.spin", state 933, "(1)" - line 397, ".input.spin", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 397, ".input.spin", state 934, "else" - line 397, ".input.spin", state 937, "(1)" - line 401, ".input.spin", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 401, ".input.spin", state 947, "(1)" - line 401, ".input.spin", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 401, ".input.spin", state 948, "else" - line 401, ".input.spin", state 951, "(1)" - line 401, ".input.spin", state 952, "(1)" - line 401, ".input.spin", state 952, "(1)" - line 399, ".input.spin", state 957, "((i<1))" - line 399, ".input.spin", state 957, "((i>=1))" - line 406, ".input.spin", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, ".input.spin", state 976, "(1)" - line 407, ".input.spin", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 407, ".input.spin", state 977, "else" - line 407, ".input.spin", state 980, "(1)" - line 407, ".input.spin", state 981, "(1)" - line 407, ".input.spin", state 981, "(1)" - line 411, ".input.spin", state 989, "(1)" - line 411, ".input.spin", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 411, ".input.spin", state 990, "else" - line 411, ".input.spin", state 993, "(1)" - line 411, ".input.spin", state 994, "(1)" - line 411, ".input.spin", state 994, "(1)" - line 409, ".input.spin", state 999, "((i<1))" - line 409, ".input.spin", state 999, "((i>=1))" - line 416, ".input.spin", state 1006, "(1)" - line 416, ".input.spin", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 416, ".input.spin", state 1007, "else" - line 416, ".input.spin", state 1010, "(1)" - line 416, ".input.spin", state 1011, "(1)" - line 416, ".input.spin", state 1011, "(1)" - line 418, ".input.spin", state 1014, "(1)" - line 418, ".input.spin", state 1014, "(1)" - line 360, ".input.spin", state 1023, "sighand_exec = 1" - line 401, ".input.spin", state 1054, "(1)" - line 406, ".input.spin", state 1070, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, ".input.spin", state 1113, "(1)" - line 401, ".input.spin", state 1151, "(1)" - line 406, ".input.spin", state 1167, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, ".input.spin", state 1210, "(1)" - line 397, ".input.spin", state 1236, "(1)" - line 401, ".input.spin", state 1250, "(1)" - line 406, ".input.spin", state 1266, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, ".input.spin", state 1309, "(1)" - line 401, ".input.spin", state 1350, "(1)" - line 406, ".input.spin", state 1366, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, ".input.spin", state 1409, "(1)" - line 173, ".input.spin", state 1430, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, ".input.spin", state 1432, "(1)" - line 177, ".input.spin", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, ".input.spin", state 1441, "(1)" - line 177, ".input.spin", state 1442, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, ".input.spin", state 1442, "else" - line 175, ".input.spin", state 1447, "((j<1))" - line 175, ".input.spin", state 1447, "((j>=1))" - line 181, ".input.spin", state 1452, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 1462, "(1)" - line 162, ".input.spin", state 1470, "(1)" - line 162, ".input.spin", state 1471, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, ".input.spin", state 1471, "else" - line 160, ".input.spin", state 1476, "((j<1))" - line 160, ".input.spin", state 1476, "((j>=1))" - line 166, ".input.spin", state 1482, "(1)" - line 166, ".input.spin", state 1483, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, ".input.spin", state 1483, "else" - line 168, ".input.spin", state 1486, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, ".input.spin", state 1486, "else" - line 173, ".input.spin", state 1493, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, ".input.spin", state 1515, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 166, ".input.spin", state 1545, "(1)" - line 166, ".input.spin", state 1546, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 173, ".input.spin", state 1560, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, ".input.spin", state 1562, "(1)" - line 177, ".input.spin", state 1569, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, ".input.spin", state 1571, "(1)" - line 177, ".input.spin", state 1572, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, ".input.spin", state 1572, "else" - line 175, ".input.spin", state 1577, "((j<1))" - line 175, ".input.spin", state 1577, "((j>=1))" - line 181, ".input.spin", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 1592, "(1)" - line 162, ".input.spin", state 1600, "(1)" - line 162, ".input.spin", state 1601, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, ".input.spin", state 1601, "else" - line 160, ".input.spin", state 1606, "((j<1))" - line 160, ".input.spin", state 1606, "((j>=1))" - line 166, ".input.spin", state 1612, "(1)" - line 166, ".input.spin", state 1613, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, ".input.spin", state 1613, "else" - line 168, ".input.spin", state 1616, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, ".input.spin", state 1616, "else" - line 200, ".input.spin", state 1618, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 200, ".input.spin", state 1618, "else" - line 219, ".input.spin", state 1619, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 219, ".input.spin", state 1619, "else" - line 354, ".input.spin", state 1625, "((sighand_exec==1))" - line 354, ".input.spin", state 1625, "else" - line 360, ".input.spin", state 1628, "sighand_exec = 1" - line 397, ".input.spin", state 1641, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 397, ".input.spin", state 1643, "(1)" - line 397, ".input.spin", state 1644, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 397, ".input.spin", state 1644, "else" - line 397, ".input.spin", state 1647, "(1)" - line 401, ".input.spin", state 1655, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 401, ".input.spin", state 1657, "(1)" - line 401, ".input.spin", state 1658, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 401, ".input.spin", state 1658, "else" - line 401, ".input.spin", state 1661, "(1)" - line 401, ".input.spin", state 1662, "(1)" - line 401, ".input.spin", state 1662, "(1)" - line 399, ".input.spin", state 1667, "((i<1))" - line 399, ".input.spin", state 1667, "((i>=1))" - line 406, ".input.spin", state 1673, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, ".input.spin", state 1686, "(1)" - line 407, ".input.spin", state 1687, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 407, ".input.spin", state 1687, "else" - line 407, ".input.spin", state 1690, "(1)" - line 407, ".input.spin", state 1691, "(1)" - line 407, ".input.spin", state 1691, "(1)" - line 411, ".input.spin", state 1699, "(1)" - line 411, ".input.spin", state 1700, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 411, ".input.spin", state 1700, "else" - line 411, ".input.spin", state 1703, "(1)" - line 411, ".input.spin", state 1704, "(1)" - line 411, ".input.spin", state 1704, "(1)" - line 409, ".input.spin", state 1709, "((i<1))" - line 409, ".input.spin", state 1709, "((i>=1))" - line 416, ".input.spin", state 1716, "(1)" - line 416, ".input.spin", state 1717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 416, ".input.spin", state 1717, "else" - line 416, ".input.spin", state 1720, "(1)" - line 416, ".input.spin", state 1721, "(1)" - line 416, ".input.spin", state 1721, "(1)" - line 418, ".input.spin", state 1724, "(1)" - line 418, ".input.spin", state 1724, "(1)" - line 360, ".input.spin", state 1733, "sighand_exec = 1" - line 177, ".input.spin", state 1758, "(1)" - line 181, ".input.spin", state 1769, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, ".input.spin", state 1779, "(1)" - line 162, ".input.spin", state 1787, "(1)" - line 166, ".input.spin", state 1799, "(1)" - line 173, ".input.spin", state 1810, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/asserts.spin.input.trail b/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/asserts.spin.input.trail deleted file mode 100644 index 287e52a..0000000 --- a/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/asserts.spin.input.trail +++ /dev/null @@ -1,6 +0,0 @@ --4:-4:-4 -1:0:2673 -2:0:2674 -3:0:2675 -4:0:2676 -5:4:1129 diff --git a/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/references.txt b/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/references.txt deleted file mode 100644 index 72c67a2..0000000 --- a/formal-model/urcu/result-signal-over-writer/result-signal-over-writer/references.txt +++ /dev/null @@ -1,13 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html - -LTL vs CTL : - -http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 -http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf - (downloaded) diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/.input.define b/formal-model/urcu/result-signal-over-writer/testmerge/.input.define deleted file mode 100644 index e69de29..0000000 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/.input.spin b/formal-model/urcu/result-signal-over-writer/testmerge/.input.spin deleted file mode 100644 index f2737c4..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/.input.spin +++ /dev/null @@ -1,531 +0,0 @@ - -#define NR_READERS 2 -#define NR_WRITERS 1 - -#define NR_PROCS 3 - - -#if (NR_READERS == 1) - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#elif (NR_READERS == 2) - -#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) -#define read_free (free_done && (data_access[0] || data_access[1])) - -#else - -#error "Too many readers" - -#endif - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - atomic { - if - :: get_readerid() == 0 -> -progress_reader: - skip; - :: else -> - skip; - fi; - } -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/DEFINES b/formal-model/urcu/result-signal-over-writer/testmerge/DEFINES deleted file mode 100644 index 12c751b..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/DEFINES +++ /dev/null @@ -1,31 +0,0 @@ - -#define NR_READERS 2 -#define NR_WRITERS 1 - -#define NR_PROCS 3 - - -#if (NR_READERS == 1) - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#elif (NR_READERS == 2) - -#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) -#define read_free (free_done && (data_access[0] || data_access[1])) - -#else - -#error "Too many readers" - -#endif - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/Makefile b/formal-model/urcu/result-signal-over-writer/testmerge/Makefile deleted file mode 100644 index ca932b7..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/Makefile +++ /dev/null @@ -1,165 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - make urcu_free_nested | tee urcu_free_nested.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/asserts.log b/formal-model/urcu/result-signal-over-writer/testmerge/asserts.log deleted file mode 100644 index 75f2427..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/asserts.log +++ /dev/null @@ -1,10 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -cat DEFINES > .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X .input.spin -spin: line 295 replacement value: tmp -spin: line 295 ".input.spin", Error: formal par of wait_for_quiescent_state contains replacement value saw '-2'' near 'readerid' -spin: 1 error(s) - aborting -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/asserts.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/asserts.spin.input deleted file mode 100644 index b06898a..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/asserts.spin.input +++ /dev/null @@ -1,409 +0,0 @@ -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#define read_free_race (read_generation == last_free_gen) -#define read_free (free_done && data_access) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces - * both. - */ - -#define DECLARE_CACHED_VAR(type, x, v) \ - type mem_##x = v; \ - type cached_##x[NR_PROCS] = v; \ - bit cache_dirty_##x[NR_PROCS] = 0 - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) - -#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x[get_pid()] = v; \ - cache_dirty_##x[get_pid()] = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x[id]; \ - cache_dirty_##x[id] = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - CACHE_READ_FROM_MEM(urcu_active_readers_one, i); - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i); -#endif -#ifndef NO_RMB - smp_rmb_pid(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid()); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid()); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i); -#endif -#ifndef NO_RMB - smp_rmb(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr, 0); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation = 1; -bit data_access = 0; - -bit write_lock = 0; - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, id, i) -{ - do - :: 1 -> - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (tmp & RCU_GP_CTR_NEST_MASK) - && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, i, j) -{ - i = 0; - do - :: i < NR_READERS -> - wait_for_reader(tmp, i, j); - if - :: (NR_READERS > 1) && (i < NR_READERS - 1) - -> ooo_mem(j); - :: else - -> skip; - fi; - i++ - :: i >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers_one, - tmp + 1); - fi; - smp_mb(i); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access = 1; - ooo_mem(i); - data_access = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i); - tmp2 = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, nest_i; - byte tmp, tmp2; - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active [NR_WRITERS] proctype urcu_writer() -{ - byte i, j; - byte tmp; - byte old_gen; - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, i, j); -#endif - smp_mb(i); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/asserts.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/asserts.spin.input.trail deleted file mode 100644 index 287e52a..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/asserts.spin.input.trail +++ /dev/null @@ -1,6 +0,0 @@ --4:-4:-4 -1:0:2673 -2:0:2674 -3:0:2675 -4:0:2676 -5:4:1129 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/references.txt b/formal-model/urcu/result-signal-over-writer/testmerge/references.txt deleted file mode 100644 index 72c67a2..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/references.txt +++ /dev/null @@ -1,13 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html - -LTL vs CTL : - -http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 -http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf - (downloaded) diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu.sh b/formal-model/urcu/result-signal-over-writer/testmerge/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin b/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin deleted file mode 100644 index 61d9052..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin +++ /dev/null @@ -1,500 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - atomic { - if - :: get_readerid() == 0 -> -progress_reader: - skip; - :: else -> - skip; - fi; - } -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin.bkp2 b/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin.bkp2 deleted file mode 100644 index b1c8311..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin.bkp2 +++ /dev/null @@ -1,395 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -#define NR_WRITERS 1 -#define NR_READERS 3 - -/* Number of reader and writer processes */ -#define NR_PROCS 5 - -/* Includes reader, writer and init process */ -#define MAX_NR_PROCS 5 - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces - * both. - */ - -#define DECLARE_CACHED_VAR(type, x, v) \ - type mem_##x = v; \ - type cached_##x[NR_PROCS] = v; \ - bit cache_dirty_##x[NR_PROCS] = 0 - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) - -#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x[get_pid()] = v; \ - cache_dirty_##x[get_pid()] = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x[id]; \ - cache_dirty_##x[id] = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - CACHE_READ_FROM_MEM(urcu_active_readers_one, i); - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i); -#endif -#ifndef NO_RMB - smp_rmb_pid(i); -#endif - skip; - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid()); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid()); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i); -#endif -#ifndef NO_RMB - smp_rmb(i); -#endif - skip; - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr, 0); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation = 1; -bit data_access = 0; - -bit write_lock = 0; - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_writerid() (get_pid()) -#define get_readerid() (get_writerrid() + NR_READERS) - -inline wait_for_reader(tmp, id, i) -{ - do - :: 1 -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (tmp & RCU_GP_CTR_NEST_MASK) - && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i); -#else - skip; -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, i, j) -{ - i = 0; - do - :: i < NR_READERS -> - wait_for_reader(tmp, i, j); - i++ - :: i >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, nest_i, tmp, tmp2, nest) -{ - nest_i = 0; - do - :: nest_i < nest -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers_one, - tmp + 1); - fi; - ooo_mem(i); - smp_mb(i); - nest_i++; - :: nest_i >= nest -> break; - od; - - ooo_mem(i); - read_generation = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access = 1; - ooo_mem(i); - data_access = 0; - - nest_i = 0; - do - :: nest_i < nest -> - ooo_mem(i); - smp_mb(i); - ooo_mem(i); - tmp2 = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); - nest_i++; - :: nest_i >= nest -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [2] proctype urcu_reader() -{ - byte i, nest_i; - byte tmp, tmp2; - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, nest_i, tmp, tmp2, 2); - od; -} - -/* Model the RCU update process. */ - -active [1] proctype urcu_writer() -{ - byte i, j; - byte tmp; - byte old_gen; - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i); - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, i, j); -#endif - ooo_mem(i); - smp_mb(i); - ooo_mem(i); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin.bkp5 b/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin.bkp5 deleted file mode 100644 index 324ee39..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu.spin.bkp5 +++ /dev/null @@ -1,398 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -#define DECLARE_CACHED_VAR(type, x, v) \ - type mem_##x = v; \ - type cached_##x[NR_PROCS] = v; \ - bit cache_dirty_##x[NR_PROCS] = 0 - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) - -#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x[get_pid()] = v; \ - cache_dirty_##x[get_pid()] = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x[id]; \ - cache_dirty_##x[id] = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - CACHE_READ_FROM_MEM(urcu_active_readers_one, i); - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i); -#endif -#ifndef NO_RMB - smp_rmb_pid(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid()); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid()); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i); -#endif -#ifndef NO_RMB - smp_rmb(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr, 0); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation = 1; -bit data_access = 0; - -bit write_lock = 0; - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, id, i) -{ - do - :: 1 -> - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (tmp & RCU_GP_CTR_NEST_MASK) - && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, i, j) -{ - i = 0; - do - :: i < NR_READERS -> - wait_for_reader(tmp, i, j); - if - :: (NR_READERS > 1) && (i < NR_READERS - 1) - -> ooo_mem(j); - :: else - -> skip; - fi; - i++ - :: i >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers_one, - tmp + 1); - fi; - smp_mb(i); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access = 1; - ooo_mem(i); - data_access = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i); - tmp2 = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, nest_i; - byte tmp, tmp2; - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active [NR_WRITERS] proctype urcu_writer() -{ - byte i, j; - byte tmp; - byte old_gen; - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, i, j); -#endif - smp_mb(i); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.log deleted file mode 100644 index 6a04aba..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.log +++ /dev/null @@ -1,414 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 566) -Depth= 4234 States= 1e+06 Transitions= 1.7e+07 Memory= 527.287 t= 31.3 R= 3e+04 -Depth= 4234 States= 2e+06 Transitions= 3.44e+07 Memory= 588.322 t= 63.9 R= 3e+04 -Depth= 4234 States= 3e+06 Transitions= 5.2e+07 Memory= 649.358 t= 97 R= 3e+04 -pan: resizing hashtable to -w22.. done -Depth= 4234 States= 4e+06 Transitions= 6.97e+07 Memory= 741.416 t= 130 R= 3e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 4234, errors: 0 - 4027146 states, stored - 66145121 states, matched - 70172267 transitions (= stored+matched) -2.6437688e+08 atomic steps -hash conflicts: 47318190 (resolved) - -Stats on memory usage (in Megabytes): - 322.609 equivalent memory usage for states (stored*(State-vector + overhead)) - 253.418 actual memory usage for states (compression: 78.55%) - state-vector as stored = 38 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 743.076 total actual memory usage - -unreached in proctype urcu_reader - line 288, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 61, "(1)" - line 307, "pan.___", state 91, "(1)" - line 288, "pan.___", state 104, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 136, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 149, "(1)" - line 307, "pan.___", state 179, "(1)" - line 288, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 225, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 238, "(1)" - line 307, "pan.___", state 268, "(1)" - line 158, "pan.___", state 289, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 158, "pan.___", state 291, "(1)" - line 162, "pan.___", state 298, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 300, "(1)" - line 162, "pan.___", state 301, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 162, "pan.___", state 301, "else" - line 160, "pan.___", state 306, "((j<1))" - line 160, "pan.___", state 306, "((j>=1))" - line 166, "pan.___", state 311, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 321, "(1)" - line 147, "pan.___", state 329, "(1)" - line 147, "pan.___", state 330, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 147, "pan.___", state 330, "else" - line 145, "pan.___", state 335, "((j<1))" - line 145, "pan.___", state 335, "((j>=1))" - line 151, "pan.___", state 341, "(1)" - line 151, "pan.___", state 342, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 151, "pan.___", state 342, "else" - line 153, "pan.___", state 345, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 153, "pan.___", state 345, "else" - line 185, "pan.___", state 347, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 185, "pan.___", state 347, "else" - line 158, "pan.___", state 352, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 166, "pan.___", state 374, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 151, "pan.___", state 404, "(1)" - line 151, "pan.___", state 405, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 158, "pan.___", state 419, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 158, "pan.___", state 421, "(1)" - line 162, "pan.___", state 428, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 430, "(1)" - line 162, "pan.___", state 431, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 162, "pan.___", state 431, "else" - line 160, "pan.___", state 436, "((j<1))" - line 160, "pan.___", state 436, "((j>=1))" - line 166, "pan.___", state 441, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 451, "(1)" - line 147, "pan.___", state 459, "(1)" - line 147, "pan.___", state 460, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 147, "pan.___", state 460, "else" - line 145, "pan.___", state 465, "((j<1))" - line 145, "pan.___", state 465, "((j>=1))" - line 151, "pan.___", state 471, "(1)" - line 151, "pan.___", state 472, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 151, "pan.___", state 472, "else" - line 153, "pan.___", state 475, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 153, "pan.___", state 475, "else" - line 185, "pan.___", state 477, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 185, "pan.___", state 477, "else" - line 288, "pan.___", state 492, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 524, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 537, "(1)" - line 307, "pan.___", state 567, "(1)" - line 288, "pan.___", state 580, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 612, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 625, "(1)" - line 307, "pan.___", state 655, "(1)" - line 288, "pan.___", state 668, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 713, "(1)" - line 307, "pan.___", state 743, "(1)" - line 158, "pan.___", state 758, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 158, "pan.___", state 760, "(1)" - line 162, "pan.___", state 767, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 769, "(1)" - line 162, "pan.___", state 770, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 162, "pan.___", state 770, "else" - line 160, "pan.___", state 775, "((j<1))" - line 160, "pan.___", state 775, "((j>=1))" - line 166, "pan.___", state 780, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 790, "(1)" - line 147, "pan.___", state 798, "(1)" - line 147, "pan.___", state 799, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 147, "pan.___", state 799, "else" - line 145, "pan.___", state 804, "((j<1))" - line 145, "pan.___", state 804, "((j>=1))" - line 151, "pan.___", state 810, "(1)" - line 151, "pan.___", state 811, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 151, "pan.___", state 811, "else" - line 153, "pan.___", state 814, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 153, "pan.___", state 814, "else" - line 185, "pan.___", state 816, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 185, "pan.___", state 816, "else" - line 158, "pan.___", state 821, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 166, "pan.___", state 843, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 151, "pan.___", state 873, "(1)" - line 151, "pan.___", state 874, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 158, "pan.___", state 888, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 158, "pan.___", state 890, "(1)" - line 162, "pan.___", state 897, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 899, "(1)" - line 162, "pan.___", state 900, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 162, "pan.___", state 900, "else" - line 160, "pan.___", state 905, "((j<1))" - line 160, "pan.___", state 905, "((j>=1))" - line 166, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 920, "(1)" - line 147, "pan.___", state 928, "(1)" - line 147, "pan.___", state 929, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 147, "pan.___", state 929, "else" - line 145, "pan.___", state 934, "((j<1))" - line 145, "pan.___", state 934, "((j>=1))" - line 151, "pan.___", state 940, "(1)" - line 151, "pan.___", state 941, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 151, "pan.___", state 941, "else" - line 153, "pan.___", state 944, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 153, "pan.___", state 944, "else" - line 185, "pan.___", state 946, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 185, "pan.___", state 946, "else" - line 288, "pan.___", state 956, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 988, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1001, "(1)" - line 307, "pan.___", state 1031, "(1)" - line 288, "pan.___", state 1052, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1084, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1097, "(1)" - line 307, "pan.___", state 1127, "(1)" - line 433, "pan.___", state 1140, "-end-" - (125 of 1140 states) -unreached in proctype urcu_writer - line 288, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 292, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 59, "(1)" - line 302, "pan.___", state 72, "(1)" - line 307, "pan.___", state 89, "(1)" - line 288, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 292, "pan.___", state 120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 151, "(1)" - line 302, "pan.___", state 164, "(1)" - line 467, "pan.___", state 195, "(1)" - line 158, "pan.___", state 205, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 214, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 237, "(1)" - line 147, "pan.___", state 245, "(1)" - line 151, "pan.___", state 257, "(1)" - line 158, "pan.___", state 268, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 297, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 923, "(1)" - line 298, "pan.___", state 924, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 298, "pan.___", state 924, "else" - line 298, "pan.___", state 927, "(1)" - line 298, "pan.___", state 928, "(1)" - line 298, "pan.___", state 928, "(1)" - line 302, "pan.___", state 936, "(1)" - line 302, "pan.___", state 937, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 302, "pan.___", state 937, "else" - line 302, "pan.___", state 940, "(1)" - line 302, "pan.___", state 941, "(1)" - line 302, "pan.___", state 941, "(1)" - line 300, "pan.___", state 946, "((i<1))" - line 300, "pan.___", state 946, "((i>=1))" - line 307, "pan.___", state 953, "(1)" - line 307, "pan.___", state 954, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 307, "pan.___", state 954, "else" - line 307, "pan.___", state 957, "(1)" - line 307, "pan.___", state 958, "(1)" - line 307, "pan.___", state 958, "(1)" - line 309, "pan.___", state 961, "(1)" - line 309, "pan.___", state 961, "(1)" - line 292, "pan.___", state 990, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1008, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 302, "pan.___", state 1034, "(1)" - line 307, "pan.___", state 1051, "(1)" - line 292, "pan.___", state 1078, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1096, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 302, "pan.___", state 1122, "(1)" - line 307, "pan.___", state 1139, "(1)" - line 288, "pan.___", state 1156, "(1)" - line 292, "pan.___", state 1168, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1186, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 302, "pan.___", state 1212, "(1)" - line 307, "pan.___", state 1229, "(1)" - line 292, "pan.___", state 1259, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1277, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 302, "pan.___", state 1303, "(1)" - line 307, "pan.___", state 1320, "(1)" - line 162, "pan.___", state 1342, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 166, "pan.___", state 1355, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 1365, "(1)" - line 147, "pan.___", state 1373, "(1)" - line 151, "pan.___", state 1385, "(1)" - line 158, "pan.___", state 1396, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 297, "pan.___", state 1571, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1584, "(1)" - line 298, "pan.___", state 1585, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 298, "pan.___", state 1585, "else" - line 298, "pan.___", state 1588, "(1)" - line 298, "pan.___", state 1589, "(1)" - line 298, "pan.___", state 1589, "(1)" - line 302, "pan.___", state 1597, "(1)" - line 302, "pan.___", state 1598, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 302, "pan.___", state 1598, "else" - line 302, "pan.___", state 1601, "(1)" - line 302, "pan.___", state 1602, "(1)" - line 302, "pan.___", state 1602, "(1)" - line 300, "pan.___", state 1607, "((i<1))" - line 300, "pan.___", state 1607, "((i>=1))" - line 307, "pan.___", state 1614, "(1)" - line 307, "pan.___", state 1615, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 307, "pan.___", state 1615, "else" - line 307, "pan.___", state 1618, "(1)" - line 307, "pan.___", state 1619, "(1)" - line 307, "pan.___", state 1619, "(1)" - line 309, "pan.___", state 1622, "(1)" - line 309, "pan.___", state 1622, "(1)" - line 162, "pan.___", state 1646, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 166, "pan.___", state 1659, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 1669, "(1)" - line 147, "pan.___", state 1677, "(1)" - line 151, "pan.___", state 1689, "(1)" - line 158, "pan.___", state 1700, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< !read_free_race) diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.spin.input deleted file mode 100644 index 18f99c4..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.spin.input +++ /dev/null @@ -1,531 +0,0 @@ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - - -#if (NR_READERS == 1) - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#elif (NR_READERS == 2) - -#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) -#define read_free (free_done && (data_access[0] || data_access[1])) - -#else - -#error "Too many readers" - -#endif - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - atomic { - if - :: get_readerid() == 0 -> -progress_reader: - skip; - :: else -> - skip; - fi; - } -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.spin.input.trail deleted file mode 100644 index 0d22946..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free.spin.input.trail +++ /dev/null @@ -1,1902 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:3013 -2:2:1132 -3:0:3013 -4:1:0 -5:0:3013 -6:1:1 -7:0:3013 -8:1:2 -9:0:3013 -10:1:3 -11:0:3013 -12:3:2969 -13:0:3013 -14:3:2970 -15:0:3013 -16:3:2971 -17:0:3013 -18:3:2972 -19:0:3013 -20:3:2973 -21:0:3013 -22:3:2974 -23:0:3013 -24:3:2971 -25:0:3013 -26:3:2972 -27:0:3013 -28:3:2973 -29:0:3013 -30:3:2974 -31:0:3013 -32:3:2975 -33:0:3013 -34:3:2980 -35:0:3013 -36:3:2981 -37:0:3013 -38:3:2982 -39:0:3013 -40:3:2983 -41:0:3013 -42:3:2984 -43:0:3013 -44:3:2985 -45:0:3013 -46:3:2982 -47:0:3013 -48:3:2983 -49:0:3013 -50:3:2984 -51:0:3013 -52:3:2985 -53:0:3013 -54:3:2986 -55:0:3013 -56:3:2992 -57:0:3013 -58:3:2993 -59:0:3013 -60:3:2994 -61:0:3013 -62:3:2995 -63:0:3013 -64:3:2996 -65:0:3013 -66:3:2997 -67:0:3013 -68:3:2998 -69:0:3013 -70:3:2995 -71:0:3013 -72:2:1133 -73:0:3013 -74:2:1134 -75:2:1138 -76:2:1139 -77:2:1147 -78:2:1148 -79:2:1152 -80:2:1153 -81:2:1161 -82:2:1166 -83:2:1170 -84:2:1171 -85:2:1178 -86:2:1179 -87:2:1190 -88:2:1191 -89:2:1192 -90:2:1203 -91:2:1208 -92:2:1209 -93:0:3013 -94:2:1221 -95:2:1222 -96:0:3013 -97:2:1226 -98:2:1230 -99:2:1231 -100:2:1239 -101:2:1240 -102:2:1244 -103:2:1245 -104:2:1253 -105:2:1258 -106:2:1259 -107:2:1270 -108:2:1271 -109:2:1282 -110:2:1283 -111:2:1284 -112:2:1295 -113:2:1300 -114:2:1301 -115:0:3013 -116:2:1313 -117:0:3013 -118:2:1314 -119:0:3013 -120:2:1324 -121:0:3013 -122:2:1325 -123:0:3013 -124:2:1329 -125:2:1330 -126:2:1334 -127:2:1338 -128:2:1339 -129:2:1343 -130:2:1351 -131:2:1352 -132:2:1357 -133:2:1364 -134:2:1365 -135:2:1372 -136:2:1377 -137:0:3013 -138:2:1388 -139:0:3013 -140:2:1392 -141:2:1393 -142:2:1397 -143:2:1401 -144:2:1402 -145:2:1406 -146:2:1414 -147:2:1415 -148:2:1420 -149:2:1427 -150:2:1428 -151:2:1435 -152:2:1440 -153:0:3013 -154:2:1451 -155:0:3013 -156:2:1459 -157:2:1460 -158:2:1464 -159:2:1468 -160:2:1469 -161:2:1473 -162:2:1481 -163:2:1482 -164:2:1487 -165:2:1494 -166:2:1495 -167:2:1502 -168:2:1507 -169:0:3013 -170:2:1522 -171:0:3013 -172:2:1523 -173:2:1527 -174:2:1528 -175:2:1536 -176:2:1537 -177:2:1541 -178:2:1542 -179:2:1550 -180:2:1555 -181:2:1559 -182:2:1560 -183:2:1567 -184:2:1568 -185:2:1579 -186:2:1580 -187:2:1581 -188:2:1592 -189:2:1597 -190:2:1598 -191:0:3013 -192:2:1610 -193:0:3013 -194:2:1613 -195:2:1614 -196:2:1626 -197:2:1627 -198:2:1631 -199:2:1632 -200:2:1640 -201:2:1645 -202:2:1649 -203:2:1650 -204:2:1657 -205:2:1658 -206:2:1669 -207:2:1670 -208:2:1671 -209:2:1682 -210:2:1687 -211:2:1688 -212:0:3013 -213:2:1700 -214:0:3013 -215:2:1701 -216:0:3013 -217:2:1702 -218:0:3013 -219:2:1703 -220:0:3013 -221:2:1704 -222:2:1708 -223:2:1709 -224:2:1717 -225:2:1718 -226:2:1722 -227:2:1723 -228:2:1731 -229:2:1736 -230:2:1740 -231:2:1741 -232:2:1748 -233:2:1749 -234:2:1760 -235:2:1761 -236:2:1762 -237:2:1773 -238:2:1778 -239:2:1779 -240:0:3013 -241:2:1989 -242:0:3013 -243:2:2085 -244:0:3013 -245:2:2086 -246:0:3013 -247:2:2090 -248:0:3013 -249:2:2096 -250:2:2100 -251:2:2101 -252:2:2109 -253:2:2110 -254:2:2114 -255:2:2115 -256:2:2123 -257:2:2128 -258:2:2132 -259:2:2133 -260:2:2140 -261:2:2141 -262:2:2152 -263:2:2153 -264:2:2154 -265:2:2165 -266:2:2170 -267:2:2171 -268:0:3013 -269:2:2183 -270:0:3013 -271:2:2184 -272:2:2188 -273:2:2189 -274:2:2197 -275:2:2198 -276:2:2202 -277:2:2203 -278:2:2211 -279:2:2216 -280:2:2220 -281:2:2221 -282:2:2228 -283:2:2229 -284:2:2240 -285:2:2241 -286:2:2242 -287:2:2253 -288:2:2258 -289:2:2259 -290:0:3013 -291:2:2271 -292:0:3013 -293:2:2274 -294:2:2275 -295:2:2287 -296:2:2288 -297:2:2292 -298:2:2293 -299:2:2301 -300:2:2306 -301:2:2310 -302:2:2311 -303:2:2318 -304:2:2319 -305:2:2330 -306:2:2331 -307:2:2332 -308:2:2343 -309:2:2348 -310:2:2349 -311:0:3013 -312:2:2361 -313:0:3013 -314:2:2362 -315:0:3013 -316:2:2363 -317:0:3013 -318:2:2364 -319:0:3013 -320:2:2365 -321:2:2369 -322:2:2370 -323:2:2378 -324:2:2379 -325:2:2383 -326:2:2384 -327:2:2392 -328:2:2397 -329:2:2401 -330:2:2402 -331:2:2409 -332:2:2410 -333:2:2421 -334:2:2422 -335:2:2423 -336:2:2434 -337:2:2439 -338:2:2440 -339:0:3013 -340:2:2650 -341:0:3013 -342:2:2746 -343:0:3013 -344:2:2747 -345:0:3013 -346:2:2751 -347:0:3013 -348:2:2757 -349:0:3013 -350:2:2761 -351:2:2762 -352:2:2766 -353:2:2770 -354:2:2771 -355:2:2775 -356:2:2783 -357:2:2784 -358:2:2789 -359:2:2796 -360:2:2797 -361:2:2804 -362:2:2809 -363:0:3013 -364:2:2820 -365:0:3013 -366:2:2824 -367:2:2825 -368:2:2829 -369:2:2833 -370:2:2834 -371:2:2838 -372:2:2846 -373:2:2847 -374:2:2852 -375:2:2859 -376:2:2860 -377:2:2867 -378:2:2872 -379:0:3013 -380:2:2883 -381:0:3013 -382:2:2891 -383:2:2892 -384:2:2896 -385:2:2900 -386:2:2901 -387:2:2905 -388:2:2913 -389:2:2914 -390:2:2919 -391:2:2926 -392:2:2927 -393:2:2934 -394:2:2939 -395:0:3013 -396:2:2954 -397:0:3013 -398:2:2955 -399:0:3013 -400:2:1133 -401:0:3013 -402:2:1134 -403:2:1138 -404:2:1139 -405:2:1147 -406:2:1148 -407:2:1152 -408:2:1153 -409:2:1161 -410:2:1166 -411:2:1170 -412:2:1171 -413:2:1178 -414:2:1179 -415:2:1190 -416:2:1191 -417:2:1192 -418:2:1203 -419:2:1208 -420:2:1209 -421:0:3013 -422:2:1221 -423:2:1222 -424:0:3013 -425:2:1226 -426:2:1230 -427:2:1231 -428:2:1239 -429:2:1240 -430:2:1244 -431:2:1245 -432:2:1253 -433:2:1258 -434:2:1259 -435:2:1270 -436:2:1271 -437:2:1282 -438:2:1283 -439:2:1284 -440:2:1295 -441:2:1300 -442:2:1301 -443:0:3013 -444:2:1313 -445:0:3013 -446:2:1314 -447:0:3013 -448:2:1324 -449:0:3013 -450:2:1325 -451:0:3013 -452:2:1329 -453:2:1330 -454:2:1334 -455:2:1338 -456:2:1339 -457:2:1343 -458:2:1351 -459:2:1352 -460:2:1357 -461:2:1364 -462:2:1365 -463:2:1372 -464:2:1377 -465:0:3013 -466:2:1388 -467:0:3013 -468:2:1392 -469:2:1393 -470:2:1397 -471:2:1401 -472:2:1402 -473:2:1406 -474:2:1414 -475:2:1415 -476:2:1420 -477:2:1427 -478:2:1428 -479:2:1435 -480:2:1440 -481:0:3013 -482:2:1451 -483:0:3013 -484:2:1459 -485:2:1460 -486:2:1464 -487:2:1468 -488:2:1469 -489:2:1473 -490:2:1481 -491:2:1482 -492:2:1487 -493:2:1494 -494:2:1495 -495:2:1502 -496:2:1507 -497:0:3013 -498:2:1522 -499:0:3013 -500:2:1523 -501:2:1527 -502:2:1528 -503:2:1536 -504:2:1537 -505:2:1541 -506:2:1542 -507:2:1550 -508:2:1555 -509:2:1559 -510:2:1560 -511:2:1567 -512:2:1568 -513:2:1579 -514:2:1580 -515:2:1581 -516:2:1592 -517:2:1597 -518:2:1598 -519:0:3013 -520:2:1610 -521:0:3013 -522:2:1613 -523:2:1614 -524:2:1626 -525:2:1627 -526:2:1631 -527:2:1632 -528:2:1640 -529:2:1645 -530:2:1649 -531:2:1650 -532:2:1657 -533:2:1658 -534:2:1669 -535:2:1670 -536:2:1671 -537:2:1682 -538:2:1687 -539:2:1688 -540:0:3013 -541:2:1700 -542:0:3013 -543:2:1701 -544:0:3013 -545:2:1702 -546:0:3013 -547:2:1703 -548:0:3013 -549:2:1704 -550:2:1708 -551:2:1709 -552:2:1717 -553:2:1718 -554:2:1722 -555:2:1723 -556:2:1731 -557:2:1736 -558:2:1740 -559:2:1741 -560:2:1748 -561:2:1749 -562:2:1760 -563:2:1761 -564:2:1762 -565:2:1773 -566:2:1778 -567:2:1779 -568:0:3013 -569:2:1989 -570:0:3013 -571:2:2085 -572:0:3013 -573:2:2086 -574:0:3013 -575:2:2090 -576:0:3013 -577:2:2096 -578:2:2100 -579:2:2101 -580:2:2109 -581:2:2110 -582:2:2114 -583:2:2115 -584:2:2123 -585:2:2128 -586:2:2132 -587:2:2133 -588:2:2140 -589:2:2141 -590:2:2152 -591:2:2153 -592:2:2154 -593:2:2165 -594:2:2170 -595:2:2171 -596:0:3013 -597:2:2183 -598:0:3013 -599:2:2184 -600:2:2188 -601:2:2189 -602:2:2197 -603:2:2198 -604:2:2202 -605:2:2203 -606:2:2211 -607:2:2216 -608:2:2220 -609:2:2221 -610:2:2228 -611:2:2229 -612:2:2240 -613:2:2241 -614:2:2242 -615:2:2253 -616:2:2258 -617:2:2259 -618:0:3013 -619:2:2271 -620:0:3013 -621:2:2274 -622:2:2275 -623:2:2287 -624:2:2288 -625:2:2292 -626:2:2293 -627:2:2301 -628:2:2306 -629:2:2310 -630:2:2311 -631:2:2318 -632:2:2319 -633:2:2330 -634:2:2331 -635:2:2332 -636:2:2343 -637:2:2348 -638:2:2349 -639:0:3013 -640:2:2361 -641:0:3013 -642:2:2362 -643:0:3013 -644:2:2363 -645:0:3013 -646:2:2364 -647:0:3013 -648:2:2365 -649:2:2369 -650:2:2370 -651:2:2378 -652:2:2379 -653:2:2383 -654:2:2384 -655:2:2392 -656:2:2397 -657:2:2401 -658:2:2402 -659:2:2409 -660:2:2410 -661:2:2421 -662:2:2422 -663:2:2423 -664:2:2434 -665:2:2439 -666:2:2440 -667:0:3013 -668:2:2650 -669:0:3013 -670:2:2746 -671:0:3013 -672:2:2747 -673:0:3013 -674:2:2751 -675:0:3013 -676:2:2757 -677:0:3013 -678:2:2761 -679:2:2762 -680:2:2766 -681:2:2770 -682:2:2771 -683:2:2775 -684:2:2783 -685:2:2784 -686:2:2789 -687:2:2796 -688:2:2797 -689:2:2804 -690:2:2809 -691:0:3013 -692:2:2820 -693:0:3013 -694:2:2824 -695:2:2825 -696:2:2829 -697:2:2833 -698:2:2834 -699:2:2838 -700:2:2846 -701:2:2847 -702:2:2852 -703:2:2859 -704:2:2860 -705:2:2867 -706:2:2872 -707:0:3013 -708:2:2883 -709:0:3013 -710:2:2891 -711:2:2892 -712:2:2896 -713:2:2900 -714:2:2901 -715:2:2905 -716:2:2913 -717:2:2914 -718:2:2919 -719:2:2926 -720:2:2927 -721:2:2934 -722:2:2939 -723:0:3013 -724:2:2954 -725:0:3013 -726:2:2955 -727:0:3013 -728:2:1133 -729:0:3013 -730:2:1134 -731:2:1138 -732:2:1139 -733:2:1147 -734:2:1148 -735:2:1152 -736:2:1153 -737:2:1161 -738:2:1166 -739:2:1170 -740:2:1171 -741:2:1178 -742:2:1179 -743:2:1190 -744:2:1191 -745:2:1192 -746:2:1203 -747:2:1208 -748:2:1209 -749:0:3013 -750:2:1221 -751:2:1222 -752:0:3013 -753:2:1226 -754:2:1230 -755:2:1231 -756:2:1239 -757:2:1240 -758:2:1244 -759:2:1245 -760:2:1253 -761:2:1258 -762:2:1259 -763:2:1270 -764:2:1271 -765:2:1282 -766:2:1283 -767:2:1284 -768:2:1295 -769:2:1300 -770:2:1301 -771:0:3013 -772:2:1313 -773:0:3013 -774:2:1314 -775:0:3013 -776:2:1324 -777:0:3013 -778:2:1325 -779:0:3013 -780:2:1329 -781:2:1330 -782:2:1334 -783:2:1338 -784:2:1339 -785:2:1343 -786:2:1351 -787:2:1352 -788:2:1357 -789:2:1364 -790:2:1365 -791:2:1372 -792:2:1377 -793:0:3013 -794:2:1388 -795:0:3013 -796:2:1392 -797:2:1393 -798:2:1397 -799:2:1401 -800:2:1402 -801:2:1406 -802:2:1414 -803:2:1415 -804:2:1420 -805:2:1427 -806:2:1428 -807:2:1435 -808:2:1440 -809:0:3013 -810:2:1451 -811:0:3013 -812:2:1459 -813:2:1460 -814:2:1464 -815:2:1468 -816:2:1469 -817:2:1473 -818:2:1481 -819:2:1482 -820:2:1487 -821:2:1494 -822:2:1495 -823:2:1502 -824:2:1507 -825:0:3013 -826:2:1522 -827:0:3013 -828:2:1523 -829:2:1527 -830:2:1528 -831:2:1536 -832:2:1537 -833:2:1541 -834:2:1542 -835:2:1550 -836:2:1555 -837:2:1559 -838:2:1560 -839:2:1567 -840:2:1568 -841:2:1579 -842:2:1580 -843:2:1581 -844:2:1592 -845:2:1597 -846:2:1598 -847:0:3013 -848:2:1610 -849:0:3013 -850:2:1613 -851:2:1614 -852:2:1626 -853:2:1627 -854:2:1631 -855:2:1632 -856:2:1640 -857:2:1645 -858:2:1649 -859:2:1650 -860:2:1657 -861:2:1658 -862:2:1669 -863:2:1670 -864:2:1671 -865:2:1682 -866:2:1687 -867:2:1688 -868:0:3013 -869:2:1700 -870:0:3013 -871:2:1701 -872:0:3013 -873:2:1702 -874:0:3013 -875:2:1703 -876:0:3013 -877:2:1704 -878:2:1708 -879:2:1709 -880:2:1717 -881:2:1718 -882:2:1722 -883:2:1723 -884:2:1731 -885:2:1736 -886:2:1740 -887:2:1741 -888:2:1748 -889:2:1749 -890:2:1760 -891:2:1761 -892:2:1762 -893:2:1773 -894:2:1778 -895:2:1779 -896:0:3013 -897:2:1989 -898:0:3013 -899:2:2085 -900:0:3013 -901:2:2086 -902:0:3013 -903:2:2090 -904:0:3013 -905:2:2096 -906:2:2100 -907:2:2101 -908:2:2109 -909:2:2110 -910:2:2114 -911:2:2115 -912:2:2123 -913:2:2128 -914:2:2132 -915:2:2133 -916:2:2140 -917:2:2141 -918:2:2152 -919:2:2153 -920:2:2154 -921:2:2165 -922:2:2170 -923:2:2171 -924:0:3013 -925:2:2183 -926:0:3013 -927:2:2184 -928:2:2188 -929:2:2189 -930:2:2197 -931:2:2198 -932:2:2202 -933:2:2203 -934:2:2211 -935:2:2216 -936:2:2220 -937:2:2221 -938:2:2228 -939:2:2229 -940:2:2240 -941:2:2241 -942:2:2242 -943:2:2253 -944:2:2258 -945:2:2259 -946:0:3013 -947:2:2271 -948:0:3013 -949:2:2274 -950:2:2275 -951:2:2287 -952:2:2288 -953:2:2292 -954:2:2293 -955:2:2301 -956:2:2306 -957:2:2310 -958:2:2311 -959:2:2318 -960:2:2319 -961:2:2330 -962:2:2331 -963:2:2332 -964:2:2343 -965:2:2348 -966:2:2349 -967:0:3013 -968:2:2361 -969:0:3013 -970:2:2362 -971:0:3013 -972:2:2363 -973:0:3013 -974:2:2364 -975:0:3013 -976:2:2365 -977:2:2369 -978:2:2370 -979:2:2378 -980:2:2379 -981:2:2383 -982:2:2384 -983:2:2392 -984:2:2397 -985:2:2401 -986:2:2402 -987:2:2409 -988:2:2410 -989:2:2421 -990:2:2422 -991:2:2423 -992:2:2434 -993:2:2439 -994:2:2440 -995:0:3013 -996:2:2650 -997:0:3013 -998:2:2746 -999:0:3013 -1000:2:2747 -1001:0:3013 -1002:2:2751 -1003:0:3013 -1004:2:2757 -1005:0:3013 -1006:2:2761 -1007:2:2762 -1008:2:2766 -1009:2:2770 -1010:2:2771 -1011:2:2775 -1012:2:2783 -1013:2:2784 -1014:2:2789 -1015:2:2796 -1016:2:2797 -1017:2:2804 -1018:2:2809 -1019:0:3013 -1020:2:2820 -1021:0:3013 -1022:2:2824 -1023:2:2825 -1024:2:2829 -1025:2:2833 -1026:2:2834 -1027:2:2838 -1028:2:2846 -1029:2:2847 -1030:2:2852 -1031:2:2859 -1032:2:2860 -1033:2:2867 -1034:2:2872 -1035:0:3013 -1036:2:2883 -1037:0:3013 -1038:2:2891 -1039:2:2892 -1040:2:2896 -1041:2:2900 -1042:2:2901 -1043:2:2905 -1044:2:2913 -1045:2:2914 -1046:2:2919 -1047:2:2926 -1048:2:2927 -1049:2:2934 -1050:2:2939 -1051:0:3013 -1052:2:2954 -1053:0:3013 -1054:2:2955 -1055:0:3013 -1056:2:1133 -1057:0:3013 -1058:2:1134 -1059:2:1138 -1060:2:1139 -1061:2:1147 -1062:2:1148 -1063:2:1152 -1064:2:1153 -1065:2:1161 -1066:2:1166 -1067:2:1170 -1068:2:1171 -1069:2:1178 -1070:2:1179 -1071:2:1190 -1072:2:1191 -1073:2:1192 -1074:2:1203 -1075:2:1208 -1076:2:1209 -1077:0:3013 -1078:2:1221 -1079:2:1222 -1080:0:3013 -1081:2:1226 -1082:2:1230 -1083:2:1231 -1084:2:1239 -1085:2:1240 -1086:2:1244 -1087:2:1245 -1088:2:1253 -1089:2:1258 -1090:2:1259 -1091:2:1270 -1092:2:1271 -1093:2:1282 -1094:2:1283 -1095:2:1284 -1096:2:1295 -1097:2:1300 -1098:2:1301 -1099:0:3013 -1100:2:1313 -1101:0:3013 -1102:2:1314 -1103:0:3013 -1104:2:1324 -1105:0:3013 -1106:2:1325 -1107:0:3013 -1108:2:1329 -1109:2:1330 -1110:2:1334 -1111:2:1338 -1112:2:1339 -1113:2:1343 -1114:2:1351 -1115:2:1352 -1116:2:1357 -1117:2:1364 -1118:2:1365 -1119:2:1372 -1120:2:1377 -1121:0:3013 -1122:2:1388 -1123:0:3013 -1124:2:1392 -1125:2:1393 -1126:2:1397 -1127:2:1401 -1128:2:1402 -1129:2:1406 -1130:2:1414 -1131:2:1415 -1132:2:1420 -1133:2:1427 -1134:2:1428 -1135:2:1435 -1136:2:1440 -1137:0:3013 -1138:2:1451 -1139:0:3013 -1140:2:1459 -1141:2:1460 -1142:2:1464 -1143:2:1468 -1144:2:1469 -1145:2:1473 -1146:2:1481 -1147:2:1482 -1148:2:1487 -1149:2:1494 -1150:2:1495 -1151:2:1502 -1152:2:1507 -1153:0:3013 -1154:2:1522 -1155:0:3013 -1156:2:1523 -1157:2:1527 -1158:2:1528 -1159:2:1536 -1160:2:1537 -1161:2:1541 -1162:2:1542 -1163:2:1550 -1164:2:1555 -1165:2:1559 -1166:2:1560 -1167:2:1567 -1168:2:1568 -1169:2:1579 -1170:2:1580 -1171:2:1581 -1172:2:1592 -1173:2:1597 -1174:2:1598 -1175:0:3013 -1176:2:1610 -1177:0:3013 -1178:2:1613 -1179:2:1614 -1180:2:1626 -1181:2:1627 -1182:2:1631 -1183:2:1632 -1184:2:1640 -1185:2:1645 -1186:2:1649 -1187:2:1650 -1188:2:1657 -1189:2:1658 -1190:2:1669 -1191:2:1670 -1192:2:1671 -1193:2:1682 -1194:2:1687 -1195:2:1688 -1196:0:3013 -1197:2:1700 -1198:0:3013 -1199:2:1701 -1200:0:3013 -1201:2:1702 -1202:0:3013 -1203:2:1703 -1204:0:3013 -1205:2:1704 -1206:2:1708 -1207:2:1709 -1208:2:1717 -1209:2:1718 -1210:2:1722 -1211:2:1723 -1212:2:1731 -1213:2:1736 -1214:2:1740 -1215:2:1741 -1216:2:1748 -1217:2:1749 -1218:2:1760 -1219:2:1761 -1220:2:1762 -1221:2:1773 -1222:2:1778 -1223:2:1779 -1224:0:3013 -1225:2:1989 -1226:0:3013 -1227:2:2085 -1228:0:3013 -1229:2:2086 -1230:0:3013 -1231:2:2090 -1232:0:3013 -1233:2:2096 -1234:2:2100 -1235:2:2101 -1236:2:2109 -1237:2:2110 -1238:2:2114 -1239:2:2115 -1240:2:2123 -1241:2:2128 -1242:2:2132 -1243:2:2133 -1244:2:2140 -1245:2:2141 -1246:2:2152 -1247:2:2153 -1248:2:2154 -1249:2:2165 -1250:2:2170 -1251:2:2171 -1252:0:3013 -1253:2:2183 -1254:0:3013 -1255:2:2184 -1256:2:2188 -1257:2:2189 -1258:2:2197 -1259:2:2198 -1260:2:2202 -1261:2:2203 -1262:2:2211 -1263:2:2216 -1264:2:2220 -1265:2:2221 -1266:2:2228 -1267:2:2229 -1268:2:2240 -1269:2:2241 -1270:2:2242 -1271:2:2253 -1272:2:2258 -1273:2:2259 -1274:0:3013 -1275:2:2271 -1276:0:3013 -1277:2:2274 -1278:2:2275 -1279:2:2287 -1280:2:2288 -1281:2:2292 -1282:2:2293 -1283:2:2301 -1284:2:2306 -1285:2:2310 -1286:2:2311 -1287:2:2318 -1288:2:2319 -1289:2:2330 -1290:2:2331 -1291:2:2332 -1292:2:2343 -1293:2:2348 -1294:2:2349 -1295:0:3013 -1296:2:2361 -1297:0:3013 -1298:2:2362 -1299:0:3013 -1300:2:2363 -1301:0:3013 -1302:2:2364 -1303:0:3013 -1304:2:2365 -1305:2:2369 -1306:2:2370 -1307:2:2378 -1308:2:2379 -1309:2:2383 -1310:2:2384 -1311:2:2392 -1312:2:2397 -1313:2:2401 -1314:2:2402 -1315:2:2409 -1316:2:2410 -1317:2:2421 -1318:2:2422 -1319:2:2423 -1320:2:2434 -1321:2:2439 -1322:2:2440 -1323:0:3013 -1324:2:2650 -1325:0:3013 -1326:2:2746 -1327:0:3013 -1328:2:2747 -1329:0:3013 -1330:2:2751 -1331:0:3013 -1332:2:2757 -1333:0:3013 -1334:2:2761 -1335:2:2762 -1336:2:2766 -1337:2:2770 -1338:2:2771 -1339:2:2775 -1340:2:2783 -1341:2:2784 -1342:2:2789 -1343:2:2796 -1344:2:2797 -1345:2:2804 -1346:2:2809 -1347:0:3013 -1348:2:2820 -1349:0:3013 -1350:2:2824 -1351:2:2825 -1352:2:2829 -1353:2:2833 -1354:2:2834 -1355:2:2838 -1356:2:2846 -1357:2:2847 -1358:2:2852 -1359:2:2859 -1360:2:2860 -1361:2:2867 -1362:2:2872 -1363:0:3013 -1364:2:2883 -1365:0:3013 -1366:2:2891 -1367:2:2892 -1368:2:2896 -1369:2:2900 -1370:2:2901 -1371:2:2905 -1372:2:2913 -1373:2:2914 -1374:2:2919 -1375:2:2926 -1376:2:2927 -1377:2:2934 -1378:2:2939 -1379:0:3013 -1380:2:2954 -1381:0:3013 -1382:2:2955 -1383:0:3013 -1384:2:1133 -1385:0:3013 -1386:2:1134 -1387:2:1138 -1388:2:1139 -1389:2:1147 -1390:2:1148 -1391:2:1152 -1392:2:1153 -1393:2:1161 -1394:2:1166 -1395:2:1170 -1396:2:1171 -1397:2:1178 -1398:2:1179 -1399:2:1190 -1400:2:1191 -1401:2:1192 -1402:2:1203 -1403:2:1208 -1404:2:1209 -1405:0:3013 -1406:2:1221 -1407:2:1222 -1408:0:3013 -1409:2:1226 -1410:2:1230 -1411:2:1231 -1412:2:1239 -1413:2:1240 -1414:2:1244 -1415:2:1245 -1416:2:1253 -1417:2:1258 -1418:2:1259 -1419:2:1270 -1420:2:1271 -1421:2:1282 -1422:2:1283 -1423:2:1284 -1424:2:1295 -1425:2:1300 -1426:2:1301 -1427:0:3013 -1428:2:1313 -1429:0:3013 -1430:2:1314 -1431:0:3013 -1432:2:1324 -1433:0:3013 -1434:2:1325 -1435:0:3013 -1436:2:1329 -1437:2:1330 -1438:2:1334 -1439:2:1338 -1440:2:1339 -1441:2:1343 -1442:2:1351 -1443:2:1352 -1444:2:1357 -1445:2:1364 -1446:2:1365 -1447:2:1372 -1448:2:1377 -1449:0:3013 -1450:2:1388 -1451:0:3013 -1452:1:4 -1453:1:8 -1454:1:9 -1455:1:17 -1456:1:18 -1457:1:22 -1458:1:23 -1459:1:31 -1460:1:36 -1461:1:40 -1462:1:41 -1463:1:48 -1464:1:49 -1465:1:60 -1466:1:61 -1467:1:62 -1468:1:73 -1469:1:85 -1470:1:86 -1471:0:3013 -1472:1:91 -1473:0:3013 -1474:1:92 -1475:1:96 -1476:1:97 -1477:1:105 -1478:1:106 -1479:1:110 -1480:1:111 -1481:1:119 -1482:1:124 -1483:1:128 -1484:1:129 -1485:1:136 -1486:1:137 -1487:1:148 -1488:1:149 -1489:1:150 -1490:1:161 -1491:1:173 -1492:1:174 -1493:0:3013 -1494:1:179 -1495:0:3013 -1496:1:180 -1497:0:3013 -1498:1:181 -1499:1:185 -1500:1:186 -1501:1:194 -1502:1:195 -1503:1:199 -1504:1:200 -1505:1:208 -1506:1:213 -1507:1:217 -1508:1:218 -1509:1:225 -1510:1:226 -1511:1:237 -1512:1:238 -1513:1:239 -1514:1:250 -1515:1:262 -1516:1:263 -1517:0:3013 -1518:1:268 -1519:0:3013 -1520:1:469 -1521:0:3013 -1522:1:470 -1523:0:3013 -1524:1:3 -1525:0:3013 -1526:1:4 -1527:1:8 -1528:1:9 -1529:1:17 -1530:1:18 -1531:1:19 -1532:1:31 -1533:1:36 -1534:1:40 -1535:1:41 -1536:1:48 -1537:1:49 -1538:1:60 -1539:1:61 -1540:1:62 -1541:1:73 -1542:1:85 -1543:1:86 -1544:0:3013 -1545:1:91 -1546:0:3013 -1547:1:92 -1548:1:96 -1549:1:97 -1550:1:105 -1551:1:106 -1552:1:110 -1553:1:111 -1554:1:119 -1555:1:124 -1556:1:128 -1557:1:129 -1558:1:136 -1559:1:137 -1560:1:148 -1561:1:149 -1562:1:150 -1563:1:161 -1564:1:173 -1565:1:174 -1566:0:3013 -1567:1:271 -1568:0:3013 -1569:1:272 -1570:0:3013 -1571:1:469 -1572:0:3013 -1573:1:470 -1574:0:3013 -1575:1:475 -1576:0:3013 -1577:1:480 -1578:1:484 -1579:1:485 -1580:1:493 -1581:1:494 -1582:1:495 -1583:1:507 -1584:1:512 -1585:1:516 -1586:1:517 -1587:1:524 -1588:1:525 -1589:1:536 -1590:1:537 -1591:1:538 -1592:1:549 -1593:1:561 -1594:1:562 -1595:0:3013 -1596:1:567 -1597:0:3013 -1598:2:1392 -1599:2:1393 -1600:2:1397 -1601:2:1401 -1602:2:1402 -1603:2:1406 -1604:2:1414 -1605:2:1415 -1606:2:1420 -1607:2:1427 -1608:2:1428 -1609:2:1435 -1610:2:1440 -1611:0:3013 -1612:2:1451 -1613:0:3013 -1614:2:1459 -1615:2:1460 -1616:2:1464 -1617:2:1468 -1618:2:1469 -1619:2:1473 -1620:2:1481 -1621:2:1482 -1622:2:1487 -1623:2:1494 -1624:2:1495 -1625:2:1502 -1626:2:1507 -1627:0:3013 -1628:3:2996 -1629:0:3013 -1630:3:2997 -1631:0:3013 -1632:3:2998 -1633:0:3013 -1634:3:2999 -1635:0:3013 -1636:3:3005 -1637:0:3013 -1638:3:3010 -1639:0:3013 -1640:2:1522 -1641:0:3013 -1642:2:1523 -1643:2:1527 -1644:2:1528 -1645:2:1536 -1646:2:1537 -1647:2:1541 -1648:2:1542 -1649:2:1550 -1650:2:1555 -1651:2:1559 -1652:2:1560 -1653:2:1567 -1654:2:1568 -1655:2:1579 -1656:2:1587 -1657:2:1588 -1658:2:1592 -1659:2:1597 -1660:2:1598 -1661:0:3013 -1662:2:1610 -1663:0:3013 -1664:2:1613 -1665:2:1614 -1666:2:1626 -1667:2:1627 -1668:2:1631 -1669:2:1632 -1670:2:1640 -1671:2:1645 -1672:2:1649 -1673:2:1650 -1674:2:1657 -1675:2:1658 -1676:2:1669 -1677:2:1677 -1678:2:1678 -1679:2:1682 -1680:2:1687 -1681:2:1688 -1682:0:3013 -1683:2:1700 -1684:0:3013 -1685:2:1701 -1686:0:3013 -1687:2:1702 -1688:0:3013 -1689:2:1703 -1690:0:3013 -1691:2:1704 -1692:2:1708 -1693:2:1709 -1694:2:1717 -1695:2:1718 -1696:2:1722 -1697:2:1723 -1698:2:1731 -1699:2:1736 -1700:2:1740 -1701:2:1741 -1702:2:1748 -1703:2:1749 -1704:2:1760 -1705:2:1761 -1706:2:1762 -1707:2:1773 -1708:2:1778 -1709:2:1779 -1710:0:3013 -1711:2:1989 -1712:0:3013 -1713:2:2085 -1714:0:3013 -1715:2:2086 -1716:0:3013 -1717:2:2090 -1718:0:3013 -1719:2:2096 -1720:2:2100 -1721:2:2101 -1722:2:2109 -1723:2:2110 -1724:2:2114 -1725:2:2115 -1726:2:2123 -1727:2:2128 -1728:2:2132 -1729:2:2133 -1730:2:2140 -1731:2:2141 -1732:2:2152 -1733:2:2153 -1734:2:2154 -1735:2:2165 -1736:2:2170 -1737:2:2171 -1738:0:3013 -1739:2:2183 -1740:0:3013 -1741:2:2184 -1742:2:2188 -1743:2:2189 -1744:2:2197 -1745:2:2198 -1746:2:2202 -1747:2:2203 -1748:2:2211 -1749:2:2216 -1750:2:2220 -1751:2:2221 -1752:2:2228 -1753:2:2229 -1754:2:2240 -1755:2:2241 -1756:2:2242 -1757:2:2253 -1758:2:2258 -1759:2:2259 -1760:0:3013 -1761:2:2271 -1762:0:3013 -1763:2:2274 -1764:2:2275 -1765:2:2287 -1766:2:2288 -1767:2:2292 -1768:2:2293 -1769:2:2301 -1770:2:2306 -1771:2:2310 -1772:2:2311 -1773:2:2318 -1774:2:2319 -1775:2:2330 -1776:2:2331 -1777:2:2332 -1778:2:2343 -1779:2:2348 -1780:2:2349 -1781:0:3013 -1782:2:2361 -1783:0:3013 -1784:2:2362 -1785:0:3013 -1786:2:2363 -1787:0:3013 -1788:2:2364 -1789:0:3013 -1790:2:2365 -1791:2:2369 -1792:2:2370 -1793:2:2378 -1794:2:2379 -1795:2:2383 -1796:2:2384 -1797:2:2392 -1798:2:2397 -1799:2:2401 -1800:2:2402 -1801:2:2409 -1802:2:2410 -1803:2:2421 -1804:2:2422 -1805:2:2423 -1806:2:2434 -1807:2:2439 -1808:2:2440 -1809:0:3013 -1810:2:2650 -1811:0:3013 -1812:2:2746 -1813:0:3013 -1814:2:2747 -1815:0:3013 -1816:2:2751 -1817:0:3013 -1818:2:2757 -1819:0:3013 -1820:2:2761 -1821:2:2762 -1822:2:2766 -1823:2:2770 -1824:2:2771 -1825:2:2775 -1826:2:2783 -1827:2:2784 -1828:2:2789 -1829:2:2796 -1830:2:2797 -1831:2:2804 -1832:2:2809 -1833:0:3013 -1834:2:2820 -1835:0:3013 -1836:2:2824 -1837:2:2825 -1838:2:2829 -1839:2:2833 -1840:2:2834 -1841:2:2838 -1842:2:2846 -1843:2:2847 -1844:2:2852 -1845:2:2859 -1846:2:2860 -1847:2:2867 -1848:2:2872 -1849:0:3013 -1850:2:2883 -1851:0:3013 -1852:2:2891 -1853:2:2892 -1854:2:2896 -1855:2:2900 -1856:2:2901 -1857:2:2905 -1858:2:2913 -1859:2:2914 -1860:2:2919 -1861:2:2926 -1862:2:2927 -1863:2:2934 -1864:2:2939 -1865:0:3013 -1866:2:2954 -1867:0:3013 -1868:2:2955 -1869:0:3013 -1870:2:2958 -1871:0:3013 -1872:2:2963 -1873:0:3013 -1874:1:568 -1875:1:572 -1876:1:573 -1877:1:581 -1878:1:582 -1879:1:586 -1880:1:587 -1881:1:595 -1882:1:600 -1883:1:604 -1884:1:605 -1885:1:612 -1886:1:613 -1887:1:624 -1888:1:625 -1889:1:626 -1890:1:637 -1891:1:642 -1892:1:643 -1893:0:3013 -1894:2:2964 -1895:0:3013 -1896:1:655 -1897:0:3011 -1898:2:2963 -1899:0:3017 -1900:1:655 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_nested.define b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_nested.define deleted file mode 100644 index e69de29..0000000 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_nested.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_nested.log deleted file mode 100644 index 708dee2..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_nested.log +++ /dev/null @@ -1,415 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_nested.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 566) -Depth= 4234 States= 1e+06 Transitions= 1.7e+07 Memory= 527.287 t= 31.2 R= 3e+04 -Depth= 4234 States= 2e+06 Transitions= 3.44e+07 Memory= 588.322 t= 63.7 R= 3e+04 -Depth= 4234 States= 3e+06 Transitions= 5.2e+07 Memory= 649.358 t= 96.8 R= 3e+04 -pan: resizing hashtable to -w22.. done -Depth= 4234 States= 4e+06 Transitions= 6.97e+07 Memory= 741.416 t= 130 R= 3e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 4234, errors: 0 - 4027146 states, stored - 66145121 states, matched - 70172267 transitions (= stored+matched) -2.6437688e+08 atomic steps -hash conflicts: 47318190 (resolved) - -Stats on memory usage (in Megabytes): - 322.609 equivalent memory usage for states (stored*(State-vector + overhead)) - 253.418 actual memory usage for states (compression: 78.55%) - state-vector as stored = 38 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 743.076 total actual memory usage - -unreached in proctype urcu_reader - line 288, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 61, "(1)" - line 307, "pan.___", state 91, "(1)" - line 288, "pan.___", state 104, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 136, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 149, "(1)" - line 307, "pan.___", state 179, "(1)" - line 288, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 225, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 238, "(1)" - line 307, "pan.___", state 268, "(1)" - line 158, "pan.___", state 289, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 158, "pan.___", state 291, "(1)" - line 162, "pan.___", state 298, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 300, "(1)" - line 162, "pan.___", state 301, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 162, "pan.___", state 301, "else" - line 160, "pan.___", state 306, "((j<1))" - line 160, "pan.___", state 306, "((j>=1))" - line 166, "pan.___", state 311, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 321, "(1)" - line 147, "pan.___", state 329, "(1)" - line 147, "pan.___", state 330, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 147, "pan.___", state 330, "else" - line 145, "pan.___", state 335, "((j<1))" - line 145, "pan.___", state 335, "((j>=1))" - line 151, "pan.___", state 341, "(1)" - line 151, "pan.___", state 342, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 151, "pan.___", state 342, "else" - line 153, "pan.___", state 345, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 153, "pan.___", state 345, "else" - line 185, "pan.___", state 347, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 185, "pan.___", state 347, "else" - line 158, "pan.___", state 352, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 166, "pan.___", state 374, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 151, "pan.___", state 404, "(1)" - line 151, "pan.___", state 405, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 158, "pan.___", state 419, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 158, "pan.___", state 421, "(1)" - line 162, "pan.___", state 428, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 430, "(1)" - line 162, "pan.___", state 431, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 162, "pan.___", state 431, "else" - line 160, "pan.___", state 436, "((j<1))" - line 160, "pan.___", state 436, "((j>=1))" - line 166, "pan.___", state 441, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 451, "(1)" - line 147, "pan.___", state 459, "(1)" - line 147, "pan.___", state 460, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 147, "pan.___", state 460, "else" - line 145, "pan.___", state 465, "((j<1))" - line 145, "pan.___", state 465, "((j>=1))" - line 151, "pan.___", state 471, "(1)" - line 151, "pan.___", state 472, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 151, "pan.___", state 472, "else" - line 153, "pan.___", state 475, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 153, "pan.___", state 475, "else" - line 185, "pan.___", state 477, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 185, "pan.___", state 477, "else" - line 288, "pan.___", state 492, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 524, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 537, "(1)" - line 307, "pan.___", state 567, "(1)" - line 288, "pan.___", state 580, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 612, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 625, "(1)" - line 307, "pan.___", state 655, "(1)" - line 288, "pan.___", state 668, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 713, "(1)" - line 307, "pan.___", state 743, "(1)" - line 158, "pan.___", state 758, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 158, "pan.___", state 760, "(1)" - line 162, "pan.___", state 767, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 769, "(1)" - line 162, "pan.___", state 770, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 162, "pan.___", state 770, "else" - line 160, "pan.___", state 775, "((j<1))" - line 160, "pan.___", state 775, "((j>=1))" - line 166, "pan.___", state 780, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 790, "(1)" - line 147, "pan.___", state 798, "(1)" - line 147, "pan.___", state 799, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 147, "pan.___", state 799, "else" - line 145, "pan.___", state 804, "((j<1))" - line 145, "pan.___", state 804, "((j>=1))" - line 151, "pan.___", state 810, "(1)" - line 151, "pan.___", state 811, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 151, "pan.___", state 811, "else" - line 153, "pan.___", state 814, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 153, "pan.___", state 814, "else" - line 185, "pan.___", state 816, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 185, "pan.___", state 816, "else" - line 158, "pan.___", state 821, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 166, "pan.___", state 843, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 151, "pan.___", state 873, "(1)" - line 151, "pan.___", state 874, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 158, "pan.___", state 888, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 158, "pan.___", state 890, "(1)" - line 162, "pan.___", state 897, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 899, "(1)" - line 162, "pan.___", state 900, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 162, "pan.___", state 900, "else" - line 160, "pan.___", state 905, "((j<1))" - line 160, "pan.___", state 905, "((j>=1))" - line 166, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 920, "(1)" - line 147, "pan.___", state 928, "(1)" - line 147, "pan.___", state 929, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 147, "pan.___", state 929, "else" - line 145, "pan.___", state 934, "((j<1))" - line 145, "pan.___", state 934, "((j>=1))" - line 151, "pan.___", state 940, "(1)" - line 151, "pan.___", state 941, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 151, "pan.___", state 941, "else" - line 153, "pan.___", state 944, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 153, "pan.___", state 944, "else" - line 185, "pan.___", state 946, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 185, "pan.___", state 946, "else" - line 288, "pan.___", state 956, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 988, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1001, "(1)" - line 307, "pan.___", state 1031, "(1)" - line 288, "pan.___", state 1052, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1084, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1097, "(1)" - line 307, "pan.___", state 1127, "(1)" - line 433, "pan.___", state 1140, "-end-" - (125 of 1140 states) -unreached in proctype urcu_writer - line 288, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 292, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 59, "(1)" - line 302, "pan.___", state 72, "(1)" - line 307, "pan.___", state 89, "(1)" - line 288, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 292, "pan.___", state 120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 151, "(1)" - line 302, "pan.___", state 164, "(1)" - line 467, "pan.___", state 195, "(1)" - line 158, "pan.___", state 205, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 162, "pan.___", state 214, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 237, "(1)" - line 147, "pan.___", state 245, "(1)" - line 151, "pan.___", state 257, "(1)" - line 158, "pan.___", state 268, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 297, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 923, "(1)" - line 298, "pan.___", state 924, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 298, "pan.___", state 924, "else" - line 298, "pan.___", state 927, "(1)" - line 298, "pan.___", state 928, "(1)" - line 298, "pan.___", state 928, "(1)" - line 302, "pan.___", state 936, "(1)" - line 302, "pan.___", state 937, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 302, "pan.___", state 937, "else" - line 302, "pan.___", state 940, "(1)" - line 302, "pan.___", state 941, "(1)" - line 302, "pan.___", state 941, "(1)" - line 300, "pan.___", state 946, "((i<1))" - line 300, "pan.___", state 946, "((i>=1))" - line 307, "pan.___", state 953, "(1)" - line 307, "pan.___", state 954, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 307, "pan.___", state 954, "else" - line 307, "pan.___", state 957, "(1)" - line 307, "pan.___", state 958, "(1)" - line 307, "pan.___", state 958, "(1)" - line 309, "pan.___", state 961, "(1)" - line 309, "pan.___", state 961, "(1)" - line 292, "pan.___", state 990, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1008, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 302, "pan.___", state 1034, "(1)" - line 307, "pan.___", state 1051, "(1)" - line 292, "pan.___", state 1078, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1096, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 302, "pan.___", state 1122, "(1)" - line 307, "pan.___", state 1139, "(1)" - line 288, "pan.___", state 1156, "(1)" - line 292, "pan.___", state 1168, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1186, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 302, "pan.___", state 1212, "(1)" - line 307, "pan.___", state 1229, "(1)" - line 292, "pan.___", state 1259, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 297, "pan.___", state 1277, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 302, "pan.___", state 1303, "(1)" - line 307, "pan.___", state 1320, "(1)" - line 162, "pan.___", state 1342, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 166, "pan.___", state 1355, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 1365, "(1)" - line 147, "pan.___", state 1373, "(1)" - line 151, "pan.___", state 1385, "(1)" - line 158, "pan.___", state 1396, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 297, "pan.___", state 1571, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1584, "(1)" - line 298, "pan.___", state 1585, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 298, "pan.___", state 1585, "else" - line 298, "pan.___", state 1588, "(1)" - line 298, "pan.___", state 1589, "(1)" - line 298, "pan.___", state 1589, "(1)" - line 302, "pan.___", state 1597, "(1)" - line 302, "pan.___", state 1598, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 302, "pan.___", state 1598, "else" - line 302, "pan.___", state 1601, "(1)" - line 302, "pan.___", state 1602, "(1)" - line 302, "pan.___", state 1602, "(1)" - line 300, "pan.___", state 1607, "((i<1))" - line 300, "pan.___", state 1607, "((i>=1))" - line 307, "pan.___", state 1614, "(1)" - line 307, "pan.___", state 1615, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 307, "pan.___", state 1615, "else" - line 307, "pan.___", state 1618, "(1)" - line 307, "pan.___", state 1619, "(1)" - line 307, "pan.___", state 1619, "(1)" - line 309, "pan.___", state 1622, "(1)" - line 309, "pan.___", state 1622, "(1)" - line 162, "pan.___", state 1646, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 166, "pan.___", state 1659, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 143, "pan.___", state 1669, "(1)" - line 147, "pan.___", state 1677, "(1)" - line 151, "pan.___", state 1689, "(1)" - line 158, "pan.___", state 1700, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - atomic { - if - :: get_readerid() == 0 -> -progress_reader: - skip; - :: else -> - skip; - fi; - } -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_nested.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_nested.spin.input.trail deleted file mode 100644 index 2cefe6b..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_nested.spin.input.trail +++ /dev/null @@ -1,7 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2679 -2:1:2673 -3:1:2674 -4:0:2679 -5:3:1129 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.define b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.define deleted file mode 100644 index 136ef67..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.define +++ /dev/null @@ -1,2 +0,0 @@ -#define NO_RMB -#define NO_WMB diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.log deleted file mode 100644 index c722840..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.log +++ /dev/null @@ -1,16 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_mb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -spin: line 291 "pan.___", Error: syntax error saw 'operator: =' -spin: line 291 "pan.___", Error: syntax error saw 'operator: =' -spin: 2 error(s) - aborting -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input deleted file mode 100644 index 1346c4e..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input +++ /dev/null @@ -1,533 +0,0 @@ -#define NO_RMB -#define NO_WMB - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - - -#if (NR_READERS == 1) - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#elif (NR_READERS == 2) - -#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) -#define read_free (free_done && (data_access[0] || data_access[1])) - -#else - -#error "Too many readers" - -#endif - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - atomic { - if - :: get_readerid() == 0 -> -progress_reader: - skip; - :: else -> - skip; - fi; - } -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input.trail deleted file mode 100644 index 3d2a95e..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_mb.spin.input.trail +++ /dev/null @@ -1,2082 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:3537 -2:3:3489 -3:3:3492 -4:3:3492 -5:3:3495 -6:3:3503 -7:3:3503 -8:3:3506 -9:3:3512 -10:3:3516 -11:3:3516 -12:3:3519 -13:3:3527 -14:3:3531 -15:3:3532 -16:0:3537 -17:3:3534 -18:0:3537 -19:2:1310 -20:0:3537 -21:2:1316 -22:0:3537 -23:2:1317 -24:0:3537 -25:2:1318 -26:2:1322 -27:2:1323 -28:2:1331 -29:2:1332 -30:2:1336 -31:2:1337 -32:2:1345 -33:2:1350 -34:2:1354 -35:2:1355 -36:2:1362 -37:2:1363 -38:2:1374 -39:2:1375 -40:2:1376 -41:2:1387 -42:2:1392 -43:2:1393 -44:0:3537 -45:2:1405 -46:2:1406 -47:0:3537 -48:2:1410 -49:2:1414 -50:2:1415 -51:2:1423 -52:2:1424 -53:2:1428 -54:2:1429 -55:2:1437 -56:2:1442 -57:2:1443 -58:2:1454 -59:2:1455 -60:2:1466 -61:2:1467 -62:2:1468 -63:2:1479 -64:2:1484 -65:2:1485 -66:0:3537 -67:2:1497 -68:0:3537 -69:2:1498 -70:0:3537 -71:2:1508 -72:0:3537 -73:2:1509 -74:0:3537 -75:2:1510 -76:2:1514 -77:2:1515 -78:2:1523 -79:2:1524 -80:2:1528 -81:2:1529 -82:2:1537 -83:2:1542 -84:2:1546 -85:2:1547 -86:2:1554 -87:2:1555 -88:2:1566 -89:2:1567 -90:2:1568 -91:2:1579 -92:2:1584 -93:2:1585 -94:0:3537 -95:2:1600 -96:0:3537 -97:2:1601 -98:2:1605 -99:2:1606 -100:2:1614 -101:2:1615 -102:2:1619 -103:2:1620 -104:2:1628 -105:2:1633 -106:2:1637 -107:2:1638 -108:2:1645 -109:2:1646 -110:2:1657 -111:2:1658 -112:2:1659 -113:2:1670 -114:2:1675 -115:2:1676 -116:0:3537 -117:2:1691 -118:0:3537 -119:2:1696 -120:2:1700 -121:2:1701 -122:2:1709 -123:2:1710 -124:2:1714 -125:2:1715 -126:2:1723 -127:2:1728 -128:2:1732 -129:2:1733 -130:2:1740 -131:2:1741 -132:2:1752 -133:2:1753 -134:2:1754 -135:2:1765 -136:2:1770 -137:2:1771 -138:0:3537 -139:2:1790 -140:0:3537 -141:2:1791 -142:2:1795 -143:2:1796 -144:2:1804 -145:2:1805 -146:2:1809 -147:2:1810 -148:2:1818 -149:2:1823 -150:2:1827 -151:2:1828 -152:2:1835 -153:2:1836 -154:2:1847 -155:2:1848 -156:2:1849 -157:2:1860 -158:2:1865 -159:2:1866 -160:0:3537 -161:2:1878 -162:0:3537 -163:2:1881 -164:2:1882 -165:2:1894 -166:2:1895 -167:2:1899 -168:2:1900 -169:2:1908 -170:2:1913 -171:2:1917 -172:2:1918 -173:2:1925 -174:2:1926 -175:2:1937 -176:2:1938 -177:2:1939 -178:2:1950 -179:2:1955 -180:2:1956 -181:0:3537 -182:2:1968 -183:0:3537 -184:2:1969 -185:0:3537 -186:2:1970 -187:0:3537 -188:2:1971 -189:0:3537 -190:2:1972 -191:2:1976 -192:2:1977 -193:2:1985 -194:2:1986 -195:2:1990 -196:2:1991 -197:2:1999 -198:2:2004 -199:2:2008 -200:2:2009 -201:2:2016 -202:2:2017 -203:2:2028 -204:2:2029 -205:2:2030 -206:2:2041 -207:2:2046 -208:2:2047 -209:0:3537 -210:2:2341 -211:0:3537 -212:2:2437 -213:0:3537 -214:2:2438 -215:0:3537 -216:2:2442 -217:0:3537 -218:2:2448 -219:2:2452 -220:2:2453 -221:2:2461 -222:2:2462 -223:2:2466 -224:2:2467 -225:2:2475 -226:2:2480 -227:2:2484 -228:2:2485 -229:2:2492 -230:2:2493 -231:2:2504 -232:2:2505 -233:2:2506 -234:2:2517 -235:2:2522 -236:2:2523 -237:0:3537 -238:2:2535 -239:0:3537 -240:2:2536 -241:2:2540 -242:2:2541 -243:2:2549 -244:2:2550 -245:2:2554 -246:2:2555 -247:2:2563 -248:2:2568 -249:2:2572 -250:2:2573 -251:2:2580 -252:2:2581 -253:2:2592 -254:2:2593 -255:2:2594 -256:2:2605 -257:2:2610 -258:2:2611 -259:0:3537 -260:2:2623 -261:0:3537 -262:2:2626 -263:2:2627 -264:2:2639 -265:2:2640 -266:2:2644 -267:2:2645 -268:2:2653 -269:2:2658 -270:2:2662 -271:2:2663 -272:2:2670 -273:2:2671 -274:2:2682 -275:2:2683 -276:2:2684 -277:2:2695 -278:2:2700 -279:2:2701 -280:0:3537 -281:2:2713 -282:0:3537 -283:2:2714 -284:0:3537 -285:2:2715 -286:0:3537 -287:2:2716 -288:0:3537 -289:2:2717 -290:2:2721 -291:2:2722 -292:2:2730 -293:2:2731 -294:2:2735 -295:2:2736 -296:2:2744 -297:2:2749 -298:2:2753 -299:2:2754 -300:2:2761 -301:2:2762 -302:2:2773 -303:2:2774 -304:2:2775 -305:2:2786 -306:2:2791 -307:2:2792 -308:0:3537 -309:2:3086 -310:0:3537 -311:2:3182 -312:0:3537 -313:2:3183 -314:0:3537 -315:2:3187 -316:0:3537 -317:2:3193 -318:0:3537 -319:2:3194 -320:2:3198 -321:2:3199 -322:2:3207 -323:2:3208 -324:2:3212 -325:2:3213 -326:2:3221 -327:2:3226 -328:2:3230 -329:2:3231 -330:2:3238 -331:2:3239 -332:2:3250 -333:2:3251 -334:2:3252 -335:2:3263 -336:2:3268 -337:2:3269 -338:0:3537 -339:2:3284 -340:0:3537 -341:2:3285 -342:2:3289 -343:2:3290 -344:2:3298 -345:2:3299 -346:2:3303 -347:2:3304 -348:2:3312 -349:2:3317 -350:2:3321 -351:2:3322 -352:2:3329 -353:2:3330 -354:2:3341 -355:2:3342 -356:2:3343 -357:2:3354 -358:2:3359 -359:2:3360 -360:0:3537 -361:2:3375 -362:0:3537 -363:2:3380 -364:2:3384 -365:2:3385 -366:2:3393 -367:2:3394 -368:2:3398 -369:2:3399 -370:2:3407 -371:2:3412 -372:2:3416 -373:2:3417 -374:2:3424 -375:2:3425 -376:2:3436 -377:2:3437 -378:2:3438 -379:2:3449 -380:2:3454 -381:2:3455 -382:0:3537 -383:2:3474 -384:0:3537 -385:2:3475 -386:0:3537 -387:2:1317 -388:0:3537 -389:2:1318 -390:2:1322 -391:2:1323 -392:2:1331 -393:2:1332 -394:2:1336 -395:2:1337 -396:2:1345 -397:2:1350 -398:2:1354 -399:2:1355 -400:2:1362 -401:2:1363 -402:2:1374 -403:2:1375 -404:2:1376 -405:2:1387 -406:2:1392 -407:2:1393 -408:0:3537 -409:2:1405 -410:2:1406 -411:0:3537 -412:2:1410 -413:2:1414 -414:2:1415 -415:2:1423 -416:2:1424 -417:2:1428 -418:2:1429 -419:2:1437 -420:2:1442 -421:2:1443 -422:2:1454 -423:2:1455 -424:2:1466 -425:2:1467 -426:2:1468 -427:2:1479 -428:2:1484 -429:2:1485 -430:0:3537 -431:2:1497 -432:0:3537 -433:2:1498 -434:0:3537 -435:2:1508 -436:0:3537 -437:2:1509 -438:0:3537 -439:2:1510 -440:2:1514 -441:2:1515 -442:2:1523 -443:2:1524 -444:2:1528 -445:2:1529 -446:2:1537 -447:2:1542 -448:2:1546 -449:2:1547 -450:2:1554 -451:2:1555 -452:2:1566 -453:2:1567 -454:2:1568 -455:2:1579 -456:2:1584 -457:2:1585 -458:0:3537 -459:2:1600 -460:0:3537 -461:2:1601 -462:2:1605 -463:2:1606 -464:2:1614 -465:2:1615 -466:2:1619 -467:2:1620 -468:2:1628 -469:2:1633 -470:2:1637 -471:2:1638 -472:2:1645 -473:2:1646 -474:2:1657 -475:2:1658 -476:2:1659 -477:2:1670 -478:2:1675 -479:2:1676 -480:0:3537 -481:2:1691 -482:0:3537 -483:2:1696 -484:2:1700 -485:2:1701 -486:2:1709 -487:2:1710 -488:2:1714 -489:2:1715 -490:2:1723 -491:2:1728 -492:2:1732 -493:2:1733 -494:2:1740 -495:2:1741 -496:2:1752 -497:2:1753 -498:2:1754 -499:2:1765 -500:2:1770 -501:2:1771 -502:0:3537 -503:2:1790 -504:0:3537 -505:2:1791 -506:2:1795 -507:2:1796 -508:2:1804 -509:2:1805 -510:2:1809 -511:2:1810 -512:2:1818 -513:2:1823 -514:2:1827 -515:2:1828 -516:2:1835 -517:2:1836 -518:2:1847 -519:2:1848 -520:2:1849 -521:2:1860 -522:2:1865 -523:2:1866 -524:0:3537 -525:2:1878 -526:0:3537 -527:2:1881 -528:2:1882 -529:2:1894 -530:2:1895 -531:2:1899 -532:2:1900 -533:2:1908 -534:2:1913 -535:2:1917 -536:2:1918 -537:2:1925 -538:2:1926 -539:2:1937 -540:2:1938 -541:2:1939 -542:2:1950 -543:2:1955 -544:2:1956 -545:0:3537 -546:2:1968 -547:0:3537 -548:2:1969 -549:0:3537 -550:2:1970 -551:0:3537 -552:2:1971 -553:0:3537 -554:2:1972 -555:2:1976 -556:2:1977 -557:2:1985 -558:2:1986 -559:2:1990 -560:2:1991 -561:2:1999 -562:2:2004 -563:2:2008 -564:2:2009 -565:2:2016 -566:2:2017 -567:2:2028 -568:2:2029 -569:2:2030 -570:2:2041 -571:2:2046 -572:2:2047 -573:0:3537 -574:2:2341 -575:0:3537 -576:2:2437 -577:0:3537 -578:2:2438 -579:0:3537 -580:2:2442 -581:0:3537 -582:2:2448 -583:2:2452 -584:2:2453 -585:2:2461 -586:2:2462 -587:2:2466 -588:2:2467 -589:2:2475 -590:2:2480 -591:2:2484 -592:2:2485 -593:2:2492 -594:2:2493 -595:2:2504 -596:2:2505 -597:2:2506 -598:2:2517 -599:2:2522 -600:2:2523 -601:0:3537 -602:2:2535 -603:0:3537 -604:2:2536 -605:2:2540 -606:2:2541 -607:2:2549 -608:2:2550 -609:2:2554 -610:2:2555 -611:2:2563 -612:2:2568 -613:2:2572 -614:2:2573 -615:2:2580 -616:2:2581 -617:2:2592 -618:2:2593 -619:2:2594 -620:2:2605 -621:2:2610 -622:2:2611 -623:0:3537 -624:2:2623 -625:0:3537 -626:2:2626 -627:2:2627 -628:2:2639 -629:2:2640 -630:2:2644 -631:2:2645 -632:2:2653 -633:2:2658 -634:2:2662 -635:2:2663 -636:2:2670 -637:2:2671 -638:2:2682 -639:2:2683 -640:2:2684 -641:2:2695 -642:2:2700 -643:2:2701 -644:0:3537 -645:2:2713 -646:0:3537 -647:2:2714 -648:0:3537 -649:2:2715 -650:0:3537 -651:2:2716 -652:0:3537 -653:2:2717 -654:2:2721 -655:2:2722 -656:2:2730 -657:2:2731 -658:2:2735 -659:2:2736 -660:2:2744 -661:2:2749 -662:2:2753 -663:2:2754 -664:2:2761 -665:2:2762 -666:2:2773 -667:2:2774 -668:2:2775 -669:2:2786 -670:2:2791 -671:2:2792 -672:0:3537 -673:2:3086 -674:0:3537 -675:2:3182 -676:0:3537 -677:2:3183 -678:0:3537 -679:2:3187 -680:0:3537 -681:2:3193 -682:0:3537 -683:2:3194 -684:2:3198 -685:2:3199 -686:2:3207 -687:2:3208 -688:2:3212 -689:2:3213 -690:2:3221 -691:2:3226 -692:2:3230 -693:2:3231 -694:2:3238 -695:2:3239 -696:2:3250 -697:2:3251 -698:2:3252 -699:2:3263 -700:2:3268 -701:2:3269 -702:0:3537 -703:2:3284 -704:0:3537 -705:2:3285 -706:2:3289 -707:2:3290 -708:2:3298 -709:2:3299 -710:2:3303 -711:2:3304 -712:2:3312 -713:2:3317 -714:2:3321 -715:2:3322 -716:2:3329 -717:2:3330 -718:2:3341 -719:2:3342 -720:2:3343 -721:2:3354 -722:2:3359 -723:2:3360 -724:0:3537 -725:2:3375 -726:0:3537 -727:2:3380 -728:2:3384 -729:2:3385 -730:2:3393 -731:2:3394 -732:2:3398 -733:2:3399 -734:2:3407 -735:2:3412 -736:2:3416 -737:2:3417 -738:2:3424 -739:2:3425 -740:2:3436 -741:2:3437 -742:2:3438 -743:2:3449 -744:2:3454 -745:2:3455 -746:0:3537 -747:2:3474 -748:0:3537 -749:2:3475 -750:0:3537 -751:2:1317 -752:0:3537 -753:2:1318 -754:2:1322 -755:2:1323 -756:2:1331 -757:2:1332 -758:2:1336 -759:2:1337 -760:2:1345 -761:2:1350 -762:2:1354 -763:2:1355 -764:2:1362 -765:2:1363 -766:2:1374 -767:2:1375 -768:2:1376 -769:2:1387 -770:2:1392 -771:2:1393 -772:0:3537 -773:2:1405 -774:2:1406 -775:0:3537 -776:2:1410 -777:2:1414 -778:2:1415 -779:2:1423 -780:2:1424 -781:2:1428 -782:2:1429 -783:2:1437 -784:2:1442 -785:2:1443 -786:2:1454 -787:2:1455 -788:2:1466 -789:2:1467 -790:2:1468 -791:2:1479 -792:2:1484 -793:2:1485 -794:0:3537 -795:2:1497 -796:0:3537 -797:2:1498 -798:0:3537 -799:2:1508 -800:0:3537 -801:2:1509 -802:0:3537 -803:2:1510 -804:2:1514 -805:2:1515 -806:2:1523 -807:2:1524 -808:2:1528 -809:2:1529 -810:2:1537 -811:2:1542 -812:2:1546 -813:2:1547 -814:2:1554 -815:2:1555 -816:2:1566 -817:2:1567 -818:2:1568 -819:2:1579 -820:2:1584 -821:2:1585 -822:0:3537 -823:2:1600 -824:0:3537 -825:2:1601 -826:2:1605 -827:2:1606 -828:2:1614 -829:2:1615 -830:2:1619 -831:2:1620 -832:2:1628 -833:2:1633 -834:2:1637 -835:2:1638 -836:2:1645 -837:2:1646 -838:2:1657 -839:2:1658 -840:2:1659 -841:2:1670 -842:2:1675 -843:2:1676 -844:0:3537 -845:2:1691 -846:0:3537 -847:2:1696 -848:2:1700 -849:2:1701 -850:2:1709 -851:2:1710 -852:2:1714 -853:2:1715 -854:2:1723 -855:2:1728 -856:2:1732 -857:2:1733 -858:2:1740 -859:2:1741 -860:2:1752 -861:2:1753 -862:2:1754 -863:2:1765 -864:2:1770 -865:2:1771 -866:0:3537 -867:2:1790 -868:0:3537 -869:2:1791 -870:2:1795 -871:2:1796 -872:2:1804 -873:2:1805 -874:2:1809 -875:2:1810 -876:2:1818 -877:2:1823 -878:2:1827 -879:2:1828 -880:2:1835 -881:2:1836 -882:2:1847 -883:2:1848 -884:2:1849 -885:2:1860 -886:2:1865 -887:2:1866 -888:0:3537 -889:2:1878 -890:0:3537 -891:2:1881 -892:2:1882 -893:2:1894 -894:2:1895 -895:2:1899 -896:2:1900 -897:2:1908 -898:2:1913 -899:2:1917 -900:2:1918 -901:2:1925 -902:2:1926 -903:2:1937 -904:2:1938 -905:2:1939 -906:2:1950 -907:2:1955 -908:2:1956 -909:0:3537 -910:2:1968 -911:0:3537 -912:2:1969 -913:0:3537 -914:2:1970 -915:0:3537 -916:2:1971 -917:0:3537 -918:2:1972 -919:2:1976 -920:2:1977 -921:2:1985 -922:2:1986 -923:2:1990 -924:2:1991 -925:2:1999 -926:2:2004 -927:2:2008 -928:2:2009 -929:2:2016 -930:2:2017 -931:2:2028 -932:2:2029 -933:2:2030 -934:2:2041 -935:2:2046 -936:2:2047 -937:0:3537 -938:2:2341 -939:0:3537 -940:2:2437 -941:0:3537 -942:2:2438 -943:0:3537 -944:2:2442 -945:0:3537 -946:2:2448 -947:2:2452 -948:2:2453 -949:2:2461 -950:2:2462 -951:2:2466 -952:2:2467 -953:2:2475 -954:2:2480 -955:2:2484 -956:2:2485 -957:2:2492 -958:2:2493 -959:2:2504 -960:2:2505 -961:2:2506 -962:2:2517 -963:2:2522 -964:2:2523 -965:0:3537 -966:2:2535 -967:0:3537 -968:2:2536 -969:2:2540 -970:2:2541 -971:2:2549 -972:2:2550 -973:2:2554 -974:2:2555 -975:2:2563 -976:2:2568 -977:2:2572 -978:2:2573 -979:2:2580 -980:2:2581 -981:2:2592 -982:2:2593 -983:2:2594 -984:2:2605 -985:2:2610 -986:2:2611 -987:0:3537 -988:2:2623 -989:0:3537 -990:2:2626 -991:2:2627 -992:2:2639 -993:2:2640 -994:2:2644 -995:2:2645 -996:2:2653 -997:2:2658 -998:2:2662 -999:2:2663 -1000:2:2670 -1001:2:2671 -1002:2:2682 -1003:2:2683 -1004:2:2684 -1005:2:2695 -1006:2:2700 -1007:2:2701 -1008:0:3537 -1009:2:2713 -1010:0:3537 -1011:2:2714 -1012:0:3537 -1013:2:2715 -1014:0:3537 -1015:2:2716 -1016:0:3537 -1017:2:2717 -1018:2:2721 -1019:2:2722 -1020:2:2730 -1021:2:2731 -1022:2:2735 -1023:2:2736 -1024:2:2744 -1025:2:2749 -1026:2:2753 -1027:2:2754 -1028:2:2761 -1029:2:2762 -1030:2:2773 -1031:2:2774 -1032:2:2775 -1033:2:2786 -1034:2:2791 -1035:2:2792 -1036:0:3537 -1037:2:3086 -1038:0:3537 -1039:2:3182 -1040:0:3537 -1041:2:3183 -1042:0:3537 -1043:2:3187 -1044:0:3537 -1045:2:3193 -1046:0:3537 -1047:2:3194 -1048:2:3198 -1049:2:3199 -1050:2:3207 -1051:2:3208 -1052:2:3212 -1053:2:3213 -1054:2:3221 -1055:2:3226 -1056:2:3230 -1057:2:3231 -1058:2:3238 -1059:2:3239 -1060:2:3250 -1061:2:3251 -1062:2:3252 -1063:2:3263 -1064:2:3268 -1065:2:3269 -1066:0:3537 -1067:2:3284 -1068:0:3537 -1069:2:3285 -1070:2:3289 -1071:2:3290 -1072:2:3298 -1073:2:3299 -1074:2:3303 -1075:2:3304 -1076:2:3312 -1077:2:3317 -1078:2:3321 -1079:2:3322 -1080:2:3329 -1081:2:3330 -1082:2:3341 -1083:2:3342 -1084:2:3343 -1085:2:3354 -1086:2:3359 -1087:2:3360 -1088:0:3537 -1089:2:3375 -1090:0:3537 -1091:2:3380 -1092:2:3384 -1093:2:3385 -1094:2:3393 -1095:2:3394 -1096:2:3398 -1097:2:3399 -1098:2:3407 -1099:2:3412 -1100:2:3416 -1101:2:3417 -1102:2:3424 -1103:2:3425 -1104:2:3436 -1105:2:3437 -1106:2:3438 -1107:2:3449 -1108:2:3454 -1109:2:3455 -1110:0:3537 -1111:2:3474 -1112:0:3537 -1113:2:3475 -1114:0:3537 -1115:2:1317 -1116:0:3537 -1117:2:1318 -1118:2:1322 -1119:2:1323 -1120:2:1331 -1121:2:1332 -1122:2:1336 -1123:2:1337 -1124:2:1345 -1125:2:1350 -1126:2:1354 -1127:2:1355 -1128:2:1362 -1129:2:1363 -1130:2:1374 -1131:2:1375 -1132:2:1376 -1133:2:1387 -1134:2:1392 -1135:2:1393 -1136:0:3537 -1137:2:1405 -1138:2:1406 -1139:0:3537 -1140:2:1410 -1141:2:1414 -1142:2:1415 -1143:2:1423 -1144:2:1424 -1145:2:1428 -1146:2:1429 -1147:2:1437 -1148:2:1442 -1149:2:1443 -1150:2:1454 -1151:2:1455 -1152:2:1466 -1153:2:1467 -1154:2:1468 -1155:2:1479 -1156:2:1484 -1157:2:1485 -1158:0:3537 -1159:2:1497 -1160:0:3537 -1161:2:1498 -1162:0:3537 -1163:2:1508 -1164:0:3537 -1165:2:1509 -1166:0:3537 -1167:2:1510 -1168:2:1514 -1169:2:1515 -1170:2:1523 -1171:2:1524 -1172:2:1528 -1173:2:1529 -1174:2:1537 -1175:2:1542 -1176:2:1546 -1177:2:1547 -1178:2:1554 -1179:2:1555 -1180:2:1566 -1181:2:1567 -1182:2:1568 -1183:2:1579 -1184:2:1584 -1185:2:1585 -1186:0:3537 -1187:2:1600 -1188:0:3537 -1189:2:1601 -1190:2:1605 -1191:2:1606 -1192:2:1614 -1193:2:1615 -1194:2:1619 -1195:2:1620 -1196:2:1628 -1197:2:1633 -1198:2:1637 -1199:2:1638 -1200:2:1645 -1201:2:1646 -1202:2:1657 -1203:2:1658 -1204:2:1659 -1205:2:1670 -1206:2:1675 -1207:2:1676 -1208:0:3537 -1209:2:1691 -1210:0:3537 -1211:2:1696 -1212:2:1700 -1213:2:1701 -1214:2:1709 -1215:2:1710 -1216:2:1714 -1217:2:1715 -1218:2:1723 -1219:2:1728 -1220:2:1732 -1221:2:1733 -1222:2:1740 -1223:2:1741 -1224:2:1752 -1225:2:1753 -1226:2:1754 -1227:2:1765 -1228:2:1770 -1229:2:1771 -1230:0:3537 -1231:2:1790 -1232:0:3537 -1233:2:1791 -1234:2:1795 -1235:2:1796 -1236:2:1804 -1237:2:1805 -1238:2:1809 -1239:2:1810 -1240:2:1818 -1241:2:1823 -1242:2:1827 -1243:2:1828 -1244:2:1835 -1245:2:1836 -1246:2:1847 -1247:2:1848 -1248:2:1849 -1249:2:1860 -1250:2:1865 -1251:2:1866 -1252:0:3537 -1253:2:1878 -1254:0:3537 -1255:2:1881 -1256:2:1882 -1257:2:1894 -1258:2:1895 -1259:2:1899 -1260:2:1900 -1261:2:1908 -1262:2:1913 -1263:2:1917 -1264:2:1918 -1265:2:1925 -1266:2:1926 -1267:2:1937 -1268:2:1938 -1269:2:1939 -1270:2:1950 -1271:2:1955 -1272:2:1956 -1273:0:3537 -1274:2:1968 -1275:0:3537 -1276:2:1969 -1277:0:3537 -1278:2:1970 -1279:0:3537 -1280:2:1971 -1281:0:3537 -1282:2:1972 -1283:2:1976 -1284:2:1977 -1285:2:1985 -1286:2:1986 -1287:2:1990 -1288:2:1991 -1289:2:1999 -1290:2:2004 -1291:2:2008 -1292:2:2009 -1293:2:2016 -1294:2:2017 -1295:2:2028 -1296:2:2029 -1297:2:2030 -1298:2:2041 -1299:2:2046 -1300:2:2047 -1301:0:3537 -1302:2:2341 -1303:0:3537 -1304:2:2437 -1305:0:3537 -1306:2:2438 -1307:0:3537 -1308:2:2442 -1309:0:3537 -1310:2:2448 -1311:2:2452 -1312:2:2453 -1313:2:2461 -1314:2:2462 -1315:2:2466 -1316:2:2467 -1317:2:2475 -1318:2:2480 -1319:2:2484 -1320:2:2485 -1321:2:2492 -1322:2:2493 -1323:2:2504 -1324:2:2505 -1325:2:2506 -1326:2:2517 -1327:2:2522 -1328:2:2523 -1329:0:3537 -1330:2:2535 -1331:0:3537 -1332:2:2536 -1333:2:2540 -1334:2:2541 -1335:2:2549 -1336:2:2550 -1337:2:2554 -1338:2:2555 -1339:2:2563 -1340:2:2568 -1341:2:2572 -1342:2:2573 -1343:2:2580 -1344:2:2581 -1345:2:2592 -1346:2:2593 -1347:2:2594 -1348:2:2605 -1349:2:2610 -1350:2:2611 -1351:0:3537 -1352:2:2623 -1353:0:3537 -1354:2:2626 -1355:2:2627 -1356:2:2639 -1357:2:2640 -1358:2:2644 -1359:2:2645 -1360:2:2653 -1361:2:2658 -1362:2:2662 -1363:2:2663 -1364:2:2670 -1365:2:2671 -1366:2:2682 -1367:2:2683 -1368:2:2684 -1369:2:2695 -1370:2:2700 -1371:2:2701 -1372:0:3537 -1373:2:2713 -1374:0:3537 -1375:2:2714 -1376:0:3537 -1377:2:2715 -1378:0:3537 -1379:2:2716 -1380:0:3537 -1381:2:2717 -1382:2:2721 -1383:2:2722 -1384:2:2730 -1385:2:2731 -1386:2:2735 -1387:2:2736 -1388:2:2744 -1389:2:2749 -1390:2:2753 -1391:2:2754 -1392:2:2761 -1393:2:2762 -1394:2:2773 -1395:2:2774 -1396:2:2775 -1397:2:2786 -1398:2:2791 -1399:2:2792 -1400:0:3537 -1401:2:3086 -1402:0:3537 -1403:2:3182 -1404:0:3537 -1405:2:3183 -1406:0:3537 -1407:2:3187 -1408:0:3537 -1409:2:3193 -1410:0:3537 -1411:2:3194 -1412:2:3198 -1413:2:3199 -1414:2:3207 -1415:2:3208 -1416:2:3212 -1417:2:3213 -1418:2:3221 -1419:2:3226 -1420:2:3230 -1421:2:3231 -1422:2:3238 -1423:2:3239 -1424:2:3250 -1425:2:3251 -1426:2:3252 -1427:2:3263 -1428:2:3268 -1429:2:3269 -1430:0:3537 -1431:2:3284 -1432:0:3537 -1433:2:3285 -1434:2:3289 -1435:2:3290 -1436:2:3298 -1437:2:3299 -1438:2:3303 -1439:2:3304 -1440:2:3312 -1441:2:3317 -1442:2:3321 -1443:2:3322 -1444:2:3329 -1445:2:3330 -1446:2:3341 -1447:2:3342 -1448:2:3343 -1449:2:3354 -1450:2:3359 -1451:2:3360 -1452:0:3537 -1453:2:3375 -1454:0:3537 -1455:2:3380 -1456:2:3384 -1457:2:3385 -1458:2:3393 -1459:2:3394 -1460:2:3398 -1461:2:3399 -1462:2:3407 -1463:2:3412 -1464:2:3416 -1465:2:3417 -1466:2:3424 -1467:2:3425 -1468:2:3436 -1469:2:3437 -1470:2:3438 -1471:2:3449 -1472:2:3454 -1473:2:3455 -1474:0:3537 -1475:2:3474 -1476:0:3537 -1477:2:3475 -1478:0:3537 -1479:2:1317 -1480:0:3537 -1481:2:1318 -1482:2:1322 -1483:2:1323 -1484:2:1331 -1485:2:1332 -1486:2:1336 -1487:2:1337 -1488:2:1345 -1489:2:1350 -1490:2:1354 -1491:2:1355 -1492:2:1362 -1493:2:1363 -1494:2:1374 -1495:2:1375 -1496:2:1376 -1497:2:1387 -1498:2:1392 -1499:2:1393 -1500:0:3537 -1501:2:1405 -1502:2:1406 -1503:0:3537 -1504:2:1410 -1505:2:1414 -1506:2:1415 -1507:2:1423 -1508:2:1424 -1509:2:1428 -1510:2:1429 -1511:2:1437 -1512:2:1450 -1513:2:1451 -1514:2:1454 -1515:2:1455 -1516:2:1466 -1517:2:1467 -1518:2:1468 -1519:2:1479 -1520:2:1484 -1521:2:1487 -1522:2:1488 -1523:0:3537 -1524:2:1497 -1525:0:3537 -1526:2:1498 -1527:0:3537 -1528:2:1508 -1529:0:3537 -1530:2:1509 -1531:0:3537 -1532:2:1510 -1533:2:1514 -1534:2:1515 -1535:2:1523 -1536:2:1524 -1537:2:1528 -1538:2:1529 -1539:2:1537 -1540:2:1550 -1541:2:1551 -1542:2:1554 -1543:2:1555 -1544:2:1566 -1545:2:1567 -1546:2:1568 -1547:2:1579 -1548:2:1584 -1549:2:1587 -1550:2:1588 -1551:0:3537 -1552:2:1600 -1553:0:3537 -1554:2:1601 -1555:2:1605 -1556:2:1606 -1557:2:1614 -1558:2:1615 -1559:2:1619 -1560:2:1620 -1561:2:1628 -1562:2:1641 -1563:2:1642 -1564:2:1645 -1565:2:1646 -1566:2:1657 -1567:2:1658 -1568:2:1659 -1569:2:1670 -1570:2:1675 -1571:2:1678 -1572:2:1679 -1573:0:3537 -1574:2:1691 -1575:0:3537 -1576:2:1696 -1577:2:1700 -1578:2:1701 -1579:2:1709 -1580:2:1710 -1581:2:1714 -1582:2:1715 -1583:2:1723 -1584:2:1736 -1585:2:1737 -1586:2:1740 -1587:2:1741 -1588:2:1752 -1589:2:1753 -1590:2:1754 -1591:2:1765 -1592:2:1770 -1593:2:1773 -1594:2:1774 -1595:0:3537 -1596:2:1790 -1597:0:3537 -1598:2:1791 -1599:2:1795 -1600:2:1796 -1601:2:1804 -1602:2:1805 -1603:2:1809 -1604:2:1810 -1605:2:1818 -1606:2:1831 -1607:2:1832 -1608:2:1835 -1609:2:1836 -1610:2:1847 -1611:2:1848 -1612:2:1849 -1613:2:1860 -1614:2:1865 -1615:2:1868 -1616:2:1869 -1617:0:3537 -1618:2:1878 -1619:0:3537 -1620:2:1881 -1621:2:1882 -1622:2:1894 -1623:2:1895 -1624:2:1899 -1625:2:1900 -1626:2:1908 -1627:2:1921 -1628:2:1922 -1629:2:1925 -1630:2:1926 -1631:2:1937 -1632:2:1938 -1633:2:1939 -1634:2:1950 -1635:2:1955 -1636:2:1958 -1637:2:1959 -1638:0:3537 -1639:2:1968 -1640:0:3537 -1641:2:1969 -1642:0:3537 -1643:2:1970 -1644:0:3537 -1645:2:1971 -1646:0:3537 -1647:2:1972 -1648:2:1976 -1649:2:1977 -1650:2:1985 -1651:2:1986 -1652:2:1990 -1653:2:1991 -1654:2:1999 -1655:2:2012 -1656:2:2013 -1657:2:2016 -1658:2:2017 -1659:2:2028 -1660:2:2029 -1661:2:2030 -1662:2:2041 -1663:2:2046 -1664:2:2049 -1665:2:2050 -1666:0:3537 -1667:2:2341 -1668:0:3537 -1669:2:2437 -1670:0:3537 -1671:2:2438 -1672:0:3537 -1673:2:2442 -1674:0:3537 -1675:2:2448 -1676:2:2452 -1677:2:2453 -1678:2:2461 -1679:2:2462 -1680:2:2466 -1681:2:2467 -1682:2:2475 -1683:2:2488 -1684:2:2489 -1685:2:2492 -1686:2:2493 -1687:2:2504 -1688:2:2505 -1689:2:2506 -1690:2:2517 -1691:2:2522 -1692:2:2525 -1693:2:2526 -1694:0:3537 -1695:2:2535 -1696:0:3537 -1697:2:2536 -1698:2:2540 -1699:2:2541 -1700:2:2549 -1701:2:2550 -1702:2:2554 -1703:2:2555 -1704:2:2563 -1705:2:2576 -1706:2:2577 -1707:2:2580 -1708:2:2581 -1709:2:2592 -1710:2:2593 -1711:2:2594 -1712:2:2605 -1713:2:2610 -1714:2:2613 -1715:2:2614 -1716:0:3537 -1717:2:2623 -1718:0:3537 -1719:2:2626 -1720:2:2627 -1721:2:2639 -1722:2:2640 -1723:2:2644 -1724:2:2645 -1725:2:2653 -1726:2:2666 -1727:2:2667 -1728:2:2670 -1729:2:2671 -1730:2:2682 -1731:2:2683 -1732:2:2684 -1733:2:2695 -1734:2:2700 -1735:2:2703 -1736:2:2704 -1737:0:3537 -1738:2:2713 -1739:0:3537 -1740:2:2714 -1741:0:3537 -1742:2:2715 -1743:0:3537 -1744:2:2716 -1745:0:3537 -1746:2:2717 -1747:2:2721 -1748:2:2722 -1749:2:2730 -1750:2:2731 -1751:2:2735 -1752:2:2736 -1753:2:2744 -1754:2:2757 -1755:2:2758 -1756:2:2761 -1757:2:2762 -1758:2:2773 -1759:2:2774 -1760:2:2775 -1761:2:2786 -1762:2:2791 -1763:2:2794 -1764:2:2795 -1765:0:3537 -1766:2:3086 -1767:0:3537 -1768:2:3182 -1769:0:3537 -1770:2:3183 -1771:0:3537 -1772:2:3187 -1773:0:3537 -1774:2:3193 -1775:0:3537 -1776:2:3194 -1777:2:3198 -1778:2:3199 -1779:2:3207 -1780:2:3208 -1781:2:3212 -1782:2:3213 -1783:2:3221 -1784:2:3234 -1785:2:3235 -1786:2:3238 -1787:2:3239 -1788:2:3250 -1789:2:3251 -1790:2:3252 -1791:2:3263 -1792:2:3268 -1793:2:3271 -1794:2:3272 -1795:0:3537 -1796:2:3284 -1797:0:3537 -1798:2:3285 -1799:2:3289 -1800:2:3290 -1801:2:3298 -1802:2:3299 -1803:2:3303 -1804:2:3304 -1805:2:3312 -1806:2:3325 -1807:2:3326 -1808:2:3329 -1809:2:3330 -1810:2:3341 -1811:2:3342 -1812:2:3343 -1813:2:3354 -1814:2:3359 -1815:2:3362 -1816:2:3363 -1817:0:3537 -1818:2:3375 -1819:0:3537 -1820:2:3380 -1821:2:3384 -1822:2:3385 -1823:2:3393 -1824:2:3394 -1825:2:3398 -1826:2:3399 -1827:2:3407 -1828:2:3420 -1829:2:3421 -1830:2:3424 -1831:2:3425 -1832:2:3436 -1833:2:3437 -1834:2:3438 -1835:2:3449 -1836:2:3454 -1837:2:3457 -1838:2:3458 -1839:0:3537 -1840:2:3474 -1841:0:3537 -1842:2:3475 -1843:0:3537 -1844:2:3478 -1845:0:3537 -1846:2:3483 -1847:0:3537 -1848:1:2 -1849:0:3537 -1850:2:3484 -1851:0:3537 -1852:1:8 -1853:0:3537 -1854:2:3483 -1855:0:3537 -1856:1:9 -1857:0:3537 -1858:2:3484 -1859:0:3537 -1860:1:10 -1861:0:3537 -1862:2:3483 -1863:0:3537 -1864:1:11 -1865:0:3537 -1866:2:3484 -1867:0:3537 -1868:1:12 -1869:1:16 -1870:1:17 -1871:1:25 -1872:1:26 -1873:1:30 -1874:1:31 -1875:1:39 -1876:1:44 -1877:1:48 -1878:1:49 -1879:1:56 -1880:1:57 -1881:1:68 -1882:1:69 -1883:1:70 -1884:1:81 -1885:1:86 -1886:1:87 -1887:0:3537 -1888:2:3483 -1889:0:3537 -1890:1:99 -1891:0:3537 -1892:2:3484 -1893:0:3537 -1894:1:100 -1895:1:104 -1896:1:105 -1897:1:113 -1898:1:114 -1899:1:118 -1900:1:119 -1901:1:127 -1902:1:132 -1903:1:136 -1904:1:137 -1905:1:144 -1906:1:145 -1907:1:156 -1908:1:157 -1909:1:158 -1910:1:169 -1911:1:174 -1912:1:175 -1913:0:3537 -1914:2:3483 -1915:0:3537 -1916:1:187 -1917:0:3537 -1918:2:3484 -1919:0:3537 -1920:1:188 -1921:0:3537 -1922:2:3483 -1923:0:3537 -1924:1:189 -1925:1:193 -1926:1:194 -1927:1:202 -1928:1:203 -1929:1:207 -1930:1:208 -1931:1:216 -1932:1:221 -1933:1:225 -1934:1:226 -1935:1:233 -1936:1:234 -1937:1:245 -1938:1:246 -1939:1:247 -1940:1:258 -1941:1:263 -1942:1:264 -1943:0:3537 -1944:2:3484 -1945:0:3537 -1946:1:276 -1947:0:3537 -1948:2:3483 -1949:0:3537 -1950:1:561 -1951:0:3537 -1952:2:3484 -1953:0:3537 -1954:1:562 -1955:0:3537 -1956:2:3483 -1957:0:3537 -1958:1:11 -1959:0:3537 -1960:2:3484 -1961:0:3537 -1962:1:12 -1963:1:16 -1964:1:17 -1965:1:25 -1966:1:26 -1967:1:27 -1968:1:39 -1969:1:44 -1970:1:48 -1971:1:49 -1972:1:56 -1973:1:57 -1974:1:68 -1975:1:69 -1976:1:70 -1977:1:81 -1978:1:86 -1979:1:87 -1980:0:3537 -1981:2:3483 -1982:0:3537 -1983:1:99 -1984:0:3537 -1985:2:3484 -1986:0:3537 -1987:1:100 -1988:1:104 -1989:1:105 -1990:1:113 -1991:1:114 -1992:1:118 -1993:1:119 -1994:1:127 -1995:1:132 -1996:1:136 -1997:1:137 -1998:1:144 -1999:1:145 -2000:1:156 -2001:1:157 -2002:1:158 -2003:1:169 -2004:1:174 -2005:1:175 -2006:0:3537 -2007:2:3483 -2008:0:3537 -2009:1:279 -2010:0:3537 -2011:2:3484 -2012:0:3537 -2013:1:280 -2014:0:3537 -2015:2:3483 -2016:0:3537 -2017:1:561 -2018:0:3537 -2019:2:3484 -2020:0:3537 -2021:1:562 -2022:0:3537 -2023:2:3483 -2024:0:3537 -2025:1:567 -2026:0:3537 -2027:2:3484 -2028:0:3537 -2029:1:572 -2030:1:576 -2031:1:577 -2032:1:585 -2033:1:586 -2034:1:587 -2035:1:599 -2036:1:604 -2037:1:608 -2038:1:609 -2039:1:616 -2040:1:617 -2041:1:628 -2042:1:629 -2043:1:630 -2044:1:641 -2045:1:646 -2046:1:647 -2047:0:3537 -2048:2:3483 -2049:0:3537 -2050:1:659 -2051:0:3537 -2052:2:3484 -2053:0:3537 -2054:1:660 -2055:1:664 -2056:1:665 -2057:1:673 -2058:1:674 -2059:1:678 -2060:1:679 -2061:1:687 -2062:1:692 -2063:1:696 -2064:1:697 -2065:1:704 -2066:1:705 -2067:1:716 -2068:1:717 -2069:1:718 -2070:1:729 -2071:1:734 -2072:1:735 -2073:0:3537 -2074:2:3483 -2075:0:3537 -2076:1:747 -2077:0:3535 -2078:2:3484 -2079:0:3541 -2080:1:1280 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.define b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.log deleted file mode 100644 index 6a46f80..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.log +++ /dev/null @@ -1,369 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_rmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 567) -Depth= 5645 States= 1e+06 Transitions= 1.47e+07 Memory= 527.287 t= 27.1 R= 4e+04 -pan: claim violated! (at depth 1736) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 5645, errors: 1 - 1039881 states, stored - 14441478 states, matched - 15481359 transitions (= stored+matched) - 57000435 atomic steps -hash conflicts: 2892596 (resolved) - -Stats on memory usage (in Megabytes): - 83.303 equivalent memory usage for states (stored*(State-vector + overhead)) - 64.050 actual memory usage for states (compression: 76.89%) - state-vector as stored = 37 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 529.729 total actual memory usage - -unreached in proctype urcu_reader - line 289, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 61, "(1)" - line 308, "pan.___", state 91, "(1)" - line 289, "pan.___", state 104, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 136, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 149, "(1)" - line 308, "pan.___", state 179, "(1)" - line 289, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 225, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 238, "(1)" - line 308, "pan.___", state 268, "(1)" - line 159, "pan.___", state 289, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 291, "(1)" - line 163, "pan.___", state 298, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 300, "(1)" - line 163, "pan.___", state 301, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 163, "pan.___", state 301, "else" - line 161, "pan.___", state 306, "((j<1))" - line 161, "pan.___", state 306, "((j>=1))" - line 167, "pan.___", state 311, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 167, "pan.___", state 313, "(1)" - line 167, "pan.___", state 314, "((cache_dirty_generation_ptr.bitfield&(1<<_pid)))" - line 167, "pan.___", state 314, "else" - line 177, "pan.___", state 319, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 177, "pan.___", state 319, "else" - line 159, "pan.___", state 324, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 167, "pan.___", state 346, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 159, "pan.___", state 363, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 365, "(1)" - line 163, "pan.___", state 372, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 374, "(1)" - line 163, "pan.___", state 375, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 163, "pan.___", state 375, "else" - line 161, "pan.___", state 380, "((j<1))" - line 161, "pan.___", state 380, "((j>=1))" - line 167, "pan.___", state 385, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 167, "pan.___", state 387, "(1)" - line 167, "pan.___", state 388, "((cache_dirty_generation_ptr.bitfield&(1<<_pid)))" - line 167, "pan.___", state 388, "else" - line 177, "pan.___", state 393, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 177, "pan.___", state 393, "else" - line 289, "pan.___", state 408, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 440, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 453, "(1)" - line 308, "pan.___", state 483, "(1)" - line 289, "pan.___", state 496, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 541, "(1)" - line 308, "pan.___", state 571, "(1)" - line 289, "pan.___", state 584, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 616, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 629, "(1)" - line 308, "pan.___", state 659, "(1)" - line 159, "pan.___", state 674, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 676, "(1)" - line 163, "pan.___", state 683, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 685, "(1)" - line 163, "pan.___", state 686, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 163, "pan.___", state 686, "else" - line 161, "pan.___", state 691, "((j<1))" - line 161, "pan.___", state 691, "((j>=1))" - line 167, "pan.___", state 696, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 167, "pan.___", state 698, "(1)" - line 167, "pan.___", state 699, "((cache_dirty_generation_ptr.bitfield&(1<<_pid)))" - line 167, "pan.___", state 699, "else" - line 177, "pan.___", state 704, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 177, "pan.___", state 704, "else" - line 159, "pan.___", state 709, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 167, "pan.___", state 731, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 159, "pan.___", state 748, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 750, "(1)" - line 163, "pan.___", state 757, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 759, "(1)" - line 163, "pan.___", state 760, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 163, "pan.___", state 760, "else" - line 161, "pan.___", state 765, "((j<1))" - line 161, "pan.___", state 765, "((j>=1))" - line 167, "pan.___", state 770, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 167, "pan.___", state 772, "(1)" - line 167, "pan.___", state 773, "((cache_dirty_generation_ptr.bitfield&(1<<_pid)))" - line 167, "pan.___", state 773, "else" - line 177, "pan.___", state 778, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 177, "pan.___", state 778, "else" - line 289, "pan.___", state 788, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 820, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 833, "(1)" - line 308, "pan.___", state 863, "(1)" - line 289, "pan.___", state 884, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 916, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 929, "(1)" - line 308, "pan.___", state 959, "(1)" - line 434, "pan.___", state 972, "-end-" - (95 of 972 states) -unreached in proctype urcu_writer - line 289, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 289, "pan.___", state 20, "(1)" - line 293, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 34, "(1)" - line 293, "pan.___", state 35, "(1)" - line 293, "pan.___", state 35, "(1)" - line 291, "pan.___", state 40, "((i<1))" - line 291, "pan.___", state 40, "((i>=1))" - line 298, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 59, "(1)" - line 299, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 299, "pan.___", state 60, "else" - line 299, "pan.___", state 63, "(1)" - line 299, "pan.___", state 64, "(1)" - line 299, "pan.___", state 64, "(1)" - line 303, "pan.___", state 72, "(1)" - line 303, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 303, "pan.___", state 73, "else" - line 303, "pan.___", state 76, "(1)" - line 303, "pan.___", state 77, "(1)" - line 303, "pan.___", state 77, "(1)" - line 301, "pan.___", state 82, "((i<1))" - line 301, "pan.___", state 82, "((i>=1))" - line 308, "pan.___", state 89, "(1)" - line 308, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 308, "pan.___", state 90, "else" - line 308, "pan.___", state 93, "(1)" - line 308, "pan.___", state 94, "(1)" - line 308, "pan.___", state 94, "(1)" - line 310, "pan.___", state 97, "(1)" - line 310, "pan.___", state 97, "(1)" - line 456, "pan.___", state 101, "cached_generation_ptr.val[_pid] = (old_gen+1)" - line 454, "pan.___", state 102, "old_gen = cached_generation_ptr.val[_pid]" - line 289, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 289, "pan.___", state 112, "(1)" - line 293, "pan.___", state 120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 126, "(1)" - line 293, "pan.___", state 127, "(1)" - line 293, "pan.___", state 127, "(1)" - line 299, "pan.___", state 151, "(1)" - line 303, "pan.___", state 164, "(1)" - line 310, "pan.___", state 189, "(1)" - line 310, "pan.___", state 189, "(1)" - line 468, "pan.___", state 195, "(1)" - line 159, "pan.___", state 205, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 214, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 240, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 298, "pan.___", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 755, "(1)" - line 299, "pan.___", state 756, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 299, "pan.___", state 756, "else" - line 299, "pan.___", state 759, "(1)" - line 299, "pan.___", state 760, "(1)" - line 299, "pan.___", state 760, "(1)" - line 303, "pan.___", state 768, "(1)" - line 303, "pan.___", state 769, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 303, "pan.___", state 769, "else" - line 303, "pan.___", state 772, "(1)" - line 303, "pan.___", state 773, "(1)" - line 303, "pan.___", state 773, "(1)" - line 301, "pan.___", state 778, "((i<1))" - line 301, "pan.___", state 778, "((i>=1))" - line 308, "pan.___", state 785, "(1)" - line 308, "pan.___", state 786, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 308, "pan.___", state 786, "else" - line 308, "pan.___", state 789, "(1)" - line 308, "pan.___", state 790, "(1)" - line 308, "pan.___", state 790, "(1)" - line 310, "pan.___", state 793, "(1)" - line 310, "pan.___", state 793, "(1)" - line 293, "pan.___", state 822, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 840, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 866, "(1)" - line 308, "pan.___", state 883, "(1)" - line 293, "pan.___", state 910, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 928, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 954, "(1)" - line 308, "pan.___", state 971, "(1)" - line 289, "pan.___", state 988, "(1)" - line 293, "pan.___", state 1000, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1018, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 1044, "(1)" - line 308, "pan.___", state 1061, "(1)" - line 293, "pan.___", state 1091, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1109, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 1135, "(1)" - line 308, "pan.___", state 1152, "(1)" - line 163, "pan.___", state 1174, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 167, "pan.___", state 1187, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 1200, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 298, "pan.___", state 1319, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 1332, "(1)" - line 299, "pan.___", state 1333, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 299, "pan.___", state 1333, "else" - line 299, "pan.___", state 1336, "(1)" - line 299, "pan.___", state 1337, "(1)" - line 299, "pan.___", state 1337, "(1)" - line 303, "pan.___", state 1345, "(1)" - line 303, "pan.___", state 1346, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 303, "pan.___", state 1346, "else" - line 303, "pan.___", state 1349, "(1)" - line 303, "pan.___", state 1350, "(1)" - line 303, "pan.___", state 1350, "(1)" - line 301, "pan.___", state 1355, "((i<1))" - line 301, "pan.___", state 1355, "((i>=1))" - line 308, "pan.___", state 1362, "(1)" - line 308, "pan.___", state 1363, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 308, "pan.___", state 1363, "else" - line 308, "pan.___", state 1366, "(1)" - line 308, "pan.___", state 1367, "(1)" - line 308, "pan.___", state 1367, "(1)" - line 310, "pan.___", state 1370, "(1)" - line 310, "pan.___", state 1370, "(1)" - line 163, "pan.___", state 1394, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 167, "pan.___", state 1407, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 1420, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=2))" - line 519, "pan.___", state 20, "((j<2))" - line 519, "pan.___", state 20, "((j>=2))" - line 524, "pan.___", state 33, "((j<2))" - line 524, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 572, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 28.5 seconds -pan: rate 36487.053 states/second -pan: avg transition delay 1.8409e-06 usec -cp .input.spin urcu_free_no_rmb.spin.input -cp .input.spin.trail urcu_free_no_rmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input deleted file mode 100644 index 899fdb4..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input +++ /dev/null @@ -1,532 +0,0 @@ -#define NO_RMB - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - - -#if (NR_READERS == 1) - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#elif (NR_READERS == 2) - -#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) -#define read_free (free_done && (data_access[0] || data_access[1])) - -#else - -#error "Too many readers" - -#endif - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - atomic { - if - :: get_readerid() == 0 -> -progress_reader: - skip; - :: else -> - skip; - fi; - } -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input.trail deleted file mode 100644 index 0aacf1a..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_rmb.spin.input.trail +++ /dev/null @@ -1,1739 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2529 -2:3:2481 -3:3:2484 -4:3:2484 -5:3:2487 -6:3:2495 -7:3:2495 -8:3:2498 -9:3:2504 -10:3:2508 -11:3:2508 -12:3:2511 -13:3:2519 -14:3:2523 -15:3:2524 -16:0:2529 -17:3:2526 -18:0:2529 -19:2:974 -20:0:2529 -21:2:980 -22:0:2529 -23:2:981 -24:0:2529 -25:2:982 -26:2:986 -27:2:987 -28:2:995 -29:2:996 -30:2:1000 -31:2:1001 -32:2:1009 -33:2:1014 -34:2:1018 -35:2:1019 -36:2:1026 -37:2:1027 -38:2:1038 -39:2:1039 -40:2:1040 -41:2:1051 -42:2:1056 -43:2:1057 -44:0:2529 -45:2:1069 -46:2:1070 -47:0:2529 -48:2:1074 -49:2:1078 -50:2:1079 -51:2:1087 -52:2:1088 -53:2:1092 -54:2:1093 -55:2:1101 -56:2:1106 -57:2:1107 -58:2:1118 -59:2:1119 -60:2:1130 -61:2:1131 -62:2:1132 -63:2:1143 -64:2:1148 -65:2:1149 -66:0:2529 -67:2:1161 -68:0:2529 -69:2:1162 -70:0:2529 -71:2:1172 -72:0:2529 -73:2:1173 -74:0:2529 -75:2:1177 -76:2:1178 -77:2:1182 -78:2:1186 -79:2:1187 -80:2:1191 -81:2:1199 -82:2:1200 -83:0:2529 -84:2:1208 -85:0:2529 -86:2:1212 -87:2:1213 -88:2:1217 -89:2:1221 -90:2:1222 -91:2:1226 -92:2:1234 -93:2:1235 -94:0:2529 -95:2:1243 -96:0:2529 -97:2:1251 -98:2:1252 -99:2:1256 -100:2:1260 -101:2:1261 -102:2:1265 -103:2:1273 -104:2:1274 -105:0:2529 -106:2:1286 -107:0:2529 -108:2:1287 -109:2:1291 -110:2:1292 -111:2:1300 -112:2:1301 -113:2:1305 -114:2:1306 -115:2:1314 -116:2:1319 -117:2:1323 -118:2:1324 -119:2:1331 -120:2:1332 -121:2:1343 -122:2:1344 -123:2:1345 -124:2:1356 -125:2:1361 -126:2:1362 -127:0:2529 -128:2:1374 -129:0:2529 -130:2:1377 -131:2:1378 -132:2:1390 -133:2:1391 -134:2:1395 -135:2:1396 -136:2:1404 -137:2:1409 -138:2:1413 -139:2:1414 -140:2:1421 -141:2:1422 -142:2:1433 -143:2:1434 -144:2:1435 -145:2:1446 -146:2:1451 -147:2:1452 -148:0:2529 -149:2:1464 -150:0:2529 -151:2:1465 -152:0:2529 -153:2:1466 -154:0:2529 -155:2:1467 -156:0:2529 -157:2:1468 -158:2:1472 -159:2:1473 -160:2:1481 -161:2:1482 -162:2:1486 -163:2:1487 -164:2:1495 -165:2:1500 -166:2:1504 -167:2:1505 -168:2:1512 -169:2:1513 -170:2:1524 -171:2:1525 -172:2:1526 -173:2:1537 -174:2:1542 -175:2:1543 -176:0:2529 -177:2:1669 -178:0:2529 -179:2:1765 -180:0:2529 -181:2:1766 -182:0:2529 -183:2:1770 -184:0:2529 -185:2:1776 -186:2:1780 -187:2:1781 -188:2:1789 -189:2:1790 -190:2:1794 -191:2:1795 -192:2:1803 -193:2:1808 -194:2:1812 -195:2:1813 -196:2:1820 -197:2:1821 -198:2:1832 -199:2:1833 -200:2:1834 -201:2:1845 -202:2:1850 -203:2:1851 -204:0:2529 -205:2:1863 -206:0:2529 -207:2:1864 -208:2:1868 -209:2:1869 -210:2:1877 -211:2:1878 -212:2:1882 -213:2:1883 -214:2:1891 -215:2:1896 -216:2:1900 -217:2:1901 -218:2:1908 -219:2:1909 -220:2:1920 -221:2:1921 -222:2:1922 -223:2:1933 -224:2:1938 -225:2:1939 -226:0:2529 -227:2:1951 -228:0:2529 -229:2:1954 -230:2:1955 -231:2:1967 -232:2:1968 -233:2:1972 -234:2:1973 -235:2:1981 -236:2:1986 -237:2:1990 -238:2:1991 -239:2:1998 -240:2:1999 -241:2:2010 -242:2:2011 -243:2:2012 -244:2:2023 -245:2:2028 -246:2:2029 -247:0:2529 -248:2:2041 -249:0:2529 -250:2:2042 -251:0:2529 -252:2:2043 -253:0:2529 -254:2:2044 -255:0:2529 -256:2:2045 -257:2:2049 -258:2:2050 -259:2:2058 -260:2:2059 -261:2:2063 -262:2:2064 -263:2:2072 -264:2:2077 -265:2:2081 -266:2:2082 -267:2:2089 -268:2:2090 -269:2:2101 -270:2:2102 -271:2:2103 -272:2:2114 -273:2:2119 -274:2:2120 -275:0:2529 -276:2:2246 -277:0:2529 -278:2:2342 -279:0:2529 -280:2:2343 -281:0:2529 -282:2:2347 -283:0:2529 -284:2:2353 -285:0:2529 -286:2:2357 -287:2:2358 -288:2:2362 -289:2:2366 -290:2:2367 -291:2:2371 -292:2:2379 -293:2:2380 -294:0:2529 -295:2:2388 -296:0:2529 -297:2:2392 -298:2:2393 -299:2:2397 -300:2:2401 -301:2:2402 -302:2:2406 -303:2:2414 -304:2:2415 -305:0:2529 -306:2:2423 -307:0:2529 -308:2:2431 -309:2:2432 -310:2:2436 -311:2:2440 -312:2:2441 -313:2:2445 -314:2:2453 -315:2:2454 -316:0:2529 -317:2:2466 -318:0:2529 -319:2:2467 -320:0:2529 -321:2:981 -322:0:2529 -323:2:982 -324:2:986 -325:2:987 -326:2:995 -327:2:996 -328:2:1000 -329:2:1001 -330:2:1009 -331:2:1014 -332:2:1018 -333:2:1019 -334:2:1026 -335:2:1027 -336:2:1038 -337:2:1039 -338:2:1040 -339:2:1051 -340:2:1056 -341:2:1057 -342:0:2529 -343:2:1069 -344:2:1070 -345:0:2529 -346:2:1074 -347:2:1078 -348:2:1079 -349:2:1087 -350:2:1088 -351:2:1092 -352:2:1093 -353:2:1101 -354:2:1106 -355:2:1107 -356:2:1118 -357:2:1119 -358:2:1130 -359:2:1131 -360:2:1132 -361:2:1143 -362:2:1148 -363:2:1149 -364:0:2529 -365:2:1161 -366:0:2529 -367:2:1162 -368:0:2529 -369:2:1172 -370:0:2529 -371:2:1173 -372:0:2529 -373:2:1177 -374:2:1178 -375:2:1182 -376:2:1186 -377:2:1187 -378:2:1191 -379:2:1199 -380:2:1200 -381:0:2529 -382:2:1208 -383:0:2529 -384:2:1212 -385:2:1213 -386:2:1217 -387:2:1221 -388:2:1222 -389:2:1226 -390:2:1234 -391:2:1235 -392:0:2529 -393:2:1243 -394:0:2529 -395:2:1251 -396:2:1252 -397:2:1256 -398:2:1260 -399:2:1261 -400:2:1265 -401:2:1273 -402:2:1274 -403:0:2529 -404:2:1286 -405:0:2529 -406:2:1287 -407:2:1291 -408:2:1292 -409:2:1300 -410:2:1301 -411:2:1305 -412:2:1306 -413:2:1314 -414:2:1319 -415:2:1323 -416:2:1324 -417:2:1331 -418:2:1332 -419:2:1343 -420:2:1344 -421:2:1345 -422:2:1356 -423:2:1361 -424:2:1362 -425:0:2529 -426:2:1374 -427:0:2529 -428:2:1377 -429:2:1378 -430:2:1390 -431:2:1391 -432:2:1395 -433:2:1396 -434:2:1404 -435:2:1409 -436:2:1413 -437:2:1414 -438:2:1421 -439:2:1422 -440:2:1433 -441:2:1434 -442:2:1435 -443:2:1446 -444:2:1451 -445:2:1452 -446:0:2529 -447:2:1464 -448:0:2529 -449:2:1465 -450:0:2529 -451:2:1466 -452:0:2529 -453:2:1467 -454:0:2529 -455:2:1468 -456:2:1472 -457:2:1473 -458:2:1481 -459:2:1482 -460:2:1486 -461:2:1487 -462:2:1495 -463:2:1500 -464:2:1504 -465:2:1505 -466:2:1512 -467:2:1513 -468:2:1524 -469:2:1525 -470:2:1526 -471:2:1537 -472:2:1542 -473:2:1543 -474:0:2529 -475:2:1669 -476:0:2529 -477:2:1765 -478:0:2529 -479:2:1766 -480:0:2529 -481:2:1770 -482:0:2529 -483:2:1776 -484:2:1780 -485:2:1781 -486:2:1789 -487:2:1790 -488:2:1794 -489:2:1795 -490:2:1803 -491:2:1808 -492:2:1812 -493:2:1813 -494:2:1820 -495:2:1821 -496:2:1832 -497:2:1833 -498:2:1834 -499:2:1845 -500:2:1850 -501:2:1851 -502:0:2529 -503:2:1863 -504:0:2529 -505:2:1864 -506:2:1868 -507:2:1869 -508:2:1877 -509:2:1878 -510:2:1882 -511:2:1883 -512:2:1891 -513:2:1896 -514:2:1900 -515:2:1901 -516:2:1908 -517:2:1909 -518:2:1920 -519:2:1921 -520:2:1922 -521:2:1933 -522:2:1938 -523:2:1939 -524:0:2529 -525:2:1951 -526:0:2529 -527:2:1954 -528:2:1955 -529:2:1967 -530:2:1968 -531:2:1972 -532:2:1973 -533:2:1981 -534:2:1986 -535:2:1990 -536:2:1991 -537:2:1998 -538:2:1999 -539:2:2010 -540:2:2011 -541:2:2012 -542:2:2023 -543:2:2028 -544:2:2029 -545:0:2529 -546:2:2041 -547:0:2529 -548:2:2042 -549:0:2529 -550:2:2043 -551:0:2529 -552:2:2044 -553:0:2529 -554:2:2045 -555:2:2049 -556:2:2050 -557:2:2058 -558:2:2059 -559:2:2063 -560:2:2064 -561:2:2072 -562:2:2077 -563:2:2081 -564:2:2082 -565:2:2089 -566:2:2090 -567:2:2101 -568:2:2102 -569:2:2103 -570:2:2114 -571:2:2119 -572:2:2120 -573:0:2529 -574:2:2246 -575:0:2529 -576:2:2342 -577:0:2529 -578:2:2343 -579:0:2529 -580:2:2347 -581:0:2529 -582:2:2353 -583:0:2529 -584:2:2357 -585:2:2358 -586:2:2362 -587:2:2366 -588:2:2367 -589:2:2371 -590:2:2379 -591:2:2380 -592:0:2529 -593:2:2388 -594:0:2529 -595:2:2392 -596:2:2393 -597:2:2397 -598:2:2401 -599:2:2402 -600:2:2406 -601:2:2414 -602:2:2415 -603:0:2529 -604:2:2423 -605:0:2529 -606:2:2431 -607:2:2432 -608:2:2436 -609:2:2440 -610:2:2441 -611:2:2445 -612:2:2453 -613:2:2454 -614:0:2529 -615:2:2466 -616:0:2529 -617:2:2467 -618:0:2529 -619:2:981 -620:0:2529 -621:2:982 -622:2:986 -623:2:987 -624:2:995 -625:2:996 -626:2:1000 -627:2:1001 -628:2:1009 -629:2:1014 -630:2:1018 -631:2:1019 -632:2:1026 -633:2:1027 -634:2:1038 -635:2:1039 -636:2:1040 -637:2:1051 -638:2:1056 -639:2:1057 -640:0:2529 -641:2:1069 -642:2:1070 -643:0:2529 -644:2:1074 -645:2:1078 -646:2:1079 -647:2:1087 -648:2:1088 -649:2:1092 -650:2:1093 -651:2:1101 -652:2:1106 -653:2:1107 -654:2:1118 -655:2:1119 -656:2:1130 -657:2:1131 -658:2:1132 -659:2:1143 -660:2:1148 -661:2:1149 -662:0:2529 -663:2:1161 -664:0:2529 -665:2:1162 -666:0:2529 -667:2:1172 -668:0:2529 -669:2:1173 -670:0:2529 -671:2:1177 -672:2:1178 -673:2:1182 -674:2:1186 -675:2:1187 -676:2:1191 -677:2:1199 -678:2:1200 -679:0:2529 -680:2:1208 -681:0:2529 -682:2:1212 -683:2:1213 -684:2:1217 -685:2:1221 -686:2:1222 -687:2:1226 -688:2:1234 -689:2:1235 -690:0:2529 -691:2:1243 -692:0:2529 -693:2:1251 -694:2:1252 -695:2:1256 -696:2:1260 -697:2:1261 -698:2:1265 -699:2:1273 -700:2:1274 -701:0:2529 -702:2:1286 -703:0:2529 -704:2:1287 -705:2:1291 -706:2:1292 -707:2:1300 -708:2:1301 -709:2:1305 -710:2:1306 -711:2:1314 -712:2:1319 -713:2:1323 -714:2:1324 -715:2:1331 -716:2:1332 -717:2:1343 -718:2:1344 -719:2:1345 -720:2:1356 -721:2:1361 -722:2:1362 -723:0:2529 -724:2:1374 -725:0:2529 -726:2:1377 -727:2:1378 -728:2:1390 -729:2:1391 -730:2:1395 -731:2:1396 -732:2:1404 -733:2:1409 -734:2:1413 -735:2:1414 -736:2:1421 -737:2:1422 -738:2:1433 -739:2:1434 -740:2:1435 -741:2:1446 -742:2:1451 -743:2:1452 -744:0:2529 -745:2:1464 -746:0:2529 -747:2:1465 -748:0:2529 -749:2:1466 -750:0:2529 -751:2:1467 -752:0:2529 -753:2:1468 -754:2:1472 -755:2:1473 -756:2:1481 -757:2:1482 -758:2:1486 -759:2:1487 -760:2:1495 -761:2:1500 -762:2:1504 -763:2:1505 -764:2:1512 -765:2:1513 -766:2:1524 -767:2:1525 -768:2:1526 -769:2:1537 -770:2:1542 -771:2:1543 -772:0:2529 -773:2:1669 -774:0:2529 -775:2:1765 -776:0:2529 -777:2:1766 -778:0:2529 -779:2:1770 -780:0:2529 -781:2:1776 -782:2:1780 -783:2:1781 -784:2:1789 -785:2:1790 -786:2:1794 -787:2:1795 -788:2:1803 -789:2:1808 -790:2:1812 -791:2:1813 -792:2:1820 -793:2:1821 -794:2:1832 -795:2:1833 -796:2:1834 -797:2:1845 -798:2:1850 -799:2:1851 -800:0:2529 -801:2:1863 -802:0:2529 -803:2:1864 -804:2:1868 -805:2:1869 -806:2:1877 -807:2:1878 -808:2:1882 -809:2:1883 -810:2:1891 -811:2:1896 -812:2:1900 -813:2:1901 -814:2:1908 -815:2:1909 -816:2:1920 -817:2:1921 -818:2:1922 -819:2:1933 -820:2:1938 -821:2:1939 -822:0:2529 -823:2:1951 -824:0:2529 -825:2:1954 -826:2:1955 -827:2:1967 -828:2:1968 -829:2:1972 -830:2:1973 -831:2:1981 -832:2:1986 -833:2:1990 -834:2:1991 -835:2:1998 -836:2:1999 -837:2:2010 -838:2:2011 -839:2:2012 -840:2:2023 -841:2:2028 -842:2:2029 -843:0:2529 -844:2:2041 -845:0:2529 -846:2:2042 -847:0:2529 -848:2:2043 -849:0:2529 -850:2:2044 -851:0:2529 -852:2:2045 -853:2:2049 -854:2:2050 -855:2:2058 -856:2:2059 -857:2:2063 -858:2:2064 -859:2:2072 -860:2:2077 -861:2:2081 -862:2:2082 -863:2:2089 -864:2:2090 -865:2:2101 -866:2:2102 -867:2:2103 -868:2:2114 -869:2:2119 -870:2:2120 -871:0:2529 -872:2:2246 -873:0:2529 -874:2:2342 -875:0:2529 -876:2:2343 -877:0:2529 -878:2:2347 -879:0:2529 -880:2:2353 -881:0:2529 -882:2:2357 -883:2:2358 -884:2:2362 -885:2:2366 -886:2:2367 -887:2:2371 -888:2:2379 -889:2:2380 -890:0:2529 -891:2:2388 -892:0:2529 -893:2:2392 -894:2:2393 -895:2:2397 -896:2:2401 -897:2:2402 -898:2:2406 -899:2:2414 -900:2:2415 -901:0:2529 -902:2:2423 -903:0:2529 -904:2:2431 -905:2:2432 -906:2:2436 -907:2:2440 -908:2:2441 -909:2:2445 -910:2:2453 -911:2:2454 -912:0:2529 -913:2:2466 -914:0:2529 -915:2:2467 -916:0:2529 -917:2:981 -918:0:2529 -919:2:982 -920:2:986 -921:2:987 -922:2:995 -923:2:996 -924:2:1000 -925:2:1001 -926:2:1009 -927:2:1014 -928:2:1018 -929:2:1019 -930:2:1026 -931:2:1027 -932:2:1038 -933:2:1039 -934:2:1040 -935:2:1051 -936:2:1056 -937:2:1057 -938:0:2529 -939:2:1069 -940:2:1070 -941:0:2529 -942:2:1074 -943:2:1078 -944:2:1079 -945:2:1087 -946:2:1088 -947:2:1092 -948:2:1093 -949:2:1101 -950:2:1106 -951:2:1107 -952:2:1118 -953:2:1119 -954:2:1130 -955:2:1131 -956:2:1132 -957:2:1143 -958:2:1148 -959:2:1149 -960:0:2529 -961:2:1161 -962:0:2529 -963:2:1162 -964:0:2529 -965:2:1172 -966:0:2529 -967:2:1173 -968:0:2529 -969:2:1177 -970:2:1178 -971:2:1182 -972:2:1186 -973:2:1187 -974:2:1191 -975:2:1199 -976:2:1200 -977:0:2529 -978:2:1208 -979:0:2529 -980:2:1212 -981:2:1213 -982:2:1217 -983:2:1221 -984:2:1222 -985:2:1226 -986:2:1234 -987:2:1235 -988:0:2529 -989:2:1243 -990:0:2529 -991:2:1251 -992:2:1252 -993:2:1256 -994:2:1260 -995:2:1261 -996:2:1265 -997:2:1273 -998:2:1274 -999:0:2529 -1000:2:1286 -1001:0:2529 -1002:2:1287 -1003:2:1291 -1004:2:1292 -1005:2:1300 -1006:2:1301 -1007:2:1305 -1008:2:1306 -1009:2:1314 -1010:2:1319 -1011:2:1323 -1012:2:1324 -1013:2:1331 -1014:2:1332 -1015:2:1343 -1016:2:1344 -1017:2:1345 -1018:2:1356 -1019:2:1361 -1020:2:1362 -1021:0:2529 -1022:2:1374 -1023:0:2529 -1024:2:1377 -1025:2:1378 -1026:2:1390 -1027:2:1391 -1028:2:1395 -1029:2:1396 -1030:2:1404 -1031:2:1409 -1032:2:1413 -1033:2:1414 -1034:2:1421 -1035:2:1422 -1036:2:1433 -1037:2:1434 -1038:2:1435 -1039:2:1446 -1040:2:1451 -1041:2:1452 -1042:0:2529 -1043:2:1464 -1044:0:2529 -1045:2:1465 -1046:0:2529 -1047:2:1466 -1048:0:2529 -1049:2:1467 -1050:0:2529 -1051:2:1468 -1052:2:1472 -1053:2:1473 -1054:2:1481 -1055:2:1482 -1056:2:1486 -1057:2:1487 -1058:2:1495 -1059:2:1500 -1060:2:1504 -1061:2:1505 -1062:2:1512 -1063:2:1513 -1064:2:1524 -1065:2:1525 -1066:2:1526 -1067:2:1537 -1068:2:1542 -1069:2:1543 -1070:0:2529 -1071:2:1669 -1072:0:2529 -1073:2:1765 -1074:0:2529 -1075:2:1766 -1076:0:2529 -1077:2:1770 -1078:0:2529 -1079:2:1776 -1080:2:1780 -1081:2:1781 -1082:2:1789 -1083:2:1790 -1084:2:1794 -1085:2:1795 -1086:2:1803 -1087:2:1808 -1088:2:1812 -1089:2:1813 -1090:2:1820 -1091:2:1821 -1092:2:1832 -1093:2:1833 -1094:2:1834 -1095:2:1845 -1096:2:1850 -1097:2:1851 -1098:0:2529 -1099:2:1863 -1100:0:2529 -1101:2:1864 -1102:2:1868 -1103:2:1869 -1104:2:1877 -1105:2:1878 -1106:2:1882 -1107:2:1883 -1108:2:1891 -1109:2:1896 -1110:2:1900 -1111:2:1901 -1112:2:1908 -1113:2:1909 -1114:2:1920 -1115:2:1921 -1116:2:1922 -1117:2:1933 -1118:2:1938 -1119:2:1939 -1120:0:2529 -1121:2:1951 -1122:0:2529 -1123:2:1954 -1124:2:1955 -1125:2:1967 -1126:2:1968 -1127:2:1972 -1128:2:1973 -1129:2:1981 -1130:2:1986 -1131:2:1990 -1132:2:1991 -1133:2:1998 -1134:2:1999 -1135:2:2010 -1136:2:2011 -1137:2:2012 -1138:2:2023 -1139:2:2028 -1140:2:2029 -1141:0:2529 -1142:2:2041 -1143:0:2529 -1144:2:2042 -1145:0:2529 -1146:2:2043 -1147:0:2529 -1148:2:2044 -1149:0:2529 -1150:2:2045 -1151:2:2049 -1152:2:2050 -1153:2:2058 -1154:2:2059 -1155:2:2063 -1156:2:2064 -1157:2:2072 -1158:2:2077 -1159:2:2081 -1160:2:2082 -1161:2:2089 -1162:2:2090 -1163:2:2101 -1164:2:2102 -1165:2:2103 -1166:2:2114 -1167:2:2119 -1168:2:2120 -1169:0:2529 -1170:2:2246 -1171:0:2529 -1172:2:2342 -1173:0:2529 -1174:2:2343 -1175:0:2529 -1176:2:2347 -1177:0:2529 -1178:2:2353 -1179:0:2529 -1180:2:2357 -1181:2:2358 -1182:2:2362 -1183:2:2366 -1184:2:2367 -1185:2:2371 -1186:2:2379 -1187:2:2380 -1188:0:2529 -1189:2:2388 -1190:0:2529 -1191:2:2392 -1192:2:2393 -1193:2:2397 -1194:2:2401 -1195:2:2402 -1196:2:2406 -1197:2:2414 -1198:2:2415 -1199:0:2529 -1200:2:2423 -1201:0:2529 -1202:2:2431 -1203:2:2432 -1204:2:2436 -1205:2:2440 -1206:2:2441 -1207:2:2445 -1208:2:2453 -1209:2:2454 -1210:0:2529 -1211:2:2466 -1212:0:2529 -1213:2:2467 -1214:0:2529 -1215:2:981 -1216:0:2529 -1217:2:982 -1218:2:986 -1219:2:987 -1220:2:995 -1221:2:996 -1222:2:1000 -1223:2:1001 -1224:2:1009 -1225:2:1014 -1226:2:1018 -1227:2:1019 -1228:2:1026 -1229:2:1027 -1230:2:1038 -1231:2:1039 -1232:2:1040 -1233:2:1051 -1234:2:1056 -1235:2:1057 -1236:0:2529 -1237:2:1069 -1238:2:1070 -1239:0:2529 -1240:2:1074 -1241:2:1078 -1242:2:1079 -1243:2:1087 -1244:2:1088 -1245:2:1092 -1246:2:1093 -1247:2:1101 -1248:2:1114 -1249:2:1115 -1250:2:1118 -1251:2:1119 -1252:2:1130 -1253:2:1131 -1254:2:1132 -1255:2:1143 -1256:2:1148 -1257:2:1151 -1258:2:1152 -1259:0:2529 -1260:2:1161 -1261:0:2529 -1262:2:1162 -1263:0:2529 -1264:2:1172 -1265:0:2529 -1266:2:1173 -1267:0:2529 -1268:1:2 -1269:0:2529 -1270:1:8 -1271:0:2529 -1272:1:9 -1273:0:2529 -1274:1:10 -1275:0:2529 -1276:1:11 -1277:0:2529 -1278:1:12 -1279:1:16 -1280:1:17 -1281:1:25 -1282:1:26 -1283:1:30 -1284:1:31 -1285:1:39 -1286:1:44 -1287:1:48 -1288:1:49 -1289:1:56 -1290:1:57 -1291:1:68 -1292:1:69 -1293:1:70 -1294:1:81 -1295:1:86 -1296:1:87 -1297:0:2529 -1298:2:1177 -1299:2:1178 -1300:2:1182 -1301:2:1186 -1302:2:1187 -1303:2:1191 -1304:2:1196 -1305:0:2529 -1306:2:1208 -1307:0:2529 -1308:2:1212 -1309:2:1213 -1310:2:1217 -1311:2:1221 -1312:2:1222 -1313:2:1226 -1314:2:1234 -1315:2:1235 -1316:0:2529 -1317:2:1243 -1318:0:2529 -1319:2:1251 -1320:2:1252 -1321:2:1256 -1322:2:1260 -1323:2:1261 -1324:2:1265 -1325:2:1273 -1326:2:1274 -1327:0:2529 -1328:2:1286 -1329:0:2529 -1330:2:1287 -1331:2:1291 -1332:2:1292 -1333:2:1300 -1334:2:1301 -1335:2:1305 -1336:2:1306 -1337:2:1314 -1338:2:1319 -1339:2:1323 -1340:2:1324 -1341:2:1331 -1342:2:1332 -1343:2:1343 -1344:2:1344 -1345:2:1345 -1346:2:1356 -1347:2:1361 -1348:2:1362 -1349:0:2529 -1350:2:1374 -1351:0:2529 -1352:2:1377 -1353:2:1378 -1354:2:1390 -1355:2:1391 -1356:2:1395 -1357:2:1396 -1358:2:1404 -1359:2:1409 -1360:2:1413 -1361:2:1414 -1362:2:1421 -1363:2:1422 -1364:2:1433 -1365:2:1434 -1366:2:1435 -1367:2:1446 -1368:2:1451 -1369:2:1452 -1370:0:2529 -1371:2:1464 -1372:0:2529 -1373:2:1465 -1374:0:2529 -1375:2:1466 -1376:0:2529 -1377:2:1467 -1378:0:2529 -1379:2:1468 -1380:2:1472 -1381:2:1473 -1382:2:1481 -1383:2:1482 -1384:2:1486 -1385:2:1487 -1386:2:1495 -1387:2:1500 -1388:2:1504 -1389:2:1505 -1390:2:1512 -1391:2:1513 -1392:2:1524 -1393:2:1525 -1394:2:1526 -1395:2:1537 -1396:2:1542 -1397:2:1543 -1398:0:2529 -1399:2:1669 -1400:0:2529 -1401:2:1765 -1402:0:2529 -1403:2:1766 -1404:0:2529 -1405:2:1770 -1406:0:2529 -1407:2:1776 -1408:2:1780 -1409:2:1781 -1410:2:1789 -1411:2:1790 -1412:2:1794 -1413:2:1795 -1414:2:1803 -1415:2:1808 -1416:2:1812 -1417:2:1813 -1418:2:1820 -1419:2:1821 -1420:2:1832 -1421:2:1833 -1422:2:1834 -1423:2:1845 -1424:2:1850 -1425:2:1851 -1426:0:2529 -1427:2:1863 -1428:0:2529 -1429:2:1864 -1430:2:1868 -1431:2:1869 -1432:2:1877 -1433:2:1878 -1434:2:1882 -1435:2:1883 -1436:2:1891 -1437:2:1896 -1438:2:1900 -1439:2:1901 -1440:2:1908 -1441:2:1909 -1442:2:1920 -1443:2:1921 -1444:2:1922 -1445:2:1933 -1446:2:1938 -1447:2:1939 -1448:0:2529 -1449:2:1951 -1450:0:2529 -1451:2:1954 -1452:2:1955 -1453:2:1967 -1454:2:1968 -1455:2:1972 -1456:2:1973 -1457:2:1981 -1458:2:1986 -1459:2:1990 -1460:2:1991 -1461:2:1998 -1462:2:1999 -1463:2:2010 -1464:2:2011 -1465:2:2012 -1466:2:2023 -1467:2:2028 -1468:2:2029 -1469:0:2529 -1470:2:2041 -1471:0:2529 -1472:2:2042 -1473:0:2529 -1474:2:2043 -1475:0:2529 -1476:2:2044 -1477:0:2529 -1478:2:2045 -1479:2:2049 -1480:2:2050 -1481:2:2058 -1482:2:2059 -1483:2:2063 -1484:2:2064 -1485:2:2072 -1486:2:2077 -1487:2:2081 -1488:2:2082 -1489:2:2089 -1490:2:2090 -1491:2:2101 -1492:2:2102 -1493:2:2103 -1494:2:2114 -1495:2:2119 -1496:2:2120 -1497:0:2529 -1498:2:2246 -1499:0:2529 -1500:2:2342 -1501:0:2529 -1502:2:2343 -1503:0:2529 -1504:2:2347 -1505:0:2529 -1506:2:2353 -1507:0:2529 -1508:2:2357 -1509:2:2358 -1510:2:2362 -1511:2:2366 -1512:2:2367 -1513:2:2371 -1514:2:2379 -1515:2:2380 -1516:0:2529 -1517:2:2388 -1518:0:2529 -1519:2:2392 -1520:2:2393 -1521:2:2397 -1522:2:2401 -1523:2:2402 -1524:2:2406 -1525:2:2414 -1526:2:2415 -1527:0:2529 -1528:2:2423 -1529:0:2529 -1530:2:2431 -1531:2:2432 -1532:2:2436 -1533:2:2440 -1534:2:2441 -1535:2:2445 -1536:2:2453 -1537:2:2454 -1538:0:2529 -1539:2:2466 -1540:0:2529 -1541:2:2467 -1542:0:2529 -1543:2:2470 -1544:0:2529 -1545:2:2475 -1546:0:2529 -1547:1:99 -1548:0:2529 -1549:2:2476 -1550:0:2529 -1551:1:100 -1552:1:104 -1553:1:105 -1554:1:113 -1555:1:114 -1556:1:118 -1557:1:119 -1558:1:127 -1559:1:132 -1560:1:136 -1561:1:137 -1562:1:144 -1563:1:145 -1564:1:156 -1565:1:157 -1566:1:158 -1567:1:169 -1568:1:181 -1569:1:182 -1570:0:2529 -1571:2:2475 -1572:0:2529 -1573:1:187 -1574:0:2529 -1575:2:2476 -1576:0:2529 -1577:1:188 -1578:0:2529 -1579:2:2475 -1580:0:2529 -1581:1:189 -1582:1:193 -1583:1:194 -1584:1:202 -1585:1:203 -1586:1:207 -1587:1:208 -1588:1:216 -1589:1:221 -1590:1:225 -1591:1:226 -1592:1:233 -1593:1:234 -1594:1:245 -1595:1:246 -1596:1:247 -1597:1:258 -1598:1:270 -1599:1:271 -1600:0:2529 -1601:2:2476 -1602:0:2529 -1603:1:276 -1604:0:2529 -1605:2:2475 -1606:0:2529 -1607:1:393 -1608:0:2529 -1609:2:2476 -1610:0:2529 -1611:1:394 -1612:0:2529 -1613:2:2475 -1614:0:2529 -1615:1:11 -1616:0:2529 -1617:2:2476 -1618:0:2529 -1619:1:12 -1620:1:16 -1621:1:17 -1622:1:25 -1623:1:26 -1624:1:27 -1625:1:39 -1626:1:44 -1627:1:48 -1628:1:49 -1629:1:56 -1630:1:57 -1631:1:68 -1632:1:69 -1633:1:70 -1634:1:81 -1635:1:93 -1636:1:94 -1637:0:2529 -1638:2:2475 -1639:0:2529 -1640:1:99 -1641:0:2529 -1642:2:2476 -1643:0:2529 -1644:1:100 -1645:1:104 -1646:1:105 -1647:1:113 -1648:1:114 -1649:1:118 -1650:1:119 -1651:1:127 -1652:1:132 -1653:1:136 -1654:1:137 -1655:1:144 -1656:1:145 -1657:1:156 -1658:1:157 -1659:1:158 -1660:1:169 -1661:1:181 -1662:1:182 -1663:0:2529 -1664:2:2475 -1665:0:2529 -1666:1:279 -1667:0:2529 -1668:2:2476 -1669:0:2529 -1670:1:280 -1671:0:2529 -1672:2:2475 -1673:0:2529 -1674:1:393 -1675:0:2529 -1676:2:2476 -1677:0:2529 -1678:1:394 -1679:0:2529 -1680:2:2475 -1681:0:2529 -1682:1:399 -1683:0:2529 -1684:2:2476 -1685:0:2529 -1686:1:404 -1687:1:408 -1688:1:409 -1689:1:417 -1690:1:418 -1691:1:419 -1692:1:431 -1693:1:436 -1694:1:440 -1695:1:441 -1696:1:448 -1697:1:449 -1698:1:460 -1699:1:461 -1700:1:462 -1701:1:473 -1702:1:485 -1703:1:486 -1704:0:2529 -1705:2:2475 -1706:0:2529 -1707:1:491 -1708:0:2529 -1709:2:2476 -1710:0:2529 -1711:1:492 -1712:1:496 -1713:1:497 -1714:1:505 -1715:1:506 -1716:1:510 -1717:1:511 -1718:1:519 -1719:1:524 -1720:1:528 -1721:1:529 -1722:1:536 -1723:1:537 -1724:1:548 -1725:1:549 -1726:1:550 -1727:1:561 -1728:1:566 -1729:1:567 -1730:0:2529 -1731:2:2475 -1732:0:2529 -1733:1:579 -1734:0:2527 -1735:2:2476 -1736:0:2533 -1737:1:662 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.define b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.log deleted file mode 100644 index 477c85d..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.log +++ /dev/null @@ -1,381 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_wmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 567) -pan: claim violated! (at depth 1889) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 6646, errors: 1 - 377244 states, stored - 5291719 states, matched - 5668963 transitions (= stored+matched) - 20822372 atomic steps -hash conflicts: 405371 (resolved) - -Stats on memory usage (in Megabytes): - 30.221 equivalent memory usage for states (stored*(State-vector + overhead)) - 23.526 actual memory usage for states (compression: 77.85%) - state-vector as stored = 37 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 489.201 total actual memory usage - -unreached in proctype urcu_reader - line 289, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 61, "(1)" - line 308, "pan.___", state 91, "(1)" - line 289, "pan.___", state 104, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 136, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 149, "(1)" - line 308, "pan.___", state 179, "(1)" - line 289, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 225, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 238, "(1)" - line 308, "pan.___", state 268, "(1)" - line 144, "pan.___", state 290, "(1)" - line 148, "pan.___", state 298, "(1)" - line 148, "pan.___", state 299, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 299, "else" - line 146, "pan.___", state 304, "((j<1))" - line 146, "pan.___", state 304, "((j>=1))" - line 152, "pan.___", state 310, "(1)" - line 152, "pan.___", state 311, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 311, "else" - line 186, "pan.___", state 316, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 186, "pan.___", state 316, "else" - line 144, "pan.___", state 322, "(1)" - line 148, "pan.___", state 330, "(1)" - line 148, "pan.___", state 331, "(!((cache_dirty_urcu_active_readers.bitfield&(1<=1))" - line 152, "pan.___", state 342, "(1)" - line 152, "pan.___", state 343, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 144, "pan.___", state 358, "(1)" - line 148, "pan.___", state 366, "(1)" - line 148, "pan.___", state 367, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 367, "else" - line 146, "pan.___", state 372, "((j<1))" - line 146, "pan.___", state 372, "((j>=1))" - line 152, "pan.___", state 378, "(1)" - line 152, "pan.___", state 379, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 379, "else" - line 186, "pan.___", state 384, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 186, "pan.___", state 384, "else" - line 289, "pan.___", state 399, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 415, "(1)" - line 298, "pan.___", state 431, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 444, "(1)" - line 308, "pan.___", state 474, "(1)" - line 289, "pan.___", state 487, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 519, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 532, "(1)" - line 308, "pan.___", state 562, "(1)" - line 289, "pan.___", state 575, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 607, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 620, "(1)" - line 308, "pan.___", state 650, "(1)" - line 144, "pan.___", state 666, "(1)" - line 148, "pan.___", state 674, "(1)" - line 148, "pan.___", state 675, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 675, "else" - line 146, "pan.___", state 680, "((j<1))" - line 146, "pan.___", state 680, "((j>=1))" - line 152, "pan.___", state 686, "(1)" - line 152, "pan.___", state 687, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 687, "else" - line 186, "pan.___", state 692, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 186, "pan.___", state 692, "else" - line 144, "pan.___", state 698, "(1)" - line 148, "pan.___", state 706, "(1)" - line 148, "pan.___", state 707, "(!((cache_dirty_urcu_active_readers.bitfield&(1<=1))" - line 152, "pan.___", state 718, "(1)" - line 152, "pan.___", state 719, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 144, "pan.___", state 734, "(1)" - line 148, "pan.___", state 742, "(1)" - line 148, "pan.___", state 743, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 743, "else" - line 146, "pan.___", state 748, "((j<1))" - line 146, "pan.___", state 748, "((j>=1))" - line 152, "pan.___", state 754, "(1)" - line 152, "pan.___", state 755, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 755, "else" - line 186, "pan.___", state 760, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 186, "pan.___", state 760, "else" - line 289, "pan.___", state 770, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 802, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 815, "(1)" - line 308, "pan.___", state 845, "(1)" - line 289, "pan.___", state 866, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 882, "(1)" - line 298, "pan.___", state 898, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 911, "(1)" - line 308, "pan.___", state 941, "(1)" - line 434, "pan.___", state 954, "-end-" - (79 of 954 states) -unreached in proctype urcu_writer - line 289, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 289, "pan.___", state 20, "(1)" - line 293, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 34, "(1)" - line 293, "pan.___", state 35, "(1)" - line 293, "pan.___", state 35, "(1)" - line 291, "pan.___", state 40, "((i<1))" - line 291, "pan.___", state 40, "((i>=1))" - line 298, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 59, "(1)" - line 299, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 299, "pan.___", state 60, "else" - line 299, "pan.___", state 63, "(1)" - line 299, "pan.___", state 64, "(1)" - line 299, "pan.___", state 64, "(1)" - line 303, "pan.___", state 72, "(1)" - line 303, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 303, "pan.___", state 73, "else" - line 303, "pan.___", state 76, "(1)" - line 303, "pan.___", state 77, "(1)" - line 303, "pan.___", state 77, "(1)" - line 301, "pan.___", state 82, "((i<1))" - line 301, "pan.___", state 82, "((i>=1))" - line 308, "pan.___", state 89, "(1)" - line 308, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 308, "pan.___", state 90, "else" - line 308, "pan.___", state 93, "(1)" - line 308, "pan.___", state 94, "(1)" - line 308, "pan.___", state 94, "(1)" - line 310, "pan.___", state 97, "(1)" - line 310, "pan.___", state 97, "(1)" - line 456, "pan.___", state 101, "cached_generation_ptr.val[_pid] = (old_gen+1)" - line 454, "pan.___", state 102, "old_gen = cached_generation_ptr.val[_pid]" - line 289, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 289, "pan.___", state 112, "(1)" - line 293, "pan.___", state 120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 126, "(1)" - line 293, "pan.___", state 127, "(1)" - line 293, "pan.___", state 127, "(1)" - line 291, "pan.___", state 132, "((i<1))" - line 291, "pan.___", state 132, "((i>=1))" - line 299, "pan.___", state 151, "(1)" - line 299, "pan.___", state 152, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 299, "pan.___", state 152, "else" - line 299, "pan.___", state 155, "(1)" - line 299, "pan.___", state 156, "(1)" - line 299, "pan.___", state 156, "(1)" - line 303, "pan.___", state 164, "(1)" - line 303, "pan.___", state 165, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 303, "pan.___", state 165, "else" - line 303, "pan.___", state 168, "(1)" - line 303, "pan.___", state 169, "(1)" - line 303, "pan.___", state 169, "(1)" - line 301, "pan.___", state 174, "((i<1))" - line 301, "pan.___", state 174, "((i>=1))" - line 308, "pan.___", state 181, "(1)" - line 308, "pan.___", state 182, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 308, "pan.___", state 182, "else" - line 308, "pan.___", state 185, "(1)" - line 308, "pan.___", state 186, "(1)" - line 308, "pan.___", state 186, "(1)" - line 310, "pan.___", state 189, "(1)" - line 310, "pan.___", state 189, "(1)" - line 468, "pan.___", state 195, "(1)" - line 462, "pan.___", state 198, "((write_lock==0))" - line 462, "pan.___", state 198, "else" - line 460, "pan.___", state 199, "(1)" - line 144, "pan.___", state 206, "(1)" - line 148, "pan.___", state 214, "(1)" - line 148, "pan.___", state 215, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 215, "else" - line 146, "pan.___", state 220, "((j<1))" - line 146, "pan.___", state 220, "((j>=1))" - line 152, "pan.___", state 226, "(1)" - line 152, "pan.___", state 227, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 227, "else" - line 186, "pan.___", state 232, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 186, "pan.___", state 232, "else" - line 144, "pan.___", state 238, "(1)" - line 152, "pan.___", state 258, "(1)" - line 144, "pan.___", state 274, "(1)" - line 148, "pan.___", state 282, "(1)" - line 152, "pan.___", state 294, "(1)" - line 289, "pan.___", state 310, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 324, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 342, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 355, "(1)" - line 303, "pan.___", state 368, "(1)" - line 308, "pan.___", state 385, "(1)" - line 289, "pan.___", state 402, "(1)" - line 293, "pan.___", state 414, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 432, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 458, "(1)" - line 308, "pan.___", state 475, "(1)" - line 293, "pan.___", state 505, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 523, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 549, "(1)" - line 308, "pan.___", state 566, "(1)" - line 148, "pan.___", state 588, "(1)" - line 152, "pan.___", state 600, "(1)" - line 144, "pan.___", state 612, "(1)" - line 152, "pan.___", state 632, "(1)" - line 148, "pan.___", state 656, "(1)" - line 152, "pan.___", state 668, "(1)" - line 289, "pan.___", state 692, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 289, "pan.___", state 694, "(1)" - line 289, "pan.___", state 695, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 289, "pan.___", state 695, "else" - line 289, "pan.___", state 698, "(1)" - line 293, "pan.___", state 706, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 708, "(1)" - line 293, "pan.___", state 709, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 293, "pan.___", state 709, "else" - line 293, "pan.___", state 712, "(1)" - line 293, "pan.___", state 713, "(1)" - line 293, "pan.___", state 713, "(1)" - line 291, "pan.___", state 718, "((i<1))" - line 291, "pan.___", state 718, "((i>=1))" - line 298, "pan.___", state 724, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 737, "(1)" - line 299, "pan.___", state 738, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 299, "pan.___", state 738, "else" - line 299, "pan.___", state 741, "(1)" - line 299, "pan.___", state 742, "(1)" - line 299, "pan.___", state 742, "(1)" - line 303, "pan.___", state 750, "(1)" - line 303, "pan.___", state 751, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 303, "pan.___", state 751, "else" - line 303, "pan.___", state 754, "(1)" - line 303, "pan.___", state 755, "(1)" - line 303, "pan.___", state 755, "(1)" - line 301, "pan.___", state 760, "((i<1))" - line 301, "pan.___", state 760, "((i>=1))" - line 308, "pan.___", state 767, "(1)" - line 308, "pan.___", state 768, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 308, "pan.___", state 768, "else" - line 308, "pan.___", state 771, "(1)" - line 308, "pan.___", state 772, "(1)" - line 308, "pan.___", state 772, "(1)" - line 310, "pan.___", state 775, "(1)" - line 310, "pan.___", state 775, "(1)" - line 293, "pan.___", state 804, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 822, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 848, "(1)" - line 308, "pan.___", state 865, "(1)" - line 293, "pan.___", state 892, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 936, "(1)" - line 308, "pan.___", state 953, "(1)" - line 289, "pan.___", state 970, "(1)" - line 293, "pan.___", state 982, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1000, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 1026, "(1)" - line 308, "pan.___", state 1043, "(1)" - line 293, "pan.___", state 1073, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1091, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 303, "pan.___", state 1117, "(1)" - line 308, "pan.___", state 1134, "(1)" - line 148, "pan.___", state 1156, "(1)" - line 152, "pan.___", state 1168, "(1)" - line 144, "pan.___", state 1180, "(1)" - line 152, "pan.___", state 1200, "(1)" - line 148, "pan.___", state 1224, "(1)" - line 152, "pan.___", state 1236, "(1)" - line 289, "pan.___", state 1260, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 289, "pan.___", state 1262, "(1)" - line 289, "pan.___", state 1263, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 289, "pan.___", state 1263, "else" - line 289, "pan.___", state 1266, "(1)" - line 293, "pan.___", state 1274, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 1276, "(1)" - line 293, "pan.___", state 1277, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 293, "pan.___", state 1277, "else" - line 293, "pan.___", state 1280, "(1)" - line 293, "pan.___", state 1281, "(1)" - line 293, "pan.___", state 1281, "(1)" - line 291, "pan.___", state 1286, "((i<1))" - line 291, "pan.___", state 1286, "((i>=1))" - line 298, "pan.___", state 1292, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 1305, "(1)" - line 299, "pan.___", state 1306, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 299, "pan.___", state 1306, "else" - line 299, "pan.___", state 1309, "(1)" - line 299, "pan.___", state 1310, "(1)" - line 299, "pan.___", state 1310, "(1)" - line 303, "pan.___", state 1318, "(1)" - line 303, "pan.___", state 1319, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 303, "pan.___", state 1319, "else" - line 303, "pan.___", state 1322, "(1)" - line 303, "pan.___", state 1323, "(1)" - line 303, "pan.___", state 1323, "(1)" - line 301, "pan.___", state 1328, "((i<1))" - line 301, "pan.___", state 1328, "((i>=1))" - line 308, "pan.___", state 1335, "(1)" - line 308, "pan.___", state 1336, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 308, "pan.___", state 1336, "else" - line 308, "pan.___", state 1339, "(1)" - line 308, "pan.___", state 1340, "(1)" - line 308, "pan.___", state 1340, "(1)" - line 310, "pan.___", state 1343, "(1)" - line 310, "pan.___", state 1343, "(1)" - line 148, "pan.___", state 1367, "(1)" - line 152, "pan.___", state 1379, "(1)" - line 144, "pan.___", state 1391, "(1)" - line 152, "pan.___", state 1411, "(1)" - line 148, "pan.___", state 1435, "(1)" - line 152, "pan.___", state 1447, "(1)" - line 511, "pan.___", state 1473, "-end-" - (159 of 1473 states) -unreached in proctype :init: - line 518, "pan.___", state 9, "((j<2))" - line 518, "pan.___", state 9, "((j>=2))" - line 519, "pan.___", state 20, "((j<2))" - line 519, "pan.___", state 20, "((j>=2))" - line 524, "pan.___", state 33, "((j<2))" - line 524, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 572, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 10.4 seconds -pan: rate 36378.399 states/second -pan: avg transition delay 1.8293e-06 usec -cp .input.spin urcu_free_no_wmb.spin.input -cp .input.spin.trail urcu_free_no_wmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input deleted file mode 100644 index 12cde50..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input +++ /dev/null @@ -1,532 +0,0 @@ -#define NO_WMB - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - - -#if (NR_READERS == 1) - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#elif (NR_READERS == 2) - -#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) -#define read_free (free_done && (data_access[0] || data_access[1])) - -#else - -#error "Too many readers" - -#endif - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - atomic { - if - :: get_readerid() == 0 -> -progress_reader: - skip; - :: else -> - skip; - fi; - } -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input.trail deleted file mode 100644 index ec82525..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_no_wmb.spin.input.trail +++ /dev/null @@ -1,1892 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2475 -2:3:2427 -3:3:2430 -4:3:2430 -5:3:2433 -6:3:2441 -7:3:2441 -8:3:2444 -9:3:2450 -10:3:2454 -11:3:2454 -12:3:2457 -13:3:2465 -14:3:2469 -15:3:2470 -16:0:2475 -17:3:2472 -18:0:2475 -19:2:956 -20:0:2475 -21:2:962 -22:0:2475 -23:2:963 -24:0:2475 -25:2:964 -26:2:968 -27:2:969 -28:2:977 -29:2:978 -30:2:982 -31:2:983 -32:2:991 -33:2:996 -34:2:1000 -35:2:1001 -36:2:1008 -37:2:1009 -38:2:1020 -39:2:1021 -40:2:1022 -41:2:1033 -42:2:1038 -43:2:1039 -44:0:2475 -45:2:1051 -46:2:1052 -47:0:2475 -48:2:1056 -49:2:1060 -50:2:1061 -51:2:1069 -52:2:1070 -53:2:1074 -54:2:1075 -55:2:1083 -56:2:1088 -57:2:1089 -58:2:1100 -59:2:1101 -60:2:1112 -61:2:1113 -62:2:1114 -63:2:1125 -64:2:1130 -65:2:1131 -66:0:2475 -67:2:1143 -68:0:2475 -69:2:1144 -70:0:2475 -71:2:1154 -72:0:2475 -73:2:1155 -74:0:2475 -75:2:1156 -76:2:1163 -77:2:1164 -78:2:1171 -79:2:1176 -80:0:2475 -81:2:1187 -82:0:2475 -83:2:1188 -84:2:1195 -85:2:1196 -86:2:1203 -87:2:1208 -88:0:2475 -89:2:1219 -90:0:2475 -91:2:1224 -92:2:1231 -93:2:1232 -94:2:1239 -95:2:1244 -96:0:2475 -97:2:1259 -98:0:2475 -99:2:1260 -100:2:1264 -101:2:1265 -102:2:1273 -103:2:1274 -104:2:1278 -105:2:1279 -106:2:1287 -107:2:1292 -108:2:1296 -109:2:1297 -110:2:1304 -111:2:1305 -112:2:1316 -113:2:1317 -114:2:1318 -115:2:1329 -116:2:1334 -117:2:1335 -118:0:2475 -119:2:1347 -120:0:2475 -121:2:1350 -122:2:1351 -123:2:1363 -124:2:1364 -125:2:1368 -126:2:1369 -127:2:1377 -128:2:1382 -129:2:1386 -130:2:1387 -131:2:1394 -132:2:1395 -133:2:1406 -134:2:1407 -135:2:1408 -136:2:1419 -137:2:1424 -138:2:1425 -139:0:2475 -140:2:1437 -141:0:2475 -142:2:1438 -143:0:2475 -144:2:1439 -145:0:2475 -146:2:1440 -147:0:2475 -148:2:1441 -149:2:1445 -150:2:1446 -151:2:1454 -152:2:1455 -153:2:1459 -154:2:1460 -155:2:1468 -156:2:1473 -157:2:1477 -158:2:1478 -159:2:1485 -160:2:1486 -161:2:1497 -162:2:1498 -163:2:1499 -164:2:1510 -165:2:1515 -166:2:1516 -167:0:2475 -168:2:1633 -169:0:2475 -170:2:1729 -171:0:2475 -172:2:1730 -173:0:2475 -174:2:1734 -175:0:2475 -176:2:1740 -177:2:1744 -178:2:1745 -179:2:1753 -180:2:1754 -181:2:1758 -182:2:1759 -183:2:1767 -184:2:1772 -185:2:1776 -186:2:1777 -187:2:1784 -188:2:1785 -189:2:1796 -190:2:1797 -191:2:1798 -192:2:1809 -193:2:1814 -194:2:1815 -195:0:2475 -196:2:1827 -197:0:2475 -198:2:1828 -199:2:1832 -200:2:1833 -201:2:1841 -202:2:1842 -203:2:1846 -204:2:1847 -205:2:1855 -206:2:1860 -207:2:1864 -208:2:1865 -209:2:1872 -210:2:1873 -211:2:1884 -212:2:1885 -213:2:1886 -214:2:1897 -215:2:1902 -216:2:1903 -217:0:2475 -218:2:1915 -219:0:2475 -220:2:1918 -221:2:1919 -222:2:1931 -223:2:1932 -224:2:1936 -225:2:1937 -226:2:1945 -227:2:1950 -228:2:1954 -229:2:1955 -230:2:1962 -231:2:1963 -232:2:1974 -233:2:1975 -234:2:1976 -235:2:1987 -236:2:1992 -237:2:1993 -238:0:2475 -239:2:2005 -240:0:2475 -241:2:2006 -242:0:2475 -243:2:2007 -244:0:2475 -245:2:2008 -246:0:2475 -247:2:2009 -248:2:2013 -249:2:2014 -250:2:2022 -251:2:2023 -252:2:2027 -253:2:2028 -254:2:2036 -255:2:2041 -256:2:2045 -257:2:2046 -258:2:2053 -259:2:2054 -260:2:2065 -261:2:2066 -262:2:2067 -263:2:2078 -264:2:2083 -265:2:2084 -266:0:2475 -267:2:2201 -268:0:2475 -269:2:2297 -270:0:2475 -271:2:2298 -272:0:2475 -273:2:2302 -274:0:2475 -275:2:2308 -276:0:2475 -277:2:2309 -278:2:2316 -279:2:2317 -280:2:2324 -281:2:2329 -282:0:2475 -283:2:2340 -284:0:2475 -285:2:2341 -286:2:2348 -287:2:2349 -288:2:2356 -289:2:2361 -290:0:2475 -291:2:2372 -292:0:2475 -293:2:2377 -294:2:2384 -295:2:2385 -296:2:2392 -297:2:2397 -298:0:2475 -299:2:2412 -300:0:2475 -301:2:2413 -302:0:2475 -303:2:963 -304:0:2475 -305:2:964 -306:2:968 -307:2:969 -308:2:977 -309:2:978 -310:2:982 -311:2:983 -312:2:991 -313:2:996 -314:2:1000 -315:2:1001 -316:2:1008 -317:2:1009 -318:2:1020 -319:2:1021 -320:2:1022 -321:2:1033 -322:2:1038 -323:2:1039 -324:0:2475 -325:2:1051 -326:2:1052 -327:0:2475 -328:2:1056 -329:2:1060 -330:2:1061 -331:2:1069 -332:2:1070 -333:2:1074 -334:2:1075 -335:2:1083 -336:2:1088 -337:2:1089 -338:2:1100 -339:2:1101 -340:2:1112 -341:2:1113 -342:2:1114 -343:2:1125 -344:2:1130 -345:2:1131 -346:0:2475 -347:2:1143 -348:0:2475 -349:2:1144 -350:0:2475 -351:2:1154 -352:0:2475 -353:2:1155 -354:0:2475 -355:2:1156 -356:2:1163 -357:2:1164 -358:2:1171 -359:2:1176 -360:0:2475 -361:2:1187 -362:0:2475 -363:2:1188 -364:2:1195 -365:2:1196 -366:2:1203 -367:2:1208 -368:0:2475 -369:2:1219 -370:0:2475 -371:2:1224 -372:2:1231 -373:2:1232 -374:2:1239 -375:2:1244 -376:0:2475 -377:2:1259 -378:0:2475 -379:2:1260 -380:2:1264 -381:2:1265 -382:2:1273 -383:2:1274 -384:2:1278 -385:2:1279 -386:2:1287 -387:2:1292 -388:2:1296 -389:2:1297 -390:2:1304 -391:2:1305 -392:2:1316 -393:2:1317 -394:2:1318 -395:2:1329 -396:2:1334 -397:2:1335 -398:0:2475 -399:2:1347 -400:0:2475 -401:2:1350 -402:2:1351 -403:2:1363 -404:2:1364 -405:2:1368 -406:2:1369 -407:2:1377 -408:2:1382 -409:2:1386 -410:2:1387 -411:2:1394 -412:2:1395 -413:2:1406 -414:2:1407 -415:2:1408 -416:2:1419 -417:2:1424 -418:2:1425 -419:0:2475 -420:2:1437 -421:0:2475 -422:2:1438 -423:0:2475 -424:2:1439 -425:0:2475 -426:2:1440 -427:0:2475 -428:2:1441 -429:2:1445 -430:2:1446 -431:2:1454 -432:2:1455 -433:2:1459 -434:2:1460 -435:2:1468 -436:2:1473 -437:2:1477 -438:2:1478 -439:2:1485 -440:2:1486 -441:2:1497 -442:2:1498 -443:2:1499 -444:2:1510 -445:2:1515 -446:2:1516 -447:0:2475 -448:2:1633 -449:0:2475 -450:2:1729 -451:0:2475 -452:2:1730 -453:0:2475 -454:2:1734 -455:0:2475 -456:2:1740 -457:2:1744 -458:2:1745 -459:2:1753 -460:2:1754 -461:2:1758 -462:2:1759 -463:2:1767 -464:2:1772 -465:2:1776 -466:2:1777 -467:2:1784 -468:2:1785 -469:2:1796 -470:2:1797 -471:2:1798 -472:2:1809 -473:2:1814 -474:2:1815 -475:0:2475 -476:2:1827 -477:0:2475 -478:2:1828 -479:2:1832 -480:2:1833 -481:2:1841 -482:2:1842 -483:2:1846 -484:2:1847 -485:2:1855 -486:2:1860 -487:2:1864 -488:2:1865 -489:2:1872 -490:2:1873 -491:2:1884 -492:2:1885 -493:2:1886 -494:2:1897 -495:2:1902 -496:2:1903 -497:0:2475 -498:2:1915 -499:0:2475 -500:2:1918 -501:2:1919 -502:2:1931 -503:2:1932 -504:2:1936 -505:2:1937 -506:2:1945 -507:2:1950 -508:2:1954 -509:2:1955 -510:2:1962 -511:2:1963 -512:2:1974 -513:2:1975 -514:2:1976 -515:2:1987 -516:2:1992 -517:2:1993 -518:0:2475 -519:2:2005 -520:0:2475 -521:2:2006 -522:0:2475 -523:2:2007 -524:0:2475 -525:2:2008 -526:0:2475 -527:2:2009 -528:2:2013 -529:2:2014 -530:2:2022 -531:2:2023 -532:2:2027 -533:2:2028 -534:2:2036 -535:2:2041 -536:2:2045 -537:2:2046 -538:2:2053 -539:2:2054 -540:2:2065 -541:2:2066 -542:2:2067 -543:2:2078 -544:2:2083 -545:2:2084 -546:0:2475 -547:2:2201 -548:0:2475 -549:2:2297 -550:0:2475 -551:2:2298 -552:0:2475 -553:2:2302 -554:0:2475 -555:2:2308 -556:0:2475 -557:2:2309 -558:2:2316 -559:2:2317 -560:2:2324 -561:2:2329 -562:0:2475 -563:2:2340 -564:0:2475 -565:2:2341 -566:2:2348 -567:2:2349 -568:2:2356 -569:2:2361 -570:0:2475 -571:2:2372 -572:0:2475 -573:2:2377 -574:2:2384 -575:2:2385 -576:2:2392 -577:2:2397 -578:0:2475 -579:2:2412 -580:0:2475 -581:2:2413 -582:0:2475 -583:2:963 -584:0:2475 -585:2:964 -586:2:968 -587:2:969 -588:2:977 -589:2:978 -590:2:982 -591:2:983 -592:2:991 -593:2:996 -594:2:1000 -595:2:1001 -596:2:1008 -597:2:1009 -598:2:1020 -599:2:1021 -600:2:1022 -601:2:1033 -602:2:1038 -603:2:1039 -604:0:2475 -605:2:1051 -606:2:1052 -607:0:2475 -608:2:1056 -609:2:1060 -610:2:1061 -611:2:1069 -612:2:1070 -613:2:1074 -614:2:1075 -615:2:1083 -616:2:1088 -617:2:1089 -618:2:1100 -619:2:1101 -620:2:1112 -621:2:1113 -622:2:1114 -623:2:1125 -624:2:1130 -625:2:1131 -626:0:2475 -627:2:1143 -628:0:2475 -629:2:1144 -630:0:2475 -631:2:1154 -632:0:2475 -633:2:1155 -634:0:2475 -635:2:1156 -636:2:1163 -637:2:1164 -638:2:1171 -639:2:1176 -640:0:2475 -641:2:1187 -642:0:2475 -643:2:1188 -644:2:1195 -645:2:1196 -646:2:1203 -647:2:1208 -648:0:2475 -649:2:1219 -650:0:2475 -651:2:1224 -652:2:1231 -653:2:1232 -654:2:1239 -655:2:1244 -656:0:2475 -657:2:1259 -658:0:2475 -659:2:1260 -660:2:1264 -661:2:1265 -662:2:1273 -663:2:1274 -664:2:1278 -665:2:1279 -666:2:1287 -667:2:1292 -668:2:1296 -669:2:1297 -670:2:1304 -671:2:1305 -672:2:1316 -673:2:1317 -674:2:1318 -675:2:1329 -676:2:1334 -677:2:1335 -678:0:2475 -679:2:1347 -680:0:2475 -681:2:1350 -682:2:1351 -683:2:1363 -684:2:1364 -685:2:1368 -686:2:1369 -687:2:1377 -688:2:1382 -689:2:1386 -690:2:1387 -691:2:1394 -692:2:1395 -693:2:1406 -694:2:1407 -695:2:1408 -696:2:1419 -697:2:1424 -698:2:1425 -699:0:2475 -700:2:1437 -701:0:2475 -702:2:1438 -703:0:2475 -704:2:1439 -705:0:2475 -706:2:1440 -707:0:2475 -708:2:1441 -709:2:1445 -710:2:1446 -711:2:1454 -712:2:1455 -713:2:1459 -714:2:1460 -715:2:1468 -716:2:1473 -717:2:1477 -718:2:1478 -719:2:1485 -720:2:1486 -721:2:1497 -722:2:1498 -723:2:1499 -724:2:1510 -725:2:1515 -726:2:1516 -727:0:2475 -728:2:1633 -729:0:2475 -730:2:1729 -731:0:2475 -732:2:1730 -733:0:2475 -734:2:1734 -735:0:2475 -736:2:1740 -737:2:1744 -738:2:1745 -739:2:1753 -740:2:1754 -741:2:1758 -742:2:1759 -743:2:1767 -744:2:1772 -745:2:1776 -746:2:1777 -747:2:1784 -748:2:1785 -749:2:1796 -750:2:1797 -751:2:1798 -752:2:1809 -753:2:1814 -754:2:1815 -755:0:2475 -756:2:1827 -757:0:2475 -758:2:1828 -759:2:1832 -760:2:1833 -761:2:1841 -762:2:1842 -763:2:1846 -764:2:1847 -765:2:1855 -766:2:1860 -767:2:1864 -768:2:1865 -769:2:1872 -770:2:1873 -771:2:1884 -772:2:1885 -773:2:1886 -774:2:1897 -775:2:1902 -776:2:1903 -777:0:2475 -778:2:1915 -779:0:2475 -780:2:1918 -781:2:1919 -782:2:1931 -783:2:1932 -784:2:1936 -785:2:1937 -786:2:1945 -787:2:1950 -788:2:1954 -789:2:1955 -790:2:1962 -791:2:1963 -792:2:1974 -793:2:1975 -794:2:1976 -795:2:1987 -796:2:1992 -797:2:1993 -798:0:2475 -799:2:2005 -800:0:2475 -801:2:2006 -802:0:2475 -803:2:2007 -804:0:2475 -805:2:2008 -806:0:2475 -807:2:2009 -808:2:2013 -809:2:2014 -810:2:2022 -811:2:2023 -812:2:2027 -813:2:2028 -814:2:2036 -815:2:2041 -816:2:2045 -817:2:2046 -818:2:2053 -819:2:2054 -820:2:2065 -821:2:2066 -822:2:2067 -823:2:2078 -824:2:2083 -825:2:2084 -826:0:2475 -827:2:2201 -828:0:2475 -829:2:2297 -830:0:2475 -831:2:2298 -832:0:2475 -833:2:2302 -834:0:2475 -835:2:2308 -836:0:2475 -837:2:2309 -838:2:2316 -839:2:2317 -840:2:2324 -841:2:2329 -842:0:2475 -843:2:2340 -844:0:2475 -845:2:2341 -846:2:2348 -847:2:2349 -848:2:2356 -849:2:2361 -850:0:2475 -851:2:2372 -852:0:2475 -853:2:2377 -854:2:2384 -855:2:2385 -856:2:2392 -857:2:2397 -858:0:2475 -859:2:2412 -860:0:2475 -861:2:2413 -862:0:2475 -863:2:963 -864:0:2475 -865:2:964 -866:2:968 -867:2:969 -868:2:977 -869:2:978 -870:2:982 -871:2:983 -872:2:991 -873:2:996 -874:2:1000 -875:2:1001 -876:2:1008 -877:2:1009 -878:2:1020 -879:2:1021 -880:2:1022 -881:2:1033 -882:2:1038 -883:2:1039 -884:0:2475 -885:2:1051 -886:2:1052 -887:0:2475 -888:2:1056 -889:2:1060 -890:2:1061 -891:2:1069 -892:2:1070 -893:2:1074 -894:2:1075 -895:2:1083 -896:2:1088 -897:2:1089 -898:2:1100 -899:2:1101 -900:2:1112 -901:2:1113 -902:2:1114 -903:2:1125 -904:2:1130 -905:2:1131 -906:0:2475 -907:2:1143 -908:0:2475 -909:2:1144 -910:0:2475 -911:2:1154 -912:0:2475 -913:2:1155 -914:0:2475 -915:2:1156 -916:2:1163 -917:2:1164 -918:2:1171 -919:2:1176 -920:0:2475 -921:2:1187 -922:0:2475 -923:2:1188 -924:2:1195 -925:2:1196 -926:2:1203 -927:2:1208 -928:0:2475 -929:2:1219 -930:0:2475 -931:2:1224 -932:2:1231 -933:2:1232 -934:2:1239 -935:2:1244 -936:0:2475 -937:2:1259 -938:0:2475 -939:2:1260 -940:2:1264 -941:2:1265 -942:2:1273 -943:2:1274 -944:2:1278 -945:2:1279 -946:2:1287 -947:2:1292 -948:2:1296 -949:2:1297 -950:2:1304 -951:2:1305 -952:2:1316 -953:2:1317 -954:2:1318 -955:2:1329 -956:2:1334 -957:2:1335 -958:0:2475 -959:2:1347 -960:0:2475 -961:2:1350 -962:2:1351 -963:2:1363 -964:2:1364 -965:2:1368 -966:2:1369 -967:2:1377 -968:2:1382 -969:2:1386 -970:2:1387 -971:2:1394 -972:2:1395 -973:2:1406 -974:2:1407 -975:2:1408 -976:2:1419 -977:2:1424 -978:2:1425 -979:0:2475 -980:2:1437 -981:0:2475 -982:2:1438 -983:0:2475 -984:2:1439 -985:0:2475 -986:2:1440 -987:0:2475 -988:2:1441 -989:2:1445 -990:2:1446 -991:2:1454 -992:2:1455 -993:2:1459 -994:2:1460 -995:2:1468 -996:2:1473 -997:2:1477 -998:2:1478 -999:2:1485 -1000:2:1486 -1001:2:1497 -1002:2:1498 -1003:2:1499 -1004:2:1510 -1005:2:1515 -1006:2:1516 -1007:0:2475 -1008:2:1633 -1009:0:2475 -1010:2:1729 -1011:0:2475 -1012:2:1730 -1013:0:2475 -1014:2:1734 -1015:0:2475 -1016:2:1740 -1017:2:1744 -1018:2:1745 -1019:2:1753 -1020:2:1754 -1021:2:1758 -1022:2:1759 -1023:2:1767 -1024:2:1772 -1025:2:1776 -1026:2:1777 -1027:2:1784 -1028:2:1785 -1029:2:1796 -1030:2:1797 -1031:2:1798 -1032:2:1809 -1033:2:1814 -1034:2:1815 -1035:0:2475 -1036:2:1827 -1037:0:2475 -1038:2:1828 -1039:2:1832 -1040:2:1833 -1041:2:1841 -1042:2:1842 -1043:2:1846 -1044:2:1847 -1045:2:1855 -1046:2:1860 -1047:2:1864 -1048:2:1865 -1049:2:1872 -1050:2:1873 -1051:2:1884 -1052:2:1885 -1053:2:1886 -1054:2:1897 -1055:2:1902 -1056:2:1903 -1057:0:2475 -1058:2:1915 -1059:0:2475 -1060:2:1918 -1061:2:1919 -1062:2:1931 -1063:2:1932 -1064:2:1936 -1065:2:1937 -1066:2:1945 -1067:2:1950 -1068:2:1954 -1069:2:1955 -1070:2:1962 -1071:2:1963 -1072:2:1974 -1073:2:1975 -1074:2:1976 -1075:2:1987 -1076:2:1992 -1077:2:1993 -1078:0:2475 -1079:2:2005 -1080:0:2475 -1081:2:2006 -1082:0:2475 -1083:2:2007 -1084:0:2475 -1085:2:2008 -1086:0:2475 -1087:2:2009 -1088:2:2013 -1089:2:2014 -1090:2:2022 -1091:2:2023 -1092:2:2027 -1093:2:2028 -1094:2:2036 -1095:2:2041 -1096:2:2045 -1097:2:2046 -1098:2:2053 -1099:2:2054 -1100:2:2065 -1101:2:2066 -1102:2:2067 -1103:2:2078 -1104:2:2083 -1105:2:2084 -1106:0:2475 -1107:2:2201 -1108:0:2475 -1109:2:2297 -1110:0:2475 -1111:2:2298 -1112:0:2475 -1113:2:2302 -1114:0:2475 -1115:2:2308 -1116:0:2475 -1117:2:2309 -1118:2:2316 -1119:2:2317 -1120:2:2324 -1121:2:2329 -1122:0:2475 -1123:2:2340 -1124:0:2475 -1125:2:2341 -1126:2:2348 -1127:2:2349 -1128:2:2356 -1129:2:2361 -1130:0:2475 -1131:2:2372 -1132:0:2475 -1133:2:2377 -1134:2:2384 -1135:2:2385 -1136:2:2392 -1137:2:2397 -1138:0:2475 -1139:2:2412 -1140:0:2475 -1141:2:2413 -1142:0:2475 -1143:2:963 -1144:0:2475 -1145:2:964 -1146:2:968 -1147:2:969 -1148:2:977 -1149:2:978 -1150:2:982 -1151:2:983 -1152:2:991 -1153:2:996 -1154:2:1000 -1155:2:1001 -1156:2:1008 -1157:2:1009 -1158:2:1020 -1159:2:1021 -1160:2:1022 -1161:2:1033 -1162:2:1038 -1163:2:1039 -1164:0:2475 -1165:2:1051 -1166:2:1052 -1167:0:2475 -1168:2:1056 -1169:2:1060 -1170:2:1061 -1171:2:1069 -1172:2:1070 -1173:2:1074 -1174:2:1075 -1175:2:1083 -1176:2:1088 -1177:2:1089 -1178:2:1100 -1179:2:1101 -1180:2:1112 -1181:2:1113 -1182:2:1114 -1183:2:1125 -1184:2:1130 -1185:2:1131 -1186:0:2475 -1187:2:1143 -1188:0:2475 -1189:2:1144 -1190:0:2475 -1191:2:1154 -1192:0:2475 -1193:2:1155 -1194:0:2475 -1195:2:1156 -1196:2:1163 -1197:2:1164 -1198:2:1171 -1199:2:1176 -1200:0:2475 -1201:2:1187 -1202:0:2475 -1203:1:2 -1204:0:2475 -1205:1:8 -1206:0:2475 -1207:1:9 -1208:0:2475 -1209:1:10 -1210:0:2475 -1211:1:11 -1212:0:2475 -1213:1:12 -1214:1:16 -1215:1:17 -1216:1:25 -1217:1:26 -1218:1:30 -1219:1:31 -1220:1:39 -1221:1:44 -1222:1:48 -1223:1:49 -1224:1:56 -1225:1:57 -1226:1:68 -1227:1:69 -1228:1:70 -1229:1:81 -1230:1:93 -1231:1:94 -1232:0:2475 -1233:1:99 -1234:0:2475 -1235:1:100 -1236:1:104 -1237:1:105 -1238:1:113 -1239:1:114 -1240:1:118 -1241:1:119 -1242:1:127 -1243:1:132 -1244:1:136 -1245:1:137 -1246:1:144 -1247:1:145 -1248:1:156 -1249:1:157 -1250:1:158 -1251:1:169 -1252:1:181 -1253:1:182 -1254:0:2475 -1255:1:187 -1256:0:2475 -1257:1:188 -1258:0:2475 -1259:1:189 -1260:1:193 -1261:1:194 -1262:1:202 -1263:1:203 -1264:1:207 -1265:1:208 -1266:1:216 -1267:1:221 -1268:1:225 -1269:1:226 -1270:1:233 -1271:1:234 -1272:1:245 -1273:1:246 -1274:1:247 -1275:1:258 -1276:1:270 -1277:1:271 -1278:0:2475 -1279:1:276 -1280:0:2475 -1281:1:384 -1282:0:2475 -1283:1:385 -1284:0:2475 -1285:1:11 -1286:0:2475 -1287:1:12 -1288:1:16 -1289:1:17 -1290:1:25 -1291:1:26 -1292:1:27 -1293:1:39 -1294:1:44 -1295:1:48 -1296:1:49 -1297:1:56 -1298:1:57 -1299:1:68 -1300:1:69 -1301:1:70 -1302:1:81 -1303:1:93 -1304:1:94 -1305:0:2475 -1306:1:99 -1307:0:2475 -1308:1:100 -1309:1:104 -1310:1:105 -1311:1:113 -1312:1:114 -1313:1:118 -1314:1:119 -1315:1:127 -1316:1:132 -1317:1:136 -1318:1:137 -1319:1:144 -1320:1:145 -1321:1:156 -1322:1:157 -1323:1:158 -1324:1:169 -1325:1:181 -1326:1:182 -1327:0:2475 -1328:1:279 -1329:0:2475 -1330:1:280 -1331:0:2475 -1332:1:384 -1333:0:2475 -1334:1:385 -1335:0:2475 -1336:1:390 -1337:0:2475 -1338:1:395 -1339:1:399 -1340:1:400 -1341:1:408 -1342:1:409 -1343:1:410 -1344:1:422 -1345:1:427 -1346:1:431 -1347:1:432 -1348:1:439 -1349:1:440 -1350:1:451 -1351:1:452 -1352:1:453 -1353:1:464 -1354:1:476 -1355:1:477 -1356:0:2475 -1357:1:482 -1358:0:2475 -1359:1:483 -1360:1:487 -1361:1:488 -1362:1:496 -1363:1:497 -1364:1:501 -1365:1:502 -1366:1:510 -1367:1:515 -1368:1:519 -1369:1:520 -1370:1:527 -1371:1:528 -1372:1:539 -1373:1:540 -1374:1:541 -1375:1:552 -1376:1:564 -1377:1:565 -1378:0:2475 -1379:1:570 -1380:0:2475 -1381:1:571 -1382:1:575 -1383:1:576 -1384:1:584 -1385:1:585 -1386:1:589 -1387:1:590 -1388:1:598 -1389:1:603 -1390:1:607 -1391:1:608 -1392:1:615 -1393:1:616 -1394:1:627 -1395:1:628 -1396:1:629 -1397:1:640 -1398:1:652 -1399:1:653 -1400:0:2475 -1401:1:658 -1402:0:2475 -1403:1:659 -1404:0:2475 -1405:1:660 -1406:0:2475 -1407:1:760 -1408:0:2475 -1409:1:761 -1410:0:2475 -1411:1:765 -1412:0:2475 -1413:1:766 -1414:1:770 -1415:1:771 -1416:1:779 -1417:1:780 -1418:1:784 -1419:1:785 -1420:1:793 -1421:1:798 -1422:1:802 -1423:1:803 -1424:1:810 -1425:1:811 -1426:1:822 -1427:1:823 -1428:1:824 -1429:1:835 -1430:1:847 -1431:1:848 -1432:0:2475 -1433:1:853 -1434:0:2475 -1435:1:660 -1436:0:2475 -1437:1:760 -1438:0:2475 -1439:1:761 -1440:0:2475 -1441:1:765 -1442:0:2475 -1443:1:766 -1444:1:770 -1445:1:771 -1446:1:779 -1447:1:780 -1448:1:781 -1449:1:793 -1450:1:798 -1451:1:802 -1452:1:803 -1453:1:810 -1454:1:811 -1455:1:822 -1456:1:823 -1457:1:824 -1458:1:835 -1459:1:847 -1460:1:848 -1461:0:2475 -1462:1:853 -1463:0:2475 -1464:1:857 -1465:0:2475 -1466:1:862 -1467:1:866 -1468:1:867 -1469:1:875 -1470:1:876 -1471:1:877 -1472:1:889 -1473:1:894 -1474:1:898 -1475:1:899 -1476:1:906 -1477:1:907 -1478:1:918 -1479:1:919 -1480:1:920 -1481:1:931 -1482:1:943 -1483:1:944 -1484:0:2475 -1485:1:9 -1486:0:2475 -1487:1:10 -1488:0:2475 -1489:1:11 -1490:0:2475 -1491:1:12 -1492:1:16 -1493:1:17 -1494:1:25 -1495:1:26 -1496:1:30 -1497:1:31 -1498:1:39 -1499:1:44 -1500:1:48 -1501:1:49 -1502:1:56 -1503:1:57 -1504:1:68 -1505:1:69 -1506:1:70 -1507:1:81 -1508:1:93 -1509:1:94 -1510:0:2475 -1511:1:99 -1512:0:2475 -1513:1:100 -1514:1:104 -1515:1:105 -1516:1:113 -1517:1:114 -1518:1:118 -1519:1:119 -1520:1:127 -1521:1:132 -1522:1:136 -1523:1:137 -1524:1:144 -1525:1:145 -1526:1:156 -1527:1:157 -1528:1:158 -1529:1:169 -1530:1:181 -1531:1:182 -1532:0:2475 -1533:1:187 -1534:0:2475 -1535:1:188 -1536:0:2475 -1537:1:189 -1538:1:193 -1539:1:194 -1540:1:202 -1541:1:203 -1542:1:207 -1543:1:208 -1544:1:216 -1545:1:221 -1546:1:225 -1547:1:226 -1548:1:233 -1549:1:234 -1550:1:245 -1551:1:246 -1552:1:247 -1553:1:258 -1554:1:270 -1555:1:271 -1556:0:2475 -1557:1:276 -1558:0:2475 -1559:1:384 -1560:0:2475 -1561:1:385 -1562:0:2475 -1563:1:11 -1564:0:2475 -1565:1:12 -1566:1:16 -1567:1:17 -1568:1:25 -1569:1:34 -1570:1:35 -1571:1:39 -1572:1:44 -1573:1:48 -1574:1:49 -1575:1:56 -1576:1:57 -1577:1:68 -1578:1:69 -1579:1:72 -1580:1:73 -1581:1:81 -1582:1:93 -1583:1:94 -1584:0:2475 -1585:1:99 -1586:0:2475 -1587:1:100 -1588:1:104 -1589:1:105 -1590:1:113 -1591:1:122 -1592:1:123 -1593:1:127 -1594:1:132 -1595:1:136 -1596:1:137 -1597:1:144 -1598:1:145 -1599:1:156 -1600:1:157 -1601:1:160 -1602:1:161 -1603:1:169 -1604:1:181 -1605:1:182 -1606:0:2475 -1607:1:279 -1608:0:2475 -1609:1:280 -1610:0:2475 -1611:1:384 -1612:0:2475 -1613:1:385 -1614:0:2475 -1615:1:390 -1616:0:2475 -1617:1:395 -1618:1:399 -1619:1:400 -1620:1:408 -1621:1:417 -1622:1:418 -1623:1:422 -1624:1:427 -1625:1:431 -1626:1:432 -1627:1:439 -1628:1:440 -1629:1:451 -1630:1:452 -1631:1:455 -1632:1:456 -1633:1:464 -1634:1:476 -1635:1:477 -1636:0:2475 -1637:1:482 -1638:0:2475 -1639:2:1188 -1640:2:1195 -1641:2:1198 -1642:2:1199 -1643:2:1203 -1644:2:1208 -1645:0:2475 -1646:2:1219 -1647:0:2475 -1648:2:1224 -1649:2:1231 -1650:2:1232 -1651:2:1239 -1652:2:1244 -1653:0:2475 -1654:2:1259 -1655:0:2475 -1656:2:1260 -1657:2:1264 -1658:2:1265 -1659:2:1273 -1660:2:1274 -1661:2:1278 -1662:2:1279 -1663:2:1287 -1664:2:1292 -1665:2:1296 -1666:2:1297 -1667:2:1304 -1668:2:1305 -1669:2:1316 -1670:2:1317 -1671:2:1318 -1672:2:1329 -1673:2:1334 -1674:2:1335 -1675:0:2475 -1676:2:1347 -1677:0:2475 -1678:2:1350 -1679:2:1351 -1680:2:1363 -1681:2:1364 -1682:2:1368 -1683:2:1369 -1684:2:1377 -1685:2:1382 -1686:2:1386 -1687:2:1387 -1688:2:1394 -1689:2:1395 -1690:2:1406 -1691:2:1407 -1692:2:1408 -1693:2:1419 -1694:2:1424 -1695:2:1425 -1696:0:2475 -1697:2:1437 -1698:0:2475 -1699:2:1438 -1700:0:2475 -1701:2:1439 -1702:0:2475 -1703:2:1440 -1704:0:2475 -1705:2:1441 -1706:2:1445 -1707:2:1446 -1708:2:1454 -1709:2:1455 -1710:2:1459 -1711:2:1460 -1712:2:1468 -1713:2:1473 -1714:2:1477 -1715:2:1478 -1716:2:1485 -1717:2:1486 -1718:2:1497 -1719:2:1498 -1720:2:1499 -1721:2:1510 -1722:2:1515 -1723:2:1516 -1724:0:2475 -1725:2:1633 -1726:0:2475 -1727:2:1729 -1728:0:2475 -1729:2:1730 -1730:0:2475 -1731:2:1734 -1732:0:2475 -1733:2:1740 -1734:2:1744 -1735:2:1745 -1736:2:1753 -1737:2:1754 -1738:2:1758 -1739:2:1759 -1740:2:1767 -1741:2:1772 -1742:2:1776 -1743:2:1777 -1744:2:1784 -1745:2:1785 -1746:2:1796 -1747:2:1797 -1748:2:1798 -1749:2:1809 -1750:2:1814 -1751:2:1815 -1752:0:2475 -1753:2:1827 -1754:0:2475 -1755:2:1828 -1756:2:1832 -1757:2:1833 -1758:2:1841 -1759:2:1842 -1760:2:1846 -1761:2:1847 -1762:2:1855 -1763:2:1860 -1764:2:1864 -1765:2:1865 -1766:2:1872 -1767:2:1873 -1768:2:1884 -1769:2:1885 -1770:2:1886 -1771:2:1897 -1772:2:1902 -1773:2:1903 -1774:0:2475 -1775:2:1915 -1776:0:2475 -1777:2:1918 -1778:2:1919 -1779:2:1931 -1780:2:1932 -1781:2:1936 -1782:2:1937 -1783:2:1945 -1784:2:1950 -1785:2:1954 -1786:2:1955 -1787:2:1962 -1788:2:1963 -1789:2:1974 -1790:2:1975 -1791:2:1976 -1792:2:1987 -1793:2:1992 -1794:2:1993 -1795:0:2475 -1796:2:2005 -1797:0:2475 -1798:2:2006 -1799:0:2475 -1800:2:2007 -1801:0:2475 -1802:2:2008 -1803:0:2475 -1804:2:2009 -1805:2:2013 -1806:2:2014 -1807:2:2022 -1808:2:2023 -1809:2:2027 -1810:2:2028 -1811:2:2036 -1812:2:2041 -1813:2:2045 -1814:2:2046 -1815:2:2053 -1816:2:2054 -1817:2:2065 -1818:2:2066 -1819:2:2067 -1820:2:2078 -1821:2:2083 -1822:2:2084 -1823:0:2475 -1824:2:2201 -1825:0:2475 -1826:2:2297 -1827:0:2475 -1828:2:2298 -1829:0:2475 -1830:2:2302 -1831:0:2475 -1832:2:2308 -1833:0:2475 -1834:2:2309 -1835:2:2316 -1836:2:2317 -1837:2:2324 -1838:2:2329 -1839:0:2475 -1840:2:2340 -1841:0:2475 -1842:2:2341 -1843:2:2348 -1844:2:2351 -1845:2:2352 -1846:2:2356 -1847:2:2361 -1848:0:2475 -1849:2:2372 -1850:0:2475 -1851:2:2377 -1852:2:2384 -1853:2:2385 -1854:2:2392 -1855:2:2397 -1856:0:2475 -1857:2:2412 -1858:0:2475 -1859:2:2413 -1860:0:2475 -1861:2:2416 -1862:0:2475 -1863:2:2421 -1864:0:2475 -1865:1:483 -1866:1:487 -1867:1:488 -1868:1:496 -1869:1:497 -1870:1:498 -1871:1:510 -1872:1:515 -1873:1:519 -1874:1:520 -1875:1:527 -1876:1:528 -1877:1:539 -1878:1:540 -1879:1:541 -1880:1:552 -1881:1:557 -1882:1:558 -1883:0:2475 -1884:2:2422 -1885:0:2475 -1886:1:570 -1887:0:2473 -1888:2:2421 -1889:0:2479 -1890:1:151 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.define b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.log deleted file mode 100644 index 6a9d040..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.log +++ /dev/null @@ -1,349 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_single_flip.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 567) -pan: claim violated! (at depth 1353) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 3705, errors: 1 - 216253 states, stored - 2924019 states, matched - 3140272 transitions (= stored+matched) - 11791015 atomic steps -hash conflicts: 155585 (resolved) - -Stats on memory usage (in Megabytes): - 17.324 equivalent memory usage for states (stored*(State-vector + overhead)) - 13.576 actual memory usage for states (compression: 78.37%) - state-vector as stored = 38 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 479.338 total actual memory usage - -unreached in proctype urcu_reader - line 289, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 61, "(1)" - line 308, "pan.___", state 91, "(1)" - line 289, "pan.___", state 104, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 136, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 149, "(1)" - line 308, "pan.___", state 179, "(1)" - line 289, "pan.___", state 193, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 225, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 238, "(1)" - line 308, "pan.___", state 268, "(1)" - line 159, "pan.___", state 289, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 291, "(1)" - line 163, "pan.___", state 298, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 300, "(1)" - line 163, "pan.___", state 301, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 163, "pan.___", state 301, "else" - line 161, "pan.___", state 306, "((j<1))" - line 161, "pan.___", state 306, "((j>=1))" - line 167, "pan.___", state 311, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 144, "pan.___", state 321, "(1)" - line 148, "pan.___", state 329, "(1)" - line 148, "pan.___", state 330, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 330, "else" - line 146, "pan.___", state 335, "((j<1))" - line 146, "pan.___", state 335, "((j>=1))" - line 152, "pan.___", state 341, "(1)" - line 152, "pan.___", state 342, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 342, "else" - line 154, "pan.___", state 345, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 154, "pan.___", state 345, "else" - line 186, "pan.___", state 347, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 186, "pan.___", state 347, "else" - line 159, "pan.___", state 352, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 167, "pan.___", state 374, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 152, "pan.___", state 404, "(1)" - line 152, "pan.___", state 405, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 159, "pan.___", state 419, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 421, "(1)" - line 163, "pan.___", state 428, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 430, "(1)" - line 163, "pan.___", state 431, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 163, "pan.___", state 431, "else" - line 161, "pan.___", state 436, "((j<1))" - line 161, "pan.___", state 436, "((j>=1))" - line 167, "pan.___", state 441, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 144, "pan.___", state 451, "(1)" - line 148, "pan.___", state 459, "(1)" - line 148, "pan.___", state 460, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 460, "else" - line 146, "pan.___", state 465, "((j<1))" - line 146, "pan.___", state 465, "((j>=1))" - line 152, "pan.___", state 471, "(1)" - line 152, "pan.___", state 472, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 472, "else" - line 154, "pan.___", state 475, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 154, "pan.___", state 475, "else" - line 186, "pan.___", state 477, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 186, "pan.___", state 477, "else" - line 289, "pan.___", state 492, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 524, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 537, "(1)" - line 308, "pan.___", state 567, "(1)" - line 289, "pan.___", state 580, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 612, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 625, "(1)" - line 308, "pan.___", state 655, "(1)" - line 289, "pan.___", state 668, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 700, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 713, "(1)" - line 308, "pan.___", state 743, "(1)" - line 159, "pan.___", state 758, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 760, "(1)" - line 163, "pan.___", state 767, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 769, "(1)" - line 163, "pan.___", state 770, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 163, "pan.___", state 770, "else" - line 161, "pan.___", state 775, "((j<1))" - line 161, "pan.___", state 775, "((j>=1))" - line 167, "pan.___", state 780, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 144, "pan.___", state 790, "(1)" - line 148, "pan.___", state 798, "(1)" - line 148, "pan.___", state 799, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 799, "else" - line 146, "pan.___", state 804, "((j<1))" - line 146, "pan.___", state 804, "((j>=1))" - line 152, "pan.___", state 810, "(1)" - line 152, "pan.___", state 811, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 811, "else" - line 154, "pan.___", state 814, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 154, "pan.___", state 814, "else" - line 186, "pan.___", state 816, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 186, "pan.___", state 816, "else" - line 159, "pan.___", state 821, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 167, "pan.___", state 843, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 152, "pan.___", state 873, "(1)" - line 152, "pan.___", state 874, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 159, "pan.___", state 888, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 890, "(1)" - line 163, "pan.___", state 897, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 899, "(1)" - line 163, "pan.___", state 900, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 163, "pan.___", state 900, "else" - line 161, "pan.___", state 905, "((j<1))" - line 161, "pan.___", state 905, "((j>=1))" - line 167, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 144, "pan.___", state 920, "(1)" - line 148, "pan.___", state 928, "(1)" - line 148, "pan.___", state 929, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 148, "pan.___", state 929, "else" - line 146, "pan.___", state 934, "((j<1))" - line 146, "pan.___", state 934, "((j>=1))" - line 152, "pan.___", state 940, "(1)" - line 152, "pan.___", state 941, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 152, "pan.___", state 941, "else" - line 154, "pan.___", state 944, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 154, "pan.___", state 944, "else" - line 186, "pan.___", state 946, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 186, "pan.___", state 946, "else" - line 289, "pan.___", state 956, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 988, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 1001, "(1)" - line 308, "pan.___", state 1031, "(1)" - line 289, "pan.___", state 1052, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 1084, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 1097, "(1)" - line 308, "pan.___", state 1127, "(1)" - line 434, "pan.___", state 1140, "-end-" - (125 of 1140 states) -unreached in proctype urcu_writer - line 289, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 298, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 59, "(1)" - line 303, "pan.___", state 72, "(1)" - line 308, "pan.___", state 89, "(1)" - line 289, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 293, "pan.___", state 120, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 151, "(1)" - line 303, "pan.___", state 164, "(1)" - line 468, "pan.___", state 195, "(1)" - line 159, "pan.___", state 205, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 163, "pan.___", state 214, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 144, "pan.___", state 237, "(1)" - line 148, "pan.___", state 245, "(1)" - line 152, "pan.___", state 257, "(1)" - line 159, "pan.___", state 268, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 298, "pan.___", state 910, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 299, "pan.___", state 923, "(1)" - line 299, "pan.___", state 924, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 299, "pan.___", state 924, "else" - line 299, "pan.___", state 927, "(1)" - line 299, "pan.___", state 928, "(1)" - line 299, "pan.___", state 928, "(1)" - line 303, "pan.___", state 936, "(1)" - line 303, "pan.___", state 937, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 303, "pan.___", state 937, "else" - line 303, "pan.___", state 940, "(1)" - line 303, "pan.___", state 941, "(1)" - line 303, "pan.___", state 941, "(1)" - line 301, "pan.___", state 946, "((i<1))" - line 301, "pan.___", state 946, "((i>=1))" - line 308, "pan.___", state 953, "(1)" - line 308, "pan.___", state 954, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 308, "pan.___", state 954, "else" - line 308, "pan.___", state 957, "(1)" - line 308, "pan.___", state 958, "(1)" - line 308, "pan.___", state 958, "(1)" - line 310, "pan.___", state 961, "(1)" - line 310, "pan.___", state 961, "(1)" - line 163, "pan.___", state 985, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 167, "pan.___", state 998, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 144, "pan.___", state 1008, "(1)" - line 148, "pan.___", state 1016, "(1)" - line 152, "pan.___", state 1028, "(1)" - line 159, "pan.___", state 1039, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=2))" - line 519, "pan.___", state 20, "((j<2))" - line 519, "pan.___", state 20, "((j>=2))" - line 524, "pan.___", state 33, "((j<2))" - line 524, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 572, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 5.58 seconds -pan: rate 38755.018 states/second -pan: avg transition delay 1.7769e-06 usec -cp .input.spin urcu_free_single_flip.spin.input -cp .input.spin.trail urcu_free_single_flip.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input deleted file mode 100644 index 244a7b2..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input +++ /dev/null @@ -1,532 +0,0 @@ -#define SINGLE_FLIP - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - - -#if (NR_READERS == 1) - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#elif (NR_READERS == 2) - -#define read_free_race (read_generation[0] == last_free_gen || read_generation[1] == last_free_gen) -#define read_free (free_done && (data_access[0] || data_access[1])) - -#else - -#error "Too many readers" - -#endif - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - atomic { - if - :: get_readerid() == 0 -> -progress_reader: - skip; - :: else -> - skip; - fi; - } -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input.trail deleted file mode 100644 index 363553e..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_free_single_flip.spin.input.trail +++ /dev/null @@ -1,1356 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2372 -2:3:2324 -3:3:2327 -4:3:2327 -5:3:2330 -6:3:2338 -7:3:2338 -8:3:2341 -9:3:2347 -10:3:2351 -11:3:2351 -12:3:2354 -13:3:2362 -14:3:2366 -15:3:2367 -16:0:2372 -17:3:2369 -18:0:2372 -19:2:1142 -20:0:2372 -21:2:1148 -22:0:2372 -23:2:1149 -24:0:2372 -25:2:1150 -26:2:1154 -27:2:1155 -28:2:1163 -29:2:1164 -30:2:1168 -31:2:1169 -32:2:1177 -33:2:1182 -34:2:1186 -35:2:1187 -36:2:1194 -37:2:1195 -38:2:1206 -39:2:1207 -40:2:1208 -41:2:1219 -42:2:1224 -43:2:1225 -44:0:2372 -45:2:1237 -46:2:1238 -47:0:2372 -48:2:1242 -49:2:1246 -50:2:1247 -51:2:1255 -52:2:1256 -53:2:1260 -54:2:1261 -55:2:1269 -56:2:1274 -57:2:1275 -58:2:1286 -59:2:1287 -60:2:1298 -61:2:1299 -62:2:1300 -63:2:1311 -64:2:1316 -65:2:1317 -66:0:2372 -67:2:1329 -68:0:2372 -69:2:1330 -70:0:2372 -71:2:1340 -72:0:2372 -73:2:1341 -74:0:2372 -75:2:1345 -76:2:1346 -77:2:1350 -78:2:1354 -79:2:1355 -80:2:1359 -81:2:1367 -82:2:1368 -83:2:1373 -84:2:1380 -85:2:1381 -86:2:1388 -87:2:1393 -88:0:2372 -89:2:1404 -90:0:2372 -91:2:1408 -92:2:1409 -93:2:1413 -94:2:1417 -95:2:1418 -96:2:1422 -97:2:1430 -98:2:1431 -99:2:1436 -100:2:1443 -101:2:1444 -102:2:1451 -103:2:1456 -104:0:2372 -105:2:1467 -106:0:2372 -107:2:1475 -108:2:1476 -109:2:1480 -110:2:1484 -111:2:1485 -112:2:1489 -113:2:1497 -114:2:1498 -115:2:1503 -116:2:1510 -117:2:1511 -118:2:1518 -119:2:1523 -120:0:2372 -121:2:1538 -122:0:2372 -123:2:1539 -124:2:1543 -125:2:1544 -126:2:1552 -127:2:1553 -128:2:1557 -129:2:1558 -130:2:1566 -131:2:1571 -132:2:1575 -133:2:1576 -134:2:1583 -135:2:1584 -136:2:1595 -137:2:1596 -138:2:1597 -139:2:1608 -140:2:1613 -141:2:1614 -142:0:2372 -143:2:1626 -144:0:2372 -145:2:1629 -146:2:1630 -147:2:1642 -148:2:1643 -149:2:1647 -150:2:1648 -151:2:1656 -152:2:1661 -153:2:1665 -154:2:1666 -155:2:1673 -156:2:1674 -157:2:1685 -158:2:1686 -159:2:1687 -160:2:1698 -161:2:1703 -162:2:1704 -163:0:2372 -164:2:1716 -165:0:2372 -166:2:1717 -167:0:2372 -168:2:1718 -169:0:2372 -170:2:1719 -171:0:2372 -172:2:1720 -173:2:1724 -174:2:1725 -175:2:1733 -176:2:1734 -177:2:1738 -178:2:1739 -179:2:1747 -180:2:1752 -181:2:1756 -182:2:1757 -183:2:1764 -184:2:1765 -185:2:1776 -186:2:1777 -187:2:1778 -188:2:1789 -189:2:1794 -190:2:1795 -191:0:2372 -192:2:2005 -193:0:2372 -194:2:2101 -195:0:2372 -196:2:2102 -197:0:2372 -198:2:2106 -199:0:2372 -200:2:2112 -201:0:2372 -202:2:2116 -203:2:2117 -204:2:2121 -205:2:2125 -206:2:2126 -207:2:2130 -208:2:2138 -209:2:2139 -210:2:2144 -211:2:2151 -212:2:2152 -213:2:2159 -214:2:2164 -215:0:2372 -216:2:2175 -217:0:2372 -218:2:2179 -219:2:2180 -220:2:2184 -221:2:2188 -222:2:2189 -223:2:2193 -224:2:2201 -225:2:2202 -226:2:2207 -227:2:2214 -228:2:2215 -229:2:2222 -230:2:2227 -231:0:2372 -232:2:2238 -233:0:2372 -234:2:2246 -235:2:2247 -236:2:2251 -237:2:2255 -238:2:2256 -239:2:2260 -240:2:2268 -241:2:2269 -242:2:2274 -243:2:2281 -244:2:2282 -245:2:2289 -246:2:2294 -247:0:2372 -248:2:2309 -249:0:2372 -250:2:2310 -251:0:2372 -252:2:1149 -253:0:2372 -254:2:1150 -255:2:1154 -256:2:1155 -257:2:1163 -258:2:1164 -259:2:1168 -260:2:1169 -261:2:1177 -262:2:1182 -263:2:1186 -264:2:1187 -265:2:1194 -266:2:1195 -267:2:1206 -268:2:1207 -269:2:1208 -270:2:1219 -271:2:1224 -272:2:1225 -273:0:2372 -274:2:1237 -275:2:1238 -276:0:2372 -277:2:1242 -278:2:1246 -279:2:1247 -280:2:1255 -281:2:1256 -282:2:1260 -283:2:1261 -284:2:1269 -285:2:1274 -286:2:1275 -287:2:1286 -288:2:1287 -289:2:1298 -290:2:1299 -291:2:1300 -292:2:1311 -293:2:1316 -294:2:1317 -295:0:2372 -296:2:1329 -297:0:2372 -298:2:1330 -299:0:2372 -300:2:1340 -301:0:2372 -302:2:1341 -303:0:2372 -304:2:1345 -305:2:1346 -306:2:1350 -307:2:1354 -308:2:1355 -309:2:1359 -310:2:1367 -311:2:1368 -312:2:1373 -313:2:1380 -314:2:1381 -315:2:1388 -316:2:1393 -317:0:2372 -318:2:1404 -319:0:2372 -320:2:1408 -321:2:1409 -322:2:1413 -323:2:1417 -324:2:1418 -325:2:1422 -326:2:1430 -327:2:1431 -328:2:1436 -329:2:1443 -330:2:1444 -331:2:1451 -332:2:1456 -333:0:2372 -334:2:1467 -335:0:2372 -336:2:1475 -337:2:1476 -338:2:1480 -339:2:1484 -340:2:1485 -341:2:1489 -342:2:1497 -343:2:1498 -344:2:1503 -345:2:1510 -346:2:1511 -347:2:1518 -348:2:1523 -349:0:2372 -350:2:1538 -351:0:2372 -352:2:1539 -353:2:1543 -354:2:1544 -355:2:1552 -356:2:1553 -357:2:1557 -358:2:1558 -359:2:1566 -360:2:1571 -361:2:1575 -362:2:1576 -363:2:1583 -364:2:1584 -365:2:1595 -366:2:1596 -367:2:1597 -368:2:1608 -369:2:1613 -370:2:1614 -371:0:2372 -372:2:1626 -373:0:2372 -374:2:1629 -375:2:1630 -376:2:1642 -377:2:1643 -378:2:1647 -379:2:1648 -380:2:1656 -381:2:1661 -382:2:1665 -383:2:1666 -384:2:1673 -385:2:1674 -386:2:1685 -387:2:1686 -388:2:1687 -389:2:1698 -390:2:1703 -391:2:1704 -392:0:2372 -393:2:1716 -394:0:2372 -395:2:1717 -396:0:2372 -397:2:1718 -398:0:2372 -399:2:1719 -400:0:2372 -401:2:1720 -402:2:1724 -403:2:1725 -404:2:1733 -405:2:1734 -406:2:1738 -407:2:1739 -408:2:1747 -409:2:1752 -410:2:1756 -411:2:1757 -412:2:1764 -413:2:1765 -414:2:1776 -415:2:1777 -416:2:1778 -417:2:1789 -418:2:1794 -419:2:1795 -420:0:2372 -421:2:2005 -422:0:2372 -423:2:2101 -424:0:2372 -425:2:2102 -426:0:2372 -427:2:2106 -428:0:2372 -429:2:2112 -430:0:2372 -431:2:2116 -432:2:2117 -433:2:2121 -434:2:2125 -435:2:2126 -436:2:2130 -437:2:2138 -438:2:2139 -439:2:2144 -440:2:2151 -441:2:2152 -442:2:2159 -443:2:2164 -444:0:2372 -445:2:2175 -446:0:2372 -447:2:2179 -448:2:2180 -449:2:2184 -450:2:2188 -451:2:2189 -452:2:2193 -453:2:2201 -454:2:2202 -455:2:2207 -456:2:2214 -457:2:2215 -458:2:2222 -459:2:2227 -460:0:2372 -461:2:2238 -462:0:2372 -463:2:2246 -464:2:2247 -465:2:2251 -466:2:2255 -467:2:2256 -468:2:2260 -469:2:2268 -470:2:2269 -471:2:2274 -472:2:2281 -473:2:2282 -474:2:2289 -475:2:2294 -476:0:2372 -477:2:2309 -478:0:2372 -479:2:2310 -480:0:2372 -481:2:1149 -482:0:2372 -483:2:1150 -484:2:1154 -485:2:1155 -486:2:1163 -487:2:1164 -488:2:1168 -489:2:1169 -490:2:1177 -491:2:1182 -492:2:1186 -493:2:1187 -494:2:1194 -495:2:1195 -496:2:1206 -497:2:1207 -498:2:1208 -499:2:1219 -500:2:1224 -501:2:1225 -502:0:2372 -503:2:1237 -504:2:1238 -505:0:2372 -506:2:1242 -507:2:1246 -508:2:1247 -509:2:1255 -510:2:1256 -511:2:1260 -512:2:1261 -513:2:1269 -514:2:1274 -515:2:1275 -516:2:1286 -517:2:1287 -518:2:1298 -519:2:1299 -520:2:1300 -521:2:1311 -522:2:1316 -523:2:1317 -524:0:2372 -525:2:1329 -526:0:2372 -527:2:1330 -528:0:2372 -529:2:1340 -530:0:2372 -531:2:1341 -532:0:2372 -533:2:1345 -534:2:1346 -535:2:1350 -536:2:1354 -537:2:1355 -538:2:1359 -539:2:1367 -540:2:1368 -541:2:1373 -542:2:1380 -543:2:1381 -544:2:1388 -545:2:1393 -546:0:2372 -547:2:1404 -548:0:2372 -549:2:1408 -550:2:1409 -551:2:1413 -552:2:1417 -553:2:1418 -554:2:1422 -555:2:1430 -556:2:1431 -557:2:1436 -558:2:1443 -559:2:1444 -560:2:1451 -561:2:1456 -562:0:2372 -563:2:1467 -564:0:2372 -565:2:1475 -566:2:1476 -567:2:1480 -568:2:1484 -569:2:1485 -570:2:1489 -571:2:1497 -572:2:1498 -573:2:1503 -574:2:1510 -575:2:1511 -576:2:1518 -577:2:1523 -578:0:2372 -579:2:1538 -580:0:2372 -581:2:1539 -582:2:1543 -583:2:1544 -584:2:1552 -585:2:1553 -586:2:1557 -587:2:1558 -588:2:1566 -589:2:1571 -590:2:1575 -591:2:1576 -592:2:1583 -593:2:1584 -594:2:1595 -595:2:1596 -596:2:1597 -597:2:1608 -598:2:1613 -599:2:1614 -600:0:2372 -601:2:1626 -602:0:2372 -603:2:1629 -604:2:1630 -605:2:1642 -606:2:1643 -607:2:1647 -608:2:1648 -609:2:1656 -610:2:1661 -611:2:1665 -612:2:1666 -613:2:1673 -614:2:1674 -615:2:1685 -616:2:1686 -617:2:1687 -618:2:1698 -619:2:1703 -620:2:1704 -621:0:2372 -622:2:1716 -623:0:2372 -624:2:1717 -625:0:2372 -626:2:1718 -627:0:2372 -628:2:1719 -629:0:2372 -630:2:1720 -631:2:1724 -632:2:1725 -633:2:1733 -634:2:1734 -635:2:1738 -636:2:1739 -637:2:1747 -638:2:1752 -639:2:1756 -640:2:1757 -641:2:1764 -642:2:1765 -643:2:1776 -644:2:1777 -645:2:1778 -646:2:1789 -647:2:1794 -648:2:1795 -649:0:2372 -650:2:2005 -651:0:2372 -652:2:2101 -653:0:2372 -654:2:2102 -655:0:2372 -656:2:2106 -657:0:2372 -658:2:2112 -659:0:2372 -660:2:2116 -661:2:2117 -662:2:2121 -663:2:2125 -664:2:2126 -665:2:2130 -666:2:2138 -667:2:2139 -668:2:2144 -669:2:2151 -670:2:2152 -671:2:2159 -672:2:2164 -673:0:2372 -674:2:2175 -675:0:2372 -676:2:2179 -677:2:2180 -678:2:2184 -679:2:2188 -680:2:2189 -681:2:2193 -682:2:2201 -683:2:2202 -684:2:2207 -685:2:2214 -686:2:2215 -687:2:2222 -688:2:2227 -689:0:2372 -690:2:2238 -691:0:2372 -692:2:2246 -693:2:2247 -694:2:2251 -695:2:2255 -696:2:2256 -697:2:2260 -698:2:2268 -699:2:2269 -700:2:2274 -701:2:2281 -702:2:2282 -703:2:2289 -704:2:2294 -705:0:2372 -706:2:2309 -707:0:2372 -708:2:2310 -709:0:2372 -710:2:1149 -711:0:2372 -712:2:1150 -713:2:1154 -714:2:1155 -715:2:1163 -716:2:1164 -717:2:1168 -718:2:1169 -719:2:1177 -720:2:1182 -721:2:1186 -722:2:1187 -723:2:1194 -724:2:1195 -725:2:1206 -726:2:1207 -727:2:1208 -728:2:1219 -729:2:1224 -730:2:1225 -731:0:2372 -732:2:1237 -733:2:1238 -734:0:2372 -735:2:1242 -736:2:1246 -737:2:1247 -738:2:1255 -739:2:1256 -740:2:1260 -741:2:1261 -742:2:1269 -743:2:1274 -744:2:1275 -745:2:1286 -746:2:1287 -747:2:1298 -748:2:1299 -749:2:1300 -750:2:1311 -751:2:1316 -752:2:1317 -753:0:2372 -754:2:1329 -755:0:2372 -756:2:1330 -757:0:2372 -758:2:1340 -759:0:2372 -760:2:1341 -761:0:2372 -762:2:1345 -763:2:1346 -764:2:1350 -765:2:1354 -766:2:1355 -767:2:1359 -768:2:1367 -769:2:1368 -770:2:1373 -771:2:1380 -772:2:1381 -773:2:1388 -774:2:1393 -775:0:2372 -776:2:1404 -777:0:2372 -778:2:1408 -779:2:1409 -780:2:1413 -781:2:1417 -782:2:1418 -783:2:1422 -784:2:1430 -785:2:1431 -786:2:1436 -787:2:1443 -788:2:1444 -789:2:1451 -790:2:1456 -791:0:2372 -792:2:1467 -793:0:2372 -794:2:1475 -795:2:1476 -796:2:1480 -797:2:1484 -798:2:1485 -799:2:1489 -800:2:1497 -801:2:1498 -802:2:1503 -803:2:1510 -804:2:1511 -805:2:1518 -806:2:1523 -807:0:2372 -808:2:1538 -809:0:2372 -810:2:1539 -811:2:1543 -812:2:1544 -813:2:1552 -814:2:1553 -815:2:1557 -816:2:1558 -817:2:1566 -818:2:1571 -819:2:1575 -820:2:1576 -821:2:1583 -822:2:1584 -823:2:1595 -824:2:1596 -825:2:1597 -826:2:1608 -827:2:1613 -828:2:1614 -829:0:2372 -830:2:1626 -831:0:2372 -832:2:1629 -833:2:1630 -834:2:1642 -835:2:1643 -836:2:1647 -837:2:1648 -838:2:1656 -839:2:1661 -840:2:1665 -841:2:1666 -842:2:1673 -843:2:1674 -844:2:1685 -845:2:1686 -846:2:1687 -847:2:1698 -848:2:1703 -849:2:1704 -850:0:2372 -851:2:1716 -852:0:2372 -853:2:1717 -854:0:2372 -855:2:1718 -856:0:2372 -857:2:1719 -858:0:2372 -859:2:1720 -860:2:1724 -861:2:1725 -862:2:1733 -863:2:1734 -864:2:1738 -865:2:1739 -866:2:1747 -867:2:1752 -868:2:1756 -869:2:1757 -870:2:1764 -871:2:1765 -872:2:1776 -873:2:1777 -874:2:1778 -875:2:1789 -876:2:1794 -877:2:1795 -878:0:2372 -879:2:2005 -880:0:2372 -881:2:2101 -882:0:2372 -883:2:2102 -884:0:2372 -885:2:2106 -886:0:2372 -887:2:2112 -888:0:2372 -889:2:2116 -890:2:2117 -891:2:2121 -892:2:2125 -893:2:2126 -894:2:2130 -895:2:2138 -896:2:2139 -897:2:2144 -898:2:2151 -899:2:2152 -900:2:2159 -901:2:2164 -902:0:2372 -903:2:2175 -904:0:2372 -905:1:2 -906:0:2372 -907:1:8 -908:0:2372 -909:1:9 -910:0:2372 -911:1:10 -912:0:2372 -913:1:11 -914:0:2372 -915:1:12 -916:1:16 -917:1:17 -918:1:25 -919:1:26 -920:1:30 -921:1:31 -922:1:39 -923:1:44 -924:1:48 -925:1:49 -926:1:63 -927:1:64 -928:1:68 -929:1:69 -930:1:70 -931:1:81 -932:1:86 -933:1:87 -934:0:2372 -935:1:99 -936:0:2372 -937:1:100 -938:1:104 -939:1:105 -940:1:113 -941:1:114 -942:1:118 -943:1:119 -944:1:127 -945:1:132 -946:1:136 -947:1:137 -948:1:151 -949:1:152 -950:1:156 -951:1:157 -952:1:158 -953:1:169 -954:1:174 -955:1:175 -956:0:2372 -957:1:187 -958:0:2372 -959:1:188 -960:0:2372 -961:2:2179 -962:2:2180 -963:2:2184 -964:2:2188 -965:2:2189 -966:2:2193 -967:2:2201 -968:2:2202 -969:2:2207 -970:2:2214 -971:2:2215 -972:2:2222 -973:2:2227 -974:0:2372 -975:2:2238 -976:0:2372 -977:2:2246 -978:2:2247 -979:2:2251 -980:2:2255 -981:2:2256 -982:2:2260 -983:2:2268 -984:2:2269 -985:2:2274 -986:2:2281 -987:2:2282 -988:2:2289 -989:2:2294 -990:0:2372 -991:2:2309 -992:0:2372 -993:2:2310 -994:0:2372 -995:2:1149 -996:0:2372 -997:2:1150 -998:2:1154 -999:2:1155 -1000:2:1163 -1001:2:1164 -1002:2:1168 -1003:2:1169 -1004:2:1177 -1005:2:1182 -1006:2:1186 -1007:2:1187 -1008:2:1194 -1009:2:1195 -1010:2:1206 -1011:2:1207 -1012:2:1208 -1013:2:1219 -1014:2:1224 -1015:2:1225 -1016:0:2372 -1017:2:1237 -1018:2:1238 -1019:0:2372 -1020:2:1242 -1021:2:1246 -1022:2:1247 -1023:2:1255 -1024:2:1256 -1025:2:1260 -1026:2:1261 -1027:2:1269 -1028:2:1274 -1029:2:1275 -1030:2:1286 -1031:2:1287 -1032:2:1298 -1033:2:1299 -1034:2:1300 -1035:2:1311 -1036:2:1316 -1037:2:1317 -1038:0:2372 -1039:2:1329 -1040:0:2372 -1041:2:1330 -1042:0:2372 -1043:2:1340 -1044:0:2372 -1045:2:1341 -1046:0:2372 -1047:2:1345 -1048:2:1346 -1049:2:1350 -1050:2:1354 -1051:2:1355 -1052:2:1359 -1053:2:1367 -1054:2:1368 -1055:2:1373 -1056:2:1380 -1057:2:1381 -1058:2:1388 -1059:2:1393 -1060:0:2372 -1061:2:1404 -1062:0:2372 -1063:1:189 -1064:1:193 -1065:1:194 -1066:1:202 -1067:1:203 -1068:1:207 -1069:1:208 -1070:1:216 -1071:1:221 -1072:1:225 -1073:1:226 -1074:1:233 -1075:1:234 -1076:1:245 -1077:1:246 -1078:1:247 -1079:1:258 -1080:1:270 -1081:1:271 -1082:0:2372 -1083:1:276 -1084:0:2372 -1085:1:477 -1086:0:2372 -1087:1:478 -1088:0:2372 -1089:1:11 -1090:0:2372 -1091:1:12 -1092:1:16 -1093:1:17 -1094:1:25 -1095:1:26 -1096:1:27 -1097:1:39 -1098:1:44 -1099:1:48 -1100:1:49 -1101:1:56 -1102:1:57 -1103:1:68 -1104:1:69 -1105:1:70 -1106:1:81 -1107:1:93 -1108:1:94 -1109:0:2372 -1110:1:99 -1111:0:2372 -1112:1:100 -1113:1:104 -1114:1:105 -1115:1:113 -1116:1:114 -1117:1:118 -1118:1:119 -1119:1:127 -1120:1:132 -1121:1:136 -1122:1:137 -1123:1:144 -1124:1:145 -1125:1:156 -1126:1:157 -1127:1:158 -1128:1:169 -1129:1:181 -1130:1:182 -1131:0:2372 -1132:1:279 -1133:0:2372 -1134:1:280 -1135:0:2372 -1136:1:477 -1137:0:2372 -1138:1:478 -1139:0:2372 -1140:1:483 -1141:0:2372 -1142:1:488 -1143:1:492 -1144:1:493 -1145:1:501 -1146:1:502 -1147:1:503 -1148:1:515 -1149:1:520 -1150:1:524 -1151:1:525 -1152:1:532 -1153:1:533 -1154:1:544 -1155:1:545 -1156:1:546 -1157:1:557 -1158:1:569 -1159:1:570 -1160:0:2372 -1161:1:575 -1162:0:2372 -1163:2:1408 -1164:2:1409 -1165:2:1413 -1166:2:1417 -1167:2:1418 -1168:2:1422 -1169:2:1430 -1170:2:1431 -1171:2:1436 -1172:2:1443 -1173:2:1444 -1174:2:1451 -1175:2:1456 -1176:0:2372 -1177:2:1467 -1178:0:2372 -1179:2:1475 -1180:2:1476 -1181:2:1480 -1182:2:1484 -1183:2:1485 -1184:2:1489 -1185:2:1497 -1186:2:1498 -1187:2:1503 -1188:2:1510 -1189:2:1511 -1190:2:1518 -1191:2:1523 -1192:0:2372 -1193:2:1538 -1194:0:2372 -1195:2:1539 -1196:2:1543 -1197:2:1544 -1198:2:1552 -1199:2:1553 -1200:2:1557 -1201:2:1558 -1202:2:1566 -1203:2:1571 -1204:2:1575 -1205:2:1576 -1206:2:1583 -1207:2:1584 -1208:2:1595 -1209:2:1596 -1210:2:1597 -1211:2:1608 -1212:2:1613 -1213:2:1614 -1214:0:2372 -1215:2:1626 -1216:0:2372 -1217:2:1629 -1218:2:1630 -1219:2:1642 -1220:2:1643 -1221:2:1647 -1222:2:1648 -1223:2:1656 -1224:2:1661 -1225:2:1665 -1226:2:1666 -1227:2:1673 -1228:2:1674 -1229:2:1685 -1230:2:1686 -1231:2:1687 -1232:2:1698 -1233:2:1703 -1234:2:1704 -1235:0:2372 -1236:2:1716 -1237:0:2372 -1238:2:1717 -1239:0:2372 -1240:2:1718 -1241:0:2372 -1242:2:1719 -1243:0:2372 -1244:2:1720 -1245:2:1724 -1246:2:1725 -1247:2:1733 -1248:2:1734 -1249:2:1738 -1250:2:1739 -1251:2:1747 -1252:2:1752 -1253:2:1756 -1254:2:1757 -1255:2:1764 -1256:2:1765 -1257:2:1776 -1258:2:1777 -1259:2:1778 -1260:2:1789 -1261:2:1794 -1262:2:1795 -1263:0:2372 -1264:2:2005 -1265:0:2372 -1266:2:2101 -1267:0:2372 -1268:2:2102 -1269:0:2372 -1270:2:2106 -1271:0:2372 -1272:2:2112 -1273:0:2372 -1274:2:2116 -1275:2:2117 -1276:2:2121 -1277:2:2125 -1278:2:2126 -1279:2:2130 -1280:2:2138 -1281:2:2139 -1282:2:2144 -1283:2:2151 -1284:2:2152 -1285:2:2159 -1286:2:2164 -1287:0:2372 -1288:2:2175 -1289:0:2372 -1290:2:2179 -1291:2:2180 -1292:2:2184 -1293:2:2188 -1294:2:2189 -1295:2:2193 -1296:2:2201 -1297:2:2202 -1298:2:2207 -1299:2:2214 -1300:2:2215 -1301:2:2222 -1302:2:2227 -1303:0:2372 -1304:2:2238 -1305:0:2372 -1306:2:2246 -1307:2:2247 -1308:2:2251 -1309:2:2255 -1310:2:2256 -1311:2:2260 -1312:2:2268 -1313:2:2269 -1314:2:2274 -1315:2:2281 -1316:2:2282 -1317:2:2289 -1318:2:2294 -1319:0:2372 -1320:2:2309 -1321:0:2372 -1322:2:2310 -1323:0:2372 -1324:2:2313 -1325:0:2372 -1326:2:2318 -1327:0:2372 -1328:1:576 -1329:1:580 -1330:1:581 -1331:1:589 -1332:1:590 -1333:1:594 -1334:1:595 -1335:1:603 -1336:1:608 -1337:1:612 -1338:1:613 -1339:1:620 -1340:1:621 -1341:1:632 -1342:1:633 -1343:1:634 -1344:1:645 -1345:1:650 -1346:1:651 -1347:0:2372 -1348:2:2319 -1349:0:2372 -1350:1:663 -1351:0:2370 -1352:2:2318 -1353:0:2376 -1354:1:241 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress.ltl b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.define b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.log deleted file mode 100644 index ceb438f..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.log +++ /dev/null @@ -1,16 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_reader.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -spin: line 296 replacement value: tmp -spin: line 296 "pan.___", Error: formal par of wait_for_quiescent_state contains replacement value saw '-2'' near 'readerid' -spin: 1 error(s) - aborting -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input deleted file mode 100644 index cc55960..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input +++ /dev/null @@ -1,410 +0,0 @@ -#define READER_PROGRESS -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#define read_free_race (read_generation == last_free_gen) -#define read_free (free_done && data_access) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces - * both. - */ - -#define DECLARE_CACHED_VAR(type, x, v) \ - type mem_##x = v; \ - type cached_##x[NR_PROCS] = v; \ - bit cache_dirty_##x[NR_PROCS] = 0 - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) - -#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x[get_pid()] = v; \ - cache_dirty_##x[get_pid()] = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x[id]; \ - cache_dirty_##x[id] = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - CACHE_READ_FROM_MEM(urcu_active_readers_one, i); - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i); -#endif -#ifndef NO_RMB - smp_rmb_pid(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid()); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid()); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i); -#endif -#ifndef NO_RMB - smp_rmb(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr, 0); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation = 1; -bit data_access = 0; - -bit write_lock = 0; - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, id, i) -{ - do - :: 1 -> - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (tmp & RCU_GP_CTR_NEST_MASK) - && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, i, j) -{ - i = 0; - do - :: i < NR_READERS -> - wait_for_reader(tmp, i, j); - if - :: (NR_READERS > 1) && (i < NR_READERS - 1) - -> ooo_mem(j); - :: else - -> skip; - fi; - i++ - :: i >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers_one, - tmp + 1); - fi; - smp_mb(i); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access = 1; - ooo_mem(i); - data_access = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i); - tmp2 = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, nest_i; - byte tmp, tmp2; - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active [NR_WRITERS] proctype urcu_writer() -{ - byte i, j; - byte tmp; - byte old_gen; - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, i, j); -#endif - smp_mb(i); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input.trail deleted file mode 100644 index e65d663..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_reader.spin.input.trail +++ /dev/null @@ -1,9 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2679 -2:1:2673 -3:1:2674 -4:1:2675 -5:1:2676 -6:0:2685 -7:5:1129 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.define b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.log deleted file mode 100644 index 985f839..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.log +++ /dev/null @@ -1,14 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -w -DHASH64 -o pan pan.c diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input deleted file mode 100644 index 28f1299..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input +++ /dev/null @@ -1,410 +0,0 @@ -#define WRITER_PROGRESS -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#define read_free_race (read_generation == last_free_gen) -#define read_free (free_done && data_access) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces - * both. - */ - -#define DECLARE_CACHED_VAR(type, x, v) \ - type mem_##x = v; \ - type cached_##x[NR_PROCS] = v; \ - bit cache_dirty_##x[NR_PROCS] = 0 - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) - -#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x[get_pid()] = v; \ - cache_dirty_##x[get_pid()] = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x[id]; \ - cache_dirty_##x[id] = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - CACHE_READ_FROM_MEM(urcu_active_readers_one, i); - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i); -#endif -#ifndef NO_RMB - smp_rmb_pid(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid()); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid()); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i); -#endif -#ifndef NO_RMB - smp_rmb(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr, 0); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation = 1; -bit data_access = 0; - -bit write_lock = 0; - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, id, i) -{ - do - :: 1 -> - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (tmp & RCU_GP_CTR_NEST_MASK) - && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, i, j) -{ - i = 0; - do - :: i < NR_READERS -> - wait_for_reader(tmp, i, j); - if - :: (NR_READERS > 1) && (i < NR_READERS - 1) - -> ooo_mem(j); - :: else - -> skip; - fi; - i++ - :: i >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers_one, - tmp + 1); - fi; - smp_mb(i); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access = 1; - ooo_mem(i); - data_access = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i); - tmp2 = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, nest_i; - byte tmp, tmp2; - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active [NR_WRITERS] proctype urcu_writer() -{ - byte i, j; - byte tmp; - byte old_gen; - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, i, j); -#endif - smp_mb(i); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input.trail deleted file mode 100644 index e65d663..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer.spin.input.trail +++ /dev/null @@ -1,9 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2679 -2:1:2673 -3:1:2674 -4:1:2675 -5:1:2676 -6:0:2685 -7:5:1129 diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.define b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.log b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.log deleted file mode 100644 index 26b6236..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.log +++ /dev/null @@ -1,16 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer_error.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -spin: line 297 replacement value: tmp -spin: line 297 "pan.___", Error: formal par of wait_for_quiescent_state contains replacement value saw '-2'' near 'readerid' -spin: 1 error(s) - aborting -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu/testmerge' diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input deleted file mode 100644 index 43e979c..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input +++ /dev/null @@ -1,411 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#define read_free_race (read_generation == last_free_gen) -#define read_free (free_done && data_access) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define get_pid() (_pid) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), wmb_mb forces - * both. - */ - -#define DECLARE_CACHED_VAR(type, x, v) \ - type mem_##x = v; \ - type cached_##x[NR_PROCS] = v; \ - bit cache_dirty_##x[NR_PROCS] = 0 - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x[id]) - -#define READ_CACHED_VAR(x) (cached_##x[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x[get_pid()] = v; \ - cache_dirty_##x[get_pid()] = 1; \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x[id]; \ - cache_dirty_##x[id] = 0; \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - CACHE_READ_FROM_MEM(urcu_active_readers_one, i); - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, i); - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i); -#endif -#ifndef NO_RMB - smp_rmb_pid(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid()); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid()); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - CACHE_READ_FROM_MEM(urcu_active_readers_one, get_pid()); - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - CACHE_WRITE_TO_MEM(urcu_active_readers_one, get_pid()); - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i); -#endif -#ifndef NO_RMB - smp_rmb(i); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb and ooo_mem */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr, 1); -/* Note ! currently only one reader */ -DECLARE_CACHED_VAR(byte, urcu_active_readers_one, 0); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr, 0); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation = 1; -bit data_access = 0; - -bit write_lock = 0; - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers_one, - get_pid()); - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, id, i) -{ - do - :: 1 -> - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (tmp & RCU_GP_CTR_NEST_MASK) - && ((tmp ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i); -#else - ooo_mem(i); -#endif - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, i, j) -{ - i = 0; - do - :: i < NR_READERS -> - wait_for_reader(tmp, i, j); - if - :: (NR_READERS > 1) && (i < NR_READERS - 1) - -> ooo_mem(j); - :: else - -> skip; - fi; - i++ - :: i >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers_one, - tmp + 1); - fi; - smp_mb(i); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access = 1; - ooo_mem(i); - data_access = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i); - tmp2 = READ_CACHED_VAR(urcu_active_readers_one); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers_one, tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active [NR_READERS] proctype urcu_reader() -{ - byte i, nest_i; - byte tmp, tmp2; - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, nest_i, tmp, tmp2); - od; -} - -/* Model the RCU update process. */ - -active [NR_WRITERS] proctype urcu_writer() -{ - byte i, j; - byte tmp; - byte old_gen; - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - //smp_mc(i); - wait_for_quiescent_state(tmp, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - wait_for_quiescent_state(tmp, i, j); -#endif - smp_mb(i); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - skip; - od; -} diff --git a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input.trail deleted file mode 100644 index ff6f1c5..0000000 --- a/formal-model/urcu/result-signal-over-writer/testmerge/urcu_progress_writer_error.spin.input.trail +++ /dev/null @@ -1,4590 +0,0 @@ --2:2:-2 --4:-4:-4 -1:0:2223 -2:2:908 -3:0:2223 -4:1:0 -5:0:2223 -6:1:1 -7:0:2223 -8:1:2 -9:0:2223 -10:1:3 -11:0:2223 -12:2:909 -13:0:2223 -14:2:910 -15:2:914 -16:2:915 -17:2:922 -18:2:926 -19:2:927 -20:2:934 -21:2:938 -22:2:939 -23:2:946 -24:2:947 -25:2:957 -26:2:958 -27:2:968 -28:2:969 -29:0:2221 -30:2:981 -31:2:982 -32:0:2227 -33:2:986 -34:2:990 -35:2:991 -36:2:998 -37:2:1002 -38:2:1003 -39:2:1010 -40:2:1011 -41:2:1022 -42:2:1023 -43:2:1033 -44:2:1034 -45:2:1044 -46:2:1045 -47:0:2227 -48:2:1057 -49:0:2227 -50:2:1058 -51:0:2227 -52:2:1068 -53:0:2227 -54:2:1069 -55:0:2227 -56:2:1073 -57:2:1074 -58:2:1080 -59:2:1081 -60:2:1087 -61:2:1088 -62:2:1093 -63:2:1099 -64:2:1105 -65:0:2227 -66:2:1116 -67:0:2227 -68:2:1120 -69:2:1121 -70:2:1127 -71:2:1128 -72:2:1134 -73:2:1135 -74:2:1140 -75:2:1146 -76:2:1152 -77:0:2227 -78:2:1163 -79:0:2227 -80:2:1171 -81:2:1172 -82:2:1178 -83:2:1179 -84:2:1185 -85:2:1186 -86:2:1191 -87:2:1197 -88:2:1203 -89:0:2227 -90:2:1218 -91:0:2227 -92:2:1219 -93:2:1223 -94:2:1224 -95:2:1231 -96:2:1235 -97:2:1236 -98:2:1243 -99:2:1247 -100:2:1248 -101:2:1255 -102:2:1256 -103:2:1266 -104:2:1267 -105:2:1277 -106:2:1278 -107:0:2227 -108:2:1290 -109:0:2227 -110:2:1293 -111:2:1294 -112:2:1305 -113:2:1309 -114:2:1310 -115:2:1317 -116:2:1321 -117:2:1322 -118:2:1329 -119:2:1330 -120:2:1340 -121:2:1341 -122:2:1351 -123:2:1352 -124:0:2227 -125:2:1364 -126:0:2227 -127:2:1365 -128:0:2227 -129:2:1366 -130:0:2227 -131:2:1367 -132:0:2227 -133:2:1368 -134:2:1372 -135:2:1373 -136:2:1380 -137:2:1384 -138:2:1385 -139:2:1392 -140:2:1396 -141:2:1397 -142:2:1404 -143:2:1405 -144:2:1415 -145:2:1416 -146:2:1426 -147:2:1427 -148:0:2227 -149:2:1511 -150:0:2227 -151:2:1591 -152:0:2227 -153:2:1592 -154:0:2227 -155:2:1596 -156:0:2227 -157:2:1602 -158:2:1606 -159:2:1607 -160:2:1614 -161:2:1618 -162:2:1619 -163:2:1626 -164:2:1630 -165:2:1631 -166:2:1638 -167:2:1639 -168:2:1649 -169:2:1650 -170:2:1660 -171:2:1661 -172:0:2227 -173:2:1673 -174:0:2227 -175:2:1674 -176:2:1678 -177:2:1679 -178:2:1686 -179:2:1690 -180:2:1691 -181:2:1698 -182:2:1702 -183:2:1703 -184:2:1710 -185:2:1711 -186:2:1721 -187:2:1722 -188:2:1732 -189:2:1733 -190:0:2227 -191:2:1745 -192:0:2227 -193:1:4 -194:1:8 -195:1:9 -196:1:16 -197:1:20 -198:1:21 -199:1:28 -200:1:32 -201:1:33 -202:1:40 -203:1:41 -204:1:51 -205:1:52 -206:1:62 -207:1:63 -208:0:2227 -209:1:75 -210:0:2227 -211:1:76 -212:1:80 -213:1:81 -214:1:88 -215:1:92 -216:1:93 -217:1:100 -218:1:104 -219:1:105 -220:1:112 -221:1:113 -222:1:123 -223:1:124 -224:1:134 -225:1:135 -226:0:2227 -227:1:147 -228:0:2227 -229:1:148 -230:0:2227 -231:1:149 -232:1:153 -233:1:154 -234:1:161 -235:1:165 -236:1:166 -237:1:173 -238:1:177 -239:1:178 -240:1:185 -241:1:186 -242:1:196 -243:1:197 -244:1:207 -245:1:208 -246:0:2227 -247:1:220 -248:0:2227 -249:1:373 -250:0:2227 -251:1:374 -252:0:2227 -253:1:3 -254:0:2227 -255:1:4 -256:1:8 -257:1:9 -258:1:16 -259:1:17 -260:1:28 -261:1:32 -262:1:33 -263:1:40 -264:1:41 -265:1:51 -266:1:52 -267:1:62 -268:1:63 -269:0:2227 -270:2:1748 -271:2:1749 -272:2:1760 -273:2:1764 -274:2:1765 -275:2:1772 -276:2:1776 -277:2:1777 -278:2:1784 -279:2:1785 -280:2:1795 -281:2:1796 -282:2:1806 -283:2:1807 -284:0:2227 -285:2:1819 -286:0:2227 -287:2:1820 -288:0:2227 -289:2:1821 -290:0:2227 -291:2:1822 -292:0:2227 -293:2:1823 -294:2:1827 -295:2:1828 -296:2:1835 -297:2:1839 -298:2:1840 -299:2:1847 -300:2:1851 -301:2:1852 -302:2:1859 -303:2:1860 -304:2:1870 -305:2:1871 -306:2:1881 -307:2:1882 -308:0:2227 -309:2:1894 -310:0:2227 -311:2:1895 -312:2:1899 -313:2:1900 -314:2:1907 -315:2:1911 -316:2:1912 -317:2:1919 -318:2:1923 -319:2:1924 -320:2:1931 -321:2:1932 -322:2:1942 -323:2:1943 -324:2:1953 -325:2:1954 -326:0:2227 -327:2:1821 -328:0:2227 -329:1:75 -330:0:2227 -331:2:1822 -332:0:2227 -333:2:1823 -334:2:1827 -335:2:1828 -336:2:1835 -337:2:1839 -338:2:1840 -339:2:1847 -340:2:1851 -341:2:1852 -342:2:1859 -343:2:1860 -344:2:1870 -345:2:1871 -346:2:1881 -347:2:1882 -348:0:2227 -349:2:1894 -350:0:2227 -351:2:1895 -352:2:1899 -353:2:1900 -354:2:1907 -355:2:1911 -356:2:1912 -357:2:1919 -358:2:1923 -359:2:1924 -360:2:1931 -361:2:1932 -362:2:1942 -363:2:1943 -364:2:1953 -365:2:1954 -366:0:2227 -367:2:1821 -368:0:2227 -369:1:76 -370:1:80 -371:1:81 -372:1:88 -373:1:92 -374:1:93 -375:1:100 -376:1:104 -377:1:105 -378:1:112 -379:1:113 -380:1:123 -381:1:124 -382:1:134 -383:1:135 -384:0:2227 -385:1:223 -386:0:2227 -387:2:1822 -388:0:2227 -389:2:1823 -390:2:1827 -391:2:1828 -392:2:1835 -393:2:1839 -394:2:1840 -395:2:1847 -396:2:1851 -397:2:1852 -398:2:1859 -399:2:1860 -400:2:1870 -401:2:1871 -402:2:1881 -403:2:1882 -404:0:2227 -405:2:1894 -406:0:2227 -407:2:1895 -408:2:1899 -409:2:1900 -410:2:1907 -411:2:1911 -412:2:1912 -413:2:1919 -414:2:1923 -415:2:1924 -416:2:1931 -417:2:1932 -418:2:1942 -419:2:1943 -420:2:1953 -421:2:1954 -422:0:2227 -423:2:1821 -424:0:2227 -425:1:224 -426:0:2227 -427:1:373 -428:0:2227 -429:1:374 -430:0:2227 -431:1:379 -432:0:2227 -433:2:1822 -434:0:2227 -435:2:1823 -436:2:1827 -437:2:1828 -438:2:1835 -439:2:1839 -440:2:1840 -441:2:1847 -442:2:1851 -443:2:1852 -444:2:1859 -445:2:1860 -446:2:1870 -447:2:1871 -448:2:1881 -449:2:1882 -450:0:2227 -451:2:1894 -452:0:2227 -453:2:1895 -454:2:1899 -455:2:1900 -456:2:1907 -457:2:1911 -458:2:1912 -459:2:1919 -460:2:1923 -461:2:1924 -462:2:1931 -463:2:1932 -464:2:1942 -465:2:1943 -466:2:1953 -467:2:1954 -468:0:2227 -469:2:1821 -470:0:2227 -471:1:384 -472:1:388 -473:1:389 -474:1:396 -475:1:397 -476:1:408 -477:1:412 -478:1:413 -479:1:420 -480:1:421 -481:1:431 -482:1:432 -483:1:442 -484:1:443 -485:0:2227 -486:2:1822 -487:0:2227 -488:2:1823 -489:2:1827 -490:2:1828 -491:2:1835 -492:2:1839 -493:2:1840 -494:2:1847 -495:2:1851 -496:2:1852 -497:2:1859 -498:2:1860 -499:2:1870 -500:2:1871 -501:2:1881 -502:2:1882 -503:0:2227 -504:2:1894 -505:0:2227 -506:2:1895 -507:2:1899 -508:2:1900 -509:2:1907 -510:2:1911 -511:2:1912 -512:2:1919 -513:2:1923 -514:2:1924 -515:2:1931 -516:2:1932 -517:2:1942 -518:2:1943 -519:2:1953 -520:2:1954 -521:0:2227 -522:2:1821 -523:0:2227 -524:2:1822 -525:0:2227 -526:2:1823 -527:2:1827 -528:2:1828 -529:2:1835 -530:2:1839 -531:2:1840 -532:2:1847 -533:2:1851 -534:2:1852 -535:2:1859 -536:2:1860 -537:2:1870 -538:2:1871 -539:2:1881 -540:2:1882 -541:0:2227 -542:1:455 -543:0:2227 -544:2:1894 -545:0:2227 -546:2:1895 -547:2:1899 -548:2:1900 -549:2:1907 -550:2:1911 -551:2:1912 -552:2:1919 -553:2:1923 -554:2:1924 -555:2:1931 -556:2:1932 -557:2:1942 -558:2:1943 -559:2:1953 -560:2:1954 -561:0:2227 -562:2:1821 -563:0:2227 -564:2:1822 -565:0:2227 -566:2:1823 -567:2:1827 -568:2:1828 -569:2:1835 -570:2:1839 -571:2:1840 -572:2:1847 -573:2:1851 -574:2:1852 -575:2:1859 -576:2:1860 -577:2:1870 -578:2:1871 -579:2:1881 -580:2:1882 -581:0:2227 -582:1:456 -583:1:460 -584:1:461 -585:1:468 -586:1:472 -587:1:473 -588:1:480 -589:1:484 -590:1:485 -591:1:492 -592:1:493 -593:1:503 -594:1:504 -595:1:514 -596:1:515 -597:0:2227 -598:2:1894 -599:0:2227 -600:2:1895 -601:2:1899 -602:2:1900 -603:2:1907 -604:2:1911 -605:2:1912 -606:2:1919 -607:2:1923 -608:2:1924 -609:2:1931 -610:2:1932 -611:2:1942 -612:2:1943 -613:2:1953 -614:2:1954 -615:0:2227 -616:2:1821 -617:0:2227 -618:2:1822 -619:0:2227 -620:2:1823 -621:2:1827 -622:2:1828 -623:2:1835 -624:2:1839 -625:2:1840 -626:2:1847 -627:2:1851 -628:2:1852 -629:2:1859 -630:2:1860 -631:2:1870 -632:2:1871 -633:2:1881 -634:2:1882 -635:0:2227 -636:1:527 -637:0:2227 -638:2:1894 -639:0:2227 -640:2:1895 -641:2:1899 -642:2:1900 -643:2:1907 -644:2:1911 -645:2:1912 -646:2:1919 -647:2:1923 -648:2:1924 -649:2:1931 -650:2:1932 -651:2:1942 -652:2:1943 -653:2:1953 -654:2:1954 -655:0:2227 -656:2:1821 -657:0:2227 -658:2:1822 -659:0:2227 -660:2:1823 -661:2:1827 -662:2:1828 -663:2:1835 -664:2:1839 -665:2:1840 -666:2:1847 -667:2:1851 -668:2:1852 -669:2:1859 -670:2:1860 -671:2:1870 -672:2:1871 -673:2:1881 -674:2:1882 -675:0:2227 -676:1:528 -677:1:532 -678:1:533 -679:1:540 -680:1:544 -681:1:545 -682:1:552 -683:1:556 -684:1:557 -685:1:564 -686:1:565 -687:1:575 -688:1:576 -689:1:586 -690:1:587 -691:0:2227 -692:2:1894 -693:0:2227 -694:2:1895 -695:2:1899 -696:2:1900 -697:2:1907 -698:2:1911 -699:2:1912 -700:2:1919 -701:2:1923 -702:2:1924 -703:2:1931 -704:2:1932 -705:2:1942 -706:2:1943 -707:2:1953 -708:2:1954 -709:0:2227 -710:2:1821 -711:0:2227 -712:2:1822 -713:0:2227 -714:2:1823 -715:2:1827 -716:2:1828 -717:2:1835 -718:2:1839 -719:2:1840 -720:2:1847 -721:2:1851 -722:2:1852 -723:2:1859 -724:2:1860 -725:2:1870 -726:2:1871 -727:2:1881 -728:2:1882 -729:0:2227 -730:1:599 -731:0:2227 -732:1:600 -733:0:2227 -734:1:601 -735:0:2227 -736:1:746 -737:0:2227 -738:1:747 -739:0:2227 -740:2:1894 -741:0:2227 -742:2:1895 -743:2:1899 -744:2:1900 -745:2:1907 -746:2:1911 -747:2:1912 -748:2:1919 -749:2:1923 -750:2:1924 -751:2:1931 -752:2:1932 -753:2:1942 -754:2:1943 -755:2:1953 -756:2:1954 -757:0:2227 -758:2:1821 -759:0:2227 -760:2:1822 -761:0:2227 -762:2:1823 -763:2:1827 -764:2:1828 -765:2:1835 -766:2:1839 -767:2:1840 -768:2:1847 -769:2:1851 -770:2:1852 -771:2:1859 -772:2:1860 -773:2:1870 -774:2:1871 -775:2:1881 -776:2:1882 -777:0:2227 -778:1:751 -779:0:2227 -780:2:1894 -781:0:2227 -782:2:1895 -783:2:1899 -784:2:1900 -785:2:1907 -786:2:1911 -787:2:1912 -788:2:1919 -789:2:1923 -790:2:1924 -791:2:1931 -792:2:1932 -793:2:1942 -794:2:1943 -795:2:1953 -796:2:1954 -797:0:2227 -798:2:1821 -799:0:2227 -800:2:1822 -801:0:2227 -802:2:1823 -803:2:1827 -804:2:1828 -805:2:1835 -806:2:1839 -807:2:1840 -808:2:1847 -809:2:1851 -810:2:1852 -811:2:1859 -812:2:1860 -813:2:1870 -814:2:1871 -815:2:1881 -816:2:1882 -817:0:2227 -818:1:752 -819:1:756 -820:1:757 -821:1:764 -822:1:768 -823:1:769 -824:1:776 -825:1:780 -826:1:781 -827:1:788 -828:1:789 -829:1:799 -830:1:800 -831:1:810 -832:1:811 -833:0:2227 -834:2:1894 -835:0:2227 -836:2:1895 -837:2:1899 -838:2:1900 -839:2:1907 -840:2:1911 -841:2:1912 -842:2:1919 -843:2:1923 -844:2:1924 -845:2:1931 -846:2:1932 -847:2:1942 -848:2:1943 -849:2:1953 -850:2:1954 -851:0:2227 -852:2:1821 -853:0:2227 -854:2:1822 -855:0:2227 -856:2:1823 -857:2:1827 -858:2:1828 -859:2:1835 -860:2:1839 -861:2:1840 -862:2:1847 -863:2:1851 -864:2:1852 -865:2:1859 -866:2:1860 -867:2:1870 -868:2:1871 -869:2:1881 -870:2:1882 -871:0:2227 -872:1:823 -873:0:2227 -874:1:601 -875:0:2227 -876:1:746 -877:0:2227 -878:1:747 -879:0:2227 -880:2:1894 -881:0:2227 -882:2:1895 -883:2:1899 -884:2:1900 -885:2:1907 -886:2:1911 -887:2:1912 -888:2:1919 -889:2:1923 -890:2:1924 -891:2:1931 -892:2:1932 -893:2:1942 -894:2:1943 -895:2:1953 -896:2:1954 -897:0:2227 -898:2:1821 -899:0:2227 -900:2:1822 -901:0:2227 -902:2:1823 -903:2:1827 -904:2:1828 -905:2:1835 -906:2:1839 -907:2:1840 -908:2:1847 -909:2:1851 -910:2:1852 -911:2:1859 -912:2:1860 -913:2:1870 -914:2:1871 -915:2:1881 -916:2:1882 -917:0:2227 -918:1:751 -919:0:2227 -920:2:1894 -921:0:2227 -922:2:1895 -923:2:1899 -924:2:1900 -925:2:1907 -926:2:1911 -927:2:1912 -928:2:1919 -929:2:1923 -930:2:1924 -931:2:1931 -932:2:1932 -933:2:1942 -934:2:1943 -935:2:1953 -936:2:1954 -937:0:2227 -938:2:1821 -939:0:2227 -940:2:1822 -941:0:2227 -942:2:1823 -943:2:1827 -944:2:1828 -945:2:1835 -946:2:1839 -947:2:1840 -948:2:1847 -949:2:1851 -950:2:1852 -951:2:1859 -952:2:1860 -953:2:1870 -954:2:1871 -955:2:1881 -956:2:1882 -957:0:2227 -958:1:752 -959:1:756 -960:1:757 -961:1:764 -962:1:765 -963:1:776 -964:1:780 -965:1:781 -966:1:788 -967:1:789 -968:1:799 -969:1:800 -970:1:810 -971:1:811 -972:0:2227 -973:2:1894 -974:0:2227 -975:2:1895 -976:2:1899 -977:2:1900 -978:2:1907 -979:2:1911 -980:2:1912 -981:2:1919 -982:2:1923 -983:2:1924 -984:2:1931 -985:2:1932 -986:2:1942 -987:2:1943 -988:2:1953 -989:2:1954 -990:0:2227 -991:2:1821 -992:0:2227 -993:2:1822 -994:0:2227 -995:2:1823 -996:2:1827 -997:2:1828 -998:2:1835 -999:2:1839 -1000:2:1840 -1001:2:1847 -1002:2:1851 -1003:2:1852 -1004:2:1859 -1005:2:1860 -1006:2:1870 -1007:2:1871 -1008:2:1881 -1009:2:1882 -1010:0:2227 -1011:2:1894 -1012:0:2227 -1013:1:823 -1014:0:2227 -1015:1:827 -1016:0:2227 -1017:2:1895 -1018:2:1899 -1019:2:1900 -1020:2:1907 -1021:2:1911 -1022:2:1912 -1023:2:1919 -1024:2:1923 -1025:2:1924 -1026:2:1931 -1027:2:1932 -1028:2:1942 -1029:2:1943 -1030:2:1953 -1031:2:1954 -1032:0:2227 -1033:2:1821 -1034:0:2227 -1035:2:1822 -1036:0:2227 -1037:2:1823 -1038:2:1827 -1039:2:1828 -1040:2:1835 -1041:2:1839 -1042:2:1840 -1043:2:1847 -1044:2:1851 -1045:2:1852 -1046:2:1859 -1047:2:1860 -1048:2:1870 -1049:2:1871 -1050:2:1881 -1051:2:1882 -1052:0:2227 -1053:2:1894 -1054:0:2227 -1055:1:832 -1056:1:836 -1057:1:837 -1058:1:844 -1059:1:845 -1060:1:856 -1061:1:860 -1062:1:861 -1063:1:868 -1064:1:869 -1065:1:879 -1066:1:880 -1067:1:890 -1068:1:891 -1069:0:2227 -1070:1:1 -1071:0:2227 -1072:1:2 -1073:0:2227 -1074:1:3 -1075:0:2227 -1076:2:1895 -1077:2:1899 -1078:2:1900 -1079:2:1907 -1080:2:1911 -1081:2:1912 -1082:2:1919 -1083:2:1923 -1084:2:1924 -1085:2:1931 -1086:2:1932 -1087:2:1949 -1088:2:1950 -1089:2:1953 -1090:2:1954 -1091:0:2227 -1092:2:1821 -1093:0:2227 -1094:2:1822 -1095:0:2227 -1096:2:1823 -1097:2:1827 -1098:2:1828 -1099:2:1835 -1100:2:1839 -1101:2:1840 -1102:2:1847 -1103:2:1851 -1104:2:1852 -1105:2:1859 -1106:2:1860 -1107:2:1877 -1108:2:1878 -1109:2:1881 -1110:2:1882 -1111:0:2227 -1112:2:1894 -1113:0:2227 -1114:1:4 -1115:1:8 -1116:1:9 -1117:1:16 -1118:1:20 -1119:1:21 -1120:1:28 -1121:1:32 -1122:1:33 -1123:1:40 -1124:1:41 -1125:1:51 -1126:1:52 -1127:1:62 -1128:1:63 -1129:0:2227 -1130:2:1895 -1131:2:1899 -1132:2:1900 -1133:2:1907 -1134:2:1911 -1135:2:1912 -1136:2:1919 -1137:2:1923 -1138:2:1924 -1139:2:1931 -1140:2:1932 -1141:2:1949 -1142:2:1950 -1143:2:1953 -1144:2:1954 -1145:0:2227 -1146:2:1821 -1147:0:2227 -1148:2:1822 -1149:0:2227 -1150:2:1823 -1151:2:1827 -1152:2:1828 -1153:2:1835 -1154:2:1839 -1155:2:1840 -1156:2:1847 -1157:2:1851 -1158:2:1852 -1159:2:1859 -1160:2:1860 -1161:2:1877 -1162:2:1878 -1163:2:1881 -1164:2:1882 -1165:0:2227 -1166:2:1894 -1167:0:2227 -1168:1:75 -1169:0:2227 -1170:2:1895 -1171:2:1899 -1172:2:1900 -1173:2:1907 -1174:2:1911 -1175:2:1912 -1176:2:1919 -1177:2:1923 -1178:2:1924 -1179:2:1931 -1180:2:1932 -1181:2:1949 -1182:2:1950 -1183:2:1953 -1184:2:1954 -1185:0:2227 -1186:2:1821 -1187:0:2227 -1188:2:1822 -1189:0:2227 -1190:2:1823 -1191:2:1827 -1192:2:1828 -1193:2:1835 -1194:2:1839 -1195:2:1840 -1196:2:1847 -1197:2:1851 -1198:2:1852 -1199:2:1859 -1200:2:1860 -1201:2:1877 -1202:2:1878 -1203:2:1881 -1204:2:1882 -1205:0:2227 -1206:2:1894 -1207:0:2227 -1208:1:76 -1209:1:80 -1210:1:81 -1211:1:88 -1212:1:92 -1213:1:93 -1214:1:100 -1215:1:104 -1216:1:105 -1217:1:112 -1218:1:113 -1219:1:123 -1220:1:124 -1221:1:134 -1222:1:135 -1223:0:2227 -1224:1:147 -1225:0:2227 -1226:2:1895 -1227:2:1899 -1228:2:1900 -1229:2:1907 -1230:2:1911 -1231:2:1912 -1232:2:1919 -1233:2:1923 -1234:2:1924 -1235:2:1931 -1236:2:1932 -1237:2:1949 -1238:2:1950 -1239:2:1953 -1240:2:1954 -1241:0:2227 -1242:2:1821 -1243:0:2227 -1244:2:1822 -1245:0:2227 -1246:2:1823 -1247:2:1827 -1248:2:1828 -1249:2:1835 -1250:2:1839 -1251:2:1840 -1252:2:1847 -1253:2:1851 -1254:2:1852 -1255:2:1859 -1256:2:1860 -1257:2:1877 -1258:2:1878 -1259:2:1881 -1260:2:1882 -1261:0:2227 -1262:2:1894 -1263:0:2227 -1264:1:148 -1265:0:2227 -1266:2:1895 -1267:2:1899 -1268:2:1900 -1269:2:1907 -1270:2:1911 -1271:2:1912 -1272:2:1919 -1273:2:1923 -1274:2:1924 -1275:2:1931 -1276:2:1932 -1277:2:1949 -1278:2:1950 -1279:2:1953 -1280:2:1954 -1281:0:2227 -1282:2:1821 -1283:0:2227 -1284:2:1822 -1285:0:2227 -1286:2:1823 -1287:2:1827 -1288:2:1828 -1289:2:1835 -1290:2:1839 -1291:2:1840 -1292:2:1847 -1293:2:1851 -1294:2:1852 -1295:2:1859 -1296:2:1860 -1297:2:1877 -1298:2:1878 -1299:2:1881 -1300:2:1882 -1301:0:2227 -1302:2:1894 -1303:0:2227 -1304:1:149 -1305:1:153 -1306:1:154 -1307:1:161 -1308:1:165 -1309:1:166 -1310:1:173 -1311:1:177 -1312:1:178 -1313:1:185 -1314:1:186 -1315:1:196 -1316:1:197 -1317:1:207 -1318:1:208 -1319:0:2227 -1320:2:1895 -1321:2:1899 -1322:2:1900 -1323:2:1907 -1324:2:1911 -1325:2:1912 -1326:2:1919 -1327:2:1923 -1328:2:1924 -1329:2:1931 -1330:2:1932 -1331:2:1949 -1332:2:1950 -1333:2:1953 -1334:2:1954 -1335:0:2227 -1336:2:1821 -1337:0:2227 -1338:2:1822 -1339:0:2227 -1340:2:1823 -1341:2:1827 -1342:2:1828 -1343:2:1835 -1344:2:1839 -1345:2:1840 -1346:2:1847 -1347:2:1851 -1348:2:1852 -1349:2:1859 -1350:2:1860 -1351:2:1877 -1352:2:1878 -1353:2:1881 -1354:2:1882 -1355:0:2227 -1356:2:1894 -1357:0:2227 -1358:1:220 -1359:0:2227 -1360:1:373 -1361:0:2227 -1362:1:374 -1363:0:2227 -1364:1:3 -1365:0:2227 -1366:2:1895 -1367:2:1899 -1368:2:1900 -1369:2:1907 -1370:2:1911 -1371:2:1912 -1372:2:1919 -1373:2:1923 -1374:2:1924 -1375:2:1931 -1376:2:1932 -1377:2:1949 -1378:2:1950 -1379:2:1953 -1380:2:1954 -1381:0:2227 -1382:2:1821 -1383:0:2227 -1384:2:1822 -1385:0:2227 -1386:2:1823 -1387:2:1827 -1388:2:1828 -1389:2:1835 -1390:2:1839 -1391:2:1840 -1392:2:1847 -1393:2:1851 -1394:2:1852 -1395:2:1859 -1396:2:1860 -1397:2:1877 -1398:2:1878 -1399:2:1881 -1400:2:1882 -1401:0:2227 -1402:2:1894 -1403:0:2227 -1404:1:4 -1405:1:8 -1406:1:9 -1407:1:16 -1408:1:17 -1409:1:28 -1410:1:32 -1411:1:33 -1412:1:40 -1413:1:41 -1414:1:51 -1415:1:52 -1416:1:62 -1417:1:63 -1418:0:2227 -1419:2:1895 -1420:2:1899 -1421:2:1900 -1422:2:1907 -1423:2:1911 -1424:2:1912 -1425:2:1919 -1426:2:1923 -1427:2:1924 -1428:2:1931 -1429:2:1932 -1430:2:1949 -1431:2:1950 -1432:2:1953 -1433:2:1954 -1434:0:2227 -1435:2:1821 -1436:0:2227 -1437:2:1822 --1:-1:-1 -1438:0:2227 -1439:2:1823 -1440:2:1827 -1441:2:1828 -1442:2:1835 -1443:2:1839 -1444:2:1840 -1445:2:1847 -1446:2:1851 -1447:2:1852 -1448:2:1859 -1449:2:1860 -1450:2:1877 -1451:2:1878 -1452:2:1881 -1453:2:1882 -1454:0:2227 -1455:2:1894 -1456:0:2227 -1457:1:75 -1458:0:2227 -1459:2:1895 -1460:2:1899 -1461:2:1900 -1462:2:1907 -1463:2:1911 -1464:2:1912 -1465:2:1919 -1466:2:1923 -1467:2:1924 -1468:2:1931 -1469:2:1932 -1470:2:1949 -1471:2:1950 -1472:2:1953 -1473:2:1954 -1474:0:2227 -1475:2:1821 -1476:0:2227 -1477:2:1822 -1478:0:2227 -1479:2:1823 -1480:2:1827 -1481:2:1828 -1482:2:1835 -1483:2:1839 -1484:2:1840 -1485:2:1847 -1486:2:1851 -1487:2:1852 -1488:2:1859 -1489:2:1860 -1490:2:1877 -1491:2:1878 -1492:2:1881 -1493:2:1882 -1494:0:2227 -1495:2:1894 -1496:0:2227 -1497:1:76 -1498:1:80 -1499:1:81 -1500:1:88 -1501:1:92 -1502:1:93 -1503:1:100 -1504:1:104 -1505:1:105 -1506:1:112 -1507:1:113 -1508:1:123 -1509:1:124 -1510:1:134 -1511:1:135 -1512:0:2227 -1513:1:223 -1514:0:2227 -1515:2:1895 -1516:2:1899 -1517:2:1900 -1518:2:1907 -1519:2:1911 -1520:2:1912 -1521:2:1919 -1522:2:1923 -1523:2:1924 -1524:2:1931 -1525:2:1932 -1526:2:1949 -1527:2:1950 -1528:2:1953 -1529:2:1954 -1530:0:2227 -1531:2:1821 -1532:0:2227 -1533:2:1822 -1534:0:2227 -1535:2:1823 -1536:2:1827 -1537:2:1828 -1538:2:1835 -1539:2:1839 -1540:2:1840 -1541:2:1847 -1542:2:1851 -1543:2:1852 -1544:2:1859 -1545:2:1860 -1546:2:1877 -1547:2:1878 -1548:2:1881 -1549:2:1882 -1550:0:2227 -1551:2:1894 -1552:0:2227 -1553:1:224 -1554:0:2227 -1555:1:373 -1556:0:2227 -1557:1:374 -1558:0:2227 -1559:1:379 -1560:0:2227 -1561:2:1895 -1562:2:1899 -1563:2:1900 -1564:2:1907 -1565:2:1911 -1566:2:1912 -1567:2:1919 -1568:2:1923 -1569:2:1924 -1570:2:1931 -1571:2:1932 -1572:2:1949 -1573:2:1950 -1574:2:1953 -1575:2:1954 -1576:0:2227 -1577:2:1821 -1578:0:2227 -1579:2:1822 -1580:0:2227 -1581:2:1823 -1582:2:1827 -1583:2:1828 -1584:2:1835 -1585:2:1839 -1586:2:1840 -1587:2:1847 -1588:2:1851 -1589:2:1852 -1590:2:1859 -1591:2:1860 -1592:2:1877 -1593:2:1878 -1594:2:1881 -1595:2:1882 -1596:0:2227 -1597:2:1894 -1598:0:2227 -1599:1:384 -1600:1:388 -1601:1:389 -1602:1:396 -1603:1:397 -1604:1:408 -1605:1:412 -1606:1:413 -1607:1:420 -1608:1:421 -1609:1:431 -1610:1:432 -1611:1:442 -1612:1:443 -1613:0:2227 -1614:2:1895 -1615:2:1899 -1616:2:1900 -1617:2:1907 -1618:2:1911 -1619:2:1912 -1620:2:1919 -1621:2:1923 -1622:2:1924 -1623:2:1931 -1624:2:1932 -1625:2:1949 -1626:2:1950 -1627:2:1953 -1628:2:1954 -1629:0:2227 -1630:2:1821 -1631:0:2227 -1632:2:1822 -1633:0:2227 -1634:2:1823 -1635:2:1827 -1636:2:1828 -1637:2:1835 -1638:2:1839 -1639:2:1840 -1640:2:1847 -1641:2:1851 -1642:2:1852 -1643:2:1859 -1644:2:1860 -1645:2:1877 -1646:2:1878 -1647:2:1881 -1648:2:1882 -1649:0:2227 -1650:2:1894 -1651:0:2227 -1652:1:455 -1653:0:2227 -1654:2:1895 -1655:2:1899 -1656:2:1900 -1657:2:1907 -1658:2:1911 -1659:2:1912 -1660:2:1919 -1661:2:1923 -1662:2:1924 -1663:2:1931 -1664:2:1932 -1665:2:1949 -1666:2:1950 -1667:2:1953 -1668:2:1954 -1669:0:2227 -1670:2:1821 -1671:0:2227 -1672:2:1822 -1673:0:2227 -1674:2:1823 -1675:2:1827 -1676:2:1828 -1677:2:1835 -1678:2:1839 -1679:2:1840 -1680:2:1847 -1681:2:1851 -1682:2:1852 -1683:2:1859 -1684:2:1860 -1685:2:1877 -1686:2:1878 -1687:2:1881 -1688:2:1882 -1689:0:2227 -1690:2:1894 -1691:0:2227 -1692:1:456 -1693:1:460 -1694:1:461 -1695:1:468 -1696:1:472 -1697:1:473 -1698:1:480 -1699:1:484 -1700:1:485 -1701:1:492 -1702:1:493 -1703:1:503 -1704:1:504 -1705:1:514 -1706:1:515 -1707:0:2227 -1708:2:1895 -1709:2:1899 -1710:2:1900 -1711:2:1907 -1712:2:1911 -1713:2:1912 -1714:2:1919 -1715:2:1923 -1716:2:1924 -1717:2:1931 -1718:2:1932 -1719:2:1949 -1720:2:1950 -1721:2:1953 -1722:2:1954 -1723:0:2227 -1724:2:1821 -1725:0:2227 -1726:2:1822 -1727:0:2227 -1728:2:1823 -1729:2:1827 -1730:2:1828 -1731:2:1835 -1732:2:1839 -1733:2:1840 -1734:2:1847 -1735:2:1851 -1736:2:1852 -1737:2:1859 -1738:2:1860 -1739:2:1877 -1740:2:1878 -1741:2:1881 -1742:2:1882 -1743:0:2227 -1744:2:1894 -1745:0:2227 -1746:1:527 -1747:0:2227 -1748:2:1895 -1749:2:1899 -1750:2:1900 -1751:2:1907 -1752:2:1911 -1753:2:1912 -1754:2:1919 -1755:2:1923 -1756:2:1924 -1757:2:1931 -1758:2:1932 -1759:2:1949 -1760:2:1950 -1761:2:1953 -1762:2:1954 -1763:0:2227 -1764:2:1821 -1765:0:2227 -1766:2:1822 -1767:0:2227 -1768:2:1823 -1769:2:1827 -1770:2:1828 -1771:2:1835 -1772:2:1839 -1773:2:1840 -1774:2:1847 -1775:2:1851 -1776:2:1852 -1777:2:1859 -1778:2:1860 -1779:2:1877 -1780:2:1878 -1781:2:1881 -1782:2:1882 -1783:0:2227 -1784:2:1894 -1785:0:2227 -1786:1:528 -1787:1:532 -1788:1:533 -1789:1:540 -1790:1:544 -1791:1:545 -1792:1:552 -1793:1:556 -1794:1:557 -1795:1:564 -1796:1:565 -1797:1:575 -1798:1:576 -1799:1:586 -1800:1:587 -1801:0:2227 -1802:2:1895 -1803:2:1899 -1804:2:1900 -1805:2:1907 -1806:2:1911 -1807:2:1912 -1808:2:1919 -1809:2:1923 -1810:2:1924 -1811:2:1931 -1812:2:1932 -1813:2:1949 -1814:2:1950 -1815:2:1953 -1816:2:1954 -1817:0:2227 -1818:2:1821 -1819:0:2227 -1820:2:1822 -1821:0:2227 -1822:2:1823 -1823:2:1827 -1824:2:1828 -1825:2:1835 -1826:2:1839 -1827:2:1840 -1828:2:1847 -1829:2:1851 -1830:2:1852 -1831:2:1859 -1832:2:1860 -1833:2:1877 -1834:2:1878 -1835:2:1881 -1836:2:1882 -1837:0:2227 -1838:2:1894 -1839:0:2227 -1840:1:599 -1841:0:2227 -1842:1:600 -1843:0:2227 -1844:1:601 -1845:0:2227 -1846:1:746 -1847:0:2227 -1848:1:747 -1849:0:2227 -1850:2:1895 -1851:2:1899 -1852:2:1900 -1853:2:1907 -1854:2:1911 -1855:2:1912 -1856:2:1919 -1857:2:1923 -1858:2:1924 -1859:2:1931 -1860:2:1932 -1861:2:1949 -1862:2:1950 -1863:2:1953 -1864:2:1954 -1865:0:2227 -1866:2:1821 -1867:0:2227 -1868:2:1822 -1869:0:2227 -1870:2:1823 -1871:2:1827 -1872:2:1828 -1873:2:1835 -1874:2:1839 -1875:2:1840 -1876:2:1847 -1877:2:1851 -1878:2:1852 -1879:2:1859 -1880:2:1860 -1881:2:1877 -1882:2:1878 -1883:2:1881 -1884:2:1882 -1885:0:2227 -1886:2:1894 -1887:0:2227 -1888:1:751 -1889:0:2227 -1890:2:1895 -1891:2:1899 -1892:2:1900 -1893:2:1907 -1894:2:1911 -1895:2:1912 -1896:2:1919 -1897:2:1923 -1898:2:1924 -1899:2:1931 -1900:2:1932 -1901:2:1949 -1902:2:1950 -1903:2:1953 -1904:2:1954 -1905:0:2227 -1906:2:1821 -1907:0:2227 -1908:2:1822 -1909:0:2227 -1910:2:1823 -1911:2:1827 -1912:2:1828 -1913:2:1835 -1914:2:1839 -1915:2:1840 -1916:2:1847 -1917:2:1851 -1918:2:1852 -1919:2:1859 -1920:2:1860 -1921:2:1877 -1922:2:1878 -1923:2:1881 -1924:2:1882 -1925:0:2227 -1926:2:1894 -1927:0:2227 -1928:1:752 -1929:1:756 -1930:1:757 -1931:1:764 -1932:1:768 -1933:1:769 -1934:1:776 -1935:1:780 -1936:1:781 -1937:1:788 -1938:1:789 -1939:1:799 -1940:1:800 -1941:1:810 -1942:1:811 -1943:0:2227 -1944:2:1895 -1945:2:1899 -1946:2:1900 -1947:2:1907 -1948:2:1911 -1949:2:1912 -1950:2:1919 -1951:2:1923 -1952:2:1924 -1953:2:1931 -1954:2:1932 -1955:2:1949 -1956:2:1950 -1957:2:1953 -1958:2:1954 -1959:0:2227 -1960:2:1821 -1961:0:2227 -1962:2:1822 -1963:0:2227 -1964:2:1823 -1965:2:1827 -1966:2:1828 -1967:2:1835 -1968:2:1839 -1969:2:1840 -1970:2:1847 -1971:2:1851 -1972:2:1852 -1973:2:1859 -1974:2:1860 -1975:2:1877 -1976:2:1878 -1977:2:1881 -1978:2:1882 -1979:0:2227 -1980:2:1894 -1981:0:2227 -1982:1:823 -1983:0:2227 -1984:1:601 -1985:0:2227 -1986:1:746 -1987:0:2227 -1988:1:747 -1989:0:2227 -1990:2:1895 -1991:2:1899 -1992:2:1900 -1993:2:1907 -1994:2:1911 -1995:2:1912 -1996:2:1919 -1997:2:1923 -1998:2:1924 -1999:2:1931 -2000:2:1932 -2001:2:1949 -2002:2:1950 -2003:2:1953 -2004:2:1954 -2005:0:2227 -2006:2:1821 -2007:0:2227 -2008:2:1822 -2009:0:2227 -2010:2:1823 -2011:2:1827 -2012:2:1828 -2013:2:1835 -2014:2:1839 -2015:2:1840 -2016:2:1847 -2017:2:1851 -2018:2:1852 -2019:2:1859 -2020:2:1860 -2021:2:1877 -2022:2:1878 -2023:2:1881 -2024:2:1882 -2025:0:2227 -2026:2:1894 -2027:0:2227 -2028:1:751 -2029:0:2227 -2030:2:1895 -2031:2:1899 -2032:2:1900 -2033:2:1907 -2034:2:1911 -2035:2:1912 -2036:2:1919 -2037:2:1923 -2038:2:1924 -2039:2:1931 -2040:2:1932 -2041:2:1949 -2042:2:1950 -2043:2:1953 -2044:2:1954 -2045:0:2227 -2046:2:1821 -2047:0:2227 -2048:2:1822 -2049:0:2227 -2050:2:1823 -2051:2:1827 -2052:2:1828 -2053:2:1835 -2054:2:1839 -2055:2:1840 -2056:2:1847 -2057:2:1851 -2058:2:1852 -2059:2:1859 -2060:2:1860 -2061:2:1877 -2062:2:1878 -2063:2:1881 -2064:2:1882 -2065:0:2227 -2066:2:1894 -2067:0:2227 -2068:1:752 -2069:1:756 -2070:1:757 -2071:1:764 -2072:1:765 -2073:1:776 -2074:1:780 -2075:1:781 -2076:1:788 -2077:1:789 -2078:1:799 -2079:1:800 -2080:1:810 -2081:1:811 -2082:0:2227 -2083:2:1895 -2084:2:1899 -2085:2:1900 -2086:2:1907 -2087:2:1911 -2088:2:1912 -2089:2:1919 -2090:2:1923 -2091:2:1924 -2092:2:1931 -2093:2:1932 -2094:2:1949 -2095:2:1950 -2096:2:1953 -2097:2:1954 -2098:0:2227 -2099:2:1821 -2100:0:2227 -2101:2:1822 -2102:0:2227 -2103:2:1823 -2104:2:1827 -2105:2:1828 -2106:2:1835 -2107:2:1839 -2108:2:1840 -2109:2:1847 -2110:2:1851 -2111:2:1852 -2112:2:1859 -2113:2:1860 -2114:2:1877 -2115:2:1878 -2116:2:1881 -2117:2:1882 -2118:0:2227 -2119:2:1894 -2120:0:2227 -2121:1:823 -2122:0:2227 -2123:1:827 -2124:0:2227 -2125:2:1895 -2126:2:1899 -2127:2:1900 -2128:2:1907 -2129:2:1911 -2130:2:1912 -2131:2:1919 -2132:2:1923 -2133:2:1924 -2134:2:1931 -2135:2:1932 -2136:2:1949 -2137:2:1950 -2138:2:1953 -2139:2:1954 -2140:0:2227 -2141:2:1821 -2142:0:2227 -2143:2:1822 -2144:0:2227 -2145:2:1823 -2146:2:1827 -2147:2:1828 -2148:2:1835 -2149:2:1839 -2150:2:1840 -2151:2:1847 -2152:2:1851 -2153:2:1852 -2154:2:1859 -2155:2:1860 -2156:2:1877 -2157:2:1878 -2158:2:1881 -2159:2:1882 -2160:0:2227 -2161:2:1894 -2162:0:2227 -2163:1:832 -2164:1:836 -2165:1:837 -2166:1:844 -2167:1:845 -2168:1:856 -2169:1:860 -2170:1:861 -2171:1:868 -2172:1:869 -2173:1:879 -2174:1:880 -2175:1:890 -2176:1:891 -2177:0:2227 -2178:1:1 -2179:0:2227 -2180:1:2 -2181:0:2227 -2182:1:3 -2183:0:2227 -2184:2:1895 -2185:2:1899 -2186:2:1900 -2187:2:1907 -2188:2:1911 -2189:2:1912 -2190:2:1919 -2191:2:1923 -2192:2:1924 -2193:2:1931 -2194:2:1932 -2195:2:1949 -2196:2:1950 -2197:2:1953 -2198:2:1954 -2199:0:2227 -2200:2:1821 -2201:0:2227 -2202:2:1822 -2203:0:2227 -2204:2:1823 -2205:2:1827 -2206:2:1828 -2207:2:1835 -2208:2:1839 -2209:2:1840 -2210:2:1847 -2211:2:1851 -2212:2:1852 -2213:2:1859 -2214:2:1860 -2215:2:1877 -2216:2:1878 -2217:2:1881 -2218:2:1882 -2219:0:2227 -2220:2:1894 -2221:0:2227 -2222:1:4 -2223:1:8 -2224:1:9 -2225:1:16 -2226:1:20 -2227:1:21 -2228:1:28 -2229:1:32 -2230:1:33 -2231:1:40 -2232:1:41 -2233:1:51 -2234:1:52 -2235:1:62 -2236:1:63 -2237:0:2227 -2238:2:1895 -2239:2:1899 -2240:2:1900 -2241:2:1907 -2242:2:1911 -2243:2:1912 -2244:2:1919 -2245:2:1923 -2246:2:1924 -2247:2:1931 -2248:2:1932 -2249:2:1949 -2250:2:1950 -2251:2:1953 -2252:2:1954 -2253:0:2227 -2254:2:1821 -2255:0:2227 -2256:2:1822 -2257:0:2227 -2258:2:1823 -2259:2:1827 -2260:2:1828 -2261:2:1835 -2262:2:1839 -2263:2:1840 -2264:2:1847 -2265:2:1851 -2266:2:1852 -2267:2:1859 -2268:2:1860 -2269:2:1877 -2270:2:1878 -2271:2:1881 -2272:2:1882 -2273:0:2227 -2274:2:1894 -2275:0:2227 -2276:1:75 -2277:0:2227 -2278:2:1895 -2279:2:1899 -2280:2:1900 -2281:2:1907 -2282:2:1911 -2283:2:1912 -2284:2:1919 -2285:2:1923 -2286:2:1924 -2287:2:1931 -2288:2:1932 -2289:2:1949 -2290:2:1950 -2291:2:1953 -2292:2:1954 -2293:0:2227 -2294:2:1821 -2295:0:2227 -2296:2:1822 -2297:0:2227 -2298:2:1823 -2299:2:1827 -2300:2:1828 -2301:2:1835 -2302:2:1839 -2303:2:1840 -2304:2:1847 -2305:2:1851 -2306:2:1852 -2307:2:1859 -2308:2:1860 -2309:2:1877 -2310:2:1878 -2311:2:1881 -2312:2:1882 -2313:0:2227 -2314:2:1894 -2315:0:2227 -2316:1:76 -2317:1:80 -2318:1:81 -2319:1:88 -2320:1:92 -2321:1:93 -2322:1:100 -2323:1:104 -2324:1:105 -2325:1:112 -2326:1:113 -2327:1:123 -2328:1:124 -2329:1:134 -2330:1:135 -2331:0:2227 -2332:1:147 -2333:0:2227 -2334:2:1895 -2335:2:1899 -2336:2:1900 -2337:2:1907 -2338:2:1911 -2339:2:1912 -2340:2:1919 -2341:2:1923 -2342:2:1924 -2343:2:1931 -2344:2:1932 -2345:2:1949 -2346:2:1950 -2347:2:1953 -2348:2:1954 -2349:0:2227 -2350:2:1821 -2351:0:2227 -2352:2:1822 -2353:0:2227 -2354:2:1823 -2355:2:1827 -2356:2:1828 -2357:2:1835 -2358:2:1839 -2359:2:1840 -2360:2:1847 -2361:2:1851 -2362:2:1852 -2363:2:1859 -2364:2:1860 -2365:2:1877 -2366:2:1878 -2367:2:1881 -2368:2:1882 -2369:0:2227 -2370:2:1894 -2371:0:2227 -2372:1:148 -2373:0:2227 -2374:2:1895 -2375:2:1899 -2376:2:1900 -2377:2:1907 -2378:2:1911 -2379:2:1912 -2380:2:1919 -2381:2:1923 -2382:2:1924 -2383:2:1931 -2384:2:1932 -2385:2:1949 -2386:2:1950 -2387:2:1953 -2388:2:1954 -2389:0:2227 -2390:2:1821 -2391:0:2227 -2392:2:1822 -2393:0:2227 -2394:2:1823 -2395:2:1827 -2396:2:1828 -2397:2:1835 -2398:2:1839 -2399:2:1840 -2400:2:1847 -2401:2:1851 -2402:2:1852 -2403:2:1859 -2404:2:1860 -2405:2:1877 -2406:2:1878 -2407:2:1881 -2408:2:1882 -2409:0:2227 -2410:2:1894 -2411:0:2227 -2412:1:149 -2413:1:153 -2414:1:154 -2415:1:161 -2416:1:165 -2417:1:166 -2418:1:173 -2419:1:177 -2420:1:178 -2421:1:185 -2422:1:186 -2423:1:196 -2424:1:197 -2425:1:207 -2426:1:208 -2427:0:2227 -2428:2:1895 -2429:2:1899 -2430:2:1900 -2431:2:1907 -2432:2:1911 -2433:2:1912 -2434:2:1919 -2435:2:1923 -2436:2:1924 -2437:2:1931 -2438:2:1932 -2439:2:1949 -2440:2:1950 -2441:2:1953 -2442:2:1954 -2443:0:2227 -2444:2:1821 -2445:0:2227 -2446:2:1822 -2447:0:2227 -2448:2:1823 -2449:2:1827 -2450:2:1828 -2451:2:1835 -2452:2:1839 -2453:2:1840 -2454:2:1847 -2455:2:1851 -2456:2:1852 -2457:2:1859 -2458:2:1860 -2459:2:1877 -2460:2:1878 -2461:2:1881 -2462:2:1882 -2463:0:2227 -2464:2:1894 -2465:0:2227 -2466:1:220 -2467:0:2227 -2468:1:373 -2469:0:2227 -2470:1:374 -2471:0:2227 -2472:1:3 -2473:0:2227 -2474:2:1895 -2475:2:1899 -2476:2:1900 -2477:2:1907 -2478:2:1911 -2479:2:1912 -2480:2:1919 -2481:2:1923 -2482:2:1924 -2483:2:1931 -2484:2:1932 -2485:2:1949 -2486:2:1950 -2487:2:1953 -2488:2:1954 -2489:0:2227 -2490:2:1821 -2491:0:2227 -2492:2:1822 -2493:0:2227 -2494:2:1823 -2495:2:1827 -2496:2:1828 -2497:2:1835 -2498:2:1839 -2499:2:1840 -2500:2:1847 -2501:2:1851 -2502:2:1852 -2503:2:1859 -2504:2:1860 -2505:2:1877 -2506:2:1878 -2507:2:1881 -2508:2:1882 -2509:0:2227 -2510:2:1894 -2511:0:2227 -2512:1:4 -2513:1:8 -2514:1:9 -2515:1:24 -2516:1:25 -2517:1:28 -2518:1:32 -2519:1:33 -2520:1:40 -2521:1:41 -2522:1:51 -2523:1:54 -2524:1:55 -2525:1:62 -2526:1:63 -2527:0:2227 -2528:2:1895 -2529:2:1899 -2530:2:1900 -2531:2:1907 -2532:2:1911 -2533:2:1912 -2534:2:1919 -2535:2:1923 -2536:2:1924 -2537:2:1931 -2538:2:1932 -2539:2:1949 -2540:2:1950 -2541:2:1953 -2542:2:1954 -2543:0:2227 -2544:2:1821 -2545:0:2227 -2546:2:1822 -2547:0:2227 -2548:2:1823 -2549:2:1827 -2550:2:1828 -2551:2:1835 -2552:2:1839 -2553:2:1840 -2554:2:1847 -2555:2:1851 -2556:2:1852 -2557:2:1859 -2558:2:1860 -2559:2:1877 -2560:2:1878 -2561:2:1881 -2562:2:1882 -2563:0:2227 -2564:2:1894 -2565:0:2227 -2566:1:75 -2567:0:2227 -2568:2:1895 -2569:2:1899 -2570:2:1900 -2571:2:1907 -2572:2:1911 -2573:2:1912 -2574:2:1919 -2575:2:1923 -2576:2:1924 -2577:2:1931 -2578:2:1932 -2579:2:1949 -2580:2:1950 -2581:2:1953 -2582:2:1954 -2583:0:2227 -2584:2:1821 -2585:0:2227 -2586:2:1822 -2587:0:2227 -2588:2:1823 -2589:2:1827 -2590:2:1828 -2591:2:1835 -2592:2:1839 -2593:2:1840 -2594:2:1847 -2595:2:1851 -2596:2:1852 -2597:2:1859 -2598:2:1860 -2599:2:1877 -2600:2:1878 -2601:2:1881 -2602:2:1882 -2603:0:2227 -2604:2:1894 -2605:0:2227 -2606:1:76 -2607:1:80 -2608:1:81 -2609:1:96 -2610:1:97 -2611:1:100 -2612:1:104 -2613:1:105 -2614:1:112 -2615:1:113 -2616:1:123 -2617:1:126 -2618:1:127 -2619:1:134 -2620:1:135 -2621:0:2227 -2622:1:223 -2623:0:2227 -2624:2:1895 -2625:2:1899 -2626:2:1900 -2627:2:1907 -2628:2:1911 -2629:2:1912 -2630:2:1919 -2631:2:1923 -2632:2:1924 -2633:2:1931 -2634:2:1932 -2635:2:1949 -2636:2:1950 -2637:2:1953 -2638:2:1954 -2639:0:2227 -2640:2:1821 -2641:0:2227 -2642:2:1822 -2643:0:2227 -2644:2:1823 -2645:2:1827 -2646:2:1828 -2647:2:1835 -2648:2:1839 -2649:2:1840 -2650:2:1847 -2651:2:1851 -2652:2:1852 -2653:2:1859 -2654:2:1860 -2655:2:1877 -2656:2:1878 -2657:2:1881 -2658:2:1882 -2659:0:2227 -2660:2:1894 -2661:0:2227 -2662:1:224 -2663:0:2227 -2664:1:373 -2665:0:2227 -2666:1:374 -2667:0:2227 -2668:1:379 -2669:0:2227 -2670:2:1895 -2671:2:1899 -2672:2:1900 -2673:2:1907 -2674:2:1911 -2675:2:1912 -2676:2:1919 -2677:2:1923 -2678:2:1924 -2679:2:1931 -2680:2:1932 -2681:2:1949 -2682:2:1950 -2683:2:1953 -2684:2:1954 -2685:0:2227 -2686:2:1821 -2687:0:2227 -2688:2:1822 -2689:0:2227 -2690:2:1823 -2691:2:1827 -2692:2:1828 -2693:2:1835 -2694:2:1839 -2695:2:1840 -2696:2:1847 -2697:2:1851 -2698:2:1852 -2699:2:1859 -2700:2:1860 -2701:2:1877 -2702:2:1878 -2703:2:1881 -2704:2:1882 -2705:0:2227 -2706:2:1894 -2707:0:2227 -2708:1:384 -2709:1:388 -2710:1:389 -2711:1:404 -2712:1:405 -2713:1:408 -2714:1:412 -2715:1:413 -2716:1:420 -2717:1:421 -2718:1:431 -2719:1:434 -2720:1:435 -2721:1:442 -2722:1:443 -2723:0:2227 -2724:2:1895 -2725:2:1899 -2726:2:1900 -2727:2:1907 -2728:2:1911 -2729:2:1912 -2730:2:1919 -2731:2:1923 -2732:2:1924 -2733:2:1931 -2734:2:1932 -2735:2:1949 -2736:2:1950 -2737:2:1953 -2738:2:1954 -2739:0:2227 -2740:2:1821 -2741:0:2227 -2742:2:1822 -2743:0:2227 -2744:2:1823 -2745:2:1827 -2746:2:1828 -2747:2:1835 -2748:2:1839 -2749:2:1840 -2750:2:1847 -2751:2:1851 -2752:2:1852 -2753:2:1859 -2754:2:1860 -2755:2:1877 -2756:2:1878 -2757:2:1881 -2758:2:1882 -2759:0:2227 -2760:2:1894 -2761:0:2227 -2762:1:455 -2763:0:2227 -2764:2:1895 -2765:2:1899 -2766:2:1900 -2767:2:1907 -2768:2:1911 -2769:2:1912 -2770:2:1919 -2771:2:1923 -2772:2:1924 -2773:2:1931 -2774:2:1932 -2775:2:1949 -2776:2:1950 -2777:2:1953 -2778:2:1954 -2779:0:2227 -2780:2:1821 -2781:0:2227 -2782:2:1822 -2783:0:2227 -2784:2:1823 -2785:2:1827 -2786:2:1828 -2787:2:1835 -2788:2:1839 -2789:2:1840 -2790:2:1847 -2791:2:1851 -2792:2:1852 -2793:2:1859 -2794:2:1860 -2795:2:1877 -2796:2:1878 -2797:2:1881 -2798:2:1882 -2799:0:2227 -2800:2:1894 -2801:0:2227 -2802:1:456 -2803:1:460 -2804:1:461 -2805:1:476 -2806:1:477 -2807:1:480 -2808:1:484 -2809:1:485 -2810:1:492 -2811:1:493 -2812:1:503 -2813:1:506 -2814:1:507 -2815:1:514 -2816:1:515 -2817:0:2227 -2818:2:1895 -2819:2:1899 -2820:2:1900 -2821:2:1907 -2822:2:1911 -2823:2:1912 -2824:2:1919 -2825:2:1923 -2826:2:1924 -2827:2:1931 -2828:2:1932 -2829:2:1949 -2830:2:1950 -2831:2:1953 -2832:2:1954 -2833:0:2227 -2834:2:1821 -2835:0:2227 -2836:2:1822 -2837:0:2227 -2838:2:1823 -2839:2:1827 -2840:2:1828 -2841:2:1835 -2842:2:1839 -2843:2:1840 -2844:2:1847 -2845:2:1851 -2846:2:1852 -2847:2:1859 -2848:2:1860 -2849:2:1877 -2850:2:1878 -2851:2:1881 -2852:2:1882 -2853:0:2227 -2854:2:1894 -2855:0:2227 -2856:1:527 -2857:0:2227 -2858:2:1895 -2859:2:1899 -2860:2:1900 -2861:2:1907 -2862:2:1911 -2863:2:1912 -2864:2:1919 -2865:2:1923 -2866:2:1924 -2867:2:1931 -2868:2:1932 -2869:2:1949 -2870:2:1950 -2871:2:1953 -2872:2:1954 -2873:0:2227 -2874:2:1821 -2875:0:2227 -2876:2:1822 -2877:0:2227 -2878:2:1823 -2879:2:1827 -2880:2:1828 -2881:2:1835 -2882:2:1839 -2883:2:1840 -2884:2:1847 -2885:2:1851 -2886:2:1852 -2887:2:1859 -2888:2:1860 -2889:2:1877 -2890:2:1878 -2891:2:1881 -2892:2:1882 -2893:0:2227 -2894:2:1894 -2895:0:2227 -2896:1:528 -2897:1:532 -2898:1:533 -2899:1:548 -2900:1:549 -2901:1:552 -2902:1:556 -2903:1:557 -2904:1:564 -2905:1:565 -2906:1:575 -2907:1:578 -2908:1:579 -2909:1:586 -2910:1:587 -2911:0:2227 -2912:2:1895 -2913:2:1899 -2914:2:1900 -2915:2:1907 -2916:2:1911 -2917:2:1912 -2918:2:1919 -2919:2:1923 -2920:2:1924 -2921:2:1931 -2922:2:1932 -2923:2:1949 -2924:2:1950 -2925:2:1953 -2926:2:1954 -2927:0:2227 -2928:2:1821 -2929:0:2227 -2930:2:1822 -2931:0:2227 -2932:2:1823 -2933:2:1827 -2934:2:1828 -2935:2:1835 -2936:2:1839 -2937:2:1840 -2938:2:1847 -2939:2:1851 -2940:2:1852 -2941:2:1859 -2942:2:1860 -2943:2:1877 -2944:2:1878 -2945:2:1881 -2946:2:1882 -2947:0:2227 -2948:2:1894 -2949:0:2227 -2950:1:599 -2951:0:2227 -2952:1:600 -2953:0:2227 -2954:1:601 -2955:0:2227 -2956:1:746 -2957:0:2227 -2958:1:747 -2959:0:2227 -2960:2:1895 -2961:2:1899 -2962:2:1900 -2963:2:1907 -2964:2:1911 -2965:2:1912 -2966:2:1919 -2967:2:1923 -2968:2:1924 -2969:2:1931 -2970:2:1932 -2971:2:1949 -2972:2:1950 -2973:2:1953 -2974:2:1954 -2975:0:2227 -2976:2:1821 -2977:0:2227 -2978:2:1822 -2979:0:2227 -2980:2:1823 -2981:2:1827 -2982:2:1828 -2983:2:1835 -2984:2:1839 -2985:2:1840 -2986:2:1847 -2987:2:1851 -2988:2:1852 -2989:2:1859 -2990:2:1860 -2991:2:1877 -2992:2:1878 -2993:2:1881 -2994:2:1882 -2995:0:2227 -2996:2:1894 -2997:0:2227 -2998:1:751 -2999:0:2227 -3000:2:1895 -3001:2:1899 -3002:2:1900 -3003:2:1907 -3004:2:1911 -3005:2:1912 -3006:2:1919 -3007:2:1923 -3008:2:1924 -3009:2:1931 -3010:2:1932 -3011:2:1949 -3012:2:1950 -3013:2:1953 -3014:2:1954 -3015:0:2227 -3016:2:1821 -3017:0:2227 -3018:2:1822 -3019:0:2227 -3020:2:1823 -3021:2:1827 -3022:2:1828 -3023:2:1835 -3024:2:1839 -3025:2:1840 -3026:2:1847 -3027:2:1851 -3028:2:1852 -3029:2:1859 -3030:2:1860 -3031:2:1877 -3032:2:1878 -3033:2:1881 -3034:2:1882 -3035:0:2227 -3036:2:1894 -3037:0:2227 -3038:1:752 -3039:1:756 -3040:1:757 -3041:1:772 -3042:1:773 -3043:1:776 -3044:1:780 -3045:1:781 -3046:1:788 -3047:1:789 -3048:1:799 -3049:1:802 -3050:1:803 -3051:1:810 -3052:1:811 -3053:0:2227 -3054:2:1895 -3055:2:1899 -3056:2:1900 -3057:2:1907 -3058:2:1911 -3059:2:1912 -3060:2:1919 -3061:2:1923 -3062:2:1924 -3063:2:1931 -3064:2:1932 -3065:2:1949 -3066:2:1950 -3067:2:1953 -3068:2:1954 -3069:0:2227 -3070:2:1821 -3071:0:2227 -3072:2:1822 -3073:0:2227 -3074:2:1823 -3075:2:1827 -3076:2:1828 -3077:2:1835 -3078:2:1839 -3079:2:1840 -3080:2:1847 -3081:2:1851 -3082:2:1852 -3083:2:1859 -3084:2:1860 -3085:2:1877 -3086:2:1878 -3087:2:1881 -3088:2:1882 -3089:0:2227 -3090:2:1894 -3091:0:2227 -3092:1:823 -3093:0:2227 -3094:1:601 -3095:0:2227 -3096:1:746 -3097:0:2227 -3098:1:747 -3099:0:2227 -3100:2:1895 -3101:2:1899 -3102:2:1900 -3103:2:1907 -3104:2:1911 -3105:2:1912 -3106:2:1919 -3107:2:1923 -3108:2:1924 -3109:2:1931 -3110:2:1932 -3111:2:1949 -3112:2:1950 -3113:2:1953 -3114:2:1954 -3115:0:2227 -3116:2:1821 -3117:0:2227 -3118:2:1822 -3119:0:2227 -3120:2:1823 -3121:2:1827 -3122:2:1828 -3123:2:1835 -3124:2:1839 -3125:2:1840 -3126:2:1847 -3127:2:1851 -3128:2:1852 -3129:2:1859 -3130:2:1860 -3131:2:1877 -3132:2:1878 -3133:2:1881 -3134:2:1882 -3135:0:2227 -3136:2:1894 -3137:0:2227 -3138:1:751 -3139:0:2227 -3140:2:1895 -3141:2:1899 -3142:2:1900 -3143:2:1907 -3144:2:1911 -3145:2:1912 -3146:2:1919 -3147:2:1923 -3148:2:1924 -3149:2:1931 -3150:2:1932 -3151:2:1949 -3152:2:1950 -3153:2:1953 -3154:2:1954 -3155:0:2227 -3156:2:1821 -3157:0:2227 -3158:2:1822 -3159:0:2227 -3160:2:1823 -3161:2:1827 -3162:2:1828 -3163:2:1835 -3164:2:1839 -3165:2:1840 -3166:2:1847 -3167:2:1851 -3168:2:1852 -3169:2:1859 -3170:2:1860 -3171:2:1877 -3172:2:1878 -3173:2:1881 -3174:2:1882 -3175:0:2227 -3176:2:1894 -3177:0:2227 -3178:1:752 -3179:1:756 -3180:1:757 -3181:1:772 -3182:1:773 -3183:1:776 -3184:1:780 -3185:1:781 -3186:1:788 -3187:1:789 -3188:1:799 -3189:1:802 -3190:1:803 -3191:1:810 -3192:1:811 -3193:0:2227 -3194:2:1895 -3195:2:1899 -3196:2:1900 -3197:2:1907 -3198:2:1911 -3199:2:1912 -3200:2:1919 -3201:2:1923 -3202:2:1924 -3203:2:1931 -3204:2:1932 -3205:2:1949 -3206:2:1950 -3207:2:1953 -3208:2:1954 -3209:0:2227 -3210:2:1821 -3211:0:2227 -3212:2:1822 -3213:0:2227 -3214:2:1823 -3215:2:1827 -3216:2:1828 -3217:2:1835 -3218:2:1839 -3219:2:1840 -3220:2:1847 -3221:2:1851 -3222:2:1852 -3223:2:1859 -3224:2:1860 -3225:2:1877 -3226:2:1878 -3227:2:1881 -3228:2:1882 -3229:0:2227 -3230:2:1894 -3231:0:2227 -3232:1:823 -3233:0:2227 -3234:1:827 -3235:0:2227 -3236:2:1895 -3237:2:1899 -3238:2:1900 -3239:2:1907 -3240:2:1911 -3241:2:1912 -3242:2:1919 -3243:2:1923 -3244:2:1924 -3245:2:1931 -3246:2:1932 -3247:2:1949 -3248:2:1950 -3249:2:1953 -3250:2:1954 -3251:0:2227 -3252:2:1821 -3253:0:2227 -3254:2:1822 -3255:0:2227 -3256:2:1823 -3257:2:1827 -3258:2:1828 -3259:2:1835 -3260:2:1839 -3261:2:1840 -3262:2:1847 -3263:2:1851 -3264:2:1852 -3265:2:1859 -3266:2:1860 -3267:2:1877 -3268:2:1878 -3269:2:1881 -3270:2:1882 -3271:0:2227 -3272:2:1894 -3273:0:2227 -3274:1:832 -3275:1:836 -3276:1:837 -3277:1:852 -3278:1:853 -3279:1:856 -3280:1:860 -3281:1:861 -3282:1:868 -3283:1:869 -3284:1:879 -3285:1:882 -3286:1:883 -3287:1:890 -3288:1:891 -3289:0:2227 -3290:1:1 -3291:0:2227 -3292:1:2 -3293:0:2227 -3294:1:3 -3295:0:2227 -3296:2:1895 -3297:2:1899 -3298:2:1900 -3299:2:1907 -3300:2:1911 -3301:2:1912 -3302:2:1919 -3303:2:1923 -3304:2:1924 -3305:2:1931 -3306:2:1932 -3307:2:1949 -3308:2:1950 -3309:2:1953 -3310:2:1954 -3311:0:2227 -3312:2:1821 -3313:0:2227 -3314:2:1822 -3315:0:2227 -3316:2:1823 -3317:2:1827 -3318:2:1828 -3319:2:1835 -3320:2:1839 -3321:2:1840 -3322:2:1847 -3323:2:1851 -3324:2:1852 -3325:2:1859 -3326:2:1860 -3327:2:1877 -3328:2:1878 -3329:2:1881 -3330:2:1882 -3331:0:2227 -3332:2:1894 -3333:0:2227 -3334:1:4 -3335:1:8 -3336:1:9 -3337:1:24 -3338:1:25 -3339:1:28 -3340:1:32 -3341:1:33 -3342:1:40 -3343:1:41 -3344:1:51 -3345:1:54 -3346:1:55 -3347:1:62 -3348:1:63 -3349:0:2227 -3350:2:1895 -3351:2:1899 -3352:2:1900 -3353:2:1907 -3354:2:1911 -3355:2:1912 -3356:2:1919 -3357:2:1923 -3358:2:1924 -3359:2:1931 -3360:2:1932 -3361:2:1949 -3362:2:1950 -3363:2:1953 -3364:2:1954 -3365:0:2227 -3366:2:1821 -3367:0:2227 -3368:2:1822 -3369:0:2227 -3370:2:1823 -3371:2:1827 -3372:2:1828 -3373:2:1835 -3374:2:1839 -3375:2:1840 -3376:2:1847 -3377:2:1851 -3378:2:1852 -3379:2:1859 -3380:2:1860 -3381:2:1877 -3382:2:1878 -3383:2:1881 -3384:2:1882 -3385:0:2227 -3386:2:1894 -3387:0:2227 -3388:1:75 -3389:0:2227 -3390:2:1895 -3391:2:1899 -3392:2:1900 -3393:2:1907 -3394:2:1911 -3395:2:1912 -3396:2:1919 -3397:2:1923 -3398:2:1924 -3399:2:1931 -3400:2:1932 -3401:2:1949 -3402:2:1950 -3403:2:1953 -3404:2:1954 -3405:0:2227 -3406:2:1821 -3407:0:2227 -3408:2:1822 -3409:0:2227 -3410:2:1823 -3411:2:1827 -3412:2:1828 -3413:2:1835 -3414:2:1839 -3415:2:1840 -3416:2:1847 -3417:2:1851 -3418:2:1852 -3419:2:1859 -3420:2:1860 -3421:2:1877 -3422:2:1878 -3423:2:1881 -3424:2:1882 -3425:0:2227 -3426:2:1894 -3427:0:2227 -3428:1:76 -3429:1:80 -3430:1:81 -3431:1:96 -3432:1:97 -3433:1:100 -3434:1:104 -3435:1:105 -3436:1:112 -3437:1:113 -3438:1:123 -3439:1:126 -3440:1:127 -3441:1:134 -3442:1:135 -3443:0:2227 -3444:1:147 -3445:0:2227 -3446:2:1895 -3447:2:1899 -3448:2:1900 -3449:2:1907 -3450:2:1911 -3451:2:1912 -3452:2:1919 -3453:2:1923 -3454:2:1924 -3455:2:1931 -3456:2:1932 -3457:2:1949 -3458:2:1950 -3459:2:1953 -3460:2:1954 -3461:0:2227 -3462:2:1821 -3463:0:2227 -3464:2:1822 -3465:0:2227 -3466:2:1823 -3467:2:1827 -3468:2:1828 -3469:2:1835 -3470:2:1839 -3471:2:1840 -3472:2:1847 -3473:2:1851 -3474:2:1852 -3475:2:1859 -3476:2:1860 -3477:2:1877 -3478:2:1878 -3479:2:1881 -3480:2:1882 -3481:0:2227 -3482:2:1894 -3483:0:2227 -3484:1:148 -3485:0:2227 -3486:2:1895 -3487:2:1899 -3488:2:1900 -3489:2:1907 -3490:2:1911 -3491:2:1912 -3492:2:1919 -3493:2:1923 -3494:2:1924 -3495:2:1931 -3496:2:1932 -3497:2:1949 -3498:2:1950 -3499:2:1953 -3500:2:1954 -3501:0:2227 -3502:2:1821 -3503:0:2227 -3504:2:1822 -3505:0:2227 -3506:2:1823 -3507:2:1827 -3508:2:1828 -3509:2:1835 -3510:2:1839 -3511:2:1840 -3512:2:1847 -3513:2:1851 -3514:2:1852 -3515:2:1859 -3516:2:1860 -3517:2:1877 -3518:2:1878 -3519:2:1881 -3520:2:1882 -3521:0:2227 -3522:2:1894 -3523:0:2227 -3524:1:149 -3525:1:153 -3526:1:154 -3527:1:169 -3528:1:170 -3529:1:173 -3530:1:177 -3531:1:178 -3532:1:185 -3533:1:186 -3534:1:196 -3535:1:199 -3536:1:200 -3537:1:207 -3538:1:208 -3539:0:2227 -3540:2:1895 -3541:2:1899 -3542:2:1900 -3543:2:1907 -3544:2:1911 -3545:2:1912 -3546:2:1919 -3547:2:1923 -3548:2:1924 -3549:2:1931 -3550:2:1932 -3551:2:1949 -3552:2:1950 -3553:2:1953 -3554:2:1954 -3555:0:2227 -3556:2:1821 -3557:0:2227 -3558:2:1822 -3559:0:2227 -3560:2:1823 -3561:2:1827 -3562:2:1828 -3563:2:1835 -3564:2:1839 -3565:2:1840 -3566:2:1847 -3567:2:1851 -3568:2:1852 -3569:2:1859 -3570:2:1860 -3571:2:1877 -3572:2:1878 -3573:2:1881 -3574:2:1882 -3575:0:2227 -3576:1:220 -3577:0:2227 -3578:1:373 -3579:0:2227 -3580:1:374 -3581:0:2227 -3582:1:3 -3583:0:2227 -3584:1:4 -3585:1:8 -3586:1:9 -3587:1:16 -3588:1:17 -3589:1:28 -3590:1:32 -3591:1:33 -3592:1:40 -3593:1:41 -3594:1:51 -3595:1:52 -3596:1:62 -3597:1:63 -3598:0:2227 -3599:1:75 -3600:0:2227 -3601:1:76 -3602:1:80 -3603:1:81 -3604:1:88 -3605:1:92 -3606:1:93 -3607:1:100 -3608:1:104 -3609:1:105 -3610:1:112 -3611:1:113 -3612:1:123 -3613:1:124 -3614:1:134 -3615:1:135 -3616:0:2227 -3617:1:223 -3618:0:2227 -3619:1:224 -3620:0:2227 -3621:1:373 -3622:0:2227 -3623:1:374 -3624:0:2227 -3625:1:379 -3626:0:2227 -3627:1:384 -3628:1:388 -3629:1:389 -3630:1:396 -3631:1:397 -3632:1:408 -3633:1:412 -3634:1:413 -3635:1:420 -3636:1:421 -3637:1:431 -3638:1:432 -3639:1:442 -3640:1:443 -3641:0:2227 -3642:1:455 -3643:0:2227 -3644:1:456 -3645:1:460 -3646:1:461 -3647:1:468 -3648:1:472 -3649:1:473 -3650:1:480 -3651:1:484 -3652:1:485 -3653:1:492 -3654:1:493 -3655:1:503 -3656:1:504 -3657:1:514 -3658:1:515 -3659:0:2227 -3660:1:527 -3661:0:2227 -3662:1:528 -3663:1:532 -3664:1:533 -3665:1:540 -3666:1:544 -3667:1:545 -3668:1:552 -3669:1:556 -3670:1:557 -3671:1:564 -3672:1:565 -3673:1:575 -3674:1:576 -3675:1:586 -3676:1:587 -3677:0:2227 -3678:1:599 -3679:0:2227 -3680:1:600 -3681:0:2227 -3682:1:601 -3683:0:2227 -3684:1:746 -3685:0:2227 -3686:1:747 -3687:0:2227 -3688:1:751 -3689:0:2227 -3690:1:752 -3691:1:756 -3692:1:757 -3693:1:764 -3694:1:768 -3695:1:769 -3696:1:776 -3697:1:780 -3698:1:781 -3699:1:788 -3700:1:789 -3701:1:799 -3702:1:800 -3703:1:810 -3704:1:811 -3705:0:2227 -3706:1:823 -3707:0:2227 -3708:1:601 -3709:0:2227 -3710:1:746 -3711:0:2227 -3712:1:747 -3713:0:2227 -3714:1:751 -3715:0:2227 -3716:1:752 -3717:1:756 -3718:1:757 -3719:1:764 -3720:1:765 -3721:1:776 -3722:1:780 -3723:1:781 -3724:1:788 -3725:1:789 -3726:1:799 -3727:1:800 -3728:1:810 -3729:1:811 -3730:0:2227 -3731:1:823 -3732:0:2227 -3733:1:827 -3734:0:2227 -3735:1:832 -3736:1:836 -3737:1:837 -3738:1:844 -3739:1:845 -3740:1:856 -3741:1:860 -3742:1:861 -3743:1:868 -3744:1:869 -3745:1:879 -3746:1:880 -3747:1:890 -3748:1:891 -3749:0:2227 -3750:1:1 -3751:0:2227 -3752:1:2 -3753:0:2227 -3754:1:3 -3755:0:2227 -3756:1:4 -3757:1:8 -3758:1:9 -3759:1:16 -3760:1:20 -3761:1:21 -3762:1:28 -3763:1:32 -3764:1:33 -3765:1:40 -3766:1:41 -3767:1:51 -3768:1:52 -3769:1:62 -3770:1:63 -3771:0:2227 -3772:1:75 -3773:0:2227 -3774:1:76 -3775:1:80 -3776:1:81 -3777:1:88 -3778:1:92 -3779:1:93 -3780:1:100 -3781:1:104 -3782:1:105 -3783:1:112 -3784:1:113 -3785:1:123 -3786:1:124 -3787:1:134 -3788:1:135 -3789:0:2227 -3790:1:147 -3791:0:2227 -3792:1:148 -3793:0:2227 -3794:1:149 -3795:1:153 -3796:1:154 -3797:1:161 -3798:1:165 -3799:1:166 -3800:1:173 -3801:1:177 -3802:1:178 -3803:1:185 -3804:1:186 -3805:1:196 -3806:1:197 -3807:1:207 -3808:1:208 -3809:0:2227 -3810:1:220 -3811:0:2227 -3812:2:1894 -3813:0:2227 -3814:1:373 -3815:0:2227 -3816:2:1895 -3817:2:1899 -3818:2:1900 -3819:2:1907 -3820:2:1911 -3821:2:1912 -3822:2:1919 -3823:2:1923 -3824:2:1924 -3825:2:1931 -3826:2:1932 -3827:2:1949 -3828:2:1950 -3829:2:1953 -3830:2:1954 -3831:0:2227 -3832:2:1821 -3833:0:2227 -3834:1:374 -3835:0:2227 -3836:1:3 -3837:0:2227 -3838:1:4 -3839:1:8 -3840:1:9 -3841:1:16 -3842:1:17 -3843:1:28 -3844:1:32 -3845:1:33 -3846:1:40 -3847:1:41 -3848:1:51 -3849:1:52 -3850:1:62 -3851:1:63 -3852:0:2227 -3853:1:75 -3854:0:2227 -3855:1:76 -3856:1:80 -3857:1:81 -3858:1:88 -3859:1:92 -3860:1:93 -3861:1:100 -3862:1:104 -3863:1:105 -3864:1:112 -3865:1:113 -3866:1:123 -3867:1:124 -3868:1:134 -3869:1:135 -3870:0:2227 -3871:1:223 -3872:0:2227 -3873:1:224 -3874:0:2227 -3875:1:373 -3876:0:2227 -3877:1:374 -3878:0:2227 -3879:1:379 -3880:0:2227 -3881:1:384 -3882:1:388 -3883:1:389 -3884:1:396 -3885:1:397 -3886:1:408 -3887:1:412 -3888:1:413 -3889:1:420 -3890:1:421 -3891:1:431 -3892:1:432 -3893:1:442 -3894:1:443 -3895:0:2227 -3896:1:455 -3897:0:2227 -3898:1:456 -3899:1:460 -3900:1:461 -3901:1:468 -3902:1:472 -3903:1:473 -3904:1:480 -3905:1:484 -3906:1:485 -3907:1:492 -3908:1:493 -3909:1:503 -3910:1:504 -3911:1:514 -3912:1:515 -3913:0:2227 -3914:1:527 -3915:0:2227 -3916:1:528 -3917:1:532 -3918:1:533 -3919:1:540 -3920:1:544 -3921:1:545 -3922:1:552 -3923:1:556 -3924:1:557 -3925:1:564 -3926:1:565 -3927:1:575 -3928:1:576 -3929:1:586 -3930:1:587 -3931:0:2227 -3932:1:599 -3933:0:2227 -3934:1:600 -3935:0:2227 -3936:1:601 -3937:0:2227 -3938:1:746 -3939:0:2227 -3940:1:747 -3941:0:2227 -3942:1:751 -3943:0:2227 -3944:1:752 -3945:1:756 -3946:1:757 -3947:1:764 -3948:1:768 -3949:1:769 -3950:1:776 -3951:1:780 -3952:1:781 -3953:1:788 -3954:1:789 -3955:1:799 -3956:1:800 -3957:1:810 -3958:1:811 -3959:0:2227 -3960:1:823 -3961:0:2227 -3962:1:601 -3963:0:2227 -3964:1:746 -3965:0:2227 -3966:1:747 -3967:0:2227 -3968:1:751 -3969:0:2227 -3970:1:752 -3971:1:756 -3972:1:757 -3973:1:764 -3974:1:765 -3975:1:776 -3976:1:780 -3977:1:781 -3978:1:788 -3979:1:789 -3980:1:799 -3981:1:800 -3982:1:810 -3983:1:811 -3984:0:2227 -3985:1:823 -3986:0:2227 -3987:1:827 -3988:0:2227 -3989:1:832 -3990:1:836 -3991:1:837 -3992:1:844 -3993:1:845 -3994:1:856 -3995:1:860 -3996:1:861 -3997:1:868 -3998:1:869 -3999:1:879 -4000:1:880 -4001:1:890 -4002:1:891 -4003:0:2227 -4004:1:1 -4005:0:2227 -4006:1:2 -4007:0:2227 -4008:1:3 -4009:0:2227 -4010:1:4 -4011:1:8 -4012:1:9 -4013:1:16 -4014:1:20 -4015:1:21 -4016:1:28 -4017:1:32 -4018:1:33 -4019:1:40 -4020:1:41 -4021:1:51 -4022:1:52 -4023:1:62 -4024:1:63 -4025:0:2227 -4026:1:75 -4027:0:2227 -4028:1:76 -4029:1:80 -4030:1:81 -4031:1:88 -4032:1:92 -4033:1:93 -4034:1:100 -4035:1:104 -4036:1:105 -4037:1:112 -4038:1:113 -4039:1:123 -4040:1:124 -4041:1:134 -4042:1:135 -4043:0:2227 -4044:1:147 -4045:0:2227 -4046:1:148 -4047:0:2227 -4048:1:149 -4049:1:153 -4050:1:154 -4051:1:161 -4052:1:165 -4053:1:166 -4054:1:173 -4055:1:177 -4056:1:178 -4057:1:185 -4058:1:186 -4059:1:196 -4060:1:197 -4061:1:207 -4062:1:208 -4063:0:2227 -4064:1:220 -4065:0:2227 -4066:1:373 -4067:0:2227 -4068:1:374 -4069:0:2227 -4070:2:1822 -4071:0:2227 -4072:1:3 -4073:0:2227 -4074:1:4 -4075:1:8 -4076:1:9 -4077:1:16 -4078:1:17 -4079:1:28 -4080:1:32 -4081:1:33 -4082:1:40 -4083:1:41 -4084:1:51 -4085:1:52 -4086:1:62 -4087:1:63 -4088:0:2227 -4089:1:75 -4090:0:2227 -4091:1:76 -4092:1:80 -4093:1:81 -4094:1:88 -4095:1:92 -4096:1:93 -4097:1:100 -4098:1:104 -4099:1:105 -4100:1:112 -4101:1:113 -4102:1:123 -4103:1:124 -4104:1:134 -4105:1:135 -4106:0:2227 -4107:1:223 -4108:0:2227 -4109:1:224 -4110:0:2227 -4111:1:373 -4112:0:2227 -4113:1:374 -4114:0:2227 -4115:1:379 -4116:0:2227 -4117:1:384 -4118:1:388 -4119:1:389 -4120:1:396 -4121:1:397 -4122:1:408 -4123:1:412 -4124:1:413 -4125:1:420 -4126:1:421 -4127:1:431 -4128:1:432 -4129:1:442 -4130:1:443 -4131:0:2227 -4132:1:455 -4133:0:2227 -4134:1:456 -4135:1:460 -4136:1:461 -4137:1:468 -4138:1:472 -4139:1:473 -4140:1:480 -4141:1:484 -4142:1:485 -4143:1:492 -4144:1:493 -4145:1:503 -4146:1:504 -4147:1:514 -4148:1:515 -4149:0:2227 -4150:1:527 -4151:0:2227 -4152:1:528 -4153:1:532 -4154:1:533 -4155:1:540 -4156:1:544 -4157:1:545 -4158:1:552 -4159:1:556 -4160:1:557 -4161:1:564 -4162:1:565 -4163:1:575 -4164:1:576 -4165:1:586 -4166:1:587 -4167:0:2227 -4168:1:599 -4169:0:2227 -4170:1:600 -4171:0:2227 -4172:1:601 -4173:0:2227 -4174:1:746 -4175:0:2227 -4176:1:747 -4177:0:2227 -4178:1:751 -4179:0:2227 -4180:1:752 -4181:1:756 -4182:1:757 -4183:1:764 -4184:1:768 -4185:1:769 -4186:1:776 -4187:1:780 -4188:1:781 -4189:1:788 -4190:1:789 -4191:1:799 -4192:1:800 -4193:1:810 -4194:1:811 -4195:0:2227 -4196:1:823 -4197:0:2227 -4198:1:601 -4199:0:2227 -4200:1:746 -4201:0:2227 -4202:1:747 -4203:0:2227 -4204:1:751 -4205:0:2227 -4206:1:752 -4207:1:756 -4208:1:757 -4209:1:764 -4210:1:765 -4211:1:776 -4212:1:780 -4213:1:781 -4214:1:788 -4215:1:789 -4216:1:799 -4217:1:800 -4218:1:810 -4219:1:811 -4220:0:2227 -4221:1:823 -4222:0:2227 -4223:1:827 -4224:0:2227 -4225:1:832 -4226:1:836 -4227:1:837 -4228:1:852 -4229:1:853 -4230:1:856 -4231:1:860 -4232:1:861 -4233:1:868 -4234:1:869 -4235:1:879 -4236:1:882 -4237:1:883 -4238:1:890 -4239:1:891 -4240:0:2227 -4241:1:1 -4242:0:2227 -4243:1:2 -4244:0:2227 -4245:1:3 -4246:0:2227 -4247:2:1823 -4248:2:1827 -4249:2:1828 -4250:2:1835 -4251:2:1839 -4252:2:1840 -4253:2:1847 -4254:2:1851 -4255:2:1852 -4256:2:1859 -4257:2:1860 -4258:2:1877 -4259:2:1878 -4260:2:1881 -4261:2:1882 -4262:0:2227 -4263:2:1894 -4264:0:2227 -4265:2:1895 -4266:2:1899 -4267:2:1900 -4268:2:1907 -4269:2:1911 -4270:2:1912 -4271:2:1919 -4272:2:1923 -4273:2:1924 -4274:2:1931 -4275:2:1932 -4276:2:1949 -4277:2:1950 -4278:2:1953 -4279:2:1954 -4280:0:2227 -4281:2:1821 -4282:0:2227 -4283:2:1822 -4284:0:2227 -4285:1:4 -4286:1:8 -4287:1:9 -4288:1:16 -4289:1:17 -4290:1:28 -4291:1:32 -4292:1:33 -4293:1:40 -4294:1:41 -4295:1:51 -4296:1:52 -4297:1:62 -4298:1:63 -4299:0:2227 -4300:2:1823 -4301:2:1827 -4302:2:1828 -4303:2:1835 -4304:2:1839 -4305:2:1840 -4306:2:1847 -4307:2:1851 -4308:2:1852 -4309:2:1859 -4310:2:1860 -4311:2:1877 -4312:2:1878 -4313:2:1881 -4314:2:1882 -4315:0:2227 -4316:2:1894 -4317:0:2227 -4318:2:1895 -4319:2:1899 -4320:2:1900 -4321:2:1907 -4322:2:1911 -4323:2:1912 -4324:2:1919 -4325:2:1923 -4326:2:1924 -4327:2:1931 -4328:2:1932 -4329:2:1949 -4330:2:1950 -4331:2:1953 -4332:2:1954 -4333:0:2227 -4334:2:1821 -4335:0:2227 -4336:2:1822 -4337:0:2227 -4338:1:75 -4339:0:2227 -4340:2:1823 -4341:2:1827 -4342:2:1828 -4343:2:1835 -4344:2:1839 -4345:2:1840 -4346:2:1847 -4347:2:1851 -4348:2:1852 -4349:2:1859 -4350:2:1860 -4351:2:1877 -4352:2:1878 -4353:2:1881 -4354:2:1882 -4355:0:2227 -4356:2:1894 -4357:0:2227 -4358:2:1895 -4359:2:1899 -4360:2:1900 -4361:2:1907 -4362:2:1911 -4363:2:1912 -4364:2:1919 -4365:2:1923 -4366:2:1924 -4367:2:1931 -4368:2:1932 -4369:2:1949 -4370:2:1950 -4371:2:1953 -4372:2:1954 -4373:0:2227 -4374:2:1821 -4375:0:2227 -4376:2:1822 -4377:0:2227 -4378:1:76 -4379:1:80 -4380:1:81 -4381:1:88 -4382:1:92 -4383:1:93 -4384:1:100 -4385:1:104 -4386:1:105 -4387:1:112 -4388:1:113 -4389:1:123 -4390:1:124 -4391:1:134 -4392:1:135 -4393:0:2227 -4394:1:147 -4395:0:2227 -4396:2:1823 -4397:2:1827 -4398:2:1828 -4399:2:1835 -4400:2:1839 -4401:2:1840 -4402:2:1847 -4403:2:1851 -4404:2:1852 -4405:2:1859 -4406:2:1860 -4407:2:1877 -4408:2:1878 -4409:2:1881 -4410:2:1882 -4411:0:2227 -4412:2:1894 -4413:0:2227 -4414:2:1895 -4415:2:1899 -4416:2:1900 -4417:2:1907 -4418:2:1911 -4419:2:1912 -4420:2:1919 -4421:2:1923 -4422:2:1924 -4423:2:1931 -4424:2:1932 -4425:2:1949 -4426:2:1950 -4427:2:1953 -4428:2:1954 -4429:0:2227 -4430:2:1821 -4431:0:2227 -4432:2:1822 -4433:0:2227 -4434:1:148 -4435:0:2227 -4436:2:1823 -4437:2:1827 -4438:2:1828 -4439:2:1835 -4440:2:1839 -4441:2:1840 -4442:2:1847 -4443:2:1851 -4444:2:1852 -4445:2:1859 -4446:2:1860 -4447:2:1877 -4448:2:1878 -4449:2:1881 -4450:2:1882 -4451:0:2227 -4452:2:1894 -4453:0:2227 -4454:2:1895 -4455:2:1899 -4456:2:1900 -4457:2:1907 -4458:2:1911 -4459:2:1912 -4460:2:1919 -4461:2:1923 -4462:2:1924 -4463:2:1931 -4464:2:1932 -4465:2:1949 -4466:2:1950 -4467:2:1953 -4468:2:1954 -4469:0:2227 -4470:2:1821 -4471:0:2227 -4472:2:1822 -4473:0:2227 -4474:1:149 -4475:1:153 -4476:1:154 -4477:1:161 -4478:1:165 -4479:1:166 -4480:1:173 -4481:1:177 -4482:1:178 -4483:1:185 -4484:1:186 -4485:1:196 -4486:1:197 -4487:1:207 -4488:1:208 -4489:0:2227 -4490:2:1823 -4491:2:1827 -4492:2:1828 -4493:2:1835 -4494:2:1839 -4495:2:1840 -4496:2:1847 -4497:2:1851 -4498:2:1852 -4499:2:1859 -4500:2:1860 -4501:2:1877 -4502:2:1878 -4503:2:1881 -4504:2:1882 -4505:0:2227 -4506:2:1894 -4507:0:2227 -4508:2:1895 -4509:2:1899 -4510:2:1900 -4511:2:1907 -4512:2:1911 -4513:2:1912 -4514:2:1919 -4515:2:1923 -4516:2:1924 -4517:2:1931 -4518:2:1932 -4519:2:1949 -4520:2:1950 -4521:2:1953 -4522:2:1954 -4523:0:2227 -4524:2:1821 -4525:0:2227 -4526:2:1822 -4527:0:2227 -4528:1:220 -4529:0:2227 -4530:1:373 -4531:0:2227 -4532:1:374 -4533:0:2227 -4534:1:3 -4535:0:2227 -4536:2:1823 -4537:2:1827 -4538:2:1828 -4539:2:1835 -4540:2:1839 -4541:2:1840 -4542:2:1847 -4543:2:1851 -4544:2:1852 -4545:2:1859 -4546:2:1860 -4547:2:1877 -4548:2:1878 -4549:2:1881 -4550:2:1882 -4551:0:2227 -4552:2:1894 -4553:0:2227 -4554:2:1895 -4555:2:1899 -4556:2:1900 -4557:2:1907 -4558:2:1911 -4559:2:1912 -4560:2:1919 -4561:2:1923 -4562:2:1924 -4563:2:1931 -4564:2:1932 -4565:2:1949 -4566:2:1950 -4567:2:1953 -4568:2:1954 -4569:0:2227 -4570:2:1821 -4571:0:2227 -4572:2:1822 -4573:0:2227 -4574:1:4 -4575:1:8 -4576:1:9 -4577:1:16 -4578:1:17 -4579:1:28 -4580:1:32 -4581:1:33 -4582:1:40 -4583:1:41 -4584:1:51 -4585:1:52 -4586:1:62 -4587:1:63 diff --git a/formal-model/urcu/result-signal-over-writer/urcu.sh b/formal-model/urcu/result-signal-over-writer/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu/result-signal-over-writer/urcu.spin b/formal-model/urcu/result-signal-over-writer/urcu.spin deleted file mode 100644 index 2cfcb70..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu.spin +++ /dev/null @@ -1,705 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free.log b/formal-model/urcu/result-signal-over-writer/urcu_free.log deleted file mode 100644 index 9a22c47..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_free.log +++ /dev/null @@ -1,345 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 741) - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 10669, errors: 0 - 20146 states, stored - 191615 states, matched - 211761 transitions (= stored+matched) - 712676 atomic steps -hash conflicts: 1523 (resolved) - -Stats on memory usage (in Megabytes): - 1.614 equivalent memory usage for states (stored*(State-vector + overhead)) - 1.661 actual memory usage for states (unsuccessful compression: 102.92%) - state-vector as stored = 58 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 467.326 total actual memory usage - -unreached in proctype urcu_reader_sig - line 401, "pan.___", state 330, "(1)" - line 612, "pan.___", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 397, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 406, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, "pan.___", state 59, "(1)" - line 416, "pan.___", state 89, "(1)" - line 397, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 407, "pan.___", state 160, "(1)" - line 650, "pan.___", state 213, "(1)" - line 173, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 177, "pan.___", state 233, "(1)" - line 158, "pan.___", state 254, "(1)" - line 162, "pan.___", state 262, "(1)" - line 166, "pan.___", state 274, "(1)" - line 173, "pan.___", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, "pan.___", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, "pan.___", state 752, "(1)" - line 162, "pan.___", state 760, "(1)" - line 162, "pan.___", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, "pan.___", state 761, "else" - line 160, "pan.___", state 766, "((j<1))" - line 160, "pan.___", state 766, "((j>=1))" - line 166, "pan.___", state 772, "(1)" - line 166, "pan.___", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, "pan.___", state 773, "else" - line 168, "pan.___", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, "pan.___", state 776, "else" - line 173, "pan.___", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, "pan.___", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 166, "pan.___", state 835, "(1)" - line 166, "pan.___", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 173, "pan.___", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, "pan.___", state 852, "(1)" - line 177, "pan.___", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, "pan.___", state 861, "(1)" - line 177, "pan.___", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, "pan.___", state 862, "else" - line 175, "pan.___", state 867, "((j<1))" - line 175, "pan.___", state 867, "((j>=1))" - line 181, "pan.___", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, "pan.___", state 882, "(1)" - line 162, "pan.___", state 890, "(1)" - line 162, "pan.___", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, "pan.___", state 891, "else" - line 160, "pan.___", state 896, "((j<1))" - line 160, "pan.___", state 896, "((j>=1))" - line 166, "pan.___", state 902, "(1)" - line 166, "pan.___", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, "pan.___", state 903, "else" - line 168, "pan.___", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, "pan.___", state 906, "else" - line 200, "pan.___", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 200, "pan.___", state 908, "else" - line 219, "pan.___", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 219, "pan.___", state 909, "else" - line 354, "pan.___", state 915, "((sighand_exec==1))" - line 354, "pan.___", state 915, "else" - line 360, "pan.___", state 918, "sighand_exec = 1" - line 397, "pan.___", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 397, "pan.___", state 933, "(1)" - line 397, "pan.___", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 397, "pan.___", state 934, "else" - line 397, "pan.___", state 937, "(1)" - line 401, "pan.___", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 401, "pan.___", state 947, "(1)" - line 401, "pan.___", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 401, "pan.___", state 948, "else" - line 401, "pan.___", state 951, "(1)" - line 401, "pan.___", state 952, "(1)" - line 401, "pan.___", state 952, "(1)" - line 399, "pan.___", state 957, "((i<1))" - line 399, "pan.___", state 957, "((i>=1))" - line 406, "pan.___", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, "pan.___", state 976, "(1)" - line 407, "pan.___", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 407, "pan.___", state 977, "else" - line 407, "pan.___", state 980, "(1)" - line 407, "pan.___", state 981, "(1)" - line 407, "pan.___", state 981, "(1)" - line 411, "pan.___", state 989, "(1)" - line 411, "pan.___", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 411, "pan.___", state 990, "else" - line 411, "pan.___", state 993, "(1)" - line 411, "pan.___", state 994, "(1)" - line 411, "pan.___", state 994, "(1)" - line 409, "pan.___", state 999, "((i<1))" - line 409, "pan.___", state 999, "((i>=1))" - line 416, "pan.___", state 1006, "(1)" - line 416, "pan.___", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 416, "pan.___", state 1007, "else" - line 416, "pan.___", state 1010, "(1)" - line 416, "pan.___", state 1011, "(1)" - line 416, "pan.___", state 1011, "(1)" - line 418, "pan.___", state 1014, "(1)" - line 418, "pan.___", state 1014, "(1)" - line 360, "pan.___", state 1023, "sighand_exec = 1" - line 401, "pan.___", state 1054, "(1)" - line 406, "pan.___", state 1070, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, "pan.___", state 1113, "(1)" - line 401, "pan.___", state 1151, "(1)" - line 406, "pan.___", state 1167, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, "pan.___", state 1210, "(1)" - line 397, "pan.___", state 1236, "(1)" - line 401, "pan.___", state 1250, "(1)" - line 406, "pan.___", state 1266, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, "pan.___", state 1309, "(1)" - line 401, "pan.___", state 1350, "(1)" - line 406, "pan.___", state 1366, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 416, "pan.___", state 1409, "(1)" - line 173, "pan.___", state 1430, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, "pan.___", state 1432, "(1)" - line 177, "pan.___", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, "pan.___", state 1441, "(1)" - line 177, "pan.___", state 1442, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, "pan.___", state 1442, "else" - line 175, "pan.___", state 1447, "((j<1))" - line 175, "pan.___", state 1447, "((j>=1))" - line 181, "pan.___", state 1452, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, "pan.___", state 1462, "(1)" - line 162, "pan.___", state 1470, "(1)" - line 162, "pan.___", state 1471, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, "pan.___", state 1471, "else" - line 160, "pan.___", state 1476, "((j<1))" - line 160, "pan.___", state 1476, "((j>=1))" - line 166, "pan.___", state 1482, "(1)" - line 166, "pan.___", state 1483, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, "pan.___", state 1483, "else" - line 168, "pan.___", state 1486, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, "pan.___", state 1486, "else" - line 173, "pan.___", state 1493, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 181, "pan.___", state 1515, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 166, "pan.___", state 1545, "(1)" - line 166, "pan.___", state 1546, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 173, "pan.___", state 1560, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 173, "pan.___", state 1562, "(1)" - line 177, "pan.___", state 1569, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 177, "pan.___", state 1571, "(1)" - line 177, "pan.___", state 1572, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 177, "pan.___", state 1572, "else" - line 175, "pan.___", state 1577, "((j<1))" - line 175, "pan.___", state 1577, "((j>=1))" - line 181, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, "pan.___", state 1592, "(1)" - line 162, "pan.___", state 1600, "(1)" - line 162, "pan.___", state 1601, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 162, "pan.___", state 1601, "else" - line 160, "pan.___", state 1606, "((j<1))" - line 160, "pan.___", state 1606, "((j>=1))" - line 166, "pan.___", state 1612, "(1)" - line 166, "pan.___", state 1613, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 166, "pan.___", state 1613, "else" - line 168, "pan.___", state 1616, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 168, "pan.___", state 1616, "else" - line 200, "pan.___", state 1618, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 200, "pan.___", state 1618, "else" - line 219, "pan.___", state 1619, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 219, "pan.___", state 1619, "else" - line 354, "pan.___", state 1625, "((sighand_exec==1))" - line 354, "pan.___", state 1625, "else" - line 360, "pan.___", state 1628, "sighand_exec = 1" - line 397, "pan.___", state 1641, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 397, "pan.___", state 1643, "(1)" - line 397, "pan.___", state 1644, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 397, "pan.___", state 1644, "else" - line 397, "pan.___", state 1647, "(1)" - line 401, "pan.___", state 1655, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 401, "pan.___", state 1657, "(1)" - line 401, "pan.___", state 1658, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 401, "pan.___", state 1658, "else" - line 401, "pan.___", state 1661, "(1)" - line 401, "pan.___", state 1662, "(1)" - line 401, "pan.___", state 1662, "(1)" - line 399, "pan.___", state 1667, "((i<1))" - line 399, "pan.___", state 1667, "((i>=1))" - line 406, "pan.___", state 1673, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 407, "pan.___", state 1686, "(1)" - line 407, "pan.___", state 1687, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 407, "pan.___", state 1687, "else" - line 407, "pan.___", state 1690, "(1)" - line 407, "pan.___", state 1691, "(1)" - line 407, "pan.___", state 1691, "(1)" - line 411, "pan.___", state 1699, "(1)" - line 411, "pan.___", state 1700, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 411, "pan.___", state 1700, "else" - line 411, "pan.___", state 1703, "(1)" - line 411, "pan.___", state 1704, "(1)" - line 411, "pan.___", state 1704, "(1)" - line 409, "pan.___", state 1709, "((i<1))" - line 409, "pan.___", state 1709, "((i>=1))" - line 416, "pan.___", state 1716, "(1)" - line 416, "pan.___", state 1717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 416, "pan.___", state 1717, "else" - line 416, "pan.___", state 1720, "(1)" - line 416, "pan.___", state 1721, "(1)" - line 416, "pan.___", state 1721, "(1)" - line 418, "pan.___", state 1724, "(1)" - line 418, "pan.___", state 1724, "(1)" - line 360, "pan.___", state 1733, "sighand_exec = 1" - line 177, "pan.___", state 1758, "(1)" - line 181, "pan.___", state 1769, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 158, "pan.___", state 1779, "(1)" - line 162, "pan.___", state 1787, "(1)" - line 166, "pan.___", state 1799, "(1)" - line 173, "pan.___", state 1810, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< !read_free_race) diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free.spin.input b/formal-model/urcu/result-signal-over-writer/urcu_free.spin.input deleted file mode 100644 index 953115f..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_free.spin.input +++ /dev/null @@ -1,721 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free.spin.input.trail b/formal-model/urcu/result-signal-over-writer/urcu_free.spin.input.trail deleted file mode 100644 index 837f3d9..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_free.spin.input.trail +++ /dev/null @@ -1,15043 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4365 -2:4:4317 -3:4:4320 -4:4:4320 -5:4:4320 -6:4:4323 -7:4:4331 -8:4:4331 -9:4:4331 -10:4:4334 -11:4:4340 -12:4:4344 -13:4:4344 -14:4:4344 -15:4:4347 -16:4:4340 -17:4:4344 -18:4:4344 -19:4:4344 -20:4:4347 -21:4:4355 -22:4:4359 -23:4:4360 -24:0:4365 -25:4:4362 -26:0:4365 -27:3:2331 -28:0:4365 -29:3:2337 -30:0:4365 -31:3:2338 -32:0:4365 -33:3:2339 -34:3:2343 -35:3:2344 -36:3:2352 -37:3:2353 -38:3:2357 -39:3:2358 -40:3:2352 -41:3:2353 -42:3:2357 -43:3:2358 -44:3:2366 -45:3:2371 -46:3:2375 -47:3:2376 -48:3:2383 -49:3:2384 -50:3:2395 -51:3:2396 -52:3:2397 -53:3:2395 -54:3:2396 -55:3:2397 -56:3:2408 -57:3:2413 -58:3:2414 -59:0:4365 -60:3:2426 -61:0:4365 -62:3:2427 -63:0:4365 -64:2:1162 -65:0:4365 -66:3:2428 -67:0:4365 -68:2:1168 -69:0:4365 -70:2:1169 -71:0:4365 -72:3:2427 -73:0:4365 -74:2:1170 -75:0:4365 -76:3:2428 -77:0:4365 -78:3:2429 -79:0:4365 -80:3:2435 -81:3:2436 -82:0:4365 -83:3:2440 -84:3:2444 -85:3:2445 -86:3:2453 -87:3:2454 -88:3:2458 -89:3:2459 -90:3:2453 -91:3:2454 -92:3:2458 -93:3:2459 -94:3:2467 -95:3:2472 -96:3:2473 -97:3:2484 -98:3:2485 -99:3:2496 -100:3:2497 -101:3:2498 -102:3:2496 -103:3:2497 -104:3:2498 -105:3:2509 -106:3:2514 -107:3:2515 -108:0:4365 -109:3:2527 -110:0:4365 -111:3:2528 -112:0:4365 -113:2:1173 -114:0:4365 -115:3:2529 -116:0:4365 -117:2:1179 -118:0:4365 -119:2:1180 -120:0:4365 -121:3:2528 -122:0:4365 -123:2:1181 -124:2:1185 -125:2:1186 -126:2:1194 -127:2:1195 -128:2:1199 -129:2:1200 -130:2:1194 -131:2:1195 -132:2:1199 -133:2:1200 -134:2:1208 -135:2:1213 -136:2:1217 -137:2:1218 -138:2:1225 -139:2:1226 -140:2:1237 -141:2:1238 -142:2:1239 -143:2:1237 -144:2:1238 -145:2:1239 -146:2:1250 -147:2:1255 -148:2:1256 -149:0:4365 -150:3:2529 -151:0:4365 -152:2:1268 -153:0:4365 -154:3:2528 -155:0:4365 -156:2:1270 -157:0:4365 -158:3:2529 -159:0:4365 -160:2:1271 -161:2:1275 -162:2:1276 -163:2:1284 -164:2:1285 -165:2:1289 -166:2:1290 -167:2:1284 -168:2:1285 -169:2:1289 -170:2:1290 -171:2:1298 -172:2:1303 -173:2:1307 -174:2:1308 -175:2:1315 -176:2:1316 -177:2:1327 -178:2:1328 -179:2:1329 -180:2:1327 -181:2:1328 -182:2:1329 -183:2:1340 -184:2:1345 -185:2:1346 -186:0:4365 -187:2:1358 -188:0:4365 -189:2:1360 -190:0:4365 -191:3:2528 -192:0:4365 -193:2:1361 -194:0:4365 -195:3:2529 -196:0:4365 -197:2:1362 -198:2:1366 -199:2:1367 -200:2:1375 -201:2:1376 -202:2:1380 -203:2:1381 -204:2:1375 -205:2:1376 -206:2:1380 -207:2:1381 -208:2:1389 -209:2:1394 -210:2:1398 -211:2:1399 -212:2:1406 -213:2:1407 -214:2:1418 -215:2:1419 -216:2:1420 -217:2:1418 -218:2:1419 -219:2:1420 -220:2:1431 -221:2:1436 -222:2:1437 -223:0:4365 -224:2:1449 -225:0:4365 -226:3:2528 -227:0:4365 -228:2:1451 -229:0:4365 -230:3:2529 -231:0:4365 -232:2:1652 -233:0:4365 -234:2:1653 -235:0:4365 -236:2:1657 -237:0:4365 -238:2:1180 -239:0:4365 -240:3:2528 -241:0:4365 -242:2:1181 -243:2:1185 -244:2:1186 -245:2:1194 -246:2:1195 -247:2:1199 -248:2:1200 -249:2:1194 -250:2:1195 -251:2:1196 -252:2:1208 -253:2:1213 -254:2:1217 -255:2:1218 -256:2:1225 -257:2:1226 -258:2:1237 -259:2:1238 -260:2:1239 -261:2:1237 -262:2:1238 -263:2:1239 -264:2:1250 -265:2:1255 -266:2:1256 -267:0:4365 -268:3:2529 -269:0:4365 -270:2:1268 -271:0:4365 -272:3:2528 -273:0:4365 -274:2:1270 -275:0:4365 -276:3:2529 -277:0:4365 -278:2:1271 -279:2:1275 -280:2:1276 -281:2:1284 -282:2:1285 -283:2:1289 -284:2:1290 -285:2:1284 -286:2:1285 -287:2:1289 -288:2:1290 -289:2:1298 -290:2:1303 -291:2:1307 -292:2:1308 -293:2:1315 -294:2:1316 -295:2:1327 -296:2:1328 -297:2:1329 -298:2:1327 -299:2:1328 -300:2:1329 -301:2:1340 -302:2:1345 -303:2:1346 -304:0:4365 -305:2:1358 -306:0:4365 -307:2:1454 -308:0:4365 -309:3:2528 -310:0:4365 -311:2:1455 -312:0:4365 -313:3:2529 -314:0:4365 -315:2:1652 -316:0:4365 -317:2:1653 -318:0:4365 -319:2:1657 -320:0:4365 -321:2:1660 -322:0:4365 -323:3:2528 -324:0:4365 -325:2:1665 -326:2:1669 -327:2:1670 -328:2:1678 -329:2:1679 -330:2:1683 -331:2:1684 -332:2:1678 -333:2:1679 -334:2:1680 -335:2:1692 -336:2:1697 -337:2:1701 -338:2:1702 -339:2:1709 -340:2:1710 -341:2:1721 -342:2:1722 -343:2:1723 -344:2:1721 -345:2:1722 -346:2:1723 -347:2:1734 -348:2:1739 -349:2:1740 -350:0:4365 -351:3:2529 -352:0:4365 -353:2:1752 -354:0:4365 -355:3:2528 -356:0:4365 -357:2:1754 -358:0:4365 -359:3:2529 -360:0:4365 -361:2:1755 -362:2:1759 -363:2:1760 -364:2:1768 -365:2:1769 -366:2:1773 -367:2:1774 -368:2:1768 -369:2:1769 -370:2:1773 -371:2:1774 -372:2:1782 -373:2:1787 -374:2:1791 -375:2:1792 -376:2:1799 -377:2:1800 -378:2:1811 -379:2:1812 -380:2:1813 -381:2:1811 -382:2:1812 -383:2:1813 -384:2:1824 -385:2:1829 -386:2:1830 -387:0:4365 -388:2:1842 -389:0:4365 -390:3:2528 -391:0:4365 -392:2:1844 -393:0:4365 -394:3:2529 -395:0:4365 -396:2:1845 -397:2:1849 -398:2:1850 -399:2:1858 -400:2:1859 -401:2:1863 -402:2:1864 -403:2:1858 -404:2:1859 -405:2:1863 -406:2:1864 -407:2:1872 -408:2:1877 -409:2:1881 -410:2:1882 -411:2:1889 -412:2:1890 -413:2:1901 -414:2:1902 -415:2:1903 -416:2:1901 -417:2:1902 -418:2:1903 -419:2:1914 -420:2:1919 -421:2:1920 -422:0:4365 -423:2:1932 -424:0:4365 -425:3:2528 -426:0:4365 -427:2:1934 -428:0:4365 -429:3:2529 -430:0:4365 -431:2:1935 -432:0:4365 -433:2:1936 -434:0:4365 -435:2:2129 -436:0:4365 -437:2:2130 -438:0:4365 -439:2:2134 -440:0:4365 -441:3:2528 -442:0:4365 -443:2:2136 -444:0:4365 -445:3:2529 -446:0:4365 -447:2:2137 -448:2:2141 -449:2:2142 -450:2:2150 -451:2:2151 -452:2:2155 -453:2:2156 -454:2:2150 -455:2:2151 -456:2:2155 -457:2:2156 -458:2:2164 -459:2:2169 -460:2:2173 -461:2:2174 -462:2:2181 -463:2:2182 -464:2:2193 -465:2:2194 -466:2:2195 -467:2:2193 -468:2:2194 -469:2:2195 -470:2:2206 -471:2:2211 -472:2:2212 -473:0:4365 -474:2:2224 -475:0:4365 -476:3:2528 -477:0:4365 -478:2:2226 -479:0:4365 -480:3:2529 -481:0:4365 -482:2:1936 -483:0:4365 -484:2:2129 -485:0:4365 -486:2:2130 -487:0:4365 -488:2:2134 -489:0:4365 -490:3:2528 -491:0:4365 -492:2:2136 -493:0:4365 -494:3:2529 -495:0:4365 -496:2:2137 -497:2:2141 -498:2:2142 -499:2:2150 -500:2:2151 -501:2:2155 -502:2:2156 -503:2:2150 -504:2:2151 -505:2:2152 -506:2:2164 -507:2:2169 -508:2:2173 -509:2:2174 -510:2:2181 -511:2:2182 -512:2:2193 -513:2:2194 -514:2:2195 -515:2:2193 -516:2:2194 -517:2:2195 -518:2:2206 -519:2:2211 -520:2:2212 -521:0:4365 -522:2:2224 -523:0:4365 -524:3:2528 -525:0:4365 -526:2:2226 -527:0:4365 -528:3:2529 -529:0:4365 -530:2:2230 -531:0:4365 -532:3:2528 -533:0:4365 -534:2:2235 -535:2:2239 -536:2:2240 -537:2:2248 -538:2:2249 -539:2:2253 -540:2:2254 -541:2:2248 -542:2:2249 -543:2:2250 -544:2:2262 -545:2:2267 -546:2:2271 -547:2:2272 -548:2:2279 -549:2:2280 -550:2:2291 -551:2:2292 -552:2:2293 -553:2:2291 -554:2:2292 -555:2:2293 -556:2:2304 -557:2:2309 -558:2:2310 -559:0:4365 -560:3:2529 -561:0:4365 -562:2:2322 -563:0:4365 -564:2:1169 -565:0:4365 -566:3:2528 -567:0:4365 -568:2:1170 -569:0:4365 -570:3:2529 -571:0:4365 -572:3:2530 -573:0:4365 -574:3:2536 -575:0:4365 -576:3:2537 -577:0:4365 -578:3:2547 -579:0:4365 -580:3:2548 -581:0:4365 -582:3:2552 -583:3:2553 -584:3:2557 -585:3:2561 -586:3:2562 -587:3:2557 -588:3:2561 -589:3:2562 -590:3:2566 -591:3:2574 -592:3:2575 -593:3:2580 -594:3:2587 -595:3:2588 -596:3:2587 -597:3:2588 -598:3:2595 -599:3:2600 -600:0:4365 -601:3:2611 -602:0:4365 -603:3:2615 -604:3:2616 -605:3:2620 -606:3:2624 -607:3:2625 -608:3:2620 -609:3:2624 -610:3:2625 -611:3:2629 -612:3:2637 -613:3:2638 -614:3:2643 -615:3:2650 -616:3:2651 -617:3:2650 -618:3:2651 -619:3:2658 -620:3:2663 -621:0:4365 -622:3:2611 -623:0:4365 -624:3:2615 -625:3:2616 -626:3:2620 -627:3:2624 -628:3:2625 -629:3:2620 -630:3:2624 -631:3:2625 -632:3:2629 -633:3:2637 -634:3:2638 -635:3:2643 -636:3:2650 -637:3:2651 -638:3:2650 -639:3:2651 -640:3:2658 -641:3:2663 -642:0:4365 -643:3:2674 -644:0:4365 -645:3:2682 -646:3:2683 -647:3:2687 -648:3:2691 -649:3:2692 -650:3:2687 -651:3:2691 -652:3:2692 -653:3:2696 -654:3:2704 -655:3:2705 -656:3:2710 -657:3:2717 -658:3:2718 -659:3:2717 -660:3:2718 -661:3:2725 -662:3:2730 -663:0:4365 -664:3:2745 -665:0:4365 -666:3:2746 -667:0:4365 -668:2:1173 -669:0:4365 -670:3:2747 -671:0:4365 -672:2:1179 -673:0:4365 -674:2:1180 -675:0:4365 -676:3:2746 -677:0:4365 -678:2:1181 -679:2:1185 -680:2:1186 -681:2:1194 -682:2:1195 -683:2:1199 -684:2:1200 -685:2:1194 -686:2:1195 -687:2:1199 -688:2:1200 -689:2:1208 -690:2:1213 -691:2:1217 -692:2:1218 -693:2:1225 -694:2:1226 -695:2:1237 -696:2:1238 -697:2:1239 -698:2:1237 -699:2:1238 -700:2:1239 -701:2:1250 -702:2:1255 -703:2:1256 -704:0:4365 -705:3:2747 -706:0:4365 -707:2:1268 -708:0:4365 -709:3:2746 -710:0:4365 -711:2:1270 -712:0:4365 -713:3:2747 -714:0:4365 -715:2:1271 -716:2:1275 -717:2:1276 -718:2:1284 -719:2:1285 -720:2:1289 -721:2:1290 -722:2:1284 -723:2:1285 -724:2:1289 -725:2:1290 -726:2:1298 -727:2:1303 -728:2:1307 -729:2:1308 -730:2:1315 -731:2:1316 -732:2:1327 -733:2:1328 -734:2:1329 -735:2:1327 -736:2:1328 -737:2:1329 -738:2:1340 -739:2:1345 -740:2:1346 -741:0:4365 -742:2:1358 -743:0:4365 -744:2:1360 -745:0:4365 -746:3:2746 -747:0:4365 -748:2:1361 -749:0:4365 -750:3:2747 -751:0:4365 -752:2:1362 -753:2:1366 -754:2:1367 -755:2:1375 -756:2:1376 -757:2:1380 -758:2:1381 -759:2:1375 -760:2:1376 -761:2:1380 -762:2:1381 -763:2:1389 -764:2:1394 -765:2:1398 -766:2:1399 -767:2:1406 -768:2:1407 -769:2:1418 -770:2:1419 -771:2:1420 -772:2:1418 -773:2:1419 -774:2:1420 -775:2:1431 -776:2:1436 -777:2:1437 -778:0:4365 -779:2:1449 -780:0:4365 -781:3:2746 -782:0:4365 -783:2:1451 -784:0:4365 -785:3:2747 -786:0:4365 -787:2:1652 -788:0:4365 -789:2:1653 -790:0:4365 -791:2:1657 -792:0:4365 -793:2:1180 -794:0:4365 -795:3:2746 -796:0:4365 -797:2:1181 -798:2:1185 -799:2:1186 -800:2:1194 -801:2:1195 -802:2:1199 -803:2:1200 -804:2:1194 -805:2:1195 -806:2:1196 -807:2:1208 -808:2:1213 -809:2:1217 -810:2:1218 -811:2:1225 -812:2:1226 -813:2:1237 -814:2:1238 -815:2:1239 -816:2:1237 -817:2:1238 -818:2:1239 -819:2:1250 -820:2:1255 -821:2:1256 -822:0:4365 -823:3:2747 -824:0:4365 -825:2:1268 -826:0:4365 -827:3:2746 -828:0:4365 -829:2:1270 -830:0:4365 -831:3:2747 -832:0:4365 -833:2:1271 -834:2:1275 -835:2:1276 -836:2:1284 -837:2:1285 -838:2:1289 -839:2:1290 -840:2:1284 -841:2:1285 -842:2:1289 -843:2:1290 -844:2:1298 -845:2:1303 -846:2:1307 -847:2:1308 -848:2:1315 -849:2:1316 -850:2:1327 -851:2:1328 -852:2:1329 -853:2:1327 -854:2:1328 -855:2:1329 -856:2:1340 -857:2:1345 -858:2:1346 -859:0:4365 -860:2:1358 -861:0:4365 -862:2:1454 -863:0:4365 -864:3:2746 -865:0:4365 -866:2:1455 -867:0:4365 -868:3:2747 -869:0:4365 -870:2:1652 -871:0:4365 -872:2:1653 -873:0:4365 -874:2:1657 -875:0:4365 -876:2:1660 -877:0:4365 -878:3:2746 -879:0:4365 -880:2:1665 -881:2:1669 -882:2:1670 -883:2:1678 -884:2:1679 -885:2:1683 -886:2:1684 -887:2:1678 -888:2:1679 -889:2:1680 -890:2:1692 -891:2:1697 -892:2:1701 -893:2:1702 -894:2:1709 -895:2:1710 -896:2:1721 -897:2:1722 -898:2:1723 -899:2:1721 -900:2:1722 -901:2:1723 -902:2:1734 -903:2:1739 -904:2:1740 -905:0:4365 -906:3:2747 -907:0:4365 -908:2:1752 -909:0:4365 -910:3:2746 -911:0:4365 -912:2:1754 -913:0:4365 -914:3:2747 -915:0:4365 -916:2:1755 -917:2:1759 -918:2:1760 -919:2:1768 -920:2:1769 -921:2:1773 -922:2:1774 -923:2:1768 -924:2:1769 -925:2:1773 -926:2:1774 -927:2:1782 -928:2:1787 -929:2:1791 -930:2:1792 -931:2:1799 -932:2:1800 -933:2:1811 -934:2:1812 -935:2:1813 -936:2:1811 -937:2:1812 -938:2:1813 -939:2:1824 -940:2:1829 -941:2:1830 -942:0:4365 -943:2:1842 -944:0:4365 -945:3:2746 -946:0:4365 -947:2:1844 -948:0:4365 -949:3:2747 -950:0:4365 -951:2:1845 -952:2:1849 -953:2:1850 -954:2:1858 -955:2:1859 -956:2:1863 -957:2:1864 -958:2:1858 -959:2:1859 -960:2:1863 -961:2:1864 -962:2:1872 -963:2:1877 -964:2:1881 -965:2:1882 -966:2:1889 -967:2:1890 -968:2:1901 -969:2:1902 -970:2:1903 -971:2:1901 -972:2:1902 -973:2:1903 -974:2:1914 -975:2:1919 -976:2:1920 -977:0:4365 -978:2:1932 -979:0:4365 -980:3:2746 -981:0:4365 -982:2:1934 -983:0:4365 -984:3:2747 -985:0:4365 -986:2:1935 -987:0:4365 -988:2:1936 -989:0:4365 -990:2:2129 -991:0:4365 -992:2:2130 -993:0:4365 -994:2:2134 -995:0:4365 -996:3:2746 -997:0:4365 -998:2:2136 -999:0:4365 -1000:3:2747 -1001:0:4365 -1002:2:2137 -1003:2:2141 -1004:2:2142 -1005:2:2150 -1006:2:2151 -1007:2:2155 -1008:2:2156 -1009:2:2150 -1010:2:2151 -1011:2:2155 -1012:2:2156 -1013:2:2164 -1014:2:2169 -1015:2:2173 -1016:2:2174 -1017:2:2181 -1018:2:2182 -1019:2:2193 -1020:2:2194 -1021:2:2195 -1022:2:2193 -1023:2:2194 -1024:2:2195 -1025:2:2206 -1026:2:2211 -1027:2:2212 -1028:0:4365 -1029:2:2224 -1030:0:4365 -1031:3:2746 -1032:0:4365 -1033:2:2226 -1034:0:4365 -1035:3:2747 -1036:0:4365 -1037:2:1936 -1038:0:4365 -1039:2:2129 -1040:0:4365 -1041:2:2130 -1042:0:4365 -1043:2:2134 -1044:0:4365 -1045:3:2746 -1046:0:4365 -1047:2:2136 -1048:0:4365 -1049:3:2747 -1050:0:4365 -1051:2:2137 -1052:2:2141 -1053:2:2142 -1054:2:2150 -1055:2:2151 -1056:2:2155 -1057:2:2156 -1058:2:2150 -1059:2:2151 -1060:2:2152 -1061:2:2164 -1062:2:2169 -1063:2:2173 -1064:2:2174 -1065:2:2181 -1066:2:2182 -1067:2:2193 -1068:2:2194 -1069:2:2195 -1070:2:2193 -1071:2:2194 -1072:2:2195 -1073:2:2206 -1074:2:2211 -1075:2:2212 -1076:0:4365 -1077:2:2224 -1078:0:4365 -1079:3:2746 -1080:0:4365 -1081:2:2226 -1082:0:4365 -1083:3:2747 -1084:0:4365 -1085:2:2230 -1086:0:4365 -1087:3:2746 -1088:0:4365 -1089:2:2235 -1090:2:2239 -1091:2:2240 -1092:2:2248 -1093:2:2249 -1094:2:2253 -1095:2:2254 -1096:2:2248 -1097:2:2249 -1098:2:2250 -1099:2:2262 -1100:2:2267 -1101:2:2271 -1102:2:2272 -1103:2:2279 -1104:2:2280 -1105:2:2291 -1106:2:2292 -1107:2:2293 -1108:2:2291 -1109:2:2292 -1110:2:2293 -1111:2:2304 -1112:2:2309 -1113:2:2310 -1114:0:4365 -1115:3:2747 -1116:0:4365 -1117:2:2322 -1118:0:4365 -1119:2:1169 -1120:0:4365 -1121:3:2746 -1122:0:4365 -1123:2:1170 -1124:0:4365 -1125:3:2747 -1126:0:4365 -1127:3:2748 -1128:0:4365 -1129:3:2754 -1130:0:4365 -1131:3:2755 -1132:3:2759 -1133:3:2760 -1134:3:2768 -1135:3:2769 -1136:3:2773 -1137:3:2774 -1138:3:2768 -1139:3:2769 -1140:3:2773 -1141:3:2774 -1142:3:2782 -1143:3:2787 -1144:3:2791 -1145:3:2792 -1146:3:2799 -1147:3:2800 -1148:3:2811 -1149:3:2812 -1150:3:2813 -1151:3:2811 -1152:3:2812 -1153:3:2813 -1154:3:2824 -1155:3:2829 -1156:3:2830 -1157:0:4365 -1158:3:2842 -1159:0:4365 -1160:3:2843 -1161:0:4365 -1162:2:1173 -1163:0:4365 -1164:3:2844 -1165:0:4365 -1166:2:1179 -1167:0:4365 -1168:2:1180 -1169:0:4365 -1170:3:2843 -1171:0:4365 -1172:2:1181 -1173:2:1185 -1174:2:1186 -1175:2:1194 -1176:2:1195 -1177:2:1199 -1178:2:1200 -1179:2:1194 -1180:2:1195 -1181:2:1199 -1182:2:1200 -1183:2:1208 -1184:2:1213 -1185:2:1217 -1186:2:1218 -1187:2:1225 -1188:2:1226 -1189:2:1237 -1190:2:1238 -1191:2:1239 -1192:2:1237 -1193:2:1238 -1194:2:1239 -1195:2:1250 -1196:2:1255 -1197:2:1256 -1198:0:4365 -1199:3:2844 -1200:0:4365 -1201:2:1268 -1202:0:4365 -1203:3:2843 -1204:0:4365 -1205:2:1270 -1206:0:4365 -1207:3:2844 -1208:0:4365 -1209:2:1271 -1210:2:1275 -1211:2:1276 -1212:2:1284 -1213:2:1285 -1214:2:1289 -1215:2:1290 -1216:2:1284 -1217:2:1285 -1218:2:1289 -1219:2:1290 -1220:2:1298 -1221:2:1303 -1222:2:1307 -1223:2:1308 -1224:2:1315 -1225:2:1316 -1226:2:1327 -1227:2:1328 -1228:2:1329 -1229:2:1327 -1230:2:1328 -1231:2:1329 -1232:2:1340 -1233:2:1345 -1234:2:1346 -1235:0:4365 -1236:2:1358 -1237:0:4365 -1238:2:1360 -1239:0:4365 -1240:3:2843 -1241:0:4365 -1242:2:1361 -1243:0:4365 -1244:3:2844 -1245:0:4365 -1246:2:1362 -1247:2:1366 -1248:2:1367 -1249:2:1375 -1250:2:1376 -1251:2:1380 -1252:2:1381 -1253:2:1375 -1254:2:1376 -1255:2:1380 -1256:2:1381 -1257:2:1389 -1258:2:1394 -1259:2:1398 -1260:2:1399 -1261:2:1406 -1262:2:1407 -1263:2:1418 -1264:2:1419 -1265:2:1420 -1266:2:1418 -1267:2:1419 -1268:2:1420 -1269:2:1431 -1270:2:1436 -1271:2:1437 -1272:0:4365 -1273:2:1449 -1274:0:4365 -1275:3:2843 -1276:0:4365 -1277:2:1451 -1278:0:4365 -1279:3:2844 -1280:0:4365 -1281:2:1652 -1282:0:4365 -1283:2:1653 -1284:0:4365 -1285:2:1657 -1286:0:4365 -1287:2:1180 -1288:0:4365 -1289:3:2843 -1290:0:4365 -1291:2:1181 -1292:2:1185 -1293:2:1186 -1294:2:1194 -1295:2:1195 -1296:2:1199 -1297:2:1200 -1298:2:1194 -1299:2:1195 -1300:2:1196 -1301:2:1208 -1302:2:1213 -1303:2:1217 -1304:2:1218 -1305:2:1225 -1306:2:1226 -1307:2:1237 -1308:2:1238 -1309:2:1239 -1310:2:1237 -1311:2:1238 -1312:2:1239 -1313:2:1250 -1314:2:1255 -1315:2:1256 -1316:0:4365 -1317:3:2844 -1318:0:4365 -1319:2:1268 -1320:0:4365 -1321:3:2843 -1322:0:4365 -1323:2:1270 -1324:0:4365 -1325:3:2844 -1326:0:4365 -1327:2:1271 -1328:2:1275 -1329:2:1276 -1330:2:1284 -1331:2:1285 -1332:2:1289 -1333:2:1290 -1334:2:1284 -1335:2:1285 -1336:2:1289 -1337:2:1290 -1338:2:1298 -1339:2:1303 -1340:2:1307 -1341:2:1308 -1342:2:1315 -1343:2:1316 -1344:2:1327 -1345:2:1328 -1346:2:1329 -1347:2:1327 -1348:2:1328 -1349:2:1329 -1350:2:1340 -1351:2:1345 -1352:2:1346 -1353:0:4365 -1354:2:1358 -1355:0:4365 -1356:2:1454 -1357:0:4365 -1358:3:2843 -1359:0:4365 -1360:2:1455 -1361:0:4365 -1362:3:2844 -1363:0:4365 -1364:2:1652 -1365:0:4365 -1366:2:1653 -1367:0:4365 -1368:2:1657 -1369:0:4365 -1370:2:1660 -1371:0:4365 -1372:3:2843 -1373:0:4365 -1374:2:1665 -1375:2:1669 -1376:2:1670 -1377:2:1678 -1378:2:1679 -1379:2:1683 -1380:2:1684 -1381:2:1678 -1382:2:1679 -1383:2:1680 -1384:2:1692 -1385:2:1697 -1386:2:1701 -1387:2:1702 -1388:2:1709 -1389:2:1710 -1390:2:1721 -1391:2:1722 -1392:2:1723 -1393:2:1721 -1394:2:1722 -1395:2:1723 -1396:2:1734 -1397:2:1739 -1398:2:1740 -1399:0:4365 -1400:3:2844 -1401:0:4365 -1402:2:1752 -1403:0:4365 -1404:3:2843 -1405:0:4365 -1406:2:1754 -1407:0:4365 -1408:3:2844 -1409:0:4365 -1410:2:1755 -1411:2:1759 -1412:2:1760 -1413:2:1768 -1414:2:1769 -1415:2:1773 -1416:2:1774 -1417:2:1768 -1418:2:1769 -1419:2:1773 -1420:2:1774 -1421:2:1782 -1422:2:1787 -1423:2:1791 -1424:2:1792 -1425:2:1799 -1426:2:1800 -1427:2:1811 -1428:2:1812 -1429:2:1813 -1430:2:1811 -1431:2:1812 -1432:2:1813 -1433:2:1824 -1434:2:1829 -1435:2:1830 -1436:0:4365 -1437:2:1842 -1438:0:4365 -1439:3:2843 -1440:0:4365 -1441:2:1844 -1442:0:4365 -1443:3:2844 -1444:0:4365 -1445:2:1845 -1446:2:1849 -1447:2:1850 -1448:2:1858 -1449:2:1859 -1450:2:1863 -1451:2:1864 -1452:2:1858 -1453:2:1859 -1454:2:1863 -1455:2:1864 -1456:2:1872 -1457:2:1877 -1458:2:1881 -1459:2:1882 -1460:2:1889 -1461:2:1890 -1462:2:1901 -1463:2:1902 -1464:2:1903 -1465:2:1901 -1466:2:1902 -1467:2:1903 -1468:2:1914 -1469:2:1919 -1470:2:1920 -1471:0:4365 -1472:2:1932 -1473:0:4365 -1474:3:2843 -1475:0:4365 -1476:2:1934 -1477:0:4365 -1478:3:2844 -1479:0:4365 -1480:2:1935 -1481:0:4365 -1482:2:1936 -1483:0:4365 -1484:2:2129 -1485:0:4365 -1486:2:2130 -1487:0:4365 -1488:2:2134 -1489:0:4365 -1490:3:2843 -1491:0:4365 -1492:2:2136 -1493:0:4365 -1494:3:2844 -1495:0:4365 -1496:2:2137 -1497:2:2141 -1498:2:2142 -1499:2:2150 -1500:2:2151 -1501:2:2155 -1502:2:2156 -1503:2:2150 -1504:2:2151 -1505:2:2155 -1506:2:2156 -1507:2:2164 -1508:2:2169 -1509:2:2173 -1510:2:2174 -1511:2:2181 -1512:2:2182 -1513:2:2193 -1514:2:2194 -1515:2:2195 -1516:2:2193 -1517:2:2194 -1518:2:2195 -1519:2:2206 -1520:2:2211 -1521:2:2212 -1522:0:4365 -1523:2:2224 -1524:0:4365 -1525:3:2843 -1526:0:4365 -1527:2:2226 -1528:0:4365 -1529:3:2844 -1530:0:4365 -1531:2:1936 -1532:0:4365 -1533:2:2129 -1534:0:4365 -1535:2:2130 -1536:0:4365 -1537:2:2134 -1538:0:4365 -1539:3:2843 -1540:0:4365 -1541:2:2136 -1542:0:4365 -1543:3:2844 -1544:0:4365 -1545:2:2137 -1546:2:2141 -1547:2:2142 -1548:2:2150 -1549:2:2151 -1550:2:2155 -1551:2:2156 -1552:2:2150 -1553:2:2151 -1554:2:2152 -1555:2:2164 -1556:2:2169 -1557:2:2173 -1558:2:2174 -1559:2:2181 -1560:2:2182 -1561:2:2193 -1562:2:2194 -1563:2:2195 -1564:2:2193 -1565:2:2194 -1566:2:2195 -1567:2:2206 -1568:2:2211 -1569:2:2212 -1570:0:4365 -1571:2:2224 -1572:0:4365 -1573:3:2843 -1574:0:4365 -1575:2:2226 -1576:0:4365 -1577:3:2844 -1578:0:4365 -1579:2:2230 -1580:0:4365 -1581:3:2843 -1582:0:4365 -1583:2:2235 -1584:2:2239 -1585:2:2240 -1586:2:2248 -1587:2:2249 -1588:2:2253 -1589:2:2254 -1590:2:2248 -1591:2:2249 -1592:2:2250 -1593:2:2262 -1594:2:2267 -1595:2:2271 -1596:2:2272 -1597:2:2279 -1598:2:2280 -1599:2:2291 -1600:2:2292 -1601:2:2293 -1602:2:2291 -1603:2:2292 -1604:2:2293 -1605:2:2304 -1606:2:2309 -1607:2:2310 -1608:0:4365 -1609:3:2844 -1610:0:4365 -1611:2:2322 -1612:0:4365 -1613:2:1169 -1614:0:4365 -1615:3:2843 -1616:0:4365 -1617:2:1170 -1618:0:4365 -1619:3:2844 -1620:0:4365 -1621:3:2845 -1622:0:4365 -1623:3:2851 -1624:0:4365 -1625:3:2854 -1626:3:2855 -1627:3:2867 -1628:3:2868 -1629:3:2872 -1630:3:2873 -1631:3:2867 -1632:3:2868 -1633:3:2872 -1634:3:2873 -1635:3:2881 -1636:3:2886 -1637:3:2890 -1638:3:2891 -1639:3:2898 -1640:3:2899 -1641:3:2910 -1642:3:2911 -1643:3:2912 -1644:3:2910 -1645:3:2911 -1646:3:2912 -1647:3:2923 -1648:3:2928 -1649:3:2929 -1650:0:4365 -1651:3:2941 -1652:0:4365 -1653:3:2942 -1654:0:4365 -1655:2:1173 -1656:0:4365 -1657:3:2943 -1658:0:4365 -1659:2:1179 -1660:0:4365 -1661:2:1180 -1662:0:4365 -1663:3:2942 -1664:0:4365 -1665:2:1181 -1666:2:1185 -1667:2:1186 -1668:2:1194 -1669:2:1195 -1670:2:1199 -1671:2:1200 -1672:2:1194 -1673:2:1195 -1674:2:1199 -1675:2:1200 -1676:2:1208 -1677:2:1213 -1678:2:1217 -1679:2:1218 -1680:2:1225 -1681:2:1226 -1682:2:1237 -1683:2:1238 -1684:2:1239 -1685:2:1237 -1686:2:1238 -1687:2:1239 -1688:2:1250 -1689:2:1255 -1690:2:1256 -1691:0:4365 -1692:3:2943 -1693:0:4365 -1694:2:1268 -1695:0:4365 -1696:3:2942 -1697:0:4365 -1698:2:1270 -1699:0:4365 -1700:3:2943 -1701:0:4365 -1702:2:1271 -1703:2:1275 -1704:2:1276 -1705:2:1284 -1706:2:1285 -1707:2:1289 -1708:2:1290 -1709:2:1284 -1710:2:1285 -1711:2:1289 -1712:2:1290 -1713:2:1298 -1714:2:1303 -1715:2:1307 -1716:2:1308 -1717:2:1315 -1718:2:1316 -1719:2:1327 -1720:2:1328 -1721:2:1329 -1722:2:1327 -1723:2:1328 -1724:2:1329 -1725:2:1340 -1726:2:1345 -1727:2:1346 -1728:0:4365 -1729:2:1358 -1730:0:4365 -1731:2:1360 -1732:0:4365 -1733:3:2942 -1734:0:4365 -1735:2:1361 -1736:0:4365 -1737:3:2943 -1738:0:4365 -1739:2:1362 -1740:2:1366 -1741:2:1367 -1742:2:1375 -1743:2:1376 -1744:2:1380 -1745:2:1381 -1746:2:1375 -1747:2:1376 -1748:2:1380 -1749:2:1381 -1750:2:1389 -1751:2:1394 -1752:2:1398 -1753:2:1399 -1754:2:1406 -1755:2:1407 -1756:2:1418 -1757:2:1419 -1758:2:1420 -1759:2:1418 -1760:2:1419 -1761:2:1420 -1762:2:1431 -1763:2:1436 -1764:2:1437 -1765:0:4365 -1766:2:1449 -1767:0:4365 -1768:3:2942 -1769:0:4365 -1770:2:1451 -1771:0:4365 -1772:3:2943 -1773:0:4365 -1774:2:1652 -1775:0:4365 -1776:2:1653 -1777:0:4365 -1778:2:1657 -1779:0:4365 -1780:2:1180 -1781:0:4365 -1782:3:2942 -1783:0:4365 -1784:2:1181 -1785:2:1185 -1786:2:1186 -1787:2:1194 -1788:2:1195 -1789:2:1199 -1790:2:1200 -1791:2:1194 -1792:2:1195 -1793:2:1196 -1794:2:1208 -1795:2:1213 -1796:2:1217 -1797:2:1218 -1798:2:1225 -1799:2:1226 -1800:2:1237 -1801:2:1238 -1802:2:1239 -1803:2:1237 -1804:2:1238 -1805:2:1239 -1806:2:1250 -1807:2:1255 -1808:2:1256 -1809:0:4365 -1810:3:2943 -1811:0:4365 -1812:2:1268 -1813:0:4365 -1814:3:2942 -1815:0:4365 -1816:2:1270 -1817:0:4365 -1818:3:2943 -1819:0:4365 -1820:2:1271 -1821:2:1275 -1822:2:1276 -1823:2:1284 -1824:2:1285 -1825:2:1289 -1826:2:1290 -1827:2:1284 -1828:2:1285 -1829:2:1289 -1830:2:1290 -1831:2:1298 -1832:2:1303 -1833:2:1307 -1834:2:1308 -1835:2:1315 -1836:2:1316 -1837:2:1327 -1838:2:1328 -1839:2:1329 -1840:2:1327 -1841:2:1328 -1842:2:1329 -1843:2:1340 -1844:2:1345 -1845:2:1346 -1846:0:4365 -1847:2:1358 -1848:0:4365 -1849:2:1454 -1850:0:4365 -1851:3:2942 -1852:0:4365 -1853:2:1455 -1854:0:4365 -1855:3:2943 -1856:0:4365 -1857:2:1652 -1858:0:4365 -1859:2:1653 -1860:0:4365 -1861:2:1657 -1862:0:4365 -1863:2:1660 -1864:0:4365 -1865:3:2942 -1866:0:4365 -1867:2:1665 -1868:2:1669 -1869:2:1670 -1870:2:1678 -1871:2:1679 -1872:2:1683 -1873:2:1684 -1874:2:1678 -1875:2:1679 -1876:2:1680 -1877:2:1692 -1878:2:1697 -1879:2:1701 -1880:2:1702 -1881:2:1709 -1882:2:1710 -1883:2:1721 -1884:2:1722 -1885:2:1723 -1886:2:1721 -1887:2:1722 -1888:2:1723 -1889:2:1734 -1890:2:1739 -1891:2:1740 -1892:0:4365 -1893:3:2943 -1894:0:4365 -1895:2:1752 -1896:0:4365 -1897:3:2942 -1898:0:4365 -1899:2:1754 -1900:0:4365 -1901:3:2943 -1902:0:4365 -1903:2:1755 -1904:2:1759 -1905:2:1760 -1906:2:1768 -1907:2:1769 -1908:2:1773 -1909:2:1774 -1910:2:1768 -1911:2:1769 -1912:2:1773 -1913:2:1774 -1914:2:1782 -1915:2:1787 -1916:2:1791 -1917:2:1792 -1918:2:1799 -1919:2:1800 -1920:2:1811 -1921:2:1812 -1922:2:1813 -1923:2:1811 -1924:2:1812 -1925:2:1813 -1926:2:1824 -1927:2:1829 -1928:2:1830 -1929:0:4365 -1930:2:1842 -1931:0:4365 -1932:3:2942 -1933:0:4365 -1934:2:1844 -1935:0:4365 -1936:3:2943 -1937:0:4365 -1938:2:1845 -1939:2:1849 -1940:2:1850 -1941:2:1858 -1942:2:1859 -1943:2:1863 -1944:2:1864 -1945:2:1858 -1946:2:1859 -1947:2:1863 -1948:2:1864 -1949:2:1872 -1950:2:1877 -1951:2:1881 -1952:2:1882 -1953:2:1889 -1954:2:1890 -1955:2:1901 -1956:2:1902 -1957:2:1903 -1958:2:1901 -1959:2:1902 -1960:2:1903 -1961:2:1914 -1962:2:1919 -1963:2:1920 -1964:0:4365 -1965:2:1932 -1966:0:4365 -1967:3:2942 -1968:0:4365 -1969:2:1934 -1970:0:4365 -1971:3:2943 -1972:0:4365 -1973:2:1935 -1974:0:4365 -1975:2:1936 -1976:0:4365 -1977:2:2129 -1978:0:4365 -1979:2:2130 -1980:0:4365 -1981:2:2134 -1982:0:4365 -1983:3:2942 -1984:0:4365 -1985:2:2136 -1986:0:4365 -1987:3:2943 -1988:0:4365 -1989:2:2137 -1990:2:2141 -1991:2:2142 -1992:2:2150 -1993:2:2151 -1994:2:2155 -1995:2:2156 -1996:2:2150 -1997:2:2151 -1998:2:2155 -1999:2:2156 -2000:2:2164 -2001:2:2169 -2002:2:2173 -2003:2:2174 -2004:2:2181 -2005:2:2182 -2006:2:2193 -2007:2:2194 -2008:2:2195 -2009:2:2193 -2010:2:2194 -2011:2:2195 -2012:2:2206 -2013:2:2211 -2014:2:2212 -2015:0:4365 -2016:2:2224 -2017:0:4365 -2018:3:2942 -2019:0:4365 -2020:2:2226 -2021:0:4365 -2022:3:2943 -2023:0:4365 -2024:2:1936 -2025:0:4365 -2026:2:2129 -2027:0:4365 -2028:2:2130 -2029:0:4365 -2030:2:2134 -2031:0:4365 -2032:3:2942 -2033:0:4365 -2034:2:2136 -2035:0:4365 -2036:3:2943 -2037:0:4365 -2038:2:2137 -2039:2:2141 -2040:2:2142 -2041:2:2150 -2042:2:2151 -2043:2:2155 -2044:2:2156 -2045:2:2150 -2046:2:2151 -2047:2:2152 -2048:2:2164 -2049:2:2169 -2050:2:2173 -2051:2:2174 -2052:2:2181 -2053:2:2182 -2054:2:2193 -2055:2:2194 -2056:2:2195 -2057:2:2193 -2058:2:2194 -2059:2:2195 -2060:2:2206 -2061:2:2211 -2062:2:2212 -2063:0:4365 -2064:2:2224 -2065:0:4365 -2066:3:2942 -2067:0:4365 -2068:2:2226 -2069:0:4365 -2070:3:2943 -2071:0:4365 -2072:2:2230 -2073:0:4365 -2074:3:2942 -2075:0:4365 -2076:2:2235 -2077:2:2239 -2078:2:2240 -2079:2:2248 -2080:2:2249 -2081:2:2253 -2082:2:2254 -2083:2:2248 -2084:2:2249 -2085:2:2250 -2086:2:2262 -2087:2:2267 -2088:2:2271 -2089:2:2272 -2090:2:2279 -2091:2:2280 -2092:2:2291 -2093:2:2292 -2094:2:2293 -2095:2:2291 -2096:2:2292 -2097:2:2293 -2098:2:2304 -2099:2:2309 -2100:2:2310 -2101:0:4365 -2102:3:2943 -2103:0:4365 -2104:2:2322 -2105:0:4365 -2106:2:1169 -2107:0:4365 -2108:3:2942 -2109:0:4365 -2110:2:1170 -2111:0:4365 -2112:3:2943 -2113:0:4365 -2114:3:2944 -2115:0:4365 -2116:3:2950 -2117:0:4365 -2118:3:2951 -2119:0:4365 -2120:3:2952 -2121:0:4365 -2122:3:2953 -2123:0:4365 -2124:3:2954 -2125:3:2958 -2126:3:2959 -2127:3:2967 -2128:3:2968 -2129:3:2972 -2130:3:2973 -2131:3:2967 -2132:3:2968 -2133:3:2972 -2134:3:2973 -2135:3:2981 -2136:3:2986 -2137:3:2990 -2138:3:2991 -2139:3:2998 -2140:3:2999 -2141:3:3010 -2142:3:3011 -2143:3:3012 -2144:3:3010 -2145:3:3011 -2146:3:3012 -2147:3:3023 -2148:3:3028 -2149:3:3029 -2150:0:4365 -2151:3:3041 -2152:0:4365 -2153:3:3042 -2154:0:4365 -2155:2:1173 -2156:0:4365 -2157:3:3043 -2158:0:4365 -2159:2:1179 -2160:0:4365 -2161:2:1180 -2162:0:4365 -2163:3:3042 -2164:0:4365 -2165:2:1181 -2166:2:1185 -2167:2:1186 -2168:2:1194 -2169:2:1195 -2170:2:1199 -2171:2:1200 -2172:2:1194 -2173:2:1195 -2174:2:1199 -2175:2:1200 -2176:2:1208 -2177:2:1213 -2178:2:1217 -2179:2:1218 -2180:2:1225 -2181:2:1226 -2182:2:1237 -2183:2:1238 -2184:2:1239 -2185:2:1237 -2186:2:1238 -2187:2:1239 -2188:2:1250 -2189:2:1255 -2190:2:1256 -2191:0:4365 -2192:3:3043 -2193:0:4365 -2194:2:1268 -2195:0:4365 -2196:3:3042 -2197:0:4365 -2198:2:1270 -2199:0:4365 -2200:3:3043 -2201:0:4365 -2202:2:1271 -2203:2:1275 -2204:2:1276 -2205:2:1284 -2206:2:1285 -2207:2:1289 -2208:2:1290 -2209:2:1284 -2210:2:1285 -2211:2:1289 -2212:2:1290 -2213:2:1298 -2214:2:1303 -2215:2:1307 -2216:2:1308 -2217:2:1315 -2218:2:1316 -2219:2:1327 -2220:2:1328 -2221:2:1329 -2222:2:1327 -2223:2:1328 -2224:2:1329 -2225:2:1340 -2226:2:1345 -2227:2:1346 -2228:0:4365 -2229:2:1358 -2230:0:4365 -2231:2:1360 -2232:0:4365 -2233:3:3042 -2234:0:4365 -2235:2:1361 -2236:0:4365 -2237:3:3043 -2238:0:4365 -2239:2:1362 -2240:2:1366 -2241:2:1367 -2242:2:1375 -2243:2:1376 -2244:2:1380 -2245:2:1381 -2246:2:1375 -2247:2:1376 -2248:2:1380 -2249:2:1381 -2250:2:1389 -2251:2:1394 -2252:2:1398 -2253:2:1399 -2254:2:1406 -2255:2:1407 -2256:2:1418 -2257:2:1419 -2258:2:1420 -2259:2:1418 -2260:2:1419 -2261:2:1420 -2262:2:1431 -2263:2:1436 -2264:2:1437 -2265:0:4365 -2266:2:1449 -2267:0:4365 -2268:3:3042 -2269:0:4365 -2270:2:1451 -2271:0:4365 -2272:3:3043 -2273:0:4365 -2274:2:1652 -2275:0:4365 -2276:2:1653 -2277:0:4365 -2278:2:1657 -2279:0:4365 -2280:2:1180 -2281:0:4365 -2282:3:3042 -2283:0:4365 -2284:2:1181 -2285:2:1185 -2286:2:1186 -2287:2:1194 -2288:2:1195 -2289:2:1199 -2290:2:1200 -2291:2:1194 -2292:2:1195 -2293:2:1196 -2294:2:1208 -2295:2:1213 -2296:2:1217 -2297:2:1218 -2298:2:1225 -2299:2:1226 -2300:2:1237 -2301:2:1238 -2302:2:1239 -2303:2:1237 -2304:2:1238 -2305:2:1239 -2306:2:1250 -2307:2:1255 -2308:2:1256 -2309:0:4365 -2310:3:3043 -2311:0:4365 -2312:2:1268 -2313:0:4365 -2314:3:3042 -2315:0:4365 -2316:2:1270 -2317:0:4365 -2318:3:3043 -2319:0:4365 -2320:2:1271 -2321:2:1275 -2322:2:1276 -2323:2:1284 -2324:2:1285 -2325:2:1289 -2326:2:1290 -2327:2:1284 -2328:2:1285 -2329:2:1289 -2330:2:1290 -2331:2:1298 -2332:2:1303 -2333:2:1307 -2334:2:1308 -2335:2:1315 -2336:2:1316 -2337:2:1327 -2338:2:1328 -2339:2:1329 -2340:2:1327 -2341:2:1328 -2342:2:1329 -2343:2:1340 -2344:2:1345 -2345:2:1346 -2346:0:4365 -2347:2:1358 -2348:0:4365 -2349:2:1454 -2350:0:4365 -2351:3:3042 -2352:0:4365 -2353:2:1455 -2354:0:4365 -2355:3:3043 -2356:0:4365 -2357:2:1652 -2358:0:4365 -2359:2:1653 -2360:0:4365 -2361:2:1657 -2362:0:4365 -2363:2:1660 -2364:0:4365 -2365:3:3042 -2366:0:4365 -2367:2:1665 -2368:2:1669 -2369:2:1670 -2370:2:1678 -2371:2:1679 -2372:2:1683 -2373:2:1684 -2374:2:1678 -2375:2:1679 -2376:2:1680 -2377:2:1692 -2378:2:1697 -2379:2:1701 -2380:2:1702 -2381:2:1709 -2382:2:1710 -2383:2:1721 -2384:2:1722 -2385:2:1723 -2386:2:1721 -2387:2:1722 -2388:2:1723 -2389:2:1734 -2390:2:1739 -2391:2:1740 -2392:0:4365 -2393:3:3043 -2394:0:4365 -2395:2:1752 -2396:0:4365 -2397:3:3042 -2398:0:4365 -2399:2:1754 -2400:0:4365 -2401:3:3043 -2402:0:4365 -2403:2:1755 -2404:2:1759 -2405:2:1760 -2406:2:1768 -2407:2:1769 -2408:2:1773 -2409:2:1774 -2410:2:1768 -2411:2:1769 -2412:2:1773 -2413:2:1774 -2414:2:1782 -2415:2:1787 -2416:2:1791 -2417:2:1792 -2418:2:1799 -2419:2:1800 -2420:2:1811 -2421:2:1812 -2422:2:1813 -2423:2:1811 -2424:2:1812 -2425:2:1813 -2426:2:1824 -2427:2:1829 -2428:2:1830 -2429:0:4365 -2430:2:1842 -2431:0:4365 -2432:3:3042 -2433:0:4365 -2434:2:1844 -2435:0:4365 -2436:3:3043 -2437:0:4365 -2438:2:1845 -2439:2:1849 -2440:2:1850 -2441:2:1858 -2442:2:1859 -2443:2:1863 -2444:2:1864 -2445:2:1858 -2446:2:1859 -2447:2:1863 -2448:2:1864 -2449:2:1872 -2450:2:1877 -2451:2:1881 -2452:2:1882 -2453:2:1889 -2454:2:1890 -2455:2:1901 -2456:2:1902 -2457:2:1903 -2458:2:1901 -2459:2:1902 -2460:2:1903 -2461:2:1914 -2462:2:1919 -2463:2:1920 -2464:0:4365 -2465:2:1932 -2466:0:4365 -2467:3:3042 -2468:0:4365 -2469:2:1934 -2470:0:4365 -2471:3:3043 -2472:0:4365 -2473:2:1935 -2474:0:4365 -2475:2:1936 -2476:0:4365 -2477:2:2129 -2478:0:4365 -2479:2:2130 -2480:0:4365 -2481:2:2134 -2482:0:4365 -2483:3:3042 -2484:0:4365 -2485:2:2136 -2486:0:4365 -2487:3:3043 -2488:0:4365 -2489:2:2137 -2490:2:2141 -2491:2:2142 -2492:2:2150 -2493:2:2151 -2494:2:2155 -2495:2:2156 -2496:2:2150 -2497:2:2151 -2498:2:2155 -2499:2:2156 -2500:2:2164 -2501:2:2169 -2502:2:2173 -2503:2:2174 -2504:2:2181 -2505:2:2182 -2506:2:2193 -2507:2:2194 -2508:2:2195 -2509:2:2193 -2510:2:2194 -2511:2:2195 -2512:2:2206 -2513:2:2211 -2514:2:2212 -2515:0:4365 -2516:2:2224 -2517:0:4365 -2518:3:3042 -2519:0:4365 -2520:2:2226 -2521:0:4365 -2522:3:3043 -2523:0:4365 -2524:2:1936 -2525:0:4365 -2526:2:2129 -2527:0:4365 -2528:2:2130 -2529:0:4365 -2530:2:2134 -2531:0:4365 -2532:3:3042 -2533:0:4365 -2534:2:2136 -2535:0:4365 -2536:3:3043 -2537:0:4365 -2538:2:2137 -2539:2:2141 -2540:2:2142 -2541:2:2150 -2542:2:2151 -2543:2:2155 -2544:2:2156 -2545:2:2150 -2546:2:2151 -2547:2:2152 -2548:2:2164 -2549:2:2169 -2550:2:2173 -2551:2:2174 -2552:2:2181 -2553:2:2182 -2554:2:2193 -2555:2:2194 -2556:2:2195 -2557:2:2193 -2558:2:2194 -2559:2:2195 -2560:2:2206 -2561:2:2211 -2562:2:2212 -2563:0:4365 -2564:2:2224 -2565:0:4365 -2566:3:3042 -2567:0:4365 -2568:2:2226 -2569:0:4365 -2570:3:3043 -2571:0:4365 -2572:2:2230 -2573:0:4365 -2574:3:3042 -2575:0:4365 -2576:2:2235 -2577:2:2239 -2578:2:2240 -2579:2:2248 -2580:2:2249 -2581:2:2253 -2582:2:2254 -2583:2:2248 -2584:2:2249 -2585:2:2250 -2586:2:2262 -2587:2:2267 -2588:2:2271 -2589:2:2272 -2590:2:2279 -2591:2:2280 -2592:2:2291 -2593:2:2292 -2594:2:2293 -2595:2:2291 -2596:2:2292 -2597:2:2293 -2598:2:2304 -2599:2:2309 -2600:2:2310 -2601:0:4365 -2602:3:3043 -2603:0:4365 -2604:2:2322 -2605:0:4365 -2606:2:1169 -2607:0:4365 -2608:3:3042 -2609:0:4365 -2610:2:1170 -2611:0:4365 -2612:3:3043 -2613:0:4365 -2614:3:3044 -2615:0:4365 -2616:3:3257 -2617:0:4365 -2618:3:3265 -2619:0:4365 -2620:3:3266 -2621:3:3270 -2622:3:3271 -2623:3:3279 -2624:3:3280 -2625:3:3284 -2626:3:3285 -2627:3:3279 -2628:3:3280 -2629:3:3284 -2630:3:3285 -2631:3:3293 -2632:3:3298 -2633:3:3302 -2634:3:3303 -2635:3:3310 -2636:3:3311 -2637:3:3322 -2638:3:3323 -2639:3:3324 -2640:3:3322 -2641:3:3323 -2642:3:3324 -2643:3:3335 -2644:3:3340 -2645:3:3341 -2646:0:4365 -2647:3:3353 -2648:0:4365 -2649:3:3354 -2650:0:4365 -2651:2:1173 -2652:0:4365 -2653:3:3355 -2654:0:4365 -2655:2:1179 -2656:0:4365 -2657:2:1180 -2658:0:4365 -2659:3:3354 -2660:0:4365 -2661:2:1181 -2662:2:1185 -2663:2:1186 -2664:2:1194 -2665:2:1195 -2666:2:1199 -2667:2:1200 -2668:2:1194 -2669:2:1195 -2670:2:1199 -2671:2:1200 -2672:2:1208 -2673:2:1213 -2674:2:1217 -2675:2:1218 -2676:2:1225 -2677:2:1226 -2678:2:1237 -2679:2:1238 -2680:2:1239 -2681:2:1237 -2682:2:1238 -2683:2:1239 -2684:2:1250 -2685:2:1255 -2686:2:1256 -2687:0:4365 -2688:3:3355 -2689:0:4365 -2690:2:1268 -2691:0:4365 -2692:3:3354 -2693:0:4365 -2694:2:1270 -2695:0:4365 -2696:3:3355 -2697:0:4365 -2698:2:1271 -2699:2:1275 -2700:2:1276 -2701:2:1284 -2702:2:1285 -2703:2:1289 -2704:2:1290 -2705:2:1284 -2706:2:1285 -2707:2:1289 -2708:2:1290 -2709:2:1298 -2710:2:1303 -2711:2:1307 -2712:2:1308 -2713:2:1315 -2714:2:1316 -2715:2:1327 -2716:2:1328 -2717:2:1329 -2718:2:1327 -2719:2:1328 -2720:2:1329 -2721:2:1340 -2722:2:1345 -2723:2:1346 -2724:0:4365 -2725:2:1358 -2726:0:4365 -2727:2:1360 -2728:0:4365 -2729:3:3354 -2730:0:4365 -2731:2:1361 -2732:0:4365 -2733:3:3355 -2734:0:4365 -2735:2:1362 -2736:2:1366 -2737:2:1367 -2738:2:1375 -2739:2:1376 -2740:2:1380 -2741:2:1381 -2742:2:1375 -2743:2:1376 -2744:2:1380 -2745:2:1381 -2746:2:1389 -2747:2:1394 -2748:2:1398 -2749:2:1399 -2750:2:1406 -2751:2:1407 -2752:2:1418 -2753:2:1419 -2754:2:1420 -2755:2:1418 -2756:2:1419 -2757:2:1420 -2758:2:1431 -2759:2:1436 -2760:2:1437 -2761:0:4365 -2762:2:1449 -2763:0:4365 -2764:3:3354 -2765:0:4365 -2766:2:1451 -2767:0:4365 -2768:3:3355 -2769:0:4365 -2770:2:1652 -2771:0:4365 -2772:2:1653 -2773:0:4365 -2774:2:1657 -2775:0:4365 -2776:2:1180 -2777:0:4365 -2778:3:3354 -2779:0:4365 -2780:2:1181 -2781:2:1185 -2782:2:1186 -2783:2:1194 -2784:2:1195 -2785:2:1199 -2786:2:1200 -2787:2:1194 -2788:2:1195 -2789:2:1196 -2790:2:1208 -2791:2:1213 -2792:2:1217 -2793:2:1218 -2794:2:1225 -2795:2:1226 -2796:2:1237 -2797:2:1238 -2798:2:1239 -2799:2:1237 -2800:2:1238 -2801:2:1239 -2802:2:1250 -2803:2:1255 -2804:2:1256 -2805:0:4365 -2806:3:3355 -2807:0:4365 -2808:2:1268 -2809:0:4365 -2810:3:3354 -2811:0:4365 -2812:2:1270 -2813:0:4365 -2814:3:3355 -2815:0:4365 -2816:2:1271 -2817:2:1275 -2818:2:1276 -2819:2:1284 -2820:2:1285 -2821:2:1289 -2822:2:1290 -2823:2:1284 -2824:2:1285 -2825:2:1289 -2826:2:1290 -2827:2:1298 -2828:2:1303 -2829:2:1307 -2830:2:1308 -2831:2:1315 -2832:2:1316 -2833:2:1327 -2834:2:1328 -2835:2:1329 -2836:2:1327 -2837:2:1328 -2838:2:1329 -2839:2:1340 -2840:2:1345 -2841:2:1346 -2842:0:4365 -2843:2:1358 -2844:0:4365 -2845:2:1454 -2846:0:4365 -2847:3:3354 -2848:0:4365 -2849:2:1455 -2850:0:4365 -2851:3:3355 -2852:0:4365 -2853:2:1652 -2854:0:4365 -2855:2:1653 -2856:0:4365 -2857:2:1657 -2858:0:4365 -2859:2:1660 -2860:0:4365 -2861:3:3354 -2862:0:4365 -2863:2:1665 -2864:2:1669 -2865:2:1670 -2866:2:1678 -2867:2:1679 -2868:2:1683 -2869:2:1684 -2870:2:1678 -2871:2:1679 -2872:2:1680 -2873:2:1692 -2874:2:1697 -2875:2:1701 -2876:2:1702 -2877:2:1709 -2878:2:1710 -2879:2:1721 -2880:2:1722 -2881:2:1723 -2882:2:1721 -2883:2:1722 -2884:2:1723 -2885:2:1734 -2886:2:1739 -2887:2:1740 -2888:0:4365 -2889:3:3355 -2890:0:4365 -2891:2:1752 -2892:0:4365 -2893:3:3354 -2894:0:4365 -2895:2:1754 -2896:0:4365 -2897:3:3355 -2898:0:4365 -2899:2:1755 -2900:2:1759 -2901:2:1760 -2902:2:1768 -2903:2:1769 -2904:2:1773 -2905:2:1774 -2906:2:1768 -2907:2:1769 -2908:2:1773 -2909:2:1774 -2910:2:1782 -2911:2:1787 -2912:2:1791 -2913:2:1792 -2914:2:1799 -2915:2:1800 -2916:2:1811 -2917:2:1812 -2918:2:1813 -2919:2:1811 -2920:2:1812 -2921:2:1813 -2922:2:1824 -2923:2:1829 -2924:2:1830 -2925:0:4365 -2926:2:1842 -2927:0:4365 -2928:3:3354 -2929:0:4365 -2930:2:1844 -2931:0:4365 -2932:3:3355 -2933:0:4365 -2934:2:1845 -2935:2:1849 -2936:2:1850 -2937:2:1858 -2938:2:1859 -2939:2:1863 -2940:2:1864 -2941:2:1858 -2942:2:1859 -2943:2:1863 -2944:2:1864 -2945:2:1872 -2946:2:1877 -2947:2:1881 -2948:2:1882 -2949:2:1889 -2950:2:1890 -2951:2:1901 -2952:2:1902 -2953:2:1903 -2954:2:1901 -2955:2:1902 -2956:2:1903 -2957:2:1914 -2958:2:1919 -2959:2:1920 -2960:0:4365 -2961:2:1932 -2962:0:4365 -2963:3:3354 -2964:0:4365 -2965:2:1934 -2966:0:4365 -2967:3:3355 -2968:0:4365 -2969:2:1935 -2970:0:4365 -2971:2:1936 -2972:0:4365 -2973:2:2129 -2974:0:4365 -2975:2:2130 -2976:0:4365 -2977:2:2134 -2978:0:4365 -2979:3:3354 -2980:0:4365 -2981:2:2136 -2982:0:4365 -2983:3:3355 -2984:0:4365 -2985:2:2137 -2986:2:2141 -2987:2:2142 -2988:2:2150 -2989:2:2151 -2990:2:2155 -2991:2:2156 -2992:2:2150 -2993:2:2151 -2994:2:2155 -2995:2:2156 -2996:2:2164 -2997:2:2169 -2998:2:2173 -2999:2:2174 -3000:2:2181 -3001:2:2182 -3002:2:2193 -3003:2:2194 -3004:2:2195 -3005:2:2193 -3006:2:2194 -3007:2:2195 -3008:2:2206 -3009:2:2211 -3010:2:2212 -3011:0:4365 -3012:2:2224 -3013:0:4365 -3014:3:3354 -3015:0:4365 -3016:2:2226 -3017:0:4365 -3018:3:3355 -3019:0:4365 -3020:2:1936 -3021:0:4365 -3022:2:2129 -3023:0:4365 -3024:2:2130 -3025:0:4365 -3026:2:2134 -3027:0:4365 -3028:3:3354 -3029:0:4365 -3030:2:2136 -3031:0:4365 -3032:3:3355 -3033:0:4365 -3034:2:2137 -3035:2:2141 -3036:2:2142 -3037:2:2150 -3038:2:2151 -3039:2:2155 -3040:2:2156 -3041:2:2150 -3042:2:2151 -3043:2:2152 -3044:2:2164 -3045:2:2169 -3046:2:2173 -3047:2:2174 -3048:2:2181 -3049:2:2182 -3050:2:2193 -3051:2:2194 -3052:2:2195 -3053:2:2193 -3054:2:2194 -3055:2:2195 -3056:2:2206 -3057:2:2211 -3058:2:2212 -3059:0:4365 -3060:2:2224 -3061:0:4365 -3062:3:3354 -3063:0:4365 -3064:2:2226 -3065:0:4365 -3066:3:3355 -3067:0:4365 -3068:2:2230 -3069:0:4365 -3070:3:3354 -3071:0:4365 -3072:2:2235 -3073:2:2239 -3074:2:2240 -3075:2:2248 -3076:2:2249 -3077:2:2253 -3078:2:2254 -3079:2:2248 -3080:2:2249 -3081:2:2250 -3082:2:2262 -3083:2:2267 -3084:2:2271 -3085:2:2272 -3086:2:2279 -3087:2:2280 -3088:2:2291 -3089:2:2292 -3090:2:2293 -3091:2:2291 -3092:2:2292 -3093:2:2293 -3094:2:2304 -3095:2:2309 -3096:2:2310 -3097:0:4365 -3098:3:3355 -3099:0:4365 -3100:2:2322 -3101:0:4365 -3102:2:1169 -3103:0:4365 -3104:3:3354 -3105:0:4365 -3106:2:1170 -3107:0:4365 -3108:3:3355 -3109:0:4365 -3110:3:3356 -3111:0:4365 -3112:3:3366 -3113:0:4365 -3114:3:2951 -3115:0:4365 -3116:3:2952 -3117:0:4365 -3118:3:2953 -3119:0:4365 -3120:3:2954 -3121:3:2958 -3122:3:2959 -3123:3:2967 -3124:3:2968 -3125:3:2972 -3126:3:2973 -3127:3:2967 -3128:3:2968 -3129:3:2972 -3130:3:2973 -3131:3:2981 -3132:3:2986 -3133:3:2990 -3134:3:2991 -3135:3:2998 -3136:3:2999 -3137:3:3010 -3138:3:3011 -3139:3:3012 -3140:3:3010 -3141:3:3011 -3142:3:3012 -3143:3:3023 -3144:3:3028 -3145:3:3029 -3146:0:4365 -3147:3:3041 -3148:0:4365 -3149:3:3042 -3150:0:4365 -3151:2:1173 -3152:0:4365 -3153:3:3043 -3154:0:4365 -3155:2:1179 -3156:0:4365 -3157:2:1180 -3158:0:4365 -3159:3:3042 -3160:0:4365 -3161:2:1181 -3162:2:1185 -3163:2:1186 -3164:2:1194 -3165:2:1195 -3166:2:1199 -3167:2:1200 -3168:2:1194 -3169:2:1195 -3170:2:1199 -3171:2:1200 -3172:2:1208 -3173:2:1213 -3174:2:1217 -3175:2:1218 -3176:2:1225 -3177:2:1226 -3178:2:1237 -3179:2:1238 -3180:2:1239 -3181:2:1237 -3182:2:1238 -3183:2:1239 -3184:2:1250 -3185:2:1255 -3186:2:1256 -3187:0:4365 -3188:3:3043 -3189:0:4365 -3190:2:1268 -3191:0:4365 -3192:3:3042 -3193:0:4365 -3194:2:1270 -3195:0:4365 -3196:3:3043 -3197:0:4365 -3198:2:1271 -3199:2:1275 -3200:2:1276 -3201:2:1284 -3202:2:1285 -3203:2:1289 -3204:2:1290 -3205:2:1284 -3206:2:1285 -3207:2:1289 -3208:2:1290 -3209:2:1298 -3210:2:1303 -3211:2:1307 -3212:2:1308 -3213:2:1315 -3214:2:1316 -3215:2:1327 -3216:2:1328 -3217:2:1329 -3218:2:1327 -3219:2:1328 -3220:2:1329 -3221:2:1340 -3222:2:1345 -3223:2:1346 -3224:0:4365 -3225:2:1358 -3226:0:4365 -3227:2:1360 -3228:0:4365 -3229:3:3042 -3230:0:4365 -3231:2:1361 -3232:0:4365 -3233:3:3043 -3234:0:4365 -3235:2:1362 -3236:2:1366 -3237:2:1367 -3238:2:1375 -3239:2:1376 -3240:2:1380 -3241:2:1381 -3242:2:1375 -3243:2:1376 -3244:2:1380 -3245:2:1381 -3246:2:1389 -3247:2:1394 -3248:2:1398 -3249:2:1399 -3250:2:1406 -3251:2:1407 -3252:2:1418 -3253:2:1419 -3254:2:1420 -3255:2:1418 -3256:2:1419 -3257:2:1420 -3258:2:1431 -3259:2:1436 -3260:2:1437 -3261:0:4365 -3262:2:1449 -3263:0:4365 -3264:3:3042 -3265:0:4365 -3266:2:1451 -3267:0:4365 -3268:3:3043 -3269:0:4365 -3270:2:1652 -3271:0:4365 -3272:2:1653 -3273:0:4365 -3274:2:1657 -3275:0:4365 -3276:2:1180 -3277:0:4365 -3278:3:3042 -3279:0:4365 -3280:2:1181 -3281:2:1185 -3282:2:1186 -3283:2:1194 -3284:2:1195 -3285:2:1199 -3286:2:1200 -3287:2:1194 -3288:2:1195 -3289:2:1196 -3290:2:1208 -3291:2:1213 -3292:2:1217 -3293:2:1218 -3294:2:1225 -3295:2:1226 -3296:2:1237 -3297:2:1238 -3298:2:1239 -3299:2:1237 -3300:2:1238 -3301:2:1239 -3302:2:1250 -3303:2:1255 -3304:2:1256 -3305:0:4365 -3306:3:3043 -3307:0:4365 -3308:2:1268 -3309:0:4365 -3310:3:3042 -3311:0:4365 -3312:2:1270 -3313:0:4365 -3314:3:3043 -3315:0:4365 -3316:2:1271 -3317:2:1275 -3318:2:1276 -3319:2:1284 -3320:2:1285 -3321:2:1289 -3322:2:1290 -3323:2:1284 -3324:2:1285 -3325:2:1289 -3326:2:1290 -3327:2:1298 -3328:2:1303 -3329:2:1307 -3330:2:1308 -3331:2:1315 -3332:2:1316 -3333:2:1327 -3334:2:1328 -3335:2:1329 -3336:2:1327 -3337:2:1328 -3338:2:1329 -3339:2:1340 -3340:2:1345 -3341:2:1346 -3342:0:4365 -3343:2:1358 -3344:0:4365 -3345:2:1454 -3346:0:4365 -3347:3:3042 -3348:0:4365 -3349:2:1455 -3350:0:4365 -3351:3:3043 -3352:0:4365 -3353:2:1652 -3354:0:4365 -3355:2:1653 -3356:0:4365 -3357:2:1657 -3358:0:4365 -3359:2:1660 -3360:0:4365 -3361:3:3042 -3362:0:4365 -3363:2:1665 -3364:2:1669 -3365:2:1670 -3366:2:1678 -3367:2:1679 -3368:2:1683 -3369:2:1684 -3370:2:1678 -3371:2:1679 -3372:2:1680 -3373:2:1692 -3374:2:1697 -3375:2:1701 -3376:2:1702 -3377:2:1709 -3378:2:1710 -3379:2:1721 -3380:2:1722 -3381:2:1723 -3382:2:1721 -3383:2:1722 -3384:2:1723 -3385:2:1734 -3386:2:1739 -3387:2:1740 -3388:0:4365 -3389:3:3043 -3390:0:4365 -3391:2:1752 -3392:0:4365 -3393:3:3042 -3394:0:4365 -3395:2:1754 -3396:0:4365 -3397:3:3043 -3398:0:4365 -3399:2:1755 -3400:2:1759 -3401:2:1760 -3402:2:1768 -3403:2:1769 -3404:2:1773 -3405:2:1774 -3406:2:1768 -3407:2:1769 -3408:2:1773 -3409:2:1774 -3410:2:1782 -3411:2:1787 -3412:2:1791 -3413:2:1792 -3414:2:1799 -3415:2:1800 -3416:2:1811 -3417:2:1812 -3418:2:1813 -3419:2:1811 -3420:2:1812 -3421:2:1813 -3422:2:1824 -3423:2:1829 -3424:2:1830 -3425:0:4365 -3426:2:1842 -3427:0:4365 -3428:3:3042 -3429:0:4365 -3430:2:1844 -3431:0:4365 -3432:3:3043 -3433:0:4365 -3434:2:1845 -3435:2:1849 -3436:2:1850 -3437:2:1858 -3438:2:1859 -3439:2:1863 -3440:2:1864 -3441:2:1858 -3442:2:1859 -3443:2:1863 -3444:2:1864 -3445:2:1872 -3446:2:1877 -3447:2:1881 -3448:2:1882 -3449:2:1889 -3450:2:1890 -3451:2:1901 -3452:2:1902 -3453:2:1903 -3454:2:1901 -3455:2:1902 -3456:2:1903 -3457:2:1914 -3458:2:1919 -3459:2:1920 -3460:0:4365 -3461:2:1932 -3462:0:4365 -3463:3:3042 -3464:0:4365 -3465:2:1934 -3466:0:4365 -3467:3:3043 -3468:0:4365 -3469:2:1935 -3470:0:4365 -3471:2:1936 -3472:0:4365 -3473:2:2129 -3474:0:4365 -3475:2:2130 -3476:0:4365 -3477:2:2134 -3478:0:4365 -3479:3:3042 -3480:0:4365 -3481:2:2136 -3482:0:4365 -3483:3:3043 -3484:0:4365 -3485:2:2137 -3486:2:2141 -3487:2:2142 -3488:2:2150 -3489:2:2151 -3490:2:2155 -3491:2:2156 -3492:2:2150 -3493:2:2151 -3494:2:2155 -3495:2:2156 -3496:2:2164 -3497:2:2169 -3498:2:2173 -3499:2:2174 -3500:2:2181 -3501:2:2182 -3502:2:2193 -3503:2:2194 -3504:2:2195 -3505:2:2193 -3506:2:2194 -3507:2:2195 -3508:2:2206 -3509:2:2211 -3510:2:2212 -3511:0:4365 -3512:2:2224 -3513:0:4365 -3514:3:3042 -3515:0:4365 -3516:2:2226 -3517:0:4365 -3518:3:3043 -3519:0:4365 -3520:2:1936 -3521:0:4365 -3522:2:2129 -3523:0:4365 -3524:2:2130 -3525:0:4365 -3526:2:2134 -3527:0:4365 -3528:3:3042 -3529:0:4365 -3530:2:2136 -3531:0:4365 -3532:3:3043 -3533:0:4365 -3534:2:2137 -3535:2:2141 -3536:2:2142 -3537:2:2150 -3538:2:2151 -3539:2:2155 -3540:2:2156 -3541:2:2150 -3542:2:2151 -3543:2:2152 -3544:2:2164 -3545:2:2169 -3546:2:2173 -3547:2:2174 -3548:2:2181 -3549:2:2182 -3550:2:2193 -3551:2:2194 -3552:2:2195 -3553:2:2193 -3554:2:2194 -3555:2:2195 -3556:2:2206 -3557:2:2211 -3558:2:2212 -3559:0:4365 -3560:2:2224 -3561:0:4365 -3562:3:3042 -3563:0:4365 -3564:2:2226 -3565:0:4365 -3566:3:3043 -3567:0:4365 -3568:2:2230 -3569:0:4365 -3570:3:3042 -3571:0:4365 -3572:2:2235 -3573:2:2239 -3574:2:2240 -3575:2:2248 -3576:2:2249 -3577:2:2253 -3578:2:2254 -3579:2:2248 -3580:2:2249 -3581:2:2250 -3582:2:2262 -3583:2:2267 -3584:2:2271 -3585:2:2272 -3586:2:2279 -3587:2:2280 -3588:2:2291 -3589:2:2292 -3590:2:2293 -3591:2:2291 -3592:2:2292 -3593:2:2293 -3594:2:2304 -3595:2:2309 -3596:2:2310 -3597:0:4365 -3598:3:3043 -3599:0:4365 -3600:2:2322 -3601:0:4365 -3602:2:1169 -3603:0:4365 -3604:3:3042 -3605:0:4365 -3606:2:1170 -3607:0:4365 -3608:3:3043 -3609:0:4365 -3610:3:3044 -3611:0:4365 -3612:3:3257 -3613:0:4365 -3614:3:3362 -3615:0:4365 -3616:3:3363 -3617:0:4365 -3618:3:3367 -3619:0:4365 -3620:3:3373 -3621:3:3377 -3622:3:3378 -3623:3:3386 -3624:3:3387 -3625:3:3391 -3626:3:3392 -3627:3:3386 -3628:3:3387 -3629:3:3391 -3630:3:3392 -3631:3:3400 -3632:3:3405 -3633:3:3409 -3634:3:3410 -3635:3:3417 -3636:3:3418 -3637:3:3429 -3638:3:3430 -3639:3:3431 -3640:3:3429 -3641:3:3430 -3642:3:3431 -3643:3:3442 -3644:3:3447 -3645:3:3448 -3646:0:4365 -3647:3:3460 -3648:0:4365 -3649:3:3461 -3650:0:4365 -3651:2:1173 -3652:0:4365 -3653:3:3462 -3654:0:4365 -3655:2:1179 -3656:0:4365 -3657:2:1180 -3658:0:4365 -3659:3:3461 -3660:0:4365 -3661:2:1181 -3662:2:1185 -3663:2:1186 -3664:2:1194 -3665:2:1195 -3666:2:1199 -3667:2:1200 -3668:2:1194 -3669:2:1195 -3670:2:1199 -3671:2:1200 -3672:2:1208 -3673:2:1213 -3674:2:1217 -3675:2:1218 -3676:2:1225 -3677:2:1226 -3678:2:1237 -3679:2:1238 -3680:2:1239 -3681:2:1237 -3682:2:1238 -3683:2:1239 -3684:2:1250 -3685:2:1255 -3686:2:1256 -3687:0:4365 -3688:3:3462 -3689:0:4365 -3690:2:1268 -3691:0:4365 -3692:3:3461 -3693:0:4365 -3694:2:1270 -3695:0:4365 -3696:3:3462 -3697:0:4365 -3698:2:1271 -3699:2:1275 -3700:2:1276 -3701:2:1284 -3702:2:1285 -3703:2:1289 -3704:2:1290 -3705:2:1284 -3706:2:1285 -3707:2:1289 -3708:2:1290 -3709:2:1298 -3710:2:1303 -3711:2:1307 -3712:2:1308 -3713:2:1315 -3714:2:1316 -3715:2:1327 -3716:2:1328 -3717:2:1329 -3718:2:1327 -3719:2:1328 -3720:2:1329 -3721:2:1340 -3722:2:1345 -3723:2:1346 -3724:0:4365 -3725:2:1358 -3726:0:4365 -3727:2:1360 -3728:0:4365 -3729:3:3461 -3730:0:4365 -3731:2:1361 -3732:0:4365 -3733:3:3462 -3734:0:4365 -3735:2:1362 -3736:2:1366 -3737:2:1367 -3738:2:1375 -3739:2:1376 -3740:2:1380 -3741:2:1381 -3742:2:1375 -3743:2:1376 -3744:2:1380 -3745:2:1381 -3746:2:1389 -3747:2:1394 -3748:2:1398 -3749:2:1399 -3750:2:1406 -3751:2:1407 -3752:2:1418 -3753:2:1419 -3754:2:1420 -3755:2:1418 -3756:2:1419 -3757:2:1420 -3758:2:1431 -3759:2:1436 -3760:2:1437 -3761:0:4365 -3762:2:1449 -3763:0:4365 -3764:3:3461 -3765:0:4365 -3766:2:1451 -3767:0:4365 -3768:3:3462 -3769:0:4365 -3770:2:1652 -3771:0:4365 -3772:2:1653 -3773:0:4365 -3774:2:1657 -3775:0:4365 -3776:2:1180 -3777:0:4365 -3778:3:3461 -3779:0:4365 -3780:2:1181 -3781:2:1185 -3782:2:1186 -3783:2:1194 -3784:2:1195 -3785:2:1199 -3786:2:1200 -3787:2:1194 -3788:2:1195 -3789:2:1196 -3790:2:1208 -3791:2:1213 -3792:2:1217 -3793:2:1218 -3794:2:1225 -3795:2:1226 -3796:2:1237 -3797:2:1238 -3798:2:1239 -3799:2:1237 -3800:2:1238 -3801:2:1239 -3802:2:1250 -3803:2:1255 -3804:2:1256 -3805:0:4365 -3806:3:3462 -3807:0:4365 -3808:2:1268 -3809:0:4365 -3810:3:3461 -3811:0:4365 -3812:2:1270 -3813:0:4365 -3814:3:3462 -3815:0:4365 -3816:2:1271 -3817:2:1275 -3818:2:1276 -3819:2:1284 -3820:2:1285 -3821:2:1289 -3822:2:1290 -3823:2:1284 -3824:2:1285 -3825:2:1289 -3826:2:1290 -3827:2:1298 -3828:2:1303 -3829:2:1307 -3830:2:1308 -3831:2:1315 -3832:2:1316 -3833:2:1327 -3834:2:1328 -3835:2:1329 -3836:2:1327 -3837:2:1328 -3838:2:1329 -3839:2:1340 -3840:2:1345 -3841:2:1346 -3842:0:4365 -3843:2:1358 -3844:0:4365 -3845:2:1454 -3846:0:4365 -3847:3:3461 -3848:0:4365 -3849:2:1455 -3850:0:4365 -3851:3:3462 -3852:0:4365 -3853:2:1652 -3854:0:4365 -3855:2:1653 -3856:0:4365 -3857:2:1657 -3858:0:4365 -3859:2:1660 -3860:0:4365 -3861:3:3461 -3862:0:4365 -3863:2:1665 -3864:2:1669 -3865:2:1670 -3866:2:1678 -3867:2:1679 -3868:2:1683 -3869:2:1684 -3870:2:1678 -3871:2:1679 -3872:2:1680 -3873:2:1692 -3874:2:1697 -3875:2:1701 -3876:2:1702 -3877:2:1709 -3878:2:1710 -3879:2:1721 -3880:2:1722 -3881:2:1723 -3882:2:1721 -3883:2:1722 -3884:2:1723 -3885:2:1734 -3886:2:1739 -3887:2:1740 -3888:0:4365 -3889:3:3462 -3890:0:4365 -3891:2:1752 -3892:0:4365 -3893:3:3461 -3894:0:4365 -3895:2:1754 -3896:0:4365 -3897:3:3462 -3898:0:4365 -3899:2:1755 -3900:2:1759 -3901:2:1760 -3902:2:1768 -3903:2:1769 -3904:2:1773 -3905:2:1774 -3906:2:1768 -3907:2:1769 -3908:2:1773 -3909:2:1774 -3910:2:1782 -3911:2:1787 -3912:2:1791 -3913:2:1792 -3914:2:1799 -3915:2:1800 -3916:2:1811 -3917:2:1812 -3918:2:1813 -3919:2:1811 -3920:2:1812 -3921:2:1813 -3922:2:1824 -3923:2:1829 -3924:2:1830 -3925:0:4365 -3926:2:1842 -3927:0:4365 -3928:3:3461 -3929:0:4365 -3930:2:1844 -3931:0:4365 -3932:3:3462 -3933:0:4365 -3934:2:1845 -3935:2:1849 -3936:2:1850 -3937:2:1858 -3938:2:1859 -3939:2:1863 -3940:2:1864 -3941:2:1858 -3942:2:1859 -3943:2:1863 -3944:2:1864 -3945:2:1872 -3946:2:1877 -3947:2:1881 -3948:2:1882 -3949:2:1889 -3950:2:1890 -3951:2:1901 -3952:2:1902 -3953:2:1903 -3954:2:1901 -3955:2:1902 -3956:2:1903 -3957:2:1914 -3958:2:1919 -3959:2:1920 -3960:0:4365 -3961:2:1932 -3962:0:4365 -3963:3:3461 -3964:0:4365 -3965:2:1934 -3966:0:4365 -3967:3:3462 -3968:0:4365 -3969:2:1935 -3970:0:4365 -3971:2:1936 -3972:0:4365 -3973:2:2129 -3974:0:4365 -3975:2:2130 -3976:0:4365 -3977:2:2134 -3978:0:4365 -3979:3:3461 -3980:0:4365 -3981:2:2136 -3982:0:4365 -3983:3:3462 -3984:0:4365 -3985:2:2137 -3986:2:2141 -3987:2:2142 -3988:2:2150 -3989:2:2151 -3990:2:2155 -3991:2:2156 -3992:2:2150 -3993:2:2151 -3994:2:2155 -3995:2:2156 -3996:2:2164 -3997:2:2169 -3998:2:2173 -3999:2:2174 -4000:2:2181 -4001:2:2182 -4002:2:2193 -4003:2:2194 -4004:2:2195 -4005:2:2193 -4006:2:2194 -4007:2:2195 -4008:2:2206 -4009:2:2211 -4010:2:2212 -4011:0:4365 -4012:2:2224 -4013:0:4365 -4014:3:3461 -4015:0:4365 -4016:2:2226 -4017:0:4365 -4018:3:3462 -4019:0:4365 -4020:2:1936 -4021:0:4365 -4022:2:2129 -4023:0:4365 -4024:2:2130 -4025:0:4365 -4026:2:2134 -4027:0:4365 -4028:3:3461 -4029:0:4365 -4030:2:2136 -4031:0:4365 -4032:3:3462 -4033:0:4365 -4034:2:2137 -4035:2:2141 -4036:2:2142 -4037:2:2150 -4038:2:2151 -4039:2:2155 -4040:2:2156 -4041:2:2150 -4042:2:2151 -4043:2:2152 -4044:2:2164 -4045:2:2169 -4046:2:2173 -4047:2:2174 -4048:2:2181 -4049:2:2182 -4050:2:2193 -4051:2:2194 -4052:2:2195 -4053:2:2193 -4054:2:2194 -4055:2:2195 -4056:2:2206 -4057:2:2211 -4058:2:2212 -4059:0:4365 -4060:2:2224 -4061:0:4365 -4062:3:3461 -4063:0:4365 -4064:2:2226 -4065:0:4365 -4066:3:3462 -4067:0:4365 -4068:2:2230 -4069:0:4365 -4070:3:3461 -4071:0:4365 -4072:2:2235 -4073:2:2239 -4074:2:2240 -4075:2:2248 -4076:2:2249 -4077:2:2253 -4078:2:2254 -4079:2:2248 -4080:2:2249 -4081:2:2250 -4082:2:2262 -4083:2:2267 -4084:2:2271 -4085:2:2272 -4086:2:2279 -4087:2:2280 -4088:2:2291 -4089:2:2292 -4090:2:2293 -4091:2:2291 -4092:2:2292 -4093:2:2293 -4094:2:2304 -4095:2:2309 -4096:2:2310 -4097:0:4365 -4098:3:3462 -4099:0:4365 -4100:2:2322 -4101:0:4365 -4102:2:1169 -4103:0:4365 -4104:3:3461 -4105:0:4365 -4106:2:1170 -4107:0:4365 -4108:3:3462 -4109:0:4365 -4110:3:3463 -4111:0:4365 -4112:3:3469 -4113:0:4365 -4114:3:3470 -4115:3:3474 -4116:3:3475 -4117:3:3483 -4118:3:3484 -4119:3:3488 -4120:3:3489 -4121:3:3483 -4122:3:3484 -4123:3:3488 -4124:3:3489 -4125:3:3497 -4126:3:3502 -4127:3:3506 -4128:3:3507 -4129:3:3514 -4130:3:3515 -4131:3:3526 -4132:3:3527 -4133:3:3528 -4134:3:3526 -4135:3:3527 -4136:3:3528 -4137:3:3539 -4138:3:3544 -4139:3:3545 -4140:0:4365 -4141:3:3557 -4142:0:4365 -4143:3:3558 -4144:0:4365 -4145:2:1173 -4146:0:4365 -4147:3:3559 -4148:0:4365 -4149:2:1179 -4150:0:4365 -4151:2:1180 -4152:0:4365 -4153:3:3558 -4154:0:4365 -4155:2:1181 -4156:2:1185 -4157:2:1186 -4158:2:1194 -4159:2:1195 -4160:2:1199 -4161:2:1200 -4162:2:1194 -4163:2:1195 -4164:2:1199 -4165:2:1200 -4166:2:1208 -4167:2:1213 -4168:2:1217 -4169:2:1218 -4170:2:1225 -4171:2:1226 -4172:2:1237 -4173:2:1238 -4174:2:1239 -4175:2:1237 -4176:2:1238 -4177:2:1239 -4178:2:1250 -4179:2:1255 -4180:2:1256 -4181:0:4365 -4182:3:3559 -4183:0:4365 -4184:2:1268 -4185:0:4365 -4186:3:3558 -4187:0:4365 -4188:2:1270 -4189:0:4365 -4190:3:3559 -4191:0:4365 -4192:2:1271 -4193:2:1275 -4194:2:1276 -4195:2:1284 -4196:2:1285 -4197:2:1289 -4198:2:1290 -4199:2:1284 -4200:2:1285 -4201:2:1289 -4202:2:1290 -4203:2:1298 -4204:2:1303 -4205:2:1307 -4206:2:1308 -4207:2:1315 -4208:2:1316 -4209:2:1327 -4210:2:1328 -4211:2:1329 -4212:2:1327 -4213:2:1328 -4214:2:1329 -4215:2:1340 -4216:2:1345 -4217:2:1346 -4218:0:4365 -4219:2:1358 -4220:0:4365 -4221:2:1360 -4222:0:4365 -4223:3:3558 -4224:0:4365 -4225:2:1361 -4226:0:4365 -4227:3:3559 -4228:0:4365 -4229:2:1362 -4230:2:1366 -4231:2:1367 -4232:2:1375 -4233:2:1376 -4234:2:1380 -4235:2:1381 -4236:2:1375 -4237:2:1376 -4238:2:1380 -4239:2:1381 -4240:2:1389 -4241:2:1394 -4242:2:1398 -4243:2:1399 -4244:2:1406 -4245:2:1407 -4246:2:1418 -4247:2:1419 -4248:2:1420 -4249:2:1418 -4250:2:1419 -4251:2:1420 -4252:2:1431 -4253:2:1436 -4254:2:1437 -4255:0:4365 -4256:2:1449 -4257:0:4365 -4258:3:3558 -4259:0:4365 -4260:2:1451 -4261:0:4365 -4262:3:3559 -4263:0:4365 -4264:2:1652 -4265:0:4365 -4266:2:1653 -4267:0:4365 -4268:2:1657 -4269:0:4365 -4270:2:1180 -4271:0:4365 -4272:3:3558 -4273:0:4365 -4274:2:1181 -4275:2:1185 -4276:2:1186 -4277:2:1194 -4278:2:1195 -4279:2:1199 -4280:2:1200 -4281:2:1194 -4282:2:1195 -4283:2:1196 -4284:2:1208 -4285:2:1213 -4286:2:1217 -4287:2:1218 -4288:2:1225 -4289:2:1226 -4290:2:1237 -4291:2:1238 -4292:2:1239 -4293:2:1237 -4294:2:1238 -4295:2:1239 -4296:2:1250 -4297:2:1255 -4298:2:1256 -4299:0:4365 -4300:3:3559 -4301:0:4365 -4302:2:1268 -4303:0:4365 -4304:3:3558 -4305:0:4365 -4306:2:1270 -4307:0:4365 -4308:3:3559 -4309:0:4365 -4310:2:1271 -4311:2:1275 -4312:2:1276 -4313:2:1284 -4314:2:1285 -4315:2:1289 -4316:2:1290 -4317:2:1284 -4318:2:1285 -4319:2:1289 -4320:2:1290 -4321:2:1298 -4322:2:1303 -4323:2:1307 -4324:2:1308 -4325:2:1315 -4326:2:1316 -4327:2:1327 -4328:2:1328 -4329:2:1329 -4330:2:1327 -4331:2:1328 -4332:2:1329 -4333:2:1340 -4334:2:1345 -4335:2:1346 -4336:0:4365 -4337:2:1358 -4338:0:4365 -4339:2:1454 -4340:0:4365 -4341:3:3558 -4342:0:4365 -4343:2:1455 -4344:0:4365 -4345:3:3559 -4346:0:4365 -4347:2:1652 -4348:0:4365 -4349:2:1653 -4350:0:4365 -4351:2:1657 -4352:0:4365 -4353:2:1660 -4354:0:4365 -4355:3:3558 -4356:0:4365 -4357:2:1665 -4358:2:1669 -4359:2:1670 -4360:2:1678 -4361:2:1679 -4362:2:1683 -4363:2:1684 -4364:2:1678 -4365:2:1679 -4366:2:1680 -4367:2:1692 -4368:2:1697 -4369:2:1701 -4370:2:1702 -4371:2:1709 -4372:2:1710 -4373:2:1721 -4374:2:1722 -4375:2:1723 -4376:2:1721 -4377:2:1722 -4378:2:1723 -4379:2:1734 -4380:2:1739 -4381:2:1740 -4382:0:4365 -4383:3:3559 -4384:0:4365 -4385:2:1752 -4386:0:4365 -4387:3:3558 -4388:0:4365 -4389:2:1754 -4390:0:4365 -4391:3:3559 -4392:0:4365 -4393:2:1755 -4394:2:1759 -4395:2:1760 -4396:2:1768 -4397:2:1769 -4398:2:1773 -4399:2:1774 -4400:2:1768 -4401:2:1769 -4402:2:1773 -4403:2:1774 -4404:2:1782 -4405:2:1787 -4406:2:1791 -4407:2:1792 -4408:2:1799 -4409:2:1800 -4410:2:1811 -4411:2:1812 -4412:2:1813 -4413:2:1811 -4414:2:1812 -4415:2:1813 -4416:2:1824 -4417:2:1829 -4418:2:1830 -4419:0:4365 -4420:2:1842 -4421:0:4365 -4422:3:3558 -4423:0:4365 -4424:2:1844 -4425:0:4365 -4426:3:3559 -4427:0:4365 -4428:2:1845 -4429:2:1849 -4430:2:1850 -4431:2:1858 -4432:2:1859 -4433:2:1863 -4434:2:1864 -4435:2:1858 -4436:2:1859 -4437:2:1863 -4438:2:1864 -4439:2:1872 -4440:2:1877 -4441:2:1881 -4442:2:1882 -4443:2:1889 -4444:2:1890 -4445:2:1901 -4446:2:1902 -4447:2:1903 -4448:2:1901 -4449:2:1902 -4450:2:1903 -4451:2:1914 -4452:2:1919 -4453:2:1920 -4454:0:4365 -4455:2:1932 -4456:0:4365 -4457:3:3558 -4458:0:4365 -4459:2:1934 -4460:0:4365 -4461:3:3559 -4462:0:4365 -4463:2:1935 -4464:0:4365 -4465:2:1936 -4466:0:4365 -4467:2:2129 -4468:0:4365 -4469:2:2130 -4470:0:4365 -4471:2:2134 -4472:0:4365 -4473:3:3558 -4474:0:4365 -4475:2:2136 -4476:0:4365 -4477:3:3559 -4478:0:4365 -4479:2:2137 -4480:2:2141 -4481:2:2142 -4482:2:2150 -4483:2:2151 -4484:2:2155 -4485:2:2156 -4486:2:2150 -4487:2:2151 -4488:2:2155 -4489:2:2156 -4490:2:2164 -4491:2:2169 -4492:2:2173 -4493:2:2174 -4494:2:2181 -4495:2:2182 -4496:2:2193 -4497:2:2194 -4498:2:2195 -4499:2:2193 -4500:2:2194 -4501:2:2195 -4502:2:2206 -4503:2:2211 -4504:2:2212 -4505:0:4365 -4506:2:2224 -4507:0:4365 -4508:3:3558 -4509:0:4365 -4510:2:2226 -4511:0:4365 -4512:3:3559 -4513:0:4365 -4514:2:1936 -4515:0:4365 -4516:2:2129 -4517:0:4365 -4518:2:2130 -4519:0:4365 -4520:2:2134 -4521:0:4365 -4522:3:3558 -4523:0:4365 -4524:2:2136 -4525:0:4365 -4526:3:3559 -4527:0:4365 -4528:2:2137 -4529:2:2141 -4530:2:2142 -4531:2:2150 -4532:2:2151 -4533:2:2155 -4534:2:2156 -4535:2:2150 -4536:2:2151 -4537:2:2152 -4538:2:2164 -4539:2:2169 -4540:2:2173 -4541:2:2174 -4542:2:2181 -4543:2:2182 -4544:2:2193 -4545:2:2194 -4546:2:2195 -4547:2:2193 -4548:2:2194 -4549:2:2195 -4550:2:2206 -4551:2:2211 -4552:2:2212 -4553:0:4365 -4554:2:2224 -4555:0:4365 -4556:3:3558 -4557:0:4365 -4558:2:2226 -4559:0:4365 -4560:3:3559 -4561:0:4365 -4562:2:2230 -4563:0:4365 -4564:3:3558 -4565:0:4365 -4566:2:2235 -4567:2:2239 -4568:2:2240 -4569:2:2248 -4570:2:2249 -4571:2:2253 -4572:2:2254 -4573:2:2248 -4574:2:2249 -4575:2:2250 -4576:2:2262 -4577:2:2267 -4578:2:2271 -4579:2:2272 -4580:2:2279 -4581:2:2280 -4582:2:2291 -4583:2:2292 -4584:2:2293 -4585:2:2291 -4586:2:2292 -4587:2:2293 -4588:2:2304 -4589:2:2309 -4590:2:2310 -4591:0:4365 -4592:3:3559 -4593:0:4365 -4594:2:2322 -4595:0:4365 -4596:2:1169 -4597:0:4365 -4598:3:3558 -4599:0:4365 -4600:2:1170 -4601:0:4365 -4602:3:3559 -4603:0:4365 -4604:3:3560 -4605:0:4365 -4606:3:3566 -4607:0:4365 -4608:3:3569 -4609:3:3570 -4610:3:3582 -4611:3:3583 -4612:3:3587 -4613:3:3588 -4614:3:3582 -4615:3:3583 -4616:3:3587 -4617:3:3588 -4618:3:3596 -4619:3:3601 -4620:3:3605 -4621:3:3606 -4622:3:3613 -4623:3:3614 -4624:3:3625 -4625:3:3626 -4626:3:3627 -4627:3:3625 -4628:3:3626 -4629:3:3627 -4630:3:3638 -4631:3:3643 -4632:3:3644 -4633:0:4365 -4634:3:3656 -4635:0:4365 -4636:3:3657 -4637:0:4365 -4638:2:1173 -4639:0:4365 -4640:3:3658 -4641:0:4365 -4642:2:1179 -4643:0:4365 -4644:2:1180 -4645:0:4365 -4646:3:3657 -4647:0:4365 -4648:2:1181 -4649:2:1185 -4650:2:1186 -4651:2:1194 -4652:2:1195 -4653:2:1199 -4654:2:1200 -4655:2:1194 -4656:2:1195 -4657:2:1199 -4658:2:1200 -4659:2:1208 -4660:2:1213 -4661:2:1217 -4662:2:1218 -4663:2:1225 -4664:2:1226 -4665:2:1237 -4666:2:1238 -4667:2:1239 -4668:2:1237 -4669:2:1238 -4670:2:1239 -4671:2:1250 -4672:2:1255 -4673:2:1256 -4674:0:4365 -4675:3:3658 -4676:0:4365 -4677:2:1268 -4678:0:4365 -4679:3:3657 -4680:0:4365 -4681:2:1270 -4682:0:4365 -4683:3:3658 -4684:0:4365 -4685:2:1271 -4686:2:1275 -4687:2:1276 -4688:2:1284 -4689:2:1285 -4690:2:1289 -4691:2:1290 -4692:2:1284 -4693:2:1285 -4694:2:1289 -4695:2:1290 -4696:2:1298 -4697:2:1303 -4698:2:1307 -4699:2:1308 -4700:2:1315 -4701:2:1316 -4702:2:1327 -4703:2:1328 -4704:2:1329 -4705:2:1327 -4706:2:1328 -4707:2:1329 -4708:2:1340 -4709:2:1345 -4710:2:1346 -4711:0:4365 -4712:2:1358 -4713:0:4365 -4714:2:1360 -4715:0:4365 -4716:3:3657 -4717:0:4365 -4718:2:1361 -4719:0:4365 -4720:3:3658 -4721:0:4365 -4722:2:1362 -4723:2:1366 -4724:2:1367 -4725:2:1375 -4726:2:1376 -4727:2:1380 -4728:2:1381 -4729:2:1375 -4730:2:1376 -4731:2:1380 -4732:2:1381 -4733:2:1389 -4734:2:1394 -4735:2:1398 -4736:2:1399 -4737:2:1406 -4738:2:1407 -4739:2:1418 -4740:2:1419 -4741:2:1420 -4742:2:1418 -4743:2:1419 -4744:2:1420 -4745:2:1431 -4746:2:1436 -4747:2:1437 -4748:0:4365 -4749:2:1449 -4750:0:4365 -4751:3:3657 -4752:0:4365 -4753:2:1451 -4754:0:4365 -4755:3:3658 -4756:0:4365 -4757:2:1652 -4758:0:4365 -4759:2:1653 -4760:0:4365 -4761:2:1657 -4762:0:4365 -4763:2:1180 -4764:0:4365 -4765:3:3657 -4766:0:4365 -4767:2:1181 -4768:2:1185 -4769:2:1186 -4770:2:1194 -4771:2:1195 -4772:2:1199 -4773:2:1200 -4774:2:1194 -4775:2:1195 -4776:2:1196 -4777:2:1208 -4778:2:1213 -4779:2:1217 -4780:2:1218 -4781:2:1225 -4782:2:1226 -4783:2:1237 -4784:2:1238 -4785:2:1239 -4786:2:1237 -4787:2:1238 -4788:2:1239 -4789:2:1250 -4790:2:1255 -4791:2:1256 -4792:0:4365 -4793:3:3658 -4794:0:4365 -4795:2:1268 -4796:0:4365 -4797:3:3657 -4798:0:4365 -4799:2:1270 -4800:0:4365 -4801:3:3658 -4802:0:4365 -4803:2:1271 -4804:2:1275 -4805:2:1276 -4806:2:1284 -4807:2:1285 -4808:2:1289 -4809:2:1290 -4810:2:1284 -4811:2:1285 -4812:2:1289 -4813:2:1290 -4814:2:1298 -4815:2:1303 -4816:2:1307 -4817:2:1308 -4818:2:1315 -4819:2:1316 -4820:2:1327 -4821:2:1328 -4822:2:1329 -4823:2:1327 -4824:2:1328 -4825:2:1329 -4826:2:1340 -4827:2:1345 -4828:2:1346 -4829:0:4365 -4830:2:1358 -4831:0:4365 -4832:2:1454 -4833:0:4365 -4834:3:3657 -4835:0:4365 -4836:2:1455 -4837:0:4365 -4838:3:3658 -4839:0:4365 -4840:2:1652 -4841:0:4365 -4842:2:1653 -4843:0:4365 -4844:2:1657 -4845:0:4365 -4846:2:1660 -4847:0:4365 -4848:3:3657 -4849:0:4365 -4850:2:1665 -4851:2:1669 -4852:2:1670 -4853:2:1678 -4854:2:1679 -4855:2:1683 -4856:2:1684 -4857:2:1678 -4858:2:1679 -4859:2:1680 -4860:2:1692 -4861:2:1697 -4862:2:1701 -4863:2:1702 -4864:2:1709 -4865:2:1710 -4866:2:1721 -4867:2:1722 -4868:2:1723 -4869:2:1721 -4870:2:1722 -4871:2:1723 -4872:2:1734 -4873:2:1739 -4874:2:1740 -4875:0:4365 -4876:3:3658 -4877:0:4365 -4878:2:1752 -4879:0:4365 -4880:3:3657 -4881:0:4365 -4882:2:1754 -4883:0:4365 -4884:3:3658 -4885:0:4365 -4886:2:1755 -4887:2:1759 -4888:2:1760 -4889:2:1768 -4890:2:1769 -4891:2:1773 -4892:2:1774 -4893:2:1768 -4894:2:1769 -4895:2:1773 -4896:2:1774 -4897:2:1782 -4898:2:1787 -4899:2:1791 -4900:2:1792 -4901:2:1799 -4902:2:1800 -4903:2:1811 -4904:2:1812 -4905:2:1813 -4906:2:1811 -4907:2:1812 -4908:2:1813 -4909:2:1824 -4910:2:1829 -4911:2:1830 -4912:0:4365 -4913:2:1842 -4914:0:4365 -4915:3:3657 -4916:0:4365 -4917:2:1844 -4918:0:4365 -4919:3:3658 -4920:0:4365 -4921:2:1845 -4922:2:1849 -4923:2:1850 -4924:2:1858 -4925:2:1859 -4926:2:1863 -4927:2:1864 -4928:2:1858 -4929:2:1859 -4930:2:1863 -4931:2:1864 -4932:2:1872 -4933:2:1877 -4934:2:1881 -4935:2:1882 -4936:2:1889 -4937:2:1890 -4938:2:1901 -4939:2:1902 -4940:2:1903 -4941:2:1901 -4942:2:1902 -4943:2:1903 -4944:2:1914 -4945:2:1919 -4946:2:1920 -4947:0:4365 -4948:2:1932 -4949:0:4365 -4950:3:3657 -4951:0:4365 -4952:2:1934 -4953:0:4365 -4954:3:3658 -4955:0:4365 -4956:2:1935 -4957:0:4365 -4958:2:1936 -4959:0:4365 -4960:2:2129 -4961:0:4365 -4962:2:2130 -4963:0:4365 -4964:2:2134 -4965:0:4365 -4966:3:3657 -4967:0:4365 -4968:2:2136 -4969:0:4365 -4970:3:3658 -4971:0:4365 -4972:2:2137 -4973:2:2141 -4974:2:2142 -4975:2:2150 -4976:2:2151 -4977:2:2155 -4978:2:2156 -4979:2:2150 -4980:2:2151 -4981:2:2155 -4982:2:2156 -4983:2:2164 -4984:2:2169 -4985:2:2173 -4986:2:2174 -4987:2:2181 -4988:2:2182 -4989:2:2193 -4990:2:2194 -4991:2:2195 -4992:2:2193 -4993:2:2194 -4994:2:2195 -4995:2:2206 -4996:2:2211 -4997:2:2212 -4998:0:4365 -4999:2:2224 -5000:0:4365 -5001:3:3657 -5002:0:4365 -5003:2:2226 -5004:0:4365 -5005:3:3658 -5006:0:4365 -5007:2:1936 -5008:0:4365 -5009:2:2129 -5010:0:4365 -5011:2:2130 -5012:0:4365 -5013:2:2134 -5014:0:4365 -5015:3:3657 -5016:0:4365 -5017:2:2136 -5018:0:4365 -5019:3:3658 -5020:0:4365 -5021:2:2137 -5022:2:2141 -5023:2:2142 -5024:2:2150 -5025:2:2151 -5026:2:2155 -5027:2:2156 -5028:2:2150 -5029:2:2151 -5030:2:2152 -5031:2:2164 -5032:2:2169 -5033:2:2173 -5034:2:2174 -5035:2:2181 -5036:2:2182 -5037:2:2193 -5038:2:2194 -5039:2:2195 -5040:2:2193 -5041:2:2194 -5042:2:2195 -5043:2:2206 -5044:2:2211 -5045:2:2212 -5046:0:4365 -5047:2:2224 -5048:0:4365 -5049:3:3657 -5050:0:4365 -5051:2:2226 -5052:0:4365 -5053:3:3658 -5054:0:4365 -5055:2:2230 -5056:0:4365 -5057:3:3657 -5058:0:4365 -5059:2:2235 -5060:2:2239 -5061:2:2240 -5062:2:2248 -5063:2:2249 -5064:2:2253 -5065:2:2254 -5066:2:2248 -5067:2:2249 -5068:2:2250 -5069:2:2262 -5070:2:2267 -5071:2:2271 -5072:2:2272 -5073:2:2279 -5074:2:2280 -5075:2:2291 -5076:2:2292 -5077:2:2293 -5078:2:2291 -5079:2:2292 -5080:2:2293 -5081:2:2304 -5082:2:2309 -5083:2:2310 -5084:0:4365 -5085:3:3658 -5086:0:4365 -5087:2:2322 -5088:0:4365 -5089:2:1169 -5090:0:4365 -5091:3:3657 -5092:0:4365 -5093:2:1170 -5094:0:4365 -5095:3:3658 -5096:0:4365 -5097:3:3659 -5098:0:4365 -5099:3:3665 -5100:0:4365 -5101:3:3666 -5102:0:4365 -5103:3:3667 -5104:0:4365 -5105:3:3668 -5106:0:4365 -5107:3:3669 -5108:3:3673 -5109:3:3674 -5110:3:3682 -5111:3:3683 -5112:3:3687 -5113:3:3688 -5114:3:3682 -5115:3:3683 -5116:3:3687 -5117:3:3688 -5118:3:3696 -5119:3:3701 -5120:3:3705 -5121:3:3706 -5122:3:3713 -5123:3:3714 -5124:3:3725 -5125:3:3726 -5126:3:3727 -5127:3:3725 -5128:3:3726 -5129:3:3727 -5130:3:3738 -5131:3:3743 -5132:3:3744 -5133:0:4365 -5134:3:3756 -5135:0:4365 -5136:3:3757 -5137:0:4365 -5138:2:1173 -5139:0:4365 -5140:3:3758 -5141:0:4365 -5142:2:1179 -5143:0:4365 -5144:2:1180 -5145:0:4365 -5146:3:3757 -5147:0:4365 -5148:2:1181 -5149:2:1185 -5150:2:1186 -5151:2:1194 -5152:2:1195 -5153:2:1199 -5154:2:1200 -5155:2:1194 -5156:2:1195 -5157:2:1199 -5158:2:1200 -5159:2:1208 -5160:2:1213 -5161:2:1217 -5162:2:1218 -5163:2:1225 -5164:2:1226 -5165:2:1237 -5166:2:1238 -5167:2:1239 -5168:2:1237 -5169:2:1238 -5170:2:1239 -5171:2:1250 -5172:2:1255 -5173:2:1256 -5174:0:4365 -5175:3:3758 -5176:0:4365 -5177:2:1268 -5178:0:4365 -5179:3:3757 -5180:0:4365 -5181:2:1270 -5182:0:4365 -5183:3:3758 -5184:0:4365 -5185:2:1271 -5186:2:1275 -5187:2:1276 -5188:2:1284 -5189:2:1285 -5190:2:1289 -5191:2:1290 -5192:2:1284 -5193:2:1285 -5194:2:1289 -5195:2:1290 -5196:2:1298 -5197:2:1303 -5198:2:1307 -5199:2:1308 -5200:2:1315 -5201:2:1316 -5202:2:1327 -5203:2:1328 -5204:2:1329 -5205:2:1327 -5206:2:1328 -5207:2:1329 -5208:2:1340 -5209:2:1345 -5210:2:1346 -5211:0:4365 -5212:2:1358 -5213:0:4365 -5214:2:1360 -5215:0:4365 -5216:3:3757 -5217:0:4365 -5218:2:1361 -5219:0:4365 -5220:3:3758 -5221:0:4365 -5222:2:1362 -5223:2:1366 -5224:2:1367 -5225:2:1375 -5226:2:1376 -5227:2:1380 -5228:2:1381 -5229:2:1375 -5230:2:1376 -5231:2:1380 -5232:2:1381 -5233:2:1389 -5234:2:1394 -5235:2:1398 -5236:2:1399 -5237:2:1406 -5238:2:1407 -5239:2:1418 -5240:2:1419 -5241:2:1420 -5242:2:1418 -5243:2:1419 -5244:2:1420 -5245:2:1431 -5246:2:1436 -5247:2:1437 -5248:0:4365 -5249:2:1449 -5250:0:4365 -5251:3:3757 -5252:0:4365 -5253:2:1451 -5254:0:4365 -5255:3:3758 -5256:0:4365 -5257:2:1652 -5258:0:4365 -5259:2:1653 -5260:0:4365 -5261:2:1657 -5262:0:4365 -5263:2:1180 -5264:0:4365 -5265:3:3757 -5266:0:4365 -5267:2:1181 -5268:2:1185 -5269:2:1186 -5270:2:1194 -5271:2:1195 -5272:2:1199 -5273:2:1200 -5274:2:1194 -5275:2:1195 -5276:2:1196 -5277:2:1208 -5278:2:1213 -5279:2:1217 -5280:2:1218 -5281:2:1225 -5282:2:1226 -5283:2:1237 -5284:2:1238 -5285:2:1239 -5286:2:1237 -5287:2:1238 -5288:2:1239 -5289:2:1250 -5290:2:1255 -5291:2:1256 -5292:0:4365 -5293:3:3758 -5294:0:4365 -5295:2:1268 -5296:0:4365 -5297:3:3757 -5298:0:4365 -5299:2:1270 -5300:0:4365 -5301:3:3758 -5302:0:4365 -5303:2:1271 -5304:2:1275 -5305:2:1276 -5306:2:1284 -5307:2:1285 -5308:2:1289 -5309:2:1290 -5310:2:1284 -5311:2:1285 -5312:2:1289 -5313:2:1290 -5314:2:1298 -5315:2:1303 -5316:2:1307 -5317:2:1308 -5318:2:1315 -5319:2:1316 -5320:2:1327 -5321:2:1328 -5322:2:1329 -5323:2:1327 -5324:2:1328 -5325:2:1329 -5326:2:1340 -5327:2:1345 -5328:2:1346 -5329:0:4365 -5330:2:1358 -5331:0:4365 -5332:2:1454 -5333:0:4365 -5334:3:3757 -5335:0:4365 -5336:2:1455 -5337:0:4365 -5338:3:3758 -5339:0:4365 -5340:2:1652 -5341:0:4365 -5342:2:1653 -5343:0:4365 -5344:2:1657 -5345:0:4365 -5346:2:1660 -5347:0:4365 -5348:3:3757 -5349:0:4365 -5350:2:1665 -5351:2:1669 -5352:2:1670 -5353:2:1678 -5354:2:1679 -5355:2:1683 -5356:2:1684 -5357:2:1678 -5358:2:1679 -5359:2:1680 -5360:2:1692 -5361:2:1697 -5362:2:1701 -5363:2:1702 -5364:2:1709 -5365:2:1710 -5366:2:1721 -5367:2:1722 -5368:2:1723 -5369:2:1721 -5370:2:1722 -5371:2:1723 -5372:2:1734 -5373:2:1739 -5374:2:1740 -5375:0:4365 -5376:3:3758 -5377:0:4365 -5378:2:1752 -5379:0:4365 -5380:3:3757 -5381:0:4365 -5382:2:1754 -5383:0:4365 -5384:3:3758 -5385:0:4365 -5386:2:1755 -5387:2:1759 -5388:2:1760 -5389:2:1768 -5390:2:1769 -5391:2:1773 -5392:2:1774 -5393:2:1768 -5394:2:1769 -5395:2:1773 -5396:2:1774 -5397:2:1782 -5398:2:1787 -5399:2:1791 -5400:2:1792 -5401:2:1799 -5402:2:1800 -5403:2:1811 -5404:2:1812 -5405:2:1813 -5406:2:1811 -5407:2:1812 -5408:2:1813 -5409:2:1824 -5410:2:1829 -5411:2:1830 -5412:0:4365 -5413:2:1842 -5414:0:4365 -5415:3:3757 -5416:0:4365 -5417:2:1844 -5418:0:4365 -5419:3:3758 -5420:0:4365 -5421:2:1845 -5422:2:1849 -5423:2:1850 -5424:2:1858 -5425:2:1859 -5426:2:1863 -5427:2:1864 -5428:2:1858 -5429:2:1859 -5430:2:1863 -5431:2:1864 -5432:2:1872 -5433:2:1877 -5434:2:1881 -5435:2:1882 -5436:2:1889 -5437:2:1890 -5438:2:1901 -5439:2:1902 -5440:2:1903 -5441:2:1901 -5442:2:1902 -5443:2:1903 -5444:2:1914 -5445:2:1919 -5446:2:1920 -5447:0:4365 -5448:2:1932 -5449:0:4365 -5450:3:3757 -5451:0:4365 -5452:2:1934 -5453:0:4365 -5454:3:3758 -5455:0:4365 -5456:2:1935 -5457:0:4365 -5458:2:1936 -5459:0:4365 -5460:2:2129 -5461:0:4365 -5462:2:2130 -5463:0:4365 -5464:2:2134 -5465:0:4365 -5466:3:3757 -5467:0:4365 -5468:2:2136 -5469:0:4365 -5470:3:3758 -5471:0:4365 -5472:2:2137 -5473:2:2141 -5474:2:2142 -5475:2:2150 -5476:2:2151 -5477:2:2155 -5478:2:2156 -5479:2:2150 -5480:2:2151 -5481:2:2155 -5482:2:2156 -5483:2:2164 -5484:2:2169 -5485:2:2173 -5486:2:2174 -5487:2:2181 -5488:2:2182 -5489:2:2193 -5490:2:2194 -5491:2:2195 -5492:2:2193 -5493:2:2194 -5494:2:2195 -5495:2:2206 -5496:2:2211 -5497:2:2212 -5498:0:4365 -5499:2:2224 -5500:0:4365 -5501:3:3757 -5502:0:4365 -5503:2:2226 -5504:0:4365 -5505:3:3758 -5506:0:4365 -5507:2:1936 -5508:0:4365 -5509:2:2129 -5510:0:4365 -5511:2:2130 -5512:0:4365 -5513:2:2134 -5514:0:4365 -5515:3:3757 -5516:0:4365 -5517:2:2136 -5518:0:4365 -5519:3:3758 -5520:0:4365 -5521:2:2137 -5522:2:2141 -5523:2:2142 -5524:2:2150 -5525:2:2151 -5526:2:2155 -5527:2:2156 -5528:2:2150 -5529:2:2151 -5530:2:2152 -5531:2:2164 -5532:2:2169 -5533:2:2173 -5534:2:2174 -5535:2:2181 -5536:2:2182 -5537:2:2193 -5538:2:2194 -5539:2:2195 -5540:2:2193 -5541:2:2194 -5542:2:2195 -5543:2:2206 -5544:2:2211 -5545:2:2212 -5546:0:4365 -5547:2:2224 -5548:0:4365 -5549:3:3757 -5550:0:4365 -5551:2:2226 -5552:0:4365 -5553:3:3758 -5554:0:4365 -5555:2:2230 -5556:0:4365 -5557:3:3757 -5558:0:4365 -5559:2:2235 -5560:2:2239 -5561:2:2240 -5562:2:2248 -5563:2:2249 -5564:2:2253 -5565:2:2254 -5566:2:2248 -5567:2:2249 -5568:2:2250 -5569:2:2262 -5570:2:2267 -5571:2:2271 -5572:2:2272 -5573:2:2279 -5574:2:2280 -5575:2:2291 -5576:2:2292 -5577:2:2293 -5578:2:2291 -5579:2:2292 -5580:2:2293 -5581:2:2304 -5582:2:2309 -5583:2:2310 -5584:0:4365 -5585:3:3758 -5586:0:4365 -5587:2:2322 -5588:0:4365 -5589:2:1169 -5590:0:4365 -5591:3:3757 -5592:0:4365 -5593:2:1170 -5594:0:4365 -5595:3:3758 -5596:0:4365 -5597:3:3759 -5598:0:4365 -5599:3:3972 -5600:0:4365 -5601:3:3980 -5602:0:4365 -5603:3:3981 -5604:3:3985 -5605:3:3986 -5606:3:3994 -5607:3:3995 -5608:3:3999 -5609:3:4000 -5610:3:3994 -5611:3:3995 -5612:3:3999 -5613:3:4000 -5614:3:4008 -5615:3:4013 -5616:3:4017 -5617:3:4018 -5618:3:4025 -5619:3:4026 -5620:3:4037 -5621:3:4038 -5622:3:4039 -5623:3:4037 -5624:3:4038 -5625:3:4039 -5626:3:4050 -5627:3:4055 -5628:3:4056 -5629:0:4365 -5630:3:4068 -5631:0:4365 -5632:3:4069 -5633:0:4365 -5634:2:1173 -5635:0:4365 -5636:3:4070 -5637:0:4365 -5638:2:1179 -5639:0:4365 -5640:2:1180 -5641:0:4365 -5642:3:4069 -5643:0:4365 -5644:2:1181 -5645:2:1185 -5646:2:1186 -5647:2:1194 -5648:2:1195 -5649:2:1199 -5650:2:1200 -5651:2:1194 -5652:2:1195 -5653:2:1199 -5654:2:1200 -5655:2:1208 -5656:2:1213 -5657:2:1217 -5658:2:1218 -5659:2:1225 -5660:2:1226 -5661:2:1237 -5662:2:1238 -5663:2:1239 -5664:2:1237 -5665:2:1238 -5666:2:1239 -5667:2:1250 -5668:2:1255 -5669:2:1256 -5670:0:4365 -5671:3:4070 -5672:0:4365 -5673:2:1268 -5674:0:4365 -5675:3:4069 -5676:0:4365 -5677:2:1270 -5678:0:4365 -5679:3:4070 -5680:0:4365 -5681:2:1271 -5682:2:1275 -5683:2:1276 -5684:2:1284 -5685:2:1285 -5686:2:1289 -5687:2:1290 -5688:2:1284 -5689:2:1285 -5690:2:1289 -5691:2:1290 -5692:2:1298 -5693:2:1303 -5694:2:1307 -5695:2:1308 -5696:2:1315 -5697:2:1316 -5698:2:1327 -5699:2:1328 -5700:2:1329 -5701:2:1327 -5702:2:1328 -5703:2:1329 -5704:2:1340 -5705:2:1345 -5706:2:1346 -5707:0:4365 -5708:2:1358 -5709:0:4365 -5710:2:1360 -5711:0:4365 -5712:3:4069 -5713:0:4365 -5714:2:1361 -5715:0:4365 -5716:3:4070 -5717:0:4365 -5718:2:1362 -5719:2:1366 -5720:2:1367 -5721:2:1375 -5722:2:1376 -5723:2:1380 -5724:2:1381 -5725:2:1375 -5726:2:1376 -5727:2:1380 -5728:2:1381 -5729:2:1389 -5730:2:1394 -5731:2:1398 -5732:2:1399 -5733:2:1406 -5734:2:1407 -5735:2:1418 -5736:2:1419 -5737:2:1420 -5738:2:1418 -5739:2:1419 -5740:2:1420 -5741:2:1431 -5742:2:1436 -5743:2:1437 -5744:0:4365 -5745:2:1449 -5746:0:4365 -5747:3:4069 -5748:0:4365 -5749:2:1451 -5750:0:4365 -5751:3:4070 -5752:0:4365 -5753:2:1652 -5754:0:4365 -5755:2:1653 -5756:0:4365 -5757:2:1657 -5758:0:4365 -5759:2:1180 -5760:0:4365 -5761:3:4069 -5762:0:4365 -5763:2:1181 -5764:2:1185 -5765:2:1186 -5766:2:1194 -5767:2:1195 -5768:2:1199 -5769:2:1200 -5770:2:1194 -5771:2:1195 -5772:2:1196 -5773:2:1208 -5774:2:1213 -5775:2:1217 -5776:2:1218 -5777:2:1225 -5778:2:1226 -5779:2:1237 -5780:2:1238 -5781:2:1239 -5782:2:1237 -5783:2:1238 -5784:2:1239 -5785:2:1250 -5786:2:1255 -5787:2:1256 -5788:0:4365 -5789:3:4070 -5790:0:4365 -5791:2:1268 -5792:0:4365 -5793:3:4069 -5794:0:4365 -5795:2:1270 -5796:0:4365 -5797:3:4070 -5798:0:4365 -5799:2:1271 -5800:2:1275 -5801:2:1276 -5802:2:1284 -5803:2:1285 -5804:2:1289 -5805:2:1290 -5806:2:1284 -5807:2:1285 -5808:2:1289 -5809:2:1290 -5810:2:1298 -5811:2:1303 -5812:2:1307 -5813:2:1308 -5814:2:1315 -5815:2:1316 -5816:2:1327 -5817:2:1328 -5818:2:1329 -5819:2:1327 -5820:2:1328 -5821:2:1329 -5822:2:1340 -5823:2:1345 -5824:2:1346 -5825:0:4365 -5826:2:1358 -5827:0:4365 -5828:2:1454 -5829:0:4365 -5830:3:4069 -5831:0:4365 -5832:2:1455 -5833:0:4365 -5834:3:4070 -5835:0:4365 -5836:2:1652 -5837:0:4365 -5838:2:1653 -5839:0:4365 -5840:2:1657 -5841:0:4365 -5842:2:1660 -5843:0:4365 -5844:3:4069 -5845:0:4365 -5846:2:1665 -5847:2:1669 -5848:2:1670 -5849:2:1678 -5850:2:1679 -5851:2:1683 -5852:2:1684 -5853:2:1678 -5854:2:1679 -5855:2:1680 -5856:2:1692 -5857:2:1697 -5858:2:1701 -5859:2:1702 -5860:2:1709 -5861:2:1710 -5862:2:1721 -5863:2:1722 -5864:2:1723 -5865:2:1721 -5866:2:1722 -5867:2:1723 -5868:2:1734 -5869:2:1739 -5870:2:1740 -5871:0:4365 -5872:3:4070 -5873:0:4365 -5874:2:1752 -5875:0:4365 -5876:3:4069 -5877:0:4365 -5878:2:1754 -5879:0:4365 -5880:3:4070 -5881:0:4365 -5882:2:1755 -5883:2:1759 -5884:2:1760 -5885:2:1768 -5886:2:1769 -5887:2:1773 -5888:2:1774 -5889:2:1768 -5890:2:1769 -5891:2:1773 -5892:2:1774 -5893:2:1782 -5894:2:1787 -5895:2:1791 -5896:2:1792 -5897:2:1799 -5898:2:1800 -5899:2:1811 -5900:2:1812 -5901:2:1813 -5902:2:1811 -5903:2:1812 -5904:2:1813 -5905:2:1824 -5906:2:1829 -5907:2:1830 -5908:0:4365 -5909:2:1842 -5910:0:4365 -5911:3:4069 -5912:0:4365 -5913:2:1844 -5914:0:4365 -5915:3:4070 -5916:0:4365 -5917:2:1845 -5918:2:1849 -5919:2:1850 -5920:2:1858 -5921:2:1859 -5922:2:1863 -5923:2:1864 -5924:2:1858 -5925:2:1859 -5926:2:1863 -5927:2:1864 -5928:2:1872 -5929:2:1877 -5930:2:1881 -5931:2:1882 -5932:2:1889 -5933:2:1890 -5934:2:1901 -5935:2:1902 -5936:2:1903 -5937:2:1901 -5938:2:1902 -5939:2:1903 -5940:2:1914 -5941:2:1919 -5942:2:1920 -5943:0:4365 -5944:2:1932 -5945:0:4365 -5946:3:4069 -5947:0:4365 -5948:2:1934 -5949:0:4365 -5950:3:4070 -5951:0:4365 -5952:2:1935 -5953:0:4365 -5954:2:1936 -5955:0:4365 -5956:2:2129 -5957:0:4365 -5958:2:2130 -5959:0:4365 -5960:2:2134 -5961:0:4365 -5962:3:4069 -5963:0:4365 -5964:2:2136 -5965:0:4365 -5966:3:4070 -5967:0:4365 -5968:2:2137 -5969:2:2141 -5970:2:2142 -5971:2:2150 -5972:2:2151 -5973:2:2155 -5974:2:2156 -5975:2:2150 -5976:2:2151 -5977:2:2155 -5978:2:2156 -5979:2:2164 -5980:2:2169 -5981:2:2173 -5982:2:2174 -5983:2:2181 -5984:2:2182 -5985:2:2193 -5986:2:2194 -5987:2:2195 -5988:2:2193 -5989:2:2194 -5990:2:2195 -5991:2:2206 -5992:2:2211 -5993:2:2212 -5994:0:4365 -5995:2:2224 -5996:0:4365 -5997:3:4069 -5998:0:4365 -5999:2:2226 -6000:0:4365 -6001:3:4070 -6002:0:4365 -6003:2:1936 -6004:0:4365 -6005:2:2129 -6006:0:4365 -6007:2:2130 -6008:0:4365 -6009:2:2134 -6010:0:4365 -6011:3:4069 -6012:0:4365 -6013:2:2136 -6014:0:4365 -6015:3:4070 -6016:0:4365 -6017:2:2137 -6018:2:2141 -6019:2:2142 -6020:2:2150 -6021:2:2151 -6022:2:2155 -6023:2:2156 -6024:2:2150 -6025:2:2151 -6026:2:2152 -6027:2:2164 -6028:2:2169 -6029:2:2173 -6030:2:2174 -6031:2:2181 -6032:2:2182 -6033:2:2193 -6034:2:2194 -6035:2:2195 -6036:2:2193 -6037:2:2194 -6038:2:2195 -6039:2:2206 -6040:2:2211 -6041:2:2212 -6042:0:4365 -6043:2:2224 -6044:0:4365 -6045:3:4069 -6046:0:4365 -6047:2:2226 -6048:0:4365 -6049:3:4070 -6050:0:4365 -6051:2:2230 -6052:0:4365 -6053:3:4069 -6054:0:4365 -6055:2:2235 -6056:2:2239 -6057:2:2240 -6058:2:2248 -6059:2:2249 -6060:2:2253 -6061:2:2254 -6062:2:2248 -6063:2:2249 -6064:2:2250 -6065:2:2262 -6066:2:2267 -6067:2:2271 -6068:2:2272 -6069:2:2279 -6070:2:2280 -6071:2:2291 -6072:2:2292 -6073:2:2293 -6074:2:2291 -6075:2:2292 -6076:2:2293 -6077:2:2304 -6078:2:2309 -6079:2:2310 -6080:0:4365 -6081:3:4070 -6082:0:4365 -6083:2:2322 -6084:0:4365 -6085:2:1169 -6086:0:4365 -6087:3:4069 -6088:0:4365 -6089:2:1170 -6090:0:4365 -6091:3:4070 -6092:0:4365 -6093:3:4071 -6094:0:4365 -6095:3:4081 -6096:0:4365 -6097:3:3666 -6098:0:4365 -6099:3:3667 -6100:0:4365 -6101:3:3668 -6102:0:4365 -6103:3:3669 -6104:3:3673 -6105:3:3674 -6106:3:3682 -6107:3:3683 -6108:3:3687 -6109:3:3688 -6110:3:3682 -6111:3:3683 -6112:3:3687 -6113:3:3688 -6114:3:3696 -6115:3:3701 -6116:3:3705 -6117:3:3706 -6118:3:3713 -6119:3:3714 -6120:3:3725 -6121:3:3726 -6122:3:3727 -6123:3:3725 -6124:3:3726 -6125:3:3727 -6126:3:3738 -6127:3:3743 -6128:3:3744 -6129:0:4365 -6130:3:3756 -6131:0:4365 -6132:3:3757 -6133:0:4365 -6134:2:1173 -6135:0:4365 -6136:3:3758 -6137:0:4365 -6138:2:1179 -6139:0:4365 -6140:2:1180 -6141:0:4365 -6142:3:3757 -6143:0:4365 -6144:2:1181 -6145:2:1185 -6146:2:1186 -6147:2:1194 -6148:2:1195 -6149:2:1199 -6150:2:1200 -6151:2:1194 -6152:2:1195 -6153:2:1199 -6154:2:1200 -6155:2:1208 -6156:2:1213 -6157:2:1217 -6158:2:1218 -6159:2:1225 -6160:2:1226 -6161:2:1237 -6162:2:1238 -6163:2:1239 -6164:2:1237 -6165:2:1238 -6166:2:1239 -6167:2:1250 -6168:2:1255 -6169:2:1256 -6170:0:4365 -6171:3:3758 -6172:0:4365 -6173:2:1268 -6174:0:4365 -6175:3:3757 -6176:0:4365 -6177:2:1270 -6178:0:4365 -6179:3:3758 -6180:0:4365 -6181:2:1271 -6182:2:1275 -6183:2:1276 -6184:2:1284 -6185:2:1285 -6186:2:1289 -6187:2:1290 -6188:2:1284 -6189:2:1285 -6190:2:1289 -6191:2:1290 -6192:2:1298 -6193:2:1303 -6194:2:1307 -6195:2:1308 -6196:2:1315 -6197:2:1316 -6198:2:1327 -6199:2:1328 -6200:2:1329 -6201:2:1327 -6202:2:1328 -6203:2:1329 -6204:2:1340 -6205:2:1345 -6206:2:1346 -6207:0:4365 -6208:2:1358 -6209:0:4365 -6210:2:1360 -6211:0:4365 -6212:3:3757 -6213:0:4365 -6214:2:1361 -6215:0:4365 -6216:3:3758 -6217:0:4365 -6218:2:1362 -6219:2:1366 -6220:2:1367 -6221:2:1375 -6222:2:1376 -6223:2:1380 -6224:2:1381 -6225:2:1375 -6226:2:1376 -6227:2:1380 -6228:2:1381 -6229:2:1389 -6230:2:1394 -6231:2:1398 -6232:2:1399 -6233:2:1406 -6234:2:1407 -6235:2:1418 -6236:2:1419 -6237:2:1420 -6238:2:1418 -6239:2:1419 -6240:2:1420 -6241:2:1431 -6242:2:1436 -6243:2:1437 -6244:0:4365 -6245:2:1449 -6246:0:4365 -6247:3:3757 -6248:0:4365 -6249:2:1451 -6250:0:4365 -6251:3:3758 -6252:0:4365 -6253:2:1652 -6254:0:4365 -6255:2:1653 -6256:0:4365 -6257:2:1657 -6258:0:4365 -6259:2:1180 -6260:0:4365 -6261:3:3757 -6262:0:4365 -6263:2:1181 -6264:2:1185 -6265:2:1186 -6266:2:1194 -6267:2:1195 -6268:2:1199 -6269:2:1200 -6270:2:1194 -6271:2:1195 -6272:2:1196 -6273:2:1208 -6274:2:1213 -6275:2:1217 -6276:2:1218 -6277:2:1225 -6278:2:1226 -6279:2:1237 -6280:2:1238 -6281:2:1239 -6282:2:1237 -6283:2:1238 -6284:2:1239 -6285:2:1250 -6286:2:1255 -6287:2:1256 -6288:0:4365 -6289:3:3758 -6290:0:4365 -6291:2:1268 -6292:0:4365 -6293:3:3757 -6294:0:4365 -6295:2:1270 -6296:0:4365 -6297:3:3758 -6298:0:4365 -6299:2:1271 -6300:2:1275 -6301:2:1276 -6302:2:1284 -6303:2:1285 -6304:2:1289 -6305:2:1290 -6306:2:1284 -6307:2:1285 -6308:2:1289 -6309:2:1290 -6310:2:1298 -6311:2:1303 -6312:2:1307 -6313:2:1308 -6314:2:1315 -6315:2:1316 -6316:2:1327 -6317:2:1328 -6318:2:1329 -6319:2:1327 -6320:2:1328 -6321:2:1329 -6322:2:1340 -6323:2:1345 -6324:2:1346 -6325:0:4365 -6326:2:1358 -6327:0:4365 -6328:2:1454 -6329:0:4365 -6330:3:3757 -6331:0:4365 -6332:2:1455 -6333:0:4365 -6334:3:3758 -6335:0:4365 -6336:2:1652 -6337:0:4365 -6338:2:1653 -6339:0:4365 -6340:2:1657 -6341:0:4365 -6342:2:1660 -6343:0:4365 -6344:3:3757 -6345:0:4365 -6346:2:1665 -6347:2:1669 -6348:2:1670 -6349:2:1678 -6350:2:1679 -6351:2:1683 -6352:2:1684 -6353:2:1678 -6354:2:1679 -6355:2:1680 -6356:2:1692 -6357:2:1697 -6358:2:1701 -6359:2:1702 -6360:2:1709 -6361:2:1710 -6362:2:1721 -6363:2:1722 -6364:2:1723 -6365:2:1721 -6366:2:1722 -6367:2:1723 -6368:2:1734 -6369:2:1739 -6370:2:1740 -6371:0:4365 -6372:3:3758 -6373:0:4365 -6374:2:1752 -6375:0:4365 -6376:3:3757 -6377:0:4365 -6378:2:1754 -6379:0:4365 -6380:3:3758 -6381:0:4365 -6382:2:1755 -6383:2:1759 -6384:2:1760 -6385:2:1768 -6386:2:1769 -6387:2:1773 -6388:2:1774 -6389:2:1768 -6390:2:1769 -6391:2:1773 -6392:2:1774 -6393:2:1782 -6394:2:1787 -6395:2:1791 -6396:2:1792 -6397:2:1799 -6398:2:1800 -6399:2:1811 -6400:2:1812 -6401:2:1813 -6402:2:1811 -6403:2:1812 -6404:2:1813 -6405:2:1824 -6406:2:1829 -6407:2:1830 -6408:0:4365 -6409:2:1842 -6410:0:4365 -6411:3:3757 -6412:0:4365 -6413:2:1844 -6414:0:4365 -6415:3:3758 -6416:0:4365 -6417:2:1845 -6418:2:1849 -6419:2:1850 -6420:2:1858 -6421:2:1859 -6422:2:1863 -6423:2:1864 -6424:2:1858 -6425:2:1859 -6426:2:1863 -6427:2:1864 -6428:2:1872 -6429:2:1877 -6430:2:1881 -6431:2:1882 -6432:2:1889 -6433:2:1890 -6434:2:1901 -6435:2:1902 -6436:2:1903 -6437:2:1901 -6438:2:1902 -6439:2:1903 -6440:2:1914 -6441:2:1919 -6442:2:1920 -6443:0:4365 -6444:2:1932 -6445:0:4365 -6446:3:3757 -6447:0:4365 -6448:2:1934 -6449:0:4365 -6450:3:3758 -6451:0:4365 -6452:2:1935 -6453:0:4365 -6454:2:1936 -6455:0:4365 -6456:2:2129 -6457:0:4365 -6458:2:2130 -6459:0:4365 -6460:2:2134 -6461:0:4365 -6462:3:3757 -6463:0:4365 -6464:2:2136 -6465:0:4365 -6466:3:3758 -6467:0:4365 -6468:2:2137 -6469:2:2141 -6470:2:2142 -6471:2:2150 -6472:2:2151 -6473:2:2155 -6474:2:2156 -6475:2:2150 -6476:2:2151 -6477:2:2155 -6478:2:2156 -6479:2:2164 -6480:2:2169 -6481:2:2173 -6482:2:2174 -6483:2:2181 -6484:2:2182 -6485:2:2193 -6486:2:2194 -6487:2:2195 -6488:2:2193 -6489:2:2194 -6490:2:2195 -6491:2:2206 -6492:2:2211 -6493:2:2212 -6494:0:4365 -6495:2:2224 -6496:0:4365 -6497:3:3757 -6498:0:4365 -6499:2:2226 -6500:0:4365 -6501:3:3758 -6502:0:4365 -6503:2:1936 -6504:0:4365 -6505:2:2129 -6506:0:4365 -6507:2:2130 -6508:0:4365 -6509:2:2134 -6510:0:4365 -6511:3:3757 -6512:0:4365 -6513:2:2136 -6514:0:4365 -6515:3:3758 -6516:0:4365 -6517:2:2137 -6518:2:2141 -6519:2:2142 -6520:2:2150 -6521:2:2151 -6522:2:2155 -6523:2:2156 -6524:2:2150 -6525:2:2151 -6526:2:2152 -6527:2:2164 -6528:2:2169 -6529:2:2173 -6530:2:2174 -6531:2:2181 -6532:2:2182 -6533:2:2193 -6534:2:2194 -6535:2:2195 -6536:2:2193 -6537:2:2194 -6538:2:2195 -6539:2:2206 -6540:2:2211 -6541:2:2212 -6542:0:4365 -6543:2:2224 -6544:0:4365 -6545:3:3757 -6546:0:4365 -6547:2:2226 -6548:0:4365 -6549:3:3758 -6550:0:4365 -6551:2:2230 -6552:0:4365 -6553:3:3757 -6554:0:4365 -6555:2:2235 -6556:2:2239 -6557:2:2240 -6558:2:2248 -6559:2:2249 -6560:2:2253 -6561:2:2254 -6562:2:2248 -6563:2:2249 -6564:2:2250 -6565:2:2262 -6566:2:2267 -6567:2:2271 -6568:2:2272 -6569:2:2279 -6570:2:2280 -6571:2:2291 -6572:2:2292 -6573:2:2293 -6574:2:2291 -6575:2:2292 -6576:2:2293 -6577:2:2304 -6578:2:2309 -6579:2:2310 -6580:0:4365 -6581:3:3758 -6582:0:4365 -6583:2:2322 -6584:0:4365 -6585:2:1169 -6586:0:4365 -6587:3:3757 -6588:0:4365 -6589:2:1170 -6590:0:4365 -6591:3:3758 -6592:0:4365 -6593:3:3759 -6594:0:4365 -6595:3:3972 -6596:0:4365 -6597:3:4077 -6598:0:4365 -6599:3:4078 -6600:0:4365 -6601:3:4082 -6602:0:4365 -6603:3:4088 -6604:0:4365 -6605:3:4092 -6606:3:4093 -6607:3:4097 -6608:3:4101 -6609:3:4102 -6610:3:4097 -6611:3:4101 -6612:3:4102 -6613:3:4106 -6614:3:4114 -6615:3:4115 -6616:3:4120 -6617:3:4127 -6618:3:4128 -6619:3:4127 -6620:3:4128 -6621:3:4135 -6622:3:4140 -6623:0:4365 -6624:3:4151 -6625:0:4365 -6626:3:4155 -6627:3:4156 -6628:3:4160 -6629:3:4164 -6630:3:4165 -6631:3:4160 -6632:3:4164 -6633:3:4165 -6634:3:4169 -6635:3:4177 -6636:3:4178 -6637:3:4183 -6638:3:4190 -6639:3:4191 -6640:3:4190 -6641:3:4191 -6642:3:4198 -6643:3:4203 -6644:0:4365 -6645:3:4151 -6646:0:4365 -6647:3:4155 -6648:3:4156 -6649:3:4160 -6650:3:4164 -6651:3:4165 -6652:3:4160 -6653:3:4164 -6654:3:4165 -6655:3:4169 -6656:3:4177 -6657:3:4178 -6658:3:4183 -6659:3:4190 -6660:3:4191 -6661:3:4190 -6662:3:4191 -6663:3:4198 -6664:3:4203 -6665:0:4365 -6666:3:4214 -6667:0:4365 -6668:3:4222 -6669:3:4223 -6670:3:4227 -6671:3:4231 -6672:3:4232 -6673:3:4227 -6674:3:4231 -6675:3:4232 -6676:3:4236 -6677:3:4244 -6678:3:4245 -6679:3:4250 -6680:3:4257 -6681:3:4258 -6682:3:4257 -6683:3:4258 -6684:3:4265 -6685:3:4270 -6686:0:4365 -6687:3:4285 -6688:0:4365 -6689:3:4286 -6690:0:4365 -6691:2:1173 -6692:0:4365 -6693:3:4287 -6694:0:4365 -6695:2:1179 -6696:0:4365 -6697:2:1180 -6698:0:4365 -6699:3:4286 -6700:0:4365 -6701:2:1181 -6702:2:1185 -6703:2:1186 -6704:2:1194 -6705:2:1195 -6706:2:1199 -6707:2:1200 -6708:2:1194 -6709:2:1195 -6710:2:1199 -6711:2:1200 -6712:2:1208 -6713:2:1213 -6714:2:1217 -6715:2:1218 -6716:2:1225 -6717:2:1226 -6718:2:1237 -6719:2:1238 -6720:2:1239 -6721:2:1237 -6722:2:1238 -6723:2:1239 -6724:2:1250 -6725:2:1255 -6726:2:1256 -6727:0:4365 -6728:3:4287 -6729:0:4365 -6730:2:1268 -6731:0:4365 -6732:3:4286 -6733:0:4365 -6734:2:1270 -6735:0:4365 -6736:3:4287 -6737:0:4365 -6738:2:1271 -6739:2:1275 -6740:2:1276 -6741:2:1284 -6742:2:1285 -6743:2:1289 -6744:2:1290 -6745:2:1284 -6746:2:1285 -6747:2:1289 -6748:2:1290 -6749:2:1298 -6750:2:1303 -6751:2:1307 -6752:2:1308 -6753:2:1315 -6754:2:1316 -6755:2:1327 -6756:2:1328 -6757:2:1329 -6758:2:1327 -6759:2:1328 -6760:2:1329 -6761:2:1340 -6762:2:1345 -6763:2:1346 -6764:0:4365 -6765:2:1358 -6766:0:4365 -6767:2:1360 -6768:0:4365 -6769:3:4286 -6770:0:4365 -6771:2:1361 -6772:0:4365 -6773:3:4287 -6774:0:4365 -6775:2:1362 -6776:2:1366 -6777:2:1367 -6778:2:1375 -6779:2:1376 -6780:2:1380 -6781:2:1381 -6782:2:1375 -6783:2:1376 -6784:2:1380 -6785:2:1381 -6786:2:1389 -6787:2:1394 -6788:2:1398 -6789:2:1399 -6790:2:1406 -6791:2:1407 -6792:2:1418 -6793:2:1419 -6794:2:1420 -6795:2:1418 -6796:2:1419 -6797:2:1420 -6798:2:1431 -6799:2:1436 -6800:2:1437 -6801:0:4365 -6802:2:1449 -6803:0:4365 -6804:3:4286 -6805:0:4365 -6806:2:1451 -6807:0:4365 -6808:3:4287 -6809:0:4365 -6810:2:1652 -6811:0:4365 -6812:2:1653 -6813:0:4365 -6814:2:1657 -6815:0:4365 -6816:2:1180 -6817:0:4365 -6818:3:4286 -6819:0:4365 -6820:2:1181 -6821:2:1185 -6822:2:1186 -6823:2:1194 -6824:2:1195 -6825:2:1199 -6826:2:1200 -6827:2:1194 -6828:2:1195 -6829:2:1196 -6830:2:1208 -6831:2:1213 -6832:2:1217 -6833:2:1218 -6834:2:1225 -6835:2:1226 -6836:2:1237 -6837:2:1238 -6838:2:1239 -6839:2:1237 -6840:2:1238 -6841:2:1239 -6842:2:1250 -6843:2:1255 -6844:2:1256 -6845:0:4365 -6846:3:4287 -6847:0:4365 -6848:2:1268 -6849:0:4365 -6850:3:4286 -6851:0:4365 -6852:2:1270 -6853:0:4365 -6854:3:4287 -6855:0:4365 -6856:2:1271 -6857:2:1275 -6858:2:1276 -6859:2:1284 -6860:2:1285 -6861:2:1289 -6862:2:1290 -6863:2:1284 -6864:2:1285 -6865:2:1289 -6866:2:1290 -6867:2:1298 -6868:2:1303 -6869:2:1307 -6870:2:1308 -6871:2:1315 -6872:2:1316 -6873:2:1327 -6874:2:1328 -6875:2:1329 -6876:2:1327 -6877:2:1328 -6878:2:1329 -6879:2:1340 -6880:2:1345 -6881:2:1346 -6882:0:4365 -6883:2:1358 -6884:0:4365 -6885:2:1454 -6886:0:4365 -6887:3:4286 -6888:0:4365 -6889:2:1455 -6890:0:4365 -6891:3:4287 -6892:0:4365 -6893:2:1652 -6894:0:4365 -6895:2:1653 -6896:0:4365 -6897:2:1657 -6898:0:4365 -6899:2:1660 -6900:0:4365 -6901:3:4286 -6902:0:4365 -6903:2:1665 -6904:2:1669 -6905:2:1670 -6906:2:1678 -6907:2:1679 -6908:2:1683 -6909:2:1684 -6910:2:1678 -6911:2:1679 -6912:2:1680 -6913:2:1692 -6914:2:1697 -6915:2:1701 -6916:2:1702 -6917:2:1709 -6918:2:1710 -6919:2:1721 -6920:2:1722 -6921:2:1723 -6922:2:1721 -6923:2:1722 -6924:2:1723 -6925:2:1734 -6926:2:1739 -6927:2:1740 -6928:0:4365 -6929:3:4287 -6930:0:4365 -6931:2:1752 -6932:0:4365 -6933:3:4286 -6934:0:4365 -6935:2:1754 -6936:0:4365 -6937:3:4287 -6938:0:4365 -6939:2:1755 -6940:2:1759 -6941:2:1760 -6942:2:1768 -6943:2:1769 -6944:2:1773 -6945:2:1774 -6946:2:1768 -6947:2:1769 -6948:2:1773 -6949:2:1774 -6950:2:1782 -6951:2:1787 -6952:2:1791 -6953:2:1792 -6954:2:1799 -6955:2:1800 -6956:2:1811 -6957:2:1812 -6958:2:1813 -6959:2:1811 -6960:2:1812 -6961:2:1813 -6962:2:1824 -6963:2:1829 -6964:2:1830 -6965:0:4365 -6966:2:1842 -6967:0:4365 -6968:3:4286 -6969:0:4365 -6970:2:1844 -6971:0:4365 -6972:3:4287 -6973:0:4365 -6974:2:1845 -6975:2:1849 -6976:2:1850 -6977:2:1858 -6978:2:1859 -6979:2:1863 -6980:2:1864 -6981:2:1858 -6982:2:1859 -6983:2:1863 -6984:2:1864 -6985:2:1872 -6986:2:1877 -6987:2:1881 -6988:2:1882 -6989:2:1889 -6990:2:1890 -6991:2:1901 -6992:2:1902 -6993:2:1903 -6994:2:1901 -6995:2:1902 -6996:2:1903 -6997:2:1914 -6998:2:1919 -6999:2:1920 -7000:0:4365 -7001:2:1932 -7002:0:4365 -7003:3:4286 -7004:0:4365 -7005:2:1934 -7006:0:4365 -7007:3:4287 -7008:0:4365 -7009:2:1935 -7010:0:4365 -7011:2:1936 -7012:0:4365 -7013:2:2129 -7014:0:4365 -7015:2:2130 -7016:0:4365 -7017:2:2134 -7018:0:4365 -7019:3:4286 -7020:0:4365 -7021:2:2136 -7022:0:4365 -7023:3:4287 -7024:0:4365 -7025:2:2137 -7026:2:2141 -7027:2:2142 -7028:2:2150 -7029:2:2151 -7030:2:2155 -7031:2:2156 -7032:2:2150 -7033:2:2151 -7034:2:2155 -7035:2:2156 -7036:2:2164 -7037:2:2169 -7038:2:2173 -7039:2:2174 -7040:2:2181 -7041:2:2182 -7042:2:2193 -7043:2:2194 -7044:2:2195 -7045:2:2193 -7046:2:2194 -7047:2:2195 -7048:2:2206 -7049:2:2211 -7050:2:2212 -7051:0:4365 -7052:2:2224 -7053:0:4365 -7054:3:4286 -7055:0:4365 -7056:2:2226 -7057:0:4365 -7058:3:4287 -7059:0:4365 -7060:2:1936 -7061:0:4365 -7062:2:2129 -7063:0:4365 -7064:2:2130 -7065:0:4365 -7066:2:2134 -7067:0:4365 -7068:3:4286 -7069:0:4365 -7070:2:2136 -7071:0:4365 -7072:3:4287 -7073:0:4365 -7074:2:2137 -7075:2:2141 -7076:2:2142 -7077:2:2150 -7078:2:2151 -7079:2:2155 -7080:2:2156 -7081:2:2150 -7082:2:2151 -7083:2:2152 -7084:2:2164 -7085:2:2169 -7086:2:2173 -7087:2:2174 -7088:2:2181 -7089:2:2182 -7090:2:2193 -7091:2:2194 -7092:2:2195 -7093:2:2193 -7094:2:2194 -7095:2:2195 -7096:2:2206 -7097:2:2211 -7098:2:2212 -7099:0:4365 -7100:2:2224 -7101:0:4365 -7102:3:4286 -7103:0:4365 -7104:2:2226 -7105:0:4365 -7106:3:4287 -7107:0:4365 -7108:2:2230 -7109:0:4365 -7110:3:4286 -7111:0:4365 -7112:2:2235 -7113:2:2239 -7114:2:2240 -7115:2:2248 -7116:2:2249 -7117:2:2253 -7118:2:2254 -7119:2:2248 -7120:2:2249 -7121:2:2250 -7122:2:2262 -7123:2:2267 -7124:2:2271 -7125:2:2272 -7126:2:2279 -7127:2:2280 -7128:2:2291 -7129:2:2292 -7130:2:2293 -7131:2:2291 -7132:2:2292 -7133:2:2293 -7134:2:2304 -7135:2:2309 -7136:2:2310 -7137:0:4365 -7138:3:4287 -7139:0:4365 -7140:2:2322 -7141:0:4365 -7142:2:1169 -7143:0:4365 -7144:3:4286 -7145:0:4365 -7146:2:1170 -7147:0:4365 -7148:3:4287 -7149:0:4365 -7150:3:4288 -7151:0:4365 -7152:3:4294 -7153:0:4365 -7154:3:4295 -7155:0:4365 -7156:3:2338 -7157:0:4365 -7158:3:2339 -7159:3:2343 -7160:3:2344 -7161:3:2352 -7162:3:2353 -7163:3:2357 -7164:3:2358 -7165:3:2352 -7166:3:2353 -7167:3:2357 -7168:3:2358 -7169:3:2366 -7170:3:2371 -7171:3:2375 -7172:3:2376 -7173:3:2383 -7174:3:2384 -7175:3:2395 -7176:3:2396 -7177:3:2397 -7178:3:2395 -7179:3:2396 -7180:3:2397 -7181:3:2408 -7182:3:2413 -7183:3:2414 -7184:0:4365 -7185:3:2426 -7186:0:4365 -7187:3:2427 -7188:0:4365 -7189:2:1173 -7190:0:4365 -7191:3:2428 -7192:0:4365 -7193:2:1179 -7194:0:4365 -7195:2:1180 -7196:0:4365 -7197:3:2427 -7198:0:4365 -7199:2:1181 -7200:2:1185 -7201:2:1186 -7202:2:1194 -7203:2:1195 -7204:2:1199 -7205:2:1200 -7206:2:1194 -7207:2:1195 -7208:2:1199 -7209:2:1200 -7210:2:1208 -7211:2:1213 -7212:2:1217 -7213:2:1218 -7214:2:1225 -7215:2:1226 -7216:2:1237 -7217:2:1238 -7218:2:1239 -7219:2:1237 -7220:2:1238 -7221:2:1239 -7222:2:1250 -7223:2:1255 -7224:2:1256 -7225:0:4365 -7226:3:2428 -7227:0:4365 -7228:2:1268 -7229:0:4365 -7230:3:2427 -7231:0:4365 -7232:2:1270 -7233:0:4365 -7234:3:2428 -7235:0:4365 -7236:2:1271 -7237:2:1275 -7238:2:1276 -7239:2:1284 -7240:2:1285 -7241:2:1289 -7242:2:1290 -7243:2:1284 -7244:2:1285 -7245:2:1289 -7246:2:1290 -7247:2:1298 -7248:2:1303 -7249:2:1307 -7250:2:1308 -7251:2:1315 -7252:2:1316 -7253:2:1327 -7254:2:1328 -7255:2:1329 -7256:2:1327 -7257:2:1328 -7258:2:1329 -7259:2:1340 -7260:2:1345 -7261:2:1346 -7262:0:4365 -7263:2:1358 -7264:0:4365 -7265:2:1360 -7266:0:4365 -7267:3:2427 -7268:0:4365 -7269:2:1361 -7270:0:4365 -7271:3:2428 -7272:0:4365 -7273:2:1362 -7274:2:1366 -7275:2:1367 -7276:2:1375 -7277:2:1376 -7278:2:1380 -7279:2:1381 -7280:2:1375 -7281:2:1376 -7282:2:1380 -7283:2:1381 -7284:2:1389 -7285:2:1394 -7286:2:1398 -7287:2:1399 -7288:2:1406 -7289:2:1407 -7290:2:1418 -7291:2:1419 -7292:2:1420 -7293:2:1418 -7294:2:1419 -7295:2:1420 -7296:2:1431 -7297:2:1436 -7298:2:1437 -7299:0:4365 -7300:2:1449 -7301:0:4365 -7302:3:2427 -7303:0:4365 -7304:2:1451 -7305:0:4365 -7306:3:2428 -7307:0:4365 -7308:2:1652 -7309:0:4365 -7310:2:1653 -7311:0:4365 -7312:2:1657 -7313:0:4365 -7314:2:1180 -7315:0:4365 -7316:3:2427 -7317:0:4365 -7318:2:1181 -7319:2:1185 -7320:2:1186 -7321:2:1194 -7322:2:1195 -7323:2:1199 -7324:2:1200 -7325:2:1194 -7326:2:1195 -7327:2:1196 -7328:2:1208 -7329:2:1213 -7330:2:1217 -7331:2:1218 -7332:2:1225 -7333:2:1226 -7334:2:1237 -7335:2:1238 -7336:2:1239 -7337:2:1237 -7338:2:1238 -7339:2:1239 -7340:2:1250 -7341:2:1255 -7342:2:1256 -7343:0:4365 -7344:3:2428 -7345:0:4365 -7346:2:1268 -7347:0:4365 -7348:3:2427 -7349:0:4365 -7350:2:1270 -7351:0:4365 -7352:3:2428 -7353:0:4365 -7354:2:1271 -7355:2:1275 -7356:2:1276 -7357:2:1284 -7358:2:1285 -7359:2:1289 -7360:2:1290 -7361:2:1284 -7362:2:1285 -7363:2:1289 -7364:2:1290 -7365:2:1298 -7366:2:1303 -7367:2:1307 -7368:2:1308 -7369:2:1315 -7370:2:1316 -7371:2:1327 -7372:2:1328 -7373:2:1329 -7374:2:1327 -7375:2:1328 -7376:2:1329 -7377:2:1340 -7378:2:1345 -7379:2:1346 -7380:0:4365 -7381:2:1358 -7382:0:4365 -7383:2:1454 -7384:0:4365 -7385:3:2427 -7386:0:4365 -7387:2:1455 -7388:0:4365 -7389:3:2428 -7390:0:4365 -7391:2:1652 -7392:0:4365 -7393:2:1653 -7394:0:4365 -7395:2:1657 -7396:0:4365 -7397:2:1660 -7398:0:4365 -7399:3:2427 -7400:0:4365 -7401:2:1665 -7402:2:1669 -7403:2:1670 -7404:2:1678 -7405:2:1679 -7406:2:1683 -7407:2:1684 -7408:2:1678 -7409:2:1679 -7410:2:1680 -7411:2:1692 -7412:2:1697 -7413:2:1701 -7414:2:1702 -7415:2:1709 -7416:2:1710 -7417:2:1721 -7418:2:1722 -7419:2:1723 -7420:2:1721 -7421:2:1722 -7422:2:1723 -7423:2:1734 -7424:2:1739 -7425:2:1740 -7426:0:4365 -7427:3:2428 -7428:0:4365 -7429:2:1752 -7430:0:4365 -7431:3:2427 -7432:0:4365 -7433:2:1754 -7434:0:4365 -7435:3:2428 -7436:0:4365 -7437:2:1755 -7438:2:1759 -7439:2:1760 -7440:2:1768 -7441:2:1769 -7442:2:1773 -7443:2:1774 -7444:2:1768 -7445:2:1769 -7446:2:1773 -7447:2:1774 -7448:2:1782 -7449:2:1787 -7450:2:1791 -7451:2:1792 -7452:2:1799 -7453:2:1800 -7454:2:1811 -7455:2:1812 -7456:2:1813 -7457:2:1811 -7458:2:1812 -7459:2:1813 -7460:2:1824 -7461:2:1829 -7462:2:1830 -7463:0:4365 -7464:2:1842 -7465:0:4365 -7466:3:2427 -7467:0:4365 -7468:2:1844 -7469:0:4365 -7470:3:2428 -7471:0:4365 -7472:2:1845 -7473:2:1849 -7474:2:1850 -7475:2:1858 -7476:2:1859 -7477:2:1863 -7478:2:1864 -7479:2:1858 -7480:2:1859 -7481:2:1863 -7482:2:1864 -7483:2:1872 -7484:2:1877 -7485:2:1881 -7486:2:1882 -7487:2:1889 -7488:2:1890 -7489:2:1901 -7490:2:1902 -7491:2:1903 -7492:2:1901 -7493:2:1902 -7494:2:1903 -7495:2:1914 -7496:2:1919 -7497:2:1920 -7498:0:4365 -7499:2:1932 -7500:0:4365 -7501:3:2427 -7502:0:4365 -7503:2:1934 -7504:0:4365 -7505:3:2428 -7506:0:4365 -7507:2:1935 -7508:0:4365 -7509:2:1936 -7510:0:4365 -7511:2:2129 -7512:0:4365 -7513:2:2130 -7514:0:4365 -7515:2:2134 -7516:0:4365 -7517:3:2427 -7518:0:4365 -7519:2:2136 -7520:0:4365 -7521:3:2428 -7522:0:4365 -7523:2:2137 -7524:2:2141 -7525:2:2142 -7526:2:2150 -7527:2:2151 -7528:2:2155 -7529:2:2156 -7530:2:2150 -7531:2:2151 -7532:2:2155 -7533:2:2156 -7534:2:2164 -7535:2:2169 -7536:2:2173 -7537:2:2174 -7538:2:2181 -7539:2:2182 -7540:2:2193 -7541:2:2194 -7542:2:2195 -7543:2:2193 -7544:2:2194 -7545:2:2195 -7546:2:2206 -7547:2:2211 -7548:2:2212 -7549:0:4365 -7550:2:2224 -7551:0:4365 -7552:3:2427 -7553:0:4365 -7554:2:2226 -7555:0:4365 -7556:3:2428 -7557:0:4365 -7558:2:1936 -7559:0:4365 -7560:2:2129 -7561:0:4365 -7562:2:2130 -7563:0:4365 -7564:2:2134 -7565:0:4365 -7566:3:2427 -7567:0:4365 -7568:2:2136 -7569:0:4365 -7570:3:2428 -7571:0:4365 -7572:2:2137 -7573:2:2141 -7574:2:2142 -7575:2:2150 -7576:2:2151 -7577:2:2155 -7578:2:2156 -7579:2:2150 -7580:2:2151 -7581:2:2152 -7582:2:2164 -7583:2:2169 -7584:2:2173 -7585:2:2174 -7586:2:2181 -7587:2:2182 -7588:2:2193 -7589:2:2194 -7590:2:2195 -7591:2:2193 -7592:2:2194 -7593:2:2195 -7594:2:2206 -7595:2:2211 -7596:2:2212 -7597:0:4365 -7598:2:2224 -7599:0:4365 -7600:3:2427 -7601:0:4365 -7602:2:2226 -7603:0:4365 -7604:3:2428 -7605:0:4365 -7606:2:2230 -7607:0:4365 -7608:3:2427 -7609:0:4365 -7610:2:2235 -7611:2:2239 -7612:2:2240 -7613:2:2248 -7614:2:2249 -7615:2:2253 -7616:2:2254 -7617:2:2248 -7618:2:2249 -7619:2:2250 -7620:2:2262 -7621:2:2267 -7622:2:2271 -7623:2:2272 -7624:2:2279 -7625:2:2280 -7626:2:2291 -7627:2:2292 -7628:2:2293 -7629:2:2291 -7630:2:2292 -7631:2:2293 -7632:2:2304 -7633:2:2309 -7634:2:2310 -7635:0:4365 -7636:3:2428 -7637:0:4365 -7638:2:2322 -7639:0:4365 -7640:2:1169 -7641:0:4365 -7642:3:2427 -7643:0:4365 -7644:2:1170 -7645:0:4365 -7646:3:2428 -7647:0:4365 -7648:3:2429 -7649:0:4365 -7650:3:2435 -7651:3:2436 -7652:0:4365 -7653:3:2440 -7654:3:2444 -7655:3:2445 -7656:3:2453 -7657:3:2454 -7658:3:2458 -7659:3:2459 -7660:3:2453 -7661:3:2454 -7662:3:2458 -7663:3:2459 -7664:3:2467 -7665:3:2472 -7666:3:2473 -7667:3:2484 -7668:3:2485 -7669:3:2496 -7670:3:2497 -7671:3:2498 -7672:3:2496 -7673:3:2497 -7674:3:2498 -7675:3:2509 -7676:3:2514 -7677:3:2515 -7678:0:4365 -7679:3:2527 -7680:0:4365 -7681:3:2528 -7682:0:4365 -7683:2:1173 -7684:0:4365 -7685:3:2529 -7686:0:4365 -7687:2:1179 -7688:0:4365 -7689:2:1180 -7690:0:4365 -7691:3:2528 -7692:0:4365 -7693:2:1181 -7694:2:1185 -7695:2:1186 -7696:2:1194 -7697:2:1195 -7698:2:1199 -7699:2:1200 -7700:2:1194 -7701:2:1195 -7702:2:1199 -7703:2:1200 -7704:2:1208 -7705:2:1213 -7706:2:1217 -7707:2:1218 -7708:2:1225 -7709:2:1226 -7710:2:1237 -7711:2:1238 -7712:2:1239 -7713:2:1237 -7714:2:1238 -7715:2:1239 -7716:2:1250 -7717:2:1255 -7718:2:1256 -7719:0:4365 -7720:3:2529 -7721:0:4365 -7722:2:1268 -7723:0:4365 -7724:3:2528 -7725:0:4365 -7726:2:1270 -7727:0:4365 -7728:3:2529 -7729:0:4365 -7730:2:1271 -7731:2:1275 -7732:2:1276 -7733:2:1284 -7734:2:1285 -7735:2:1289 -7736:2:1290 -7737:2:1284 -7738:2:1285 -7739:2:1289 -7740:2:1290 -7741:2:1298 -7742:2:1303 -7743:2:1307 -7744:2:1308 -7745:2:1315 -7746:2:1316 -7747:2:1327 -7748:2:1328 -7749:2:1329 -7750:2:1327 -7751:2:1328 -7752:2:1329 -7753:2:1340 -7754:2:1345 -7755:2:1346 -7756:0:4365 -7757:2:1358 -7758:0:4365 -7759:2:1360 -7760:0:4365 -7761:3:2528 -7762:0:4365 -7763:2:1361 -7764:0:4365 -7765:3:2529 -7766:0:4365 -7767:2:1362 -7768:2:1366 -7769:2:1367 -7770:2:1375 -7771:2:1376 -7772:2:1380 -7773:2:1381 -7774:2:1375 -7775:2:1376 -7776:2:1380 -7777:2:1381 -7778:2:1389 -7779:2:1394 -7780:2:1398 -7781:2:1399 -7782:2:1406 -7783:2:1407 -7784:2:1418 -7785:2:1419 -7786:2:1420 -7787:2:1418 -7788:2:1419 -7789:2:1420 -7790:2:1431 -7791:2:1436 -7792:2:1437 -7793:0:4365 -7794:2:1449 -7795:0:4365 -7796:3:2528 -7797:0:4365 -7798:2:1451 -7799:0:4365 -7800:3:2529 -7801:0:4365 -7802:2:1652 -7803:0:4365 -7804:2:1653 -7805:0:4365 -7806:2:1657 -7807:0:4365 -7808:2:1180 -7809:0:4365 -7810:3:2528 -7811:0:4365 -7812:2:1181 -7813:2:1185 -7814:2:1186 -7815:2:1194 -7816:2:1195 -7817:2:1199 -7818:2:1200 -7819:2:1194 -7820:2:1195 -7821:2:1196 -7822:2:1208 -7823:2:1213 -7824:2:1217 -7825:2:1218 -7826:2:1225 -7827:2:1226 -7828:2:1237 -7829:2:1238 -7830:2:1239 -7831:2:1237 -7832:2:1238 -7833:2:1239 -7834:2:1250 -7835:2:1255 -7836:2:1256 -7837:0:4365 -7838:3:2529 -7839:0:4365 -7840:2:1268 -7841:0:4365 -7842:3:2528 -7843:0:4365 -7844:2:1270 -7845:0:4365 -7846:3:2529 -7847:0:4365 -7848:2:1271 -7849:2:1275 -7850:2:1276 -7851:2:1284 -7852:2:1285 -7853:2:1289 -7854:2:1290 -7855:2:1284 -7856:2:1285 -7857:2:1289 -7858:2:1290 -7859:2:1298 -7860:2:1303 -7861:2:1307 -7862:2:1308 -7863:2:1315 -7864:2:1316 -7865:2:1327 -7866:2:1328 -7867:2:1329 -7868:2:1327 -7869:2:1328 -7870:2:1329 -7871:2:1340 -7872:2:1345 -7873:2:1346 -7874:0:4365 -7875:2:1358 -7876:0:4365 -7877:2:1454 -7878:0:4365 -7879:3:2528 -7880:0:4365 -7881:2:1455 -7882:0:4365 -7883:3:2529 -7884:0:4365 -7885:2:1652 -7886:0:4365 -7887:2:1653 -7888:0:4365 -7889:2:1657 -7890:0:4365 -7891:2:1660 -7892:0:4365 -7893:3:2528 -7894:0:4365 -7895:2:1665 -7896:2:1669 -7897:2:1670 -7898:2:1678 -7899:2:1679 -7900:2:1683 -7901:2:1684 -7902:2:1678 -7903:2:1679 -7904:2:1680 -7905:2:1692 -7906:2:1697 -7907:2:1701 -7908:2:1702 -7909:2:1709 -7910:2:1710 -7911:2:1721 -7912:2:1722 -7913:2:1723 -7914:2:1721 -7915:2:1722 -7916:2:1723 -7917:2:1734 -7918:2:1739 -7919:2:1740 -7920:0:4365 -7921:3:2529 -7922:0:4365 -7923:2:1752 -7924:0:4365 -7925:3:2528 -7926:0:4365 -7927:2:1754 -7928:0:4365 -7929:3:2529 -7930:0:4365 -7931:2:1755 -7932:2:1759 -7933:2:1760 -7934:2:1768 -7935:2:1769 -7936:2:1773 -7937:2:1774 -7938:2:1768 -7939:2:1769 -7940:2:1773 -7941:2:1774 -7942:2:1782 -7943:2:1787 -7944:2:1791 -7945:2:1792 -7946:2:1799 -7947:2:1800 -7948:2:1811 -7949:2:1812 -7950:2:1813 -7951:2:1811 -7952:2:1812 -7953:2:1813 -7954:2:1824 -7955:2:1829 -7956:2:1830 -7957:0:4365 -7958:2:1842 -7959:0:4365 -7960:3:2528 -7961:0:4365 -7962:2:1844 -7963:0:4365 -7964:3:2529 -7965:0:4365 -7966:2:1845 -7967:2:1849 -7968:2:1850 -7969:2:1858 -7970:2:1859 -7971:2:1863 -7972:2:1864 -7973:2:1858 -7974:2:1859 -7975:2:1863 -7976:2:1864 -7977:2:1872 -7978:2:1877 -7979:2:1881 -7980:2:1882 -7981:2:1889 -7982:2:1890 -7983:2:1901 -7984:2:1902 -7985:2:1903 -7986:2:1901 -7987:2:1902 -7988:2:1903 -7989:2:1914 -7990:2:1919 -7991:2:1920 -7992:0:4365 -7993:2:1932 -7994:0:4365 -7995:3:2528 -7996:0:4365 -7997:2:1934 -7998:0:4365 -7999:3:2529 -8000:0:4365 -8001:2:1935 -8002:0:4365 -8003:2:1936 -8004:0:4365 -8005:2:2129 -8006:0:4365 -8007:2:2130 -8008:0:4365 -8009:2:2134 -8010:0:4365 -8011:3:2528 -8012:0:4365 -8013:2:2136 -8014:0:4365 -8015:3:2529 -8016:0:4365 -8017:2:2137 -8018:2:2141 -8019:2:2142 -8020:2:2150 -8021:2:2151 -8022:2:2155 -8023:2:2156 -8024:2:2150 -8025:2:2151 -8026:2:2155 -8027:2:2156 -8028:2:2164 -8029:2:2169 -8030:2:2173 -8031:2:2174 -8032:2:2181 -8033:2:2182 -8034:2:2193 -8035:2:2194 -8036:2:2195 -8037:2:2193 -8038:2:2194 -8039:2:2195 -8040:2:2206 -8041:2:2211 -8042:2:2212 -8043:0:4365 -8044:2:2224 -8045:0:4365 -8046:3:2528 -8047:0:4365 -8048:2:2226 -8049:0:4365 -8050:3:2529 -8051:0:4365 -8052:2:1936 -8053:0:4365 -8054:2:2129 -8055:0:4365 -8056:2:2130 -8057:0:4365 -8058:2:2134 -8059:0:4365 -8060:3:2528 -8061:0:4365 -8062:2:2136 -8063:0:4365 -8064:3:2529 -8065:0:4365 -8066:2:2137 -8067:2:2141 -8068:2:2142 -8069:2:2150 -8070:2:2151 -8071:2:2155 -8072:2:2156 -8073:2:2150 -8074:2:2151 -8075:2:2152 -8076:2:2164 -8077:2:2169 -8078:2:2173 -8079:2:2174 -8080:2:2181 -8081:2:2182 -8082:2:2193 -8083:2:2194 -8084:2:2195 -8085:2:2193 -8086:2:2194 -8087:2:2195 -8088:2:2206 -8089:2:2211 -8090:2:2212 -8091:0:4365 -8092:2:2224 -8093:0:4365 -8094:3:2528 -8095:0:4365 -8096:2:2226 -8097:0:4365 -8098:3:2529 -8099:0:4365 -8100:2:2230 -8101:0:4365 -8102:3:2528 -8103:0:4365 -8104:2:2235 -8105:2:2239 -8106:2:2240 -8107:2:2248 -8108:2:2249 -8109:2:2253 -8110:2:2254 -8111:2:2248 -8112:2:2249 -8113:2:2250 -8114:2:2262 -8115:2:2267 -8116:2:2271 -8117:2:2272 -8118:2:2279 -8119:2:2280 -8120:2:2291 -8121:2:2292 -8122:2:2293 -8123:2:2291 -8124:2:2292 -8125:2:2293 -8126:2:2304 -8127:2:2309 -8128:2:2310 -8129:0:4365 -8130:3:2529 -8131:0:4365 -8132:2:2322 -8133:0:4365 -8134:2:1169 -8135:0:4365 -8136:3:2528 -8137:0:4365 -8138:2:1170 -8139:0:4365 -8140:3:2529 -8141:0:4365 -8142:3:2530 -8143:0:4365 -8144:3:2536 -8145:0:4365 -8146:3:2537 -8147:0:4365 -8148:3:2547 -8149:0:4365 -8150:3:2548 -8151:0:4365 -8152:3:2552 -8153:3:2553 -8154:3:2557 -8155:3:2561 -8156:3:2562 -8157:3:2557 -8158:3:2561 -8159:3:2562 -8160:3:2566 -8161:3:2574 -8162:3:2575 -8163:3:2580 -8164:3:2587 -8165:3:2588 -8166:3:2587 -8167:3:2588 -8168:3:2595 -8169:3:2600 -8170:0:4365 -8171:3:2611 -8172:0:4365 -8173:3:2615 -8174:3:2616 -8175:3:2620 -8176:3:2624 -8177:3:2625 -8178:3:2620 -8179:3:2624 -8180:3:2625 -8181:3:2629 -8182:3:2637 -8183:3:2638 -8184:3:2643 -8185:3:2650 -8186:3:2651 -8187:3:2650 -8188:3:2651 -8189:3:2658 -8190:3:2663 -8191:0:4365 -8192:3:2611 -8193:0:4365 -8194:3:2615 -8195:3:2616 -8196:3:2620 -8197:3:2624 -8198:3:2625 -8199:3:2620 -8200:3:2624 -8201:3:2625 -8202:3:2629 -8203:3:2637 -8204:3:2638 -8205:3:2643 -8206:3:2650 -8207:3:2651 -8208:3:2650 -8209:3:2651 -8210:3:2658 -8211:3:2663 -8212:0:4365 -8213:3:2674 -8214:0:4365 -8215:3:2682 -8216:3:2683 -8217:3:2687 -8218:3:2691 -8219:3:2692 -8220:3:2687 -8221:3:2691 -8222:3:2692 -8223:3:2696 -8224:3:2704 -8225:3:2705 -8226:3:2710 -8227:3:2717 -8228:3:2718 -8229:3:2717 -8230:3:2718 -8231:3:2725 -8232:3:2730 -8233:0:4365 -8234:3:2745 -8235:0:4365 -8236:3:2746 -8237:0:4365 -8238:2:1173 -8239:0:4365 -8240:3:2747 -8241:0:4365 -8242:2:1179 -8243:0:4365 -8244:2:1180 -8245:0:4365 -8246:3:2746 -8247:0:4365 -8248:2:1181 -8249:2:1185 -8250:2:1186 -8251:2:1194 -8252:2:1195 -8253:2:1199 -8254:2:1200 -8255:2:1194 -8256:2:1195 -8257:2:1199 -8258:2:1200 -8259:2:1208 -8260:2:1213 -8261:2:1217 -8262:2:1218 -8263:2:1225 -8264:2:1226 -8265:2:1237 -8266:2:1238 -8267:2:1239 -8268:2:1237 -8269:2:1238 -8270:2:1239 -8271:2:1250 -8272:2:1255 -8273:2:1256 -8274:0:4365 -8275:3:2747 -8276:0:4365 -8277:2:1268 -8278:0:4365 -8279:3:2746 -8280:0:4365 -8281:2:1270 -8282:0:4365 -8283:3:2747 -8284:0:4365 -8285:2:1271 -8286:2:1275 -8287:2:1276 -8288:2:1284 -8289:2:1285 -8290:2:1289 -8291:2:1290 -8292:2:1284 -8293:2:1285 -8294:2:1289 -8295:2:1290 -8296:2:1298 -8297:2:1303 -8298:2:1307 -8299:2:1308 -8300:2:1315 -8301:2:1316 -8302:2:1327 -8303:2:1328 -8304:2:1329 -8305:2:1327 -8306:2:1328 -8307:2:1329 -8308:2:1340 -8309:2:1345 -8310:2:1346 -8311:0:4365 -8312:2:1358 -8313:0:4365 -8314:2:1360 -8315:0:4365 -8316:3:2746 -8317:0:4365 -8318:2:1361 -8319:0:4365 -8320:3:2747 -8321:0:4365 -8322:2:1362 -8323:2:1366 -8324:2:1367 -8325:2:1375 -8326:2:1376 -8327:2:1380 -8328:2:1381 -8329:2:1375 -8330:2:1376 -8331:2:1380 -8332:2:1381 -8333:2:1389 -8334:2:1394 -8335:2:1398 -8336:2:1399 -8337:2:1406 -8338:2:1407 -8339:2:1418 -8340:2:1419 -8341:2:1420 -8342:2:1418 -8343:2:1419 -8344:2:1420 -8345:2:1431 -8346:2:1436 -8347:2:1437 -8348:0:4365 -8349:2:1449 -8350:0:4365 -8351:3:2746 -8352:0:4365 -8353:2:1451 -8354:0:4365 -8355:3:2747 -8356:0:4365 -8357:2:1652 -8358:0:4365 -8359:2:1653 -8360:0:4365 -8361:2:1657 -8362:0:4365 -8363:2:1180 -8364:0:4365 -8365:3:2746 -8366:0:4365 -8367:2:1181 -8368:2:1185 -8369:2:1186 -8370:2:1194 -8371:2:1195 -8372:2:1199 -8373:2:1200 -8374:2:1194 -8375:2:1195 -8376:2:1196 -8377:2:1208 -8378:2:1213 -8379:2:1217 -8380:2:1218 -8381:2:1225 -8382:2:1226 -8383:2:1237 -8384:2:1238 -8385:2:1239 -8386:2:1237 -8387:2:1238 -8388:2:1239 -8389:2:1250 -8390:2:1255 -8391:2:1256 -8392:0:4365 -8393:3:2747 -8394:0:4365 -8395:2:1268 -8396:0:4365 -8397:3:2746 -8398:0:4365 -8399:2:1270 -8400:0:4365 -8401:3:2747 -8402:0:4365 -8403:2:1271 -8404:2:1275 -8405:2:1276 -8406:2:1284 -8407:2:1285 -8408:2:1289 -8409:2:1290 -8410:2:1284 -8411:2:1285 -8412:2:1289 -8413:2:1290 -8414:2:1298 -8415:2:1303 -8416:2:1307 -8417:2:1308 -8418:2:1315 -8419:2:1316 -8420:2:1327 -8421:2:1328 -8422:2:1329 -8423:2:1327 -8424:2:1328 -8425:2:1329 -8426:2:1340 -8427:2:1345 -8428:2:1346 -8429:0:4365 -8430:2:1358 -8431:0:4365 -8432:2:1454 -8433:0:4365 -8434:3:2746 -8435:0:4365 -8436:2:1455 -8437:0:4365 -8438:3:2747 -8439:0:4365 -8440:2:1652 -8441:0:4365 -8442:2:1653 -8443:0:4365 -8444:2:1657 -8445:0:4365 -8446:2:1660 -8447:0:4365 -8448:3:2746 -8449:0:4365 -8450:2:1665 -8451:2:1669 -8452:2:1670 -8453:2:1678 -8454:2:1679 -8455:2:1683 -8456:2:1684 -8457:2:1678 -8458:2:1679 -8459:2:1680 -8460:2:1692 -8461:2:1697 -8462:2:1701 -8463:2:1702 -8464:2:1709 -8465:2:1710 -8466:2:1721 -8467:2:1722 -8468:2:1723 -8469:2:1721 -8470:2:1722 -8471:2:1723 -8472:2:1734 -8473:2:1739 -8474:2:1740 -8475:0:4365 -8476:3:2747 -8477:0:4365 -8478:2:1752 -8479:0:4365 -8480:3:2746 -8481:0:4365 -8482:2:1754 -8483:0:4365 -8484:3:2747 -8485:0:4365 -8486:2:1755 -8487:2:1759 -8488:2:1760 -8489:2:1768 -8490:2:1769 -8491:2:1773 -8492:2:1774 -8493:2:1768 -8494:2:1769 -8495:2:1773 -8496:2:1774 -8497:2:1782 -8498:2:1787 -8499:2:1791 -8500:2:1792 -8501:2:1799 -8502:2:1800 -8503:2:1811 -8504:2:1812 -8505:2:1813 -8506:2:1811 -8507:2:1812 -8508:2:1813 -8509:2:1824 -8510:2:1829 -8511:2:1830 -8512:0:4365 -8513:2:1842 -8514:0:4365 -8515:3:2746 -8516:0:4365 -8517:2:1844 -8518:0:4365 -8519:3:2747 -8520:0:4365 -8521:2:1845 -8522:2:1849 -8523:2:1850 -8524:2:1858 -8525:2:1859 -8526:2:1863 -8527:2:1864 -8528:2:1858 -8529:2:1859 -8530:2:1863 -8531:2:1864 -8532:2:1872 -8533:2:1877 -8534:2:1881 -8535:2:1882 -8536:2:1889 -8537:2:1890 -8538:2:1901 -8539:2:1902 -8540:2:1903 -8541:2:1901 -8542:2:1902 -8543:2:1903 -8544:2:1914 -8545:2:1919 -8546:2:1920 -8547:0:4365 -8548:2:1932 -8549:0:4365 -8550:3:2746 -8551:0:4365 -8552:2:1934 -8553:0:4365 -8554:3:2747 -8555:0:4365 -8556:2:1935 -8557:0:4365 -8558:2:1936 -8559:0:4365 -8560:2:2129 -8561:0:4365 -8562:2:2130 -8563:0:4365 -8564:2:2134 -8565:0:4365 -8566:3:2746 -8567:0:4365 -8568:2:2136 -8569:0:4365 -8570:3:2747 -8571:0:4365 -8572:2:2137 -8573:2:2141 -8574:2:2142 -8575:2:2150 -8576:2:2151 -8577:2:2155 -8578:2:2156 -8579:2:2150 -8580:2:2151 -8581:2:2155 -8582:2:2156 -8583:2:2164 -8584:2:2169 -8585:2:2173 -8586:2:2174 -8587:2:2181 -8588:2:2182 -8589:2:2193 -8590:2:2194 -8591:2:2195 -8592:2:2193 -8593:2:2194 -8594:2:2195 -8595:2:2206 -8596:2:2211 -8597:2:2212 -8598:0:4365 -8599:2:2224 -8600:0:4365 -8601:3:2746 -8602:0:4365 -8603:2:2226 -8604:0:4365 -8605:3:2747 -8606:0:4365 -8607:2:1936 -8608:0:4365 -8609:2:2129 -8610:0:4365 -8611:2:2130 -8612:0:4365 -8613:2:2134 -8614:0:4365 -8615:3:2746 -8616:0:4365 -8617:2:2136 -8618:0:4365 -8619:3:2747 -8620:0:4365 -8621:2:2137 -8622:2:2141 -8623:2:2142 -8624:2:2150 -8625:2:2151 -8626:2:2155 -8627:2:2156 -8628:2:2150 -8629:2:2151 -8630:2:2152 -8631:2:2164 -8632:2:2169 -8633:2:2173 -8634:2:2174 -8635:2:2181 -8636:2:2182 -8637:2:2193 -8638:2:2194 -8639:2:2195 -8640:2:2193 -8641:2:2194 -8642:2:2195 -8643:2:2206 -8644:2:2211 -8645:2:2212 -8646:0:4365 -8647:2:2224 -8648:0:4365 -8649:3:2746 -8650:0:4365 -8651:2:2226 -8652:0:4365 -8653:3:2747 -8654:0:4365 -8655:2:2230 -8656:0:4365 -8657:3:2746 -8658:0:4365 -8659:2:2235 -8660:2:2239 -8661:2:2240 -8662:2:2248 -8663:2:2249 -8664:2:2253 -8665:2:2254 -8666:2:2248 -8667:2:2249 -8668:2:2250 -8669:2:2262 -8670:2:2267 -8671:2:2271 -8672:2:2272 -8673:2:2279 -8674:2:2280 -8675:2:2291 -8676:2:2292 -8677:2:2293 -8678:2:2291 -8679:2:2292 -8680:2:2293 -8681:2:2304 -8682:2:2309 -8683:2:2310 -8684:0:4365 -8685:3:2747 -8686:0:4365 -8687:2:2322 -8688:0:4365 -8689:2:1169 -8690:0:4365 -8691:3:2746 -8692:0:4365 -8693:2:1170 -8694:0:4365 -8695:3:2747 -8696:0:4365 -8697:3:2748 -8698:0:4365 -8699:3:2754 -8700:0:4365 -8701:3:2755 -8702:3:2759 -8703:3:2760 -8704:3:2768 -8705:3:2769 -8706:3:2773 -8707:3:2774 -8708:3:2768 -8709:3:2769 -8710:3:2773 -8711:3:2774 -8712:3:2782 -8713:3:2787 -8714:3:2791 -8715:3:2792 -8716:3:2799 -8717:3:2800 -8718:3:2811 -8719:3:2812 -8720:3:2813 -8721:3:2811 -8722:3:2812 -8723:3:2813 -8724:3:2824 -8725:3:2829 -8726:3:2830 -8727:0:4365 -8728:3:2842 -8729:0:4365 -8730:3:2843 -8731:0:4365 -8732:2:1173 -8733:0:4365 -8734:3:2844 -8735:0:4365 -8736:2:1179 -8737:0:4365 -8738:2:1180 -8739:0:4365 -8740:3:2843 -8741:0:4365 -8742:2:1181 -8743:2:1185 -8744:2:1186 -8745:2:1194 -8746:2:1195 -8747:2:1199 -8748:2:1200 -8749:2:1194 -8750:2:1195 -8751:2:1199 -8752:2:1200 -8753:2:1208 -8754:2:1213 -8755:2:1217 -8756:2:1218 -8757:2:1225 -8758:2:1226 -8759:2:1237 -8760:2:1238 -8761:2:1239 -8762:2:1237 -8763:2:1238 -8764:2:1239 -8765:2:1250 -8766:2:1255 -8767:2:1256 -8768:0:4365 -8769:3:2844 -8770:0:4365 -8771:2:1268 -8772:0:4365 -8773:3:2843 -8774:0:4365 -8775:2:1270 -8776:0:4365 -8777:3:2844 -8778:0:4365 -8779:2:1271 -8780:2:1275 -8781:2:1276 -8782:2:1284 -8783:2:1285 -8784:2:1289 -8785:2:1290 -8786:2:1284 -8787:2:1285 -8788:2:1289 -8789:2:1290 -8790:2:1298 -8791:2:1303 -8792:2:1307 -8793:2:1308 -8794:2:1315 -8795:2:1316 -8796:2:1327 -8797:2:1328 -8798:2:1329 -8799:2:1327 -8800:2:1328 -8801:2:1329 -8802:2:1340 -8803:2:1345 -8804:2:1346 -8805:0:4365 -8806:2:1358 -8807:0:4365 -8808:2:1360 -8809:0:4365 -8810:3:2843 -8811:0:4365 -8812:2:1361 -8813:0:4365 -8814:3:2844 -8815:0:4365 -8816:2:1362 -8817:2:1366 -8818:2:1367 -8819:2:1375 -8820:2:1376 -8821:2:1380 -8822:2:1381 -8823:2:1375 -8824:2:1376 -8825:2:1380 -8826:2:1381 -8827:2:1389 -8828:2:1394 -8829:2:1398 -8830:2:1399 -8831:2:1406 -8832:2:1407 -8833:2:1418 -8834:2:1419 -8835:2:1420 -8836:2:1418 -8837:2:1419 -8838:2:1420 -8839:2:1431 -8840:2:1436 -8841:2:1437 -8842:0:4365 -8843:2:1449 -8844:0:4365 -8845:3:2843 -8846:0:4365 -8847:2:1451 -8848:0:4365 -8849:3:2844 -8850:0:4365 -8851:2:1652 -8852:0:4365 -8853:2:1653 -8854:0:4365 -8855:2:1657 -8856:0:4365 -8857:2:1180 -8858:0:4365 -8859:3:2843 -8860:0:4365 -8861:2:1181 -8862:2:1185 -8863:2:1186 -8864:2:1194 -8865:2:1195 -8866:2:1199 -8867:2:1200 -8868:2:1194 -8869:2:1195 -8870:2:1196 -8871:2:1208 -8872:2:1213 -8873:2:1217 -8874:2:1218 -8875:2:1225 -8876:2:1226 -8877:2:1237 -8878:2:1238 -8879:2:1239 -8880:2:1237 -8881:2:1238 -8882:2:1239 -8883:2:1250 -8884:2:1255 -8885:2:1256 -8886:0:4365 -8887:3:2844 -8888:0:4365 -8889:2:1268 -8890:0:4365 -8891:3:2843 -8892:0:4365 -8893:2:1270 -8894:0:4365 -8895:3:2844 -8896:0:4365 -8897:2:1271 -8898:2:1275 -8899:2:1276 -8900:2:1284 -8901:2:1285 -8902:2:1289 -8903:2:1290 -8904:2:1284 -8905:2:1285 -8906:2:1289 -8907:2:1290 -8908:2:1298 -8909:2:1303 -8910:2:1307 -8911:2:1308 -8912:2:1315 -8913:2:1316 -8914:2:1327 -8915:2:1328 -8916:2:1329 -8917:2:1327 -8918:2:1328 -8919:2:1329 -8920:2:1340 -8921:2:1345 -8922:2:1346 -8923:0:4365 -8924:2:1358 -8925:0:4365 -8926:2:1454 -8927:0:4365 -8928:3:2843 -8929:0:4365 -8930:2:1455 -8931:0:4365 -8932:3:2844 -8933:0:4365 -8934:2:1652 -8935:0:4365 -8936:2:1653 -8937:0:4365 -8938:2:1657 -8939:0:4365 -8940:2:1660 -8941:0:4365 -8942:3:2843 -8943:0:4365 -8944:2:1665 -8945:2:1669 -8946:2:1670 -8947:2:1678 -8948:2:1679 -8949:2:1683 -8950:2:1684 -8951:2:1678 -8952:2:1679 -8953:2:1680 -8954:2:1692 -8955:2:1697 -8956:2:1701 -8957:2:1702 -8958:2:1709 -8959:2:1710 -8960:2:1721 -8961:2:1722 -8962:2:1723 -8963:2:1721 -8964:2:1722 -8965:2:1723 -8966:2:1734 -8967:2:1739 -8968:2:1740 -8969:0:4365 -8970:3:2844 -8971:0:4365 -8972:2:1752 -8973:0:4365 -8974:3:2843 -8975:0:4365 -8976:2:1754 -8977:0:4365 -8978:3:2844 -8979:0:4365 -8980:2:1755 -8981:2:1759 -8982:2:1760 -8983:2:1768 -8984:2:1769 -8985:2:1773 -8986:2:1774 -8987:2:1768 -8988:2:1769 -8989:2:1773 -8990:2:1774 -8991:2:1782 -8992:2:1787 -8993:2:1791 -8994:2:1792 -8995:2:1799 -8996:2:1800 -8997:2:1811 -8998:2:1812 -8999:2:1813 -9000:2:1811 -9001:2:1812 -9002:2:1813 -9003:2:1824 -9004:2:1829 -9005:2:1830 -9006:0:4365 -9007:2:1842 -9008:0:4365 -9009:3:2843 -9010:0:4365 -9011:2:1844 -9012:0:4365 -9013:3:2844 -9014:0:4365 -9015:2:1845 -9016:2:1849 -9017:2:1850 -9018:2:1858 -9019:2:1859 -9020:2:1863 -9021:2:1864 -9022:2:1858 -9023:2:1859 -9024:2:1863 -9025:2:1864 -9026:2:1872 -9027:2:1877 -9028:2:1881 -9029:2:1882 -9030:2:1889 -9031:2:1890 -9032:2:1901 -9033:2:1902 -9034:2:1903 -9035:2:1901 -9036:2:1902 -9037:2:1903 -9038:2:1914 -9039:2:1919 -9040:2:1920 -9041:0:4365 -9042:2:1932 -9043:0:4365 -9044:3:2843 -9045:0:4365 -9046:2:1934 -9047:0:4365 -9048:3:2844 -9049:0:4365 -9050:2:1935 -9051:0:4365 -9052:2:1936 -9053:0:4365 -9054:2:2129 -9055:0:4365 -9056:2:2130 -9057:0:4365 -9058:2:2134 -9059:0:4365 -9060:3:2843 -9061:0:4365 -9062:2:2136 -9063:0:4365 -9064:3:2844 -9065:0:4365 -9066:2:2137 -9067:2:2141 -9068:2:2142 -9069:2:2150 -9070:2:2151 -9071:2:2155 -9072:2:2156 -9073:2:2150 -9074:2:2151 -9075:2:2155 -9076:2:2156 -9077:2:2164 -9078:2:2169 -9079:2:2173 -9080:2:2174 -9081:2:2181 -9082:2:2182 -9083:2:2193 -9084:2:2194 -9085:2:2195 -9086:2:2193 -9087:2:2194 -9088:2:2195 -9089:2:2206 -9090:2:2211 -9091:2:2212 -9092:0:4365 -9093:2:2224 -9094:0:4365 -9095:3:2843 -9096:0:4365 -9097:2:2226 -9098:0:4365 -9099:3:2844 -9100:0:4365 -9101:2:1936 -9102:0:4365 -9103:2:2129 -9104:0:4365 -9105:2:2130 -9106:0:4365 -9107:2:2134 -9108:0:4365 -9109:3:2843 -9110:0:4365 -9111:2:2136 -9112:0:4365 -9113:3:2844 -9114:0:4365 -9115:2:2137 -9116:2:2141 -9117:2:2142 -9118:2:2150 -9119:2:2151 -9120:2:2155 -9121:2:2156 -9122:2:2150 -9123:2:2151 -9124:2:2152 -9125:2:2164 -9126:2:2169 -9127:2:2173 -9128:2:2174 -9129:2:2181 -9130:2:2182 -9131:2:2193 -9132:2:2194 -9133:2:2195 -9134:2:2193 -9135:2:2194 -9136:2:2195 -9137:2:2206 -9138:2:2211 -9139:2:2212 -9140:0:4365 -9141:2:2224 -9142:0:4365 -9143:3:2843 -9144:0:4365 -9145:2:2226 -9146:0:4365 -9147:3:2844 -9148:0:4365 -9149:2:2230 -9150:0:4365 -9151:3:2843 -9152:0:4365 -9153:2:2235 -9154:2:2239 -9155:2:2240 -9156:2:2248 -9157:2:2249 -9158:2:2253 -9159:2:2254 -9160:2:2248 -9161:2:2249 -9162:2:2250 -9163:2:2262 -9164:2:2267 -9165:2:2271 -9166:2:2272 -9167:2:2279 -9168:2:2280 -9169:2:2291 -9170:2:2292 -9171:2:2293 -9172:2:2291 -9173:2:2292 -9174:2:2293 -9175:2:2304 -9176:2:2309 -9177:2:2310 -9178:0:4365 -9179:3:2844 -9180:0:4365 -9181:2:2322 -9182:0:4365 -9183:2:1169 -9184:0:4365 -9185:3:2843 -9186:0:4365 -9187:2:1170 -9188:0:4365 -9189:3:2844 -9190:0:4365 -9191:3:2845 -9192:0:4365 -9193:3:2851 -9194:0:4365 -9195:3:2854 -9196:3:2855 -9197:3:2867 -9198:3:2868 -9199:3:2872 -9200:3:2873 -9201:3:2867 -9202:3:2868 -9203:3:2872 -9204:3:2873 -9205:3:2881 -9206:3:2886 -9207:3:2890 -9208:3:2891 -9209:3:2898 -9210:3:2899 -9211:3:2910 -9212:3:2911 -9213:3:2912 -9214:3:2910 -9215:3:2911 -9216:3:2912 -9217:3:2923 -9218:3:2928 -9219:3:2929 -9220:0:4365 -9221:3:2941 -9222:0:4365 -9223:3:2942 -9224:0:4365 -9225:2:1173 -9226:0:4365 -9227:3:2943 -9228:0:4365 -9229:2:1179 -9230:0:4365 -9231:2:1180 -9232:0:4365 -9233:3:2942 -9234:0:4365 -9235:2:1181 -9236:2:1185 -9237:2:1186 -9238:2:1194 -9239:2:1195 -9240:2:1199 -9241:2:1200 -9242:2:1194 -9243:2:1195 -9244:2:1199 -9245:2:1200 -9246:2:1208 -9247:2:1213 -9248:2:1217 -9249:2:1218 -9250:2:1225 -9251:2:1226 -9252:2:1237 -9253:2:1238 -9254:2:1239 -9255:2:1237 -9256:2:1238 -9257:2:1239 -9258:2:1250 -9259:2:1255 -9260:2:1256 -9261:0:4365 -9262:3:2943 -9263:0:4365 -9264:2:1268 -9265:0:4365 -9266:3:2942 -9267:0:4365 -9268:2:1270 -9269:0:4365 -9270:3:2943 -9271:0:4365 -9272:2:1271 -9273:2:1275 -9274:2:1276 -9275:2:1284 -9276:2:1285 -9277:2:1289 -9278:2:1290 -9279:2:1284 -9280:2:1285 -9281:2:1289 -9282:2:1290 -9283:2:1298 -9284:2:1303 -9285:2:1307 -9286:2:1308 -9287:2:1315 -9288:2:1316 -9289:2:1327 -9290:2:1328 -9291:2:1329 -9292:2:1327 -9293:2:1328 -9294:2:1329 -9295:2:1340 -9296:2:1345 -9297:2:1346 -9298:0:4365 -9299:2:1358 -9300:0:4365 -9301:2:1360 -9302:0:4365 -9303:3:2942 -9304:0:4365 -9305:2:1361 -9306:0:4365 -9307:3:2943 -9308:0:4365 -9309:2:1362 -9310:2:1366 -9311:2:1367 -9312:2:1375 -9313:2:1376 -9314:2:1380 -9315:2:1381 -9316:2:1375 -9317:2:1376 -9318:2:1380 -9319:2:1381 -9320:2:1389 -9321:2:1394 -9322:2:1398 -9323:2:1399 -9324:2:1406 -9325:2:1407 -9326:2:1418 -9327:2:1419 -9328:2:1420 -9329:2:1418 -9330:2:1419 -9331:2:1420 -9332:2:1431 -9333:2:1436 -9334:2:1437 -9335:0:4365 -9336:2:1449 -9337:0:4365 -9338:3:2942 -9339:0:4365 -9340:2:1451 -9341:0:4365 -9342:3:2943 -9343:0:4365 -9344:2:1652 -9345:0:4365 -9346:2:1653 -9347:0:4365 -9348:2:1657 -9349:0:4365 -9350:2:1180 -9351:0:4365 -9352:3:2942 -9353:0:4365 -9354:2:1181 -9355:2:1185 -9356:2:1186 -9357:2:1194 -9358:2:1195 -9359:2:1199 -9360:2:1200 -9361:2:1194 -9362:2:1195 -9363:2:1196 -9364:2:1208 -9365:2:1213 -9366:2:1217 -9367:2:1218 -9368:2:1225 -9369:2:1226 -9370:2:1237 -9371:2:1238 -9372:2:1239 -9373:2:1237 -9374:2:1238 -9375:2:1239 -9376:2:1250 -9377:2:1255 -9378:2:1256 -9379:0:4365 -9380:3:2943 -9381:0:4365 -9382:2:1268 -9383:0:4365 -9384:3:2942 -9385:0:4365 -9386:2:1270 -9387:0:4365 -9388:3:2943 -9389:0:4365 -9390:2:1271 -9391:2:1275 -9392:2:1276 -9393:2:1284 -9394:2:1285 -9395:2:1289 -9396:2:1290 -9397:2:1284 -9398:2:1285 -9399:2:1289 -9400:2:1290 -9401:2:1298 -9402:2:1303 -9403:2:1307 -9404:2:1308 -9405:2:1315 -9406:2:1316 -9407:2:1327 -9408:2:1328 -9409:2:1329 -9410:2:1327 -9411:2:1328 -9412:2:1329 -9413:2:1340 -9414:2:1345 -9415:2:1346 -9416:0:4365 -9417:2:1358 -9418:0:4365 -9419:2:1454 -9420:0:4365 -9421:3:2942 -9422:0:4365 -9423:2:1455 -9424:0:4365 -9425:3:2943 -9426:0:4365 -9427:2:1652 -9428:0:4365 -9429:2:1653 -9430:0:4365 -9431:2:1657 -9432:0:4365 -9433:2:1660 -9434:0:4365 -9435:3:2942 -9436:0:4365 -9437:2:1665 -9438:2:1669 -9439:2:1670 -9440:2:1678 -9441:2:1679 -9442:2:1683 -9443:2:1684 -9444:2:1678 -9445:2:1679 -9446:2:1680 -9447:2:1692 -9448:2:1697 -9449:2:1701 -9450:2:1702 -9451:2:1709 -9452:2:1710 -9453:2:1721 -9454:2:1722 -9455:2:1723 -9456:2:1721 -9457:2:1722 -9458:2:1723 -9459:2:1734 -9460:2:1739 -9461:2:1740 -9462:0:4365 -9463:3:2943 -9464:0:4365 -9465:2:1752 -9466:0:4365 -9467:3:2942 -9468:0:4365 -9469:2:1754 -9470:0:4365 -9471:3:2943 -9472:0:4365 -9473:2:1755 -9474:2:1759 -9475:2:1760 -9476:2:1768 -9477:2:1769 -9478:2:1773 -9479:2:1774 -9480:2:1768 -9481:2:1769 -9482:2:1773 -9483:2:1774 -9484:2:1782 -9485:2:1787 -9486:2:1791 -9487:2:1792 -9488:2:1799 -9489:2:1800 -9490:2:1811 -9491:2:1812 -9492:2:1813 -9493:2:1811 -9494:2:1812 -9495:2:1813 -9496:2:1824 -9497:2:1829 -9498:2:1830 -9499:0:4365 -9500:2:1842 -9501:0:4365 -9502:3:2942 -9503:0:4365 -9504:2:1844 -9505:0:4365 -9506:3:2943 -9507:0:4365 -9508:2:1845 -9509:2:1849 -9510:2:1850 -9511:2:1858 -9512:2:1859 -9513:2:1863 -9514:2:1864 -9515:2:1858 -9516:2:1859 -9517:2:1863 -9518:2:1864 -9519:2:1872 -9520:2:1877 -9521:2:1881 -9522:2:1882 -9523:2:1889 -9524:2:1890 -9525:2:1901 -9526:2:1902 -9527:2:1903 -9528:2:1901 -9529:2:1902 -9530:2:1903 -9531:2:1914 -9532:2:1919 -9533:2:1920 -9534:0:4365 -9535:2:1932 -9536:0:4365 -9537:3:2942 -9538:0:4365 -9539:2:1934 -9540:0:4365 -9541:3:2943 -9542:0:4365 -9543:2:1935 -9544:0:4365 -9545:2:1936 -9546:0:4365 -9547:2:2129 -9548:0:4365 -9549:2:2130 -9550:0:4365 -9551:2:2134 -9552:0:4365 -9553:3:2942 -9554:0:4365 -9555:2:2136 -9556:0:4365 -9557:3:2943 -9558:0:4365 -9559:2:2137 -9560:2:2141 -9561:2:2142 -9562:2:2150 -9563:2:2151 -9564:2:2155 -9565:2:2156 -9566:2:2150 -9567:2:2151 -9568:2:2155 -9569:2:2156 -9570:2:2164 -9571:2:2169 -9572:2:2173 -9573:2:2174 -9574:2:2181 -9575:2:2182 -9576:2:2193 -9577:2:2194 -9578:2:2195 -9579:2:2193 -9580:2:2194 -9581:2:2195 -9582:2:2206 -9583:2:2211 -9584:2:2212 -9585:0:4365 -9586:2:2224 -9587:0:4365 -9588:3:2942 -9589:0:4365 -9590:2:2226 -9591:0:4365 -9592:3:2943 -9593:0:4365 -9594:2:1936 -9595:0:4365 -9596:2:2129 -9597:0:4365 -9598:2:2130 -9599:0:4365 -9600:2:2134 -9601:0:4365 -9602:3:2942 -9603:0:4365 -9604:2:2136 -9605:0:4365 -9606:3:2943 -9607:0:4365 -9608:2:2137 -9609:2:2141 -9610:2:2142 -9611:2:2150 -9612:2:2151 -9613:2:2155 -9614:2:2156 -9615:2:2150 -9616:2:2151 -9617:2:2152 -9618:2:2164 -9619:2:2169 -9620:2:2173 -9621:2:2174 -9622:2:2181 -9623:2:2182 -9624:2:2193 -9625:2:2194 -9626:2:2195 -9627:2:2193 -9628:2:2194 -9629:2:2195 -9630:2:2206 -9631:2:2211 -9632:2:2212 -9633:0:4365 -9634:2:2224 -9635:0:4365 -9636:3:2942 -9637:0:4365 -9638:2:2226 -9639:0:4365 -9640:3:2943 -9641:0:4365 -9642:2:2230 -9643:0:4365 -9644:3:2942 -9645:0:4365 -9646:2:2235 -9647:2:2239 -9648:2:2240 -9649:2:2248 -9650:2:2249 -9651:2:2253 -9652:2:2254 -9653:2:2248 -9654:2:2249 -9655:2:2250 -9656:2:2262 -9657:2:2267 -9658:2:2271 -9659:2:2272 -9660:2:2279 -9661:2:2280 -9662:2:2291 -9663:2:2292 -9664:2:2293 -9665:2:2291 -9666:2:2292 -9667:2:2293 -9668:2:2304 -9669:2:2309 -9670:2:2310 -9671:0:4365 -9672:3:2943 -9673:0:4365 -9674:2:2322 -9675:0:4365 -9676:2:1169 -9677:0:4365 -9678:3:2942 -9679:0:4365 -9680:2:1170 -9681:0:4365 -9682:3:2943 -9683:0:4365 -9684:3:2944 -9685:0:4365 -9686:3:2950 -9687:0:4365 -9688:3:2951 -9689:0:4365 -9690:3:2952 -9691:0:4365 -9692:3:2953 -9693:0:4365 -9694:3:2954 -9695:3:2958 -9696:3:2959 -9697:3:2967 -9698:3:2968 -9699:3:2972 -9700:3:2973 -9701:3:2967 -9702:3:2968 -9703:3:2972 -9704:3:2973 -9705:3:2981 -9706:3:2986 -9707:3:2990 -9708:3:2991 -9709:3:2998 -9710:3:2999 -9711:3:3010 -9712:3:3011 -9713:3:3012 -9714:3:3010 -9715:3:3011 -9716:3:3012 -9717:3:3023 -9718:3:3028 -9719:3:3029 -9720:0:4365 -9721:3:3041 -9722:0:4365 -9723:3:3042 -9724:0:4365 -9725:2:1173 -9726:0:4365 -9727:3:3043 -9728:0:4365 -9729:2:1179 -9730:0:4365 -9731:2:1180 -9732:0:4365 -9733:3:3042 -9734:0:4365 -9735:2:1181 -9736:2:1185 -9737:2:1186 -9738:2:1194 -9739:2:1195 -9740:2:1199 -9741:2:1200 -9742:2:1194 -9743:2:1195 -9744:2:1199 -9745:2:1200 -9746:2:1208 -9747:2:1213 -9748:2:1217 -9749:2:1218 -9750:2:1225 -9751:2:1226 -9752:2:1237 -9753:2:1238 -9754:2:1239 -9755:2:1237 -9756:2:1238 -9757:2:1239 -9758:2:1250 -9759:2:1255 -9760:2:1256 -9761:0:4365 -9762:3:3043 -9763:0:4365 -9764:2:1268 -9765:0:4365 -9766:3:3042 -9767:0:4365 -9768:2:1270 -9769:0:4365 -9770:3:3043 -9771:0:4365 -9772:2:1271 -9773:2:1275 -9774:2:1276 -9775:2:1284 -9776:2:1285 -9777:2:1289 -9778:2:1290 -9779:2:1284 -9780:2:1285 -9781:2:1289 -9782:2:1290 -9783:2:1298 -9784:2:1303 -9785:2:1307 -9786:2:1308 -9787:2:1315 -9788:2:1316 -9789:2:1327 -9790:2:1328 -9791:2:1329 -9792:2:1327 -9793:2:1328 -9794:2:1329 -9795:2:1340 -9796:2:1345 -9797:2:1346 -9798:0:4365 -9799:2:1358 -9800:0:4365 -9801:2:1360 -9802:0:4365 -9803:3:3042 -9804:0:4365 -9805:2:1361 -9806:0:4365 -9807:3:3043 -9808:0:4365 -9809:2:1362 -9810:2:1366 -9811:2:1367 -9812:2:1375 -9813:2:1376 -9814:2:1380 -9815:2:1381 -9816:2:1375 -9817:2:1376 -9818:2:1380 -9819:2:1381 -9820:2:1389 -9821:2:1394 -9822:2:1398 -9823:2:1399 -9824:2:1406 -9825:2:1407 -9826:2:1418 -9827:2:1419 -9828:2:1420 -9829:2:1418 -9830:2:1419 -9831:2:1420 -9832:2:1431 -9833:2:1436 -9834:2:1437 -9835:0:4365 -9836:2:1449 -9837:0:4365 -9838:3:3042 -9839:0:4365 -9840:2:1451 -9841:0:4365 -9842:3:3043 -9843:0:4365 -9844:2:1652 -9845:0:4365 -9846:2:1653 -9847:0:4365 -9848:2:1657 -9849:0:4365 -9850:2:1180 -9851:0:4365 -9852:3:3042 -9853:0:4365 -9854:2:1181 -9855:2:1185 -9856:2:1186 -9857:2:1194 -9858:2:1195 -9859:2:1199 -9860:2:1200 -9861:2:1194 -9862:2:1195 -9863:2:1196 -9864:2:1208 -9865:2:1213 -9866:2:1217 -9867:2:1218 -9868:2:1225 -9869:2:1226 -9870:2:1237 -9871:2:1238 -9872:2:1239 -9873:2:1237 -9874:2:1238 -9875:2:1239 -9876:2:1250 -9877:2:1255 -9878:2:1256 -9879:0:4365 -9880:3:3043 -9881:0:4365 -9882:2:1268 -9883:0:4365 -9884:3:3042 -9885:0:4365 -9886:2:1270 -9887:0:4365 -9888:3:3043 -9889:0:4365 -9890:2:1271 -9891:2:1275 -9892:2:1276 -9893:2:1284 -9894:2:1285 -9895:2:1289 -9896:2:1290 -9897:2:1284 -9898:2:1285 -9899:2:1289 -9900:2:1290 -9901:2:1298 -9902:2:1303 -9903:2:1307 -9904:2:1308 -9905:2:1315 -9906:2:1316 -9907:2:1327 -9908:2:1328 -9909:2:1329 -9910:2:1327 -9911:2:1328 -9912:2:1329 -9913:2:1340 -9914:2:1345 -9915:2:1346 -9916:0:4365 -9917:2:1358 -9918:0:4365 -9919:2:1454 -9920:0:4365 -9921:3:3042 -9922:0:4365 -9923:2:1455 -9924:0:4365 -9925:3:3043 -9926:0:4365 -9927:2:1652 -9928:0:4365 -9929:2:1653 -9930:0:4365 -9931:2:1657 -9932:0:4365 -9933:2:1660 -9934:0:4365 -9935:3:3042 -9936:0:4365 -9937:2:1665 -9938:2:1669 -9939:2:1670 -9940:2:1678 -9941:2:1679 -9942:2:1683 -9943:2:1684 -9944:2:1678 -9945:2:1679 -9946:2:1680 -9947:2:1692 -9948:2:1697 -9949:2:1701 -9950:2:1702 -9951:2:1709 -9952:2:1710 -9953:2:1721 -9954:2:1722 -9955:2:1723 -9956:2:1721 -9957:2:1722 -9958:2:1723 -9959:2:1734 -9960:2:1739 -9961:2:1740 -9962:0:4365 -9963:3:3043 -9964:0:4365 -9965:2:1752 -9966:0:4365 -9967:3:3042 -9968:0:4365 -9969:2:1754 -9970:0:4365 -9971:3:3043 -9972:0:4365 -9973:2:1755 -9974:2:1759 -9975:2:1760 -9976:2:1768 -9977:2:1769 -9978:2:1773 -9979:2:1774 -9980:2:1768 -9981:2:1769 -9982:2:1773 -9983:2:1774 -9984:2:1782 -9985:2:1787 -9986:2:1791 -9987:2:1792 -9988:2:1799 -9989:2:1800 -9990:2:1811 -9991:2:1812 -9992:2:1813 -9993:2:1811 -9994:2:1812 -9995:2:1813 -9996:2:1824 -9997:2:1829 -9998:2:1830 -9999:0:4365 -10000:2:1842 -10001:0:4365 -10002:3:3042 -10003:0:4365 -10004:2:1844 -10005:0:4365 -10006:3:3043 -10007:0:4365 -10008:2:1845 -10009:2:1849 -10010:2:1850 -10011:2:1858 -10012:2:1859 -10013:2:1863 -10014:2:1864 -10015:2:1858 -10016:2:1859 -10017:2:1863 -10018:2:1864 -10019:2:1872 -10020:2:1877 -10021:2:1881 -10022:2:1882 -10023:2:1889 -10024:2:1890 -10025:2:1901 -10026:2:1902 -10027:2:1903 -10028:2:1901 -10029:2:1902 -10030:2:1903 -10031:2:1914 -10032:2:1919 -10033:2:1920 -10034:0:4365 -10035:2:1932 -10036:0:4365 -10037:3:3042 -10038:0:4365 -10039:2:1934 -10040:0:4365 -10041:3:3043 -10042:0:4365 -10043:2:1935 -10044:0:4365 -10045:2:1936 -10046:0:4365 -10047:2:2129 -10048:0:4365 -10049:2:2130 -10050:0:4365 -10051:2:2134 -10052:0:4365 -10053:3:3042 -10054:0:4365 -10055:2:2136 -10056:0:4365 -10057:3:3043 -10058:0:4365 -10059:2:2137 -10060:2:2141 -10061:2:2142 -10062:2:2150 -10063:2:2151 -10064:2:2155 -10065:2:2156 -10066:2:2150 -10067:2:2151 -10068:2:2155 -10069:2:2156 -10070:2:2164 -10071:2:2169 -10072:2:2173 -10073:2:2174 -10074:2:2181 -10075:2:2182 -10076:2:2193 -10077:2:2194 -10078:2:2195 -10079:2:2193 -10080:2:2194 -10081:2:2195 -10082:2:2206 -10083:2:2211 -10084:2:2212 -10085:0:4365 -10086:2:2224 -10087:0:4365 -10088:3:3042 -10089:0:4365 -10090:2:2226 -10091:0:4365 -10092:3:3043 -10093:0:4365 -10094:2:1936 -10095:0:4365 -10096:2:2129 -10097:0:4365 -10098:2:2130 -10099:0:4365 -10100:2:2134 -10101:0:4365 -10102:3:3042 -10103:0:4365 -10104:2:2136 -10105:0:4365 -10106:3:3043 -10107:0:4365 -10108:2:2137 -10109:2:2141 -10110:2:2142 -10111:2:2150 -10112:2:2151 -10113:2:2155 -10114:2:2156 -10115:2:2150 -10116:2:2151 -10117:2:2152 -10118:2:2164 -10119:2:2169 -10120:2:2173 -10121:2:2174 -10122:2:2181 -10123:2:2182 -10124:2:2193 -10125:2:2194 -10126:2:2195 -10127:2:2193 -10128:2:2194 -10129:2:2195 -10130:2:2206 -10131:2:2211 -10132:2:2212 -10133:0:4365 -10134:2:2224 -10135:0:4365 -10136:3:3042 -10137:0:4365 -10138:2:2226 -10139:0:4365 -10140:3:3043 -10141:0:4365 -10142:2:2230 -10143:0:4365 -10144:3:3042 -10145:0:4365 -10146:2:2235 -10147:2:2239 -10148:2:2240 -10149:2:2248 -10150:2:2249 -10151:2:2253 -10152:2:2254 -10153:2:2248 -10154:2:2249 -10155:2:2250 -10156:2:2262 -10157:2:2267 -10158:2:2271 -10159:2:2272 -10160:2:2279 -10161:2:2280 -10162:2:2291 -10163:2:2292 -10164:2:2293 -10165:2:2291 -10166:2:2292 -10167:2:2293 -10168:2:2304 -10169:2:2309 -10170:2:2310 -10171:0:4365 -10172:3:3043 -10173:0:4365 -10174:2:2322 -10175:0:4365 -10176:2:1169 -10177:0:4365 -10178:3:3042 -10179:0:4365 -10180:2:1170 -10181:0:4365 -10182:3:3043 -10183:0:4365 -10184:3:3044 -10185:0:4365 -10186:3:3257 -10187:0:4365 -10188:3:3265 -10189:0:4365 -10190:3:3266 -10191:3:3270 -10192:3:3271 -10193:3:3279 -10194:3:3280 -10195:3:3284 -10196:3:3285 -10197:3:3279 -10198:3:3280 -10199:3:3284 -10200:3:3285 -10201:3:3293 -10202:3:3298 -10203:3:3302 -10204:3:3303 -10205:3:3310 -10206:3:3311 -10207:3:3322 -10208:3:3323 -10209:3:3324 -10210:3:3322 -10211:3:3323 -10212:3:3324 -10213:3:3335 -10214:3:3340 -10215:3:3341 -10216:0:4365 -10217:3:3353 -10218:0:4365 -10219:3:3354 -10220:0:4365 -10221:2:1173 -10222:0:4365 -10223:3:3355 -10224:0:4365 -10225:2:1179 -10226:0:4365 -10227:2:1180 -10228:0:4365 -10229:3:3354 -10230:0:4365 -10231:2:1181 -10232:2:1185 -10233:2:1186 -10234:2:1194 -10235:2:1195 -10236:2:1199 -10237:2:1200 -10238:2:1194 -10239:2:1195 -10240:2:1199 -10241:2:1200 -10242:2:1208 -10243:2:1213 -10244:2:1217 -10245:2:1218 -10246:2:1225 -10247:2:1226 -10248:2:1237 -10249:2:1238 -10250:2:1239 -10251:2:1237 -10252:2:1238 -10253:2:1239 -10254:2:1250 -10255:2:1255 -10256:2:1256 -10257:0:4365 -10258:3:3355 -10259:0:4365 -10260:2:1268 -10261:0:4365 -10262:3:3354 -10263:0:4365 -10264:2:1270 -10265:0:4365 -10266:3:3355 -10267:0:4365 -10268:2:1271 -10269:2:1275 -10270:2:1276 -10271:2:1284 -10272:2:1285 -10273:2:1289 -10274:2:1290 -10275:2:1284 -10276:2:1285 -10277:2:1289 -10278:2:1290 -10279:2:1298 -10280:2:1303 -10281:2:1307 -10282:2:1308 -10283:2:1315 -10284:2:1316 -10285:2:1327 -10286:2:1328 -10287:2:1329 -10288:2:1327 -10289:2:1328 -10290:2:1329 -10291:2:1340 -10292:2:1345 -10293:2:1346 -10294:0:4365 -10295:2:1358 -10296:0:4365 -10297:2:1360 -10298:0:4365 -10299:3:3354 -10300:0:4365 -10301:2:1361 -10302:0:4365 -10303:3:3355 -10304:0:4365 -10305:2:1362 -10306:2:1366 -10307:2:1367 -10308:2:1375 -10309:2:1376 -10310:2:1380 -10311:2:1381 -10312:2:1375 -10313:2:1376 -10314:2:1380 -10315:2:1381 -10316:2:1389 -10317:2:1394 -10318:2:1398 -10319:2:1399 -10320:2:1406 -10321:2:1407 -10322:2:1418 -10323:2:1419 -10324:2:1420 -10325:2:1418 -10326:2:1419 -10327:2:1420 -10328:2:1431 -10329:2:1436 -10330:2:1437 -10331:0:4365 -10332:2:1449 -10333:0:4365 -10334:3:3354 -10335:0:4365 -10336:2:1451 -10337:0:4365 -10338:3:3355 -10339:0:4365 -10340:2:1652 -10341:0:4365 -10342:2:1653 -10343:0:4365 -10344:2:1657 -10345:0:4365 -10346:2:1180 -10347:0:4365 -10348:3:3354 -10349:0:4365 -10350:2:1181 -10351:2:1185 -10352:2:1186 -10353:2:1194 -10354:2:1195 -10355:2:1199 -10356:2:1200 -10357:2:1194 -10358:2:1195 -10359:2:1196 -10360:2:1208 -10361:2:1213 -10362:2:1217 -10363:2:1218 -10364:2:1225 -10365:2:1226 -10366:2:1237 -10367:2:1238 -10368:2:1239 -10369:2:1237 -10370:2:1238 -10371:2:1239 -10372:2:1250 -10373:2:1255 -10374:2:1256 -10375:0:4365 -10376:3:3355 -10377:0:4365 -10378:2:1268 -10379:0:4365 -10380:3:3354 -10381:0:4365 -10382:2:1270 -10383:0:4365 -10384:3:3355 -10385:0:4365 -10386:2:1271 -10387:2:1275 -10388:2:1276 -10389:2:1284 -10390:2:1285 -10391:2:1289 -10392:2:1290 -10393:2:1284 -10394:2:1285 -10395:2:1289 -10396:2:1290 -10397:2:1298 -10398:2:1303 -10399:2:1307 -10400:2:1308 -10401:2:1315 -10402:2:1316 -10403:2:1327 -10404:2:1328 -10405:2:1329 -10406:2:1327 -10407:2:1328 -10408:2:1329 -10409:2:1340 -10410:2:1345 -10411:2:1346 -10412:0:4365 -10413:2:1358 -10414:0:4365 -10415:2:1454 -10416:0:4365 -10417:3:3354 -10418:0:4365 -10419:2:1455 -10420:0:4365 -10421:3:3355 -10422:0:4365 -10423:2:1652 -10424:0:4365 -10425:2:1653 -10426:0:4365 -10427:2:1657 -10428:0:4365 -10429:2:1660 -10430:0:4365 -10431:3:3354 -10432:0:4365 -10433:2:1665 -10434:2:1669 -10435:2:1670 -10436:2:1678 -10437:2:1679 -10438:2:1683 -10439:2:1684 -10440:2:1678 -10441:2:1679 -10442:2:1680 -10443:2:1692 -10444:2:1697 -10445:2:1701 -10446:2:1702 -10447:2:1709 -10448:2:1710 -10449:2:1721 -10450:2:1722 -10451:2:1723 -10452:2:1721 -10453:2:1722 -10454:2:1723 -10455:2:1734 -10456:2:1739 -10457:2:1740 -10458:0:4365 -10459:3:3355 -10460:0:4365 -10461:2:1752 -10462:0:4365 -10463:3:3354 -10464:0:4365 -10465:2:1754 -10466:0:4365 -10467:3:3355 -10468:0:4365 -10469:2:1755 -10470:2:1759 -10471:2:1760 -10472:2:1768 -10473:2:1769 -10474:2:1773 -10475:2:1774 -10476:2:1768 -10477:2:1769 -10478:2:1773 -10479:2:1774 -10480:2:1782 -10481:2:1787 -10482:2:1791 -10483:2:1792 -10484:2:1799 -10485:2:1800 -10486:2:1811 -10487:2:1812 -10488:2:1813 -10489:2:1811 -10490:2:1812 -10491:2:1813 -10492:2:1824 -10493:2:1829 -10494:2:1830 -10495:0:4365 -10496:2:1842 -10497:0:4365 -10498:3:3354 -10499:0:4365 -10500:2:1844 -10501:0:4365 -10502:3:3355 -10503:0:4365 -10504:2:1845 -10505:2:1849 -10506:2:1850 -10507:2:1858 -10508:2:1859 -10509:2:1863 -10510:2:1864 -10511:2:1858 -10512:2:1859 -10513:2:1863 -10514:2:1864 -10515:2:1872 -10516:2:1877 -10517:2:1881 -10518:2:1882 -10519:2:1889 -10520:2:1890 -10521:2:1901 -10522:2:1902 -10523:2:1903 -10524:2:1901 -10525:2:1902 -10526:2:1903 -10527:2:1914 -10528:2:1919 -10529:2:1920 -10530:0:4365 -10531:2:1932 -10532:0:4365 -10533:3:3354 -10534:0:4365 -10535:2:1934 -10536:0:4365 -10537:3:3355 -10538:0:4365 -10539:2:1935 -10540:0:4365 -10541:2:1936 -10542:0:4365 -10543:2:2129 -10544:0:4365 -10545:2:2130 -10546:0:4365 -10547:2:2134 -10548:0:4365 -10549:3:3354 -10550:0:4365 -10551:2:2136 -10552:0:4365 -10553:3:3355 -10554:0:4365 -10555:2:2137 -10556:2:2141 -10557:2:2142 -10558:2:2150 -10559:2:2151 -10560:2:2155 -10561:2:2156 -10562:2:2150 -10563:2:2151 -10564:2:2155 -10565:2:2156 -10566:2:2164 -10567:2:2169 -10568:2:2173 -10569:2:2174 -10570:2:2181 -10571:2:2182 -10572:2:2193 -10573:2:2194 -10574:2:2195 -10575:2:2193 -10576:2:2194 -10577:2:2195 -10578:2:2206 -10579:2:2211 -10580:2:2212 -10581:0:4365 -10582:2:2224 -10583:0:4365 -10584:3:3354 -10585:0:4365 -10586:2:2226 -10587:0:4365 -10588:3:3355 -10589:0:4365 -10590:2:1936 -10591:0:4365 -10592:2:2129 -10593:0:4365 -10594:2:2130 -10595:0:4365 -10596:2:2134 -10597:0:4365 -10598:3:3354 -10599:0:4365 -10600:2:2136 -10601:0:4365 -10602:3:3355 -10603:0:4365 -10604:2:2137 -10605:2:2141 -10606:2:2142 -10607:2:2150 -10608:2:2151 -10609:2:2155 -10610:2:2156 -10611:2:2150 -10612:2:2151 -10613:2:2152 -10614:2:2164 -10615:2:2169 -10616:2:2173 -10617:2:2174 -10618:2:2181 -10619:2:2182 -10620:2:2193 -10621:2:2194 -10622:2:2195 -10623:2:2193 -10624:2:2194 -10625:2:2195 -10626:2:2206 -10627:2:2211 -10628:2:2212 -10629:0:4365 -10630:2:2224 -10631:0:4365 -10632:3:3354 -10633:0:4365 -10634:2:2226 -10635:0:4365 -10636:3:3355 -10637:0:4365 -10638:2:2230 -10639:0:4365 -10640:3:3354 -10641:0:4365 -10642:2:2235 -10643:2:2239 -10644:2:2240 -10645:2:2248 -10646:2:2249 -10647:2:2253 -10648:2:2254 -10649:2:2248 -10650:2:2249 -10651:2:2250 -10652:2:2262 -10653:2:2267 -10654:2:2271 -10655:2:2272 -10656:2:2279 -10657:2:2280 -10658:2:2291 -10659:2:2292 -10660:2:2293 -10661:2:2291 -10662:2:2292 -10663:2:2293 -10664:2:2304 -10665:2:2309 -10666:2:2310 -10667:0:4365 -10668:3:3355 -10669:0:4365 -10670:2:2322 -10671:0:4365 -10672:2:1169 -10673:0:4365 -10674:3:3354 -10675:0:4365 -10676:2:1170 -10677:0:4365 -10678:3:3355 -10679:0:4365 -10680:3:3356 -10681:0:4365 -10682:3:3366 -10683:0:4365 -10684:3:2951 -10685:0:4365 -10686:3:2952 -10687:0:4365 -10688:3:2953 -10689:0:4365 -10690:3:2954 -10691:3:2958 -10692:3:2959 -10693:3:2967 -10694:3:2968 -10695:3:2972 -10696:3:2973 -10697:3:2967 -10698:3:2968 -10699:3:2972 -10700:3:2973 -10701:3:2981 -10702:3:2986 -10703:3:2990 -10704:3:2991 -10705:3:2998 -10706:3:2999 -10707:3:3010 -10708:3:3011 -10709:3:3012 -10710:3:3010 -10711:3:3011 -10712:3:3012 -10713:3:3023 -10714:3:3028 -10715:3:3029 -10716:0:4365 -10717:3:3041 -10718:0:4365 -10719:3:3042 -10720:0:4365 -10721:2:1173 -10722:0:4365 -10723:3:3043 -10724:0:4365 -10725:2:1179 -10726:0:4365 -10727:2:1180 -10728:0:4365 -10729:3:3042 -10730:0:4365 -10731:2:1181 -10732:2:1185 -10733:2:1186 -10734:2:1194 -10735:2:1195 -10736:2:1199 -10737:2:1200 -10738:2:1194 -10739:2:1195 -10740:2:1199 -10741:2:1200 -10742:2:1208 -10743:2:1213 -10744:2:1217 -10745:2:1218 -10746:2:1225 -10747:2:1226 -10748:2:1237 -10749:2:1238 -10750:2:1239 -10751:2:1237 -10752:2:1238 -10753:2:1239 -10754:2:1250 -10755:2:1255 -10756:2:1256 -10757:0:4365 -10758:3:3043 -10759:0:4365 -10760:2:1268 -10761:0:4365 -10762:3:3042 -10763:0:4365 -10764:2:1270 -10765:0:4365 -10766:3:3043 -10767:0:4365 -10768:2:1271 -10769:2:1275 -10770:2:1276 -10771:2:1284 -10772:2:1285 -10773:2:1289 -10774:2:1290 -10775:2:1284 -10776:2:1285 -10777:2:1289 -10778:2:1290 -10779:2:1298 -10780:2:1303 -10781:2:1307 -10782:2:1308 -10783:2:1315 -10784:2:1316 -10785:2:1327 -10786:2:1328 -10787:2:1329 -10788:2:1327 -10789:2:1328 -10790:2:1329 -10791:2:1340 -10792:2:1345 -10793:2:1346 -10794:0:4365 -10795:2:1358 -10796:0:4365 -10797:2:1360 -10798:0:4365 -10799:3:3042 -10800:0:4365 -10801:2:1361 -10802:0:4365 -10803:3:3043 -10804:0:4365 -10805:2:1362 -10806:2:1366 -10807:2:1367 -10808:2:1375 -10809:2:1376 -10810:2:1380 -10811:2:1381 -10812:2:1375 -10813:2:1376 -10814:2:1380 -10815:2:1381 -10816:2:1389 -10817:2:1394 -10818:2:1398 -10819:2:1399 -10820:2:1406 -10821:2:1407 -10822:2:1418 -10823:2:1419 -10824:2:1420 -10825:2:1418 -10826:2:1419 -10827:2:1420 -10828:2:1431 -10829:2:1436 -10830:2:1437 -10831:0:4365 -10832:2:1449 -10833:0:4365 -10834:3:3042 -10835:0:4365 -10836:2:1451 -10837:0:4365 -10838:3:3043 -10839:0:4365 -10840:2:1652 -10841:0:4365 -10842:2:1653 -10843:0:4365 -10844:2:1657 -10845:0:4365 -10846:2:1180 -10847:0:4365 -10848:3:3042 -10849:0:4365 -10850:2:1181 -10851:2:1185 -10852:2:1186 -10853:2:1194 -10854:2:1195 -10855:2:1199 -10856:2:1200 -10857:2:1194 -10858:2:1195 -10859:2:1196 -10860:2:1208 -10861:2:1213 -10862:2:1217 -10863:2:1218 -10864:2:1225 -10865:2:1226 -10866:2:1237 -10867:2:1238 -10868:2:1239 -10869:2:1237 -10870:2:1238 -10871:2:1239 -10872:2:1250 -10873:2:1255 -10874:2:1256 -10875:0:4365 -10876:3:3043 -10877:0:4365 -10878:2:1268 -10879:0:4365 -10880:3:3042 -10881:0:4365 -10882:2:1270 -10883:0:4365 -10884:3:3043 -10885:0:4365 -10886:2:1271 -10887:2:1275 -10888:2:1276 -10889:2:1284 -10890:2:1285 -10891:2:1289 -10892:2:1290 -10893:2:1284 -10894:2:1285 -10895:2:1289 -10896:2:1290 -10897:2:1298 -10898:2:1303 -10899:2:1307 -10900:2:1308 -10901:2:1315 -10902:2:1316 -10903:2:1327 -10904:2:1328 -10905:2:1329 -10906:2:1327 -10907:2:1328 -10908:2:1329 -10909:2:1340 -10910:2:1345 -10911:2:1346 -10912:0:4365 -10913:2:1358 -10914:0:4365 -10915:2:1454 -10916:0:4365 -10917:3:3042 -10918:0:4365 -10919:2:1455 -10920:0:4365 -10921:3:3043 -10922:0:4365 -10923:2:1652 -10924:0:4365 -10925:2:1653 -10926:0:4365 -10927:2:1657 -10928:0:4365 -10929:2:1660 -10930:0:4365 -10931:3:3042 -10932:0:4365 -10933:2:1665 -10934:2:1669 -10935:2:1670 -10936:2:1678 -10937:2:1679 -10938:2:1683 -10939:2:1684 -10940:2:1678 -10941:2:1679 -10942:2:1680 -10943:2:1692 -10944:2:1697 -10945:2:1701 -10946:2:1702 -10947:2:1709 -10948:2:1710 -10949:2:1721 -10950:2:1722 -10951:2:1723 -10952:2:1721 -10953:2:1722 -10954:2:1723 -10955:2:1734 -10956:2:1739 -10957:2:1740 -10958:0:4365 -10959:3:3043 -10960:0:4365 -10961:2:1752 -10962:0:4365 -10963:3:3042 -10964:0:4365 -10965:2:1754 -10966:0:4365 -10967:3:3043 -10968:0:4365 -10969:2:1755 -10970:2:1759 -10971:2:1760 -10972:2:1768 -10973:2:1769 -10974:2:1773 -10975:2:1774 -10976:2:1768 -10977:2:1769 -10978:2:1773 -10979:2:1774 -10980:2:1782 -10981:2:1787 -10982:2:1791 -10983:2:1792 -10984:2:1799 -10985:2:1800 -10986:2:1811 -10987:2:1812 -10988:2:1813 -10989:2:1811 -10990:2:1812 -10991:2:1813 -10992:2:1824 -10993:2:1829 -10994:2:1830 -10995:0:4365 -10996:2:1842 -10997:0:4365 -10998:3:3042 -10999:0:4365 -11000:2:1844 -11001:0:4365 -11002:3:3043 -11003:0:4365 -11004:2:1845 -11005:2:1849 -11006:2:1850 -11007:2:1858 -11008:2:1859 -11009:2:1863 -11010:2:1864 -11011:2:1858 -11012:2:1859 -11013:2:1863 -11014:2:1864 -11015:2:1872 -11016:2:1877 -11017:2:1881 -11018:2:1882 -11019:2:1889 -11020:2:1890 -11021:2:1901 -11022:2:1902 -11023:2:1903 -11024:2:1901 -11025:2:1902 -11026:2:1903 -11027:2:1914 -11028:2:1919 -11029:2:1920 -11030:0:4365 -11031:2:1932 -11032:0:4365 -11033:3:3042 -11034:0:4365 -11035:2:1934 -11036:0:4365 -11037:3:3043 -11038:0:4365 -11039:2:1935 -11040:0:4365 -11041:2:1936 -11042:0:4365 -11043:2:2129 -11044:0:4365 -11045:2:2130 -11046:0:4365 -11047:2:2134 -11048:0:4365 -11049:3:3042 -11050:0:4365 -11051:2:2136 -11052:0:4365 -11053:3:3043 -11054:0:4365 -11055:2:2137 -11056:2:2141 -11057:2:2142 -11058:2:2150 -11059:2:2151 -11060:2:2155 -11061:2:2156 -11062:2:2150 -11063:2:2151 -11064:2:2155 -11065:2:2156 -11066:2:2164 -11067:2:2169 -11068:2:2173 -11069:2:2174 -11070:2:2181 -11071:2:2182 -11072:2:2193 -11073:2:2194 -11074:2:2195 -11075:2:2193 -11076:2:2194 -11077:2:2195 -11078:2:2206 -11079:2:2211 -11080:2:2212 -11081:0:4365 -11082:2:2224 -11083:0:4365 -11084:3:3042 -11085:0:4365 -11086:2:2226 -11087:0:4365 -11088:3:3043 -11089:0:4365 -11090:2:1936 -11091:0:4365 -11092:2:2129 -11093:0:4365 -11094:2:2130 -11095:0:4365 -11096:2:2134 -11097:0:4365 -11098:3:3042 -11099:0:4365 -11100:2:2136 -11101:0:4365 -11102:3:3043 -11103:0:4365 -11104:2:2137 -11105:2:2141 -11106:2:2142 -11107:2:2150 -11108:2:2151 -11109:2:2155 -11110:2:2156 -11111:2:2150 -11112:2:2151 -11113:2:2152 -11114:2:2164 -11115:2:2169 -11116:2:2173 -11117:2:2174 -11118:2:2181 -11119:2:2182 -11120:2:2193 -11121:2:2194 -11122:2:2195 -11123:2:2193 -11124:2:2194 -11125:2:2195 -11126:2:2206 -11127:2:2211 -11128:2:2212 -11129:0:4365 -11130:2:2224 -11131:0:4365 -11132:3:3042 -11133:0:4365 -11134:2:2226 -11135:0:4365 -11136:3:3043 -11137:0:4365 -11138:2:2230 -11139:0:4365 -11140:3:3042 -11141:0:4365 -11142:2:2235 -11143:2:2239 -11144:2:2240 -11145:2:2248 -11146:2:2249 -11147:2:2253 -11148:2:2254 -11149:2:2248 -11150:2:2249 -11151:2:2250 -11152:2:2262 -11153:2:2267 -11154:2:2271 -11155:2:2272 -11156:2:2279 -11157:2:2280 -11158:2:2291 -11159:2:2292 -11160:2:2293 -11161:2:2291 -11162:2:2292 -11163:2:2293 -11164:2:2304 -11165:2:2309 -11166:2:2310 -11167:0:4365 -11168:3:3043 -11169:0:4365 -11170:2:2322 -11171:0:4365 -11172:2:1169 -11173:0:4365 -11174:3:3042 -11175:0:4365 -11176:2:1170 -11177:0:4365 -11178:3:3043 -11179:0:4365 -11180:3:3044 -11181:0:4365 -11182:3:3257 -11183:0:4365 -11184:3:3362 -11185:0:4365 -11186:3:3363 -11187:0:4365 -11188:3:3367 -11189:0:4365 -11190:3:3373 -11191:3:3377 -11192:3:3378 -11193:3:3386 -11194:3:3387 -11195:3:3391 -11196:3:3392 -11197:3:3386 -11198:3:3387 -11199:3:3391 -11200:3:3392 -11201:3:3400 -11202:3:3405 -11203:3:3409 -11204:3:3410 -11205:3:3417 -11206:3:3418 -11207:3:3429 -11208:3:3430 -11209:3:3431 -11210:3:3429 -11211:3:3430 -11212:3:3431 -11213:3:3442 -11214:3:3447 -11215:3:3448 -11216:0:4365 -11217:3:3460 -11218:0:4365 -11219:3:3461 -11220:0:4365 -11221:2:1173 -11222:0:4365 -11223:3:3462 -11224:0:4365 -11225:2:1179 -11226:0:4365 -11227:2:1180 -11228:0:4365 -11229:3:3461 -11230:0:4365 -11231:2:1181 -11232:2:1185 -11233:2:1186 -11234:2:1194 -11235:2:1195 -11236:2:1199 -11237:2:1200 -11238:2:1194 -11239:2:1195 -11240:2:1199 -11241:2:1200 -11242:2:1208 -11243:2:1213 -11244:2:1217 -11245:2:1218 -11246:2:1225 -11247:2:1226 -11248:2:1237 -11249:2:1238 -11250:2:1239 -11251:2:1237 -11252:2:1238 -11253:2:1239 -11254:2:1250 -11255:2:1255 -11256:2:1256 -11257:0:4365 -11258:3:3462 -11259:0:4365 -11260:2:1268 -11261:0:4365 -11262:3:3461 -11263:0:4365 -11264:2:1270 -11265:0:4365 -11266:3:3462 -11267:0:4365 -11268:2:1271 -11269:2:1275 -11270:2:1276 -11271:2:1284 -11272:2:1285 -11273:2:1289 -11274:2:1290 -11275:2:1284 -11276:2:1285 -11277:2:1289 -11278:2:1290 -11279:2:1298 -11280:2:1303 -11281:2:1307 -11282:2:1308 -11283:2:1315 -11284:2:1316 -11285:2:1327 -11286:2:1328 -11287:2:1329 -11288:2:1327 -11289:2:1328 -11290:2:1329 -11291:2:1340 -11292:2:1345 -11293:2:1346 -11294:0:4365 -11295:2:1358 -11296:0:4365 -11297:2:1360 -11298:0:4365 -11299:3:3461 -11300:0:4365 -11301:2:1361 -11302:0:4365 -11303:3:3462 -11304:0:4365 -11305:2:1362 -11306:2:1366 -11307:2:1367 -11308:2:1375 -11309:2:1376 -11310:2:1380 -11311:2:1381 -11312:2:1375 -11313:2:1376 -11314:2:1380 -11315:2:1381 -11316:2:1389 -11317:2:1394 -11318:2:1398 -11319:2:1399 -11320:2:1406 -11321:2:1407 -11322:2:1418 -11323:2:1419 -11324:2:1420 -11325:2:1418 -11326:2:1419 -11327:2:1420 -11328:2:1431 -11329:2:1436 -11330:2:1437 -11331:0:4365 -11332:2:1449 -11333:0:4365 -11334:3:3461 -11335:0:4365 -11336:2:1451 -11337:0:4365 -11338:3:3462 -11339:0:4365 -11340:2:1652 -11341:0:4365 -11342:2:1653 -11343:0:4365 -11344:2:1657 -11345:0:4365 -11346:2:1180 -11347:0:4365 -11348:3:3461 -11349:0:4365 -11350:2:1181 -11351:2:1185 -11352:2:1186 -11353:2:1194 -11354:2:1195 -11355:2:1199 -11356:2:1200 -11357:2:1194 -11358:2:1195 -11359:2:1196 -11360:2:1208 -11361:2:1213 -11362:2:1217 -11363:2:1218 -11364:2:1225 -11365:2:1226 -11366:2:1237 -11367:2:1238 -11368:2:1239 -11369:2:1237 -11370:2:1238 -11371:2:1239 -11372:2:1250 -11373:2:1255 -11374:2:1256 -11375:0:4365 -11376:3:3462 -11377:0:4365 -11378:2:1268 -11379:0:4365 -11380:3:3461 -11381:0:4365 -11382:2:1270 -11383:0:4365 -11384:3:3462 -11385:0:4365 -11386:2:1271 -11387:2:1275 -11388:2:1276 -11389:2:1284 -11390:2:1285 -11391:2:1289 -11392:2:1290 -11393:2:1284 -11394:2:1285 -11395:2:1289 -11396:2:1290 -11397:2:1298 -11398:2:1303 -11399:2:1307 -11400:2:1308 -11401:2:1315 -11402:2:1316 -11403:2:1327 -11404:2:1328 -11405:2:1329 -11406:2:1327 -11407:2:1328 -11408:2:1329 -11409:2:1340 -11410:2:1345 -11411:2:1346 -11412:0:4365 -11413:2:1358 -11414:0:4365 -11415:2:1454 -11416:0:4365 -11417:3:3461 -11418:0:4365 -11419:2:1455 -11420:0:4365 -11421:3:3462 -11422:0:4365 -11423:2:1652 -11424:0:4365 -11425:2:1653 -11426:0:4365 -11427:2:1657 -11428:0:4365 -11429:2:1660 -11430:0:4365 -11431:3:3461 -11432:0:4365 -11433:2:1665 -11434:2:1669 -11435:2:1670 -11436:2:1678 -11437:2:1679 -11438:2:1683 -11439:2:1684 -11440:2:1678 -11441:2:1679 -11442:2:1680 -11443:2:1692 -11444:2:1697 -11445:2:1701 -11446:2:1702 -11447:2:1709 -11448:2:1710 -11449:2:1721 -11450:2:1722 -11451:2:1723 -11452:2:1721 -11453:2:1722 -11454:2:1723 -11455:2:1734 -11456:2:1739 -11457:2:1740 -11458:0:4365 -11459:3:3462 -11460:0:4365 -11461:2:1752 -11462:0:4365 -11463:3:3461 -11464:0:4365 -11465:2:1754 -11466:0:4365 -11467:3:3462 -11468:0:4365 -11469:2:1755 -11470:2:1759 -11471:2:1760 -11472:2:1768 -11473:2:1769 -11474:2:1773 -11475:2:1774 -11476:2:1768 -11477:2:1769 -11478:2:1773 -11479:2:1774 -11480:2:1782 -11481:2:1787 -11482:2:1791 -11483:2:1792 -11484:2:1799 -11485:2:1800 -11486:2:1811 -11487:2:1812 -11488:2:1813 -11489:2:1811 -11490:2:1812 -11491:2:1813 -11492:2:1824 -11493:2:1829 -11494:2:1830 -11495:0:4365 -11496:2:1842 -11497:0:4365 -11498:3:3461 -11499:0:4365 -11500:2:1844 -11501:0:4365 -11502:3:3462 -11503:0:4365 -11504:2:1845 -11505:2:1849 -11506:2:1850 -11507:2:1858 -11508:2:1859 -11509:2:1863 -11510:2:1864 -11511:2:1858 -11512:2:1859 -11513:2:1863 -11514:2:1864 -11515:2:1872 -11516:2:1877 -11517:2:1881 -11518:2:1882 -11519:2:1889 -11520:2:1890 -11521:2:1901 -11522:2:1902 -11523:2:1903 -11524:2:1901 -11525:2:1902 -11526:2:1903 -11527:2:1914 -11528:2:1919 -11529:2:1920 -11530:0:4365 -11531:2:1932 -11532:0:4365 -11533:3:3461 -11534:0:4365 -11535:2:1934 -11536:0:4365 -11537:3:3462 -11538:0:4365 -11539:2:1935 -11540:0:4365 -11541:2:1936 -11542:0:4365 -11543:2:2129 -11544:0:4365 -11545:2:2130 -11546:0:4365 -11547:2:2134 -11548:0:4365 -11549:3:3461 -11550:0:4365 -11551:2:2136 -11552:0:4365 -11553:3:3462 -11554:0:4365 -11555:2:2137 -11556:2:2141 -11557:2:2142 -11558:2:2150 -11559:2:2151 -11560:2:2155 -11561:2:2156 -11562:2:2150 -11563:2:2151 -11564:2:2155 -11565:2:2156 -11566:2:2164 -11567:2:2169 -11568:2:2173 -11569:2:2174 -11570:2:2181 -11571:2:2182 -11572:2:2193 -11573:2:2194 -11574:2:2195 -11575:2:2193 -11576:2:2194 -11577:2:2195 -11578:2:2206 -11579:2:2211 -11580:2:2212 -11581:0:4365 -11582:2:2224 -11583:0:4365 -11584:3:3461 -11585:0:4365 -11586:2:2226 -11587:0:4365 -11588:3:3462 -11589:0:4365 -11590:2:1936 -11591:0:4365 -11592:2:2129 -11593:0:4365 -11594:2:2130 -11595:0:4365 -11596:2:2134 -11597:0:4365 -11598:3:3461 -11599:0:4365 -11600:2:2136 -11601:0:4365 -11602:3:3462 -11603:0:4365 -11604:2:2137 -11605:2:2141 -11606:2:2142 -11607:2:2150 -11608:2:2151 -11609:2:2155 -11610:2:2156 -11611:2:2150 -11612:2:2151 -11613:2:2152 -11614:2:2164 -11615:2:2169 -11616:2:2173 -11617:2:2174 -11618:2:2181 -11619:2:2182 -11620:2:2193 -11621:2:2194 -11622:2:2195 -11623:2:2193 -11624:2:2194 -11625:2:2195 -11626:2:2206 -11627:2:2211 -11628:2:2212 -11629:0:4365 -11630:2:2224 -11631:0:4365 -11632:3:3461 -11633:0:4365 -11634:2:2226 -11635:0:4365 -11636:3:3462 -11637:0:4365 -11638:2:2230 -11639:0:4365 -11640:3:3461 -11641:0:4365 -11642:2:2235 -11643:2:2239 -11644:2:2240 -11645:2:2248 -11646:2:2249 -11647:2:2253 -11648:2:2254 -11649:2:2248 -11650:2:2249 -11651:2:2250 -11652:2:2262 -11653:2:2267 -11654:2:2271 -11655:2:2272 -11656:2:2279 -11657:2:2280 -11658:2:2291 -11659:2:2292 -11660:2:2293 -11661:2:2291 -11662:2:2292 -11663:2:2293 -11664:2:2304 -11665:2:2309 -11666:2:2310 -11667:0:4365 -11668:3:3462 -11669:0:4365 -11670:2:2322 -11671:0:4365 -11672:2:1169 -11673:0:4365 -11674:3:3461 -11675:0:4365 -11676:2:1170 -11677:0:4365 -11678:3:3462 -11679:0:4365 -11680:3:3463 -11681:0:4365 -11682:3:3469 -11683:0:4365 -11684:3:3470 -11685:3:3474 -11686:3:3475 -11687:3:3483 -11688:3:3484 -11689:3:3488 -11690:3:3489 -11691:3:3483 -11692:3:3484 -11693:3:3488 -11694:3:3489 -11695:3:3497 -11696:3:3502 -11697:3:3506 -11698:3:3507 -11699:3:3514 -11700:3:3515 -11701:3:3526 -11702:3:3527 -11703:3:3528 -11704:3:3526 -11705:3:3527 -11706:3:3528 -11707:3:3539 -11708:3:3544 -11709:3:3545 -11710:0:4365 -11711:3:3557 -11712:0:4365 -11713:3:3558 -11714:0:4365 -11715:2:1173 -11716:0:4365 -11717:3:3559 -11718:0:4365 -11719:2:1179 -11720:0:4365 -11721:2:1180 -11722:0:4365 -11723:3:3558 -11724:0:4365 -11725:2:1181 -11726:2:1185 -11727:2:1186 -11728:2:1194 -11729:2:1195 -11730:2:1199 -11731:2:1200 -11732:2:1194 -11733:2:1195 -11734:2:1199 -11735:2:1200 -11736:2:1208 -11737:2:1213 -11738:2:1217 -11739:2:1218 -11740:2:1225 -11741:2:1226 -11742:2:1237 -11743:2:1238 -11744:2:1239 -11745:2:1237 -11746:2:1238 -11747:2:1239 -11748:2:1250 -11749:2:1255 -11750:2:1256 -11751:0:4365 -11752:3:3559 -11753:0:4365 -11754:2:1268 -11755:0:4365 -11756:3:3558 -11757:0:4365 -11758:2:1270 -11759:0:4365 -11760:3:3559 -11761:0:4365 -11762:2:1271 -11763:2:1275 -11764:2:1276 -11765:2:1284 -11766:2:1285 -11767:2:1289 -11768:2:1290 -11769:2:1284 -11770:2:1285 -11771:2:1289 -11772:2:1290 -11773:2:1298 -11774:2:1303 -11775:2:1307 -11776:2:1308 -11777:2:1315 -11778:2:1316 -11779:2:1327 -11780:2:1328 -11781:2:1329 -11782:2:1327 -11783:2:1328 -11784:2:1329 -11785:2:1340 -11786:2:1345 -11787:2:1346 -11788:0:4365 -11789:2:1358 -11790:0:4365 -11791:2:1360 -11792:0:4365 -11793:3:3558 -11794:0:4365 -11795:2:1361 -11796:0:4365 -11797:3:3559 -11798:0:4365 -11799:2:1362 -11800:2:1366 -11801:2:1367 -11802:2:1375 -11803:2:1376 -11804:2:1380 -11805:2:1381 -11806:2:1375 -11807:2:1376 -11808:2:1380 -11809:2:1381 -11810:2:1389 -11811:2:1394 -11812:2:1398 -11813:2:1399 -11814:2:1406 -11815:2:1407 -11816:2:1418 -11817:2:1419 -11818:2:1420 -11819:2:1418 -11820:2:1419 -11821:2:1420 -11822:2:1431 -11823:2:1436 -11824:2:1437 -11825:0:4365 -11826:2:1449 -11827:0:4365 -11828:3:3558 -11829:0:4365 -11830:2:1451 -11831:0:4365 -11832:3:3559 -11833:0:4365 -11834:2:1652 -11835:0:4365 -11836:2:1653 -11837:0:4365 -11838:2:1657 -11839:0:4365 -11840:2:1180 -11841:0:4365 -11842:3:3558 -11843:0:4365 -11844:2:1181 -11845:2:1185 -11846:2:1186 -11847:2:1194 -11848:2:1195 -11849:2:1199 -11850:2:1200 -11851:2:1194 -11852:2:1195 -11853:2:1196 -11854:2:1208 -11855:2:1213 -11856:2:1217 -11857:2:1218 -11858:2:1225 -11859:2:1226 -11860:2:1237 -11861:2:1238 -11862:2:1239 -11863:2:1237 -11864:2:1238 -11865:2:1239 -11866:2:1250 -11867:2:1255 -11868:2:1256 -11869:0:4365 -11870:3:3559 -11871:0:4365 -11872:2:1268 -11873:0:4365 -11874:3:3558 -11875:0:4365 -11876:2:1270 -11877:0:4365 -11878:3:3559 -11879:0:4365 -11880:2:1271 -11881:2:1275 -11882:2:1276 -11883:2:1284 -11884:2:1285 -11885:2:1289 -11886:2:1290 -11887:2:1284 -11888:2:1285 -11889:2:1289 -11890:2:1290 -11891:2:1298 -11892:2:1303 -11893:2:1307 -11894:2:1308 -11895:2:1315 -11896:2:1316 -11897:2:1327 -11898:2:1328 -11899:2:1329 -11900:2:1327 -11901:2:1328 -11902:2:1329 -11903:2:1340 -11904:2:1345 -11905:2:1346 -11906:0:4365 -11907:2:1358 -11908:0:4365 -11909:2:1454 -11910:0:4365 -11911:3:3558 -11912:0:4365 -11913:2:1455 -11914:0:4365 -11915:3:3559 -11916:0:4365 -11917:2:1652 -11918:0:4365 -11919:2:1653 -11920:0:4365 -11921:2:1657 -11922:0:4365 -11923:2:1660 -11924:0:4365 -11925:3:3558 -11926:0:4365 -11927:2:1665 -11928:2:1669 -11929:2:1670 -11930:2:1678 -11931:2:1679 -11932:2:1683 -11933:2:1684 -11934:2:1678 -11935:2:1679 -11936:2:1680 -11937:2:1692 -11938:2:1697 -11939:2:1701 -11940:2:1702 -11941:2:1709 -11942:2:1710 -11943:2:1721 -11944:2:1722 -11945:2:1723 -11946:2:1721 -11947:2:1722 -11948:2:1723 -11949:2:1734 -11950:2:1739 -11951:2:1740 -11952:0:4365 -11953:3:3559 -11954:0:4365 -11955:2:1752 -11956:0:4365 -11957:3:3558 -11958:0:4365 -11959:2:1754 -11960:0:4365 -11961:3:3559 -11962:0:4365 -11963:2:1755 -11964:2:1759 -11965:2:1760 -11966:2:1768 -11967:2:1769 -11968:2:1773 -11969:2:1774 -11970:2:1768 -11971:2:1769 -11972:2:1773 -11973:2:1774 -11974:2:1782 -11975:2:1787 -11976:2:1791 -11977:2:1792 -11978:2:1799 -11979:2:1800 -11980:2:1811 -11981:2:1812 -11982:2:1813 -11983:2:1811 -11984:2:1812 -11985:2:1813 -11986:2:1824 -11987:2:1829 -11988:2:1830 -11989:0:4365 -11990:2:1842 -11991:0:4365 -11992:3:3558 -11993:0:4365 -11994:2:1844 -11995:0:4365 -11996:3:3559 -11997:0:4365 -11998:2:1845 -11999:2:1849 -12000:2:1850 -12001:2:1858 -12002:2:1859 -12003:2:1863 -12004:2:1864 -12005:2:1858 -12006:2:1859 -12007:2:1863 -12008:2:1864 -12009:2:1872 -12010:2:1877 -12011:2:1881 -12012:2:1882 -12013:2:1889 -12014:2:1890 -12015:2:1901 -12016:2:1902 -12017:2:1903 -12018:2:1901 -12019:2:1902 -12020:2:1903 -12021:2:1914 -12022:2:1919 -12023:2:1920 -12024:0:4365 -12025:2:1932 -12026:0:4365 -12027:3:3558 -12028:0:4365 -12029:2:1934 -12030:0:4365 -12031:3:3559 -12032:0:4365 -12033:2:1935 -12034:0:4365 -12035:2:1936 -12036:0:4365 -12037:2:2129 -12038:0:4365 -12039:2:2130 -12040:0:4365 -12041:2:2134 -12042:0:4365 -12043:3:3558 -12044:0:4365 -12045:2:2136 -12046:0:4365 -12047:3:3559 -12048:0:4365 -12049:2:2137 -12050:2:2141 -12051:2:2142 -12052:2:2150 -12053:2:2151 -12054:2:2155 -12055:2:2156 -12056:2:2150 -12057:2:2151 -12058:2:2155 -12059:2:2156 -12060:2:2164 -12061:2:2169 -12062:2:2173 -12063:2:2174 -12064:2:2181 -12065:2:2182 -12066:2:2193 -12067:2:2194 -12068:2:2195 -12069:2:2193 -12070:2:2194 -12071:2:2195 -12072:2:2206 -12073:2:2211 -12074:2:2212 -12075:0:4365 -12076:2:2224 -12077:0:4365 -12078:3:3558 -12079:0:4365 -12080:2:2226 -12081:0:4365 -12082:3:3559 -12083:0:4365 -12084:2:1936 -12085:0:4365 -12086:2:2129 -12087:0:4365 -12088:2:2130 -12089:0:4365 -12090:2:2134 -12091:0:4365 -12092:3:3558 -12093:0:4365 -12094:2:2136 -12095:0:4365 -12096:3:3559 -12097:0:4365 -12098:2:2137 -12099:2:2141 -12100:2:2142 -12101:2:2150 -12102:2:2151 -12103:2:2155 -12104:2:2156 -12105:2:2150 -12106:2:2151 -12107:2:2152 -12108:2:2164 -12109:2:2169 -12110:2:2173 -12111:2:2174 -12112:2:2181 -12113:2:2182 -12114:2:2193 -12115:2:2194 -12116:2:2195 -12117:2:2193 -12118:2:2194 -12119:2:2195 -12120:2:2206 -12121:2:2211 -12122:2:2212 -12123:0:4365 -12124:2:2224 -12125:0:4365 -12126:3:3558 -12127:0:4365 -12128:2:2226 -12129:0:4365 -12130:3:3559 -12131:0:4365 -12132:2:2230 -12133:0:4365 -12134:3:3558 -12135:0:4365 -12136:2:2235 -12137:2:2239 -12138:2:2240 -12139:2:2248 -12140:2:2249 -12141:2:2253 -12142:2:2254 -12143:2:2248 -12144:2:2249 -12145:2:2250 -12146:2:2262 -12147:2:2267 -12148:2:2271 -12149:2:2272 -12150:2:2279 -12151:2:2280 -12152:2:2291 -12153:2:2292 -12154:2:2293 -12155:2:2291 -12156:2:2292 -12157:2:2293 -12158:2:2304 -12159:2:2309 -12160:2:2310 -12161:0:4365 -12162:3:3559 -12163:0:4365 -12164:2:2322 -12165:0:4365 -12166:2:1169 -12167:0:4365 -12168:3:3558 -12169:0:4365 -12170:2:1170 -12171:0:4365 -12172:3:3559 -12173:0:4365 -12174:3:3560 -12175:0:4365 -12176:3:3566 -12177:0:4365 -12178:3:3569 -12179:3:3570 -12180:3:3582 -12181:3:3583 -12182:3:3587 -12183:3:3588 -12184:3:3582 -12185:3:3583 -12186:3:3587 -12187:3:3588 -12188:3:3596 -12189:3:3601 -12190:3:3605 -12191:3:3606 -12192:3:3613 -12193:3:3614 -12194:3:3625 -12195:3:3626 -12196:3:3627 -12197:3:3625 -12198:3:3626 -12199:3:3627 -12200:3:3638 -12201:3:3643 -12202:3:3644 -12203:0:4365 -12204:3:3656 -12205:0:4365 -12206:3:3657 -12207:0:4365 -12208:2:1173 -12209:0:4365 -12210:3:3658 -12211:0:4365 -12212:2:1179 -12213:0:4365 -12214:2:1180 -12215:0:4365 -12216:3:3657 -12217:0:4365 -12218:2:1181 -12219:2:1185 -12220:2:1186 -12221:2:1194 -12222:2:1195 -12223:2:1199 -12224:2:1200 -12225:2:1194 -12226:2:1195 -12227:2:1199 -12228:2:1200 -12229:2:1208 -12230:2:1213 -12231:2:1217 -12232:2:1218 -12233:2:1225 -12234:2:1226 -12235:2:1237 -12236:2:1238 -12237:2:1239 -12238:2:1237 -12239:2:1238 -12240:2:1239 -12241:2:1250 -12242:2:1255 -12243:2:1256 -12244:0:4365 -12245:3:3658 -12246:0:4365 -12247:2:1268 -12248:0:4365 -12249:3:3657 -12250:0:4365 -12251:2:1270 -12252:0:4365 -12253:3:3658 -12254:0:4365 -12255:2:1271 -12256:2:1275 -12257:2:1276 -12258:2:1284 -12259:2:1285 -12260:2:1289 -12261:2:1290 -12262:2:1284 -12263:2:1285 -12264:2:1289 -12265:2:1290 -12266:2:1298 -12267:2:1303 -12268:2:1307 -12269:2:1308 -12270:2:1315 -12271:2:1316 -12272:2:1327 -12273:2:1328 -12274:2:1329 -12275:2:1327 -12276:2:1328 -12277:2:1329 -12278:2:1340 -12279:2:1345 -12280:2:1346 -12281:0:4365 -12282:2:1358 -12283:0:4365 -12284:2:1360 -12285:0:4365 -12286:3:3657 -12287:0:4365 -12288:2:1361 -12289:0:4365 -12290:3:3658 -12291:0:4365 -12292:2:1362 -12293:2:1366 -12294:2:1367 -12295:2:1375 -12296:2:1376 -12297:2:1380 -12298:2:1381 -12299:2:1375 -12300:2:1376 -12301:2:1380 -12302:2:1381 -12303:2:1389 -12304:2:1394 -12305:2:1398 -12306:2:1399 -12307:2:1406 -12308:2:1407 -12309:2:1418 -12310:2:1419 -12311:2:1420 -12312:2:1418 -12313:2:1419 -12314:2:1420 -12315:2:1431 -12316:2:1436 -12317:2:1437 -12318:0:4365 -12319:2:1449 -12320:0:4365 -12321:3:3657 -12322:0:4365 -12323:2:1451 -12324:0:4365 -12325:3:3658 -12326:0:4365 -12327:2:1652 -12328:0:4365 -12329:2:1653 -12330:0:4365 -12331:2:1657 -12332:0:4365 -12333:2:1180 -12334:0:4365 -12335:3:3657 -12336:0:4365 -12337:2:1181 -12338:2:1185 -12339:2:1186 -12340:2:1194 -12341:2:1195 -12342:2:1199 -12343:2:1200 -12344:2:1194 -12345:2:1195 -12346:2:1196 -12347:2:1208 -12348:2:1213 -12349:2:1217 -12350:2:1218 -12351:2:1225 -12352:2:1226 -12353:2:1237 -12354:2:1238 -12355:2:1239 -12356:2:1237 -12357:2:1238 -12358:2:1239 -12359:2:1250 -12360:2:1255 -12361:2:1256 -12362:0:4365 -12363:3:3658 -12364:0:4365 -12365:2:1268 -12366:0:4365 -12367:3:3657 -12368:0:4365 -12369:2:1270 -12370:0:4365 -12371:3:3658 -12372:0:4365 -12373:2:1271 -12374:2:1275 -12375:2:1276 -12376:2:1284 -12377:2:1285 -12378:2:1289 -12379:2:1290 -12380:2:1284 -12381:2:1285 -12382:2:1289 -12383:2:1290 -12384:2:1298 -12385:2:1303 -12386:2:1307 -12387:2:1308 -12388:2:1315 -12389:2:1316 -12390:2:1327 -12391:2:1328 -12392:2:1329 -12393:2:1327 -12394:2:1328 -12395:2:1329 -12396:2:1340 -12397:2:1345 -12398:2:1346 -12399:0:4365 -12400:2:1358 -12401:0:4365 -12402:2:1454 -12403:0:4365 -12404:3:3657 -12405:0:4365 -12406:2:1455 -12407:0:4365 -12408:3:3658 -12409:0:4365 -12410:2:1652 -12411:0:4365 -12412:2:1653 -12413:0:4365 -12414:2:1657 -12415:0:4365 -12416:2:1660 -12417:0:4365 -12418:3:3657 -12419:0:4365 -12420:2:1665 -12421:2:1669 -12422:2:1670 -12423:2:1678 -12424:2:1679 -12425:2:1683 -12426:2:1684 -12427:2:1678 -12428:2:1679 -12429:2:1680 -12430:2:1692 -12431:2:1697 -12432:2:1701 -12433:2:1702 -12434:2:1709 -12435:2:1710 -12436:2:1721 -12437:2:1722 -12438:2:1723 -12439:2:1721 -12440:2:1722 -12441:2:1723 -12442:2:1734 -12443:2:1739 -12444:2:1740 -12445:0:4365 -12446:3:3658 -12447:0:4365 -12448:2:1752 -12449:0:4365 -12450:3:3657 -12451:0:4365 -12452:2:1754 -12453:0:4365 -12454:3:3658 -12455:0:4365 -12456:2:1755 -12457:2:1759 -12458:2:1760 -12459:2:1768 -12460:2:1769 -12461:2:1773 -12462:2:1774 -12463:2:1768 -12464:2:1769 -12465:2:1773 -12466:2:1774 -12467:2:1782 -12468:2:1787 -12469:2:1791 -12470:2:1792 -12471:2:1799 -12472:2:1800 -12473:2:1811 -12474:2:1812 -12475:2:1813 -12476:2:1811 -12477:2:1812 -12478:2:1813 -12479:2:1824 -12480:2:1829 -12481:2:1830 -12482:0:4365 -12483:2:1842 -12484:0:4365 -12485:3:3657 -12486:0:4365 -12487:2:1844 -12488:0:4365 -12489:3:3658 -12490:0:4365 -12491:2:1845 -12492:2:1849 -12493:2:1850 -12494:2:1858 -12495:2:1859 -12496:2:1863 -12497:2:1864 -12498:2:1858 -12499:2:1859 -12500:2:1863 -12501:2:1864 -12502:2:1872 -12503:2:1877 -12504:2:1881 -12505:2:1882 -12506:2:1889 -12507:2:1890 -12508:2:1901 -12509:2:1902 -12510:2:1903 -12511:2:1901 -12512:2:1902 -12513:2:1903 -12514:2:1914 -12515:2:1919 -12516:2:1920 -12517:0:4365 -12518:2:1932 -12519:0:4365 -12520:3:3657 -12521:0:4365 -12522:2:1934 -12523:0:4365 -12524:3:3658 -12525:0:4365 -12526:2:1935 -12527:0:4365 -12528:2:1936 -12529:0:4365 -12530:2:2129 -12531:0:4365 -12532:2:2130 -12533:0:4365 -12534:2:2134 -12535:0:4365 -12536:3:3657 -12537:0:4365 -12538:2:2136 -12539:0:4365 -12540:3:3658 -12541:0:4365 -12542:2:2137 -12543:2:2141 -12544:2:2142 -12545:2:2150 -12546:2:2151 -12547:2:2155 -12548:2:2156 -12549:2:2150 -12550:2:2151 -12551:2:2155 -12552:2:2156 -12553:2:2164 -12554:2:2169 -12555:2:2173 -12556:2:2174 -12557:2:2181 -12558:2:2182 -12559:2:2193 -12560:2:2194 -12561:2:2195 -12562:2:2193 -12563:2:2194 -12564:2:2195 -12565:2:2206 -12566:2:2211 -12567:2:2212 -12568:0:4365 -12569:2:2224 -12570:0:4365 -12571:3:3657 -12572:0:4365 -12573:2:2226 -12574:0:4365 -12575:3:3658 -12576:0:4365 -12577:2:1936 -12578:0:4365 -12579:2:2129 -12580:0:4365 -12581:2:2130 -12582:0:4365 -12583:2:2134 -12584:0:4365 -12585:3:3657 -12586:0:4365 -12587:2:2136 -12588:0:4365 -12589:3:3658 -12590:0:4365 -12591:2:2137 -12592:2:2141 -12593:2:2142 -12594:2:2150 -12595:2:2151 -12596:2:2155 -12597:2:2156 -12598:2:2150 -12599:2:2151 -12600:2:2152 -12601:2:2164 -12602:2:2169 -12603:2:2173 -12604:2:2174 -12605:2:2181 -12606:2:2182 -12607:2:2193 -12608:2:2194 -12609:2:2195 -12610:2:2193 -12611:2:2194 -12612:2:2195 -12613:2:2206 -12614:2:2211 -12615:2:2212 -12616:0:4365 -12617:2:2224 -12618:0:4365 -12619:3:3657 -12620:0:4365 -12621:2:2226 -12622:0:4365 -12623:3:3658 -12624:0:4365 -12625:2:2230 -12626:0:4365 -12627:3:3657 -12628:0:4365 -12629:2:2235 -12630:2:2239 -12631:2:2240 -12632:2:2248 -12633:2:2249 -12634:2:2253 -12635:2:2254 -12636:2:2248 -12637:2:2249 -12638:2:2250 -12639:2:2262 -12640:2:2267 -12641:2:2271 -12642:2:2272 -12643:2:2279 -12644:2:2280 -12645:2:2291 -12646:2:2292 -12647:2:2293 -12648:2:2291 -12649:2:2292 -12650:2:2293 -12651:2:2304 -12652:2:2309 -12653:2:2310 -12654:0:4365 -12655:3:3658 -12656:0:4365 -12657:2:2322 -12658:0:4365 -12659:2:1169 -12660:0:4365 -12661:3:3657 -12662:0:4365 -12663:2:1170 -12664:0:4365 -12665:3:3658 -12666:0:4365 -12667:3:3659 -12668:0:4365 -12669:3:3665 -12670:0:4365 -12671:3:3666 -12672:0:4365 -12673:3:3667 -12674:0:4365 -12675:3:3668 -12676:0:4365 -12677:3:3669 -12678:3:3673 -12679:3:3674 -12680:3:3682 -12681:3:3683 -12682:3:3687 -12683:3:3688 -12684:3:3682 -12685:3:3683 -12686:3:3687 -12687:3:3688 -12688:3:3696 -12689:3:3701 -12690:3:3705 -12691:3:3706 -12692:3:3713 -12693:3:3714 -12694:3:3725 -12695:3:3726 -12696:3:3727 -12697:3:3725 -12698:3:3726 -12699:3:3727 -12700:3:3738 -12701:3:3743 -12702:3:3744 -12703:0:4365 -12704:3:3756 -12705:0:4365 -12706:3:3757 -12707:0:4365 -12708:2:1173 -12709:0:4365 -12710:3:3758 -12711:0:4365 -12712:2:1179 -12713:0:4365 -12714:2:1180 -12715:0:4365 -12716:3:3757 -12717:0:4365 -12718:2:1181 -12719:2:1185 -12720:2:1186 -12721:2:1194 -12722:2:1195 -12723:2:1199 -12724:2:1200 -12725:2:1194 -12726:2:1195 -12727:2:1199 -12728:2:1200 -12729:2:1208 -12730:2:1213 -12731:2:1217 -12732:2:1218 -12733:2:1225 -12734:2:1226 -12735:2:1237 -12736:2:1238 -12737:2:1239 -12738:2:1237 -12739:2:1238 -12740:2:1239 -12741:2:1250 -12742:2:1255 -12743:2:1256 -12744:0:4365 -12745:3:3758 -12746:0:4365 -12747:2:1268 -12748:0:4365 -12749:3:3757 -12750:0:4365 -12751:2:1270 -12752:0:4365 -12753:3:3758 -12754:0:4365 -12755:2:1271 -12756:2:1275 -12757:2:1276 -12758:2:1284 -12759:2:1285 -12760:2:1289 -12761:2:1290 -12762:2:1284 -12763:2:1285 -12764:2:1289 -12765:2:1290 -12766:2:1298 -12767:2:1303 -12768:2:1307 -12769:2:1308 -12770:2:1315 -12771:2:1316 -12772:2:1327 -12773:2:1328 -12774:2:1329 -12775:2:1327 -12776:2:1328 -12777:2:1329 -12778:2:1340 -12779:2:1345 -12780:2:1346 -12781:0:4365 -12782:2:1358 -12783:0:4365 -12784:2:1360 -12785:0:4365 -12786:3:3757 -12787:0:4365 -12788:2:1361 -12789:0:4365 -12790:3:3758 -12791:0:4365 -12792:2:1362 -12793:2:1366 -12794:2:1367 -12795:2:1375 -12796:2:1376 -12797:2:1380 -12798:2:1381 -12799:2:1375 -12800:2:1376 -12801:2:1380 -12802:2:1381 -12803:2:1389 -12804:2:1394 -12805:2:1398 -12806:2:1399 -12807:2:1406 -12808:2:1407 -12809:2:1418 -12810:2:1419 -12811:2:1420 -12812:2:1418 -12813:2:1419 -12814:2:1420 -12815:2:1431 -12816:2:1436 -12817:2:1437 -12818:0:4365 -12819:2:1449 -12820:0:4365 -12821:3:3757 -12822:0:4365 -12823:2:1451 -12824:0:4365 -12825:3:3758 -12826:0:4365 -12827:2:1652 -12828:0:4365 -12829:2:1653 -12830:0:4365 -12831:2:1657 -12832:0:4365 -12833:2:1180 -12834:0:4365 -12835:3:3757 -12836:0:4365 -12837:2:1181 -12838:2:1185 -12839:2:1186 -12840:2:1194 -12841:2:1195 -12842:2:1199 -12843:2:1200 -12844:2:1194 -12845:2:1195 -12846:2:1196 -12847:2:1208 -12848:2:1213 -12849:2:1217 -12850:2:1218 -12851:2:1225 -12852:2:1226 -12853:2:1237 -12854:2:1238 -12855:2:1239 -12856:2:1237 -12857:2:1238 -12858:2:1239 -12859:2:1250 -12860:2:1255 -12861:2:1256 -12862:0:4365 -12863:3:3758 -12864:0:4365 -12865:2:1268 -12866:0:4365 -12867:3:3757 -12868:0:4365 -12869:2:1270 -12870:0:4365 -12871:3:3758 -12872:0:4365 -12873:2:1271 -12874:2:1275 -12875:2:1276 -12876:2:1284 -12877:2:1285 -12878:2:1289 -12879:2:1290 -12880:2:1284 -12881:2:1285 -12882:2:1289 -12883:2:1290 -12884:2:1298 -12885:2:1303 -12886:2:1307 -12887:2:1308 -12888:2:1315 -12889:2:1316 -12890:2:1327 -12891:2:1328 -12892:2:1329 -12893:2:1327 -12894:2:1328 -12895:2:1329 -12896:2:1340 -12897:2:1345 -12898:2:1346 -12899:0:4365 -12900:2:1358 -12901:0:4365 -12902:2:1454 -12903:0:4365 -12904:3:3757 -12905:0:4365 -12906:2:1455 -12907:0:4365 -12908:3:3758 -12909:0:4365 -12910:2:1652 -12911:0:4365 -12912:2:1653 -12913:0:4365 -12914:2:1657 -12915:0:4365 -12916:2:1660 -12917:0:4365 -12918:3:3757 -12919:0:4365 -12920:2:1665 -12921:2:1669 -12922:2:1670 -12923:2:1678 -12924:2:1679 -12925:2:1683 -12926:2:1684 -12927:2:1678 -12928:2:1679 -12929:2:1680 -12930:2:1692 -12931:2:1697 -12932:2:1701 -12933:2:1702 -12934:2:1709 -12935:2:1710 -12936:2:1721 -12937:2:1722 -12938:2:1723 -12939:2:1721 -12940:2:1722 -12941:2:1723 -12942:2:1734 -12943:2:1739 -12944:2:1740 -12945:0:4365 -12946:3:3758 -12947:0:4365 -12948:2:1752 -12949:0:4365 -12950:3:3757 -12951:0:4365 -12952:2:1754 -12953:0:4365 -12954:3:3758 -12955:0:4365 -12956:2:1755 -12957:2:1759 -12958:2:1760 -12959:2:1768 -12960:2:1769 -12961:2:1773 -12962:2:1774 -12963:2:1768 -12964:2:1769 -12965:2:1773 -12966:2:1774 -12967:2:1782 -12968:2:1787 -12969:2:1791 -12970:2:1792 -12971:2:1799 -12972:2:1800 -12973:2:1811 -12974:2:1812 -12975:2:1813 -12976:2:1811 -12977:2:1812 -12978:2:1813 -12979:2:1824 -12980:2:1829 -12981:2:1830 -12982:0:4365 -12983:2:1842 -12984:0:4365 -12985:3:3757 -12986:0:4365 -12987:2:1844 -12988:0:4365 -12989:3:3758 -12990:0:4365 -12991:2:1845 -12992:2:1849 -12993:2:1850 -12994:2:1858 -12995:2:1859 -12996:2:1863 -12997:2:1864 -12998:2:1858 -12999:2:1859 -13000:2:1863 -13001:2:1864 -13002:2:1872 -13003:2:1877 -13004:2:1881 -13005:2:1882 -13006:2:1889 -13007:2:1890 -13008:2:1901 -13009:2:1902 -13010:2:1903 -13011:2:1901 -13012:2:1902 -13013:2:1903 -13014:2:1914 -13015:2:1919 -13016:2:1920 -13017:0:4365 -13018:2:1932 -13019:0:4365 -13020:3:3757 -13021:0:4365 -13022:2:1934 -13023:0:4365 -13024:3:3758 -13025:0:4365 -13026:2:1935 -13027:0:4365 -13028:2:1936 -13029:0:4365 -13030:2:2129 -13031:0:4365 -13032:2:2130 -13033:0:4365 -13034:2:2134 -13035:0:4365 -13036:3:3757 -13037:0:4365 -13038:2:2136 -13039:0:4365 -13040:3:3758 -13041:0:4365 -13042:2:2137 -13043:2:2141 -13044:2:2142 -13045:2:2150 -13046:2:2151 -13047:2:2155 -13048:2:2156 -13049:2:2150 -13050:2:2151 -13051:2:2155 -13052:2:2156 -13053:2:2164 -13054:2:2169 -13055:2:2173 -13056:2:2174 -13057:2:2181 -13058:2:2182 -13059:2:2193 -13060:2:2194 -13061:2:2195 -13062:2:2193 -13063:2:2194 -13064:2:2195 -13065:2:2206 -13066:2:2211 -13067:2:2212 -13068:0:4365 -13069:2:2224 -13070:0:4365 -13071:3:3757 -13072:0:4365 -13073:2:2226 -13074:0:4365 -13075:3:3758 -13076:0:4365 -13077:2:1936 -13078:0:4365 -13079:2:2129 -13080:0:4365 -13081:2:2130 -13082:0:4365 -13083:2:2134 -13084:0:4365 -13085:3:3757 -13086:0:4365 -13087:2:2136 -13088:0:4365 -13089:3:3758 -13090:0:4365 -13091:2:2137 -13092:2:2141 -13093:2:2142 -13094:2:2150 -13095:2:2151 -13096:2:2155 -13097:2:2156 -13098:2:2150 -13099:2:2151 -13100:2:2152 -13101:2:2164 -13102:2:2169 -13103:2:2173 -13104:2:2174 -13105:2:2181 -13106:2:2182 -13107:2:2193 -13108:2:2194 -13109:2:2195 -13110:2:2193 -13111:2:2194 -13112:2:2195 -13113:2:2206 -13114:2:2211 -13115:2:2212 -13116:0:4365 -13117:2:2224 -13118:0:4365 -13119:3:3757 -13120:0:4365 -13121:2:2226 -13122:0:4365 -13123:3:3758 -13124:0:4365 -13125:2:2230 -13126:0:4365 -13127:3:3757 -13128:0:4365 -13129:2:2235 -13130:2:2239 -13131:2:2240 -13132:2:2248 -13133:2:2249 -13134:2:2253 -13135:2:2254 -13136:2:2248 -13137:2:2249 -13138:2:2250 -13139:2:2262 -13140:2:2267 -13141:2:2271 -13142:2:2272 -13143:2:2279 -13144:2:2280 -13145:2:2291 -13146:2:2292 -13147:2:2293 -13148:2:2291 -13149:2:2292 -13150:2:2293 -13151:2:2304 -13152:2:2309 -13153:2:2310 -13154:0:4365 -13155:3:3758 -13156:0:4365 -13157:2:2322 -13158:0:4365 -13159:2:1169 -13160:0:4365 -13161:3:3757 -13162:0:4365 -13163:2:1170 -13164:0:4365 -13165:3:3758 -13166:0:4365 -13167:3:3759 -13168:0:4365 -13169:3:3972 -13170:0:4365 -13171:3:3980 -13172:0:4365 -13173:3:3981 -13174:3:3985 -13175:3:3986 -13176:3:3994 -13177:3:3995 -13178:3:3999 -13179:3:4000 -13180:3:3994 -13181:3:3995 -13182:3:3999 -13183:3:4000 -13184:3:4008 -13185:3:4013 -13186:3:4017 -13187:3:4018 -13188:3:4025 -13189:3:4026 -13190:3:4037 -13191:3:4038 -13192:3:4039 -13193:3:4037 -13194:3:4038 -13195:3:4039 -13196:3:4050 -13197:3:4055 -13198:3:4056 -13199:0:4365 -13200:3:4068 -13201:0:4365 -13202:3:4069 -13203:0:4365 -13204:2:1173 -13205:0:4365 -13206:3:4070 -13207:0:4365 -13208:2:1179 -13209:0:4365 -13210:2:1180 -13211:0:4365 -13212:3:4069 -13213:0:4365 -13214:2:1181 -13215:2:1185 -13216:2:1186 -13217:2:1194 -13218:2:1195 -13219:2:1199 -13220:2:1200 -13221:2:1194 -13222:2:1195 -13223:2:1199 -13224:2:1200 -13225:2:1208 -13226:2:1213 -13227:2:1217 -13228:2:1218 -13229:2:1225 -13230:2:1226 -13231:2:1237 -13232:2:1238 -13233:2:1239 -13234:2:1237 -13235:2:1238 -13236:2:1239 -13237:2:1250 -13238:2:1255 -13239:2:1256 -13240:0:4365 -13241:3:4070 -13242:0:4365 -13243:2:1268 -13244:0:4365 -13245:3:4069 -13246:0:4365 -13247:2:1270 -13248:0:4365 -13249:3:4070 -13250:0:4365 -13251:2:1271 -13252:2:1275 -13253:2:1276 -13254:2:1284 -13255:2:1285 -13256:2:1289 -13257:2:1290 -13258:2:1284 -13259:2:1285 -13260:2:1289 -13261:2:1290 -13262:2:1298 -13263:2:1303 -13264:2:1307 -13265:2:1308 -13266:2:1315 -13267:2:1316 -13268:2:1327 -13269:2:1328 -13270:2:1329 -13271:2:1327 -13272:2:1328 -13273:2:1329 -13274:2:1340 -13275:2:1345 -13276:2:1346 -13277:0:4365 -13278:2:1358 -13279:0:4365 -13280:2:1360 -13281:0:4365 -13282:3:4069 -13283:0:4365 -13284:2:1361 -13285:0:4365 -13286:3:4070 -13287:0:4365 -13288:2:1362 -13289:2:1366 -13290:2:1367 -13291:2:1375 -13292:2:1376 -13293:2:1380 -13294:2:1381 -13295:2:1375 -13296:2:1376 -13297:2:1380 -13298:2:1381 -13299:2:1389 -13300:2:1394 -13301:2:1398 -13302:2:1399 -13303:2:1406 -13304:2:1407 -13305:2:1418 -13306:2:1419 -13307:2:1420 -13308:2:1418 -13309:2:1419 -13310:2:1420 -13311:2:1431 -13312:2:1436 -13313:2:1437 -13314:0:4365 -13315:2:1449 -13316:0:4365 -13317:3:4069 -13318:0:4365 -13319:2:1451 -13320:0:4365 -13321:3:4070 -13322:0:4365 -13323:2:1652 -13324:0:4365 -13325:2:1653 -13326:0:4365 -13327:2:1657 -13328:0:4365 -13329:2:1180 -13330:0:4365 -13331:3:4069 -13332:0:4365 -13333:2:1181 -13334:2:1185 -13335:2:1186 -13336:2:1194 -13337:2:1195 -13338:2:1199 -13339:2:1200 -13340:2:1194 -13341:2:1195 -13342:2:1196 -13343:2:1208 -13344:2:1213 -13345:2:1217 -13346:2:1218 -13347:2:1225 -13348:2:1226 -13349:2:1237 -13350:2:1238 -13351:2:1239 -13352:2:1237 -13353:2:1238 -13354:2:1239 -13355:2:1250 -13356:2:1255 -13357:2:1256 -13358:0:4365 -13359:3:4070 -13360:0:4365 -13361:2:1268 -13362:0:4365 -13363:3:4069 -13364:0:4365 -13365:2:1270 -13366:0:4365 -13367:3:4070 -13368:0:4365 -13369:2:1271 -13370:2:1275 -13371:2:1276 -13372:2:1284 -13373:2:1285 -13374:2:1289 -13375:2:1290 -13376:2:1284 -13377:2:1285 -13378:2:1289 -13379:2:1290 -13380:2:1298 -13381:2:1303 -13382:2:1307 -13383:2:1308 -13384:2:1315 -13385:2:1316 -13386:2:1327 -13387:2:1328 -13388:2:1329 -13389:2:1327 -13390:2:1328 -13391:2:1329 -13392:2:1340 -13393:2:1345 -13394:2:1346 -13395:0:4365 -13396:2:1358 -13397:0:4365 -13398:2:1454 -13399:0:4365 -13400:3:4069 -13401:0:4365 -13402:2:1455 -13403:0:4365 -13404:3:4070 -13405:0:4365 -13406:2:1652 -13407:0:4365 -13408:2:1653 -13409:0:4365 -13410:2:1657 -13411:0:4365 -13412:2:1660 -13413:0:4365 -13414:3:4069 -13415:0:4365 -13416:2:1665 -13417:2:1669 -13418:2:1670 -13419:2:1678 -13420:2:1679 -13421:2:1683 -13422:2:1684 -13423:2:1678 -13424:2:1679 -13425:2:1680 -13426:2:1692 -13427:2:1697 -13428:2:1701 -13429:2:1702 -13430:2:1709 -13431:2:1710 -13432:2:1721 -13433:2:1722 -13434:2:1723 -13435:2:1721 -13436:2:1722 -13437:2:1723 -13438:2:1734 -13439:2:1739 -13440:2:1740 -13441:0:4365 -13442:3:4070 -13443:0:4365 -13444:2:1752 -13445:0:4365 -13446:3:4069 -13447:0:4365 -13448:2:1754 -13449:0:4365 -13450:3:4070 -13451:0:4365 -13452:2:1755 -13453:2:1759 -13454:2:1760 -13455:2:1768 -13456:2:1769 -13457:2:1773 -13458:2:1774 -13459:2:1768 -13460:2:1769 -13461:2:1773 -13462:2:1774 -13463:2:1782 -13464:2:1787 -13465:2:1791 -13466:2:1792 -13467:2:1799 -13468:2:1800 -13469:2:1811 -13470:2:1812 -13471:2:1813 -13472:2:1811 -13473:2:1812 -13474:2:1813 -13475:2:1824 -13476:2:1829 -13477:2:1830 -13478:0:4365 -13479:2:1842 -13480:0:4365 -13481:3:4069 -13482:0:4365 -13483:2:1844 -13484:0:4365 -13485:3:4070 -13486:0:4365 -13487:2:1845 -13488:2:1849 -13489:2:1850 -13490:2:1858 -13491:2:1859 -13492:2:1863 -13493:2:1864 -13494:2:1858 -13495:2:1859 -13496:2:1863 -13497:2:1864 -13498:2:1872 -13499:2:1877 -13500:2:1881 -13501:2:1882 -13502:2:1889 -13503:2:1890 -13504:2:1901 -13505:2:1902 -13506:2:1903 -13507:2:1901 -13508:2:1902 -13509:2:1903 -13510:2:1914 -13511:2:1919 -13512:2:1920 -13513:0:4365 -13514:2:1932 -13515:0:4365 -13516:3:4069 -13517:0:4365 -13518:2:1934 -13519:0:4365 -13520:3:4070 -13521:0:4365 -13522:2:1935 -13523:0:4365 -13524:2:1936 -13525:0:4365 -13526:2:2129 -13527:0:4365 -13528:2:2130 -13529:0:4365 -13530:2:2134 -13531:0:4365 -13532:3:4069 -13533:0:4365 -13534:2:2136 -13535:0:4365 -13536:3:4070 -13537:0:4365 -13538:2:2137 -13539:2:2141 -13540:2:2142 -13541:2:2150 -13542:2:2151 -13543:2:2155 -13544:2:2156 -13545:2:2150 -13546:2:2151 -13547:2:2155 -13548:2:2156 -13549:2:2164 -13550:2:2169 -13551:2:2173 -13552:2:2174 -13553:2:2181 -13554:2:2182 -13555:2:2193 -13556:2:2194 -13557:2:2195 -13558:2:2193 -13559:2:2194 -13560:2:2195 -13561:2:2206 -13562:2:2211 -13563:2:2212 -13564:0:4365 -13565:2:2224 -13566:0:4365 -13567:3:4069 -13568:0:4365 -13569:2:2226 -13570:0:4365 -13571:3:4070 -13572:0:4365 -13573:2:1936 -13574:0:4365 -13575:2:2129 -13576:0:4365 -13577:2:2130 -13578:0:4365 -13579:2:2134 -13580:0:4365 -13581:3:4069 -13582:0:4365 -13583:2:2136 -13584:0:4365 -13585:3:4070 -13586:0:4365 -13587:2:2137 -13588:2:2141 -13589:2:2142 -13590:2:2150 -13591:2:2151 -13592:2:2155 -13593:2:2156 -13594:2:2150 -13595:2:2151 -13596:2:2152 -13597:2:2164 -13598:2:2169 -13599:2:2173 -13600:2:2174 -13601:2:2181 -13602:2:2182 -13603:2:2193 -13604:2:2194 -13605:2:2195 -13606:2:2193 -13607:2:2194 -13608:2:2195 -13609:2:2206 -13610:2:2211 -13611:2:2212 -13612:0:4365 -13613:2:2224 -13614:0:4365 -13615:3:4069 -13616:0:4365 -13617:2:2226 -13618:0:4365 -13619:3:4070 -13620:0:4365 -13621:2:2230 -13622:0:4365 -13623:3:4069 -13624:0:4365 -13625:2:2235 -13626:2:2239 -13627:2:2240 -13628:2:2248 -13629:2:2249 -13630:2:2253 -13631:2:2254 -13632:2:2248 -13633:2:2249 -13634:2:2250 -13635:2:2262 -13636:2:2267 -13637:2:2271 -13638:2:2272 -13639:2:2279 -13640:2:2280 -13641:2:2291 -13642:2:2292 -13643:2:2293 -13644:2:2291 -13645:2:2292 -13646:2:2293 -13647:2:2304 -13648:2:2309 -13649:2:2310 -13650:0:4365 -13651:3:4070 -13652:0:4365 -13653:2:2322 -13654:0:4365 -13655:2:1169 -13656:0:4365 -13657:3:4069 -13658:0:4365 -13659:2:1170 -13660:0:4365 -13661:3:4070 -13662:0:4365 -13663:3:4071 -13664:0:4365 -13665:3:4081 -13666:0:4365 -13667:3:3666 -13668:0:4365 -13669:3:3667 -13670:0:4365 -13671:3:3668 -13672:0:4365 -13673:3:3669 -13674:3:3673 -13675:3:3674 -13676:3:3682 -13677:3:3683 -13678:3:3687 -13679:3:3688 -13680:3:3682 -13681:3:3683 -13682:3:3687 -13683:3:3688 -13684:3:3696 -13685:3:3701 -13686:3:3705 -13687:3:3706 -13688:3:3713 -13689:3:3714 -13690:3:3725 -13691:3:3726 -13692:3:3727 -13693:3:3725 -13694:3:3726 -13695:3:3727 -13696:3:3738 -13697:3:3743 -13698:3:3744 -13699:0:4365 -13700:3:3756 -13701:0:4365 -13702:3:3757 -13703:0:4365 -13704:2:1173 -13705:0:4365 -13706:3:3758 -13707:0:4365 -13708:2:1179 -13709:0:4365 -13710:2:1180 -13711:0:4365 -13712:3:3757 -13713:0:4365 -13714:2:1181 -13715:2:1185 -13716:2:1186 -13717:2:1194 -13718:2:1195 -13719:2:1199 -13720:2:1200 -13721:2:1194 -13722:2:1195 -13723:2:1199 -13724:2:1200 -13725:2:1208 -13726:2:1213 -13727:2:1217 -13728:2:1218 -13729:2:1225 -13730:2:1226 -13731:2:1237 -13732:2:1238 -13733:2:1239 -13734:2:1237 -13735:2:1238 -13736:2:1239 -13737:2:1250 -13738:2:1255 -13739:2:1256 -13740:0:4365 -13741:3:3758 -13742:0:4365 -13743:2:1268 -13744:0:4365 -13745:3:3757 -13746:0:4365 -13747:2:1270 -13748:0:4365 -13749:3:3758 -13750:0:4365 -13751:2:1271 -13752:2:1275 -13753:2:1276 -13754:2:1284 -13755:2:1285 -13756:2:1289 -13757:2:1290 -13758:2:1284 -13759:2:1285 -13760:2:1289 -13761:2:1290 -13762:2:1298 -13763:2:1303 -13764:2:1307 -13765:2:1308 -13766:2:1315 -13767:2:1316 -13768:2:1327 -13769:2:1328 -13770:2:1329 -13771:2:1327 -13772:2:1328 -13773:2:1329 -13774:2:1340 -13775:2:1345 -13776:2:1346 -13777:0:4365 -13778:2:1358 -13779:0:4365 -13780:2:1360 -13781:0:4365 -13782:3:3757 -13783:0:4365 -13784:2:1361 -13785:0:4365 -13786:3:3758 -13787:0:4365 -13788:2:1362 -13789:2:1366 -13790:2:1367 -13791:2:1375 -13792:2:1376 -13793:2:1380 -13794:2:1381 -13795:2:1375 -13796:2:1376 -13797:2:1380 -13798:2:1381 -13799:2:1389 -13800:2:1394 -13801:2:1398 -13802:2:1399 -13803:2:1406 -13804:2:1407 -13805:2:1418 -13806:2:1419 -13807:2:1420 -13808:2:1418 -13809:2:1419 -13810:2:1420 -13811:2:1431 -13812:2:1436 -13813:2:1437 -13814:0:4365 -13815:2:1449 -13816:0:4365 -13817:3:3757 -13818:0:4365 -13819:2:1451 -13820:0:4365 -13821:3:3758 -13822:0:4365 -13823:2:1652 -13824:0:4365 -13825:2:1653 -13826:0:4365 -13827:2:1657 -13828:0:4365 -13829:2:1180 -13830:0:4365 -13831:3:3757 -13832:0:4365 -13833:2:1181 -13834:2:1185 -13835:2:1186 -13836:2:1194 -13837:2:1195 -13838:2:1199 -13839:2:1200 -13840:2:1194 -13841:2:1195 -13842:2:1196 -13843:2:1208 -13844:2:1213 -13845:2:1217 -13846:2:1218 -13847:2:1225 -13848:2:1226 -13849:2:1237 -13850:2:1238 -13851:2:1239 -13852:2:1237 -13853:2:1238 -13854:2:1239 -13855:2:1250 -13856:2:1255 -13857:2:1256 -13858:0:4365 -13859:3:3758 -13860:0:4365 -13861:2:1268 -13862:0:4365 -13863:3:3757 -13864:0:4365 -13865:2:1270 -13866:0:4365 -13867:3:3758 -13868:0:4365 -13869:2:1271 -13870:2:1275 -13871:2:1276 -13872:2:1284 -13873:2:1285 -13874:2:1289 -13875:2:1290 -13876:2:1284 -13877:2:1285 -13878:2:1289 -13879:2:1290 -13880:2:1298 -13881:2:1303 -13882:2:1307 -13883:2:1308 -13884:2:1315 -13885:2:1316 -13886:2:1327 -13887:2:1328 -13888:2:1329 -13889:2:1327 -13890:2:1328 -13891:2:1329 -13892:2:1340 -13893:2:1345 -13894:2:1346 -13895:0:4365 -13896:2:1358 -13897:0:4365 -13898:2:1454 -13899:0:4365 -13900:3:3757 -13901:0:4365 -13902:2:1455 -13903:0:4365 -13904:3:3758 -13905:0:4365 -13906:2:1652 -13907:0:4365 -13908:2:1653 -13909:0:4365 -13910:2:1657 -13911:0:4365 -13912:2:1660 -13913:0:4365 -13914:3:3757 -13915:0:4365 -13916:2:1665 -13917:2:1669 -13918:2:1670 -13919:2:1678 -13920:2:1679 -13921:2:1683 -13922:2:1684 -13923:2:1678 -13924:2:1679 -13925:2:1680 -13926:2:1692 -13927:2:1697 -13928:2:1701 -13929:2:1702 -13930:2:1709 -13931:2:1710 -13932:2:1721 -13933:2:1722 -13934:2:1723 -13935:2:1721 -13936:2:1722 -13937:2:1723 -13938:2:1734 -13939:2:1739 -13940:2:1740 -13941:0:4365 -13942:3:3758 -13943:0:4365 -13944:2:1752 -13945:0:4365 -13946:3:3757 -13947:0:4365 -13948:2:1754 -13949:0:4365 -13950:3:3758 -13951:0:4365 -13952:2:1755 -13953:2:1759 -13954:2:1760 -13955:2:1768 -13956:2:1769 -13957:2:1773 -13958:2:1774 -13959:2:1768 -13960:2:1769 -13961:2:1773 -13962:2:1774 -13963:2:1782 -13964:2:1787 -13965:2:1791 -13966:2:1792 -13967:2:1799 -13968:2:1800 -13969:2:1811 -13970:2:1812 -13971:2:1813 -13972:2:1811 -13973:2:1812 -13974:2:1813 -13975:2:1824 -13976:2:1829 -13977:2:1830 -13978:0:4365 -13979:2:1842 -13980:0:4365 -13981:3:3757 -13982:0:4365 -13983:2:1844 -13984:0:4365 -13985:3:3758 -13986:0:4365 -13987:2:1845 -13988:2:1849 -13989:2:1850 -13990:2:1858 -13991:2:1859 -13992:2:1863 -13993:2:1864 -13994:2:1858 -13995:2:1859 -13996:2:1863 -13997:2:1864 -13998:2:1872 -13999:2:1877 -14000:2:1881 -14001:2:1882 -14002:2:1889 -14003:2:1890 -14004:2:1901 -14005:2:1902 -14006:2:1903 -14007:2:1901 -14008:2:1902 -14009:2:1903 -14010:2:1914 -14011:2:1919 -14012:2:1920 -14013:0:4365 -14014:2:1932 -14015:0:4365 -14016:3:3757 -14017:0:4365 -14018:2:1934 -14019:0:4365 -14020:3:3758 -14021:0:4365 -14022:2:1935 -14023:0:4365 -14024:2:1936 -14025:0:4365 -14026:2:2129 -14027:0:4365 -14028:2:2130 -14029:0:4365 -14030:2:2134 -14031:0:4365 -14032:3:3757 -14033:0:4365 -14034:2:2136 -14035:0:4365 -14036:3:3758 -14037:0:4365 -14038:2:2137 -14039:2:2141 -14040:2:2142 -14041:2:2150 -14042:2:2151 -14043:2:2155 -14044:2:2156 -14045:2:2150 -14046:2:2151 -14047:2:2155 -14048:2:2156 -14049:2:2164 -14050:2:2169 -14051:2:2173 -14052:2:2174 -14053:2:2181 -14054:2:2182 -14055:2:2193 -14056:2:2194 -14057:2:2195 -14058:2:2193 -14059:2:2194 -14060:2:2195 -14061:2:2206 -14062:2:2211 -14063:2:2212 -14064:0:4365 -14065:2:2224 -14066:0:4365 -14067:3:3757 -14068:0:4365 -14069:2:2226 -14070:0:4365 -14071:3:3758 -14072:0:4365 -14073:2:1936 -14074:0:4365 -14075:2:2129 -14076:0:4365 -14077:2:2130 -14078:0:4365 -14079:2:2134 -14080:0:4365 -14081:3:3757 -14082:0:4365 -14083:2:2136 -14084:0:4365 -14085:3:3758 -14086:0:4365 -14087:2:2137 -14088:2:2141 -14089:2:2142 -14090:2:2150 -14091:2:2151 -14092:2:2155 -14093:2:2156 -14094:2:2150 -14095:2:2151 -14096:2:2152 -14097:2:2164 -14098:2:2169 -14099:2:2173 -14100:2:2174 -14101:2:2181 -14102:2:2182 -14103:2:2193 -14104:2:2194 -14105:2:2195 -14106:2:2193 -14107:2:2194 -14108:2:2195 -14109:2:2206 -14110:2:2211 -14111:2:2212 -14112:0:4365 -14113:2:2224 -14114:0:4365 -14115:3:3757 -14116:0:4365 -14117:2:2226 -14118:0:4365 -14119:3:3758 -14120:0:4365 -14121:2:2230 -14122:0:4365 -14123:3:3757 -14124:0:4365 -14125:2:2235 -14126:2:2239 -14127:2:2240 -14128:2:2248 -14129:2:2249 -14130:2:2253 -14131:2:2254 -14132:2:2248 -14133:2:2249 -14134:2:2250 -14135:2:2262 -14136:2:2267 -14137:2:2271 -14138:2:2272 -14139:2:2279 -14140:2:2280 -14141:2:2291 -14142:2:2292 -14143:2:2293 -14144:2:2291 -14145:2:2292 -14146:2:2293 -14147:2:2304 -14148:2:2309 -14149:2:2310 -14150:0:4365 -14151:3:3758 -14152:0:4365 -14153:2:2322 -14154:0:4365 -14155:2:1169 -14156:0:4365 -14157:3:3757 -14158:0:4365 -14159:2:1170 -14160:0:4365 -14161:3:3758 -14162:0:4365 -14163:3:3759 -14164:0:4365 -14165:3:3972 -14166:0:4365 -14167:3:4077 -14168:0:4365 -14169:3:4078 -14170:0:4365 -14171:3:4082 -14172:0:4365 -14173:3:4088 -14174:0:4365 -14175:3:4092 -14176:3:4093 -14177:3:4097 -14178:3:4101 -14179:3:4102 -14180:3:4097 -14181:3:4101 -14182:3:4102 -14183:3:4106 -14184:3:4114 -14185:3:4115 -14186:3:4120 -14187:3:4127 -14188:3:4128 -14189:3:4127 -14190:3:4128 -14191:3:4135 -14192:3:4140 -14193:0:4365 -14194:3:4151 -14195:0:4365 -14196:3:4155 -14197:3:4156 -14198:3:4160 -14199:3:4164 -14200:3:4165 -14201:3:4160 -14202:3:4164 -14203:3:4165 -14204:3:4169 -14205:3:4177 -14206:3:4178 -14207:3:4183 -14208:3:4190 -14209:3:4191 -14210:3:4190 -14211:3:4191 -14212:3:4198 -14213:3:4203 -14214:0:4365 -14215:3:4151 -14216:0:4365 -14217:3:4155 -14218:3:4156 -14219:3:4160 -14220:3:4164 -14221:3:4165 -14222:3:4160 -14223:3:4164 -14224:3:4165 -14225:3:4169 -14226:3:4177 -14227:3:4178 -14228:3:4183 -14229:3:4190 -14230:3:4191 -14231:3:4190 -14232:3:4191 -14233:3:4198 -14234:3:4203 -14235:0:4365 -14236:3:4214 -14237:0:4365 -14238:3:4222 -14239:3:4223 -14240:3:4227 -14241:3:4231 -14242:3:4232 -14243:3:4227 -14244:3:4231 -14245:3:4232 -14246:3:4236 -14247:3:4244 -14248:3:4245 -14249:3:4250 -14250:3:4257 -14251:3:4258 -14252:3:4257 -14253:3:4258 -14254:3:4265 -14255:3:4270 -14256:0:4365 -14257:3:4285 -14258:0:4365 -14259:3:4286 -14260:0:4365 -14261:2:1173 -14262:0:4365 -14263:3:4287 -14264:0:4365 -14265:2:1179 -14266:0:4365 -14267:2:1180 -14268:0:4365 -14269:3:4286 -14270:0:4365 -14271:2:1181 -14272:2:1185 -14273:2:1186 -14274:2:1194 -14275:2:1195 -14276:2:1199 -14277:2:1200 -14278:2:1194 -14279:2:1195 -14280:2:1199 -14281:2:1200 -14282:2:1208 -14283:2:1213 -14284:2:1217 -14285:2:1218 -14286:2:1225 -14287:2:1226 -14288:2:1237 -14289:2:1238 -14290:2:1239 -14291:2:1237 -14292:2:1238 -14293:2:1239 -14294:2:1250 -14295:2:1255 -14296:2:1256 -14297:0:4365 -14298:3:4287 -14299:0:4365 -14300:2:1268 -14301:0:4365 -14302:3:4286 -14303:0:4365 -14304:2:1270 -14305:0:4365 -14306:3:4287 -14307:0:4365 -14308:2:1271 -14309:2:1275 -14310:2:1276 -14311:2:1284 -14312:2:1285 -14313:2:1289 -14314:2:1290 -14315:2:1284 -14316:2:1285 -14317:2:1289 -14318:2:1290 -14319:2:1298 -14320:2:1303 -14321:2:1307 -14322:2:1308 -14323:2:1315 -14324:2:1316 -14325:2:1327 -14326:2:1328 -14327:2:1329 -14328:2:1327 -14329:2:1328 -14330:2:1329 -14331:2:1340 -14332:2:1345 -14333:2:1346 -14334:0:4365 -14335:2:1358 -14336:0:4365 -14337:2:1360 -14338:0:4365 -14339:3:4286 -14340:0:4365 -14341:2:1361 -14342:0:4365 -14343:3:4287 -14344:0:4365 -14345:2:1362 -14346:2:1366 -14347:2:1367 -14348:2:1375 -14349:2:1376 -14350:2:1380 -14351:2:1381 -14352:2:1375 -14353:2:1376 -14354:2:1380 -14355:2:1381 -14356:2:1389 -14357:2:1394 -14358:2:1398 -14359:2:1399 -14360:2:1406 -14361:2:1407 -14362:2:1418 -14363:2:1419 -14364:2:1420 -14365:2:1418 -14366:2:1419 -14367:2:1420 -14368:2:1431 -14369:2:1436 -14370:2:1437 -14371:0:4365 -14372:2:1449 -14373:0:4365 -14374:3:4286 -14375:0:4365 -14376:2:1451 -14377:0:4365 -14378:3:4287 -14379:0:4365 -14380:2:1652 -14381:0:4365 -14382:2:1653 -14383:0:4365 -14384:2:1657 -14385:0:4365 -14386:2:1180 -14387:0:4365 -14388:3:4286 -14389:0:4365 -14390:2:1181 -14391:2:1185 -14392:2:1186 -14393:2:1194 -14394:2:1195 -14395:2:1199 -14396:2:1200 -14397:2:1194 -14398:2:1195 -14399:2:1196 -14400:2:1208 -14401:2:1213 -14402:2:1217 -14403:2:1218 -14404:2:1225 -14405:2:1226 -14406:2:1237 -14407:2:1238 -14408:2:1239 -14409:2:1237 -14410:2:1238 -14411:2:1239 -14412:2:1250 -14413:2:1255 -14414:2:1256 -14415:0:4365 -14416:3:4287 -14417:0:4365 -14418:2:1268 -14419:0:4365 -14420:3:4286 -14421:0:4365 -14422:2:1270 -14423:0:4365 -14424:3:4287 -14425:0:4365 -14426:2:1271 -14427:2:1275 -14428:2:1276 -14429:2:1284 -14430:2:1285 -14431:2:1289 -14432:2:1290 -14433:2:1284 -14434:2:1285 -14435:2:1289 -14436:2:1290 -14437:2:1298 -14438:2:1303 -14439:2:1307 -14440:2:1308 -14441:2:1315 -14442:2:1316 -14443:2:1327 -14444:2:1328 -14445:2:1329 -14446:2:1327 -14447:2:1328 -14448:2:1329 -14449:2:1340 -14450:2:1345 -14451:2:1346 -14452:0:4365 -14453:2:1358 -14454:0:4365 -14455:2:1454 -14456:0:4365 -14457:3:4286 -14458:0:4365 -14459:2:1455 -14460:0:4365 -14461:3:4287 -14462:0:4365 -14463:2:1652 -14464:0:4365 -14465:2:1653 -14466:0:4365 -14467:2:1657 -14468:0:4365 -14469:2:1660 -14470:0:4365 -14471:3:4286 -14472:0:4365 -14473:2:1665 -14474:2:1669 -14475:2:1670 -14476:2:1678 -14477:2:1679 -14478:2:1683 -14479:2:1684 -14480:2:1678 -14481:2:1679 -14482:2:1680 -14483:2:1692 -14484:2:1697 -14485:2:1701 -14486:2:1702 -14487:2:1709 -14488:2:1710 -14489:2:1721 -14490:2:1722 -14491:2:1723 -14492:2:1721 -14493:2:1722 -14494:2:1723 -14495:2:1734 -14496:2:1739 -14497:2:1740 -14498:0:4365 -14499:3:4287 -14500:0:4365 -14501:2:1752 -14502:0:4365 -14503:3:4286 -14504:0:4365 -14505:2:1754 -14506:0:4365 -14507:3:4287 -14508:0:4365 -14509:2:1755 -14510:2:1759 -14511:2:1760 -14512:2:1768 -14513:2:1769 -14514:2:1773 -14515:2:1774 -14516:2:1768 -14517:2:1769 -14518:2:1773 -14519:2:1774 -14520:2:1782 -14521:2:1787 -14522:2:1791 -14523:2:1792 -14524:2:1799 -14525:2:1800 -14526:2:1811 -14527:2:1812 -14528:2:1813 -14529:2:1811 -14530:2:1812 -14531:2:1813 -14532:2:1824 -14533:2:1829 -14534:2:1830 -14535:0:4365 -14536:2:1842 -14537:0:4365 -14538:3:4286 -14539:0:4365 -14540:2:1844 -14541:0:4365 -14542:3:4287 -14543:0:4365 -14544:2:1845 -14545:2:1849 -14546:2:1850 -14547:2:1858 -14548:2:1859 -14549:2:1863 -14550:2:1864 -14551:2:1858 -14552:2:1859 -14553:2:1863 -14554:2:1864 -14555:2:1872 -14556:2:1877 -14557:2:1881 -14558:2:1882 -14559:2:1889 -14560:2:1890 -14561:2:1901 -14562:2:1902 -14563:2:1903 -14564:2:1901 -14565:2:1902 -14566:2:1903 -14567:2:1914 -14568:2:1919 -14569:2:1920 -14570:0:4365 -14571:2:1932 -14572:0:4365 -14573:3:4286 -14574:0:4365 -14575:2:1934 -14576:0:4365 -14577:3:4287 -14578:0:4365 -14579:2:1935 -14580:0:4365 -14581:2:1936 -14582:0:4365 -14583:2:2129 -14584:0:4365 -14585:2:2130 -14586:0:4365 -14587:2:2134 -14588:0:4365 -14589:3:4286 -14590:0:4365 -14591:2:2136 -14592:0:4365 -14593:3:4287 -14594:0:4365 -14595:2:2137 -14596:2:2141 -14597:2:2142 -14598:2:2150 -14599:2:2151 -14600:2:2155 -14601:2:2156 -14602:2:2150 -14603:2:2151 -14604:2:2155 -14605:2:2156 -14606:2:2164 -14607:2:2169 -14608:2:2173 -14609:2:2174 -14610:2:2181 -14611:2:2182 -14612:2:2193 -14613:2:2194 -14614:2:2195 -14615:2:2193 -14616:2:2194 -14617:2:2195 -14618:2:2206 -14619:2:2211 -14620:2:2212 -14621:0:4365 -14622:2:2224 -14623:0:4365 -14624:3:4286 -14625:0:4365 -14626:2:2226 -14627:0:4365 -14628:3:4287 -14629:0:4365 -14630:2:1936 -14631:0:4365 -14632:2:2129 -14633:0:4365 -14634:2:2130 -14635:0:4365 -14636:2:2134 -14637:0:4365 -14638:3:4286 -14639:0:4365 -14640:2:2136 -14641:0:4365 -14642:3:4287 -14643:0:4365 -14644:2:2137 -14645:2:2141 -14646:2:2142 -14647:2:2150 -14648:2:2151 -14649:2:2155 -14650:2:2156 -14651:2:2150 -14652:2:2151 -14653:2:2152 -14654:2:2164 -14655:2:2169 -14656:2:2173 -14657:2:2174 -14658:2:2181 -14659:2:2182 -14660:2:2193 -14661:2:2194 -14662:2:2195 -14663:2:2193 -14664:2:2194 -14665:2:2195 -14666:2:2206 -14667:2:2211 -14668:2:2212 -14669:0:4365 -14670:2:2224 -14671:0:4365 -14672:3:4286 -14673:0:4365 -14674:2:2226 -14675:0:4365 -14676:3:4287 -14677:0:4365 -14678:2:2230 -14679:0:4365 -14680:3:4286 -14681:0:4365 -14682:2:2235 -14683:2:2239 -14684:2:2240 -14685:2:2248 -14686:2:2249 -14687:2:2253 -14688:2:2254 -14689:2:2248 -14690:2:2249 -14691:2:2250 -14692:2:2262 -14693:2:2267 -14694:2:2271 -14695:2:2272 -14696:2:2279 -14697:2:2280 -14698:2:2291 -14699:2:2292 -14700:2:2293 -14701:2:2291 -14702:2:2292 -14703:2:2293 -14704:2:2304 -14705:2:2309 -14706:2:2310 -14707:0:4365 -14708:3:4287 -14709:0:4365 -14710:2:2322 -14711:0:4365 -14712:2:1169 -14713:0:4365 -14714:3:4286 -14715:0:4365 -14716:2:1170 -14717:0:4365 -14718:3:4287 -14719:0:4365 -14720:3:4288 -14721:0:4365 -14722:3:4294 -14723:0:4365 -14724:3:4295 -14725:0:4365 -14726:3:2338 -14727:0:4365 -14728:3:2339 -14729:3:2343 -14730:3:2344 -14731:3:2352 -14732:3:2353 -14733:3:2357 -14734:3:2358 -14735:3:2352 -14736:3:2353 -14737:3:2357 -14738:3:2358 -14739:3:2366 -14740:3:2371 -14741:3:2375 -14742:3:2376 -14743:3:2383 -14744:3:2384 -14745:3:2395 -14746:3:2396 -14747:3:2397 -14748:3:2395 -14749:3:2396 -14750:3:2397 -14751:3:2408 -14752:3:2413 -14753:3:2414 -14754:0:4365 -14755:3:2426 -14756:0:4365 -14757:3:2427 -14758:0:4365 -14759:2:1173 -14760:0:4365 -14761:3:2428 -14762:0:4365 -14763:2:1179 -14764:0:4365 -14765:2:1180 -14766:0:4365 -14767:3:2427 -14768:0:4365 -14769:2:1181 -14770:2:1185 -14771:2:1186 -14772:2:1194 -14773:2:1195 -14774:2:1199 -14775:2:1200 -14776:2:1194 -14777:2:1195 -14778:2:1199 -14779:2:1200 -14780:2:1208 -14781:2:1213 -14782:2:1217 -14783:2:1218 -14784:2:1225 -14785:2:1226 -14786:2:1237 -14787:2:1238 -14788:2:1239 -14789:2:1237 -14790:2:1238 -14791:2:1239 -14792:2:1250 -14793:2:1255 -14794:2:1256 -14795:0:4365 -14796:3:2428 -14797:0:4365 -14798:2:1268 -14799:0:4365 -14800:3:2427 -14801:0:4365 -14802:2:1270 -14803:0:4365 -14804:3:2428 -14805:0:4365 -14806:2:1271 -14807:2:1275 -14808:2:1276 -14809:2:1284 -14810:2:1285 -14811:2:1289 -14812:2:1290 -14813:2:1284 -14814:2:1285 -14815:2:1289 -14816:2:1290 -14817:2:1298 -14818:2:1303 -14819:2:1307 -14820:2:1308 -14821:2:1315 -14822:2:1316 -14823:2:1327 -14824:2:1328 -14825:2:1329 -14826:2:1327 -14827:2:1328 -14828:2:1329 -14829:2:1340 -14830:2:1345 -14831:2:1346 -14832:0:4365 -14833:2:1358 -14834:0:4365 -14835:2:1360 -14836:0:4365 -14837:3:2427 -14838:0:4365 -14839:2:1361 -14840:0:4365 -14841:3:2428 -14842:0:4365 -14843:2:1362 -14844:2:1366 -14845:2:1367 -14846:2:1375 -14847:2:1376 -14848:2:1380 -14849:2:1381 -14850:2:1375 -14851:2:1376 -14852:2:1380 -14853:2:1381 -14854:2:1389 -14855:2:1394 -14856:2:1398 -14857:2:1399 -14858:2:1406 -14859:2:1407 -14860:2:1418 -14861:2:1419 -14862:2:1420 -14863:2:1418 -14864:2:1419 -14865:2:1420 -14866:2:1431 -14867:2:1436 -14868:2:1437 -14869:0:4365 -14870:2:1449 -14871:0:4365 -14872:3:2427 -14873:0:4365 -14874:2:1451 -14875:0:4365 -14876:3:2428 -14877:0:4365 -14878:2:1652 -14879:0:4365 -14880:2:1653 -14881:0:4365 -14882:2:1657 -14883:0:4365 -14884:2:1180 -14885:0:4365 -14886:3:2427 -14887:0:4365 -14888:2:1181 -14889:2:1185 -14890:2:1186 -14891:2:1194 -14892:2:1195 -14893:2:1199 -14894:2:1200 -14895:2:1194 -14896:2:1195 -14897:2:1196 -14898:2:1208 -14899:2:1213 -14900:2:1217 -14901:2:1218 -14902:2:1225 -14903:2:1226 -14904:2:1237 -14905:2:1238 -14906:2:1239 -14907:2:1237 -14908:2:1238 -14909:2:1239 -14910:2:1250 -14911:2:1255 -14912:2:1256 -14913:0:4365 -14914:3:2428 -14915:0:4365 -14916:2:1268 -14917:0:4365 -14918:3:2427 -14919:0:4365 -14920:2:1270 -14921:0:4365 -14922:3:2428 -14923:0:4365 -14924:2:1271 -14925:2:1275 -14926:2:1276 -14927:2:1284 -14928:2:1285 -14929:2:1289 -14930:2:1290 -14931:2:1284 -14932:2:1285 -14933:2:1289 -14934:2:1290 -14935:2:1298 -14936:2:1303 -14937:2:1307 -14938:2:1308 -14939:2:1315 -14940:2:1316 -14941:2:1327 -14942:2:1328 -14943:2:1329 -14944:2:1327 -14945:2:1328 -14946:2:1329 -14947:2:1340 -14948:2:1345 -14949:2:1346 -14950:0:4365 -14951:2:1358 -14952:0:4365 -14953:2:1454 -14954:0:4365 -14955:3:2427 -14956:0:4365 -14957:2:1455 -14958:0:4365 -14959:3:2428 -14960:0:4365 -14961:2:1652 -14962:0:4365 -14963:2:1653 -14964:0:4365 -14965:2:1657 -14966:0:4365 -14967:2:1660 -14968:0:4365 -14969:3:2427 -14970:0:4365 -14971:2:1665 -14972:2:1669 -14973:2:1670 -14974:2:1678 -14975:2:1679 -14976:2:1683 -14977:2:1684 -14978:2:1678 -14979:2:1679 -14980:2:1680 -14981:2:1692 -14982:2:1697 -14983:2:1701 -14984:2:1702 -14985:2:1709 -14986:2:1710 -14987:2:1721 -14988:2:1722 -14989:2:1723 -14990:2:1721 -14991:2:1722 -14992:2:1723 -14993:2:1734 -14994:2:1739 -14995:2:1740 -14996:0:4365 -14997:3:2428 -14998:0:4365 -14999:2:1752 -15000:0:4365 -15001:3:2427 -15002:0:4365 -15003:2:1754 -15004:0:4365 -15005:3:2428 -15006:0:4365 -15007:2:1755 -15008:2:1759 -15009:2:1760 -15010:2:1768 -15011:2:1769 -15012:2:1773 -15013:2:1774 -15014:2:1768 -15015:2:1769 -15016:2:1773 -15017:2:1774 -15018:2:1782 -15019:2:1787 -15020:2:1791 -15021:2:1792 -15022:2:1799 -15023:2:1800 -15024:2:1811 -15025:2:1812 -15026:2:1813 -15027:2:1811 -15028:2:1812 -15029:2:1813 -15030:2:1824 -15031:2:1829 -15032:2:1830 -15033:0:4365 -15034:2:1842 -15035:0:4365 -15036:3:2427 -15037:0:4365 -15038:2:1844 -15039:0:4363 -15040:3:2428 -15041:0:4369 diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.define b/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.define deleted file mode 100644 index 136ef67..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.define +++ /dev/null @@ -1,2 +0,0 @@ -#define NO_RMB -#define NO_WMB diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.log b/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.log deleted file mode 100644 index 4cee7dc..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.log +++ /dev/null @@ -1,382 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_mb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 743) - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 72 byte, depth reached 10856, errors: 0 - 161519 states, stored - 1724866 states, matched - 1886385 transitions (= stored+matched) - 6692565 atomic steps -hash conflicts: 84009 (resolved) - -Stats on memory usage (in Megabytes): - 15.404 equivalent memory usage for states (stored*(State-vector + overhead)) - 10.421 actual memory usage for states (compression: 67.65%) - state-vector as stored = 40 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 476.115 total actual memory usage - -unreached in proctype urcu_reader_sig - line 403, "pan.___", state 330, "(1)" - line 614, "pan.___", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 652, "pan.___", state 213, "(1)" - line 403, "pan.___", state 239, "(1)" - line 403, "pan.___", state 525, "(1)" - line 399, "pan.___", state 610, "(1)" - line 403, "pan.___", state 624, "(1)" - line 403, "pan.___", state 724, "(1)" - line 399, "pan.___", state 805, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 807, "(1)" - line 399, "pan.___", state 808, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 808, "else" - line 399, "pan.___", state 811, "(1)" - line 403, "pan.___", state 819, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 821, "(1)" - line 403, "pan.___", state 822, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 822, "else" - line 403, "pan.___", state 825, "(1)" - line 403, "pan.___", state 826, "(1)" - line 403, "pan.___", state 826, "(1)" - line 401, "pan.___", state 831, "((j<1))" - line 401, "pan.___", state 831, "((j>=1))" - line 408, "pan.___", state 837, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 850, "(1)" - line 409, "pan.___", state 851, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 851, "else" - line 409, "pan.___", state 854, "(1)" - line 409, "pan.___", state 855, "(1)" - line 409, "pan.___", state 855, "(1)" - line 413, "pan.___", state 863, "(1)" - line 413, "pan.___", state 864, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 864, "else" - line 413, "pan.___", state 867, "(1)" - line 413, "pan.___", state 868, "(1)" - line 413, "pan.___", state 868, "(1)" - line 411, "pan.___", state 873, "((j<1))" - line 411, "pan.___", state 873, "((j>=1))" - line 418, "pan.___", state 880, "(1)" - line 418, "pan.___", state 881, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 881, "else" - line 418, "pan.___", state 884, "(1)" - line 418, "pan.___", state 885, "(1)" - line 418, "pan.___", state 885, "(1)" - line 399, "pan.___", state 896, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 898, "(1)" - line 399, "pan.___", state 899, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 899, "else" - line 399, "pan.___", state 902, "(1)" - line 403, "pan.___", state 910, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 912, "(1)" - line 403, "pan.___", state 913, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 913, "else" - line 403, "pan.___", state 916, "(1)" - line 403, "pan.___", state 917, "(1)" - line 403, "pan.___", state 917, "(1)" - line 401, "pan.___", state 922, "((j<1))" - line 401, "pan.___", state 922, "((j>=1))" - line 408, "pan.___", state 928, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 941, "(1)" - line 409, "pan.___", state 942, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 942, "else" - line 409, "pan.___", state 945, "(1)" - line 409, "pan.___", state 946, "(1)" - line 409, "pan.___", state 946, "(1)" - line 413, "pan.___", state 954, "(1)" - line 413, "pan.___", state 955, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 955, "else" - line 413, "pan.___", state 958, "(1)" - line 413, "pan.___", state 959, "(1)" - line 413, "pan.___", state 959, "(1)" - line 411, "pan.___", state 964, "((j<1))" - line 411, "pan.___", state 964, "((j>=1))" - line 418, "pan.___", state 971, "(1)" - line 418, "pan.___", state 972, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 972, "else" - line 418, "pan.___", state 975, "(1)" - line 418, "pan.___", state 976, "(1)" - line 418, "pan.___", state 976, "(1)" - line 194, "pan.___", state 981, "(1)" - line 194, "pan.___", state 981, "(1)" - line 214, "pan.___", state 985, "((i<1))" - line 214, "pan.___", state 985, "((i>=1))" - line 399, "pan.___", state 991, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 993, "(1)" - line 399, "pan.___", state 994, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 994, "else" - line 399, "pan.___", state 997, "(1)" - line 403, "pan.___", state 1005, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 1007, "(1)" - line 403, "pan.___", state 1008, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 1008, "else" - line 403, "pan.___", state 1011, "(1)" - line 403, "pan.___", state 1012, "(1)" - line 403, "pan.___", state 1012, "(1)" - line 401, "pan.___", state 1017, "((j<1))" - line 401, "pan.___", state 1017, "((j>=1))" - line 408, "pan.___", state 1023, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 1036, "(1)" - line 409, "pan.___", state 1037, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 1037, "else" - line 409, "pan.___", state 1040, "(1)" - line 409, "pan.___", state 1041, "(1)" - line 409, "pan.___", state 1041, "(1)" - line 413, "pan.___", state 1049, "(1)" - line 413, "pan.___", state 1050, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 1050, "else" - line 413, "pan.___", state 1053, "(1)" - line 413, "pan.___", state 1054, "(1)" - line 413, "pan.___", state 1054, "(1)" - line 411, "pan.___", state 1059, "((j<1))" - line 411, "pan.___", state 1059, "((j>=1))" - line 418, "pan.___", state 1066, "(1)" - line 418, "pan.___", state 1067, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 1067, "else" - line 418, "pan.___", state 1070, "(1)" - line 418, "pan.___", state 1071, "(1)" - line 418, "pan.___", state 1071, "(1)" - line 194, "pan.___", state 1076, "(1)" - line 194, "pan.___", state 1076, "(1)" - line 221, "pan.___", state 1077, "(1)" - line 221, "pan.___", state 1077, "(1)" - line 356, "pan.___", state 1083, "((sighand_exec==1))" - line 356, "pan.___", state 1083, "else" - line 362, "pan.___", state 1086, "sighand_exec = 1" - line 399, "pan.___", state 1099, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 1101, "(1)" - line 399, "pan.___", state 1102, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 1102, "else" - line 399, "pan.___", state 1105, "(1)" - line 403, "pan.___", state 1113, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 1115, "(1)" - line 403, "pan.___", state 1116, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 1116, "else" - line 403, "pan.___", state 1119, "(1)" - line 403, "pan.___", state 1120, "(1)" - line 403, "pan.___", state 1120, "(1)" - line 401, "pan.___", state 1125, "((i<1))" - line 401, "pan.___", state 1125, "((i>=1))" - line 408, "pan.___", state 1131, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 1144, "(1)" - line 409, "pan.___", state 1145, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 1145, "else" - line 409, "pan.___", state 1148, "(1)" - line 409, "pan.___", state 1149, "(1)" - line 409, "pan.___", state 1149, "(1)" - line 413, "pan.___", state 1157, "(1)" - line 413, "pan.___", state 1158, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 1158, "else" - line 413, "pan.___", state 1161, "(1)" - line 413, "pan.___", state 1162, "(1)" - line 413, "pan.___", state 1162, "(1)" - line 411, "pan.___", state 1167, "((i<1))" - line 411, "pan.___", state 1167, "((i>=1))" - line 418, "pan.___", state 1174, "(1)" - line 418, "pan.___", state 1175, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 1175, "else" - line 418, "pan.___", state 1178, "(1)" - line 418, "pan.___", state 1179, "(1)" - line 418, "pan.___", state 1179, "(1)" - line 420, "pan.___", state 1182, "(1)" - line 420, "pan.___", state 1182, "(1)" - line 362, "pan.___", state 1191, "sighand_exec = 1" - line 403, "pan.___", state 1222, "(1)" - line 403, "pan.___", state 1319, "(1)" - line 399, "pan.___", state 1404, "(1)" - line 403, "pan.___", state 1418, "(1)" - line 403, "pan.___", state 1518, "(1)" - line 399, "pan.___", state 1599, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 1601, "(1)" - line 399, "pan.___", state 1602, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 1602, "else" - line 399, "pan.___", state 1605, "(1)" - line 403, "pan.___", state 1613, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 1615, "(1)" - line 403, "pan.___", state 1616, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 1616, "else" - line 403, "pan.___", state 1619, "(1)" - line 403, "pan.___", state 1620, "(1)" - line 403, "pan.___", state 1620, "(1)" - line 401, "pan.___", state 1625, "((j<1))" - line 401, "pan.___", state 1625, "((j>=1))" - line 408, "pan.___", state 1631, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 1644, "(1)" - line 409, "pan.___", state 1645, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 1645, "else" - line 409, "pan.___", state 1648, "(1)" - line 409, "pan.___", state 1649, "(1)" - line 409, "pan.___", state 1649, "(1)" - line 413, "pan.___", state 1657, "(1)" - line 413, "pan.___", state 1658, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 1658, "else" - line 413, "pan.___", state 1661, "(1)" - line 413, "pan.___", state 1662, "(1)" - line 413, "pan.___", state 1662, "(1)" - line 411, "pan.___", state 1667, "((j<1))" - line 411, "pan.___", state 1667, "((j>=1))" - line 418, "pan.___", state 1674, "(1)" - line 418, "pan.___", state 1675, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 1675, "else" - line 418, "pan.___", state 1678, "(1)" - line 418, "pan.___", state 1679, "(1)" - line 418, "pan.___", state 1679, "(1)" - line 399, "pan.___", state 1690, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 1692, "(1)" - line 399, "pan.___", state 1693, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 1693, "else" - line 399, "pan.___", state 1696, "(1)" - line 403, "pan.___", state 1704, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 1706, "(1)" - line 403, "pan.___", state 1707, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 1707, "else" - line 403, "pan.___", state 1710, "(1)" - line 403, "pan.___", state 1711, "(1)" - line 403, "pan.___", state 1711, "(1)" - line 401, "pan.___", state 1716, "((j<1))" - line 401, "pan.___", state 1716, "((j>=1))" - line 408, "pan.___", state 1722, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 1735, "(1)" - line 409, "pan.___", state 1736, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 1736, "else" - line 409, "pan.___", state 1739, "(1)" - line 409, "pan.___", state 1740, "(1)" - line 409, "pan.___", state 1740, "(1)" - line 413, "pan.___", state 1748, "(1)" - line 413, "pan.___", state 1749, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 1749, "else" - line 413, "pan.___", state 1752, "(1)" - line 413, "pan.___", state 1753, "(1)" - line 413, "pan.___", state 1753, "(1)" - line 411, "pan.___", state 1758, "((j<1))" - line 411, "pan.___", state 1758, "((j>=1))" - line 418, "pan.___", state 1765, "(1)" - line 418, "pan.___", state 1766, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 1766, "else" - line 418, "pan.___", state 1769, "(1)" - line 418, "pan.___", state 1770, "(1)" - line 418, "pan.___", state 1770, "(1)" - line 194, "pan.___", state 1775, "(1)" - line 194, "pan.___", state 1775, "(1)" - line 214, "pan.___", state 1779, "((i<1))" - line 214, "pan.___", state 1779, "((i>=1))" - line 399, "pan.___", state 1785, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 1787, "(1)" - line 399, "pan.___", state 1788, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 1788, "else" - line 399, "pan.___", state 1791, "(1)" - line 403, "pan.___", state 1799, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 1801, "(1)" - line 403, "pan.___", state 1802, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 1802, "else" - line 403, "pan.___", state 1805, "(1)" - line 403, "pan.___", state 1806, "(1)" - line 403, "pan.___", state 1806, "(1)" - line 401, "pan.___", state 1811, "((j<1))" - line 401, "pan.___", state 1811, "((j>=1))" - line 408, "pan.___", state 1817, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 1830, "(1)" - line 409, "pan.___", state 1831, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 1831, "else" - line 409, "pan.___", state 1834, "(1)" - line 409, "pan.___", state 1835, "(1)" - line 409, "pan.___", state 1835, "(1)" - line 413, "pan.___", state 1843, "(1)" - line 413, "pan.___", state 1844, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 1844, "else" - line 413, "pan.___", state 1847, "(1)" - line 413, "pan.___", state 1848, "(1)" - line 413, "pan.___", state 1848, "(1)" - line 411, "pan.___", state 1853, "((j<1))" - line 411, "pan.___", state 1853, "((j>=1))" - line 418, "pan.___", state 1860, "(1)" - line 418, "pan.___", state 1861, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 1861, "else" - line 418, "pan.___", state 1864, "(1)" - line 418, "pan.___", state 1865, "(1)" - line 418, "pan.___", state 1865, "(1)" - line 194, "pan.___", state 1870, "(1)" - line 194, "pan.___", state 1870, "(1)" - line 221, "pan.___", state 1871, "(1)" - line 221, "pan.___", state 1871, "(1)" - line 356, "pan.___", state 1877, "((sighand_exec==1))" - line 356, "pan.___", state 1877, "else" - line 362, "pan.___", state 1880, "sighand_exec = 1" - line 399, "pan.___", state 1893, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 1895, "(1)" - line 399, "pan.___", state 1896, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 1896, "else" - line 399, "pan.___", state 1899, "(1)" - line 403, "pan.___", state 1907, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 1909, "(1)" - line 403, "pan.___", state 1910, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 1910, "else" - line 403, "pan.___", state 1913, "(1)" - line 403, "pan.___", state 1914, "(1)" - line 403, "pan.___", state 1914, "(1)" - line 401, "pan.___", state 1919, "((i<1))" - line 401, "pan.___", state 1919, "((i>=1))" - line 408, "pan.___", state 1925, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 1938, "(1)" - line 409, "pan.___", state 1939, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 1939, "else" - line 409, "pan.___", state 1942, "(1)" - line 409, "pan.___", state 1943, "(1)" - line 409, "pan.___", state 1943, "(1)" - line 413, "pan.___", state 1951, "(1)" - line 413, "pan.___", state 1952, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 1952, "else" - line 413, "pan.___", state 1955, "(1)" - line 413, "pan.___", state 1956, "(1)" - line 413, "pan.___", state 1956, "(1)" - line 411, "pan.___", state 1961, "((i<1))" - line 411, "pan.___", state 1961, "((i>=1))" - line 418, "pan.___", state 1968, "(1)" - line 418, "pan.___", state 1969, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 1969, "else" - line 418, "pan.___", state 1972, "(1)" - line 418, "pan.___", state 1973, "(1)" - line 418, "pan.___", state 1973, "(1)" - line 420, "pan.___", state 1976, "(1)" - line 420, "pan.___", state 1976, "(1)" - line 362, "pan.___", state 1985, "sighand_exec = 1" - line 403, "pan.___", state 2016, "(1)" - line 702, "pan.___", state 2304, "-end-" - (221 of 2304 states) -unreached in proctype :init: - (0 of 46 states) -unreached in proctype :never: - line 748, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 1.47 seconds -pan: rate 109876.87 states/second -pan: avg transition delay 7.7927e-07 usec -cp .input.spin urcu_free_no_mb.spin.input -cp .input.spin.trail urcu_free_no_mb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.spin.input b/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.spin.input deleted file mode 100644 index 48411ec..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define NO_RMB -#define NO_WMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.spin.input.trail b/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.spin.input.trail deleted file mode 100644 index 00fba51..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_free_no_mb.spin.input.trail +++ /dev/null @@ -1,2172 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4249 -2:4:4201 -3:4:4204 -4:4:4204 -5:4:4207 -6:4:4215 -7:4:4215 -8:4:4218 -9:4:4224 -10:4:4228 -11:4:4228 -12:4:4231 -13:4:4239 -14:4:4243 -15:4:4244 -16:0:4249 -17:4:4246 -18:0:4249 -19:3:1991 -20:0:4249 -21:3:1997 -22:0:4249 -23:3:1998 -24:0:4249 -25:3:1999 -26:3:2003 -27:3:2004 -28:3:2012 -29:3:2013 -30:3:2017 -31:3:2018 -32:3:2026 -33:3:2031 -34:3:2035 -35:3:2036 -36:3:2043 -37:3:2044 -38:3:2055 -39:3:2056 -40:3:2057 -41:3:2068 -42:3:2073 -43:3:2074 -44:0:4249 -45:3:2086 -46:0:4249 -47:3:2088 -48:3:2089 -49:0:4249 -50:3:2093 -51:3:2097 -52:3:2098 -53:3:2106 -54:3:2107 -55:3:2111 -56:3:2112 -57:3:2120 -58:3:2125 -59:3:2126 -60:3:2137 -61:3:2138 -62:3:2149 -63:3:2150 -64:3:2151 -65:3:2162 -66:3:2167 -67:3:2168 -68:0:4249 -69:3:2180 -70:0:4249 -71:3:2182 -72:0:4249 -73:3:2183 -74:0:4249 -75:3:2193 -76:0:4249 -77:3:2194 -78:0:4249 -79:3:2195 -80:3:2199 -81:3:2200 -82:3:2208 -83:3:2209 -84:3:2213 -85:3:2214 -86:3:2222 -87:3:2227 -88:3:2231 -89:3:2232 -90:3:2239 -91:3:2240 -92:3:2251 -93:3:2252 -94:3:2253 -95:3:2264 -96:3:2269 -97:3:2270 -98:0:4249 -99:3:2285 -100:0:4249 -101:3:2286 -102:3:2290 -103:3:2291 -104:3:2299 -105:3:2300 -106:3:2304 -107:3:2305 -108:3:2313 -109:3:2318 -110:3:2322 -111:3:2323 -112:3:2330 -113:3:2331 -114:3:2342 -115:3:2343 -116:3:2344 -117:3:2355 -118:3:2360 -119:3:2361 -120:0:4249 -121:3:2376 -122:0:4249 -123:3:2381 -124:3:2385 -125:3:2386 -126:3:2394 -127:3:2395 -128:3:2399 -129:3:2400 -130:3:2408 -131:3:2413 -132:3:2417 -133:3:2418 -134:3:2425 -135:3:2426 -136:3:2437 -137:3:2438 -138:3:2439 -139:3:2450 -140:3:2455 -141:3:2456 -142:0:4249 -143:3:2475 -144:0:4249 -145:3:2477 -146:0:4249 -147:3:2478 -148:3:2482 -149:3:2483 -150:3:2491 -151:3:2492 -152:3:2496 -153:3:2497 -154:3:2505 -155:3:2510 -156:3:2514 -157:3:2515 -158:3:2522 -159:3:2523 -160:3:2534 -161:3:2535 -162:3:2536 -163:3:2547 -164:3:2552 -165:3:2553 -166:0:4249 -167:3:2565 -168:0:4249 -169:3:2567 -170:0:4249 -171:3:2570 -172:3:2571 -173:3:2583 -174:3:2584 -175:3:2588 -176:3:2589 -177:3:2597 -178:3:2602 -179:3:2606 -180:3:2607 -181:3:2614 -182:3:2615 -183:3:2626 -184:3:2627 -185:3:2628 -186:3:2639 -187:3:2644 -188:3:2645 -189:0:4249 -190:3:2657 -191:0:4249 -192:3:2659 -193:0:4249 -194:3:2660 -195:0:4249 -196:3:2661 -197:0:4249 -198:3:2662 -199:0:4249 -200:3:2663 -201:3:2667 -202:3:2668 -203:3:2676 -204:3:2677 -205:3:2681 -206:3:2682 -207:3:2690 -208:3:2695 -209:3:2699 -210:3:2700 -211:3:2707 -212:3:2708 -213:3:2719 -214:3:2720 -215:3:2721 -216:3:2732 -217:3:2737 -218:3:2738 -219:0:4249 -220:3:2750 -221:0:4249 -222:3:3036 -223:0:4249 -224:3:3134 -225:0:4249 -226:3:3135 -227:0:4249 -228:3:3139 -229:0:4249 -230:3:3145 -231:3:3149 -232:3:3150 -233:3:3158 -234:3:3159 -235:3:3163 -236:3:3164 -237:3:3172 -238:3:3177 -239:3:3181 -240:3:3182 -241:3:3189 -242:3:3190 -243:3:3201 -244:3:3202 -245:3:3203 -246:3:3214 -247:3:3219 -248:3:3220 -249:0:4249 -250:3:3232 -251:0:4249 -252:3:3234 -253:0:4249 -254:3:3235 -255:3:3239 -256:3:3240 -257:3:3248 -258:3:3249 -259:3:3253 -260:3:3254 -261:3:3262 -262:3:3267 -263:3:3271 -264:3:3272 -265:3:3279 -266:3:3280 -267:3:3291 -268:3:3292 -269:3:3293 -270:3:3304 -271:3:3309 -272:3:3310 -273:0:4249 -274:3:3322 -275:0:4249 -276:3:3324 -277:0:4249 -278:3:3327 -279:3:3328 -280:3:3340 -281:3:3341 -282:3:3345 -283:3:3346 -284:3:3354 -285:3:3359 -286:3:3363 -287:3:3364 -288:3:3371 -289:3:3372 -290:3:3383 -291:3:3384 -292:3:3385 -293:3:3396 -294:3:3401 -295:3:3402 -296:0:4249 -297:3:3414 -298:0:4249 -299:3:3416 -300:0:4249 -301:3:3417 -302:0:4249 -303:3:3418 -304:0:4249 -305:3:3419 -306:0:4249 -307:3:3420 -308:3:3424 -309:3:3425 -310:3:3433 -311:3:3434 -312:3:3438 -313:3:3439 -314:3:3447 -315:3:3452 -316:3:3456 -317:3:3457 -318:3:3464 -319:3:3465 -320:3:3476 -321:3:3477 -322:3:3478 -323:3:3489 -324:3:3494 -325:3:3495 -326:0:4249 -327:3:3507 -328:0:4249 -329:3:3793 -330:0:4249 -331:3:3891 -332:0:4249 -333:3:3892 -334:0:4249 -335:3:3896 -336:0:4249 -337:3:3902 -338:0:4249 -339:3:3903 -340:3:3907 -341:3:3908 -342:3:3916 -343:3:3917 -344:3:3921 -345:3:3922 -346:3:3930 -347:3:3935 -348:3:3939 -349:3:3940 -350:3:3947 -351:3:3948 -352:3:3959 -353:3:3960 -354:3:3961 -355:3:3972 -356:3:3977 -357:3:3978 -358:0:4249 -359:3:3993 -360:0:4249 -361:3:3994 -362:3:3998 -363:3:3999 -364:3:4007 -365:3:4008 -366:3:4012 -367:3:4013 -368:3:4021 -369:3:4026 -370:3:4030 -371:3:4031 -372:3:4038 -373:3:4039 -374:3:4050 -375:3:4051 -376:3:4052 -377:3:4063 -378:3:4068 -379:3:4069 -380:0:4249 -381:3:4084 -382:0:4249 -383:3:4089 -384:3:4093 -385:3:4094 -386:3:4102 -387:3:4103 -388:3:4107 -389:3:4108 -390:3:4116 -391:3:4121 -392:3:4125 -393:3:4126 -394:3:4133 -395:3:4134 -396:3:4145 -397:3:4146 -398:3:4147 -399:3:4158 -400:3:4163 -401:3:4164 -402:0:4249 -403:3:4183 -404:0:4249 -405:3:4185 -406:0:4249 -407:3:4186 -408:0:4249 -409:3:1998 -410:0:4249 -411:3:1999 -412:3:2003 -413:3:2004 -414:3:2012 -415:3:2013 -416:3:2017 -417:3:2018 -418:3:2026 -419:3:2031 -420:3:2035 -421:3:2036 -422:3:2043 -423:3:2044 -424:3:2055 -425:3:2056 -426:3:2057 -427:3:2068 -428:3:2073 -429:3:2074 -430:0:4249 -431:3:2086 -432:0:4249 -433:3:2088 -434:3:2089 -435:0:4249 -436:3:2093 -437:3:2097 -438:3:2098 -439:3:2106 -440:3:2107 -441:3:2111 -442:3:2112 -443:3:2120 -444:3:2125 -445:3:2126 -446:3:2137 -447:3:2138 -448:3:2149 -449:3:2150 -450:3:2151 -451:3:2162 -452:3:2167 -453:3:2168 -454:0:4249 -455:3:2180 -456:0:4249 -457:3:2182 -458:0:4249 -459:3:2183 -460:0:4249 -461:3:2193 -462:0:4249 -463:3:2194 -464:0:4249 -465:3:2195 -466:3:2199 -467:3:2200 -468:3:2208 -469:3:2209 -470:3:2213 -471:3:2214 -472:3:2222 -473:3:2227 -474:3:2231 -475:3:2232 -476:3:2239 -477:3:2240 -478:3:2251 -479:3:2252 -480:3:2253 -481:3:2264 -482:3:2269 -483:3:2270 -484:0:4249 -485:3:2285 -486:0:4249 -487:3:2286 -488:3:2290 -489:3:2291 -490:3:2299 -491:3:2300 -492:3:2304 -493:3:2305 -494:3:2313 -495:3:2318 -496:3:2322 -497:3:2323 -498:3:2330 -499:3:2331 -500:3:2342 -501:3:2343 -502:3:2344 -503:3:2355 -504:3:2360 -505:3:2361 -506:0:4249 -507:3:2376 -508:0:4249 -509:3:2381 -510:3:2385 -511:3:2386 -512:3:2394 -513:3:2395 -514:3:2399 -515:3:2400 -516:3:2408 -517:3:2413 -518:3:2417 -519:3:2418 -520:3:2425 -521:3:2426 -522:3:2437 -523:3:2438 -524:3:2439 -525:3:2450 -526:3:2455 -527:3:2456 -528:0:4249 -529:3:2475 -530:0:4249 -531:3:2477 -532:0:4249 -533:3:2478 -534:3:2482 -535:3:2483 -536:3:2491 -537:3:2492 -538:3:2496 -539:3:2497 -540:3:2505 -541:3:2510 -542:3:2514 -543:3:2515 -544:3:2522 -545:3:2523 -546:3:2534 -547:3:2535 -548:3:2536 -549:3:2547 -550:3:2552 -551:3:2553 -552:0:4249 -553:3:2565 -554:0:4249 -555:3:2567 -556:0:4249 -557:3:2570 -558:3:2571 -559:3:2583 -560:3:2584 -561:3:2588 -562:3:2589 -563:3:2597 -564:3:2602 -565:3:2606 -566:3:2607 -567:3:2614 -568:3:2615 -569:3:2626 -570:3:2627 -571:3:2628 -572:3:2639 -573:3:2644 -574:3:2645 -575:0:4249 -576:3:2657 -577:0:4249 -578:3:2659 -579:0:4249 -580:3:2660 -581:0:4249 -582:3:2661 -583:0:4249 -584:3:2662 -585:0:4249 -586:3:2663 -587:3:2667 -588:3:2668 -589:3:2676 -590:3:2677 -591:3:2681 -592:3:2682 -593:3:2690 -594:3:2695 -595:3:2699 -596:3:2700 -597:3:2707 -598:3:2708 -599:3:2719 -600:3:2720 -601:3:2721 -602:3:2732 -603:3:2737 -604:3:2738 -605:0:4249 -606:3:2750 -607:0:4249 -608:3:3036 -609:0:4249 -610:3:3134 -611:0:4249 -612:3:3135 -613:0:4249 -614:3:3139 -615:0:4249 -616:3:3145 -617:3:3149 -618:3:3150 -619:3:3158 -620:3:3159 -621:3:3163 -622:3:3164 -623:3:3172 -624:3:3177 -625:3:3181 -626:3:3182 -627:3:3189 -628:3:3190 -629:3:3201 -630:3:3202 -631:3:3203 -632:3:3214 -633:3:3219 -634:3:3220 -635:0:4249 -636:3:3232 -637:0:4249 -638:3:3234 -639:0:4249 -640:3:3235 -641:3:3239 -642:3:3240 -643:3:3248 -644:3:3249 -645:3:3253 -646:3:3254 -647:3:3262 -648:3:3267 -649:3:3271 -650:3:3272 -651:3:3279 -652:3:3280 -653:3:3291 -654:3:3292 -655:3:3293 -656:3:3304 -657:3:3309 -658:3:3310 -659:0:4249 -660:3:3322 -661:0:4249 -662:3:3324 -663:0:4249 -664:3:3327 -665:3:3328 -666:3:3340 -667:3:3341 -668:3:3345 -669:3:3346 -670:3:3354 -671:3:3359 -672:3:3363 -673:3:3364 -674:3:3371 -675:3:3372 -676:3:3383 -677:3:3384 -678:3:3385 -679:3:3396 -680:3:3401 -681:3:3402 -682:0:4249 -683:3:3414 -684:0:4249 -685:3:3416 -686:0:4249 -687:3:3417 -688:0:4249 -689:3:3418 -690:0:4249 -691:3:3419 -692:0:4249 -693:3:3420 -694:3:3424 -695:3:3425 -696:3:3433 -697:3:3434 -698:3:3438 -699:3:3439 -700:3:3447 -701:3:3452 -702:3:3456 -703:3:3457 -704:3:3464 -705:3:3465 -706:3:3476 -707:3:3477 -708:3:3478 -709:3:3489 -710:3:3494 -711:3:3495 -712:0:4249 -713:3:3507 -714:0:4249 -715:3:3793 -716:0:4249 -717:3:3891 -718:0:4249 -719:3:3892 -720:0:4249 -721:3:3896 -722:0:4249 -723:3:3902 -724:0:4249 -725:3:3903 -726:3:3907 -727:3:3908 -728:3:3916 -729:3:3917 -730:3:3921 -731:3:3922 -732:3:3930 -733:3:3935 -734:3:3939 -735:3:3940 -736:3:3947 -737:3:3948 -738:3:3959 -739:3:3960 -740:3:3961 -741:3:3972 -742:3:3977 -743:3:3978 -744:0:4249 -745:3:3993 -746:0:4249 -747:3:3994 -748:3:3998 -749:3:3999 -750:3:4007 -751:3:4008 -752:3:4012 -753:3:4013 -754:3:4021 -755:3:4026 -756:3:4030 -757:3:4031 -758:3:4038 -759:3:4039 -760:3:4050 -761:3:4051 -762:3:4052 -763:3:4063 -764:3:4068 -765:3:4069 -766:0:4249 -767:3:4084 -768:0:4249 -769:3:4089 -770:3:4093 -771:3:4094 -772:3:4102 -773:3:4103 -774:3:4107 -775:3:4108 -776:3:4116 -777:3:4121 -778:3:4125 -779:3:4126 -780:3:4133 -781:3:4134 -782:3:4145 -783:3:4146 -784:3:4147 -785:3:4158 -786:3:4163 -787:3:4164 -788:0:4249 -789:3:4183 -790:0:4249 -791:3:4185 -792:0:4249 -793:3:4186 -794:0:4249 -795:3:1998 -796:0:4249 -797:3:1999 -798:3:2003 -799:3:2004 -800:3:2012 -801:3:2013 -802:3:2017 -803:3:2018 -804:3:2026 -805:3:2031 -806:3:2035 -807:3:2036 -808:3:2043 -809:3:2044 -810:3:2055 -811:3:2056 -812:3:2057 -813:3:2068 -814:3:2073 -815:3:2074 -816:0:4249 -817:3:2086 -818:0:4249 -819:3:2088 -820:3:2089 -821:0:4249 -822:3:2093 -823:3:2097 -824:3:2098 -825:3:2106 -826:3:2107 -827:3:2111 -828:3:2112 -829:3:2120 -830:3:2125 -831:3:2126 -832:3:2137 -833:3:2138 -834:3:2149 -835:3:2150 -836:3:2151 -837:3:2162 -838:3:2167 -839:3:2168 -840:0:4249 -841:3:2180 -842:0:4249 -843:3:2182 -844:0:4249 -845:3:2183 -846:0:4249 -847:3:2193 -848:0:4249 -849:3:2194 -850:0:4249 -851:3:2195 -852:3:2199 -853:3:2200 -854:3:2208 -855:3:2209 -856:3:2213 -857:3:2214 -858:3:2222 -859:3:2227 -860:3:2231 -861:3:2232 -862:3:2239 -863:3:2240 -864:3:2251 -865:3:2252 -866:3:2253 -867:3:2264 -868:3:2269 -869:3:2270 -870:0:4249 -871:3:2285 -872:0:4249 -873:3:2286 -874:3:2290 -875:3:2291 -876:3:2299 -877:3:2300 -878:3:2304 -879:3:2305 -880:3:2313 -881:3:2318 -882:3:2322 -883:3:2323 -884:3:2330 -885:3:2331 -886:3:2342 -887:3:2343 -888:3:2344 -889:3:2355 -890:3:2360 -891:3:2361 -892:0:4249 -893:3:2376 -894:0:4249 -895:3:2381 -896:3:2385 -897:3:2386 -898:3:2394 -899:3:2395 -900:3:2399 -901:3:2400 -902:3:2408 -903:3:2413 -904:3:2417 -905:3:2418 -906:3:2425 -907:3:2426 -908:3:2437 -909:3:2438 -910:3:2439 -911:3:2450 -912:3:2455 -913:3:2456 -914:0:4249 -915:3:2475 -916:0:4249 -917:3:2477 -918:0:4249 -919:3:2478 -920:3:2482 -921:3:2483 -922:3:2491 -923:3:2492 -924:3:2496 -925:3:2497 -926:3:2505 -927:3:2510 -928:3:2514 -929:3:2515 -930:3:2522 -931:3:2523 -932:3:2534 -933:3:2535 -934:3:2536 -935:3:2547 -936:3:2552 -937:3:2553 -938:0:4249 -939:3:2565 -940:0:4249 -941:3:2567 -942:0:4249 -943:3:2570 -944:3:2571 -945:3:2583 -946:3:2584 -947:3:2588 -948:3:2589 -949:3:2597 -950:3:2602 -951:3:2606 -952:3:2607 -953:3:2614 -954:3:2615 -955:3:2626 -956:3:2627 -957:3:2628 -958:3:2639 -959:3:2644 -960:3:2645 -961:0:4249 -962:3:2657 -963:0:4249 -964:3:2659 -965:0:4249 -966:3:2660 -967:0:4249 -968:3:2661 -969:0:4249 -970:3:2662 -971:0:4249 -972:3:2663 -973:3:2667 -974:3:2668 -975:3:2676 -976:3:2677 -977:3:2681 -978:3:2682 -979:3:2690 -980:3:2695 -981:3:2699 -982:3:2700 -983:3:2707 -984:3:2708 -985:3:2719 -986:3:2720 -987:3:2721 -988:3:2732 -989:3:2737 -990:3:2738 -991:0:4249 -992:3:2750 -993:0:4249 -994:3:3036 -995:0:4249 -996:3:3134 -997:0:4249 -998:3:3135 -999:0:4249 -1000:3:3139 -1001:0:4249 -1002:3:3145 -1003:3:3149 -1004:3:3150 -1005:3:3158 -1006:3:3159 -1007:3:3163 -1008:3:3164 -1009:3:3172 -1010:3:3177 -1011:3:3181 -1012:3:3182 -1013:3:3189 -1014:3:3190 -1015:3:3201 -1016:3:3202 -1017:3:3203 -1018:3:3214 -1019:3:3219 -1020:3:3220 -1021:0:4249 -1022:3:3232 -1023:0:4249 -1024:3:3234 -1025:0:4249 -1026:3:3235 -1027:3:3239 -1028:3:3240 -1029:3:3248 -1030:3:3249 -1031:3:3253 -1032:3:3254 -1033:3:3262 -1034:3:3267 -1035:3:3271 -1036:3:3272 -1037:3:3279 -1038:3:3280 -1039:3:3291 -1040:3:3292 -1041:3:3293 -1042:3:3304 -1043:3:3309 -1044:3:3310 -1045:0:4249 -1046:3:3322 -1047:0:4249 -1048:3:3324 -1049:0:4249 -1050:3:3327 -1051:3:3328 -1052:3:3340 -1053:3:3341 -1054:3:3345 -1055:3:3346 -1056:3:3354 -1057:3:3359 -1058:3:3363 -1059:3:3364 -1060:3:3371 -1061:3:3372 -1062:3:3383 -1063:3:3384 -1064:3:3385 -1065:3:3396 -1066:3:3401 -1067:3:3402 -1068:0:4249 -1069:3:3414 -1070:0:4249 -1071:3:3416 -1072:0:4249 -1073:3:3417 -1074:0:4249 -1075:3:3418 -1076:0:4249 -1077:3:3419 -1078:0:4249 -1079:3:3420 -1080:3:3424 -1081:3:3425 -1082:3:3433 -1083:3:3434 -1084:3:3438 -1085:3:3439 -1086:3:3447 -1087:3:3452 -1088:3:3456 -1089:3:3457 -1090:3:3464 -1091:3:3465 -1092:3:3476 -1093:3:3477 -1094:3:3478 -1095:3:3489 -1096:3:3494 -1097:3:3495 -1098:0:4249 -1099:3:3507 -1100:0:4249 -1101:3:3793 -1102:0:4249 -1103:3:3891 -1104:0:4249 -1105:3:3892 -1106:0:4249 -1107:3:3896 -1108:0:4249 -1109:3:3902 -1110:0:4249 -1111:3:3903 -1112:3:3907 -1113:3:3908 -1114:3:3916 -1115:3:3917 -1116:3:3921 -1117:3:3922 -1118:3:3930 -1119:3:3935 -1120:3:3939 -1121:3:3940 -1122:3:3947 -1123:3:3948 -1124:3:3959 -1125:3:3960 -1126:3:3961 -1127:3:3972 -1128:3:3977 -1129:3:3978 -1130:0:4249 -1131:3:3993 -1132:0:4249 -1133:3:3994 -1134:3:3998 -1135:3:3999 -1136:3:4007 -1137:3:4008 -1138:3:4012 -1139:3:4013 -1140:3:4021 -1141:3:4026 -1142:3:4030 -1143:3:4031 -1144:3:4038 -1145:3:4039 -1146:3:4050 -1147:3:4051 -1148:3:4052 -1149:3:4063 -1150:3:4068 -1151:3:4069 -1152:0:4249 -1153:3:4084 -1154:0:4249 -1155:3:4089 -1156:3:4093 -1157:3:4094 -1158:3:4102 -1159:3:4103 -1160:3:4107 -1161:3:4108 -1162:3:4116 -1163:3:4121 -1164:3:4125 -1165:3:4126 -1166:3:4133 -1167:3:4134 -1168:3:4145 -1169:3:4146 -1170:3:4147 -1171:3:4158 -1172:3:4163 -1173:3:4164 -1174:0:4249 -1175:3:4183 -1176:0:4249 -1177:3:4185 -1178:0:4249 -1179:3:4186 -1180:0:4249 -1181:3:1998 -1182:0:4249 -1183:3:1999 -1184:3:2003 -1185:3:2004 -1186:3:2012 -1187:3:2013 -1188:3:2017 -1189:3:2018 -1190:3:2026 -1191:3:2031 -1192:3:2035 -1193:3:2036 -1194:3:2043 -1195:3:2044 -1196:3:2055 -1197:3:2056 -1198:3:2057 -1199:3:2068 -1200:3:2073 -1201:3:2074 -1202:0:4249 -1203:3:2086 -1204:0:4249 -1205:3:2088 -1206:3:2089 -1207:0:4249 -1208:3:2093 -1209:3:2097 -1210:3:2098 -1211:3:2106 -1212:3:2107 -1213:3:2111 -1214:3:2112 -1215:3:2120 -1216:3:2125 -1217:3:2126 -1218:3:2137 -1219:3:2138 -1220:3:2149 -1221:3:2150 -1222:3:2151 -1223:3:2162 -1224:3:2167 -1225:3:2168 -1226:0:4249 -1227:3:2180 -1228:0:4249 -1229:3:2182 -1230:0:4249 -1231:3:2183 -1232:0:4249 -1233:3:2193 -1234:0:4249 -1235:3:2194 -1236:0:4249 -1237:3:2195 -1238:3:2199 -1239:3:2200 -1240:3:2208 -1241:3:2209 -1242:3:2213 -1243:3:2214 -1244:3:2222 -1245:3:2227 -1246:3:2231 -1247:3:2232 -1248:3:2239 -1249:3:2240 -1250:3:2251 -1251:3:2252 -1252:3:2253 -1253:3:2264 -1254:3:2269 -1255:3:2270 -1256:0:4249 -1257:3:2285 -1258:0:4249 -1259:3:2286 -1260:3:2290 -1261:3:2291 -1262:3:2299 -1263:3:2300 -1264:3:2304 -1265:3:2305 -1266:3:2313 -1267:3:2318 -1268:3:2322 -1269:3:2323 -1270:3:2330 -1271:3:2331 -1272:3:2342 -1273:3:2343 -1274:3:2344 -1275:3:2355 -1276:3:2360 -1277:3:2361 -1278:0:4249 -1279:3:2376 -1280:0:4249 -1281:3:2381 -1282:3:2385 -1283:3:2386 -1284:3:2394 -1285:3:2395 -1286:3:2399 -1287:3:2400 -1288:3:2408 -1289:3:2413 -1290:3:2417 -1291:3:2418 -1292:3:2425 -1293:3:2426 -1294:3:2437 -1295:3:2438 -1296:3:2439 -1297:3:2450 -1298:3:2455 -1299:3:2456 -1300:0:4249 -1301:3:2475 -1302:0:4249 -1303:3:2477 -1304:0:4249 -1305:3:2478 -1306:3:2482 -1307:3:2483 -1308:3:2491 -1309:3:2492 -1310:3:2496 -1311:3:2497 -1312:3:2505 -1313:3:2510 -1314:3:2514 -1315:3:2515 -1316:3:2522 -1317:3:2523 -1318:3:2534 -1319:3:2535 -1320:3:2536 -1321:3:2547 -1322:3:2552 -1323:3:2553 -1324:0:4249 -1325:3:2565 -1326:0:4249 -1327:3:2567 -1328:0:4249 -1329:3:2570 -1330:3:2571 -1331:3:2583 -1332:3:2584 -1333:3:2588 -1334:3:2589 -1335:3:2597 -1336:3:2602 -1337:3:2606 -1338:3:2607 -1339:3:2614 -1340:3:2615 -1341:3:2626 -1342:3:2627 -1343:3:2628 -1344:3:2639 -1345:3:2644 -1346:3:2645 -1347:0:4249 -1348:3:2657 -1349:0:4249 -1350:3:2659 -1351:0:4249 -1352:3:2660 -1353:0:4249 -1354:3:2661 -1355:0:4249 -1356:3:2662 -1357:0:4249 -1358:3:2663 -1359:3:2667 -1360:3:2668 -1361:3:2676 -1362:3:2677 -1363:3:2681 -1364:3:2682 -1365:3:2690 -1366:3:2695 -1367:3:2699 -1368:3:2700 -1369:3:2707 -1370:3:2708 -1371:3:2719 -1372:3:2720 -1373:3:2721 -1374:3:2732 -1375:3:2737 -1376:3:2738 -1377:0:4249 -1378:3:2750 -1379:0:4249 -1380:3:3036 -1381:0:4249 -1382:3:3134 -1383:0:4249 -1384:3:3135 -1385:0:4249 -1386:3:3139 -1387:0:4249 -1388:3:3145 -1389:3:3149 -1390:3:3150 -1391:3:3158 -1392:3:3159 -1393:3:3163 -1394:3:3164 -1395:3:3172 -1396:3:3177 -1397:3:3181 -1398:3:3182 -1399:3:3189 -1400:3:3190 -1401:3:3201 -1402:3:3202 -1403:3:3203 -1404:3:3214 -1405:3:3219 -1406:3:3220 -1407:0:4249 -1408:3:3232 -1409:0:4249 -1410:3:3234 -1411:0:4249 -1412:3:3235 -1413:3:3239 -1414:3:3240 -1415:3:3248 -1416:3:3249 -1417:3:3253 -1418:3:3254 -1419:3:3262 -1420:3:3267 -1421:3:3271 -1422:3:3272 -1423:3:3279 -1424:3:3280 -1425:3:3291 -1426:3:3292 -1427:3:3293 -1428:3:3304 -1429:3:3309 -1430:3:3310 -1431:0:4249 -1432:3:3322 -1433:0:4249 -1434:3:3324 -1435:0:4249 -1436:3:3327 -1437:3:3328 -1438:3:3340 -1439:3:3341 -1440:3:3345 -1441:3:3346 -1442:3:3354 -1443:3:3359 -1444:3:3363 -1445:3:3364 -1446:3:3371 -1447:3:3372 -1448:3:3383 -1449:3:3384 -1450:3:3385 -1451:3:3396 -1452:3:3401 -1453:3:3402 -1454:0:4249 -1455:3:3414 -1456:0:4249 -1457:3:3416 -1458:0:4249 -1459:3:3417 -1460:0:4249 -1461:3:3418 -1462:0:4249 -1463:3:3419 -1464:0:4249 -1465:3:3420 -1466:3:3424 -1467:3:3425 -1468:3:3433 -1469:3:3434 -1470:3:3438 -1471:3:3439 -1472:3:3447 -1473:3:3452 -1474:3:3456 -1475:3:3457 -1476:3:3464 -1477:3:3465 -1478:3:3476 -1479:3:3477 -1480:3:3478 -1481:3:3489 -1482:3:3494 -1483:3:3495 -1484:0:4249 -1485:3:3507 -1486:0:4249 -1487:3:3793 -1488:0:4249 -1489:3:3891 -1490:0:4249 -1491:3:3892 -1492:0:4249 -1493:3:3896 -1494:0:4249 -1495:3:3902 -1496:0:4249 -1497:3:3903 -1498:3:3907 -1499:3:3908 -1500:3:3916 -1501:3:3917 -1502:3:3921 -1503:3:3922 -1504:3:3930 -1505:3:3935 -1506:3:3939 -1507:3:3940 -1508:3:3947 -1509:3:3948 -1510:3:3959 -1511:3:3960 -1512:3:3961 -1513:3:3972 -1514:3:3977 -1515:3:3978 -1516:0:4249 -1517:3:3993 -1518:0:4249 -1519:3:3994 -1520:3:3998 -1521:3:3999 -1522:3:4007 -1523:3:4008 -1524:3:4012 -1525:3:4013 -1526:3:4021 -1527:3:4026 -1528:3:4030 -1529:3:4031 -1530:3:4038 -1531:3:4039 -1532:3:4050 -1533:3:4051 -1534:3:4052 -1535:3:4063 -1536:3:4068 -1537:3:4069 -1538:0:4249 -1539:3:4084 -1540:0:4249 -1541:3:4089 -1542:3:4093 -1543:3:4094 -1544:3:4102 -1545:3:4103 -1546:3:4107 -1547:3:4108 -1548:3:4116 -1549:3:4121 -1550:3:4125 -1551:3:4126 -1552:3:4133 -1553:3:4134 -1554:3:4145 -1555:3:4146 -1556:3:4147 -1557:3:4158 -1558:3:4163 -1559:3:4164 -1560:0:4249 -1561:3:4183 -1562:0:4249 -1563:3:4185 -1564:0:4249 -1565:3:4186 -1566:0:4249 -1567:3:1998 -1568:0:4249 -1569:3:1999 -1570:3:2003 -1571:3:2004 -1572:3:2012 -1573:3:2013 -1574:3:2017 -1575:3:2018 -1576:3:2026 -1577:3:2031 -1578:3:2035 -1579:3:2036 -1580:3:2043 -1581:3:2044 -1582:3:2055 -1583:3:2056 -1584:3:2057 -1585:3:2068 -1586:3:2073 -1587:3:2074 -1588:0:4249 -1589:3:2086 -1590:0:4249 -1591:3:2088 -1592:3:2089 -1593:0:4249 -1594:3:2093 -1595:3:2097 -1596:3:2098 -1597:3:2106 -1598:3:2107 -1599:3:2111 -1600:3:2112 -1601:3:2120 -1602:3:2133 -1603:3:2134 -1604:3:2137 -1605:3:2138 -1606:3:2149 -1607:3:2150 -1608:3:2151 -1609:3:2162 -1610:3:2167 -1611:3:2170 -1612:3:2171 -1613:0:4249 -1614:3:2180 -1615:0:4249 -1616:3:2182 -1617:0:4249 -1618:3:2183 -1619:0:4249 -1620:3:2193 -1621:0:4249 -1622:3:2194 -1623:0:4249 -1624:3:2195 -1625:3:2199 -1626:3:2200 -1627:3:2208 -1628:3:2209 -1629:3:2213 -1630:3:2214 -1631:3:2222 -1632:3:2235 -1633:3:2236 -1634:3:2239 -1635:3:2240 -1636:3:2251 -1637:3:2252 -1638:3:2253 -1639:3:2264 -1640:3:2269 -1641:3:2272 -1642:3:2273 -1643:0:4249 -1644:3:2285 -1645:0:4249 -1646:3:2286 -1647:3:2290 -1648:3:2291 -1649:3:2299 -1650:3:2300 -1651:3:2304 -1652:3:2305 -1653:3:2313 -1654:3:2326 -1655:3:2327 -1656:3:2330 -1657:3:2331 -1658:3:2342 -1659:3:2343 -1660:3:2344 -1661:3:2355 -1662:3:2360 -1663:3:2363 -1664:3:2364 -1665:0:4249 -1666:3:2376 -1667:0:4249 -1668:3:2381 -1669:3:2385 -1670:3:2386 -1671:3:2394 -1672:3:2395 -1673:3:2399 -1674:3:2400 -1675:3:2408 -1676:3:2421 -1677:3:2422 -1678:3:2425 -1679:3:2426 -1680:3:2437 -1681:3:2438 -1682:3:2439 -1683:3:2450 -1684:3:2455 -1685:3:2458 -1686:3:2459 -1687:0:4249 -1688:3:2475 -1689:0:4249 -1690:3:2477 -1691:0:4249 -1692:3:2478 -1693:3:2482 -1694:3:2483 -1695:3:2491 -1696:3:2492 -1697:3:2496 -1698:3:2497 -1699:3:2505 -1700:3:2518 -1701:3:2519 -1702:3:2522 -1703:3:2523 -1704:3:2534 -1705:3:2535 -1706:3:2536 -1707:3:2547 -1708:3:2552 -1709:3:2555 -1710:3:2556 -1711:0:4249 -1712:3:2565 -1713:0:4249 -1714:3:2567 -1715:0:4249 -1716:3:2570 -1717:3:2571 -1718:3:2583 -1719:3:2584 -1720:3:2588 -1721:3:2589 -1722:3:2597 -1723:3:2610 -1724:3:2611 -1725:3:2614 -1726:3:2615 -1727:3:2626 -1728:3:2627 -1729:3:2628 -1730:3:2639 -1731:3:2644 -1732:3:2647 -1733:3:2648 -1734:0:4249 -1735:3:2657 -1736:0:4249 -1737:3:2659 -1738:0:4249 -1739:3:2660 -1740:0:4249 -1741:3:2661 -1742:0:4249 -1743:3:2662 -1744:0:4249 -1745:3:2663 -1746:3:2667 -1747:3:2668 -1748:3:2676 -1749:3:2677 -1750:3:2681 -1751:3:2682 -1752:3:2690 -1753:3:2703 -1754:3:2704 -1755:3:2707 -1756:3:2708 -1757:3:2719 -1758:3:2720 -1759:3:2721 -1760:3:2732 -1761:3:2737 -1762:3:2740 -1763:3:2741 -1764:0:4249 -1765:3:2750 -1766:0:4249 -1767:3:3036 -1768:0:4249 -1769:3:3134 -1770:0:4249 -1771:3:3135 -1772:0:4249 -1773:3:3139 -1774:0:4249 -1775:3:3145 -1776:3:3149 -1777:3:3150 -1778:3:3158 -1779:3:3159 -1780:3:3163 -1781:3:3164 -1782:3:3172 -1783:3:3185 -1784:3:3186 -1785:3:3189 -1786:3:3190 -1787:3:3201 -1788:3:3202 -1789:3:3203 -1790:3:3214 -1791:3:3219 -1792:3:3222 -1793:3:3223 -1794:0:4249 -1795:3:3232 -1796:0:4249 -1797:3:3234 -1798:0:4249 -1799:3:3235 -1800:3:3239 -1801:3:3240 -1802:3:3248 -1803:3:3249 -1804:3:3253 -1805:3:3254 -1806:3:3262 -1807:3:3275 -1808:3:3276 -1809:3:3279 -1810:3:3280 -1811:3:3291 -1812:3:3292 -1813:3:3293 -1814:3:3304 -1815:3:3309 -1816:3:3312 -1817:3:3313 -1818:0:4249 -1819:3:3322 -1820:0:4249 -1821:3:3324 -1822:0:4249 -1823:3:3327 -1824:3:3328 -1825:3:3340 -1826:3:3341 -1827:3:3345 -1828:3:3346 -1829:3:3354 -1830:3:3367 -1831:3:3368 -1832:3:3371 -1833:3:3372 -1834:3:3383 -1835:3:3384 -1836:3:3385 -1837:3:3396 -1838:3:3401 -1839:3:3404 -1840:3:3405 -1841:0:4249 -1842:3:3414 -1843:0:4249 -1844:3:3416 -1845:0:4249 -1846:3:3417 -1847:0:4249 -1848:3:3418 -1849:0:4249 -1850:3:3419 -1851:0:4249 -1852:3:3420 -1853:3:3424 -1854:3:3425 -1855:3:3433 -1856:3:3434 -1857:3:3438 -1858:3:3439 -1859:3:3447 -1860:3:3460 -1861:3:3461 -1862:3:3464 -1863:3:3465 -1864:3:3476 -1865:3:3477 -1866:3:3478 -1867:3:3489 -1868:3:3494 -1869:3:3497 -1870:3:3498 -1871:0:4249 -1872:3:3507 -1873:0:4249 -1874:3:3793 -1875:0:4249 -1876:3:3891 -1877:0:4249 -1878:3:3892 -1879:0:4249 -1880:3:3896 -1881:0:4249 -1882:3:3902 -1883:0:4249 -1884:3:3903 -1885:3:3907 -1886:3:3908 -1887:3:3916 -1888:3:3917 -1889:3:3921 -1890:3:3922 -1891:3:3930 -1892:3:3943 -1893:3:3944 -1894:3:3947 -1895:3:3948 -1896:3:3959 -1897:3:3960 -1898:3:3961 -1899:3:3972 -1900:3:3977 -1901:3:3980 -1902:3:3981 -1903:0:4249 -1904:3:3993 -1905:0:4249 -1906:3:3994 -1907:3:3998 -1908:3:3999 -1909:3:4007 -1910:3:4008 -1911:3:4012 -1912:3:4013 -1913:3:4021 -1914:3:4034 -1915:3:4035 -1916:3:4038 -1917:3:4039 -1918:3:4050 -1919:3:4051 -1920:3:4052 -1921:3:4063 -1922:3:4068 -1923:3:4071 -1924:3:4072 -1925:0:4249 -1926:3:4084 -1927:0:4249 -1928:3:4089 -1929:3:4093 -1930:3:4094 -1931:3:4102 -1932:3:4103 -1933:3:4107 -1934:3:4108 -1935:3:4116 -1936:3:4129 -1937:3:4130 -1938:3:4133 -1939:3:4134 -1940:3:4145 -1941:3:4146 -1942:3:4147 -1943:3:4158 -1944:3:4163 -1945:3:4166 -1946:3:4167 -1947:0:4249 -1948:3:4183 -1949:0:4249 -1950:3:4185 -1951:0:4249 -1952:3:4186 -1953:0:4249 -1954:3:4189 -1955:0:4249 -1956:3:4194 -1957:0:4249 -1958:2:1016 -1959:0:4249 -1960:3:4195 -1961:0:4249 -1962:2:1022 -1963:0:4249 -1964:3:4194 -1965:0:4249 -1966:2:1023 -1967:0:4249 -1968:3:4195 -1969:0:4249 -1970:2:1024 -1971:0:4249 -1972:3:4194 -1973:0:4249 -1974:2:1025 -1975:0:4249 -1976:3:4195 -1977:0:4249 -1978:1:2 -1979:0:4249 -1980:3:4194 -1981:0:4249 -1982:2:1026 -1983:0:4249 -1984:3:4195 -1985:0:4249 -1986:1:8 -1987:0:4249 -1988:3:4194 -1989:0:4249 -1990:2:1025 -1991:0:4249 -1992:3:4195 -1993:0:4249 -1994:1:9 -1995:0:4249 -1996:3:4194 -1997:0:4249 -1998:2:1026 -1999:0:4249 -2000:3:4195 -2001:0:4249 -2002:1:10 -2003:0:4249 -2004:3:4194 -2005:0:4249 -2006:2:1025 -2007:0:4249 -2008:3:4195 -2009:0:4249 -2010:1:11 -2011:0:4249 -2012:3:4194 -2013:0:4249 -2014:2:1026 -2015:0:4249 -2016:3:4195 -2017:0:4249 -2018:1:12 -2019:1:16 -2020:1:17 -2021:1:25 -2022:1:26 -2023:1:30 -2024:1:31 -2025:1:39 -2026:1:44 -2027:1:48 -2028:1:49 -2029:1:56 -2030:1:57 -2031:1:68 -2032:1:69 -2033:1:70 -2034:1:81 -2035:1:86 -2036:1:87 -2037:0:4249 -2038:3:4194 -2039:0:4249 -2040:2:1025 -2041:0:4249 -2042:3:4195 -2043:0:4249 -2044:1:99 -2045:0:4249 -2046:3:4194 -2047:0:4249 -2048:2:1026 -2049:0:4249 -2050:3:4195 -2051:0:4249 -2052:2:1027 -2053:0:4249 -2054:3:4194 -2055:0:4249 -2056:2:1028 -2057:0:4249 -2058:3:4195 -2059:0:4249 -2060:2:1039 -2061:0:4249 -2062:3:4194 -2063:0:4249 -2064:2:1040 -2065:0:4249 -2066:3:4195 -2067:0:4249 -2068:2:1041 -2069:2:1045 -2070:2:1046 -2071:2:1054 -2072:2:1055 -2073:2:1059 -2074:2:1060 -2075:2:1068 -2076:2:1073 -2077:2:1077 -2078:2:1078 -2079:2:1085 -2080:2:1086 -2081:2:1097 -2082:2:1098 -2083:2:1099 -2084:2:1110 -2085:2:1115 -2086:2:1116 -2087:0:4249 -2088:3:4194 -2089:0:4249 -2090:2:1128 -2091:0:4249 -2092:3:4195 -2093:0:4249 -2094:2:1129 -2095:2:1133 -2096:2:1134 -2097:2:1142 -2098:2:1143 -2099:2:1147 -2100:2:1148 -2101:2:1156 -2102:2:1161 -2103:2:1165 -2104:2:1166 -2105:2:1173 -2106:2:1174 -2107:2:1185 -2108:2:1186 -2109:2:1187 -2110:2:1198 -2111:2:1203 -2112:2:1204 -2113:0:4249 -2114:3:4194 -2115:0:4249 -2116:2:1216 -2117:0:4249 -2118:3:4195 -2119:0:4249 -2120:2:1217 -2121:0:4249 -2122:3:4194 -2123:0:4249 -2124:2:1218 -2125:2:1222 -2126:2:1223 -2127:2:1231 -2128:2:1232 -2129:2:1236 -2130:2:1237 -2131:2:1245 -2132:2:1250 -2133:2:1254 -2134:2:1255 -2135:2:1262 -2136:2:1263 -2137:2:1274 -2138:2:1275 -2139:2:1276 -2140:2:1287 -2141:2:1292 -2142:2:1293 -2143:0:4249 -2144:3:4195 -2145:0:4249 -2146:2:1305 -2147:0:4249 -2148:3:4194 -2149:0:4249 -2150:2:1590 -2151:0:4249 -2152:3:4195 -2153:0:4249 -2154:2:1591 -2155:0:4249 -2156:3:4194 -2157:0:4249 -2158:2:1596 -2159:0:4249 -2160:3:4195 -2161:0:4249 -2162:2:1601 -2163:0:4249 -2164:3:4194 -2165:0:4249 -2166:2:1602 -2167:0:4247 -2168:3:4195 -2169:0:4253 -2170:2:1211 diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.define b/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.log b/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.log deleted file mode 100644 index 5eb694e..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.log +++ /dev/null @@ -1,280 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_rmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 742) - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 10519, errors: 0 - 20146 states, stored - 191615 states, matched - 211761 transitions (= stored+matched) - 711676 atomic steps -hash conflicts: 1222 (resolved) - -Stats on memory usage (in Megabytes): - 1.614 equivalent memory usage for states (stored*(State-vector + overhead)) - 1.509 actual memory usage for states (compression: 93.51%) - state-vector as stored = 51 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 467.229 total actual memory usage - -unreached in proctype urcu_reader_sig - line 402, "pan.___", state 330, "(1)" - line 613, "pan.___", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 59, "(1)" - line 417, "pan.___", state 89, "(1)" - line 398, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 408, "pan.___", state 160, "(1)" - line 651, "pan.___", state 213, "(1)" - line 174, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 178, "pan.___", state 233, "(1)" - line 174, "pan.___", state 257, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 658, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 182, "pan.___", state 660, "(1)" - line 182, "pan.___", state 661, "((cache_dirty_generation_ptr.bitfield&(1<<0)))" - line 182, "pan.___", state 661, "else" - line 174, "pan.___", state 671, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 693, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 174, "pan.___", state 710, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 712, "(1)" - line 178, "pan.___", state 719, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 721, "(1)" - line 178, "pan.___", state 722, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 722, "else" - line 176, "pan.___", state 727, "((j<1))" - line 176, "pan.___", state 727, "((j>=1))" - line 182, "pan.___", state 732, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 182, "pan.___", state 734, "(1)" - line 182, "pan.___", state 735, "((cache_dirty_generation_ptr.bitfield&(1<<0)))" - line 182, "pan.___", state 735, "else" - line 192, "pan.___", state 740, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 192, "pan.___", state 740, "else" - line 220, "pan.___", state 741, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 220, "pan.___", state 741, "else" - line 355, "pan.___", state 747, "((sighand_exec==1))" - line 355, "pan.___", state 747, "else" - line 361, "pan.___", state 750, "sighand_exec = 1" - line 398, "pan.___", state 763, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 765, "(1)" - line 398, "pan.___", state 766, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 766, "else" - line 398, "pan.___", state 769, "(1)" - line 402, "pan.___", state 777, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 779, "(1)" - line 402, "pan.___", state 780, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 780, "else" - line 402, "pan.___", state 783, "(1)" - line 402, "pan.___", state 784, "(1)" - line 402, "pan.___", state 784, "(1)" - line 400, "pan.___", state 789, "((i<1))" - line 400, "pan.___", state 789, "((i>=1))" - line 407, "pan.___", state 795, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 808, "(1)" - line 408, "pan.___", state 809, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 809, "else" - line 408, "pan.___", state 812, "(1)" - line 408, "pan.___", state 813, "(1)" - line 408, "pan.___", state 813, "(1)" - line 412, "pan.___", state 821, "(1)" - line 412, "pan.___", state 822, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 822, "else" - line 412, "pan.___", state 825, "(1)" - line 412, "pan.___", state 826, "(1)" - line 412, "pan.___", state 826, "(1)" - line 410, "pan.___", state 831, "((i<1))" - line 410, "pan.___", state 831, "((i>=1))" - line 417, "pan.___", state 838, "(1)" - line 417, "pan.___", state 839, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 839, "else" - line 417, "pan.___", state 842, "(1)" - line 417, "pan.___", state 843, "(1)" - line 417, "pan.___", state 843, "(1)" - line 419, "pan.___", state 846, "(1)" - line 419, "pan.___", state 846, "(1)" - line 361, "pan.___", state 855, "sighand_exec = 1" - line 402, "pan.___", state 886, "(1)" - line 407, "pan.___", state 902, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 945, "(1)" - line 402, "pan.___", state 983, "(1)" - line 407, "pan.___", state 999, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1042, "(1)" - line 398, "pan.___", state 1068, "(1)" - line 402, "pan.___", state 1082, "(1)" - line 407, "pan.___", state 1098, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1141, "(1)" - line 402, "pan.___", state 1182, "(1)" - line 407, "pan.___", state 1198, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1241, "(1)" - line 174, "pan.___", state 1262, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 1264, "(1)" - line 178, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 1273, "(1)" - line 178, "pan.___", state 1274, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 1274, "else" - line 176, "pan.___", state 1279, "((j<1))" - line 176, "pan.___", state 1279, "((j>=1))" - line 182, "pan.___", state 1284, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 182, "pan.___", state 1286, "(1)" - line 182, "pan.___", state 1287, "((cache_dirty_generation_ptr.bitfield&(1<<0)))" - line 182, "pan.___", state 1287, "else" - line 174, "pan.___", state 1297, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 1319, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 174, "pan.___", state 1336, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 1338, "(1)" - line 178, "pan.___", state 1345, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 1347, "(1)" - line 178, "pan.___", state 1348, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 1348, "else" - line 176, "pan.___", state 1353, "((j<1))" - line 176, "pan.___", state 1353, "((j>=1))" - line 182, "pan.___", state 1358, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 182, "pan.___", state 1360, "(1)" - line 182, "pan.___", state 1361, "((cache_dirty_generation_ptr.bitfield&(1<<0)))" - line 182, "pan.___", state 1361, "else" - line 192, "pan.___", state 1366, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 192, "pan.___", state 1366, "else" - line 220, "pan.___", state 1367, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 220, "pan.___", state 1367, "else" - line 355, "pan.___", state 1373, "((sighand_exec==1))" - line 355, "pan.___", state 1373, "else" - line 361, "pan.___", state 1376, "sighand_exec = 1" - line 398, "pan.___", state 1389, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 1391, "(1)" - line 398, "pan.___", state 1392, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 1392, "else" - line 398, "pan.___", state 1395, "(1)" - line 402, "pan.___", state 1403, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 1405, "(1)" - line 402, "pan.___", state 1406, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 1406, "else" - line 402, "pan.___", state 1409, "(1)" - line 402, "pan.___", state 1410, "(1)" - line 402, "pan.___", state 1410, "(1)" - line 400, "pan.___", state 1415, "((i<1))" - line 400, "pan.___", state 1415, "((i>=1))" - line 407, "pan.___", state 1421, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 1434, "(1)" - line 408, "pan.___", state 1435, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 1435, "else" - line 408, "pan.___", state 1438, "(1)" - line 408, "pan.___", state 1439, "(1)" - line 408, "pan.___", state 1439, "(1)" - line 412, "pan.___", state 1447, "(1)" - line 412, "pan.___", state 1448, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 1448, "else" - line 412, "pan.___", state 1451, "(1)" - line 412, "pan.___", state 1452, "(1)" - line 412, "pan.___", state 1452, "(1)" - line 410, "pan.___", state 1457, "((i<1))" - line 410, "pan.___", state 1457, "((i>=1))" - line 417, "pan.___", state 1464, "(1)" - line 417, "pan.___", state 1465, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 1465, "else" - line 417, "pan.___", state 1468, "(1)" - line 417, "pan.___", state 1469, "(1)" - line 417, "pan.___", state 1469, "(1)" - line 419, "pan.___", state 1472, "(1)" - line 419, "pan.___", state 1472, "(1)" - line 361, "pan.___", state 1481, "sighand_exec = 1" - line 178, "pan.___", state 1506, "(1)" - line 182, "pan.___", state 1517, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 174, "pan.___", state 1530, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.spin.input.trail b/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.spin.input.trail deleted file mode 100644 index 8219815..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_free_no_rmb.spin.input.trail +++ /dev/null @@ -1,1805 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:2905 -2:4:2857 -3:4:2860 -4:4:2860 -5:4:2863 -6:4:2871 -7:4:2871 -8:4:2874 -9:4:2880 -10:4:2884 -11:4:2884 -12:4:2887 -13:4:2895 -14:4:2899 -15:4:2900 -16:0:2905 -17:4:2902 -18:0:2905 -19:3:1319 -20:0:2905 -21:3:1325 -22:0:2905 -23:3:1326 -24:0:2905 -25:3:1327 -26:3:1331 -27:3:1332 -28:3:1340 -29:3:1341 -30:3:1345 -31:3:1346 -32:3:1354 -33:3:1359 -34:3:1363 -35:3:1364 -36:3:1371 -37:3:1372 -38:3:1383 -39:3:1384 -40:3:1385 -41:3:1396 -42:3:1401 -43:3:1402 -44:0:2905 -45:3:1414 -46:0:2905 -47:3:1416 -48:3:1417 -49:0:2905 -50:3:1421 -51:3:1425 -52:3:1426 -53:3:1434 -54:3:1435 -55:3:1439 -56:3:1440 -57:3:1448 -58:3:1453 -59:3:1454 -60:3:1465 -61:3:1466 -62:3:1477 -63:3:1478 -64:3:1479 -65:3:1490 -66:3:1495 -67:3:1496 -68:0:2905 -69:3:1508 -70:0:2905 -71:3:1510 -72:0:2905 -73:3:1511 -74:0:2905 -75:3:1521 -76:0:2905 -77:3:1522 -78:0:2905 -79:3:1526 -80:3:1527 -81:3:1531 -82:3:1535 -83:3:1536 -84:3:1540 -85:3:1548 -86:3:1549 -87:0:2905 -88:3:1557 -89:0:2905 -90:3:1561 -91:3:1562 -92:3:1566 -93:3:1570 -94:3:1571 -95:3:1575 -96:3:1583 -97:3:1584 -98:0:2905 -99:3:1592 -100:0:2905 -101:3:1600 -102:3:1601 -103:3:1605 -104:3:1609 -105:3:1610 -106:3:1614 -107:3:1622 -108:3:1623 -109:0:2905 -110:3:1635 -111:0:2905 -112:3:1637 -113:0:2905 -114:3:1638 -115:3:1642 -116:3:1643 -117:3:1651 -118:3:1652 -119:3:1656 -120:3:1657 -121:3:1665 -122:3:1670 -123:3:1674 -124:3:1675 -125:3:1682 -126:3:1683 -127:3:1694 -128:3:1695 -129:3:1696 -130:3:1707 -131:3:1712 -132:3:1713 -133:0:2905 -134:3:1725 -135:0:2905 -136:3:1727 -137:0:2905 -138:3:1730 -139:3:1731 -140:3:1743 -141:3:1744 -142:3:1748 -143:3:1749 -144:3:1757 -145:3:1762 -146:3:1766 -147:3:1767 -148:3:1774 -149:3:1775 -150:3:1786 -151:3:1787 -152:3:1788 -153:3:1799 -154:3:1804 -155:3:1805 -156:0:2905 -157:3:1817 -158:0:2905 -159:3:1819 -160:0:2905 -161:3:1820 -162:0:2905 -163:3:1821 -164:0:2905 -165:3:1822 -166:0:2905 -167:3:1823 -168:3:1827 -169:3:1828 -170:3:1836 -171:3:1837 -172:3:1841 -173:3:1842 -174:3:1850 -175:3:1855 -176:3:1859 -177:3:1860 -178:3:1867 -179:3:1868 -180:3:1879 -181:3:1880 -182:3:1881 -183:3:1892 -184:3:1897 -185:3:1898 -186:0:2905 -187:3:1910 -188:0:2905 -189:3:2028 -190:0:2905 -191:3:2126 -192:0:2905 -193:3:2127 -194:0:2905 -195:3:2131 -196:0:2905 -197:3:2137 -198:3:2141 -199:3:2142 -200:3:2150 -201:3:2151 -202:3:2155 -203:3:2156 -204:3:2164 -205:3:2169 -206:3:2173 -207:3:2174 -208:3:2181 -209:3:2182 -210:3:2193 -211:3:2194 -212:3:2195 -213:3:2206 -214:3:2211 -215:3:2212 -216:0:2905 -217:3:2224 -218:0:2905 -219:3:2226 -220:0:2905 -221:3:2227 -222:3:2231 -223:3:2232 -224:3:2240 -225:3:2241 -226:3:2245 -227:3:2246 -228:3:2254 -229:3:2259 -230:3:2263 -231:3:2264 -232:3:2271 -233:3:2272 -234:3:2283 -235:3:2284 -236:3:2285 -237:3:2296 -238:3:2301 -239:3:2302 -240:0:2905 -241:3:2314 -242:0:2905 -243:3:2316 -244:0:2905 -245:3:2319 -246:3:2320 -247:3:2332 -248:3:2333 -249:3:2337 -250:3:2338 -251:3:2346 -252:3:2351 -253:3:2355 -254:3:2356 -255:3:2363 -256:3:2364 -257:3:2375 -258:3:2376 -259:3:2377 -260:3:2388 -261:3:2393 -262:3:2394 -263:0:2905 -264:3:2406 -265:0:2905 -266:3:2408 -267:0:2905 -268:3:2409 -269:0:2905 -270:3:2410 -271:0:2905 -272:3:2411 -273:0:2905 -274:3:2412 -275:3:2416 -276:3:2417 -277:3:2425 -278:3:2426 -279:3:2430 -280:3:2431 -281:3:2439 -282:3:2444 -283:3:2448 -284:3:2449 -285:3:2456 -286:3:2457 -287:3:2468 -288:3:2469 -289:3:2470 -290:3:2481 -291:3:2486 -292:3:2487 -293:0:2905 -294:3:2499 -295:0:2905 -296:3:2617 -297:0:2905 -298:3:2715 -299:0:2905 -300:3:2716 -301:0:2905 -302:3:2720 -303:0:2905 -304:3:2726 -305:0:2905 -306:3:2730 -307:3:2731 -308:3:2735 -309:3:2739 -310:3:2740 -311:3:2744 -312:3:2752 -313:3:2753 -314:0:2905 -315:3:2761 -316:0:2905 -317:3:2765 -318:3:2766 -319:3:2770 -320:3:2774 -321:3:2775 -322:3:2779 -323:3:2787 -324:3:2788 -325:0:2905 -326:3:2796 -327:0:2905 -328:3:2804 -329:3:2805 -330:3:2809 -331:3:2813 -332:3:2814 -333:3:2818 -334:3:2826 -335:3:2827 -336:0:2905 -337:3:2839 -338:0:2905 -339:3:2841 -340:0:2905 -341:3:2842 -342:0:2905 -343:3:1326 -344:0:2905 -345:3:1327 -346:3:1331 -347:3:1332 -348:3:1340 -349:3:1341 -350:3:1345 -351:3:1346 -352:3:1354 -353:3:1359 -354:3:1363 -355:3:1364 -356:3:1371 -357:3:1372 -358:3:1383 -359:3:1384 -360:3:1385 -361:3:1396 -362:3:1401 -363:3:1402 -364:0:2905 -365:3:1414 -366:0:2905 -367:3:1416 -368:3:1417 -369:0:2905 -370:3:1421 -371:3:1425 -372:3:1426 -373:3:1434 -374:3:1435 -375:3:1439 -376:3:1440 -377:3:1448 -378:3:1453 -379:3:1454 -380:3:1465 -381:3:1466 -382:3:1477 -383:3:1478 -384:3:1479 -385:3:1490 -386:3:1495 -387:3:1496 -388:0:2905 -389:3:1508 -390:0:2905 -391:3:1510 -392:0:2905 -393:3:1511 -394:0:2905 -395:3:1521 -396:0:2905 -397:3:1522 -398:0:2905 -399:3:1526 -400:3:1527 -401:3:1531 -402:3:1535 -403:3:1536 -404:3:1540 -405:3:1548 -406:3:1549 -407:0:2905 -408:3:1557 -409:0:2905 -410:3:1561 -411:3:1562 -412:3:1566 -413:3:1570 -414:3:1571 -415:3:1575 -416:3:1583 -417:3:1584 -418:0:2905 -419:3:1592 -420:0:2905 -421:3:1600 -422:3:1601 -423:3:1605 -424:3:1609 -425:3:1610 -426:3:1614 -427:3:1622 -428:3:1623 -429:0:2905 -430:3:1635 -431:0:2905 -432:3:1637 -433:0:2905 -434:3:1638 -435:3:1642 -436:3:1643 -437:3:1651 -438:3:1652 -439:3:1656 -440:3:1657 -441:3:1665 -442:3:1670 -443:3:1674 -444:3:1675 -445:3:1682 -446:3:1683 -447:3:1694 -448:3:1695 -449:3:1696 -450:3:1707 -451:3:1712 -452:3:1713 -453:0:2905 -454:3:1725 -455:0:2905 -456:3:1727 -457:0:2905 -458:3:1730 -459:3:1731 -460:3:1743 -461:3:1744 -462:3:1748 -463:3:1749 -464:3:1757 -465:3:1762 -466:3:1766 -467:3:1767 -468:3:1774 -469:3:1775 -470:3:1786 -471:3:1787 -472:3:1788 -473:3:1799 -474:3:1804 -475:3:1805 -476:0:2905 -477:3:1817 -478:0:2905 -479:3:1819 -480:0:2905 -481:3:1820 -482:0:2905 -483:3:1821 -484:0:2905 -485:3:1822 -486:0:2905 -487:3:1823 -488:3:1827 -489:3:1828 -490:3:1836 -491:3:1837 -492:3:1841 -493:3:1842 -494:3:1850 -495:3:1855 -496:3:1859 -497:3:1860 -498:3:1867 -499:3:1868 -500:3:1879 -501:3:1880 -502:3:1881 -503:3:1892 -504:3:1897 -505:3:1898 -506:0:2905 -507:3:1910 -508:0:2905 -509:3:2028 -510:0:2905 -511:3:2126 -512:0:2905 -513:3:2127 -514:0:2905 -515:3:2131 -516:0:2905 -517:3:2137 -518:3:2141 -519:3:2142 -520:3:2150 -521:3:2151 -522:3:2155 -523:3:2156 -524:3:2164 -525:3:2169 -526:3:2173 -527:3:2174 -528:3:2181 -529:3:2182 -530:3:2193 -531:3:2194 -532:3:2195 -533:3:2206 -534:3:2211 -535:3:2212 -536:0:2905 -537:3:2224 -538:0:2905 -539:3:2226 -540:0:2905 -541:3:2227 -542:3:2231 -543:3:2232 -544:3:2240 -545:3:2241 -546:3:2245 -547:3:2246 -548:3:2254 -549:3:2259 -550:3:2263 -551:3:2264 -552:3:2271 -553:3:2272 -554:3:2283 -555:3:2284 -556:3:2285 -557:3:2296 -558:3:2301 -559:3:2302 -560:0:2905 -561:3:2314 -562:0:2905 -563:3:2316 -564:0:2905 -565:3:2319 -566:3:2320 -567:3:2332 -568:3:2333 -569:3:2337 -570:3:2338 -571:3:2346 -572:3:2351 -573:3:2355 -574:3:2356 -575:3:2363 -576:3:2364 -577:3:2375 -578:3:2376 -579:3:2377 -580:3:2388 -581:3:2393 -582:3:2394 -583:0:2905 -584:3:2406 -585:0:2905 -586:3:2408 -587:0:2905 -588:3:2409 -589:0:2905 -590:3:2410 -591:0:2905 -592:3:2411 -593:0:2905 -594:3:2412 -595:3:2416 -596:3:2417 -597:3:2425 -598:3:2426 -599:3:2430 -600:3:2431 -601:3:2439 -602:3:2444 -603:3:2448 -604:3:2449 -605:3:2456 -606:3:2457 -607:3:2468 -608:3:2469 -609:3:2470 -610:3:2481 -611:3:2486 -612:3:2487 -613:0:2905 -614:3:2499 -615:0:2905 -616:3:2617 -617:0:2905 -618:3:2715 -619:0:2905 -620:3:2716 -621:0:2905 -622:3:2720 -623:0:2905 -624:3:2726 -625:0:2905 -626:3:2730 -627:3:2731 -628:3:2735 -629:3:2739 -630:3:2740 -631:3:2744 -632:3:2752 -633:3:2753 -634:0:2905 -635:3:2761 -636:0:2905 -637:3:2765 -638:3:2766 -639:3:2770 -640:3:2774 -641:3:2775 -642:3:2779 -643:3:2787 -644:3:2788 -645:0:2905 -646:3:2796 -647:0:2905 -648:3:2804 -649:3:2805 -650:3:2809 -651:3:2813 -652:3:2814 -653:3:2818 -654:3:2826 -655:3:2827 -656:0:2905 -657:3:2839 -658:0:2905 -659:3:2841 -660:0:2905 -661:3:2842 -662:0:2905 -663:3:1326 -664:0:2905 -665:3:1327 -666:3:1331 -667:3:1332 -668:3:1340 -669:3:1341 -670:3:1345 -671:3:1346 -672:3:1354 -673:3:1359 -674:3:1363 -675:3:1364 -676:3:1371 -677:3:1372 -678:3:1383 -679:3:1384 -680:3:1385 -681:3:1396 -682:3:1401 -683:3:1402 -684:0:2905 -685:3:1414 -686:0:2905 -687:3:1416 -688:3:1417 -689:0:2905 -690:3:1421 -691:3:1425 -692:3:1426 -693:3:1434 -694:3:1435 -695:3:1439 -696:3:1440 -697:3:1448 -698:3:1453 -699:3:1454 -700:3:1465 -701:3:1466 -702:3:1477 -703:3:1478 -704:3:1479 -705:3:1490 -706:3:1495 -707:3:1496 -708:0:2905 -709:3:1508 -710:0:2905 -711:3:1510 -712:0:2905 -713:3:1511 -714:0:2905 -715:3:1521 -716:0:2905 -717:3:1522 -718:0:2905 -719:3:1526 -720:3:1527 -721:3:1531 -722:3:1535 -723:3:1536 -724:3:1540 -725:3:1548 -726:3:1549 -727:0:2905 -728:3:1557 -729:0:2905 -730:3:1561 -731:3:1562 -732:3:1566 -733:3:1570 -734:3:1571 -735:3:1575 -736:3:1583 -737:3:1584 -738:0:2905 -739:3:1592 -740:0:2905 -741:3:1600 -742:3:1601 -743:3:1605 -744:3:1609 -745:3:1610 -746:3:1614 -747:3:1622 -748:3:1623 -749:0:2905 -750:3:1635 -751:0:2905 -752:3:1637 -753:0:2905 -754:3:1638 -755:3:1642 -756:3:1643 -757:3:1651 -758:3:1652 -759:3:1656 -760:3:1657 -761:3:1665 -762:3:1670 -763:3:1674 -764:3:1675 -765:3:1682 -766:3:1683 -767:3:1694 -768:3:1695 -769:3:1696 -770:3:1707 -771:3:1712 -772:3:1713 -773:0:2905 -774:3:1725 -775:0:2905 -776:3:1727 -777:0:2905 -778:3:1730 -779:3:1731 -780:3:1743 -781:3:1744 -782:3:1748 -783:3:1749 -784:3:1757 -785:3:1762 -786:3:1766 -787:3:1767 -788:3:1774 -789:3:1775 -790:3:1786 -791:3:1787 -792:3:1788 -793:3:1799 -794:3:1804 -795:3:1805 -796:0:2905 -797:3:1817 -798:0:2905 -799:3:1819 -800:0:2905 -801:3:1820 -802:0:2905 -803:3:1821 -804:0:2905 -805:3:1822 -806:0:2905 -807:3:1823 -808:3:1827 -809:3:1828 -810:3:1836 -811:3:1837 -812:3:1841 -813:3:1842 -814:3:1850 -815:3:1855 -816:3:1859 -817:3:1860 -818:3:1867 -819:3:1868 -820:3:1879 -821:3:1880 -822:3:1881 -823:3:1892 -824:3:1897 -825:3:1898 -826:0:2905 -827:3:1910 -828:0:2905 -829:3:2028 -830:0:2905 -831:3:2126 -832:0:2905 -833:3:2127 -834:0:2905 -835:3:2131 -836:0:2905 -837:3:2137 -838:3:2141 -839:3:2142 -840:3:2150 -841:3:2151 -842:3:2155 -843:3:2156 -844:3:2164 -845:3:2169 -846:3:2173 -847:3:2174 -848:3:2181 -849:3:2182 -850:3:2193 -851:3:2194 -852:3:2195 -853:3:2206 -854:3:2211 -855:3:2212 -856:0:2905 -857:3:2224 -858:0:2905 -859:3:2226 -860:0:2905 -861:3:2227 -862:3:2231 -863:3:2232 -864:3:2240 -865:3:2241 -866:3:2245 -867:3:2246 -868:3:2254 -869:3:2259 -870:3:2263 -871:3:2264 -872:3:2271 -873:3:2272 -874:3:2283 -875:3:2284 -876:3:2285 -877:3:2296 -878:3:2301 -879:3:2302 -880:0:2905 -881:3:2314 -882:0:2905 -883:3:2316 -884:0:2905 -885:3:2319 -886:3:2320 -887:3:2332 -888:3:2333 -889:3:2337 -890:3:2338 -891:3:2346 -892:3:2351 -893:3:2355 -894:3:2356 -895:3:2363 -896:3:2364 -897:3:2375 -898:3:2376 -899:3:2377 -900:3:2388 -901:3:2393 -902:3:2394 -903:0:2905 -904:3:2406 -905:0:2905 -906:3:2408 -907:0:2905 -908:3:2409 -909:0:2905 -910:3:2410 -911:0:2905 -912:3:2411 -913:0:2905 -914:3:2412 -915:3:2416 -916:3:2417 -917:3:2425 -918:3:2426 -919:3:2430 -920:3:2431 -921:3:2439 -922:3:2444 -923:3:2448 -924:3:2449 -925:3:2456 -926:3:2457 -927:3:2468 -928:3:2469 -929:3:2470 -930:3:2481 -931:3:2486 -932:3:2487 -933:0:2905 -934:3:2499 -935:0:2905 -936:3:2617 -937:0:2905 -938:3:2715 -939:0:2905 -940:3:2716 -941:0:2905 -942:3:2720 -943:0:2905 -944:3:2726 -945:0:2905 -946:3:2730 -947:3:2731 -948:3:2735 -949:3:2739 -950:3:2740 -951:3:2744 -952:3:2752 -953:3:2753 -954:0:2905 -955:3:2761 -956:0:2905 -957:3:2765 -958:3:2766 -959:3:2770 -960:3:2774 -961:3:2775 -962:3:2779 -963:3:2787 -964:3:2788 -965:0:2905 -966:3:2796 -967:0:2905 -968:3:2804 -969:3:2805 -970:3:2809 -971:3:2813 -972:3:2814 -973:3:2818 -974:3:2826 -975:3:2827 -976:0:2905 -977:3:2839 -978:0:2905 -979:3:2841 -980:0:2905 -981:3:2842 -982:0:2905 -983:3:1326 -984:0:2905 -985:3:1327 -986:3:1331 -987:3:1332 -988:3:1340 -989:3:1341 -990:3:1345 -991:3:1346 -992:3:1354 -993:3:1359 -994:3:1363 -995:3:1364 -996:3:1371 -997:3:1372 -998:3:1383 -999:3:1384 -1000:3:1385 -1001:3:1396 -1002:3:1401 -1003:3:1402 -1004:0:2905 -1005:3:1414 -1006:0:2905 -1007:3:1416 -1008:3:1417 -1009:0:2905 -1010:3:1421 -1011:3:1425 -1012:3:1426 -1013:3:1434 -1014:3:1435 -1015:3:1439 -1016:3:1440 -1017:3:1448 -1018:3:1453 -1019:3:1454 -1020:3:1465 -1021:3:1466 -1022:3:1477 -1023:3:1478 -1024:3:1479 -1025:3:1490 -1026:3:1495 -1027:3:1496 -1028:0:2905 -1029:3:1508 -1030:0:2905 -1031:3:1510 -1032:0:2905 -1033:3:1511 -1034:0:2905 -1035:3:1521 -1036:0:2905 -1037:3:1522 -1038:0:2905 -1039:3:1526 -1040:3:1527 -1041:3:1531 -1042:3:1535 -1043:3:1536 -1044:3:1540 -1045:3:1548 -1046:3:1549 -1047:0:2905 -1048:3:1557 -1049:0:2905 -1050:3:1561 -1051:3:1562 -1052:3:1566 -1053:3:1570 -1054:3:1571 -1055:3:1575 -1056:3:1583 -1057:3:1584 -1058:0:2905 -1059:3:1592 -1060:0:2905 -1061:3:1600 -1062:3:1601 -1063:3:1605 -1064:3:1609 -1065:3:1610 -1066:3:1614 -1067:3:1622 -1068:3:1623 -1069:0:2905 -1070:3:1635 -1071:0:2905 -1072:3:1637 -1073:0:2905 -1074:3:1638 -1075:3:1642 -1076:3:1643 -1077:3:1651 -1078:3:1652 -1079:3:1656 -1080:3:1657 -1081:3:1665 -1082:3:1670 -1083:3:1674 -1084:3:1675 -1085:3:1682 -1086:3:1683 -1087:3:1694 -1088:3:1695 -1089:3:1696 -1090:3:1707 -1091:3:1712 -1092:3:1713 -1093:0:2905 -1094:3:1725 -1095:0:2905 -1096:3:1727 -1097:0:2905 -1098:3:1730 -1099:3:1731 -1100:3:1743 -1101:3:1744 -1102:3:1748 -1103:3:1749 -1104:3:1757 -1105:3:1762 -1106:3:1766 -1107:3:1767 -1108:3:1774 -1109:3:1775 -1110:3:1786 -1111:3:1787 -1112:3:1788 -1113:3:1799 -1114:3:1804 -1115:3:1805 -1116:0:2905 -1117:3:1817 -1118:0:2905 -1119:3:1819 -1120:0:2905 -1121:3:1820 -1122:0:2905 -1123:3:1821 -1124:0:2905 -1125:3:1822 -1126:0:2905 -1127:3:1823 -1128:3:1827 -1129:3:1828 -1130:3:1836 -1131:3:1837 -1132:3:1841 -1133:3:1842 -1134:3:1850 -1135:3:1855 -1136:3:1859 -1137:3:1860 -1138:3:1867 -1139:3:1868 -1140:3:1879 -1141:3:1880 -1142:3:1881 -1143:3:1892 -1144:3:1897 -1145:3:1898 -1146:0:2905 -1147:3:1910 -1148:0:2905 -1149:3:2028 -1150:0:2905 -1151:3:2126 -1152:0:2905 -1153:3:2127 -1154:0:2905 -1155:3:2131 -1156:0:2905 -1157:3:2137 -1158:3:2141 -1159:3:2142 -1160:3:2150 -1161:3:2151 -1162:3:2155 -1163:3:2156 -1164:3:2164 -1165:3:2169 -1166:3:2173 -1167:3:2174 -1168:3:2181 -1169:3:2182 -1170:3:2193 -1171:3:2194 -1172:3:2195 -1173:3:2206 -1174:3:2211 -1175:3:2212 -1176:0:2905 -1177:3:2224 -1178:0:2905 -1179:3:2226 -1180:0:2905 -1181:3:2227 -1182:3:2231 -1183:3:2232 -1184:3:2240 -1185:3:2241 -1186:3:2245 -1187:3:2246 -1188:3:2254 -1189:3:2259 -1190:3:2263 -1191:3:2264 -1192:3:2271 -1193:3:2272 -1194:3:2283 -1195:3:2284 -1196:3:2285 -1197:3:2296 -1198:3:2301 -1199:3:2302 -1200:0:2905 -1201:3:2314 -1202:0:2905 -1203:3:2316 -1204:0:2905 -1205:3:2319 -1206:3:2320 -1207:3:2332 -1208:3:2333 -1209:3:2337 -1210:3:2338 -1211:3:2346 -1212:3:2351 -1213:3:2355 -1214:3:2356 -1215:3:2363 -1216:3:2364 -1217:3:2375 -1218:3:2376 -1219:3:2377 -1220:3:2388 -1221:3:2393 -1222:3:2394 -1223:0:2905 -1224:3:2406 -1225:0:2905 -1226:3:2408 -1227:0:2905 -1228:3:2409 -1229:0:2905 -1230:3:2410 -1231:0:2905 -1232:3:2411 -1233:0:2905 -1234:3:2412 -1235:3:2416 -1236:3:2417 -1237:3:2425 -1238:3:2426 -1239:3:2430 -1240:3:2431 -1241:3:2439 -1242:3:2444 -1243:3:2448 -1244:3:2449 -1245:3:2456 -1246:3:2457 -1247:3:2468 -1248:3:2469 -1249:3:2470 -1250:3:2481 -1251:3:2486 -1252:3:2487 -1253:0:2905 -1254:3:2499 -1255:0:2905 -1256:3:2617 -1257:0:2905 -1258:3:2715 -1259:0:2905 -1260:3:2716 -1261:0:2905 -1262:3:2720 -1263:0:2905 -1264:3:2726 -1265:0:2905 -1266:3:2730 -1267:3:2731 -1268:3:2735 -1269:3:2739 -1270:3:2740 -1271:3:2744 -1272:3:2752 -1273:3:2753 -1274:0:2905 -1275:3:2761 -1276:0:2905 -1277:3:2765 -1278:3:2766 -1279:3:2770 -1280:3:2774 -1281:3:2775 -1282:3:2779 -1283:3:2787 -1284:3:2788 -1285:0:2905 -1286:3:2796 -1287:0:2905 -1288:3:2804 -1289:3:2805 -1290:3:2809 -1291:3:2813 -1292:3:2814 -1293:3:2818 -1294:3:2826 -1295:3:2827 -1296:0:2905 -1297:3:2839 -1298:0:2905 -1299:3:2841 -1300:0:2905 -1301:3:2842 -1302:0:2905 -1303:3:1326 -1304:0:2905 -1305:3:1327 -1306:3:1331 -1307:3:1332 -1308:3:1340 -1309:3:1341 -1310:3:1345 -1311:3:1346 -1312:3:1354 -1313:3:1359 -1314:3:1363 -1315:3:1364 -1316:3:1371 -1317:3:1372 -1318:3:1383 -1319:3:1384 -1320:3:1385 -1321:3:1396 -1322:3:1401 -1323:3:1402 -1324:0:2905 -1325:3:1414 -1326:0:2905 -1327:3:1416 -1328:3:1417 -1329:0:2905 -1330:3:1421 -1331:3:1425 -1332:3:1426 -1333:3:1434 -1334:3:1435 -1335:3:1439 -1336:3:1440 -1337:3:1448 -1338:3:1461 -1339:3:1462 -1340:3:1465 -1341:3:1466 -1342:3:1477 -1343:3:1478 -1344:3:1479 -1345:3:1490 -1346:3:1495 -1347:3:1498 -1348:3:1499 -1349:0:2905 -1350:3:1508 -1351:0:2905 -1352:3:1510 -1353:0:2905 -1354:3:1511 -1355:0:2905 -1356:3:1521 -1357:0:2905 -1358:3:1522 -1359:0:2905 -1360:2:680 -1361:0:2905 -1362:2:686 -1363:0:2905 -1364:2:687 -1365:0:2905 -1366:2:688 -1367:0:2905 -1368:2:689 -1369:0:2905 -1370:1:2 -1371:0:2905 -1372:2:690 -1373:0:2905 -1374:1:8 -1375:0:2905 -1376:1:9 -1377:0:2905 -1378:1:10 -1379:0:2905 -1380:1:11 -1381:0:2905 -1382:2:689 -1383:0:2905 -1384:1:12 -1385:1:16 -1386:1:17 -1387:1:25 -1388:1:26 -1389:1:30 -1390:1:31 -1391:1:39 -1392:1:44 -1393:1:48 -1394:1:49 -1395:1:56 -1396:1:57 -1397:1:68 -1398:1:69 -1399:1:70 -1400:1:81 -1401:1:86 -1402:1:87 -1403:0:2905 -1404:2:690 -1405:0:2905 -1406:3:1526 -1407:3:1527 -1408:3:1531 -1409:3:1535 -1410:3:1536 -1411:3:1540 -1412:3:1545 -1413:0:2905 -1414:3:1557 -1415:0:2905 -1416:3:1561 -1417:3:1562 -1418:3:1566 -1419:3:1570 -1420:3:1571 -1421:3:1575 -1422:3:1583 -1423:3:1584 -1424:0:2905 -1425:3:1592 -1426:0:2905 -1427:3:1600 -1428:3:1601 -1429:3:1605 -1430:3:1609 -1431:3:1610 -1432:3:1614 -1433:3:1622 -1434:3:1623 -1435:0:2905 -1436:3:1635 -1437:0:2905 -1438:3:1637 -1439:0:2905 -1440:3:1638 -1441:3:1642 -1442:3:1643 -1443:3:1651 -1444:3:1652 -1445:3:1656 -1446:3:1657 -1447:3:1665 -1448:3:1670 -1449:3:1674 -1450:3:1675 -1451:3:1682 -1452:3:1683 -1453:3:1694 -1454:3:1695 -1455:3:1696 -1456:3:1707 -1457:3:1712 -1458:3:1713 -1459:0:2905 -1460:3:1725 -1461:0:2905 -1462:3:1727 -1463:0:2905 -1464:3:1730 -1465:3:1731 -1466:3:1743 -1467:3:1744 -1468:3:1748 -1469:3:1749 -1470:3:1757 -1471:3:1762 -1472:3:1766 -1473:3:1767 -1474:3:1774 -1475:3:1775 -1476:3:1786 -1477:3:1787 -1478:3:1788 -1479:3:1799 -1480:3:1804 -1481:3:1805 -1482:0:2905 -1483:3:1817 -1484:0:2905 -1485:3:1819 -1486:0:2905 -1487:3:1820 -1488:0:2905 -1489:3:1821 -1490:0:2905 -1491:3:1822 -1492:0:2905 -1493:3:1823 -1494:3:1827 -1495:3:1828 -1496:3:1836 -1497:3:1837 -1498:3:1841 -1499:3:1842 -1500:3:1850 -1501:3:1855 -1502:3:1859 -1503:3:1860 -1504:3:1867 -1505:3:1868 -1506:3:1879 -1507:3:1880 -1508:3:1881 -1509:3:1892 -1510:3:1897 -1511:3:1898 -1512:0:2905 -1513:3:1910 -1514:0:2905 -1515:3:2028 -1516:0:2905 -1517:3:2126 -1518:0:2905 -1519:3:2127 -1520:0:2905 -1521:3:2131 -1522:0:2905 -1523:3:2137 -1524:3:2141 -1525:3:2142 -1526:3:2150 -1527:3:2151 -1528:3:2155 -1529:3:2156 -1530:3:2164 -1531:3:2169 -1532:3:2173 -1533:3:2174 -1534:3:2181 -1535:3:2182 -1536:3:2193 -1537:3:2194 -1538:3:2195 -1539:3:2206 -1540:3:2211 -1541:3:2212 -1542:0:2905 -1543:3:2224 -1544:0:2905 -1545:3:2226 -1546:0:2905 -1547:3:2227 -1548:3:2231 -1549:3:2232 -1550:3:2240 -1551:3:2241 -1552:3:2245 -1553:3:2246 -1554:3:2254 -1555:3:2259 -1556:3:2263 -1557:3:2264 -1558:3:2271 -1559:3:2272 -1560:3:2283 -1561:3:2284 -1562:3:2285 -1563:3:2296 -1564:3:2301 -1565:3:2302 -1566:0:2905 -1567:3:2314 -1568:0:2905 -1569:3:2316 -1570:0:2905 -1571:3:2319 -1572:3:2320 -1573:3:2332 -1574:3:2333 -1575:3:2337 -1576:3:2338 -1577:3:2346 -1578:3:2351 -1579:3:2355 -1580:3:2356 -1581:3:2363 -1582:3:2364 -1583:3:2375 -1584:3:2376 -1585:3:2377 -1586:3:2388 -1587:3:2393 -1588:3:2394 -1589:0:2905 -1590:3:2406 -1591:0:2905 -1592:3:2408 -1593:0:2905 -1594:3:2409 -1595:0:2905 -1596:3:2410 -1597:0:2905 -1598:3:2411 -1599:0:2905 -1600:3:2412 -1601:3:2416 -1602:3:2417 -1603:3:2425 -1604:3:2426 -1605:3:2430 -1606:3:2431 -1607:3:2439 -1608:3:2444 -1609:3:2448 -1610:3:2449 -1611:3:2456 -1612:3:2457 -1613:3:2468 -1614:3:2469 -1615:3:2470 -1616:3:2481 -1617:3:2486 -1618:3:2487 -1619:0:2905 -1620:3:2499 -1621:0:2905 -1622:3:2617 -1623:0:2905 -1624:3:2715 -1625:0:2905 -1626:3:2716 -1627:0:2905 -1628:3:2720 -1629:0:2905 -1630:3:2726 -1631:0:2905 -1632:3:2730 -1633:3:2731 -1634:3:2735 -1635:3:2739 -1636:3:2740 -1637:3:2744 -1638:3:2752 -1639:3:2753 -1640:0:2905 -1641:3:2761 -1642:0:2905 -1643:3:2765 -1644:3:2766 -1645:3:2770 -1646:3:2774 -1647:3:2775 -1648:3:2779 -1649:3:2787 -1650:3:2788 -1651:0:2905 -1652:3:2796 -1653:0:2905 -1654:3:2804 -1655:3:2805 -1656:3:2809 -1657:3:2813 -1658:3:2814 -1659:3:2818 -1660:3:2826 -1661:3:2827 -1662:0:2905 -1663:3:2839 -1664:0:2905 -1665:3:2841 -1666:0:2905 -1667:3:2842 -1668:0:2905 -1669:3:2845 -1670:0:2905 -1671:3:2850 -1672:0:2905 -1673:2:689 -1674:0:2905 -1675:3:2851 -1676:0:2905 -1677:1:99 -1678:0:2905 -1679:3:2850 -1680:0:2905 -1681:2:690 -1682:0:2905 -1683:3:2851 -1684:0:2905 -1685:2:691 -1686:0:2905 -1687:3:2850 -1688:0:2905 -1689:2:692 -1690:0:2905 -1691:3:2851 -1692:0:2905 -1693:2:703 -1694:0:2905 -1695:3:2850 -1696:0:2905 -1697:2:704 -1698:0:2905 -1699:3:2851 -1700:0:2905 -1701:2:705 -1702:2:709 -1703:2:710 -1704:2:718 -1705:2:719 -1706:2:723 -1707:2:724 -1708:2:732 -1709:2:737 -1710:2:741 -1711:2:742 -1712:2:749 -1713:2:750 -1714:2:761 -1715:2:762 -1716:2:763 -1717:2:774 -1718:2:786 -1719:2:787 -1720:0:2905 -1721:3:2850 -1722:0:2905 -1723:2:792 -1724:0:2905 -1725:3:2851 -1726:0:2905 -1727:2:793 -1728:2:797 -1729:2:798 -1730:2:806 -1731:2:807 -1732:2:811 -1733:2:812 -1734:2:820 -1735:2:825 -1736:2:829 -1737:2:830 -1738:2:837 -1739:2:838 -1740:2:849 -1741:2:850 -1742:2:851 -1743:2:862 -1744:2:874 -1745:2:875 -1746:0:2905 -1747:3:2850 -1748:0:2905 -1749:2:880 -1750:0:2905 -1751:3:2851 -1752:0:2905 -1753:2:881 -1754:0:2905 -1755:3:2850 -1756:0:2905 -1757:2:882 -1758:2:886 -1759:2:887 -1760:2:895 -1761:2:896 -1762:2:900 -1763:2:901 -1764:2:909 -1765:2:914 -1766:2:918 -1767:2:919 -1768:2:926 -1769:2:927 -1770:2:938 -1771:2:939 -1772:2:940 -1773:2:951 -1774:2:963 -1775:2:964 -1776:0:2905 -1777:3:2851 -1778:0:2905 -1779:2:969 -1780:0:2905 -1781:3:2850 -1782:0:2905 -1783:2:1086 -1784:0:2905 -1785:3:2851 -1786:0:2905 -1787:2:1087 -1788:0:2905 -1789:3:2850 -1790:0:2905 -1791:2:1092 -1792:0:2905 -1793:3:2851 -1794:0:2905 -1795:2:1097 -1796:0:2905 -1797:3:2850 -1798:0:2905 -1799:2:1098 -1800:0:2903 -1801:3:2851 -1802:0:2909 -1803:3:1630 diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.define b/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.log b/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.log deleted file mode 100644 index a346ed9..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.log +++ /dev/null @@ -1,224 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_wmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 742) - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 10499, errors: 0 - 159431 states, stored - 1505398 states, matched - 1664829 transitions (= stored+matched) - 5794809 atomic steps -hash conflicts: 62144 (resolved) - -Stats on memory usage (in Megabytes): - 12.772 equivalent memory usage for states (stored*(State-vector + overhead)) - 8.936 actual memory usage for states (compression: 69.96%) - state-vector as stored = 31 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 474.651 total actual memory usage - -unreached in proctype urcu_reader_sig - line 402, "pan.___", state 330, "(1)" - line 613, "pan.___", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 651, "pan.___", state 213, "(1)" - line 402, "pan.___", state 348, "(1)" - line 398, "pan.___", state 433, "(1)" - line 402, "pan.___", state 447, "(1)" - line 402, "pan.___", state 547, "(1)" - line 159, "pan.___", state 628, "(1)" - line 163, "pan.___", state 636, "(1)" - line 163, "pan.___", state 637, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 637, "else" - line 161, "pan.___", state 642, "((j<1))" - line 161, "pan.___", state 642, "((j>=1))" - line 167, "pan.___", state 648, "(1)" - line 167, "pan.___", state 649, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 649, "else" - line 159, "pan.___", state 660, "(1)" - line 163, "pan.___", state 668, "(1)" - line 163, "pan.___", state 669, "(!((cache_dirty_urcu_active_readers.bitfield&(1<=1))" - line 167, "pan.___", state 680, "(1)" - line 167, "pan.___", state 681, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 159, "pan.___", state 696, "(1)" - line 163, "pan.___", state 704, "(1)" - line 163, "pan.___", state 705, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 705, "else" - line 161, "pan.___", state 710, "((j<1))" - line 161, "pan.___", state 710, "((j>=1))" - line 167, "pan.___", state 716, "(1)" - line 167, "pan.___", state 717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 717, "else" - line 201, "pan.___", state 722, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 201, "pan.___", state 722, "else" - line 220, "pan.___", state 723, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 220, "pan.___", state 723, "else" - line 355, "pan.___", state 729, "((sighand_exec==1))" - line 355, "pan.___", state 729, "else" - line 361, "pan.___", state 732, "sighand_exec = 1" - line 398, "pan.___", state 745, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 747, "(1)" - line 398, "pan.___", state 748, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 748, "else" - line 398, "pan.___", state 751, "(1)" - line 402, "pan.___", state 759, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 761, "(1)" - line 402, "pan.___", state 762, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 762, "else" - line 402, "pan.___", state 765, "(1)" - line 402, "pan.___", state 766, "(1)" - line 402, "pan.___", state 766, "(1)" - line 400, "pan.___", state 771, "((i<1))" - line 400, "pan.___", state 771, "((i>=1))" - line 407, "pan.___", state 777, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 790, "(1)" - line 408, "pan.___", state 791, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 791, "else" - line 408, "pan.___", state 794, "(1)" - line 408, "pan.___", state 795, "(1)" - line 408, "pan.___", state 795, "(1)" - line 412, "pan.___", state 803, "(1)" - line 412, "pan.___", state 804, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 804, "else" - line 412, "pan.___", state 807, "(1)" - line 412, "pan.___", state 808, "(1)" - line 412, "pan.___", state 808, "(1)" - line 410, "pan.___", state 813, "((i<1))" - line 410, "pan.___", state 813, "((i>=1))" - line 417, "pan.___", state 820, "(1)" - line 417, "pan.___", state 821, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 821, "else" - line 417, "pan.___", state 824, "(1)" - line 417, "pan.___", state 825, "(1)" - line 417, "pan.___", state 825, "(1)" - line 419, "pan.___", state 828, "(1)" - line 419, "pan.___", state 828, "(1)" - line 361, "pan.___", state 837, "sighand_exec = 1" - line 402, "pan.___", state 868, "(1)" - line 402, "pan.___", state 965, "(1)" - line 398, "pan.___", state 1050, "(1)" - line 402, "pan.___", state 1064, "(1)" - line 402, "pan.___", state 1164, "(1)" - line 159, "pan.___", state 1245, "(1)" - line 163, "pan.___", state 1253, "(1)" - line 163, "pan.___", state 1254, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 1254, "else" - line 161, "pan.___", state 1259, "((j<1))" - line 161, "pan.___", state 1259, "((j>=1))" - line 167, "pan.___", state 1265, "(1)" - line 167, "pan.___", state 1266, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 1266, "else" - line 159, "pan.___", state 1277, "(1)" - line 163, "pan.___", state 1285, "(1)" - line 163, "pan.___", state 1286, "(!((cache_dirty_urcu_active_readers.bitfield&(1<=1))" - line 167, "pan.___", state 1297, "(1)" - line 167, "pan.___", state 1298, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 159, "pan.___", state 1313, "(1)" - line 163, "pan.___", state 1321, "(1)" - line 163, "pan.___", state 1322, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 1322, "else" - line 161, "pan.___", state 1327, "((j<1))" - line 161, "pan.___", state 1327, "((j>=1))" - line 167, "pan.___", state 1333, "(1)" - line 167, "pan.___", state 1334, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 1334, "else" - line 201, "pan.___", state 1339, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 201, "pan.___", state 1339, "else" - line 220, "pan.___", state 1340, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 220, "pan.___", state 1340, "else" - line 355, "pan.___", state 1346, "((sighand_exec==1))" - line 355, "pan.___", state 1346, "else" - line 361, "pan.___", state 1349, "sighand_exec = 1" - line 398, "pan.___", state 1362, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 1364, "(1)" - line 398, "pan.___", state 1365, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 1365, "else" - line 398, "pan.___", state 1368, "(1)" - line 402, "pan.___", state 1376, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 1378, "(1)" - line 402, "pan.___", state 1379, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 1379, "else" - line 402, "pan.___", state 1382, "(1)" - line 402, "pan.___", state 1383, "(1)" - line 402, "pan.___", state 1383, "(1)" - line 400, "pan.___", state 1388, "((i<1))" - line 400, "pan.___", state 1388, "((i>=1))" - line 407, "pan.___", state 1394, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 1407, "(1)" - line 408, "pan.___", state 1408, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 1408, "else" - line 408, "pan.___", state 1411, "(1)" - line 408, "pan.___", state 1412, "(1)" - line 408, "pan.___", state 1412, "(1)" - line 412, "pan.___", state 1420, "(1)" - line 412, "pan.___", state 1421, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 1421, "else" - line 412, "pan.___", state 1424, "(1)" - line 412, "pan.___", state 1425, "(1)" - line 412, "pan.___", state 1425, "(1)" - line 410, "pan.___", state 1430, "((i<1))" - line 410, "pan.___", state 1430, "((i>=1))" - line 417, "pan.___", state 1437, "(1)" - line 417, "pan.___", state 1438, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 1438, "else" - line 417, "pan.___", state 1441, "(1)" - line 417, "pan.___", state 1442, "(1)" - line 417, "pan.___", state 1442, "(1)" - line 419, "pan.___", state 1445, "(1)" - line 419, "pan.___", state 1445, "(1)" - line 361, "pan.___", state 1454, "sighand_exec = 1" - line 701, "pan.___", state 1596, "-end-" - (111 of 1596 states) -unreached in proctype :init: - (0 of 46 states) -unreached in proctype :never: - line 747, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 1.23 seconds -pan: rate 129618.7 states/second -pan: avg transition delay 7.3881e-07 usec -cp .input.spin urcu_free_no_wmb.spin.input -cp .input.spin.trail urcu_free_no_wmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.spin.input b/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.spin.input deleted file mode 100644 index 808154e..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.spin.input +++ /dev/null @@ -1,722 +0,0 @@ -#define NO_WMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.spin.input.trail deleted file mode 100644 index 522df0a..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_free_no_wmb.spin.input.trail +++ /dev/null @@ -1,1677 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:2833 -2:4:2785 -3:4:2788 -4:4:2788 -5:4:2791 -6:4:2799 -7:4:2799 -8:4:2802 -9:4:2808 -10:4:2812 -11:4:2812 -12:4:2815 -13:4:2823 -14:4:2827 -15:4:2828 -16:0:2833 -17:4:2830 -18:0:2833 -19:3:1283 -20:0:2833 -21:3:1289 -22:0:2833 -23:3:1290 -24:0:2833 -25:3:1291 -26:3:1295 -27:3:1296 -28:3:1304 -29:3:1305 -30:3:1309 -31:3:1310 -32:3:1318 -33:3:1323 -34:3:1327 -35:3:1328 -36:3:1335 -37:3:1336 -38:3:1347 -39:3:1348 -40:3:1349 -41:3:1360 -42:3:1365 -43:3:1366 -44:0:2833 -45:3:1378 -46:0:2833 -47:3:1380 -48:3:1381 -49:0:2833 -50:3:1385 -51:3:1389 -52:3:1390 -53:3:1398 -54:3:1399 -55:3:1403 -56:3:1404 -57:3:1412 -58:3:1417 -59:3:1418 -60:3:1429 -61:3:1430 -62:3:1441 -63:3:1442 -64:3:1443 -65:3:1454 -66:3:1459 -67:3:1460 -68:0:2833 -69:3:1472 -70:0:2833 -71:3:1474 -72:0:2833 -73:3:1475 -74:0:2833 -75:3:1485 -76:0:2833 -77:3:1486 -78:0:2833 -79:3:1487 -80:3:1494 -81:3:1495 -82:3:1502 -83:3:1507 -84:0:2833 -85:3:1518 -86:0:2833 -87:3:1519 -88:3:1526 -89:3:1527 -90:3:1534 -91:3:1539 -92:0:2833 -93:3:1550 -94:0:2833 -95:3:1555 -96:3:1562 -97:3:1563 -98:3:1570 -99:3:1575 -100:0:2833 -101:3:1590 -102:0:2833 -103:3:1592 -104:0:2833 -105:3:1593 -106:3:1597 -107:3:1598 -108:3:1606 -109:3:1607 -110:3:1611 -111:3:1612 -112:3:1620 -113:3:1625 -114:3:1629 -115:3:1630 -116:3:1637 -117:3:1638 -118:3:1649 -119:3:1650 -120:3:1651 -121:3:1662 -122:3:1667 -123:3:1668 -124:0:2833 -125:3:1680 -126:0:2833 -127:3:1682 -128:0:2833 -129:3:1685 -130:3:1686 -131:3:1698 -132:3:1699 -133:3:1703 -134:3:1704 -135:3:1712 -136:3:1717 -137:3:1721 -138:3:1722 -139:3:1729 -140:3:1730 -141:3:1741 -142:3:1742 -143:3:1743 -144:3:1754 -145:3:1759 -146:3:1760 -147:0:2833 -148:3:1772 -149:0:2833 -150:3:1774 -151:0:2833 -152:3:1775 -153:0:2833 -154:3:1776 -155:0:2833 -156:3:1777 -157:0:2833 -158:3:1778 -159:3:1782 -160:3:1783 -161:3:1791 -162:3:1792 -163:3:1796 -164:3:1797 -165:3:1805 -166:3:1810 -167:3:1814 -168:3:1815 -169:3:1822 -170:3:1823 -171:3:1834 -172:3:1835 -173:3:1836 -174:3:1847 -175:3:1852 -176:3:1853 -177:0:2833 -178:3:1865 -179:0:2833 -180:3:1974 -181:0:2833 -182:3:2072 -183:0:2833 -184:3:2073 -185:0:2833 -186:3:2077 -187:0:2833 -188:3:2083 -189:3:2087 -190:3:2088 -191:3:2096 -192:3:2097 -193:3:2101 -194:3:2102 -195:3:2110 -196:3:2115 -197:3:2119 -198:3:2120 -199:3:2127 -200:3:2128 -201:3:2139 -202:3:2140 -203:3:2141 -204:3:2152 -205:3:2157 -206:3:2158 -207:0:2833 -208:3:2170 -209:0:2833 -210:3:2172 -211:0:2833 -212:3:2173 -213:3:2177 -214:3:2178 -215:3:2186 -216:3:2187 -217:3:2191 -218:3:2192 -219:3:2200 -220:3:2205 -221:3:2209 -222:3:2210 -223:3:2217 -224:3:2218 -225:3:2229 -226:3:2230 -227:3:2231 -228:3:2242 -229:3:2247 -230:3:2248 -231:0:2833 -232:3:2260 -233:0:2833 -234:3:2262 -235:0:2833 -236:3:2265 -237:3:2266 -238:3:2278 -239:3:2279 -240:3:2283 -241:3:2284 -242:3:2292 -243:3:2297 -244:3:2301 -245:3:2302 -246:3:2309 -247:3:2310 -248:3:2321 -249:3:2322 -250:3:2323 -251:3:2334 -252:3:2339 -253:3:2340 -254:0:2833 -255:3:2352 -256:0:2833 -257:3:2354 -258:0:2833 -259:3:2355 -260:0:2833 -261:3:2356 -262:0:2833 -263:3:2357 -264:0:2833 -265:3:2358 -266:3:2362 -267:3:2363 -268:3:2371 -269:3:2372 -270:3:2376 -271:3:2377 -272:3:2385 -273:3:2390 -274:3:2394 -275:3:2395 -276:3:2402 -277:3:2403 -278:3:2414 -279:3:2415 -280:3:2416 -281:3:2427 -282:3:2432 -283:3:2433 -284:0:2833 -285:3:2445 -286:0:2833 -287:3:2554 -288:0:2833 -289:3:2652 -290:0:2833 -291:3:2653 -292:0:2833 -293:3:2657 -294:0:2833 -295:3:2663 -296:0:2833 -297:3:2664 -298:3:2671 -299:3:2672 -300:3:2679 -301:3:2684 -302:0:2833 -303:3:2695 -304:0:2833 -305:3:2696 -306:3:2703 -307:3:2704 -308:3:2711 -309:3:2716 -310:0:2833 -311:3:2727 -312:0:2833 -313:3:2732 -314:3:2739 -315:3:2740 -316:3:2747 -317:3:2752 -318:0:2833 -319:3:2767 -320:0:2833 -321:3:2769 -322:0:2833 -323:3:2770 -324:0:2833 -325:3:1290 -326:0:2833 -327:3:1291 -328:3:1295 -329:3:1296 -330:3:1304 -331:3:1305 -332:3:1309 -333:3:1310 -334:3:1318 -335:3:1323 -336:3:1327 -337:3:1328 -338:3:1335 -339:3:1336 -340:3:1347 -341:3:1348 -342:3:1349 -343:3:1360 -344:3:1365 -345:3:1366 -346:0:2833 -347:3:1378 -348:0:2833 -349:3:1380 -350:3:1381 -351:0:2833 -352:3:1385 -353:3:1389 -354:3:1390 -355:3:1398 -356:3:1399 -357:3:1403 -358:3:1404 -359:3:1412 -360:3:1417 -361:3:1418 -362:3:1429 -363:3:1430 -364:3:1441 -365:3:1442 -366:3:1443 -367:3:1454 -368:3:1459 -369:3:1460 -370:0:2833 -371:3:1472 -372:0:2833 -373:3:1474 -374:0:2833 -375:3:1475 -376:0:2833 -377:3:1485 -378:0:2833 -379:3:1486 -380:0:2833 -381:3:1487 -382:3:1494 -383:3:1495 -384:3:1502 -385:3:1507 -386:0:2833 -387:3:1518 -388:0:2833 -389:3:1519 -390:3:1526 -391:3:1527 -392:3:1534 -393:3:1539 -394:0:2833 -395:3:1550 -396:0:2833 -397:3:1555 -398:3:1562 -399:3:1563 -400:3:1570 -401:3:1575 -402:0:2833 -403:3:1590 -404:0:2833 -405:3:1592 -406:0:2833 -407:3:1593 -408:3:1597 -409:3:1598 -410:3:1606 -411:3:1607 -412:3:1611 -413:3:1612 -414:3:1620 -415:3:1625 -416:3:1629 -417:3:1630 -418:3:1637 -419:3:1638 -420:3:1649 -421:3:1650 -422:3:1651 -423:3:1662 -424:3:1667 -425:3:1668 -426:0:2833 -427:3:1680 -428:0:2833 -429:3:1682 -430:0:2833 -431:3:1685 -432:3:1686 -433:3:1698 -434:3:1699 -435:3:1703 -436:3:1704 -437:3:1712 -438:3:1717 -439:3:1721 -440:3:1722 -441:3:1729 -442:3:1730 -443:3:1741 -444:3:1742 -445:3:1743 -446:3:1754 -447:3:1759 -448:3:1760 -449:0:2833 -450:3:1772 -451:0:2833 -452:3:1774 -453:0:2833 -454:3:1775 -455:0:2833 -456:3:1776 -457:0:2833 -458:3:1777 -459:0:2833 -460:3:1778 -461:3:1782 -462:3:1783 -463:3:1791 -464:3:1792 -465:3:1796 -466:3:1797 -467:3:1805 -468:3:1810 -469:3:1814 -470:3:1815 -471:3:1822 -472:3:1823 -473:3:1834 -474:3:1835 -475:3:1836 -476:3:1847 -477:3:1852 -478:3:1853 -479:0:2833 -480:3:1865 -481:0:2833 -482:3:1974 -483:0:2833 -484:3:2072 -485:0:2833 -486:3:2073 -487:0:2833 -488:3:2077 -489:0:2833 -490:3:2083 -491:3:2087 -492:3:2088 -493:3:2096 -494:3:2097 -495:3:2101 -496:3:2102 -497:3:2110 -498:3:2115 -499:3:2119 -500:3:2120 -501:3:2127 -502:3:2128 -503:3:2139 -504:3:2140 -505:3:2141 -506:3:2152 -507:3:2157 -508:3:2158 -509:0:2833 -510:3:2170 -511:0:2833 -512:3:2172 -513:0:2833 -514:3:2173 -515:3:2177 -516:3:2178 -517:3:2186 -518:3:2187 -519:3:2191 -520:3:2192 -521:3:2200 -522:3:2205 -523:3:2209 -524:3:2210 -525:3:2217 -526:3:2218 -527:3:2229 -528:3:2230 -529:3:2231 -530:3:2242 -531:3:2247 -532:3:2248 -533:0:2833 -534:3:2260 -535:0:2833 -536:3:2262 -537:0:2833 -538:3:2265 -539:3:2266 -540:3:2278 -541:3:2279 -542:3:2283 -543:3:2284 -544:3:2292 -545:3:2297 -546:3:2301 -547:3:2302 -548:3:2309 -549:3:2310 -550:3:2321 -551:3:2322 -552:3:2323 -553:3:2334 -554:3:2339 -555:3:2340 -556:0:2833 -557:3:2352 -558:0:2833 -559:3:2354 -560:0:2833 -561:3:2355 -562:0:2833 -563:3:2356 -564:0:2833 -565:3:2357 -566:0:2833 -567:3:2358 -568:3:2362 -569:3:2363 -570:3:2371 -571:3:2372 -572:3:2376 -573:3:2377 -574:3:2385 -575:3:2390 -576:3:2394 -577:3:2395 -578:3:2402 -579:3:2403 -580:3:2414 -581:3:2415 -582:3:2416 -583:3:2427 -584:3:2432 -585:3:2433 -586:0:2833 -587:3:2445 -588:0:2833 -589:3:2554 -590:0:2833 -591:3:2652 -592:0:2833 -593:3:2653 -594:0:2833 -595:3:2657 -596:0:2833 -597:3:2663 -598:0:2833 -599:3:2664 -600:3:2671 -601:3:2672 -602:3:2679 -603:3:2684 -604:0:2833 -605:3:2695 -606:0:2833 -607:3:2696 -608:3:2703 -609:3:2704 -610:3:2711 -611:3:2716 -612:0:2833 -613:3:2727 -614:0:2833 -615:3:2732 -616:3:2739 -617:3:2740 -618:3:2747 -619:3:2752 -620:0:2833 -621:3:2767 -622:0:2833 -623:3:2769 -624:0:2833 -625:3:2770 -626:0:2833 -627:3:1290 -628:0:2833 -629:3:1291 -630:3:1295 -631:3:1296 -632:3:1304 -633:3:1305 -634:3:1309 -635:3:1310 -636:3:1318 -637:3:1323 -638:3:1327 -639:3:1328 -640:3:1335 -641:3:1336 -642:3:1347 -643:3:1348 -644:3:1349 -645:3:1360 -646:3:1365 -647:3:1366 -648:0:2833 -649:3:1378 -650:0:2833 -651:3:1380 -652:3:1381 -653:0:2833 -654:3:1385 -655:3:1389 -656:3:1390 -657:3:1398 -658:3:1399 -659:3:1403 -660:3:1404 -661:3:1412 -662:3:1417 -663:3:1418 -664:3:1429 -665:3:1430 -666:3:1441 -667:3:1442 -668:3:1443 -669:3:1454 -670:3:1459 -671:3:1460 -672:0:2833 -673:3:1472 -674:0:2833 -675:3:1474 -676:0:2833 -677:3:1475 -678:0:2833 -679:3:1485 -680:0:2833 -681:3:1486 -682:0:2833 -683:3:1487 -684:3:1494 -685:3:1495 -686:3:1502 -687:3:1507 -688:0:2833 -689:3:1518 -690:0:2833 -691:3:1519 -692:3:1526 -693:3:1527 -694:3:1534 -695:3:1539 -696:0:2833 -697:3:1550 -698:0:2833 -699:3:1555 -700:3:1562 -701:3:1563 -702:3:1570 -703:3:1575 -704:0:2833 -705:3:1590 -706:0:2833 -707:3:1592 -708:0:2833 -709:3:1593 -710:3:1597 -711:3:1598 -712:3:1606 -713:3:1607 -714:3:1611 -715:3:1612 -716:3:1620 -717:3:1625 -718:3:1629 -719:3:1630 -720:3:1637 -721:3:1638 -722:3:1649 -723:3:1650 -724:3:1651 -725:3:1662 -726:3:1667 -727:3:1668 -728:0:2833 -729:3:1680 -730:0:2833 -731:3:1682 -732:0:2833 -733:3:1685 -734:3:1686 -735:3:1698 -736:3:1699 -737:3:1703 -738:3:1704 -739:3:1712 -740:3:1717 -741:3:1721 -742:3:1722 -743:3:1729 -744:3:1730 -745:3:1741 -746:3:1742 -747:3:1743 -748:3:1754 -749:3:1759 -750:3:1760 -751:0:2833 -752:3:1772 -753:0:2833 -754:3:1774 -755:0:2833 -756:3:1775 -757:0:2833 -758:3:1776 -759:0:2833 -760:3:1777 -761:0:2833 -762:3:1778 -763:3:1782 -764:3:1783 -765:3:1791 -766:3:1792 -767:3:1796 -768:3:1797 -769:3:1805 -770:3:1810 -771:3:1814 -772:3:1815 -773:3:1822 -774:3:1823 -775:3:1834 -776:3:1835 -777:3:1836 -778:3:1847 -779:3:1852 -780:3:1853 -781:0:2833 -782:3:1865 -783:0:2833 -784:3:1974 -785:0:2833 -786:3:2072 -787:0:2833 -788:3:2073 -789:0:2833 -790:3:2077 -791:0:2833 -792:3:2083 -793:3:2087 -794:3:2088 -795:3:2096 -796:3:2097 -797:3:2101 -798:3:2102 -799:3:2110 -800:3:2115 -801:3:2119 -802:3:2120 -803:3:2127 -804:3:2128 -805:3:2139 -806:3:2140 -807:3:2141 -808:3:2152 -809:3:2157 -810:3:2158 -811:0:2833 -812:3:2170 -813:0:2833 -814:3:2172 -815:0:2833 -816:3:2173 -817:3:2177 -818:3:2178 -819:3:2186 -820:3:2187 -821:3:2191 -822:3:2192 -823:3:2200 -824:3:2205 -825:3:2209 -826:3:2210 -827:3:2217 -828:3:2218 -829:3:2229 -830:3:2230 -831:3:2231 -832:3:2242 -833:3:2247 -834:3:2248 -835:0:2833 -836:3:2260 -837:0:2833 -838:3:2262 -839:0:2833 -840:3:2265 -841:3:2266 -842:3:2278 -843:3:2279 -844:3:2283 -845:3:2284 -846:3:2292 -847:3:2297 -848:3:2301 -849:3:2302 -850:3:2309 -851:3:2310 -852:3:2321 -853:3:2322 -854:3:2323 -855:3:2334 -856:3:2339 -857:3:2340 -858:0:2833 -859:3:2352 -860:0:2833 -861:3:2354 -862:0:2833 -863:3:2355 -864:0:2833 -865:3:2356 -866:0:2833 -867:3:2357 -868:0:2833 -869:3:2358 -870:3:2362 -871:3:2363 -872:3:2371 -873:3:2372 -874:3:2376 -875:3:2377 -876:3:2385 -877:3:2390 -878:3:2394 -879:3:2395 -880:3:2402 -881:3:2403 -882:3:2414 -883:3:2415 -884:3:2416 -885:3:2427 -886:3:2432 -887:3:2433 -888:0:2833 -889:3:2445 -890:0:2833 -891:3:2554 -892:0:2833 -893:3:2652 -894:0:2833 -895:3:2653 -896:0:2833 -897:3:2657 -898:0:2833 -899:3:2663 -900:0:2833 -901:3:2664 -902:3:2671 -903:3:2672 -904:3:2679 -905:3:2684 -906:0:2833 -907:3:2695 -908:0:2833 -909:3:2696 -910:3:2703 -911:3:2704 -912:3:2711 -913:3:2716 -914:0:2833 -915:3:2727 -916:0:2833 -917:3:2732 -918:3:2739 -919:3:2740 -920:3:2747 -921:3:2752 -922:0:2833 -923:3:2767 -924:0:2833 -925:3:2769 -926:0:2833 -927:3:2770 -928:0:2833 -929:3:1290 -930:0:2833 -931:3:1291 -932:3:1295 -933:3:1296 -934:3:1304 -935:3:1305 -936:3:1309 -937:3:1310 -938:3:1318 -939:3:1323 -940:3:1327 -941:3:1328 -942:3:1335 -943:3:1336 -944:3:1347 -945:3:1348 -946:3:1349 -947:3:1360 -948:3:1365 -949:3:1366 -950:0:2833 -951:3:1378 -952:0:2833 -953:3:1380 -954:3:1381 -955:0:2833 -956:3:1385 -957:3:1389 -958:3:1390 -959:3:1398 -960:3:1399 -961:3:1403 -962:3:1404 -963:3:1412 -964:3:1417 -965:3:1418 -966:3:1429 -967:3:1430 -968:3:1441 -969:3:1442 -970:3:1443 -971:3:1454 -972:3:1459 -973:3:1460 -974:0:2833 -975:3:1472 -976:0:2833 -977:3:1474 -978:0:2833 -979:3:1475 -980:0:2833 -981:3:1485 -982:0:2833 -983:3:1486 -984:0:2833 -985:3:1487 -986:3:1494 -987:3:1495 -988:3:1502 -989:3:1507 -990:0:2833 -991:3:1518 -992:0:2833 -993:3:1519 -994:3:1526 -995:3:1527 -996:3:1534 -997:3:1539 -998:0:2833 -999:3:1550 -1000:0:2833 -1001:3:1555 -1002:3:1562 -1003:3:1563 -1004:3:1570 -1005:3:1575 -1006:0:2833 -1007:3:1590 -1008:0:2833 -1009:3:1592 -1010:0:2833 -1011:3:1593 -1012:3:1597 -1013:3:1598 -1014:3:1606 -1015:3:1607 -1016:3:1611 -1017:3:1612 -1018:3:1620 -1019:3:1625 -1020:3:1629 -1021:3:1630 -1022:3:1637 -1023:3:1638 -1024:3:1649 -1025:3:1650 -1026:3:1651 -1027:3:1662 -1028:3:1667 -1029:3:1668 -1030:0:2833 -1031:3:1680 -1032:0:2833 -1033:3:1682 -1034:0:2833 -1035:3:1685 -1036:3:1686 -1037:3:1698 -1038:3:1699 -1039:3:1703 -1040:3:1704 -1041:3:1712 -1042:3:1717 -1043:3:1721 -1044:3:1722 -1045:3:1729 -1046:3:1730 -1047:3:1741 -1048:3:1742 -1049:3:1743 -1050:3:1754 -1051:3:1759 -1052:3:1760 -1053:0:2833 -1054:3:1772 -1055:0:2833 -1056:3:1774 -1057:0:2833 -1058:3:1775 -1059:0:2833 -1060:3:1776 -1061:0:2833 -1062:3:1777 -1063:0:2833 -1064:3:1778 -1065:3:1782 -1066:3:1783 -1067:3:1791 -1068:3:1792 -1069:3:1796 -1070:3:1797 -1071:3:1805 -1072:3:1810 -1073:3:1814 -1074:3:1815 -1075:3:1822 -1076:3:1823 -1077:3:1834 -1078:3:1835 -1079:3:1836 -1080:3:1847 -1081:3:1852 -1082:3:1853 -1083:0:2833 -1084:3:1865 -1085:0:2833 -1086:3:1974 -1087:0:2833 -1088:3:2072 -1089:0:2833 -1090:3:2073 -1091:0:2833 -1092:3:2077 -1093:0:2833 -1094:3:2083 -1095:3:2087 -1096:3:2088 -1097:3:2096 -1098:3:2097 -1099:3:2101 -1100:3:2102 -1101:3:2110 -1102:3:2115 -1103:3:2119 -1104:3:2120 -1105:3:2127 -1106:3:2128 -1107:3:2139 -1108:3:2140 -1109:3:2141 -1110:3:2152 -1111:3:2157 -1112:3:2158 -1113:0:2833 -1114:3:2170 -1115:0:2833 -1116:3:2172 -1117:0:2833 -1118:3:2173 -1119:3:2177 -1120:3:2178 -1121:3:2186 -1122:3:2187 -1123:3:2191 -1124:3:2192 -1125:3:2200 -1126:3:2205 -1127:3:2209 -1128:3:2210 -1129:3:2217 -1130:3:2218 -1131:3:2229 -1132:3:2230 -1133:3:2231 -1134:3:2242 -1135:3:2247 -1136:3:2248 -1137:0:2833 -1138:3:2260 -1139:0:2833 -1140:3:2262 -1141:0:2833 -1142:3:2265 -1143:3:2266 -1144:3:2278 -1145:3:2279 -1146:3:2283 -1147:3:2284 -1148:3:2292 -1149:3:2297 -1150:3:2301 -1151:3:2302 -1152:3:2309 -1153:3:2310 -1154:3:2321 -1155:3:2322 -1156:3:2323 -1157:3:2334 -1158:3:2339 -1159:3:2340 -1160:0:2833 -1161:3:2352 -1162:0:2833 -1163:3:2354 -1164:0:2833 -1165:3:2355 -1166:0:2833 -1167:3:2356 -1168:0:2833 -1169:3:2357 -1170:0:2833 -1171:3:2358 -1172:3:2362 -1173:3:2363 -1174:3:2371 -1175:3:2372 -1176:3:2376 -1177:3:2377 -1178:3:2385 -1179:3:2390 -1180:3:2394 -1181:3:2395 -1182:3:2402 -1183:3:2403 -1184:3:2414 -1185:3:2415 -1186:3:2416 -1187:3:2427 -1188:3:2432 -1189:3:2433 -1190:0:2833 -1191:3:2445 -1192:0:2833 -1193:3:2554 -1194:0:2833 -1195:3:2652 -1196:0:2833 -1197:3:2653 -1198:0:2833 -1199:3:2657 -1200:0:2833 -1201:3:2663 -1202:0:2833 -1203:3:2664 -1204:3:2671 -1205:3:2672 -1206:3:2679 -1207:3:2684 -1208:0:2833 -1209:3:2695 -1210:0:2833 -1211:3:2696 -1212:3:2703 -1213:3:2704 -1214:3:2711 -1215:3:2716 -1216:0:2833 -1217:3:2727 -1218:0:2833 -1219:3:2732 -1220:3:2739 -1221:3:2740 -1222:3:2747 -1223:3:2752 -1224:0:2833 -1225:3:2767 -1226:0:2833 -1227:3:2769 -1228:0:2833 -1229:3:2770 -1230:0:2833 -1231:3:1290 -1232:0:2833 -1233:3:1291 -1234:3:1295 -1235:3:1296 -1236:3:1304 -1237:3:1305 -1238:3:1309 -1239:3:1310 -1240:3:1318 -1241:3:1323 -1242:3:1327 -1243:3:1328 -1244:3:1335 -1245:3:1336 -1246:3:1347 -1247:3:1348 -1248:3:1349 -1249:3:1360 -1250:3:1365 -1251:3:1366 -1252:0:2833 -1253:3:1378 -1254:0:2833 -1255:3:1380 -1256:3:1381 -1257:0:2833 -1258:3:1385 -1259:3:1389 -1260:3:1390 -1261:3:1398 -1262:3:1399 -1263:3:1403 -1264:3:1404 -1265:3:1412 -1266:3:1417 -1267:3:1418 -1268:3:1429 -1269:3:1430 -1270:3:1441 -1271:3:1442 -1272:3:1443 -1273:3:1454 -1274:3:1459 -1275:3:1460 -1276:0:2833 -1277:3:1472 -1278:0:2833 -1279:3:1474 -1280:0:2833 -1281:3:1475 -1282:0:2833 -1283:3:1485 -1284:0:2833 -1285:3:1486 -1286:0:2833 -1287:3:1487 -1288:3:1494 -1289:3:1495 -1290:3:1502 -1291:3:1507 -1292:0:2833 -1293:3:1518 -1294:0:2833 -1295:2:662 -1296:0:2833 -1297:2:668 -1298:0:2833 -1299:2:669 -1300:0:2833 -1301:2:670 -1302:0:2833 -1303:2:671 -1304:0:2833 -1305:1:2 -1306:0:2833 -1307:2:672 -1308:0:2833 -1309:1:8 -1310:0:2833 -1311:1:9 -1312:0:2833 -1313:1:10 -1314:0:2833 -1315:1:11 -1316:0:2833 -1317:2:671 -1318:0:2833 -1319:1:12 -1320:1:16 -1321:1:17 -1322:1:25 -1323:1:26 -1324:1:30 -1325:1:31 -1326:1:39 -1327:1:44 -1328:1:48 -1329:1:49 -1330:1:56 -1331:1:57 -1332:1:68 -1333:1:69 -1334:1:70 -1335:1:81 -1336:1:93 -1337:1:94 -1338:0:2833 -1339:2:672 -1340:0:2833 -1341:1:99 -1342:0:2833 -1343:2:673 -1344:0:2833 -1345:2:674 -1346:0:2833 -1347:2:685 -1348:0:2833 -1349:2:686 -1350:0:2833 -1351:2:687 -1352:2:691 -1353:2:692 -1354:2:700 -1355:2:701 -1356:2:705 -1357:2:706 -1358:2:714 -1359:2:719 -1360:2:723 -1361:2:724 -1362:2:731 -1363:2:732 -1364:2:743 -1365:2:744 -1366:2:745 -1367:2:756 -1368:2:768 -1369:2:769 -1370:0:2833 -1371:2:774 -1372:0:2833 -1373:2:775 -1374:2:779 -1375:2:780 -1376:2:788 -1377:2:789 -1378:2:793 -1379:2:794 -1380:2:802 -1381:2:807 -1382:2:811 -1383:2:812 -1384:2:819 -1385:2:820 -1386:2:831 -1387:2:832 -1388:2:833 -1389:2:844 -1390:2:856 -1391:2:857 -1392:0:2833 -1393:2:862 -1394:0:2833 -1395:2:863 -1396:0:2833 -1397:2:864 -1398:2:868 -1399:2:869 -1400:2:877 -1401:2:878 -1402:2:882 -1403:2:883 -1404:2:891 -1405:2:896 -1406:2:900 -1407:2:901 -1408:2:908 -1409:2:909 -1410:2:920 -1411:2:921 -1412:2:922 -1413:2:933 -1414:2:945 -1415:2:946 -1416:0:2833 -1417:2:951 -1418:0:2833 -1419:2:1059 -1420:0:2833 -1421:2:1060 -1422:0:2833 -1423:2:1065 -1424:0:2833 -1425:2:1070 -1426:0:2833 -1427:3:1519 -1428:3:1526 -1429:3:1529 -1430:3:1530 -1431:3:1534 -1432:3:1539 -1433:0:2833 -1434:3:1550 -1435:0:2833 -1436:3:1555 -1437:3:1562 -1438:3:1563 -1439:3:1570 -1440:3:1575 -1441:0:2833 -1442:3:1590 -1443:0:2833 -1444:3:1592 -1445:0:2833 -1446:3:1593 -1447:3:1597 -1448:3:1598 -1449:3:1606 -1450:3:1607 -1451:3:1611 -1452:3:1612 -1453:3:1620 -1454:3:1625 -1455:3:1629 -1456:3:1630 -1457:3:1637 -1458:3:1638 -1459:3:1649 -1460:3:1650 -1461:3:1651 -1462:3:1662 -1463:3:1667 -1464:3:1668 -1465:0:2833 -1466:3:1680 -1467:0:2833 -1468:3:1682 -1469:0:2833 -1470:3:1685 -1471:3:1686 -1472:3:1698 -1473:3:1699 -1474:3:1703 -1475:3:1704 -1476:3:1712 -1477:3:1717 -1478:3:1721 -1479:3:1722 -1480:3:1729 -1481:3:1730 -1482:3:1741 -1483:3:1742 -1484:3:1743 -1485:3:1754 -1486:3:1759 -1487:3:1760 -1488:0:2833 -1489:3:1772 -1490:0:2833 -1491:3:1774 -1492:0:2833 -1493:3:1775 -1494:0:2833 -1495:3:1776 -1496:0:2833 -1497:3:1777 -1498:0:2833 -1499:3:1778 -1500:3:1782 -1501:3:1783 -1502:3:1791 -1503:3:1792 -1504:3:1796 -1505:3:1797 -1506:3:1805 -1507:3:1810 -1508:3:1814 -1509:3:1815 -1510:3:1822 -1511:3:1823 -1512:3:1834 -1513:3:1835 -1514:3:1836 -1515:3:1847 -1516:3:1852 -1517:3:1853 -1518:0:2833 -1519:3:1865 -1520:0:2833 -1521:3:1974 -1522:0:2833 -1523:3:2072 -1524:0:2833 -1525:3:2073 -1526:0:2833 -1527:3:2077 -1528:0:2833 -1529:3:2083 -1530:3:2087 -1531:3:2088 -1532:3:2096 -1533:3:2097 -1534:3:2101 -1535:3:2102 -1536:3:2110 -1537:3:2115 -1538:3:2119 -1539:3:2120 -1540:3:2127 -1541:3:2128 -1542:3:2139 -1543:3:2140 -1544:3:2141 -1545:3:2152 -1546:3:2157 -1547:3:2158 -1548:0:2833 -1549:3:2170 -1550:0:2833 -1551:3:2172 -1552:0:2833 -1553:3:2173 -1554:3:2177 -1555:3:2178 -1556:3:2186 -1557:3:2187 -1558:3:2191 -1559:3:2192 -1560:3:2200 -1561:3:2205 -1562:3:2209 -1563:3:2210 -1564:3:2217 -1565:3:2218 -1566:3:2229 -1567:3:2230 -1568:3:2231 -1569:3:2242 -1570:3:2247 -1571:3:2248 -1572:0:2833 -1573:3:2260 -1574:0:2833 -1575:3:2262 -1576:0:2833 -1577:3:2265 -1578:3:2266 -1579:3:2278 -1580:3:2279 -1581:3:2283 -1582:3:2284 -1583:3:2292 -1584:3:2297 -1585:3:2301 -1586:3:2302 -1587:3:2309 -1588:3:2310 -1589:3:2321 -1590:3:2322 -1591:3:2323 -1592:3:2334 -1593:3:2339 -1594:3:2340 -1595:0:2833 -1596:3:2352 -1597:0:2833 -1598:3:2354 -1599:0:2833 -1600:3:2355 -1601:0:2833 -1602:3:2356 -1603:0:2833 -1604:3:2357 -1605:0:2833 -1606:3:2358 -1607:3:2362 -1608:3:2363 -1609:3:2371 -1610:3:2372 -1611:3:2376 -1612:3:2377 -1613:3:2385 -1614:3:2390 -1615:3:2394 -1616:3:2395 -1617:3:2402 -1618:3:2403 -1619:3:2414 -1620:3:2415 -1621:3:2416 -1622:3:2427 -1623:3:2432 -1624:3:2433 -1625:0:2833 -1626:3:2445 -1627:0:2833 -1628:3:2554 -1629:0:2833 -1630:3:2652 -1631:0:2833 -1632:3:2653 -1633:0:2833 -1634:3:2657 -1635:0:2833 -1636:3:2663 -1637:0:2833 -1638:3:2664 -1639:3:2671 -1640:3:2672 -1641:3:2679 -1642:3:2684 -1643:0:2833 -1644:3:2695 -1645:0:2833 -1646:3:2696 -1647:3:2703 -1648:3:2706 -1649:3:2707 -1650:3:2711 -1651:3:2716 -1652:0:2833 -1653:3:2727 -1654:0:2833 -1655:3:2732 -1656:3:2739 -1657:3:2740 -1658:3:2747 -1659:3:2752 -1660:0:2833 -1661:3:2767 -1662:0:2833 -1663:3:2769 -1664:0:2833 -1665:3:2770 -1666:0:2833 -1667:3:2773 -1668:0:2833 -1669:3:2778 -1670:0:2833 -1671:2:1071 -1672:0:2831 -1673:3:2779 -1674:0:2837 -1675:1:288 diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.define b/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.log b/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.log deleted file mode 100644 index f854175..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.log +++ /dev/null @@ -1,224 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_single_flip.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 742) - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 6934, errors: 0 - 7626 states, stored - 67235 states, matched - 74861 transitions (= stored+matched) - 248896 atomic steps -hash conflicts: 113 (resolved) - -Stats on memory usage (in Megabytes): - 0.611 equivalent memory usage for states (stored*(State-vector + overhead)) - 0.867 actual memory usage for states (unsuccessful compression: 141.88%) - state-vector as stored = 91 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 466.545 total actual memory usage - -unreached in proctype urcu_reader_sig - line 402, "pan.___", state 330, "(1)" - line 613, "pan.___", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 59, "(1)" - line 417, "pan.___", state 89, "(1)" - line 398, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 408, "pan.___", state 160, "(1)" - line 651, "pan.___", state 213, "(1)" - line 174, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 178, "pan.___", state 233, "(1)" - line 159, "pan.___", state 254, "(1)" - line 163, "pan.___", state 262, "(1)" - line 167, "pan.___", state 274, "(1)" - line 174, "pan.___", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 752, "(1)" - line 163, "pan.___", state 760, "(1)" - line 163, "pan.___", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 761, "else" - line 161, "pan.___", state 766, "((j<1))" - line 161, "pan.___", state 766, "((j>=1))" - line 167, "pan.___", state 772, "(1)" - line 167, "pan.___", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 773, "else" - line 169, "pan.___", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 776, "else" - line 174, "pan.___", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 167, "pan.___", state 835, "(1)" - line 167, "pan.___", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 174, "pan.___", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 852, "(1)" - line 178, "pan.___", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 861, "(1)" - line 178, "pan.___", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 862, "else" - line 176, "pan.___", state 867, "((j<1))" - line 176, "pan.___", state 867, "((j>=1))" - line 182, "pan.___", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 882, "(1)" - line 163, "pan.___", state 890, "(1)" - line 163, "pan.___", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 891, "else" - line 161, "pan.___", state 896, "((j<1))" - line 161, "pan.___", state 896, "((j>=1))" - line 167, "pan.___", state 902, "(1)" - line 167, "pan.___", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 903, "else" - line 169, "pan.___", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 906, "else" - line 201, "pan.___", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 201, "pan.___", state 908, "else" - line 220, "pan.___", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 220, "pan.___", state 909, "else" - line 355, "pan.___", state 915, "((sighand_exec==1))" - line 355, "pan.___", state 915, "else" - line 361, "pan.___", state 918, "sighand_exec = 1" - line 398, "pan.___", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 933, "(1)" - line 398, "pan.___", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 934, "else" - line 398, "pan.___", state 937, "(1)" - line 402, "pan.___", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 947, "(1)" - line 402, "pan.___", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 948, "else" - line 402, "pan.___", state 951, "(1)" - line 402, "pan.___", state 952, "(1)" - line 402, "pan.___", state 952, "(1)" - line 400, "pan.___", state 957, "((i<1))" - line 400, "pan.___", state 957, "((i>=1))" - line 407, "pan.___", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 976, "(1)" - line 408, "pan.___", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 977, "else" - line 408, "pan.___", state 980, "(1)" - line 408, "pan.___", state 981, "(1)" - line 408, "pan.___", state 981, "(1)" - line 412, "pan.___", state 989, "(1)" - line 412, "pan.___", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 990, "else" - line 412, "pan.___", state 993, "(1)" - line 412, "pan.___", state 994, "(1)" - line 412, "pan.___", state 994, "(1)" - line 410, "pan.___", state 999, "((i<1))" - line 410, "pan.___", state 999, "((i>=1))" - line 417, "pan.___", state 1006, "(1)" - line 417, "pan.___", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 1007, "else" - line 417, "pan.___", state 1010, "(1)" - line 417, "pan.___", state 1011, "(1)" - line 417, "pan.___", state 1011, "(1)" - line 419, "pan.___", state 1014, "(1)" - line 419, "pan.___", state 1014, "(1)" - line 361, "pan.___", state 1023, "sighand_exec = 1" - line 178, "pan.___", state 1048, "(1)" - line 182, "pan.___", state 1059, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 1069, "(1)" - line 163, "pan.___", state 1077, "(1)" - line 167, "pan.___", state 1089, "(1)" - line 174, "pan.___", state 1100, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.spin.input.trail b/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.spin.input.trail deleted file mode 100644 index 84cf653..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_free_single_flip.spin.input.trail +++ /dev/null @@ -1,1379 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:2904 -2:4:2856 -3:4:2859 -4:4:2859 -5:4:2862 -6:4:2870 -7:4:2870 -8:4:2873 -9:4:2879 -10:4:2883 -11:4:2883 -12:4:2886 -13:4:2894 -14:4:2898 -15:4:2899 -16:0:2904 -17:4:2901 -18:0:2904 -19:3:1655 -20:0:2904 -21:3:1661 -22:0:2904 -23:3:1662 -24:0:2904 -25:3:1663 -26:3:1667 -27:3:1668 -28:3:1676 -29:3:1677 -30:3:1681 -31:3:1682 -32:3:1690 -33:3:1695 -34:3:1699 -35:3:1700 -36:3:1707 -37:3:1708 -38:3:1719 -39:3:1720 -40:3:1721 -41:3:1732 -42:3:1737 -43:3:1738 -44:0:2904 -45:3:1750 -46:0:2904 -47:3:1752 -48:3:1753 -49:0:2904 -50:3:1757 -51:3:1761 -52:3:1762 -53:3:1770 -54:3:1771 -55:3:1775 -56:3:1776 -57:3:1784 -58:3:1789 -59:3:1790 -60:3:1801 -61:3:1802 -62:3:1813 -63:3:1814 -64:3:1815 -65:3:1826 -66:3:1831 -67:3:1832 -68:0:2904 -69:3:1844 -70:0:2904 -71:3:1846 -72:0:2904 -73:3:1847 -74:0:2904 -75:3:1857 -76:0:2904 -77:3:1858 -78:0:2904 -79:3:1862 -80:3:1863 -81:3:1867 -82:3:1871 -83:3:1872 -84:3:1876 -85:3:1884 -86:3:1885 -87:3:1890 -88:3:1897 -89:3:1898 -90:3:1905 -91:3:1910 -92:0:2904 -93:3:1921 -94:0:2904 -95:3:1925 -96:3:1926 -97:3:1930 -98:3:1934 -99:3:1935 -100:3:1939 -101:3:1947 -102:3:1948 -103:3:1953 -104:3:1960 -105:3:1961 -106:3:1968 -107:3:1973 -108:0:2904 -109:3:1984 -110:0:2904 -111:3:1992 -112:3:1993 -113:3:1997 -114:3:2001 -115:3:2002 -116:3:2006 -117:3:2014 -118:3:2015 -119:3:2020 -120:3:2027 -121:3:2028 -122:3:2035 -123:3:2040 -124:0:2904 -125:3:2055 -126:0:2904 -127:3:2057 -128:0:2904 -129:3:2058 -130:3:2062 -131:3:2063 -132:3:2071 -133:3:2072 -134:3:2076 -135:3:2077 -136:3:2085 -137:3:2090 -138:3:2094 -139:3:2095 -140:3:2102 -141:3:2103 -142:3:2114 -143:3:2115 -144:3:2116 -145:3:2127 -146:3:2132 -147:3:2133 -148:0:2904 -149:3:2145 -150:0:2904 -151:3:2147 -152:0:2904 -153:3:2150 -154:3:2151 -155:3:2163 -156:3:2164 -157:3:2168 -158:3:2169 -159:3:2177 -160:3:2182 -161:3:2186 -162:3:2187 -163:3:2194 -164:3:2195 -165:3:2206 -166:3:2207 -167:3:2208 -168:3:2219 -169:3:2224 -170:3:2225 -171:0:2904 -172:3:2237 -173:0:2904 -174:3:2239 -175:0:2904 -176:3:2240 -177:0:2904 -178:3:2241 -179:0:2904 -180:3:2242 -181:0:2904 -182:3:2243 -183:3:2247 -184:3:2248 -185:3:2256 -186:3:2257 -187:3:2261 -188:3:2262 -189:3:2270 -190:3:2275 -191:3:2279 -192:3:2280 -193:3:2287 -194:3:2288 -195:3:2299 -196:3:2300 -197:3:2301 -198:3:2312 -199:3:2317 -200:3:2318 -201:0:2904 -202:3:2330 -203:0:2904 -204:3:2532 -205:0:2904 -206:3:2630 -207:0:2904 -208:3:2631 -209:0:2904 -210:3:2635 -211:0:2904 -212:3:2641 -213:0:2904 -214:3:2645 -215:3:2646 -216:3:2650 -217:3:2654 -218:3:2655 -219:3:2659 -220:3:2667 -221:3:2668 -222:3:2673 -223:3:2680 -224:3:2681 -225:3:2688 -226:3:2693 -227:0:2904 -228:3:2704 -229:0:2904 -230:3:2708 -231:3:2709 -232:3:2713 -233:3:2717 -234:3:2718 -235:3:2722 -236:3:2730 -237:3:2731 -238:3:2736 -239:3:2743 -240:3:2744 -241:3:2751 -242:3:2756 -243:0:2904 -244:3:2767 -245:0:2904 -246:3:2775 -247:3:2776 -248:3:2780 -249:3:2784 -250:3:2785 -251:3:2789 -252:3:2797 -253:3:2798 -254:3:2803 -255:3:2810 -256:3:2811 -257:3:2818 -258:3:2823 -259:0:2904 -260:3:2838 -261:0:2904 -262:3:2840 -263:0:2904 -264:3:2841 -265:0:2904 -266:3:1662 -267:0:2904 -268:3:1663 -269:3:1667 -270:3:1668 -271:3:1676 -272:3:1677 -273:3:1681 -274:3:1682 -275:3:1690 -276:3:1695 -277:3:1699 -278:3:1700 -279:3:1707 -280:3:1708 -281:3:1719 -282:3:1720 -283:3:1721 -284:3:1732 -285:3:1737 -286:3:1738 -287:0:2904 -288:3:1750 -289:0:2904 -290:3:1752 -291:3:1753 -292:0:2904 -293:3:1757 -294:3:1761 -295:3:1762 -296:3:1770 -297:3:1771 -298:3:1775 -299:3:1776 -300:3:1784 -301:3:1789 -302:3:1790 -303:3:1801 -304:3:1802 -305:3:1813 -306:3:1814 -307:3:1815 -308:3:1826 -309:3:1831 -310:3:1832 -311:0:2904 -312:3:1844 -313:0:2904 -314:3:1846 -315:0:2904 -316:3:1847 -317:0:2904 -318:3:1857 -319:0:2904 -320:3:1858 -321:0:2904 -322:3:1862 -323:3:1863 -324:3:1867 -325:3:1871 -326:3:1872 -327:3:1876 -328:3:1884 -329:3:1885 -330:3:1890 -331:3:1897 -332:3:1898 -333:3:1905 -334:3:1910 -335:0:2904 -336:3:1921 -337:0:2904 -338:3:1925 -339:3:1926 -340:3:1930 -341:3:1934 -342:3:1935 -343:3:1939 -344:3:1947 -345:3:1948 -346:3:1953 -347:3:1960 -348:3:1961 -349:3:1968 -350:3:1973 -351:0:2904 -352:3:1984 -353:0:2904 -354:3:1992 -355:3:1993 -356:3:1997 -357:3:2001 -358:3:2002 -359:3:2006 -360:3:2014 -361:3:2015 -362:3:2020 -363:3:2027 -364:3:2028 -365:3:2035 -366:3:2040 -367:0:2904 -368:3:2055 -369:0:2904 -370:3:2057 -371:0:2904 -372:3:2058 -373:3:2062 -374:3:2063 -375:3:2071 -376:3:2072 -377:3:2076 -378:3:2077 -379:3:2085 -380:3:2090 -381:3:2094 -382:3:2095 -383:3:2102 -384:3:2103 -385:3:2114 -386:3:2115 -387:3:2116 -388:3:2127 -389:3:2132 -390:3:2133 -391:0:2904 -392:3:2145 -393:0:2904 -394:3:2147 -395:0:2904 -396:3:2150 -397:3:2151 -398:3:2163 -399:3:2164 -400:3:2168 -401:3:2169 -402:3:2177 -403:3:2182 -404:3:2186 -405:3:2187 -406:3:2194 -407:3:2195 -408:3:2206 -409:3:2207 -410:3:2208 -411:3:2219 -412:3:2224 -413:3:2225 -414:0:2904 -415:3:2237 -416:0:2904 -417:3:2239 -418:0:2904 -419:3:2240 -420:0:2904 -421:3:2241 -422:0:2904 -423:3:2242 -424:0:2904 -425:3:2243 -426:3:2247 -427:3:2248 -428:3:2256 -429:3:2257 -430:3:2261 -431:3:2262 -432:3:2270 -433:3:2275 -434:3:2279 -435:3:2280 -436:3:2287 -437:3:2288 -438:3:2299 -439:3:2300 -440:3:2301 -441:3:2312 -442:3:2317 -443:3:2318 -444:0:2904 -445:3:2330 -446:0:2904 -447:3:2532 -448:0:2904 -449:3:2630 -450:0:2904 -451:3:2631 -452:0:2904 -453:3:2635 -454:0:2904 -455:3:2641 -456:0:2904 -457:3:2645 -458:3:2646 -459:3:2650 -460:3:2654 -461:3:2655 -462:3:2659 -463:3:2667 -464:3:2668 -465:3:2673 -466:3:2680 -467:3:2681 -468:3:2688 -469:3:2693 -470:0:2904 -471:3:2704 -472:0:2904 -473:3:2708 -474:3:2709 -475:3:2713 -476:3:2717 -477:3:2718 -478:3:2722 -479:3:2730 -480:3:2731 -481:3:2736 -482:3:2743 -483:3:2744 -484:3:2751 -485:3:2756 -486:0:2904 -487:3:2767 -488:0:2904 -489:3:2775 -490:3:2776 -491:3:2780 -492:3:2784 -493:3:2785 -494:3:2789 -495:3:2797 -496:3:2798 -497:3:2803 -498:3:2810 -499:3:2811 -500:3:2818 -501:3:2823 -502:0:2904 -503:3:2838 -504:0:2904 -505:3:2840 -506:0:2904 -507:3:2841 -508:0:2904 -509:3:1662 -510:0:2904 -511:3:1663 -512:3:1667 -513:3:1668 -514:3:1676 -515:3:1677 -516:3:1681 -517:3:1682 -518:3:1690 -519:3:1695 -520:3:1699 -521:3:1700 -522:3:1707 -523:3:1708 -524:3:1719 -525:3:1720 -526:3:1721 -527:3:1732 -528:3:1737 -529:3:1738 -530:0:2904 -531:3:1750 -532:0:2904 -533:3:1752 -534:3:1753 -535:0:2904 -536:3:1757 -537:3:1761 -538:3:1762 -539:3:1770 -540:3:1771 -541:3:1775 -542:3:1776 -543:3:1784 -544:3:1789 -545:3:1790 -546:3:1801 -547:3:1802 -548:3:1813 -549:3:1814 -550:3:1815 -551:3:1826 -552:3:1831 -553:3:1832 -554:0:2904 -555:3:1844 -556:0:2904 -557:3:1846 -558:0:2904 -559:3:1847 -560:0:2904 -561:3:1857 -562:0:2904 -563:3:1858 -564:0:2904 -565:3:1862 -566:3:1863 -567:3:1867 -568:3:1871 -569:3:1872 -570:3:1876 -571:3:1884 -572:3:1885 -573:3:1890 -574:3:1897 -575:3:1898 -576:3:1905 -577:3:1910 -578:0:2904 -579:3:1921 -580:0:2904 -581:3:1925 -582:3:1926 -583:3:1930 -584:3:1934 -585:3:1935 -586:3:1939 -587:3:1947 -588:3:1948 -589:3:1953 -590:3:1960 -591:3:1961 -592:3:1968 -593:3:1973 -594:0:2904 -595:3:1984 -596:0:2904 -597:3:1992 -598:3:1993 -599:3:1997 -600:3:2001 -601:3:2002 -602:3:2006 -603:3:2014 -604:3:2015 -605:3:2020 -606:3:2027 -607:3:2028 -608:3:2035 -609:3:2040 -610:0:2904 -611:3:2055 -612:0:2904 -613:3:2057 -614:0:2904 -615:3:2058 -616:3:2062 -617:3:2063 -618:3:2071 -619:3:2072 -620:3:2076 -621:3:2077 -622:3:2085 -623:3:2090 -624:3:2094 -625:3:2095 -626:3:2102 -627:3:2103 -628:3:2114 -629:3:2115 -630:3:2116 -631:3:2127 -632:3:2132 -633:3:2133 -634:0:2904 -635:3:2145 -636:0:2904 -637:3:2147 -638:0:2904 -639:3:2150 -640:3:2151 -641:3:2163 -642:3:2164 -643:3:2168 -644:3:2169 -645:3:2177 -646:3:2182 -647:3:2186 -648:3:2187 -649:3:2194 -650:3:2195 -651:3:2206 -652:3:2207 -653:3:2208 -654:3:2219 -655:3:2224 -656:3:2225 -657:0:2904 -658:3:2237 -659:0:2904 -660:3:2239 -661:0:2904 -662:3:2240 -663:0:2904 -664:3:2241 -665:0:2904 -666:3:2242 -667:0:2904 -668:3:2243 -669:3:2247 -670:3:2248 -671:3:2256 -672:3:2257 -673:3:2261 -674:3:2262 -675:3:2270 -676:3:2275 -677:3:2279 -678:3:2280 -679:3:2287 -680:3:2288 -681:3:2299 -682:3:2300 -683:3:2301 -684:3:2312 -685:3:2317 -686:3:2318 -687:0:2904 -688:3:2330 -689:0:2904 -690:3:2532 -691:0:2904 -692:3:2630 -693:0:2904 -694:3:2631 -695:0:2904 -696:3:2635 -697:0:2904 -698:3:2641 -699:0:2904 -700:3:2645 -701:3:2646 -702:3:2650 -703:3:2654 -704:3:2655 -705:3:2659 -706:3:2667 -707:3:2668 -708:3:2673 -709:3:2680 -710:3:2681 -711:3:2688 -712:3:2693 -713:0:2904 -714:3:2704 -715:0:2904 -716:3:2708 -717:3:2709 -718:3:2713 -719:3:2717 -720:3:2718 -721:3:2722 -722:3:2730 -723:3:2731 -724:3:2736 -725:3:2743 -726:3:2744 -727:3:2751 -728:3:2756 -729:0:2904 -730:3:2767 -731:0:2904 -732:3:2775 -733:3:2776 -734:3:2780 -735:3:2784 -736:3:2785 -737:3:2789 -738:3:2797 -739:3:2798 -740:3:2803 -741:3:2810 -742:3:2811 -743:3:2818 -744:3:2823 -745:0:2904 -746:3:2838 -747:0:2904 -748:3:2840 -749:0:2904 -750:3:2841 -751:0:2904 -752:3:1662 -753:0:2904 -754:3:1663 -755:3:1667 -756:3:1668 -757:3:1676 -758:3:1677 -759:3:1681 -760:3:1682 -761:3:1690 -762:3:1695 -763:3:1699 -764:3:1700 -765:3:1707 -766:3:1708 -767:3:1719 -768:3:1720 -769:3:1721 -770:3:1732 -771:3:1737 -772:3:1738 -773:0:2904 -774:3:1750 -775:0:2904 -776:3:1752 -777:3:1753 -778:0:2904 -779:3:1757 -780:3:1761 -781:3:1762 -782:3:1770 -783:3:1771 -784:3:1775 -785:3:1776 -786:3:1784 -787:3:1789 -788:3:1790 -789:3:1801 -790:3:1802 -791:3:1813 -792:3:1814 -793:3:1815 -794:3:1826 -795:3:1831 -796:3:1832 -797:0:2904 -798:3:1844 -799:0:2904 -800:3:1846 -801:0:2904 -802:3:1847 -803:0:2904 -804:3:1857 -805:0:2904 -806:3:1858 -807:0:2904 -808:3:1862 -809:3:1863 -810:3:1867 -811:3:1871 -812:3:1872 -813:3:1876 -814:3:1884 -815:3:1885 -816:3:1890 -817:3:1897 -818:3:1898 -819:3:1905 -820:3:1910 -821:0:2904 -822:3:1921 -823:0:2904 -824:3:1925 -825:3:1926 -826:3:1930 -827:3:1934 -828:3:1935 -829:3:1939 -830:3:1947 -831:3:1948 -832:3:1953 -833:3:1960 -834:3:1961 -835:3:1968 -836:3:1973 -837:0:2904 -838:3:1984 -839:0:2904 -840:3:1992 -841:3:1993 -842:3:1997 -843:3:2001 -844:3:2002 -845:3:2006 -846:3:2014 -847:3:2015 -848:3:2020 -849:3:2027 -850:3:2028 -851:3:2035 -852:3:2040 -853:0:2904 -854:3:2055 -855:0:2904 -856:3:2057 -857:0:2904 -858:3:2058 -859:3:2062 -860:3:2063 -861:3:2071 -862:3:2072 -863:3:2076 -864:3:2077 -865:3:2085 -866:3:2090 -867:3:2094 -868:3:2095 -869:3:2102 -870:3:2103 -871:3:2114 -872:3:2115 -873:3:2116 -874:3:2127 -875:3:2132 -876:3:2133 -877:0:2904 -878:3:2145 -879:0:2904 -880:3:2147 -881:0:2904 -882:3:2150 -883:3:2151 -884:3:2163 -885:3:2164 -886:3:2168 -887:3:2169 -888:3:2177 -889:3:2182 -890:3:2186 -891:3:2187 -892:3:2194 -893:3:2195 -894:3:2206 -895:3:2207 -896:3:2208 -897:3:2219 -898:3:2224 -899:3:2225 -900:0:2904 -901:3:2237 -902:0:2904 -903:3:2239 -904:0:2904 -905:3:2240 -906:0:2904 -907:3:2241 -908:0:2904 -909:3:2242 -910:0:2904 -911:3:2243 -912:3:2247 -913:3:2248 -914:3:2256 -915:3:2257 -916:3:2261 -917:3:2262 -918:3:2270 -919:3:2275 -920:3:2279 -921:3:2280 -922:3:2287 -923:3:2288 -924:3:2299 -925:3:2300 -926:3:2301 -927:3:2312 -928:3:2317 -929:3:2318 -930:0:2904 -931:3:2330 -932:0:2904 -933:3:2532 -934:0:2904 -935:3:2630 -936:0:2904 -937:3:2631 -938:0:2904 -939:3:2635 -940:0:2904 -941:3:2641 -942:0:2904 -943:3:2645 -944:3:2646 -945:3:2650 -946:3:2654 -947:3:2655 -948:3:2659 -949:3:2667 -950:3:2668 -951:3:2673 -952:3:2680 -953:3:2681 -954:3:2688 -955:3:2693 -956:0:2904 -957:3:2704 -958:0:2904 -959:2:848 -960:0:2904 -961:2:854 -962:0:2904 -963:2:855 -964:0:2904 -965:2:856 -966:0:2904 -967:2:857 -968:0:2904 -969:1:2 -970:0:2904 -971:2:858 -972:0:2904 -973:1:8 -974:0:2904 -975:1:9 -976:0:2904 -977:1:10 -978:0:2904 -979:1:11 -980:0:2904 -981:2:857 -982:0:2904 -983:1:12 -984:1:16 -985:1:17 -986:1:25 -987:1:26 -988:1:30 -989:1:31 -990:1:39 -991:1:44 -992:1:48 -993:1:49 -994:1:63 -995:1:64 -996:1:68 -997:1:69 -998:1:70 -999:1:81 -1000:1:86 -1001:1:87 -1002:0:2904 -1003:2:858 -1004:0:2904 -1005:1:99 -1006:0:2904 -1007:2:859 -1008:0:2904 -1009:2:860 -1010:0:2904 -1011:2:871 -1012:0:2904 -1013:2:872 -1014:0:2904 -1015:2:873 -1016:2:877 -1017:2:878 -1018:2:886 -1019:2:887 -1020:2:891 -1021:2:892 -1022:2:900 -1023:2:905 -1024:2:909 -1025:2:910 -1026:2:924 -1027:2:925 -1028:2:929 -1029:2:930 -1030:2:931 -1031:2:942 -1032:2:947 -1033:2:948 -1034:0:2904 -1035:2:960 -1036:0:2904 -1037:2:961 -1038:2:965 -1039:2:966 -1040:2:974 -1041:2:975 -1042:2:979 -1043:2:980 -1044:2:988 -1045:2:993 -1046:2:997 -1047:2:998 -1048:2:1012 -1049:2:1013 -1050:2:1017 -1051:2:1018 -1052:2:1019 -1053:2:1030 -1054:2:1035 -1055:2:1036 -1056:0:2904 -1057:2:1048 -1058:0:2904 -1059:2:1049 -1060:0:2904 -1061:3:2708 -1062:3:2709 -1063:3:2713 -1064:3:2717 -1065:3:2718 -1066:3:2722 -1067:3:2730 -1068:3:2731 -1069:3:2736 -1070:3:2743 -1071:3:2744 -1072:3:2751 -1073:3:2756 -1074:0:2904 -1075:3:2767 -1076:0:2904 -1077:3:2775 -1078:3:2776 -1079:3:2780 -1080:3:2784 -1081:3:2785 -1082:3:2789 -1083:3:2797 -1084:3:2798 -1085:3:2803 -1086:3:2810 -1087:3:2811 -1088:3:2818 -1089:3:2823 -1090:0:2904 -1091:3:2838 -1092:0:2904 -1093:3:2840 -1094:0:2904 -1095:3:2841 -1096:0:2904 -1097:3:1662 -1098:0:2904 -1099:3:1663 -1100:3:1667 -1101:3:1668 -1102:3:1676 -1103:3:1677 -1104:3:1681 -1105:3:1682 -1106:3:1690 -1107:3:1695 -1108:3:1699 -1109:3:1700 -1110:3:1707 -1111:3:1708 -1112:3:1719 -1113:3:1720 -1114:3:1721 -1115:3:1732 -1116:3:1737 -1117:3:1738 -1118:0:2904 -1119:3:1750 -1120:0:2904 -1121:3:1752 -1122:3:1753 -1123:0:2904 -1124:3:1757 -1125:3:1761 -1126:3:1762 -1127:3:1770 -1128:3:1771 -1129:3:1775 -1130:3:1776 -1131:3:1784 -1132:3:1789 -1133:3:1790 -1134:3:1801 -1135:3:1802 -1136:3:1813 -1137:3:1814 -1138:3:1815 -1139:3:1826 -1140:3:1831 -1141:3:1832 -1142:0:2904 -1143:3:1844 -1144:0:2904 -1145:3:1846 -1146:0:2904 -1147:3:1847 -1148:0:2904 -1149:3:1857 -1150:0:2904 -1151:3:1858 -1152:0:2904 -1153:3:1862 -1154:3:1863 -1155:3:1867 -1156:3:1871 -1157:3:1872 -1158:3:1876 -1159:3:1884 -1160:3:1885 -1161:3:1890 -1162:3:1897 -1163:3:1898 -1164:3:1905 -1165:3:1910 -1166:0:2904 -1167:3:1921 -1168:0:2904 -1169:2:1050 -1170:2:1054 -1171:2:1055 -1172:2:1063 -1173:2:1064 -1174:2:1068 -1175:2:1069 -1176:2:1077 -1177:2:1082 -1178:2:1086 -1179:2:1087 -1180:2:1094 -1181:2:1095 -1182:2:1106 -1183:2:1107 -1184:2:1108 -1185:2:1119 -1186:2:1131 -1187:2:1132 -1188:0:2904 -1189:2:1137 -1190:0:2904 -1191:2:1338 -1192:0:2904 -1193:2:1339 -1194:0:2904 -1195:2:1344 -1196:0:2904 -1197:2:1349 -1198:0:2904 -1199:3:1925 -1200:3:1926 -1201:3:1930 -1202:3:1931 -1203:3:1939 -1204:3:1947 -1205:3:1948 -1206:3:1953 -1207:3:1960 -1208:3:1961 -1209:3:1968 -1210:3:1973 -1211:0:2904 -1212:3:1984 -1213:0:2904 -1214:3:1992 -1215:3:1993 -1216:3:1997 -1217:3:2001 -1218:3:2002 -1219:3:2006 -1220:3:2014 -1221:3:2015 -1222:3:2020 -1223:3:2027 -1224:3:2028 -1225:3:2035 -1226:3:2040 -1227:0:2904 -1228:3:2055 -1229:0:2904 -1230:3:2057 -1231:0:2904 -1232:3:2058 -1233:3:2062 -1234:3:2063 -1235:3:2071 -1236:3:2072 -1237:3:2076 -1238:3:2077 -1239:3:2085 -1240:3:2090 -1241:3:2094 -1242:3:2095 -1243:3:2102 -1244:3:2103 -1245:3:2114 -1246:3:2115 -1247:3:2116 -1248:3:2127 -1249:3:2132 -1250:3:2133 -1251:0:2904 -1252:3:2145 -1253:0:2904 -1254:3:2147 -1255:0:2904 -1256:3:2150 -1257:3:2151 -1258:3:2163 -1259:3:2164 -1260:3:2168 -1261:3:2169 -1262:3:2177 -1263:3:2182 -1264:3:2186 -1265:3:2187 -1266:3:2194 -1267:3:2195 -1268:3:2206 -1269:3:2207 -1270:3:2208 -1271:3:2219 -1272:3:2224 -1273:3:2225 -1274:0:2904 -1275:3:2237 -1276:0:2904 -1277:3:2239 -1278:0:2904 -1279:3:2240 -1280:0:2904 -1281:3:2241 -1282:0:2904 -1283:3:2242 -1284:0:2904 -1285:3:2243 -1286:3:2247 -1287:3:2248 -1288:3:2256 -1289:3:2257 -1290:3:2261 -1291:3:2262 -1292:3:2270 -1293:3:2275 -1294:3:2279 -1295:3:2280 -1296:3:2287 -1297:3:2288 -1298:3:2299 -1299:3:2300 -1300:3:2301 -1301:3:2312 -1302:3:2317 -1303:3:2318 -1304:0:2904 -1305:3:2330 -1306:0:2904 -1307:3:2532 -1308:0:2904 -1309:3:2630 -1310:0:2904 -1311:3:2631 -1312:0:2904 -1313:3:2635 -1314:0:2904 -1315:3:2641 -1316:0:2904 -1317:3:2645 -1318:3:2646 -1319:3:2650 -1320:3:2654 -1321:3:2655 -1322:3:2659 -1323:3:2667 -1324:3:2668 -1325:3:2673 -1326:3:2680 -1327:3:2681 -1328:3:2688 -1329:3:2693 -1330:0:2904 -1331:3:2704 -1332:0:2904 -1333:3:2708 -1334:3:2709 -1335:3:2713 -1336:3:2717 -1337:3:2718 -1338:3:2722 -1339:3:2730 -1340:3:2731 -1341:3:2736 -1342:3:2743 -1343:3:2744 -1344:3:2751 -1345:3:2756 -1346:0:2904 -1347:3:2767 -1348:0:2904 -1349:3:2775 -1350:3:2776 -1351:3:2780 -1352:3:2784 -1353:3:2785 -1354:3:2789 -1355:3:2797 -1356:3:2798 -1357:3:2803 -1358:3:2810 -1359:3:2811 -1360:3:2818 -1361:3:2823 -1362:0:2904 -1363:3:2838 -1364:0:2904 -1365:3:2840 -1366:0:2904 -1367:3:2841 -1368:0:2904 -1369:3:2844 -1370:0:2904 -1371:3:2849 -1372:0:2904 -1373:2:1350 -1374:0:2902 -1375:3:2850 -1376:0:2908 -1377:1:296 diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress.ltl b/formal-model/urcu/result-signal-over-writer/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.define b/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.log b/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.log deleted file mode 100644 index a1a6122..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.log +++ /dev/null @@ -1,348 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_reader.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 742) -depth 12: Claim reached state 9 (line 747) -depth 86: Claim reached state 9 (line 746) - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 10679, errors: 0 - 38182 states, stored (88898 visited) - 997091 states, matched - 1085989 transitions (= visited+matched) - 3694897 atomic steps -hash conflicts: 9602 (resolved) - -Stats on memory usage (in Megabytes): - 3.059 equivalent memory usage for states (stored*(State-vector + overhead)) - 2.930 actual memory usage for states (compression: 95.79%) - state-vector as stored = 52 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 468.596 total actual memory usage - -unreached in proctype urcu_reader_sig - line 402, "pan.___", state 330, "(1)" - line 613, "pan.___", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 59, "(1)" - line 417, "pan.___", state 89, "(1)" - line 398, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 408, "pan.___", state 160, "(1)" - line 651, "pan.___", state 213, "(1)" - line 174, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 178, "pan.___", state 233, "(1)" - line 159, "pan.___", state 254, "(1)" - line 163, "pan.___", state 262, "(1)" - line 167, "pan.___", state 274, "(1)" - line 174, "pan.___", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 752, "(1)" - line 163, "pan.___", state 760, "(1)" - line 163, "pan.___", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 761, "else" - line 161, "pan.___", state 766, "((j<1))" - line 161, "pan.___", state 766, "((j>=1))" - line 167, "pan.___", state 772, "(1)" - line 167, "pan.___", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 773, "else" - line 169, "pan.___", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 776, "else" - line 174, "pan.___", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 167, "pan.___", state 835, "(1)" - line 167, "pan.___", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 174, "pan.___", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 852, "(1)" - line 178, "pan.___", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 861, "(1)" - line 178, "pan.___", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 862, "else" - line 176, "pan.___", state 867, "((j<1))" - line 176, "pan.___", state 867, "((j>=1))" - line 182, "pan.___", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 882, "(1)" - line 163, "pan.___", state 890, "(1)" - line 163, "pan.___", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 891, "else" - line 161, "pan.___", state 896, "((j<1))" - line 161, "pan.___", state 896, "((j>=1))" - line 167, "pan.___", state 902, "(1)" - line 167, "pan.___", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 903, "else" - line 169, "pan.___", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 906, "else" - line 201, "pan.___", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 201, "pan.___", state 908, "else" - line 220, "pan.___", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 220, "pan.___", state 909, "else" - line 355, "pan.___", state 915, "((sighand_exec==1))" - line 355, "pan.___", state 915, "else" - line 361, "pan.___", state 918, "sighand_exec = 1" - line 398, "pan.___", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 933, "(1)" - line 398, "pan.___", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 934, "else" - line 398, "pan.___", state 937, "(1)" - line 402, "pan.___", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 947, "(1)" - line 402, "pan.___", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 948, "else" - line 402, "pan.___", state 951, "(1)" - line 402, "pan.___", state 952, "(1)" - line 402, "pan.___", state 952, "(1)" - line 400, "pan.___", state 957, "((i<1))" - line 400, "pan.___", state 957, "((i>=1))" - line 407, "pan.___", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 976, "(1)" - line 408, "pan.___", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 977, "else" - line 408, "pan.___", state 980, "(1)" - line 408, "pan.___", state 981, "(1)" - line 408, "pan.___", state 981, "(1)" - line 412, "pan.___", state 989, "(1)" - line 412, "pan.___", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 990, "else" - line 412, "pan.___", state 993, "(1)" - line 412, "pan.___", state 994, "(1)" - line 412, "pan.___", state 994, "(1)" - line 410, "pan.___", state 999, "((i<1))" - line 410, "pan.___", state 999, "((i>=1))" - line 417, "pan.___", state 1006, "(1)" - line 417, "pan.___", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 1007, "else" - line 417, "pan.___", state 1010, "(1)" - line 417, "pan.___", state 1011, "(1)" - line 417, "pan.___", state 1011, "(1)" - line 419, "pan.___", state 1014, "(1)" - line 419, "pan.___", state 1014, "(1)" - line 361, "pan.___", state 1023, "sighand_exec = 1" - line 402, "pan.___", state 1054, "(1)" - line 407, "pan.___", state 1070, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1113, "(1)" - line 402, "pan.___", state 1151, "(1)" - line 407, "pan.___", state 1167, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1210, "(1)" - line 398, "pan.___", state 1236, "(1)" - line 402, "pan.___", state 1250, "(1)" - line 407, "pan.___", state 1266, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1309, "(1)" - line 402, "pan.___", state 1350, "(1)" - line 407, "pan.___", state 1366, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1409, "(1)" - line 174, "pan.___", state 1430, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 1432, "(1)" - line 178, "pan.___", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 1441, "(1)" - line 178, "pan.___", state 1442, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 1442, "else" - line 176, "pan.___", state 1447, "((j<1))" - line 176, "pan.___", state 1447, "((j>=1))" - line 182, "pan.___", state 1452, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 1462, "(1)" - line 163, "pan.___", state 1470, "(1)" - line 163, "pan.___", state 1471, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 1471, "else" - line 161, "pan.___", state 1476, "((j<1))" - line 161, "pan.___", state 1476, "((j>=1))" - line 167, "pan.___", state 1482, "(1)" - line 167, "pan.___", state 1483, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 1483, "else" - line 169, "pan.___", state 1486, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 1486, "else" - line 174, "pan.___", state 1493, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 1515, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 167, "pan.___", state 1545, "(1)" - line 167, "pan.___", state 1546, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 174, "pan.___", state 1560, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 1562, "(1)" - line 178, "pan.___", state 1569, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 1571, "(1)" - line 178, "pan.___", state 1572, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 1572, "else" - line 176, "pan.___", state 1577, "((j<1))" - line 176, "pan.___", state 1577, "((j>=1))" - line 182, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 1592, "(1)" - line 163, "pan.___", state 1600, "(1)" - line 163, "pan.___", state 1601, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 1601, "else" - line 161, "pan.___", state 1606, "((j<1))" - line 161, "pan.___", state 1606, "((j>=1))" - line 167, "pan.___", state 1612, "(1)" - line 167, "pan.___", state 1613, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 1613, "else" - line 169, "pan.___", state 1616, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 1616, "else" - line 201, "pan.___", state 1618, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 201, "pan.___", state 1618, "else" - line 220, "pan.___", state 1619, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 220, "pan.___", state 1619, "else" - line 355, "pan.___", state 1625, "((sighand_exec==1))" - line 355, "pan.___", state 1625, "else" - line 361, "pan.___", state 1628, "sighand_exec = 1" - line 398, "pan.___", state 1641, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 1643, "(1)" - line 398, "pan.___", state 1644, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 1644, "else" - line 398, "pan.___", state 1647, "(1)" - line 402, "pan.___", state 1655, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 1657, "(1)" - line 402, "pan.___", state 1658, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 1658, "else" - line 402, "pan.___", state 1661, "(1)" - line 402, "pan.___", state 1662, "(1)" - line 402, "pan.___", state 1662, "(1)" - line 400, "pan.___", state 1667, "((i<1))" - line 400, "pan.___", state 1667, "((i>=1))" - line 407, "pan.___", state 1673, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 1686, "(1)" - line 408, "pan.___", state 1687, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 1687, "else" - line 408, "pan.___", state 1690, "(1)" - line 408, "pan.___", state 1691, "(1)" - line 408, "pan.___", state 1691, "(1)" - line 412, "pan.___", state 1699, "(1)" - line 412, "pan.___", state 1700, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 1700, "else" - line 412, "pan.___", state 1703, "(1)" - line 412, "pan.___", state 1704, "(1)" - line 412, "pan.___", state 1704, "(1)" - line 410, "pan.___", state 1709, "((i<1))" - line 410, "pan.___", state 1709, "((i>=1))" - line 417, "pan.___", state 1716, "(1)" - line 417, "pan.___", state 1717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 1717, "else" - line 417, "pan.___", state 1720, "(1)" - line 417, "pan.___", state 1721, "(1)" - line 417, "pan.___", state 1721, "(1)" - line 419, "pan.___", state 1724, "(1)" - line 419, "pan.___", state 1724, "(1)" - line 361, "pan.___", state 1733, "sighand_exec = 1" - line 178, "pan.___", state 1758, "(1)" - line 182, "pan.___", state 1769, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 1779, "(1)" - line 163, "pan.___", state 1787, "(1)" - line 167, "pan.___", state 1799, "(1)" - line 174, "pan.___", state 1810, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.spin.input.trail b/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.spin.input.trail deleted file mode 100644 index 7c42af1..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_progress_reader.spin.input.trail +++ /dev/null @@ -1,1270 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4401 -2:4:4353 -3:4:4356 -4:4:4356 -5:4:4359 -6:4:4367 -7:4:4367 -8:4:4370 -9:4:4376 -10:4:4380 -11:4:4380 -12:4:4383 -13:4:4391 -14:4:4395 -15:4:4396 -16:0:4401 -17:4:4398 -18:0:4401 -19:3:2479 -20:0:4401 -21:3:2485 -22:0:4401 -23:3:2486 -24:0:4401 -25:3:2487 -26:3:2491 -27:3:2492 -28:3:2500 -29:3:2501 -30:3:2505 -31:3:2506 -32:3:2514 -33:3:2519 -34:3:2523 -35:3:2524 -36:3:2531 -37:3:2532 -38:3:2543 -39:3:2544 -40:3:2545 -41:3:2556 -42:3:2561 -43:3:2562 -44:0:4401 -45:3:2574 -46:0:4401 -47:3:2576 -48:3:2577 -49:0:4401 -50:3:2581 -51:3:2585 -52:3:2586 -53:3:2594 -54:3:2595 -55:3:2599 -56:3:2600 -57:3:2608 -58:3:2613 -59:3:2614 -60:3:2625 -61:3:2626 -62:3:2637 -63:3:2638 -64:3:2639 -65:3:2650 -66:3:2655 -67:3:2656 -68:0:4401 -69:3:2668 -70:0:4401 -71:3:2670 -72:0:4401 -73:3:2671 -74:0:4401 -75:3:2681 -76:0:4401 -77:3:2682 -78:0:4401 -79:3:2686 -80:3:2687 -81:3:2691 -82:3:2695 -83:3:2696 -84:3:2700 -85:3:2708 -86:3:2709 -87:3:2714 -88:3:2721 -89:3:2722 -90:3:2729 -91:3:2734 -92:0:4401 -93:3:2745 -94:0:4401 -95:3:2749 -96:3:2750 -97:3:2754 -98:3:2758 -99:3:2759 -100:3:2763 -101:3:2771 -102:3:2772 -103:3:2777 -104:3:2784 -105:3:2785 -106:3:2792 -107:3:2797 -108:0:4401 -109:3:2808 -110:0:4401 -111:3:2816 -112:3:2817 -113:3:2821 -114:3:2825 -115:3:2826 -116:3:2830 -117:3:2838 -118:3:2839 -119:3:2844 -120:3:2851 -121:3:2852 -122:3:2859 -123:3:2864 -124:0:4401 -125:3:2879 -126:0:4401 -127:3:2881 -128:0:4401 -129:3:2882 -130:3:2886 -131:3:2887 -132:3:2895 -133:3:2896 -134:3:2900 -135:3:2901 -136:3:2909 -137:3:2914 -138:3:2918 -139:3:2919 -140:3:2926 -141:3:2927 -142:3:2938 -143:3:2939 -144:3:2940 -145:3:2951 -146:3:2956 -147:3:2957 -148:0:4401 -149:3:2969 -150:0:4401 -151:3:2971 -152:0:4401 -153:3:2974 -154:3:2975 -155:3:2987 -156:3:2988 -157:3:2992 -158:3:2993 -159:3:3001 -160:3:3006 -161:3:3010 -162:3:3011 -163:3:3018 -164:3:3019 -165:3:3030 -166:3:3031 -167:3:3032 -168:3:3043 -169:3:3048 -170:3:3049 -171:0:4401 -172:3:3061 -173:0:4401 -174:3:3063 -175:0:4401 -176:3:3064 -177:0:4401 -178:3:3065 -179:0:4401 -180:3:3066 -181:0:4401 -182:3:3067 -183:3:3071 -184:3:3072 -185:3:3080 -186:3:3081 -187:3:3085 -188:3:3086 -189:3:3094 -190:3:3099 -191:3:3103 -192:3:3104 -193:3:3111 -194:3:3112 -195:3:3123 -196:3:3124 -197:3:3125 -198:3:3136 -199:3:3141 -200:3:3142 -201:0:4401 -202:3:3154 -203:0:4401 -204:3:3356 -205:0:4401 -206:3:3454 -207:0:4401 -208:3:3455 -209:0:4401 -210:3:3459 -211:0:4401 -212:3:3465 -213:3:3469 -214:3:3470 -215:3:3478 -216:3:3479 -217:3:3483 -218:3:3484 -219:3:3492 -220:3:3497 -221:3:3501 -222:3:3502 -223:3:3509 -224:3:3510 -225:3:3521 -226:3:3522 -227:3:3523 -228:3:3534 -229:3:3539 -230:3:3540 -231:0:4401 -232:3:3552 -233:0:4401 -234:3:3554 -235:0:4401 -236:3:3555 -237:3:3559 -238:3:3560 -239:3:3568 -240:3:3569 -241:3:3573 -242:3:3574 -243:3:3582 -244:3:3587 -245:3:3591 -246:3:3592 -247:3:3599 -248:3:3600 -249:3:3611 -250:3:3612 -251:3:3613 -252:3:3624 -253:3:3629 -254:3:3630 -255:0:4401 -256:3:3642 -257:0:4401 -258:3:3644 -259:0:4401 -260:3:3647 -261:3:3648 -262:3:3660 -263:3:3661 -264:3:3665 -265:3:3666 -266:3:3674 -267:3:3679 -268:3:3683 -269:3:3684 -270:3:3691 -271:3:3692 -272:3:3703 -273:3:3704 -274:3:3705 -275:3:3716 -276:3:3721 -277:3:3722 -278:0:4401 -279:3:3734 -280:0:4401 -281:3:3736 -282:0:4401 -283:3:3737 -284:0:4401 -285:3:3738 -286:0:4401 -287:3:3739 -288:0:4401 -289:3:3740 -290:3:3744 -291:3:3745 -292:3:3753 -293:3:3754 -294:3:3758 -295:3:3759 -296:3:3767 -297:3:3772 -298:3:3776 -299:3:3777 -300:3:3784 -301:3:3785 -302:3:3796 -303:3:3797 -304:3:3798 -305:3:3809 -306:3:3814 -307:3:3815 -308:0:4401 -309:3:3827 -310:0:4401 -311:3:4029 -312:0:4401 -313:3:4127 -314:0:4401 -315:3:4128 -316:0:4401 -317:3:4132 -318:0:4401 -319:3:4138 -320:0:4401 -321:3:4142 -322:3:4143 -323:3:4147 -324:3:4151 -325:3:4152 -326:3:4156 -327:3:4164 -328:3:4165 -329:3:4170 -330:3:4177 -331:3:4178 -332:3:4185 -333:3:4190 -334:0:4401 -335:3:4201 -336:0:4401 -337:3:4205 -338:3:4206 -339:3:4210 -340:3:4214 -341:3:4215 -342:3:4219 -343:3:4227 -344:3:4228 -345:3:4233 -346:3:4240 -347:3:4241 -348:3:4248 -349:3:4253 -350:0:4401 -351:3:4264 -352:0:4401 -353:3:4272 -354:3:4273 -355:3:4277 -356:3:4281 -357:3:4282 -358:3:4286 -359:3:4294 -360:3:4295 -361:3:4300 -362:3:4307 -363:3:4308 -364:3:4315 -365:3:4320 -366:0:4401 -367:3:4335 -368:0:4401 -369:3:4337 -370:0:4401 -371:3:4338 -372:0:4401 -373:3:2486 -374:0:4401 -375:3:2487 -376:3:2491 -377:3:2492 -378:3:2500 -379:3:2501 -380:3:2505 -381:3:2506 -382:3:2514 -383:3:2519 -384:3:2523 -385:3:2524 -386:3:2531 -387:3:2532 -388:3:2543 -389:3:2544 -390:3:2545 -391:3:2556 -392:3:2561 -393:3:2562 -394:0:4401 -395:3:2574 -396:0:4401 -397:3:2576 -398:3:2577 -399:0:4401 -400:3:2581 -401:3:2585 -402:3:2586 -403:3:2594 -404:3:2595 -405:3:2599 -406:3:2600 -407:3:2608 -408:3:2613 -409:3:2614 -410:3:2625 -411:3:2626 -412:3:2637 -413:3:2638 -414:3:2639 -415:3:2650 -416:3:2655 -417:3:2656 -418:0:4401 -419:3:2668 -420:0:4401 -421:3:2670 -422:0:4401 -423:3:2671 -424:0:4401 -425:3:2681 -426:0:4401 -427:3:2682 -428:0:4401 -429:3:2686 -430:3:2687 -431:3:2691 -432:3:2695 -433:3:2696 -434:3:2700 -435:3:2708 -436:3:2709 -437:3:2714 -438:3:2721 -439:3:2722 -440:3:2729 -441:3:2734 -442:0:4401 -443:3:2745 -444:0:4401 -445:3:2749 -446:3:2750 -447:3:2754 -448:3:2758 -449:3:2759 -450:3:2763 -451:3:2771 -452:3:2772 -453:3:2777 -454:3:2784 -455:3:2785 -456:3:2792 -457:3:2797 -458:0:4401 -459:3:2808 -460:0:4401 -461:3:2816 -462:3:2817 -463:3:2821 -464:3:2825 -465:3:2826 -466:3:2830 -467:3:2838 -468:3:2839 -469:3:2844 -470:3:2851 -471:3:2852 -472:3:2859 -473:3:2864 -474:0:4401 -475:3:2879 -476:0:4401 -477:3:2881 -478:0:4401 -479:3:2882 -480:3:2886 -481:3:2887 -482:3:2895 -483:3:2896 -484:3:2900 -485:3:2901 -486:3:2909 -487:3:2914 -488:3:2918 -489:3:2919 -490:3:2926 -491:3:2927 -492:3:2938 -493:3:2939 -494:3:2940 -495:3:2951 -496:3:2956 -497:3:2957 -498:0:4401 -499:3:2969 -500:0:4401 -501:3:2971 -502:0:4401 -503:3:2974 -504:3:2975 -505:3:2987 -506:3:2988 -507:3:2992 -508:3:2993 -509:3:3001 -510:3:3006 -511:3:3010 -512:3:3011 -513:3:3018 -514:3:3019 -515:3:3030 -516:3:3031 -517:3:3032 -518:3:3043 -519:3:3048 -520:3:3049 -521:0:4401 -522:3:3061 -523:0:4401 -524:3:3063 -525:0:4401 -526:3:3064 -527:0:4401 -528:3:3065 -529:0:4401 -530:3:3066 -531:0:4401 -532:3:3067 -533:3:3071 -534:3:3072 -535:3:3080 -536:3:3081 -537:3:3085 -538:3:3086 -539:3:3094 -540:3:3099 -541:3:3103 -542:3:3104 -543:3:3111 -544:3:3112 -545:3:3123 -546:3:3124 -547:3:3125 -548:3:3136 -549:3:3141 -550:3:3142 -551:0:4401 -552:3:3154 -553:0:4401 -554:3:3356 -555:0:4401 -556:3:3454 -557:0:4401 -558:3:3455 -559:0:4401 -560:3:3459 -561:0:4401 -562:3:3465 -563:3:3469 -564:3:3470 -565:3:3478 -566:3:3479 -567:3:3483 -568:3:3484 -569:3:3492 -570:3:3497 -571:3:3501 -572:3:3502 -573:3:3509 -574:3:3510 -575:3:3521 -576:3:3522 -577:3:3523 -578:3:3534 -579:3:3539 -580:3:3540 -581:0:4401 -582:3:3552 -583:0:4401 -584:3:3554 -585:0:4401 -586:3:3555 -587:3:3559 -588:3:3560 -589:3:3568 -590:3:3569 -591:3:3573 -592:3:3574 -593:3:3582 -594:3:3587 -595:3:3591 -596:3:3592 -597:3:3599 -598:3:3600 -599:3:3611 -600:3:3612 -601:3:3613 -602:3:3624 -603:3:3629 -604:3:3630 -605:0:4401 -606:3:3642 -607:0:4401 -608:3:3644 -609:0:4401 -610:3:3647 -611:3:3648 -612:3:3660 -613:3:3661 -614:3:3665 -615:3:3666 -616:3:3674 -617:3:3679 -618:3:3683 -619:3:3684 -620:3:3691 -621:3:3692 -622:3:3703 -623:3:3704 -624:3:3705 -625:3:3716 -626:3:3721 -627:3:3722 -628:0:4401 -629:3:3734 -630:0:4401 -631:3:3736 -632:0:4401 -633:3:3737 -634:0:4401 -635:3:3738 -636:0:4401 -637:3:3739 -638:0:4401 -639:3:3740 -640:3:3744 -641:3:3745 -642:3:3753 -643:3:3754 -644:3:3758 -645:3:3759 -646:3:3767 -647:3:3772 -648:3:3776 -649:3:3777 -650:3:3784 -651:3:3785 -652:3:3796 -653:3:3797 -654:3:3798 -655:3:3809 -656:3:3814 -657:3:3815 -658:0:4401 -659:3:3827 -660:0:4401 -661:3:4029 -662:0:4401 -663:3:4127 -664:0:4401 -665:3:4128 -666:0:4401 -667:3:4132 -668:0:4401 -669:3:4138 -670:0:4401 -671:3:4142 -672:3:4143 -673:3:4147 -674:3:4151 -675:3:4152 -676:3:4156 -677:3:4164 -678:3:4165 -679:3:4170 -680:3:4177 -681:3:4178 -682:3:4185 -683:3:4190 -684:0:4401 -685:3:4201 -686:0:4401 -687:3:4205 -688:3:4206 -689:3:4210 -690:3:4214 -691:3:4215 -692:3:4219 -693:3:4227 -694:3:4228 -695:3:4233 -696:3:4240 -697:3:4241 -698:3:4248 -699:3:4253 -700:0:4401 -701:3:4264 -702:0:4401 -703:3:4272 -704:3:4273 -705:3:4277 -706:3:4281 -707:3:4282 -708:3:4286 -709:3:4294 -710:3:4295 -711:3:4300 -712:3:4307 -713:3:4308 -714:3:4315 -715:3:4320 -716:0:4401 -717:3:4335 -718:0:4401 -719:3:4337 -720:0:4401 -721:3:4338 -722:0:4401 -723:3:2486 -724:0:4401 -725:3:2487 -726:3:2491 -727:3:2492 -728:3:2500 -729:3:2501 -730:3:2505 -731:3:2506 -732:3:2514 -733:3:2519 -734:3:2523 -735:3:2524 -736:3:2531 -737:3:2532 -738:3:2543 -739:3:2544 -740:3:2545 -741:3:2556 -742:3:2561 -743:3:2562 -744:0:4401 -745:3:2574 -746:0:4401 -747:3:2576 -748:3:2577 -749:0:4401 -750:3:2581 -751:3:2585 -752:3:2586 -753:3:2594 -754:3:2595 -755:3:2599 -756:3:2600 -757:3:2608 -758:3:2613 -759:3:2614 -760:3:2625 -761:3:2626 -762:3:2637 -763:3:2638 -764:3:2639 -765:3:2650 -766:3:2655 -767:3:2656 -768:0:4401 -769:3:2668 -770:0:4401 -771:3:2670 -772:0:4401 -773:3:2671 -774:0:4401 -775:3:2681 -776:0:4401 -777:3:2682 -778:0:4401 -779:3:2686 -780:3:2687 -781:3:2691 -782:3:2695 -783:3:2696 -784:3:2700 -785:3:2708 -786:3:2709 -787:3:2714 -788:3:2721 -789:3:2722 -790:3:2729 -791:3:2734 -792:0:4401 -793:3:2745 -794:0:4401 -795:3:2749 -796:3:2750 -797:3:2754 -798:3:2758 -799:3:2759 -800:3:2763 -801:3:2771 -802:3:2772 -803:3:2777 -804:3:2784 -805:3:2785 -806:3:2792 -807:3:2797 -808:0:4401 -809:3:2808 -810:0:4401 -811:3:2816 -812:3:2817 -813:3:2821 -814:3:2825 -815:3:2826 -816:3:2830 -817:3:2838 -818:3:2839 -819:3:2844 -820:3:2851 -821:3:2852 -822:3:2859 -823:3:2864 -824:0:4401 -825:3:2879 -826:0:4401 -827:3:2881 -828:0:4401 -829:3:2882 -830:3:2886 -831:3:2887 -832:3:2895 -833:3:2896 -834:3:2900 -835:3:2901 -836:3:2909 -837:3:2914 -838:3:2918 -839:3:2919 -840:3:2926 -841:3:2927 -842:3:2938 -843:3:2939 -844:3:2940 -845:3:2951 -846:3:2956 -847:3:2957 -848:0:4401 -849:3:2969 -850:0:4401 -851:3:2971 -852:0:4401 -853:3:2974 -854:3:2975 -855:3:2987 -856:3:2988 -857:3:2992 -858:3:2993 -859:3:3001 -860:3:3006 -861:3:3010 -862:3:3011 -863:3:3018 -864:3:3019 -865:3:3030 -866:3:3031 -867:3:3032 -868:3:3043 -869:3:3048 -870:3:3049 -871:0:4401 -872:3:3061 -873:0:4401 -874:3:3063 -875:0:4401 -876:3:3064 -877:0:4401 -878:3:3065 -879:0:4401 -880:3:3066 -881:0:4401 -882:3:3067 -883:3:3071 -884:3:3072 -885:3:3080 -886:3:3081 -887:3:3085 -888:3:3086 -889:3:3094 -890:3:3099 -891:3:3103 -892:3:3104 -893:3:3111 -894:3:3112 -895:3:3123 -896:3:3124 -897:3:3125 -898:3:3136 -899:3:3141 -900:3:3142 -901:0:4401 -902:3:3154 -903:0:4401 -904:3:3356 -905:0:4401 -906:3:3454 -907:0:4401 -908:3:3455 -909:0:4401 -910:3:3459 -911:0:4401 -912:3:3465 -913:3:3469 -914:3:3470 -915:3:3478 -916:3:3479 -917:3:3483 -918:3:3484 -919:3:3492 -920:3:3497 -921:3:3501 -922:3:3502 -923:3:3509 -924:3:3510 -925:3:3521 -926:3:3522 -927:3:3523 -928:3:3534 -929:3:3539 -930:3:3540 -931:0:4401 -932:3:3552 -933:0:4401 -934:3:3554 -935:0:4401 -936:3:3555 -937:3:3559 -938:3:3560 -939:3:3568 -940:3:3569 -941:3:3573 -942:3:3574 -943:3:3582 -944:3:3587 -945:3:3591 -946:3:3592 -947:3:3599 -948:3:3600 -949:3:3611 -950:3:3612 -951:3:3613 -952:3:3624 -953:3:3629 -954:3:3630 -955:0:4401 -956:3:3642 -957:0:4401 -958:3:3644 -959:0:4401 -960:3:3647 -961:3:3648 -962:3:3660 -963:3:3661 -964:3:3665 -965:3:3666 -966:3:3674 -967:3:3679 -968:3:3683 -969:3:3684 -970:3:3691 -971:3:3692 -972:3:3703 -973:3:3704 -974:3:3705 -975:3:3716 -976:3:3721 -977:3:3722 -978:0:4401 -979:3:3734 -980:0:4401 -981:3:3736 -982:0:4401 -983:3:3737 -984:0:4401 -985:3:3738 -986:0:4401 -987:3:3739 -988:0:4401 -989:3:3740 -990:3:3744 -991:3:3745 -992:3:3753 -993:3:3754 -994:3:3758 -995:3:3759 -996:3:3767 -997:3:3772 -998:3:3776 -999:3:3777 -1000:3:3784 -1001:3:3785 -1002:3:3796 -1003:3:3797 -1004:3:3798 -1005:3:3809 -1006:3:3814 -1007:3:3815 -1008:0:4401 -1009:3:3827 -1010:0:4401 -1011:3:4029 -1012:0:4401 -1013:3:4127 -1014:0:4401 -1015:3:4128 -1016:0:4401 -1017:3:4132 -1018:0:4401 -1019:3:4138 -1020:0:4401 -1021:3:4142 -1022:3:4143 -1023:3:4147 -1024:3:4151 -1025:3:4152 -1026:3:4156 -1027:3:4164 -1028:3:4165 -1029:3:4170 -1030:3:4177 -1031:3:4178 -1032:3:4185 -1033:3:4190 -1034:0:4401 -1035:3:4201 -1036:0:4401 -1037:3:4205 -1038:3:4206 -1039:3:4210 -1040:3:4214 -1041:3:4215 -1042:3:4219 -1043:3:4227 -1044:3:4228 -1045:3:4233 -1046:3:4240 -1047:3:4241 -1048:3:4248 -1049:3:4253 -1050:0:4401 -1051:3:4264 -1052:0:4401 -1053:3:4272 -1054:3:4273 -1055:3:4277 -1056:3:4281 -1057:3:4282 -1058:3:4286 -1059:3:4294 -1060:3:4295 -1061:3:4300 -1062:3:4307 -1063:3:4308 -1064:3:4315 -1065:3:4320 -1066:0:4401 -1067:3:4335 -1068:0:4401 -1069:3:4337 -1070:0:4401 -1071:3:4338 -1072:0:4401 -1073:3:4341 -1074:0:4401 -1075:3:4346 -1076:0:4401 -1077:2:1236 -1078:0:4401 -1079:3:4347 -1080:0:4401 -1081:2:1242 -1082:0:4401 -1083:3:4346 -1084:0:4401 -1085:2:1243 -1086:0:4401 -1087:3:4347 -1088:0:4401 -1089:2:1244 -1090:0:4401 -1091:3:4346 -1092:0:4401 -1093:2:1245 -1094:0:4401 -1095:3:4347 -1096:0:4401 -1097:1:2 -1098:0:4401 -1099:3:4346 -1100:0:4401 -1101:2:1246 -1102:0:4401 -1103:3:4347 -1104:0:4401 -1105:1:8 -1106:0:4401 -1107:3:4346 -1108:0:4401 -1109:2:1245 -1110:0:4401 -1111:3:4347 -1112:0:4401 -1113:1:9 -1114:0:4401 -1115:3:4346 -1116:0:4401 -1117:2:1246 -1118:0:4401 -1119:3:4347 -1120:0:4401 -1121:1:10 -1122:0:4401 -1123:3:4346 -1124:0:4401 -1125:2:1245 -1126:0:4401 -1127:3:4347 -1128:0:4401 -1129:1:11 -1130:0:4401 -1131:3:4346 -1132:0:4401 -1133:2:1246 -1134:0:4401 -1135:3:4347 -1136:0:4401 -1137:1:14 -1138:0:4401 -1139:3:4346 -1140:0:4401 -1141:2:1245 -1142:0:4401 -1143:3:4347 -1144:0:4401 -1145:1:15 -1146:0:4401 -1147:3:4346 -1148:0:4401 -1149:2:1246 -1150:0:4401 -1151:3:4347 -1152:0:4401 -1153:1:16 -1154:1:20 -1155:1:21 -1156:1:29 -1157:1:30 -1158:1:34 -1159:1:35 -1160:1:43 -1161:1:48 -1162:1:52 -1163:1:53 -1164:1:60 -1165:1:61 -1166:1:72 -1167:1:73 -1168:1:74 -1169:1:85 -1170:1:90 -1171:1:91 -1172:0:4401 -1173:3:4346 -1174:0:4401 -1175:2:1245 -1176:0:4401 -1177:3:4347 -1178:0:4401 -1179:1:103 -1180:0:4401 -1181:3:4346 -1182:0:4401 -1183:2:1246 -1184:0:4401 -1185:3:4347 -1186:0:4401 -1187:2:1247 -1188:0:4401 -1189:3:4346 -1190:0:4401 -1191:2:1253 -1192:0:4401 -1193:3:4347 -1194:0:4401 -1195:2:1254 -1196:0:4399 -1197:3:4346 -1198:0:4405 -1199:3:4347 -1200:0:4405 -1201:2:1257 -1202:0:4405 -1203:3:4346 -1204:0:4405 -1205:2:1258 -1206:0:4405 -1207:3:4347 -1208:0:4405 -1209:2:1259 -1210:2:1263 -1211:2:1264 -1212:2:1272 -1213:2:1273 -1214:2:1277 -1215:2:1278 -1216:2:1286 -1217:2:1291 -1218:2:1295 -1219:2:1296 -1220:2:1303 -1221:2:1304 -1222:2:1315 -1223:2:1316 -1224:2:1317 -1225:2:1328 -1226:2:1333 -1227:2:1334 -1228:0:4405 -1229:3:4346 -1230:0:4405 -1231:2:1346 -1232:0:4405 -1233:3:4347 -1234:0:4405 -1235:2:1347 -1236:0:4405 -1237:3:4346 -1238:0:4405 -1239:1:104 --1:-1:-1 -1240:0:4405 -1241:3:4347 -1242:0:4405 -1243:3:4346 -1244:0:4405 -1245:2:1348 -1246:0:4405 -1247:3:4347 -1248:0:4405 -1249:2:1347 -1250:0:4405 -1251:3:4346 -1252:0:4405 -1253:1:105 -1254:0:4405 -1255:3:4347 -1256:0:4405 -1257:3:4346 -1258:0:4405 -1259:2:1348 -1260:0:4405 -1261:3:4347 -1262:0:4405 -1263:2:1347 -1264:0:4405 -1265:3:4346 -1266:0:4405 -1267:1:104 diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.define b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.log b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.log deleted file mode 100644 index 02c53cf..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.log +++ /dev/null @@ -1,348 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 742) -depth 12: Claim reached state 9 (line 747) -depth 28: Claim reached state 9 (line 746) - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 10679, errors: 0 - 38555 states, stored (92500 visited) - 1044204 states, matched - 1136704 transitions (= visited+matched) - 3867169 atomic steps -hash conflicts: 8572 (resolved) - -Stats on memory usage (in Megabytes): - 3.089 equivalent memory usage for states (stored*(State-vector + overhead)) - 2.930 actual memory usage for states (compression: 94.87%) - state-vector as stored = 52 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 468.596 total actual memory usage - -unreached in proctype urcu_reader_sig - line 402, "pan.___", state 330, "(1)" - line 613, "pan.___", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 59, "(1)" - line 417, "pan.___", state 89, "(1)" - line 398, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 408, "pan.___", state 160, "(1)" - line 651, "pan.___", state 213, "(1)" - line 174, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 178, "pan.___", state 233, "(1)" - line 159, "pan.___", state 254, "(1)" - line 163, "pan.___", state 262, "(1)" - line 167, "pan.___", state 274, "(1)" - line 174, "pan.___", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 742, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 752, "(1)" - line 163, "pan.___", state 760, "(1)" - line 163, "pan.___", state 761, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 761, "else" - line 161, "pan.___", state 766, "((j<1))" - line 161, "pan.___", state 766, "((j>=1))" - line 167, "pan.___", state 772, "(1)" - line 167, "pan.___", state 773, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 773, "else" - line 169, "pan.___", state 776, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 776, "else" - line 174, "pan.___", state 783, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 805, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 167, "pan.___", state 835, "(1)" - line 167, "pan.___", state 836, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 174, "pan.___", state 850, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 852, "(1)" - line 178, "pan.___", state 859, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 861, "(1)" - line 178, "pan.___", state 862, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 862, "else" - line 176, "pan.___", state 867, "((j<1))" - line 176, "pan.___", state 867, "((j>=1))" - line 182, "pan.___", state 872, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 882, "(1)" - line 163, "pan.___", state 890, "(1)" - line 163, "pan.___", state 891, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 891, "else" - line 161, "pan.___", state 896, "((j<1))" - line 161, "pan.___", state 896, "((j>=1))" - line 167, "pan.___", state 902, "(1)" - line 167, "pan.___", state 903, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 903, "else" - line 169, "pan.___", state 906, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 906, "else" - line 201, "pan.___", state 908, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 201, "pan.___", state 908, "else" - line 220, "pan.___", state 909, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 220, "pan.___", state 909, "else" - line 355, "pan.___", state 915, "((sighand_exec==1))" - line 355, "pan.___", state 915, "else" - line 361, "pan.___", state 918, "sighand_exec = 1" - line 398, "pan.___", state 931, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 933, "(1)" - line 398, "pan.___", state 934, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 934, "else" - line 398, "pan.___", state 937, "(1)" - line 402, "pan.___", state 945, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 947, "(1)" - line 402, "pan.___", state 948, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 948, "else" - line 402, "pan.___", state 951, "(1)" - line 402, "pan.___", state 952, "(1)" - line 402, "pan.___", state 952, "(1)" - line 400, "pan.___", state 957, "((i<1))" - line 400, "pan.___", state 957, "((i>=1))" - line 407, "pan.___", state 963, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 976, "(1)" - line 408, "pan.___", state 977, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 977, "else" - line 408, "pan.___", state 980, "(1)" - line 408, "pan.___", state 981, "(1)" - line 408, "pan.___", state 981, "(1)" - line 412, "pan.___", state 989, "(1)" - line 412, "pan.___", state 990, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 990, "else" - line 412, "pan.___", state 993, "(1)" - line 412, "pan.___", state 994, "(1)" - line 412, "pan.___", state 994, "(1)" - line 410, "pan.___", state 999, "((i<1))" - line 410, "pan.___", state 999, "((i>=1))" - line 417, "pan.___", state 1006, "(1)" - line 417, "pan.___", state 1007, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 1007, "else" - line 417, "pan.___", state 1010, "(1)" - line 417, "pan.___", state 1011, "(1)" - line 417, "pan.___", state 1011, "(1)" - line 419, "pan.___", state 1014, "(1)" - line 419, "pan.___", state 1014, "(1)" - line 361, "pan.___", state 1023, "sighand_exec = 1" - line 402, "pan.___", state 1054, "(1)" - line 407, "pan.___", state 1070, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1113, "(1)" - line 402, "pan.___", state 1151, "(1)" - line 407, "pan.___", state 1167, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1210, "(1)" - line 398, "pan.___", state 1236, "(1)" - line 402, "pan.___", state 1250, "(1)" - line 407, "pan.___", state 1266, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1309, "(1)" - line 402, "pan.___", state 1350, "(1)" - line 407, "pan.___", state 1366, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 417, "pan.___", state 1409, "(1)" - line 174, "pan.___", state 1430, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 1432, "(1)" - line 178, "pan.___", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 1441, "(1)" - line 178, "pan.___", state 1442, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 1442, "else" - line 176, "pan.___", state 1447, "((j<1))" - line 176, "pan.___", state 1447, "((j>=1))" - line 182, "pan.___", state 1452, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 1462, "(1)" - line 163, "pan.___", state 1470, "(1)" - line 163, "pan.___", state 1471, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 1471, "else" - line 161, "pan.___", state 1476, "((j<1))" - line 161, "pan.___", state 1476, "((j>=1))" - line 167, "pan.___", state 1482, "(1)" - line 167, "pan.___", state 1483, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 1483, "else" - line 169, "pan.___", state 1486, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 1486, "else" - line 174, "pan.___", state 1493, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 182, "pan.___", state 1515, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 167, "pan.___", state 1545, "(1)" - line 167, "pan.___", state 1546, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 174, "pan.___", state 1560, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 174, "pan.___", state 1562, "(1)" - line 178, "pan.___", state 1569, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 178, "pan.___", state 1571, "(1)" - line 178, "pan.___", state 1572, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 178, "pan.___", state 1572, "else" - line 176, "pan.___", state 1577, "((j<1))" - line 176, "pan.___", state 1577, "((j>=1))" - line 182, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 1592, "(1)" - line 163, "pan.___", state 1600, "(1)" - line 163, "pan.___", state 1601, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 163, "pan.___", state 1601, "else" - line 161, "pan.___", state 1606, "((j<1))" - line 161, "pan.___", state 1606, "((j>=1))" - line 167, "pan.___", state 1612, "(1)" - line 167, "pan.___", state 1613, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 167, "pan.___", state 1613, "else" - line 169, "pan.___", state 1616, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 169, "pan.___", state 1616, "else" - line 201, "pan.___", state 1618, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 201, "pan.___", state 1618, "else" - line 220, "pan.___", state 1619, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 220, "pan.___", state 1619, "else" - line 355, "pan.___", state 1625, "((sighand_exec==1))" - line 355, "pan.___", state 1625, "else" - line 361, "pan.___", state 1628, "sighand_exec = 1" - line 398, "pan.___", state 1641, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 398, "pan.___", state 1643, "(1)" - line 398, "pan.___", state 1644, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 398, "pan.___", state 1644, "else" - line 398, "pan.___", state 1647, "(1)" - line 402, "pan.___", state 1655, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 402, "pan.___", state 1657, "(1)" - line 402, "pan.___", state 1658, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 402, "pan.___", state 1658, "else" - line 402, "pan.___", state 1661, "(1)" - line 402, "pan.___", state 1662, "(1)" - line 402, "pan.___", state 1662, "(1)" - line 400, "pan.___", state 1667, "((i<1))" - line 400, "pan.___", state 1667, "((i>=1))" - line 407, "pan.___", state 1673, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 408, "pan.___", state 1686, "(1)" - line 408, "pan.___", state 1687, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 408, "pan.___", state 1687, "else" - line 408, "pan.___", state 1690, "(1)" - line 408, "pan.___", state 1691, "(1)" - line 408, "pan.___", state 1691, "(1)" - line 412, "pan.___", state 1699, "(1)" - line 412, "pan.___", state 1700, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 412, "pan.___", state 1700, "else" - line 412, "pan.___", state 1703, "(1)" - line 412, "pan.___", state 1704, "(1)" - line 412, "pan.___", state 1704, "(1)" - line 410, "pan.___", state 1709, "((i<1))" - line 410, "pan.___", state 1709, "((i>=1))" - line 417, "pan.___", state 1716, "(1)" - line 417, "pan.___", state 1717, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 417, "pan.___", state 1717, "else" - line 417, "pan.___", state 1720, "(1)" - line 417, "pan.___", state 1721, "(1)" - line 417, "pan.___", state 1721, "(1)" - line 419, "pan.___", state 1724, "(1)" - line 419, "pan.___", state 1724, "(1)" - line 361, "pan.___", state 1733, "sighand_exec = 1" - line 178, "pan.___", state 1758, "(1)" - line 182, "pan.___", state 1769, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 159, "pan.___", state 1779, "(1)" - line 163, "pan.___", state 1787, "(1)" - line 167, "pan.___", state 1799, "(1)" - line 174, "pan.___", state 1810, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.spin.input.trail b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.spin.input.trail deleted file mode 100644 index e65d663..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer.spin.input.trail +++ /dev/null @@ -1,9 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2679 -2:1:2673 -3:1:2674 -4:1:2675 -5:1:2676 -6:0:2685 -7:5:1129 diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.define b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.log b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.log deleted file mode 100644 index cd4e32b..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.log +++ /dev/null @@ -1,286 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer_error.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 743) -depth 12: Claim reached state 9 (line 748) -depth 28: Claim reached state 9 (line 747) - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 10679, errors: 0 - 38555 states, stored (92500 visited) - 1044204 states, matched - 1136704 transitions (= visited+matched) - 3867169 atomic steps -hash conflicts: 6390 (resolved) - -Stats on memory usage (in Megabytes): - 3.089 equivalent memory usage for states (stored*(State-vector + overhead)) - 2.767 actual memory usage for states (compression: 89.58%) - state-vector as stored = 47 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 468.498 total actual memory usage - -unreached in proctype urcu_reader_sig - line 403, "pan.___", state 330, "(1)" - line 614, "pan.___", state 411, "-end-" - (2 of 411 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 59, "(1)" - line 418, "pan.___", state 89, "(1)" - line 399, "pan.___", state 115, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 409, "pan.___", state 160, "(1)" - line 652, "pan.___", state 213, "(1)" - line 175, "pan.___", state 222, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 179, "pan.___", state 233, "(1)" - line 160, "pan.___", state 254, "(1)" - line 164, "pan.___", state 262, "(1)" - line 168, "pan.___", state 274, "(1)" - line 175, "pan.___", state 285, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 753, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 766, "(1)" - line 409, "pan.___", state 767, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 767, "else" - line 409, "pan.___", state 770, "(1)" - line 409, "pan.___", state 771, "(1)" - line 409, "pan.___", state 771, "(1)" - line 413, "pan.___", state 779, "(1)" - line 413, "pan.___", state 780, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 780, "else" - line 413, "pan.___", state 783, "(1)" - line 413, "pan.___", state 784, "(1)" - line 413, "pan.___", state 784, "(1)" - line 411, "pan.___", state 789, "((i<1))" - line 411, "pan.___", state 789, "((i>=1))" - line 418, "pan.___", state 796, "(1)" - line 418, "pan.___", state 797, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 797, "else" - line 418, "pan.___", state 800, "(1)" - line 418, "pan.___", state 801, "(1)" - line 418, "pan.___", state 801, "(1)" - line 420, "pan.___", state 804, "(1)" - line 420, "pan.___", state 804, "(1)" - line 356, "pan.___", state 810, "((sighand_exec==1))" - line 356, "pan.___", state 810, "else" - line 362, "pan.___", state 813, "sighand_exec = 1" - line 399, "pan.___", state 826, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 828, "(1)" - line 399, "pan.___", state 829, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 829, "else" - line 399, "pan.___", state 832, "(1)" - line 403, "pan.___", state 840, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 842, "(1)" - line 403, "pan.___", state 843, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 843, "else" - line 403, "pan.___", state 846, "(1)" - line 403, "pan.___", state 847, "(1)" - line 403, "pan.___", state 847, "(1)" - line 401, "pan.___", state 852, "((i<1))" - line 401, "pan.___", state 852, "((i>=1))" - line 408, "pan.___", state 858, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 871, "(1)" - line 409, "pan.___", state 872, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 872, "else" - line 409, "pan.___", state 875, "(1)" - line 409, "pan.___", state 876, "(1)" - line 409, "pan.___", state 876, "(1)" - line 413, "pan.___", state 884, "(1)" - line 413, "pan.___", state 885, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 885, "else" - line 413, "pan.___", state 888, "(1)" - line 413, "pan.___", state 889, "(1)" - line 413, "pan.___", state 889, "(1)" - line 411, "pan.___", state 894, "((i<1))" - line 411, "pan.___", state 894, "((i>=1))" - line 418, "pan.___", state 901, "(1)" - line 418, "pan.___", state 902, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 902, "else" - line 418, "pan.___", state 905, "(1)" - line 418, "pan.___", state 906, "(1)" - line 418, "pan.___", state 906, "(1)" - line 420, "pan.___", state 909, "(1)" - line 420, "pan.___", state 909, "(1)" - line 362, "pan.___", state 918, "sighand_exec = 1" - line 403, "pan.___", state 949, "(1)" - line 408, "pan.___", state 965, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 418, "pan.___", state 1008, "(1)" - line 403, "pan.___", state 1046, "(1)" - line 408, "pan.___", state 1062, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 418, "pan.___", state 1105, "(1)" - line 399, "pan.___", state 1131, "(1)" - line 403, "pan.___", state 1145, "(1)" - line 408, "pan.___", state 1161, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 418, "pan.___", state 1204, "(1)" - line 403, "pan.___", state 1245, "(1)" - line 408, "pan.___", state 1261, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 418, "pan.___", state 1304, "(1)" - line 399, "pan.___", state 1326, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 1328, "(1)" - line 399, "pan.___", state 1329, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 1329, "else" - line 399, "pan.___", state 1332, "(1)" - line 403, "pan.___", state 1340, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 1342, "(1)" - line 403, "pan.___", state 1343, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 1343, "else" - line 403, "pan.___", state 1346, "(1)" - line 403, "pan.___", state 1347, "(1)" - line 403, "pan.___", state 1347, "(1)" - line 401, "pan.___", state 1352, "((i<1))" - line 401, "pan.___", state 1352, "((i>=1))" - line 408, "pan.___", state 1358, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 1371, "(1)" - line 409, "pan.___", state 1372, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 1372, "else" - line 409, "pan.___", state 1375, "(1)" - line 409, "pan.___", state 1376, "(1)" - line 409, "pan.___", state 1376, "(1)" - line 413, "pan.___", state 1384, "(1)" - line 413, "pan.___", state 1385, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 1385, "else" - line 413, "pan.___", state 1388, "(1)" - line 413, "pan.___", state 1389, "(1)" - line 413, "pan.___", state 1389, "(1)" - line 411, "pan.___", state 1394, "((i<1))" - line 411, "pan.___", state 1394, "((i>=1))" - line 418, "pan.___", state 1401, "(1)" - line 418, "pan.___", state 1402, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 1402, "else" - line 418, "pan.___", state 1405, "(1)" - line 418, "pan.___", state 1406, "(1)" - line 418, "pan.___", state 1406, "(1)" - line 420, "pan.___", state 1409, "(1)" - line 420, "pan.___", state 1409, "(1)" - line 356, "pan.___", state 1415, "((sighand_exec==1))" - line 356, "pan.___", state 1415, "else" - line 362, "pan.___", state 1418, "sighand_exec = 1" - line 399, "pan.___", state 1431, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<0)))" - line 399, "pan.___", state 1433, "(1)" - line 399, "pan.___", state 1434, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<0)))" - line 399, "pan.___", state 1434, "else" - line 399, "pan.___", state 1437, "(1)" - line 403, "pan.___", state 1445, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<0)))" - line 403, "pan.___", state 1447, "(1)" - line 403, "pan.___", state 1448, "((cache_dirty_urcu_active_readers.bitfield&(1<<0)))" - line 403, "pan.___", state 1448, "else" - line 403, "pan.___", state 1451, "(1)" - line 403, "pan.___", state 1452, "(1)" - line 403, "pan.___", state 1452, "(1)" - line 401, "pan.___", state 1457, "((i<1))" - line 401, "pan.___", state 1457, "((i>=1))" - line 408, "pan.___", state 1463, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 409, "pan.___", state 1476, "(1)" - line 409, "pan.___", state 1477, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<0))))" - line 409, "pan.___", state 1477, "else" - line 409, "pan.___", state 1480, "(1)" - line 409, "pan.___", state 1481, "(1)" - line 409, "pan.___", state 1481, "(1)" - line 413, "pan.___", state 1489, "(1)" - line 413, "pan.___", state 1490, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<0))))" - line 413, "pan.___", state 1490, "else" - line 413, "pan.___", state 1493, "(1)" - line 413, "pan.___", state 1494, "(1)" - line 413, "pan.___", state 1494, "(1)" - line 411, "pan.___", state 1499, "((i<1))" - line 411, "pan.___", state 1499, "((i>=1))" - line 418, "pan.___", state 1506, "(1)" - line 418, "pan.___", state 1507, "(!((cache_dirty_generation_ptr.bitfield&(1<<0))))" - line 418, "pan.___", state 1507, "else" - line 418, "pan.___", state 1510, "(1)" - line 418, "pan.___", state 1511, "(1)" - line 418, "pan.___", state 1511, "(1)" - line 420, "pan.___", state 1514, "(1)" - line 420, "pan.___", state 1514, "(1)" - line 362, "pan.___", state 1523, "sighand_exec = 1" - line 179, "pan.___", state 1548, "(1)" - line 183, "pan.___", state 1559, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<0)))" - line 160, "pan.___", state 1569, "(1)" - line 164, "pan.___", state 1577, "(1)" - line 168, "pan.___", state 1589, "(1)" - line 175, "pan.___", state 1600, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.spin.input.trail deleted file mode 100644 index 5b0eadd..0000000 --- a/formal-model/urcu/result-signal-over-writer/urcu_progress_writer_error.spin.input.trail +++ /dev/null @@ -1,4231 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2965 -2:3:2917 -3:3:2920 -4:3:2920 -5:3:2920 -6:3:2923 -7:3:2931 -8:3:2931 -9:3:2931 -10:3:2934 -11:3:2940 -12:3:2944 -13:3:2944 -14:3:2944 -15:3:2947 -16:3:2955 -17:3:2959 -18:3:2960 -19:0:2965 -20:3:2962 -21:0:2965 -22:2:1151 -23:0:2965 -24:2:1157 -25:0:2965 -26:2:1158 -27:0:2965 -28:2:1159 -29:2:1163 -30:2:1164 -31:2:1172 -32:2:1173 -33:2:1177 -34:2:1178 -35:2:1186 -36:2:1191 -37:2:1195 -38:2:1196 -39:2:1203 -40:2:1204 -41:2:1215 -42:2:1216 -43:2:1217 -44:2:1228 -45:2:1233 -46:2:1234 -47:0:2963 -48:2:1246 -49:0:2969 -50:2:1247 -51:0:2969 -52:1:2 -53:0:2969 -54:2:1248 -55:0:2969 -56:1:8 -57:0:2969 -58:1:9 -59:0:2969 -60:2:1247 -61:0:2969 -62:2:1248 -63:0:2969 -64:1:10 -65:0:2969 -66:2:1249 -67:0:2969 -68:2:1255 -69:2:1256 -70:0:2969 -71:2:1260 -72:2:1264 -73:2:1265 -74:2:1273 -75:2:1274 -76:2:1278 -77:2:1279 -78:2:1287 -79:2:1292 -80:2:1293 -81:2:1304 -82:2:1305 -83:2:1316 -84:2:1317 -85:2:1318 -86:2:1329 -87:2:1334 -88:2:1335 -89:0:2969 -90:2:1347 -91:0:2969 -92:2:1348 -93:0:2969 -94:1:13 -95:0:2969 -96:2:1349 -97:0:2969 -98:1:19 -99:0:2969 -100:1:20 -101:0:2969 -102:2:1348 -103:0:2969 -104:2:1349 -105:0:2969 -106:1:21 -107:1:25 -108:1:26 -109:1:34 -110:1:35 -111:1:39 -112:1:40 -113:1:48 -114:1:53 -115:1:57 -116:1:58 -117:1:65 -118:1:66 -119:1:77 -120:1:78 -121:1:79 -122:1:90 -123:1:95 -124:1:96 -125:0:2969 -126:2:1348 -127:0:2969 -128:2:1349 -129:0:2969 -130:1:108 -131:0:2969 -132:2:1348 -133:0:2969 -134:2:1349 -135:0:2969 -136:1:109 -137:1:113 -138:1:114 -139:1:122 -140:1:123 -141:1:127 -142:1:128 -143:1:136 -144:1:141 -145:1:145 -146:1:146 -147:1:153 -148:1:154 -149:1:165 -150:1:166 -151:1:167 -152:1:178 -153:1:183 -154:1:184 -155:0:2969 -156:1:196 -157:0:2969 -158:2:1348 -159:0:2969 -160:2:1349 -161:0:2969 -162:1:197 -163:0:2969 -164:2:1348 -165:0:2969 -166:2:1349 -167:0:2969 -168:1:198 -169:1:202 -170:1:203 -171:1:211 -172:1:212 -173:1:216 -174:1:217 -175:1:225 -176:1:230 -177:1:234 -178:1:235 -179:1:242 -180:1:243 -181:1:254 -182:1:255 -183:1:256 -184:1:267 -185:1:272 -186:1:273 -187:0:2969 -188:2:1348 -189:0:2969 -190:2:1349 -191:0:2969 -192:1:285 -193:0:2969 -194:1:486 -195:0:2969 -196:1:487 -197:0:2969 -198:1:20 -199:0:2969 -200:2:1348 -201:0:2969 -202:2:1349 -203:0:2969 -204:1:21 -205:1:25 -206:1:26 -207:1:34 -208:1:35 -209:1:36 -210:1:48 -211:1:53 -212:1:57 -213:1:58 -214:1:65 -215:1:66 -216:1:77 -217:1:78 -218:1:79 -219:1:90 -220:1:95 -221:1:96 -222:0:2969 -223:2:1348 -224:0:2969 -225:2:1349 -226:0:2969 -227:1:108 -228:0:2969 -229:2:1348 -230:0:2969 -231:2:1349 -232:0:2969 -233:1:109 -234:1:113 -235:1:114 -236:1:122 -237:1:123 -238:1:127 -239:1:128 -240:1:136 -241:1:141 -242:1:145 -243:1:146 -244:1:153 -245:1:154 -246:1:165 -247:1:166 -248:1:167 -249:1:178 -250:1:183 -251:1:184 -252:0:2969 -253:1:288 -254:0:2969 -255:2:1348 -256:0:2969 -257:2:1349 -258:0:2969 -259:1:289 -260:0:2969 -261:1:486 -262:0:2969 -263:1:487 -264:0:2969 -265:1:492 -266:0:2969 -267:2:1348 -268:0:2969 -269:2:1349 -270:0:2969 -271:1:497 -272:1:501 -273:1:502 -274:1:510 -275:1:511 -276:1:512 -277:1:524 -278:1:529 -279:1:533 -280:1:534 -281:1:541 -282:1:542 -283:1:553 -284:1:554 -285:1:555 -286:1:566 -287:1:571 -288:1:572 -289:0:2969 -290:2:1348 -291:0:2969 -292:2:1349 -293:0:2969 -294:1:584 -295:0:2969 -296:2:1348 -297:0:2969 -298:2:1349 -299:0:2969 -300:1:585 -301:1:589 -302:1:590 -303:1:598 -304:1:599 -305:1:603 -306:1:604 -307:1:612 -308:1:617 -309:1:621 -310:1:622 -311:1:629 -312:1:630 -313:1:641 -314:1:642 -315:1:643 -316:1:654 -317:1:659 -318:1:660 -319:0:2969 -320:2:1348 -321:0:2969 -322:2:1349 -323:0:2969 -324:1:672 -325:0:2969 -326:2:1348 -327:0:2969 -328:2:1349 -329:0:2969 -330:1:673 -331:1:677 -332:1:678 -333:1:686 -334:1:687 -335:1:691 -336:1:692 -337:1:700 -338:1:705 -339:1:709 -340:1:710 -341:1:717 -342:1:718 -343:1:729 -344:1:730 -345:1:731 -346:1:742 -347:1:747 -348:1:748 -349:0:2969 -350:2:1348 -351:0:2969 -352:2:1349 -353:0:2969 -354:1:760 -355:0:2969 -356:1:761 -357:0:2969 -358:1:762 -359:0:2969 -360:1:955 -361:0:2969 -362:1:956 -363:0:2969 -364:2:1348 -365:0:2969 -366:2:1349 -367:0:2969 -368:1:960 -369:0:2969 -370:2:1348 -371:0:2969 -372:2:1349 -373:0:2969 -374:1:961 -375:1:965 -376:1:966 -377:1:974 -378:1:975 -379:1:979 -380:1:980 -381:1:988 -382:1:993 -383:1:997 -384:1:998 -385:1:1005 -386:1:1006 -387:1:1017 -388:1:1018 -389:1:1019 -390:1:1030 -391:1:1035 -392:1:1036 -393:0:2969 -394:2:1348 -395:0:2969 -396:2:1349 -397:0:2969 -398:1:1048 -399:0:2969 -400:1:762 -401:0:2969 -402:1:955 -403:0:2969 -404:1:956 -405:0:2969 -406:2:1348 -407:0:2969 -408:2:1349 -409:0:2969 -410:1:960 -411:0:2969 -412:2:1348 -413:0:2969 -414:2:1349 -415:0:2969 -416:1:961 -417:1:965 -418:1:966 -419:1:974 -420:1:975 -421:1:976 -422:1:988 -423:1:993 -424:1:997 -425:1:998 -426:1:1005 -427:1:1006 -428:1:1017 -429:1:1018 -430:1:1019 -431:1:1030 -432:1:1035 -433:1:1036 -434:0:2969 -435:2:1348 -436:0:2969 -437:2:1349 -438:0:2969 -439:1:1048 -440:0:2969 -441:1:1052 -442:0:2969 -443:2:1348 -444:0:2969 -445:2:1349 -446:0:2969 -447:1:1057 -448:1:1061 -449:1:1062 -450:1:1070 -451:1:1071 -452:1:1072 -453:1:1084 -454:1:1089 -455:1:1093 -456:1:1094 -457:1:1101 -458:1:1102 -459:1:1113 -460:1:1114 -461:1:1115 -462:1:1126 -463:1:1131 -464:1:1132 -465:0:2969 -466:1:9 -467:0:2969 -468:2:1348 -469:0:2969 -470:2:1349 -471:0:2969 -472:1:10 -473:0:2969 -474:2:1350 -475:0:2969 -476:2:1356 -477:0:2969 -478:2:1357 -479:0:2969 -480:2:1367 -481:0:2969 -482:2:1368 -483:0:2969 -484:2:1372 -485:2:1373 -486:2:1377 -487:2:1381 -488:2:1382 -489:2:1386 -490:2:1394 -491:2:1395 -492:2:1400 -493:2:1407 -494:2:1408 -495:2:1415 -496:2:1420 -497:0:2969 -498:2:1431 -499:0:2969 -500:2:1435 -501:2:1436 -502:2:1440 -503:2:1444 -504:2:1445 -505:2:1449 -506:2:1457 -507:2:1458 -508:2:1463 -509:2:1470 -510:2:1471 -511:2:1478 -512:2:1483 -513:0:2969 -514:2:1494 -515:0:2969 -516:2:1502 -517:2:1503 -518:2:1507 -519:2:1511 -520:2:1512 -521:2:1516 -522:2:1524 -523:2:1525 -524:2:1530 -525:2:1537 -526:2:1538 -527:2:1545 -528:2:1550 -529:0:2969 -530:2:1565 -531:0:2969 -532:2:1566 -533:0:2969 -534:1:13 -535:0:2969 -536:2:1567 -537:0:2969 -538:1:19 -539:0:2969 -540:1:20 -541:0:2969 -542:2:1566 -543:0:2969 -544:2:1567 -545:0:2969 -546:1:21 -547:1:25 -548:1:26 -549:1:34 -550:1:35 -551:1:39 -552:1:40 -553:1:48 -554:1:53 -555:1:57 -556:1:58 -557:1:65 -558:1:66 -559:1:77 -560:1:78 -561:1:79 -562:1:90 -563:1:95 -564:1:96 -565:0:2969 -566:2:1566 -567:0:2969 -568:2:1567 -569:0:2969 -570:1:108 -571:0:2969 -572:2:1566 -573:0:2969 -574:2:1567 -575:0:2969 -576:1:109 -577:1:113 -578:1:114 -579:1:122 -580:1:123 -581:1:127 -582:1:128 -583:1:136 -584:1:141 -585:1:145 -586:1:146 -587:1:153 -588:1:154 -589:1:165 -590:1:166 -591:1:167 -592:1:178 -593:1:183 -594:1:184 -595:0:2969 -596:1:196 -597:0:2969 -598:2:1566 -599:0:2969 -600:2:1567 -601:0:2969 -602:1:197 -603:0:2969 -604:2:1566 -605:0:2969 -606:2:1567 -607:0:2969 -608:1:198 -609:1:202 -610:1:203 -611:1:211 -612:1:212 -613:1:216 -614:1:217 -615:1:225 -616:1:230 -617:1:234 -618:1:235 -619:1:242 -620:1:243 -621:1:254 -622:1:255 -623:1:256 -624:1:267 -625:1:272 -626:1:273 -627:0:2969 -628:2:1566 -629:0:2969 -630:2:1567 -631:0:2969 -632:1:285 -633:0:2969 -634:1:486 -635:0:2969 -636:1:487 -637:0:2969 -638:1:20 -639:0:2969 -640:2:1566 -641:0:2969 -642:2:1567 -643:0:2969 -644:1:21 -645:1:25 -646:1:26 -647:1:34 -648:1:35 -649:1:36 -650:1:48 -651:1:53 -652:1:57 -653:1:58 -654:1:65 -655:1:66 -656:1:77 -657:1:78 -658:1:79 -659:1:90 -660:1:95 -661:1:96 -662:0:2969 -663:2:1566 -664:0:2969 -665:2:1567 -666:0:2969 -667:1:108 -668:0:2969 -669:2:1566 -670:0:2969 -671:2:1567 -672:0:2969 -673:1:109 -674:1:113 -675:1:114 -676:1:122 -677:1:123 -678:1:127 -679:1:128 -680:1:136 -681:1:141 -682:1:145 -683:1:146 -684:1:153 -685:1:154 -686:1:165 -687:1:166 -688:1:167 -689:1:178 -690:1:183 -691:1:184 -692:0:2969 -693:1:288 -694:0:2969 -695:2:1566 -696:0:2969 -697:2:1567 -698:0:2969 -699:1:289 -700:0:2969 -701:1:486 -702:0:2969 -703:1:487 -704:0:2969 -705:1:492 -706:0:2969 -707:2:1566 -708:0:2969 -709:2:1567 -710:0:2969 -711:1:497 -712:1:501 -713:1:502 -714:1:510 -715:1:511 -716:1:512 -717:1:524 -718:1:529 -719:1:533 -720:1:534 -721:1:541 -722:1:542 -723:1:553 -724:1:554 -725:1:555 -726:1:566 -727:1:571 -728:1:572 -729:0:2969 -730:2:1566 -731:0:2969 -732:2:1567 -733:0:2969 -734:1:584 -735:0:2969 -736:2:1566 -737:0:2969 -738:2:1567 -739:0:2969 -740:1:585 -741:1:589 -742:1:590 -743:1:598 -744:1:599 -745:1:603 -746:1:604 -747:1:612 -748:1:617 -749:1:621 -750:1:622 -751:1:629 -752:1:630 -753:1:641 -754:1:642 -755:1:643 -756:1:654 -757:1:659 -758:1:660 -759:0:2969 -760:2:1566 -761:0:2969 -762:2:1567 -763:0:2969 -764:1:672 -765:0:2969 -766:2:1566 -767:0:2969 -768:2:1567 -769:0:2969 -770:1:673 -771:1:677 -772:1:678 -773:1:686 -774:1:687 -775:1:691 -776:1:692 -777:1:700 -778:1:705 -779:1:709 -780:1:710 -781:1:717 -782:1:718 -783:1:729 -784:1:730 -785:1:731 -786:1:742 -787:1:747 -788:1:748 -789:0:2969 -790:2:1566 -791:0:2969 -792:2:1567 -793:0:2969 -794:1:760 -795:0:2969 -796:1:761 -797:0:2969 -798:1:762 -799:0:2969 -800:1:955 -801:0:2969 -802:1:956 -803:0:2969 -804:2:1566 -805:0:2969 -806:2:1567 -807:0:2969 -808:1:960 -809:0:2969 -810:2:1566 -811:0:2969 -812:2:1567 -813:0:2969 -814:1:961 -815:1:965 -816:1:966 -817:1:974 -818:1:975 -819:1:979 -820:1:980 -821:1:988 -822:1:993 -823:1:997 -824:1:998 -825:1:1005 -826:1:1006 -827:1:1017 -828:1:1018 -829:1:1019 -830:1:1030 -831:1:1035 -832:1:1036 -833:0:2969 -834:2:1566 -835:0:2969 -836:2:1567 -837:0:2969 -838:1:1048 -839:0:2969 -840:1:762 -841:0:2969 -842:1:955 -843:0:2969 -844:1:956 -845:0:2969 -846:2:1566 -847:0:2969 -848:2:1567 -849:0:2969 -850:1:960 -851:0:2969 -852:2:1566 -853:0:2969 -854:2:1567 -855:0:2969 -856:1:961 -857:1:965 -858:1:966 -859:1:974 -860:1:975 -861:1:976 -862:1:988 -863:1:993 -864:1:997 -865:1:998 -866:1:1005 -867:1:1006 -868:1:1017 -869:1:1018 -870:1:1019 -871:1:1030 -872:1:1035 -873:1:1036 -874:0:2969 -875:2:1566 -876:0:2969 -877:2:1567 -878:0:2969 -879:1:1048 -880:0:2969 -881:1:1052 -882:0:2969 -883:2:1566 -884:0:2969 -885:2:1567 -886:0:2969 -887:1:1057 -888:1:1061 -889:1:1062 -890:1:1070 -891:1:1071 -892:1:1072 -893:1:1084 -894:1:1089 -895:1:1093 -896:1:1094 -897:1:1101 -898:1:1102 -899:1:1113 -900:1:1114 -901:1:1115 -902:1:1126 -903:1:1131 -904:1:1132 -905:0:2969 -906:1:9 -907:0:2969 -908:2:1566 -909:0:2969 -910:2:1567 -911:0:2969 -912:1:10 -913:0:2969 -914:2:1568 -915:0:2969 -916:2:1574 -917:0:2969 -918:2:1575 -919:2:1579 -920:2:1580 -921:2:1588 -922:2:1589 -923:2:1593 -924:2:1594 -925:2:1602 -926:2:1607 -927:2:1611 -928:2:1612 -929:2:1619 -930:2:1620 -931:2:1631 -932:2:1632 -933:2:1633 -934:2:1644 -935:2:1649 -936:2:1650 -937:0:2969 -938:2:1662 -939:0:2969 -940:2:1663 -941:0:2969 -942:1:13 -943:0:2969 -944:2:1664 -945:0:2969 -946:1:19 -947:0:2969 -948:1:20 -949:0:2969 -950:2:1663 -951:0:2969 -952:2:1664 -953:0:2969 -954:1:21 -955:1:25 -956:1:26 -957:1:34 -958:1:35 -959:1:39 -960:1:40 -961:1:48 -962:1:53 -963:1:57 -964:1:58 -965:1:65 -966:1:66 -967:1:77 -968:1:78 -969:1:79 -970:1:90 -971:1:95 -972:1:96 -973:0:2969 -974:2:1663 -975:0:2969 -976:2:1664 -977:0:2969 -978:1:108 -979:0:2969 -980:2:1663 -981:0:2969 -982:2:1664 -983:0:2969 -984:1:109 -985:1:113 -986:1:114 -987:1:122 -988:1:123 -989:1:127 -990:1:128 -991:1:136 -992:1:141 -993:1:145 -994:1:146 -995:1:153 -996:1:154 -997:1:165 -998:1:166 -999:1:167 -1000:1:178 -1001:1:183 -1002:1:184 -1003:0:2969 -1004:1:196 -1005:0:2969 -1006:2:1663 -1007:0:2969 -1008:2:1664 -1009:0:2969 -1010:1:197 -1011:0:2969 -1012:2:1663 -1013:0:2969 -1014:2:1664 -1015:0:2969 -1016:1:198 -1017:1:202 -1018:1:203 -1019:1:211 -1020:1:212 -1021:1:216 -1022:1:217 -1023:1:225 -1024:1:230 -1025:1:234 -1026:1:235 -1027:1:242 -1028:1:243 -1029:1:254 -1030:1:255 -1031:1:256 -1032:1:267 -1033:1:272 -1034:1:273 -1035:0:2969 -1036:2:1663 -1037:0:2969 -1038:2:1664 -1039:0:2969 -1040:1:285 -1041:0:2969 -1042:1:486 -1043:0:2969 -1044:1:487 -1045:0:2969 -1046:1:20 -1047:0:2969 -1048:2:1663 -1049:0:2969 -1050:2:1664 -1051:0:2969 -1052:1:21 -1053:1:25 -1054:1:26 -1055:1:34 -1056:1:35 -1057:1:36 -1058:1:48 -1059:1:53 -1060:1:57 -1061:1:58 -1062:1:65 -1063:1:66 -1064:1:77 -1065:1:78 -1066:1:79 -1067:1:90 -1068:1:95 -1069:1:96 -1070:0:2969 -1071:2:1663 -1072:0:2969 -1073:2:1664 -1074:0:2969 -1075:1:108 -1076:0:2969 -1077:2:1663 -1078:0:2969 -1079:2:1664 -1080:0:2969 -1081:1:109 -1082:1:113 -1083:1:114 -1084:1:122 -1085:1:123 -1086:1:127 -1087:1:128 -1088:1:136 -1089:1:141 -1090:1:145 -1091:1:146 -1092:1:153 -1093:1:154 -1094:1:165 -1095:1:166 -1096:1:167 -1097:1:178 -1098:1:183 -1099:1:184 -1100:0:2969 -1101:1:288 -1102:0:2969 -1103:2:1663 -1104:0:2969 -1105:2:1664 -1106:0:2969 -1107:1:289 -1108:0:2969 -1109:1:486 -1110:0:2969 -1111:1:487 -1112:0:2969 -1113:1:492 -1114:0:2969 -1115:2:1663 -1116:0:2969 -1117:2:1664 -1118:0:2969 -1119:1:497 -1120:1:501 -1121:1:502 -1122:1:510 -1123:1:511 -1124:1:512 -1125:1:524 -1126:1:529 -1127:1:533 -1128:1:534 -1129:1:541 -1130:1:542 -1131:1:553 -1132:1:554 -1133:1:555 -1134:1:566 -1135:1:571 -1136:1:572 -1137:0:2969 -1138:2:1663 -1139:0:2969 -1140:2:1664 -1141:0:2969 -1142:1:584 -1143:0:2969 -1144:2:1663 -1145:0:2969 -1146:2:1664 -1147:0:2969 -1148:1:585 -1149:1:589 -1150:1:590 -1151:1:598 -1152:1:599 -1153:1:603 -1154:1:604 -1155:1:612 -1156:1:617 -1157:1:621 -1158:1:622 -1159:1:629 -1160:1:630 -1161:1:641 -1162:1:642 -1163:1:643 -1164:1:654 -1165:1:659 -1166:1:660 -1167:0:2969 -1168:2:1663 -1169:0:2969 -1170:2:1664 -1171:0:2969 -1172:1:672 -1173:0:2969 -1174:2:1663 -1175:0:2969 -1176:2:1664 -1177:0:2969 -1178:1:673 -1179:1:677 -1180:1:678 -1181:1:686 -1182:1:687 -1183:1:691 -1184:1:692 -1185:1:700 -1186:1:705 -1187:1:709 -1188:1:710 -1189:1:717 -1190:1:718 -1191:1:729 -1192:1:730 -1193:1:731 -1194:1:742 -1195:1:747 -1196:1:748 -1197:0:2969 -1198:2:1663 -1199:0:2969 -1200:2:1664 -1201:0:2969 -1202:1:760 -1203:0:2969 -1204:1:761 -1205:0:2969 -1206:1:762 -1207:0:2969 -1208:1:955 -1209:0:2969 -1210:1:956 -1211:0:2969 -1212:2:1663 -1213:0:2969 -1214:2:1664 -1215:0:2969 -1216:1:960 -1217:0:2969 -1218:2:1663 -1219:0:2969 -1220:2:1664 -1221:0:2969 -1222:1:961 -1223:1:965 -1224:1:966 -1225:1:974 -1226:1:975 -1227:1:979 -1228:1:980 -1229:1:988 -1230:1:993 -1231:1:997 -1232:1:998 -1233:1:1005 -1234:1:1006 -1235:1:1017 -1236:1:1018 -1237:1:1019 -1238:1:1030 -1239:1:1035 -1240:1:1036 -1241:0:2969 -1242:2:1663 -1243:0:2969 -1244:2:1664 -1245:0:2969 -1246:1:1048 -1247:0:2969 -1248:1:762 -1249:0:2969 -1250:1:955 -1251:0:2969 -1252:1:956 -1253:0:2969 -1254:2:1663 -1255:0:2969 -1256:2:1664 -1257:0:2969 -1258:1:960 -1259:0:2969 -1260:2:1663 -1261:0:2969 -1262:2:1664 -1263:0:2969 -1264:1:961 -1265:1:965 -1266:1:966 -1267:1:974 -1268:1:975 -1269:1:976 -1270:1:988 -1271:1:993 -1272:1:997 -1273:1:998 -1274:1:1005 -1275:1:1006 -1276:1:1017 -1277:1:1018 -1278:1:1019 -1279:1:1030 -1280:1:1035 -1281:1:1036 -1282:0:2969 -1283:2:1663 -1284:0:2969 -1285:2:1664 -1286:0:2969 -1287:1:1048 -1288:0:2969 -1289:1:1052 -1290:0:2969 -1291:2:1663 -1292:0:2969 -1293:2:1664 -1294:0:2969 -1295:1:1057 -1296:1:1061 -1297:1:1062 -1298:1:1070 -1299:1:1071 -1300:1:1072 -1301:1:1084 -1302:1:1089 -1303:1:1093 -1304:1:1094 -1305:1:1101 -1306:1:1102 -1307:1:1113 -1308:1:1114 -1309:1:1115 -1310:1:1126 -1311:1:1131 -1312:1:1132 -1313:0:2969 -1314:1:9 -1315:0:2969 -1316:2:1663 -1317:0:2969 -1318:2:1664 -1319:0:2969 -1320:1:10 -1321:0:2969 -1322:2:1665 -1323:0:2969 -1324:2:1671 -1325:0:2969 -1326:2:1674 -1327:2:1675 -1328:2:1687 -1329:2:1688 -1330:2:1692 -1331:2:1693 -1332:2:1701 -1333:2:1706 -1334:2:1710 -1335:2:1711 -1336:2:1718 -1337:2:1719 -1338:2:1730 -1339:2:1731 -1340:2:1732 -1341:2:1743 -1342:2:1748 -1343:2:1749 -1344:0:2969 -1345:2:1761 -1346:0:2969 -1347:2:1762 -1348:0:2969 -1349:1:13 -1350:0:2969 -1351:2:1763 -1352:0:2969 -1353:1:19 -1354:0:2969 -1355:1:20 -1356:0:2969 -1357:2:1762 -1358:0:2969 -1359:2:1763 -1360:0:2969 -1361:1:21 -1362:1:25 -1363:1:26 -1364:1:34 -1365:1:35 -1366:1:39 -1367:1:40 -1368:1:48 -1369:1:53 -1370:1:57 -1371:1:58 -1372:1:65 -1373:1:66 -1374:1:77 -1375:1:78 -1376:1:79 -1377:1:90 -1378:1:95 -1379:1:96 -1380:0:2969 -1381:2:1762 -1382:0:2969 -1383:2:1763 -1384:0:2969 -1385:1:108 -1386:0:2969 -1387:2:1762 -1388:0:2969 -1389:2:1763 -1390:0:2969 -1391:1:109 -1392:1:113 -1393:1:114 -1394:1:122 -1395:1:123 -1396:1:127 -1397:1:128 -1398:1:136 -1399:1:141 -1400:1:145 -1401:1:146 -1402:1:153 -1403:1:154 -1404:1:165 -1405:1:166 -1406:1:167 -1407:1:178 -1408:1:183 -1409:1:184 -1410:0:2969 -1411:1:196 -1412:0:2969 -1413:2:1762 -1414:0:2969 -1415:2:1763 -1416:0:2969 -1417:1:197 -1418:0:2969 -1419:2:1762 -1420:0:2969 -1421:2:1763 -1422:0:2969 -1423:1:198 -1424:1:202 -1425:1:203 -1426:1:211 -1427:1:212 -1428:1:216 -1429:1:217 -1430:1:225 -1431:1:230 -1432:1:234 -1433:1:235 -1434:1:242 -1435:1:243 -1436:1:254 -1437:1:255 -1438:1:256 -1439:1:267 -1440:1:272 -1441:1:273 -1442:0:2969 -1443:2:1762 -1444:0:2969 -1445:2:1763 -1446:0:2969 -1447:1:285 -1448:0:2969 -1449:1:486 -1450:0:2969 -1451:1:487 -1452:0:2969 -1453:1:20 -1454:0:2969 -1455:2:1762 -1456:0:2969 -1457:2:1763 -1458:0:2969 -1459:1:21 -1460:1:25 -1461:1:26 -1462:1:34 -1463:1:35 -1464:1:36 -1465:1:48 -1466:1:53 -1467:1:57 -1468:1:58 -1469:1:65 -1470:1:66 -1471:1:77 -1472:1:78 -1473:1:79 -1474:1:90 -1475:1:95 -1476:1:96 -1477:0:2969 -1478:2:1762 -1479:0:2969 -1480:2:1763 -1481:0:2969 -1482:1:108 -1483:0:2969 -1484:2:1762 -1485:0:2969 -1486:2:1763 -1487:0:2969 -1488:1:109 -1489:1:113 -1490:1:114 -1491:1:122 -1492:1:123 -1493:1:127 -1494:1:128 -1495:1:136 -1496:1:141 -1497:1:145 -1498:1:146 -1499:1:153 -1500:1:154 -1501:1:165 -1502:1:166 -1503:1:167 -1504:1:178 -1505:1:183 -1506:1:184 -1507:0:2969 -1508:1:288 -1509:0:2969 -1510:2:1762 -1511:0:2969 -1512:2:1763 -1513:0:2969 -1514:1:289 -1515:0:2969 -1516:1:486 -1517:0:2969 -1518:1:487 -1519:0:2969 -1520:1:492 -1521:0:2969 -1522:2:1762 -1523:0:2969 -1524:2:1763 -1525:0:2969 -1526:1:497 -1527:1:501 -1528:1:502 -1529:1:510 -1530:1:511 -1531:1:512 -1532:1:524 -1533:1:529 -1534:1:533 -1535:1:534 -1536:1:541 -1537:1:542 -1538:1:553 -1539:1:554 -1540:1:555 -1541:1:566 -1542:1:571 -1543:1:572 -1544:0:2969 -1545:2:1762 -1546:0:2969 -1547:2:1763 -1548:0:2969 -1549:1:584 -1550:0:2969 -1551:2:1762 -1552:0:2969 -1553:2:1763 -1554:0:2969 -1555:1:585 -1556:1:589 -1557:1:590 -1558:1:598 -1559:1:599 -1560:1:603 -1561:1:604 -1562:1:612 -1563:1:617 -1564:1:621 -1565:1:622 -1566:1:629 -1567:1:630 -1568:1:641 -1569:1:642 -1570:1:643 -1571:1:654 -1572:1:659 -1573:1:660 -1574:0:2969 -1575:2:1762 -1576:0:2969 -1577:2:1763 -1578:0:2969 -1579:1:672 -1580:0:2969 -1581:2:1762 -1582:0:2969 -1583:2:1763 -1584:0:2969 -1585:1:673 -1586:1:677 -1587:1:678 -1588:1:686 -1589:1:687 -1590:1:691 -1591:1:692 -1592:1:700 -1593:1:705 -1594:1:709 -1595:1:710 -1596:1:717 -1597:1:718 -1598:1:729 -1599:1:730 -1600:1:731 -1601:1:742 -1602:1:747 -1603:1:748 -1604:0:2969 -1605:2:1762 -1606:0:2969 -1607:2:1763 -1608:0:2969 -1609:1:760 -1610:0:2969 -1611:1:761 -1612:0:2969 -1613:1:762 -1614:0:2969 -1615:1:955 -1616:0:2969 -1617:1:956 -1618:0:2969 -1619:2:1762 -1620:0:2969 -1621:2:1763 -1622:0:2969 -1623:1:960 -1624:0:2969 -1625:2:1762 -1626:0:2969 -1627:2:1763 -1628:0:2969 -1629:1:961 -1630:1:965 -1631:1:966 -1632:1:974 -1633:1:975 -1634:1:979 -1635:1:980 -1636:1:988 -1637:1:993 -1638:1:997 -1639:1:998 -1640:1:1005 -1641:1:1006 -1642:1:1017 -1643:1:1018 -1644:1:1019 -1645:1:1030 -1646:1:1035 -1647:1:1036 -1648:0:2969 -1649:2:1762 -1650:0:2969 -1651:2:1763 -1652:0:2969 -1653:1:1048 -1654:0:2969 -1655:1:762 -1656:0:2969 -1657:1:955 -1658:0:2969 -1659:1:956 -1660:0:2969 -1661:2:1762 -1662:0:2969 -1663:2:1763 -1664:0:2969 -1665:1:960 -1666:0:2969 -1667:2:1762 -1668:0:2969 -1669:2:1763 -1670:0:2969 -1671:1:961 -1672:1:965 -1673:1:966 -1674:1:974 -1675:1:975 -1676:1:976 -1677:1:988 -1678:1:993 -1679:1:997 -1680:1:998 -1681:1:1005 -1682:1:1006 -1683:1:1017 -1684:1:1018 -1685:1:1019 -1686:1:1030 -1687:1:1035 -1688:1:1036 -1689:0:2969 -1690:2:1762 -1691:0:2969 -1692:2:1763 -1693:0:2969 -1694:1:1048 -1695:0:2969 -1696:1:1052 -1697:0:2969 -1698:2:1762 -1699:0:2969 -1700:2:1763 -1701:0:2969 -1702:1:1057 -1703:1:1061 -1704:1:1062 -1705:1:1070 -1706:1:1071 -1707:1:1072 -1708:1:1084 -1709:1:1089 -1710:1:1093 -1711:1:1094 -1712:1:1101 -1713:1:1102 -1714:1:1113 -1715:1:1114 -1716:1:1115 -1717:1:1126 -1718:1:1131 -1719:1:1132 -1720:0:2969 -1721:1:9 -1722:0:2969 -1723:2:1762 -1724:0:2969 -1725:2:1763 -1726:0:2969 -1727:1:10 -1728:0:2969 -1729:2:1764 -1730:0:2969 -1731:2:1770 -1732:0:2969 -1733:2:1771 -1734:0:2969 -1735:2:1772 -1736:0:2969 -1737:2:1773 -1738:0:2969 -1739:2:1774 -1740:2:1778 -1741:2:1779 -1742:2:1787 -1743:2:1788 -1744:2:1792 -1745:2:1793 -1746:2:1801 -1747:2:1806 -1748:2:1810 -1749:2:1811 -1750:2:1818 -1751:2:1819 -1752:2:1830 -1753:2:1831 -1754:2:1832 -1755:2:1843 -1756:2:1848 -1757:2:1849 -1758:0:2969 -1759:2:1861 -1760:0:2969 -1761:2:1862 -1762:0:2969 -1763:1:13 -1764:0:2969 -1765:2:1863 -1766:0:2969 -1767:1:19 -1768:0:2969 -1769:1:20 -1770:0:2969 -1771:2:1862 -1772:0:2969 -1773:2:1863 -1774:0:2969 -1775:1:21 -1776:1:25 -1777:1:26 -1778:1:34 -1779:1:35 -1780:1:39 -1781:1:40 -1782:1:48 -1783:1:53 -1784:1:57 -1785:1:58 -1786:1:65 -1787:1:66 -1788:1:77 -1789:1:78 -1790:1:79 -1791:1:90 -1792:1:95 -1793:1:96 -1794:0:2969 -1795:2:1862 -1796:0:2969 -1797:2:1863 -1798:0:2969 -1799:1:108 -1800:0:2969 -1801:2:1862 -1802:0:2969 -1803:2:1863 -1804:0:2969 -1805:1:109 -1806:1:113 -1807:1:114 -1808:1:122 -1809:1:123 -1810:1:127 -1811:1:128 -1812:1:136 -1813:1:141 -1814:1:145 -1815:1:146 -1816:1:153 -1817:1:154 -1818:1:165 -1819:1:166 -1820:1:167 -1821:1:178 -1822:1:183 -1823:1:184 -1824:0:2969 -1825:1:196 -1826:0:2969 -1827:2:1862 -1828:0:2969 -1829:2:1863 -1830:0:2969 -1831:1:197 -1832:0:2969 -1833:2:1862 -1834:0:2969 -1835:2:1863 -1836:0:2969 -1837:1:198 -1838:1:202 -1839:1:203 -1840:1:211 -1841:1:212 -1842:1:216 -1843:1:217 -1844:1:225 -1845:1:230 -1846:1:234 -1847:1:235 -1848:1:242 -1849:1:243 -1850:1:254 -1851:1:255 -1852:1:256 -1853:1:267 -1854:1:272 -1855:1:273 -1856:0:2969 -1857:2:1862 -1858:0:2969 -1859:2:1863 -1860:0:2969 -1861:1:285 -1862:0:2969 -1863:1:486 -1864:0:2969 -1865:1:487 -1866:0:2969 -1867:1:20 -1868:0:2969 -1869:2:1862 -1870:0:2969 -1871:2:1863 -1872:0:2969 -1873:1:21 -1874:1:25 -1875:1:26 -1876:1:34 -1877:1:35 -1878:1:36 -1879:1:48 -1880:1:53 -1881:1:57 -1882:1:58 -1883:1:65 -1884:1:66 -1885:1:77 -1886:1:78 -1887:1:79 -1888:1:90 -1889:1:95 -1890:1:96 -1891:0:2969 -1892:2:1862 -1893:0:2969 -1894:2:1863 -1895:0:2969 -1896:1:108 -1897:0:2969 -1898:2:1862 -1899:0:2969 -1900:2:1863 -1901:0:2969 -1902:1:109 -1903:1:113 -1904:1:114 -1905:1:122 -1906:1:123 -1907:1:127 -1908:1:128 -1909:1:136 -1910:1:141 -1911:1:145 -1912:1:146 -1913:1:153 -1914:1:154 -1915:1:165 -1916:1:166 -1917:1:167 -1918:1:178 -1919:1:183 -1920:1:184 -1921:0:2969 -1922:1:288 -1923:0:2969 -1924:2:1862 -1925:0:2969 -1926:2:1863 -1927:0:2969 -1928:1:289 -1929:0:2969 -1930:1:486 -1931:0:2969 -1932:1:487 -1933:0:2969 -1934:1:492 -1935:0:2969 -1936:2:1862 -1937:0:2969 -1938:2:1863 -1939:0:2969 -1940:1:497 -1941:1:501 -1942:1:502 -1943:1:510 -1944:1:511 -1945:1:512 -1946:1:524 -1947:1:529 -1948:1:533 -1949:1:534 -1950:1:541 -1951:1:542 -1952:1:553 -1953:1:554 -1954:1:555 -1955:1:566 -1956:1:571 -1957:1:572 -1958:0:2969 -1959:2:1862 -1960:0:2969 -1961:2:1863 -1962:0:2969 -1963:1:584 -1964:0:2969 -1965:2:1862 -1966:0:2969 -1967:2:1863 -1968:0:2969 -1969:1:585 -1970:1:589 -1971:1:590 -1972:1:598 -1973:1:599 -1974:1:603 -1975:1:604 -1976:1:612 -1977:1:617 -1978:1:621 -1979:1:622 -1980:1:629 -1981:1:630 -1982:1:641 -1983:1:642 -1984:1:643 -1985:1:654 -1986:1:659 -1987:1:660 -1988:0:2969 -1989:2:1862 -1990:0:2969 -1991:2:1863 -1992:0:2969 -1993:1:672 -1994:0:2969 -1995:2:1862 -1996:0:2969 -1997:2:1863 -1998:0:2969 -1999:1:673 -2000:1:677 -2001:1:678 -2002:1:686 -2003:1:687 -2004:1:691 -2005:1:692 -2006:1:700 -2007:1:705 -2008:1:709 -2009:1:710 -2010:1:717 -2011:1:718 -2012:1:729 -2013:1:730 -2014:1:731 -2015:1:742 -2016:1:747 -2017:1:748 -2018:0:2969 -2019:2:1862 -2020:0:2969 -2021:2:1863 -2022:0:2969 -2023:1:760 -2024:0:2969 -2025:1:761 -2026:0:2969 -2027:1:762 -2028:0:2969 -2029:1:955 -2030:0:2969 -2031:1:956 -2032:0:2969 -2033:2:1862 -2034:0:2969 -2035:2:1863 -2036:0:2969 -2037:1:960 -2038:0:2969 -2039:2:1862 -2040:0:2969 -2041:2:1863 -2042:0:2969 -2043:1:961 -2044:1:965 -2045:1:966 -2046:1:974 -2047:1:975 -2048:1:979 -2049:1:980 -2050:1:988 -2051:1:993 -2052:1:997 -2053:1:998 -2054:1:1005 -2055:1:1006 -2056:1:1017 -2057:1:1018 -2058:1:1019 -2059:1:1030 -2060:1:1035 -2061:1:1036 -2062:0:2969 -2063:2:1862 -2064:0:2969 -2065:2:1863 -2066:0:2969 -2067:1:1048 -2068:0:2969 -2069:1:762 -2070:0:2969 -2071:1:955 -2072:0:2969 -2073:1:956 -2074:0:2969 -2075:2:1862 -2076:0:2969 -2077:2:1863 -2078:0:2969 -2079:1:960 -2080:0:2969 -2081:2:1862 -2082:0:2969 -2083:2:1863 -2084:0:2969 -2085:1:961 -2086:1:965 -2087:1:966 -2088:1:974 -2089:1:975 -2090:1:976 -2091:1:988 -2092:1:993 -2093:1:997 -2094:1:998 -2095:1:1005 -2096:1:1006 -2097:1:1017 -2098:1:1018 -2099:1:1019 -2100:1:1030 -2101:1:1035 -2102:1:1036 -2103:0:2969 -2104:2:1862 -2105:0:2969 -2106:2:1863 -2107:0:2969 -2108:1:1048 -2109:0:2969 -2110:1:1052 -2111:0:2969 -2112:2:1862 -2113:0:2969 -2114:2:1863 -2115:0:2969 -2116:1:1057 -2117:1:1061 -2118:1:1062 -2119:1:1070 -2120:1:1071 -2121:1:1072 -2122:1:1084 -2123:1:1089 -2124:1:1093 -2125:1:1094 -2126:1:1101 -2127:1:1102 -2128:1:1113 -2129:1:1114 -2130:1:1115 -2131:1:1126 -2132:1:1131 -2133:1:1132 -2134:0:2969 -2135:1:9 -2136:0:2969 -2137:2:1862 -2138:0:2969 -2139:2:1863 -2140:0:2969 -2141:1:10 -2142:0:2969 -2143:2:1864 -2144:0:2969 -2145:2:1967 -2146:0:2969 -2147:2:2072 -2148:0:2969 -2149:2:2073 -2150:0:2969 -2151:2:2077 -2152:0:2969 -2153:2:2083 -2154:2:2087 -2155:2:2088 -2156:2:2096 -2157:2:2097 -2158:2:2101 -2159:2:2102 -2160:2:2110 -2161:2:2115 -2162:2:2119 -2163:2:2120 -2164:2:2127 -2165:2:2128 -2166:2:2139 -2167:2:2140 -2168:2:2141 -2169:2:2152 -2170:2:2157 -2171:2:2158 -2172:0:2969 -2173:2:2170 -2174:0:2969 -2175:2:2171 -2176:0:2969 -2177:1:13 -2178:0:2969 -2179:2:2172 -2180:0:2969 -2181:1:19 -2182:0:2969 -2183:1:20 -2184:0:2969 -2185:2:2171 -2186:0:2969 -2187:2:2172 -2188:0:2969 -2189:1:21 -2190:1:25 -2191:1:26 -2192:1:34 -2193:1:35 -2194:1:39 -2195:1:40 -2196:1:48 -2197:1:53 -2198:1:57 -2199:1:58 -2200:1:65 -2201:1:66 -2202:1:77 -2203:1:78 -2204:1:79 -2205:1:90 -2206:1:95 -2207:1:96 -2208:0:2969 -2209:2:2171 -2210:0:2969 -2211:2:2172 -2212:0:2969 -2213:1:108 -2214:0:2969 -2215:2:2171 -2216:0:2969 -2217:2:2172 -2218:0:2969 -2219:1:109 -2220:1:113 -2221:1:114 -2222:1:122 -2223:1:123 -2224:1:127 -2225:1:128 -2226:1:136 -2227:1:141 -2228:1:145 -2229:1:146 -2230:1:153 -2231:1:154 -2232:1:165 -2233:1:166 -2234:1:167 -2235:1:178 -2236:1:183 -2237:1:184 -2238:0:2969 -2239:1:196 -2240:0:2969 -2241:2:2171 -2242:0:2969 -2243:2:2172 -2244:0:2969 -2245:1:197 -2246:0:2969 -2247:2:2171 -2248:0:2969 -2249:2:2172 -2250:0:2969 -2251:1:198 -2252:1:202 -2253:1:203 -2254:1:211 -2255:1:212 -2256:1:216 -2257:1:217 -2258:1:225 -2259:1:230 -2260:1:234 -2261:1:235 -2262:1:242 -2263:1:243 -2264:1:254 -2265:1:255 -2266:1:256 -2267:1:267 -2268:1:272 -2269:1:273 -2270:0:2969 -2271:2:2171 -2272:0:2969 -2273:2:2172 -2274:0:2969 -2275:1:285 -2276:0:2969 -2277:1:486 -2278:0:2969 -2279:1:487 -2280:0:2969 -2281:1:20 -2282:0:2969 -2283:2:2171 -2284:0:2969 -2285:2:2172 -2286:0:2969 -2287:1:21 -2288:1:25 -2289:1:26 -2290:1:34 -2291:1:35 -2292:1:36 -2293:1:48 -2294:1:53 -2295:1:57 -2296:1:58 -2297:1:65 -2298:1:66 -2299:1:77 -2300:1:78 -2301:1:79 -2302:1:90 -2303:1:95 -2304:1:96 -2305:0:2969 -2306:2:2171 -2307:0:2969 -2308:2:2172 -2309:0:2969 -2310:1:108 -2311:0:2969 -2312:2:2171 -2313:0:2969 -2314:2:2172 -2315:0:2969 -2316:1:109 -2317:1:113 -2318:1:114 -2319:1:122 -2320:1:123 -2321:1:127 -2322:1:128 -2323:1:136 -2324:1:141 -2325:1:145 -2326:1:146 -2327:1:153 -2328:1:154 -2329:1:165 -2330:1:166 -2331:1:167 -2332:1:178 -2333:1:183 -2334:1:184 -2335:0:2969 -2336:1:288 -2337:0:2969 -2338:2:2171 -2339:0:2969 -2340:2:2172 -2341:0:2969 -2342:1:289 -2343:0:2969 -2344:1:486 -2345:0:2969 -2346:1:487 -2347:0:2969 -2348:1:492 -2349:0:2969 -2350:2:2171 -2351:0:2969 -2352:2:2172 -2353:0:2969 -2354:1:497 -2355:1:501 -2356:1:502 -2357:1:510 -2358:1:511 -2359:1:512 -2360:1:524 -2361:1:529 -2362:1:533 -2363:1:534 -2364:1:541 -2365:1:542 -2366:1:553 -2367:1:554 -2368:1:555 -2369:1:566 -2370:1:571 -2371:1:572 -2372:0:2969 -2373:2:2171 -2374:0:2969 -2375:2:2172 -2376:0:2969 -2377:1:584 -2378:0:2969 -2379:2:2171 -2380:0:2969 -2381:2:2172 -2382:0:2969 -2383:1:585 -2384:1:589 -2385:1:590 -2386:1:598 -2387:1:599 -2388:1:603 -2389:1:604 -2390:1:612 -2391:1:617 -2392:1:621 -2393:1:622 -2394:1:629 -2395:1:630 -2396:1:641 -2397:1:642 -2398:1:643 -2399:1:654 -2400:1:659 -2401:1:660 -2402:0:2969 -2403:2:2171 -2404:0:2969 -2405:2:2172 -2406:0:2969 -2407:1:672 -2408:0:2969 -2409:2:2171 -2410:0:2969 -2411:2:2172 -2412:0:2969 -2413:1:673 -2414:1:677 -2415:1:678 -2416:1:686 -2417:1:687 -2418:1:691 -2419:1:692 -2420:1:700 -2421:1:705 -2422:1:709 -2423:1:710 -2424:1:717 -2425:1:718 -2426:1:729 -2427:1:730 -2428:1:731 -2429:1:742 -2430:1:747 -2431:1:748 -2432:0:2969 -2433:2:2171 -2434:0:2969 -2435:2:2172 -2436:0:2969 -2437:1:760 -2438:0:2969 -2439:1:761 -2440:0:2969 -2441:1:762 -2442:0:2969 -2443:1:955 -2444:0:2969 -2445:1:956 -2446:0:2969 -2447:2:2171 -2448:0:2969 -2449:2:2172 -2450:0:2969 -2451:1:960 -2452:0:2969 -2453:2:2171 -2454:0:2969 -2455:2:2172 -2456:0:2969 -2457:1:961 -2458:1:965 -2459:1:966 -2460:1:974 -2461:1:975 -2462:1:979 -2463:1:980 -2464:1:988 -2465:1:993 -2466:1:997 -2467:1:998 -2468:1:1005 -2469:1:1006 -2470:1:1017 -2471:1:1018 -2472:1:1019 -2473:1:1030 -2474:1:1035 -2475:1:1036 -2476:0:2969 -2477:2:2171 -2478:0:2969 -2479:2:2172 -2480:0:2969 -2481:1:1048 -2482:0:2969 -2483:1:762 -2484:0:2969 -2485:1:955 -2486:0:2969 -2487:1:956 -2488:0:2969 -2489:2:2171 -2490:0:2969 -2491:2:2172 -2492:0:2969 -2493:1:960 -2494:0:2969 -2495:2:2171 -2496:0:2969 -2497:2:2172 -2498:0:2969 -2499:1:961 -2500:1:965 -2501:1:966 -2502:1:974 -2503:1:975 -2504:1:976 -2505:1:988 -2506:1:993 -2507:1:997 -2508:1:998 -2509:1:1005 -2510:1:1006 -2511:1:1017 -2512:1:1018 -2513:1:1019 -2514:1:1030 -2515:1:1035 -2516:1:1036 -2517:0:2969 -2518:2:2171 -2519:0:2969 -2520:2:2172 -2521:0:2969 -2522:1:1048 -2523:0:2969 -2524:1:1052 -2525:0:2969 -2526:2:2171 -2527:0:2969 -2528:2:2172 -2529:0:2969 -2530:1:1057 -2531:1:1061 -2532:1:1062 -2533:1:1070 -2534:1:1071 -2535:1:1072 -2536:1:1084 -2537:1:1089 -2538:1:1093 -2539:1:1094 -2540:1:1101 -2541:1:1102 -2542:1:1113 -2543:1:1114 -2544:1:1115 -2545:1:1126 -2546:1:1131 -2547:1:1132 -2548:0:2969 -2549:1:9 -2550:0:2969 -2551:2:2171 -2552:0:2969 -2553:2:2172 -2554:0:2969 -2555:1:10 -2556:0:2969 -2557:2:2173 -2558:0:2969 -2559:2:2179 -2560:0:2969 -2561:2:2180 -2562:2:2184 -2563:2:2185 -2564:2:2193 -2565:2:2194 -2566:2:2198 -2567:2:2199 -2568:2:2207 -2569:2:2212 -2570:2:2216 -2571:2:2217 -2572:2:2224 -2573:2:2225 -2574:2:2236 -2575:2:2237 -2576:2:2238 -2577:2:2249 -2578:2:2254 -2579:2:2255 -2580:0:2969 -2581:2:2267 -2582:0:2969 -2583:2:2268 -2584:0:2969 -2585:1:13 -2586:0:2969 -2587:2:2269 -2588:0:2969 -2589:1:19 -2590:0:2969 -2591:1:20 -2592:0:2969 -2593:2:2268 -2594:0:2969 -2595:2:2269 -2596:0:2969 -2597:1:21 -2598:1:25 -2599:1:26 -2600:1:34 -2601:1:35 -2602:1:39 -2603:1:40 -2604:1:48 -2605:1:53 -2606:1:57 -2607:1:58 -2608:1:65 -2609:1:66 -2610:1:77 -2611:1:78 -2612:1:79 -2613:1:90 -2614:1:95 -2615:1:96 -2616:0:2969 -2617:2:2268 -2618:0:2969 -2619:2:2269 -2620:0:2969 -2621:1:108 -2622:0:2969 -2623:2:2268 -2624:0:2969 -2625:2:2269 -2626:0:2969 -2627:1:109 -2628:1:113 -2629:1:114 -2630:1:122 -2631:1:123 -2632:1:127 -2633:1:128 -2634:1:136 -2635:1:141 -2636:1:145 -2637:1:146 -2638:1:153 -2639:1:154 -2640:1:165 -2641:1:166 -2642:1:167 -2643:1:178 -2644:1:183 -2645:1:184 -2646:0:2969 -2647:1:196 -2648:0:2969 -2649:2:2268 -2650:0:2969 -2651:2:2269 -2652:0:2969 -2653:1:197 -2654:0:2969 -2655:2:2268 -2656:0:2969 -2657:2:2269 -2658:0:2969 -2659:1:198 -2660:1:202 -2661:1:203 -2662:1:211 -2663:1:212 -2664:1:216 -2665:1:217 -2666:1:225 -2667:1:230 -2668:1:234 -2669:1:235 -2670:1:242 -2671:1:243 -2672:1:254 -2673:1:255 -2674:1:256 -2675:1:267 -2676:1:272 -2677:1:273 -2678:0:2969 -2679:2:2268 -2680:0:2969 -2681:2:2269 -2682:0:2969 -2683:1:285 -2684:0:2969 -2685:1:486 -2686:0:2969 -2687:1:487 -2688:0:2969 -2689:1:20 -2690:0:2969 -2691:2:2268 -2692:0:2969 -2693:2:2269 -2694:0:2969 -2695:1:21 -2696:1:25 -2697:1:26 -2698:1:34 -2699:1:35 -2700:1:36 -2701:1:48 -2702:1:53 -2703:1:57 -2704:1:58 -2705:1:65 -2706:1:66 -2707:1:77 -2708:1:78 -2709:1:79 -2710:1:90 -2711:1:95 -2712:1:96 -2713:0:2969 -2714:2:2268 -2715:0:2969 -2716:2:2269 -2717:0:2969 -2718:1:108 -2719:0:2969 -2720:2:2268 -2721:0:2969 -2722:2:2269 -2723:0:2969 -2724:1:109 -2725:1:113 -2726:1:114 -2727:1:122 -2728:1:123 -2729:1:127 -2730:1:128 -2731:1:136 -2732:1:141 -2733:1:145 -2734:1:146 -2735:1:153 -2736:1:154 -2737:1:165 -2738:1:166 -2739:1:167 -2740:1:178 -2741:1:183 -2742:1:184 -2743:0:2969 -2744:1:288 -2745:0:2969 -2746:2:2268 -2747:0:2969 -2748:2:2269 -2749:0:2969 -2750:1:289 -2751:0:2969 -2752:1:486 -2753:0:2969 -2754:1:487 -2755:0:2969 -2756:1:492 -2757:0:2969 -2758:2:2268 -2759:0:2969 -2760:2:2269 -2761:0:2969 -2762:1:497 -2763:1:501 -2764:1:502 -2765:1:510 -2766:1:511 -2767:1:512 -2768:1:524 -2769:1:529 -2770:1:533 -2771:1:534 -2772:1:541 -2773:1:542 -2774:1:553 -2775:1:554 -2776:1:555 -2777:1:566 -2778:1:571 -2779:1:572 -2780:0:2969 -2781:2:2268 -2782:0:2969 -2783:2:2269 -2784:0:2969 -2785:1:584 -2786:0:2969 -2787:2:2268 -2788:0:2969 -2789:2:2269 -2790:0:2969 -2791:1:585 -2792:1:589 -2793:1:590 -2794:1:598 -2795:1:599 -2796:1:603 -2797:1:604 -2798:1:612 -2799:1:617 -2800:1:621 -2801:1:622 -2802:1:629 -2803:1:630 -2804:1:641 -2805:1:642 -2806:1:643 -2807:1:654 -2808:1:659 -2809:1:660 -2810:0:2969 -2811:2:2268 -2812:0:2969 -2813:2:2269 -2814:0:2969 -2815:1:672 -2816:0:2969 -2817:2:2268 -2818:0:2969 -2819:2:2269 -2820:0:2969 -2821:1:673 -2822:1:677 -2823:1:678 -2824:1:686 -2825:1:687 -2826:1:691 -2827:1:692 -2828:1:700 -2829:1:705 -2830:1:709 -2831:1:710 -2832:1:717 -2833:1:718 -2834:1:729 -2835:1:730 -2836:1:731 -2837:1:742 -2838:1:747 -2839:1:748 -2840:0:2969 -2841:2:2268 -2842:0:2969 -2843:2:2269 -2844:0:2969 -2845:1:760 -2846:0:2969 -2847:1:761 -2848:0:2969 -2849:1:762 -2850:0:2969 -2851:1:955 -2852:0:2969 -2853:1:956 -2854:0:2969 -2855:2:2268 -2856:0:2969 -2857:2:2269 -2858:0:2969 -2859:1:960 -2860:0:2969 -2861:2:2268 -2862:0:2969 -2863:2:2269 -2864:0:2969 -2865:1:961 -2866:1:965 -2867:1:966 -2868:1:974 -2869:1:975 -2870:1:979 -2871:1:980 -2872:1:988 -2873:1:993 -2874:1:997 -2875:1:998 -2876:1:1005 -2877:1:1006 -2878:1:1017 -2879:1:1018 -2880:1:1019 -2881:1:1030 -2882:1:1035 -2883:1:1036 -2884:0:2969 -2885:2:2268 -2886:0:2969 -2887:2:2269 -2888:0:2969 -2889:1:1048 -2890:0:2969 -2891:1:762 -2892:0:2969 -2893:1:955 -2894:0:2969 -2895:1:956 -2896:0:2969 -2897:2:2268 -2898:0:2969 -2899:2:2269 -2900:0:2969 -2901:1:960 -2902:0:2969 -2903:2:2268 -2904:0:2969 -2905:2:2269 -2906:0:2969 -2907:1:961 -2908:1:965 -2909:1:966 -2910:1:974 -2911:1:975 -2912:1:976 -2913:1:988 -2914:1:993 -2915:1:997 -2916:1:998 -2917:1:1005 -2918:1:1006 -2919:1:1017 -2920:1:1018 -2921:1:1019 -2922:1:1030 -2923:1:1035 -2924:1:1036 -2925:0:2969 -2926:2:2268 -2927:0:2969 -2928:2:2269 -2929:0:2969 -2930:1:1048 -2931:0:2969 -2932:1:1052 -2933:0:2969 -2934:2:2268 -2935:0:2969 -2936:2:2269 -2937:0:2969 -2938:1:1057 -2939:1:1061 -2940:1:1062 -2941:1:1070 -2942:1:1079 -2943:1:1080 -2944:1:1084 -2945:1:1089 -2946:1:1093 -2947:1:1094 -2948:1:1101 -2949:1:1102 -2950:1:1113 -2951:1:1114 -2952:1:1117 -2953:1:1118 -2954:1:1126 -2955:1:1131 -2956:1:1132 -2957:0:2969 -2958:1:9 -2959:0:2969 -2960:2:2268 -2961:0:2969 -2962:2:2269 -2963:0:2969 -2964:1:10 -2965:0:2969 -2966:2:2270 -2967:0:2969 -2968:2:2276 -2969:0:2969 -2970:2:2279 -2971:2:2280 -2972:2:2292 -2973:2:2293 -2974:2:2297 -2975:2:2298 -2976:2:2306 -2977:2:2311 -2978:2:2315 -2979:2:2316 -2980:2:2323 -2981:2:2324 -2982:2:2335 -2983:2:2336 -2984:2:2337 -2985:2:2348 -2986:2:2353 -2987:2:2354 -2988:0:2969 -2989:2:2366 -2990:0:2969 -2991:2:2367 -2992:0:2969 -2993:1:13 -2994:0:2969 -2995:2:2368 -2996:0:2969 -2997:1:19 -2998:0:2969 -2999:1:20 -3000:0:2969 -3001:2:2367 -3002:0:2969 -3003:2:2368 -3004:0:2969 -3005:1:21 -3006:1:25 -3007:1:26 -3008:1:34 -3009:1:35 -3010:1:36 -3011:1:48 -3012:1:53 -3013:1:57 -3014:1:58 -3015:1:65 -3016:1:66 -3017:1:77 -3018:1:78 -3019:1:79 -3020:1:90 -3021:1:95 -3022:1:96 -3023:0:2969 -3024:2:2367 -3025:0:2969 -3026:2:2368 -3027:0:2969 -3028:1:108 -3029:0:2969 -3030:2:2367 -3031:0:2969 -3032:2:2368 -3033:0:2969 -3034:1:109 -3035:1:113 -3036:1:114 -3037:1:122 -3038:1:123 -3039:1:127 -3040:1:128 -3041:1:136 -3042:1:141 -3043:1:145 -3044:1:146 -3045:1:153 -3046:1:154 -3047:1:165 -3048:1:166 -3049:1:167 -3050:1:178 -3051:1:183 -3052:1:184 -3053:0:2969 -3054:1:196 -3055:0:2969 -3056:2:2367 -3057:0:2969 -3058:2:2368 -3059:0:2969 -3060:1:197 -3061:0:2969 -3062:2:2367 -3063:0:2969 -3064:2:2368 -3065:0:2969 -3066:1:198 -3067:1:202 -3068:1:203 -3069:1:211 -3070:1:212 -3071:1:216 -3072:1:217 -3073:1:225 -3074:1:230 -3075:1:234 -3076:1:235 -3077:1:242 -3078:1:243 -3079:1:254 -3080:1:255 -3081:1:256 -3082:1:267 -3083:1:272 -3084:1:273 -3085:0:2969 -3086:2:2367 -3087:0:2969 -3088:2:2368 -3089:0:2969 -3090:1:285 -3091:0:2969 -3092:1:486 -3093:0:2969 -3094:1:487 -3095:0:2969 -3096:1:20 -3097:0:2969 -3098:2:2367 -3099:0:2969 -3100:2:2368 -3101:0:2969 -3102:1:21 -3103:1:25 -3104:1:26 -3105:1:34 -3106:1:35 -3107:1:36 -3108:1:48 -3109:1:53 -3110:1:57 -3111:1:58 -3112:1:65 -3113:1:66 -3114:1:77 -3115:1:78 -3116:1:79 -3117:1:90 -3118:1:95 -3119:1:96 -3120:0:2969 -3121:2:2367 -3122:0:2969 -3123:2:2368 -3124:0:2969 -3125:1:108 -3126:0:2969 -3127:2:2367 -3128:0:2969 -3129:2:2368 -3130:0:2969 -3131:1:109 -3132:1:113 -3133:1:114 -3134:1:122 -3135:1:123 -3136:1:127 -3137:1:128 -3138:1:136 -3139:1:141 -3140:1:145 -3141:1:146 -3142:1:153 -3143:1:154 -3144:1:165 -3145:1:166 -3146:1:167 -3147:1:178 -3148:1:183 -3149:1:184 -3150:0:2969 -3151:1:288 -3152:0:2969 -3153:2:2367 -3154:0:2969 -3155:2:2368 -3156:0:2969 -3157:1:289 -3158:0:2969 -3159:1:486 -3160:0:2969 -3161:1:487 -3162:0:2969 -3163:1:492 -3164:0:2969 -3165:2:2367 -3166:0:2969 -3167:2:2368 -3168:0:2969 -3169:1:497 -3170:1:501 -3171:1:502 -3172:1:510 -3173:1:511 -3174:1:512 -3175:1:524 -3176:1:529 -3177:1:533 -3178:1:534 -3179:1:541 -3180:1:542 -3181:1:553 -3182:1:554 -3183:1:555 -3184:1:566 -3185:1:571 -3186:1:572 -3187:0:2969 -3188:2:2367 -3189:0:2969 -3190:2:2368 -3191:0:2969 -3192:1:584 -3193:0:2969 -3194:2:2367 -3195:0:2969 -3196:2:2368 -3197:0:2969 -3198:1:585 -3199:1:589 -3200:1:590 -3201:1:598 -3202:1:599 -3203:1:603 -3204:1:604 -3205:1:612 -3206:1:617 -3207:1:621 -3208:1:622 -3209:1:629 -3210:1:630 -3211:1:641 -3212:1:642 -3213:1:643 -3214:1:654 -3215:1:659 -3216:1:660 -3217:0:2969 -3218:2:2367 -3219:0:2969 -3220:2:2368 -3221:0:2969 -3222:1:672 -3223:0:2969 -3224:2:2367 -3225:0:2969 -3226:2:2368 -3227:0:2969 -3228:1:673 -3229:1:677 -3230:1:678 -3231:1:686 -3232:1:687 -3233:1:691 -3234:1:692 -3235:1:700 -3236:1:705 -3237:1:709 -3238:1:710 -3239:1:717 -3240:1:718 -3241:1:729 -3242:1:730 -3243:1:731 -3244:1:742 -3245:1:747 -3246:1:748 -3247:0:2969 -3248:2:2367 -3249:0:2969 -3250:2:2368 -3251:0:2969 -3252:1:760 -3253:0:2969 -3254:1:761 -3255:0:2969 -3256:1:762 -3257:0:2969 -3258:1:955 -3259:0:2969 -3260:1:956 -3261:0:2969 -3262:2:2367 -3263:0:2969 -3264:2:2368 -3265:0:2969 -3266:1:960 -3267:0:2969 -3268:2:2367 -3269:0:2969 -3270:2:2368 -3271:0:2969 -3272:1:961 -3273:1:965 -3274:1:966 -3275:1:974 -3276:1:975 -3277:1:979 -3278:1:980 -3279:1:988 -3280:1:993 -3281:1:997 -3282:1:998 -3283:1:1005 -3284:1:1006 -3285:1:1017 -3286:1:1018 -3287:1:1019 -3288:1:1030 -3289:1:1035 -3290:1:1036 -3291:0:2969 -3292:2:2367 -3293:0:2969 -3294:2:2368 -3295:0:2969 -3296:1:1048 -3297:0:2969 -3298:1:762 -3299:0:2969 -3300:1:955 -3301:0:2969 -3302:1:956 -3303:0:2969 -3304:2:2367 -3305:0:2969 -3306:2:2368 -3307:0:2969 -3308:1:960 -3309:0:2969 -3310:2:2367 -3311:0:2969 -3312:2:2368 -3313:0:2969 -3314:1:961 -3315:1:965 -3316:1:966 -3317:1:974 -3318:1:975 -3319:1:976 -3320:1:988 -3321:1:993 -3322:1:997 -3323:1:998 -3324:1:1005 -3325:1:1006 -3326:1:1017 -3327:1:1018 -3328:1:1019 -3329:1:1030 -3330:1:1035 -3331:1:1036 -3332:0:2969 -3333:2:2367 -3334:0:2969 -3335:2:2368 -3336:0:2969 -3337:1:1048 -3338:0:2969 -3339:1:1052 -3340:0:2969 -3341:2:2367 -3342:0:2969 -3343:2:2368 -3344:0:2969 -3345:1:1057 -3346:1:1061 -3347:1:1062 -3348:1:1070 -3349:1:1071 -3350:1:1072 -3351:1:1084 -3352:1:1089 -3353:1:1093 -3354:1:1094 -3355:1:1101 -3356:1:1102 -3357:1:1113 -3358:1:1114 -3359:1:1115 -3360:1:1126 -3361:1:1131 -3362:1:1132 -3363:0:2969 -3364:1:9 -3365:0:2969 -3366:2:2367 -3367:0:2969 -3368:2:2368 -3369:0:2969 -3370:1:10 -3371:0:2969 -3372:2:2369 -3373:0:2969 -3374:2:2375 -3375:0:2969 -3376:2:2376 -3377:0:2969 -3378:2:2377 -3379:0:2969 -3380:2:2378 -3381:0:2969 -3382:2:2379 -3383:2:2383 -3384:2:2384 -3385:2:2392 -3386:2:2393 -3387:2:2397 -3388:2:2398 -3389:2:2406 -3390:2:2411 -3391:2:2415 -3392:2:2416 -3393:2:2423 -3394:2:2424 -3395:2:2435 -3396:2:2443 -3397:2:2444 -3398:2:2448 -3399:2:2453 -3400:2:2454 -3401:0:2969 -3402:2:2466 -3403:0:2969 -3404:2:2467 -3405:0:2969 -3406:1:13 --1:-1:-1 -3407:0:2969 -3408:2:2468 -3409:0:2969 -3410:1:19 -3411:0:2969 -3412:1:20 -3413:0:2969 -3414:2:2467 -3415:0:2969 -3416:2:2468 -3417:0:2969 -3418:1:21 -3419:1:25 -3420:1:26 -3421:1:34 -3422:1:35 -3423:1:39 -3424:1:40 -3425:1:48 -3426:1:53 -3427:1:57 -3428:1:58 -3429:1:65 -3430:1:66 -3431:1:77 -3432:1:78 -3433:1:79 -3434:1:90 -3435:1:95 -3436:1:96 -3437:0:2969 -3438:2:2467 -3439:0:2969 -3440:2:2468 -3441:0:2969 -3442:1:108 -3443:0:2969 -3444:2:2467 -3445:0:2969 -3446:2:2468 -3447:0:2969 -3448:1:109 -3449:1:113 -3450:1:114 -3451:1:122 -3452:1:123 -3453:1:127 -3454:1:128 -3455:1:136 -3456:1:141 -3457:1:145 -3458:1:146 -3459:1:153 -3460:1:154 -3461:1:165 -3462:1:166 -3463:1:167 -3464:1:178 -3465:1:183 -3466:1:184 -3467:0:2969 -3468:1:196 -3469:0:2969 -3470:2:2467 -3471:0:2969 -3472:2:2468 -3473:0:2969 -3474:1:197 -3475:0:2969 -3476:2:2467 -3477:0:2969 -3478:2:2468 -3479:0:2969 -3480:1:198 -3481:1:202 -3482:1:203 -3483:1:211 -3484:1:212 -3485:1:216 -3486:1:217 -3487:1:225 -3488:1:230 -3489:1:234 -3490:1:235 -3491:1:242 -3492:1:243 -3493:1:254 -3494:1:255 -3495:1:256 -3496:1:267 -3497:1:272 -3498:1:273 -3499:0:2969 -3500:2:2467 -3501:0:2969 -3502:2:2468 -3503:0:2969 -3504:1:285 -3505:0:2969 -3506:1:486 -3507:0:2969 -3508:1:487 -3509:0:2969 -3510:1:20 -3511:0:2969 -3512:2:2467 -3513:0:2969 -3514:2:2468 -3515:0:2969 -3516:1:21 -3517:1:25 -3518:1:26 -3519:1:34 -3520:1:35 -3521:1:36 -3522:1:48 -3523:1:53 -3524:1:57 -3525:1:58 -3526:1:65 -3527:1:66 -3528:1:77 -3529:1:78 -3530:1:79 -3531:1:90 -3532:1:95 -3533:1:96 -3534:0:2969 -3535:2:2467 -3536:0:2969 -3537:2:2468 -3538:0:2969 -3539:1:108 -3540:0:2969 -3541:2:2467 -3542:0:2969 -3543:2:2468 -3544:0:2969 -3545:1:109 -3546:1:113 -3547:1:114 -3548:1:122 -3549:1:123 -3550:1:127 -3551:1:128 -3552:1:136 -3553:1:141 -3554:1:145 -3555:1:146 -3556:1:153 -3557:1:154 -3558:1:165 -3559:1:166 -3560:1:167 -3561:1:178 -3562:1:183 -3563:1:184 -3564:0:2969 -3565:1:288 -3566:0:2969 -3567:2:2467 -3568:0:2969 -3569:2:2468 -3570:0:2969 -3571:1:289 -3572:0:2969 -3573:1:486 -3574:0:2969 -3575:1:487 -3576:0:2969 -3577:1:492 -3578:0:2969 -3579:2:2467 -3580:0:2969 -3581:2:2468 -3582:0:2969 -3583:1:497 -3584:1:501 -3585:1:502 -3586:1:510 -3587:1:511 -3588:1:512 -3589:1:524 -3590:1:529 -3591:1:533 -3592:1:534 -3593:1:541 -3594:1:542 -3595:1:553 -3596:1:554 -3597:1:555 -3598:1:566 -3599:1:571 -3600:1:572 -3601:0:2969 -3602:2:2467 -3603:0:2969 -3604:2:2468 -3605:0:2969 -3606:1:584 -3607:0:2969 -3608:2:2467 -3609:0:2969 -3610:2:2468 -3611:0:2969 -3612:1:585 -3613:1:589 -3614:1:590 -3615:1:598 -3616:1:599 -3617:1:603 -3618:1:604 -3619:1:612 -3620:1:617 -3621:1:621 -3622:1:622 -3623:1:629 -3624:1:630 -3625:1:641 -3626:1:642 -3627:1:643 -3628:1:654 -3629:1:659 -3630:1:660 -3631:0:2969 -3632:2:2467 -3633:0:2969 -3634:2:2468 -3635:0:2969 -3636:1:672 -3637:0:2969 -3638:2:2467 -3639:0:2969 -3640:2:2468 -3641:0:2969 -3642:1:673 -3643:1:677 -3644:1:678 -3645:1:686 -3646:1:687 -3647:1:691 -3648:1:692 -3649:1:700 -3650:1:705 -3651:1:709 -3652:1:710 -3653:1:717 -3654:1:718 -3655:1:729 -3656:1:730 -3657:1:731 -3658:1:742 -3659:1:747 -3660:1:748 -3661:0:2969 -3662:2:2467 -3663:0:2969 -3664:2:2468 -3665:0:2969 -3666:1:760 -3667:0:2969 -3668:1:761 -3669:0:2969 -3670:1:762 -3671:0:2969 -3672:1:955 -3673:0:2969 -3674:1:956 -3675:0:2969 -3676:2:2467 -3677:0:2969 -3678:2:2468 -3679:0:2969 -3680:1:960 -3681:0:2969 -3682:2:2467 -3683:0:2969 -3684:2:2468 -3685:0:2969 -3686:1:961 -3687:1:965 -3688:1:966 -3689:1:974 -3690:1:975 -3691:1:979 -3692:1:980 -3693:1:988 -3694:1:993 -3695:1:997 -3696:1:998 -3697:1:1005 -3698:1:1006 -3699:1:1017 -3700:1:1018 -3701:1:1019 -3702:1:1030 -3703:1:1035 -3704:1:1036 -3705:0:2969 -3706:2:2467 -3707:0:2969 -3708:2:2468 -3709:0:2969 -3710:1:1048 -3711:0:2969 -3712:1:762 -3713:0:2969 -3714:1:955 -3715:0:2969 -3716:1:956 -3717:0:2969 -3718:2:2467 -3719:0:2969 -3720:2:2468 -3721:0:2969 -3722:1:960 -3723:0:2969 -3724:2:2467 -3725:0:2969 -3726:2:2468 -3727:0:2969 -3728:1:961 -3729:1:965 -3730:1:966 -3731:1:974 -3732:1:975 -3733:1:976 -3734:1:988 -3735:1:993 -3736:1:997 -3737:1:998 -3738:1:1005 -3739:1:1006 -3740:1:1017 -3741:1:1018 -3742:1:1019 -3743:1:1030 -3744:1:1035 -3745:1:1036 -3746:0:2969 -3747:2:2467 -3748:0:2969 -3749:2:2468 -3750:0:2969 -3751:1:1048 -3752:0:2969 -3753:1:1052 -3754:0:2969 -3755:2:2467 -3756:0:2969 -3757:2:2468 -3758:0:2969 -3759:1:1057 -3760:1:1061 -3761:1:1062 -3762:1:1070 -3763:1:1071 -3764:1:1072 -3765:1:1084 -3766:1:1089 -3767:1:1093 -3768:1:1094 -3769:1:1101 -3770:1:1102 -3771:1:1113 -3772:1:1114 -3773:1:1115 -3774:1:1126 -3775:1:1131 -3776:1:1132 -3777:0:2969 -3778:1:9 -3779:0:2969 -3780:2:2467 -3781:0:2969 -3782:2:2468 -3783:0:2969 -3784:1:10 -3785:0:2969 -3786:2:2469 -3787:0:2969 -3788:2:2475 -3789:0:2969 -3790:2:2476 -3791:2:2480 -3792:2:2481 -3793:2:2489 -3794:2:2490 -3795:2:2494 -3796:2:2495 -3797:2:2503 -3798:2:2508 -3799:2:2512 -3800:2:2513 -3801:2:2520 -3802:2:2521 -3803:2:2532 -3804:2:2540 -3805:2:2541 -3806:2:2545 -3807:2:2550 -3808:2:2551 -3809:0:2969 -3810:2:2563 -3811:0:2969 -3812:2:2564 -3813:0:2969 -3814:1:13 -3815:0:2969 -3816:2:2565 -3817:0:2969 -3818:1:19 -3819:0:2969 -3820:1:20 -3821:0:2969 -3822:2:2564 -3823:0:2969 -3824:2:2565 -3825:0:2969 -3826:1:21 -3827:1:25 -3828:1:26 -3829:1:34 -3830:1:35 -3831:1:39 -3832:1:40 -3833:1:48 -3834:1:53 -3835:1:57 -3836:1:58 -3837:1:65 -3838:1:66 -3839:1:77 -3840:1:78 -3841:1:79 -3842:1:90 -3843:1:95 -3844:1:96 -3845:0:2969 -3846:2:2564 -3847:0:2969 -3848:2:2565 -3849:0:2969 -3850:1:108 -3851:0:2969 -3852:2:2564 -3853:0:2969 -3854:2:2565 -3855:0:2969 -3856:1:109 -3857:1:113 -3858:1:114 -3859:1:122 -3860:1:123 -3861:1:127 -3862:1:128 -3863:1:136 -3864:1:141 -3865:1:145 -3866:1:146 -3867:1:153 -3868:1:154 -3869:1:165 -3870:1:166 -3871:1:167 -3872:1:178 -3873:1:183 -3874:1:184 -3875:0:2969 -3876:1:196 -3877:0:2969 -3878:2:2564 -3879:0:2969 -3880:2:2565 -3881:0:2969 -3882:1:197 -3883:0:2969 -3884:2:2564 -3885:0:2969 -3886:2:2565 -3887:0:2969 -3888:1:198 -3889:1:202 -3890:1:203 -3891:1:211 -3892:1:212 -3893:1:216 -3894:1:217 -3895:1:225 -3896:1:230 -3897:1:234 -3898:1:235 -3899:1:242 -3900:1:243 -3901:1:254 -3902:1:255 -3903:1:256 -3904:1:267 -3905:1:272 -3906:1:273 -3907:0:2969 -3908:2:2564 -3909:0:2969 -3910:2:2565 -3911:0:2969 -3912:1:285 -3913:0:2969 -3914:1:486 -3915:0:2969 -3916:1:487 -3917:0:2969 -3918:1:20 -3919:0:2969 -3920:2:2564 -3921:0:2969 -3922:2:2565 -3923:0:2969 -3924:1:21 -3925:1:25 -3926:1:26 -3927:1:34 -3928:1:35 -3929:1:36 -3930:1:48 -3931:1:53 -3932:1:57 -3933:1:58 -3934:1:65 -3935:1:66 -3936:1:77 -3937:1:78 -3938:1:79 -3939:1:90 -3940:1:95 -3941:1:96 -3942:0:2969 -3943:2:2564 -3944:0:2969 -3945:2:2565 -3946:0:2969 -3947:1:108 -3948:0:2969 -3949:2:2564 -3950:0:2969 -3951:2:2565 -3952:0:2969 -3953:1:109 -3954:1:113 -3955:1:114 -3956:1:122 -3957:1:123 -3958:1:127 -3959:1:128 -3960:1:136 -3961:1:141 -3962:1:145 -3963:1:146 -3964:1:153 -3965:1:154 -3966:1:165 -3967:1:166 -3968:1:167 -3969:1:178 -3970:1:183 -3971:1:184 -3972:0:2969 -3973:1:288 -3974:0:2969 -3975:2:2564 -3976:0:2969 -3977:2:2565 -3978:0:2969 -3979:1:289 -3980:0:2969 -3981:1:486 -3982:0:2969 -3983:1:487 -3984:0:2969 -3985:1:492 -3986:0:2969 -3987:2:2564 -3988:0:2969 -3989:2:2565 -3990:0:2969 -3991:1:497 -3992:1:501 -3993:1:502 -3994:1:510 -3995:1:511 -3996:1:512 -3997:1:524 -3998:1:529 -3999:1:533 -4000:1:534 -4001:1:541 -4002:1:542 -4003:1:553 -4004:1:554 -4005:1:555 -4006:1:566 -4007:1:571 -4008:1:572 -4009:0:2969 -4010:2:2564 -4011:0:2969 -4012:2:2565 -4013:0:2969 -4014:1:584 -4015:0:2969 -4016:2:2564 -4017:0:2969 -4018:2:2565 -4019:0:2969 -4020:1:585 -4021:1:589 -4022:1:590 -4023:1:598 -4024:1:599 -4025:1:603 -4026:1:604 -4027:1:612 -4028:1:617 -4029:1:621 -4030:1:622 -4031:1:629 -4032:1:630 -4033:1:641 -4034:1:642 -4035:1:643 -4036:1:654 -4037:1:659 -4038:1:660 -4039:0:2969 -4040:2:2564 -4041:0:2969 -4042:2:2565 -4043:0:2969 -4044:1:672 -4045:0:2969 -4046:2:2564 -4047:0:2969 -4048:2:2565 -4049:0:2969 -4050:1:673 -4051:1:677 -4052:1:678 -4053:1:686 -4054:1:687 -4055:1:691 -4056:1:692 -4057:1:700 -4058:1:705 -4059:1:709 -4060:1:710 -4061:1:717 -4062:1:718 -4063:1:729 -4064:1:730 -4065:1:731 -4066:1:742 -4067:1:747 -4068:1:748 -4069:0:2969 -4070:2:2564 -4071:0:2969 -4072:2:2565 -4073:0:2969 -4074:1:760 -4075:0:2969 -4076:1:761 -4077:0:2969 -4078:1:762 -4079:0:2969 -4080:1:955 -4081:0:2969 -4082:1:956 -4083:0:2969 -4084:2:2564 -4085:0:2969 -4086:2:2565 -4087:0:2969 -4088:1:960 -4089:0:2969 -4090:2:2564 -4091:0:2969 -4092:2:2565 -4093:0:2969 -4094:1:961 -4095:1:965 -4096:1:966 -4097:1:974 -4098:1:975 -4099:1:979 -4100:1:980 -4101:1:988 -4102:1:993 -4103:1:997 -4104:1:998 -4105:1:1005 -4106:1:1006 -4107:1:1017 -4108:1:1018 -4109:1:1019 -4110:1:1030 -4111:1:1035 -4112:1:1036 -4113:0:2969 -4114:2:2564 -4115:0:2969 -4116:2:2565 -4117:0:2969 -4118:1:1048 -4119:0:2969 -4120:1:762 -4121:0:2969 -4122:1:955 -4123:0:2969 -4124:1:956 -4125:0:2969 -4126:2:2564 -4127:0:2969 -4128:2:2565 -4129:0:2969 -4130:1:960 -4131:0:2969 -4132:2:2564 -4133:0:2969 -4134:2:2565 -4135:0:2969 -4136:1:961 -4137:1:965 -4138:1:966 -4139:1:974 -4140:1:975 -4141:1:976 -4142:1:988 -4143:1:993 -4144:1:997 -4145:1:998 -4146:1:1005 -4147:1:1006 -4148:1:1017 -4149:1:1018 -4150:1:1019 -4151:1:1030 -4152:1:1035 -4153:1:1036 -4154:0:2969 -4155:2:2564 -4156:0:2969 -4157:2:2565 -4158:0:2969 -4159:1:1048 -4160:0:2969 -4161:1:1052 -4162:0:2969 -4163:2:2564 -4164:0:2969 -4165:2:2565 -4166:0:2969 -4167:1:1057 -4168:1:1061 -4169:1:1062 -4170:1:1070 -4171:1:1071 -4172:1:1072 -4173:1:1084 -4174:1:1089 -4175:1:1093 -4176:1:1094 -4177:1:1101 -4178:1:1102 -4179:1:1113 -4180:1:1114 -4181:1:1115 -4182:1:1126 -4183:1:1131 -4184:1:1132 -4185:0:2969 -4186:1:9 -4187:0:2969 -4188:2:2564 -4189:0:2969 -4190:2:2565 -4191:0:2969 -4192:1:10 -4193:0:2969 -4194:2:2566 -4195:0:2969 -4196:1:11 -4197:0:2969 -4198:2:2377 -4199:0:2969 -4200:1:12 -4201:0:2969 -4202:2:2378 -4203:0:2969 -4204:2:2379 -4205:2:2383 -4206:2:2384 -4207:2:2392 -4208:2:2393 -4209:2:2397 -4210:2:2398 -4211:2:2406 -4212:2:2411 -4213:2:2415 -4214:2:2416 -4215:2:2423 -4216:2:2424 -4217:2:2435 -4218:2:2443 -4219:2:2444 -4220:2:2448 -4221:2:2453 -4222:2:2454 -4223:0:2969 -4224:2:2466 -4225:0:2969 -4226:2:2467 -4227:0:2969 -4228:1:13 diff --git a/formal-model/urcu/result-standard-execution-nest/DEFINES b/formal-model/urcu/result-standard-execution-nest/DEFINES deleted file mode 100644 index 150a83c..0000000 --- a/formal-model/urcu/result-standard-execution-nest/DEFINES +++ /dev/null @@ -1,17 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -//#define READER_NEST_LEVEL 1 -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS diff --git a/formal-model/urcu/result-standard-execution-nest/Makefile b/formal-model/urcu/result-standard-execution-nest/Makefile deleted file mode 100644 index 8af320d..0000000 --- a/formal-model/urcu/result-standard-execution-nest/Makefile +++ /dev/null @@ -1,172 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - #nested useless with signal test. - #make urcu_free_nested | tee urcu_free_nested.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu/result-standard-execution-nest/asserts.log b/formal-model/urcu/result-standard-execution-nest/asserts.log deleted file mode 100644 index 51f1ac0..0000000 --- a/formal-model/urcu/result-standard-execution-nest/asserts.log +++ /dev/null @@ -1,250 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -cat DEFINES > .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w20 -Depth= 3212 States= 1e+06 Transitions= 1.17e+07 Memory= 519.572 t= 7.66 R= 1e+05 -Depth= 3212 States= 2e+06 Transitions= 2.38e+07 Memory= 572.990 t= 16 R= 1e+05 -Depth= 3212 States= 3e+06 Transitions= 3.62e+07 Memory= 626.408 t= 24.9 R= 1e+05 -pan: resizing hashtable to -w22.. done - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim - (none specified) - assertion violations + - cycle checks - (disabled by -DSAFETY) - invalid end states + - -State-vector 48 byte, depth reached 3212, errors: 0 - 3539988 states, stored - 39085459 states, matched - 42625447 transitions (= stored+matched) -1.5602888e+08 atomic steps -hash conflicts: 28971442 (resolved) - -Stats on memory usage (in Megabytes): - 256.576 equivalent memory usage for states (stored*(State-vector + overhead)) - 196.718 actual memory usage for states (compression: 76.67%) - state-vector as stored = 30 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 686.338 total actual memory usage - -unreached in proctype urcu_reader - line 398, ".input.spin", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 61, "(1)" - line 417, ".input.spin", state 91, "(1)" - line 398, ".input.spin", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 151, "(1)" - line 417, ".input.spin", state 181, "(1)" - line 398, ".input.spin", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 242, "(1)" - line 417, ".input.spin", state 272, "(1)" - line 398, ".input.spin", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 360, "(1)" - line 417, ".input.spin", state 390, "(1)" - line 539, ".input.spin", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 398, ".input.spin", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 402, ".input.spin", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 59, "(1)" - line 412, ".input.spin", state 72, "(1)" - line 417, ".input.spin", state 89, "(1)" - line 398, ".input.spin", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 402, ".input.spin", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 153, "(1)" - line 412, ".input.spin", state 166, "(1)" - line 651, ".input.spin", state 199, "(1)" - line 174, ".input.spin", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 178, ".input.spin", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 159, ".input.spin", state 240, "(1)" - line 163, ".input.spin", state 248, "(1)" - line 167, ".input.spin", state 260, "(1)" - line 174, ".input.spin", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 407, ".input.spin", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 927, "(1)" - line 408, ".input.spin", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 408, ".input.spin", state 928, "else" - line 408, ".input.spin", state 931, "(1)" - line 408, ".input.spin", state 932, "(1)" - line 408, ".input.spin", state 932, "(1)" - line 412, ".input.spin", state 940, "(1)" - line 412, ".input.spin", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 412, ".input.spin", state 941, "else" - line 412, ".input.spin", state 944, "(1)" - line 412, ".input.spin", state 945, "(1)" - line 412, ".input.spin", state 945, "(1)" - line 410, ".input.spin", state 950, "((i<1))" - line 410, ".input.spin", state 950, "((i>=1))" - line 417, ".input.spin", state 957, "(1)" - line 417, ".input.spin", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 417, ".input.spin", state 958, "else" - line 417, ".input.spin", state 961, "(1)" - line 417, ".input.spin", state 962, "(1)" - line 417, ".input.spin", state 962, "(1)" - line 419, ".input.spin", state 965, "(1)" - line 419, ".input.spin", state 965, "(1)" - line 402, ".input.spin", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, ".input.spin", state 1040, "(1)" - line 417, ".input.spin", state 1057, "(1)" - line 402, ".input.spin", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, ".input.spin", state 1130, "(1)" - line 417, ".input.spin", state 1147, "(1)" - line 398, ".input.spin", state 1166, "(1)" - line 402, ".input.spin", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, ".input.spin", state 1222, "(1)" - line 417, ".input.spin", state 1239, "(1)" - line 402, ".input.spin", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, ".input.spin", state 1315, "(1)" - line 417, ".input.spin", state 1332, "(1)" - line 178, ".input.spin", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 182, ".input.spin", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 159, ".input.spin", state 1378, "(1)" - line 163, ".input.spin", state 1386, "(1)" - line 167, ".input.spin", state 1398, "(1)" - line 174, ".input.spin", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 407, ".input.spin", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 1595, "(1)" - line 408, ".input.spin", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 408, ".input.spin", state 1596, "else" - line 408, ".input.spin", state 1599, "(1)" - line 408, ".input.spin", state 1600, "(1)" - line 408, ".input.spin", state 1600, "(1)" - line 412, ".input.spin", state 1608, "(1)" - line 412, ".input.spin", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 412, ".input.spin", state 1609, "else" - line 412, ".input.spin", state 1612, "(1)" - line 412, ".input.spin", state 1613, "(1)" - line 412, ".input.spin", state 1613, "(1)" - line 410, ".input.spin", state 1618, "((i<1))" - line 410, ".input.spin", state 1618, "((i>=1))" - line 417, ".input.spin", state 1625, "(1)" - line 417, ".input.spin", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 417, ".input.spin", state 1626, "else" - line 417, ".input.spin", state 1629, "(1)" - line 417, ".input.spin", state 1630, "(1)" - line 417, ".input.spin", state 1630, "(1)" - line 419, ".input.spin", state 1633, "(1)" - line 419, ".input.spin", state 1633, "(1)" - line 178, ".input.spin", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 182, ".input.spin", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 159, ".input.spin", state 1681, "(1)" - line 163, ".input.spin", state 1689, "(1)" - line 167, ".input.spin", state 1701, "(1)" - line 174, ".input.spin", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nest/asserts.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/asserts.spin.input.trail deleted file mode 100644 index 287e52a..0000000 --- a/formal-model/urcu/result-standard-execution-nest/asserts.spin.input.trail +++ /dev/null @@ -1,6 +0,0 @@ --4:-4:-4 -1:0:2673 -2:0:2674 -3:0:2675 -4:0:2676 -5:4:1129 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu.sh b/formal-model/urcu/result-standard-execution-nest/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu.spin b/formal-model/urcu/result-standard-execution-nest/urcu.spin deleted file mode 100644 index 2cfcb70..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu.spin +++ /dev/null @@ -1,705 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free.log b/formal-model/urcu/result-standard-execution-nest/urcu_free.log deleted file mode 100644 index 884b15e..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free.log +++ /dev/null @@ -1,262 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 743) -Depth= 3880 States= 1e+06 Transitions= 1.18e+07 Memory= 527.190 t= 9.53 R= 1e+05 -Depth= 3880 States= 2e+06 Transitions= 2.39e+07 Memory= 588.225 t= 19.8 R= 1e+05 -Depth= 3880 States= 3e+06 Transitions= 3.61e+07 Memory= 649.260 t= 30.5 R= 1e+05 -pan: resizing hashtable to -w22.. done -Depth= 3880 States= 4e+06 Transitions= 4.84e+07 Memory= 741.318 t= 41.1 R= 1e+05 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 3880, errors: 0 - 4015564 states, stored - 44539121 states, matched - 48554685 transitions (= stored+matched) -1.7777933e+08 atomic steps -hash conflicts: 33629695 (resolved) - -Stats on memory usage (in Megabytes): - 321.681 equivalent memory usage for states (stored*(State-vector + overhead)) - 252.629 actual memory usage for states (compression: 78.53%) - state-vector as stored = 38 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 742.295 total actual memory usage - -unreached in proctype urcu_reader - line 398, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 61, "(1)" - line 417, "pan.___", state 91, "(1)" - line 398, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 151, "(1)" - line 417, "pan.___", state 181, "(1)" - line 398, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 242, "(1)" - line 417, "pan.___", state 272, "(1)" - line 398, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 360, "(1)" - line 417, "pan.___", state 390, "(1)" - line 539, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 402, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 59, "(1)" - line 412, "pan.___", state 72, "(1)" - line 417, "pan.___", state 89, "(1)" - line 398, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 402, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 153, "(1)" - line 412, "pan.___", state 166, "(1)" - line 651, "pan.___", state 199, "(1)" - line 174, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 178, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 240, "(1)" - line 163, "pan.___", state 248, "(1)" - line 167, "pan.___", state 260, "(1)" - line 174, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 407, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 927, "(1)" - line 408, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 408, "pan.___", state 928, "else" - line 408, "pan.___", state 931, "(1)" - line 408, "pan.___", state 932, "(1)" - line 408, "pan.___", state 932, "(1)" - line 412, "pan.___", state 940, "(1)" - line 412, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 412, "pan.___", state 941, "else" - line 412, "pan.___", state 944, "(1)" - line 412, "pan.___", state 945, "(1)" - line 412, "pan.___", state 945, "(1)" - line 410, "pan.___", state 950, "((i<1))" - line 410, "pan.___", state 950, "((i>=1))" - line 417, "pan.___", state 957, "(1)" - line 417, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 417, "pan.___", state 958, "else" - line 417, "pan.___", state 961, "(1)" - line 417, "pan.___", state 962, "(1)" - line 417, "pan.___", state 962, "(1)" - line 419, "pan.___", state 965, "(1)" - line 419, "pan.___", state 965, "(1)" - line 402, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 1040, "(1)" - line 417, "pan.___", state 1057, "(1)" - line 402, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 1130, "(1)" - line 417, "pan.___", state 1147, "(1)" - line 398, "pan.___", state 1166, "(1)" - line 402, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 1222, "(1)" - line 417, "pan.___", state 1239, "(1)" - line 402, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 1315, "(1)" - line 417, "pan.___", state 1332, "(1)" - line 178, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 182, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 1378, "(1)" - line 163, "pan.___", state 1386, "(1)" - line 167, "pan.___", state 1398, "(1)" - line 174, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 407, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1595, "(1)" - line 408, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 408, "pan.___", state 1596, "else" - line 408, "pan.___", state 1599, "(1)" - line 408, "pan.___", state 1600, "(1)" - line 408, "pan.___", state 1600, "(1)" - line 412, "pan.___", state 1608, "(1)" - line 412, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 412, "pan.___", state 1609, "else" - line 412, "pan.___", state 1612, "(1)" - line 412, "pan.___", state 1613, "(1)" - line 412, "pan.___", state 1613, "(1)" - line 410, "pan.___", state 1618, "((i<1))" - line 410, "pan.___", state 1618, "((i>=1))" - line 417, "pan.___", state 1625, "(1)" - line 417, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 417, "pan.___", state 1626, "else" - line 417, "pan.___", state 1629, "(1)" - line 417, "pan.___", state 1630, "(1)" - line 417, "pan.___", state 1630, "(1)" - line 419, "pan.___", state 1633, "(1)" - line 419, "pan.___", state 1633, "(1)" - line 178, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 182, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 1681, "(1)" - line 163, "pan.___", state 1689, "(1)" - line 167, "pan.___", state 1701, "(1)" - line 174, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< !read_free_race) diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free.spin.input b/formal-model/urcu/result-standard-execution-nest/urcu_free.spin.input deleted file mode 100644 index f2f00e4..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free.spin.input +++ /dev/null @@ -1,722 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -//#define READER_NEST_LEVEL 1 -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/urcu_free.spin.input.trail deleted file mode 100644 index 837f3d9..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free.spin.input.trail +++ /dev/null @@ -1,15043 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4365 -2:4:4317 -3:4:4320 -4:4:4320 -5:4:4320 -6:4:4323 -7:4:4331 -8:4:4331 -9:4:4331 -10:4:4334 -11:4:4340 -12:4:4344 -13:4:4344 -14:4:4344 -15:4:4347 -16:4:4340 -17:4:4344 -18:4:4344 -19:4:4344 -20:4:4347 -21:4:4355 -22:4:4359 -23:4:4360 -24:0:4365 -25:4:4362 -26:0:4365 -27:3:2331 -28:0:4365 -29:3:2337 -30:0:4365 -31:3:2338 -32:0:4365 -33:3:2339 -34:3:2343 -35:3:2344 -36:3:2352 -37:3:2353 -38:3:2357 -39:3:2358 -40:3:2352 -41:3:2353 -42:3:2357 -43:3:2358 -44:3:2366 -45:3:2371 -46:3:2375 -47:3:2376 -48:3:2383 -49:3:2384 -50:3:2395 -51:3:2396 -52:3:2397 -53:3:2395 -54:3:2396 -55:3:2397 -56:3:2408 -57:3:2413 -58:3:2414 -59:0:4365 -60:3:2426 -61:0:4365 -62:3:2427 -63:0:4365 -64:2:1162 -65:0:4365 -66:3:2428 -67:0:4365 -68:2:1168 -69:0:4365 -70:2:1169 -71:0:4365 -72:3:2427 -73:0:4365 -74:2:1170 -75:0:4365 -76:3:2428 -77:0:4365 -78:3:2429 -79:0:4365 -80:3:2435 -81:3:2436 -82:0:4365 -83:3:2440 -84:3:2444 -85:3:2445 -86:3:2453 -87:3:2454 -88:3:2458 -89:3:2459 -90:3:2453 -91:3:2454 -92:3:2458 -93:3:2459 -94:3:2467 -95:3:2472 -96:3:2473 -97:3:2484 -98:3:2485 -99:3:2496 -100:3:2497 -101:3:2498 -102:3:2496 -103:3:2497 -104:3:2498 -105:3:2509 -106:3:2514 -107:3:2515 -108:0:4365 -109:3:2527 -110:0:4365 -111:3:2528 -112:0:4365 -113:2:1173 -114:0:4365 -115:3:2529 -116:0:4365 -117:2:1179 -118:0:4365 -119:2:1180 -120:0:4365 -121:3:2528 -122:0:4365 -123:2:1181 -124:2:1185 -125:2:1186 -126:2:1194 -127:2:1195 -128:2:1199 -129:2:1200 -130:2:1194 -131:2:1195 -132:2:1199 -133:2:1200 -134:2:1208 -135:2:1213 -136:2:1217 -137:2:1218 -138:2:1225 -139:2:1226 -140:2:1237 -141:2:1238 -142:2:1239 -143:2:1237 -144:2:1238 -145:2:1239 -146:2:1250 -147:2:1255 -148:2:1256 -149:0:4365 -150:3:2529 -151:0:4365 -152:2:1268 -153:0:4365 -154:3:2528 -155:0:4365 -156:2:1270 -157:0:4365 -158:3:2529 -159:0:4365 -160:2:1271 -161:2:1275 -162:2:1276 -163:2:1284 -164:2:1285 -165:2:1289 -166:2:1290 -167:2:1284 -168:2:1285 -169:2:1289 -170:2:1290 -171:2:1298 -172:2:1303 -173:2:1307 -174:2:1308 -175:2:1315 -176:2:1316 -177:2:1327 -178:2:1328 -179:2:1329 -180:2:1327 -181:2:1328 -182:2:1329 -183:2:1340 -184:2:1345 -185:2:1346 -186:0:4365 -187:2:1358 -188:0:4365 -189:2:1360 -190:0:4365 -191:3:2528 -192:0:4365 -193:2:1361 -194:0:4365 -195:3:2529 -196:0:4365 -197:2:1362 -198:2:1366 -199:2:1367 -200:2:1375 -201:2:1376 -202:2:1380 -203:2:1381 -204:2:1375 -205:2:1376 -206:2:1380 -207:2:1381 -208:2:1389 -209:2:1394 -210:2:1398 -211:2:1399 -212:2:1406 -213:2:1407 -214:2:1418 -215:2:1419 -216:2:1420 -217:2:1418 -218:2:1419 -219:2:1420 -220:2:1431 -221:2:1436 -222:2:1437 -223:0:4365 -224:2:1449 -225:0:4365 -226:3:2528 -227:0:4365 -228:2:1451 -229:0:4365 -230:3:2529 -231:0:4365 -232:2:1652 -233:0:4365 -234:2:1653 -235:0:4365 -236:2:1657 -237:0:4365 -238:2:1180 -239:0:4365 -240:3:2528 -241:0:4365 -242:2:1181 -243:2:1185 -244:2:1186 -245:2:1194 -246:2:1195 -247:2:1199 -248:2:1200 -249:2:1194 -250:2:1195 -251:2:1196 -252:2:1208 -253:2:1213 -254:2:1217 -255:2:1218 -256:2:1225 -257:2:1226 -258:2:1237 -259:2:1238 -260:2:1239 -261:2:1237 -262:2:1238 -263:2:1239 -264:2:1250 -265:2:1255 -266:2:1256 -267:0:4365 -268:3:2529 -269:0:4365 -270:2:1268 -271:0:4365 -272:3:2528 -273:0:4365 -274:2:1270 -275:0:4365 -276:3:2529 -277:0:4365 -278:2:1271 -279:2:1275 -280:2:1276 -281:2:1284 -282:2:1285 -283:2:1289 -284:2:1290 -285:2:1284 -286:2:1285 -287:2:1289 -288:2:1290 -289:2:1298 -290:2:1303 -291:2:1307 -292:2:1308 -293:2:1315 -294:2:1316 -295:2:1327 -296:2:1328 -297:2:1329 -298:2:1327 -299:2:1328 -300:2:1329 -301:2:1340 -302:2:1345 -303:2:1346 -304:0:4365 -305:2:1358 -306:0:4365 -307:2:1454 -308:0:4365 -309:3:2528 -310:0:4365 -311:2:1455 -312:0:4365 -313:3:2529 -314:0:4365 -315:2:1652 -316:0:4365 -317:2:1653 -318:0:4365 -319:2:1657 -320:0:4365 -321:2:1660 -322:0:4365 -323:3:2528 -324:0:4365 -325:2:1665 -326:2:1669 -327:2:1670 -328:2:1678 -329:2:1679 -330:2:1683 -331:2:1684 -332:2:1678 -333:2:1679 -334:2:1680 -335:2:1692 -336:2:1697 -337:2:1701 -338:2:1702 -339:2:1709 -340:2:1710 -341:2:1721 -342:2:1722 -343:2:1723 -344:2:1721 -345:2:1722 -346:2:1723 -347:2:1734 -348:2:1739 -349:2:1740 -350:0:4365 -351:3:2529 -352:0:4365 -353:2:1752 -354:0:4365 -355:3:2528 -356:0:4365 -357:2:1754 -358:0:4365 -359:3:2529 -360:0:4365 -361:2:1755 -362:2:1759 -363:2:1760 -364:2:1768 -365:2:1769 -366:2:1773 -367:2:1774 -368:2:1768 -369:2:1769 -370:2:1773 -371:2:1774 -372:2:1782 -373:2:1787 -374:2:1791 -375:2:1792 -376:2:1799 -377:2:1800 -378:2:1811 -379:2:1812 -380:2:1813 -381:2:1811 -382:2:1812 -383:2:1813 -384:2:1824 -385:2:1829 -386:2:1830 -387:0:4365 -388:2:1842 -389:0:4365 -390:3:2528 -391:0:4365 -392:2:1844 -393:0:4365 -394:3:2529 -395:0:4365 -396:2:1845 -397:2:1849 -398:2:1850 -399:2:1858 -400:2:1859 -401:2:1863 -402:2:1864 -403:2:1858 -404:2:1859 -405:2:1863 -406:2:1864 -407:2:1872 -408:2:1877 -409:2:1881 -410:2:1882 -411:2:1889 -412:2:1890 -413:2:1901 -414:2:1902 -415:2:1903 -416:2:1901 -417:2:1902 -418:2:1903 -419:2:1914 -420:2:1919 -421:2:1920 -422:0:4365 -423:2:1932 -424:0:4365 -425:3:2528 -426:0:4365 -427:2:1934 -428:0:4365 -429:3:2529 -430:0:4365 -431:2:1935 -432:0:4365 -433:2:1936 -434:0:4365 -435:2:2129 -436:0:4365 -437:2:2130 -438:0:4365 -439:2:2134 -440:0:4365 -441:3:2528 -442:0:4365 -443:2:2136 -444:0:4365 -445:3:2529 -446:0:4365 -447:2:2137 -448:2:2141 -449:2:2142 -450:2:2150 -451:2:2151 -452:2:2155 -453:2:2156 -454:2:2150 -455:2:2151 -456:2:2155 -457:2:2156 -458:2:2164 -459:2:2169 -460:2:2173 -461:2:2174 -462:2:2181 -463:2:2182 -464:2:2193 -465:2:2194 -466:2:2195 -467:2:2193 -468:2:2194 -469:2:2195 -470:2:2206 -471:2:2211 -472:2:2212 -473:0:4365 -474:2:2224 -475:0:4365 -476:3:2528 -477:0:4365 -478:2:2226 -479:0:4365 -480:3:2529 -481:0:4365 -482:2:1936 -483:0:4365 -484:2:2129 -485:0:4365 -486:2:2130 -487:0:4365 -488:2:2134 -489:0:4365 -490:3:2528 -491:0:4365 -492:2:2136 -493:0:4365 -494:3:2529 -495:0:4365 -496:2:2137 -497:2:2141 -498:2:2142 -499:2:2150 -500:2:2151 -501:2:2155 -502:2:2156 -503:2:2150 -504:2:2151 -505:2:2152 -506:2:2164 -507:2:2169 -508:2:2173 -509:2:2174 -510:2:2181 -511:2:2182 -512:2:2193 -513:2:2194 -514:2:2195 -515:2:2193 -516:2:2194 -517:2:2195 -518:2:2206 -519:2:2211 -520:2:2212 -521:0:4365 -522:2:2224 -523:0:4365 -524:3:2528 -525:0:4365 -526:2:2226 -527:0:4365 -528:3:2529 -529:0:4365 -530:2:2230 -531:0:4365 -532:3:2528 -533:0:4365 -534:2:2235 -535:2:2239 -536:2:2240 -537:2:2248 -538:2:2249 -539:2:2253 -540:2:2254 -541:2:2248 -542:2:2249 -543:2:2250 -544:2:2262 -545:2:2267 -546:2:2271 -547:2:2272 -548:2:2279 -549:2:2280 -550:2:2291 -551:2:2292 -552:2:2293 -553:2:2291 -554:2:2292 -555:2:2293 -556:2:2304 -557:2:2309 -558:2:2310 -559:0:4365 -560:3:2529 -561:0:4365 -562:2:2322 -563:0:4365 -564:2:1169 -565:0:4365 -566:3:2528 -567:0:4365 -568:2:1170 -569:0:4365 -570:3:2529 -571:0:4365 -572:3:2530 -573:0:4365 -574:3:2536 -575:0:4365 -576:3:2537 -577:0:4365 -578:3:2547 -579:0:4365 -580:3:2548 -581:0:4365 -582:3:2552 -583:3:2553 -584:3:2557 -585:3:2561 -586:3:2562 -587:3:2557 -588:3:2561 -589:3:2562 -590:3:2566 -591:3:2574 -592:3:2575 -593:3:2580 -594:3:2587 -595:3:2588 -596:3:2587 -597:3:2588 -598:3:2595 -599:3:2600 -600:0:4365 -601:3:2611 -602:0:4365 -603:3:2615 -604:3:2616 -605:3:2620 -606:3:2624 -607:3:2625 -608:3:2620 -609:3:2624 -610:3:2625 -611:3:2629 -612:3:2637 -613:3:2638 -614:3:2643 -615:3:2650 -616:3:2651 -617:3:2650 -618:3:2651 -619:3:2658 -620:3:2663 -621:0:4365 -622:3:2611 -623:0:4365 -624:3:2615 -625:3:2616 -626:3:2620 -627:3:2624 -628:3:2625 -629:3:2620 -630:3:2624 -631:3:2625 -632:3:2629 -633:3:2637 -634:3:2638 -635:3:2643 -636:3:2650 -637:3:2651 -638:3:2650 -639:3:2651 -640:3:2658 -641:3:2663 -642:0:4365 -643:3:2674 -644:0:4365 -645:3:2682 -646:3:2683 -647:3:2687 -648:3:2691 -649:3:2692 -650:3:2687 -651:3:2691 -652:3:2692 -653:3:2696 -654:3:2704 -655:3:2705 -656:3:2710 -657:3:2717 -658:3:2718 -659:3:2717 -660:3:2718 -661:3:2725 -662:3:2730 -663:0:4365 -664:3:2745 -665:0:4365 -666:3:2746 -667:0:4365 -668:2:1173 -669:0:4365 -670:3:2747 -671:0:4365 -672:2:1179 -673:0:4365 -674:2:1180 -675:0:4365 -676:3:2746 -677:0:4365 -678:2:1181 -679:2:1185 -680:2:1186 -681:2:1194 -682:2:1195 -683:2:1199 -684:2:1200 -685:2:1194 -686:2:1195 -687:2:1199 -688:2:1200 -689:2:1208 -690:2:1213 -691:2:1217 -692:2:1218 -693:2:1225 -694:2:1226 -695:2:1237 -696:2:1238 -697:2:1239 -698:2:1237 -699:2:1238 -700:2:1239 -701:2:1250 -702:2:1255 -703:2:1256 -704:0:4365 -705:3:2747 -706:0:4365 -707:2:1268 -708:0:4365 -709:3:2746 -710:0:4365 -711:2:1270 -712:0:4365 -713:3:2747 -714:0:4365 -715:2:1271 -716:2:1275 -717:2:1276 -718:2:1284 -719:2:1285 -720:2:1289 -721:2:1290 -722:2:1284 -723:2:1285 -724:2:1289 -725:2:1290 -726:2:1298 -727:2:1303 -728:2:1307 -729:2:1308 -730:2:1315 -731:2:1316 -732:2:1327 -733:2:1328 -734:2:1329 -735:2:1327 -736:2:1328 -737:2:1329 -738:2:1340 -739:2:1345 -740:2:1346 -741:0:4365 -742:2:1358 -743:0:4365 -744:2:1360 -745:0:4365 -746:3:2746 -747:0:4365 -748:2:1361 -749:0:4365 -750:3:2747 -751:0:4365 -752:2:1362 -753:2:1366 -754:2:1367 -755:2:1375 -756:2:1376 -757:2:1380 -758:2:1381 -759:2:1375 -760:2:1376 -761:2:1380 -762:2:1381 -763:2:1389 -764:2:1394 -765:2:1398 -766:2:1399 -767:2:1406 -768:2:1407 -769:2:1418 -770:2:1419 -771:2:1420 -772:2:1418 -773:2:1419 -774:2:1420 -775:2:1431 -776:2:1436 -777:2:1437 -778:0:4365 -779:2:1449 -780:0:4365 -781:3:2746 -782:0:4365 -783:2:1451 -784:0:4365 -785:3:2747 -786:0:4365 -787:2:1652 -788:0:4365 -789:2:1653 -790:0:4365 -791:2:1657 -792:0:4365 -793:2:1180 -794:0:4365 -795:3:2746 -796:0:4365 -797:2:1181 -798:2:1185 -799:2:1186 -800:2:1194 -801:2:1195 -802:2:1199 -803:2:1200 -804:2:1194 -805:2:1195 -806:2:1196 -807:2:1208 -808:2:1213 -809:2:1217 -810:2:1218 -811:2:1225 -812:2:1226 -813:2:1237 -814:2:1238 -815:2:1239 -816:2:1237 -817:2:1238 -818:2:1239 -819:2:1250 -820:2:1255 -821:2:1256 -822:0:4365 -823:3:2747 -824:0:4365 -825:2:1268 -826:0:4365 -827:3:2746 -828:0:4365 -829:2:1270 -830:0:4365 -831:3:2747 -832:0:4365 -833:2:1271 -834:2:1275 -835:2:1276 -836:2:1284 -837:2:1285 -838:2:1289 -839:2:1290 -840:2:1284 -841:2:1285 -842:2:1289 -843:2:1290 -844:2:1298 -845:2:1303 -846:2:1307 -847:2:1308 -848:2:1315 -849:2:1316 -850:2:1327 -851:2:1328 -852:2:1329 -853:2:1327 -854:2:1328 -855:2:1329 -856:2:1340 -857:2:1345 -858:2:1346 -859:0:4365 -860:2:1358 -861:0:4365 -862:2:1454 -863:0:4365 -864:3:2746 -865:0:4365 -866:2:1455 -867:0:4365 -868:3:2747 -869:0:4365 -870:2:1652 -871:0:4365 -872:2:1653 -873:0:4365 -874:2:1657 -875:0:4365 -876:2:1660 -877:0:4365 -878:3:2746 -879:0:4365 -880:2:1665 -881:2:1669 -882:2:1670 -883:2:1678 -884:2:1679 -885:2:1683 -886:2:1684 -887:2:1678 -888:2:1679 -889:2:1680 -890:2:1692 -891:2:1697 -892:2:1701 -893:2:1702 -894:2:1709 -895:2:1710 -896:2:1721 -897:2:1722 -898:2:1723 -899:2:1721 -900:2:1722 -901:2:1723 -902:2:1734 -903:2:1739 -904:2:1740 -905:0:4365 -906:3:2747 -907:0:4365 -908:2:1752 -909:0:4365 -910:3:2746 -911:0:4365 -912:2:1754 -913:0:4365 -914:3:2747 -915:0:4365 -916:2:1755 -917:2:1759 -918:2:1760 -919:2:1768 -920:2:1769 -921:2:1773 -922:2:1774 -923:2:1768 -924:2:1769 -925:2:1773 -926:2:1774 -927:2:1782 -928:2:1787 -929:2:1791 -930:2:1792 -931:2:1799 -932:2:1800 -933:2:1811 -934:2:1812 -935:2:1813 -936:2:1811 -937:2:1812 -938:2:1813 -939:2:1824 -940:2:1829 -941:2:1830 -942:0:4365 -943:2:1842 -944:0:4365 -945:3:2746 -946:0:4365 -947:2:1844 -948:0:4365 -949:3:2747 -950:0:4365 -951:2:1845 -952:2:1849 -953:2:1850 -954:2:1858 -955:2:1859 -956:2:1863 -957:2:1864 -958:2:1858 -959:2:1859 -960:2:1863 -961:2:1864 -962:2:1872 -963:2:1877 -964:2:1881 -965:2:1882 -966:2:1889 -967:2:1890 -968:2:1901 -969:2:1902 -970:2:1903 -971:2:1901 -972:2:1902 -973:2:1903 -974:2:1914 -975:2:1919 -976:2:1920 -977:0:4365 -978:2:1932 -979:0:4365 -980:3:2746 -981:0:4365 -982:2:1934 -983:0:4365 -984:3:2747 -985:0:4365 -986:2:1935 -987:0:4365 -988:2:1936 -989:0:4365 -990:2:2129 -991:0:4365 -992:2:2130 -993:0:4365 -994:2:2134 -995:0:4365 -996:3:2746 -997:0:4365 -998:2:2136 -999:0:4365 -1000:3:2747 -1001:0:4365 -1002:2:2137 -1003:2:2141 -1004:2:2142 -1005:2:2150 -1006:2:2151 -1007:2:2155 -1008:2:2156 -1009:2:2150 -1010:2:2151 -1011:2:2155 -1012:2:2156 -1013:2:2164 -1014:2:2169 -1015:2:2173 -1016:2:2174 -1017:2:2181 -1018:2:2182 -1019:2:2193 -1020:2:2194 -1021:2:2195 -1022:2:2193 -1023:2:2194 -1024:2:2195 -1025:2:2206 -1026:2:2211 -1027:2:2212 -1028:0:4365 -1029:2:2224 -1030:0:4365 -1031:3:2746 -1032:0:4365 -1033:2:2226 -1034:0:4365 -1035:3:2747 -1036:0:4365 -1037:2:1936 -1038:0:4365 -1039:2:2129 -1040:0:4365 -1041:2:2130 -1042:0:4365 -1043:2:2134 -1044:0:4365 -1045:3:2746 -1046:0:4365 -1047:2:2136 -1048:0:4365 -1049:3:2747 -1050:0:4365 -1051:2:2137 -1052:2:2141 -1053:2:2142 -1054:2:2150 -1055:2:2151 -1056:2:2155 -1057:2:2156 -1058:2:2150 -1059:2:2151 -1060:2:2152 -1061:2:2164 -1062:2:2169 -1063:2:2173 -1064:2:2174 -1065:2:2181 -1066:2:2182 -1067:2:2193 -1068:2:2194 -1069:2:2195 -1070:2:2193 -1071:2:2194 -1072:2:2195 -1073:2:2206 -1074:2:2211 -1075:2:2212 -1076:0:4365 -1077:2:2224 -1078:0:4365 -1079:3:2746 -1080:0:4365 -1081:2:2226 -1082:0:4365 -1083:3:2747 -1084:0:4365 -1085:2:2230 -1086:0:4365 -1087:3:2746 -1088:0:4365 -1089:2:2235 -1090:2:2239 -1091:2:2240 -1092:2:2248 -1093:2:2249 -1094:2:2253 -1095:2:2254 -1096:2:2248 -1097:2:2249 -1098:2:2250 -1099:2:2262 -1100:2:2267 -1101:2:2271 -1102:2:2272 -1103:2:2279 -1104:2:2280 -1105:2:2291 -1106:2:2292 -1107:2:2293 -1108:2:2291 -1109:2:2292 -1110:2:2293 -1111:2:2304 -1112:2:2309 -1113:2:2310 -1114:0:4365 -1115:3:2747 -1116:0:4365 -1117:2:2322 -1118:0:4365 -1119:2:1169 -1120:0:4365 -1121:3:2746 -1122:0:4365 -1123:2:1170 -1124:0:4365 -1125:3:2747 -1126:0:4365 -1127:3:2748 -1128:0:4365 -1129:3:2754 -1130:0:4365 -1131:3:2755 -1132:3:2759 -1133:3:2760 -1134:3:2768 -1135:3:2769 -1136:3:2773 -1137:3:2774 -1138:3:2768 -1139:3:2769 -1140:3:2773 -1141:3:2774 -1142:3:2782 -1143:3:2787 -1144:3:2791 -1145:3:2792 -1146:3:2799 -1147:3:2800 -1148:3:2811 -1149:3:2812 -1150:3:2813 -1151:3:2811 -1152:3:2812 -1153:3:2813 -1154:3:2824 -1155:3:2829 -1156:3:2830 -1157:0:4365 -1158:3:2842 -1159:0:4365 -1160:3:2843 -1161:0:4365 -1162:2:1173 -1163:0:4365 -1164:3:2844 -1165:0:4365 -1166:2:1179 -1167:0:4365 -1168:2:1180 -1169:0:4365 -1170:3:2843 -1171:0:4365 -1172:2:1181 -1173:2:1185 -1174:2:1186 -1175:2:1194 -1176:2:1195 -1177:2:1199 -1178:2:1200 -1179:2:1194 -1180:2:1195 -1181:2:1199 -1182:2:1200 -1183:2:1208 -1184:2:1213 -1185:2:1217 -1186:2:1218 -1187:2:1225 -1188:2:1226 -1189:2:1237 -1190:2:1238 -1191:2:1239 -1192:2:1237 -1193:2:1238 -1194:2:1239 -1195:2:1250 -1196:2:1255 -1197:2:1256 -1198:0:4365 -1199:3:2844 -1200:0:4365 -1201:2:1268 -1202:0:4365 -1203:3:2843 -1204:0:4365 -1205:2:1270 -1206:0:4365 -1207:3:2844 -1208:0:4365 -1209:2:1271 -1210:2:1275 -1211:2:1276 -1212:2:1284 -1213:2:1285 -1214:2:1289 -1215:2:1290 -1216:2:1284 -1217:2:1285 -1218:2:1289 -1219:2:1290 -1220:2:1298 -1221:2:1303 -1222:2:1307 -1223:2:1308 -1224:2:1315 -1225:2:1316 -1226:2:1327 -1227:2:1328 -1228:2:1329 -1229:2:1327 -1230:2:1328 -1231:2:1329 -1232:2:1340 -1233:2:1345 -1234:2:1346 -1235:0:4365 -1236:2:1358 -1237:0:4365 -1238:2:1360 -1239:0:4365 -1240:3:2843 -1241:0:4365 -1242:2:1361 -1243:0:4365 -1244:3:2844 -1245:0:4365 -1246:2:1362 -1247:2:1366 -1248:2:1367 -1249:2:1375 -1250:2:1376 -1251:2:1380 -1252:2:1381 -1253:2:1375 -1254:2:1376 -1255:2:1380 -1256:2:1381 -1257:2:1389 -1258:2:1394 -1259:2:1398 -1260:2:1399 -1261:2:1406 -1262:2:1407 -1263:2:1418 -1264:2:1419 -1265:2:1420 -1266:2:1418 -1267:2:1419 -1268:2:1420 -1269:2:1431 -1270:2:1436 -1271:2:1437 -1272:0:4365 -1273:2:1449 -1274:0:4365 -1275:3:2843 -1276:0:4365 -1277:2:1451 -1278:0:4365 -1279:3:2844 -1280:0:4365 -1281:2:1652 -1282:0:4365 -1283:2:1653 -1284:0:4365 -1285:2:1657 -1286:0:4365 -1287:2:1180 -1288:0:4365 -1289:3:2843 -1290:0:4365 -1291:2:1181 -1292:2:1185 -1293:2:1186 -1294:2:1194 -1295:2:1195 -1296:2:1199 -1297:2:1200 -1298:2:1194 -1299:2:1195 -1300:2:1196 -1301:2:1208 -1302:2:1213 -1303:2:1217 -1304:2:1218 -1305:2:1225 -1306:2:1226 -1307:2:1237 -1308:2:1238 -1309:2:1239 -1310:2:1237 -1311:2:1238 -1312:2:1239 -1313:2:1250 -1314:2:1255 -1315:2:1256 -1316:0:4365 -1317:3:2844 -1318:0:4365 -1319:2:1268 -1320:0:4365 -1321:3:2843 -1322:0:4365 -1323:2:1270 -1324:0:4365 -1325:3:2844 -1326:0:4365 -1327:2:1271 -1328:2:1275 -1329:2:1276 -1330:2:1284 -1331:2:1285 -1332:2:1289 -1333:2:1290 -1334:2:1284 -1335:2:1285 -1336:2:1289 -1337:2:1290 -1338:2:1298 -1339:2:1303 -1340:2:1307 -1341:2:1308 -1342:2:1315 -1343:2:1316 -1344:2:1327 -1345:2:1328 -1346:2:1329 -1347:2:1327 -1348:2:1328 -1349:2:1329 -1350:2:1340 -1351:2:1345 -1352:2:1346 -1353:0:4365 -1354:2:1358 -1355:0:4365 -1356:2:1454 -1357:0:4365 -1358:3:2843 -1359:0:4365 -1360:2:1455 -1361:0:4365 -1362:3:2844 -1363:0:4365 -1364:2:1652 -1365:0:4365 -1366:2:1653 -1367:0:4365 -1368:2:1657 -1369:0:4365 -1370:2:1660 -1371:0:4365 -1372:3:2843 -1373:0:4365 -1374:2:1665 -1375:2:1669 -1376:2:1670 -1377:2:1678 -1378:2:1679 -1379:2:1683 -1380:2:1684 -1381:2:1678 -1382:2:1679 -1383:2:1680 -1384:2:1692 -1385:2:1697 -1386:2:1701 -1387:2:1702 -1388:2:1709 -1389:2:1710 -1390:2:1721 -1391:2:1722 -1392:2:1723 -1393:2:1721 -1394:2:1722 -1395:2:1723 -1396:2:1734 -1397:2:1739 -1398:2:1740 -1399:0:4365 -1400:3:2844 -1401:0:4365 -1402:2:1752 -1403:0:4365 -1404:3:2843 -1405:0:4365 -1406:2:1754 -1407:0:4365 -1408:3:2844 -1409:0:4365 -1410:2:1755 -1411:2:1759 -1412:2:1760 -1413:2:1768 -1414:2:1769 -1415:2:1773 -1416:2:1774 -1417:2:1768 -1418:2:1769 -1419:2:1773 -1420:2:1774 -1421:2:1782 -1422:2:1787 -1423:2:1791 -1424:2:1792 -1425:2:1799 -1426:2:1800 -1427:2:1811 -1428:2:1812 -1429:2:1813 -1430:2:1811 -1431:2:1812 -1432:2:1813 -1433:2:1824 -1434:2:1829 -1435:2:1830 -1436:0:4365 -1437:2:1842 -1438:0:4365 -1439:3:2843 -1440:0:4365 -1441:2:1844 -1442:0:4365 -1443:3:2844 -1444:0:4365 -1445:2:1845 -1446:2:1849 -1447:2:1850 -1448:2:1858 -1449:2:1859 -1450:2:1863 -1451:2:1864 -1452:2:1858 -1453:2:1859 -1454:2:1863 -1455:2:1864 -1456:2:1872 -1457:2:1877 -1458:2:1881 -1459:2:1882 -1460:2:1889 -1461:2:1890 -1462:2:1901 -1463:2:1902 -1464:2:1903 -1465:2:1901 -1466:2:1902 -1467:2:1903 -1468:2:1914 -1469:2:1919 -1470:2:1920 -1471:0:4365 -1472:2:1932 -1473:0:4365 -1474:3:2843 -1475:0:4365 -1476:2:1934 -1477:0:4365 -1478:3:2844 -1479:0:4365 -1480:2:1935 -1481:0:4365 -1482:2:1936 -1483:0:4365 -1484:2:2129 -1485:0:4365 -1486:2:2130 -1487:0:4365 -1488:2:2134 -1489:0:4365 -1490:3:2843 -1491:0:4365 -1492:2:2136 -1493:0:4365 -1494:3:2844 -1495:0:4365 -1496:2:2137 -1497:2:2141 -1498:2:2142 -1499:2:2150 -1500:2:2151 -1501:2:2155 -1502:2:2156 -1503:2:2150 -1504:2:2151 -1505:2:2155 -1506:2:2156 -1507:2:2164 -1508:2:2169 -1509:2:2173 -1510:2:2174 -1511:2:2181 -1512:2:2182 -1513:2:2193 -1514:2:2194 -1515:2:2195 -1516:2:2193 -1517:2:2194 -1518:2:2195 -1519:2:2206 -1520:2:2211 -1521:2:2212 -1522:0:4365 -1523:2:2224 -1524:0:4365 -1525:3:2843 -1526:0:4365 -1527:2:2226 -1528:0:4365 -1529:3:2844 -1530:0:4365 -1531:2:1936 -1532:0:4365 -1533:2:2129 -1534:0:4365 -1535:2:2130 -1536:0:4365 -1537:2:2134 -1538:0:4365 -1539:3:2843 -1540:0:4365 -1541:2:2136 -1542:0:4365 -1543:3:2844 -1544:0:4365 -1545:2:2137 -1546:2:2141 -1547:2:2142 -1548:2:2150 -1549:2:2151 -1550:2:2155 -1551:2:2156 -1552:2:2150 -1553:2:2151 -1554:2:2152 -1555:2:2164 -1556:2:2169 -1557:2:2173 -1558:2:2174 -1559:2:2181 -1560:2:2182 -1561:2:2193 -1562:2:2194 -1563:2:2195 -1564:2:2193 -1565:2:2194 -1566:2:2195 -1567:2:2206 -1568:2:2211 -1569:2:2212 -1570:0:4365 -1571:2:2224 -1572:0:4365 -1573:3:2843 -1574:0:4365 -1575:2:2226 -1576:0:4365 -1577:3:2844 -1578:0:4365 -1579:2:2230 -1580:0:4365 -1581:3:2843 -1582:0:4365 -1583:2:2235 -1584:2:2239 -1585:2:2240 -1586:2:2248 -1587:2:2249 -1588:2:2253 -1589:2:2254 -1590:2:2248 -1591:2:2249 -1592:2:2250 -1593:2:2262 -1594:2:2267 -1595:2:2271 -1596:2:2272 -1597:2:2279 -1598:2:2280 -1599:2:2291 -1600:2:2292 -1601:2:2293 -1602:2:2291 -1603:2:2292 -1604:2:2293 -1605:2:2304 -1606:2:2309 -1607:2:2310 -1608:0:4365 -1609:3:2844 -1610:0:4365 -1611:2:2322 -1612:0:4365 -1613:2:1169 -1614:0:4365 -1615:3:2843 -1616:0:4365 -1617:2:1170 -1618:0:4365 -1619:3:2844 -1620:0:4365 -1621:3:2845 -1622:0:4365 -1623:3:2851 -1624:0:4365 -1625:3:2854 -1626:3:2855 -1627:3:2867 -1628:3:2868 -1629:3:2872 -1630:3:2873 -1631:3:2867 -1632:3:2868 -1633:3:2872 -1634:3:2873 -1635:3:2881 -1636:3:2886 -1637:3:2890 -1638:3:2891 -1639:3:2898 -1640:3:2899 -1641:3:2910 -1642:3:2911 -1643:3:2912 -1644:3:2910 -1645:3:2911 -1646:3:2912 -1647:3:2923 -1648:3:2928 -1649:3:2929 -1650:0:4365 -1651:3:2941 -1652:0:4365 -1653:3:2942 -1654:0:4365 -1655:2:1173 -1656:0:4365 -1657:3:2943 -1658:0:4365 -1659:2:1179 -1660:0:4365 -1661:2:1180 -1662:0:4365 -1663:3:2942 -1664:0:4365 -1665:2:1181 -1666:2:1185 -1667:2:1186 -1668:2:1194 -1669:2:1195 -1670:2:1199 -1671:2:1200 -1672:2:1194 -1673:2:1195 -1674:2:1199 -1675:2:1200 -1676:2:1208 -1677:2:1213 -1678:2:1217 -1679:2:1218 -1680:2:1225 -1681:2:1226 -1682:2:1237 -1683:2:1238 -1684:2:1239 -1685:2:1237 -1686:2:1238 -1687:2:1239 -1688:2:1250 -1689:2:1255 -1690:2:1256 -1691:0:4365 -1692:3:2943 -1693:0:4365 -1694:2:1268 -1695:0:4365 -1696:3:2942 -1697:0:4365 -1698:2:1270 -1699:0:4365 -1700:3:2943 -1701:0:4365 -1702:2:1271 -1703:2:1275 -1704:2:1276 -1705:2:1284 -1706:2:1285 -1707:2:1289 -1708:2:1290 -1709:2:1284 -1710:2:1285 -1711:2:1289 -1712:2:1290 -1713:2:1298 -1714:2:1303 -1715:2:1307 -1716:2:1308 -1717:2:1315 -1718:2:1316 -1719:2:1327 -1720:2:1328 -1721:2:1329 -1722:2:1327 -1723:2:1328 -1724:2:1329 -1725:2:1340 -1726:2:1345 -1727:2:1346 -1728:0:4365 -1729:2:1358 -1730:0:4365 -1731:2:1360 -1732:0:4365 -1733:3:2942 -1734:0:4365 -1735:2:1361 -1736:0:4365 -1737:3:2943 -1738:0:4365 -1739:2:1362 -1740:2:1366 -1741:2:1367 -1742:2:1375 -1743:2:1376 -1744:2:1380 -1745:2:1381 -1746:2:1375 -1747:2:1376 -1748:2:1380 -1749:2:1381 -1750:2:1389 -1751:2:1394 -1752:2:1398 -1753:2:1399 -1754:2:1406 -1755:2:1407 -1756:2:1418 -1757:2:1419 -1758:2:1420 -1759:2:1418 -1760:2:1419 -1761:2:1420 -1762:2:1431 -1763:2:1436 -1764:2:1437 -1765:0:4365 -1766:2:1449 -1767:0:4365 -1768:3:2942 -1769:0:4365 -1770:2:1451 -1771:0:4365 -1772:3:2943 -1773:0:4365 -1774:2:1652 -1775:0:4365 -1776:2:1653 -1777:0:4365 -1778:2:1657 -1779:0:4365 -1780:2:1180 -1781:0:4365 -1782:3:2942 -1783:0:4365 -1784:2:1181 -1785:2:1185 -1786:2:1186 -1787:2:1194 -1788:2:1195 -1789:2:1199 -1790:2:1200 -1791:2:1194 -1792:2:1195 -1793:2:1196 -1794:2:1208 -1795:2:1213 -1796:2:1217 -1797:2:1218 -1798:2:1225 -1799:2:1226 -1800:2:1237 -1801:2:1238 -1802:2:1239 -1803:2:1237 -1804:2:1238 -1805:2:1239 -1806:2:1250 -1807:2:1255 -1808:2:1256 -1809:0:4365 -1810:3:2943 -1811:0:4365 -1812:2:1268 -1813:0:4365 -1814:3:2942 -1815:0:4365 -1816:2:1270 -1817:0:4365 -1818:3:2943 -1819:0:4365 -1820:2:1271 -1821:2:1275 -1822:2:1276 -1823:2:1284 -1824:2:1285 -1825:2:1289 -1826:2:1290 -1827:2:1284 -1828:2:1285 -1829:2:1289 -1830:2:1290 -1831:2:1298 -1832:2:1303 -1833:2:1307 -1834:2:1308 -1835:2:1315 -1836:2:1316 -1837:2:1327 -1838:2:1328 -1839:2:1329 -1840:2:1327 -1841:2:1328 -1842:2:1329 -1843:2:1340 -1844:2:1345 -1845:2:1346 -1846:0:4365 -1847:2:1358 -1848:0:4365 -1849:2:1454 -1850:0:4365 -1851:3:2942 -1852:0:4365 -1853:2:1455 -1854:0:4365 -1855:3:2943 -1856:0:4365 -1857:2:1652 -1858:0:4365 -1859:2:1653 -1860:0:4365 -1861:2:1657 -1862:0:4365 -1863:2:1660 -1864:0:4365 -1865:3:2942 -1866:0:4365 -1867:2:1665 -1868:2:1669 -1869:2:1670 -1870:2:1678 -1871:2:1679 -1872:2:1683 -1873:2:1684 -1874:2:1678 -1875:2:1679 -1876:2:1680 -1877:2:1692 -1878:2:1697 -1879:2:1701 -1880:2:1702 -1881:2:1709 -1882:2:1710 -1883:2:1721 -1884:2:1722 -1885:2:1723 -1886:2:1721 -1887:2:1722 -1888:2:1723 -1889:2:1734 -1890:2:1739 -1891:2:1740 -1892:0:4365 -1893:3:2943 -1894:0:4365 -1895:2:1752 -1896:0:4365 -1897:3:2942 -1898:0:4365 -1899:2:1754 -1900:0:4365 -1901:3:2943 -1902:0:4365 -1903:2:1755 -1904:2:1759 -1905:2:1760 -1906:2:1768 -1907:2:1769 -1908:2:1773 -1909:2:1774 -1910:2:1768 -1911:2:1769 -1912:2:1773 -1913:2:1774 -1914:2:1782 -1915:2:1787 -1916:2:1791 -1917:2:1792 -1918:2:1799 -1919:2:1800 -1920:2:1811 -1921:2:1812 -1922:2:1813 -1923:2:1811 -1924:2:1812 -1925:2:1813 -1926:2:1824 -1927:2:1829 -1928:2:1830 -1929:0:4365 -1930:2:1842 -1931:0:4365 -1932:3:2942 -1933:0:4365 -1934:2:1844 -1935:0:4365 -1936:3:2943 -1937:0:4365 -1938:2:1845 -1939:2:1849 -1940:2:1850 -1941:2:1858 -1942:2:1859 -1943:2:1863 -1944:2:1864 -1945:2:1858 -1946:2:1859 -1947:2:1863 -1948:2:1864 -1949:2:1872 -1950:2:1877 -1951:2:1881 -1952:2:1882 -1953:2:1889 -1954:2:1890 -1955:2:1901 -1956:2:1902 -1957:2:1903 -1958:2:1901 -1959:2:1902 -1960:2:1903 -1961:2:1914 -1962:2:1919 -1963:2:1920 -1964:0:4365 -1965:2:1932 -1966:0:4365 -1967:3:2942 -1968:0:4365 -1969:2:1934 -1970:0:4365 -1971:3:2943 -1972:0:4365 -1973:2:1935 -1974:0:4365 -1975:2:1936 -1976:0:4365 -1977:2:2129 -1978:0:4365 -1979:2:2130 -1980:0:4365 -1981:2:2134 -1982:0:4365 -1983:3:2942 -1984:0:4365 -1985:2:2136 -1986:0:4365 -1987:3:2943 -1988:0:4365 -1989:2:2137 -1990:2:2141 -1991:2:2142 -1992:2:2150 -1993:2:2151 -1994:2:2155 -1995:2:2156 -1996:2:2150 -1997:2:2151 -1998:2:2155 -1999:2:2156 -2000:2:2164 -2001:2:2169 -2002:2:2173 -2003:2:2174 -2004:2:2181 -2005:2:2182 -2006:2:2193 -2007:2:2194 -2008:2:2195 -2009:2:2193 -2010:2:2194 -2011:2:2195 -2012:2:2206 -2013:2:2211 -2014:2:2212 -2015:0:4365 -2016:2:2224 -2017:0:4365 -2018:3:2942 -2019:0:4365 -2020:2:2226 -2021:0:4365 -2022:3:2943 -2023:0:4365 -2024:2:1936 -2025:0:4365 -2026:2:2129 -2027:0:4365 -2028:2:2130 -2029:0:4365 -2030:2:2134 -2031:0:4365 -2032:3:2942 -2033:0:4365 -2034:2:2136 -2035:0:4365 -2036:3:2943 -2037:0:4365 -2038:2:2137 -2039:2:2141 -2040:2:2142 -2041:2:2150 -2042:2:2151 -2043:2:2155 -2044:2:2156 -2045:2:2150 -2046:2:2151 -2047:2:2152 -2048:2:2164 -2049:2:2169 -2050:2:2173 -2051:2:2174 -2052:2:2181 -2053:2:2182 -2054:2:2193 -2055:2:2194 -2056:2:2195 -2057:2:2193 -2058:2:2194 -2059:2:2195 -2060:2:2206 -2061:2:2211 -2062:2:2212 -2063:0:4365 -2064:2:2224 -2065:0:4365 -2066:3:2942 -2067:0:4365 -2068:2:2226 -2069:0:4365 -2070:3:2943 -2071:0:4365 -2072:2:2230 -2073:0:4365 -2074:3:2942 -2075:0:4365 -2076:2:2235 -2077:2:2239 -2078:2:2240 -2079:2:2248 -2080:2:2249 -2081:2:2253 -2082:2:2254 -2083:2:2248 -2084:2:2249 -2085:2:2250 -2086:2:2262 -2087:2:2267 -2088:2:2271 -2089:2:2272 -2090:2:2279 -2091:2:2280 -2092:2:2291 -2093:2:2292 -2094:2:2293 -2095:2:2291 -2096:2:2292 -2097:2:2293 -2098:2:2304 -2099:2:2309 -2100:2:2310 -2101:0:4365 -2102:3:2943 -2103:0:4365 -2104:2:2322 -2105:0:4365 -2106:2:1169 -2107:0:4365 -2108:3:2942 -2109:0:4365 -2110:2:1170 -2111:0:4365 -2112:3:2943 -2113:0:4365 -2114:3:2944 -2115:0:4365 -2116:3:2950 -2117:0:4365 -2118:3:2951 -2119:0:4365 -2120:3:2952 -2121:0:4365 -2122:3:2953 -2123:0:4365 -2124:3:2954 -2125:3:2958 -2126:3:2959 -2127:3:2967 -2128:3:2968 -2129:3:2972 -2130:3:2973 -2131:3:2967 -2132:3:2968 -2133:3:2972 -2134:3:2973 -2135:3:2981 -2136:3:2986 -2137:3:2990 -2138:3:2991 -2139:3:2998 -2140:3:2999 -2141:3:3010 -2142:3:3011 -2143:3:3012 -2144:3:3010 -2145:3:3011 -2146:3:3012 -2147:3:3023 -2148:3:3028 -2149:3:3029 -2150:0:4365 -2151:3:3041 -2152:0:4365 -2153:3:3042 -2154:0:4365 -2155:2:1173 -2156:0:4365 -2157:3:3043 -2158:0:4365 -2159:2:1179 -2160:0:4365 -2161:2:1180 -2162:0:4365 -2163:3:3042 -2164:0:4365 -2165:2:1181 -2166:2:1185 -2167:2:1186 -2168:2:1194 -2169:2:1195 -2170:2:1199 -2171:2:1200 -2172:2:1194 -2173:2:1195 -2174:2:1199 -2175:2:1200 -2176:2:1208 -2177:2:1213 -2178:2:1217 -2179:2:1218 -2180:2:1225 -2181:2:1226 -2182:2:1237 -2183:2:1238 -2184:2:1239 -2185:2:1237 -2186:2:1238 -2187:2:1239 -2188:2:1250 -2189:2:1255 -2190:2:1256 -2191:0:4365 -2192:3:3043 -2193:0:4365 -2194:2:1268 -2195:0:4365 -2196:3:3042 -2197:0:4365 -2198:2:1270 -2199:0:4365 -2200:3:3043 -2201:0:4365 -2202:2:1271 -2203:2:1275 -2204:2:1276 -2205:2:1284 -2206:2:1285 -2207:2:1289 -2208:2:1290 -2209:2:1284 -2210:2:1285 -2211:2:1289 -2212:2:1290 -2213:2:1298 -2214:2:1303 -2215:2:1307 -2216:2:1308 -2217:2:1315 -2218:2:1316 -2219:2:1327 -2220:2:1328 -2221:2:1329 -2222:2:1327 -2223:2:1328 -2224:2:1329 -2225:2:1340 -2226:2:1345 -2227:2:1346 -2228:0:4365 -2229:2:1358 -2230:0:4365 -2231:2:1360 -2232:0:4365 -2233:3:3042 -2234:0:4365 -2235:2:1361 -2236:0:4365 -2237:3:3043 -2238:0:4365 -2239:2:1362 -2240:2:1366 -2241:2:1367 -2242:2:1375 -2243:2:1376 -2244:2:1380 -2245:2:1381 -2246:2:1375 -2247:2:1376 -2248:2:1380 -2249:2:1381 -2250:2:1389 -2251:2:1394 -2252:2:1398 -2253:2:1399 -2254:2:1406 -2255:2:1407 -2256:2:1418 -2257:2:1419 -2258:2:1420 -2259:2:1418 -2260:2:1419 -2261:2:1420 -2262:2:1431 -2263:2:1436 -2264:2:1437 -2265:0:4365 -2266:2:1449 -2267:0:4365 -2268:3:3042 -2269:0:4365 -2270:2:1451 -2271:0:4365 -2272:3:3043 -2273:0:4365 -2274:2:1652 -2275:0:4365 -2276:2:1653 -2277:0:4365 -2278:2:1657 -2279:0:4365 -2280:2:1180 -2281:0:4365 -2282:3:3042 -2283:0:4365 -2284:2:1181 -2285:2:1185 -2286:2:1186 -2287:2:1194 -2288:2:1195 -2289:2:1199 -2290:2:1200 -2291:2:1194 -2292:2:1195 -2293:2:1196 -2294:2:1208 -2295:2:1213 -2296:2:1217 -2297:2:1218 -2298:2:1225 -2299:2:1226 -2300:2:1237 -2301:2:1238 -2302:2:1239 -2303:2:1237 -2304:2:1238 -2305:2:1239 -2306:2:1250 -2307:2:1255 -2308:2:1256 -2309:0:4365 -2310:3:3043 -2311:0:4365 -2312:2:1268 -2313:0:4365 -2314:3:3042 -2315:0:4365 -2316:2:1270 -2317:0:4365 -2318:3:3043 -2319:0:4365 -2320:2:1271 -2321:2:1275 -2322:2:1276 -2323:2:1284 -2324:2:1285 -2325:2:1289 -2326:2:1290 -2327:2:1284 -2328:2:1285 -2329:2:1289 -2330:2:1290 -2331:2:1298 -2332:2:1303 -2333:2:1307 -2334:2:1308 -2335:2:1315 -2336:2:1316 -2337:2:1327 -2338:2:1328 -2339:2:1329 -2340:2:1327 -2341:2:1328 -2342:2:1329 -2343:2:1340 -2344:2:1345 -2345:2:1346 -2346:0:4365 -2347:2:1358 -2348:0:4365 -2349:2:1454 -2350:0:4365 -2351:3:3042 -2352:0:4365 -2353:2:1455 -2354:0:4365 -2355:3:3043 -2356:0:4365 -2357:2:1652 -2358:0:4365 -2359:2:1653 -2360:0:4365 -2361:2:1657 -2362:0:4365 -2363:2:1660 -2364:0:4365 -2365:3:3042 -2366:0:4365 -2367:2:1665 -2368:2:1669 -2369:2:1670 -2370:2:1678 -2371:2:1679 -2372:2:1683 -2373:2:1684 -2374:2:1678 -2375:2:1679 -2376:2:1680 -2377:2:1692 -2378:2:1697 -2379:2:1701 -2380:2:1702 -2381:2:1709 -2382:2:1710 -2383:2:1721 -2384:2:1722 -2385:2:1723 -2386:2:1721 -2387:2:1722 -2388:2:1723 -2389:2:1734 -2390:2:1739 -2391:2:1740 -2392:0:4365 -2393:3:3043 -2394:0:4365 -2395:2:1752 -2396:0:4365 -2397:3:3042 -2398:0:4365 -2399:2:1754 -2400:0:4365 -2401:3:3043 -2402:0:4365 -2403:2:1755 -2404:2:1759 -2405:2:1760 -2406:2:1768 -2407:2:1769 -2408:2:1773 -2409:2:1774 -2410:2:1768 -2411:2:1769 -2412:2:1773 -2413:2:1774 -2414:2:1782 -2415:2:1787 -2416:2:1791 -2417:2:1792 -2418:2:1799 -2419:2:1800 -2420:2:1811 -2421:2:1812 -2422:2:1813 -2423:2:1811 -2424:2:1812 -2425:2:1813 -2426:2:1824 -2427:2:1829 -2428:2:1830 -2429:0:4365 -2430:2:1842 -2431:0:4365 -2432:3:3042 -2433:0:4365 -2434:2:1844 -2435:0:4365 -2436:3:3043 -2437:0:4365 -2438:2:1845 -2439:2:1849 -2440:2:1850 -2441:2:1858 -2442:2:1859 -2443:2:1863 -2444:2:1864 -2445:2:1858 -2446:2:1859 -2447:2:1863 -2448:2:1864 -2449:2:1872 -2450:2:1877 -2451:2:1881 -2452:2:1882 -2453:2:1889 -2454:2:1890 -2455:2:1901 -2456:2:1902 -2457:2:1903 -2458:2:1901 -2459:2:1902 -2460:2:1903 -2461:2:1914 -2462:2:1919 -2463:2:1920 -2464:0:4365 -2465:2:1932 -2466:0:4365 -2467:3:3042 -2468:0:4365 -2469:2:1934 -2470:0:4365 -2471:3:3043 -2472:0:4365 -2473:2:1935 -2474:0:4365 -2475:2:1936 -2476:0:4365 -2477:2:2129 -2478:0:4365 -2479:2:2130 -2480:0:4365 -2481:2:2134 -2482:0:4365 -2483:3:3042 -2484:0:4365 -2485:2:2136 -2486:0:4365 -2487:3:3043 -2488:0:4365 -2489:2:2137 -2490:2:2141 -2491:2:2142 -2492:2:2150 -2493:2:2151 -2494:2:2155 -2495:2:2156 -2496:2:2150 -2497:2:2151 -2498:2:2155 -2499:2:2156 -2500:2:2164 -2501:2:2169 -2502:2:2173 -2503:2:2174 -2504:2:2181 -2505:2:2182 -2506:2:2193 -2507:2:2194 -2508:2:2195 -2509:2:2193 -2510:2:2194 -2511:2:2195 -2512:2:2206 -2513:2:2211 -2514:2:2212 -2515:0:4365 -2516:2:2224 -2517:0:4365 -2518:3:3042 -2519:0:4365 -2520:2:2226 -2521:0:4365 -2522:3:3043 -2523:0:4365 -2524:2:1936 -2525:0:4365 -2526:2:2129 -2527:0:4365 -2528:2:2130 -2529:0:4365 -2530:2:2134 -2531:0:4365 -2532:3:3042 -2533:0:4365 -2534:2:2136 -2535:0:4365 -2536:3:3043 -2537:0:4365 -2538:2:2137 -2539:2:2141 -2540:2:2142 -2541:2:2150 -2542:2:2151 -2543:2:2155 -2544:2:2156 -2545:2:2150 -2546:2:2151 -2547:2:2152 -2548:2:2164 -2549:2:2169 -2550:2:2173 -2551:2:2174 -2552:2:2181 -2553:2:2182 -2554:2:2193 -2555:2:2194 -2556:2:2195 -2557:2:2193 -2558:2:2194 -2559:2:2195 -2560:2:2206 -2561:2:2211 -2562:2:2212 -2563:0:4365 -2564:2:2224 -2565:0:4365 -2566:3:3042 -2567:0:4365 -2568:2:2226 -2569:0:4365 -2570:3:3043 -2571:0:4365 -2572:2:2230 -2573:0:4365 -2574:3:3042 -2575:0:4365 -2576:2:2235 -2577:2:2239 -2578:2:2240 -2579:2:2248 -2580:2:2249 -2581:2:2253 -2582:2:2254 -2583:2:2248 -2584:2:2249 -2585:2:2250 -2586:2:2262 -2587:2:2267 -2588:2:2271 -2589:2:2272 -2590:2:2279 -2591:2:2280 -2592:2:2291 -2593:2:2292 -2594:2:2293 -2595:2:2291 -2596:2:2292 -2597:2:2293 -2598:2:2304 -2599:2:2309 -2600:2:2310 -2601:0:4365 -2602:3:3043 -2603:0:4365 -2604:2:2322 -2605:0:4365 -2606:2:1169 -2607:0:4365 -2608:3:3042 -2609:0:4365 -2610:2:1170 -2611:0:4365 -2612:3:3043 -2613:0:4365 -2614:3:3044 -2615:0:4365 -2616:3:3257 -2617:0:4365 -2618:3:3265 -2619:0:4365 -2620:3:3266 -2621:3:3270 -2622:3:3271 -2623:3:3279 -2624:3:3280 -2625:3:3284 -2626:3:3285 -2627:3:3279 -2628:3:3280 -2629:3:3284 -2630:3:3285 -2631:3:3293 -2632:3:3298 -2633:3:3302 -2634:3:3303 -2635:3:3310 -2636:3:3311 -2637:3:3322 -2638:3:3323 -2639:3:3324 -2640:3:3322 -2641:3:3323 -2642:3:3324 -2643:3:3335 -2644:3:3340 -2645:3:3341 -2646:0:4365 -2647:3:3353 -2648:0:4365 -2649:3:3354 -2650:0:4365 -2651:2:1173 -2652:0:4365 -2653:3:3355 -2654:0:4365 -2655:2:1179 -2656:0:4365 -2657:2:1180 -2658:0:4365 -2659:3:3354 -2660:0:4365 -2661:2:1181 -2662:2:1185 -2663:2:1186 -2664:2:1194 -2665:2:1195 -2666:2:1199 -2667:2:1200 -2668:2:1194 -2669:2:1195 -2670:2:1199 -2671:2:1200 -2672:2:1208 -2673:2:1213 -2674:2:1217 -2675:2:1218 -2676:2:1225 -2677:2:1226 -2678:2:1237 -2679:2:1238 -2680:2:1239 -2681:2:1237 -2682:2:1238 -2683:2:1239 -2684:2:1250 -2685:2:1255 -2686:2:1256 -2687:0:4365 -2688:3:3355 -2689:0:4365 -2690:2:1268 -2691:0:4365 -2692:3:3354 -2693:0:4365 -2694:2:1270 -2695:0:4365 -2696:3:3355 -2697:0:4365 -2698:2:1271 -2699:2:1275 -2700:2:1276 -2701:2:1284 -2702:2:1285 -2703:2:1289 -2704:2:1290 -2705:2:1284 -2706:2:1285 -2707:2:1289 -2708:2:1290 -2709:2:1298 -2710:2:1303 -2711:2:1307 -2712:2:1308 -2713:2:1315 -2714:2:1316 -2715:2:1327 -2716:2:1328 -2717:2:1329 -2718:2:1327 -2719:2:1328 -2720:2:1329 -2721:2:1340 -2722:2:1345 -2723:2:1346 -2724:0:4365 -2725:2:1358 -2726:0:4365 -2727:2:1360 -2728:0:4365 -2729:3:3354 -2730:0:4365 -2731:2:1361 -2732:0:4365 -2733:3:3355 -2734:0:4365 -2735:2:1362 -2736:2:1366 -2737:2:1367 -2738:2:1375 -2739:2:1376 -2740:2:1380 -2741:2:1381 -2742:2:1375 -2743:2:1376 -2744:2:1380 -2745:2:1381 -2746:2:1389 -2747:2:1394 -2748:2:1398 -2749:2:1399 -2750:2:1406 -2751:2:1407 -2752:2:1418 -2753:2:1419 -2754:2:1420 -2755:2:1418 -2756:2:1419 -2757:2:1420 -2758:2:1431 -2759:2:1436 -2760:2:1437 -2761:0:4365 -2762:2:1449 -2763:0:4365 -2764:3:3354 -2765:0:4365 -2766:2:1451 -2767:0:4365 -2768:3:3355 -2769:0:4365 -2770:2:1652 -2771:0:4365 -2772:2:1653 -2773:0:4365 -2774:2:1657 -2775:0:4365 -2776:2:1180 -2777:0:4365 -2778:3:3354 -2779:0:4365 -2780:2:1181 -2781:2:1185 -2782:2:1186 -2783:2:1194 -2784:2:1195 -2785:2:1199 -2786:2:1200 -2787:2:1194 -2788:2:1195 -2789:2:1196 -2790:2:1208 -2791:2:1213 -2792:2:1217 -2793:2:1218 -2794:2:1225 -2795:2:1226 -2796:2:1237 -2797:2:1238 -2798:2:1239 -2799:2:1237 -2800:2:1238 -2801:2:1239 -2802:2:1250 -2803:2:1255 -2804:2:1256 -2805:0:4365 -2806:3:3355 -2807:0:4365 -2808:2:1268 -2809:0:4365 -2810:3:3354 -2811:0:4365 -2812:2:1270 -2813:0:4365 -2814:3:3355 -2815:0:4365 -2816:2:1271 -2817:2:1275 -2818:2:1276 -2819:2:1284 -2820:2:1285 -2821:2:1289 -2822:2:1290 -2823:2:1284 -2824:2:1285 -2825:2:1289 -2826:2:1290 -2827:2:1298 -2828:2:1303 -2829:2:1307 -2830:2:1308 -2831:2:1315 -2832:2:1316 -2833:2:1327 -2834:2:1328 -2835:2:1329 -2836:2:1327 -2837:2:1328 -2838:2:1329 -2839:2:1340 -2840:2:1345 -2841:2:1346 -2842:0:4365 -2843:2:1358 -2844:0:4365 -2845:2:1454 -2846:0:4365 -2847:3:3354 -2848:0:4365 -2849:2:1455 -2850:0:4365 -2851:3:3355 -2852:0:4365 -2853:2:1652 -2854:0:4365 -2855:2:1653 -2856:0:4365 -2857:2:1657 -2858:0:4365 -2859:2:1660 -2860:0:4365 -2861:3:3354 -2862:0:4365 -2863:2:1665 -2864:2:1669 -2865:2:1670 -2866:2:1678 -2867:2:1679 -2868:2:1683 -2869:2:1684 -2870:2:1678 -2871:2:1679 -2872:2:1680 -2873:2:1692 -2874:2:1697 -2875:2:1701 -2876:2:1702 -2877:2:1709 -2878:2:1710 -2879:2:1721 -2880:2:1722 -2881:2:1723 -2882:2:1721 -2883:2:1722 -2884:2:1723 -2885:2:1734 -2886:2:1739 -2887:2:1740 -2888:0:4365 -2889:3:3355 -2890:0:4365 -2891:2:1752 -2892:0:4365 -2893:3:3354 -2894:0:4365 -2895:2:1754 -2896:0:4365 -2897:3:3355 -2898:0:4365 -2899:2:1755 -2900:2:1759 -2901:2:1760 -2902:2:1768 -2903:2:1769 -2904:2:1773 -2905:2:1774 -2906:2:1768 -2907:2:1769 -2908:2:1773 -2909:2:1774 -2910:2:1782 -2911:2:1787 -2912:2:1791 -2913:2:1792 -2914:2:1799 -2915:2:1800 -2916:2:1811 -2917:2:1812 -2918:2:1813 -2919:2:1811 -2920:2:1812 -2921:2:1813 -2922:2:1824 -2923:2:1829 -2924:2:1830 -2925:0:4365 -2926:2:1842 -2927:0:4365 -2928:3:3354 -2929:0:4365 -2930:2:1844 -2931:0:4365 -2932:3:3355 -2933:0:4365 -2934:2:1845 -2935:2:1849 -2936:2:1850 -2937:2:1858 -2938:2:1859 -2939:2:1863 -2940:2:1864 -2941:2:1858 -2942:2:1859 -2943:2:1863 -2944:2:1864 -2945:2:1872 -2946:2:1877 -2947:2:1881 -2948:2:1882 -2949:2:1889 -2950:2:1890 -2951:2:1901 -2952:2:1902 -2953:2:1903 -2954:2:1901 -2955:2:1902 -2956:2:1903 -2957:2:1914 -2958:2:1919 -2959:2:1920 -2960:0:4365 -2961:2:1932 -2962:0:4365 -2963:3:3354 -2964:0:4365 -2965:2:1934 -2966:0:4365 -2967:3:3355 -2968:0:4365 -2969:2:1935 -2970:0:4365 -2971:2:1936 -2972:0:4365 -2973:2:2129 -2974:0:4365 -2975:2:2130 -2976:0:4365 -2977:2:2134 -2978:0:4365 -2979:3:3354 -2980:0:4365 -2981:2:2136 -2982:0:4365 -2983:3:3355 -2984:0:4365 -2985:2:2137 -2986:2:2141 -2987:2:2142 -2988:2:2150 -2989:2:2151 -2990:2:2155 -2991:2:2156 -2992:2:2150 -2993:2:2151 -2994:2:2155 -2995:2:2156 -2996:2:2164 -2997:2:2169 -2998:2:2173 -2999:2:2174 -3000:2:2181 -3001:2:2182 -3002:2:2193 -3003:2:2194 -3004:2:2195 -3005:2:2193 -3006:2:2194 -3007:2:2195 -3008:2:2206 -3009:2:2211 -3010:2:2212 -3011:0:4365 -3012:2:2224 -3013:0:4365 -3014:3:3354 -3015:0:4365 -3016:2:2226 -3017:0:4365 -3018:3:3355 -3019:0:4365 -3020:2:1936 -3021:0:4365 -3022:2:2129 -3023:0:4365 -3024:2:2130 -3025:0:4365 -3026:2:2134 -3027:0:4365 -3028:3:3354 -3029:0:4365 -3030:2:2136 -3031:0:4365 -3032:3:3355 -3033:0:4365 -3034:2:2137 -3035:2:2141 -3036:2:2142 -3037:2:2150 -3038:2:2151 -3039:2:2155 -3040:2:2156 -3041:2:2150 -3042:2:2151 -3043:2:2152 -3044:2:2164 -3045:2:2169 -3046:2:2173 -3047:2:2174 -3048:2:2181 -3049:2:2182 -3050:2:2193 -3051:2:2194 -3052:2:2195 -3053:2:2193 -3054:2:2194 -3055:2:2195 -3056:2:2206 -3057:2:2211 -3058:2:2212 -3059:0:4365 -3060:2:2224 -3061:0:4365 -3062:3:3354 -3063:0:4365 -3064:2:2226 -3065:0:4365 -3066:3:3355 -3067:0:4365 -3068:2:2230 -3069:0:4365 -3070:3:3354 -3071:0:4365 -3072:2:2235 -3073:2:2239 -3074:2:2240 -3075:2:2248 -3076:2:2249 -3077:2:2253 -3078:2:2254 -3079:2:2248 -3080:2:2249 -3081:2:2250 -3082:2:2262 -3083:2:2267 -3084:2:2271 -3085:2:2272 -3086:2:2279 -3087:2:2280 -3088:2:2291 -3089:2:2292 -3090:2:2293 -3091:2:2291 -3092:2:2292 -3093:2:2293 -3094:2:2304 -3095:2:2309 -3096:2:2310 -3097:0:4365 -3098:3:3355 -3099:0:4365 -3100:2:2322 -3101:0:4365 -3102:2:1169 -3103:0:4365 -3104:3:3354 -3105:0:4365 -3106:2:1170 -3107:0:4365 -3108:3:3355 -3109:0:4365 -3110:3:3356 -3111:0:4365 -3112:3:3366 -3113:0:4365 -3114:3:2951 -3115:0:4365 -3116:3:2952 -3117:0:4365 -3118:3:2953 -3119:0:4365 -3120:3:2954 -3121:3:2958 -3122:3:2959 -3123:3:2967 -3124:3:2968 -3125:3:2972 -3126:3:2973 -3127:3:2967 -3128:3:2968 -3129:3:2972 -3130:3:2973 -3131:3:2981 -3132:3:2986 -3133:3:2990 -3134:3:2991 -3135:3:2998 -3136:3:2999 -3137:3:3010 -3138:3:3011 -3139:3:3012 -3140:3:3010 -3141:3:3011 -3142:3:3012 -3143:3:3023 -3144:3:3028 -3145:3:3029 -3146:0:4365 -3147:3:3041 -3148:0:4365 -3149:3:3042 -3150:0:4365 -3151:2:1173 -3152:0:4365 -3153:3:3043 -3154:0:4365 -3155:2:1179 -3156:0:4365 -3157:2:1180 -3158:0:4365 -3159:3:3042 -3160:0:4365 -3161:2:1181 -3162:2:1185 -3163:2:1186 -3164:2:1194 -3165:2:1195 -3166:2:1199 -3167:2:1200 -3168:2:1194 -3169:2:1195 -3170:2:1199 -3171:2:1200 -3172:2:1208 -3173:2:1213 -3174:2:1217 -3175:2:1218 -3176:2:1225 -3177:2:1226 -3178:2:1237 -3179:2:1238 -3180:2:1239 -3181:2:1237 -3182:2:1238 -3183:2:1239 -3184:2:1250 -3185:2:1255 -3186:2:1256 -3187:0:4365 -3188:3:3043 -3189:0:4365 -3190:2:1268 -3191:0:4365 -3192:3:3042 -3193:0:4365 -3194:2:1270 -3195:0:4365 -3196:3:3043 -3197:0:4365 -3198:2:1271 -3199:2:1275 -3200:2:1276 -3201:2:1284 -3202:2:1285 -3203:2:1289 -3204:2:1290 -3205:2:1284 -3206:2:1285 -3207:2:1289 -3208:2:1290 -3209:2:1298 -3210:2:1303 -3211:2:1307 -3212:2:1308 -3213:2:1315 -3214:2:1316 -3215:2:1327 -3216:2:1328 -3217:2:1329 -3218:2:1327 -3219:2:1328 -3220:2:1329 -3221:2:1340 -3222:2:1345 -3223:2:1346 -3224:0:4365 -3225:2:1358 -3226:0:4365 -3227:2:1360 -3228:0:4365 -3229:3:3042 -3230:0:4365 -3231:2:1361 -3232:0:4365 -3233:3:3043 -3234:0:4365 -3235:2:1362 -3236:2:1366 -3237:2:1367 -3238:2:1375 -3239:2:1376 -3240:2:1380 -3241:2:1381 -3242:2:1375 -3243:2:1376 -3244:2:1380 -3245:2:1381 -3246:2:1389 -3247:2:1394 -3248:2:1398 -3249:2:1399 -3250:2:1406 -3251:2:1407 -3252:2:1418 -3253:2:1419 -3254:2:1420 -3255:2:1418 -3256:2:1419 -3257:2:1420 -3258:2:1431 -3259:2:1436 -3260:2:1437 -3261:0:4365 -3262:2:1449 -3263:0:4365 -3264:3:3042 -3265:0:4365 -3266:2:1451 -3267:0:4365 -3268:3:3043 -3269:0:4365 -3270:2:1652 -3271:0:4365 -3272:2:1653 -3273:0:4365 -3274:2:1657 -3275:0:4365 -3276:2:1180 -3277:0:4365 -3278:3:3042 -3279:0:4365 -3280:2:1181 -3281:2:1185 -3282:2:1186 -3283:2:1194 -3284:2:1195 -3285:2:1199 -3286:2:1200 -3287:2:1194 -3288:2:1195 -3289:2:1196 -3290:2:1208 -3291:2:1213 -3292:2:1217 -3293:2:1218 -3294:2:1225 -3295:2:1226 -3296:2:1237 -3297:2:1238 -3298:2:1239 -3299:2:1237 -3300:2:1238 -3301:2:1239 -3302:2:1250 -3303:2:1255 -3304:2:1256 -3305:0:4365 -3306:3:3043 -3307:0:4365 -3308:2:1268 -3309:0:4365 -3310:3:3042 -3311:0:4365 -3312:2:1270 -3313:0:4365 -3314:3:3043 -3315:0:4365 -3316:2:1271 -3317:2:1275 -3318:2:1276 -3319:2:1284 -3320:2:1285 -3321:2:1289 -3322:2:1290 -3323:2:1284 -3324:2:1285 -3325:2:1289 -3326:2:1290 -3327:2:1298 -3328:2:1303 -3329:2:1307 -3330:2:1308 -3331:2:1315 -3332:2:1316 -3333:2:1327 -3334:2:1328 -3335:2:1329 -3336:2:1327 -3337:2:1328 -3338:2:1329 -3339:2:1340 -3340:2:1345 -3341:2:1346 -3342:0:4365 -3343:2:1358 -3344:0:4365 -3345:2:1454 -3346:0:4365 -3347:3:3042 -3348:0:4365 -3349:2:1455 -3350:0:4365 -3351:3:3043 -3352:0:4365 -3353:2:1652 -3354:0:4365 -3355:2:1653 -3356:0:4365 -3357:2:1657 -3358:0:4365 -3359:2:1660 -3360:0:4365 -3361:3:3042 -3362:0:4365 -3363:2:1665 -3364:2:1669 -3365:2:1670 -3366:2:1678 -3367:2:1679 -3368:2:1683 -3369:2:1684 -3370:2:1678 -3371:2:1679 -3372:2:1680 -3373:2:1692 -3374:2:1697 -3375:2:1701 -3376:2:1702 -3377:2:1709 -3378:2:1710 -3379:2:1721 -3380:2:1722 -3381:2:1723 -3382:2:1721 -3383:2:1722 -3384:2:1723 -3385:2:1734 -3386:2:1739 -3387:2:1740 -3388:0:4365 -3389:3:3043 -3390:0:4365 -3391:2:1752 -3392:0:4365 -3393:3:3042 -3394:0:4365 -3395:2:1754 -3396:0:4365 -3397:3:3043 -3398:0:4365 -3399:2:1755 -3400:2:1759 -3401:2:1760 -3402:2:1768 -3403:2:1769 -3404:2:1773 -3405:2:1774 -3406:2:1768 -3407:2:1769 -3408:2:1773 -3409:2:1774 -3410:2:1782 -3411:2:1787 -3412:2:1791 -3413:2:1792 -3414:2:1799 -3415:2:1800 -3416:2:1811 -3417:2:1812 -3418:2:1813 -3419:2:1811 -3420:2:1812 -3421:2:1813 -3422:2:1824 -3423:2:1829 -3424:2:1830 -3425:0:4365 -3426:2:1842 -3427:0:4365 -3428:3:3042 -3429:0:4365 -3430:2:1844 -3431:0:4365 -3432:3:3043 -3433:0:4365 -3434:2:1845 -3435:2:1849 -3436:2:1850 -3437:2:1858 -3438:2:1859 -3439:2:1863 -3440:2:1864 -3441:2:1858 -3442:2:1859 -3443:2:1863 -3444:2:1864 -3445:2:1872 -3446:2:1877 -3447:2:1881 -3448:2:1882 -3449:2:1889 -3450:2:1890 -3451:2:1901 -3452:2:1902 -3453:2:1903 -3454:2:1901 -3455:2:1902 -3456:2:1903 -3457:2:1914 -3458:2:1919 -3459:2:1920 -3460:0:4365 -3461:2:1932 -3462:0:4365 -3463:3:3042 -3464:0:4365 -3465:2:1934 -3466:0:4365 -3467:3:3043 -3468:0:4365 -3469:2:1935 -3470:0:4365 -3471:2:1936 -3472:0:4365 -3473:2:2129 -3474:0:4365 -3475:2:2130 -3476:0:4365 -3477:2:2134 -3478:0:4365 -3479:3:3042 -3480:0:4365 -3481:2:2136 -3482:0:4365 -3483:3:3043 -3484:0:4365 -3485:2:2137 -3486:2:2141 -3487:2:2142 -3488:2:2150 -3489:2:2151 -3490:2:2155 -3491:2:2156 -3492:2:2150 -3493:2:2151 -3494:2:2155 -3495:2:2156 -3496:2:2164 -3497:2:2169 -3498:2:2173 -3499:2:2174 -3500:2:2181 -3501:2:2182 -3502:2:2193 -3503:2:2194 -3504:2:2195 -3505:2:2193 -3506:2:2194 -3507:2:2195 -3508:2:2206 -3509:2:2211 -3510:2:2212 -3511:0:4365 -3512:2:2224 -3513:0:4365 -3514:3:3042 -3515:0:4365 -3516:2:2226 -3517:0:4365 -3518:3:3043 -3519:0:4365 -3520:2:1936 -3521:0:4365 -3522:2:2129 -3523:0:4365 -3524:2:2130 -3525:0:4365 -3526:2:2134 -3527:0:4365 -3528:3:3042 -3529:0:4365 -3530:2:2136 -3531:0:4365 -3532:3:3043 -3533:0:4365 -3534:2:2137 -3535:2:2141 -3536:2:2142 -3537:2:2150 -3538:2:2151 -3539:2:2155 -3540:2:2156 -3541:2:2150 -3542:2:2151 -3543:2:2152 -3544:2:2164 -3545:2:2169 -3546:2:2173 -3547:2:2174 -3548:2:2181 -3549:2:2182 -3550:2:2193 -3551:2:2194 -3552:2:2195 -3553:2:2193 -3554:2:2194 -3555:2:2195 -3556:2:2206 -3557:2:2211 -3558:2:2212 -3559:0:4365 -3560:2:2224 -3561:0:4365 -3562:3:3042 -3563:0:4365 -3564:2:2226 -3565:0:4365 -3566:3:3043 -3567:0:4365 -3568:2:2230 -3569:0:4365 -3570:3:3042 -3571:0:4365 -3572:2:2235 -3573:2:2239 -3574:2:2240 -3575:2:2248 -3576:2:2249 -3577:2:2253 -3578:2:2254 -3579:2:2248 -3580:2:2249 -3581:2:2250 -3582:2:2262 -3583:2:2267 -3584:2:2271 -3585:2:2272 -3586:2:2279 -3587:2:2280 -3588:2:2291 -3589:2:2292 -3590:2:2293 -3591:2:2291 -3592:2:2292 -3593:2:2293 -3594:2:2304 -3595:2:2309 -3596:2:2310 -3597:0:4365 -3598:3:3043 -3599:0:4365 -3600:2:2322 -3601:0:4365 -3602:2:1169 -3603:0:4365 -3604:3:3042 -3605:0:4365 -3606:2:1170 -3607:0:4365 -3608:3:3043 -3609:0:4365 -3610:3:3044 -3611:0:4365 -3612:3:3257 -3613:0:4365 -3614:3:3362 -3615:0:4365 -3616:3:3363 -3617:0:4365 -3618:3:3367 -3619:0:4365 -3620:3:3373 -3621:3:3377 -3622:3:3378 -3623:3:3386 -3624:3:3387 -3625:3:3391 -3626:3:3392 -3627:3:3386 -3628:3:3387 -3629:3:3391 -3630:3:3392 -3631:3:3400 -3632:3:3405 -3633:3:3409 -3634:3:3410 -3635:3:3417 -3636:3:3418 -3637:3:3429 -3638:3:3430 -3639:3:3431 -3640:3:3429 -3641:3:3430 -3642:3:3431 -3643:3:3442 -3644:3:3447 -3645:3:3448 -3646:0:4365 -3647:3:3460 -3648:0:4365 -3649:3:3461 -3650:0:4365 -3651:2:1173 -3652:0:4365 -3653:3:3462 -3654:0:4365 -3655:2:1179 -3656:0:4365 -3657:2:1180 -3658:0:4365 -3659:3:3461 -3660:0:4365 -3661:2:1181 -3662:2:1185 -3663:2:1186 -3664:2:1194 -3665:2:1195 -3666:2:1199 -3667:2:1200 -3668:2:1194 -3669:2:1195 -3670:2:1199 -3671:2:1200 -3672:2:1208 -3673:2:1213 -3674:2:1217 -3675:2:1218 -3676:2:1225 -3677:2:1226 -3678:2:1237 -3679:2:1238 -3680:2:1239 -3681:2:1237 -3682:2:1238 -3683:2:1239 -3684:2:1250 -3685:2:1255 -3686:2:1256 -3687:0:4365 -3688:3:3462 -3689:0:4365 -3690:2:1268 -3691:0:4365 -3692:3:3461 -3693:0:4365 -3694:2:1270 -3695:0:4365 -3696:3:3462 -3697:0:4365 -3698:2:1271 -3699:2:1275 -3700:2:1276 -3701:2:1284 -3702:2:1285 -3703:2:1289 -3704:2:1290 -3705:2:1284 -3706:2:1285 -3707:2:1289 -3708:2:1290 -3709:2:1298 -3710:2:1303 -3711:2:1307 -3712:2:1308 -3713:2:1315 -3714:2:1316 -3715:2:1327 -3716:2:1328 -3717:2:1329 -3718:2:1327 -3719:2:1328 -3720:2:1329 -3721:2:1340 -3722:2:1345 -3723:2:1346 -3724:0:4365 -3725:2:1358 -3726:0:4365 -3727:2:1360 -3728:0:4365 -3729:3:3461 -3730:0:4365 -3731:2:1361 -3732:0:4365 -3733:3:3462 -3734:0:4365 -3735:2:1362 -3736:2:1366 -3737:2:1367 -3738:2:1375 -3739:2:1376 -3740:2:1380 -3741:2:1381 -3742:2:1375 -3743:2:1376 -3744:2:1380 -3745:2:1381 -3746:2:1389 -3747:2:1394 -3748:2:1398 -3749:2:1399 -3750:2:1406 -3751:2:1407 -3752:2:1418 -3753:2:1419 -3754:2:1420 -3755:2:1418 -3756:2:1419 -3757:2:1420 -3758:2:1431 -3759:2:1436 -3760:2:1437 -3761:0:4365 -3762:2:1449 -3763:0:4365 -3764:3:3461 -3765:0:4365 -3766:2:1451 -3767:0:4365 -3768:3:3462 -3769:0:4365 -3770:2:1652 -3771:0:4365 -3772:2:1653 -3773:0:4365 -3774:2:1657 -3775:0:4365 -3776:2:1180 -3777:0:4365 -3778:3:3461 -3779:0:4365 -3780:2:1181 -3781:2:1185 -3782:2:1186 -3783:2:1194 -3784:2:1195 -3785:2:1199 -3786:2:1200 -3787:2:1194 -3788:2:1195 -3789:2:1196 -3790:2:1208 -3791:2:1213 -3792:2:1217 -3793:2:1218 -3794:2:1225 -3795:2:1226 -3796:2:1237 -3797:2:1238 -3798:2:1239 -3799:2:1237 -3800:2:1238 -3801:2:1239 -3802:2:1250 -3803:2:1255 -3804:2:1256 -3805:0:4365 -3806:3:3462 -3807:0:4365 -3808:2:1268 -3809:0:4365 -3810:3:3461 -3811:0:4365 -3812:2:1270 -3813:0:4365 -3814:3:3462 -3815:0:4365 -3816:2:1271 -3817:2:1275 -3818:2:1276 -3819:2:1284 -3820:2:1285 -3821:2:1289 -3822:2:1290 -3823:2:1284 -3824:2:1285 -3825:2:1289 -3826:2:1290 -3827:2:1298 -3828:2:1303 -3829:2:1307 -3830:2:1308 -3831:2:1315 -3832:2:1316 -3833:2:1327 -3834:2:1328 -3835:2:1329 -3836:2:1327 -3837:2:1328 -3838:2:1329 -3839:2:1340 -3840:2:1345 -3841:2:1346 -3842:0:4365 -3843:2:1358 -3844:0:4365 -3845:2:1454 -3846:0:4365 -3847:3:3461 -3848:0:4365 -3849:2:1455 -3850:0:4365 -3851:3:3462 -3852:0:4365 -3853:2:1652 -3854:0:4365 -3855:2:1653 -3856:0:4365 -3857:2:1657 -3858:0:4365 -3859:2:1660 -3860:0:4365 -3861:3:3461 -3862:0:4365 -3863:2:1665 -3864:2:1669 -3865:2:1670 -3866:2:1678 -3867:2:1679 -3868:2:1683 -3869:2:1684 -3870:2:1678 -3871:2:1679 -3872:2:1680 -3873:2:1692 -3874:2:1697 -3875:2:1701 -3876:2:1702 -3877:2:1709 -3878:2:1710 -3879:2:1721 -3880:2:1722 -3881:2:1723 -3882:2:1721 -3883:2:1722 -3884:2:1723 -3885:2:1734 -3886:2:1739 -3887:2:1740 -3888:0:4365 -3889:3:3462 -3890:0:4365 -3891:2:1752 -3892:0:4365 -3893:3:3461 -3894:0:4365 -3895:2:1754 -3896:0:4365 -3897:3:3462 -3898:0:4365 -3899:2:1755 -3900:2:1759 -3901:2:1760 -3902:2:1768 -3903:2:1769 -3904:2:1773 -3905:2:1774 -3906:2:1768 -3907:2:1769 -3908:2:1773 -3909:2:1774 -3910:2:1782 -3911:2:1787 -3912:2:1791 -3913:2:1792 -3914:2:1799 -3915:2:1800 -3916:2:1811 -3917:2:1812 -3918:2:1813 -3919:2:1811 -3920:2:1812 -3921:2:1813 -3922:2:1824 -3923:2:1829 -3924:2:1830 -3925:0:4365 -3926:2:1842 -3927:0:4365 -3928:3:3461 -3929:0:4365 -3930:2:1844 -3931:0:4365 -3932:3:3462 -3933:0:4365 -3934:2:1845 -3935:2:1849 -3936:2:1850 -3937:2:1858 -3938:2:1859 -3939:2:1863 -3940:2:1864 -3941:2:1858 -3942:2:1859 -3943:2:1863 -3944:2:1864 -3945:2:1872 -3946:2:1877 -3947:2:1881 -3948:2:1882 -3949:2:1889 -3950:2:1890 -3951:2:1901 -3952:2:1902 -3953:2:1903 -3954:2:1901 -3955:2:1902 -3956:2:1903 -3957:2:1914 -3958:2:1919 -3959:2:1920 -3960:0:4365 -3961:2:1932 -3962:0:4365 -3963:3:3461 -3964:0:4365 -3965:2:1934 -3966:0:4365 -3967:3:3462 -3968:0:4365 -3969:2:1935 -3970:0:4365 -3971:2:1936 -3972:0:4365 -3973:2:2129 -3974:0:4365 -3975:2:2130 -3976:0:4365 -3977:2:2134 -3978:0:4365 -3979:3:3461 -3980:0:4365 -3981:2:2136 -3982:0:4365 -3983:3:3462 -3984:0:4365 -3985:2:2137 -3986:2:2141 -3987:2:2142 -3988:2:2150 -3989:2:2151 -3990:2:2155 -3991:2:2156 -3992:2:2150 -3993:2:2151 -3994:2:2155 -3995:2:2156 -3996:2:2164 -3997:2:2169 -3998:2:2173 -3999:2:2174 -4000:2:2181 -4001:2:2182 -4002:2:2193 -4003:2:2194 -4004:2:2195 -4005:2:2193 -4006:2:2194 -4007:2:2195 -4008:2:2206 -4009:2:2211 -4010:2:2212 -4011:0:4365 -4012:2:2224 -4013:0:4365 -4014:3:3461 -4015:0:4365 -4016:2:2226 -4017:0:4365 -4018:3:3462 -4019:0:4365 -4020:2:1936 -4021:0:4365 -4022:2:2129 -4023:0:4365 -4024:2:2130 -4025:0:4365 -4026:2:2134 -4027:0:4365 -4028:3:3461 -4029:0:4365 -4030:2:2136 -4031:0:4365 -4032:3:3462 -4033:0:4365 -4034:2:2137 -4035:2:2141 -4036:2:2142 -4037:2:2150 -4038:2:2151 -4039:2:2155 -4040:2:2156 -4041:2:2150 -4042:2:2151 -4043:2:2152 -4044:2:2164 -4045:2:2169 -4046:2:2173 -4047:2:2174 -4048:2:2181 -4049:2:2182 -4050:2:2193 -4051:2:2194 -4052:2:2195 -4053:2:2193 -4054:2:2194 -4055:2:2195 -4056:2:2206 -4057:2:2211 -4058:2:2212 -4059:0:4365 -4060:2:2224 -4061:0:4365 -4062:3:3461 -4063:0:4365 -4064:2:2226 -4065:0:4365 -4066:3:3462 -4067:0:4365 -4068:2:2230 -4069:0:4365 -4070:3:3461 -4071:0:4365 -4072:2:2235 -4073:2:2239 -4074:2:2240 -4075:2:2248 -4076:2:2249 -4077:2:2253 -4078:2:2254 -4079:2:2248 -4080:2:2249 -4081:2:2250 -4082:2:2262 -4083:2:2267 -4084:2:2271 -4085:2:2272 -4086:2:2279 -4087:2:2280 -4088:2:2291 -4089:2:2292 -4090:2:2293 -4091:2:2291 -4092:2:2292 -4093:2:2293 -4094:2:2304 -4095:2:2309 -4096:2:2310 -4097:0:4365 -4098:3:3462 -4099:0:4365 -4100:2:2322 -4101:0:4365 -4102:2:1169 -4103:0:4365 -4104:3:3461 -4105:0:4365 -4106:2:1170 -4107:0:4365 -4108:3:3462 -4109:0:4365 -4110:3:3463 -4111:0:4365 -4112:3:3469 -4113:0:4365 -4114:3:3470 -4115:3:3474 -4116:3:3475 -4117:3:3483 -4118:3:3484 -4119:3:3488 -4120:3:3489 -4121:3:3483 -4122:3:3484 -4123:3:3488 -4124:3:3489 -4125:3:3497 -4126:3:3502 -4127:3:3506 -4128:3:3507 -4129:3:3514 -4130:3:3515 -4131:3:3526 -4132:3:3527 -4133:3:3528 -4134:3:3526 -4135:3:3527 -4136:3:3528 -4137:3:3539 -4138:3:3544 -4139:3:3545 -4140:0:4365 -4141:3:3557 -4142:0:4365 -4143:3:3558 -4144:0:4365 -4145:2:1173 -4146:0:4365 -4147:3:3559 -4148:0:4365 -4149:2:1179 -4150:0:4365 -4151:2:1180 -4152:0:4365 -4153:3:3558 -4154:0:4365 -4155:2:1181 -4156:2:1185 -4157:2:1186 -4158:2:1194 -4159:2:1195 -4160:2:1199 -4161:2:1200 -4162:2:1194 -4163:2:1195 -4164:2:1199 -4165:2:1200 -4166:2:1208 -4167:2:1213 -4168:2:1217 -4169:2:1218 -4170:2:1225 -4171:2:1226 -4172:2:1237 -4173:2:1238 -4174:2:1239 -4175:2:1237 -4176:2:1238 -4177:2:1239 -4178:2:1250 -4179:2:1255 -4180:2:1256 -4181:0:4365 -4182:3:3559 -4183:0:4365 -4184:2:1268 -4185:0:4365 -4186:3:3558 -4187:0:4365 -4188:2:1270 -4189:0:4365 -4190:3:3559 -4191:0:4365 -4192:2:1271 -4193:2:1275 -4194:2:1276 -4195:2:1284 -4196:2:1285 -4197:2:1289 -4198:2:1290 -4199:2:1284 -4200:2:1285 -4201:2:1289 -4202:2:1290 -4203:2:1298 -4204:2:1303 -4205:2:1307 -4206:2:1308 -4207:2:1315 -4208:2:1316 -4209:2:1327 -4210:2:1328 -4211:2:1329 -4212:2:1327 -4213:2:1328 -4214:2:1329 -4215:2:1340 -4216:2:1345 -4217:2:1346 -4218:0:4365 -4219:2:1358 -4220:0:4365 -4221:2:1360 -4222:0:4365 -4223:3:3558 -4224:0:4365 -4225:2:1361 -4226:0:4365 -4227:3:3559 -4228:0:4365 -4229:2:1362 -4230:2:1366 -4231:2:1367 -4232:2:1375 -4233:2:1376 -4234:2:1380 -4235:2:1381 -4236:2:1375 -4237:2:1376 -4238:2:1380 -4239:2:1381 -4240:2:1389 -4241:2:1394 -4242:2:1398 -4243:2:1399 -4244:2:1406 -4245:2:1407 -4246:2:1418 -4247:2:1419 -4248:2:1420 -4249:2:1418 -4250:2:1419 -4251:2:1420 -4252:2:1431 -4253:2:1436 -4254:2:1437 -4255:0:4365 -4256:2:1449 -4257:0:4365 -4258:3:3558 -4259:0:4365 -4260:2:1451 -4261:0:4365 -4262:3:3559 -4263:0:4365 -4264:2:1652 -4265:0:4365 -4266:2:1653 -4267:0:4365 -4268:2:1657 -4269:0:4365 -4270:2:1180 -4271:0:4365 -4272:3:3558 -4273:0:4365 -4274:2:1181 -4275:2:1185 -4276:2:1186 -4277:2:1194 -4278:2:1195 -4279:2:1199 -4280:2:1200 -4281:2:1194 -4282:2:1195 -4283:2:1196 -4284:2:1208 -4285:2:1213 -4286:2:1217 -4287:2:1218 -4288:2:1225 -4289:2:1226 -4290:2:1237 -4291:2:1238 -4292:2:1239 -4293:2:1237 -4294:2:1238 -4295:2:1239 -4296:2:1250 -4297:2:1255 -4298:2:1256 -4299:0:4365 -4300:3:3559 -4301:0:4365 -4302:2:1268 -4303:0:4365 -4304:3:3558 -4305:0:4365 -4306:2:1270 -4307:0:4365 -4308:3:3559 -4309:0:4365 -4310:2:1271 -4311:2:1275 -4312:2:1276 -4313:2:1284 -4314:2:1285 -4315:2:1289 -4316:2:1290 -4317:2:1284 -4318:2:1285 -4319:2:1289 -4320:2:1290 -4321:2:1298 -4322:2:1303 -4323:2:1307 -4324:2:1308 -4325:2:1315 -4326:2:1316 -4327:2:1327 -4328:2:1328 -4329:2:1329 -4330:2:1327 -4331:2:1328 -4332:2:1329 -4333:2:1340 -4334:2:1345 -4335:2:1346 -4336:0:4365 -4337:2:1358 -4338:0:4365 -4339:2:1454 -4340:0:4365 -4341:3:3558 -4342:0:4365 -4343:2:1455 -4344:0:4365 -4345:3:3559 -4346:0:4365 -4347:2:1652 -4348:0:4365 -4349:2:1653 -4350:0:4365 -4351:2:1657 -4352:0:4365 -4353:2:1660 -4354:0:4365 -4355:3:3558 -4356:0:4365 -4357:2:1665 -4358:2:1669 -4359:2:1670 -4360:2:1678 -4361:2:1679 -4362:2:1683 -4363:2:1684 -4364:2:1678 -4365:2:1679 -4366:2:1680 -4367:2:1692 -4368:2:1697 -4369:2:1701 -4370:2:1702 -4371:2:1709 -4372:2:1710 -4373:2:1721 -4374:2:1722 -4375:2:1723 -4376:2:1721 -4377:2:1722 -4378:2:1723 -4379:2:1734 -4380:2:1739 -4381:2:1740 -4382:0:4365 -4383:3:3559 -4384:0:4365 -4385:2:1752 -4386:0:4365 -4387:3:3558 -4388:0:4365 -4389:2:1754 -4390:0:4365 -4391:3:3559 -4392:0:4365 -4393:2:1755 -4394:2:1759 -4395:2:1760 -4396:2:1768 -4397:2:1769 -4398:2:1773 -4399:2:1774 -4400:2:1768 -4401:2:1769 -4402:2:1773 -4403:2:1774 -4404:2:1782 -4405:2:1787 -4406:2:1791 -4407:2:1792 -4408:2:1799 -4409:2:1800 -4410:2:1811 -4411:2:1812 -4412:2:1813 -4413:2:1811 -4414:2:1812 -4415:2:1813 -4416:2:1824 -4417:2:1829 -4418:2:1830 -4419:0:4365 -4420:2:1842 -4421:0:4365 -4422:3:3558 -4423:0:4365 -4424:2:1844 -4425:0:4365 -4426:3:3559 -4427:0:4365 -4428:2:1845 -4429:2:1849 -4430:2:1850 -4431:2:1858 -4432:2:1859 -4433:2:1863 -4434:2:1864 -4435:2:1858 -4436:2:1859 -4437:2:1863 -4438:2:1864 -4439:2:1872 -4440:2:1877 -4441:2:1881 -4442:2:1882 -4443:2:1889 -4444:2:1890 -4445:2:1901 -4446:2:1902 -4447:2:1903 -4448:2:1901 -4449:2:1902 -4450:2:1903 -4451:2:1914 -4452:2:1919 -4453:2:1920 -4454:0:4365 -4455:2:1932 -4456:0:4365 -4457:3:3558 -4458:0:4365 -4459:2:1934 -4460:0:4365 -4461:3:3559 -4462:0:4365 -4463:2:1935 -4464:0:4365 -4465:2:1936 -4466:0:4365 -4467:2:2129 -4468:0:4365 -4469:2:2130 -4470:0:4365 -4471:2:2134 -4472:0:4365 -4473:3:3558 -4474:0:4365 -4475:2:2136 -4476:0:4365 -4477:3:3559 -4478:0:4365 -4479:2:2137 -4480:2:2141 -4481:2:2142 -4482:2:2150 -4483:2:2151 -4484:2:2155 -4485:2:2156 -4486:2:2150 -4487:2:2151 -4488:2:2155 -4489:2:2156 -4490:2:2164 -4491:2:2169 -4492:2:2173 -4493:2:2174 -4494:2:2181 -4495:2:2182 -4496:2:2193 -4497:2:2194 -4498:2:2195 -4499:2:2193 -4500:2:2194 -4501:2:2195 -4502:2:2206 -4503:2:2211 -4504:2:2212 -4505:0:4365 -4506:2:2224 -4507:0:4365 -4508:3:3558 -4509:0:4365 -4510:2:2226 -4511:0:4365 -4512:3:3559 -4513:0:4365 -4514:2:1936 -4515:0:4365 -4516:2:2129 -4517:0:4365 -4518:2:2130 -4519:0:4365 -4520:2:2134 -4521:0:4365 -4522:3:3558 -4523:0:4365 -4524:2:2136 -4525:0:4365 -4526:3:3559 -4527:0:4365 -4528:2:2137 -4529:2:2141 -4530:2:2142 -4531:2:2150 -4532:2:2151 -4533:2:2155 -4534:2:2156 -4535:2:2150 -4536:2:2151 -4537:2:2152 -4538:2:2164 -4539:2:2169 -4540:2:2173 -4541:2:2174 -4542:2:2181 -4543:2:2182 -4544:2:2193 -4545:2:2194 -4546:2:2195 -4547:2:2193 -4548:2:2194 -4549:2:2195 -4550:2:2206 -4551:2:2211 -4552:2:2212 -4553:0:4365 -4554:2:2224 -4555:0:4365 -4556:3:3558 -4557:0:4365 -4558:2:2226 -4559:0:4365 -4560:3:3559 -4561:0:4365 -4562:2:2230 -4563:0:4365 -4564:3:3558 -4565:0:4365 -4566:2:2235 -4567:2:2239 -4568:2:2240 -4569:2:2248 -4570:2:2249 -4571:2:2253 -4572:2:2254 -4573:2:2248 -4574:2:2249 -4575:2:2250 -4576:2:2262 -4577:2:2267 -4578:2:2271 -4579:2:2272 -4580:2:2279 -4581:2:2280 -4582:2:2291 -4583:2:2292 -4584:2:2293 -4585:2:2291 -4586:2:2292 -4587:2:2293 -4588:2:2304 -4589:2:2309 -4590:2:2310 -4591:0:4365 -4592:3:3559 -4593:0:4365 -4594:2:2322 -4595:0:4365 -4596:2:1169 -4597:0:4365 -4598:3:3558 -4599:0:4365 -4600:2:1170 -4601:0:4365 -4602:3:3559 -4603:0:4365 -4604:3:3560 -4605:0:4365 -4606:3:3566 -4607:0:4365 -4608:3:3569 -4609:3:3570 -4610:3:3582 -4611:3:3583 -4612:3:3587 -4613:3:3588 -4614:3:3582 -4615:3:3583 -4616:3:3587 -4617:3:3588 -4618:3:3596 -4619:3:3601 -4620:3:3605 -4621:3:3606 -4622:3:3613 -4623:3:3614 -4624:3:3625 -4625:3:3626 -4626:3:3627 -4627:3:3625 -4628:3:3626 -4629:3:3627 -4630:3:3638 -4631:3:3643 -4632:3:3644 -4633:0:4365 -4634:3:3656 -4635:0:4365 -4636:3:3657 -4637:0:4365 -4638:2:1173 -4639:0:4365 -4640:3:3658 -4641:0:4365 -4642:2:1179 -4643:0:4365 -4644:2:1180 -4645:0:4365 -4646:3:3657 -4647:0:4365 -4648:2:1181 -4649:2:1185 -4650:2:1186 -4651:2:1194 -4652:2:1195 -4653:2:1199 -4654:2:1200 -4655:2:1194 -4656:2:1195 -4657:2:1199 -4658:2:1200 -4659:2:1208 -4660:2:1213 -4661:2:1217 -4662:2:1218 -4663:2:1225 -4664:2:1226 -4665:2:1237 -4666:2:1238 -4667:2:1239 -4668:2:1237 -4669:2:1238 -4670:2:1239 -4671:2:1250 -4672:2:1255 -4673:2:1256 -4674:0:4365 -4675:3:3658 -4676:0:4365 -4677:2:1268 -4678:0:4365 -4679:3:3657 -4680:0:4365 -4681:2:1270 -4682:0:4365 -4683:3:3658 -4684:0:4365 -4685:2:1271 -4686:2:1275 -4687:2:1276 -4688:2:1284 -4689:2:1285 -4690:2:1289 -4691:2:1290 -4692:2:1284 -4693:2:1285 -4694:2:1289 -4695:2:1290 -4696:2:1298 -4697:2:1303 -4698:2:1307 -4699:2:1308 -4700:2:1315 -4701:2:1316 -4702:2:1327 -4703:2:1328 -4704:2:1329 -4705:2:1327 -4706:2:1328 -4707:2:1329 -4708:2:1340 -4709:2:1345 -4710:2:1346 -4711:0:4365 -4712:2:1358 -4713:0:4365 -4714:2:1360 -4715:0:4365 -4716:3:3657 -4717:0:4365 -4718:2:1361 -4719:0:4365 -4720:3:3658 -4721:0:4365 -4722:2:1362 -4723:2:1366 -4724:2:1367 -4725:2:1375 -4726:2:1376 -4727:2:1380 -4728:2:1381 -4729:2:1375 -4730:2:1376 -4731:2:1380 -4732:2:1381 -4733:2:1389 -4734:2:1394 -4735:2:1398 -4736:2:1399 -4737:2:1406 -4738:2:1407 -4739:2:1418 -4740:2:1419 -4741:2:1420 -4742:2:1418 -4743:2:1419 -4744:2:1420 -4745:2:1431 -4746:2:1436 -4747:2:1437 -4748:0:4365 -4749:2:1449 -4750:0:4365 -4751:3:3657 -4752:0:4365 -4753:2:1451 -4754:0:4365 -4755:3:3658 -4756:0:4365 -4757:2:1652 -4758:0:4365 -4759:2:1653 -4760:0:4365 -4761:2:1657 -4762:0:4365 -4763:2:1180 -4764:0:4365 -4765:3:3657 -4766:0:4365 -4767:2:1181 -4768:2:1185 -4769:2:1186 -4770:2:1194 -4771:2:1195 -4772:2:1199 -4773:2:1200 -4774:2:1194 -4775:2:1195 -4776:2:1196 -4777:2:1208 -4778:2:1213 -4779:2:1217 -4780:2:1218 -4781:2:1225 -4782:2:1226 -4783:2:1237 -4784:2:1238 -4785:2:1239 -4786:2:1237 -4787:2:1238 -4788:2:1239 -4789:2:1250 -4790:2:1255 -4791:2:1256 -4792:0:4365 -4793:3:3658 -4794:0:4365 -4795:2:1268 -4796:0:4365 -4797:3:3657 -4798:0:4365 -4799:2:1270 -4800:0:4365 -4801:3:3658 -4802:0:4365 -4803:2:1271 -4804:2:1275 -4805:2:1276 -4806:2:1284 -4807:2:1285 -4808:2:1289 -4809:2:1290 -4810:2:1284 -4811:2:1285 -4812:2:1289 -4813:2:1290 -4814:2:1298 -4815:2:1303 -4816:2:1307 -4817:2:1308 -4818:2:1315 -4819:2:1316 -4820:2:1327 -4821:2:1328 -4822:2:1329 -4823:2:1327 -4824:2:1328 -4825:2:1329 -4826:2:1340 -4827:2:1345 -4828:2:1346 -4829:0:4365 -4830:2:1358 -4831:0:4365 -4832:2:1454 -4833:0:4365 -4834:3:3657 -4835:0:4365 -4836:2:1455 -4837:0:4365 -4838:3:3658 -4839:0:4365 -4840:2:1652 -4841:0:4365 -4842:2:1653 -4843:0:4365 -4844:2:1657 -4845:0:4365 -4846:2:1660 -4847:0:4365 -4848:3:3657 -4849:0:4365 -4850:2:1665 -4851:2:1669 -4852:2:1670 -4853:2:1678 -4854:2:1679 -4855:2:1683 -4856:2:1684 -4857:2:1678 -4858:2:1679 -4859:2:1680 -4860:2:1692 -4861:2:1697 -4862:2:1701 -4863:2:1702 -4864:2:1709 -4865:2:1710 -4866:2:1721 -4867:2:1722 -4868:2:1723 -4869:2:1721 -4870:2:1722 -4871:2:1723 -4872:2:1734 -4873:2:1739 -4874:2:1740 -4875:0:4365 -4876:3:3658 -4877:0:4365 -4878:2:1752 -4879:0:4365 -4880:3:3657 -4881:0:4365 -4882:2:1754 -4883:0:4365 -4884:3:3658 -4885:0:4365 -4886:2:1755 -4887:2:1759 -4888:2:1760 -4889:2:1768 -4890:2:1769 -4891:2:1773 -4892:2:1774 -4893:2:1768 -4894:2:1769 -4895:2:1773 -4896:2:1774 -4897:2:1782 -4898:2:1787 -4899:2:1791 -4900:2:1792 -4901:2:1799 -4902:2:1800 -4903:2:1811 -4904:2:1812 -4905:2:1813 -4906:2:1811 -4907:2:1812 -4908:2:1813 -4909:2:1824 -4910:2:1829 -4911:2:1830 -4912:0:4365 -4913:2:1842 -4914:0:4365 -4915:3:3657 -4916:0:4365 -4917:2:1844 -4918:0:4365 -4919:3:3658 -4920:0:4365 -4921:2:1845 -4922:2:1849 -4923:2:1850 -4924:2:1858 -4925:2:1859 -4926:2:1863 -4927:2:1864 -4928:2:1858 -4929:2:1859 -4930:2:1863 -4931:2:1864 -4932:2:1872 -4933:2:1877 -4934:2:1881 -4935:2:1882 -4936:2:1889 -4937:2:1890 -4938:2:1901 -4939:2:1902 -4940:2:1903 -4941:2:1901 -4942:2:1902 -4943:2:1903 -4944:2:1914 -4945:2:1919 -4946:2:1920 -4947:0:4365 -4948:2:1932 -4949:0:4365 -4950:3:3657 -4951:0:4365 -4952:2:1934 -4953:0:4365 -4954:3:3658 -4955:0:4365 -4956:2:1935 -4957:0:4365 -4958:2:1936 -4959:0:4365 -4960:2:2129 -4961:0:4365 -4962:2:2130 -4963:0:4365 -4964:2:2134 -4965:0:4365 -4966:3:3657 -4967:0:4365 -4968:2:2136 -4969:0:4365 -4970:3:3658 -4971:0:4365 -4972:2:2137 -4973:2:2141 -4974:2:2142 -4975:2:2150 -4976:2:2151 -4977:2:2155 -4978:2:2156 -4979:2:2150 -4980:2:2151 -4981:2:2155 -4982:2:2156 -4983:2:2164 -4984:2:2169 -4985:2:2173 -4986:2:2174 -4987:2:2181 -4988:2:2182 -4989:2:2193 -4990:2:2194 -4991:2:2195 -4992:2:2193 -4993:2:2194 -4994:2:2195 -4995:2:2206 -4996:2:2211 -4997:2:2212 -4998:0:4365 -4999:2:2224 -5000:0:4365 -5001:3:3657 -5002:0:4365 -5003:2:2226 -5004:0:4365 -5005:3:3658 -5006:0:4365 -5007:2:1936 -5008:0:4365 -5009:2:2129 -5010:0:4365 -5011:2:2130 -5012:0:4365 -5013:2:2134 -5014:0:4365 -5015:3:3657 -5016:0:4365 -5017:2:2136 -5018:0:4365 -5019:3:3658 -5020:0:4365 -5021:2:2137 -5022:2:2141 -5023:2:2142 -5024:2:2150 -5025:2:2151 -5026:2:2155 -5027:2:2156 -5028:2:2150 -5029:2:2151 -5030:2:2152 -5031:2:2164 -5032:2:2169 -5033:2:2173 -5034:2:2174 -5035:2:2181 -5036:2:2182 -5037:2:2193 -5038:2:2194 -5039:2:2195 -5040:2:2193 -5041:2:2194 -5042:2:2195 -5043:2:2206 -5044:2:2211 -5045:2:2212 -5046:0:4365 -5047:2:2224 -5048:0:4365 -5049:3:3657 -5050:0:4365 -5051:2:2226 -5052:0:4365 -5053:3:3658 -5054:0:4365 -5055:2:2230 -5056:0:4365 -5057:3:3657 -5058:0:4365 -5059:2:2235 -5060:2:2239 -5061:2:2240 -5062:2:2248 -5063:2:2249 -5064:2:2253 -5065:2:2254 -5066:2:2248 -5067:2:2249 -5068:2:2250 -5069:2:2262 -5070:2:2267 -5071:2:2271 -5072:2:2272 -5073:2:2279 -5074:2:2280 -5075:2:2291 -5076:2:2292 -5077:2:2293 -5078:2:2291 -5079:2:2292 -5080:2:2293 -5081:2:2304 -5082:2:2309 -5083:2:2310 -5084:0:4365 -5085:3:3658 -5086:0:4365 -5087:2:2322 -5088:0:4365 -5089:2:1169 -5090:0:4365 -5091:3:3657 -5092:0:4365 -5093:2:1170 -5094:0:4365 -5095:3:3658 -5096:0:4365 -5097:3:3659 -5098:0:4365 -5099:3:3665 -5100:0:4365 -5101:3:3666 -5102:0:4365 -5103:3:3667 -5104:0:4365 -5105:3:3668 -5106:0:4365 -5107:3:3669 -5108:3:3673 -5109:3:3674 -5110:3:3682 -5111:3:3683 -5112:3:3687 -5113:3:3688 -5114:3:3682 -5115:3:3683 -5116:3:3687 -5117:3:3688 -5118:3:3696 -5119:3:3701 -5120:3:3705 -5121:3:3706 -5122:3:3713 -5123:3:3714 -5124:3:3725 -5125:3:3726 -5126:3:3727 -5127:3:3725 -5128:3:3726 -5129:3:3727 -5130:3:3738 -5131:3:3743 -5132:3:3744 -5133:0:4365 -5134:3:3756 -5135:0:4365 -5136:3:3757 -5137:0:4365 -5138:2:1173 -5139:0:4365 -5140:3:3758 -5141:0:4365 -5142:2:1179 -5143:0:4365 -5144:2:1180 -5145:0:4365 -5146:3:3757 -5147:0:4365 -5148:2:1181 -5149:2:1185 -5150:2:1186 -5151:2:1194 -5152:2:1195 -5153:2:1199 -5154:2:1200 -5155:2:1194 -5156:2:1195 -5157:2:1199 -5158:2:1200 -5159:2:1208 -5160:2:1213 -5161:2:1217 -5162:2:1218 -5163:2:1225 -5164:2:1226 -5165:2:1237 -5166:2:1238 -5167:2:1239 -5168:2:1237 -5169:2:1238 -5170:2:1239 -5171:2:1250 -5172:2:1255 -5173:2:1256 -5174:0:4365 -5175:3:3758 -5176:0:4365 -5177:2:1268 -5178:0:4365 -5179:3:3757 -5180:0:4365 -5181:2:1270 -5182:0:4365 -5183:3:3758 -5184:0:4365 -5185:2:1271 -5186:2:1275 -5187:2:1276 -5188:2:1284 -5189:2:1285 -5190:2:1289 -5191:2:1290 -5192:2:1284 -5193:2:1285 -5194:2:1289 -5195:2:1290 -5196:2:1298 -5197:2:1303 -5198:2:1307 -5199:2:1308 -5200:2:1315 -5201:2:1316 -5202:2:1327 -5203:2:1328 -5204:2:1329 -5205:2:1327 -5206:2:1328 -5207:2:1329 -5208:2:1340 -5209:2:1345 -5210:2:1346 -5211:0:4365 -5212:2:1358 -5213:0:4365 -5214:2:1360 -5215:0:4365 -5216:3:3757 -5217:0:4365 -5218:2:1361 -5219:0:4365 -5220:3:3758 -5221:0:4365 -5222:2:1362 -5223:2:1366 -5224:2:1367 -5225:2:1375 -5226:2:1376 -5227:2:1380 -5228:2:1381 -5229:2:1375 -5230:2:1376 -5231:2:1380 -5232:2:1381 -5233:2:1389 -5234:2:1394 -5235:2:1398 -5236:2:1399 -5237:2:1406 -5238:2:1407 -5239:2:1418 -5240:2:1419 -5241:2:1420 -5242:2:1418 -5243:2:1419 -5244:2:1420 -5245:2:1431 -5246:2:1436 -5247:2:1437 -5248:0:4365 -5249:2:1449 -5250:0:4365 -5251:3:3757 -5252:0:4365 -5253:2:1451 -5254:0:4365 -5255:3:3758 -5256:0:4365 -5257:2:1652 -5258:0:4365 -5259:2:1653 -5260:0:4365 -5261:2:1657 -5262:0:4365 -5263:2:1180 -5264:0:4365 -5265:3:3757 -5266:0:4365 -5267:2:1181 -5268:2:1185 -5269:2:1186 -5270:2:1194 -5271:2:1195 -5272:2:1199 -5273:2:1200 -5274:2:1194 -5275:2:1195 -5276:2:1196 -5277:2:1208 -5278:2:1213 -5279:2:1217 -5280:2:1218 -5281:2:1225 -5282:2:1226 -5283:2:1237 -5284:2:1238 -5285:2:1239 -5286:2:1237 -5287:2:1238 -5288:2:1239 -5289:2:1250 -5290:2:1255 -5291:2:1256 -5292:0:4365 -5293:3:3758 -5294:0:4365 -5295:2:1268 -5296:0:4365 -5297:3:3757 -5298:0:4365 -5299:2:1270 -5300:0:4365 -5301:3:3758 -5302:0:4365 -5303:2:1271 -5304:2:1275 -5305:2:1276 -5306:2:1284 -5307:2:1285 -5308:2:1289 -5309:2:1290 -5310:2:1284 -5311:2:1285 -5312:2:1289 -5313:2:1290 -5314:2:1298 -5315:2:1303 -5316:2:1307 -5317:2:1308 -5318:2:1315 -5319:2:1316 -5320:2:1327 -5321:2:1328 -5322:2:1329 -5323:2:1327 -5324:2:1328 -5325:2:1329 -5326:2:1340 -5327:2:1345 -5328:2:1346 -5329:0:4365 -5330:2:1358 -5331:0:4365 -5332:2:1454 -5333:0:4365 -5334:3:3757 -5335:0:4365 -5336:2:1455 -5337:0:4365 -5338:3:3758 -5339:0:4365 -5340:2:1652 -5341:0:4365 -5342:2:1653 -5343:0:4365 -5344:2:1657 -5345:0:4365 -5346:2:1660 -5347:0:4365 -5348:3:3757 -5349:0:4365 -5350:2:1665 -5351:2:1669 -5352:2:1670 -5353:2:1678 -5354:2:1679 -5355:2:1683 -5356:2:1684 -5357:2:1678 -5358:2:1679 -5359:2:1680 -5360:2:1692 -5361:2:1697 -5362:2:1701 -5363:2:1702 -5364:2:1709 -5365:2:1710 -5366:2:1721 -5367:2:1722 -5368:2:1723 -5369:2:1721 -5370:2:1722 -5371:2:1723 -5372:2:1734 -5373:2:1739 -5374:2:1740 -5375:0:4365 -5376:3:3758 -5377:0:4365 -5378:2:1752 -5379:0:4365 -5380:3:3757 -5381:0:4365 -5382:2:1754 -5383:0:4365 -5384:3:3758 -5385:0:4365 -5386:2:1755 -5387:2:1759 -5388:2:1760 -5389:2:1768 -5390:2:1769 -5391:2:1773 -5392:2:1774 -5393:2:1768 -5394:2:1769 -5395:2:1773 -5396:2:1774 -5397:2:1782 -5398:2:1787 -5399:2:1791 -5400:2:1792 -5401:2:1799 -5402:2:1800 -5403:2:1811 -5404:2:1812 -5405:2:1813 -5406:2:1811 -5407:2:1812 -5408:2:1813 -5409:2:1824 -5410:2:1829 -5411:2:1830 -5412:0:4365 -5413:2:1842 -5414:0:4365 -5415:3:3757 -5416:0:4365 -5417:2:1844 -5418:0:4365 -5419:3:3758 -5420:0:4365 -5421:2:1845 -5422:2:1849 -5423:2:1850 -5424:2:1858 -5425:2:1859 -5426:2:1863 -5427:2:1864 -5428:2:1858 -5429:2:1859 -5430:2:1863 -5431:2:1864 -5432:2:1872 -5433:2:1877 -5434:2:1881 -5435:2:1882 -5436:2:1889 -5437:2:1890 -5438:2:1901 -5439:2:1902 -5440:2:1903 -5441:2:1901 -5442:2:1902 -5443:2:1903 -5444:2:1914 -5445:2:1919 -5446:2:1920 -5447:0:4365 -5448:2:1932 -5449:0:4365 -5450:3:3757 -5451:0:4365 -5452:2:1934 -5453:0:4365 -5454:3:3758 -5455:0:4365 -5456:2:1935 -5457:0:4365 -5458:2:1936 -5459:0:4365 -5460:2:2129 -5461:0:4365 -5462:2:2130 -5463:0:4365 -5464:2:2134 -5465:0:4365 -5466:3:3757 -5467:0:4365 -5468:2:2136 -5469:0:4365 -5470:3:3758 -5471:0:4365 -5472:2:2137 -5473:2:2141 -5474:2:2142 -5475:2:2150 -5476:2:2151 -5477:2:2155 -5478:2:2156 -5479:2:2150 -5480:2:2151 -5481:2:2155 -5482:2:2156 -5483:2:2164 -5484:2:2169 -5485:2:2173 -5486:2:2174 -5487:2:2181 -5488:2:2182 -5489:2:2193 -5490:2:2194 -5491:2:2195 -5492:2:2193 -5493:2:2194 -5494:2:2195 -5495:2:2206 -5496:2:2211 -5497:2:2212 -5498:0:4365 -5499:2:2224 -5500:0:4365 -5501:3:3757 -5502:0:4365 -5503:2:2226 -5504:0:4365 -5505:3:3758 -5506:0:4365 -5507:2:1936 -5508:0:4365 -5509:2:2129 -5510:0:4365 -5511:2:2130 -5512:0:4365 -5513:2:2134 -5514:0:4365 -5515:3:3757 -5516:0:4365 -5517:2:2136 -5518:0:4365 -5519:3:3758 -5520:0:4365 -5521:2:2137 -5522:2:2141 -5523:2:2142 -5524:2:2150 -5525:2:2151 -5526:2:2155 -5527:2:2156 -5528:2:2150 -5529:2:2151 -5530:2:2152 -5531:2:2164 -5532:2:2169 -5533:2:2173 -5534:2:2174 -5535:2:2181 -5536:2:2182 -5537:2:2193 -5538:2:2194 -5539:2:2195 -5540:2:2193 -5541:2:2194 -5542:2:2195 -5543:2:2206 -5544:2:2211 -5545:2:2212 -5546:0:4365 -5547:2:2224 -5548:0:4365 -5549:3:3757 -5550:0:4365 -5551:2:2226 -5552:0:4365 -5553:3:3758 -5554:0:4365 -5555:2:2230 -5556:0:4365 -5557:3:3757 -5558:0:4365 -5559:2:2235 -5560:2:2239 -5561:2:2240 -5562:2:2248 -5563:2:2249 -5564:2:2253 -5565:2:2254 -5566:2:2248 -5567:2:2249 -5568:2:2250 -5569:2:2262 -5570:2:2267 -5571:2:2271 -5572:2:2272 -5573:2:2279 -5574:2:2280 -5575:2:2291 -5576:2:2292 -5577:2:2293 -5578:2:2291 -5579:2:2292 -5580:2:2293 -5581:2:2304 -5582:2:2309 -5583:2:2310 -5584:0:4365 -5585:3:3758 -5586:0:4365 -5587:2:2322 -5588:0:4365 -5589:2:1169 -5590:0:4365 -5591:3:3757 -5592:0:4365 -5593:2:1170 -5594:0:4365 -5595:3:3758 -5596:0:4365 -5597:3:3759 -5598:0:4365 -5599:3:3972 -5600:0:4365 -5601:3:3980 -5602:0:4365 -5603:3:3981 -5604:3:3985 -5605:3:3986 -5606:3:3994 -5607:3:3995 -5608:3:3999 -5609:3:4000 -5610:3:3994 -5611:3:3995 -5612:3:3999 -5613:3:4000 -5614:3:4008 -5615:3:4013 -5616:3:4017 -5617:3:4018 -5618:3:4025 -5619:3:4026 -5620:3:4037 -5621:3:4038 -5622:3:4039 -5623:3:4037 -5624:3:4038 -5625:3:4039 -5626:3:4050 -5627:3:4055 -5628:3:4056 -5629:0:4365 -5630:3:4068 -5631:0:4365 -5632:3:4069 -5633:0:4365 -5634:2:1173 -5635:0:4365 -5636:3:4070 -5637:0:4365 -5638:2:1179 -5639:0:4365 -5640:2:1180 -5641:0:4365 -5642:3:4069 -5643:0:4365 -5644:2:1181 -5645:2:1185 -5646:2:1186 -5647:2:1194 -5648:2:1195 -5649:2:1199 -5650:2:1200 -5651:2:1194 -5652:2:1195 -5653:2:1199 -5654:2:1200 -5655:2:1208 -5656:2:1213 -5657:2:1217 -5658:2:1218 -5659:2:1225 -5660:2:1226 -5661:2:1237 -5662:2:1238 -5663:2:1239 -5664:2:1237 -5665:2:1238 -5666:2:1239 -5667:2:1250 -5668:2:1255 -5669:2:1256 -5670:0:4365 -5671:3:4070 -5672:0:4365 -5673:2:1268 -5674:0:4365 -5675:3:4069 -5676:0:4365 -5677:2:1270 -5678:0:4365 -5679:3:4070 -5680:0:4365 -5681:2:1271 -5682:2:1275 -5683:2:1276 -5684:2:1284 -5685:2:1285 -5686:2:1289 -5687:2:1290 -5688:2:1284 -5689:2:1285 -5690:2:1289 -5691:2:1290 -5692:2:1298 -5693:2:1303 -5694:2:1307 -5695:2:1308 -5696:2:1315 -5697:2:1316 -5698:2:1327 -5699:2:1328 -5700:2:1329 -5701:2:1327 -5702:2:1328 -5703:2:1329 -5704:2:1340 -5705:2:1345 -5706:2:1346 -5707:0:4365 -5708:2:1358 -5709:0:4365 -5710:2:1360 -5711:0:4365 -5712:3:4069 -5713:0:4365 -5714:2:1361 -5715:0:4365 -5716:3:4070 -5717:0:4365 -5718:2:1362 -5719:2:1366 -5720:2:1367 -5721:2:1375 -5722:2:1376 -5723:2:1380 -5724:2:1381 -5725:2:1375 -5726:2:1376 -5727:2:1380 -5728:2:1381 -5729:2:1389 -5730:2:1394 -5731:2:1398 -5732:2:1399 -5733:2:1406 -5734:2:1407 -5735:2:1418 -5736:2:1419 -5737:2:1420 -5738:2:1418 -5739:2:1419 -5740:2:1420 -5741:2:1431 -5742:2:1436 -5743:2:1437 -5744:0:4365 -5745:2:1449 -5746:0:4365 -5747:3:4069 -5748:0:4365 -5749:2:1451 -5750:0:4365 -5751:3:4070 -5752:0:4365 -5753:2:1652 -5754:0:4365 -5755:2:1653 -5756:0:4365 -5757:2:1657 -5758:0:4365 -5759:2:1180 -5760:0:4365 -5761:3:4069 -5762:0:4365 -5763:2:1181 -5764:2:1185 -5765:2:1186 -5766:2:1194 -5767:2:1195 -5768:2:1199 -5769:2:1200 -5770:2:1194 -5771:2:1195 -5772:2:1196 -5773:2:1208 -5774:2:1213 -5775:2:1217 -5776:2:1218 -5777:2:1225 -5778:2:1226 -5779:2:1237 -5780:2:1238 -5781:2:1239 -5782:2:1237 -5783:2:1238 -5784:2:1239 -5785:2:1250 -5786:2:1255 -5787:2:1256 -5788:0:4365 -5789:3:4070 -5790:0:4365 -5791:2:1268 -5792:0:4365 -5793:3:4069 -5794:0:4365 -5795:2:1270 -5796:0:4365 -5797:3:4070 -5798:0:4365 -5799:2:1271 -5800:2:1275 -5801:2:1276 -5802:2:1284 -5803:2:1285 -5804:2:1289 -5805:2:1290 -5806:2:1284 -5807:2:1285 -5808:2:1289 -5809:2:1290 -5810:2:1298 -5811:2:1303 -5812:2:1307 -5813:2:1308 -5814:2:1315 -5815:2:1316 -5816:2:1327 -5817:2:1328 -5818:2:1329 -5819:2:1327 -5820:2:1328 -5821:2:1329 -5822:2:1340 -5823:2:1345 -5824:2:1346 -5825:0:4365 -5826:2:1358 -5827:0:4365 -5828:2:1454 -5829:0:4365 -5830:3:4069 -5831:0:4365 -5832:2:1455 -5833:0:4365 -5834:3:4070 -5835:0:4365 -5836:2:1652 -5837:0:4365 -5838:2:1653 -5839:0:4365 -5840:2:1657 -5841:0:4365 -5842:2:1660 -5843:0:4365 -5844:3:4069 -5845:0:4365 -5846:2:1665 -5847:2:1669 -5848:2:1670 -5849:2:1678 -5850:2:1679 -5851:2:1683 -5852:2:1684 -5853:2:1678 -5854:2:1679 -5855:2:1680 -5856:2:1692 -5857:2:1697 -5858:2:1701 -5859:2:1702 -5860:2:1709 -5861:2:1710 -5862:2:1721 -5863:2:1722 -5864:2:1723 -5865:2:1721 -5866:2:1722 -5867:2:1723 -5868:2:1734 -5869:2:1739 -5870:2:1740 -5871:0:4365 -5872:3:4070 -5873:0:4365 -5874:2:1752 -5875:0:4365 -5876:3:4069 -5877:0:4365 -5878:2:1754 -5879:0:4365 -5880:3:4070 -5881:0:4365 -5882:2:1755 -5883:2:1759 -5884:2:1760 -5885:2:1768 -5886:2:1769 -5887:2:1773 -5888:2:1774 -5889:2:1768 -5890:2:1769 -5891:2:1773 -5892:2:1774 -5893:2:1782 -5894:2:1787 -5895:2:1791 -5896:2:1792 -5897:2:1799 -5898:2:1800 -5899:2:1811 -5900:2:1812 -5901:2:1813 -5902:2:1811 -5903:2:1812 -5904:2:1813 -5905:2:1824 -5906:2:1829 -5907:2:1830 -5908:0:4365 -5909:2:1842 -5910:0:4365 -5911:3:4069 -5912:0:4365 -5913:2:1844 -5914:0:4365 -5915:3:4070 -5916:0:4365 -5917:2:1845 -5918:2:1849 -5919:2:1850 -5920:2:1858 -5921:2:1859 -5922:2:1863 -5923:2:1864 -5924:2:1858 -5925:2:1859 -5926:2:1863 -5927:2:1864 -5928:2:1872 -5929:2:1877 -5930:2:1881 -5931:2:1882 -5932:2:1889 -5933:2:1890 -5934:2:1901 -5935:2:1902 -5936:2:1903 -5937:2:1901 -5938:2:1902 -5939:2:1903 -5940:2:1914 -5941:2:1919 -5942:2:1920 -5943:0:4365 -5944:2:1932 -5945:0:4365 -5946:3:4069 -5947:0:4365 -5948:2:1934 -5949:0:4365 -5950:3:4070 -5951:0:4365 -5952:2:1935 -5953:0:4365 -5954:2:1936 -5955:0:4365 -5956:2:2129 -5957:0:4365 -5958:2:2130 -5959:0:4365 -5960:2:2134 -5961:0:4365 -5962:3:4069 -5963:0:4365 -5964:2:2136 -5965:0:4365 -5966:3:4070 -5967:0:4365 -5968:2:2137 -5969:2:2141 -5970:2:2142 -5971:2:2150 -5972:2:2151 -5973:2:2155 -5974:2:2156 -5975:2:2150 -5976:2:2151 -5977:2:2155 -5978:2:2156 -5979:2:2164 -5980:2:2169 -5981:2:2173 -5982:2:2174 -5983:2:2181 -5984:2:2182 -5985:2:2193 -5986:2:2194 -5987:2:2195 -5988:2:2193 -5989:2:2194 -5990:2:2195 -5991:2:2206 -5992:2:2211 -5993:2:2212 -5994:0:4365 -5995:2:2224 -5996:0:4365 -5997:3:4069 -5998:0:4365 -5999:2:2226 -6000:0:4365 -6001:3:4070 -6002:0:4365 -6003:2:1936 -6004:0:4365 -6005:2:2129 -6006:0:4365 -6007:2:2130 -6008:0:4365 -6009:2:2134 -6010:0:4365 -6011:3:4069 -6012:0:4365 -6013:2:2136 -6014:0:4365 -6015:3:4070 -6016:0:4365 -6017:2:2137 -6018:2:2141 -6019:2:2142 -6020:2:2150 -6021:2:2151 -6022:2:2155 -6023:2:2156 -6024:2:2150 -6025:2:2151 -6026:2:2152 -6027:2:2164 -6028:2:2169 -6029:2:2173 -6030:2:2174 -6031:2:2181 -6032:2:2182 -6033:2:2193 -6034:2:2194 -6035:2:2195 -6036:2:2193 -6037:2:2194 -6038:2:2195 -6039:2:2206 -6040:2:2211 -6041:2:2212 -6042:0:4365 -6043:2:2224 -6044:0:4365 -6045:3:4069 -6046:0:4365 -6047:2:2226 -6048:0:4365 -6049:3:4070 -6050:0:4365 -6051:2:2230 -6052:0:4365 -6053:3:4069 -6054:0:4365 -6055:2:2235 -6056:2:2239 -6057:2:2240 -6058:2:2248 -6059:2:2249 -6060:2:2253 -6061:2:2254 -6062:2:2248 -6063:2:2249 -6064:2:2250 -6065:2:2262 -6066:2:2267 -6067:2:2271 -6068:2:2272 -6069:2:2279 -6070:2:2280 -6071:2:2291 -6072:2:2292 -6073:2:2293 -6074:2:2291 -6075:2:2292 -6076:2:2293 -6077:2:2304 -6078:2:2309 -6079:2:2310 -6080:0:4365 -6081:3:4070 -6082:0:4365 -6083:2:2322 -6084:0:4365 -6085:2:1169 -6086:0:4365 -6087:3:4069 -6088:0:4365 -6089:2:1170 -6090:0:4365 -6091:3:4070 -6092:0:4365 -6093:3:4071 -6094:0:4365 -6095:3:4081 -6096:0:4365 -6097:3:3666 -6098:0:4365 -6099:3:3667 -6100:0:4365 -6101:3:3668 -6102:0:4365 -6103:3:3669 -6104:3:3673 -6105:3:3674 -6106:3:3682 -6107:3:3683 -6108:3:3687 -6109:3:3688 -6110:3:3682 -6111:3:3683 -6112:3:3687 -6113:3:3688 -6114:3:3696 -6115:3:3701 -6116:3:3705 -6117:3:3706 -6118:3:3713 -6119:3:3714 -6120:3:3725 -6121:3:3726 -6122:3:3727 -6123:3:3725 -6124:3:3726 -6125:3:3727 -6126:3:3738 -6127:3:3743 -6128:3:3744 -6129:0:4365 -6130:3:3756 -6131:0:4365 -6132:3:3757 -6133:0:4365 -6134:2:1173 -6135:0:4365 -6136:3:3758 -6137:0:4365 -6138:2:1179 -6139:0:4365 -6140:2:1180 -6141:0:4365 -6142:3:3757 -6143:0:4365 -6144:2:1181 -6145:2:1185 -6146:2:1186 -6147:2:1194 -6148:2:1195 -6149:2:1199 -6150:2:1200 -6151:2:1194 -6152:2:1195 -6153:2:1199 -6154:2:1200 -6155:2:1208 -6156:2:1213 -6157:2:1217 -6158:2:1218 -6159:2:1225 -6160:2:1226 -6161:2:1237 -6162:2:1238 -6163:2:1239 -6164:2:1237 -6165:2:1238 -6166:2:1239 -6167:2:1250 -6168:2:1255 -6169:2:1256 -6170:0:4365 -6171:3:3758 -6172:0:4365 -6173:2:1268 -6174:0:4365 -6175:3:3757 -6176:0:4365 -6177:2:1270 -6178:0:4365 -6179:3:3758 -6180:0:4365 -6181:2:1271 -6182:2:1275 -6183:2:1276 -6184:2:1284 -6185:2:1285 -6186:2:1289 -6187:2:1290 -6188:2:1284 -6189:2:1285 -6190:2:1289 -6191:2:1290 -6192:2:1298 -6193:2:1303 -6194:2:1307 -6195:2:1308 -6196:2:1315 -6197:2:1316 -6198:2:1327 -6199:2:1328 -6200:2:1329 -6201:2:1327 -6202:2:1328 -6203:2:1329 -6204:2:1340 -6205:2:1345 -6206:2:1346 -6207:0:4365 -6208:2:1358 -6209:0:4365 -6210:2:1360 -6211:0:4365 -6212:3:3757 -6213:0:4365 -6214:2:1361 -6215:0:4365 -6216:3:3758 -6217:0:4365 -6218:2:1362 -6219:2:1366 -6220:2:1367 -6221:2:1375 -6222:2:1376 -6223:2:1380 -6224:2:1381 -6225:2:1375 -6226:2:1376 -6227:2:1380 -6228:2:1381 -6229:2:1389 -6230:2:1394 -6231:2:1398 -6232:2:1399 -6233:2:1406 -6234:2:1407 -6235:2:1418 -6236:2:1419 -6237:2:1420 -6238:2:1418 -6239:2:1419 -6240:2:1420 -6241:2:1431 -6242:2:1436 -6243:2:1437 -6244:0:4365 -6245:2:1449 -6246:0:4365 -6247:3:3757 -6248:0:4365 -6249:2:1451 -6250:0:4365 -6251:3:3758 -6252:0:4365 -6253:2:1652 -6254:0:4365 -6255:2:1653 -6256:0:4365 -6257:2:1657 -6258:0:4365 -6259:2:1180 -6260:0:4365 -6261:3:3757 -6262:0:4365 -6263:2:1181 -6264:2:1185 -6265:2:1186 -6266:2:1194 -6267:2:1195 -6268:2:1199 -6269:2:1200 -6270:2:1194 -6271:2:1195 -6272:2:1196 -6273:2:1208 -6274:2:1213 -6275:2:1217 -6276:2:1218 -6277:2:1225 -6278:2:1226 -6279:2:1237 -6280:2:1238 -6281:2:1239 -6282:2:1237 -6283:2:1238 -6284:2:1239 -6285:2:1250 -6286:2:1255 -6287:2:1256 -6288:0:4365 -6289:3:3758 -6290:0:4365 -6291:2:1268 -6292:0:4365 -6293:3:3757 -6294:0:4365 -6295:2:1270 -6296:0:4365 -6297:3:3758 -6298:0:4365 -6299:2:1271 -6300:2:1275 -6301:2:1276 -6302:2:1284 -6303:2:1285 -6304:2:1289 -6305:2:1290 -6306:2:1284 -6307:2:1285 -6308:2:1289 -6309:2:1290 -6310:2:1298 -6311:2:1303 -6312:2:1307 -6313:2:1308 -6314:2:1315 -6315:2:1316 -6316:2:1327 -6317:2:1328 -6318:2:1329 -6319:2:1327 -6320:2:1328 -6321:2:1329 -6322:2:1340 -6323:2:1345 -6324:2:1346 -6325:0:4365 -6326:2:1358 -6327:0:4365 -6328:2:1454 -6329:0:4365 -6330:3:3757 -6331:0:4365 -6332:2:1455 -6333:0:4365 -6334:3:3758 -6335:0:4365 -6336:2:1652 -6337:0:4365 -6338:2:1653 -6339:0:4365 -6340:2:1657 -6341:0:4365 -6342:2:1660 -6343:0:4365 -6344:3:3757 -6345:0:4365 -6346:2:1665 -6347:2:1669 -6348:2:1670 -6349:2:1678 -6350:2:1679 -6351:2:1683 -6352:2:1684 -6353:2:1678 -6354:2:1679 -6355:2:1680 -6356:2:1692 -6357:2:1697 -6358:2:1701 -6359:2:1702 -6360:2:1709 -6361:2:1710 -6362:2:1721 -6363:2:1722 -6364:2:1723 -6365:2:1721 -6366:2:1722 -6367:2:1723 -6368:2:1734 -6369:2:1739 -6370:2:1740 -6371:0:4365 -6372:3:3758 -6373:0:4365 -6374:2:1752 -6375:0:4365 -6376:3:3757 -6377:0:4365 -6378:2:1754 -6379:0:4365 -6380:3:3758 -6381:0:4365 -6382:2:1755 -6383:2:1759 -6384:2:1760 -6385:2:1768 -6386:2:1769 -6387:2:1773 -6388:2:1774 -6389:2:1768 -6390:2:1769 -6391:2:1773 -6392:2:1774 -6393:2:1782 -6394:2:1787 -6395:2:1791 -6396:2:1792 -6397:2:1799 -6398:2:1800 -6399:2:1811 -6400:2:1812 -6401:2:1813 -6402:2:1811 -6403:2:1812 -6404:2:1813 -6405:2:1824 -6406:2:1829 -6407:2:1830 -6408:0:4365 -6409:2:1842 -6410:0:4365 -6411:3:3757 -6412:0:4365 -6413:2:1844 -6414:0:4365 -6415:3:3758 -6416:0:4365 -6417:2:1845 -6418:2:1849 -6419:2:1850 -6420:2:1858 -6421:2:1859 -6422:2:1863 -6423:2:1864 -6424:2:1858 -6425:2:1859 -6426:2:1863 -6427:2:1864 -6428:2:1872 -6429:2:1877 -6430:2:1881 -6431:2:1882 -6432:2:1889 -6433:2:1890 -6434:2:1901 -6435:2:1902 -6436:2:1903 -6437:2:1901 -6438:2:1902 -6439:2:1903 -6440:2:1914 -6441:2:1919 -6442:2:1920 -6443:0:4365 -6444:2:1932 -6445:0:4365 -6446:3:3757 -6447:0:4365 -6448:2:1934 -6449:0:4365 -6450:3:3758 -6451:0:4365 -6452:2:1935 -6453:0:4365 -6454:2:1936 -6455:0:4365 -6456:2:2129 -6457:0:4365 -6458:2:2130 -6459:0:4365 -6460:2:2134 -6461:0:4365 -6462:3:3757 -6463:0:4365 -6464:2:2136 -6465:0:4365 -6466:3:3758 -6467:0:4365 -6468:2:2137 -6469:2:2141 -6470:2:2142 -6471:2:2150 -6472:2:2151 -6473:2:2155 -6474:2:2156 -6475:2:2150 -6476:2:2151 -6477:2:2155 -6478:2:2156 -6479:2:2164 -6480:2:2169 -6481:2:2173 -6482:2:2174 -6483:2:2181 -6484:2:2182 -6485:2:2193 -6486:2:2194 -6487:2:2195 -6488:2:2193 -6489:2:2194 -6490:2:2195 -6491:2:2206 -6492:2:2211 -6493:2:2212 -6494:0:4365 -6495:2:2224 -6496:0:4365 -6497:3:3757 -6498:0:4365 -6499:2:2226 -6500:0:4365 -6501:3:3758 -6502:0:4365 -6503:2:1936 -6504:0:4365 -6505:2:2129 -6506:0:4365 -6507:2:2130 -6508:0:4365 -6509:2:2134 -6510:0:4365 -6511:3:3757 -6512:0:4365 -6513:2:2136 -6514:0:4365 -6515:3:3758 -6516:0:4365 -6517:2:2137 -6518:2:2141 -6519:2:2142 -6520:2:2150 -6521:2:2151 -6522:2:2155 -6523:2:2156 -6524:2:2150 -6525:2:2151 -6526:2:2152 -6527:2:2164 -6528:2:2169 -6529:2:2173 -6530:2:2174 -6531:2:2181 -6532:2:2182 -6533:2:2193 -6534:2:2194 -6535:2:2195 -6536:2:2193 -6537:2:2194 -6538:2:2195 -6539:2:2206 -6540:2:2211 -6541:2:2212 -6542:0:4365 -6543:2:2224 -6544:0:4365 -6545:3:3757 -6546:0:4365 -6547:2:2226 -6548:0:4365 -6549:3:3758 -6550:0:4365 -6551:2:2230 -6552:0:4365 -6553:3:3757 -6554:0:4365 -6555:2:2235 -6556:2:2239 -6557:2:2240 -6558:2:2248 -6559:2:2249 -6560:2:2253 -6561:2:2254 -6562:2:2248 -6563:2:2249 -6564:2:2250 -6565:2:2262 -6566:2:2267 -6567:2:2271 -6568:2:2272 -6569:2:2279 -6570:2:2280 -6571:2:2291 -6572:2:2292 -6573:2:2293 -6574:2:2291 -6575:2:2292 -6576:2:2293 -6577:2:2304 -6578:2:2309 -6579:2:2310 -6580:0:4365 -6581:3:3758 -6582:0:4365 -6583:2:2322 -6584:0:4365 -6585:2:1169 -6586:0:4365 -6587:3:3757 -6588:0:4365 -6589:2:1170 -6590:0:4365 -6591:3:3758 -6592:0:4365 -6593:3:3759 -6594:0:4365 -6595:3:3972 -6596:0:4365 -6597:3:4077 -6598:0:4365 -6599:3:4078 -6600:0:4365 -6601:3:4082 -6602:0:4365 -6603:3:4088 -6604:0:4365 -6605:3:4092 -6606:3:4093 -6607:3:4097 -6608:3:4101 -6609:3:4102 -6610:3:4097 -6611:3:4101 -6612:3:4102 -6613:3:4106 -6614:3:4114 -6615:3:4115 -6616:3:4120 -6617:3:4127 -6618:3:4128 -6619:3:4127 -6620:3:4128 -6621:3:4135 -6622:3:4140 -6623:0:4365 -6624:3:4151 -6625:0:4365 -6626:3:4155 -6627:3:4156 -6628:3:4160 -6629:3:4164 -6630:3:4165 -6631:3:4160 -6632:3:4164 -6633:3:4165 -6634:3:4169 -6635:3:4177 -6636:3:4178 -6637:3:4183 -6638:3:4190 -6639:3:4191 -6640:3:4190 -6641:3:4191 -6642:3:4198 -6643:3:4203 -6644:0:4365 -6645:3:4151 -6646:0:4365 -6647:3:4155 -6648:3:4156 -6649:3:4160 -6650:3:4164 -6651:3:4165 -6652:3:4160 -6653:3:4164 -6654:3:4165 -6655:3:4169 -6656:3:4177 -6657:3:4178 -6658:3:4183 -6659:3:4190 -6660:3:4191 -6661:3:4190 -6662:3:4191 -6663:3:4198 -6664:3:4203 -6665:0:4365 -6666:3:4214 -6667:0:4365 -6668:3:4222 -6669:3:4223 -6670:3:4227 -6671:3:4231 -6672:3:4232 -6673:3:4227 -6674:3:4231 -6675:3:4232 -6676:3:4236 -6677:3:4244 -6678:3:4245 -6679:3:4250 -6680:3:4257 -6681:3:4258 -6682:3:4257 -6683:3:4258 -6684:3:4265 -6685:3:4270 -6686:0:4365 -6687:3:4285 -6688:0:4365 -6689:3:4286 -6690:0:4365 -6691:2:1173 -6692:0:4365 -6693:3:4287 -6694:0:4365 -6695:2:1179 -6696:0:4365 -6697:2:1180 -6698:0:4365 -6699:3:4286 -6700:0:4365 -6701:2:1181 -6702:2:1185 -6703:2:1186 -6704:2:1194 -6705:2:1195 -6706:2:1199 -6707:2:1200 -6708:2:1194 -6709:2:1195 -6710:2:1199 -6711:2:1200 -6712:2:1208 -6713:2:1213 -6714:2:1217 -6715:2:1218 -6716:2:1225 -6717:2:1226 -6718:2:1237 -6719:2:1238 -6720:2:1239 -6721:2:1237 -6722:2:1238 -6723:2:1239 -6724:2:1250 -6725:2:1255 -6726:2:1256 -6727:0:4365 -6728:3:4287 -6729:0:4365 -6730:2:1268 -6731:0:4365 -6732:3:4286 -6733:0:4365 -6734:2:1270 -6735:0:4365 -6736:3:4287 -6737:0:4365 -6738:2:1271 -6739:2:1275 -6740:2:1276 -6741:2:1284 -6742:2:1285 -6743:2:1289 -6744:2:1290 -6745:2:1284 -6746:2:1285 -6747:2:1289 -6748:2:1290 -6749:2:1298 -6750:2:1303 -6751:2:1307 -6752:2:1308 -6753:2:1315 -6754:2:1316 -6755:2:1327 -6756:2:1328 -6757:2:1329 -6758:2:1327 -6759:2:1328 -6760:2:1329 -6761:2:1340 -6762:2:1345 -6763:2:1346 -6764:0:4365 -6765:2:1358 -6766:0:4365 -6767:2:1360 -6768:0:4365 -6769:3:4286 -6770:0:4365 -6771:2:1361 -6772:0:4365 -6773:3:4287 -6774:0:4365 -6775:2:1362 -6776:2:1366 -6777:2:1367 -6778:2:1375 -6779:2:1376 -6780:2:1380 -6781:2:1381 -6782:2:1375 -6783:2:1376 -6784:2:1380 -6785:2:1381 -6786:2:1389 -6787:2:1394 -6788:2:1398 -6789:2:1399 -6790:2:1406 -6791:2:1407 -6792:2:1418 -6793:2:1419 -6794:2:1420 -6795:2:1418 -6796:2:1419 -6797:2:1420 -6798:2:1431 -6799:2:1436 -6800:2:1437 -6801:0:4365 -6802:2:1449 -6803:0:4365 -6804:3:4286 -6805:0:4365 -6806:2:1451 -6807:0:4365 -6808:3:4287 -6809:0:4365 -6810:2:1652 -6811:0:4365 -6812:2:1653 -6813:0:4365 -6814:2:1657 -6815:0:4365 -6816:2:1180 -6817:0:4365 -6818:3:4286 -6819:0:4365 -6820:2:1181 -6821:2:1185 -6822:2:1186 -6823:2:1194 -6824:2:1195 -6825:2:1199 -6826:2:1200 -6827:2:1194 -6828:2:1195 -6829:2:1196 -6830:2:1208 -6831:2:1213 -6832:2:1217 -6833:2:1218 -6834:2:1225 -6835:2:1226 -6836:2:1237 -6837:2:1238 -6838:2:1239 -6839:2:1237 -6840:2:1238 -6841:2:1239 -6842:2:1250 -6843:2:1255 -6844:2:1256 -6845:0:4365 -6846:3:4287 -6847:0:4365 -6848:2:1268 -6849:0:4365 -6850:3:4286 -6851:0:4365 -6852:2:1270 -6853:0:4365 -6854:3:4287 -6855:0:4365 -6856:2:1271 -6857:2:1275 -6858:2:1276 -6859:2:1284 -6860:2:1285 -6861:2:1289 -6862:2:1290 -6863:2:1284 -6864:2:1285 -6865:2:1289 -6866:2:1290 -6867:2:1298 -6868:2:1303 -6869:2:1307 -6870:2:1308 -6871:2:1315 -6872:2:1316 -6873:2:1327 -6874:2:1328 -6875:2:1329 -6876:2:1327 -6877:2:1328 -6878:2:1329 -6879:2:1340 -6880:2:1345 -6881:2:1346 -6882:0:4365 -6883:2:1358 -6884:0:4365 -6885:2:1454 -6886:0:4365 -6887:3:4286 -6888:0:4365 -6889:2:1455 -6890:0:4365 -6891:3:4287 -6892:0:4365 -6893:2:1652 -6894:0:4365 -6895:2:1653 -6896:0:4365 -6897:2:1657 -6898:0:4365 -6899:2:1660 -6900:0:4365 -6901:3:4286 -6902:0:4365 -6903:2:1665 -6904:2:1669 -6905:2:1670 -6906:2:1678 -6907:2:1679 -6908:2:1683 -6909:2:1684 -6910:2:1678 -6911:2:1679 -6912:2:1680 -6913:2:1692 -6914:2:1697 -6915:2:1701 -6916:2:1702 -6917:2:1709 -6918:2:1710 -6919:2:1721 -6920:2:1722 -6921:2:1723 -6922:2:1721 -6923:2:1722 -6924:2:1723 -6925:2:1734 -6926:2:1739 -6927:2:1740 -6928:0:4365 -6929:3:4287 -6930:0:4365 -6931:2:1752 -6932:0:4365 -6933:3:4286 -6934:0:4365 -6935:2:1754 -6936:0:4365 -6937:3:4287 -6938:0:4365 -6939:2:1755 -6940:2:1759 -6941:2:1760 -6942:2:1768 -6943:2:1769 -6944:2:1773 -6945:2:1774 -6946:2:1768 -6947:2:1769 -6948:2:1773 -6949:2:1774 -6950:2:1782 -6951:2:1787 -6952:2:1791 -6953:2:1792 -6954:2:1799 -6955:2:1800 -6956:2:1811 -6957:2:1812 -6958:2:1813 -6959:2:1811 -6960:2:1812 -6961:2:1813 -6962:2:1824 -6963:2:1829 -6964:2:1830 -6965:0:4365 -6966:2:1842 -6967:0:4365 -6968:3:4286 -6969:0:4365 -6970:2:1844 -6971:0:4365 -6972:3:4287 -6973:0:4365 -6974:2:1845 -6975:2:1849 -6976:2:1850 -6977:2:1858 -6978:2:1859 -6979:2:1863 -6980:2:1864 -6981:2:1858 -6982:2:1859 -6983:2:1863 -6984:2:1864 -6985:2:1872 -6986:2:1877 -6987:2:1881 -6988:2:1882 -6989:2:1889 -6990:2:1890 -6991:2:1901 -6992:2:1902 -6993:2:1903 -6994:2:1901 -6995:2:1902 -6996:2:1903 -6997:2:1914 -6998:2:1919 -6999:2:1920 -7000:0:4365 -7001:2:1932 -7002:0:4365 -7003:3:4286 -7004:0:4365 -7005:2:1934 -7006:0:4365 -7007:3:4287 -7008:0:4365 -7009:2:1935 -7010:0:4365 -7011:2:1936 -7012:0:4365 -7013:2:2129 -7014:0:4365 -7015:2:2130 -7016:0:4365 -7017:2:2134 -7018:0:4365 -7019:3:4286 -7020:0:4365 -7021:2:2136 -7022:0:4365 -7023:3:4287 -7024:0:4365 -7025:2:2137 -7026:2:2141 -7027:2:2142 -7028:2:2150 -7029:2:2151 -7030:2:2155 -7031:2:2156 -7032:2:2150 -7033:2:2151 -7034:2:2155 -7035:2:2156 -7036:2:2164 -7037:2:2169 -7038:2:2173 -7039:2:2174 -7040:2:2181 -7041:2:2182 -7042:2:2193 -7043:2:2194 -7044:2:2195 -7045:2:2193 -7046:2:2194 -7047:2:2195 -7048:2:2206 -7049:2:2211 -7050:2:2212 -7051:0:4365 -7052:2:2224 -7053:0:4365 -7054:3:4286 -7055:0:4365 -7056:2:2226 -7057:0:4365 -7058:3:4287 -7059:0:4365 -7060:2:1936 -7061:0:4365 -7062:2:2129 -7063:0:4365 -7064:2:2130 -7065:0:4365 -7066:2:2134 -7067:0:4365 -7068:3:4286 -7069:0:4365 -7070:2:2136 -7071:0:4365 -7072:3:4287 -7073:0:4365 -7074:2:2137 -7075:2:2141 -7076:2:2142 -7077:2:2150 -7078:2:2151 -7079:2:2155 -7080:2:2156 -7081:2:2150 -7082:2:2151 -7083:2:2152 -7084:2:2164 -7085:2:2169 -7086:2:2173 -7087:2:2174 -7088:2:2181 -7089:2:2182 -7090:2:2193 -7091:2:2194 -7092:2:2195 -7093:2:2193 -7094:2:2194 -7095:2:2195 -7096:2:2206 -7097:2:2211 -7098:2:2212 -7099:0:4365 -7100:2:2224 -7101:0:4365 -7102:3:4286 -7103:0:4365 -7104:2:2226 -7105:0:4365 -7106:3:4287 -7107:0:4365 -7108:2:2230 -7109:0:4365 -7110:3:4286 -7111:0:4365 -7112:2:2235 -7113:2:2239 -7114:2:2240 -7115:2:2248 -7116:2:2249 -7117:2:2253 -7118:2:2254 -7119:2:2248 -7120:2:2249 -7121:2:2250 -7122:2:2262 -7123:2:2267 -7124:2:2271 -7125:2:2272 -7126:2:2279 -7127:2:2280 -7128:2:2291 -7129:2:2292 -7130:2:2293 -7131:2:2291 -7132:2:2292 -7133:2:2293 -7134:2:2304 -7135:2:2309 -7136:2:2310 -7137:0:4365 -7138:3:4287 -7139:0:4365 -7140:2:2322 -7141:0:4365 -7142:2:1169 -7143:0:4365 -7144:3:4286 -7145:0:4365 -7146:2:1170 -7147:0:4365 -7148:3:4287 -7149:0:4365 -7150:3:4288 -7151:0:4365 -7152:3:4294 -7153:0:4365 -7154:3:4295 -7155:0:4365 -7156:3:2338 -7157:0:4365 -7158:3:2339 -7159:3:2343 -7160:3:2344 -7161:3:2352 -7162:3:2353 -7163:3:2357 -7164:3:2358 -7165:3:2352 -7166:3:2353 -7167:3:2357 -7168:3:2358 -7169:3:2366 -7170:3:2371 -7171:3:2375 -7172:3:2376 -7173:3:2383 -7174:3:2384 -7175:3:2395 -7176:3:2396 -7177:3:2397 -7178:3:2395 -7179:3:2396 -7180:3:2397 -7181:3:2408 -7182:3:2413 -7183:3:2414 -7184:0:4365 -7185:3:2426 -7186:0:4365 -7187:3:2427 -7188:0:4365 -7189:2:1173 -7190:0:4365 -7191:3:2428 -7192:0:4365 -7193:2:1179 -7194:0:4365 -7195:2:1180 -7196:0:4365 -7197:3:2427 -7198:0:4365 -7199:2:1181 -7200:2:1185 -7201:2:1186 -7202:2:1194 -7203:2:1195 -7204:2:1199 -7205:2:1200 -7206:2:1194 -7207:2:1195 -7208:2:1199 -7209:2:1200 -7210:2:1208 -7211:2:1213 -7212:2:1217 -7213:2:1218 -7214:2:1225 -7215:2:1226 -7216:2:1237 -7217:2:1238 -7218:2:1239 -7219:2:1237 -7220:2:1238 -7221:2:1239 -7222:2:1250 -7223:2:1255 -7224:2:1256 -7225:0:4365 -7226:3:2428 -7227:0:4365 -7228:2:1268 -7229:0:4365 -7230:3:2427 -7231:0:4365 -7232:2:1270 -7233:0:4365 -7234:3:2428 -7235:0:4365 -7236:2:1271 -7237:2:1275 -7238:2:1276 -7239:2:1284 -7240:2:1285 -7241:2:1289 -7242:2:1290 -7243:2:1284 -7244:2:1285 -7245:2:1289 -7246:2:1290 -7247:2:1298 -7248:2:1303 -7249:2:1307 -7250:2:1308 -7251:2:1315 -7252:2:1316 -7253:2:1327 -7254:2:1328 -7255:2:1329 -7256:2:1327 -7257:2:1328 -7258:2:1329 -7259:2:1340 -7260:2:1345 -7261:2:1346 -7262:0:4365 -7263:2:1358 -7264:0:4365 -7265:2:1360 -7266:0:4365 -7267:3:2427 -7268:0:4365 -7269:2:1361 -7270:0:4365 -7271:3:2428 -7272:0:4365 -7273:2:1362 -7274:2:1366 -7275:2:1367 -7276:2:1375 -7277:2:1376 -7278:2:1380 -7279:2:1381 -7280:2:1375 -7281:2:1376 -7282:2:1380 -7283:2:1381 -7284:2:1389 -7285:2:1394 -7286:2:1398 -7287:2:1399 -7288:2:1406 -7289:2:1407 -7290:2:1418 -7291:2:1419 -7292:2:1420 -7293:2:1418 -7294:2:1419 -7295:2:1420 -7296:2:1431 -7297:2:1436 -7298:2:1437 -7299:0:4365 -7300:2:1449 -7301:0:4365 -7302:3:2427 -7303:0:4365 -7304:2:1451 -7305:0:4365 -7306:3:2428 -7307:0:4365 -7308:2:1652 -7309:0:4365 -7310:2:1653 -7311:0:4365 -7312:2:1657 -7313:0:4365 -7314:2:1180 -7315:0:4365 -7316:3:2427 -7317:0:4365 -7318:2:1181 -7319:2:1185 -7320:2:1186 -7321:2:1194 -7322:2:1195 -7323:2:1199 -7324:2:1200 -7325:2:1194 -7326:2:1195 -7327:2:1196 -7328:2:1208 -7329:2:1213 -7330:2:1217 -7331:2:1218 -7332:2:1225 -7333:2:1226 -7334:2:1237 -7335:2:1238 -7336:2:1239 -7337:2:1237 -7338:2:1238 -7339:2:1239 -7340:2:1250 -7341:2:1255 -7342:2:1256 -7343:0:4365 -7344:3:2428 -7345:0:4365 -7346:2:1268 -7347:0:4365 -7348:3:2427 -7349:0:4365 -7350:2:1270 -7351:0:4365 -7352:3:2428 -7353:0:4365 -7354:2:1271 -7355:2:1275 -7356:2:1276 -7357:2:1284 -7358:2:1285 -7359:2:1289 -7360:2:1290 -7361:2:1284 -7362:2:1285 -7363:2:1289 -7364:2:1290 -7365:2:1298 -7366:2:1303 -7367:2:1307 -7368:2:1308 -7369:2:1315 -7370:2:1316 -7371:2:1327 -7372:2:1328 -7373:2:1329 -7374:2:1327 -7375:2:1328 -7376:2:1329 -7377:2:1340 -7378:2:1345 -7379:2:1346 -7380:0:4365 -7381:2:1358 -7382:0:4365 -7383:2:1454 -7384:0:4365 -7385:3:2427 -7386:0:4365 -7387:2:1455 -7388:0:4365 -7389:3:2428 -7390:0:4365 -7391:2:1652 -7392:0:4365 -7393:2:1653 -7394:0:4365 -7395:2:1657 -7396:0:4365 -7397:2:1660 -7398:0:4365 -7399:3:2427 -7400:0:4365 -7401:2:1665 -7402:2:1669 -7403:2:1670 -7404:2:1678 -7405:2:1679 -7406:2:1683 -7407:2:1684 -7408:2:1678 -7409:2:1679 -7410:2:1680 -7411:2:1692 -7412:2:1697 -7413:2:1701 -7414:2:1702 -7415:2:1709 -7416:2:1710 -7417:2:1721 -7418:2:1722 -7419:2:1723 -7420:2:1721 -7421:2:1722 -7422:2:1723 -7423:2:1734 -7424:2:1739 -7425:2:1740 -7426:0:4365 -7427:3:2428 -7428:0:4365 -7429:2:1752 -7430:0:4365 -7431:3:2427 -7432:0:4365 -7433:2:1754 -7434:0:4365 -7435:3:2428 -7436:0:4365 -7437:2:1755 -7438:2:1759 -7439:2:1760 -7440:2:1768 -7441:2:1769 -7442:2:1773 -7443:2:1774 -7444:2:1768 -7445:2:1769 -7446:2:1773 -7447:2:1774 -7448:2:1782 -7449:2:1787 -7450:2:1791 -7451:2:1792 -7452:2:1799 -7453:2:1800 -7454:2:1811 -7455:2:1812 -7456:2:1813 -7457:2:1811 -7458:2:1812 -7459:2:1813 -7460:2:1824 -7461:2:1829 -7462:2:1830 -7463:0:4365 -7464:2:1842 -7465:0:4365 -7466:3:2427 -7467:0:4365 -7468:2:1844 -7469:0:4365 -7470:3:2428 -7471:0:4365 -7472:2:1845 -7473:2:1849 -7474:2:1850 -7475:2:1858 -7476:2:1859 -7477:2:1863 -7478:2:1864 -7479:2:1858 -7480:2:1859 -7481:2:1863 -7482:2:1864 -7483:2:1872 -7484:2:1877 -7485:2:1881 -7486:2:1882 -7487:2:1889 -7488:2:1890 -7489:2:1901 -7490:2:1902 -7491:2:1903 -7492:2:1901 -7493:2:1902 -7494:2:1903 -7495:2:1914 -7496:2:1919 -7497:2:1920 -7498:0:4365 -7499:2:1932 -7500:0:4365 -7501:3:2427 -7502:0:4365 -7503:2:1934 -7504:0:4365 -7505:3:2428 -7506:0:4365 -7507:2:1935 -7508:0:4365 -7509:2:1936 -7510:0:4365 -7511:2:2129 -7512:0:4365 -7513:2:2130 -7514:0:4365 -7515:2:2134 -7516:0:4365 -7517:3:2427 -7518:0:4365 -7519:2:2136 -7520:0:4365 -7521:3:2428 -7522:0:4365 -7523:2:2137 -7524:2:2141 -7525:2:2142 -7526:2:2150 -7527:2:2151 -7528:2:2155 -7529:2:2156 -7530:2:2150 -7531:2:2151 -7532:2:2155 -7533:2:2156 -7534:2:2164 -7535:2:2169 -7536:2:2173 -7537:2:2174 -7538:2:2181 -7539:2:2182 -7540:2:2193 -7541:2:2194 -7542:2:2195 -7543:2:2193 -7544:2:2194 -7545:2:2195 -7546:2:2206 -7547:2:2211 -7548:2:2212 -7549:0:4365 -7550:2:2224 -7551:0:4365 -7552:3:2427 -7553:0:4365 -7554:2:2226 -7555:0:4365 -7556:3:2428 -7557:0:4365 -7558:2:1936 -7559:0:4365 -7560:2:2129 -7561:0:4365 -7562:2:2130 -7563:0:4365 -7564:2:2134 -7565:0:4365 -7566:3:2427 -7567:0:4365 -7568:2:2136 -7569:0:4365 -7570:3:2428 -7571:0:4365 -7572:2:2137 -7573:2:2141 -7574:2:2142 -7575:2:2150 -7576:2:2151 -7577:2:2155 -7578:2:2156 -7579:2:2150 -7580:2:2151 -7581:2:2152 -7582:2:2164 -7583:2:2169 -7584:2:2173 -7585:2:2174 -7586:2:2181 -7587:2:2182 -7588:2:2193 -7589:2:2194 -7590:2:2195 -7591:2:2193 -7592:2:2194 -7593:2:2195 -7594:2:2206 -7595:2:2211 -7596:2:2212 -7597:0:4365 -7598:2:2224 -7599:0:4365 -7600:3:2427 -7601:0:4365 -7602:2:2226 -7603:0:4365 -7604:3:2428 -7605:0:4365 -7606:2:2230 -7607:0:4365 -7608:3:2427 -7609:0:4365 -7610:2:2235 -7611:2:2239 -7612:2:2240 -7613:2:2248 -7614:2:2249 -7615:2:2253 -7616:2:2254 -7617:2:2248 -7618:2:2249 -7619:2:2250 -7620:2:2262 -7621:2:2267 -7622:2:2271 -7623:2:2272 -7624:2:2279 -7625:2:2280 -7626:2:2291 -7627:2:2292 -7628:2:2293 -7629:2:2291 -7630:2:2292 -7631:2:2293 -7632:2:2304 -7633:2:2309 -7634:2:2310 -7635:0:4365 -7636:3:2428 -7637:0:4365 -7638:2:2322 -7639:0:4365 -7640:2:1169 -7641:0:4365 -7642:3:2427 -7643:0:4365 -7644:2:1170 -7645:0:4365 -7646:3:2428 -7647:0:4365 -7648:3:2429 -7649:0:4365 -7650:3:2435 -7651:3:2436 -7652:0:4365 -7653:3:2440 -7654:3:2444 -7655:3:2445 -7656:3:2453 -7657:3:2454 -7658:3:2458 -7659:3:2459 -7660:3:2453 -7661:3:2454 -7662:3:2458 -7663:3:2459 -7664:3:2467 -7665:3:2472 -7666:3:2473 -7667:3:2484 -7668:3:2485 -7669:3:2496 -7670:3:2497 -7671:3:2498 -7672:3:2496 -7673:3:2497 -7674:3:2498 -7675:3:2509 -7676:3:2514 -7677:3:2515 -7678:0:4365 -7679:3:2527 -7680:0:4365 -7681:3:2528 -7682:0:4365 -7683:2:1173 -7684:0:4365 -7685:3:2529 -7686:0:4365 -7687:2:1179 -7688:0:4365 -7689:2:1180 -7690:0:4365 -7691:3:2528 -7692:0:4365 -7693:2:1181 -7694:2:1185 -7695:2:1186 -7696:2:1194 -7697:2:1195 -7698:2:1199 -7699:2:1200 -7700:2:1194 -7701:2:1195 -7702:2:1199 -7703:2:1200 -7704:2:1208 -7705:2:1213 -7706:2:1217 -7707:2:1218 -7708:2:1225 -7709:2:1226 -7710:2:1237 -7711:2:1238 -7712:2:1239 -7713:2:1237 -7714:2:1238 -7715:2:1239 -7716:2:1250 -7717:2:1255 -7718:2:1256 -7719:0:4365 -7720:3:2529 -7721:0:4365 -7722:2:1268 -7723:0:4365 -7724:3:2528 -7725:0:4365 -7726:2:1270 -7727:0:4365 -7728:3:2529 -7729:0:4365 -7730:2:1271 -7731:2:1275 -7732:2:1276 -7733:2:1284 -7734:2:1285 -7735:2:1289 -7736:2:1290 -7737:2:1284 -7738:2:1285 -7739:2:1289 -7740:2:1290 -7741:2:1298 -7742:2:1303 -7743:2:1307 -7744:2:1308 -7745:2:1315 -7746:2:1316 -7747:2:1327 -7748:2:1328 -7749:2:1329 -7750:2:1327 -7751:2:1328 -7752:2:1329 -7753:2:1340 -7754:2:1345 -7755:2:1346 -7756:0:4365 -7757:2:1358 -7758:0:4365 -7759:2:1360 -7760:0:4365 -7761:3:2528 -7762:0:4365 -7763:2:1361 -7764:0:4365 -7765:3:2529 -7766:0:4365 -7767:2:1362 -7768:2:1366 -7769:2:1367 -7770:2:1375 -7771:2:1376 -7772:2:1380 -7773:2:1381 -7774:2:1375 -7775:2:1376 -7776:2:1380 -7777:2:1381 -7778:2:1389 -7779:2:1394 -7780:2:1398 -7781:2:1399 -7782:2:1406 -7783:2:1407 -7784:2:1418 -7785:2:1419 -7786:2:1420 -7787:2:1418 -7788:2:1419 -7789:2:1420 -7790:2:1431 -7791:2:1436 -7792:2:1437 -7793:0:4365 -7794:2:1449 -7795:0:4365 -7796:3:2528 -7797:0:4365 -7798:2:1451 -7799:0:4365 -7800:3:2529 -7801:0:4365 -7802:2:1652 -7803:0:4365 -7804:2:1653 -7805:0:4365 -7806:2:1657 -7807:0:4365 -7808:2:1180 -7809:0:4365 -7810:3:2528 -7811:0:4365 -7812:2:1181 -7813:2:1185 -7814:2:1186 -7815:2:1194 -7816:2:1195 -7817:2:1199 -7818:2:1200 -7819:2:1194 -7820:2:1195 -7821:2:1196 -7822:2:1208 -7823:2:1213 -7824:2:1217 -7825:2:1218 -7826:2:1225 -7827:2:1226 -7828:2:1237 -7829:2:1238 -7830:2:1239 -7831:2:1237 -7832:2:1238 -7833:2:1239 -7834:2:1250 -7835:2:1255 -7836:2:1256 -7837:0:4365 -7838:3:2529 -7839:0:4365 -7840:2:1268 -7841:0:4365 -7842:3:2528 -7843:0:4365 -7844:2:1270 -7845:0:4365 -7846:3:2529 -7847:0:4365 -7848:2:1271 -7849:2:1275 -7850:2:1276 -7851:2:1284 -7852:2:1285 -7853:2:1289 -7854:2:1290 -7855:2:1284 -7856:2:1285 -7857:2:1289 -7858:2:1290 -7859:2:1298 -7860:2:1303 -7861:2:1307 -7862:2:1308 -7863:2:1315 -7864:2:1316 -7865:2:1327 -7866:2:1328 -7867:2:1329 -7868:2:1327 -7869:2:1328 -7870:2:1329 -7871:2:1340 -7872:2:1345 -7873:2:1346 -7874:0:4365 -7875:2:1358 -7876:0:4365 -7877:2:1454 -7878:0:4365 -7879:3:2528 -7880:0:4365 -7881:2:1455 -7882:0:4365 -7883:3:2529 -7884:0:4365 -7885:2:1652 -7886:0:4365 -7887:2:1653 -7888:0:4365 -7889:2:1657 -7890:0:4365 -7891:2:1660 -7892:0:4365 -7893:3:2528 -7894:0:4365 -7895:2:1665 -7896:2:1669 -7897:2:1670 -7898:2:1678 -7899:2:1679 -7900:2:1683 -7901:2:1684 -7902:2:1678 -7903:2:1679 -7904:2:1680 -7905:2:1692 -7906:2:1697 -7907:2:1701 -7908:2:1702 -7909:2:1709 -7910:2:1710 -7911:2:1721 -7912:2:1722 -7913:2:1723 -7914:2:1721 -7915:2:1722 -7916:2:1723 -7917:2:1734 -7918:2:1739 -7919:2:1740 -7920:0:4365 -7921:3:2529 -7922:0:4365 -7923:2:1752 -7924:0:4365 -7925:3:2528 -7926:0:4365 -7927:2:1754 -7928:0:4365 -7929:3:2529 -7930:0:4365 -7931:2:1755 -7932:2:1759 -7933:2:1760 -7934:2:1768 -7935:2:1769 -7936:2:1773 -7937:2:1774 -7938:2:1768 -7939:2:1769 -7940:2:1773 -7941:2:1774 -7942:2:1782 -7943:2:1787 -7944:2:1791 -7945:2:1792 -7946:2:1799 -7947:2:1800 -7948:2:1811 -7949:2:1812 -7950:2:1813 -7951:2:1811 -7952:2:1812 -7953:2:1813 -7954:2:1824 -7955:2:1829 -7956:2:1830 -7957:0:4365 -7958:2:1842 -7959:0:4365 -7960:3:2528 -7961:0:4365 -7962:2:1844 -7963:0:4365 -7964:3:2529 -7965:0:4365 -7966:2:1845 -7967:2:1849 -7968:2:1850 -7969:2:1858 -7970:2:1859 -7971:2:1863 -7972:2:1864 -7973:2:1858 -7974:2:1859 -7975:2:1863 -7976:2:1864 -7977:2:1872 -7978:2:1877 -7979:2:1881 -7980:2:1882 -7981:2:1889 -7982:2:1890 -7983:2:1901 -7984:2:1902 -7985:2:1903 -7986:2:1901 -7987:2:1902 -7988:2:1903 -7989:2:1914 -7990:2:1919 -7991:2:1920 -7992:0:4365 -7993:2:1932 -7994:0:4365 -7995:3:2528 -7996:0:4365 -7997:2:1934 -7998:0:4365 -7999:3:2529 -8000:0:4365 -8001:2:1935 -8002:0:4365 -8003:2:1936 -8004:0:4365 -8005:2:2129 -8006:0:4365 -8007:2:2130 -8008:0:4365 -8009:2:2134 -8010:0:4365 -8011:3:2528 -8012:0:4365 -8013:2:2136 -8014:0:4365 -8015:3:2529 -8016:0:4365 -8017:2:2137 -8018:2:2141 -8019:2:2142 -8020:2:2150 -8021:2:2151 -8022:2:2155 -8023:2:2156 -8024:2:2150 -8025:2:2151 -8026:2:2155 -8027:2:2156 -8028:2:2164 -8029:2:2169 -8030:2:2173 -8031:2:2174 -8032:2:2181 -8033:2:2182 -8034:2:2193 -8035:2:2194 -8036:2:2195 -8037:2:2193 -8038:2:2194 -8039:2:2195 -8040:2:2206 -8041:2:2211 -8042:2:2212 -8043:0:4365 -8044:2:2224 -8045:0:4365 -8046:3:2528 -8047:0:4365 -8048:2:2226 -8049:0:4365 -8050:3:2529 -8051:0:4365 -8052:2:1936 -8053:0:4365 -8054:2:2129 -8055:0:4365 -8056:2:2130 -8057:0:4365 -8058:2:2134 -8059:0:4365 -8060:3:2528 -8061:0:4365 -8062:2:2136 -8063:0:4365 -8064:3:2529 -8065:0:4365 -8066:2:2137 -8067:2:2141 -8068:2:2142 -8069:2:2150 -8070:2:2151 -8071:2:2155 -8072:2:2156 -8073:2:2150 -8074:2:2151 -8075:2:2152 -8076:2:2164 -8077:2:2169 -8078:2:2173 -8079:2:2174 -8080:2:2181 -8081:2:2182 -8082:2:2193 -8083:2:2194 -8084:2:2195 -8085:2:2193 -8086:2:2194 -8087:2:2195 -8088:2:2206 -8089:2:2211 -8090:2:2212 -8091:0:4365 -8092:2:2224 -8093:0:4365 -8094:3:2528 -8095:0:4365 -8096:2:2226 -8097:0:4365 -8098:3:2529 -8099:0:4365 -8100:2:2230 -8101:0:4365 -8102:3:2528 -8103:0:4365 -8104:2:2235 -8105:2:2239 -8106:2:2240 -8107:2:2248 -8108:2:2249 -8109:2:2253 -8110:2:2254 -8111:2:2248 -8112:2:2249 -8113:2:2250 -8114:2:2262 -8115:2:2267 -8116:2:2271 -8117:2:2272 -8118:2:2279 -8119:2:2280 -8120:2:2291 -8121:2:2292 -8122:2:2293 -8123:2:2291 -8124:2:2292 -8125:2:2293 -8126:2:2304 -8127:2:2309 -8128:2:2310 -8129:0:4365 -8130:3:2529 -8131:0:4365 -8132:2:2322 -8133:0:4365 -8134:2:1169 -8135:0:4365 -8136:3:2528 -8137:0:4365 -8138:2:1170 -8139:0:4365 -8140:3:2529 -8141:0:4365 -8142:3:2530 -8143:0:4365 -8144:3:2536 -8145:0:4365 -8146:3:2537 -8147:0:4365 -8148:3:2547 -8149:0:4365 -8150:3:2548 -8151:0:4365 -8152:3:2552 -8153:3:2553 -8154:3:2557 -8155:3:2561 -8156:3:2562 -8157:3:2557 -8158:3:2561 -8159:3:2562 -8160:3:2566 -8161:3:2574 -8162:3:2575 -8163:3:2580 -8164:3:2587 -8165:3:2588 -8166:3:2587 -8167:3:2588 -8168:3:2595 -8169:3:2600 -8170:0:4365 -8171:3:2611 -8172:0:4365 -8173:3:2615 -8174:3:2616 -8175:3:2620 -8176:3:2624 -8177:3:2625 -8178:3:2620 -8179:3:2624 -8180:3:2625 -8181:3:2629 -8182:3:2637 -8183:3:2638 -8184:3:2643 -8185:3:2650 -8186:3:2651 -8187:3:2650 -8188:3:2651 -8189:3:2658 -8190:3:2663 -8191:0:4365 -8192:3:2611 -8193:0:4365 -8194:3:2615 -8195:3:2616 -8196:3:2620 -8197:3:2624 -8198:3:2625 -8199:3:2620 -8200:3:2624 -8201:3:2625 -8202:3:2629 -8203:3:2637 -8204:3:2638 -8205:3:2643 -8206:3:2650 -8207:3:2651 -8208:3:2650 -8209:3:2651 -8210:3:2658 -8211:3:2663 -8212:0:4365 -8213:3:2674 -8214:0:4365 -8215:3:2682 -8216:3:2683 -8217:3:2687 -8218:3:2691 -8219:3:2692 -8220:3:2687 -8221:3:2691 -8222:3:2692 -8223:3:2696 -8224:3:2704 -8225:3:2705 -8226:3:2710 -8227:3:2717 -8228:3:2718 -8229:3:2717 -8230:3:2718 -8231:3:2725 -8232:3:2730 -8233:0:4365 -8234:3:2745 -8235:0:4365 -8236:3:2746 -8237:0:4365 -8238:2:1173 -8239:0:4365 -8240:3:2747 -8241:0:4365 -8242:2:1179 -8243:0:4365 -8244:2:1180 -8245:0:4365 -8246:3:2746 -8247:0:4365 -8248:2:1181 -8249:2:1185 -8250:2:1186 -8251:2:1194 -8252:2:1195 -8253:2:1199 -8254:2:1200 -8255:2:1194 -8256:2:1195 -8257:2:1199 -8258:2:1200 -8259:2:1208 -8260:2:1213 -8261:2:1217 -8262:2:1218 -8263:2:1225 -8264:2:1226 -8265:2:1237 -8266:2:1238 -8267:2:1239 -8268:2:1237 -8269:2:1238 -8270:2:1239 -8271:2:1250 -8272:2:1255 -8273:2:1256 -8274:0:4365 -8275:3:2747 -8276:0:4365 -8277:2:1268 -8278:0:4365 -8279:3:2746 -8280:0:4365 -8281:2:1270 -8282:0:4365 -8283:3:2747 -8284:0:4365 -8285:2:1271 -8286:2:1275 -8287:2:1276 -8288:2:1284 -8289:2:1285 -8290:2:1289 -8291:2:1290 -8292:2:1284 -8293:2:1285 -8294:2:1289 -8295:2:1290 -8296:2:1298 -8297:2:1303 -8298:2:1307 -8299:2:1308 -8300:2:1315 -8301:2:1316 -8302:2:1327 -8303:2:1328 -8304:2:1329 -8305:2:1327 -8306:2:1328 -8307:2:1329 -8308:2:1340 -8309:2:1345 -8310:2:1346 -8311:0:4365 -8312:2:1358 -8313:0:4365 -8314:2:1360 -8315:0:4365 -8316:3:2746 -8317:0:4365 -8318:2:1361 -8319:0:4365 -8320:3:2747 -8321:0:4365 -8322:2:1362 -8323:2:1366 -8324:2:1367 -8325:2:1375 -8326:2:1376 -8327:2:1380 -8328:2:1381 -8329:2:1375 -8330:2:1376 -8331:2:1380 -8332:2:1381 -8333:2:1389 -8334:2:1394 -8335:2:1398 -8336:2:1399 -8337:2:1406 -8338:2:1407 -8339:2:1418 -8340:2:1419 -8341:2:1420 -8342:2:1418 -8343:2:1419 -8344:2:1420 -8345:2:1431 -8346:2:1436 -8347:2:1437 -8348:0:4365 -8349:2:1449 -8350:0:4365 -8351:3:2746 -8352:0:4365 -8353:2:1451 -8354:0:4365 -8355:3:2747 -8356:0:4365 -8357:2:1652 -8358:0:4365 -8359:2:1653 -8360:0:4365 -8361:2:1657 -8362:0:4365 -8363:2:1180 -8364:0:4365 -8365:3:2746 -8366:0:4365 -8367:2:1181 -8368:2:1185 -8369:2:1186 -8370:2:1194 -8371:2:1195 -8372:2:1199 -8373:2:1200 -8374:2:1194 -8375:2:1195 -8376:2:1196 -8377:2:1208 -8378:2:1213 -8379:2:1217 -8380:2:1218 -8381:2:1225 -8382:2:1226 -8383:2:1237 -8384:2:1238 -8385:2:1239 -8386:2:1237 -8387:2:1238 -8388:2:1239 -8389:2:1250 -8390:2:1255 -8391:2:1256 -8392:0:4365 -8393:3:2747 -8394:0:4365 -8395:2:1268 -8396:0:4365 -8397:3:2746 -8398:0:4365 -8399:2:1270 -8400:0:4365 -8401:3:2747 -8402:0:4365 -8403:2:1271 -8404:2:1275 -8405:2:1276 -8406:2:1284 -8407:2:1285 -8408:2:1289 -8409:2:1290 -8410:2:1284 -8411:2:1285 -8412:2:1289 -8413:2:1290 -8414:2:1298 -8415:2:1303 -8416:2:1307 -8417:2:1308 -8418:2:1315 -8419:2:1316 -8420:2:1327 -8421:2:1328 -8422:2:1329 -8423:2:1327 -8424:2:1328 -8425:2:1329 -8426:2:1340 -8427:2:1345 -8428:2:1346 -8429:0:4365 -8430:2:1358 -8431:0:4365 -8432:2:1454 -8433:0:4365 -8434:3:2746 -8435:0:4365 -8436:2:1455 -8437:0:4365 -8438:3:2747 -8439:0:4365 -8440:2:1652 -8441:0:4365 -8442:2:1653 -8443:0:4365 -8444:2:1657 -8445:0:4365 -8446:2:1660 -8447:0:4365 -8448:3:2746 -8449:0:4365 -8450:2:1665 -8451:2:1669 -8452:2:1670 -8453:2:1678 -8454:2:1679 -8455:2:1683 -8456:2:1684 -8457:2:1678 -8458:2:1679 -8459:2:1680 -8460:2:1692 -8461:2:1697 -8462:2:1701 -8463:2:1702 -8464:2:1709 -8465:2:1710 -8466:2:1721 -8467:2:1722 -8468:2:1723 -8469:2:1721 -8470:2:1722 -8471:2:1723 -8472:2:1734 -8473:2:1739 -8474:2:1740 -8475:0:4365 -8476:3:2747 -8477:0:4365 -8478:2:1752 -8479:0:4365 -8480:3:2746 -8481:0:4365 -8482:2:1754 -8483:0:4365 -8484:3:2747 -8485:0:4365 -8486:2:1755 -8487:2:1759 -8488:2:1760 -8489:2:1768 -8490:2:1769 -8491:2:1773 -8492:2:1774 -8493:2:1768 -8494:2:1769 -8495:2:1773 -8496:2:1774 -8497:2:1782 -8498:2:1787 -8499:2:1791 -8500:2:1792 -8501:2:1799 -8502:2:1800 -8503:2:1811 -8504:2:1812 -8505:2:1813 -8506:2:1811 -8507:2:1812 -8508:2:1813 -8509:2:1824 -8510:2:1829 -8511:2:1830 -8512:0:4365 -8513:2:1842 -8514:0:4365 -8515:3:2746 -8516:0:4365 -8517:2:1844 -8518:0:4365 -8519:3:2747 -8520:0:4365 -8521:2:1845 -8522:2:1849 -8523:2:1850 -8524:2:1858 -8525:2:1859 -8526:2:1863 -8527:2:1864 -8528:2:1858 -8529:2:1859 -8530:2:1863 -8531:2:1864 -8532:2:1872 -8533:2:1877 -8534:2:1881 -8535:2:1882 -8536:2:1889 -8537:2:1890 -8538:2:1901 -8539:2:1902 -8540:2:1903 -8541:2:1901 -8542:2:1902 -8543:2:1903 -8544:2:1914 -8545:2:1919 -8546:2:1920 -8547:0:4365 -8548:2:1932 -8549:0:4365 -8550:3:2746 -8551:0:4365 -8552:2:1934 -8553:0:4365 -8554:3:2747 -8555:0:4365 -8556:2:1935 -8557:0:4365 -8558:2:1936 -8559:0:4365 -8560:2:2129 -8561:0:4365 -8562:2:2130 -8563:0:4365 -8564:2:2134 -8565:0:4365 -8566:3:2746 -8567:0:4365 -8568:2:2136 -8569:0:4365 -8570:3:2747 -8571:0:4365 -8572:2:2137 -8573:2:2141 -8574:2:2142 -8575:2:2150 -8576:2:2151 -8577:2:2155 -8578:2:2156 -8579:2:2150 -8580:2:2151 -8581:2:2155 -8582:2:2156 -8583:2:2164 -8584:2:2169 -8585:2:2173 -8586:2:2174 -8587:2:2181 -8588:2:2182 -8589:2:2193 -8590:2:2194 -8591:2:2195 -8592:2:2193 -8593:2:2194 -8594:2:2195 -8595:2:2206 -8596:2:2211 -8597:2:2212 -8598:0:4365 -8599:2:2224 -8600:0:4365 -8601:3:2746 -8602:0:4365 -8603:2:2226 -8604:0:4365 -8605:3:2747 -8606:0:4365 -8607:2:1936 -8608:0:4365 -8609:2:2129 -8610:0:4365 -8611:2:2130 -8612:0:4365 -8613:2:2134 -8614:0:4365 -8615:3:2746 -8616:0:4365 -8617:2:2136 -8618:0:4365 -8619:3:2747 -8620:0:4365 -8621:2:2137 -8622:2:2141 -8623:2:2142 -8624:2:2150 -8625:2:2151 -8626:2:2155 -8627:2:2156 -8628:2:2150 -8629:2:2151 -8630:2:2152 -8631:2:2164 -8632:2:2169 -8633:2:2173 -8634:2:2174 -8635:2:2181 -8636:2:2182 -8637:2:2193 -8638:2:2194 -8639:2:2195 -8640:2:2193 -8641:2:2194 -8642:2:2195 -8643:2:2206 -8644:2:2211 -8645:2:2212 -8646:0:4365 -8647:2:2224 -8648:0:4365 -8649:3:2746 -8650:0:4365 -8651:2:2226 -8652:0:4365 -8653:3:2747 -8654:0:4365 -8655:2:2230 -8656:0:4365 -8657:3:2746 -8658:0:4365 -8659:2:2235 -8660:2:2239 -8661:2:2240 -8662:2:2248 -8663:2:2249 -8664:2:2253 -8665:2:2254 -8666:2:2248 -8667:2:2249 -8668:2:2250 -8669:2:2262 -8670:2:2267 -8671:2:2271 -8672:2:2272 -8673:2:2279 -8674:2:2280 -8675:2:2291 -8676:2:2292 -8677:2:2293 -8678:2:2291 -8679:2:2292 -8680:2:2293 -8681:2:2304 -8682:2:2309 -8683:2:2310 -8684:0:4365 -8685:3:2747 -8686:0:4365 -8687:2:2322 -8688:0:4365 -8689:2:1169 -8690:0:4365 -8691:3:2746 -8692:0:4365 -8693:2:1170 -8694:0:4365 -8695:3:2747 -8696:0:4365 -8697:3:2748 -8698:0:4365 -8699:3:2754 -8700:0:4365 -8701:3:2755 -8702:3:2759 -8703:3:2760 -8704:3:2768 -8705:3:2769 -8706:3:2773 -8707:3:2774 -8708:3:2768 -8709:3:2769 -8710:3:2773 -8711:3:2774 -8712:3:2782 -8713:3:2787 -8714:3:2791 -8715:3:2792 -8716:3:2799 -8717:3:2800 -8718:3:2811 -8719:3:2812 -8720:3:2813 -8721:3:2811 -8722:3:2812 -8723:3:2813 -8724:3:2824 -8725:3:2829 -8726:3:2830 -8727:0:4365 -8728:3:2842 -8729:0:4365 -8730:3:2843 -8731:0:4365 -8732:2:1173 -8733:0:4365 -8734:3:2844 -8735:0:4365 -8736:2:1179 -8737:0:4365 -8738:2:1180 -8739:0:4365 -8740:3:2843 -8741:0:4365 -8742:2:1181 -8743:2:1185 -8744:2:1186 -8745:2:1194 -8746:2:1195 -8747:2:1199 -8748:2:1200 -8749:2:1194 -8750:2:1195 -8751:2:1199 -8752:2:1200 -8753:2:1208 -8754:2:1213 -8755:2:1217 -8756:2:1218 -8757:2:1225 -8758:2:1226 -8759:2:1237 -8760:2:1238 -8761:2:1239 -8762:2:1237 -8763:2:1238 -8764:2:1239 -8765:2:1250 -8766:2:1255 -8767:2:1256 -8768:0:4365 -8769:3:2844 -8770:0:4365 -8771:2:1268 -8772:0:4365 -8773:3:2843 -8774:0:4365 -8775:2:1270 -8776:0:4365 -8777:3:2844 -8778:0:4365 -8779:2:1271 -8780:2:1275 -8781:2:1276 -8782:2:1284 -8783:2:1285 -8784:2:1289 -8785:2:1290 -8786:2:1284 -8787:2:1285 -8788:2:1289 -8789:2:1290 -8790:2:1298 -8791:2:1303 -8792:2:1307 -8793:2:1308 -8794:2:1315 -8795:2:1316 -8796:2:1327 -8797:2:1328 -8798:2:1329 -8799:2:1327 -8800:2:1328 -8801:2:1329 -8802:2:1340 -8803:2:1345 -8804:2:1346 -8805:0:4365 -8806:2:1358 -8807:0:4365 -8808:2:1360 -8809:0:4365 -8810:3:2843 -8811:0:4365 -8812:2:1361 -8813:0:4365 -8814:3:2844 -8815:0:4365 -8816:2:1362 -8817:2:1366 -8818:2:1367 -8819:2:1375 -8820:2:1376 -8821:2:1380 -8822:2:1381 -8823:2:1375 -8824:2:1376 -8825:2:1380 -8826:2:1381 -8827:2:1389 -8828:2:1394 -8829:2:1398 -8830:2:1399 -8831:2:1406 -8832:2:1407 -8833:2:1418 -8834:2:1419 -8835:2:1420 -8836:2:1418 -8837:2:1419 -8838:2:1420 -8839:2:1431 -8840:2:1436 -8841:2:1437 -8842:0:4365 -8843:2:1449 -8844:0:4365 -8845:3:2843 -8846:0:4365 -8847:2:1451 -8848:0:4365 -8849:3:2844 -8850:0:4365 -8851:2:1652 -8852:0:4365 -8853:2:1653 -8854:0:4365 -8855:2:1657 -8856:0:4365 -8857:2:1180 -8858:0:4365 -8859:3:2843 -8860:0:4365 -8861:2:1181 -8862:2:1185 -8863:2:1186 -8864:2:1194 -8865:2:1195 -8866:2:1199 -8867:2:1200 -8868:2:1194 -8869:2:1195 -8870:2:1196 -8871:2:1208 -8872:2:1213 -8873:2:1217 -8874:2:1218 -8875:2:1225 -8876:2:1226 -8877:2:1237 -8878:2:1238 -8879:2:1239 -8880:2:1237 -8881:2:1238 -8882:2:1239 -8883:2:1250 -8884:2:1255 -8885:2:1256 -8886:0:4365 -8887:3:2844 -8888:0:4365 -8889:2:1268 -8890:0:4365 -8891:3:2843 -8892:0:4365 -8893:2:1270 -8894:0:4365 -8895:3:2844 -8896:0:4365 -8897:2:1271 -8898:2:1275 -8899:2:1276 -8900:2:1284 -8901:2:1285 -8902:2:1289 -8903:2:1290 -8904:2:1284 -8905:2:1285 -8906:2:1289 -8907:2:1290 -8908:2:1298 -8909:2:1303 -8910:2:1307 -8911:2:1308 -8912:2:1315 -8913:2:1316 -8914:2:1327 -8915:2:1328 -8916:2:1329 -8917:2:1327 -8918:2:1328 -8919:2:1329 -8920:2:1340 -8921:2:1345 -8922:2:1346 -8923:0:4365 -8924:2:1358 -8925:0:4365 -8926:2:1454 -8927:0:4365 -8928:3:2843 -8929:0:4365 -8930:2:1455 -8931:0:4365 -8932:3:2844 -8933:0:4365 -8934:2:1652 -8935:0:4365 -8936:2:1653 -8937:0:4365 -8938:2:1657 -8939:0:4365 -8940:2:1660 -8941:0:4365 -8942:3:2843 -8943:0:4365 -8944:2:1665 -8945:2:1669 -8946:2:1670 -8947:2:1678 -8948:2:1679 -8949:2:1683 -8950:2:1684 -8951:2:1678 -8952:2:1679 -8953:2:1680 -8954:2:1692 -8955:2:1697 -8956:2:1701 -8957:2:1702 -8958:2:1709 -8959:2:1710 -8960:2:1721 -8961:2:1722 -8962:2:1723 -8963:2:1721 -8964:2:1722 -8965:2:1723 -8966:2:1734 -8967:2:1739 -8968:2:1740 -8969:0:4365 -8970:3:2844 -8971:0:4365 -8972:2:1752 -8973:0:4365 -8974:3:2843 -8975:0:4365 -8976:2:1754 -8977:0:4365 -8978:3:2844 -8979:0:4365 -8980:2:1755 -8981:2:1759 -8982:2:1760 -8983:2:1768 -8984:2:1769 -8985:2:1773 -8986:2:1774 -8987:2:1768 -8988:2:1769 -8989:2:1773 -8990:2:1774 -8991:2:1782 -8992:2:1787 -8993:2:1791 -8994:2:1792 -8995:2:1799 -8996:2:1800 -8997:2:1811 -8998:2:1812 -8999:2:1813 -9000:2:1811 -9001:2:1812 -9002:2:1813 -9003:2:1824 -9004:2:1829 -9005:2:1830 -9006:0:4365 -9007:2:1842 -9008:0:4365 -9009:3:2843 -9010:0:4365 -9011:2:1844 -9012:0:4365 -9013:3:2844 -9014:0:4365 -9015:2:1845 -9016:2:1849 -9017:2:1850 -9018:2:1858 -9019:2:1859 -9020:2:1863 -9021:2:1864 -9022:2:1858 -9023:2:1859 -9024:2:1863 -9025:2:1864 -9026:2:1872 -9027:2:1877 -9028:2:1881 -9029:2:1882 -9030:2:1889 -9031:2:1890 -9032:2:1901 -9033:2:1902 -9034:2:1903 -9035:2:1901 -9036:2:1902 -9037:2:1903 -9038:2:1914 -9039:2:1919 -9040:2:1920 -9041:0:4365 -9042:2:1932 -9043:0:4365 -9044:3:2843 -9045:0:4365 -9046:2:1934 -9047:0:4365 -9048:3:2844 -9049:0:4365 -9050:2:1935 -9051:0:4365 -9052:2:1936 -9053:0:4365 -9054:2:2129 -9055:0:4365 -9056:2:2130 -9057:0:4365 -9058:2:2134 -9059:0:4365 -9060:3:2843 -9061:0:4365 -9062:2:2136 -9063:0:4365 -9064:3:2844 -9065:0:4365 -9066:2:2137 -9067:2:2141 -9068:2:2142 -9069:2:2150 -9070:2:2151 -9071:2:2155 -9072:2:2156 -9073:2:2150 -9074:2:2151 -9075:2:2155 -9076:2:2156 -9077:2:2164 -9078:2:2169 -9079:2:2173 -9080:2:2174 -9081:2:2181 -9082:2:2182 -9083:2:2193 -9084:2:2194 -9085:2:2195 -9086:2:2193 -9087:2:2194 -9088:2:2195 -9089:2:2206 -9090:2:2211 -9091:2:2212 -9092:0:4365 -9093:2:2224 -9094:0:4365 -9095:3:2843 -9096:0:4365 -9097:2:2226 -9098:0:4365 -9099:3:2844 -9100:0:4365 -9101:2:1936 -9102:0:4365 -9103:2:2129 -9104:0:4365 -9105:2:2130 -9106:0:4365 -9107:2:2134 -9108:0:4365 -9109:3:2843 -9110:0:4365 -9111:2:2136 -9112:0:4365 -9113:3:2844 -9114:0:4365 -9115:2:2137 -9116:2:2141 -9117:2:2142 -9118:2:2150 -9119:2:2151 -9120:2:2155 -9121:2:2156 -9122:2:2150 -9123:2:2151 -9124:2:2152 -9125:2:2164 -9126:2:2169 -9127:2:2173 -9128:2:2174 -9129:2:2181 -9130:2:2182 -9131:2:2193 -9132:2:2194 -9133:2:2195 -9134:2:2193 -9135:2:2194 -9136:2:2195 -9137:2:2206 -9138:2:2211 -9139:2:2212 -9140:0:4365 -9141:2:2224 -9142:0:4365 -9143:3:2843 -9144:0:4365 -9145:2:2226 -9146:0:4365 -9147:3:2844 -9148:0:4365 -9149:2:2230 -9150:0:4365 -9151:3:2843 -9152:0:4365 -9153:2:2235 -9154:2:2239 -9155:2:2240 -9156:2:2248 -9157:2:2249 -9158:2:2253 -9159:2:2254 -9160:2:2248 -9161:2:2249 -9162:2:2250 -9163:2:2262 -9164:2:2267 -9165:2:2271 -9166:2:2272 -9167:2:2279 -9168:2:2280 -9169:2:2291 -9170:2:2292 -9171:2:2293 -9172:2:2291 -9173:2:2292 -9174:2:2293 -9175:2:2304 -9176:2:2309 -9177:2:2310 -9178:0:4365 -9179:3:2844 -9180:0:4365 -9181:2:2322 -9182:0:4365 -9183:2:1169 -9184:0:4365 -9185:3:2843 -9186:0:4365 -9187:2:1170 -9188:0:4365 -9189:3:2844 -9190:0:4365 -9191:3:2845 -9192:0:4365 -9193:3:2851 -9194:0:4365 -9195:3:2854 -9196:3:2855 -9197:3:2867 -9198:3:2868 -9199:3:2872 -9200:3:2873 -9201:3:2867 -9202:3:2868 -9203:3:2872 -9204:3:2873 -9205:3:2881 -9206:3:2886 -9207:3:2890 -9208:3:2891 -9209:3:2898 -9210:3:2899 -9211:3:2910 -9212:3:2911 -9213:3:2912 -9214:3:2910 -9215:3:2911 -9216:3:2912 -9217:3:2923 -9218:3:2928 -9219:3:2929 -9220:0:4365 -9221:3:2941 -9222:0:4365 -9223:3:2942 -9224:0:4365 -9225:2:1173 -9226:0:4365 -9227:3:2943 -9228:0:4365 -9229:2:1179 -9230:0:4365 -9231:2:1180 -9232:0:4365 -9233:3:2942 -9234:0:4365 -9235:2:1181 -9236:2:1185 -9237:2:1186 -9238:2:1194 -9239:2:1195 -9240:2:1199 -9241:2:1200 -9242:2:1194 -9243:2:1195 -9244:2:1199 -9245:2:1200 -9246:2:1208 -9247:2:1213 -9248:2:1217 -9249:2:1218 -9250:2:1225 -9251:2:1226 -9252:2:1237 -9253:2:1238 -9254:2:1239 -9255:2:1237 -9256:2:1238 -9257:2:1239 -9258:2:1250 -9259:2:1255 -9260:2:1256 -9261:0:4365 -9262:3:2943 -9263:0:4365 -9264:2:1268 -9265:0:4365 -9266:3:2942 -9267:0:4365 -9268:2:1270 -9269:0:4365 -9270:3:2943 -9271:0:4365 -9272:2:1271 -9273:2:1275 -9274:2:1276 -9275:2:1284 -9276:2:1285 -9277:2:1289 -9278:2:1290 -9279:2:1284 -9280:2:1285 -9281:2:1289 -9282:2:1290 -9283:2:1298 -9284:2:1303 -9285:2:1307 -9286:2:1308 -9287:2:1315 -9288:2:1316 -9289:2:1327 -9290:2:1328 -9291:2:1329 -9292:2:1327 -9293:2:1328 -9294:2:1329 -9295:2:1340 -9296:2:1345 -9297:2:1346 -9298:0:4365 -9299:2:1358 -9300:0:4365 -9301:2:1360 -9302:0:4365 -9303:3:2942 -9304:0:4365 -9305:2:1361 -9306:0:4365 -9307:3:2943 -9308:0:4365 -9309:2:1362 -9310:2:1366 -9311:2:1367 -9312:2:1375 -9313:2:1376 -9314:2:1380 -9315:2:1381 -9316:2:1375 -9317:2:1376 -9318:2:1380 -9319:2:1381 -9320:2:1389 -9321:2:1394 -9322:2:1398 -9323:2:1399 -9324:2:1406 -9325:2:1407 -9326:2:1418 -9327:2:1419 -9328:2:1420 -9329:2:1418 -9330:2:1419 -9331:2:1420 -9332:2:1431 -9333:2:1436 -9334:2:1437 -9335:0:4365 -9336:2:1449 -9337:0:4365 -9338:3:2942 -9339:0:4365 -9340:2:1451 -9341:0:4365 -9342:3:2943 -9343:0:4365 -9344:2:1652 -9345:0:4365 -9346:2:1653 -9347:0:4365 -9348:2:1657 -9349:0:4365 -9350:2:1180 -9351:0:4365 -9352:3:2942 -9353:0:4365 -9354:2:1181 -9355:2:1185 -9356:2:1186 -9357:2:1194 -9358:2:1195 -9359:2:1199 -9360:2:1200 -9361:2:1194 -9362:2:1195 -9363:2:1196 -9364:2:1208 -9365:2:1213 -9366:2:1217 -9367:2:1218 -9368:2:1225 -9369:2:1226 -9370:2:1237 -9371:2:1238 -9372:2:1239 -9373:2:1237 -9374:2:1238 -9375:2:1239 -9376:2:1250 -9377:2:1255 -9378:2:1256 -9379:0:4365 -9380:3:2943 -9381:0:4365 -9382:2:1268 -9383:0:4365 -9384:3:2942 -9385:0:4365 -9386:2:1270 -9387:0:4365 -9388:3:2943 -9389:0:4365 -9390:2:1271 -9391:2:1275 -9392:2:1276 -9393:2:1284 -9394:2:1285 -9395:2:1289 -9396:2:1290 -9397:2:1284 -9398:2:1285 -9399:2:1289 -9400:2:1290 -9401:2:1298 -9402:2:1303 -9403:2:1307 -9404:2:1308 -9405:2:1315 -9406:2:1316 -9407:2:1327 -9408:2:1328 -9409:2:1329 -9410:2:1327 -9411:2:1328 -9412:2:1329 -9413:2:1340 -9414:2:1345 -9415:2:1346 -9416:0:4365 -9417:2:1358 -9418:0:4365 -9419:2:1454 -9420:0:4365 -9421:3:2942 -9422:0:4365 -9423:2:1455 -9424:0:4365 -9425:3:2943 -9426:0:4365 -9427:2:1652 -9428:0:4365 -9429:2:1653 -9430:0:4365 -9431:2:1657 -9432:0:4365 -9433:2:1660 -9434:0:4365 -9435:3:2942 -9436:0:4365 -9437:2:1665 -9438:2:1669 -9439:2:1670 -9440:2:1678 -9441:2:1679 -9442:2:1683 -9443:2:1684 -9444:2:1678 -9445:2:1679 -9446:2:1680 -9447:2:1692 -9448:2:1697 -9449:2:1701 -9450:2:1702 -9451:2:1709 -9452:2:1710 -9453:2:1721 -9454:2:1722 -9455:2:1723 -9456:2:1721 -9457:2:1722 -9458:2:1723 -9459:2:1734 -9460:2:1739 -9461:2:1740 -9462:0:4365 -9463:3:2943 -9464:0:4365 -9465:2:1752 -9466:0:4365 -9467:3:2942 -9468:0:4365 -9469:2:1754 -9470:0:4365 -9471:3:2943 -9472:0:4365 -9473:2:1755 -9474:2:1759 -9475:2:1760 -9476:2:1768 -9477:2:1769 -9478:2:1773 -9479:2:1774 -9480:2:1768 -9481:2:1769 -9482:2:1773 -9483:2:1774 -9484:2:1782 -9485:2:1787 -9486:2:1791 -9487:2:1792 -9488:2:1799 -9489:2:1800 -9490:2:1811 -9491:2:1812 -9492:2:1813 -9493:2:1811 -9494:2:1812 -9495:2:1813 -9496:2:1824 -9497:2:1829 -9498:2:1830 -9499:0:4365 -9500:2:1842 -9501:0:4365 -9502:3:2942 -9503:0:4365 -9504:2:1844 -9505:0:4365 -9506:3:2943 -9507:0:4365 -9508:2:1845 -9509:2:1849 -9510:2:1850 -9511:2:1858 -9512:2:1859 -9513:2:1863 -9514:2:1864 -9515:2:1858 -9516:2:1859 -9517:2:1863 -9518:2:1864 -9519:2:1872 -9520:2:1877 -9521:2:1881 -9522:2:1882 -9523:2:1889 -9524:2:1890 -9525:2:1901 -9526:2:1902 -9527:2:1903 -9528:2:1901 -9529:2:1902 -9530:2:1903 -9531:2:1914 -9532:2:1919 -9533:2:1920 -9534:0:4365 -9535:2:1932 -9536:0:4365 -9537:3:2942 -9538:0:4365 -9539:2:1934 -9540:0:4365 -9541:3:2943 -9542:0:4365 -9543:2:1935 -9544:0:4365 -9545:2:1936 -9546:0:4365 -9547:2:2129 -9548:0:4365 -9549:2:2130 -9550:0:4365 -9551:2:2134 -9552:0:4365 -9553:3:2942 -9554:0:4365 -9555:2:2136 -9556:0:4365 -9557:3:2943 -9558:0:4365 -9559:2:2137 -9560:2:2141 -9561:2:2142 -9562:2:2150 -9563:2:2151 -9564:2:2155 -9565:2:2156 -9566:2:2150 -9567:2:2151 -9568:2:2155 -9569:2:2156 -9570:2:2164 -9571:2:2169 -9572:2:2173 -9573:2:2174 -9574:2:2181 -9575:2:2182 -9576:2:2193 -9577:2:2194 -9578:2:2195 -9579:2:2193 -9580:2:2194 -9581:2:2195 -9582:2:2206 -9583:2:2211 -9584:2:2212 -9585:0:4365 -9586:2:2224 -9587:0:4365 -9588:3:2942 -9589:0:4365 -9590:2:2226 -9591:0:4365 -9592:3:2943 -9593:0:4365 -9594:2:1936 -9595:0:4365 -9596:2:2129 -9597:0:4365 -9598:2:2130 -9599:0:4365 -9600:2:2134 -9601:0:4365 -9602:3:2942 -9603:0:4365 -9604:2:2136 -9605:0:4365 -9606:3:2943 -9607:0:4365 -9608:2:2137 -9609:2:2141 -9610:2:2142 -9611:2:2150 -9612:2:2151 -9613:2:2155 -9614:2:2156 -9615:2:2150 -9616:2:2151 -9617:2:2152 -9618:2:2164 -9619:2:2169 -9620:2:2173 -9621:2:2174 -9622:2:2181 -9623:2:2182 -9624:2:2193 -9625:2:2194 -9626:2:2195 -9627:2:2193 -9628:2:2194 -9629:2:2195 -9630:2:2206 -9631:2:2211 -9632:2:2212 -9633:0:4365 -9634:2:2224 -9635:0:4365 -9636:3:2942 -9637:0:4365 -9638:2:2226 -9639:0:4365 -9640:3:2943 -9641:0:4365 -9642:2:2230 -9643:0:4365 -9644:3:2942 -9645:0:4365 -9646:2:2235 -9647:2:2239 -9648:2:2240 -9649:2:2248 -9650:2:2249 -9651:2:2253 -9652:2:2254 -9653:2:2248 -9654:2:2249 -9655:2:2250 -9656:2:2262 -9657:2:2267 -9658:2:2271 -9659:2:2272 -9660:2:2279 -9661:2:2280 -9662:2:2291 -9663:2:2292 -9664:2:2293 -9665:2:2291 -9666:2:2292 -9667:2:2293 -9668:2:2304 -9669:2:2309 -9670:2:2310 -9671:0:4365 -9672:3:2943 -9673:0:4365 -9674:2:2322 -9675:0:4365 -9676:2:1169 -9677:0:4365 -9678:3:2942 -9679:0:4365 -9680:2:1170 -9681:0:4365 -9682:3:2943 -9683:0:4365 -9684:3:2944 -9685:0:4365 -9686:3:2950 -9687:0:4365 -9688:3:2951 -9689:0:4365 -9690:3:2952 -9691:0:4365 -9692:3:2953 -9693:0:4365 -9694:3:2954 -9695:3:2958 -9696:3:2959 -9697:3:2967 -9698:3:2968 -9699:3:2972 -9700:3:2973 -9701:3:2967 -9702:3:2968 -9703:3:2972 -9704:3:2973 -9705:3:2981 -9706:3:2986 -9707:3:2990 -9708:3:2991 -9709:3:2998 -9710:3:2999 -9711:3:3010 -9712:3:3011 -9713:3:3012 -9714:3:3010 -9715:3:3011 -9716:3:3012 -9717:3:3023 -9718:3:3028 -9719:3:3029 -9720:0:4365 -9721:3:3041 -9722:0:4365 -9723:3:3042 -9724:0:4365 -9725:2:1173 -9726:0:4365 -9727:3:3043 -9728:0:4365 -9729:2:1179 -9730:0:4365 -9731:2:1180 -9732:0:4365 -9733:3:3042 -9734:0:4365 -9735:2:1181 -9736:2:1185 -9737:2:1186 -9738:2:1194 -9739:2:1195 -9740:2:1199 -9741:2:1200 -9742:2:1194 -9743:2:1195 -9744:2:1199 -9745:2:1200 -9746:2:1208 -9747:2:1213 -9748:2:1217 -9749:2:1218 -9750:2:1225 -9751:2:1226 -9752:2:1237 -9753:2:1238 -9754:2:1239 -9755:2:1237 -9756:2:1238 -9757:2:1239 -9758:2:1250 -9759:2:1255 -9760:2:1256 -9761:0:4365 -9762:3:3043 -9763:0:4365 -9764:2:1268 -9765:0:4365 -9766:3:3042 -9767:0:4365 -9768:2:1270 -9769:0:4365 -9770:3:3043 -9771:0:4365 -9772:2:1271 -9773:2:1275 -9774:2:1276 -9775:2:1284 -9776:2:1285 -9777:2:1289 -9778:2:1290 -9779:2:1284 -9780:2:1285 -9781:2:1289 -9782:2:1290 -9783:2:1298 -9784:2:1303 -9785:2:1307 -9786:2:1308 -9787:2:1315 -9788:2:1316 -9789:2:1327 -9790:2:1328 -9791:2:1329 -9792:2:1327 -9793:2:1328 -9794:2:1329 -9795:2:1340 -9796:2:1345 -9797:2:1346 -9798:0:4365 -9799:2:1358 -9800:0:4365 -9801:2:1360 -9802:0:4365 -9803:3:3042 -9804:0:4365 -9805:2:1361 -9806:0:4365 -9807:3:3043 -9808:0:4365 -9809:2:1362 -9810:2:1366 -9811:2:1367 -9812:2:1375 -9813:2:1376 -9814:2:1380 -9815:2:1381 -9816:2:1375 -9817:2:1376 -9818:2:1380 -9819:2:1381 -9820:2:1389 -9821:2:1394 -9822:2:1398 -9823:2:1399 -9824:2:1406 -9825:2:1407 -9826:2:1418 -9827:2:1419 -9828:2:1420 -9829:2:1418 -9830:2:1419 -9831:2:1420 -9832:2:1431 -9833:2:1436 -9834:2:1437 -9835:0:4365 -9836:2:1449 -9837:0:4365 -9838:3:3042 -9839:0:4365 -9840:2:1451 -9841:0:4365 -9842:3:3043 -9843:0:4365 -9844:2:1652 -9845:0:4365 -9846:2:1653 -9847:0:4365 -9848:2:1657 -9849:0:4365 -9850:2:1180 -9851:0:4365 -9852:3:3042 -9853:0:4365 -9854:2:1181 -9855:2:1185 -9856:2:1186 -9857:2:1194 -9858:2:1195 -9859:2:1199 -9860:2:1200 -9861:2:1194 -9862:2:1195 -9863:2:1196 -9864:2:1208 -9865:2:1213 -9866:2:1217 -9867:2:1218 -9868:2:1225 -9869:2:1226 -9870:2:1237 -9871:2:1238 -9872:2:1239 -9873:2:1237 -9874:2:1238 -9875:2:1239 -9876:2:1250 -9877:2:1255 -9878:2:1256 -9879:0:4365 -9880:3:3043 -9881:0:4365 -9882:2:1268 -9883:0:4365 -9884:3:3042 -9885:0:4365 -9886:2:1270 -9887:0:4365 -9888:3:3043 -9889:0:4365 -9890:2:1271 -9891:2:1275 -9892:2:1276 -9893:2:1284 -9894:2:1285 -9895:2:1289 -9896:2:1290 -9897:2:1284 -9898:2:1285 -9899:2:1289 -9900:2:1290 -9901:2:1298 -9902:2:1303 -9903:2:1307 -9904:2:1308 -9905:2:1315 -9906:2:1316 -9907:2:1327 -9908:2:1328 -9909:2:1329 -9910:2:1327 -9911:2:1328 -9912:2:1329 -9913:2:1340 -9914:2:1345 -9915:2:1346 -9916:0:4365 -9917:2:1358 -9918:0:4365 -9919:2:1454 -9920:0:4365 -9921:3:3042 -9922:0:4365 -9923:2:1455 -9924:0:4365 -9925:3:3043 -9926:0:4365 -9927:2:1652 -9928:0:4365 -9929:2:1653 -9930:0:4365 -9931:2:1657 -9932:0:4365 -9933:2:1660 -9934:0:4365 -9935:3:3042 -9936:0:4365 -9937:2:1665 -9938:2:1669 -9939:2:1670 -9940:2:1678 -9941:2:1679 -9942:2:1683 -9943:2:1684 -9944:2:1678 -9945:2:1679 -9946:2:1680 -9947:2:1692 -9948:2:1697 -9949:2:1701 -9950:2:1702 -9951:2:1709 -9952:2:1710 -9953:2:1721 -9954:2:1722 -9955:2:1723 -9956:2:1721 -9957:2:1722 -9958:2:1723 -9959:2:1734 -9960:2:1739 -9961:2:1740 -9962:0:4365 -9963:3:3043 -9964:0:4365 -9965:2:1752 -9966:0:4365 -9967:3:3042 -9968:0:4365 -9969:2:1754 -9970:0:4365 -9971:3:3043 -9972:0:4365 -9973:2:1755 -9974:2:1759 -9975:2:1760 -9976:2:1768 -9977:2:1769 -9978:2:1773 -9979:2:1774 -9980:2:1768 -9981:2:1769 -9982:2:1773 -9983:2:1774 -9984:2:1782 -9985:2:1787 -9986:2:1791 -9987:2:1792 -9988:2:1799 -9989:2:1800 -9990:2:1811 -9991:2:1812 -9992:2:1813 -9993:2:1811 -9994:2:1812 -9995:2:1813 -9996:2:1824 -9997:2:1829 -9998:2:1830 -9999:0:4365 -10000:2:1842 -10001:0:4365 -10002:3:3042 -10003:0:4365 -10004:2:1844 -10005:0:4365 -10006:3:3043 -10007:0:4365 -10008:2:1845 -10009:2:1849 -10010:2:1850 -10011:2:1858 -10012:2:1859 -10013:2:1863 -10014:2:1864 -10015:2:1858 -10016:2:1859 -10017:2:1863 -10018:2:1864 -10019:2:1872 -10020:2:1877 -10021:2:1881 -10022:2:1882 -10023:2:1889 -10024:2:1890 -10025:2:1901 -10026:2:1902 -10027:2:1903 -10028:2:1901 -10029:2:1902 -10030:2:1903 -10031:2:1914 -10032:2:1919 -10033:2:1920 -10034:0:4365 -10035:2:1932 -10036:0:4365 -10037:3:3042 -10038:0:4365 -10039:2:1934 -10040:0:4365 -10041:3:3043 -10042:0:4365 -10043:2:1935 -10044:0:4365 -10045:2:1936 -10046:0:4365 -10047:2:2129 -10048:0:4365 -10049:2:2130 -10050:0:4365 -10051:2:2134 -10052:0:4365 -10053:3:3042 -10054:0:4365 -10055:2:2136 -10056:0:4365 -10057:3:3043 -10058:0:4365 -10059:2:2137 -10060:2:2141 -10061:2:2142 -10062:2:2150 -10063:2:2151 -10064:2:2155 -10065:2:2156 -10066:2:2150 -10067:2:2151 -10068:2:2155 -10069:2:2156 -10070:2:2164 -10071:2:2169 -10072:2:2173 -10073:2:2174 -10074:2:2181 -10075:2:2182 -10076:2:2193 -10077:2:2194 -10078:2:2195 -10079:2:2193 -10080:2:2194 -10081:2:2195 -10082:2:2206 -10083:2:2211 -10084:2:2212 -10085:0:4365 -10086:2:2224 -10087:0:4365 -10088:3:3042 -10089:0:4365 -10090:2:2226 -10091:0:4365 -10092:3:3043 -10093:0:4365 -10094:2:1936 -10095:0:4365 -10096:2:2129 -10097:0:4365 -10098:2:2130 -10099:0:4365 -10100:2:2134 -10101:0:4365 -10102:3:3042 -10103:0:4365 -10104:2:2136 -10105:0:4365 -10106:3:3043 -10107:0:4365 -10108:2:2137 -10109:2:2141 -10110:2:2142 -10111:2:2150 -10112:2:2151 -10113:2:2155 -10114:2:2156 -10115:2:2150 -10116:2:2151 -10117:2:2152 -10118:2:2164 -10119:2:2169 -10120:2:2173 -10121:2:2174 -10122:2:2181 -10123:2:2182 -10124:2:2193 -10125:2:2194 -10126:2:2195 -10127:2:2193 -10128:2:2194 -10129:2:2195 -10130:2:2206 -10131:2:2211 -10132:2:2212 -10133:0:4365 -10134:2:2224 -10135:0:4365 -10136:3:3042 -10137:0:4365 -10138:2:2226 -10139:0:4365 -10140:3:3043 -10141:0:4365 -10142:2:2230 -10143:0:4365 -10144:3:3042 -10145:0:4365 -10146:2:2235 -10147:2:2239 -10148:2:2240 -10149:2:2248 -10150:2:2249 -10151:2:2253 -10152:2:2254 -10153:2:2248 -10154:2:2249 -10155:2:2250 -10156:2:2262 -10157:2:2267 -10158:2:2271 -10159:2:2272 -10160:2:2279 -10161:2:2280 -10162:2:2291 -10163:2:2292 -10164:2:2293 -10165:2:2291 -10166:2:2292 -10167:2:2293 -10168:2:2304 -10169:2:2309 -10170:2:2310 -10171:0:4365 -10172:3:3043 -10173:0:4365 -10174:2:2322 -10175:0:4365 -10176:2:1169 -10177:0:4365 -10178:3:3042 -10179:0:4365 -10180:2:1170 -10181:0:4365 -10182:3:3043 -10183:0:4365 -10184:3:3044 -10185:0:4365 -10186:3:3257 -10187:0:4365 -10188:3:3265 -10189:0:4365 -10190:3:3266 -10191:3:3270 -10192:3:3271 -10193:3:3279 -10194:3:3280 -10195:3:3284 -10196:3:3285 -10197:3:3279 -10198:3:3280 -10199:3:3284 -10200:3:3285 -10201:3:3293 -10202:3:3298 -10203:3:3302 -10204:3:3303 -10205:3:3310 -10206:3:3311 -10207:3:3322 -10208:3:3323 -10209:3:3324 -10210:3:3322 -10211:3:3323 -10212:3:3324 -10213:3:3335 -10214:3:3340 -10215:3:3341 -10216:0:4365 -10217:3:3353 -10218:0:4365 -10219:3:3354 -10220:0:4365 -10221:2:1173 -10222:0:4365 -10223:3:3355 -10224:0:4365 -10225:2:1179 -10226:0:4365 -10227:2:1180 -10228:0:4365 -10229:3:3354 -10230:0:4365 -10231:2:1181 -10232:2:1185 -10233:2:1186 -10234:2:1194 -10235:2:1195 -10236:2:1199 -10237:2:1200 -10238:2:1194 -10239:2:1195 -10240:2:1199 -10241:2:1200 -10242:2:1208 -10243:2:1213 -10244:2:1217 -10245:2:1218 -10246:2:1225 -10247:2:1226 -10248:2:1237 -10249:2:1238 -10250:2:1239 -10251:2:1237 -10252:2:1238 -10253:2:1239 -10254:2:1250 -10255:2:1255 -10256:2:1256 -10257:0:4365 -10258:3:3355 -10259:0:4365 -10260:2:1268 -10261:0:4365 -10262:3:3354 -10263:0:4365 -10264:2:1270 -10265:0:4365 -10266:3:3355 -10267:0:4365 -10268:2:1271 -10269:2:1275 -10270:2:1276 -10271:2:1284 -10272:2:1285 -10273:2:1289 -10274:2:1290 -10275:2:1284 -10276:2:1285 -10277:2:1289 -10278:2:1290 -10279:2:1298 -10280:2:1303 -10281:2:1307 -10282:2:1308 -10283:2:1315 -10284:2:1316 -10285:2:1327 -10286:2:1328 -10287:2:1329 -10288:2:1327 -10289:2:1328 -10290:2:1329 -10291:2:1340 -10292:2:1345 -10293:2:1346 -10294:0:4365 -10295:2:1358 -10296:0:4365 -10297:2:1360 -10298:0:4365 -10299:3:3354 -10300:0:4365 -10301:2:1361 -10302:0:4365 -10303:3:3355 -10304:0:4365 -10305:2:1362 -10306:2:1366 -10307:2:1367 -10308:2:1375 -10309:2:1376 -10310:2:1380 -10311:2:1381 -10312:2:1375 -10313:2:1376 -10314:2:1380 -10315:2:1381 -10316:2:1389 -10317:2:1394 -10318:2:1398 -10319:2:1399 -10320:2:1406 -10321:2:1407 -10322:2:1418 -10323:2:1419 -10324:2:1420 -10325:2:1418 -10326:2:1419 -10327:2:1420 -10328:2:1431 -10329:2:1436 -10330:2:1437 -10331:0:4365 -10332:2:1449 -10333:0:4365 -10334:3:3354 -10335:0:4365 -10336:2:1451 -10337:0:4365 -10338:3:3355 -10339:0:4365 -10340:2:1652 -10341:0:4365 -10342:2:1653 -10343:0:4365 -10344:2:1657 -10345:0:4365 -10346:2:1180 -10347:0:4365 -10348:3:3354 -10349:0:4365 -10350:2:1181 -10351:2:1185 -10352:2:1186 -10353:2:1194 -10354:2:1195 -10355:2:1199 -10356:2:1200 -10357:2:1194 -10358:2:1195 -10359:2:1196 -10360:2:1208 -10361:2:1213 -10362:2:1217 -10363:2:1218 -10364:2:1225 -10365:2:1226 -10366:2:1237 -10367:2:1238 -10368:2:1239 -10369:2:1237 -10370:2:1238 -10371:2:1239 -10372:2:1250 -10373:2:1255 -10374:2:1256 -10375:0:4365 -10376:3:3355 -10377:0:4365 -10378:2:1268 -10379:0:4365 -10380:3:3354 -10381:0:4365 -10382:2:1270 -10383:0:4365 -10384:3:3355 -10385:0:4365 -10386:2:1271 -10387:2:1275 -10388:2:1276 -10389:2:1284 -10390:2:1285 -10391:2:1289 -10392:2:1290 -10393:2:1284 -10394:2:1285 -10395:2:1289 -10396:2:1290 -10397:2:1298 -10398:2:1303 -10399:2:1307 -10400:2:1308 -10401:2:1315 -10402:2:1316 -10403:2:1327 -10404:2:1328 -10405:2:1329 -10406:2:1327 -10407:2:1328 -10408:2:1329 -10409:2:1340 -10410:2:1345 -10411:2:1346 -10412:0:4365 -10413:2:1358 -10414:0:4365 -10415:2:1454 -10416:0:4365 -10417:3:3354 -10418:0:4365 -10419:2:1455 -10420:0:4365 -10421:3:3355 -10422:0:4365 -10423:2:1652 -10424:0:4365 -10425:2:1653 -10426:0:4365 -10427:2:1657 -10428:0:4365 -10429:2:1660 -10430:0:4365 -10431:3:3354 -10432:0:4365 -10433:2:1665 -10434:2:1669 -10435:2:1670 -10436:2:1678 -10437:2:1679 -10438:2:1683 -10439:2:1684 -10440:2:1678 -10441:2:1679 -10442:2:1680 -10443:2:1692 -10444:2:1697 -10445:2:1701 -10446:2:1702 -10447:2:1709 -10448:2:1710 -10449:2:1721 -10450:2:1722 -10451:2:1723 -10452:2:1721 -10453:2:1722 -10454:2:1723 -10455:2:1734 -10456:2:1739 -10457:2:1740 -10458:0:4365 -10459:3:3355 -10460:0:4365 -10461:2:1752 -10462:0:4365 -10463:3:3354 -10464:0:4365 -10465:2:1754 -10466:0:4365 -10467:3:3355 -10468:0:4365 -10469:2:1755 -10470:2:1759 -10471:2:1760 -10472:2:1768 -10473:2:1769 -10474:2:1773 -10475:2:1774 -10476:2:1768 -10477:2:1769 -10478:2:1773 -10479:2:1774 -10480:2:1782 -10481:2:1787 -10482:2:1791 -10483:2:1792 -10484:2:1799 -10485:2:1800 -10486:2:1811 -10487:2:1812 -10488:2:1813 -10489:2:1811 -10490:2:1812 -10491:2:1813 -10492:2:1824 -10493:2:1829 -10494:2:1830 -10495:0:4365 -10496:2:1842 -10497:0:4365 -10498:3:3354 -10499:0:4365 -10500:2:1844 -10501:0:4365 -10502:3:3355 -10503:0:4365 -10504:2:1845 -10505:2:1849 -10506:2:1850 -10507:2:1858 -10508:2:1859 -10509:2:1863 -10510:2:1864 -10511:2:1858 -10512:2:1859 -10513:2:1863 -10514:2:1864 -10515:2:1872 -10516:2:1877 -10517:2:1881 -10518:2:1882 -10519:2:1889 -10520:2:1890 -10521:2:1901 -10522:2:1902 -10523:2:1903 -10524:2:1901 -10525:2:1902 -10526:2:1903 -10527:2:1914 -10528:2:1919 -10529:2:1920 -10530:0:4365 -10531:2:1932 -10532:0:4365 -10533:3:3354 -10534:0:4365 -10535:2:1934 -10536:0:4365 -10537:3:3355 -10538:0:4365 -10539:2:1935 -10540:0:4365 -10541:2:1936 -10542:0:4365 -10543:2:2129 -10544:0:4365 -10545:2:2130 -10546:0:4365 -10547:2:2134 -10548:0:4365 -10549:3:3354 -10550:0:4365 -10551:2:2136 -10552:0:4365 -10553:3:3355 -10554:0:4365 -10555:2:2137 -10556:2:2141 -10557:2:2142 -10558:2:2150 -10559:2:2151 -10560:2:2155 -10561:2:2156 -10562:2:2150 -10563:2:2151 -10564:2:2155 -10565:2:2156 -10566:2:2164 -10567:2:2169 -10568:2:2173 -10569:2:2174 -10570:2:2181 -10571:2:2182 -10572:2:2193 -10573:2:2194 -10574:2:2195 -10575:2:2193 -10576:2:2194 -10577:2:2195 -10578:2:2206 -10579:2:2211 -10580:2:2212 -10581:0:4365 -10582:2:2224 -10583:0:4365 -10584:3:3354 -10585:0:4365 -10586:2:2226 -10587:0:4365 -10588:3:3355 -10589:0:4365 -10590:2:1936 -10591:0:4365 -10592:2:2129 -10593:0:4365 -10594:2:2130 -10595:0:4365 -10596:2:2134 -10597:0:4365 -10598:3:3354 -10599:0:4365 -10600:2:2136 -10601:0:4365 -10602:3:3355 -10603:0:4365 -10604:2:2137 -10605:2:2141 -10606:2:2142 -10607:2:2150 -10608:2:2151 -10609:2:2155 -10610:2:2156 -10611:2:2150 -10612:2:2151 -10613:2:2152 -10614:2:2164 -10615:2:2169 -10616:2:2173 -10617:2:2174 -10618:2:2181 -10619:2:2182 -10620:2:2193 -10621:2:2194 -10622:2:2195 -10623:2:2193 -10624:2:2194 -10625:2:2195 -10626:2:2206 -10627:2:2211 -10628:2:2212 -10629:0:4365 -10630:2:2224 -10631:0:4365 -10632:3:3354 -10633:0:4365 -10634:2:2226 -10635:0:4365 -10636:3:3355 -10637:0:4365 -10638:2:2230 -10639:0:4365 -10640:3:3354 -10641:0:4365 -10642:2:2235 -10643:2:2239 -10644:2:2240 -10645:2:2248 -10646:2:2249 -10647:2:2253 -10648:2:2254 -10649:2:2248 -10650:2:2249 -10651:2:2250 -10652:2:2262 -10653:2:2267 -10654:2:2271 -10655:2:2272 -10656:2:2279 -10657:2:2280 -10658:2:2291 -10659:2:2292 -10660:2:2293 -10661:2:2291 -10662:2:2292 -10663:2:2293 -10664:2:2304 -10665:2:2309 -10666:2:2310 -10667:0:4365 -10668:3:3355 -10669:0:4365 -10670:2:2322 -10671:0:4365 -10672:2:1169 -10673:0:4365 -10674:3:3354 -10675:0:4365 -10676:2:1170 -10677:0:4365 -10678:3:3355 -10679:0:4365 -10680:3:3356 -10681:0:4365 -10682:3:3366 -10683:0:4365 -10684:3:2951 -10685:0:4365 -10686:3:2952 -10687:0:4365 -10688:3:2953 -10689:0:4365 -10690:3:2954 -10691:3:2958 -10692:3:2959 -10693:3:2967 -10694:3:2968 -10695:3:2972 -10696:3:2973 -10697:3:2967 -10698:3:2968 -10699:3:2972 -10700:3:2973 -10701:3:2981 -10702:3:2986 -10703:3:2990 -10704:3:2991 -10705:3:2998 -10706:3:2999 -10707:3:3010 -10708:3:3011 -10709:3:3012 -10710:3:3010 -10711:3:3011 -10712:3:3012 -10713:3:3023 -10714:3:3028 -10715:3:3029 -10716:0:4365 -10717:3:3041 -10718:0:4365 -10719:3:3042 -10720:0:4365 -10721:2:1173 -10722:0:4365 -10723:3:3043 -10724:0:4365 -10725:2:1179 -10726:0:4365 -10727:2:1180 -10728:0:4365 -10729:3:3042 -10730:0:4365 -10731:2:1181 -10732:2:1185 -10733:2:1186 -10734:2:1194 -10735:2:1195 -10736:2:1199 -10737:2:1200 -10738:2:1194 -10739:2:1195 -10740:2:1199 -10741:2:1200 -10742:2:1208 -10743:2:1213 -10744:2:1217 -10745:2:1218 -10746:2:1225 -10747:2:1226 -10748:2:1237 -10749:2:1238 -10750:2:1239 -10751:2:1237 -10752:2:1238 -10753:2:1239 -10754:2:1250 -10755:2:1255 -10756:2:1256 -10757:0:4365 -10758:3:3043 -10759:0:4365 -10760:2:1268 -10761:0:4365 -10762:3:3042 -10763:0:4365 -10764:2:1270 -10765:0:4365 -10766:3:3043 -10767:0:4365 -10768:2:1271 -10769:2:1275 -10770:2:1276 -10771:2:1284 -10772:2:1285 -10773:2:1289 -10774:2:1290 -10775:2:1284 -10776:2:1285 -10777:2:1289 -10778:2:1290 -10779:2:1298 -10780:2:1303 -10781:2:1307 -10782:2:1308 -10783:2:1315 -10784:2:1316 -10785:2:1327 -10786:2:1328 -10787:2:1329 -10788:2:1327 -10789:2:1328 -10790:2:1329 -10791:2:1340 -10792:2:1345 -10793:2:1346 -10794:0:4365 -10795:2:1358 -10796:0:4365 -10797:2:1360 -10798:0:4365 -10799:3:3042 -10800:0:4365 -10801:2:1361 -10802:0:4365 -10803:3:3043 -10804:0:4365 -10805:2:1362 -10806:2:1366 -10807:2:1367 -10808:2:1375 -10809:2:1376 -10810:2:1380 -10811:2:1381 -10812:2:1375 -10813:2:1376 -10814:2:1380 -10815:2:1381 -10816:2:1389 -10817:2:1394 -10818:2:1398 -10819:2:1399 -10820:2:1406 -10821:2:1407 -10822:2:1418 -10823:2:1419 -10824:2:1420 -10825:2:1418 -10826:2:1419 -10827:2:1420 -10828:2:1431 -10829:2:1436 -10830:2:1437 -10831:0:4365 -10832:2:1449 -10833:0:4365 -10834:3:3042 -10835:0:4365 -10836:2:1451 -10837:0:4365 -10838:3:3043 -10839:0:4365 -10840:2:1652 -10841:0:4365 -10842:2:1653 -10843:0:4365 -10844:2:1657 -10845:0:4365 -10846:2:1180 -10847:0:4365 -10848:3:3042 -10849:0:4365 -10850:2:1181 -10851:2:1185 -10852:2:1186 -10853:2:1194 -10854:2:1195 -10855:2:1199 -10856:2:1200 -10857:2:1194 -10858:2:1195 -10859:2:1196 -10860:2:1208 -10861:2:1213 -10862:2:1217 -10863:2:1218 -10864:2:1225 -10865:2:1226 -10866:2:1237 -10867:2:1238 -10868:2:1239 -10869:2:1237 -10870:2:1238 -10871:2:1239 -10872:2:1250 -10873:2:1255 -10874:2:1256 -10875:0:4365 -10876:3:3043 -10877:0:4365 -10878:2:1268 -10879:0:4365 -10880:3:3042 -10881:0:4365 -10882:2:1270 -10883:0:4365 -10884:3:3043 -10885:0:4365 -10886:2:1271 -10887:2:1275 -10888:2:1276 -10889:2:1284 -10890:2:1285 -10891:2:1289 -10892:2:1290 -10893:2:1284 -10894:2:1285 -10895:2:1289 -10896:2:1290 -10897:2:1298 -10898:2:1303 -10899:2:1307 -10900:2:1308 -10901:2:1315 -10902:2:1316 -10903:2:1327 -10904:2:1328 -10905:2:1329 -10906:2:1327 -10907:2:1328 -10908:2:1329 -10909:2:1340 -10910:2:1345 -10911:2:1346 -10912:0:4365 -10913:2:1358 -10914:0:4365 -10915:2:1454 -10916:0:4365 -10917:3:3042 -10918:0:4365 -10919:2:1455 -10920:0:4365 -10921:3:3043 -10922:0:4365 -10923:2:1652 -10924:0:4365 -10925:2:1653 -10926:0:4365 -10927:2:1657 -10928:0:4365 -10929:2:1660 -10930:0:4365 -10931:3:3042 -10932:0:4365 -10933:2:1665 -10934:2:1669 -10935:2:1670 -10936:2:1678 -10937:2:1679 -10938:2:1683 -10939:2:1684 -10940:2:1678 -10941:2:1679 -10942:2:1680 -10943:2:1692 -10944:2:1697 -10945:2:1701 -10946:2:1702 -10947:2:1709 -10948:2:1710 -10949:2:1721 -10950:2:1722 -10951:2:1723 -10952:2:1721 -10953:2:1722 -10954:2:1723 -10955:2:1734 -10956:2:1739 -10957:2:1740 -10958:0:4365 -10959:3:3043 -10960:0:4365 -10961:2:1752 -10962:0:4365 -10963:3:3042 -10964:0:4365 -10965:2:1754 -10966:0:4365 -10967:3:3043 -10968:0:4365 -10969:2:1755 -10970:2:1759 -10971:2:1760 -10972:2:1768 -10973:2:1769 -10974:2:1773 -10975:2:1774 -10976:2:1768 -10977:2:1769 -10978:2:1773 -10979:2:1774 -10980:2:1782 -10981:2:1787 -10982:2:1791 -10983:2:1792 -10984:2:1799 -10985:2:1800 -10986:2:1811 -10987:2:1812 -10988:2:1813 -10989:2:1811 -10990:2:1812 -10991:2:1813 -10992:2:1824 -10993:2:1829 -10994:2:1830 -10995:0:4365 -10996:2:1842 -10997:0:4365 -10998:3:3042 -10999:0:4365 -11000:2:1844 -11001:0:4365 -11002:3:3043 -11003:0:4365 -11004:2:1845 -11005:2:1849 -11006:2:1850 -11007:2:1858 -11008:2:1859 -11009:2:1863 -11010:2:1864 -11011:2:1858 -11012:2:1859 -11013:2:1863 -11014:2:1864 -11015:2:1872 -11016:2:1877 -11017:2:1881 -11018:2:1882 -11019:2:1889 -11020:2:1890 -11021:2:1901 -11022:2:1902 -11023:2:1903 -11024:2:1901 -11025:2:1902 -11026:2:1903 -11027:2:1914 -11028:2:1919 -11029:2:1920 -11030:0:4365 -11031:2:1932 -11032:0:4365 -11033:3:3042 -11034:0:4365 -11035:2:1934 -11036:0:4365 -11037:3:3043 -11038:0:4365 -11039:2:1935 -11040:0:4365 -11041:2:1936 -11042:0:4365 -11043:2:2129 -11044:0:4365 -11045:2:2130 -11046:0:4365 -11047:2:2134 -11048:0:4365 -11049:3:3042 -11050:0:4365 -11051:2:2136 -11052:0:4365 -11053:3:3043 -11054:0:4365 -11055:2:2137 -11056:2:2141 -11057:2:2142 -11058:2:2150 -11059:2:2151 -11060:2:2155 -11061:2:2156 -11062:2:2150 -11063:2:2151 -11064:2:2155 -11065:2:2156 -11066:2:2164 -11067:2:2169 -11068:2:2173 -11069:2:2174 -11070:2:2181 -11071:2:2182 -11072:2:2193 -11073:2:2194 -11074:2:2195 -11075:2:2193 -11076:2:2194 -11077:2:2195 -11078:2:2206 -11079:2:2211 -11080:2:2212 -11081:0:4365 -11082:2:2224 -11083:0:4365 -11084:3:3042 -11085:0:4365 -11086:2:2226 -11087:0:4365 -11088:3:3043 -11089:0:4365 -11090:2:1936 -11091:0:4365 -11092:2:2129 -11093:0:4365 -11094:2:2130 -11095:0:4365 -11096:2:2134 -11097:0:4365 -11098:3:3042 -11099:0:4365 -11100:2:2136 -11101:0:4365 -11102:3:3043 -11103:0:4365 -11104:2:2137 -11105:2:2141 -11106:2:2142 -11107:2:2150 -11108:2:2151 -11109:2:2155 -11110:2:2156 -11111:2:2150 -11112:2:2151 -11113:2:2152 -11114:2:2164 -11115:2:2169 -11116:2:2173 -11117:2:2174 -11118:2:2181 -11119:2:2182 -11120:2:2193 -11121:2:2194 -11122:2:2195 -11123:2:2193 -11124:2:2194 -11125:2:2195 -11126:2:2206 -11127:2:2211 -11128:2:2212 -11129:0:4365 -11130:2:2224 -11131:0:4365 -11132:3:3042 -11133:0:4365 -11134:2:2226 -11135:0:4365 -11136:3:3043 -11137:0:4365 -11138:2:2230 -11139:0:4365 -11140:3:3042 -11141:0:4365 -11142:2:2235 -11143:2:2239 -11144:2:2240 -11145:2:2248 -11146:2:2249 -11147:2:2253 -11148:2:2254 -11149:2:2248 -11150:2:2249 -11151:2:2250 -11152:2:2262 -11153:2:2267 -11154:2:2271 -11155:2:2272 -11156:2:2279 -11157:2:2280 -11158:2:2291 -11159:2:2292 -11160:2:2293 -11161:2:2291 -11162:2:2292 -11163:2:2293 -11164:2:2304 -11165:2:2309 -11166:2:2310 -11167:0:4365 -11168:3:3043 -11169:0:4365 -11170:2:2322 -11171:0:4365 -11172:2:1169 -11173:0:4365 -11174:3:3042 -11175:0:4365 -11176:2:1170 -11177:0:4365 -11178:3:3043 -11179:0:4365 -11180:3:3044 -11181:0:4365 -11182:3:3257 -11183:0:4365 -11184:3:3362 -11185:0:4365 -11186:3:3363 -11187:0:4365 -11188:3:3367 -11189:0:4365 -11190:3:3373 -11191:3:3377 -11192:3:3378 -11193:3:3386 -11194:3:3387 -11195:3:3391 -11196:3:3392 -11197:3:3386 -11198:3:3387 -11199:3:3391 -11200:3:3392 -11201:3:3400 -11202:3:3405 -11203:3:3409 -11204:3:3410 -11205:3:3417 -11206:3:3418 -11207:3:3429 -11208:3:3430 -11209:3:3431 -11210:3:3429 -11211:3:3430 -11212:3:3431 -11213:3:3442 -11214:3:3447 -11215:3:3448 -11216:0:4365 -11217:3:3460 -11218:0:4365 -11219:3:3461 -11220:0:4365 -11221:2:1173 -11222:0:4365 -11223:3:3462 -11224:0:4365 -11225:2:1179 -11226:0:4365 -11227:2:1180 -11228:0:4365 -11229:3:3461 -11230:0:4365 -11231:2:1181 -11232:2:1185 -11233:2:1186 -11234:2:1194 -11235:2:1195 -11236:2:1199 -11237:2:1200 -11238:2:1194 -11239:2:1195 -11240:2:1199 -11241:2:1200 -11242:2:1208 -11243:2:1213 -11244:2:1217 -11245:2:1218 -11246:2:1225 -11247:2:1226 -11248:2:1237 -11249:2:1238 -11250:2:1239 -11251:2:1237 -11252:2:1238 -11253:2:1239 -11254:2:1250 -11255:2:1255 -11256:2:1256 -11257:0:4365 -11258:3:3462 -11259:0:4365 -11260:2:1268 -11261:0:4365 -11262:3:3461 -11263:0:4365 -11264:2:1270 -11265:0:4365 -11266:3:3462 -11267:0:4365 -11268:2:1271 -11269:2:1275 -11270:2:1276 -11271:2:1284 -11272:2:1285 -11273:2:1289 -11274:2:1290 -11275:2:1284 -11276:2:1285 -11277:2:1289 -11278:2:1290 -11279:2:1298 -11280:2:1303 -11281:2:1307 -11282:2:1308 -11283:2:1315 -11284:2:1316 -11285:2:1327 -11286:2:1328 -11287:2:1329 -11288:2:1327 -11289:2:1328 -11290:2:1329 -11291:2:1340 -11292:2:1345 -11293:2:1346 -11294:0:4365 -11295:2:1358 -11296:0:4365 -11297:2:1360 -11298:0:4365 -11299:3:3461 -11300:0:4365 -11301:2:1361 -11302:0:4365 -11303:3:3462 -11304:0:4365 -11305:2:1362 -11306:2:1366 -11307:2:1367 -11308:2:1375 -11309:2:1376 -11310:2:1380 -11311:2:1381 -11312:2:1375 -11313:2:1376 -11314:2:1380 -11315:2:1381 -11316:2:1389 -11317:2:1394 -11318:2:1398 -11319:2:1399 -11320:2:1406 -11321:2:1407 -11322:2:1418 -11323:2:1419 -11324:2:1420 -11325:2:1418 -11326:2:1419 -11327:2:1420 -11328:2:1431 -11329:2:1436 -11330:2:1437 -11331:0:4365 -11332:2:1449 -11333:0:4365 -11334:3:3461 -11335:0:4365 -11336:2:1451 -11337:0:4365 -11338:3:3462 -11339:0:4365 -11340:2:1652 -11341:0:4365 -11342:2:1653 -11343:0:4365 -11344:2:1657 -11345:0:4365 -11346:2:1180 -11347:0:4365 -11348:3:3461 -11349:0:4365 -11350:2:1181 -11351:2:1185 -11352:2:1186 -11353:2:1194 -11354:2:1195 -11355:2:1199 -11356:2:1200 -11357:2:1194 -11358:2:1195 -11359:2:1196 -11360:2:1208 -11361:2:1213 -11362:2:1217 -11363:2:1218 -11364:2:1225 -11365:2:1226 -11366:2:1237 -11367:2:1238 -11368:2:1239 -11369:2:1237 -11370:2:1238 -11371:2:1239 -11372:2:1250 -11373:2:1255 -11374:2:1256 -11375:0:4365 -11376:3:3462 -11377:0:4365 -11378:2:1268 -11379:0:4365 -11380:3:3461 -11381:0:4365 -11382:2:1270 -11383:0:4365 -11384:3:3462 -11385:0:4365 -11386:2:1271 -11387:2:1275 -11388:2:1276 -11389:2:1284 -11390:2:1285 -11391:2:1289 -11392:2:1290 -11393:2:1284 -11394:2:1285 -11395:2:1289 -11396:2:1290 -11397:2:1298 -11398:2:1303 -11399:2:1307 -11400:2:1308 -11401:2:1315 -11402:2:1316 -11403:2:1327 -11404:2:1328 -11405:2:1329 -11406:2:1327 -11407:2:1328 -11408:2:1329 -11409:2:1340 -11410:2:1345 -11411:2:1346 -11412:0:4365 -11413:2:1358 -11414:0:4365 -11415:2:1454 -11416:0:4365 -11417:3:3461 -11418:0:4365 -11419:2:1455 -11420:0:4365 -11421:3:3462 -11422:0:4365 -11423:2:1652 -11424:0:4365 -11425:2:1653 -11426:0:4365 -11427:2:1657 -11428:0:4365 -11429:2:1660 -11430:0:4365 -11431:3:3461 -11432:0:4365 -11433:2:1665 -11434:2:1669 -11435:2:1670 -11436:2:1678 -11437:2:1679 -11438:2:1683 -11439:2:1684 -11440:2:1678 -11441:2:1679 -11442:2:1680 -11443:2:1692 -11444:2:1697 -11445:2:1701 -11446:2:1702 -11447:2:1709 -11448:2:1710 -11449:2:1721 -11450:2:1722 -11451:2:1723 -11452:2:1721 -11453:2:1722 -11454:2:1723 -11455:2:1734 -11456:2:1739 -11457:2:1740 -11458:0:4365 -11459:3:3462 -11460:0:4365 -11461:2:1752 -11462:0:4365 -11463:3:3461 -11464:0:4365 -11465:2:1754 -11466:0:4365 -11467:3:3462 -11468:0:4365 -11469:2:1755 -11470:2:1759 -11471:2:1760 -11472:2:1768 -11473:2:1769 -11474:2:1773 -11475:2:1774 -11476:2:1768 -11477:2:1769 -11478:2:1773 -11479:2:1774 -11480:2:1782 -11481:2:1787 -11482:2:1791 -11483:2:1792 -11484:2:1799 -11485:2:1800 -11486:2:1811 -11487:2:1812 -11488:2:1813 -11489:2:1811 -11490:2:1812 -11491:2:1813 -11492:2:1824 -11493:2:1829 -11494:2:1830 -11495:0:4365 -11496:2:1842 -11497:0:4365 -11498:3:3461 -11499:0:4365 -11500:2:1844 -11501:0:4365 -11502:3:3462 -11503:0:4365 -11504:2:1845 -11505:2:1849 -11506:2:1850 -11507:2:1858 -11508:2:1859 -11509:2:1863 -11510:2:1864 -11511:2:1858 -11512:2:1859 -11513:2:1863 -11514:2:1864 -11515:2:1872 -11516:2:1877 -11517:2:1881 -11518:2:1882 -11519:2:1889 -11520:2:1890 -11521:2:1901 -11522:2:1902 -11523:2:1903 -11524:2:1901 -11525:2:1902 -11526:2:1903 -11527:2:1914 -11528:2:1919 -11529:2:1920 -11530:0:4365 -11531:2:1932 -11532:0:4365 -11533:3:3461 -11534:0:4365 -11535:2:1934 -11536:0:4365 -11537:3:3462 -11538:0:4365 -11539:2:1935 -11540:0:4365 -11541:2:1936 -11542:0:4365 -11543:2:2129 -11544:0:4365 -11545:2:2130 -11546:0:4365 -11547:2:2134 -11548:0:4365 -11549:3:3461 -11550:0:4365 -11551:2:2136 -11552:0:4365 -11553:3:3462 -11554:0:4365 -11555:2:2137 -11556:2:2141 -11557:2:2142 -11558:2:2150 -11559:2:2151 -11560:2:2155 -11561:2:2156 -11562:2:2150 -11563:2:2151 -11564:2:2155 -11565:2:2156 -11566:2:2164 -11567:2:2169 -11568:2:2173 -11569:2:2174 -11570:2:2181 -11571:2:2182 -11572:2:2193 -11573:2:2194 -11574:2:2195 -11575:2:2193 -11576:2:2194 -11577:2:2195 -11578:2:2206 -11579:2:2211 -11580:2:2212 -11581:0:4365 -11582:2:2224 -11583:0:4365 -11584:3:3461 -11585:0:4365 -11586:2:2226 -11587:0:4365 -11588:3:3462 -11589:0:4365 -11590:2:1936 -11591:0:4365 -11592:2:2129 -11593:0:4365 -11594:2:2130 -11595:0:4365 -11596:2:2134 -11597:0:4365 -11598:3:3461 -11599:0:4365 -11600:2:2136 -11601:0:4365 -11602:3:3462 -11603:0:4365 -11604:2:2137 -11605:2:2141 -11606:2:2142 -11607:2:2150 -11608:2:2151 -11609:2:2155 -11610:2:2156 -11611:2:2150 -11612:2:2151 -11613:2:2152 -11614:2:2164 -11615:2:2169 -11616:2:2173 -11617:2:2174 -11618:2:2181 -11619:2:2182 -11620:2:2193 -11621:2:2194 -11622:2:2195 -11623:2:2193 -11624:2:2194 -11625:2:2195 -11626:2:2206 -11627:2:2211 -11628:2:2212 -11629:0:4365 -11630:2:2224 -11631:0:4365 -11632:3:3461 -11633:0:4365 -11634:2:2226 -11635:0:4365 -11636:3:3462 -11637:0:4365 -11638:2:2230 -11639:0:4365 -11640:3:3461 -11641:0:4365 -11642:2:2235 -11643:2:2239 -11644:2:2240 -11645:2:2248 -11646:2:2249 -11647:2:2253 -11648:2:2254 -11649:2:2248 -11650:2:2249 -11651:2:2250 -11652:2:2262 -11653:2:2267 -11654:2:2271 -11655:2:2272 -11656:2:2279 -11657:2:2280 -11658:2:2291 -11659:2:2292 -11660:2:2293 -11661:2:2291 -11662:2:2292 -11663:2:2293 -11664:2:2304 -11665:2:2309 -11666:2:2310 -11667:0:4365 -11668:3:3462 -11669:0:4365 -11670:2:2322 -11671:0:4365 -11672:2:1169 -11673:0:4365 -11674:3:3461 -11675:0:4365 -11676:2:1170 -11677:0:4365 -11678:3:3462 -11679:0:4365 -11680:3:3463 -11681:0:4365 -11682:3:3469 -11683:0:4365 -11684:3:3470 -11685:3:3474 -11686:3:3475 -11687:3:3483 -11688:3:3484 -11689:3:3488 -11690:3:3489 -11691:3:3483 -11692:3:3484 -11693:3:3488 -11694:3:3489 -11695:3:3497 -11696:3:3502 -11697:3:3506 -11698:3:3507 -11699:3:3514 -11700:3:3515 -11701:3:3526 -11702:3:3527 -11703:3:3528 -11704:3:3526 -11705:3:3527 -11706:3:3528 -11707:3:3539 -11708:3:3544 -11709:3:3545 -11710:0:4365 -11711:3:3557 -11712:0:4365 -11713:3:3558 -11714:0:4365 -11715:2:1173 -11716:0:4365 -11717:3:3559 -11718:0:4365 -11719:2:1179 -11720:0:4365 -11721:2:1180 -11722:0:4365 -11723:3:3558 -11724:0:4365 -11725:2:1181 -11726:2:1185 -11727:2:1186 -11728:2:1194 -11729:2:1195 -11730:2:1199 -11731:2:1200 -11732:2:1194 -11733:2:1195 -11734:2:1199 -11735:2:1200 -11736:2:1208 -11737:2:1213 -11738:2:1217 -11739:2:1218 -11740:2:1225 -11741:2:1226 -11742:2:1237 -11743:2:1238 -11744:2:1239 -11745:2:1237 -11746:2:1238 -11747:2:1239 -11748:2:1250 -11749:2:1255 -11750:2:1256 -11751:0:4365 -11752:3:3559 -11753:0:4365 -11754:2:1268 -11755:0:4365 -11756:3:3558 -11757:0:4365 -11758:2:1270 -11759:0:4365 -11760:3:3559 -11761:0:4365 -11762:2:1271 -11763:2:1275 -11764:2:1276 -11765:2:1284 -11766:2:1285 -11767:2:1289 -11768:2:1290 -11769:2:1284 -11770:2:1285 -11771:2:1289 -11772:2:1290 -11773:2:1298 -11774:2:1303 -11775:2:1307 -11776:2:1308 -11777:2:1315 -11778:2:1316 -11779:2:1327 -11780:2:1328 -11781:2:1329 -11782:2:1327 -11783:2:1328 -11784:2:1329 -11785:2:1340 -11786:2:1345 -11787:2:1346 -11788:0:4365 -11789:2:1358 -11790:0:4365 -11791:2:1360 -11792:0:4365 -11793:3:3558 -11794:0:4365 -11795:2:1361 -11796:0:4365 -11797:3:3559 -11798:0:4365 -11799:2:1362 -11800:2:1366 -11801:2:1367 -11802:2:1375 -11803:2:1376 -11804:2:1380 -11805:2:1381 -11806:2:1375 -11807:2:1376 -11808:2:1380 -11809:2:1381 -11810:2:1389 -11811:2:1394 -11812:2:1398 -11813:2:1399 -11814:2:1406 -11815:2:1407 -11816:2:1418 -11817:2:1419 -11818:2:1420 -11819:2:1418 -11820:2:1419 -11821:2:1420 -11822:2:1431 -11823:2:1436 -11824:2:1437 -11825:0:4365 -11826:2:1449 -11827:0:4365 -11828:3:3558 -11829:0:4365 -11830:2:1451 -11831:0:4365 -11832:3:3559 -11833:0:4365 -11834:2:1652 -11835:0:4365 -11836:2:1653 -11837:0:4365 -11838:2:1657 -11839:0:4365 -11840:2:1180 -11841:0:4365 -11842:3:3558 -11843:0:4365 -11844:2:1181 -11845:2:1185 -11846:2:1186 -11847:2:1194 -11848:2:1195 -11849:2:1199 -11850:2:1200 -11851:2:1194 -11852:2:1195 -11853:2:1196 -11854:2:1208 -11855:2:1213 -11856:2:1217 -11857:2:1218 -11858:2:1225 -11859:2:1226 -11860:2:1237 -11861:2:1238 -11862:2:1239 -11863:2:1237 -11864:2:1238 -11865:2:1239 -11866:2:1250 -11867:2:1255 -11868:2:1256 -11869:0:4365 -11870:3:3559 -11871:0:4365 -11872:2:1268 -11873:0:4365 -11874:3:3558 -11875:0:4365 -11876:2:1270 -11877:0:4365 -11878:3:3559 -11879:0:4365 -11880:2:1271 -11881:2:1275 -11882:2:1276 -11883:2:1284 -11884:2:1285 -11885:2:1289 -11886:2:1290 -11887:2:1284 -11888:2:1285 -11889:2:1289 -11890:2:1290 -11891:2:1298 -11892:2:1303 -11893:2:1307 -11894:2:1308 -11895:2:1315 -11896:2:1316 -11897:2:1327 -11898:2:1328 -11899:2:1329 -11900:2:1327 -11901:2:1328 -11902:2:1329 -11903:2:1340 -11904:2:1345 -11905:2:1346 -11906:0:4365 -11907:2:1358 -11908:0:4365 -11909:2:1454 -11910:0:4365 -11911:3:3558 -11912:0:4365 -11913:2:1455 -11914:0:4365 -11915:3:3559 -11916:0:4365 -11917:2:1652 -11918:0:4365 -11919:2:1653 -11920:0:4365 -11921:2:1657 -11922:0:4365 -11923:2:1660 -11924:0:4365 -11925:3:3558 -11926:0:4365 -11927:2:1665 -11928:2:1669 -11929:2:1670 -11930:2:1678 -11931:2:1679 -11932:2:1683 -11933:2:1684 -11934:2:1678 -11935:2:1679 -11936:2:1680 -11937:2:1692 -11938:2:1697 -11939:2:1701 -11940:2:1702 -11941:2:1709 -11942:2:1710 -11943:2:1721 -11944:2:1722 -11945:2:1723 -11946:2:1721 -11947:2:1722 -11948:2:1723 -11949:2:1734 -11950:2:1739 -11951:2:1740 -11952:0:4365 -11953:3:3559 -11954:0:4365 -11955:2:1752 -11956:0:4365 -11957:3:3558 -11958:0:4365 -11959:2:1754 -11960:0:4365 -11961:3:3559 -11962:0:4365 -11963:2:1755 -11964:2:1759 -11965:2:1760 -11966:2:1768 -11967:2:1769 -11968:2:1773 -11969:2:1774 -11970:2:1768 -11971:2:1769 -11972:2:1773 -11973:2:1774 -11974:2:1782 -11975:2:1787 -11976:2:1791 -11977:2:1792 -11978:2:1799 -11979:2:1800 -11980:2:1811 -11981:2:1812 -11982:2:1813 -11983:2:1811 -11984:2:1812 -11985:2:1813 -11986:2:1824 -11987:2:1829 -11988:2:1830 -11989:0:4365 -11990:2:1842 -11991:0:4365 -11992:3:3558 -11993:0:4365 -11994:2:1844 -11995:0:4365 -11996:3:3559 -11997:0:4365 -11998:2:1845 -11999:2:1849 -12000:2:1850 -12001:2:1858 -12002:2:1859 -12003:2:1863 -12004:2:1864 -12005:2:1858 -12006:2:1859 -12007:2:1863 -12008:2:1864 -12009:2:1872 -12010:2:1877 -12011:2:1881 -12012:2:1882 -12013:2:1889 -12014:2:1890 -12015:2:1901 -12016:2:1902 -12017:2:1903 -12018:2:1901 -12019:2:1902 -12020:2:1903 -12021:2:1914 -12022:2:1919 -12023:2:1920 -12024:0:4365 -12025:2:1932 -12026:0:4365 -12027:3:3558 -12028:0:4365 -12029:2:1934 -12030:0:4365 -12031:3:3559 -12032:0:4365 -12033:2:1935 -12034:0:4365 -12035:2:1936 -12036:0:4365 -12037:2:2129 -12038:0:4365 -12039:2:2130 -12040:0:4365 -12041:2:2134 -12042:0:4365 -12043:3:3558 -12044:0:4365 -12045:2:2136 -12046:0:4365 -12047:3:3559 -12048:0:4365 -12049:2:2137 -12050:2:2141 -12051:2:2142 -12052:2:2150 -12053:2:2151 -12054:2:2155 -12055:2:2156 -12056:2:2150 -12057:2:2151 -12058:2:2155 -12059:2:2156 -12060:2:2164 -12061:2:2169 -12062:2:2173 -12063:2:2174 -12064:2:2181 -12065:2:2182 -12066:2:2193 -12067:2:2194 -12068:2:2195 -12069:2:2193 -12070:2:2194 -12071:2:2195 -12072:2:2206 -12073:2:2211 -12074:2:2212 -12075:0:4365 -12076:2:2224 -12077:0:4365 -12078:3:3558 -12079:0:4365 -12080:2:2226 -12081:0:4365 -12082:3:3559 -12083:0:4365 -12084:2:1936 -12085:0:4365 -12086:2:2129 -12087:0:4365 -12088:2:2130 -12089:0:4365 -12090:2:2134 -12091:0:4365 -12092:3:3558 -12093:0:4365 -12094:2:2136 -12095:0:4365 -12096:3:3559 -12097:0:4365 -12098:2:2137 -12099:2:2141 -12100:2:2142 -12101:2:2150 -12102:2:2151 -12103:2:2155 -12104:2:2156 -12105:2:2150 -12106:2:2151 -12107:2:2152 -12108:2:2164 -12109:2:2169 -12110:2:2173 -12111:2:2174 -12112:2:2181 -12113:2:2182 -12114:2:2193 -12115:2:2194 -12116:2:2195 -12117:2:2193 -12118:2:2194 -12119:2:2195 -12120:2:2206 -12121:2:2211 -12122:2:2212 -12123:0:4365 -12124:2:2224 -12125:0:4365 -12126:3:3558 -12127:0:4365 -12128:2:2226 -12129:0:4365 -12130:3:3559 -12131:0:4365 -12132:2:2230 -12133:0:4365 -12134:3:3558 -12135:0:4365 -12136:2:2235 -12137:2:2239 -12138:2:2240 -12139:2:2248 -12140:2:2249 -12141:2:2253 -12142:2:2254 -12143:2:2248 -12144:2:2249 -12145:2:2250 -12146:2:2262 -12147:2:2267 -12148:2:2271 -12149:2:2272 -12150:2:2279 -12151:2:2280 -12152:2:2291 -12153:2:2292 -12154:2:2293 -12155:2:2291 -12156:2:2292 -12157:2:2293 -12158:2:2304 -12159:2:2309 -12160:2:2310 -12161:0:4365 -12162:3:3559 -12163:0:4365 -12164:2:2322 -12165:0:4365 -12166:2:1169 -12167:0:4365 -12168:3:3558 -12169:0:4365 -12170:2:1170 -12171:0:4365 -12172:3:3559 -12173:0:4365 -12174:3:3560 -12175:0:4365 -12176:3:3566 -12177:0:4365 -12178:3:3569 -12179:3:3570 -12180:3:3582 -12181:3:3583 -12182:3:3587 -12183:3:3588 -12184:3:3582 -12185:3:3583 -12186:3:3587 -12187:3:3588 -12188:3:3596 -12189:3:3601 -12190:3:3605 -12191:3:3606 -12192:3:3613 -12193:3:3614 -12194:3:3625 -12195:3:3626 -12196:3:3627 -12197:3:3625 -12198:3:3626 -12199:3:3627 -12200:3:3638 -12201:3:3643 -12202:3:3644 -12203:0:4365 -12204:3:3656 -12205:0:4365 -12206:3:3657 -12207:0:4365 -12208:2:1173 -12209:0:4365 -12210:3:3658 -12211:0:4365 -12212:2:1179 -12213:0:4365 -12214:2:1180 -12215:0:4365 -12216:3:3657 -12217:0:4365 -12218:2:1181 -12219:2:1185 -12220:2:1186 -12221:2:1194 -12222:2:1195 -12223:2:1199 -12224:2:1200 -12225:2:1194 -12226:2:1195 -12227:2:1199 -12228:2:1200 -12229:2:1208 -12230:2:1213 -12231:2:1217 -12232:2:1218 -12233:2:1225 -12234:2:1226 -12235:2:1237 -12236:2:1238 -12237:2:1239 -12238:2:1237 -12239:2:1238 -12240:2:1239 -12241:2:1250 -12242:2:1255 -12243:2:1256 -12244:0:4365 -12245:3:3658 -12246:0:4365 -12247:2:1268 -12248:0:4365 -12249:3:3657 -12250:0:4365 -12251:2:1270 -12252:0:4365 -12253:3:3658 -12254:0:4365 -12255:2:1271 -12256:2:1275 -12257:2:1276 -12258:2:1284 -12259:2:1285 -12260:2:1289 -12261:2:1290 -12262:2:1284 -12263:2:1285 -12264:2:1289 -12265:2:1290 -12266:2:1298 -12267:2:1303 -12268:2:1307 -12269:2:1308 -12270:2:1315 -12271:2:1316 -12272:2:1327 -12273:2:1328 -12274:2:1329 -12275:2:1327 -12276:2:1328 -12277:2:1329 -12278:2:1340 -12279:2:1345 -12280:2:1346 -12281:0:4365 -12282:2:1358 -12283:0:4365 -12284:2:1360 -12285:0:4365 -12286:3:3657 -12287:0:4365 -12288:2:1361 -12289:0:4365 -12290:3:3658 -12291:0:4365 -12292:2:1362 -12293:2:1366 -12294:2:1367 -12295:2:1375 -12296:2:1376 -12297:2:1380 -12298:2:1381 -12299:2:1375 -12300:2:1376 -12301:2:1380 -12302:2:1381 -12303:2:1389 -12304:2:1394 -12305:2:1398 -12306:2:1399 -12307:2:1406 -12308:2:1407 -12309:2:1418 -12310:2:1419 -12311:2:1420 -12312:2:1418 -12313:2:1419 -12314:2:1420 -12315:2:1431 -12316:2:1436 -12317:2:1437 -12318:0:4365 -12319:2:1449 -12320:0:4365 -12321:3:3657 -12322:0:4365 -12323:2:1451 -12324:0:4365 -12325:3:3658 -12326:0:4365 -12327:2:1652 -12328:0:4365 -12329:2:1653 -12330:0:4365 -12331:2:1657 -12332:0:4365 -12333:2:1180 -12334:0:4365 -12335:3:3657 -12336:0:4365 -12337:2:1181 -12338:2:1185 -12339:2:1186 -12340:2:1194 -12341:2:1195 -12342:2:1199 -12343:2:1200 -12344:2:1194 -12345:2:1195 -12346:2:1196 -12347:2:1208 -12348:2:1213 -12349:2:1217 -12350:2:1218 -12351:2:1225 -12352:2:1226 -12353:2:1237 -12354:2:1238 -12355:2:1239 -12356:2:1237 -12357:2:1238 -12358:2:1239 -12359:2:1250 -12360:2:1255 -12361:2:1256 -12362:0:4365 -12363:3:3658 -12364:0:4365 -12365:2:1268 -12366:0:4365 -12367:3:3657 -12368:0:4365 -12369:2:1270 -12370:0:4365 -12371:3:3658 -12372:0:4365 -12373:2:1271 -12374:2:1275 -12375:2:1276 -12376:2:1284 -12377:2:1285 -12378:2:1289 -12379:2:1290 -12380:2:1284 -12381:2:1285 -12382:2:1289 -12383:2:1290 -12384:2:1298 -12385:2:1303 -12386:2:1307 -12387:2:1308 -12388:2:1315 -12389:2:1316 -12390:2:1327 -12391:2:1328 -12392:2:1329 -12393:2:1327 -12394:2:1328 -12395:2:1329 -12396:2:1340 -12397:2:1345 -12398:2:1346 -12399:0:4365 -12400:2:1358 -12401:0:4365 -12402:2:1454 -12403:0:4365 -12404:3:3657 -12405:0:4365 -12406:2:1455 -12407:0:4365 -12408:3:3658 -12409:0:4365 -12410:2:1652 -12411:0:4365 -12412:2:1653 -12413:0:4365 -12414:2:1657 -12415:0:4365 -12416:2:1660 -12417:0:4365 -12418:3:3657 -12419:0:4365 -12420:2:1665 -12421:2:1669 -12422:2:1670 -12423:2:1678 -12424:2:1679 -12425:2:1683 -12426:2:1684 -12427:2:1678 -12428:2:1679 -12429:2:1680 -12430:2:1692 -12431:2:1697 -12432:2:1701 -12433:2:1702 -12434:2:1709 -12435:2:1710 -12436:2:1721 -12437:2:1722 -12438:2:1723 -12439:2:1721 -12440:2:1722 -12441:2:1723 -12442:2:1734 -12443:2:1739 -12444:2:1740 -12445:0:4365 -12446:3:3658 -12447:0:4365 -12448:2:1752 -12449:0:4365 -12450:3:3657 -12451:0:4365 -12452:2:1754 -12453:0:4365 -12454:3:3658 -12455:0:4365 -12456:2:1755 -12457:2:1759 -12458:2:1760 -12459:2:1768 -12460:2:1769 -12461:2:1773 -12462:2:1774 -12463:2:1768 -12464:2:1769 -12465:2:1773 -12466:2:1774 -12467:2:1782 -12468:2:1787 -12469:2:1791 -12470:2:1792 -12471:2:1799 -12472:2:1800 -12473:2:1811 -12474:2:1812 -12475:2:1813 -12476:2:1811 -12477:2:1812 -12478:2:1813 -12479:2:1824 -12480:2:1829 -12481:2:1830 -12482:0:4365 -12483:2:1842 -12484:0:4365 -12485:3:3657 -12486:0:4365 -12487:2:1844 -12488:0:4365 -12489:3:3658 -12490:0:4365 -12491:2:1845 -12492:2:1849 -12493:2:1850 -12494:2:1858 -12495:2:1859 -12496:2:1863 -12497:2:1864 -12498:2:1858 -12499:2:1859 -12500:2:1863 -12501:2:1864 -12502:2:1872 -12503:2:1877 -12504:2:1881 -12505:2:1882 -12506:2:1889 -12507:2:1890 -12508:2:1901 -12509:2:1902 -12510:2:1903 -12511:2:1901 -12512:2:1902 -12513:2:1903 -12514:2:1914 -12515:2:1919 -12516:2:1920 -12517:0:4365 -12518:2:1932 -12519:0:4365 -12520:3:3657 -12521:0:4365 -12522:2:1934 -12523:0:4365 -12524:3:3658 -12525:0:4365 -12526:2:1935 -12527:0:4365 -12528:2:1936 -12529:0:4365 -12530:2:2129 -12531:0:4365 -12532:2:2130 -12533:0:4365 -12534:2:2134 -12535:0:4365 -12536:3:3657 -12537:0:4365 -12538:2:2136 -12539:0:4365 -12540:3:3658 -12541:0:4365 -12542:2:2137 -12543:2:2141 -12544:2:2142 -12545:2:2150 -12546:2:2151 -12547:2:2155 -12548:2:2156 -12549:2:2150 -12550:2:2151 -12551:2:2155 -12552:2:2156 -12553:2:2164 -12554:2:2169 -12555:2:2173 -12556:2:2174 -12557:2:2181 -12558:2:2182 -12559:2:2193 -12560:2:2194 -12561:2:2195 -12562:2:2193 -12563:2:2194 -12564:2:2195 -12565:2:2206 -12566:2:2211 -12567:2:2212 -12568:0:4365 -12569:2:2224 -12570:0:4365 -12571:3:3657 -12572:0:4365 -12573:2:2226 -12574:0:4365 -12575:3:3658 -12576:0:4365 -12577:2:1936 -12578:0:4365 -12579:2:2129 -12580:0:4365 -12581:2:2130 -12582:0:4365 -12583:2:2134 -12584:0:4365 -12585:3:3657 -12586:0:4365 -12587:2:2136 -12588:0:4365 -12589:3:3658 -12590:0:4365 -12591:2:2137 -12592:2:2141 -12593:2:2142 -12594:2:2150 -12595:2:2151 -12596:2:2155 -12597:2:2156 -12598:2:2150 -12599:2:2151 -12600:2:2152 -12601:2:2164 -12602:2:2169 -12603:2:2173 -12604:2:2174 -12605:2:2181 -12606:2:2182 -12607:2:2193 -12608:2:2194 -12609:2:2195 -12610:2:2193 -12611:2:2194 -12612:2:2195 -12613:2:2206 -12614:2:2211 -12615:2:2212 -12616:0:4365 -12617:2:2224 -12618:0:4365 -12619:3:3657 -12620:0:4365 -12621:2:2226 -12622:0:4365 -12623:3:3658 -12624:0:4365 -12625:2:2230 -12626:0:4365 -12627:3:3657 -12628:0:4365 -12629:2:2235 -12630:2:2239 -12631:2:2240 -12632:2:2248 -12633:2:2249 -12634:2:2253 -12635:2:2254 -12636:2:2248 -12637:2:2249 -12638:2:2250 -12639:2:2262 -12640:2:2267 -12641:2:2271 -12642:2:2272 -12643:2:2279 -12644:2:2280 -12645:2:2291 -12646:2:2292 -12647:2:2293 -12648:2:2291 -12649:2:2292 -12650:2:2293 -12651:2:2304 -12652:2:2309 -12653:2:2310 -12654:0:4365 -12655:3:3658 -12656:0:4365 -12657:2:2322 -12658:0:4365 -12659:2:1169 -12660:0:4365 -12661:3:3657 -12662:0:4365 -12663:2:1170 -12664:0:4365 -12665:3:3658 -12666:0:4365 -12667:3:3659 -12668:0:4365 -12669:3:3665 -12670:0:4365 -12671:3:3666 -12672:0:4365 -12673:3:3667 -12674:0:4365 -12675:3:3668 -12676:0:4365 -12677:3:3669 -12678:3:3673 -12679:3:3674 -12680:3:3682 -12681:3:3683 -12682:3:3687 -12683:3:3688 -12684:3:3682 -12685:3:3683 -12686:3:3687 -12687:3:3688 -12688:3:3696 -12689:3:3701 -12690:3:3705 -12691:3:3706 -12692:3:3713 -12693:3:3714 -12694:3:3725 -12695:3:3726 -12696:3:3727 -12697:3:3725 -12698:3:3726 -12699:3:3727 -12700:3:3738 -12701:3:3743 -12702:3:3744 -12703:0:4365 -12704:3:3756 -12705:0:4365 -12706:3:3757 -12707:0:4365 -12708:2:1173 -12709:0:4365 -12710:3:3758 -12711:0:4365 -12712:2:1179 -12713:0:4365 -12714:2:1180 -12715:0:4365 -12716:3:3757 -12717:0:4365 -12718:2:1181 -12719:2:1185 -12720:2:1186 -12721:2:1194 -12722:2:1195 -12723:2:1199 -12724:2:1200 -12725:2:1194 -12726:2:1195 -12727:2:1199 -12728:2:1200 -12729:2:1208 -12730:2:1213 -12731:2:1217 -12732:2:1218 -12733:2:1225 -12734:2:1226 -12735:2:1237 -12736:2:1238 -12737:2:1239 -12738:2:1237 -12739:2:1238 -12740:2:1239 -12741:2:1250 -12742:2:1255 -12743:2:1256 -12744:0:4365 -12745:3:3758 -12746:0:4365 -12747:2:1268 -12748:0:4365 -12749:3:3757 -12750:0:4365 -12751:2:1270 -12752:0:4365 -12753:3:3758 -12754:0:4365 -12755:2:1271 -12756:2:1275 -12757:2:1276 -12758:2:1284 -12759:2:1285 -12760:2:1289 -12761:2:1290 -12762:2:1284 -12763:2:1285 -12764:2:1289 -12765:2:1290 -12766:2:1298 -12767:2:1303 -12768:2:1307 -12769:2:1308 -12770:2:1315 -12771:2:1316 -12772:2:1327 -12773:2:1328 -12774:2:1329 -12775:2:1327 -12776:2:1328 -12777:2:1329 -12778:2:1340 -12779:2:1345 -12780:2:1346 -12781:0:4365 -12782:2:1358 -12783:0:4365 -12784:2:1360 -12785:0:4365 -12786:3:3757 -12787:0:4365 -12788:2:1361 -12789:0:4365 -12790:3:3758 -12791:0:4365 -12792:2:1362 -12793:2:1366 -12794:2:1367 -12795:2:1375 -12796:2:1376 -12797:2:1380 -12798:2:1381 -12799:2:1375 -12800:2:1376 -12801:2:1380 -12802:2:1381 -12803:2:1389 -12804:2:1394 -12805:2:1398 -12806:2:1399 -12807:2:1406 -12808:2:1407 -12809:2:1418 -12810:2:1419 -12811:2:1420 -12812:2:1418 -12813:2:1419 -12814:2:1420 -12815:2:1431 -12816:2:1436 -12817:2:1437 -12818:0:4365 -12819:2:1449 -12820:0:4365 -12821:3:3757 -12822:0:4365 -12823:2:1451 -12824:0:4365 -12825:3:3758 -12826:0:4365 -12827:2:1652 -12828:0:4365 -12829:2:1653 -12830:0:4365 -12831:2:1657 -12832:0:4365 -12833:2:1180 -12834:0:4365 -12835:3:3757 -12836:0:4365 -12837:2:1181 -12838:2:1185 -12839:2:1186 -12840:2:1194 -12841:2:1195 -12842:2:1199 -12843:2:1200 -12844:2:1194 -12845:2:1195 -12846:2:1196 -12847:2:1208 -12848:2:1213 -12849:2:1217 -12850:2:1218 -12851:2:1225 -12852:2:1226 -12853:2:1237 -12854:2:1238 -12855:2:1239 -12856:2:1237 -12857:2:1238 -12858:2:1239 -12859:2:1250 -12860:2:1255 -12861:2:1256 -12862:0:4365 -12863:3:3758 -12864:0:4365 -12865:2:1268 -12866:0:4365 -12867:3:3757 -12868:0:4365 -12869:2:1270 -12870:0:4365 -12871:3:3758 -12872:0:4365 -12873:2:1271 -12874:2:1275 -12875:2:1276 -12876:2:1284 -12877:2:1285 -12878:2:1289 -12879:2:1290 -12880:2:1284 -12881:2:1285 -12882:2:1289 -12883:2:1290 -12884:2:1298 -12885:2:1303 -12886:2:1307 -12887:2:1308 -12888:2:1315 -12889:2:1316 -12890:2:1327 -12891:2:1328 -12892:2:1329 -12893:2:1327 -12894:2:1328 -12895:2:1329 -12896:2:1340 -12897:2:1345 -12898:2:1346 -12899:0:4365 -12900:2:1358 -12901:0:4365 -12902:2:1454 -12903:0:4365 -12904:3:3757 -12905:0:4365 -12906:2:1455 -12907:0:4365 -12908:3:3758 -12909:0:4365 -12910:2:1652 -12911:0:4365 -12912:2:1653 -12913:0:4365 -12914:2:1657 -12915:0:4365 -12916:2:1660 -12917:0:4365 -12918:3:3757 -12919:0:4365 -12920:2:1665 -12921:2:1669 -12922:2:1670 -12923:2:1678 -12924:2:1679 -12925:2:1683 -12926:2:1684 -12927:2:1678 -12928:2:1679 -12929:2:1680 -12930:2:1692 -12931:2:1697 -12932:2:1701 -12933:2:1702 -12934:2:1709 -12935:2:1710 -12936:2:1721 -12937:2:1722 -12938:2:1723 -12939:2:1721 -12940:2:1722 -12941:2:1723 -12942:2:1734 -12943:2:1739 -12944:2:1740 -12945:0:4365 -12946:3:3758 -12947:0:4365 -12948:2:1752 -12949:0:4365 -12950:3:3757 -12951:0:4365 -12952:2:1754 -12953:0:4365 -12954:3:3758 -12955:0:4365 -12956:2:1755 -12957:2:1759 -12958:2:1760 -12959:2:1768 -12960:2:1769 -12961:2:1773 -12962:2:1774 -12963:2:1768 -12964:2:1769 -12965:2:1773 -12966:2:1774 -12967:2:1782 -12968:2:1787 -12969:2:1791 -12970:2:1792 -12971:2:1799 -12972:2:1800 -12973:2:1811 -12974:2:1812 -12975:2:1813 -12976:2:1811 -12977:2:1812 -12978:2:1813 -12979:2:1824 -12980:2:1829 -12981:2:1830 -12982:0:4365 -12983:2:1842 -12984:0:4365 -12985:3:3757 -12986:0:4365 -12987:2:1844 -12988:0:4365 -12989:3:3758 -12990:0:4365 -12991:2:1845 -12992:2:1849 -12993:2:1850 -12994:2:1858 -12995:2:1859 -12996:2:1863 -12997:2:1864 -12998:2:1858 -12999:2:1859 -13000:2:1863 -13001:2:1864 -13002:2:1872 -13003:2:1877 -13004:2:1881 -13005:2:1882 -13006:2:1889 -13007:2:1890 -13008:2:1901 -13009:2:1902 -13010:2:1903 -13011:2:1901 -13012:2:1902 -13013:2:1903 -13014:2:1914 -13015:2:1919 -13016:2:1920 -13017:0:4365 -13018:2:1932 -13019:0:4365 -13020:3:3757 -13021:0:4365 -13022:2:1934 -13023:0:4365 -13024:3:3758 -13025:0:4365 -13026:2:1935 -13027:0:4365 -13028:2:1936 -13029:0:4365 -13030:2:2129 -13031:0:4365 -13032:2:2130 -13033:0:4365 -13034:2:2134 -13035:0:4365 -13036:3:3757 -13037:0:4365 -13038:2:2136 -13039:0:4365 -13040:3:3758 -13041:0:4365 -13042:2:2137 -13043:2:2141 -13044:2:2142 -13045:2:2150 -13046:2:2151 -13047:2:2155 -13048:2:2156 -13049:2:2150 -13050:2:2151 -13051:2:2155 -13052:2:2156 -13053:2:2164 -13054:2:2169 -13055:2:2173 -13056:2:2174 -13057:2:2181 -13058:2:2182 -13059:2:2193 -13060:2:2194 -13061:2:2195 -13062:2:2193 -13063:2:2194 -13064:2:2195 -13065:2:2206 -13066:2:2211 -13067:2:2212 -13068:0:4365 -13069:2:2224 -13070:0:4365 -13071:3:3757 -13072:0:4365 -13073:2:2226 -13074:0:4365 -13075:3:3758 -13076:0:4365 -13077:2:1936 -13078:0:4365 -13079:2:2129 -13080:0:4365 -13081:2:2130 -13082:0:4365 -13083:2:2134 -13084:0:4365 -13085:3:3757 -13086:0:4365 -13087:2:2136 -13088:0:4365 -13089:3:3758 -13090:0:4365 -13091:2:2137 -13092:2:2141 -13093:2:2142 -13094:2:2150 -13095:2:2151 -13096:2:2155 -13097:2:2156 -13098:2:2150 -13099:2:2151 -13100:2:2152 -13101:2:2164 -13102:2:2169 -13103:2:2173 -13104:2:2174 -13105:2:2181 -13106:2:2182 -13107:2:2193 -13108:2:2194 -13109:2:2195 -13110:2:2193 -13111:2:2194 -13112:2:2195 -13113:2:2206 -13114:2:2211 -13115:2:2212 -13116:0:4365 -13117:2:2224 -13118:0:4365 -13119:3:3757 -13120:0:4365 -13121:2:2226 -13122:0:4365 -13123:3:3758 -13124:0:4365 -13125:2:2230 -13126:0:4365 -13127:3:3757 -13128:0:4365 -13129:2:2235 -13130:2:2239 -13131:2:2240 -13132:2:2248 -13133:2:2249 -13134:2:2253 -13135:2:2254 -13136:2:2248 -13137:2:2249 -13138:2:2250 -13139:2:2262 -13140:2:2267 -13141:2:2271 -13142:2:2272 -13143:2:2279 -13144:2:2280 -13145:2:2291 -13146:2:2292 -13147:2:2293 -13148:2:2291 -13149:2:2292 -13150:2:2293 -13151:2:2304 -13152:2:2309 -13153:2:2310 -13154:0:4365 -13155:3:3758 -13156:0:4365 -13157:2:2322 -13158:0:4365 -13159:2:1169 -13160:0:4365 -13161:3:3757 -13162:0:4365 -13163:2:1170 -13164:0:4365 -13165:3:3758 -13166:0:4365 -13167:3:3759 -13168:0:4365 -13169:3:3972 -13170:0:4365 -13171:3:3980 -13172:0:4365 -13173:3:3981 -13174:3:3985 -13175:3:3986 -13176:3:3994 -13177:3:3995 -13178:3:3999 -13179:3:4000 -13180:3:3994 -13181:3:3995 -13182:3:3999 -13183:3:4000 -13184:3:4008 -13185:3:4013 -13186:3:4017 -13187:3:4018 -13188:3:4025 -13189:3:4026 -13190:3:4037 -13191:3:4038 -13192:3:4039 -13193:3:4037 -13194:3:4038 -13195:3:4039 -13196:3:4050 -13197:3:4055 -13198:3:4056 -13199:0:4365 -13200:3:4068 -13201:0:4365 -13202:3:4069 -13203:0:4365 -13204:2:1173 -13205:0:4365 -13206:3:4070 -13207:0:4365 -13208:2:1179 -13209:0:4365 -13210:2:1180 -13211:0:4365 -13212:3:4069 -13213:0:4365 -13214:2:1181 -13215:2:1185 -13216:2:1186 -13217:2:1194 -13218:2:1195 -13219:2:1199 -13220:2:1200 -13221:2:1194 -13222:2:1195 -13223:2:1199 -13224:2:1200 -13225:2:1208 -13226:2:1213 -13227:2:1217 -13228:2:1218 -13229:2:1225 -13230:2:1226 -13231:2:1237 -13232:2:1238 -13233:2:1239 -13234:2:1237 -13235:2:1238 -13236:2:1239 -13237:2:1250 -13238:2:1255 -13239:2:1256 -13240:0:4365 -13241:3:4070 -13242:0:4365 -13243:2:1268 -13244:0:4365 -13245:3:4069 -13246:0:4365 -13247:2:1270 -13248:0:4365 -13249:3:4070 -13250:0:4365 -13251:2:1271 -13252:2:1275 -13253:2:1276 -13254:2:1284 -13255:2:1285 -13256:2:1289 -13257:2:1290 -13258:2:1284 -13259:2:1285 -13260:2:1289 -13261:2:1290 -13262:2:1298 -13263:2:1303 -13264:2:1307 -13265:2:1308 -13266:2:1315 -13267:2:1316 -13268:2:1327 -13269:2:1328 -13270:2:1329 -13271:2:1327 -13272:2:1328 -13273:2:1329 -13274:2:1340 -13275:2:1345 -13276:2:1346 -13277:0:4365 -13278:2:1358 -13279:0:4365 -13280:2:1360 -13281:0:4365 -13282:3:4069 -13283:0:4365 -13284:2:1361 -13285:0:4365 -13286:3:4070 -13287:0:4365 -13288:2:1362 -13289:2:1366 -13290:2:1367 -13291:2:1375 -13292:2:1376 -13293:2:1380 -13294:2:1381 -13295:2:1375 -13296:2:1376 -13297:2:1380 -13298:2:1381 -13299:2:1389 -13300:2:1394 -13301:2:1398 -13302:2:1399 -13303:2:1406 -13304:2:1407 -13305:2:1418 -13306:2:1419 -13307:2:1420 -13308:2:1418 -13309:2:1419 -13310:2:1420 -13311:2:1431 -13312:2:1436 -13313:2:1437 -13314:0:4365 -13315:2:1449 -13316:0:4365 -13317:3:4069 -13318:0:4365 -13319:2:1451 -13320:0:4365 -13321:3:4070 -13322:0:4365 -13323:2:1652 -13324:0:4365 -13325:2:1653 -13326:0:4365 -13327:2:1657 -13328:0:4365 -13329:2:1180 -13330:0:4365 -13331:3:4069 -13332:0:4365 -13333:2:1181 -13334:2:1185 -13335:2:1186 -13336:2:1194 -13337:2:1195 -13338:2:1199 -13339:2:1200 -13340:2:1194 -13341:2:1195 -13342:2:1196 -13343:2:1208 -13344:2:1213 -13345:2:1217 -13346:2:1218 -13347:2:1225 -13348:2:1226 -13349:2:1237 -13350:2:1238 -13351:2:1239 -13352:2:1237 -13353:2:1238 -13354:2:1239 -13355:2:1250 -13356:2:1255 -13357:2:1256 -13358:0:4365 -13359:3:4070 -13360:0:4365 -13361:2:1268 -13362:0:4365 -13363:3:4069 -13364:0:4365 -13365:2:1270 -13366:0:4365 -13367:3:4070 -13368:0:4365 -13369:2:1271 -13370:2:1275 -13371:2:1276 -13372:2:1284 -13373:2:1285 -13374:2:1289 -13375:2:1290 -13376:2:1284 -13377:2:1285 -13378:2:1289 -13379:2:1290 -13380:2:1298 -13381:2:1303 -13382:2:1307 -13383:2:1308 -13384:2:1315 -13385:2:1316 -13386:2:1327 -13387:2:1328 -13388:2:1329 -13389:2:1327 -13390:2:1328 -13391:2:1329 -13392:2:1340 -13393:2:1345 -13394:2:1346 -13395:0:4365 -13396:2:1358 -13397:0:4365 -13398:2:1454 -13399:0:4365 -13400:3:4069 -13401:0:4365 -13402:2:1455 -13403:0:4365 -13404:3:4070 -13405:0:4365 -13406:2:1652 -13407:0:4365 -13408:2:1653 -13409:0:4365 -13410:2:1657 -13411:0:4365 -13412:2:1660 -13413:0:4365 -13414:3:4069 -13415:0:4365 -13416:2:1665 -13417:2:1669 -13418:2:1670 -13419:2:1678 -13420:2:1679 -13421:2:1683 -13422:2:1684 -13423:2:1678 -13424:2:1679 -13425:2:1680 -13426:2:1692 -13427:2:1697 -13428:2:1701 -13429:2:1702 -13430:2:1709 -13431:2:1710 -13432:2:1721 -13433:2:1722 -13434:2:1723 -13435:2:1721 -13436:2:1722 -13437:2:1723 -13438:2:1734 -13439:2:1739 -13440:2:1740 -13441:0:4365 -13442:3:4070 -13443:0:4365 -13444:2:1752 -13445:0:4365 -13446:3:4069 -13447:0:4365 -13448:2:1754 -13449:0:4365 -13450:3:4070 -13451:0:4365 -13452:2:1755 -13453:2:1759 -13454:2:1760 -13455:2:1768 -13456:2:1769 -13457:2:1773 -13458:2:1774 -13459:2:1768 -13460:2:1769 -13461:2:1773 -13462:2:1774 -13463:2:1782 -13464:2:1787 -13465:2:1791 -13466:2:1792 -13467:2:1799 -13468:2:1800 -13469:2:1811 -13470:2:1812 -13471:2:1813 -13472:2:1811 -13473:2:1812 -13474:2:1813 -13475:2:1824 -13476:2:1829 -13477:2:1830 -13478:0:4365 -13479:2:1842 -13480:0:4365 -13481:3:4069 -13482:0:4365 -13483:2:1844 -13484:0:4365 -13485:3:4070 -13486:0:4365 -13487:2:1845 -13488:2:1849 -13489:2:1850 -13490:2:1858 -13491:2:1859 -13492:2:1863 -13493:2:1864 -13494:2:1858 -13495:2:1859 -13496:2:1863 -13497:2:1864 -13498:2:1872 -13499:2:1877 -13500:2:1881 -13501:2:1882 -13502:2:1889 -13503:2:1890 -13504:2:1901 -13505:2:1902 -13506:2:1903 -13507:2:1901 -13508:2:1902 -13509:2:1903 -13510:2:1914 -13511:2:1919 -13512:2:1920 -13513:0:4365 -13514:2:1932 -13515:0:4365 -13516:3:4069 -13517:0:4365 -13518:2:1934 -13519:0:4365 -13520:3:4070 -13521:0:4365 -13522:2:1935 -13523:0:4365 -13524:2:1936 -13525:0:4365 -13526:2:2129 -13527:0:4365 -13528:2:2130 -13529:0:4365 -13530:2:2134 -13531:0:4365 -13532:3:4069 -13533:0:4365 -13534:2:2136 -13535:0:4365 -13536:3:4070 -13537:0:4365 -13538:2:2137 -13539:2:2141 -13540:2:2142 -13541:2:2150 -13542:2:2151 -13543:2:2155 -13544:2:2156 -13545:2:2150 -13546:2:2151 -13547:2:2155 -13548:2:2156 -13549:2:2164 -13550:2:2169 -13551:2:2173 -13552:2:2174 -13553:2:2181 -13554:2:2182 -13555:2:2193 -13556:2:2194 -13557:2:2195 -13558:2:2193 -13559:2:2194 -13560:2:2195 -13561:2:2206 -13562:2:2211 -13563:2:2212 -13564:0:4365 -13565:2:2224 -13566:0:4365 -13567:3:4069 -13568:0:4365 -13569:2:2226 -13570:0:4365 -13571:3:4070 -13572:0:4365 -13573:2:1936 -13574:0:4365 -13575:2:2129 -13576:0:4365 -13577:2:2130 -13578:0:4365 -13579:2:2134 -13580:0:4365 -13581:3:4069 -13582:0:4365 -13583:2:2136 -13584:0:4365 -13585:3:4070 -13586:0:4365 -13587:2:2137 -13588:2:2141 -13589:2:2142 -13590:2:2150 -13591:2:2151 -13592:2:2155 -13593:2:2156 -13594:2:2150 -13595:2:2151 -13596:2:2152 -13597:2:2164 -13598:2:2169 -13599:2:2173 -13600:2:2174 -13601:2:2181 -13602:2:2182 -13603:2:2193 -13604:2:2194 -13605:2:2195 -13606:2:2193 -13607:2:2194 -13608:2:2195 -13609:2:2206 -13610:2:2211 -13611:2:2212 -13612:0:4365 -13613:2:2224 -13614:0:4365 -13615:3:4069 -13616:0:4365 -13617:2:2226 -13618:0:4365 -13619:3:4070 -13620:0:4365 -13621:2:2230 -13622:0:4365 -13623:3:4069 -13624:0:4365 -13625:2:2235 -13626:2:2239 -13627:2:2240 -13628:2:2248 -13629:2:2249 -13630:2:2253 -13631:2:2254 -13632:2:2248 -13633:2:2249 -13634:2:2250 -13635:2:2262 -13636:2:2267 -13637:2:2271 -13638:2:2272 -13639:2:2279 -13640:2:2280 -13641:2:2291 -13642:2:2292 -13643:2:2293 -13644:2:2291 -13645:2:2292 -13646:2:2293 -13647:2:2304 -13648:2:2309 -13649:2:2310 -13650:0:4365 -13651:3:4070 -13652:0:4365 -13653:2:2322 -13654:0:4365 -13655:2:1169 -13656:0:4365 -13657:3:4069 -13658:0:4365 -13659:2:1170 -13660:0:4365 -13661:3:4070 -13662:0:4365 -13663:3:4071 -13664:0:4365 -13665:3:4081 -13666:0:4365 -13667:3:3666 -13668:0:4365 -13669:3:3667 -13670:0:4365 -13671:3:3668 -13672:0:4365 -13673:3:3669 -13674:3:3673 -13675:3:3674 -13676:3:3682 -13677:3:3683 -13678:3:3687 -13679:3:3688 -13680:3:3682 -13681:3:3683 -13682:3:3687 -13683:3:3688 -13684:3:3696 -13685:3:3701 -13686:3:3705 -13687:3:3706 -13688:3:3713 -13689:3:3714 -13690:3:3725 -13691:3:3726 -13692:3:3727 -13693:3:3725 -13694:3:3726 -13695:3:3727 -13696:3:3738 -13697:3:3743 -13698:3:3744 -13699:0:4365 -13700:3:3756 -13701:0:4365 -13702:3:3757 -13703:0:4365 -13704:2:1173 -13705:0:4365 -13706:3:3758 -13707:0:4365 -13708:2:1179 -13709:0:4365 -13710:2:1180 -13711:0:4365 -13712:3:3757 -13713:0:4365 -13714:2:1181 -13715:2:1185 -13716:2:1186 -13717:2:1194 -13718:2:1195 -13719:2:1199 -13720:2:1200 -13721:2:1194 -13722:2:1195 -13723:2:1199 -13724:2:1200 -13725:2:1208 -13726:2:1213 -13727:2:1217 -13728:2:1218 -13729:2:1225 -13730:2:1226 -13731:2:1237 -13732:2:1238 -13733:2:1239 -13734:2:1237 -13735:2:1238 -13736:2:1239 -13737:2:1250 -13738:2:1255 -13739:2:1256 -13740:0:4365 -13741:3:3758 -13742:0:4365 -13743:2:1268 -13744:0:4365 -13745:3:3757 -13746:0:4365 -13747:2:1270 -13748:0:4365 -13749:3:3758 -13750:0:4365 -13751:2:1271 -13752:2:1275 -13753:2:1276 -13754:2:1284 -13755:2:1285 -13756:2:1289 -13757:2:1290 -13758:2:1284 -13759:2:1285 -13760:2:1289 -13761:2:1290 -13762:2:1298 -13763:2:1303 -13764:2:1307 -13765:2:1308 -13766:2:1315 -13767:2:1316 -13768:2:1327 -13769:2:1328 -13770:2:1329 -13771:2:1327 -13772:2:1328 -13773:2:1329 -13774:2:1340 -13775:2:1345 -13776:2:1346 -13777:0:4365 -13778:2:1358 -13779:0:4365 -13780:2:1360 -13781:0:4365 -13782:3:3757 -13783:0:4365 -13784:2:1361 -13785:0:4365 -13786:3:3758 -13787:0:4365 -13788:2:1362 -13789:2:1366 -13790:2:1367 -13791:2:1375 -13792:2:1376 -13793:2:1380 -13794:2:1381 -13795:2:1375 -13796:2:1376 -13797:2:1380 -13798:2:1381 -13799:2:1389 -13800:2:1394 -13801:2:1398 -13802:2:1399 -13803:2:1406 -13804:2:1407 -13805:2:1418 -13806:2:1419 -13807:2:1420 -13808:2:1418 -13809:2:1419 -13810:2:1420 -13811:2:1431 -13812:2:1436 -13813:2:1437 -13814:0:4365 -13815:2:1449 -13816:0:4365 -13817:3:3757 -13818:0:4365 -13819:2:1451 -13820:0:4365 -13821:3:3758 -13822:0:4365 -13823:2:1652 -13824:0:4365 -13825:2:1653 -13826:0:4365 -13827:2:1657 -13828:0:4365 -13829:2:1180 -13830:0:4365 -13831:3:3757 -13832:0:4365 -13833:2:1181 -13834:2:1185 -13835:2:1186 -13836:2:1194 -13837:2:1195 -13838:2:1199 -13839:2:1200 -13840:2:1194 -13841:2:1195 -13842:2:1196 -13843:2:1208 -13844:2:1213 -13845:2:1217 -13846:2:1218 -13847:2:1225 -13848:2:1226 -13849:2:1237 -13850:2:1238 -13851:2:1239 -13852:2:1237 -13853:2:1238 -13854:2:1239 -13855:2:1250 -13856:2:1255 -13857:2:1256 -13858:0:4365 -13859:3:3758 -13860:0:4365 -13861:2:1268 -13862:0:4365 -13863:3:3757 -13864:0:4365 -13865:2:1270 -13866:0:4365 -13867:3:3758 -13868:0:4365 -13869:2:1271 -13870:2:1275 -13871:2:1276 -13872:2:1284 -13873:2:1285 -13874:2:1289 -13875:2:1290 -13876:2:1284 -13877:2:1285 -13878:2:1289 -13879:2:1290 -13880:2:1298 -13881:2:1303 -13882:2:1307 -13883:2:1308 -13884:2:1315 -13885:2:1316 -13886:2:1327 -13887:2:1328 -13888:2:1329 -13889:2:1327 -13890:2:1328 -13891:2:1329 -13892:2:1340 -13893:2:1345 -13894:2:1346 -13895:0:4365 -13896:2:1358 -13897:0:4365 -13898:2:1454 -13899:0:4365 -13900:3:3757 -13901:0:4365 -13902:2:1455 -13903:0:4365 -13904:3:3758 -13905:0:4365 -13906:2:1652 -13907:0:4365 -13908:2:1653 -13909:0:4365 -13910:2:1657 -13911:0:4365 -13912:2:1660 -13913:0:4365 -13914:3:3757 -13915:0:4365 -13916:2:1665 -13917:2:1669 -13918:2:1670 -13919:2:1678 -13920:2:1679 -13921:2:1683 -13922:2:1684 -13923:2:1678 -13924:2:1679 -13925:2:1680 -13926:2:1692 -13927:2:1697 -13928:2:1701 -13929:2:1702 -13930:2:1709 -13931:2:1710 -13932:2:1721 -13933:2:1722 -13934:2:1723 -13935:2:1721 -13936:2:1722 -13937:2:1723 -13938:2:1734 -13939:2:1739 -13940:2:1740 -13941:0:4365 -13942:3:3758 -13943:0:4365 -13944:2:1752 -13945:0:4365 -13946:3:3757 -13947:0:4365 -13948:2:1754 -13949:0:4365 -13950:3:3758 -13951:0:4365 -13952:2:1755 -13953:2:1759 -13954:2:1760 -13955:2:1768 -13956:2:1769 -13957:2:1773 -13958:2:1774 -13959:2:1768 -13960:2:1769 -13961:2:1773 -13962:2:1774 -13963:2:1782 -13964:2:1787 -13965:2:1791 -13966:2:1792 -13967:2:1799 -13968:2:1800 -13969:2:1811 -13970:2:1812 -13971:2:1813 -13972:2:1811 -13973:2:1812 -13974:2:1813 -13975:2:1824 -13976:2:1829 -13977:2:1830 -13978:0:4365 -13979:2:1842 -13980:0:4365 -13981:3:3757 -13982:0:4365 -13983:2:1844 -13984:0:4365 -13985:3:3758 -13986:0:4365 -13987:2:1845 -13988:2:1849 -13989:2:1850 -13990:2:1858 -13991:2:1859 -13992:2:1863 -13993:2:1864 -13994:2:1858 -13995:2:1859 -13996:2:1863 -13997:2:1864 -13998:2:1872 -13999:2:1877 -14000:2:1881 -14001:2:1882 -14002:2:1889 -14003:2:1890 -14004:2:1901 -14005:2:1902 -14006:2:1903 -14007:2:1901 -14008:2:1902 -14009:2:1903 -14010:2:1914 -14011:2:1919 -14012:2:1920 -14013:0:4365 -14014:2:1932 -14015:0:4365 -14016:3:3757 -14017:0:4365 -14018:2:1934 -14019:0:4365 -14020:3:3758 -14021:0:4365 -14022:2:1935 -14023:0:4365 -14024:2:1936 -14025:0:4365 -14026:2:2129 -14027:0:4365 -14028:2:2130 -14029:0:4365 -14030:2:2134 -14031:0:4365 -14032:3:3757 -14033:0:4365 -14034:2:2136 -14035:0:4365 -14036:3:3758 -14037:0:4365 -14038:2:2137 -14039:2:2141 -14040:2:2142 -14041:2:2150 -14042:2:2151 -14043:2:2155 -14044:2:2156 -14045:2:2150 -14046:2:2151 -14047:2:2155 -14048:2:2156 -14049:2:2164 -14050:2:2169 -14051:2:2173 -14052:2:2174 -14053:2:2181 -14054:2:2182 -14055:2:2193 -14056:2:2194 -14057:2:2195 -14058:2:2193 -14059:2:2194 -14060:2:2195 -14061:2:2206 -14062:2:2211 -14063:2:2212 -14064:0:4365 -14065:2:2224 -14066:0:4365 -14067:3:3757 -14068:0:4365 -14069:2:2226 -14070:0:4365 -14071:3:3758 -14072:0:4365 -14073:2:1936 -14074:0:4365 -14075:2:2129 -14076:0:4365 -14077:2:2130 -14078:0:4365 -14079:2:2134 -14080:0:4365 -14081:3:3757 -14082:0:4365 -14083:2:2136 -14084:0:4365 -14085:3:3758 -14086:0:4365 -14087:2:2137 -14088:2:2141 -14089:2:2142 -14090:2:2150 -14091:2:2151 -14092:2:2155 -14093:2:2156 -14094:2:2150 -14095:2:2151 -14096:2:2152 -14097:2:2164 -14098:2:2169 -14099:2:2173 -14100:2:2174 -14101:2:2181 -14102:2:2182 -14103:2:2193 -14104:2:2194 -14105:2:2195 -14106:2:2193 -14107:2:2194 -14108:2:2195 -14109:2:2206 -14110:2:2211 -14111:2:2212 -14112:0:4365 -14113:2:2224 -14114:0:4365 -14115:3:3757 -14116:0:4365 -14117:2:2226 -14118:0:4365 -14119:3:3758 -14120:0:4365 -14121:2:2230 -14122:0:4365 -14123:3:3757 -14124:0:4365 -14125:2:2235 -14126:2:2239 -14127:2:2240 -14128:2:2248 -14129:2:2249 -14130:2:2253 -14131:2:2254 -14132:2:2248 -14133:2:2249 -14134:2:2250 -14135:2:2262 -14136:2:2267 -14137:2:2271 -14138:2:2272 -14139:2:2279 -14140:2:2280 -14141:2:2291 -14142:2:2292 -14143:2:2293 -14144:2:2291 -14145:2:2292 -14146:2:2293 -14147:2:2304 -14148:2:2309 -14149:2:2310 -14150:0:4365 -14151:3:3758 -14152:0:4365 -14153:2:2322 -14154:0:4365 -14155:2:1169 -14156:0:4365 -14157:3:3757 -14158:0:4365 -14159:2:1170 -14160:0:4365 -14161:3:3758 -14162:0:4365 -14163:3:3759 -14164:0:4365 -14165:3:3972 -14166:0:4365 -14167:3:4077 -14168:0:4365 -14169:3:4078 -14170:0:4365 -14171:3:4082 -14172:0:4365 -14173:3:4088 -14174:0:4365 -14175:3:4092 -14176:3:4093 -14177:3:4097 -14178:3:4101 -14179:3:4102 -14180:3:4097 -14181:3:4101 -14182:3:4102 -14183:3:4106 -14184:3:4114 -14185:3:4115 -14186:3:4120 -14187:3:4127 -14188:3:4128 -14189:3:4127 -14190:3:4128 -14191:3:4135 -14192:3:4140 -14193:0:4365 -14194:3:4151 -14195:0:4365 -14196:3:4155 -14197:3:4156 -14198:3:4160 -14199:3:4164 -14200:3:4165 -14201:3:4160 -14202:3:4164 -14203:3:4165 -14204:3:4169 -14205:3:4177 -14206:3:4178 -14207:3:4183 -14208:3:4190 -14209:3:4191 -14210:3:4190 -14211:3:4191 -14212:3:4198 -14213:3:4203 -14214:0:4365 -14215:3:4151 -14216:0:4365 -14217:3:4155 -14218:3:4156 -14219:3:4160 -14220:3:4164 -14221:3:4165 -14222:3:4160 -14223:3:4164 -14224:3:4165 -14225:3:4169 -14226:3:4177 -14227:3:4178 -14228:3:4183 -14229:3:4190 -14230:3:4191 -14231:3:4190 -14232:3:4191 -14233:3:4198 -14234:3:4203 -14235:0:4365 -14236:3:4214 -14237:0:4365 -14238:3:4222 -14239:3:4223 -14240:3:4227 -14241:3:4231 -14242:3:4232 -14243:3:4227 -14244:3:4231 -14245:3:4232 -14246:3:4236 -14247:3:4244 -14248:3:4245 -14249:3:4250 -14250:3:4257 -14251:3:4258 -14252:3:4257 -14253:3:4258 -14254:3:4265 -14255:3:4270 -14256:0:4365 -14257:3:4285 -14258:0:4365 -14259:3:4286 -14260:0:4365 -14261:2:1173 -14262:0:4365 -14263:3:4287 -14264:0:4365 -14265:2:1179 -14266:0:4365 -14267:2:1180 -14268:0:4365 -14269:3:4286 -14270:0:4365 -14271:2:1181 -14272:2:1185 -14273:2:1186 -14274:2:1194 -14275:2:1195 -14276:2:1199 -14277:2:1200 -14278:2:1194 -14279:2:1195 -14280:2:1199 -14281:2:1200 -14282:2:1208 -14283:2:1213 -14284:2:1217 -14285:2:1218 -14286:2:1225 -14287:2:1226 -14288:2:1237 -14289:2:1238 -14290:2:1239 -14291:2:1237 -14292:2:1238 -14293:2:1239 -14294:2:1250 -14295:2:1255 -14296:2:1256 -14297:0:4365 -14298:3:4287 -14299:0:4365 -14300:2:1268 -14301:0:4365 -14302:3:4286 -14303:0:4365 -14304:2:1270 -14305:0:4365 -14306:3:4287 -14307:0:4365 -14308:2:1271 -14309:2:1275 -14310:2:1276 -14311:2:1284 -14312:2:1285 -14313:2:1289 -14314:2:1290 -14315:2:1284 -14316:2:1285 -14317:2:1289 -14318:2:1290 -14319:2:1298 -14320:2:1303 -14321:2:1307 -14322:2:1308 -14323:2:1315 -14324:2:1316 -14325:2:1327 -14326:2:1328 -14327:2:1329 -14328:2:1327 -14329:2:1328 -14330:2:1329 -14331:2:1340 -14332:2:1345 -14333:2:1346 -14334:0:4365 -14335:2:1358 -14336:0:4365 -14337:2:1360 -14338:0:4365 -14339:3:4286 -14340:0:4365 -14341:2:1361 -14342:0:4365 -14343:3:4287 -14344:0:4365 -14345:2:1362 -14346:2:1366 -14347:2:1367 -14348:2:1375 -14349:2:1376 -14350:2:1380 -14351:2:1381 -14352:2:1375 -14353:2:1376 -14354:2:1380 -14355:2:1381 -14356:2:1389 -14357:2:1394 -14358:2:1398 -14359:2:1399 -14360:2:1406 -14361:2:1407 -14362:2:1418 -14363:2:1419 -14364:2:1420 -14365:2:1418 -14366:2:1419 -14367:2:1420 -14368:2:1431 -14369:2:1436 -14370:2:1437 -14371:0:4365 -14372:2:1449 -14373:0:4365 -14374:3:4286 -14375:0:4365 -14376:2:1451 -14377:0:4365 -14378:3:4287 -14379:0:4365 -14380:2:1652 -14381:0:4365 -14382:2:1653 -14383:0:4365 -14384:2:1657 -14385:0:4365 -14386:2:1180 -14387:0:4365 -14388:3:4286 -14389:0:4365 -14390:2:1181 -14391:2:1185 -14392:2:1186 -14393:2:1194 -14394:2:1195 -14395:2:1199 -14396:2:1200 -14397:2:1194 -14398:2:1195 -14399:2:1196 -14400:2:1208 -14401:2:1213 -14402:2:1217 -14403:2:1218 -14404:2:1225 -14405:2:1226 -14406:2:1237 -14407:2:1238 -14408:2:1239 -14409:2:1237 -14410:2:1238 -14411:2:1239 -14412:2:1250 -14413:2:1255 -14414:2:1256 -14415:0:4365 -14416:3:4287 -14417:0:4365 -14418:2:1268 -14419:0:4365 -14420:3:4286 -14421:0:4365 -14422:2:1270 -14423:0:4365 -14424:3:4287 -14425:0:4365 -14426:2:1271 -14427:2:1275 -14428:2:1276 -14429:2:1284 -14430:2:1285 -14431:2:1289 -14432:2:1290 -14433:2:1284 -14434:2:1285 -14435:2:1289 -14436:2:1290 -14437:2:1298 -14438:2:1303 -14439:2:1307 -14440:2:1308 -14441:2:1315 -14442:2:1316 -14443:2:1327 -14444:2:1328 -14445:2:1329 -14446:2:1327 -14447:2:1328 -14448:2:1329 -14449:2:1340 -14450:2:1345 -14451:2:1346 -14452:0:4365 -14453:2:1358 -14454:0:4365 -14455:2:1454 -14456:0:4365 -14457:3:4286 -14458:0:4365 -14459:2:1455 -14460:0:4365 -14461:3:4287 -14462:0:4365 -14463:2:1652 -14464:0:4365 -14465:2:1653 -14466:0:4365 -14467:2:1657 -14468:0:4365 -14469:2:1660 -14470:0:4365 -14471:3:4286 -14472:0:4365 -14473:2:1665 -14474:2:1669 -14475:2:1670 -14476:2:1678 -14477:2:1679 -14478:2:1683 -14479:2:1684 -14480:2:1678 -14481:2:1679 -14482:2:1680 -14483:2:1692 -14484:2:1697 -14485:2:1701 -14486:2:1702 -14487:2:1709 -14488:2:1710 -14489:2:1721 -14490:2:1722 -14491:2:1723 -14492:2:1721 -14493:2:1722 -14494:2:1723 -14495:2:1734 -14496:2:1739 -14497:2:1740 -14498:0:4365 -14499:3:4287 -14500:0:4365 -14501:2:1752 -14502:0:4365 -14503:3:4286 -14504:0:4365 -14505:2:1754 -14506:0:4365 -14507:3:4287 -14508:0:4365 -14509:2:1755 -14510:2:1759 -14511:2:1760 -14512:2:1768 -14513:2:1769 -14514:2:1773 -14515:2:1774 -14516:2:1768 -14517:2:1769 -14518:2:1773 -14519:2:1774 -14520:2:1782 -14521:2:1787 -14522:2:1791 -14523:2:1792 -14524:2:1799 -14525:2:1800 -14526:2:1811 -14527:2:1812 -14528:2:1813 -14529:2:1811 -14530:2:1812 -14531:2:1813 -14532:2:1824 -14533:2:1829 -14534:2:1830 -14535:0:4365 -14536:2:1842 -14537:0:4365 -14538:3:4286 -14539:0:4365 -14540:2:1844 -14541:0:4365 -14542:3:4287 -14543:0:4365 -14544:2:1845 -14545:2:1849 -14546:2:1850 -14547:2:1858 -14548:2:1859 -14549:2:1863 -14550:2:1864 -14551:2:1858 -14552:2:1859 -14553:2:1863 -14554:2:1864 -14555:2:1872 -14556:2:1877 -14557:2:1881 -14558:2:1882 -14559:2:1889 -14560:2:1890 -14561:2:1901 -14562:2:1902 -14563:2:1903 -14564:2:1901 -14565:2:1902 -14566:2:1903 -14567:2:1914 -14568:2:1919 -14569:2:1920 -14570:0:4365 -14571:2:1932 -14572:0:4365 -14573:3:4286 -14574:0:4365 -14575:2:1934 -14576:0:4365 -14577:3:4287 -14578:0:4365 -14579:2:1935 -14580:0:4365 -14581:2:1936 -14582:0:4365 -14583:2:2129 -14584:0:4365 -14585:2:2130 -14586:0:4365 -14587:2:2134 -14588:0:4365 -14589:3:4286 -14590:0:4365 -14591:2:2136 -14592:0:4365 -14593:3:4287 -14594:0:4365 -14595:2:2137 -14596:2:2141 -14597:2:2142 -14598:2:2150 -14599:2:2151 -14600:2:2155 -14601:2:2156 -14602:2:2150 -14603:2:2151 -14604:2:2155 -14605:2:2156 -14606:2:2164 -14607:2:2169 -14608:2:2173 -14609:2:2174 -14610:2:2181 -14611:2:2182 -14612:2:2193 -14613:2:2194 -14614:2:2195 -14615:2:2193 -14616:2:2194 -14617:2:2195 -14618:2:2206 -14619:2:2211 -14620:2:2212 -14621:0:4365 -14622:2:2224 -14623:0:4365 -14624:3:4286 -14625:0:4365 -14626:2:2226 -14627:0:4365 -14628:3:4287 -14629:0:4365 -14630:2:1936 -14631:0:4365 -14632:2:2129 -14633:0:4365 -14634:2:2130 -14635:0:4365 -14636:2:2134 -14637:0:4365 -14638:3:4286 -14639:0:4365 -14640:2:2136 -14641:0:4365 -14642:3:4287 -14643:0:4365 -14644:2:2137 -14645:2:2141 -14646:2:2142 -14647:2:2150 -14648:2:2151 -14649:2:2155 -14650:2:2156 -14651:2:2150 -14652:2:2151 -14653:2:2152 -14654:2:2164 -14655:2:2169 -14656:2:2173 -14657:2:2174 -14658:2:2181 -14659:2:2182 -14660:2:2193 -14661:2:2194 -14662:2:2195 -14663:2:2193 -14664:2:2194 -14665:2:2195 -14666:2:2206 -14667:2:2211 -14668:2:2212 -14669:0:4365 -14670:2:2224 -14671:0:4365 -14672:3:4286 -14673:0:4365 -14674:2:2226 -14675:0:4365 -14676:3:4287 -14677:0:4365 -14678:2:2230 -14679:0:4365 -14680:3:4286 -14681:0:4365 -14682:2:2235 -14683:2:2239 -14684:2:2240 -14685:2:2248 -14686:2:2249 -14687:2:2253 -14688:2:2254 -14689:2:2248 -14690:2:2249 -14691:2:2250 -14692:2:2262 -14693:2:2267 -14694:2:2271 -14695:2:2272 -14696:2:2279 -14697:2:2280 -14698:2:2291 -14699:2:2292 -14700:2:2293 -14701:2:2291 -14702:2:2292 -14703:2:2293 -14704:2:2304 -14705:2:2309 -14706:2:2310 -14707:0:4365 -14708:3:4287 -14709:0:4365 -14710:2:2322 -14711:0:4365 -14712:2:1169 -14713:0:4365 -14714:3:4286 -14715:0:4365 -14716:2:1170 -14717:0:4365 -14718:3:4287 -14719:0:4365 -14720:3:4288 -14721:0:4365 -14722:3:4294 -14723:0:4365 -14724:3:4295 -14725:0:4365 -14726:3:2338 -14727:0:4365 -14728:3:2339 -14729:3:2343 -14730:3:2344 -14731:3:2352 -14732:3:2353 -14733:3:2357 -14734:3:2358 -14735:3:2352 -14736:3:2353 -14737:3:2357 -14738:3:2358 -14739:3:2366 -14740:3:2371 -14741:3:2375 -14742:3:2376 -14743:3:2383 -14744:3:2384 -14745:3:2395 -14746:3:2396 -14747:3:2397 -14748:3:2395 -14749:3:2396 -14750:3:2397 -14751:3:2408 -14752:3:2413 -14753:3:2414 -14754:0:4365 -14755:3:2426 -14756:0:4365 -14757:3:2427 -14758:0:4365 -14759:2:1173 -14760:0:4365 -14761:3:2428 -14762:0:4365 -14763:2:1179 -14764:0:4365 -14765:2:1180 -14766:0:4365 -14767:3:2427 -14768:0:4365 -14769:2:1181 -14770:2:1185 -14771:2:1186 -14772:2:1194 -14773:2:1195 -14774:2:1199 -14775:2:1200 -14776:2:1194 -14777:2:1195 -14778:2:1199 -14779:2:1200 -14780:2:1208 -14781:2:1213 -14782:2:1217 -14783:2:1218 -14784:2:1225 -14785:2:1226 -14786:2:1237 -14787:2:1238 -14788:2:1239 -14789:2:1237 -14790:2:1238 -14791:2:1239 -14792:2:1250 -14793:2:1255 -14794:2:1256 -14795:0:4365 -14796:3:2428 -14797:0:4365 -14798:2:1268 -14799:0:4365 -14800:3:2427 -14801:0:4365 -14802:2:1270 -14803:0:4365 -14804:3:2428 -14805:0:4365 -14806:2:1271 -14807:2:1275 -14808:2:1276 -14809:2:1284 -14810:2:1285 -14811:2:1289 -14812:2:1290 -14813:2:1284 -14814:2:1285 -14815:2:1289 -14816:2:1290 -14817:2:1298 -14818:2:1303 -14819:2:1307 -14820:2:1308 -14821:2:1315 -14822:2:1316 -14823:2:1327 -14824:2:1328 -14825:2:1329 -14826:2:1327 -14827:2:1328 -14828:2:1329 -14829:2:1340 -14830:2:1345 -14831:2:1346 -14832:0:4365 -14833:2:1358 -14834:0:4365 -14835:2:1360 -14836:0:4365 -14837:3:2427 -14838:0:4365 -14839:2:1361 -14840:0:4365 -14841:3:2428 -14842:0:4365 -14843:2:1362 -14844:2:1366 -14845:2:1367 -14846:2:1375 -14847:2:1376 -14848:2:1380 -14849:2:1381 -14850:2:1375 -14851:2:1376 -14852:2:1380 -14853:2:1381 -14854:2:1389 -14855:2:1394 -14856:2:1398 -14857:2:1399 -14858:2:1406 -14859:2:1407 -14860:2:1418 -14861:2:1419 -14862:2:1420 -14863:2:1418 -14864:2:1419 -14865:2:1420 -14866:2:1431 -14867:2:1436 -14868:2:1437 -14869:0:4365 -14870:2:1449 -14871:0:4365 -14872:3:2427 -14873:0:4365 -14874:2:1451 -14875:0:4365 -14876:3:2428 -14877:0:4365 -14878:2:1652 -14879:0:4365 -14880:2:1653 -14881:0:4365 -14882:2:1657 -14883:0:4365 -14884:2:1180 -14885:0:4365 -14886:3:2427 -14887:0:4365 -14888:2:1181 -14889:2:1185 -14890:2:1186 -14891:2:1194 -14892:2:1195 -14893:2:1199 -14894:2:1200 -14895:2:1194 -14896:2:1195 -14897:2:1196 -14898:2:1208 -14899:2:1213 -14900:2:1217 -14901:2:1218 -14902:2:1225 -14903:2:1226 -14904:2:1237 -14905:2:1238 -14906:2:1239 -14907:2:1237 -14908:2:1238 -14909:2:1239 -14910:2:1250 -14911:2:1255 -14912:2:1256 -14913:0:4365 -14914:3:2428 -14915:0:4365 -14916:2:1268 -14917:0:4365 -14918:3:2427 -14919:0:4365 -14920:2:1270 -14921:0:4365 -14922:3:2428 -14923:0:4365 -14924:2:1271 -14925:2:1275 -14926:2:1276 -14927:2:1284 -14928:2:1285 -14929:2:1289 -14930:2:1290 -14931:2:1284 -14932:2:1285 -14933:2:1289 -14934:2:1290 -14935:2:1298 -14936:2:1303 -14937:2:1307 -14938:2:1308 -14939:2:1315 -14940:2:1316 -14941:2:1327 -14942:2:1328 -14943:2:1329 -14944:2:1327 -14945:2:1328 -14946:2:1329 -14947:2:1340 -14948:2:1345 -14949:2:1346 -14950:0:4365 -14951:2:1358 -14952:0:4365 -14953:2:1454 -14954:0:4365 -14955:3:2427 -14956:0:4365 -14957:2:1455 -14958:0:4365 -14959:3:2428 -14960:0:4365 -14961:2:1652 -14962:0:4365 -14963:2:1653 -14964:0:4365 -14965:2:1657 -14966:0:4365 -14967:2:1660 -14968:0:4365 -14969:3:2427 -14970:0:4365 -14971:2:1665 -14972:2:1669 -14973:2:1670 -14974:2:1678 -14975:2:1679 -14976:2:1683 -14977:2:1684 -14978:2:1678 -14979:2:1679 -14980:2:1680 -14981:2:1692 -14982:2:1697 -14983:2:1701 -14984:2:1702 -14985:2:1709 -14986:2:1710 -14987:2:1721 -14988:2:1722 -14989:2:1723 -14990:2:1721 -14991:2:1722 -14992:2:1723 -14993:2:1734 -14994:2:1739 -14995:2:1740 -14996:0:4365 -14997:3:2428 -14998:0:4365 -14999:2:1752 -15000:0:4365 -15001:3:2427 -15002:0:4365 -15003:2:1754 -15004:0:4365 -15005:3:2428 -15006:0:4365 -15007:2:1755 -15008:2:1759 -15009:2:1760 -15010:2:1768 -15011:2:1769 -15012:2:1773 -15013:2:1774 -15014:2:1768 -15015:2:1769 -15016:2:1773 -15017:2:1774 -15018:2:1782 -15019:2:1787 -15020:2:1791 -15021:2:1792 -15022:2:1799 -15023:2:1800 -15024:2:1811 -15025:2:1812 -15026:2:1813 -15027:2:1811 -15028:2:1812 -15029:2:1813 -15030:2:1824 -15031:2:1829 -15032:2:1830 -15033:0:4365 -15034:2:1842 -15035:0:4365 -15036:3:2427 -15037:0:4365 -15038:2:1844 -15039:0:4363 -15040:3:2428 -15041:0:4369 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.define b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.define deleted file mode 100644 index 136ef67..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.define +++ /dev/null @@ -1,2 +0,0 @@ -#define NO_RMB -#define NO_WMB diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.log b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.log deleted file mode 100644 index 27a963a..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.log +++ /dev/null @@ -1,267 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_mb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 745) -Depth= 11386 States= 1e+06 Transitions= 1.56e+07 Memory= 527.287 t= 12.8 R= 8e+04 -pan: claim violated! (at depth 2146) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 72 byte, depth reached 11386, errors: 1 - 1223588 states, stored - 17987399 states, matched - 19210987 transitions (= stored+matched) - 70012127 atomic steps -hash conflicts: 4173157 (resolved) - -Stats on memory usage (in Megabytes): - 116.690 equivalent memory usage for states (stored*(State-vector + overhead)) - 75.177 actual memory usage for states (compression: 64.42%) - state-vector as stored = 36 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 540.861 total actual memory usage - -unreached in proctype urcu_reader - line 400, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 61, "(1)" - line 419, "pan.___", state 91, "(1)" - line 400, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 151, "(1)" - line 419, "pan.___", state 181, "(1)" - line 400, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 242, "(1)" - line 419, "pan.___", state 272, "(1)" - line 400, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 331, "(1)" - line 409, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 360, "(1)" - line 419, "pan.___", state 390, "(1)" - line 541, "pan.___", state 414, "-end-" - (18 of 414 states) -unreached in proctype urcu_writer - line 400, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 20, "(1)" - line 404, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 34, "(1)" - line 404, "pan.___", state 35, "(1)" - line 404, "pan.___", state 35, "(1)" - line 402, "pan.___", state 40, "((i<1))" - line 402, "pan.___", state 40, "((i>=1))" - line 409, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 59, "(1)" - line 410, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 60, "else" - line 410, "pan.___", state 63, "(1)" - line 410, "pan.___", state 64, "(1)" - line 410, "pan.___", state 64, "(1)" - line 414, "pan.___", state 72, "(1)" - line 414, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 73, "else" - line 414, "pan.___", state 76, "(1)" - line 414, "pan.___", state 77, "(1)" - line 414, "pan.___", state 77, "(1)" - line 412, "pan.___", state 82, "((i<1))" - line 412, "pan.___", state 82, "((i>=1))" - line 419, "pan.___", state 89, "(1)" - line 419, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 90, "else" - line 419, "pan.___", state 93, "(1)" - line 419, "pan.___", state 94, "(1)" - line 419, "pan.___", state 94, "(1)" - line 421, "pan.___", state 97, "(1)" - line 421, "pan.___", state 97, "(1)" - line 370, "pan.___", state 99, "(1)" - line 640, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" - line 638, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" - line 400, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 114, "(1)" - line 404, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 128, "(1)" - line 404, "pan.___", state 129, "(1)" - line 404, "pan.___", state 129, "(1)" - line 410, "pan.___", state 153, "(1)" - line 414, "pan.___", state 166, "(1)" - line 421, "pan.___", state 191, "(1)" - line 421, "pan.___", state 191, "(1)" - line 653, "pan.___", state 199, "(1)" - line 400, "pan.___", state 209, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 223, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 254, "(1)" - line 414, "pan.___", state 267, "(1)" - line 400, "pan.___", state 300, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 314, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 345, "(1)" - line 414, "pan.___", state 358, "(1)" - line 400, "pan.___", state 395, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 409, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 440, "(1)" - line 414, "pan.___", state 453, "(1)" - line 400, "pan.___", state 488, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 502, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 533, "(1)" - line 414, "pan.___", state 546, "(1)" - line 400, "pan.___", state 582, "(1)" - line 404, "pan.___", state 594, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 638, "(1)" - line 404, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 731, "(1)" - line 404, "pan.___", state 777, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 795, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 821, "(1)" - line 419, "pan.___", state 838, "(1)" - line 404, "pan.___", state 868, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 886, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 912, "(1)" - line 419, "pan.___", state 929, "(1)" - line 404, "pan.___", state 963, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 981, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1007, "(1)" - line 419, "pan.___", state 1024, "(1)" - line 400, "pan.___", state 1050, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 1052, "(1)" - line 400, "pan.___", state 1053, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 1053, "else" - line 400, "pan.___", state 1056, "(1)" - line 404, "pan.___", state 1064, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 1066, "(1)" - line 404, "pan.___", state 1067, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 404, "pan.___", state 1067, "else" - line 404, "pan.___", state 1070, "(1)" - line 404, "pan.___", state 1071, "(1)" - line 404, "pan.___", state 1071, "(1)" - line 402, "pan.___", state 1076, "((i<1))" - line 402, "pan.___", state 1076, "((i>=1))" - line 409, "pan.___", state 1082, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 1095, "(1)" - line 410, "pan.___", state 1096, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 1096, "else" - line 410, "pan.___", state 1099, "(1)" - line 410, "pan.___", state 1100, "(1)" - line 410, "pan.___", state 1100, "(1)" - line 414, "pan.___", state 1108, "(1)" - line 414, "pan.___", state 1109, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 1109, "else" - line 414, "pan.___", state 1112, "(1)" - line 414, "pan.___", state 1113, "(1)" - line 414, "pan.___", state 1113, "(1)" - line 412, "pan.___", state 1118, "((i<1))" - line 412, "pan.___", state 1118, "((i>=1))" - line 419, "pan.___", state 1125, "(1)" - line 419, "pan.___", state 1126, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 1126, "else" - line 419, "pan.___", state 1129, "(1)" - line 419, "pan.___", state 1130, "(1)" - line 419, "pan.___", state 1130, "(1)" - line 421, "pan.___", state 1133, "(1)" - line 421, "pan.___", state 1133, "(1)" - line 404, "pan.___", state 1164, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1208, "(1)" - line 404, "pan.___", state 1254, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1298, "(1)" - line 400, "pan.___", state 1334, "(1)" - line 404, "pan.___", state 1346, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1390, "(1)" - line 404, "pan.___", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1483, "(1)" - line 404, "pan.___", state 1529, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1547, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1573, "(1)" - line 419, "pan.___", state 1590, "(1)" - line 404, "pan.___", state 1620, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1638, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1664, "(1)" - line 419, "pan.___", state 1681, "(1)" - line 404, "pan.___", state 1715, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1733, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1759, "(1)" - line 419, "pan.___", state 1776, "(1)" - line 400, "pan.___", state 1802, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 1804, "(1)" - line 400, "pan.___", state 1805, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 1805, "else" - line 400, "pan.___", state 1808, "(1)" - line 404, "pan.___", state 1816, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 1818, "(1)" - line 404, "pan.___", state 1819, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 404, "pan.___", state 1819, "else" - line 404, "pan.___", state 1822, "(1)" - line 404, "pan.___", state 1823, "(1)" - line 404, "pan.___", state 1823, "(1)" - line 402, "pan.___", state 1828, "((i<1))" - line 402, "pan.___", state 1828, "((i>=1))" - line 409, "pan.___", state 1834, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 1847, "(1)" - line 410, "pan.___", state 1848, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 1848, "else" - line 410, "pan.___", state 1851, "(1)" - line 410, "pan.___", state 1852, "(1)" - line 410, "pan.___", state 1852, "(1)" - line 414, "pan.___", state 1860, "(1)" - line 414, "pan.___", state 1861, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 1861, "else" - line 414, "pan.___", state 1864, "(1)" - line 414, "pan.___", state 1865, "(1)" - line 414, "pan.___", state 1865, "(1)" - line 412, "pan.___", state 1870, "((i<1))" - line 412, "pan.___", state 1870, "((i>=1))" - line 419, "pan.___", state 1877, "(1)" - line 419, "pan.___", state 1878, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 1878, "else" - line 419, "pan.___", state 1881, "(1)" - line 419, "pan.___", state 1882, "(1)" - line 419, "pan.___", state 1882, "(1)" - line 421, "pan.___", state 1885, "(1)" - line 421, "pan.___", state 1885, "(1)" - line 404, "pan.___", state 1916, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1960, "(1)" - line 404, "pan.___", state 2007, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 2051, "(1)" - line 404, "pan.___", state 2102, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 2146, "(1)" - line 703, "pan.___", state 2192, "-end-" - (144 of 2192 states) -unreached in proctype :init: - line 710, "pan.___", state 9, "((j<2))" - line 710, "pan.___", state 9, "((j>=2))" - line 711, "pan.___", state 20, "((j<2))" - line 711, "pan.___", state 20, "((j>=2))" - line 716, "pan.___", state 33, "((j<2))" - line 716, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 750, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 15.9 seconds -pan: rate 77100.693 states/second -pan: avg transition delay 8.2609e-07 usec -cp .input.spin urcu_free_no_mb.spin.input -cp .input.spin.trail urcu_free_no_mb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.spin.input b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.spin.input deleted file mode 100644 index 927df3f..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.spin.input +++ /dev/null @@ -1,724 +0,0 @@ -#define NO_RMB -#define NO_WMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -//#define READER_NEST_LEVEL 1 -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.spin.input.trail deleted file mode 100644 index 04e7425..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_mb.spin.input.trail +++ /dev/null @@ -1,2149 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2654 -2:3:2606 -3:3:2609 -4:3:2609 -5:3:2612 -6:3:2620 -7:3:2620 -8:3:2623 -9:3:2629 -10:3:2633 -11:3:2633 -12:3:2636 -13:3:2644 -14:3:2648 -15:3:2649 -16:0:2654 -17:3:2651 -18:0:2654 -19:2:416 -20:0:2654 -21:2:422 -22:0:2654 -23:2:423 -24:0:2654 -25:2:424 -26:2:428 -27:2:429 -28:2:437 -29:2:438 -30:2:442 -31:2:443 -32:2:451 -33:2:456 -34:2:460 -35:2:461 -36:2:468 -37:2:469 -38:2:480 -39:2:481 -40:2:482 -41:2:493 -42:2:498 -43:2:499 -44:0:2654 -45:2:511 -46:0:2654 -47:2:513 -48:2:514 -49:0:2654 -50:2:518 -51:2:522 -52:2:523 -53:2:531 -54:2:532 -55:2:536 -56:2:537 -57:2:545 -58:2:550 -59:2:551 -60:2:562 -61:2:563 -62:2:574 -63:2:575 -64:2:576 -65:2:587 -66:2:592 -67:2:593 -68:0:2654 -69:2:605 -70:0:2654 -71:2:607 -72:0:2654 -73:2:608 -74:0:2654 -75:2:618 -76:0:2654 -77:2:619 -78:2:623 -79:2:624 -80:2:632 -81:2:633 -82:2:637 -83:2:638 -84:2:646 -85:2:651 -86:2:655 -87:2:656 -88:2:663 -89:2:664 -90:2:675 -91:2:676 -92:2:677 -93:2:688 -94:2:693 -95:2:694 -96:0:2654 -97:2:709 -98:0:2654 -99:2:710 -100:2:714 -101:2:715 -102:2:723 -103:2:724 -104:2:728 -105:2:729 -106:2:737 -107:2:742 -108:2:746 -109:2:747 -110:2:754 -111:2:755 -112:2:766 -113:2:767 -114:2:768 -115:2:779 -116:2:784 -117:2:785 -118:0:2654 -119:2:800 -120:0:2654 -121:2:805 -122:2:809 -123:2:810 -124:2:818 -125:2:819 -126:2:823 -127:2:824 -128:2:832 -129:2:837 -130:2:841 -131:2:842 -132:2:849 -133:2:850 -134:2:861 -135:2:862 -136:2:863 -137:2:874 -138:2:879 -139:2:880 -140:0:2654 -141:2:895 -142:0:2654 -143:2:897 -144:0:2654 -145:2:898 -146:2:902 -147:2:903 -148:2:911 -149:2:912 -150:2:916 -151:2:917 -152:2:925 -153:2:930 -154:2:934 -155:2:935 -156:2:942 -157:2:943 -158:2:954 -159:2:955 -160:2:956 -161:2:967 -162:2:972 -163:2:973 -164:0:2654 -165:2:985 -166:0:2654 -167:2:987 -168:0:2654 -169:2:990 -170:2:991 -171:2:1003 -172:2:1004 -173:2:1008 -174:2:1009 -175:2:1017 -176:2:1022 -177:2:1026 -178:2:1027 -179:2:1034 -180:2:1035 -181:2:1046 -182:2:1047 -183:2:1048 -184:2:1059 -185:2:1064 -186:2:1065 -187:0:2654 -188:2:1077 -189:0:2654 -190:2:1079 -191:0:2654 -192:2:1080 -193:0:2654 -194:2:1081 -195:0:2654 -196:2:1082 -197:0:2654 -198:2:1083 -199:2:1087 -200:2:1088 -201:2:1096 -202:2:1097 -203:2:1101 -204:2:1102 -205:2:1110 -206:2:1115 -207:2:1119 -208:2:1120 -209:2:1127 -210:2:1128 -211:2:1139 -212:2:1140 -213:2:1141 -214:2:1152 -215:2:1157 -216:2:1158 -217:0:2654 -218:2:1170 -219:0:2654 -220:2:1451 -221:0:2654 -222:2:1549 -223:0:2654 -224:2:1550 -225:0:2654 -226:2:1554 -227:0:2654 -228:2:1560 -229:2:1564 -230:2:1565 -231:2:1573 -232:2:1574 -233:2:1578 -234:2:1579 -235:2:1587 -236:2:1592 -237:2:1596 -238:2:1597 -239:2:1604 -240:2:1605 -241:2:1616 -242:2:1617 -243:2:1618 -244:2:1629 -245:2:1634 -246:2:1635 -247:0:2654 -248:2:1647 -249:0:2654 -250:2:1649 -251:0:2654 -252:2:1650 -253:2:1654 -254:2:1655 -255:2:1663 -256:2:1664 -257:2:1668 -258:2:1669 -259:2:1677 -260:2:1682 -261:2:1686 -262:2:1687 -263:2:1694 -264:2:1695 -265:2:1706 -266:2:1707 -267:2:1708 -268:2:1719 -269:2:1724 -270:2:1725 -271:0:2654 -272:2:1737 -273:0:2654 -274:2:1739 -275:0:2654 -276:2:1742 -277:2:1743 -278:2:1755 -279:2:1756 -280:2:1760 -281:2:1761 -282:2:1769 -283:2:1774 -284:2:1778 -285:2:1779 -286:2:1786 -287:2:1787 -288:2:1798 -289:2:1799 -290:2:1800 -291:2:1811 -292:2:1816 -293:2:1817 -294:0:2654 -295:2:1829 -296:0:2654 -297:2:1831 -298:0:2654 -299:2:1832 -300:0:2654 -301:2:1833 -302:0:2654 -303:2:1834 -304:0:2654 -305:2:1835 -306:2:1839 -307:2:1840 -308:2:1848 -309:2:1849 -310:2:1853 -311:2:1854 -312:2:1862 -313:2:1867 -314:2:1871 -315:2:1872 -316:2:1879 -317:2:1880 -318:2:1891 -319:2:1892 -320:2:1893 -321:2:1904 -322:2:1909 -323:2:1910 -324:0:2654 -325:2:1922 -326:0:2654 -327:2:2203 -328:0:2654 -329:2:2301 -330:0:2654 -331:2:2302 -332:0:2654 -333:2:2306 -334:0:2654 -335:2:2312 -336:2:2316 -337:2:2317 -338:2:2325 -339:2:2326 -340:2:2330 -341:2:2331 -342:2:2339 -343:2:2344 -344:2:2348 -345:2:2349 -346:2:2356 -347:2:2357 -348:2:2368 -349:2:2369 -350:2:2370 -351:2:2381 -352:2:2386 -353:2:2387 -354:0:2654 -355:2:2402 -356:0:2654 -357:2:2403 -358:2:2407 -359:2:2408 -360:2:2416 -361:2:2417 -362:2:2421 -363:2:2422 -364:2:2430 -365:2:2435 -366:2:2439 -367:2:2440 -368:2:2447 -369:2:2448 -370:2:2459 -371:2:2460 -372:2:2461 -373:2:2472 -374:2:2477 -375:2:2478 -376:0:2654 -377:2:2493 -378:0:2654 -379:2:2498 -380:2:2502 -381:2:2503 -382:2:2511 -383:2:2512 -384:2:2516 -385:2:2517 -386:2:2525 -387:2:2530 -388:2:2534 -389:2:2535 -390:2:2542 -391:2:2543 -392:2:2554 -393:2:2555 -394:2:2556 -395:2:2567 -396:2:2572 -397:2:2573 -398:0:2654 -399:2:2588 -400:0:2654 -401:2:2590 -402:0:2654 -403:2:2591 -404:0:2654 -405:2:423 -406:0:2654 -407:2:424 -408:2:428 -409:2:429 -410:2:437 -411:2:438 -412:2:442 -413:2:443 -414:2:451 -415:2:456 -416:2:460 -417:2:461 -418:2:468 -419:2:469 -420:2:480 -421:2:481 -422:2:482 -423:2:493 -424:2:498 -425:2:499 -426:0:2654 -427:2:511 -428:0:2654 -429:2:513 -430:2:514 -431:0:2654 -432:2:518 -433:2:522 -434:2:523 -435:2:531 -436:2:532 -437:2:536 -438:2:537 -439:2:545 -440:2:550 -441:2:551 -442:2:562 -443:2:563 -444:2:574 -445:2:575 -446:2:576 -447:2:587 -448:2:592 -449:2:593 -450:0:2654 -451:2:605 -452:0:2654 -453:2:607 -454:0:2654 -455:2:608 -456:0:2654 -457:2:618 -458:0:2654 -459:2:619 -460:2:623 -461:2:624 -462:2:632 -463:2:633 -464:2:637 -465:2:638 -466:2:646 -467:2:651 -468:2:655 -469:2:656 -470:2:663 -471:2:664 -472:2:675 -473:2:676 -474:2:677 -475:2:688 -476:2:693 -477:2:694 -478:0:2654 -479:2:709 -480:0:2654 -481:2:710 -482:2:714 -483:2:715 -484:2:723 -485:2:724 -486:2:728 -487:2:729 -488:2:737 -489:2:742 -490:2:746 -491:2:747 -492:2:754 -493:2:755 -494:2:766 -495:2:767 -496:2:768 -497:2:779 -498:2:784 -499:2:785 -500:0:2654 -501:2:800 -502:0:2654 -503:2:805 -504:2:809 -505:2:810 -506:2:818 -507:2:819 -508:2:823 -509:2:824 -510:2:832 -511:2:837 -512:2:841 -513:2:842 -514:2:849 -515:2:850 -516:2:861 -517:2:862 -518:2:863 -519:2:874 -520:2:879 -521:2:880 -522:0:2654 -523:2:895 -524:0:2654 -525:2:897 -526:0:2654 -527:2:898 -528:2:902 -529:2:903 -530:2:911 -531:2:912 -532:2:916 -533:2:917 -534:2:925 -535:2:930 -536:2:934 -537:2:935 -538:2:942 -539:2:943 -540:2:954 -541:2:955 -542:2:956 -543:2:967 -544:2:972 -545:2:973 -546:0:2654 -547:2:985 -548:0:2654 -549:2:987 -550:0:2654 -551:2:990 -552:2:991 -553:2:1003 -554:2:1004 -555:2:1008 -556:2:1009 -557:2:1017 -558:2:1022 -559:2:1026 -560:2:1027 -561:2:1034 -562:2:1035 -563:2:1046 -564:2:1047 -565:2:1048 -566:2:1059 -567:2:1064 -568:2:1065 -569:0:2654 -570:2:1077 -571:0:2654 -572:2:1079 -573:0:2654 -574:2:1080 -575:0:2654 -576:2:1081 -577:0:2654 -578:2:1082 -579:0:2654 -580:2:1083 -581:2:1087 -582:2:1088 -583:2:1096 -584:2:1097 -585:2:1101 -586:2:1102 -587:2:1110 -588:2:1115 -589:2:1119 -590:2:1120 -591:2:1127 -592:2:1128 -593:2:1139 -594:2:1140 -595:2:1141 -596:2:1152 -597:2:1157 -598:2:1158 -599:0:2654 -600:2:1170 -601:0:2654 -602:2:1451 -603:0:2654 -604:2:1549 -605:0:2654 -606:2:1550 -607:0:2654 -608:2:1554 -609:0:2654 -610:2:1560 -611:2:1564 -612:2:1565 -613:2:1573 -614:2:1574 -615:2:1578 -616:2:1579 -617:2:1587 -618:2:1592 -619:2:1596 -620:2:1597 -621:2:1604 -622:2:1605 -623:2:1616 -624:2:1617 -625:2:1618 -626:2:1629 -627:2:1634 -628:2:1635 -629:0:2654 -630:2:1647 -631:0:2654 -632:2:1649 -633:0:2654 -634:2:1650 -635:2:1654 -636:2:1655 -637:2:1663 -638:2:1664 -639:2:1668 -640:2:1669 -641:2:1677 -642:2:1682 -643:2:1686 -644:2:1687 -645:2:1694 -646:2:1695 -647:2:1706 -648:2:1707 -649:2:1708 -650:2:1719 -651:2:1724 -652:2:1725 -653:0:2654 -654:2:1737 -655:0:2654 -656:2:1739 -657:0:2654 -658:2:1742 -659:2:1743 -660:2:1755 -661:2:1756 -662:2:1760 -663:2:1761 -664:2:1769 -665:2:1774 -666:2:1778 -667:2:1779 -668:2:1786 -669:2:1787 -670:2:1798 -671:2:1799 -672:2:1800 -673:2:1811 -674:2:1816 -675:2:1817 -676:0:2654 -677:2:1829 -678:0:2654 -679:2:1831 -680:0:2654 -681:2:1832 -682:0:2654 -683:2:1833 -684:0:2654 -685:2:1834 -686:0:2654 -687:2:1835 -688:2:1839 -689:2:1840 -690:2:1848 -691:2:1849 -692:2:1853 -693:2:1854 -694:2:1862 -695:2:1867 -696:2:1871 -697:2:1872 -698:2:1879 -699:2:1880 -700:2:1891 -701:2:1892 -702:2:1893 -703:2:1904 -704:2:1909 -705:2:1910 -706:0:2654 -707:2:1922 -708:0:2654 -709:2:2203 -710:0:2654 -711:2:2301 -712:0:2654 -713:2:2302 -714:0:2654 -715:2:2306 -716:0:2654 -717:2:2312 -718:2:2316 -719:2:2317 -720:2:2325 -721:2:2326 -722:2:2330 -723:2:2331 -724:2:2339 -725:2:2344 -726:2:2348 -727:2:2349 -728:2:2356 -729:2:2357 -730:2:2368 -731:2:2369 -732:2:2370 -733:2:2381 -734:2:2386 -735:2:2387 -736:0:2654 -737:2:2402 -738:0:2654 -739:2:2403 -740:2:2407 -741:2:2408 -742:2:2416 -743:2:2417 -744:2:2421 -745:2:2422 -746:2:2430 -747:2:2435 -748:2:2439 -749:2:2440 -750:2:2447 -751:2:2448 -752:2:2459 -753:2:2460 -754:2:2461 -755:2:2472 -756:2:2477 -757:2:2478 -758:0:2654 -759:2:2493 -760:0:2654 -761:2:2498 -762:2:2502 -763:2:2503 -764:2:2511 -765:2:2512 -766:2:2516 -767:2:2517 -768:2:2525 -769:2:2530 -770:2:2534 -771:2:2535 -772:2:2542 -773:2:2543 -774:2:2554 -775:2:2555 -776:2:2556 -777:2:2567 -778:2:2572 -779:2:2573 -780:0:2654 -781:2:2588 -782:0:2654 -783:2:2590 -784:0:2654 -785:2:2591 -786:0:2654 -787:2:423 -788:0:2654 -789:2:424 -790:2:428 -791:2:429 -792:2:437 -793:2:438 -794:2:442 -795:2:443 -796:2:451 -797:2:456 -798:2:460 -799:2:461 -800:2:468 -801:2:469 -802:2:480 -803:2:481 -804:2:482 -805:2:493 -806:2:498 -807:2:499 -808:0:2654 -809:2:511 -810:0:2654 -811:2:513 -812:2:514 -813:0:2654 -814:2:518 -815:2:522 -816:2:523 -817:2:531 -818:2:532 -819:2:536 -820:2:537 -821:2:545 -822:2:550 -823:2:551 -824:2:562 -825:2:563 -826:2:574 -827:2:575 -828:2:576 -829:2:587 -830:2:592 -831:2:593 -832:0:2654 -833:2:605 -834:0:2654 -835:2:607 -836:0:2654 -837:2:608 -838:0:2654 -839:2:618 -840:0:2654 -841:2:619 -842:2:623 -843:2:624 -844:2:632 -845:2:633 -846:2:637 -847:2:638 -848:2:646 -849:2:651 -850:2:655 -851:2:656 -852:2:663 -853:2:664 -854:2:675 -855:2:676 -856:2:677 -857:2:688 -858:2:693 -859:2:694 -860:0:2654 -861:2:709 -862:0:2654 -863:2:710 -864:2:714 -865:2:715 -866:2:723 -867:2:724 -868:2:728 -869:2:729 -870:2:737 -871:2:742 -872:2:746 -873:2:747 -874:2:754 -875:2:755 -876:2:766 -877:2:767 -878:2:768 -879:2:779 -880:2:784 -881:2:785 -882:0:2654 -883:2:800 -884:0:2654 -885:2:805 -886:2:809 -887:2:810 -888:2:818 -889:2:819 -890:2:823 -891:2:824 -892:2:832 -893:2:837 -894:2:841 -895:2:842 -896:2:849 -897:2:850 -898:2:861 -899:2:862 -900:2:863 -901:2:874 -902:2:879 -903:2:880 -904:0:2654 -905:2:895 -906:0:2654 -907:2:897 -908:0:2654 -909:2:898 -910:2:902 -911:2:903 -912:2:911 -913:2:912 -914:2:916 -915:2:917 -916:2:925 -917:2:930 -918:2:934 -919:2:935 -920:2:942 -921:2:943 -922:2:954 -923:2:955 -924:2:956 -925:2:967 -926:2:972 -927:2:973 -928:0:2654 -929:2:985 -930:0:2654 -931:2:987 -932:0:2654 -933:2:990 -934:2:991 -935:2:1003 -936:2:1004 -937:2:1008 -938:2:1009 -939:2:1017 -940:2:1022 -941:2:1026 -942:2:1027 -943:2:1034 -944:2:1035 -945:2:1046 -946:2:1047 -947:2:1048 -948:2:1059 -949:2:1064 -950:2:1065 -951:0:2654 -952:2:1077 -953:0:2654 -954:2:1079 -955:0:2654 -956:2:1080 -957:0:2654 -958:2:1081 -959:0:2654 -960:2:1082 -961:0:2654 -962:2:1083 -963:2:1087 -964:2:1088 -965:2:1096 -966:2:1097 -967:2:1101 -968:2:1102 -969:2:1110 -970:2:1115 -971:2:1119 -972:2:1120 -973:2:1127 -974:2:1128 -975:2:1139 -976:2:1140 -977:2:1141 -978:2:1152 -979:2:1157 -980:2:1158 -981:0:2654 -982:2:1170 -983:0:2654 -984:2:1451 -985:0:2654 -986:2:1549 -987:0:2654 -988:2:1550 -989:0:2654 -990:2:1554 -991:0:2654 -992:2:1560 -993:2:1564 -994:2:1565 -995:2:1573 -996:2:1574 -997:2:1578 -998:2:1579 -999:2:1587 -1000:2:1592 -1001:2:1596 -1002:2:1597 -1003:2:1604 -1004:2:1605 -1005:2:1616 -1006:2:1617 -1007:2:1618 -1008:2:1629 -1009:2:1634 -1010:2:1635 -1011:0:2654 -1012:2:1647 -1013:0:2654 -1014:2:1649 -1015:0:2654 -1016:2:1650 -1017:2:1654 -1018:2:1655 -1019:2:1663 -1020:2:1664 -1021:2:1668 -1022:2:1669 -1023:2:1677 -1024:2:1682 -1025:2:1686 -1026:2:1687 -1027:2:1694 -1028:2:1695 -1029:2:1706 -1030:2:1707 -1031:2:1708 -1032:2:1719 -1033:2:1724 -1034:2:1725 -1035:0:2654 -1036:2:1737 -1037:0:2654 -1038:2:1739 -1039:0:2654 -1040:2:1742 -1041:2:1743 -1042:2:1755 -1043:2:1756 -1044:2:1760 -1045:2:1761 -1046:2:1769 -1047:2:1774 -1048:2:1778 -1049:2:1779 -1050:2:1786 -1051:2:1787 -1052:2:1798 -1053:2:1799 -1054:2:1800 -1055:2:1811 -1056:2:1816 -1057:2:1817 -1058:0:2654 -1059:2:1829 -1060:0:2654 -1061:2:1831 -1062:0:2654 -1063:2:1832 -1064:0:2654 -1065:2:1833 -1066:0:2654 -1067:2:1834 -1068:0:2654 -1069:2:1835 -1070:2:1839 -1071:2:1840 -1072:2:1848 -1073:2:1849 -1074:2:1853 -1075:2:1854 -1076:2:1862 -1077:2:1867 -1078:2:1871 -1079:2:1872 -1080:2:1879 -1081:2:1880 -1082:2:1891 -1083:2:1892 -1084:2:1893 -1085:2:1904 -1086:2:1909 -1087:2:1910 -1088:0:2654 -1089:2:1922 -1090:0:2654 -1091:2:2203 -1092:0:2654 -1093:2:2301 -1094:0:2654 -1095:2:2302 -1096:0:2654 -1097:2:2306 -1098:0:2654 -1099:2:2312 -1100:2:2316 -1101:2:2317 -1102:2:2325 -1103:2:2326 -1104:2:2330 -1105:2:2331 -1106:2:2339 -1107:2:2344 -1108:2:2348 -1109:2:2349 -1110:2:2356 -1111:2:2357 -1112:2:2368 -1113:2:2369 -1114:2:2370 -1115:2:2381 -1116:2:2386 -1117:2:2387 -1118:0:2654 -1119:2:2402 -1120:0:2654 -1121:2:2403 -1122:2:2407 -1123:2:2408 -1124:2:2416 -1125:2:2417 -1126:2:2421 -1127:2:2422 -1128:2:2430 -1129:2:2435 -1130:2:2439 -1131:2:2440 -1132:2:2447 -1133:2:2448 -1134:2:2459 -1135:2:2460 -1136:2:2461 -1137:2:2472 -1138:2:2477 -1139:2:2478 -1140:0:2654 -1141:2:2493 -1142:0:2654 -1143:2:2498 -1144:2:2502 -1145:2:2503 -1146:2:2511 -1147:2:2512 -1148:2:2516 -1149:2:2517 -1150:2:2525 -1151:2:2530 -1152:2:2534 -1153:2:2535 -1154:2:2542 -1155:2:2543 -1156:2:2554 -1157:2:2555 -1158:2:2556 -1159:2:2567 -1160:2:2572 -1161:2:2573 -1162:0:2654 -1163:2:2588 -1164:0:2654 -1165:2:2590 -1166:0:2654 -1167:2:2591 -1168:0:2654 -1169:2:423 -1170:0:2654 -1171:2:424 -1172:2:428 -1173:2:429 -1174:2:437 -1175:2:438 -1176:2:442 -1177:2:443 -1178:2:451 -1179:2:456 -1180:2:460 -1181:2:461 -1182:2:468 -1183:2:469 -1184:2:480 -1185:2:481 -1186:2:482 -1187:2:493 -1188:2:498 -1189:2:499 -1190:0:2654 -1191:2:511 -1192:0:2654 -1193:2:513 -1194:2:514 -1195:0:2654 -1196:2:518 -1197:2:522 -1198:2:523 -1199:2:531 -1200:2:532 -1201:2:536 -1202:2:537 -1203:2:545 -1204:2:550 -1205:2:551 -1206:2:562 -1207:2:563 -1208:2:574 -1209:2:575 -1210:2:576 -1211:2:587 -1212:2:592 -1213:2:593 -1214:0:2654 -1215:2:605 -1216:0:2654 -1217:2:607 -1218:0:2654 -1219:2:608 -1220:0:2654 -1221:2:618 -1222:0:2654 -1223:2:619 -1224:2:623 -1225:2:624 -1226:2:632 -1227:2:633 -1228:2:637 -1229:2:638 -1230:2:646 -1231:2:651 -1232:2:655 -1233:2:656 -1234:2:663 -1235:2:664 -1236:2:675 -1237:2:676 -1238:2:677 -1239:2:688 -1240:2:693 -1241:2:694 -1242:0:2654 -1243:2:709 -1244:0:2654 -1245:2:710 -1246:2:714 -1247:2:715 -1248:2:723 -1249:2:724 -1250:2:728 -1251:2:729 -1252:2:737 -1253:2:742 -1254:2:746 -1255:2:747 -1256:2:754 -1257:2:755 -1258:2:766 -1259:2:767 -1260:2:768 -1261:2:779 -1262:2:784 -1263:2:785 -1264:0:2654 -1265:2:800 -1266:0:2654 -1267:2:805 -1268:2:809 -1269:2:810 -1270:2:818 -1271:2:819 -1272:2:823 -1273:2:824 -1274:2:832 -1275:2:837 -1276:2:841 -1277:2:842 -1278:2:849 -1279:2:850 -1280:2:861 -1281:2:862 -1282:2:863 -1283:2:874 -1284:2:879 -1285:2:880 -1286:0:2654 -1287:2:895 -1288:0:2654 -1289:2:897 -1290:0:2654 -1291:2:898 -1292:2:902 -1293:2:903 -1294:2:911 -1295:2:912 -1296:2:916 -1297:2:917 -1298:2:925 -1299:2:930 -1300:2:934 -1301:2:935 -1302:2:942 -1303:2:943 -1304:2:954 -1305:2:955 -1306:2:956 -1307:2:967 -1308:2:972 -1309:2:973 -1310:0:2654 -1311:2:985 -1312:0:2654 -1313:2:987 -1314:0:2654 -1315:2:990 -1316:2:991 -1317:2:1003 -1318:2:1004 -1319:2:1008 -1320:2:1009 -1321:2:1017 -1322:2:1022 -1323:2:1026 -1324:2:1027 -1325:2:1034 -1326:2:1035 -1327:2:1046 -1328:2:1047 -1329:2:1048 -1330:2:1059 -1331:2:1064 -1332:2:1065 -1333:0:2654 -1334:2:1077 -1335:0:2654 -1336:2:1079 -1337:0:2654 -1338:2:1080 -1339:0:2654 -1340:2:1081 -1341:0:2654 -1342:2:1082 -1343:0:2654 -1344:2:1083 -1345:2:1087 -1346:2:1088 -1347:2:1096 -1348:2:1097 -1349:2:1101 -1350:2:1102 -1351:2:1110 -1352:2:1115 -1353:2:1119 -1354:2:1120 -1355:2:1127 -1356:2:1128 -1357:2:1139 -1358:2:1140 -1359:2:1141 -1360:2:1152 -1361:2:1157 -1362:2:1158 -1363:0:2654 -1364:2:1170 -1365:0:2654 -1366:2:1451 -1367:0:2654 -1368:2:1549 -1369:0:2654 -1370:2:1550 -1371:0:2654 -1372:2:1554 -1373:0:2654 -1374:2:1560 -1375:2:1564 -1376:2:1565 -1377:2:1573 -1378:2:1574 -1379:2:1578 -1380:2:1579 -1381:2:1587 -1382:2:1592 -1383:2:1596 -1384:2:1597 -1385:2:1604 -1386:2:1605 -1387:2:1616 -1388:2:1617 -1389:2:1618 -1390:2:1629 -1391:2:1634 -1392:2:1635 -1393:0:2654 -1394:2:1647 -1395:0:2654 -1396:2:1649 -1397:0:2654 -1398:2:1650 -1399:2:1654 -1400:2:1655 -1401:2:1663 -1402:2:1664 -1403:2:1668 -1404:2:1669 -1405:2:1677 -1406:2:1682 -1407:2:1686 -1408:2:1687 -1409:2:1694 -1410:2:1695 -1411:2:1706 -1412:2:1707 -1413:2:1708 -1414:2:1719 -1415:2:1724 -1416:2:1725 -1417:0:2654 -1418:2:1737 -1419:0:2654 -1420:2:1739 -1421:0:2654 -1422:2:1742 -1423:2:1743 -1424:2:1755 -1425:2:1756 -1426:2:1760 -1427:2:1761 -1428:2:1769 -1429:2:1774 -1430:2:1778 -1431:2:1779 -1432:2:1786 -1433:2:1787 -1434:2:1798 -1435:2:1799 -1436:2:1800 -1437:2:1811 -1438:2:1816 -1439:2:1817 -1440:0:2654 -1441:2:1829 -1442:0:2654 -1443:2:1831 -1444:0:2654 -1445:2:1832 -1446:0:2654 -1447:2:1833 -1448:0:2654 -1449:2:1834 -1450:0:2654 -1451:2:1835 -1452:2:1839 -1453:2:1840 -1454:2:1848 -1455:2:1849 -1456:2:1853 -1457:2:1854 -1458:2:1862 -1459:2:1867 -1460:2:1871 -1461:2:1872 -1462:2:1879 -1463:2:1880 -1464:2:1891 -1465:2:1892 -1466:2:1893 -1467:2:1904 -1468:2:1909 -1469:2:1910 -1470:0:2654 -1471:2:1922 -1472:0:2654 -1473:2:2203 -1474:0:2654 -1475:2:2301 -1476:0:2654 -1477:2:2302 -1478:0:2654 -1479:2:2306 -1480:0:2654 -1481:2:2312 -1482:2:2316 -1483:2:2317 -1484:2:2325 -1485:2:2326 -1486:2:2330 -1487:2:2331 -1488:2:2339 -1489:2:2344 -1490:2:2348 -1491:2:2349 -1492:2:2356 -1493:2:2357 -1494:2:2368 -1495:2:2369 -1496:2:2370 -1497:2:2381 -1498:2:2386 -1499:2:2387 -1500:0:2654 -1501:2:2402 -1502:0:2654 -1503:2:2403 -1504:2:2407 -1505:2:2408 -1506:2:2416 -1507:2:2417 -1508:2:2421 -1509:2:2422 -1510:2:2430 -1511:2:2435 -1512:2:2439 -1513:2:2440 -1514:2:2447 -1515:2:2448 -1516:2:2459 -1517:2:2460 -1518:2:2461 -1519:2:2472 -1520:2:2477 -1521:2:2478 -1522:0:2654 -1523:2:2493 -1524:0:2654 -1525:2:2498 -1526:2:2502 -1527:2:2503 -1528:2:2511 -1529:2:2512 -1530:2:2516 -1531:2:2517 -1532:2:2525 -1533:2:2530 -1534:2:2534 -1535:2:2535 -1536:2:2542 -1537:2:2543 -1538:2:2554 -1539:2:2555 -1540:2:2556 -1541:2:2567 -1542:2:2572 -1543:2:2573 -1544:0:2654 -1545:2:2588 -1546:0:2654 -1547:2:2590 -1548:0:2654 -1549:2:2591 -1550:0:2654 -1551:2:423 -1552:0:2654 -1553:2:424 -1554:2:428 -1555:2:429 -1556:2:437 -1557:2:438 -1558:2:442 -1559:2:443 -1560:2:451 -1561:2:456 -1562:2:460 -1563:2:461 -1564:2:468 -1565:2:469 -1566:2:480 -1567:2:481 -1568:2:482 -1569:2:493 -1570:2:498 -1571:2:499 -1572:0:2654 -1573:2:511 -1574:0:2654 -1575:2:513 -1576:2:514 -1577:0:2654 -1578:2:518 -1579:2:522 -1580:2:523 -1581:2:531 -1582:2:532 -1583:2:536 -1584:2:537 -1585:2:545 -1586:2:558 -1587:2:559 -1588:2:562 -1589:2:563 -1590:2:574 -1591:2:575 -1592:2:576 -1593:2:587 -1594:2:592 -1595:2:595 -1596:2:596 -1597:0:2654 -1598:2:605 -1599:0:2654 -1600:2:607 -1601:0:2654 -1602:2:608 -1603:0:2654 -1604:2:618 -1605:0:2654 -1606:2:619 -1607:2:623 -1608:2:624 -1609:2:632 -1610:2:633 -1611:2:637 -1612:2:638 -1613:2:646 -1614:2:659 -1615:2:660 -1616:2:663 -1617:2:664 -1618:2:675 -1619:2:676 -1620:2:677 -1621:2:688 -1622:2:693 -1623:2:696 -1624:2:697 -1625:0:2654 -1626:2:709 -1627:0:2654 -1628:2:710 -1629:2:714 -1630:2:715 -1631:2:723 -1632:2:724 -1633:2:728 -1634:2:729 -1635:2:737 -1636:2:750 -1637:2:751 -1638:2:754 -1639:2:755 -1640:2:766 -1641:2:767 -1642:2:768 -1643:2:779 -1644:2:784 -1645:2:787 -1646:2:788 -1647:0:2654 -1648:2:800 -1649:0:2654 -1650:2:805 -1651:2:809 -1652:2:810 -1653:2:818 -1654:2:819 -1655:2:823 -1656:2:824 -1657:2:832 -1658:2:845 -1659:2:846 -1660:2:849 -1661:2:850 -1662:2:861 -1663:2:862 -1664:2:863 -1665:2:874 -1666:2:879 -1667:2:882 -1668:2:883 -1669:0:2654 -1670:2:895 -1671:0:2654 -1672:2:897 -1673:0:2654 -1674:2:898 -1675:2:902 -1676:2:903 -1677:2:911 -1678:2:912 -1679:2:916 -1680:2:917 -1681:2:925 -1682:2:938 -1683:2:939 -1684:2:942 -1685:2:943 -1686:2:954 -1687:2:955 -1688:2:956 -1689:2:967 -1690:2:972 -1691:2:975 -1692:2:976 -1693:0:2654 -1694:2:985 -1695:0:2654 -1696:2:987 -1697:0:2654 -1698:2:990 -1699:2:991 -1700:2:1003 -1701:2:1004 -1702:2:1008 -1703:2:1009 -1704:2:1017 -1705:2:1030 -1706:2:1031 -1707:2:1034 -1708:2:1035 -1709:2:1046 -1710:2:1047 -1711:2:1048 -1712:2:1059 -1713:2:1064 -1714:2:1067 -1715:2:1068 -1716:0:2654 -1717:2:1077 -1718:0:2654 -1719:2:1079 -1720:0:2654 -1721:2:1080 -1722:0:2654 -1723:2:1081 -1724:0:2654 -1725:2:1082 -1726:0:2654 -1727:2:1083 -1728:2:1087 -1729:2:1088 -1730:2:1096 -1731:2:1097 -1732:2:1101 -1733:2:1102 -1734:2:1110 -1735:2:1123 -1736:2:1124 -1737:2:1127 -1738:2:1128 -1739:2:1139 -1740:2:1140 -1741:2:1141 -1742:2:1152 -1743:2:1157 -1744:2:1160 -1745:2:1161 -1746:0:2654 -1747:2:1170 -1748:0:2654 -1749:2:1451 -1750:0:2654 -1751:2:1549 -1752:0:2654 -1753:2:1550 -1754:0:2654 -1755:2:1554 -1756:0:2654 -1757:2:1560 -1758:2:1564 -1759:2:1565 -1760:2:1573 -1761:2:1574 -1762:2:1578 -1763:2:1579 -1764:2:1587 -1765:2:1600 -1766:2:1601 -1767:2:1604 -1768:2:1605 -1769:2:1616 -1770:2:1617 -1771:2:1618 -1772:2:1629 -1773:2:1634 -1774:2:1637 -1775:2:1638 -1776:0:2654 -1777:2:1647 -1778:0:2654 -1779:2:1649 -1780:0:2654 -1781:2:1650 -1782:2:1654 -1783:2:1655 -1784:2:1663 -1785:2:1664 -1786:2:1668 -1787:2:1669 -1788:2:1677 -1789:2:1690 -1790:2:1691 -1791:2:1694 -1792:2:1695 -1793:2:1706 -1794:2:1707 -1795:2:1708 -1796:2:1719 -1797:2:1724 -1798:2:1727 -1799:2:1728 -1800:0:2654 -1801:2:1737 -1802:0:2654 -1803:2:1739 -1804:0:2654 -1805:2:1742 -1806:2:1743 -1807:2:1755 -1808:2:1756 -1809:2:1760 -1810:2:1761 -1811:2:1769 -1812:2:1782 -1813:2:1783 -1814:2:1786 -1815:2:1787 -1816:2:1798 -1817:2:1799 -1818:2:1800 -1819:2:1811 -1820:2:1816 -1821:2:1819 -1822:2:1820 -1823:0:2654 -1824:2:1829 -1825:0:2654 -1826:2:1831 -1827:0:2654 -1828:2:1832 -1829:0:2654 -1830:2:1833 -1831:0:2654 -1832:2:1834 -1833:0:2654 -1834:2:1835 -1835:2:1839 -1836:2:1840 -1837:2:1848 -1838:2:1849 -1839:2:1853 -1840:2:1854 -1841:2:1862 -1842:2:1875 -1843:2:1876 -1844:2:1879 -1845:2:1880 -1846:2:1891 -1847:2:1892 -1848:2:1893 -1849:2:1904 -1850:2:1909 -1851:2:1912 -1852:2:1913 -1853:0:2654 -1854:2:1922 -1855:0:2654 -1856:2:2203 -1857:0:2654 -1858:2:2301 -1859:0:2654 -1860:2:2302 -1861:0:2654 -1862:2:2306 -1863:0:2654 -1864:2:2312 -1865:2:2316 -1866:2:2317 -1867:2:2325 -1868:2:2326 -1869:2:2330 -1870:2:2331 -1871:2:2339 -1872:2:2352 -1873:2:2353 -1874:2:2356 -1875:2:2357 -1876:2:2368 -1877:2:2369 -1878:2:2370 -1879:2:2381 -1880:2:2386 -1881:2:2389 -1882:2:2390 -1883:0:2654 -1884:2:2402 -1885:0:2654 -1886:2:2403 -1887:2:2407 -1888:2:2408 -1889:2:2416 -1890:2:2417 -1891:2:2421 -1892:2:2422 -1893:2:2430 -1894:2:2443 -1895:2:2444 -1896:2:2447 -1897:2:2448 -1898:2:2459 -1899:2:2460 -1900:2:2461 -1901:2:2472 -1902:2:2477 -1903:2:2480 -1904:2:2481 -1905:0:2654 -1906:2:2493 -1907:0:2654 -1908:2:2498 -1909:2:2502 -1910:2:2503 -1911:2:2511 -1912:2:2512 -1913:2:2516 -1914:2:2517 -1915:2:2525 -1916:2:2538 -1917:2:2539 -1918:2:2542 -1919:2:2543 -1920:2:2554 -1921:2:2555 -1922:2:2556 -1923:2:2567 -1924:2:2572 -1925:2:2575 -1926:2:2576 -1927:0:2654 -1928:2:2588 -1929:0:2654 -1930:2:2590 -1931:0:2654 -1932:2:2591 -1933:0:2654 -1934:2:2594 -1935:0:2654 -1936:2:2599 -1937:0:2654 -1938:1:2 -1939:0:2654 -1940:2:2600 -1941:0:2654 -1942:1:8 -1943:0:2654 -1944:2:2599 -1945:0:2654 -1946:1:9 -1947:0:2654 -1948:2:2600 -1949:0:2654 -1950:1:10 -1951:0:2654 -1952:2:2599 -1953:0:2654 -1954:1:11 -1955:0:2654 -1956:2:2600 -1957:0:2654 -1958:1:12 -1959:1:16 -1960:1:17 -1961:1:25 -1962:1:26 -1963:1:30 -1964:1:31 -1965:1:39 -1966:1:44 -1967:1:48 -1968:1:49 -1969:1:56 -1970:1:57 -1971:1:68 -1972:1:69 -1973:1:70 -1974:1:81 -1975:1:86 -1976:1:87 -1977:0:2654 -1978:2:2599 -1979:0:2654 -1980:1:99 -1981:0:2654 -1982:2:2600 -1983:0:2654 -1984:1:101 -1985:0:2654 -1986:2:2599 -1987:0:2654 -1988:1:102 -1989:1:106 -1990:1:107 -1991:1:115 -1992:1:116 -1993:1:120 -1994:1:121 -1995:1:129 -1996:1:134 -1997:1:138 -1998:1:139 -1999:1:146 -2000:1:147 -2001:1:158 -2002:1:159 -2003:1:160 -2004:1:171 -2005:1:176 -2006:1:177 -2007:0:2654 -2008:2:2600 -2009:0:2654 -2010:1:189 -2011:0:2654 -2012:2:2599 -2013:0:2654 -2014:1:191 -2015:0:2654 -2016:2:2600 -2017:0:2654 -2018:1:192 -2019:0:2654 -2020:2:2599 -2021:0:2654 -2022:1:193 -2023:1:197 -2024:1:198 -2025:1:206 -2026:1:207 -2027:1:211 -2028:1:212 -2029:1:220 -2030:1:225 -2031:1:229 -2032:1:230 -2033:1:237 -2034:1:238 -2035:1:249 -2036:1:250 -2037:1:251 -2038:1:262 -2039:1:267 -2040:1:268 -2041:0:2654 -2042:2:2600 -2043:0:2654 -2044:1:280 -2045:0:2654 -2046:2:2599 -2047:0:2654 -2048:1:282 -2049:0:2654 -2050:2:2600 -2051:0:2654 -2052:1:291 -2053:0:2654 -2054:2:2599 -2055:0:2654 -2056:1:293 -2057:0:2654 -2058:2:2600 -2059:0:2654 -2060:1:11 -2061:0:2654 -2062:2:2599 -2063:0:2654 -2064:1:12 -2065:1:16 -2066:1:17 -2067:1:25 -2068:1:26 -2069:1:27 -2070:1:39 -2071:1:44 -2072:1:48 -2073:1:49 -2074:1:56 -2075:1:57 -2076:1:68 -2077:1:69 -2078:1:70 -2079:1:81 -2080:1:86 -2081:1:87 -2082:0:2654 -2083:2:2600 -2084:0:2654 -2085:1:99 -2086:0:2654 -2087:2:2599 -2088:0:2654 -2089:1:101 -2090:0:2654 -2091:2:2600 -2092:0:2654 -2093:1:102 -2094:1:106 -2095:1:107 -2096:1:115 -2097:1:116 -2098:1:120 -2099:1:121 -2100:1:129 -2101:1:134 -2102:1:138 -2103:1:139 -2104:1:146 -2105:1:147 -2106:1:158 -2107:1:159 -2108:1:160 -2109:1:171 -2110:1:176 -2111:1:177 -2112:0:2654 -2113:2:2599 -2114:0:2654 -2115:1:189 -2116:0:2654 -2117:2:2600 -2118:0:2654 -2119:1:285 -2120:0:2654 -2121:2:2599 -2122:0:2654 -2123:1:286 -2124:0:2654 -2125:2:2600 -2126:0:2654 -2127:1:291 -2128:0:2654 -2129:2:2599 -2130:0:2654 -2131:1:293 -2132:0:2654 -2133:2:2600 -2134:0:2654 -2135:1:296 -2136:0:2654 -2137:2:2599 -2138:0:2654 -2139:1:301 -2140:0:2654 -2141:2:2600 -2142:0:2654 -2143:1:302 -2144:0:2652 -2145:2:2599 -2146:0:2658 -2147:2:779 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.define b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.log b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.log deleted file mode 100644 index b7f3b80..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.log +++ /dev/null @@ -1,266 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_rmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -Depth= 5439 States= 1e+06 Transitions= 1.03e+07 Memory= 527.190 t= 8.16 R= 1e+05 -pan: claim violated! (at depth 1801) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 5439, errors: 1 - 1006552 states, stored - 9396280 states, matched - 10402832 transitions (= stored+matched) - 36844262 atomic steps -hash conflicts: 1832712 (resolved) - -Stats on memory usage (in Megabytes): - 80.634 equivalent memory usage for states (stored*(State-vector + overhead)) - 61.871 actual memory usage for states (compression: 76.73%) - state-vector as stored = 36 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 527.580 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 151, "(1)" - line 418, "pan.___", state 181, "(1)" - line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 242, "(1)" - line 418, "pan.___", state 272, "(1)" - line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 360, "(1)" - line 418, "pan.___", state 390, "(1)" - line 540, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 20, "(1)" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 34, "(1)" - line 403, "pan.___", state 35, "(1)" - line 403, "pan.___", state 35, "(1)" - line 401, "pan.___", state 40, "((i<1))" - line 401, "pan.___", state 40, "((i>=1))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 59, "(1)" - line 409, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 60, "else" - line 409, "pan.___", state 63, "(1)" - line 409, "pan.___", state 64, "(1)" - line 409, "pan.___", state 64, "(1)" - line 413, "pan.___", state 72, "(1)" - line 413, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 73, "else" - line 413, "pan.___", state 76, "(1)" - line 413, "pan.___", state 77, "(1)" - line 413, "pan.___", state 77, "(1)" - line 411, "pan.___", state 82, "((i<1))" - line 411, "pan.___", state 82, "((i>=1))" - line 418, "pan.___", state 89, "(1)" - line 418, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 90, "else" - line 418, "pan.___", state 93, "(1)" - line 418, "pan.___", state 94, "(1)" - line 418, "pan.___", state 94, "(1)" - line 420, "pan.___", state 97, "(1)" - line 420, "pan.___", state 97, "(1)" - line 369, "pan.___", state 99, "(1)" - line 639, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" - line 637, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 114, "(1)" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 128, "(1)" - line 403, "pan.___", state 129, "(1)" - line 403, "pan.___", state 129, "(1)" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 420, "pan.___", state 191, "(1)" - line 420, "pan.___", state 191, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 175, "pan.___", state 243, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 746, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 759, "(1)" - line 409, "pan.___", state 760, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 760, "else" - line 409, "pan.___", state 763, "(1)" - line 409, "pan.___", state 764, "(1)" - line 409, "pan.___", state 764, "(1)" - line 413, "pan.___", state 772, "(1)" - line 413, "pan.___", state 773, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 773, "else" - line 413, "pan.___", state 776, "(1)" - line 413, "pan.___", state 777, "(1)" - line 413, "pan.___", state 777, "(1)" - line 411, "pan.___", state 782, "((i<1))" - line 411, "pan.___", state 782, "((i>=1))" - line 418, "pan.___", state 789, "(1)" - line 418, "pan.___", state 790, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 790, "else" - line 418, "pan.___", state 793, "(1)" - line 418, "pan.___", state 794, "(1)" - line 418, "pan.___", state 794, "(1)" - line 420, "pan.___", state 797, "(1)" - line 420, "pan.___", state 797, "(1)" - line 403, "pan.___", state 828, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 846, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 872, "(1)" - line 418, "pan.___", state 889, "(1)" - line 403, "pan.___", state 918, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 936, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 962, "(1)" - line 418, "pan.___", state 979, "(1)" - line 399, "pan.___", state 998, "(1)" - line 403, "pan.___", state 1010, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1028, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1054, "(1)" - line 418, "pan.___", state 1071, "(1)" - line 403, "pan.___", state 1103, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1121, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1147, "(1)" - line 418, "pan.___", state 1164, "(1)" - line 179, "pan.___", state 1187, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1200, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 175, "pan.___", state 1213, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 1330, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1343, "(1)" - line 409, "pan.___", state 1344, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 1344, "else" - line 409, "pan.___", state 1347, "(1)" - line 409, "pan.___", state 1348, "(1)" - line 409, "pan.___", state 1348, "(1)" - line 413, "pan.___", state 1356, "(1)" - line 413, "pan.___", state 1357, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 1357, "else" - line 413, "pan.___", state 1360, "(1)" - line 413, "pan.___", state 1361, "(1)" - line 413, "pan.___", state 1361, "(1)" - line 411, "pan.___", state 1366, "((i<1))" - line 411, "pan.___", state 1366, "((i>=1))" - line 418, "pan.___", state 1373, "(1)" - line 418, "pan.___", state 1374, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 1374, "else" - line 418, "pan.___", state 1377, "(1)" - line 418, "pan.___", state 1378, "(1)" - line 418, "pan.___", state 1378, "(1)" - line 420, "pan.___", state 1381, "(1)" - line 420, "pan.___", state 1381, "(1)" - line 179, "pan.___", state 1406, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1419, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 175, "pan.___", state 1432, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=2))" - line 710, "pan.___", state 20, "((j<2))" - line 710, "pan.___", state 20, "((j>=2))" - line 715, "pan.___", state 33, "((j<2))" - line 715, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 749, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 8.24 seconds -pan: rate 122154.37 states/second -pan: avg transition delay 7.9209e-07 usec -cp .input.spin urcu_free_no_rmb.spin.input -cp .input.spin.trail urcu_free_no_rmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.spin.input b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.spin.input deleted file mode 100644 index 6dea6e1..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define NO_RMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -//#define READER_NEST_LEVEL 1 -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.spin.input.trail deleted file mode 100644 index 071a19e..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_rmb.spin.input.trail +++ /dev/null @@ -1,1804 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:1982 -2:3:1934 -3:3:1937 -4:3:1937 -5:3:1940 -6:3:1948 -7:3:1948 -8:3:1951 -9:3:1957 -10:3:1961 -11:3:1961 -12:3:1964 -13:3:1972 -14:3:1976 -15:3:1977 -16:0:1982 -17:3:1979 -18:0:1982 -19:2:416 -20:0:1982 -21:2:422 -22:0:1982 -23:2:423 -24:0:1982 -25:2:424 -26:2:428 -27:2:429 -28:2:437 -29:2:438 -30:2:442 -31:2:443 -32:2:451 -33:2:456 -34:2:460 -35:2:461 -36:2:468 -37:2:469 -38:2:480 -39:2:481 -40:2:482 -41:2:493 -42:2:498 -43:2:499 -44:0:1982 -45:2:511 -46:0:1982 -47:2:513 -48:2:514 -49:0:1982 -50:2:518 -51:2:522 -52:2:523 -53:2:531 -54:2:532 -55:2:536 -56:2:537 -57:2:545 -58:2:550 -59:2:551 -60:2:562 -61:2:563 -62:2:574 -63:2:575 -64:2:576 -65:2:587 -66:2:592 -67:2:593 -68:0:1982 -69:2:605 -70:0:1982 -71:2:607 -72:0:1982 -73:2:608 -74:0:1982 -75:2:618 -76:0:1982 -77:2:622 -78:2:623 -79:2:627 -80:2:631 -81:2:632 -82:2:636 -83:2:644 -84:2:645 -85:0:1982 -86:2:653 -87:0:1982 -88:2:657 -89:2:658 -90:2:662 -91:2:666 -92:2:667 -93:2:671 -94:2:679 -95:2:680 -96:0:1982 -97:2:688 -98:0:1982 -99:2:696 -100:2:697 -101:2:701 -102:2:705 -103:2:706 -104:2:710 -105:2:718 -106:2:719 -107:0:1982 -108:2:727 -109:0:1982 -110:2:729 -111:0:1982 -112:2:730 -113:2:734 -114:2:735 -115:2:743 -116:2:744 -117:2:748 -118:2:749 -119:2:757 -120:2:762 -121:2:766 -122:2:767 -123:2:774 -124:2:775 -125:2:786 -126:2:787 -127:2:788 -128:2:799 -129:2:804 -130:2:805 -131:0:1982 -132:2:817 -133:0:1982 -134:2:819 -135:0:1982 -136:2:822 -137:2:823 -138:2:835 -139:2:836 -140:2:840 -141:2:841 -142:2:849 -143:2:854 -144:2:858 -145:2:859 -146:2:866 -147:2:867 -148:2:878 -149:2:879 -150:2:880 -151:2:891 -152:2:896 -153:2:897 -154:0:1982 -155:2:909 -156:0:1982 -157:2:911 -158:0:1982 -159:2:912 -160:0:1982 -161:2:913 -162:0:1982 -163:2:914 -164:0:1982 -165:2:915 -166:2:919 -167:2:920 -168:2:928 -169:2:929 -170:2:933 -171:2:934 -172:2:942 -173:2:947 -174:2:951 -175:2:952 -176:2:959 -177:2:960 -178:2:971 -179:2:972 -180:2:973 -181:2:984 -182:2:989 -183:2:990 -184:0:1982 -185:2:1002 -186:0:1982 -187:2:1115 -188:0:1982 -189:2:1213 -190:0:1982 -191:2:1214 -192:0:1982 -193:2:1218 -194:0:1982 -195:2:1224 -196:2:1228 -197:2:1229 -198:2:1237 -199:2:1238 -200:2:1242 -201:2:1243 -202:2:1251 -203:2:1256 -204:2:1260 -205:2:1261 -206:2:1268 -207:2:1269 -208:2:1280 -209:2:1281 -210:2:1282 -211:2:1293 -212:2:1298 -213:2:1299 -214:0:1982 -215:2:1311 -216:0:1982 -217:2:1313 -218:0:1982 -219:2:1314 -220:2:1318 -221:2:1319 -222:2:1327 -223:2:1328 -224:2:1332 -225:2:1333 -226:2:1341 -227:2:1346 -228:2:1350 -229:2:1351 -230:2:1358 -231:2:1359 -232:2:1370 -233:2:1371 -234:2:1372 -235:2:1383 -236:2:1388 -237:2:1389 -238:0:1982 -239:2:1401 -240:0:1982 -241:2:1403 -242:0:1982 -243:2:1406 -244:2:1407 -245:2:1419 -246:2:1420 -247:2:1424 -248:2:1425 -249:2:1433 -250:2:1438 -251:2:1442 -252:2:1443 -253:2:1450 -254:2:1451 -255:2:1462 -256:2:1463 -257:2:1464 -258:2:1475 -259:2:1480 -260:2:1481 -261:0:1982 -262:2:1493 -263:0:1982 -264:2:1495 -265:0:1982 -266:2:1496 -267:0:1982 -268:2:1497 -269:0:1982 -270:2:1498 -271:0:1982 -272:2:1499 -273:2:1503 -274:2:1504 -275:2:1512 -276:2:1513 -277:2:1517 -278:2:1518 -279:2:1526 -280:2:1531 -281:2:1535 -282:2:1536 -283:2:1543 -284:2:1544 -285:2:1555 -286:2:1556 -287:2:1557 -288:2:1568 -289:2:1573 -290:2:1574 -291:0:1982 -292:2:1586 -293:0:1982 -294:2:1699 -295:0:1982 -296:2:1797 -297:0:1982 -298:2:1798 -299:0:1982 -300:2:1802 -301:0:1982 -302:2:1811 -303:2:1812 -304:2:1816 -305:2:1820 -306:2:1821 -307:2:1825 -308:2:1833 -309:2:1834 -310:0:1982 -311:2:1842 -312:0:1982 -313:2:1846 -314:2:1847 -315:2:1851 -316:2:1855 -317:2:1856 -318:2:1860 -319:2:1868 -320:2:1869 -321:0:1982 -322:2:1877 -323:0:1982 -324:2:1885 -325:2:1886 -326:2:1890 -327:2:1894 -328:2:1895 -329:2:1899 -330:2:1907 -331:2:1908 -332:0:1982 -333:2:1916 -334:0:1982 -335:2:1918 -336:0:1982 -337:2:1919 -338:0:1982 -339:2:423 -340:0:1982 -341:2:424 -342:2:428 -343:2:429 -344:2:437 -345:2:438 -346:2:442 -347:2:443 -348:2:451 -349:2:456 -350:2:460 -351:2:461 -352:2:468 -353:2:469 -354:2:480 -355:2:481 -356:2:482 -357:2:493 -358:2:498 -359:2:499 -360:0:1982 -361:2:511 -362:0:1982 -363:2:513 -364:2:514 -365:0:1982 -366:2:518 -367:2:522 -368:2:523 -369:2:531 -370:2:532 -371:2:536 -372:2:537 -373:2:545 -374:2:550 -375:2:551 -376:2:562 -377:2:563 -378:2:574 -379:2:575 -380:2:576 -381:2:587 -382:2:592 -383:2:593 -384:0:1982 -385:2:605 -386:0:1982 -387:2:607 -388:0:1982 -389:2:608 -390:0:1982 -391:2:618 -392:0:1982 -393:2:622 -394:2:623 -395:2:627 -396:2:631 -397:2:632 -398:2:636 -399:2:644 -400:2:645 -401:0:1982 -402:2:653 -403:0:1982 -404:2:657 -405:2:658 -406:2:662 -407:2:666 -408:2:667 -409:2:671 -410:2:679 -411:2:680 -412:0:1982 -413:2:688 -414:0:1982 -415:2:696 -416:2:697 -417:2:701 -418:2:705 -419:2:706 -420:2:710 -421:2:718 -422:2:719 -423:0:1982 -424:2:727 -425:0:1982 -426:2:729 -427:0:1982 -428:2:730 -429:2:734 -430:2:735 -431:2:743 -432:2:744 -433:2:748 -434:2:749 -435:2:757 -436:2:762 -437:2:766 -438:2:767 -439:2:774 -440:2:775 -441:2:786 -442:2:787 -443:2:788 -444:2:799 -445:2:804 -446:2:805 -447:0:1982 -448:2:817 -449:0:1982 -450:2:819 -451:0:1982 -452:2:822 -453:2:823 -454:2:835 -455:2:836 -456:2:840 -457:2:841 -458:2:849 -459:2:854 -460:2:858 -461:2:859 -462:2:866 -463:2:867 -464:2:878 -465:2:879 -466:2:880 -467:2:891 -468:2:896 -469:2:897 -470:0:1982 -471:2:909 -472:0:1982 -473:2:911 -474:0:1982 -475:2:912 -476:0:1982 -477:2:913 -478:0:1982 -479:2:914 -480:0:1982 -481:2:915 -482:2:919 -483:2:920 -484:2:928 -485:2:929 -486:2:933 -487:2:934 -488:2:942 -489:2:947 -490:2:951 -491:2:952 -492:2:959 -493:2:960 -494:2:971 -495:2:972 -496:2:973 -497:2:984 -498:2:989 -499:2:990 -500:0:1982 -501:2:1002 -502:0:1982 -503:2:1115 -504:0:1982 -505:2:1213 -506:0:1982 -507:2:1214 -508:0:1982 -509:2:1218 -510:0:1982 -511:2:1224 -512:2:1228 -513:2:1229 -514:2:1237 -515:2:1238 -516:2:1242 -517:2:1243 -518:2:1251 -519:2:1256 -520:2:1260 -521:2:1261 -522:2:1268 -523:2:1269 -524:2:1280 -525:2:1281 -526:2:1282 -527:2:1293 -528:2:1298 -529:2:1299 -530:0:1982 -531:2:1311 -532:0:1982 -533:2:1313 -534:0:1982 -535:2:1314 -536:2:1318 -537:2:1319 -538:2:1327 -539:2:1328 -540:2:1332 -541:2:1333 -542:2:1341 -543:2:1346 -544:2:1350 -545:2:1351 -546:2:1358 -547:2:1359 -548:2:1370 -549:2:1371 -550:2:1372 -551:2:1383 -552:2:1388 -553:2:1389 -554:0:1982 -555:2:1401 -556:0:1982 -557:2:1403 -558:0:1982 -559:2:1406 -560:2:1407 -561:2:1419 -562:2:1420 -563:2:1424 -564:2:1425 -565:2:1433 -566:2:1438 -567:2:1442 -568:2:1443 -569:2:1450 -570:2:1451 -571:2:1462 -572:2:1463 -573:2:1464 -574:2:1475 -575:2:1480 -576:2:1481 -577:0:1982 -578:2:1493 -579:0:1982 -580:2:1495 -581:0:1982 -582:2:1496 -583:0:1982 -584:2:1497 -585:0:1982 -586:2:1498 -587:0:1982 -588:2:1499 -589:2:1503 -590:2:1504 -591:2:1512 -592:2:1513 -593:2:1517 -594:2:1518 -595:2:1526 -596:2:1531 -597:2:1535 -598:2:1536 -599:2:1543 -600:2:1544 -601:2:1555 -602:2:1556 -603:2:1557 -604:2:1568 -605:2:1573 -606:2:1574 -607:0:1982 -608:2:1586 -609:0:1982 -610:2:1699 -611:0:1982 -612:2:1797 -613:0:1982 -614:2:1798 -615:0:1982 -616:2:1802 -617:0:1982 -618:2:1811 -619:2:1812 -620:2:1816 -621:2:1820 -622:2:1821 -623:2:1825 -624:2:1833 -625:2:1834 -626:0:1982 -627:2:1842 -628:0:1982 -629:2:1846 -630:2:1847 -631:2:1851 -632:2:1855 -633:2:1856 -634:2:1860 -635:2:1868 -636:2:1869 -637:0:1982 -638:2:1877 -639:0:1982 -640:2:1885 -641:2:1886 -642:2:1890 -643:2:1894 -644:2:1895 -645:2:1899 -646:2:1907 -647:2:1908 -648:0:1982 -649:2:1916 -650:0:1982 -651:2:1918 -652:0:1982 -653:2:1919 -654:0:1982 -655:2:423 -656:0:1982 -657:2:424 -658:2:428 -659:2:429 -660:2:437 -661:2:438 -662:2:442 -663:2:443 -664:2:451 -665:2:456 -666:2:460 -667:2:461 -668:2:468 -669:2:469 -670:2:480 -671:2:481 -672:2:482 -673:2:493 -674:2:498 -675:2:499 -676:0:1982 -677:2:511 -678:0:1982 -679:2:513 -680:2:514 -681:0:1982 -682:2:518 -683:2:522 -684:2:523 -685:2:531 -686:2:532 -687:2:536 -688:2:537 -689:2:545 -690:2:550 -691:2:551 -692:2:562 -693:2:563 -694:2:574 -695:2:575 -696:2:576 -697:2:587 -698:2:592 -699:2:593 -700:0:1982 -701:2:605 -702:0:1982 -703:2:607 -704:0:1982 -705:2:608 -706:0:1982 -707:2:618 -708:0:1982 -709:2:622 -710:2:623 -711:2:627 -712:2:631 -713:2:632 -714:2:636 -715:2:644 -716:2:645 -717:0:1982 -718:2:653 -719:0:1982 -720:2:657 -721:2:658 -722:2:662 -723:2:666 -724:2:667 -725:2:671 -726:2:679 -727:2:680 -728:0:1982 -729:2:688 -730:0:1982 -731:2:696 -732:2:697 -733:2:701 -734:2:705 -735:2:706 -736:2:710 -737:2:718 -738:2:719 -739:0:1982 -740:2:727 -741:0:1982 -742:2:729 -743:0:1982 -744:2:730 -745:2:734 -746:2:735 -747:2:743 -748:2:744 -749:2:748 -750:2:749 -751:2:757 -752:2:762 -753:2:766 -754:2:767 -755:2:774 -756:2:775 -757:2:786 -758:2:787 -759:2:788 -760:2:799 -761:2:804 -762:2:805 -763:0:1982 -764:2:817 -765:0:1982 -766:2:819 -767:0:1982 -768:2:822 -769:2:823 -770:2:835 -771:2:836 -772:2:840 -773:2:841 -774:2:849 -775:2:854 -776:2:858 -777:2:859 -778:2:866 -779:2:867 -780:2:878 -781:2:879 -782:2:880 -783:2:891 -784:2:896 -785:2:897 -786:0:1982 -787:2:909 -788:0:1982 -789:2:911 -790:0:1982 -791:2:912 -792:0:1982 -793:2:913 -794:0:1982 -795:2:914 -796:0:1982 -797:2:915 -798:2:919 -799:2:920 -800:2:928 -801:2:929 -802:2:933 -803:2:934 -804:2:942 -805:2:947 -806:2:951 -807:2:952 -808:2:959 -809:2:960 -810:2:971 -811:2:972 -812:2:973 -813:2:984 -814:2:989 -815:2:990 -816:0:1982 -817:2:1002 -818:0:1982 -819:2:1115 -820:0:1982 -821:2:1213 -822:0:1982 -823:2:1214 -824:0:1982 -825:2:1218 -826:0:1982 -827:2:1224 -828:2:1228 -829:2:1229 -830:2:1237 -831:2:1238 -832:2:1242 -833:2:1243 -834:2:1251 -835:2:1256 -836:2:1260 -837:2:1261 -838:2:1268 -839:2:1269 -840:2:1280 -841:2:1281 -842:2:1282 -843:2:1293 -844:2:1298 -845:2:1299 -846:0:1982 -847:2:1311 -848:0:1982 -849:2:1313 -850:0:1982 -851:2:1314 -852:2:1318 -853:2:1319 -854:2:1327 -855:2:1328 -856:2:1332 -857:2:1333 -858:2:1341 -859:2:1346 -860:2:1350 -861:2:1351 -862:2:1358 -863:2:1359 -864:2:1370 -865:2:1371 -866:2:1372 -867:2:1383 -868:2:1388 -869:2:1389 -870:0:1982 -871:2:1401 -872:0:1982 -873:2:1403 -874:0:1982 -875:2:1406 -876:2:1407 -877:2:1419 -878:2:1420 -879:2:1424 -880:2:1425 -881:2:1433 -882:2:1438 -883:2:1442 -884:2:1443 -885:2:1450 -886:2:1451 -887:2:1462 -888:2:1463 -889:2:1464 -890:2:1475 -891:2:1480 -892:2:1481 -893:0:1982 -894:2:1493 -895:0:1982 -896:2:1495 -897:0:1982 -898:2:1496 -899:0:1982 -900:2:1497 -901:0:1982 -902:2:1498 -903:0:1982 -904:2:1499 -905:2:1503 -906:2:1504 -907:2:1512 -908:2:1513 -909:2:1517 -910:2:1518 -911:2:1526 -912:2:1531 -913:2:1535 -914:2:1536 -915:2:1543 -916:2:1544 -917:2:1555 -918:2:1556 -919:2:1557 -920:2:1568 -921:2:1573 -922:2:1574 -923:0:1982 -924:2:1586 -925:0:1982 -926:2:1699 -927:0:1982 -928:2:1797 -929:0:1982 -930:2:1798 -931:0:1982 -932:2:1802 -933:0:1982 -934:2:1811 -935:2:1812 -936:2:1816 -937:2:1820 -938:2:1821 -939:2:1825 -940:2:1833 -941:2:1834 -942:0:1982 -943:2:1842 -944:0:1982 -945:2:1846 -946:2:1847 -947:2:1851 -948:2:1855 -949:2:1856 -950:2:1860 -951:2:1868 -952:2:1869 -953:0:1982 -954:2:1877 -955:0:1982 -956:2:1885 -957:2:1886 -958:2:1890 -959:2:1894 -960:2:1895 -961:2:1899 -962:2:1907 -963:2:1908 -964:0:1982 -965:2:1916 -966:0:1982 -967:2:1918 -968:0:1982 -969:2:1919 -970:0:1982 -971:2:423 -972:0:1982 -973:2:424 -974:2:428 -975:2:429 -976:2:437 -977:2:438 -978:2:442 -979:2:443 -980:2:451 -981:2:456 -982:2:460 -983:2:461 -984:2:468 -985:2:469 -986:2:480 -987:2:481 -988:2:482 -989:2:493 -990:2:498 -991:2:499 -992:0:1982 -993:2:511 -994:0:1982 -995:2:513 -996:2:514 -997:0:1982 -998:2:518 -999:2:522 -1000:2:523 -1001:2:531 -1002:2:532 -1003:2:536 -1004:2:537 -1005:2:545 -1006:2:550 -1007:2:551 -1008:2:562 -1009:2:563 -1010:2:574 -1011:2:575 -1012:2:576 -1013:2:587 -1014:2:592 -1015:2:593 -1016:0:1982 -1017:2:605 -1018:0:1982 -1019:2:607 -1020:0:1982 -1021:2:608 -1022:0:1982 -1023:2:618 -1024:0:1982 -1025:2:622 -1026:2:623 -1027:2:627 -1028:2:631 -1029:2:632 -1030:2:636 -1031:2:644 -1032:2:645 -1033:0:1982 -1034:2:653 -1035:0:1982 -1036:2:657 -1037:2:658 -1038:2:662 -1039:2:666 -1040:2:667 -1041:2:671 -1042:2:679 -1043:2:680 -1044:0:1982 -1045:2:688 -1046:0:1982 -1047:2:696 -1048:2:697 -1049:2:701 -1050:2:705 -1051:2:706 -1052:2:710 -1053:2:718 -1054:2:719 -1055:0:1982 -1056:2:727 -1057:0:1982 -1058:2:729 -1059:0:1982 -1060:2:730 -1061:2:734 -1062:2:735 -1063:2:743 -1064:2:744 -1065:2:748 -1066:2:749 -1067:2:757 -1068:2:762 -1069:2:766 -1070:2:767 -1071:2:774 -1072:2:775 -1073:2:786 -1074:2:787 -1075:2:788 -1076:2:799 -1077:2:804 -1078:2:805 -1079:0:1982 -1080:2:817 -1081:0:1982 -1082:2:819 -1083:0:1982 -1084:2:822 -1085:2:823 -1086:2:835 -1087:2:836 -1088:2:840 -1089:2:841 -1090:2:849 -1091:2:854 -1092:2:858 -1093:2:859 -1094:2:866 -1095:2:867 -1096:2:878 -1097:2:879 -1098:2:880 -1099:2:891 -1100:2:896 -1101:2:897 -1102:0:1982 -1103:2:909 -1104:0:1982 -1105:2:911 -1106:0:1982 -1107:2:912 -1108:0:1982 -1109:2:913 -1110:0:1982 -1111:2:914 -1112:0:1982 -1113:2:915 -1114:2:919 -1115:2:920 -1116:2:928 -1117:2:929 -1118:2:933 -1119:2:934 -1120:2:942 -1121:2:947 -1122:2:951 -1123:2:952 -1124:2:959 -1125:2:960 -1126:2:971 -1127:2:972 -1128:2:973 -1129:2:984 -1130:2:989 -1131:2:990 -1132:0:1982 -1133:2:1002 -1134:0:1982 -1135:2:1115 -1136:0:1982 -1137:2:1213 -1138:0:1982 -1139:2:1214 -1140:0:1982 -1141:2:1218 -1142:0:1982 -1143:2:1224 -1144:2:1228 -1145:2:1229 -1146:2:1237 -1147:2:1238 -1148:2:1242 -1149:2:1243 -1150:2:1251 -1151:2:1256 -1152:2:1260 -1153:2:1261 -1154:2:1268 -1155:2:1269 -1156:2:1280 -1157:2:1281 -1158:2:1282 -1159:2:1293 -1160:2:1298 -1161:2:1299 -1162:0:1982 -1163:2:1311 -1164:0:1982 -1165:2:1313 -1166:0:1982 -1167:2:1314 -1168:2:1318 -1169:2:1319 -1170:2:1327 -1171:2:1328 -1172:2:1332 -1173:2:1333 -1174:2:1341 -1175:2:1346 -1176:2:1350 -1177:2:1351 -1178:2:1358 -1179:2:1359 -1180:2:1370 -1181:2:1371 -1182:2:1372 -1183:2:1383 -1184:2:1388 -1185:2:1389 -1186:0:1982 -1187:2:1401 -1188:0:1982 -1189:2:1403 -1190:0:1982 -1191:2:1406 -1192:2:1407 -1193:2:1419 -1194:2:1420 -1195:2:1424 -1196:2:1425 -1197:2:1433 -1198:2:1438 -1199:2:1442 -1200:2:1443 -1201:2:1450 -1202:2:1451 -1203:2:1462 -1204:2:1463 -1205:2:1464 -1206:2:1475 -1207:2:1480 -1208:2:1481 -1209:0:1982 -1210:2:1493 -1211:0:1982 -1212:2:1495 -1213:0:1982 -1214:2:1496 -1215:0:1982 -1216:2:1497 -1217:0:1982 -1218:2:1498 -1219:0:1982 -1220:2:1499 -1221:2:1503 -1222:2:1504 -1223:2:1512 -1224:2:1513 -1225:2:1517 -1226:2:1518 -1227:2:1526 -1228:2:1531 -1229:2:1535 -1230:2:1536 -1231:2:1543 -1232:2:1544 -1233:2:1555 -1234:2:1556 -1235:2:1557 -1236:2:1568 -1237:2:1573 -1238:2:1574 -1239:0:1982 -1240:2:1586 -1241:0:1982 -1242:2:1699 -1243:0:1982 -1244:2:1797 -1245:0:1982 -1246:2:1798 -1247:0:1982 -1248:2:1802 -1249:0:1982 -1250:2:1811 -1251:2:1812 -1252:2:1816 -1253:2:1820 -1254:2:1821 -1255:2:1825 -1256:2:1833 -1257:2:1834 -1258:0:1982 -1259:2:1842 -1260:0:1982 -1261:2:1846 -1262:2:1847 -1263:2:1851 -1264:2:1855 -1265:2:1856 -1266:2:1860 -1267:2:1868 -1268:2:1869 -1269:0:1982 -1270:2:1877 -1271:0:1982 -1272:2:1885 -1273:2:1886 -1274:2:1890 -1275:2:1894 -1276:2:1895 -1277:2:1899 -1278:2:1907 -1279:2:1908 -1280:0:1982 -1281:2:1916 -1282:0:1982 -1283:2:1918 -1284:0:1982 -1285:2:1919 -1286:0:1982 -1287:2:423 -1288:0:1982 -1289:2:424 -1290:2:428 -1291:2:429 -1292:2:437 -1293:2:438 -1294:2:442 -1295:2:443 -1296:2:451 -1297:2:456 -1298:2:460 -1299:2:461 -1300:2:468 -1301:2:469 -1302:2:480 -1303:2:481 -1304:2:482 -1305:2:493 -1306:2:498 -1307:2:499 -1308:0:1982 -1309:2:511 -1310:0:1982 -1311:2:513 -1312:2:514 -1313:0:1982 -1314:2:518 -1315:2:522 -1316:2:523 -1317:2:531 -1318:2:532 -1319:2:536 -1320:2:537 -1321:2:545 -1322:2:558 -1323:2:559 -1324:2:562 -1325:2:563 -1326:2:574 -1327:2:575 -1328:2:576 -1329:2:587 -1330:2:592 -1331:2:595 -1332:2:596 -1333:0:1982 -1334:2:605 -1335:0:1982 -1336:2:607 -1337:0:1982 -1338:2:608 -1339:0:1982 -1340:2:618 -1341:0:1982 -1342:1:2 -1343:0:1982 -1344:1:8 -1345:0:1982 -1346:1:9 -1347:0:1982 -1348:1:10 -1349:0:1982 -1350:1:11 -1351:0:1982 -1352:1:12 -1353:1:16 -1354:1:17 -1355:1:25 -1356:1:26 -1357:1:30 -1358:1:31 -1359:1:39 -1360:1:44 -1361:1:48 -1362:1:49 -1363:1:56 -1364:1:57 -1365:1:68 -1366:1:69 -1367:1:70 -1368:1:81 -1369:1:86 -1370:1:87 -1371:0:1982 -1372:1:99 -1373:0:1982 -1374:2:622 -1375:2:623 -1376:2:627 -1377:2:631 -1378:2:632 -1379:2:636 -1380:2:641 -1381:0:1982 -1382:2:653 -1383:0:1982 -1384:2:657 -1385:2:658 -1386:2:662 -1387:2:666 -1388:2:667 -1389:2:671 -1390:2:679 -1391:2:680 -1392:0:1982 -1393:2:688 -1394:0:1982 -1395:2:696 -1396:2:697 -1397:2:701 -1398:2:705 -1399:2:706 -1400:2:710 -1401:2:718 -1402:2:719 -1403:0:1982 -1404:2:727 -1405:0:1982 -1406:2:729 -1407:0:1982 -1408:2:730 -1409:2:734 -1410:2:735 -1411:2:743 -1412:2:744 -1413:2:748 -1414:2:749 -1415:2:757 -1416:2:762 -1417:2:766 -1418:2:767 -1419:2:774 -1420:2:775 -1421:2:786 -1422:2:787 -1423:2:788 -1424:2:799 -1425:2:804 -1426:2:805 -1427:0:1982 -1428:2:817 -1429:0:1982 -1430:2:819 -1431:0:1982 -1432:2:822 -1433:2:823 -1434:2:835 -1435:2:836 -1436:2:840 -1437:2:841 -1438:2:849 -1439:2:854 -1440:2:858 -1441:2:859 -1442:2:866 -1443:2:867 -1444:2:878 -1445:2:879 -1446:2:880 -1447:2:891 -1448:2:896 -1449:2:897 -1450:0:1982 -1451:2:909 -1452:0:1982 -1453:2:911 -1454:0:1982 -1455:2:912 -1456:0:1982 -1457:2:913 -1458:0:1982 -1459:2:914 -1460:0:1982 -1461:2:915 -1462:2:919 -1463:2:920 -1464:2:928 -1465:2:929 -1466:2:933 -1467:2:934 -1468:2:942 -1469:2:947 -1470:2:951 -1471:2:952 -1472:2:959 -1473:2:960 -1474:2:971 -1475:2:972 -1476:2:973 -1477:2:984 -1478:2:989 -1479:2:990 -1480:0:1982 -1481:2:1002 -1482:0:1982 -1483:2:1115 -1484:0:1982 -1485:2:1213 -1486:0:1982 -1487:2:1214 -1488:0:1982 -1489:2:1218 -1490:0:1982 -1491:2:1224 -1492:2:1228 -1493:2:1229 -1494:2:1237 -1495:2:1238 -1496:2:1242 -1497:2:1243 -1498:2:1251 -1499:2:1256 -1500:2:1260 -1501:2:1261 -1502:2:1268 -1503:2:1269 -1504:2:1280 -1505:2:1281 -1506:2:1282 -1507:2:1293 -1508:2:1298 -1509:2:1299 -1510:0:1982 -1511:2:1311 -1512:0:1982 -1513:2:1313 -1514:0:1982 -1515:2:1314 -1516:2:1318 -1517:2:1319 -1518:2:1327 -1519:2:1328 -1520:2:1332 -1521:2:1333 -1522:2:1341 -1523:2:1346 -1524:2:1350 -1525:2:1351 -1526:2:1358 -1527:2:1359 -1528:2:1370 -1529:2:1371 -1530:2:1372 -1531:2:1383 -1532:2:1388 -1533:2:1389 -1534:0:1982 -1535:2:1401 -1536:0:1982 -1537:2:1403 -1538:0:1982 -1539:2:1406 -1540:2:1407 -1541:2:1419 -1542:2:1420 -1543:2:1424 -1544:2:1425 -1545:2:1433 -1546:2:1438 -1547:2:1442 -1548:2:1443 -1549:2:1450 -1550:2:1451 -1551:2:1462 -1552:2:1463 -1553:2:1464 -1554:2:1475 -1555:2:1480 -1556:2:1481 -1557:0:1982 -1558:2:1493 -1559:0:1982 -1560:2:1495 -1561:0:1982 -1562:2:1496 -1563:0:1982 -1564:2:1497 -1565:0:1982 -1566:2:1498 -1567:0:1982 -1568:2:1499 -1569:2:1503 -1570:2:1504 -1571:2:1512 -1572:2:1513 -1573:2:1517 -1574:2:1518 -1575:2:1526 -1576:2:1531 -1577:2:1535 -1578:2:1536 -1579:2:1543 -1580:2:1544 -1581:2:1555 -1582:2:1556 -1583:2:1557 -1584:2:1568 -1585:2:1573 -1586:2:1574 -1587:0:1982 -1588:2:1586 -1589:0:1982 -1590:2:1699 -1591:0:1982 -1592:2:1797 -1593:0:1982 -1594:2:1798 -1595:0:1982 -1596:2:1802 -1597:0:1982 -1598:2:1811 -1599:2:1812 -1600:2:1816 -1601:2:1820 -1602:2:1821 -1603:2:1825 -1604:2:1833 -1605:2:1834 -1606:0:1982 -1607:2:1842 -1608:0:1982 -1609:2:1846 -1610:2:1847 -1611:2:1851 -1612:2:1855 -1613:2:1856 -1614:2:1860 -1615:2:1868 -1616:2:1869 -1617:0:1982 -1618:2:1877 -1619:0:1982 -1620:2:1885 -1621:2:1886 -1622:2:1890 -1623:2:1894 -1624:2:1895 -1625:2:1899 -1626:2:1907 -1627:2:1908 -1628:0:1982 -1629:2:1916 -1630:0:1982 -1631:2:1918 -1632:0:1982 -1633:2:1919 -1634:0:1982 -1635:2:1922 -1636:0:1982 -1637:2:1927 -1638:0:1982 -1639:1:101 -1640:0:1982 -1641:2:1928 -1642:0:1982 -1643:1:102 -1644:1:106 -1645:1:107 -1646:1:115 -1647:1:116 -1648:1:120 -1649:1:121 -1650:1:129 -1651:1:134 -1652:1:138 -1653:1:139 -1654:1:146 -1655:1:147 -1656:1:158 -1657:1:159 -1658:1:160 -1659:1:171 -1660:1:183 -1661:1:184 -1662:0:1982 -1663:2:1927 -1664:0:1982 -1665:1:189 -1666:0:1982 -1667:2:1928 -1668:0:1982 -1669:1:191 -1670:0:1982 -1671:2:1927 -1672:0:1982 -1673:1:192 -1674:0:1982 -1675:2:1928 -1676:0:1982 -1677:1:193 -1678:1:197 -1679:1:198 -1680:1:206 -1681:1:207 -1682:1:211 -1683:1:212 -1684:1:220 -1685:1:225 -1686:1:229 -1687:1:230 -1688:1:237 -1689:1:238 -1690:1:249 -1691:1:250 -1692:1:251 -1693:1:262 -1694:1:274 -1695:1:275 -1696:0:1982 -1697:2:1927 -1698:0:1982 -1699:1:280 -1700:0:1982 -1701:2:1928 -1702:0:1982 -1703:1:282 -1704:0:1982 -1705:2:1927 -1706:0:1982 -1707:1:291 -1708:0:1982 -1709:2:1928 -1710:0:1982 -1711:1:293 -1712:0:1982 -1713:2:1927 -1714:0:1982 -1715:1:11 -1716:0:1982 -1717:2:1928 -1718:0:1982 -1719:1:12 -1720:1:16 -1721:1:17 -1722:1:25 -1723:1:26 -1724:1:27 -1725:1:39 -1726:1:44 -1727:1:48 -1728:1:49 -1729:1:56 -1730:1:57 -1731:1:68 -1732:1:69 -1733:1:70 -1734:1:81 -1735:1:93 -1736:1:94 -1737:0:1982 -1738:2:1927 -1739:0:1982 -1740:1:99 -1741:0:1982 -1742:2:1928 -1743:0:1982 -1744:1:101 -1745:0:1982 -1746:2:1927 -1747:0:1982 -1748:1:102 -1749:1:106 -1750:1:107 -1751:1:115 -1752:1:116 -1753:1:120 -1754:1:121 -1755:1:129 -1756:1:134 -1757:1:138 -1758:1:139 -1759:1:146 -1760:1:147 -1761:1:158 -1762:1:159 -1763:1:160 -1764:1:171 -1765:1:183 -1766:1:184 -1767:0:1982 -1768:2:1928 -1769:0:1982 -1770:1:189 -1771:0:1982 -1772:2:1927 -1773:0:1982 -1774:1:285 -1775:0:1982 -1776:2:1928 -1777:0:1982 -1778:1:286 -1779:0:1982 -1780:2:1927 -1781:0:1982 -1782:1:291 -1783:0:1982 -1784:2:1928 -1785:0:1982 -1786:1:293 -1787:0:1982 -1788:2:1927 -1789:0:1982 -1790:1:296 -1791:0:1982 -1792:2:1928 -1793:0:1982 -1794:1:301 -1795:0:1982 -1796:2:1927 -1797:0:1982 -1798:1:302 -1799:0:1980 -1800:2:1928 -1801:0:1986 -1802:1:124 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.define b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.log b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.log deleted file mode 100644 index 4dd3892..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.log +++ /dev/null @@ -1,294 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_wmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -pan: claim violated! (at depth 1882) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 4174, errors: 1 - 367189 states, stored - 3431533 states, matched - 3798722 transitions (= stored+matched) - 13407384 atomic steps -hash conflicts: 253700 (resolved) - -Stats on memory usage (in Megabytes): - 29.415 equivalent memory usage for states (stored*(State-vector + overhead)) - 22.811 actual memory usage for states (compression: 77.55%) - state-vector as stored = 37 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 488.518 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 151, "(1)" - line 418, "pan.___", state 181, "(1)" - line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 242, "(1)" - line 418, "pan.___", state 272, "(1)" - line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 331, "(1)" - line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 360, "(1)" - line 418, "pan.___", state 390, "(1)" - line 540, "pan.___", state 414, "-end-" - (18 of 414 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 20, "(1)" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 34, "(1)" - line 403, "pan.___", state 35, "(1)" - line 403, "pan.___", state 35, "(1)" - line 401, "pan.___", state 40, "((i<1))" - line 401, "pan.___", state 40, "((i>=1))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 59, "(1)" - line 409, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 60, "else" - line 409, "pan.___", state 63, "(1)" - line 409, "pan.___", state 64, "(1)" - line 409, "pan.___", state 64, "(1)" - line 413, "pan.___", state 72, "(1)" - line 413, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 73, "else" - line 413, "pan.___", state 76, "(1)" - line 413, "pan.___", state 77, "(1)" - line 413, "pan.___", state 77, "(1)" - line 411, "pan.___", state 82, "((i<1))" - line 411, "pan.___", state 82, "((i>=1))" - line 418, "pan.___", state 89, "(1)" - line 418, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 90, "else" - line 418, "pan.___", state 93, "(1)" - line 418, "pan.___", state 94, "(1)" - line 418, "pan.___", state 94, "(1)" - line 420, "pan.___", state 97, "(1)" - line 420, "pan.___", state 97, "(1)" - line 369, "pan.___", state 99, "(1)" - line 639, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" - line 637, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 114, "(1)" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 128, "(1)" - line 403, "pan.___", state 129, "(1)" - line 403, "pan.___", state 129, "(1)" - line 401, "pan.___", state 134, "((i<1))" - line 401, "pan.___", state 134, "((i>=1))" - line 409, "pan.___", state 153, "(1)" - line 409, "pan.___", state 154, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 154, "else" - line 409, "pan.___", state 157, "(1)" - line 409, "pan.___", state 158, "(1)" - line 409, "pan.___", state 158, "(1)" - line 413, "pan.___", state 166, "(1)" - line 413, "pan.___", state 167, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 167, "else" - line 413, "pan.___", state 170, "(1)" - line 413, "pan.___", state 171, "(1)" - line 413, "pan.___", state 171, "(1)" - line 411, "pan.___", state 176, "((i<1))" - line 411, "pan.___", state 176, "((i>=1))" - line 418, "pan.___", state 183, "(1)" - line 418, "pan.___", state 184, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 184, "else" - line 418, "pan.___", state 187, "(1)" - line 418, "pan.___", state 188, "(1)" - line 418, "pan.___", state 188, "(1)" - line 420, "pan.___", state 191, "(1)" - line 420, "pan.___", state 191, "(1)" - line 369, "pan.___", state 193, "(1)" - line 652, "pan.___", state 199, "(1)" - line 646, "pan.___", state 202, "((write_lock==0))" - line 646, "pan.___", state 202, "else" - line 644, "pan.___", state 203, "(1)" - line 160, "pan.___", state 209, "(1)" - line 164, "pan.___", state 217, "(1)" - line 164, "pan.___", state 218, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 164, "pan.___", state 218, "else" - line 162, "pan.___", state 223, "((j<1))" - line 162, "pan.___", state 223, "((j>=1))" - line 168, "pan.___", state 229, "(1)" - line 168, "pan.___", state 230, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 168, "pan.___", state 230, "else" - line 160, "pan.___", state 241, "(1)" - line 168, "pan.___", state 261, "(1)" - line 160, "pan.___", state 277, "(1)" - line 164, "pan.___", state 285, "(1)" - line 168, "pan.___", state 297, "(1)" - line 399, "pan.___", state 311, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 325, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 343, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 356, "(1)" - line 413, "pan.___", state 369, "(1)" - line 418, "pan.___", state 386, "(1)" - line 399, "pan.___", state 405, "(1)" - line 403, "pan.___", state 417, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 435, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 461, "(1)" - line 418, "pan.___", state 478, "(1)" - line 403, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 554, "(1)" - line 418, "pan.___", state 571, "(1)" - line 164, "pan.___", state 594, "(1)" - line 168, "pan.___", state 606, "(1)" - line 160, "pan.___", state 618, "(1)" - line 168, "pan.___", state 638, "(1)" - line 164, "pan.___", state 662, "(1)" - line 168, "pan.___", state 674, "(1)" - line 399, "pan.___", state 696, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 698, "(1)" - line 399, "pan.___", state 699, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 399, "pan.___", state 699, "else" - line 399, "pan.___", state 702, "(1)" - line 403, "pan.___", state 710, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 712, "(1)" - line 403, "pan.___", state 713, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 403, "pan.___", state 713, "else" - line 403, "pan.___", state 716, "(1)" - line 403, "pan.___", state 717, "(1)" - line 403, "pan.___", state 717, "(1)" - line 401, "pan.___", state 722, "((i<1))" - line 401, "pan.___", state 722, "((i>=1))" - line 408, "pan.___", state 728, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 741, "(1)" - line 409, "pan.___", state 742, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 742, "else" - line 409, "pan.___", state 745, "(1)" - line 409, "pan.___", state 746, "(1)" - line 409, "pan.___", state 746, "(1)" - line 413, "pan.___", state 754, "(1)" - line 413, "pan.___", state 755, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 755, "else" - line 413, "pan.___", state 758, "(1)" - line 413, "pan.___", state 759, "(1)" - line 413, "pan.___", state 759, "(1)" - line 411, "pan.___", state 764, "((i<1))" - line 411, "pan.___", state 764, "((i>=1))" - line 418, "pan.___", state 771, "(1)" - line 418, "pan.___", state 772, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 772, "else" - line 418, "pan.___", state 775, "(1)" - line 418, "pan.___", state 776, "(1)" - line 418, "pan.___", state 776, "(1)" - line 420, "pan.___", state 779, "(1)" - line 420, "pan.___", state 779, "(1)" - line 403, "pan.___", state 810, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 828, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 854, "(1)" - line 418, "pan.___", state 871, "(1)" - line 403, "pan.___", state 900, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 918, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 944, "(1)" - line 418, "pan.___", state 961, "(1)" - line 399, "pan.___", state 980, "(1)" - line 403, "pan.___", state 992, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1010, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1036, "(1)" - line 418, "pan.___", state 1053, "(1)" - line 403, "pan.___", state 1085, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1103, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1129, "(1)" - line 418, "pan.___", state 1146, "(1)" - line 164, "pan.___", state 1169, "(1)" - line 168, "pan.___", state 1181, "(1)" - line 160, "pan.___", state 1193, "(1)" - line 168, "pan.___", state 1213, "(1)" - line 164, "pan.___", state 1237, "(1)" - line 168, "pan.___", state 1249, "(1)" - line 399, "pan.___", state 1271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 1273, "(1)" - line 399, "pan.___", state 1274, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 399, "pan.___", state 1274, "else" - line 399, "pan.___", state 1277, "(1)" - line 403, "pan.___", state 1285, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 1287, "(1)" - line 403, "pan.___", state 1288, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 403, "pan.___", state 1288, "else" - line 403, "pan.___", state 1291, "(1)" - line 403, "pan.___", state 1292, "(1)" - line 403, "pan.___", state 1292, "(1)" - line 401, "pan.___", state 1297, "((i<1))" - line 401, "pan.___", state 1297, "((i>=1))" - line 408, "pan.___", state 1303, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1316, "(1)" - line 409, "pan.___", state 1317, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 1317, "else" - line 409, "pan.___", state 1320, "(1)" - line 409, "pan.___", state 1321, "(1)" - line 409, "pan.___", state 1321, "(1)" - line 413, "pan.___", state 1329, "(1)" - line 413, "pan.___", state 1330, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 1330, "else" - line 413, "pan.___", state 1333, "(1)" - line 413, "pan.___", state 1334, "(1)" - line 413, "pan.___", state 1334, "(1)" - line 411, "pan.___", state 1339, "((i<1))" - line 411, "pan.___", state 1339, "((i>=1))" - line 418, "pan.___", state 1346, "(1)" - line 418, "pan.___", state 1347, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 1347, "else" - line 418, "pan.___", state 1350, "(1)" - line 418, "pan.___", state 1351, "(1)" - line 418, "pan.___", state 1351, "(1)" - line 420, "pan.___", state 1354, "(1)" - line 420, "pan.___", state 1354, "(1)" - line 164, "pan.___", state 1379, "(1)" - line 168, "pan.___", state 1391, "(1)" - line 160, "pan.___", state 1403, "(1)" - line 168, "pan.___", state 1423, "(1)" - line 164, "pan.___", state 1447, "(1)" - line 168, "pan.___", state 1459, "(1)" - line 702, "pan.___", state 1484, "-end-" - (160 of 1484 states) -unreached in proctype :init: - line 709, "pan.___", state 9, "((j<2))" - line 709, "pan.___", state 9, "((j>=2))" - line 710, "pan.___", state 20, "((j<2))" - line 710, "pan.___", state 20, "((j>=2))" - line 715, "pan.___", state 33, "((j<2))" - line 715, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 749, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 2.96 seconds -pan: rate 124050.34 states/second -pan: avg transition delay 7.7921e-07 usec -cp .input.spin urcu_free_no_wmb.spin.input -cp .input.spin.trail urcu_free_no_wmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.spin.input b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.spin.input deleted file mode 100644 index f4d8acb..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define NO_WMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -//#define READER_NEST_LEVEL 1 -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.spin.input.trail deleted file mode 100644 index f73a838..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free_no_wmb.spin.input.trail +++ /dev/null @@ -1,1885 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:1946 -2:3:1898 -3:3:1901 -4:3:1901 -5:3:1904 -6:3:1912 -7:3:1912 -8:3:1915 -9:3:1921 -10:3:1925 -11:3:1925 -12:3:1928 -13:3:1936 -14:3:1940 -15:3:1941 -16:0:1946 -17:3:1943 -18:0:1946 -19:2:416 -20:0:1946 -21:2:422 -22:0:1946 -23:2:423 -24:0:1946 -25:2:424 -26:2:428 -27:2:429 -28:2:437 -29:2:438 -30:2:442 -31:2:443 -32:2:451 -33:2:456 -34:2:460 -35:2:461 -36:2:468 -37:2:469 -38:2:480 -39:2:481 -40:2:482 -41:2:493 -42:2:498 -43:2:499 -44:0:1946 -45:2:511 -46:0:1946 -47:2:513 -48:2:514 -49:0:1946 -50:2:518 -51:2:522 -52:2:523 -53:2:531 -54:2:532 -55:2:536 -56:2:537 -57:2:545 -58:2:550 -59:2:551 -60:2:562 -61:2:563 -62:2:574 -63:2:575 -64:2:576 -65:2:587 -66:2:592 -67:2:593 -68:0:1946 -69:2:605 -70:0:1946 -71:2:607 -72:0:1946 -73:2:608 -74:0:1946 -75:2:618 -76:0:1946 -77:2:619 -78:2:626 -79:2:627 -80:2:634 -81:2:639 -82:0:1946 -83:2:650 -84:0:1946 -85:2:651 -86:2:658 -87:2:659 -88:2:666 -89:2:671 -90:0:1946 -91:2:682 -92:0:1946 -93:2:687 -94:2:694 -95:2:695 -96:2:702 -97:2:707 -98:0:1946 -99:2:718 -100:0:1946 -101:2:720 -102:0:1946 -103:2:721 -104:2:725 -105:2:726 -106:2:734 -107:2:735 -108:2:739 -109:2:740 -110:2:748 -111:2:753 -112:2:757 -113:2:758 -114:2:765 -115:2:766 -116:2:777 -117:2:778 -118:2:779 -119:2:790 -120:2:795 -121:2:796 -122:0:1946 -123:2:808 -124:0:1946 -125:2:810 -126:0:1946 -127:2:813 -128:2:814 -129:2:826 -130:2:827 -131:2:831 -132:2:832 -133:2:840 -134:2:845 -135:2:849 -136:2:850 -137:2:857 -138:2:858 -139:2:869 -140:2:870 -141:2:871 -142:2:882 -143:2:887 -144:2:888 -145:0:1946 -146:2:900 -147:0:1946 -148:2:902 -149:0:1946 -150:2:903 -151:0:1946 -152:2:904 -153:0:1946 -154:2:905 -155:0:1946 -156:2:906 -157:2:910 -158:2:911 -159:2:919 -160:2:920 -161:2:924 -162:2:925 -163:2:933 -164:2:938 -165:2:942 -166:2:943 -167:2:950 -168:2:951 -169:2:962 -170:2:963 -171:2:964 -172:2:975 -173:2:980 -174:2:981 -175:0:1946 -176:2:993 -177:0:1946 -178:2:1097 -179:0:1946 -180:2:1195 -181:0:1946 -182:2:1196 -183:0:1946 -184:2:1200 -185:0:1946 -186:2:1206 -187:2:1210 -188:2:1211 -189:2:1219 -190:2:1220 -191:2:1224 -192:2:1225 -193:2:1233 -194:2:1238 -195:2:1242 -196:2:1243 -197:2:1250 -198:2:1251 -199:2:1262 -200:2:1263 -201:2:1264 -202:2:1275 -203:2:1280 -204:2:1281 -205:0:1946 -206:2:1293 -207:0:1946 -208:2:1295 -209:0:1946 -210:2:1296 -211:2:1300 -212:2:1301 -213:2:1309 -214:2:1310 -215:2:1314 -216:2:1315 -217:2:1323 -218:2:1328 -219:2:1332 -220:2:1333 -221:2:1340 -222:2:1341 -223:2:1352 -224:2:1353 -225:2:1354 -226:2:1365 -227:2:1370 -228:2:1371 -229:0:1946 -230:2:1383 -231:0:1946 -232:2:1385 -233:0:1946 -234:2:1388 -235:2:1389 -236:2:1401 -237:2:1402 -238:2:1406 -239:2:1407 -240:2:1415 -241:2:1420 -242:2:1424 -243:2:1425 -244:2:1432 -245:2:1433 -246:2:1444 -247:2:1445 -248:2:1446 -249:2:1457 -250:2:1462 -251:2:1463 -252:0:1946 -253:2:1475 -254:0:1946 -255:2:1477 -256:0:1946 -257:2:1478 -258:0:1946 -259:2:1479 -260:0:1946 -261:2:1480 -262:0:1946 -263:2:1481 -264:2:1485 -265:2:1486 -266:2:1494 -267:2:1495 -268:2:1499 -269:2:1500 -270:2:1508 -271:2:1513 -272:2:1517 -273:2:1518 -274:2:1525 -275:2:1526 -276:2:1537 -277:2:1538 -278:2:1539 -279:2:1550 -280:2:1555 -281:2:1556 -282:0:1946 -283:2:1568 -284:0:1946 -285:2:1672 -286:0:1946 -287:2:1770 -288:0:1946 -289:2:1771 -290:0:1946 -291:2:1775 -292:0:1946 -293:2:1781 -294:2:1788 -295:2:1789 -296:2:1796 -297:2:1801 -298:0:1946 -299:2:1812 -300:0:1946 -301:2:1813 -302:2:1820 -303:2:1821 -304:2:1828 -305:2:1833 -306:0:1946 -307:2:1844 -308:0:1946 -309:2:1849 -310:2:1856 -311:2:1857 -312:2:1864 -313:2:1869 -314:0:1946 -315:2:1880 -316:0:1946 -317:2:1882 -318:0:1946 -319:2:1883 -320:0:1946 -321:2:423 -322:0:1946 -323:2:424 -324:2:428 -325:2:429 -326:2:437 -327:2:438 -328:2:442 -329:2:443 -330:2:451 -331:2:456 -332:2:460 -333:2:461 -334:2:468 -335:2:469 -336:2:480 -337:2:481 -338:2:482 -339:2:493 -340:2:498 -341:2:499 -342:0:1946 -343:2:511 -344:0:1946 -345:2:513 -346:2:514 -347:0:1946 -348:2:518 -349:2:522 -350:2:523 -351:2:531 -352:2:532 -353:2:536 -354:2:537 -355:2:545 -356:2:550 -357:2:551 -358:2:562 -359:2:563 -360:2:574 -361:2:575 -362:2:576 -363:2:587 -364:2:592 -365:2:593 -366:0:1946 -367:2:605 -368:0:1946 -369:2:607 -370:0:1946 -371:2:608 -372:0:1946 -373:2:618 -374:0:1946 -375:2:619 -376:2:626 -377:2:627 -378:2:634 -379:2:639 -380:0:1946 -381:2:650 -382:0:1946 -383:2:651 -384:2:658 -385:2:659 -386:2:666 -387:2:671 -388:0:1946 -389:2:682 -390:0:1946 -391:2:687 -392:2:694 -393:2:695 -394:2:702 -395:2:707 -396:0:1946 -397:2:718 -398:0:1946 -399:2:720 -400:0:1946 -401:2:721 -402:2:725 -403:2:726 -404:2:734 -405:2:735 -406:2:739 -407:2:740 -408:2:748 -409:2:753 -410:2:757 -411:2:758 -412:2:765 -413:2:766 -414:2:777 -415:2:778 -416:2:779 -417:2:790 -418:2:795 -419:2:796 -420:0:1946 -421:2:808 -422:0:1946 -423:2:810 -424:0:1946 -425:2:813 -426:2:814 -427:2:826 -428:2:827 -429:2:831 -430:2:832 -431:2:840 -432:2:845 -433:2:849 -434:2:850 -435:2:857 -436:2:858 -437:2:869 -438:2:870 -439:2:871 -440:2:882 -441:2:887 -442:2:888 -443:0:1946 -444:2:900 -445:0:1946 -446:2:902 -447:0:1946 -448:2:903 -449:0:1946 -450:2:904 -451:0:1946 -452:2:905 -453:0:1946 -454:2:906 -455:2:910 -456:2:911 -457:2:919 -458:2:920 -459:2:924 -460:2:925 -461:2:933 -462:2:938 -463:2:942 -464:2:943 -465:2:950 -466:2:951 -467:2:962 -468:2:963 -469:2:964 -470:2:975 -471:2:980 -472:2:981 -473:0:1946 -474:2:993 -475:0:1946 -476:2:1097 -477:0:1946 -478:2:1195 -479:0:1946 -480:2:1196 -481:0:1946 -482:2:1200 -483:0:1946 -484:2:1206 -485:2:1210 -486:2:1211 -487:2:1219 -488:2:1220 -489:2:1224 -490:2:1225 -491:2:1233 -492:2:1238 -493:2:1242 -494:2:1243 -495:2:1250 -496:2:1251 -497:2:1262 -498:2:1263 -499:2:1264 -500:2:1275 -501:2:1280 -502:2:1281 -503:0:1946 -504:2:1293 -505:0:1946 -506:2:1295 -507:0:1946 -508:2:1296 -509:2:1300 -510:2:1301 -511:2:1309 -512:2:1310 -513:2:1314 -514:2:1315 -515:2:1323 -516:2:1328 -517:2:1332 -518:2:1333 -519:2:1340 -520:2:1341 -521:2:1352 -522:2:1353 -523:2:1354 -524:2:1365 -525:2:1370 -526:2:1371 -527:0:1946 -528:2:1383 -529:0:1946 -530:2:1385 -531:0:1946 -532:2:1388 -533:2:1389 -534:2:1401 -535:2:1402 -536:2:1406 -537:2:1407 -538:2:1415 -539:2:1420 -540:2:1424 -541:2:1425 -542:2:1432 -543:2:1433 -544:2:1444 -545:2:1445 -546:2:1446 -547:2:1457 -548:2:1462 -549:2:1463 -550:0:1946 -551:2:1475 -552:0:1946 -553:2:1477 -554:0:1946 -555:2:1478 -556:0:1946 -557:2:1479 -558:0:1946 -559:2:1480 -560:0:1946 -561:2:1481 -562:2:1485 -563:2:1486 -564:2:1494 -565:2:1495 -566:2:1499 -567:2:1500 -568:2:1508 -569:2:1513 -570:2:1517 -571:2:1518 -572:2:1525 -573:2:1526 -574:2:1537 -575:2:1538 -576:2:1539 -577:2:1550 -578:2:1555 -579:2:1556 -580:0:1946 -581:2:1568 -582:0:1946 -583:2:1672 -584:0:1946 -585:2:1770 -586:0:1946 -587:2:1771 -588:0:1946 -589:2:1775 -590:0:1946 -591:2:1781 -592:2:1788 -593:2:1789 -594:2:1796 -595:2:1801 -596:0:1946 -597:2:1812 -598:0:1946 -599:2:1813 -600:2:1820 -601:2:1821 -602:2:1828 -603:2:1833 -604:0:1946 -605:2:1844 -606:0:1946 -607:2:1849 -608:2:1856 -609:2:1857 -610:2:1864 -611:2:1869 -612:0:1946 -613:2:1880 -614:0:1946 -615:2:1882 -616:0:1946 -617:2:1883 -618:0:1946 -619:2:423 -620:0:1946 -621:2:424 -622:2:428 -623:2:429 -624:2:437 -625:2:438 -626:2:442 -627:2:443 -628:2:451 -629:2:456 -630:2:460 -631:2:461 -632:2:468 -633:2:469 -634:2:480 -635:2:481 -636:2:482 -637:2:493 -638:2:498 -639:2:499 -640:0:1946 -641:2:511 -642:0:1946 -643:2:513 -644:2:514 -645:0:1946 -646:2:518 -647:2:522 -648:2:523 -649:2:531 -650:2:532 -651:2:536 -652:2:537 -653:2:545 -654:2:550 -655:2:551 -656:2:562 -657:2:563 -658:2:574 -659:2:575 -660:2:576 -661:2:587 -662:2:592 -663:2:593 -664:0:1946 -665:2:605 -666:0:1946 -667:2:607 -668:0:1946 -669:2:608 -670:0:1946 -671:2:618 -672:0:1946 -673:2:619 -674:2:626 -675:2:627 -676:2:634 -677:2:639 -678:0:1946 -679:2:650 -680:0:1946 -681:2:651 -682:2:658 -683:2:659 -684:2:666 -685:2:671 -686:0:1946 -687:2:682 -688:0:1946 -689:2:687 -690:2:694 -691:2:695 -692:2:702 -693:2:707 -694:0:1946 -695:2:718 -696:0:1946 -697:2:720 -698:0:1946 -699:2:721 -700:2:725 -701:2:726 -702:2:734 -703:2:735 -704:2:739 -705:2:740 -706:2:748 -707:2:753 -708:2:757 -709:2:758 -710:2:765 -711:2:766 -712:2:777 -713:2:778 -714:2:779 -715:2:790 -716:2:795 -717:2:796 -718:0:1946 -719:2:808 -720:0:1946 -721:2:810 -722:0:1946 -723:2:813 -724:2:814 -725:2:826 -726:2:827 -727:2:831 -728:2:832 -729:2:840 -730:2:845 -731:2:849 -732:2:850 -733:2:857 -734:2:858 -735:2:869 -736:2:870 -737:2:871 -738:2:882 -739:2:887 -740:2:888 -741:0:1946 -742:2:900 -743:0:1946 -744:2:902 -745:0:1946 -746:2:903 -747:0:1946 -748:2:904 -749:0:1946 -750:2:905 -751:0:1946 -752:2:906 -753:2:910 -754:2:911 -755:2:919 -756:2:920 -757:2:924 -758:2:925 -759:2:933 -760:2:938 -761:2:942 -762:2:943 -763:2:950 -764:2:951 -765:2:962 -766:2:963 -767:2:964 -768:2:975 -769:2:980 -770:2:981 -771:0:1946 -772:2:993 -773:0:1946 -774:2:1097 -775:0:1946 -776:2:1195 -777:0:1946 -778:2:1196 -779:0:1946 -780:2:1200 -781:0:1946 -782:2:1206 -783:2:1210 -784:2:1211 -785:2:1219 -786:2:1220 -787:2:1224 -788:2:1225 -789:2:1233 -790:2:1238 -791:2:1242 -792:2:1243 -793:2:1250 -794:2:1251 -795:2:1262 -796:2:1263 -797:2:1264 -798:2:1275 -799:2:1280 -800:2:1281 -801:0:1946 -802:2:1293 -803:0:1946 -804:2:1295 -805:0:1946 -806:2:1296 -807:2:1300 -808:2:1301 -809:2:1309 -810:2:1310 -811:2:1314 -812:2:1315 -813:2:1323 -814:2:1328 -815:2:1332 -816:2:1333 -817:2:1340 -818:2:1341 -819:2:1352 -820:2:1353 -821:2:1354 -822:2:1365 -823:2:1370 -824:2:1371 -825:0:1946 -826:2:1383 -827:0:1946 -828:2:1385 -829:0:1946 -830:2:1388 -831:2:1389 -832:2:1401 -833:2:1402 -834:2:1406 -835:2:1407 -836:2:1415 -837:2:1420 -838:2:1424 -839:2:1425 -840:2:1432 -841:2:1433 -842:2:1444 -843:2:1445 -844:2:1446 -845:2:1457 -846:2:1462 -847:2:1463 -848:0:1946 -849:2:1475 -850:0:1946 -851:2:1477 -852:0:1946 -853:2:1478 -854:0:1946 -855:2:1479 -856:0:1946 -857:2:1480 -858:0:1946 -859:2:1481 -860:2:1485 -861:2:1486 -862:2:1494 -863:2:1495 -864:2:1499 -865:2:1500 -866:2:1508 -867:2:1513 -868:2:1517 -869:2:1518 -870:2:1525 -871:2:1526 -872:2:1537 -873:2:1538 -874:2:1539 -875:2:1550 -876:2:1555 -877:2:1556 -878:0:1946 -879:2:1568 -880:0:1946 -881:2:1672 -882:0:1946 -883:2:1770 -884:0:1946 -885:2:1771 -886:0:1946 -887:2:1775 -888:0:1946 -889:2:1781 -890:2:1788 -891:2:1789 -892:2:1796 -893:2:1801 -894:0:1946 -895:2:1812 -896:0:1946 -897:2:1813 -898:2:1820 -899:2:1821 -900:2:1828 -901:2:1833 -902:0:1946 -903:2:1844 -904:0:1946 -905:2:1849 -906:2:1856 -907:2:1857 -908:2:1864 -909:2:1869 -910:0:1946 -911:2:1880 -912:0:1946 -913:2:1882 -914:0:1946 -915:2:1883 -916:0:1946 -917:2:423 -918:0:1946 -919:2:424 -920:2:428 -921:2:429 -922:2:437 -923:2:438 -924:2:442 -925:2:443 -926:2:451 -927:2:456 -928:2:460 -929:2:461 -930:2:468 -931:2:469 -932:2:480 -933:2:481 -934:2:482 -935:2:493 -936:2:498 -937:2:499 -938:0:1946 -939:2:511 -940:0:1946 -941:2:513 -942:2:514 -943:0:1946 -944:2:518 -945:2:522 -946:2:523 -947:2:531 -948:2:532 -949:2:536 -950:2:537 -951:2:545 -952:2:550 -953:2:551 -954:2:562 -955:2:563 -956:2:574 -957:2:575 -958:2:576 -959:2:587 -960:2:592 -961:2:593 -962:0:1946 -963:2:605 -964:0:1946 -965:2:607 -966:0:1946 -967:2:608 -968:0:1946 -969:2:618 -970:0:1946 -971:2:619 -972:2:626 -973:2:627 -974:2:634 -975:2:639 -976:0:1946 -977:2:650 -978:0:1946 -979:2:651 -980:2:658 -981:2:659 -982:2:666 -983:2:671 -984:0:1946 -985:2:682 -986:0:1946 -987:2:687 -988:2:694 -989:2:695 -990:2:702 -991:2:707 -992:0:1946 -993:2:718 -994:0:1946 -995:2:720 -996:0:1946 -997:2:721 -998:2:725 -999:2:726 -1000:2:734 -1001:2:735 -1002:2:739 -1003:2:740 -1004:2:748 -1005:2:753 -1006:2:757 -1007:2:758 -1008:2:765 -1009:2:766 -1010:2:777 -1011:2:778 -1012:2:779 -1013:2:790 -1014:2:795 -1015:2:796 -1016:0:1946 -1017:2:808 -1018:0:1946 -1019:2:810 -1020:0:1946 -1021:2:813 -1022:2:814 -1023:2:826 -1024:2:827 -1025:2:831 -1026:2:832 -1027:2:840 -1028:2:845 -1029:2:849 -1030:2:850 -1031:2:857 -1032:2:858 -1033:2:869 -1034:2:870 -1035:2:871 -1036:2:882 -1037:2:887 -1038:2:888 -1039:0:1946 -1040:2:900 -1041:0:1946 -1042:2:902 -1043:0:1946 -1044:2:903 -1045:0:1946 -1046:2:904 -1047:0:1946 -1048:2:905 -1049:0:1946 -1050:2:906 -1051:2:910 -1052:2:911 -1053:2:919 -1054:2:920 -1055:2:924 -1056:2:925 -1057:2:933 -1058:2:938 -1059:2:942 -1060:2:943 -1061:2:950 -1062:2:951 -1063:2:962 -1064:2:963 -1065:2:964 -1066:2:975 -1067:2:980 -1068:2:981 -1069:0:1946 -1070:2:993 -1071:0:1946 -1072:2:1097 -1073:0:1946 -1074:2:1195 -1075:0:1946 -1076:2:1196 -1077:0:1946 -1078:2:1200 -1079:0:1946 -1080:2:1206 -1081:2:1210 -1082:2:1211 -1083:2:1219 -1084:2:1220 -1085:2:1224 -1086:2:1225 -1087:2:1233 -1088:2:1238 -1089:2:1242 -1090:2:1243 -1091:2:1250 -1092:2:1251 -1093:2:1262 -1094:2:1263 -1095:2:1264 -1096:2:1275 -1097:2:1280 -1098:2:1281 -1099:0:1946 -1100:2:1293 -1101:0:1946 -1102:2:1295 -1103:0:1946 -1104:2:1296 -1105:2:1300 -1106:2:1301 -1107:2:1309 -1108:2:1310 -1109:2:1314 -1110:2:1315 -1111:2:1323 -1112:2:1328 -1113:2:1332 -1114:2:1333 -1115:2:1340 -1116:2:1341 -1117:2:1352 -1118:2:1353 -1119:2:1354 -1120:2:1365 -1121:2:1370 -1122:2:1371 -1123:0:1946 -1124:2:1383 -1125:0:1946 -1126:2:1385 -1127:0:1946 -1128:2:1388 -1129:2:1389 -1130:2:1401 -1131:2:1402 -1132:2:1406 -1133:2:1407 -1134:2:1415 -1135:2:1420 -1136:2:1424 -1137:2:1425 -1138:2:1432 -1139:2:1433 -1140:2:1444 -1141:2:1445 -1142:2:1446 -1143:2:1457 -1144:2:1462 -1145:2:1463 -1146:0:1946 -1147:2:1475 -1148:0:1946 -1149:2:1477 -1150:0:1946 -1151:2:1478 -1152:0:1946 -1153:2:1479 -1154:0:1946 -1155:2:1480 -1156:0:1946 -1157:2:1481 -1158:2:1485 -1159:2:1486 -1160:2:1494 -1161:2:1495 -1162:2:1499 -1163:2:1500 -1164:2:1508 -1165:2:1513 -1166:2:1517 -1167:2:1518 -1168:2:1525 -1169:2:1526 -1170:2:1537 -1171:2:1538 -1172:2:1539 -1173:2:1550 -1174:2:1555 -1175:2:1556 -1176:0:1946 -1177:2:1568 -1178:0:1946 -1179:2:1672 -1180:0:1946 -1181:2:1770 -1182:0:1946 -1183:2:1771 -1184:0:1946 -1185:2:1775 -1186:0:1946 -1187:2:1781 -1188:2:1788 -1189:2:1789 -1190:2:1796 -1191:2:1801 -1192:0:1946 -1193:2:1812 -1194:0:1946 -1195:2:1813 -1196:2:1820 -1197:2:1821 -1198:2:1828 -1199:2:1833 -1200:0:1946 -1201:2:1844 -1202:0:1946 -1203:2:1849 -1204:2:1856 -1205:2:1857 -1206:2:1864 -1207:2:1869 -1208:0:1946 -1209:2:1880 -1210:0:1946 -1211:2:1882 -1212:0:1946 -1213:2:1883 -1214:0:1946 -1215:2:423 -1216:0:1946 -1217:2:424 -1218:2:428 -1219:2:429 -1220:2:437 -1221:2:438 -1222:2:442 -1223:2:443 -1224:2:451 -1225:2:456 -1226:2:460 -1227:2:461 -1228:2:468 -1229:2:469 -1230:2:480 -1231:2:481 -1232:2:482 -1233:2:493 -1234:2:498 -1235:2:499 -1236:0:1946 -1237:2:511 -1238:0:1946 -1239:2:513 -1240:2:514 -1241:0:1946 -1242:2:518 -1243:2:522 -1244:2:523 -1245:2:531 -1246:2:532 -1247:2:536 -1248:2:537 -1249:2:545 -1250:2:550 -1251:2:551 -1252:2:562 -1253:2:563 -1254:2:574 -1255:2:575 -1256:2:576 -1257:2:587 -1258:2:592 -1259:2:593 -1260:0:1946 -1261:2:605 -1262:0:1946 -1263:2:607 -1264:0:1946 -1265:2:608 -1266:0:1946 -1267:2:618 -1268:0:1946 -1269:2:619 -1270:2:626 -1271:2:627 -1272:2:634 -1273:2:639 -1274:0:1946 -1275:2:650 -1276:0:1946 -1277:1:2 -1278:0:1946 -1279:1:8 -1280:0:1946 -1281:1:9 -1282:0:1946 -1283:1:10 -1284:0:1946 -1285:1:11 -1286:0:1946 -1287:1:12 -1288:1:16 -1289:1:17 -1290:1:25 -1291:1:26 -1292:1:30 -1293:1:31 -1294:1:39 -1295:1:44 -1296:1:48 -1297:1:49 -1298:1:56 -1299:1:57 -1300:1:68 -1301:1:69 -1302:1:70 -1303:1:81 -1304:1:93 -1305:1:94 -1306:0:1946 -1307:1:99 -1308:0:1946 -1309:1:101 -1310:0:1946 -1311:1:102 -1312:1:106 -1313:1:107 -1314:1:115 -1315:1:116 -1316:1:120 -1317:1:121 -1318:1:129 -1319:1:134 -1320:1:138 -1321:1:139 -1322:1:146 -1323:1:147 -1324:1:158 -1325:1:159 -1326:1:160 -1327:1:171 -1328:1:183 -1329:1:184 -1330:0:1946 -1331:1:189 -1332:0:1946 -1333:1:191 -1334:0:1946 -1335:1:192 -1336:0:1946 -1337:1:193 -1338:1:197 -1339:1:198 -1340:1:206 -1341:1:207 -1342:1:211 -1343:1:212 -1344:1:220 -1345:1:225 -1346:1:229 -1347:1:230 -1348:1:237 -1349:1:238 -1350:1:249 -1351:1:250 -1352:1:251 -1353:1:262 -1354:1:274 -1355:1:275 -1356:0:1946 -1357:1:280 -1358:0:1946 -1359:1:282 -1360:0:1946 -1361:1:291 -1362:0:1946 -1363:1:293 -1364:0:1946 -1365:1:11 -1366:0:1946 -1367:1:12 -1368:1:16 -1369:1:17 -1370:1:25 -1371:1:26 -1372:1:27 -1373:1:39 -1374:1:44 -1375:1:48 -1376:1:49 -1377:1:56 -1378:1:57 -1379:1:68 -1380:1:69 -1381:1:70 -1382:1:81 -1383:1:93 -1384:1:94 -1385:0:1946 -1386:1:99 -1387:0:1946 -1388:1:101 -1389:0:1946 -1390:1:102 -1391:1:106 -1392:1:107 -1393:1:115 -1394:1:116 -1395:1:120 -1396:1:121 -1397:1:129 -1398:1:134 -1399:1:138 -1400:1:139 -1401:1:146 -1402:1:147 -1403:1:158 -1404:1:159 -1405:1:160 -1406:1:171 -1407:1:183 -1408:1:184 -1409:0:1946 -1410:1:189 -1411:0:1946 -1412:1:285 -1413:0:1946 -1414:1:286 -1415:0:1946 -1416:1:291 -1417:0:1946 -1418:1:293 -1419:0:1946 -1420:1:296 -1421:0:1946 -1422:1:301 -1423:0:1946 -1424:1:302 -1425:0:1946 -1426:1:303 -1427:0:1946 -1428:1:304 -1429:0:1946 -1430:1:305 -1431:0:1946 -1432:1:306 -1433:0:1946 -1434:1:308 -1435:0:1946 -1436:1:310 -1437:0:1946 -1438:1:311 -1439:1:315 -1440:1:316 -1441:1:324 -1442:1:325 -1443:1:326 -1444:1:338 -1445:1:343 -1446:1:347 -1447:1:348 -1448:1:355 -1449:1:356 -1450:1:367 -1451:1:368 -1452:1:369 -1453:1:380 -1454:1:392 -1455:1:393 -1456:0:1946 -1457:1:398 -1458:0:1946 -1459:1:400 -1460:0:1946 -1461:1:305 -1462:0:1946 -1463:1:306 -1464:0:1946 -1465:1:308 -1466:0:1946 -1467:1:310 -1468:0:1946 -1469:1:311 -1470:1:315 -1471:1:316 -1472:1:324 -1473:1:325 -1474:1:326 -1475:1:338 -1476:1:343 -1477:1:347 -1478:1:348 -1479:1:355 -1480:1:356 -1481:1:367 -1482:1:368 -1483:1:369 -1484:1:380 -1485:1:392 -1486:1:393 -1487:0:1946 -1488:1:398 -1489:0:1946 -1490:1:400 -1491:0:1946 -1492:1:404 -1493:0:1946 -1494:1:9 -1495:0:1946 -1496:1:10 -1497:0:1946 -1498:1:11 -1499:0:1946 -1500:1:12 -1501:1:16 -1502:1:17 -1503:1:25 -1504:1:26 -1505:1:27 -1506:1:39 -1507:1:44 -1508:1:48 -1509:1:49 -1510:1:56 -1511:1:57 -1512:1:68 -1513:1:69 -1514:1:70 -1515:1:81 -1516:1:93 -1517:1:94 -1518:0:1946 -1519:1:99 -1520:0:1946 -1521:1:101 -1522:0:1946 -1523:1:102 -1524:1:106 -1525:1:107 -1526:1:115 -1527:1:116 -1528:1:120 -1529:1:121 -1530:1:129 -1531:1:134 -1532:1:138 -1533:1:139 -1534:1:146 -1535:1:147 -1536:1:158 -1537:1:159 -1538:1:160 -1539:1:171 -1540:1:183 -1541:1:184 -1542:0:1946 -1543:1:189 -1544:0:1946 -1545:1:191 -1546:0:1946 -1547:1:192 -1548:0:1946 -1549:1:193 -1550:1:197 -1551:1:198 -1552:1:206 -1553:1:207 -1554:1:211 -1555:1:212 -1556:1:220 -1557:1:225 -1558:1:229 -1559:1:230 -1560:1:237 -1561:1:238 -1562:1:249 -1563:1:250 -1564:1:251 -1565:1:262 -1566:1:274 -1567:1:275 -1568:0:1946 -1569:1:280 -1570:0:1946 -1571:1:282 -1572:0:1946 -1573:1:291 -1574:0:1946 -1575:1:293 -1576:0:1946 -1577:1:11 -1578:0:1946 -1579:1:12 -1580:1:16 -1581:1:17 -1582:1:25 -1583:1:34 -1584:1:35 -1585:1:39 -1586:1:44 -1587:1:48 -1588:1:49 -1589:1:56 -1590:1:57 -1591:1:68 -1592:1:69 -1593:1:72 -1594:1:73 -1595:1:81 -1596:1:93 -1597:1:94 -1598:0:1946 -1599:1:99 -1600:0:1946 -1601:1:101 -1602:0:1946 -1603:1:102 -1604:1:106 -1605:1:107 -1606:1:115 -1607:1:124 -1608:1:125 -1609:1:129 -1610:1:134 -1611:1:138 -1612:1:139 -1613:1:146 -1614:1:147 -1615:1:158 -1616:1:159 -1617:1:162 -1618:1:163 -1619:1:171 -1620:1:183 -1621:1:184 -1622:0:1946 -1623:1:189 -1624:0:1946 -1625:1:285 -1626:0:1946 -1627:1:286 -1628:0:1946 -1629:1:291 -1630:0:1946 -1631:1:293 -1632:0:1946 -1633:1:296 -1634:0:1946 -1635:1:301 -1636:0:1946 -1637:2:651 -1638:2:658 -1639:2:661 -1640:2:662 -1641:2:666 -1642:2:671 -1643:0:1946 -1644:2:682 -1645:0:1946 -1646:2:687 -1647:2:694 -1648:2:695 -1649:2:702 -1650:2:707 -1651:0:1946 -1652:2:718 -1653:0:1946 -1654:2:720 -1655:0:1946 -1656:2:721 -1657:2:725 -1658:2:726 -1659:2:734 -1660:2:735 -1661:2:739 -1662:2:740 -1663:2:748 -1664:2:753 -1665:2:757 -1666:2:758 -1667:2:765 -1668:2:766 -1669:2:777 -1670:2:778 -1671:2:779 -1672:2:790 -1673:2:795 -1674:2:796 -1675:0:1946 -1676:2:808 -1677:0:1946 -1678:2:810 -1679:0:1946 -1680:2:813 -1681:2:814 -1682:2:826 -1683:2:827 -1684:2:831 -1685:2:832 -1686:2:840 -1687:2:845 -1688:2:849 -1689:2:850 -1690:2:857 -1691:2:858 -1692:2:869 -1693:2:870 -1694:2:871 -1695:2:882 -1696:2:887 -1697:2:888 -1698:0:1946 -1699:2:900 -1700:0:1946 -1701:2:902 -1702:0:1946 -1703:2:903 -1704:0:1946 -1705:2:904 -1706:0:1946 -1707:2:905 -1708:0:1946 -1709:2:906 -1710:2:910 -1711:2:911 -1712:2:919 -1713:2:920 -1714:2:924 -1715:2:925 -1716:2:933 -1717:2:938 -1718:2:942 -1719:2:943 -1720:2:950 -1721:2:951 -1722:2:962 -1723:2:963 -1724:2:964 -1725:2:975 -1726:2:980 -1727:2:981 -1728:0:1946 -1729:2:993 -1730:0:1946 -1731:2:1097 -1732:0:1946 -1733:2:1195 -1734:0:1946 -1735:2:1196 -1736:0:1946 -1737:2:1200 -1738:0:1946 -1739:2:1206 -1740:2:1210 -1741:2:1211 -1742:2:1219 -1743:2:1220 -1744:2:1224 -1745:2:1225 -1746:2:1233 -1747:2:1238 -1748:2:1242 -1749:2:1243 -1750:2:1250 -1751:2:1251 -1752:2:1262 -1753:2:1263 -1754:2:1264 -1755:2:1275 -1756:2:1280 -1757:2:1281 -1758:0:1946 -1759:2:1293 -1760:0:1946 -1761:2:1295 -1762:0:1946 -1763:2:1296 -1764:2:1300 -1765:2:1301 -1766:2:1309 -1767:2:1310 -1768:2:1314 -1769:2:1315 -1770:2:1323 -1771:2:1328 -1772:2:1332 -1773:2:1333 -1774:2:1340 -1775:2:1341 -1776:2:1352 -1777:2:1353 -1778:2:1354 -1779:2:1365 -1780:2:1370 -1781:2:1371 -1782:0:1946 -1783:2:1383 -1784:0:1946 -1785:2:1385 -1786:0:1946 -1787:2:1388 -1788:2:1389 -1789:2:1401 -1790:2:1402 -1791:2:1406 -1792:2:1407 -1793:2:1415 -1794:2:1420 -1795:2:1424 -1796:2:1425 -1797:2:1432 -1798:2:1433 -1799:2:1444 -1800:2:1445 -1801:2:1446 -1802:2:1457 -1803:2:1462 -1804:2:1463 -1805:0:1946 -1806:2:1475 -1807:0:1946 -1808:2:1477 -1809:0:1946 -1810:2:1478 -1811:0:1946 -1812:2:1479 -1813:0:1946 -1814:2:1480 -1815:0:1946 -1816:2:1481 -1817:2:1485 -1818:2:1486 -1819:2:1494 -1820:2:1495 -1821:2:1499 -1822:2:1500 -1823:2:1508 -1824:2:1513 -1825:2:1517 -1826:2:1518 -1827:2:1525 -1828:2:1526 -1829:2:1537 -1830:2:1538 -1831:2:1539 -1832:2:1550 -1833:2:1555 -1834:2:1556 -1835:0:1946 -1836:2:1568 -1837:0:1946 -1838:2:1672 -1839:0:1946 -1840:2:1770 -1841:0:1946 -1842:2:1771 -1843:0:1946 -1844:2:1775 -1845:0:1946 -1846:2:1781 -1847:2:1788 -1848:2:1789 -1849:2:1796 -1850:2:1801 -1851:0:1946 -1852:2:1812 -1853:0:1946 -1854:2:1813 -1855:2:1820 -1856:2:1823 -1857:2:1824 -1858:2:1828 -1859:2:1833 -1860:0:1946 -1861:2:1844 -1862:0:1946 -1863:2:1849 -1864:2:1856 -1865:2:1857 -1866:2:1864 -1867:2:1869 -1868:0:1946 -1869:2:1880 -1870:0:1946 -1871:2:1882 -1872:0:1946 -1873:2:1883 -1874:0:1946 -1875:2:1886 -1876:0:1946 -1877:2:1891 -1878:0:1946 -1879:1:302 -1880:0:1944 -1881:2:1892 -1882:0:1950 -1883:1:143 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.define b/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.log b/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.log deleted file mode 100644 index 2a80112..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.log +++ /dev/null @@ -1,197 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_single_flip.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -pan: claim violated! (at depth 1371) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 3387, errors: 1 - 206295 states, stored - 1902753 states, matched - 2109048 transitions (= stored+matched) - 7663223 atomic steps -hash conflicts: 101109 (resolved) - -Stats on memory usage (in Megabytes): - 16.526 equivalent memory usage for states (stored*(State-vector + overhead)) - 13.080 actual memory usage for states (compression: 79.15%) - state-vector as stored = 38 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 478.752 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 151, "(1)" - line 418, "pan.___", state 181, "(1)" - line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 242, "(1)" - line 418, "pan.___", state 272, "(1)" - line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 360, "(1)" - line 418, "pan.___", state 390, "(1)" - line 540, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 59, "(1)" - line 413, "pan.___", state 72, "(1)" - line 418, "pan.___", state 89, "(1)" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 240, "(1)" - line 164, "pan.___", state 248, "(1)" - line 168, "pan.___", state 260, "(1)" - line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 927, "(1)" - line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 928, "else" - line 409, "pan.___", state 931, "(1)" - line 409, "pan.___", state 932, "(1)" - line 409, "pan.___", state 932, "(1)" - line 413, "pan.___", state 940, "(1)" - line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 941, "else" - line 413, "pan.___", state 944, "(1)" - line 413, "pan.___", state 945, "(1)" - line 413, "pan.___", state 945, "(1)" - line 411, "pan.___", state 950, "((i<1))" - line 411, "pan.___", state 950, "((i>=1))" - line 418, "pan.___", state 957, "(1)" - line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 958, "else" - line 418, "pan.___", state 961, "(1)" - line 418, "pan.___", state 962, "(1)" - line 418, "pan.___", state 962, "(1)" - line 420, "pan.___", state 965, "(1)" - line 420, "pan.___", state 965, "(1)" - line 179, "pan.___", state 990, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1003, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 1013, "(1)" - line 164, "pan.___", state 1021, "(1)" - line 168, "pan.___", state 1033, "(1)" - line 175, "pan.___", state 1044, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=2))" - line 710, "pan.___", state 20, "((j<2))" - line 710, "pan.___", state 20, "((j>=2))" - line 715, "pan.___", state 33, "((j<2))" - line 715, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 749, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 1.66 seconds -pan: rate 124274.1 states/second -pan: avg transition delay 7.8708e-07 usec -cp .input.spin urcu_free_single_flip.spin.input -cp .input.spin.trail urcu_free_single_flip.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.spin.input b/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.spin.input deleted file mode 100644 index 93aae44..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define SINGLE_FLIP - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -//#define READER_NEST_LEVEL 1 -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.spin.input.trail deleted file mode 100644 index 73c1400..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_free_single_flip.spin.input.trail +++ /dev/null @@ -1,1374 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:1650 -2:3:1602 -3:3:1605 -4:3:1605 -5:3:1608 -6:3:1616 -7:3:1616 -8:3:1619 -9:3:1625 -10:3:1629 -11:3:1629 -12:3:1632 -13:3:1640 -14:3:1644 -15:3:1645 -16:0:1650 -17:3:1647 -18:0:1650 -19:2:416 -20:0:1650 -21:2:422 -22:0:1650 -23:2:423 -24:0:1650 -25:2:424 -26:2:428 -27:2:429 -28:2:437 -29:2:438 -30:2:442 -31:2:443 -32:2:451 -33:2:456 -34:2:460 -35:2:461 -36:2:468 -37:2:469 -38:2:480 -39:2:481 -40:2:482 -41:2:493 -42:2:498 -43:2:499 -44:0:1650 -45:2:511 -46:0:1650 -47:2:513 -48:2:514 -49:0:1650 -50:2:518 -51:2:522 -52:2:523 -53:2:531 -54:2:532 -55:2:536 -56:2:537 -57:2:545 -58:2:550 -59:2:551 -60:2:562 -61:2:563 -62:2:574 -63:2:575 -64:2:576 -65:2:587 -66:2:592 -67:2:593 -68:0:1650 -69:2:605 -70:0:1650 -71:2:607 -72:0:1650 -73:2:608 -74:0:1650 -75:2:618 -76:0:1650 -77:2:622 -78:2:623 -79:2:627 -80:2:631 -81:2:632 -82:2:636 -83:2:644 -84:2:645 -85:2:650 -86:2:657 -87:2:658 -88:2:665 -89:2:670 -90:0:1650 -91:2:681 -92:0:1650 -93:2:685 -94:2:686 -95:2:690 -96:2:694 -97:2:695 -98:2:699 -99:2:707 -100:2:708 -101:2:713 -102:2:720 -103:2:721 -104:2:728 -105:2:733 -106:0:1650 -107:2:744 -108:0:1650 -109:2:752 -110:2:753 -111:2:757 -112:2:761 -113:2:762 -114:2:766 -115:2:774 -116:2:775 -117:2:780 -118:2:787 -119:2:788 -120:2:795 -121:2:800 -122:0:1650 -123:2:811 -124:0:1650 -125:2:813 -126:0:1650 -127:2:814 -128:2:818 -129:2:819 -130:2:827 -131:2:828 -132:2:832 -133:2:833 -134:2:841 -135:2:846 -136:2:850 -137:2:851 -138:2:858 -139:2:859 -140:2:870 -141:2:871 -142:2:872 -143:2:883 -144:2:888 -145:2:889 -146:0:1650 -147:2:901 -148:0:1650 -149:2:903 -150:0:1650 -151:2:906 -152:2:907 -153:2:919 -154:2:920 -155:2:924 -156:2:925 -157:2:933 -158:2:938 -159:2:942 -160:2:943 -161:2:950 -162:2:951 -163:2:962 -164:2:963 -165:2:964 -166:2:975 -167:2:980 -168:2:981 -169:0:1650 -170:2:993 -171:0:1650 -172:2:995 -173:0:1650 -174:2:996 -175:0:1650 -176:2:997 -177:0:1650 -178:2:998 -179:0:1650 -180:2:999 -181:2:1003 -182:2:1004 -183:2:1012 -184:2:1013 -185:2:1017 -186:2:1018 -187:2:1026 -188:2:1031 -189:2:1035 -190:2:1036 -191:2:1043 -192:2:1044 -193:2:1055 -194:2:1056 -195:2:1057 -196:2:1068 -197:2:1073 -198:2:1074 -199:0:1650 -200:2:1086 -201:0:1650 -202:2:1283 -203:0:1650 -204:2:1381 -205:0:1650 -206:2:1382 -207:0:1650 -208:2:1386 -209:0:1650 -210:2:1395 -211:2:1396 -212:2:1400 -213:2:1404 -214:2:1405 -215:2:1409 -216:2:1417 -217:2:1418 -218:2:1423 -219:2:1430 -220:2:1431 -221:2:1438 -222:2:1443 -223:0:1650 -224:2:1454 -225:0:1650 -226:2:1458 -227:2:1459 -228:2:1463 -229:2:1467 -230:2:1468 -231:2:1472 -232:2:1480 -233:2:1481 -234:2:1486 -235:2:1493 -236:2:1494 -237:2:1501 -238:2:1506 -239:0:1650 -240:2:1517 -241:0:1650 -242:2:1525 -243:2:1526 -244:2:1530 -245:2:1534 -246:2:1535 -247:2:1539 -248:2:1547 -249:2:1548 -250:2:1553 -251:2:1560 -252:2:1561 -253:2:1568 -254:2:1573 -255:0:1650 -256:2:1584 -257:0:1650 -258:2:1586 -259:0:1650 -260:2:1587 -261:0:1650 -262:2:423 -263:0:1650 -264:2:424 -265:2:428 -266:2:429 -267:2:437 -268:2:438 -269:2:442 -270:2:443 -271:2:451 -272:2:456 -273:2:460 -274:2:461 -275:2:468 -276:2:469 -277:2:480 -278:2:481 -279:2:482 -280:2:493 -281:2:498 -282:2:499 -283:0:1650 -284:2:511 -285:0:1650 -286:2:513 -287:2:514 -288:0:1650 -289:2:518 -290:2:522 -291:2:523 -292:2:531 -293:2:532 -294:2:536 -295:2:537 -296:2:545 -297:2:550 -298:2:551 -299:2:562 -300:2:563 -301:2:574 -302:2:575 -303:2:576 -304:2:587 -305:2:592 -306:2:593 -307:0:1650 -308:2:605 -309:0:1650 -310:2:607 -311:0:1650 -312:2:608 -313:0:1650 -314:2:618 -315:0:1650 -316:2:622 -317:2:623 -318:2:627 -319:2:631 -320:2:632 -321:2:636 -322:2:644 -323:2:645 -324:2:650 -325:2:657 -326:2:658 -327:2:665 -328:2:670 -329:0:1650 -330:2:681 -331:0:1650 -332:2:685 -333:2:686 -334:2:690 -335:2:694 -336:2:695 -337:2:699 -338:2:707 -339:2:708 -340:2:713 -341:2:720 -342:2:721 -343:2:728 -344:2:733 -345:0:1650 -346:2:744 -347:0:1650 -348:2:752 -349:2:753 -350:2:757 -351:2:761 -352:2:762 -353:2:766 -354:2:774 -355:2:775 -356:2:780 -357:2:787 -358:2:788 -359:2:795 -360:2:800 -361:0:1650 -362:2:811 -363:0:1650 -364:2:813 -365:0:1650 -366:2:814 -367:2:818 -368:2:819 -369:2:827 -370:2:828 -371:2:832 -372:2:833 -373:2:841 -374:2:846 -375:2:850 -376:2:851 -377:2:858 -378:2:859 -379:2:870 -380:2:871 -381:2:872 -382:2:883 -383:2:888 -384:2:889 -385:0:1650 -386:2:901 -387:0:1650 -388:2:903 -389:0:1650 -390:2:906 -391:2:907 -392:2:919 -393:2:920 -394:2:924 -395:2:925 -396:2:933 -397:2:938 -398:2:942 -399:2:943 -400:2:950 -401:2:951 -402:2:962 -403:2:963 -404:2:964 -405:2:975 -406:2:980 -407:2:981 -408:0:1650 -409:2:993 -410:0:1650 -411:2:995 -412:0:1650 -413:2:996 -414:0:1650 -415:2:997 -416:0:1650 -417:2:998 -418:0:1650 -419:2:999 -420:2:1003 -421:2:1004 -422:2:1012 -423:2:1013 -424:2:1017 -425:2:1018 -426:2:1026 -427:2:1031 -428:2:1035 -429:2:1036 -430:2:1043 -431:2:1044 -432:2:1055 -433:2:1056 -434:2:1057 -435:2:1068 -436:2:1073 -437:2:1074 -438:0:1650 -439:2:1086 -440:0:1650 -441:2:1283 -442:0:1650 -443:2:1381 -444:0:1650 -445:2:1382 -446:0:1650 -447:2:1386 -448:0:1650 -449:2:1395 -450:2:1396 -451:2:1400 -452:2:1404 -453:2:1405 -454:2:1409 -455:2:1417 -456:2:1418 -457:2:1423 -458:2:1430 -459:2:1431 -460:2:1438 -461:2:1443 -462:0:1650 -463:2:1454 -464:0:1650 -465:2:1458 -466:2:1459 -467:2:1463 -468:2:1467 -469:2:1468 -470:2:1472 -471:2:1480 -472:2:1481 -473:2:1486 -474:2:1493 -475:2:1494 -476:2:1501 -477:2:1506 -478:0:1650 -479:2:1517 -480:0:1650 -481:2:1525 -482:2:1526 -483:2:1530 -484:2:1534 -485:2:1535 -486:2:1539 -487:2:1547 -488:2:1548 -489:2:1553 -490:2:1560 -491:2:1561 -492:2:1568 -493:2:1573 -494:0:1650 -495:2:1584 -496:0:1650 -497:2:1586 -498:0:1650 -499:2:1587 -500:0:1650 -501:2:423 -502:0:1650 -503:2:424 -504:2:428 -505:2:429 -506:2:437 -507:2:438 -508:2:442 -509:2:443 -510:2:451 -511:2:456 -512:2:460 -513:2:461 -514:2:468 -515:2:469 -516:2:480 -517:2:481 -518:2:482 -519:2:493 -520:2:498 -521:2:499 -522:0:1650 -523:2:511 -524:0:1650 -525:2:513 -526:2:514 -527:0:1650 -528:2:518 -529:2:522 -530:2:523 -531:2:531 -532:2:532 -533:2:536 -534:2:537 -535:2:545 -536:2:550 -537:2:551 -538:2:562 -539:2:563 -540:2:574 -541:2:575 -542:2:576 -543:2:587 -544:2:592 -545:2:593 -546:0:1650 -547:2:605 -548:0:1650 -549:2:607 -550:0:1650 -551:2:608 -552:0:1650 -553:2:618 -554:0:1650 -555:2:622 -556:2:623 -557:2:627 -558:2:631 -559:2:632 -560:2:636 -561:2:644 -562:2:645 -563:2:650 -564:2:657 -565:2:658 -566:2:665 -567:2:670 -568:0:1650 -569:2:681 -570:0:1650 -571:2:685 -572:2:686 -573:2:690 -574:2:694 -575:2:695 -576:2:699 -577:2:707 -578:2:708 -579:2:713 -580:2:720 -581:2:721 -582:2:728 -583:2:733 -584:0:1650 -585:2:744 -586:0:1650 -587:2:752 -588:2:753 -589:2:757 -590:2:761 -591:2:762 -592:2:766 -593:2:774 -594:2:775 -595:2:780 -596:2:787 -597:2:788 -598:2:795 -599:2:800 -600:0:1650 -601:2:811 -602:0:1650 -603:2:813 -604:0:1650 -605:2:814 -606:2:818 -607:2:819 -608:2:827 -609:2:828 -610:2:832 -611:2:833 -612:2:841 -613:2:846 -614:2:850 -615:2:851 -616:2:858 -617:2:859 -618:2:870 -619:2:871 -620:2:872 -621:2:883 -622:2:888 -623:2:889 -624:0:1650 -625:2:901 -626:0:1650 -627:2:903 -628:0:1650 -629:2:906 -630:2:907 -631:2:919 -632:2:920 -633:2:924 -634:2:925 -635:2:933 -636:2:938 -637:2:942 -638:2:943 -639:2:950 -640:2:951 -641:2:962 -642:2:963 -643:2:964 -644:2:975 -645:2:980 -646:2:981 -647:0:1650 -648:2:993 -649:0:1650 -650:2:995 -651:0:1650 -652:2:996 -653:0:1650 -654:2:997 -655:0:1650 -656:2:998 -657:0:1650 -658:2:999 -659:2:1003 -660:2:1004 -661:2:1012 -662:2:1013 -663:2:1017 -664:2:1018 -665:2:1026 -666:2:1031 -667:2:1035 -668:2:1036 -669:2:1043 -670:2:1044 -671:2:1055 -672:2:1056 -673:2:1057 -674:2:1068 -675:2:1073 -676:2:1074 -677:0:1650 -678:2:1086 -679:0:1650 -680:2:1283 -681:0:1650 -682:2:1381 -683:0:1650 -684:2:1382 -685:0:1650 -686:2:1386 -687:0:1650 -688:2:1395 -689:2:1396 -690:2:1400 -691:2:1404 -692:2:1405 -693:2:1409 -694:2:1417 -695:2:1418 -696:2:1423 -697:2:1430 -698:2:1431 -699:2:1438 -700:2:1443 -701:0:1650 -702:2:1454 -703:0:1650 -704:2:1458 -705:2:1459 -706:2:1463 -707:2:1467 -708:2:1468 -709:2:1472 -710:2:1480 -711:2:1481 -712:2:1486 -713:2:1493 -714:2:1494 -715:2:1501 -716:2:1506 -717:0:1650 -718:2:1517 -719:0:1650 -720:2:1525 -721:2:1526 -722:2:1530 -723:2:1534 -724:2:1535 -725:2:1539 -726:2:1547 -727:2:1548 -728:2:1553 -729:2:1560 -730:2:1561 -731:2:1568 -732:2:1573 -733:0:1650 -734:2:1584 -735:0:1650 -736:2:1586 -737:0:1650 -738:2:1587 -739:0:1650 -740:2:423 -741:0:1650 -742:2:424 -743:2:428 -744:2:429 -745:2:437 -746:2:438 -747:2:442 -748:2:443 -749:2:451 -750:2:456 -751:2:460 -752:2:461 -753:2:468 -754:2:469 -755:2:480 -756:2:481 -757:2:482 -758:2:493 -759:2:498 -760:2:499 -761:0:1650 -762:2:511 -763:0:1650 -764:2:513 -765:2:514 -766:0:1650 -767:2:518 -768:2:522 -769:2:523 -770:2:531 -771:2:532 -772:2:536 -773:2:537 -774:2:545 -775:2:550 -776:2:551 -777:2:562 -778:2:563 -779:2:574 -780:2:575 -781:2:576 -782:2:587 -783:2:592 -784:2:593 -785:0:1650 -786:2:605 -787:0:1650 -788:2:607 -789:0:1650 -790:2:608 -791:0:1650 -792:2:618 -793:0:1650 -794:2:622 -795:2:623 -796:2:627 -797:2:631 -798:2:632 -799:2:636 -800:2:644 -801:2:645 -802:2:650 -803:2:657 -804:2:658 -805:2:665 -806:2:670 -807:0:1650 -808:2:681 -809:0:1650 -810:2:685 -811:2:686 -812:2:690 -813:2:694 -814:2:695 -815:2:699 -816:2:707 -817:2:708 -818:2:713 -819:2:720 -820:2:721 -821:2:728 -822:2:733 -823:0:1650 -824:2:744 -825:0:1650 -826:2:752 -827:2:753 -828:2:757 -829:2:761 -830:2:762 -831:2:766 -832:2:774 -833:2:775 -834:2:780 -835:2:787 -836:2:788 -837:2:795 -838:2:800 -839:0:1650 -840:2:811 -841:0:1650 -842:2:813 -843:0:1650 -844:2:814 -845:2:818 -846:2:819 -847:2:827 -848:2:828 -849:2:832 -850:2:833 -851:2:841 -852:2:846 -853:2:850 -854:2:851 -855:2:858 -856:2:859 -857:2:870 -858:2:871 -859:2:872 -860:2:883 -861:2:888 -862:2:889 -863:0:1650 -864:2:901 -865:0:1650 -866:2:903 -867:0:1650 -868:2:906 -869:2:907 -870:2:919 -871:2:920 -872:2:924 -873:2:925 -874:2:933 -875:2:938 -876:2:942 -877:2:943 -878:2:950 -879:2:951 -880:2:962 -881:2:963 -882:2:964 -883:2:975 -884:2:980 -885:2:981 -886:0:1650 -887:2:993 -888:0:1650 -889:2:995 -890:0:1650 -891:2:996 -892:0:1650 -893:2:997 -894:0:1650 -895:2:998 -896:0:1650 -897:2:999 -898:2:1003 -899:2:1004 -900:2:1012 -901:2:1013 -902:2:1017 -903:2:1018 -904:2:1026 -905:2:1031 -906:2:1035 -907:2:1036 -908:2:1043 -909:2:1044 -910:2:1055 -911:2:1056 -912:2:1057 -913:2:1068 -914:2:1073 -915:2:1074 -916:0:1650 -917:2:1086 -918:0:1650 -919:2:1283 -920:0:1650 -921:2:1381 -922:0:1650 -923:2:1382 -924:0:1650 -925:2:1386 -926:0:1650 -927:2:1395 -928:2:1396 -929:2:1400 -930:2:1404 -931:2:1405 -932:2:1409 -933:2:1417 -934:2:1418 -935:2:1423 -936:2:1430 -937:2:1431 -938:2:1438 -939:2:1443 -940:0:1650 -941:2:1454 -942:0:1650 -943:1:2 -944:0:1650 -945:1:8 -946:0:1650 -947:1:9 -948:0:1650 -949:1:10 -950:0:1650 -951:1:11 -952:0:1650 -953:1:12 -954:1:16 -955:1:17 -956:1:25 -957:1:26 -958:1:30 -959:1:31 -960:1:39 -961:1:44 -962:1:48 -963:1:49 -964:1:63 -965:1:64 -966:1:68 -967:1:69 -968:1:70 -969:1:81 -970:1:86 -971:1:87 -972:0:1650 -973:1:99 -974:0:1650 -975:1:101 -976:0:1650 -977:1:102 -978:1:106 -979:1:107 -980:1:115 -981:1:116 -982:1:120 -983:1:121 -984:1:129 -985:1:134 -986:1:138 -987:1:139 -988:1:153 -989:1:154 -990:1:158 -991:1:159 -992:1:160 -993:1:171 -994:1:176 -995:1:177 -996:0:1650 -997:1:189 -998:0:1650 -999:1:191 -1000:0:1650 -1001:1:192 -1002:0:1650 -1003:2:1458 -1004:2:1459 -1005:2:1463 -1006:2:1467 -1007:2:1468 -1008:2:1472 -1009:2:1480 -1010:2:1481 -1011:2:1486 -1012:2:1493 -1013:2:1494 -1014:2:1501 -1015:2:1506 -1016:0:1650 -1017:2:1517 -1018:0:1650 -1019:2:1525 -1020:2:1526 -1021:2:1530 -1022:2:1534 -1023:2:1535 -1024:2:1539 -1025:2:1547 -1026:2:1548 -1027:2:1553 -1028:2:1560 -1029:2:1561 -1030:2:1568 -1031:2:1573 -1032:0:1650 -1033:2:1584 -1034:0:1650 -1035:2:1586 -1036:0:1650 -1037:2:1587 -1038:0:1650 -1039:2:423 -1040:0:1650 -1041:2:424 -1042:2:428 -1043:2:429 -1044:2:437 -1045:2:438 -1046:2:442 -1047:2:443 -1048:2:451 -1049:2:456 -1050:2:460 -1051:2:461 -1052:2:468 -1053:2:469 -1054:2:480 -1055:2:481 -1056:2:482 -1057:2:493 -1058:2:498 -1059:2:499 -1060:0:1650 -1061:2:511 -1062:0:1650 -1063:2:513 -1064:2:514 -1065:0:1650 -1066:2:518 -1067:2:522 -1068:2:523 -1069:2:531 -1070:2:532 -1071:2:536 -1072:2:537 -1073:2:545 -1074:2:550 -1075:2:551 -1076:2:562 -1077:2:563 -1078:2:574 -1079:2:575 -1080:2:576 -1081:2:587 -1082:2:592 -1083:2:593 -1084:0:1650 -1085:2:605 -1086:0:1650 -1087:2:607 -1088:0:1650 -1089:2:608 -1090:0:1650 -1091:2:618 -1092:0:1650 -1093:2:622 -1094:2:623 -1095:2:627 -1096:2:631 -1097:2:632 -1098:2:636 -1099:2:644 -1100:2:645 -1101:2:650 -1102:2:657 -1103:2:658 -1104:2:665 -1105:2:670 -1106:0:1650 -1107:2:681 -1108:0:1650 -1109:1:193 -1110:1:197 -1111:1:198 -1112:1:206 -1113:1:207 -1114:1:211 -1115:1:212 -1116:1:220 -1117:1:225 -1118:1:229 -1119:1:230 -1120:1:237 -1121:1:238 -1122:1:249 -1123:1:250 -1124:1:251 -1125:1:262 -1126:1:274 -1127:1:275 -1128:0:1650 -1129:1:280 -1130:0:1650 -1131:1:282 -1132:0:1650 -1133:1:291 -1134:0:1650 -1135:1:293 -1136:0:1650 -1137:1:11 -1138:0:1650 -1139:1:12 -1140:1:16 -1141:1:17 -1142:1:25 -1143:1:26 -1144:1:27 -1145:1:39 -1146:1:44 -1147:1:48 -1148:1:49 -1149:1:56 -1150:1:57 -1151:1:68 -1152:1:69 -1153:1:70 -1154:1:81 -1155:1:93 -1156:1:94 -1157:0:1650 -1158:1:99 -1159:0:1650 -1160:1:101 -1161:0:1650 -1162:1:102 -1163:1:106 -1164:1:107 -1165:1:115 -1166:1:116 -1167:1:120 -1168:1:121 -1169:1:129 -1170:1:134 -1171:1:138 -1172:1:139 -1173:1:146 -1174:1:147 -1175:1:158 -1176:1:159 -1177:1:160 -1178:1:171 -1179:1:183 -1180:1:184 -1181:0:1650 -1182:1:189 -1183:0:1650 -1184:1:285 -1185:0:1650 -1186:1:286 -1187:0:1650 -1188:1:291 -1189:0:1650 -1190:1:293 -1191:0:1650 -1192:1:296 -1193:0:1650 -1194:1:301 -1195:0:1650 -1196:2:685 -1197:2:686 -1198:2:690 -1199:2:691 -1200:2:699 -1201:2:707 -1202:2:708 -1203:2:713 -1204:2:720 -1205:2:721 -1206:2:728 -1207:2:733 -1208:0:1650 -1209:2:744 -1210:0:1650 -1211:2:752 -1212:2:753 -1213:2:757 -1214:2:761 -1215:2:762 -1216:2:766 -1217:2:774 -1218:2:775 -1219:2:780 -1220:2:787 -1221:2:788 -1222:2:795 -1223:2:800 -1224:0:1650 -1225:2:811 -1226:0:1650 -1227:2:813 -1228:0:1650 -1229:2:814 -1230:2:818 -1231:2:819 -1232:2:827 -1233:2:828 -1234:2:832 -1235:2:833 -1236:2:841 -1237:2:846 -1238:2:850 -1239:2:851 -1240:2:858 -1241:2:859 -1242:2:870 -1243:2:871 -1244:2:872 -1245:2:883 -1246:2:888 -1247:2:889 -1248:0:1650 -1249:2:901 -1250:0:1650 -1251:2:903 -1252:0:1650 -1253:2:906 -1254:2:907 -1255:2:919 -1256:2:920 -1257:2:924 -1258:2:925 -1259:2:933 -1260:2:938 -1261:2:942 -1262:2:943 -1263:2:950 -1264:2:951 -1265:2:962 -1266:2:963 -1267:2:964 -1268:2:975 -1269:2:980 -1270:2:981 -1271:0:1650 -1272:2:993 -1273:0:1650 -1274:2:995 -1275:0:1650 -1276:2:996 -1277:0:1650 -1278:2:997 -1279:0:1650 -1280:2:998 -1281:0:1650 -1282:2:999 -1283:2:1003 -1284:2:1004 -1285:2:1012 -1286:2:1013 -1287:2:1017 -1288:2:1018 -1289:2:1026 -1290:2:1031 -1291:2:1035 -1292:2:1036 -1293:2:1043 -1294:2:1044 -1295:2:1055 -1296:2:1056 -1297:2:1057 -1298:2:1068 -1299:2:1073 -1300:2:1074 -1301:0:1650 -1302:2:1086 -1303:0:1650 -1304:2:1283 -1305:0:1650 -1306:2:1381 -1307:0:1650 -1308:2:1382 -1309:0:1650 -1310:2:1386 -1311:0:1650 -1312:2:1395 -1313:2:1396 -1314:2:1400 -1315:2:1404 -1316:2:1405 -1317:2:1409 -1318:2:1417 -1319:2:1418 -1320:2:1423 -1321:2:1430 -1322:2:1431 -1323:2:1438 -1324:2:1443 -1325:0:1650 -1326:2:1454 -1327:0:1650 -1328:2:1458 -1329:2:1459 -1330:2:1463 -1331:2:1467 -1332:2:1468 -1333:2:1472 -1334:2:1480 -1335:2:1481 -1336:2:1486 -1337:2:1493 -1338:2:1494 -1339:2:1501 -1340:2:1506 -1341:0:1650 -1342:2:1517 -1343:0:1650 -1344:2:1525 -1345:2:1526 -1346:2:1530 -1347:2:1534 -1348:2:1535 -1349:2:1539 -1350:2:1547 -1351:2:1548 -1352:2:1553 -1353:2:1560 -1354:2:1561 -1355:2:1568 -1356:2:1573 -1357:0:1650 -1358:2:1584 -1359:0:1650 -1360:2:1586 -1361:0:1650 -1362:2:1587 -1363:0:1650 -1364:2:1590 -1365:0:1650 -1366:2:1595 -1367:0:1650 -1368:1:302 -1369:0:1648 -1370:2:1596 -1371:0:1654 -1372:0:1650 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress.ltl b/formal-model/urcu/result-standard-execution-nest/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.define b/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.log b/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.log deleted file mode 100644 index 9e98b9f..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.log +++ /dev/null @@ -1,275 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_reader.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -depth 15: Claim reached state 9 (line 749) -depth 1767: Claim reached state 9 (line 748) -Depth= 3880 States= 1e+06 Transitions= 1.71e+07 Memory= 499.651 t= 14.5 R= 7e+04 -Depth= 3880 States= 2e+06 Transitions= 3.79e+07 Memory= 532.365 t= 32.3 R= 6e+04 -Depth= 3880 States= 3e+06 Transitions= 5.83e+07 Memory= 564.983 t= 50.2 R= 6e+04 -pan: resizing hashtable to -w22.. done -Depth= 3880 States= 4e+06 Transitions= 7.76e+07 Memory= 629.307 t= 67 R= 6e+04 -Depth= 3880 States= 5e+06 Transitions= 9.78e+07 Memory= 662.315 t= 84.2 R= 6e+04 -Depth= 3880 States= 6e+06 Transitions= 1.19e+08 Memory= 694.736 t= 102 R= 6e+04 -Depth= 3880 States= 7e+06 Transitions= 1.38e+08 Memory= 727.842 t= 119 R= 6e+04 -Depth= 3880 States= 8e+06 Transitions= 1.59e+08 Memory= 760.752 t= 137 R= 6e+04 -Depth= 3880 States= 9e+06 Transitions= 1.79e+08 Memory= 793.174 t= 155 R= 6e+04 -pan: resizing hashtable to -w24.. done -Depth= 3880 States= 1e+07 Transitions= 1.98e+08 Memory= 950.568 t= 172 R= 6e+04 -Depth= 3880 States= 1.1e+07 Transitions= 2.19e+08 Memory= 983.479 t= 189 R= 6e+04 -Depth= 3880 States= 1.2e+07 Transitions= 2.4e+08 Memory= 1015.901 t= 207 R= 6e+04 -Depth= 3880 States= 1.3e+07 Transitions= 2.58e+08 Memory= 1049.397 t= 223 R= 6e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 3880, errors: 0 - 7197860 states, stored (1.33457e+07 visited) -2.5266654e+08 states, matched -2.6601223e+08 transitions (= visited+matched) -9.9067284e+08 atomic steps -hash conflicts: 87783920 (resolved) - -Stats on memory usage (in Megabytes): - 576.611 equivalent memory usage for states (stored*(State-vector + overhead)) - 474.839 actual memory usage for states (compression: 82.35%) - state-vector as stored = 41 byte + 28 byte overhead - 128.000 memory used for hash table (-w24) - 457.764 memory used for DFS stack (-m10000000) - 1060.529 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 151, "(1)" - line 418, "pan.___", state 181, "(1)" - line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 242, "(1)" - line 418, "pan.___", state 272, "(1)" - line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 360, "(1)" - line 418, "pan.___", state 390, "(1)" - line 540, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 59, "(1)" - line 413, "pan.___", state 72, "(1)" - line 418, "pan.___", state 89, "(1)" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 240, "(1)" - line 164, "pan.___", state 248, "(1)" - line 168, "pan.___", state 260, "(1)" - line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 927, "(1)" - line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 928, "else" - line 409, "pan.___", state 931, "(1)" - line 409, "pan.___", state 932, "(1)" - line 409, "pan.___", state 932, "(1)" - line 413, "pan.___", state 940, "(1)" - line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 941, "else" - line 413, "pan.___", state 944, "(1)" - line 413, "pan.___", state 945, "(1)" - line 413, "pan.___", state 945, "(1)" - line 411, "pan.___", state 950, "((i<1))" - line 411, "pan.___", state 950, "((i>=1))" - line 418, "pan.___", state 957, "(1)" - line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 958, "else" - line 418, "pan.___", state 961, "(1)" - line 418, "pan.___", state 962, "(1)" - line 418, "pan.___", state 962, "(1)" - line 420, "pan.___", state 965, "(1)" - line 420, "pan.___", state 965, "(1)" - line 403, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1040, "(1)" - line 418, "pan.___", state 1057, "(1)" - line 403, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1130, "(1)" - line 418, "pan.___", state 1147, "(1)" - line 399, "pan.___", state 1166, "(1)" - line 403, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1222, "(1)" - line 418, "pan.___", state 1239, "(1)" - line 403, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1315, "(1)" - line 418, "pan.___", state 1332, "(1)" - line 179, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 1378, "(1)" - line 164, "pan.___", state 1386, "(1)" - line 168, "pan.___", state 1398, "(1)" - line 175, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1595, "(1)" - line 409, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 1596, "else" - line 409, "pan.___", state 1599, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 413, "pan.___", state 1608, "(1)" - line 413, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 1609, "else" - line 413, "pan.___", state 1612, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 411, "pan.___", state 1618, "((i<1))" - line 411, "pan.___", state 1618, "((i>=1))" - line 418, "pan.___", state 1625, "(1)" - line 418, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 1626, "else" - line 418, "pan.___", state 1629, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 179, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 1681, "(1)" - line 164, "pan.___", state 1689, "(1)" - line 168, "pan.___", state 1701, "(1)" - line 175, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.spin.input.trail deleted file mode 100644 index 7c42af1..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_progress_reader.spin.input.trail +++ /dev/null @@ -1,1270 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4401 -2:4:4353 -3:4:4356 -4:4:4356 -5:4:4359 -6:4:4367 -7:4:4367 -8:4:4370 -9:4:4376 -10:4:4380 -11:4:4380 -12:4:4383 -13:4:4391 -14:4:4395 -15:4:4396 -16:0:4401 -17:4:4398 -18:0:4401 -19:3:2479 -20:0:4401 -21:3:2485 -22:0:4401 -23:3:2486 -24:0:4401 -25:3:2487 -26:3:2491 -27:3:2492 -28:3:2500 -29:3:2501 -30:3:2505 -31:3:2506 -32:3:2514 -33:3:2519 -34:3:2523 -35:3:2524 -36:3:2531 -37:3:2532 -38:3:2543 -39:3:2544 -40:3:2545 -41:3:2556 -42:3:2561 -43:3:2562 -44:0:4401 -45:3:2574 -46:0:4401 -47:3:2576 -48:3:2577 -49:0:4401 -50:3:2581 -51:3:2585 -52:3:2586 -53:3:2594 -54:3:2595 -55:3:2599 -56:3:2600 -57:3:2608 -58:3:2613 -59:3:2614 -60:3:2625 -61:3:2626 -62:3:2637 -63:3:2638 -64:3:2639 -65:3:2650 -66:3:2655 -67:3:2656 -68:0:4401 -69:3:2668 -70:0:4401 -71:3:2670 -72:0:4401 -73:3:2671 -74:0:4401 -75:3:2681 -76:0:4401 -77:3:2682 -78:0:4401 -79:3:2686 -80:3:2687 -81:3:2691 -82:3:2695 -83:3:2696 -84:3:2700 -85:3:2708 -86:3:2709 -87:3:2714 -88:3:2721 -89:3:2722 -90:3:2729 -91:3:2734 -92:0:4401 -93:3:2745 -94:0:4401 -95:3:2749 -96:3:2750 -97:3:2754 -98:3:2758 -99:3:2759 -100:3:2763 -101:3:2771 -102:3:2772 -103:3:2777 -104:3:2784 -105:3:2785 -106:3:2792 -107:3:2797 -108:0:4401 -109:3:2808 -110:0:4401 -111:3:2816 -112:3:2817 -113:3:2821 -114:3:2825 -115:3:2826 -116:3:2830 -117:3:2838 -118:3:2839 -119:3:2844 -120:3:2851 -121:3:2852 -122:3:2859 -123:3:2864 -124:0:4401 -125:3:2879 -126:0:4401 -127:3:2881 -128:0:4401 -129:3:2882 -130:3:2886 -131:3:2887 -132:3:2895 -133:3:2896 -134:3:2900 -135:3:2901 -136:3:2909 -137:3:2914 -138:3:2918 -139:3:2919 -140:3:2926 -141:3:2927 -142:3:2938 -143:3:2939 -144:3:2940 -145:3:2951 -146:3:2956 -147:3:2957 -148:0:4401 -149:3:2969 -150:0:4401 -151:3:2971 -152:0:4401 -153:3:2974 -154:3:2975 -155:3:2987 -156:3:2988 -157:3:2992 -158:3:2993 -159:3:3001 -160:3:3006 -161:3:3010 -162:3:3011 -163:3:3018 -164:3:3019 -165:3:3030 -166:3:3031 -167:3:3032 -168:3:3043 -169:3:3048 -170:3:3049 -171:0:4401 -172:3:3061 -173:0:4401 -174:3:3063 -175:0:4401 -176:3:3064 -177:0:4401 -178:3:3065 -179:0:4401 -180:3:3066 -181:0:4401 -182:3:3067 -183:3:3071 -184:3:3072 -185:3:3080 -186:3:3081 -187:3:3085 -188:3:3086 -189:3:3094 -190:3:3099 -191:3:3103 -192:3:3104 -193:3:3111 -194:3:3112 -195:3:3123 -196:3:3124 -197:3:3125 -198:3:3136 -199:3:3141 -200:3:3142 -201:0:4401 -202:3:3154 -203:0:4401 -204:3:3356 -205:0:4401 -206:3:3454 -207:0:4401 -208:3:3455 -209:0:4401 -210:3:3459 -211:0:4401 -212:3:3465 -213:3:3469 -214:3:3470 -215:3:3478 -216:3:3479 -217:3:3483 -218:3:3484 -219:3:3492 -220:3:3497 -221:3:3501 -222:3:3502 -223:3:3509 -224:3:3510 -225:3:3521 -226:3:3522 -227:3:3523 -228:3:3534 -229:3:3539 -230:3:3540 -231:0:4401 -232:3:3552 -233:0:4401 -234:3:3554 -235:0:4401 -236:3:3555 -237:3:3559 -238:3:3560 -239:3:3568 -240:3:3569 -241:3:3573 -242:3:3574 -243:3:3582 -244:3:3587 -245:3:3591 -246:3:3592 -247:3:3599 -248:3:3600 -249:3:3611 -250:3:3612 -251:3:3613 -252:3:3624 -253:3:3629 -254:3:3630 -255:0:4401 -256:3:3642 -257:0:4401 -258:3:3644 -259:0:4401 -260:3:3647 -261:3:3648 -262:3:3660 -263:3:3661 -264:3:3665 -265:3:3666 -266:3:3674 -267:3:3679 -268:3:3683 -269:3:3684 -270:3:3691 -271:3:3692 -272:3:3703 -273:3:3704 -274:3:3705 -275:3:3716 -276:3:3721 -277:3:3722 -278:0:4401 -279:3:3734 -280:0:4401 -281:3:3736 -282:0:4401 -283:3:3737 -284:0:4401 -285:3:3738 -286:0:4401 -287:3:3739 -288:0:4401 -289:3:3740 -290:3:3744 -291:3:3745 -292:3:3753 -293:3:3754 -294:3:3758 -295:3:3759 -296:3:3767 -297:3:3772 -298:3:3776 -299:3:3777 -300:3:3784 -301:3:3785 -302:3:3796 -303:3:3797 -304:3:3798 -305:3:3809 -306:3:3814 -307:3:3815 -308:0:4401 -309:3:3827 -310:0:4401 -311:3:4029 -312:0:4401 -313:3:4127 -314:0:4401 -315:3:4128 -316:0:4401 -317:3:4132 -318:0:4401 -319:3:4138 -320:0:4401 -321:3:4142 -322:3:4143 -323:3:4147 -324:3:4151 -325:3:4152 -326:3:4156 -327:3:4164 -328:3:4165 -329:3:4170 -330:3:4177 -331:3:4178 -332:3:4185 -333:3:4190 -334:0:4401 -335:3:4201 -336:0:4401 -337:3:4205 -338:3:4206 -339:3:4210 -340:3:4214 -341:3:4215 -342:3:4219 -343:3:4227 -344:3:4228 -345:3:4233 -346:3:4240 -347:3:4241 -348:3:4248 -349:3:4253 -350:0:4401 -351:3:4264 -352:0:4401 -353:3:4272 -354:3:4273 -355:3:4277 -356:3:4281 -357:3:4282 -358:3:4286 -359:3:4294 -360:3:4295 -361:3:4300 -362:3:4307 -363:3:4308 -364:3:4315 -365:3:4320 -366:0:4401 -367:3:4335 -368:0:4401 -369:3:4337 -370:0:4401 -371:3:4338 -372:0:4401 -373:3:2486 -374:0:4401 -375:3:2487 -376:3:2491 -377:3:2492 -378:3:2500 -379:3:2501 -380:3:2505 -381:3:2506 -382:3:2514 -383:3:2519 -384:3:2523 -385:3:2524 -386:3:2531 -387:3:2532 -388:3:2543 -389:3:2544 -390:3:2545 -391:3:2556 -392:3:2561 -393:3:2562 -394:0:4401 -395:3:2574 -396:0:4401 -397:3:2576 -398:3:2577 -399:0:4401 -400:3:2581 -401:3:2585 -402:3:2586 -403:3:2594 -404:3:2595 -405:3:2599 -406:3:2600 -407:3:2608 -408:3:2613 -409:3:2614 -410:3:2625 -411:3:2626 -412:3:2637 -413:3:2638 -414:3:2639 -415:3:2650 -416:3:2655 -417:3:2656 -418:0:4401 -419:3:2668 -420:0:4401 -421:3:2670 -422:0:4401 -423:3:2671 -424:0:4401 -425:3:2681 -426:0:4401 -427:3:2682 -428:0:4401 -429:3:2686 -430:3:2687 -431:3:2691 -432:3:2695 -433:3:2696 -434:3:2700 -435:3:2708 -436:3:2709 -437:3:2714 -438:3:2721 -439:3:2722 -440:3:2729 -441:3:2734 -442:0:4401 -443:3:2745 -444:0:4401 -445:3:2749 -446:3:2750 -447:3:2754 -448:3:2758 -449:3:2759 -450:3:2763 -451:3:2771 -452:3:2772 -453:3:2777 -454:3:2784 -455:3:2785 -456:3:2792 -457:3:2797 -458:0:4401 -459:3:2808 -460:0:4401 -461:3:2816 -462:3:2817 -463:3:2821 -464:3:2825 -465:3:2826 -466:3:2830 -467:3:2838 -468:3:2839 -469:3:2844 -470:3:2851 -471:3:2852 -472:3:2859 -473:3:2864 -474:0:4401 -475:3:2879 -476:0:4401 -477:3:2881 -478:0:4401 -479:3:2882 -480:3:2886 -481:3:2887 -482:3:2895 -483:3:2896 -484:3:2900 -485:3:2901 -486:3:2909 -487:3:2914 -488:3:2918 -489:3:2919 -490:3:2926 -491:3:2927 -492:3:2938 -493:3:2939 -494:3:2940 -495:3:2951 -496:3:2956 -497:3:2957 -498:0:4401 -499:3:2969 -500:0:4401 -501:3:2971 -502:0:4401 -503:3:2974 -504:3:2975 -505:3:2987 -506:3:2988 -507:3:2992 -508:3:2993 -509:3:3001 -510:3:3006 -511:3:3010 -512:3:3011 -513:3:3018 -514:3:3019 -515:3:3030 -516:3:3031 -517:3:3032 -518:3:3043 -519:3:3048 -520:3:3049 -521:0:4401 -522:3:3061 -523:0:4401 -524:3:3063 -525:0:4401 -526:3:3064 -527:0:4401 -528:3:3065 -529:0:4401 -530:3:3066 -531:0:4401 -532:3:3067 -533:3:3071 -534:3:3072 -535:3:3080 -536:3:3081 -537:3:3085 -538:3:3086 -539:3:3094 -540:3:3099 -541:3:3103 -542:3:3104 -543:3:3111 -544:3:3112 -545:3:3123 -546:3:3124 -547:3:3125 -548:3:3136 -549:3:3141 -550:3:3142 -551:0:4401 -552:3:3154 -553:0:4401 -554:3:3356 -555:0:4401 -556:3:3454 -557:0:4401 -558:3:3455 -559:0:4401 -560:3:3459 -561:0:4401 -562:3:3465 -563:3:3469 -564:3:3470 -565:3:3478 -566:3:3479 -567:3:3483 -568:3:3484 -569:3:3492 -570:3:3497 -571:3:3501 -572:3:3502 -573:3:3509 -574:3:3510 -575:3:3521 -576:3:3522 -577:3:3523 -578:3:3534 -579:3:3539 -580:3:3540 -581:0:4401 -582:3:3552 -583:0:4401 -584:3:3554 -585:0:4401 -586:3:3555 -587:3:3559 -588:3:3560 -589:3:3568 -590:3:3569 -591:3:3573 -592:3:3574 -593:3:3582 -594:3:3587 -595:3:3591 -596:3:3592 -597:3:3599 -598:3:3600 -599:3:3611 -600:3:3612 -601:3:3613 -602:3:3624 -603:3:3629 -604:3:3630 -605:0:4401 -606:3:3642 -607:0:4401 -608:3:3644 -609:0:4401 -610:3:3647 -611:3:3648 -612:3:3660 -613:3:3661 -614:3:3665 -615:3:3666 -616:3:3674 -617:3:3679 -618:3:3683 -619:3:3684 -620:3:3691 -621:3:3692 -622:3:3703 -623:3:3704 -624:3:3705 -625:3:3716 -626:3:3721 -627:3:3722 -628:0:4401 -629:3:3734 -630:0:4401 -631:3:3736 -632:0:4401 -633:3:3737 -634:0:4401 -635:3:3738 -636:0:4401 -637:3:3739 -638:0:4401 -639:3:3740 -640:3:3744 -641:3:3745 -642:3:3753 -643:3:3754 -644:3:3758 -645:3:3759 -646:3:3767 -647:3:3772 -648:3:3776 -649:3:3777 -650:3:3784 -651:3:3785 -652:3:3796 -653:3:3797 -654:3:3798 -655:3:3809 -656:3:3814 -657:3:3815 -658:0:4401 -659:3:3827 -660:0:4401 -661:3:4029 -662:0:4401 -663:3:4127 -664:0:4401 -665:3:4128 -666:0:4401 -667:3:4132 -668:0:4401 -669:3:4138 -670:0:4401 -671:3:4142 -672:3:4143 -673:3:4147 -674:3:4151 -675:3:4152 -676:3:4156 -677:3:4164 -678:3:4165 -679:3:4170 -680:3:4177 -681:3:4178 -682:3:4185 -683:3:4190 -684:0:4401 -685:3:4201 -686:0:4401 -687:3:4205 -688:3:4206 -689:3:4210 -690:3:4214 -691:3:4215 -692:3:4219 -693:3:4227 -694:3:4228 -695:3:4233 -696:3:4240 -697:3:4241 -698:3:4248 -699:3:4253 -700:0:4401 -701:3:4264 -702:0:4401 -703:3:4272 -704:3:4273 -705:3:4277 -706:3:4281 -707:3:4282 -708:3:4286 -709:3:4294 -710:3:4295 -711:3:4300 -712:3:4307 -713:3:4308 -714:3:4315 -715:3:4320 -716:0:4401 -717:3:4335 -718:0:4401 -719:3:4337 -720:0:4401 -721:3:4338 -722:0:4401 -723:3:2486 -724:0:4401 -725:3:2487 -726:3:2491 -727:3:2492 -728:3:2500 -729:3:2501 -730:3:2505 -731:3:2506 -732:3:2514 -733:3:2519 -734:3:2523 -735:3:2524 -736:3:2531 -737:3:2532 -738:3:2543 -739:3:2544 -740:3:2545 -741:3:2556 -742:3:2561 -743:3:2562 -744:0:4401 -745:3:2574 -746:0:4401 -747:3:2576 -748:3:2577 -749:0:4401 -750:3:2581 -751:3:2585 -752:3:2586 -753:3:2594 -754:3:2595 -755:3:2599 -756:3:2600 -757:3:2608 -758:3:2613 -759:3:2614 -760:3:2625 -761:3:2626 -762:3:2637 -763:3:2638 -764:3:2639 -765:3:2650 -766:3:2655 -767:3:2656 -768:0:4401 -769:3:2668 -770:0:4401 -771:3:2670 -772:0:4401 -773:3:2671 -774:0:4401 -775:3:2681 -776:0:4401 -777:3:2682 -778:0:4401 -779:3:2686 -780:3:2687 -781:3:2691 -782:3:2695 -783:3:2696 -784:3:2700 -785:3:2708 -786:3:2709 -787:3:2714 -788:3:2721 -789:3:2722 -790:3:2729 -791:3:2734 -792:0:4401 -793:3:2745 -794:0:4401 -795:3:2749 -796:3:2750 -797:3:2754 -798:3:2758 -799:3:2759 -800:3:2763 -801:3:2771 -802:3:2772 -803:3:2777 -804:3:2784 -805:3:2785 -806:3:2792 -807:3:2797 -808:0:4401 -809:3:2808 -810:0:4401 -811:3:2816 -812:3:2817 -813:3:2821 -814:3:2825 -815:3:2826 -816:3:2830 -817:3:2838 -818:3:2839 -819:3:2844 -820:3:2851 -821:3:2852 -822:3:2859 -823:3:2864 -824:0:4401 -825:3:2879 -826:0:4401 -827:3:2881 -828:0:4401 -829:3:2882 -830:3:2886 -831:3:2887 -832:3:2895 -833:3:2896 -834:3:2900 -835:3:2901 -836:3:2909 -837:3:2914 -838:3:2918 -839:3:2919 -840:3:2926 -841:3:2927 -842:3:2938 -843:3:2939 -844:3:2940 -845:3:2951 -846:3:2956 -847:3:2957 -848:0:4401 -849:3:2969 -850:0:4401 -851:3:2971 -852:0:4401 -853:3:2974 -854:3:2975 -855:3:2987 -856:3:2988 -857:3:2992 -858:3:2993 -859:3:3001 -860:3:3006 -861:3:3010 -862:3:3011 -863:3:3018 -864:3:3019 -865:3:3030 -866:3:3031 -867:3:3032 -868:3:3043 -869:3:3048 -870:3:3049 -871:0:4401 -872:3:3061 -873:0:4401 -874:3:3063 -875:0:4401 -876:3:3064 -877:0:4401 -878:3:3065 -879:0:4401 -880:3:3066 -881:0:4401 -882:3:3067 -883:3:3071 -884:3:3072 -885:3:3080 -886:3:3081 -887:3:3085 -888:3:3086 -889:3:3094 -890:3:3099 -891:3:3103 -892:3:3104 -893:3:3111 -894:3:3112 -895:3:3123 -896:3:3124 -897:3:3125 -898:3:3136 -899:3:3141 -900:3:3142 -901:0:4401 -902:3:3154 -903:0:4401 -904:3:3356 -905:0:4401 -906:3:3454 -907:0:4401 -908:3:3455 -909:0:4401 -910:3:3459 -911:0:4401 -912:3:3465 -913:3:3469 -914:3:3470 -915:3:3478 -916:3:3479 -917:3:3483 -918:3:3484 -919:3:3492 -920:3:3497 -921:3:3501 -922:3:3502 -923:3:3509 -924:3:3510 -925:3:3521 -926:3:3522 -927:3:3523 -928:3:3534 -929:3:3539 -930:3:3540 -931:0:4401 -932:3:3552 -933:0:4401 -934:3:3554 -935:0:4401 -936:3:3555 -937:3:3559 -938:3:3560 -939:3:3568 -940:3:3569 -941:3:3573 -942:3:3574 -943:3:3582 -944:3:3587 -945:3:3591 -946:3:3592 -947:3:3599 -948:3:3600 -949:3:3611 -950:3:3612 -951:3:3613 -952:3:3624 -953:3:3629 -954:3:3630 -955:0:4401 -956:3:3642 -957:0:4401 -958:3:3644 -959:0:4401 -960:3:3647 -961:3:3648 -962:3:3660 -963:3:3661 -964:3:3665 -965:3:3666 -966:3:3674 -967:3:3679 -968:3:3683 -969:3:3684 -970:3:3691 -971:3:3692 -972:3:3703 -973:3:3704 -974:3:3705 -975:3:3716 -976:3:3721 -977:3:3722 -978:0:4401 -979:3:3734 -980:0:4401 -981:3:3736 -982:0:4401 -983:3:3737 -984:0:4401 -985:3:3738 -986:0:4401 -987:3:3739 -988:0:4401 -989:3:3740 -990:3:3744 -991:3:3745 -992:3:3753 -993:3:3754 -994:3:3758 -995:3:3759 -996:3:3767 -997:3:3772 -998:3:3776 -999:3:3777 -1000:3:3784 -1001:3:3785 -1002:3:3796 -1003:3:3797 -1004:3:3798 -1005:3:3809 -1006:3:3814 -1007:3:3815 -1008:0:4401 -1009:3:3827 -1010:0:4401 -1011:3:4029 -1012:0:4401 -1013:3:4127 -1014:0:4401 -1015:3:4128 -1016:0:4401 -1017:3:4132 -1018:0:4401 -1019:3:4138 -1020:0:4401 -1021:3:4142 -1022:3:4143 -1023:3:4147 -1024:3:4151 -1025:3:4152 -1026:3:4156 -1027:3:4164 -1028:3:4165 -1029:3:4170 -1030:3:4177 -1031:3:4178 -1032:3:4185 -1033:3:4190 -1034:0:4401 -1035:3:4201 -1036:0:4401 -1037:3:4205 -1038:3:4206 -1039:3:4210 -1040:3:4214 -1041:3:4215 -1042:3:4219 -1043:3:4227 -1044:3:4228 -1045:3:4233 -1046:3:4240 -1047:3:4241 -1048:3:4248 -1049:3:4253 -1050:0:4401 -1051:3:4264 -1052:0:4401 -1053:3:4272 -1054:3:4273 -1055:3:4277 -1056:3:4281 -1057:3:4282 -1058:3:4286 -1059:3:4294 -1060:3:4295 -1061:3:4300 -1062:3:4307 -1063:3:4308 -1064:3:4315 -1065:3:4320 -1066:0:4401 -1067:3:4335 -1068:0:4401 -1069:3:4337 -1070:0:4401 -1071:3:4338 -1072:0:4401 -1073:3:4341 -1074:0:4401 -1075:3:4346 -1076:0:4401 -1077:2:1236 -1078:0:4401 -1079:3:4347 -1080:0:4401 -1081:2:1242 -1082:0:4401 -1083:3:4346 -1084:0:4401 -1085:2:1243 -1086:0:4401 -1087:3:4347 -1088:0:4401 -1089:2:1244 -1090:0:4401 -1091:3:4346 -1092:0:4401 -1093:2:1245 -1094:0:4401 -1095:3:4347 -1096:0:4401 -1097:1:2 -1098:0:4401 -1099:3:4346 -1100:0:4401 -1101:2:1246 -1102:0:4401 -1103:3:4347 -1104:0:4401 -1105:1:8 -1106:0:4401 -1107:3:4346 -1108:0:4401 -1109:2:1245 -1110:0:4401 -1111:3:4347 -1112:0:4401 -1113:1:9 -1114:0:4401 -1115:3:4346 -1116:0:4401 -1117:2:1246 -1118:0:4401 -1119:3:4347 -1120:0:4401 -1121:1:10 -1122:0:4401 -1123:3:4346 -1124:0:4401 -1125:2:1245 -1126:0:4401 -1127:3:4347 -1128:0:4401 -1129:1:11 -1130:0:4401 -1131:3:4346 -1132:0:4401 -1133:2:1246 -1134:0:4401 -1135:3:4347 -1136:0:4401 -1137:1:14 -1138:0:4401 -1139:3:4346 -1140:0:4401 -1141:2:1245 -1142:0:4401 -1143:3:4347 -1144:0:4401 -1145:1:15 -1146:0:4401 -1147:3:4346 -1148:0:4401 -1149:2:1246 -1150:0:4401 -1151:3:4347 -1152:0:4401 -1153:1:16 -1154:1:20 -1155:1:21 -1156:1:29 -1157:1:30 -1158:1:34 -1159:1:35 -1160:1:43 -1161:1:48 -1162:1:52 -1163:1:53 -1164:1:60 -1165:1:61 -1166:1:72 -1167:1:73 -1168:1:74 -1169:1:85 -1170:1:90 -1171:1:91 -1172:0:4401 -1173:3:4346 -1174:0:4401 -1175:2:1245 -1176:0:4401 -1177:3:4347 -1178:0:4401 -1179:1:103 -1180:0:4401 -1181:3:4346 -1182:0:4401 -1183:2:1246 -1184:0:4401 -1185:3:4347 -1186:0:4401 -1187:2:1247 -1188:0:4401 -1189:3:4346 -1190:0:4401 -1191:2:1253 -1192:0:4401 -1193:3:4347 -1194:0:4401 -1195:2:1254 -1196:0:4399 -1197:3:4346 -1198:0:4405 -1199:3:4347 -1200:0:4405 -1201:2:1257 -1202:0:4405 -1203:3:4346 -1204:0:4405 -1205:2:1258 -1206:0:4405 -1207:3:4347 -1208:0:4405 -1209:2:1259 -1210:2:1263 -1211:2:1264 -1212:2:1272 -1213:2:1273 -1214:2:1277 -1215:2:1278 -1216:2:1286 -1217:2:1291 -1218:2:1295 -1219:2:1296 -1220:2:1303 -1221:2:1304 -1222:2:1315 -1223:2:1316 -1224:2:1317 -1225:2:1328 -1226:2:1333 -1227:2:1334 -1228:0:4405 -1229:3:4346 -1230:0:4405 -1231:2:1346 -1232:0:4405 -1233:3:4347 -1234:0:4405 -1235:2:1347 -1236:0:4405 -1237:3:4346 -1238:0:4405 -1239:1:104 --1:-1:-1 -1240:0:4405 -1241:3:4347 -1242:0:4405 -1243:3:4346 -1244:0:4405 -1245:2:1348 -1246:0:4405 -1247:3:4347 -1248:0:4405 -1249:2:1347 -1250:0:4405 -1251:3:4346 -1252:0:4405 -1253:1:105 -1254:0:4405 -1255:3:4347 -1256:0:4405 -1257:3:4346 -1258:0:4405 -1259:2:1348 -1260:0:4405 -1261:3:4347 -1262:0:4405 -1263:2:1347 -1264:0:4405 -1265:3:4346 -1266:0:4405 -1267:1:104 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.define b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.log b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.log deleted file mode 100644 index 434151a..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.log +++ /dev/null @@ -1,275 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -depth 15: Claim reached state 9 (line 749) -depth 291: Claim reached state 9 (line 748) -Depth= 2677 States= 1e+06 Transitions= 1.57e+07 Memory= 487.932 t= 13.4 R= 7e+04 -Depth= 3023 States= 2e+06 Transitions= 3.19e+07 Memory= 509.709 t= 27.3 R= 7e+04 -Depth= 3610 States= 3e+06 Transitions= 4.84e+07 Memory= 531.486 t= 41.6 R= 7e+04 -pan: resizing hashtable to -w22.. done -Depth= 3956 States= 4e+06 Transitions= 6.63e+07 Memory= 595.029 t= 57 R= 7e+04 -Depth= 3956 States= 5e+06 Transitions= 8.67e+07 Memory= 617.783 t= 74.5 R= 7e+04 -Depth= 3956 States= 6e+06 Transitions= 1.08e+08 Memory= 660.850 t= 93 R= 6e+04 -Depth= 3956 States= 7e+06 Transitions= 1.28e+08 Memory= 690.928 t= 110 R= 6e+04 -Depth= 3956 States= 8e+06 Transitions= 1.51e+08 Memory= 729.600 t= 129 R= 6e+04 -Depth= 3956 States= 9e+06 Transitions= 1.7e+08 Memory= 765.830 t= 146 R= 6e+04 -pan: resizing hashtable to -w24.. done -Depth= 3956 States= 1e+07 Transitions= 1.92e+08 Memory= 919.611 t= 166 R= 6e+04 -Depth= 3956 States= 1.1e+07 Transitions= 2.13e+08 Memory= 958.576 t= 183 R= 6e+04 -Depth= 3956 States= 1.2e+07 Transitions= 2.33e+08 Memory= 985.627 t= 201 R= 6e+04 -Depth= 3956 States= 1.3e+07 Transitions= 2.55e+08 Memory= 1027.033 t= 220 R= 6e+04 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 3956, errors: 0 - 7045896 states, stored (1.35792e+07 visited) -2.5326206e+08 states, matched -2.668413e+08 transitions (= visited+matched) -9.9425626e+08 atomic steps -hash conflicts: 65494104 (resolved) - -Stats on memory usage (in Megabytes): - 564.437 equivalent memory usage for states (stored*(State-vector + overhead)) - 465.758 actual memory usage for states (compression: 82.52%) - state-vector as stored = 41 byte + 28 byte overhead - 128.000 memory used for hash table (-w24) - 457.764 memory used for DFS stack (-m10000000) - 1051.350 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 151, "(1)" - line 418, "pan.___", state 181, "(1)" - line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 242, "(1)" - line 418, "pan.___", state 272, "(1)" - line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 360, "(1)" - line 418, "pan.___", state 390, "(1)" - line 540, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 59, "(1)" - line 413, "pan.___", state 72, "(1)" - line 418, "pan.___", state 89, "(1)" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 240, "(1)" - line 164, "pan.___", state 248, "(1)" - line 168, "pan.___", state 260, "(1)" - line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 927, "(1)" - line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 928, "else" - line 409, "pan.___", state 931, "(1)" - line 409, "pan.___", state 932, "(1)" - line 409, "pan.___", state 932, "(1)" - line 413, "pan.___", state 940, "(1)" - line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 941, "else" - line 413, "pan.___", state 944, "(1)" - line 413, "pan.___", state 945, "(1)" - line 413, "pan.___", state 945, "(1)" - line 411, "pan.___", state 950, "((i<1))" - line 411, "pan.___", state 950, "((i>=1))" - line 418, "pan.___", state 957, "(1)" - line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 958, "else" - line 418, "pan.___", state 961, "(1)" - line 418, "pan.___", state 962, "(1)" - line 418, "pan.___", state 962, "(1)" - line 420, "pan.___", state 965, "(1)" - line 420, "pan.___", state 965, "(1)" - line 403, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1040, "(1)" - line 418, "pan.___", state 1057, "(1)" - line 403, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1130, "(1)" - line 418, "pan.___", state 1147, "(1)" - line 399, "pan.___", state 1166, "(1)" - line 403, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1222, "(1)" - line 418, "pan.___", state 1239, "(1)" - line 403, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1315, "(1)" - line 418, "pan.___", state 1332, "(1)" - line 179, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 1378, "(1)" - line 164, "pan.___", state 1386, "(1)" - line 168, "pan.___", state 1398, "(1)" - line 175, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1595, "(1)" - line 409, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 1596, "else" - line 409, "pan.___", state 1599, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 413, "pan.___", state 1608, "(1)" - line 413, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 1609, "else" - line 413, "pan.___", state 1612, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 411, "pan.___", state 1618, "((i<1))" - line 411, "pan.___", state 1618, "((i>=1))" - line 418, "pan.___", state 1625, "(1)" - line 418, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 1626, "else" - line 418, "pan.___", state 1629, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 179, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 1681, "(1)" - line 164, "pan.___", state 1689, "(1)" - line 168, "pan.___", state 1701, "(1)" - line 175, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.spin.input.trail deleted file mode 100644 index e65d663..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer.spin.input.trail +++ /dev/null @@ -1,9 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2679 -2:1:2673 -3:1:2674 -4:1:2675 -5:1:2676 -6:0:2685 -7:5:1129 diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.define b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.log b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.log deleted file mode 100644 index 7fafb9e..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.log +++ /dev/null @@ -1,514 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer_error.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 745) -depth 15: Claim reached state 9 (line 750) -depth 291: Claim reached state 9 (line 749) -pan: acceptance cycle (at depth 4308) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 4820, errors: 1 - 62091 states, stored (169917 visited) - 2179326 states, matched - 2349243 transitions (= visited+matched) - 8805349 atomic steps -hash conflicts: 50953 (resolved) - -Stats on memory usage (in Megabytes): - 4.974 equivalent memory usage for states (stored*(State-vector + overhead)) - 4.145 actual memory usage for states (compression: 83.33%) - state-vector as stored = 42 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 469.865 total actual memory usage - -unreached in proctype urcu_reader - line 400, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 61, "(1)" - line 419, "pan.___", state 91, "(1)" - line 400, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 151, "(1)" - line 419, "pan.___", state 181, "(1)" - line 400, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 242, "(1)" - line 419, "pan.___", state 272, "(1)" - line 400, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 360, "(1)" - line 419, "pan.___", state 390, "(1)" - line 541, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 400, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 20, "(1)" - line 404, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 34, "(1)" - line 404, "pan.___", state 35, "(1)" - line 404, "pan.___", state 35, "(1)" - line 402, "pan.___", state 40, "((i<1))" - line 402, "pan.___", state 40, "((i>=1))" - line 409, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 59, "(1)" - line 410, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 60, "else" - line 410, "pan.___", state 63, "(1)" - line 410, "pan.___", state 64, "(1)" - line 410, "pan.___", state 64, "(1)" - line 414, "pan.___", state 72, "(1)" - line 414, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 73, "else" - line 414, "pan.___", state 76, "(1)" - line 414, "pan.___", state 77, "(1)" - line 414, "pan.___", state 77, "(1)" - line 412, "pan.___", state 82, "((i<1))" - line 412, "pan.___", state 82, "((i>=1))" - line 419, "pan.___", state 89, "(1)" - line 419, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 90, "else" - line 419, "pan.___", state 93, "(1)" - line 419, "pan.___", state 94, "(1)" - line 419, "pan.___", state 94, "(1)" - line 370, "pan.___", state 99, "(1)" - line 640, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" - line 638, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" - line 400, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 114, "(1)" - line 404, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 128, "(1)" - line 404, "pan.___", state 129, "(1)" - line 404, "pan.___", state 129, "(1)" - line 402, "pan.___", state 134, "((i<1))" - line 402, "pan.___", state 134, "((i>=1))" - line 410, "pan.___", state 153, "(1)" - line 410, "pan.___", state 154, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 154, "else" - line 410, "pan.___", state 157, "(1)" - line 410, "pan.___", state 158, "(1)" - line 410, "pan.___", state 158, "(1)" - line 414, "pan.___", state 166, "(1)" - line 414, "pan.___", state 167, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 167, "else" - line 414, "pan.___", state 170, "(1)" - line 414, "pan.___", state 171, "(1)" - line 414, "pan.___", state 171, "(1)" - line 412, "pan.___", state 176, "((i<1))" - line 412, "pan.___", state 176, "((i>=1))" - line 419, "pan.___", state 183, "(1)" - line 419, "pan.___", state 184, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 184, "else" - line 419, "pan.___", state 187, "(1)" - line 419, "pan.___", state 188, "(1)" - line 419, "pan.___", state 188, "(1)" - line 421, "pan.___", state 191, "(1)" - line 421, "pan.___", state 191, "(1)" - line 370, "pan.___", state 193, "(1)" - line 653, "pan.___", state 199, "(1)" - line 647, "pan.___", state 202, "((write_lock==0))" - line 647, "pan.___", state 202, "else" - line 645, "pan.___", state 203, "(1)" - line 176, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 180, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 178, "pan.___", state 225, "((j<1))" - line 178, "pan.___", state 225, "((j>=1))" - line 184, "pan.___", state 230, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 161, "pan.___", state 240, "(1)" - line 165, "pan.___", state 248, "(1)" - line 165, "pan.___", state 249, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 165, "pan.___", state 249, "else" - line 163, "pan.___", state 254, "((j<1))" - line 163, "pan.___", state 254, "((j>=1))" - line 169, "pan.___", state 260, "(1)" - line 169, "pan.___", state 261, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 169, "pan.___", state 261, "else" - line 171, "pan.___", state 264, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 171, "pan.___", state 264, "else" - line 176, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 184, "pan.___", state 293, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 169, "pan.___", state 323, "(1)" - line 169, "pan.___", state 324, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 176, "pan.___", state 338, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 180, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 178, "pan.___", state 355, "((j<1))" - line 178, "pan.___", state 355, "((j>=1))" - line 184, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 161, "pan.___", state 370, "(1)" - line 165, "pan.___", state 378, "(1)" - line 165, "pan.___", state 379, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 165, "pan.___", state 379, "else" - line 163, "pan.___", state 384, "((j<1))" - line 163, "pan.___", state 384, "((j>=1))" - line 169, "pan.___", state 390, "(1)" - line 169, "pan.___", state 391, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 169, "pan.___", state 391, "else" - line 171, "pan.___", state 394, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 171, "pan.___", state 394, "else" - line 400, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 410, "(1)" - line 404, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 424, "(1)" - line 404, "pan.___", state 425, "(1)" - line 404, "pan.___", state 425, "(1)" - line 402, "pan.___", state 430, "((i<1))" - line 402, "pan.___", state 430, "((i>=1))" - line 409, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 449, "(1)" - line 410, "pan.___", state 450, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 450, "else" - line 410, "pan.___", state 453, "(1)" - line 410, "pan.___", state 454, "(1)" - line 410, "pan.___", state 454, "(1)" - line 414, "pan.___", state 462, "(1)" - line 414, "pan.___", state 463, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 463, "else" - line 414, "pan.___", state 466, "(1)" - line 414, "pan.___", state 467, "(1)" - line 414, "pan.___", state 467, "(1)" - line 412, "pan.___", state 472, "((i<1))" - line 412, "pan.___", state 472, "((i>=1))" - line 419, "pan.___", state 479, "(1)" - line 419, "pan.___", state 480, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 480, "else" - line 419, "pan.___", state 483, "(1)" - line 419, "pan.___", state 484, "(1)" - line 419, "pan.___", state 484, "(1)" - line 421, "pan.___", state 487, "(1)" - line 421, "pan.___", state 487, "(1)" - line 370, "pan.___", state 489, "(1)" - line 662, "pan.___", state 492, "cached_urcu_gp_ctr.val[_pid] = (tmp^(1<<7))" - line 400, "pan.___", state 498, "(1)" - line 400, "pan.___", state 499, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 499, "else" - line 400, "pan.___", state 502, "(1)" - line 404, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 516, "(1)" - line 404, "pan.___", state 517, "(1)" - line 404, "pan.___", state 517, "(1)" - line 402, "pan.___", state 522, "((i<1))" - line 402, "pan.___", state 522, "((i>=1))" - line 409, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 541, "(1)" - line 410, "pan.___", state 542, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 542, "else" - line 410, "pan.___", state 545, "(1)" - line 410, "pan.___", state 546, "(1)" - line 410, "pan.___", state 546, "(1)" - line 414, "pan.___", state 554, "(1)" - line 414, "pan.___", state 555, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 555, "else" - line 414, "pan.___", state 558, "(1)" - line 414, "pan.___", state 559, "(1)" - line 414, "pan.___", state 559, "(1)" - line 412, "pan.___", state 564, "((i<1))" - line 412, "pan.___", state 564, "((i>=1))" - line 419, "pan.___", state 571, "(1)" - line 419, "pan.___", state 572, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 572, "else" - line 419, "pan.___", state 575, "(1)" - line 419, "pan.___", state 576, "(1)" - line 419, "pan.___", state 576, "(1)" - line 421, "pan.___", state 579, "(1)" - line 421, "pan.___", state 579, "(1)" - line 370, "pan.___", state 581, "(1)" - line 400, "pan.___", state 589, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 595, "(1)" - line 404, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 609, "(1)" - line 404, "pan.___", state 610, "(1)" - line 404, "pan.___", state 610, "(1)" - line 402, "pan.___", state 615, "((i<1))" - line 402, "pan.___", state 615, "((i>=1))" - line 409, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 634, "(1)" - line 410, "pan.___", state 635, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 635, "else" - line 410, "pan.___", state 638, "(1)" - line 410, "pan.___", state 639, "(1)" - line 410, "pan.___", state 639, "(1)" - line 414, "pan.___", state 647, "(1)" - line 414, "pan.___", state 648, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 648, "else" - line 414, "pan.___", state 651, "(1)" - line 414, "pan.___", state 652, "(1)" - line 414, "pan.___", state 652, "(1)" - line 412, "pan.___", state 657, "((i<1))" - line 412, "pan.___", state 657, "((i>=1))" - line 419, "pan.___", state 664, "(1)" - line 419, "pan.___", state 665, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 665, "else" - line 419, "pan.___", state 668, "(1)" - line 419, "pan.___", state 669, "(1)" - line 419, "pan.___", state 669, "(1)" - line 421, "pan.___", state 672, "(1)" - line 421, "pan.___", state 672, "(1)" - line 370, "pan.___", state 674, "(1)" - line 400, "pan.___", state 679, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 681, "(1)" - line 400, "pan.___", state 682, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 682, "else" - line 400, "pan.___", state 685, "(1)" - line 404, "pan.___", state 693, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 695, "(1)" - line 404, "pan.___", state 696, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 404, "pan.___", state 696, "else" - line 404, "pan.___", state 699, "(1)" - line 404, "pan.___", state 700, "(1)" - line 404, "pan.___", state 700, "(1)" - line 402, "pan.___", state 705, "((i<1))" - line 402, "pan.___", state 705, "((i>=1))" - line 409, "pan.___", state 711, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 724, "(1)" - line 410, "pan.___", state 725, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 725, "else" - line 410, "pan.___", state 728, "(1)" - line 410, "pan.___", state 729, "(1)" - line 410, "pan.___", state 729, "(1)" - line 414, "pan.___", state 737, "(1)" - line 414, "pan.___", state 738, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 738, "else" - line 414, "pan.___", state 741, "(1)" - line 414, "pan.___", state 742, "(1)" - line 414, "pan.___", state 742, "(1)" - line 412, "pan.___", state 747, "((i<1))" - line 412, "pan.___", state 747, "((i>=1))" - line 419, "pan.___", state 754, "(1)" - line 419, "pan.___", state 755, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 755, "else" - line 419, "pan.___", state 758, "(1)" - line 419, "pan.___", state 759, "(1)" - line 419, "pan.___", state 759, "(1)" - line 421, "pan.___", state 762, "(1)" - line 421, "pan.___", state 762, "(1)" - line 370, "pan.___", state 764, "(1)" - line 430, "pan.___", state 767, "(((tmp2&((1<<7)-1))&&((tmp2^cached_urcu_gp_ctr.val[_pid])&(1<<7))))" - line 430, "pan.___", state 767, "else" - line 400, "pan.___", state 777, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 779, "(1)" - line 400, "pan.___", state 780, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 780, "else" - line 400, "pan.___", state 783, "(1)" - line 404, "pan.___", state 791, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 793, "(1)" - line 404, "pan.___", state 794, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 404, "pan.___", state 794, "else" - line 404, "pan.___", state 797, "(1)" - line 404, "pan.___", state 798, "(1)" - line 404, "pan.___", state 798, "(1)" - line 402, "pan.___", state 803, "((i<1))" - line 402, "pan.___", state 803, "((i>=1))" - line 409, "pan.___", state 809, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 822, "(1)" - line 410, "pan.___", state 823, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 823, "else" - line 410, "pan.___", state 826, "(1)" - line 410, "pan.___", state 827, "(1)" - line 410, "pan.___", state 827, "(1)" - line 414, "pan.___", state 835, "(1)" - line 414, "pan.___", state 836, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 836, "else" - line 414, "pan.___", state 839, "(1)" - line 414, "pan.___", state 840, "(1)" - line 414, "pan.___", state 840, "(1)" - line 412, "pan.___", state 845, "((i<1))" - line 412, "pan.___", state 845, "((i>=1))" - line 419, "pan.___", state 852, "(1)" - line 419, "pan.___", state 853, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 853, "else" - line 419, "pan.___", state 856, "(1)" - line 419, "pan.___", state 857, "(1)" - line 419, "pan.___", state 857, "(1)" - line 421, "pan.___", state 860, "(1)" - line 421, "pan.___", state 860, "(1)" - line 370, "pan.___", state 862, "(1)" - line 449, "pan.___", state 870, "((tmp<1))" - line 449, "pan.___", state 870, "((tmp>=1))" - line 462, "pan.___", state 873, "tmp = 0" - line 400, "pan.___", state 877, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 883, "(1)" - line 404, "pan.___", state 891, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 897, "(1)" - line 404, "pan.___", state 898, "(1)" - line 404, "pan.___", state 898, "(1)" - line 402, "pan.___", state 903, "((i<1))" - line 402, "pan.___", state 903, "((i>=1))" - line 409, "pan.___", state 909, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 922, "(1)" - line 410, "pan.___", state 923, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 923, "else" - line 410, "pan.___", state 926, "(1)" - line 410, "pan.___", state 927, "(1)" - line 410, "pan.___", state 927, "(1)" - line 414, "pan.___", state 935, "(1)" - line 414, "pan.___", state 936, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 936, "else" - line 414, "pan.___", state 939, "(1)" - line 414, "pan.___", state 940, "(1)" - line 414, "pan.___", state 940, "(1)" - line 412, "pan.___", state 945, "((i<1))" - line 412, "pan.___", state 945, "((i>=1))" - line 419, "pan.___", state 952, "(1)" - line 419, "pan.___", state 953, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 953, "else" - line 419, "pan.___", state 956, "(1)" - line 419, "pan.___", state 957, "(1)" - line 419, "pan.___", state 957, "(1)" - line 421, "pan.___", state 960, "(1)" - line 421, "pan.___", state 960, "(1)" - line 370, "pan.___", state 962, "(1)" - line 671, "pan.___", state 963, "tmp = cached_urcu_gp_ctr.val[_pid]" - line 400, "pan.___", state 967, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 973, "(1)" - line 404, "pan.___", state 981, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 987, "(1)" - line 404, "pan.___", state 988, "(1)" - line 404, "pan.___", state 988, "(1)" - line 402, "pan.___", state 993, "((i<1))" - line 402, "pan.___", state 993, "((i>=1))" - line 409, "pan.___", state 999, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 1012, "(1)" - line 410, "pan.___", state 1013, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 1013, "else" - line 410, "pan.___", state 1016, "(1)" - line 410, "pan.___", state 1017, "(1)" - line 410, "pan.___", state 1017, "(1)" - line 414, "pan.___", state 1025, "(1)" - line 414, "pan.___", state 1026, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 1026, "else" - line 414, "pan.___", state 1029, "(1)" - line 414, "pan.___", state 1030, "(1)" - line 414, "pan.___", state 1030, "(1)" - line 412, "pan.___", state 1035, "((i<1))" - line 412, "pan.___", state 1035, "((i>=1))" - line 419, "pan.___", state 1042, "(1)" - line 419, "pan.___", state 1043, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 1043, "else" - line 419, "pan.___", state 1046, "(1)" - line 419, "pan.___", state 1047, "(1)" - line 419, "pan.___", state 1047, "(1)" - line 421, "pan.___", state 1050, "(1)" - line 421, "pan.___", state 1050, "(1)" - line 370, "pan.___", state 1052, "(1)" - line 400, "pan.___", state 1061, "(1)" - line 404, "pan.___", state 1073, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1091, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1117, "(1)" - line 419, "pan.___", state 1134, "(1)" - line 404, "pan.___", state 1166, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1184, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1210, "(1)" - line 419, "pan.___", state 1227, "(1)" - line 400, "pan.___", state 1242, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 1256, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1274, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 1287, "(1)" - line 414, "pan.___", state 1300, "(1)" - line 419, "pan.___", state 1317, "(1)" - line 400, "pan.___", state 1340, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 1342, "(1)" - line 400, "pan.___", state 1343, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 1343, "else" - line 400, "pan.___", state 1346, "(1)" - line 404, "pan.___", state 1354, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 1356, "(1)" - line 404, "pan.___", state 1357, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 404, "pan.___", state 1357, "else" - line 404, "pan.___", state 1360, "(1)" - line 404, "pan.___", state 1361, "(1)" - line 404, "pan.___", state 1361, "(1)" - line 402, "pan.___", state 1366, "((i<1))" - line 402, "pan.___", state 1366, "((i>=1))" - line 409, "pan.___", state 1372, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 1385, "(1)" - line 410, "pan.___", state 1386, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 1386, "else" - line 410, "pan.___", state 1389, "(1)" - line 410, "pan.___", state 1390, "(1)" - line 410, "pan.___", state 1390, "(1)" - line 414, "pan.___", state 1398, "(1)" - line 414, "pan.___", state 1399, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 1399, "else" - line 414, "pan.___", state 1402, "(1)" - line 414, "pan.___", state 1403, "(1)" - line 414, "pan.___", state 1403, "(1)" - line 412, "pan.___", state 1408, "((i<1))" - line 412, "pan.___", state 1408, "((i>=1))" - line 419, "pan.___", state 1415, "(1)" - line 419, "pan.___", state 1416, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 1416, "else" - line 419, "pan.___", state 1419, "(1)" - line 419, "pan.___", state 1420, "(1)" - line 419, "pan.___", state 1420, "(1)" - line 421, "pan.___", state 1423, "(1)" - line 421, "pan.___", state 1423, "(1)" - line 180, "pan.___", state 1448, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 184, "pan.___", state 1461, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 161, "pan.___", state 1471, "(1)" - line 165, "pan.___", state 1479, "(1)" - line 169, "pan.___", state 1491, "(1)" - line 176, "pan.___", state 1502, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.spin.input.trail deleted file mode 100644 index 5bb8316..0000000 --- a/formal-model/urcu/result-standard-execution-nest/urcu_progress_writer_error.spin.input.trail +++ /dev/null @@ -1,4823 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2108 -2:3:2060 -3:3:2063 -4:3:2063 -5:3:2066 -6:3:2074 -7:3:2074 -8:3:2077 -9:3:2083 -10:3:2087 -11:3:2087 -12:3:2090 -13:3:2098 -14:3:2102 -15:3:2103 -16:0:2108 -17:3:2105 -18:0:2108 -19:2:416 -20:0:2108 -21:2:422 -22:0:2108 -23:2:423 -24:0:2108 -25:2:424 -26:2:428 -27:2:429 -28:2:437 -29:2:438 -30:2:442 -31:2:443 -32:2:451 -33:2:456 -34:2:460 -35:2:461 -36:2:468 -37:2:469 -38:2:480 -39:2:481 -40:2:482 -41:2:493 -42:2:498 -43:2:499 -44:0:2106 -45:2:511 -46:0:2112 -47:2:513 -48:2:514 -49:0:2112 -50:2:518 -51:2:522 -52:2:523 -53:2:531 -54:2:532 -55:2:536 -56:2:537 -57:2:545 -58:2:550 -59:2:551 -60:2:562 -61:2:563 -62:2:574 -63:2:575 -64:2:576 -65:2:587 -66:2:592 -67:2:593 -68:0:2112 -69:2:605 -70:0:2112 -71:2:607 -72:0:2112 -73:2:608 -74:0:2112 -75:2:618 -76:0:2112 -77:2:622 -78:2:623 -79:2:627 -80:2:631 -81:2:632 -82:2:636 -83:2:644 -84:2:645 -85:2:650 -86:2:657 -87:2:658 -88:2:665 -89:2:670 -90:0:2112 -91:2:681 -92:0:2112 -93:2:685 -94:2:686 -95:2:690 -96:2:694 -97:2:695 -98:2:699 -99:2:707 -100:2:708 -101:2:713 -102:2:720 -103:2:721 -104:2:728 -105:2:733 -106:0:2112 -107:2:744 -108:0:2112 -109:2:752 -110:2:753 -111:2:757 -112:2:761 -113:2:762 -114:2:766 -115:2:774 -116:2:775 -117:2:780 -118:2:787 -119:2:788 -120:2:795 -121:2:800 -122:0:2112 -123:2:811 -124:0:2112 -125:2:813 -126:0:2112 -127:2:814 -128:2:818 -129:2:819 -130:2:827 -131:2:828 -132:2:832 -133:2:833 -134:2:841 -135:2:846 -136:2:850 -137:2:851 -138:2:858 -139:2:859 -140:2:870 -141:2:871 -142:2:872 -143:2:883 -144:2:888 -145:2:889 -146:0:2112 -147:2:901 -148:0:2112 -149:2:903 -150:0:2112 -151:2:906 -152:2:907 -153:2:919 -154:2:920 -155:2:924 -156:2:925 -157:2:933 -158:2:938 -159:2:942 -160:2:943 -161:2:950 -162:2:951 -163:2:962 -164:2:963 -165:2:964 -166:2:975 -167:2:980 -168:2:981 -169:0:2112 -170:2:993 -171:0:2112 -172:2:995 -173:0:2112 -174:2:996 -175:0:2112 -176:2:997 -177:0:2112 -178:2:998 -179:0:2112 -180:2:999 -181:2:1003 -182:2:1004 -183:2:1012 -184:2:1013 -185:2:1017 -186:2:1018 -187:2:1026 -188:2:1031 -189:2:1035 -190:2:1036 -191:2:1043 -192:2:1044 -193:2:1055 -194:2:1056 -195:2:1057 -196:2:1068 -197:2:1073 -198:2:1074 -199:0:2112 -200:2:1086 -201:0:2112 -202:2:1178 -203:0:2112 -204:2:1276 -205:0:2112 -206:2:1277 -207:0:2112 -208:2:1281 -209:0:2112 -210:2:1287 -211:2:1291 -212:2:1292 -213:2:1300 -214:2:1301 -215:2:1305 -216:2:1306 -217:2:1314 -218:2:1319 -219:2:1323 -220:2:1324 -221:2:1331 -222:2:1332 -223:2:1343 -224:2:1344 -225:2:1345 -226:2:1356 -227:2:1361 -228:2:1362 -229:0:2112 -230:2:1374 -231:0:2112 -232:2:1376 -233:0:2112 -234:2:1377 -235:2:1381 -236:2:1382 -237:2:1390 -238:2:1391 -239:2:1395 -240:2:1396 -241:2:1404 -242:2:1409 -243:2:1413 -244:2:1414 -245:2:1421 -246:2:1422 -247:2:1433 -248:2:1434 -249:2:1435 -250:2:1446 -251:2:1451 -252:2:1452 -253:0:2112 -254:2:1464 -255:0:2112 -256:2:1466 -257:0:2112 -258:1:2 -259:0:2112 -260:1:8 -261:0:2112 -262:1:9 -263:0:2112 -264:1:10 -265:0:2112 -266:1:11 -267:0:2112 -268:1:12 -269:1:16 -270:1:17 -271:1:25 -272:1:26 -273:1:30 -274:1:31 -275:1:39 -276:1:44 -277:1:48 -278:1:49 -279:1:56 -280:1:57 -281:1:68 -282:1:69 -283:1:70 -284:1:81 -285:1:86 -286:1:87 -287:0:2112 -288:1:99 -289:0:2112 -290:1:101 -291:0:2112 -292:1:102 -293:1:106 -294:1:107 -295:1:115 -296:1:116 -297:1:120 -298:1:121 -299:1:129 -300:1:134 -301:1:138 -302:1:139 -303:1:146 -304:1:147 -305:1:158 -306:1:159 -307:1:160 -308:1:171 -309:1:176 -310:1:177 -311:0:2112 -312:1:189 -313:0:2112 -314:1:191 -315:0:2112 -316:1:192 -317:0:2112 -318:1:193 -319:1:197 -320:1:198 -321:1:206 -322:1:207 -323:1:211 -324:1:212 -325:1:220 -326:1:225 -327:1:229 -328:1:230 -329:1:237 -330:1:238 -331:1:249 -332:1:250 -333:1:251 -334:1:262 -335:1:267 -336:1:268 -337:0:2112 -338:1:280 -339:0:2112 -340:1:282 -341:0:2112 -342:1:291 -343:0:2112 -344:1:293 -345:0:2112 -346:1:11 -347:0:2112 -348:1:12 -349:1:16 -350:1:17 -351:1:25 -352:1:26 -353:1:27 -354:1:39 -355:1:44 -356:1:48 -357:1:49 -358:1:56 -359:1:57 -360:1:68 -361:1:69 -362:1:70 -363:1:81 -364:1:86 -365:1:87 -366:0:2112 -367:1:99 -368:0:2112 -369:2:1469 -370:2:1470 -371:2:1482 -372:2:1483 -373:2:1487 -374:2:1488 -375:2:1496 -376:2:1501 -377:2:1505 -378:2:1506 -379:2:1513 -380:2:1514 -381:2:1525 -382:2:1526 -383:2:1527 -384:2:1538 -385:2:1543 -386:2:1544 -387:0:2112 -388:2:1556 -389:0:2112 -390:2:1558 -391:0:2112 -392:2:1559 -393:0:2112 -394:2:1560 -395:0:2112 -396:2:1561 -397:0:2112 -398:2:1562 -399:2:1566 -400:2:1567 -401:2:1575 -402:2:1576 -403:2:1580 -404:2:1581 -405:2:1589 -406:2:1594 -407:2:1598 -408:2:1599 -409:2:1606 -410:2:1607 -411:2:1618 -412:2:1619 -413:2:1620 -414:2:1631 -415:2:1636 -416:2:1637 -417:0:2112 -418:2:1649 -419:0:2112 -420:2:1651 -421:0:2112 -422:2:1652 -423:2:1656 -424:2:1657 -425:2:1665 -426:2:1666 -427:2:1670 -428:2:1671 -429:2:1679 -430:2:1684 -431:2:1688 -432:2:1689 -433:2:1696 -434:2:1697 -435:2:1708 -436:2:1709 -437:2:1710 -438:2:1721 -439:2:1726 -440:2:1727 -441:0:2112 -442:2:1739 -443:0:2112 -444:1:101 -445:0:2112 -446:2:1560 -447:0:2112 -448:2:1561 -449:0:2112 -450:2:1562 -451:2:1566 -452:2:1567 -453:2:1575 -454:2:1576 -455:2:1580 -456:2:1581 -457:2:1589 -458:2:1594 -459:2:1598 -460:2:1599 -461:2:1606 -462:2:1607 -463:2:1618 -464:2:1619 -465:2:1620 -466:2:1631 -467:2:1636 -468:2:1637 -469:0:2112 -470:2:1649 -471:0:2112 -472:2:1651 -473:0:2112 -474:2:1652 -475:2:1656 -476:2:1657 -477:2:1665 -478:2:1666 -479:2:1670 -480:2:1671 -481:2:1679 -482:2:1684 -483:2:1688 -484:2:1689 -485:2:1696 -486:2:1697 -487:2:1708 -488:2:1709 -489:2:1710 -490:2:1721 -491:2:1726 -492:2:1727 -493:0:2112 -494:2:1739 -495:0:2112 -496:1:102 -497:1:106 -498:1:107 -499:1:115 -500:1:116 -501:1:120 -502:1:121 -503:1:129 -504:1:134 -505:1:138 -506:1:139 -507:1:146 -508:1:147 -509:1:158 -510:1:159 -511:1:160 -512:1:171 -513:1:176 -514:1:177 -515:0:2112 -516:2:1560 -517:0:2112 -518:1:189 -519:0:2112 -520:1:285 -521:0:2112 -522:2:1561 -523:0:2112 -524:2:1562 -525:2:1566 -526:2:1567 -527:2:1575 -528:2:1576 -529:2:1580 -530:2:1581 -531:2:1589 -532:2:1594 -533:2:1598 -534:2:1599 -535:2:1606 -536:2:1607 -537:2:1618 -538:2:1619 -539:2:1620 -540:2:1631 -541:2:1636 -542:2:1637 -543:0:2112 -544:2:1649 -545:0:2112 -546:2:1651 -547:0:2112 -548:2:1652 -549:2:1656 -550:2:1657 -551:2:1665 -552:2:1666 -553:2:1670 -554:2:1671 -555:2:1679 -556:2:1684 -557:2:1688 -558:2:1689 -559:2:1696 -560:2:1697 -561:2:1708 -562:2:1709 -563:2:1710 -564:2:1721 -565:2:1726 -566:2:1727 -567:0:2112 -568:2:1739 -569:0:2112 -570:2:1560 -571:0:2112 -572:1:286 -573:0:2112 -574:1:291 -575:0:2112 -576:1:293 -577:0:2112 -578:1:296 -579:0:2112 -580:2:1561 -581:0:2112 -582:2:1562 -583:2:1566 -584:2:1567 -585:2:1575 -586:2:1576 -587:2:1580 -588:2:1581 -589:2:1589 -590:2:1594 -591:2:1598 -592:2:1599 -593:2:1606 -594:2:1607 -595:2:1618 -596:2:1619 -597:2:1620 -598:2:1631 -599:2:1636 -600:2:1637 -601:0:2112 -602:2:1649 -603:0:2112 -604:2:1651 -605:0:2112 -606:2:1652 -607:2:1656 -608:2:1657 -609:2:1665 -610:2:1666 -611:2:1670 -612:2:1671 -613:2:1679 -614:2:1684 -615:2:1688 -616:2:1689 -617:2:1696 -618:2:1697 -619:2:1708 -620:2:1709 -621:2:1710 -622:2:1721 -623:2:1726 -624:2:1727 -625:0:2112 -626:2:1739 -627:0:2112 -628:2:1560 -629:0:2112 -630:1:301 -631:0:2112 -632:2:1561 -633:0:2112 -634:2:1562 -635:2:1566 -636:2:1567 -637:2:1575 -638:2:1576 -639:2:1580 -640:2:1581 -641:2:1589 -642:2:1594 -643:2:1598 -644:2:1599 -645:2:1606 -646:2:1607 -647:2:1618 -648:2:1619 -649:2:1620 -650:2:1631 -651:2:1636 -652:2:1637 -653:0:2112 -654:2:1649 -655:0:2112 -656:2:1651 -657:0:2112 -658:2:1652 -659:2:1656 -660:2:1657 -661:2:1665 -662:2:1666 -663:2:1670 -664:2:1671 -665:2:1679 -666:2:1684 -667:2:1688 -668:2:1689 -669:2:1696 -670:2:1697 -671:2:1708 -672:2:1709 -673:2:1710 -674:2:1721 -675:2:1726 -676:2:1727 -677:0:2112 -678:2:1739 -679:0:2112 -680:2:1560 -681:0:2112 -682:1:302 -683:0:2112 -684:2:1561 -685:0:2112 -686:2:1562 -687:2:1566 -688:2:1567 -689:2:1575 -690:2:1576 -691:2:1580 -692:2:1581 -693:2:1589 -694:2:1594 -695:2:1598 -696:2:1599 -697:2:1606 -698:2:1607 -699:2:1618 -700:2:1619 -701:2:1620 -702:2:1631 -703:2:1636 -704:2:1637 -705:0:2112 -706:2:1649 -707:0:2112 -708:2:1651 -709:0:2112 -710:2:1652 -711:2:1656 -712:2:1657 -713:2:1665 -714:2:1666 -715:2:1670 -716:2:1671 -717:2:1679 -718:2:1684 -719:2:1688 -720:2:1689 -721:2:1696 -722:2:1697 -723:2:1708 -724:2:1709 -725:2:1710 -726:2:1721 -727:2:1726 -728:2:1727 -729:0:2112 -730:2:1739 -731:0:2112 -732:2:1560 -733:0:2112 -734:1:303 -735:0:2112 -736:1:304 -737:0:2112 -738:1:305 -739:0:2112 -740:1:306 -741:0:2112 -742:1:308 -743:0:2112 -744:2:1561 -745:0:2112 -746:2:1562 -747:2:1566 -748:2:1567 -749:2:1575 -750:2:1576 -751:2:1580 -752:2:1581 -753:2:1589 -754:2:1594 -755:2:1598 -756:2:1599 -757:2:1606 -758:2:1607 -759:2:1618 -760:2:1619 -761:2:1620 -762:2:1631 -763:2:1636 -764:2:1637 -765:0:2112 -766:2:1649 -767:0:2112 -768:2:1651 -769:0:2112 -770:2:1652 -771:2:1656 -772:2:1657 -773:2:1665 -774:2:1666 -775:2:1670 -776:2:1671 -777:2:1679 -778:2:1684 -779:2:1688 -780:2:1689 -781:2:1696 -782:2:1697 -783:2:1708 -784:2:1709 -785:2:1710 -786:2:1721 -787:2:1726 -788:2:1727 -789:0:2112 -790:2:1739 -791:0:2112 -792:2:1560 -793:0:2112 -794:1:310 -795:0:2112 -796:2:1561 -797:0:2112 -798:2:1562 -799:2:1566 -800:2:1567 -801:2:1575 -802:2:1576 -803:2:1580 -804:2:1581 -805:2:1589 -806:2:1594 -807:2:1598 -808:2:1599 -809:2:1606 -810:2:1607 -811:2:1618 -812:2:1619 -813:2:1620 -814:2:1631 -815:2:1636 -816:2:1637 -817:0:2112 -818:2:1649 -819:0:2112 -820:2:1651 -821:0:2112 -822:2:1652 -823:2:1656 -824:2:1657 -825:2:1665 -826:2:1666 -827:2:1670 -828:2:1671 -829:2:1679 -830:2:1684 -831:2:1688 -832:2:1689 -833:2:1696 -834:2:1697 -835:2:1708 -836:2:1709 -837:2:1710 -838:2:1721 -839:2:1726 -840:2:1727 -841:0:2112 -842:2:1739 -843:0:2112 -844:2:1560 -845:0:2112 -846:1:311 -847:1:315 -848:1:316 -849:1:324 -850:1:325 -851:1:326 -852:1:338 -853:1:343 -854:1:347 -855:1:348 -856:1:355 -857:1:356 -858:1:367 -859:1:368 -860:1:369 -861:1:380 -862:1:385 -863:1:386 -864:0:2112 -865:1:398 -866:0:2112 -867:2:1561 -868:0:2112 -869:2:1562 -870:2:1566 -871:2:1567 -872:2:1575 -873:2:1576 -874:2:1580 -875:2:1581 -876:2:1589 -877:2:1594 -878:2:1598 -879:2:1599 -880:2:1606 -881:2:1607 -882:2:1618 -883:2:1619 -884:2:1620 -885:2:1631 -886:2:1636 -887:2:1637 -888:0:2112 -889:2:1649 -890:0:2112 -891:2:1651 -892:0:2112 -893:2:1652 -894:2:1656 -895:2:1657 -896:2:1665 -897:2:1666 -898:2:1670 -899:2:1671 -900:2:1679 -901:2:1684 -902:2:1688 -903:2:1689 -904:2:1696 -905:2:1697 -906:2:1708 -907:2:1709 -908:2:1710 -909:2:1721 -910:2:1726 -911:2:1727 -912:0:2112 -913:2:1739 -914:0:2112 -915:2:1560 -916:0:2112 -917:2:1561 -918:0:2112 -919:2:1562 -920:2:1566 -921:2:1567 -922:2:1575 -923:2:1576 -924:2:1580 -925:2:1581 -926:2:1589 -927:2:1594 -928:2:1598 -929:2:1599 -930:2:1606 -931:2:1607 -932:2:1618 -933:2:1619 -934:2:1620 -935:2:1631 -936:2:1636 -937:2:1637 -938:0:2112 -939:2:1649 -940:0:2112 -941:1:400 -942:0:2112 -943:1:305 -944:0:2112 -945:1:306 -946:0:2112 -947:1:308 -948:0:2112 -949:2:1651 -950:0:2112 -951:2:1652 -952:2:1656 -953:2:1657 -954:2:1665 -955:2:1666 -956:2:1670 -957:2:1671 -958:2:1679 -959:2:1684 -960:2:1688 -961:2:1689 -962:2:1696 -963:2:1697 -964:2:1708 -965:2:1709 -966:2:1710 -967:2:1721 -968:2:1726 -969:2:1727 -970:0:2112 -971:2:1739 -972:0:2112 -973:2:1560 -974:0:2112 -975:2:1561 -976:0:2112 -977:2:1562 -978:2:1566 -979:2:1567 -980:2:1575 -981:2:1576 -982:2:1580 -983:2:1581 -984:2:1589 -985:2:1594 -986:2:1598 -987:2:1599 -988:2:1606 -989:2:1607 -990:2:1618 -991:2:1619 -992:2:1620 -993:2:1631 -994:2:1636 -995:2:1637 -996:0:2112 -997:2:1649 -998:0:2112 -999:1:310 -1000:0:2112 -1001:2:1651 -1002:0:2112 -1003:2:1652 -1004:2:1656 -1005:2:1657 -1006:2:1665 -1007:2:1666 -1008:2:1670 -1009:2:1671 -1010:2:1679 -1011:2:1684 -1012:2:1688 -1013:2:1689 -1014:2:1696 -1015:2:1697 -1016:2:1708 -1017:2:1709 -1018:2:1710 -1019:2:1721 -1020:2:1726 -1021:2:1727 -1022:0:2112 -1023:2:1739 -1024:0:2112 -1025:2:1560 -1026:0:2112 -1027:2:1561 -1028:0:2112 -1029:2:1562 -1030:2:1566 -1031:2:1567 -1032:2:1575 -1033:2:1576 -1034:2:1580 -1035:2:1581 -1036:2:1589 -1037:2:1594 -1038:2:1598 -1039:2:1599 -1040:2:1606 -1041:2:1607 -1042:2:1618 -1043:2:1619 -1044:2:1620 -1045:2:1631 -1046:2:1636 -1047:2:1637 -1048:0:2112 -1049:2:1649 -1050:0:2112 -1051:1:311 -1052:1:315 -1053:1:316 -1054:1:324 -1055:1:325 -1056:1:326 -1057:1:338 -1058:1:343 -1059:1:347 -1060:1:348 -1061:1:355 -1062:1:356 -1063:1:367 -1064:1:368 -1065:1:369 -1066:1:380 -1067:1:385 -1068:1:386 -1069:0:2112 -1070:1:398 -1071:0:2112 -1072:2:1651 -1073:0:2112 -1074:2:1652 -1075:2:1656 -1076:2:1657 -1077:2:1665 -1078:2:1666 -1079:2:1670 -1080:2:1671 -1081:2:1679 -1082:2:1684 -1083:2:1688 -1084:2:1689 -1085:2:1696 -1086:2:1697 -1087:2:1708 -1088:2:1709 -1089:2:1710 -1090:2:1721 -1091:2:1726 -1092:2:1727 -1093:0:2112 -1094:2:1739 -1095:0:2112 -1096:2:1560 -1097:0:2112 -1098:2:1561 -1099:0:2112 -1100:2:1562 -1101:2:1566 -1102:2:1567 -1103:2:1575 -1104:2:1576 -1105:2:1580 -1106:2:1581 -1107:2:1589 -1108:2:1594 -1109:2:1598 -1110:2:1599 -1111:2:1606 -1112:2:1607 -1113:2:1618 -1114:2:1619 -1115:2:1620 -1116:2:1631 -1117:2:1636 -1118:2:1637 -1119:0:2112 -1120:2:1649 -1121:0:2112 -1122:2:1651 -1123:0:2112 -1124:1:400 -1125:0:2112 -1126:1:404 -1127:0:2112 -1128:1:9 -1129:0:2112 -1130:1:10 -1131:0:2112 -1132:1:11 -1133:0:2112 -1134:2:1652 -1135:2:1656 -1136:2:1657 -1137:2:1665 -1138:2:1666 -1139:2:1670 -1140:2:1671 -1141:2:1679 -1142:2:1684 -1143:2:1688 -1144:2:1689 -1145:2:1696 -1146:2:1697 -1147:2:1708 -1148:2:1709 -1149:2:1710 -1150:2:1721 -1151:2:1726 -1152:2:1727 -1153:0:2112 -1154:2:1739 -1155:0:2112 -1156:2:1560 -1157:0:2112 -1158:2:1561 -1159:0:2112 -1160:2:1562 -1161:2:1566 -1162:2:1567 -1163:2:1575 -1164:2:1576 -1165:2:1580 -1166:2:1581 -1167:2:1589 -1168:2:1594 -1169:2:1598 -1170:2:1599 -1171:2:1606 -1172:2:1607 -1173:2:1618 -1174:2:1619 -1175:2:1620 -1176:2:1631 -1177:2:1636 -1178:2:1637 -1179:0:2112 -1180:2:1649 -1181:0:2112 -1182:2:1651 -1183:0:2112 -1184:1:12 -1185:1:16 -1186:1:17 -1187:1:25 -1188:1:26 -1189:1:27 -1190:1:39 -1191:1:44 -1192:1:48 -1193:1:49 -1194:1:56 -1195:1:57 -1196:1:68 -1197:1:69 -1198:1:70 -1199:1:81 -1200:1:86 -1201:1:87 -1202:0:2112 -1203:1:99 -1204:0:2112 -1205:2:1652 -1206:2:1656 -1207:2:1657 -1208:2:1665 -1209:2:1666 -1210:2:1670 -1211:2:1671 -1212:2:1679 -1213:2:1684 -1214:2:1688 -1215:2:1689 -1216:2:1696 -1217:2:1697 -1218:2:1708 -1219:2:1716 -1220:2:1717 -1221:2:1721 -1222:2:1726 -1223:2:1727 -1224:0:2112 -1225:2:1739 -1226:0:2112 -1227:2:1560 -1228:0:2112 -1229:2:1561 -1230:0:2112 -1231:2:1562 -1232:2:1566 -1233:2:1567 -1234:2:1575 -1235:2:1576 -1236:2:1580 -1237:2:1581 -1238:2:1589 -1239:2:1594 -1240:2:1598 -1241:2:1599 -1242:2:1606 -1243:2:1607 -1244:2:1618 -1245:2:1626 -1246:2:1627 -1247:2:1631 -1248:2:1636 -1249:2:1637 -1250:0:2112 -1251:2:1649 -1252:0:2112 -1253:2:1651 -1254:0:2112 -1255:1:101 -1256:0:2112 -1257:2:1652 -1258:2:1656 -1259:2:1657 -1260:2:1665 -1261:2:1666 -1262:2:1670 -1263:2:1671 -1264:2:1679 -1265:2:1684 -1266:2:1688 -1267:2:1689 -1268:2:1696 -1269:2:1697 -1270:2:1708 -1271:2:1716 -1272:2:1717 -1273:2:1721 -1274:2:1726 -1275:2:1727 -1276:0:2112 -1277:2:1739 -1278:0:2112 -1279:2:1560 -1280:0:2112 -1281:2:1561 -1282:0:2112 -1283:2:1562 -1284:2:1566 -1285:2:1567 -1286:2:1575 -1287:2:1576 -1288:2:1580 -1289:2:1581 -1290:2:1589 -1291:2:1594 -1292:2:1598 -1293:2:1599 -1294:2:1606 -1295:2:1607 -1296:2:1618 -1297:2:1626 -1298:2:1627 -1299:2:1631 -1300:2:1636 -1301:2:1637 -1302:0:2112 -1303:2:1649 -1304:0:2112 -1305:2:1651 -1306:0:2112 -1307:1:102 -1308:1:106 -1309:1:107 -1310:1:115 -1311:1:116 -1312:1:120 -1313:1:121 -1314:1:129 -1315:1:134 -1316:1:138 -1317:1:139 -1318:1:146 -1319:1:147 -1320:1:158 -1321:1:159 -1322:1:160 -1323:1:171 -1324:1:176 -1325:1:177 -1326:0:2112 -1327:1:189 -1328:0:2112 -1329:1:191 -1330:0:2112 -1331:2:1652 -1332:2:1656 -1333:2:1657 -1334:2:1665 -1335:2:1666 -1336:2:1670 -1337:2:1671 -1338:2:1679 -1339:2:1684 -1340:2:1688 -1341:2:1689 -1342:2:1696 -1343:2:1697 -1344:2:1708 -1345:2:1716 -1346:2:1717 -1347:2:1721 -1348:2:1726 -1349:2:1727 -1350:0:2112 -1351:2:1739 -1352:0:2112 -1353:2:1560 -1354:0:2112 -1355:2:1561 -1356:0:2112 -1357:2:1562 -1358:2:1566 -1359:2:1567 -1360:2:1575 -1361:2:1576 -1362:2:1580 -1363:2:1581 -1364:2:1589 -1365:2:1594 -1366:2:1598 -1367:2:1599 -1368:2:1606 -1369:2:1607 -1370:2:1618 -1371:2:1626 -1372:2:1627 -1373:2:1631 -1374:2:1636 -1375:2:1637 -1376:0:2112 -1377:2:1649 -1378:0:2112 -1379:2:1651 -1380:0:2112 -1381:1:192 -1382:0:2112 -1383:2:1652 -1384:2:1656 -1385:2:1657 -1386:2:1665 -1387:2:1666 -1388:2:1670 -1389:2:1671 -1390:2:1679 -1391:2:1684 -1392:2:1688 -1393:2:1689 -1394:2:1696 -1395:2:1697 -1396:2:1708 -1397:2:1716 -1398:2:1717 -1399:2:1721 -1400:2:1726 -1401:2:1727 -1402:0:2112 -1403:2:1739 -1404:0:2112 -1405:2:1560 -1406:0:2112 -1407:2:1561 -1408:0:2112 -1409:2:1562 -1410:2:1566 -1411:2:1567 -1412:2:1575 -1413:2:1576 -1414:2:1580 -1415:2:1581 -1416:2:1589 -1417:2:1594 -1418:2:1598 -1419:2:1599 -1420:2:1606 -1421:2:1607 -1422:2:1618 -1423:2:1626 -1424:2:1627 -1425:2:1631 -1426:2:1636 -1427:2:1637 -1428:0:2112 -1429:2:1649 -1430:0:2112 -1431:2:1651 -1432:0:2112 -1433:1:193 -1434:1:197 -1435:1:198 -1436:1:206 -1437:1:207 -1438:1:211 -1439:1:212 -1440:1:220 -1441:1:225 -1442:1:229 -1443:1:230 -1444:1:237 -1445:1:238 -1446:1:249 -1447:1:250 -1448:1:251 -1449:1:262 -1450:1:267 -1451:1:268 -1452:0:2112 -1453:1:280 -1454:0:2112 -1455:2:1652 -1456:2:1656 -1457:2:1657 -1458:2:1665 -1459:2:1666 -1460:2:1670 -1461:2:1671 -1462:2:1679 -1463:2:1684 -1464:2:1688 -1465:2:1689 -1466:2:1696 -1467:2:1697 -1468:2:1708 -1469:2:1716 -1470:2:1717 -1471:2:1721 -1472:2:1726 -1473:2:1727 -1474:0:2112 -1475:2:1739 -1476:0:2112 -1477:2:1560 -1478:0:2112 -1479:2:1561 -1480:0:2112 -1481:2:1562 -1482:2:1566 -1483:2:1567 -1484:2:1575 -1485:2:1576 -1486:2:1580 -1487:2:1581 -1488:2:1589 -1489:2:1594 -1490:2:1598 -1491:2:1599 -1492:2:1606 -1493:2:1607 -1494:2:1618 -1495:2:1626 -1496:2:1627 -1497:2:1631 -1498:2:1636 -1499:2:1637 -1500:0:2112 -1501:2:1649 -1502:0:2112 -1503:2:1651 -1504:0:2112 -1505:1:282 -1506:0:2112 -1507:1:291 -1508:0:2112 -1509:1:293 -1510:0:2112 -1511:1:11 -1512:0:2112 -1513:2:1652 -1514:2:1656 -1515:2:1657 -1516:2:1665 -1517:2:1666 -1518:2:1670 -1519:2:1671 -1520:2:1679 -1521:2:1684 -1522:2:1688 -1523:2:1689 -1524:2:1696 -1525:2:1697 -1526:2:1708 -1527:2:1716 -1528:2:1717 -1529:2:1721 -1530:2:1726 -1531:2:1727 -1532:0:2112 -1533:2:1739 -1534:0:2112 -1535:2:1560 -1536:0:2112 -1537:2:1561 -1538:0:2112 -1539:2:1562 -1540:2:1566 -1541:2:1567 -1542:2:1575 -1543:2:1576 -1544:2:1580 -1545:2:1581 -1546:2:1589 -1547:2:1594 -1548:2:1598 -1549:2:1599 -1550:2:1606 -1551:2:1607 -1552:2:1618 -1553:2:1626 -1554:2:1627 -1555:2:1631 -1556:2:1636 -1557:2:1637 -1558:0:2112 -1559:2:1649 -1560:0:2112 -1561:2:1651 -1562:0:2112 -1563:1:12 -1564:1:16 -1565:1:17 -1566:1:25 -1567:1:26 -1568:1:27 -1569:1:39 -1570:1:44 -1571:1:48 -1572:1:49 -1573:1:56 -1574:1:57 -1575:1:68 -1576:1:69 -1577:1:70 -1578:1:81 -1579:1:86 -1580:1:87 -1581:0:2112 -1582:1:99 -1583:0:2112 -1584:2:1652 -1585:2:1656 -1586:2:1657 -1587:2:1665 -1588:2:1666 -1589:2:1670 -1590:2:1671 -1591:2:1679 -1592:2:1684 -1593:2:1688 -1594:2:1689 -1595:2:1696 -1596:2:1697 -1597:2:1708 -1598:2:1716 -1599:2:1717 -1600:2:1721 -1601:2:1726 -1602:2:1727 -1603:0:2112 -1604:2:1739 -1605:0:2112 -1606:2:1560 -1607:0:2112 -1608:2:1561 -1609:0:2112 -1610:2:1562 -1611:2:1566 -1612:2:1567 -1613:2:1575 -1614:2:1576 -1615:2:1580 -1616:2:1581 -1617:2:1589 -1618:2:1594 -1619:2:1598 -1620:2:1599 -1621:2:1606 -1622:2:1607 -1623:2:1618 -1624:2:1626 -1625:2:1627 -1626:2:1631 -1627:2:1636 -1628:2:1637 -1629:0:2112 -1630:2:1649 -1631:0:2112 -1632:2:1651 -1633:0:2112 -1634:1:101 -1635:0:2112 -1636:2:1652 -1637:2:1656 -1638:2:1657 -1639:2:1665 -1640:2:1666 -1641:2:1670 -1642:2:1671 -1643:2:1679 -1644:2:1684 -1645:2:1688 -1646:2:1689 -1647:2:1696 -1648:2:1697 -1649:2:1708 -1650:2:1716 -1651:2:1717 -1652:2:1721 -1653:2:1726 -1654:2:1727 -1655:0:2112 -1656:2:1739 -1657:0:2112 -1658:2:1560 -1659:0:2112 -1660:2:1561 -1661:0:2112 -1662:2:1562 -1663:2:1566 -1664:2:1567 -1665:2:1575 -1666:2:1576 -1667:2:1580 -1668:2:1581 -1669:2:1589 -1670:2:1594 -1671:2:1598 -1672:2:1599 -1673:2:1606 -1674:2:1607 -1675:2:1618 -1676:2:1626 -1677:2:1627 -1678:2:1631 -1679:2:1636 -1680:2:1637 -1681:0:2112 -1682:2:1649 -1683:0:2112 -1684:2:1651 -1685:0:2112 -1686:1:102 -1687:1:106 -1688:1:107 -1689:1:115 -1690:1:116 -1691:1:120 -1692:1:121 -1693:1:129 -1694:1:134 -1695:1:138 -1696:1:139 -1697:1:146 -1698:1:147 -1699:1:158 -1700:1:159 -1701:1:160 -1702:1:171 -1703:1:176 -1704:1:177 -1705:0:2112 -1706:1:189 -1707:0:2112 -1708:1:285 -1709:0:2112 -1710:2:1652 -1711:2:1656 -1712:2:1657 -1713:2:1665 -1714:2:1666 -1715:2:1670 -1716:2:1671 -1717:2:1679 -1718:2:1684 -1719:2:1688 -1720:2:1689 -1721:2:1696 -1722:2:1697 -1723:2:1708 -1724:2:1716 -1725:2:1717 -1726:2:1721 -1727:2:1726 -1728:2:1727 -1729:0:2112 -1730:2:1739 -1731:0:2112 -1732:2:1560 -1733:0:2112 -1734:2:1561 -1735:0:2112 -1736:2:1562 -1737:2:1566 -1738:2:1567 -1739:2:1575 -1740:2:1576 -1741:2:1580 -1742:2:1581 -1743:2:1589 -1744:2:1594 -1745:2:1598 -1746:2:1599 -1747:2:1606 -1748:2:1607 -1749:2:1618 -1750:2:1626 -1751:2:1627 -1752:2:1631 -1753:2:1636 -1754:2:1637 -1755:0:2112 -1756:2:1649 -1757:0:2112 -1758:2:1651 -1759:0:2112 -1760:1:286 -1761:0:2112 -1762:1:291 -1763:0:2112 -1764:1:293 -1765:0:2112 -1766:1:296 -1767:0:2112 -1768:2:1652 -1769:2:1656 -1770:2:1657 -1771:2:1665 -1772:2:1666 -1773:2:1670 -1774:2:1671 -1775:2:1679 -1776:2:1684 -1777:2:1688 -1778:2:1689 -1779:2:1696 -1780:2:1697 -1781:2:1708 -1782:2:1716 -1783:2:1717 -1784:2:1721 -1785:2:1726 -1786:2:1727 -1787:0:2112 -1788:2:1739 -1789:0:2112 -1790:2:1560 -1791:0:2112 -1792:2:1561 -1793:0:2112 -1794:2:1562 -1795:2:1566 -1796:2:1567 -1797:2:1575 -1798:2:1576 -1799:2:1580 -1800:2:1581 -1801:2:1589 -1802:2:1594 -1803:2:1598 -1804:2:1599 -1805:2:1606 -1806:2:1607 -1807:2:1618 -1808:2:1626 -1809:2:1627 -1810:2:1631 -1811:2:1636 -1812:2:1637 -1813:0:2112 -1814:2:1649 -1815:0:2112 -1816:2:1651 -1817:0:2112 -1818:1:301 -1819:0:2112 -1820:2:1652 -1821:2:1656 -1822:2:1657 -1823:2:1665 -1824:2:1666 -1825:2:1670 -1826:2:1671 -1827:2:1679 -1828:2:1684 -1829:2:1688 -1830:2:1689 -1831:2:1696 -1832:2:1697 -1833:2:1708 -1834:2:1716 -1835:2:1717 -1836:2:1721 -1837:2:1726 -1838:2:1727 -1839:0:2112 -1840:2:1739 -1841:0:2112 -1842:2:1560 -1843:0:2112 -1844:2:1561 -1845:0:2112 -1846:2:1562 -1847:2:1566 -1848:2:1567 -1849:2:1575 -1850:2:1576 -1851:2:1580 -1852:2:1581 -1853:2:1589 -1854:2:1594 -1855:2:1598 -1856:2:1599 -1857:2:1606 -1858:2:1607 -1859:2:1618 -1860:2:1626 -1861:2:1627 -1862:2:1631 -1863:2:1636 -1864:2:1637 -1865:0:2112 -1866:2:1649 -1867:0:2112 -1868:2:1651 -1869:0:2112 -1870:1:302 -1871:0:2112 -1872:2:1652 -1873:2:1656 -1874:2:1657 -1875:2:1665 -1876:2:1666 -1877:2:1670 -1878:2:1671 -1879:2:1679 -1880:2:1684 -1881:2:1688 -1882:2:1689 -1883:2:1696 -1884:2:1697 -1885:2:1708 -1886:2:1716 -1887:2:1717 -1888:2:1721 -1889:2:1726 -1890:2:1727 -1891:0:2112 -1892:2:1739 -1893:0:2112 -1894:2:1560 -1895:0:2112 -1896:2:1561 -1897:0:2112 -1898:2:1562 -1899:2:1566 -1900:2:1567 -1901:2:1575 -1902:2:1576 -1903:2:1580 -1904:2:1581 -1905:2:1589 -1906:2:1594 -1907:2:1598 -1908:2:1599 -1909:2:1606 -1910:2:1607 -1911:2:1618 -1912:2:1626 -1913:2:1627 -1914:2:1631 -1915:2:1636 -1916:2:1637 -1917:0:2112 -1918:2:1649 -1919:0:2112 -1920:2:1651 -1921:0:2112 -1922:1:303 -1923:0:2112 -1924:1:304 -1925:0:2112 -1926:1:305 -1927:0:2112 -1928:1:306 -1929:0:2112 -1930:1:308 -1931:0:2112 -1932:2:1652 -1933:2:1656 -1934:2:1657 -1935:2:1665 -1936:2:1666 -1937:2:1670 -1938:2:1671 -1939:2:1679 -1940:2:1684 -1941:2:1688 -1942:2:1689 -1943:2:1696 -1944:2:1697 -1945:2:1708 -1946:2:1716 -1947:2:1717 -1948:2:1721 -1949:2:1726 -1950:2:1727 -1951:0:2112 -1952:2:1739 -1953:0:2112 -1954:2:1560 -1955:0:2112 -1956:2:1561 -1957:0:2112 -1958:2:1562 -1959:2:1566 -1960:2:1567 -1961:2:1575 -1962:2:1576 -1963:2:1580 -1964:2:1581 -1965:2:1589 -1966:2:1594 -1967:2:1598 -1968:2:1599 -1969:2:1606 -1970:2:1607 -1971:2:1618 -1972:2:1626 -1973:2:1627 -1974:2:1631 -1975:2:1636 -1976:2:1637 -1977:0:2112 -1978:2:1649 -1979:0:2112 -1980:2:1651 -1981:0:2112 -1982:1:310 -1983:0:2112 -1984:2:1652 -1985:2:1656 -1986:2:1657 -1987:2:1665 -1988:2:1666 -1989:2:1670 -1990:2:1671 -1991:2:1679 -1992:2:1684 -1993:2:1688 -1994:2:1689 -1995:2:1696 -1996:2:1697 -1997:2:1708 -1998:2:1716 -1999:2:1717 -2000:2:1721 -2001:2:1726 -2002:2:1727 -2003:0:2112 -2004:2:1739 -2005:0:2112 -2006:2:1560 -2007:0:2112 -2008:2:1561 -2009:0:2112 -2010:2:1562 -2011:2:1566 -2012:2:1567 -2013:2:1575 -2014:2:1576 -2015:2:1580 -2016:2:1581 -2017:2:1589 -2018:2:1594 -2019:2:1598 -2020:2:1599 -2021:2:1606 -2022:2:1607 -2023:2:1618 -2024:2:1626 -2025:2:1627 -2026:2:1631 -2027:2:1636 -2028:2:1637 -2029:0:2112 -2030:2:1649 -2031:0:2112 -2032:2:1651 -2033:0:2112 -2034:1:311 -2035:1:315 -2036:1:316 -2037:1:324 -2038:1:325 -2039:1:326 -2040:1:338 -2041:1:343 -2042:1:347 -2043:1:348 -2044:1:355 -2045:1:356 -2046:1:367 -2047:1:368 -2048:1:369 -2049:1:380 -2050:1:385 -2051:1:386 -2052:0:2112 -2053:1:398 -2054:0:2112 -2055:2:1652 -2056:2:1656 -2057:2:1657 -2058:2:1665 -2059:2:1666 -2060:2:1670 -2061:2:1671 -2062:2:1679 -2063:2:1684 -2064:2:1688 -2065:2:1689 -2066:2:1696 -2067:2:1697 -2068:2:1708 -2069:2:1716 -2070:2:1717 -2071:2:1721 -2072:2:1726 -2073:2:1727 -2074:0:2112 -2075:2:1739 -2076:0:2112 -2077:2:1560 -2078:0:2112 -2079:2:1561 -2080:0:2112 -2081:2:1562 -2082:2:1566 -2083:2:1567 -2084:2:1575 -2085:2:1576 -2086:2:1580 -2087:2:1581 -2088:2:1589 -2089:2:1594 -2090:2:1598 -2091:2:1599 -2092:2:1606 -2093:2:1607 -2094:2:1618 -2095:2:1626 -2096:2:1627 -2097:2:1631 -2098:2:1636 -2099:2:1637 -2100:0:2112 -2101:2:1649 -2102:0:2112 -2103:2:1651 -2104:0:2112 -2105:1:400 -2106:0:2112 -2107:1:305 -2108:0:2112 -2109:1:306 -2110:0:2112 -2111:1:308 -2112:0:2112 -2113:2:1652 -2114:2:1656 -2115:2:1657 -2116:2:1665 -2117:2:1666 -2118:2:1670 -2119:2:1671 -2120:2:1679 -2121:2:1684 -2122:2:1688 -2123:2:1689 -2124:2:1696 -2125:2:1697 -2126:2:1708 -2127:2:1716 -2128:2:1717 -2129:2:1721 -2130:2:1726 -2131:2:1727 -2132:0:2112 -2133:2:1739 -2134:0:2112 -2135:2:1560 -2136:0:2112 -2137:2:1561 -2138:0:2112 -2139:2:1562 -2140:2:1566 -2141:2:1567 -2142:2:1575 -2143:2:1576 -2144:2:1580 -2145:2:1581 -2146:2:1589 -2147:2:1594 -2148:2:1598 -2149:2:1599 -2150:2:1606 -2151:2:1607 -2152:2:1618 -2153:2:1626 -2154:2:1627 -2155:2:1631 -2156:2:1636 -2157:2:1637 -2158:0:2112 -2159:2:1649 -2160:0:2112 -2161:2:1651 -2162:0:2112 -2163:1:310 -2164:0:2112 -2165:2:1652 -2166:2:1656 -2167:2:1657 -2168:2:1665 -2169:2:1666 -2170:2:1670 -2171:2:1671 -2172:2:1679 -2173:2:1684 -2174:2:1688 -2175:2:1689 -2176:2:1696 -2177:2:1697 -2178:2:1708 -2179:2:1716 -2180:2:1717 -2181:2:1721 -2182:2:1726 -2183:2:1727 -2184:0:2112 -2185:2:1739 -2186:0:2112 -2187:2:1560 -2188:0:2112 -2189:2:1561 -2190:0:2112 -2191:2:1562 -2192:2:1566 -2193:2:1567 -2194:2:1575 -2195:2:1576 -2196:2:1580 -2197:2:1581 -2198:2:1589 -2199:2:1594 -2200:2:1598 -2201:2:1599 -2202:2:1606 -2203:2:1607 -2204:2:1618 -2205:2:1626 -2206:2:1627 -2207:2:1631 -2208:2:1636 -2209:2:1637 -2210:0:2112 -2211:2:1649 -2212:0:2112 -2213:2:1651 -2214:0:2112 -2215:1:311 -2216:1:315 -2217:1:316 -2218:1:324 -2219:1:325 -2220:1:326 -2221:1:338 -2222:1:343 -2223:1:347 -2224:1:348 -2225:1:355 -2226:1:356 -2227:1:367 -2228:1:368 -2229:1:369 -2230:1:380 -2231:1:385 -2232:1:386 -2233:0:2112 -2234:1:398 -2235:0:2112 -2236:2:1652 -2237:2:1656 -2238:2:1657 -2239:2:1665 -2240:2:1666 -2241:2:1670 -2242:2:1671 -2243:2:1679 -2244:2:1684 -2245:2:1688 -2246:2:1689 -2247:2:1696 -2248:2:1697 -2249:2:1708 -2250:2:1716 -2251:2:1717 -2252:2:1721 -2253:2:1726 -2254:2:1727 -2255:0:2112 -2256:2:1739 -2257:0:2112 -2258:2:1560 -2259:0:2112 -2260:2:1561 -2261:0:2112 -2262:2:1562 -2263:2:1566 -2264:2:1567 -2265:2:1575 -2266:2:1576 -2267:2:1580 -2268:2:1581 -2269:2:1589 -2270:2:1594 -2271:2:1598 -2272:2:1599 -2273:2:1606 -2274:2:1607 -2275:2:1618 -2276:2:1626 -2277:2:1627 -2278:2:1631 -2279:2:1636 -2280:2:1637 -2281:0:2112 -2282:2:1649 -2283:0:2112 -2284:2:1651 -2285:0:2112 -2286:1:400 -2287:0:2112 -2288:1:404 -2289:0:2112 -2290:1:9 -2291:0:2112 -2292:1:10 -2293:0:2112 -2294:1:11 -2295:0:2112 -2296:2:1652 -2297:2:1656 -2298:2:1657 -2299:2:1665 -2300:2:1666 -2301:2:1670 -2302:2:1671 -2303:2:1679 -2304:2:1684 -2305:2:1688 -2306:2:1689 -2307:2:1696 -2308:2:1697 -2309:2:1708 -2310:2:1716 -2311:2:1717 -2312:2:1721 -2313:2:1726 -2314:2:1727 -2315:0:2112 -2316:2:1739 -2317:0:2112 -2318:2:1560 -2319:0:2112 -2320:2:1561 -2321:0:2112 -2322:2:1562 -2323:2:1566 -2324:2:1567 -2325:2:1575 -2326:2:1576 -2327:2:1580 -2328:2:1581 -2329:2:1589 -2330:2:1594 -2331:2:1598 -2332:2:1599 -2333:2:1606 -2334:2:1607 -2335:2:1618 -2336:2:1626 -2337:2:1627 -2338:2:1631 -2339:2:1636 -2340:2:1637 -2341:0:2112 -2342:2:1649 -2343:0:2112 -2344:2:1651 -2345:0:2112 -2346:1:12 -2347:1:16 -2348:1:17 -2349:1:25 -2350:1:26 -2351:1:27 -2352:1:39 -2353:1:44 -2354:1:48 -2355:1:49 -2356:1:56 -2357:1:57 -2358:1:68 -2359:1:69 -2360:1:70 -2361:1:81 -2362:1:86 -2363:1:87 -2364:0:2112 -2365:1:99 -2366:0:2112 -2367:2:1652 -2368:2:1656 -2369:2:1657 -2370:2:1665 -2371:2:1666 -2372:2:1670 -2373:2:1671 -2374:2:1679 -2375:2:1684 -2376:2:1688 -2377:2:1689 -2378:2:1696 -2379:2:1697 -2380:2:1708 -2381:2:1716 -2382:2:1717 -2383:2:1721 -2384:2:1726 -2385:2:1727 -2386:0:2112 -2387:2:1739 -2388:0:2112 -2389:2:1560 -2390:0:2112 -2391:2:1561 -2392:0:2112 -2393:2:1562 -2394:2:1566 -2395:2:1567 -2396:2:1575 -2397:2:1576 -2398:2:1580 -2399:2:1581 -2400:2:1589 -2401:2:1594 -2402:2:1598 -2403:2:1599 -2404:2:1606 -2405:2:1607 -2406:2:1618 -2407:2:1626 -2408:2:1627 -2409:2:1631 -2410:2:1636 -2411:2:1637 -2412:0:2112 -2413:2:1649 -2414:0:2112 -2415:2:1651 -2416:0:2112 -2417:1:101 -2418:0:2112 -2419:2:1652 -2420:2:1656 -2421:2:1657 -2422:2:1665 -2423:2:1666 -2424:2:1670 -2425:2:1671 -2426:2:1679 -2427:2:1684 -2428:2:1688 -2429:2:1689 -2430:2:1696 -2431:2:1697 -2432:2:1708 -2433:2:1716 -2434:2:1717 -2435:2:1721 -2436:2:1726 -2437:2:1727 -2438:0:2112 -2439:2:1739 -2440:0:2112 -2441:2:1560 -2442:0:2112 -2443:2:1561 -2444:0:2112 -2445:2:1562 -2446:2:1566 -2447:2:1567 -2448:2:1575 -2449:2:1576 -2450:2:1580 -2451:2:1581 -2452:2:1589 -2453:2:1594 -2454:2:1598 -2455:2:1599 -2456:2:1606 -2457:2:1607 -2458:2:1618 -2459:2:1626 -2460:2:1627 -2461:2:1631 -2462:2:1636 -2463:2:1637 -2464:0:2112 -2465:2:1649 -2466:0:2112 -2467:2:1651 -2468:0:2112 -2469:1:102 -2470:1:106 -2471:1:107 -2472:1:115 -2473:1:116 -2474:1:120 -2475:1:121 -2476:1:129 -2477:1:134 -2478:1:138 -2479:1:139 -2480:1:146 -2481:1:147 -2482:1:158 -2483:1:159 -2484:1:160 -2485:1:171 -2486:1:176 -2487:1:177 -2488:0:2112 -2489:1:189 -2490:0:2112 -2491:1:191 -2492:0:2112 -2493:2:1652 -2494:2:1656 -2495:2:1657 -2496:2:1665 -2497:2:1666 -2498:2:1670 -2499:2:1671 -2500:2:1679 -2501:2:1684 -2502:2:1688 -2503:2:1689 -2504:2:1696 -2505:2:1697 -2506:2:1708 -2507:2:1716 -2508:2:1717 -2509:2:1721 -2510:2:1726 -2511:2:1727 -2512:0:2112 -2513:2:1739 -2514:0:2112 -2515:2:1560 -2516:0:2112 -2517:2:1561 -2518:0:2112 -2519:2:1562 -2520:2:1566 -2521:2:1567 -2522:2:1575 -2523:2:1576 -2524:2:1580 -2525:2:1581 -2526:2:1589 -2527:2:1594 -2528:2:1598 -2529:2:1599 -2530:2:1606 -2531:2:1607 -2532:2:1618 -2533:2:1626 -2534:2:1627 -2535:2:1631 -2536:2:1636 -2537:2:1637 -2538:0:2112 -2539:2:1649 -2540:0:2112 -2541:2:1651 -2542:0:2112 -2543:1:192 -2544:0:2112 -2545:2:1652 -2546:2:1656 -2547:2:1657 -2548:2:1665 -2549:2:1666 -2550:2:1670 -2551:2:1671 -2552:2:1679 -2553:2:1684 -2554:2:1688 -2555:2:1689 -2556:2:1696 -2557:2:1697 -2558:2:1708 -2559:2:1716 -2560:2:1717 -2561:2:1721 -2562:2:1726 -2563:2:1727 -2564:0:2112 -2565:2:1739 -2566:0:2112 -2567:2:1560 -2568:0:2112 -2569:2:1561 -2570:0:2112 -2571:2:1562 -2572:2:1566 -2573:2:1567 -2574:2:1575 -2575:2:1576 -2576:2:1580 -2577:2:1581 -2578:2:1589 -2579:2:1594 -2580:2:1598 -2581:2:1599 -2582:2:1606 -2583:2:1607 -2584:2:1618 -2585:2:1626 -2586:2:1627 -2587:2:1631 -2588:2:1636 -2589:2:1637 -2590:0:2112 -2591:2:1649 -2592:0:2112 -2593:2:1651 -2594:0:2112 -2595:1:193 -2596:1:197 -2597:1:198 -2598:1:206 -2599:1:207 -2600:1:211 -2601:1:212 -2602:1:220 -2603:1:225 -2604:1:229 -2605:1:230 -2606:1:237 -2607:1:238 -2608:1:249 -2609:1:250 -2610:1:251 -2611:1:262 -2612:1:267 -2613:1:268 -2614:0:2112 -2615:1:280 -2616:0:2112 -2617:2:1652 -2618:2:1656 -2619:2:1657 -2620:2:1665 -2621:2:1666 -2622:2:1670 -2623:2:1671 -2624:2:1679 -2625:2:1684 -2626:2:1688 -2627:2:1689 -2628:2:1696 -2629:2:1697 -2630:2:1708 -2631:2:1716 -2632:2:1717 -2633:2:1721 -2634:2:1726 -2635:2:1727 -2636:0:2112 -2637:2:1739 -2638:0:2112 -2639:2:1560 -2640:0:2112 -2641:2:1561 -2642:0:2112 -2643:2:1562 -2644:2:1566 -2645:2:1567 -2646:2:1575 -2647:2:1576 -2648:2:1580 -2649:2:1581 -2650:2:1589 -2651:2:1594 -2652:2:1598 -2653:2:1599 -2654:2:1606 -2655:2:1607 -2656:2:1618 -2657:2:1626 -2658:2:1627 -2659:2:1631 -2660:2:1636 -2661:2:1637 -2662:0:2112 -2663:2:1649 -2664:0:2112 -2665:2:1651 -2666:0:2112 -2667:1:282 -2668:0:2112 -2669:1:291 -2670:0:2112 -2671:1:293 -2672:0:2112 -2673:1:11 -2674:0:2112 -2675:2:1652 -2676:2:1656 -2677:2:1657 -2678:2:1665 -2679:2:1666 -2680:2:1670 -2681:2:1671 -2682:2:1679 -2683:2:1684 -2684:2:1688 -2685:2:1689 -2686:2:1696 -2687:2:1697 -2688:2:1708 -2689:2:1716 -2690:2:1717 -2691:2:1721 -2692:2:1726 -2693:2:1727 -2694:0:2112 -2695:2:1739 -2696:0:2112 -2697:2:1560 -2698:0:2112 -2699:2:1561 -2700:0:2112 -2701:2:1562 -2702:2:1566 -2703:2:1567 -2704:2:1575 -2705:2:1576 -2706:2:1580 -2707:2:1581 -2708:2:1589 -2709:2:1594 -2710:2:1598 -2711:2:1599 -2712:2:1606 -2713:2:1607 -2714:2:1618 -2715:2:1626 -2716:2:1627 -2717:2:1631 -2718:2:1636 -2719:2:1637 -2720:0:2112 -2721:2:1649 -2722:0:2112 -2723:2:1651 -2724:0:2112 -2725:1:12 -2726:1:16 -2727:1:17 -2728:1:25 -2729:1:34 -2730:1:35 -2731:1:39 -2732:1:44 -2733:1:48 -2734:1:49 -2735:1:56 -2736:1:57 -2737:1:68 -2738:1:69 -2739:1:72 -2740:1:73 -2741:1:81 -2742:1:86 -2743:1:87 -2744:0:2112 -2745:1:99 -2746:0:2112 -2747:2:1652 -2748:2:1656 -2749:2:1657 -2750:2:1665 -2751:2:1666 -2752:2:1670 -2753:2:1671 -2754:2:1679 -2755:2:1684 -2756:2:1688 -2757:2:1689 -2758:2:1696 -2759:2:1697 -2760:2:1708 -2761:2:1716 -2762:2:1717 -2763:2:1721 -2764:2:1726 -2765:2:1727 -2766:0:2112 -2767:2:1739 -2768:0:2112 -2769:2:1560 -2770:0:2112 -2771:2:1561 -2772:0:2112 -2773:2:1562 -2774:2:1566 -2775:2:1567 -2776:2:1575 -2777:2:1576 -2778:2:1580 -2779:2:1581 -2780:2:1589 -2781:2:1594 -2782:2:1598 -2783:2:1599 -2784:2:1606 -2785:2:1607 -2786:2:1618 -2787:2:1626 -2788:2:1627 -2789:2:1631 -2790:2:1636 -2791:2:1637 -2792:0:2112 -2793:2:1649 -2794:0:2112 -2795:2:1651 -2796:0:2112 -2797:1:101 -2798:0:2112 -2799:2:1652 -2800:2:1656 -2801:2:1657 -2802:2:1665 -2803:2:1666 -2804:2:1670 -2805:2:1671 -2806:2:1679 -2807:2:1684 -2808:2:1688 -2809:2:1689 -2810:2:1696 -2811:2:1697 -2812:2:1708 -2813:2:1716 -2814:2:1717 -2815:2:1721 -2816:2:1726 -2817:2:1727 -2818:0:2112 -2819:2:1739 -2820:0:2112 -2821:2:1560 -2822:0:2112 -2823:2:1561 -2824:0:2112 -2825:2:1562 -2826:2:1566 -2827:2:1567 -2828:2:1575 -2829:2:1576 -2830:2:1580 -2831:2:1581 -2832:2:1589 -2833:2:1594 -2834:2:1598 -2835:2:1599 -2836:2:1606 -2837:2:1607 -2838:2:1618 -2839:2:1626 -2840:2:1627 -2841:2:1631 -2842:2:1636 -2843:2:1637 -2844:0:2112 -2845:2:1649 -2846:0:2112 -2847:2:1651 -2848:0:2112 -2849:1:102 -2850:1:106 -2851:1:107 -2852:1:115 -2853:1:124 -2854:1:125 -2855:1:129 -2856:1:134 -2857:1:138 -2858:1:139 -2859:1:146 -2860:1:147 -2861:1:158 -2862:1:159 -2863:1:162 -2864:1:163 -2865:1:171 -2866:1:176 -2867:1:177 -2868:0:2112 -2869:1:189 -2870:0:2112 -2871:1:285 -2872:0:2112 -2873:2:1652 -2874:2:1656 -2875:2:1657 -2876:2:1665 -2877:2:1666 -2878:2:1670 -2879:2:1671 -2880:2:1679 -2881:2:1684 -2882:2:1688 -2883:2:1689 -2884:2:1696 -2885:2:1697 -2886:2:1708 -2887:2:1716 -2888:2:1717 -2889:2:1721 -2890:2:1726 -2891:2:1727 -2892:0:2112 -2893:2:1739 -2894:0:2112 -2895:2:1560 -2896:0:2112 -2897:2:1561 -2898:0:2112 -2899:2:1562 -2900:2:1566 -2901:2:1567 -2902:2:1575 -2903:2:1576 -2904:2:1580 -2905:2:1581 -2906:2:1589 -2907:2:1594 -2908:2:1598 -2909:2:1599 -2910:2:1606 -2911:2:1607 -2912:2:1618 -2913:2:1626 -2914:2:1627 -2915:2:1631 -2916:2:1636 -2917:2:1637 -2918:0:2112 -2919:2:1649 -2920:0:2112 -2921:2:1651 -2922:0:2112 -2923:1:286 -2924:0:2112 -2925:1:291 -2926:0:2112 -2927:1:293 -2928:0:2112 -2929:1:296 -2930:0:2112 -2931:2:1652 -2932:2:1656 -2933:2:1657 -2934:2:1665 -2935:2:1666 -2936:2:1670 -2937:2:1671 -2938:2:1679 -2939:2:1684 -2940:2:1688 -2941:2:1689 -2942:2:1696 -2943:2:1697 -2944:2:1708 -2945:2:1716 -2946:2:1717 -2947:2:1721 -2948:2:1726 -2949:2:1727 -2950:0:2112 -2951:2:1739 -2952:0:2112 -2953:2:1560 -2954:0:2112 -2955:2:1561 -2956:0:2112 -2957:2:1562 -2958:2:1566 -2959:2:1567 -2960:2:1575 -2961:2:1576 -2962:2:1580 -2963:2:1581 -2964:2:1589 -2965:2:1594 -2966:2:1598 -2967:2:1599 -2968:2:1606 -2969:2:1607 -2970:2:1618 -2971:2:1626 -2972:2:1627 -2973:2:1631 -2974:2:1636 -2975:2:1637 -2976:0:2112 -2977:2:1649 -2978:0:2112 -2979:2:1651 -2980:0:2112 -2981:1:301 -2982:0:2112 -2983:2:1652 -2984:2:1656 -2985:2:1657 -2986:2:1665 -2987:2:1666 -2988:2:1670 -2989:2:1671 -2990:2:1679 -2991:2:1684 -2992:2:1688 -2993:2:1689 -2994:2:1696 -2995:2:1697 -2996:2:1708 -2997:2:1716 -2998:2:1717 -2999:2:1721 -3000:2:1726 -3001:2:1727 -3002:0:2112 -3003:2:1739 -3004:0:2112 -3005:2:1560 -3006:0:2112 -3007:2:1561 -3008:0:2112 -3009:2:1562 -3010:2:1566 -3011:2:1567 -3012:2:1575 -3013:2:1576 -3014:2:1580 -3015:2:1581 -3016:2:1589 -3017:2:1594 -3018:2:1598 -3019:2:1599 -3020:2:1606 -3021:2:1607 -3022:2:1618 -3023:2:1626 -3024:2:1627 -3025:2:1631 -3026:2:1636 -3027:2:1637 -3028:0:2112 -3029:2:1649 -3030:0:2112 -3031:2:1651 -3032:0:2112 -3033:1:302 -3034:0:2112 -3035:2:1652 -3036:2:1656 -3037:2:1657 -3038:2:1665 -3039:2:1666 -3040:2:1670 -3041:2:1671 -3042:2:1679 -3043:2:1684 -3044:2:1688 -3045:2:1689 -3046:2:1696 -3047:2:1697 -3048:2:1708 -3049:2:1716 -3050:2:1717 -3051:2:1721 -3052:2:1726 -3053:2:1727 -3054:0:2112 -3055:2:1739 -3056:0:2112 -3057:2:1560 -3058:0:2112 -3059:2:1561 -3060:0:2112 -3061:2:1562 -3062:2:1566 -3063:2:1567 -3064:2:1575 -3065:2:1576 -3066:2:1580 -3067:2:1581 -3068:2:1589 -3069:2:1594 -3070:2:1598 -3071:2:1599 -3072:2:1606 -3073:2:1607 -3074:2:1618 -3075:2:1626 -3076:2:1627 -3077:2:1631 -3078:2:1636 -3079:2:1637 -3080:0:2112 -3081:2:1649 -3082:0:2112 -3083:2:1651 -3084:0:2112 -3085:1:303 -3086:0:2112 -3087:1:304 -3088:0:2112 -3089:1:305 -3090:0:2112 -3091:1:306 -3092:0:2112 -3093:1:308 -3094:0:2112 -3095:2:1652 -3096:2:1656 -3097:2:1657 -3098:2:1665 -3099:2:1666 -3100:2:1670 -3101:2:1671 -3102:2:1679 -3103:2:1684 -3104:2:1688 -3105:2:1689 -3106:2:1696 -3107:2:1697 -3108:2:1708 -3109:2:1716 -3110:2:1717 -3111:2:1721 -3112:2:1726 -3113:2:1727 -3114:0:2112 -3115:2:1739 -3116:0:2112 -3117:2:1560 -3118:0:2112 -3119:2:1561 -3120:0:2112 -3121:2:1562 -3122:2:1566 -3123:2:1567 -3124:2:1575 -3125:2:1576 -3126:2:1580 -3127:2:1581 -3128:2:1589 -3129:2:1594 -3130:2:1598 -3131:2:1599 -3132:2:1606 -3133:2:1607 -3134:2:1618 -3135:2:1626 -3136:2:1627 -3137:2:1631 -3138:2:1636 -3139:2:1637 -3140:0:2112 -3141:2:1649 -3142:0:2112 -3143:2:1651 -3144:0:2112 -3145:1:310 -3146:0:2112 -3147:2:1652 -3148:2:1656 -3149:2:1657 -3150:2:1665 -3151:2:1666 -3152:2:1670 -3153:2:1671 -3154:2:1679 -3155:2:1684 -3156:2:1688 -3157:2:1689 -3158:2:1696 -3159:2:1697 -3160:2:1708 -3161:2:1716 -3162:2:1717 -3163:2:1721 -3164:2:1726 -3165:2:1727 -3166:0:2112 -3167:2:1739 -3168:0:2112 -3169:2:1560 -3170:0:2112 -3171:2:1561 -3172:0:2112 -3173:2:1562 -3174:2:1566 -3175:2:1567 -3176:2:1575 -3177:2:1576 -3178:2:1580 -3179:2:1581 -3180:2:1589 -3181:2:1594 -3182:2:1598 -3183:2:1599 -3184:2:1606 -3185:2:1607 -3186:2:1618 -3187:2:1626 -3188:2:1627 -3189:2:1631 -3190:2:1636 -3191:2:1637 -3192:0:2112 -3193:2:1649 -3194:0:2112 -3195:2:1651 -3196:0:2112 -3197:1:311 -3198:1:315 -3199:1:316 -3200:1:324 -3201:1:333 -3202:1:334 -3203:1:338 -3204:1:343 -3205:1:347 -3206:1:348 -3207:1:355 -3208:1:356 -3209:1:367 -3210:1:368 -3211:1:371 -3212:1:372 -3213:1:380 -3214:1:385 -3215:1:386 -3216:0:2112 -3217:1:398 -3218:0:2112 -3219:2:1652 -3220:2:1656 -3221:2:1657 -3222:2:1665 -3223:2:1666 -3224:2:1670 -3225:2:1671 -3226:2:1679 -3227:2:1684 -3228:2:1688 -3229:2:1689 -3230:2:1696 -3231:2:1697 -3232:2:1708 -3233:2:1716 -3234:2:1717 -3235:2:1721 -3236:2:1726 -3237:2:1727 -3238:0:2112 -3239:2:1739 -3240:0:2112 -3241:2:1560 -3242:0:2112 -3243:2:1561 -3244:0:2112 -3245:2:1562 -3246:2:1566 -3247:2:1567 -3248:2:1575 -3249:2:1576 -3250:2:1580 -3251:2:1581 -3252:2:1589 -3253:2:1594 -3254:2:1598 -3255:2:1599 -3256:2:1606 -3257:2:1607 -3258:2:1618 -3259:2:1626 -3260:2:1627 -3261:2:1631 -3262:2:1636 -3263:2:1637 -3264:0:2112 -3265:2:1649 -3266:0:2112 -3267:2:1651 -3268:0:2112 -3269:1:400 -3270:0:2112 -3271:1:305 -3272:0:2112 -3273:1:306 -3274:0:2112 -3275:1:308 -3276:0:2112 -3277:2:1652 -3278:2:1656 -3279:2:1657 -3280:2:1665 -3281:2:1666 -3282:2:1670 -3283:2:1671 -3284:2:1679 -3285:2:1684 -3286:2:1688 -3287:2:1689 -3288:2:1696 -3289:2:1697 -3290:2:1708 -3291:2:1716 -3292:2:1717 -3293:2:1721 -3294:2:1726 -3295:2:1727 -3296:0:2112 -3297:2:1739 -3298:0:2112 -3299:2:1560 -3300:0:2112 -3301:2:1561 -3302:0:2112 -3303:2:1562 -3304:2:1566 -3305:2:1567 -3306:2:1575 -3307:2:1576 -3308:2:1580 -3309:2:1581 -3310:2:1589 -3311:2:1594 -3312:2:1598 -3313:2:1599 -3314:2:1606 -3315:2:1607 -3316:2:1618 -3317:2:1626 -3318:2:1627 -3319:2:1631 -3320:2:1636 -3321:2:1637 -3322:0:2112 -3323:2:1649 -3324:0:2112 -3325:2:1651 -3326:0:2112 -3327:1:310 -3328:0:2112 -3329:2:1652 -3330:2:1656 -3331:2:1657 -3332:2:1665 -3333:2:1666 -3334:2:1670 -3335:2:1671 -3336:2:1679 -3337:2:1684 -3338:2:1688 -3339:2:1689 -3340:2:1696 -3341:2:1697 -3342:2:1708 -3343:2:1716 -3344:2:1717 -3345:2:1721 -3346:2:1726 -3347:2:1727 -3348:0:2112 -3349:2:1739 -3350:0:2112 -3351:2:1560 -3352:0:2112 -3353:2:1561 -3354:0:2112 -3355:2:1562 -3356:2:1566 -3357:2:1567 -3358:2:1575 -3359:2:1576 -3360:2:1580 -3361:2:1581 -3362:2:1589 -3363:2:1594 -3364:2:1598 -3365:2:1599 -3366:2:1606 -3367:2:1607 -3368:2:1618 -3369:2:1626 -3370:2:1627 -3371:2:1631 -3372:2:1636 -3373:2:1637 -3374:0:2112 -3375:2:1649 -3376:0:2112 -3377:2:1651 -3378:0:2112 -3379:1:311 -3380:1:315 -3381:1:316 -3382:1:324 -3383:1:333 -3384:1:334 -3385:1:338 -3386:1:343 -3387:1:347 -3388:1:348 -3389:1:355 -3390:1:356 -3391:1:367 -3392:1:368 -3393:1:371 -3394:1:372 -3395:1:380 -3396:1:385 -3397:1:386 -3398:0:2112 -3399:1:398 -3400:0:2112 -3401:2:1652 -3402:2:1656 -3403:2:1657 -3404:2:1665 -3405:2:1666 -3406:2:1670 -3407:2:1671 -3408:2:1679 -3409:2:1684 -3410:2:1688 -3411:2:1689 -3412:2:1696 -3413:2:1697 -3414:2:1708 -3415:2:1716 -3416:2:1717 -3417:2:1721 -3418:2:1726 -3419:2:1727 -3420:0:2112 -3421:2:1739 -3422:0:2112 -3423:2:1560 -3424:0:2112 -3425:2:1561 -3426:0:2112 -3427:2:1562 -3428:2:1566 -3429:2:1567 -3430:2:1575 -3431:2:1576 -3432:2:1580 -3433:2:1581 -3434:2:1589 -3435:2:1594 -3436:2:1598 -3437:2:1599 -3438:2:1606 -3439:2:1607 -3440:2:1618 -3441:2:1626 -3442:2:1627 -3443:2:1631 -3444:2:1636 -3445:2:1637 -3446:0:2112 -3447:2:1649 -3448:0:2112 -3449:2:1651 -3450:0:2112 -3451:1:400 -3452:0:2112 -3453:1:404 -3454:0:2112 -3455:1:9 -3456:0:2112 -3457:1:10 -3458:0:2112 -3459:1:11 -3460:0:2112 -3461:2:1652 -3462:2:1656 -3463:2:1657 -3464:2:1665 -3465:2:1666 -3466:2:1670 -3467:2:1671 -3468:2:1679 -3469:2:1684 -3470:2:1688 -3471:2:1689 -3472:2:1696 -3473:2:1697 -3474:2:1708 -3475:2:1716 -3476:2:1717 -3477:2:1721 -3478:2:1726 -3479:2:1727 -3480:0:2112 -3481:2:1739 -3482:0:2112 -3483:2:1560 -3484:0:2112 -3485:2:1561 -3486:0:2112 -3487:2:1562 -3488:2:1566 -3489:2:1567 -3490:2:1575 -3491:2:1576 -3492:2:1580 -3493:2:1581 -3494:2:1589 -3495:2:1594 -3496:2:1598 -3497:2:1599 -3498:2:1606 -3499:2:1607 -3500:2:1618 -3501:2:1626 -3502:2:1627 -3503:2:1631 -3504:2:1636 -3505:2:1637 -3506:0:2112 -3507:2:1649 -3508:0:2112 -3509:2:1651 -3510:0:2112 -3511:1:12 -3512:1:16 -3513:1:17 -3514:1:25 -3515:1:34 -3516:1:35 -3517:1:39 -3518:1:44 -3519:1:48 -3520:1:49 -3521:1:56 -3522:1:57 -3523:1:68 -3524:1:69 -3525:1:72 -3526:1:73 -3527:1:81 -3528:1:86 -3529:1:87 -3530:0:2112 -3531:1:99 -3532:0:2112 -3533:2:1652 -3534:2:1656 -3535:2:1657 -3536:2:1665 -3537:2:1666 -3538:2:1670 -3539:2:1671 -3540:2:1679 -3541:2:1684 -3542:2:1688 -3543:2:1689 -3544:2:1696 -3545:2:1697 -3546:2:1708 -3547:2:1716 -3548:2:1717 -3549:2:1721 -3550:2:1726 -3551:2:1727 -3552:0:2112 -3553:2:1739 -3554:0:2112 -3555:2:1560 -3556:0:2112 -3557:2:1561 -3558:0:2112 -3559:2:1562 -3560:2:1566 -3561:2:1567 -3562:2:1575 -3563:2:1576 -3564:2:1580 -3565:2:1581 -3566:2:1589 -3567:2:1594 -3568:2:1598 -3569:2:1599 -3570:2:1606 -3571:2:1607 -3572:2:1618 -3573:2:1626 -3574:2:1627 -3575:2:1631 -3576:2:1636 -3577:2:1637 -3578:0:2112 -3579:2:1649 -3580:0:2112 -3581:2:1651 -3582:0:2112 -3583:1:101 -3584:0:2112 -3585:2:1652 -3586:2:1656 -3587:2:1657 -3588:2:1665 -3589:2:1666 -3590:2:1670 -3591:2:1671 -3592:2:1679 -3593:2:1684 -3594:2:1688 -3595:2:1689 -3596:2:1696 -3597:2:1697 -3598:2:1708 -3599:2:1716 -3600:2:1717 -3601:2:1721 -3602:2:1726 -3603:2:1727 -3604:0:2112 -3605:2:1739 -3606:0:2112 -3607:2:1560 -3608:0:2112 -3609:2:1561 -3610:0:2112 -3611:2:1562 -3612:2:1566 -3613:2:1567 -3614:2:1575 -3615:2:1576 -3616:2:1580 -3617:2:1581 -3618:2:1589 -3619:2:1594 -3620:2:1598 -3621:2:1599 -3622:2:1606 -3623:2:1607 -3624:2:1618 -3625:2:1626 -3626:2:1627 -3627:2:1631 -3628:2:1636 -3629:2:1637 -3630:0:2112 -3631:2:1649 -3632:0:2112 -3633:2:1651 -3634:0:2112 -3635:1:102 -3636:1:106 -3637:1:107 -3638:1:115 -3639:1:124 -3640:1:125 -3641:1:129 -3642:1:134 -3643:1:138 -3644:1:139 -3645:1:146 -3646:1:147 -3647:1:158 -3648:1:159 -3649:1:162 -3650:1:163 -3651:1:171 -3652:1:176 -3653:1:177 -3654:0:2112 -3655:1:189 -3656:0:2112 -3657:1:191 -3658:0:2112 -3659:2:1652 -3660:2:1656 -3661:2:1657 -3662:2:1665 -3663:2:1666 -3664:2:1670 -3665:2:1671 -3666:2:1679 -3667:2:1684 -3668:2:1688 -3669:2:1689 -3670:2:1696 -3671:2:1697 -3672:2:1708 -3673:2:1716 -3674:2:1717 -3675:2:1721 -3676:2:1726 -3677:2:1727 -3678:0:2112 -3679:2:1739 -3680:0:2112 -3681:2:1560 -3682:0:2112 -3683:2:1561 -3684:0:2112 -3685:2:1562 -3686:2:1566 -3687:2:1567 -3688:2:1575 -3689:2:1576 -3690:2:1580 -3691:2:1581 -3692:2:1589 -3693:2:1594 -3694:2:1598 -3695:2:1599 -3696:2:1606 -3697:2:1607 -3698:2:1618 -3699:2:1626 -3700:2:1627 -3701:2:1631 -3702:2:1636 -3703:2:1637 -3704:0:2112 -3705:2:1649 -3706:0:2112 -3707:2:1651 -3708:0:2112 -3709:1:192 -3710:0:2112 -3711:2:1652 -3712:2:1656 -3713:2:1657 -3714:2:1665 -3715:2:1666 -3716:2:1670 -3717:2:1671 -3718:2:1679 -3719:2:1684 -3720:2:1688 -3721:2:1689 -3722:2:1696 -3723:2:1697 -3724:2:1708 -3725:2:1716 -3726:2:1717 -3727:2:1721 -3728:2:1726 -3729:2:1727 -3730:0:2112 -3731:2:1739 -3732:0:2112 -3733:2:1560 -3734:0:2112 -3735:2:1561 -3736:0:2112 -3737:2:1562 -3738:2:1566 -3739:2:1567 -3740:2:1575 -3741:2:1576 -3742:2:1580 -3743:2:1581 -3744:2:1589 -3745:2:1594 -3746:2:1598 -3747:2:1599 -3748:2:1606 -3749:2:1607 -3750:2:1618 -3751:2:1626 -3752:2:1627 -3753:2:1631 -3754:2:1636 -3755:2:1637 -3756:0:2112 -3757:2:1649 -3758:0:2112 -3759:2:1651 -3760:0:2112 -3761:1:193 -3762:1:197 -3763:1:198 -3764:1:206 -3765:1:215 -3766:1:216 -3767:1:220 -3768:1:225 -3769:1:229 -3770:1:230 -3771:1:237 -3772:1:238 -3773:1:249 -3774:1:250 -3775:1:253 -3776:1:254 -3777:1:262 -3778:1:267 -3779:1:268 -3780:0:2112 -3781:1:280 -3782:0:2112 -3783:2:1652 -3784:2:1656 -3785:2:1657 -3786:2:1665 -3787:2:1666 -3788:2:1670 -3789:2:1671 -3790:2:1679 -3791:2:1684 -3792:2:1688 -3793:2:1689 -3794:2:1696 -3795:2:1697 -3796:2:1708 -3797:2:1716 -3798:2:1717 -3799:2:1721 -3800:2:1726 -3801:2:1727 -3802:0:2112 -3803:2:1739 -3804:0:2112 -3805:2:1560 -3806:0:2112 -3807:2:1561 -3808:0:2112 -3809:2:1562 -3810:2:1566 -3811:2:1567 -3812:2:1575 -3813:2:1576 -3814:2:1580 -3815:2:1581 -3816:2:1589 -3817:2:1594 -3818:2:1598 -3819:2:1599 -3820:2:1606 -3821:2:1607 -3822:2:1618 -3823:2:1626 -3824:2:1627 -3825:2:1631 -3826:2:1636 -3827:2:1637 -3828:0:2112 -3829:2:1649 -3830:0:2112 -3831:1:282 -3832:0:2112 -3833:1:291 -3834:0:2112 -3835:1:293 -3836:0:2112 -3837:1:11 -3838:0:2112 -3839:1:12 -3840:1:16 -3841:1:17 -3842:1:25 -3843:1:26 -3844:1:27 -3845:1:39 -3846:1:44 -3847:1:48 -3848:1:49 -3849:1:56 -3850:1:57 -3851:1:68 -3852:1:69 -3853:1:70 -3854:1:81 -3855:1:86 -3856:1:87 -3857:0:2112 -3858:1:99 -3859:0:2112 -3860:1:101 -3861:0:2112 -3862:1:102 -3863:1:106 -3864:1:107 -3865:1:115 -3866:1:116 -3867:1:120 -3868:1:121 -3869:1:129 -3870:1:134 -3871:1:138 -3872:1:139 -3873:1:146 -3874:1:147 -3875:1:158 -3876:1:159 -3877:1:160 -3878:1:171 -3879:1:176 -3880:1:177 -3881:0:2112 -3882:1:189 -3883:0:2112 -3884:1:285 -3885:0:2112 -3886:1:286 -3887:0:2112 -3888:1:291 -3889:0:2112 -3890:1:293 -3891:0:2112 -3892:1:296 -3893:0:2112 -3894:1:301 -3895:0:2112 -3896:1:302 -3897:0:2112 -3898:1:303 -3899:0:2112 -3900:1:304 -3901:0:2112 -3902:1:305 -3903:0:2112 -3904:1:306 -3905:0:2112 -3906:1:308 -3907:0:2112 -3908:1:310 -3909:0:2112 -3910:1:311 -3911:1:315 -3912:1:316 -3913:1:324 -3914:1:325 -3915:1:326 -3916:1:338 -3917:1:343 -3918:1:347 -3919:1:348 -3920:1:355 -3921:1:356 -3922:1:367 -3923:1:368 -3924:1:369 -3925:1:380 -3926:1:385 -3927:1:386 -3928:0:2112 -3929:1:398 -3930:0:2112 -3931:1:400 -3932:0:2112 -3933:1:305 -3934:0:2112 -3935:1:306 -3936:0:2112 -3937:1:308 -3938:0:2112 -3939:1:310 -3940:0:2112 -3941:1:311 -3942:1:315 -3943:1:316 -3944:1:324 -3945:1:325 -3946:1:326 -3947:1:338 -3948:1:343 -3949:1:347 -3950:1:348 -3951:1:355 -3952:1:356 -3953:1:367 -3954:1:368 -3955:1:369 -3956:1:380 -3957:1:385 -3958:1:386 -3959:0:2112 -3960:1:398 -3961:0:2112 -3962:1:400 -3963:0:2112 -3964:1:404 -3965:0:2112 -3966:1:9 -3967:0:2112 -3968:1:10 -3969:0:2112 -3970:1:11 -3971:0:2112 -3972:1:12 -3973:1:16 -3974:1:17 -3975:1:25 -3976:1:26 -3977:1:27 -3978:1:39 -3979:1:44 -3980:1:48 -3981:1:49 -3982:1:56 -3983:1:57 -3984:1:68 -3985:1:69 -3986:1:70 -3987:1:81 -3988:1:86 -3989:1:87 -3990:0:2112 -3991:1:99 -3992:0:2112 -3993:1:101 -3994:0:2112 -3995:1:102 -3996:1:106 -3997:1:107 -3998:1:115 -3999:1:116 -4000:1:120 -4001:1:121 -4002:1:129 -4003:1:134 -4004:1:138 -4005:1:139 -4006:1:146 -4007:1:147 -4008:1:158 -4009:1:159 -4010:1:160 -4011:1:171 -4012:1:176 -4013:1:177 -4014:0:2112 -4015:1:189 -4016:0:2112 -4017:1:191 -4018:0:2112 -4019:1:192 -4020:0:2112 -4021:1:193 -4022:1:197 -4023:1:198 -4024:1:206 -4025:1:207 -4026:1:211 -4027:1:212 -4028:1:220 -4029:1:225 -4030:1:229 -4031:1:230 -4032:1:237 -4033:1:238 -4034:1:249 -4035:1:250 -4036:1:251 -4037:1:262 -4038:1:267 -4039:1:268 -4040:0:2112 -4041:1:280 -4042:0:2112 -4043:1:282 -4044:0:2112 -4045:2:1651 -4046:0:2112 -4047:1:291 -4048:0:2112 -4049:2:1652 -4050:2:1656 -4051:2:1657 -4052:2:1665 -4053:2:1666 -4054:2:1670 -4055:2:1671 -4056:2:1679 -4057:2:1684 -4058:2:1688 -4059:2:1689 -4060:2:1696 -4061:2:1697 -4062:2:1708 -4063:2:1716 -4064:2:1717 -4065:2:1721 -4066:2:1726 -4067:2:1727 -4068:0:2112 -4069:2:1739 -4070:0:2112 -4071:2:1560 -4072:0:2112 -4073:1:293 -4074:0:2112 -4075:1:11 -4076:0:2112 -4077:1:12 -4078:1:16 -4079:1:17 -4080:1:25 -4081:1:26 -4082:1:27 -4083:1:39 -4084:1:44 -4085:1:48 -4086:1:49 -4087:1:56 -4088:1:57 -4089:1:68 -4090:1:69 -4091:1:70 -4092:1:81 -4093:1:86 -4094:1:87 -4095:0:2112 -4096:1:99 -4097:0:2112 -4098:1:101 -4099:0:2112 -4100:1:102 -4101:1:106 -4102:1:107 -4103:1:115 -4104:1:116 -4105:1:120 -4106:1:121 -4107:1:129 -4108:1:134 -4109:1:138 -4110:1:139 -4111:1:146 -4112:1:147 -4113:1:158 -4114:1:159 -4115:1:160 -4116:1:171 -4117:1:176 -4118:1:177 -4119:0:2112 -4120:1:189 -4121:0:2112 -4122:1:285 -4123:0:2112 -4124:1:286 -4125:0:2112 -4126:1:291 -4127:0:2112 -4128:1:293 -4129:0:2112 -4130:1:296 -4131:0:2112 -4132:1:301 -4133:0:2112 -4134:1:302 -4135:0:2112 -4136:1:303 -4137:0:2112 -4138:1:304 -4139:0:2112 -4140:1:305 -4141:0:2112 -4142:1:306 -4143:0:2112 -4144:1:308 -4145:0:2112 -4146:1:310 -4147:0:2112 -4148:1:311 -4149:1:315 -4150:1:316 -4151:1:324 -4152:1:325 -4153:1:326 -4154:1:338 -4155:1:343 -4156:1:347 -4157:1:348 -4158:1:355 -4159:1:356 -4160:1:367 -4161:1:368 -4162:1:369 -4163:1:380 -4164:1:385 -4165:1:386 -4166:0:2112 -4167:1:398 -4168:0:2112 -4169:1:400 -4170:0:2112 -4171:1:305 -4172:0:2112 -4173:1:306 -4174:0:2112 -4175:1:308 -4176:0:2112 -4177:1:310 -4178:0:2112 -4179:1:311 -4180:1:315 -4181:1:316 -4182:1:324 -4183:1:325 -4184:1:326 -4185:1:338 -4186:1:343 -4187:1:347 -4188:1:348 -4189:1:355 -4190:1:356 -4191:1:367 -4192:1:368 -4193:1:369 -4194:1:380 -4195:1:385 -4196:1:386 -4197:0:2112 -4198:1:398 -4199:0:2112 -4200:1:400 -4201:0:2112 -4202:1:404 -4203:0:2112 -4204:1:9 -4205:0:2112 -4206:1:10 -4207:0:2112 -4208:1:11 -4209:0:2112 -4210:1:12 -4211:1:16 -4212:1:17 -4213:1:25 -4214:1:26 -4215:1:27 -4216:1:39 -4217:1:44 -4218:1:48 -4219:1:49 -4220:1:56 -4221:1:57 -4222:1:68 -4223:1:69 -4224:1:70 -4225:1:81 -4226:1:86 -4227:1:87 -4228:0:2112 -4229:1:99 -4230:0:2112 -4231:1:101 -4232:0:2112 -4233:1:102 -4234:1:106 -4235:1:107 -4236:1:115 -4237:1:116 -4238:1:120 -4239:1:121 -4240:1:129 -4241:1:134 -4242:1:138 -4243:1:139 -4244:1:146 -4245:1:147 -4246:1:158 -4247:1:159 -4248:1:160 -4249:1:171 -4250:1:176 -4251:1:177 -4252:0:2112 -4253:1:189 -4254:0:2112 -4255:1:191 -4256:0:2112 -4257:1:192 -4258:0:2112 -4259:1:193 -4260:1:197 -4261:1:198 -4262:1:206 -4263:1:207 -4264:1:211 -4265:1:212 -4266:1:220 -4267:1:225 -4268:1:229 -4269:1:230 -4270:1:237 -4271:1:238 -4272:1:249 -4273:1:250 -4274:1:251 -4275:1:262 -4276:1:267 -4277:1:268 -4278:0:2112 -4279:1:280 -4280:0:2112 -4281:1:282 -4282:0:2112 -4283:1:291 -4284:0:2112 -4285:1:293 -4286:0:2112 -4287:2:1561 -4288:0:2112 -4289:1:11 -4290:0:2112 -4291:1:12 -4292:1:16 -4293:1:17 -4294:1:25 -4295:1:26 -4296:1:27 -4297:1:39 -4298:1:44 -4299:1:48 -4300:1:49 -4301:1:56 -4302:1:57 -4303:1:68 -4304:1:69 -4305:1:70 -4306:1:81 -4307:1:86 -4308:1:87 --1:-1:-1 -4309:0:2112 -4310:1:99 -4311:0:2112 -4312:1:101 -4313:0:2112 -4314:1:102 -4315:1:106 -4316:1:107 -4317:1:115 -4318:1:116 -4319:1:120 -4320:1:121 -4321:1:129 -4322:1:134 -4323:1:138 -4324:1:139 -4325:1:146 -4326:1:147 -4327:1:158 -4328:1:159 -4329:1:160 -4330:1:171 -4331:1:176 -4332:1:177 -4333:0:2112 -4334:1:189 -4335:0:2112 -4336:1:285 -4337:0:2112 -4338:1:286 -4339:0:2112 -4340:1:291 -4341:0:2112 -4342:1:293 -4343:0:2112 -4344:1:296 -4345:0:2112 -4346:1:301 -4347:0:2112 -4348:1:302 -4349:0:2112 -4350:1:303 -4351:0:2112 -4352:1:304 -4353:0:2112 -4354:1:305 -4355:0:2112 -4356:1:306 -4357:0:2112 -4358:1:308 -4359:0:2112 -4360:1:310 -4361:0:2112 -4362:1:311 -4363:1:315 -4364:1:316 -4365:1:324 -4366:1:325 -4367:1:326 -4368:1:338 -4369:1:343 -4370:1:347 -4371:1:348 -4372:1:355 -4373:1:356 -4374:1:367 -4375:1:368 -4376:1:369 -4377:1:380 -4378:1:385 -4379:1:386 -4380:0:2112 -4381:1:398 -4382:0:2112 -4383:1:400 -4384:0:2112 -4385:1:305 -4386:0:2112 -4387:1:306 -4388:0:2112 -4389:1:308 -4390:0:2112 -4391:1:310 -4392:0:2112 -4393:1:311 -4394:1:315 -4395:1:316 -4396:1:324 -4397:1:325 -4398:1:326 -4399:1:338 -4400:1:343 -4401:1:347 -4402:1:348 -4403:1:355 -4404:1:356 -4405:1:367 -4406:1:368 -4407:1:369 -4408:1:380 -4409:1:385 -4410:1:386 -4411:0:2112 -4412:1:398 -4413:0:2112 -4414:1:400 -4415:0:2112 -4416:1:404 -4417:0:2112 -4418:1:9 -4419:0:2112 -4420:1:10 -4421:0:2112 -4422:1:11 -4423:0:2112 -4424:1:12 -4425:1:16 -4426:1:17 -4427:1:25 -4428:1:34 -4429:1:35 -4430:1:39 -4431:1:44 -4432:1:48 -4433:1:49 -4434:1:56 -4435:1:57 -4436:1:68 -4437:1:69 -4438:1:72 -4439:1:73 -4440:1:81 -4441:1:86 -4442:1:87 -4443:0:2112 -4444:1:99 -4445:0:2112 -4446:2:1562 -4447:2:1566 -4448:2:1567 -4449:2:1575 -4450:2:1576 -4451:2:1580 -4452:2:1581 -4453:2:1589 -4454:2:1594 -4455:2:1598 -4456:2:1599 -4457:2:1606 -4458:2:1607 -4459:2:1618 -4460:2:1626 -4461:2:1627 -4462:2:1631 -4463:2:1636 -4464:2:1637 -4465:0:2112 -4466:2:1649 -4467:0:2112 -4468:2:1651 -4469:0:2112 -4470:2:1652 -4471:2:1656 -4472:2:1657 -4473:2:1665 -4474:2:1666 -4475:2:1670 -4476:2:1671 -4477:2:1679 -4478:2:1684 -4479:2:1688 -4480:2:1689 -4481:2:1696 -4482:2:1697 -4483:2:1708 -4484:2:1716 -4485:2:1717 -4486:2:1721 -4487:2:1726 -4488:2:1727 -4489:0:2112 -4490:2:1739 -4491:0:2112 -4492:2:1560 -4493:0:2112 -4494:2:1561 -4495:0:2112 -4496:1:101 -4497:0:2112 -4498:2:1562 -4499:2:1566 -4500:2:1567 -4501:2:1575 -4502:2:1576 -4503:2:1580 -4504:2:1581 -4505:2:1589 -4506:2:1594 -4507:2:1598 -4508:2:1599 -4509:2:1606 -4510:2:1607 -4511:2:1618 -4512:2:1626 -4513:2:1627 -4514:2:1631 -4515:2:1636 -4516:2:1637 -4517:0:2112 -4518:2:1649 -4519:0:2112 -4520:2:1651 -4521:0:2112 -4522:2:1652 -4523:2:1656 -4524:2:1657 -4525:2:1665 -4526:2:1666 -4527:2:1670 -4528:2:1671 -4529:2:1679 -4530:2:1684 -4531:2:1688 -4532:2:1689 -4533:2:1696 -4534:2:1697 -4535:2:1708 -4536:2:1716 -4537:2:1717 -4538:2:1721 -4539:2:1726 -4540:2:1727 -4541:0:2112 -4542:2:1739 -4543:0:2112 -4544:2:1560 -4545:0:2112 -4546:2:1561 -4547:0:2112 -4548:1:102 -4549:1:106 -4550:1:107 -4551:1:115 -4552:1:116 -4553:1:117 -4554:1:129 -4555:1:134 -4556:1:138 -4557:1:139 -4558:1:146 -4559:1:147 -4560:1:158 -4561:1:159 -4562:1:160 -4563:1:171 -4564:1:176 -4565:1:177 -4566:0:2112 -4567:1:189 -4568:0:2112 -4569:1:191 -4570:0:2112 -4571:2:1562 -4572:2:1566 -4573:2:1567 -4574:2:1575 -4575:2:1576 -4576:2:1580 -4577:2:1581 -4578:2:1589 -4579:2:1594 -4580:2:1598 -4581:2:1599 -4582:2:1606 -4583:2:1607 -4584:2:1618 -4585:2:1626 -4586:2:1627 -4587:2:1631 -4588:2:1636 -4589:2:1637 -4590:0:2112 -4591:2:1649 -4592:0:2112 -4593:2:1651 -4594:0:2112 -4595:2:1652 -4596:2:1656 -4597:2:1657 -4598:2:1665 -4599:2:1666 -4600:2:1670 -4601:2:1671 -4602:2:1679 -4603:2:1684 -4604:2:1688 -4605:2:1689 -4606:2:1696 -4607:2:1697 -4608:2:1708 -4609:2:1716 -4610:2:1717 -4611:2:1721 -4612:2:1726 -4613:2:1727 -4614:0:2112 -4615:2:1739 -4616:0:2112 -4617:2:1560 -4618:0:2112 -4619:2:1561 -4620:0:2112 -4621:1:192 -4622:0:2112 -4623:2:1562 -4624:2:1566 -4625:2:1567 -4626:2:1575 -4627:2:1576 -4628:2:1580 -4629:2:1581 -4630:2:1589 -4631:2:1594 -4632:2:1598 -4633:2:1599 -4634:2:1606 -4635:2:1607 -4636:2:1618 -4637:2:1626 -4638:2:1627 -4639:2:1631 -4640:2:1636 -4641:2:1637 -4642:0:2112 -4643:2:1649 -4644:0:2112 -4645:2:1651 -4646:0:2112 -4647:2:1652 -4648:2:1656 -4649:2:1657 -4650:2:1665 -4651:2:1666 -4652:2:1670 -4653:2:1671 -4654:2:1679 -4655:2:1684 -4656:2:1688 -4657:2:1689 -4658:2:1696 -4659:2:1697 -4660:2:1708 -4661:2:1716 -4662:2:1717 -4663:2:1721 -4664:2:1726 -4665:2:1727 -4666:0:2112 -4667:2:1739 -4668:0:2112 -4669:2:1560 -4670:0:2112 -4671:2:1561 -4672:0:2112 -4673:1:193 -4674:1:197 -4675:1:198 -4676:1:206 -4677:1:207 -4678:1:211 -4679:1:212 -4680:1:220 -4681:1:225 -4682:1:229 -4683:1:230 -4684:1:237 -4685:1:238 -4686:1:249 -4687:1:250 -4688:1:251 -4689:1:262 -4690:1:267 -4691:1:268 -4692:0:2112 -4693:1:280 -4694:0:2112 -4695:2:1562 -4696:2:1566 -4697:2:1567 -4698:2:1575 -4699:2:1576 -4700:2:1580 -4701:2:1581 -4702:2:1589 -4703:2:1594 -4704:2:1598 -4705:2:1599 -4706:2:1606 -4707:2:1607 -4708:2:1618 -4709:2:1626 -4710:2:1627 -4711:2:1631 -4712:2:1636 -4713:2:1637 -4714:0:2112 -4715:2:1649 -4716:0:2112 -4717:2:1651 -4718:0:2112 -4719:2:1652 -4720:2:1656 -4721:2:1657 -4722:2:1665 -4723:2:1666 -4724:2:1670 -4725:2:1671 -4726:2:1679 -4727:2:1684 -4728:2:1688 -4729:2:1689 -4730:2:1696 -4731:2:1697 -4732:2:1708 -4733:2:1716 -4734:2:1717 -4735:2:1721 -4736:2:1726 -4737:2:1727 -4738:0:2112 -4739:2:1739 -4740:0:2112 -4741:2:1560 -4742:0:2112 -4743:2:1561 -4744:0:2112 -4745:1:282 -4746:0:2112 -4747:1:291 -4748:0:2112 -4749:1:293 -4750:0:2112 -4751:1:11 -4752:0:2112 -4753:2:1562 -4754:2:1566 -4755:2:1567 -4756:2:1575 -4757:2:1576 -4758:2:1580 -4759:2:1581 -4760:2:1589 -4761:2:1594 -4762:2:1598 -4763:2:1599 -4764:2:1606 -4765:2:1607 -4766:2:1618 -4767:2:1626 -4768:2:1627 -4769:2:1631 -4770:2:1636 -4771:2:1637 -4772:0:2112 -4773:2:1649 -4774:0:2112 -4775:2:1651 -4776:0:2112 -4777:2:1652 -4778:2:1656 -4779:2:1657 -4780:2:1665 -4781:2:1666 -4782:2:1670 -4783:2:1671 -4784:2:1679 -4785:2:1684 -4786:2:1688 -4787:2:1689 -4788:2:1696 -4789:2:1697 -4790:2:1708 -4791:2:1716 -4792:2:1717 -4793:2:1721 -4794:2:1726 -4795:2:1727 -4796:0:2112 -4797:2:1739 -4798:0:2112 -4799:2:1560 -4800:0:2112 -4801:2:1561 -4802:0:2112 -4803:1:12 -4804:1:16 -4805:1:17 -4806:1:25 -4807:1:26 -4808:1:27 -4809:1:39 -4810:1:44 -4811:1:48 -4812:1:49 -4813:1:56 -4814:1:57 -4815:1:68 -4816:1:69 -4817:1:70 -4818:1:81 -4819:1:86 -4820:1:87 diff --git a/formal-model/urcu/result-standard-execution-nonest/DEFINES b/formal-model/urcu/result-standard-execution-nonest/DEFINES deleted file mode 100644 index 5d5147e..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/DEFINES +++ /dev/null @@ -1,17 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS diff --git a/formal-model/urcu/result-standard-execution-nonest/Makefile b/formal-model/urcu/result-standard-execution-nonest/Makefile deleted file mode 100644 index 8af320d..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/Makefile +++ /dev/null @@ -1,172 +0,0 @@ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) Mathieu Desnoyers, 2009 -# -# Authors: Mathieu Desnoyers - -#CFLAGS=-DSAFETY -#for multi-core verif, 15.5GB shared mem, use files if full -#CFLAGS=-DHASH64 -DMEMLIM=15500 -DNCORE=2 -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -DMEMLIM=15500 -DNCORE=8 - -#liveness -#CFLAGS=-DHASH64 -DCOLLAPSE -DMA=88 -CFLAGS=-DHASH64 - -SPINFILE=urcu.spin - -default: - make urcu_free | tee urcu_free.log - #nested useless with signal test. - #make urcu_free_nested | tee urcu_free_nested.log - make urcu_free_no_rmb | tee urcu_free_no_rmb.log - make urcu_free_no_wmb | tee urcu_free_no_wmb.log - make urcu_free_no_mb | tee urcu_free_no_mb.log - make urcu_free_single_flip | tee urcu_free_single_flip.log - make urcu_progress_writer | tee urcu_progress_writer.log - make urcu_progress_reader | tee urcu_progress_reader.log - make urcu_progress_writer_error | tee urcu_progress_writer_error.log - make asserts | tee asserts.log - make summary - -#show trail : spin -v -t -N pan.ltl input.spin -# after each individual make. - -summary: - @echo - @echo "Verification summary" - @grep errors: *.log - -asserts: clean - cat DEFINES > .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X .input.spin - gcc -O2 -w ${CFLAGS} -DSAFETY -o pan pan.c - ./pan -v -c1 -X -m10000000 -w20 - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free: clean urcu_free_ltl run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested: clean urcu_free_ltl urcu_free_nested_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_nested_define: - cp urcu_free_nested.define .input.define - -urcu_free_no_rmb: clean urcu_free_ltl urcu_free_no_rmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_rmb_define: - cp urcu_free_no_rmb.define .input.define - -urcu_free_no_wmb: clean urcu_free_ltl urcu_free_no_wmb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_wmb_define: - cp urcu_free_no_wmb.define .input.define - -urcu_free_no_mb: clean urcu_free_ltl urcu_free_no_mb_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_no_mb_define: - cp urcu_free_no_mb.define .input.define - -urcu_free_single_flip: clean urcu_free_ltl urcu_free_single_flip_define run - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_free_single_flip_define: - cp urcu_free_single_flip.define .input.define - -urcu_free_ltl: - touch .input.define - cat .input.define >> pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl - -# Progress checks - -urcu_progress_writer: clean urcu_progress_writer_ltl \ - urcu_progress_writer_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_define: - cp urcu_progress_writer.define .input.define - -urcu_progress_writer_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_reader: clean urcu_progress_reader_ltl \ - urcu_progress_reader_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_reader_define: - cp urcu_progress_reader.define .input.define - -urcu_progress_reader_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - -urcu_progress_writer_error: clean urcu_progress_writer_error_ltl \ - urcu_progress_writer_error_define run_weak_fair - cp .input.spin $@.spin.input - -cp .input.spin.trail $@.spin.input.trail - -urcu_progress_writer_error_define: - cp urcu_progress_writer_error.define .input.define - -urcu_progress_writer_error_ltl: - touch .input.define - cat .input.define > pan.ltl - cat DEFINES >> pan.ltl - spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl - - -run_weak_fair: pan - ./pan -a -f -v -c1 -X -m10000000 -w20 - -run: pan - ./pan -a -v -c1 -X -m10000000 -w20 - -pan: pan.c - gcc -O2 -w ${CFLAGS} -o pan pan.c - -pan.c: pan.ltl ${SPINFILE} - cat .input.define > .input.spin - cat DEFINES >> .input.spin - cat ${SPINFILE} >> .input.spin - rm -f .input.spin.trail - spin -a -X -N pan.ltl .input.spin - -.PHONY: clean default distclean summary -clean: - rm -f pan* trail.out .input.spin* *.spin.trail .input.define -distclean: - rm -f *.trail *.input *.log diff --git a/formal-model/urcu/result-standard-execution-nonest/asserts.log b/formal-model/urcu/result-standard-execution-nonest/asserts.log deleted file mode 100644 index 1071a7a..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/asserts.log +++ /dev/null @@ -1,246 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -cat DEFINES > .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w20 - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim - (none specified) - assertion violations + - cycle checks - (disabled by -DSAFETY) - invalid end states + - -State-vector 48 byte, depth reached 2084, errors: 0 - 847558 states, stored - 9221089 states, matched - 10068647 transitions (= stored+matched) - 36786866 atomic steps -hash conflicts: 2126850 (resolved) - -Stats on memory usage (in Megabytes): - 61.430 equivalent memory usage for states (stored*(State-vector + overhead)) - 45.632 actual memory usage for states (compression: 74.28%) - state-vector as stored = 28 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 511.369 total actual memory usage - -unreached in proctype urcu_reader - line 398, ".input.spin", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 61, "(1)" - line 417, ".input.spin", state 91, "(1)" - line 398, ".input.spin", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 151, "(1)" - line 417, ".input.spin", state 181, "(1)" - line 398, ".input.spin", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 242, "(1)" - line 417, ".input.spin", state 272, "(1)" - line 398, ".input.spin", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 360, "(1)" - line 417, ".input.spin", state 390, "(1)" - line 539, ".input.spin", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 398, ".input.spin", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 402, ".input.spin", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 59, "(1)" - line 412, ".input.spin", state 72, "(1)" - line 417, ".input.spin", state 89, "(1)" - line 398, ".input.spin", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 402, ".input.spin", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 153, "(1)" - line 412, ".input.spin", state 166, "(1)" - line 651, ".input.spin", state 199, "(1)" - line 174, ".input.spin", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 178, ".input.spin", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 159, ".input.spin", state 240, "(1)" - line 163, ".input.spin", state 248, "(1)" - line 167, ".input.spin", state 260, "(1)" - line 174, ".input.spin", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 407, ".input.spin", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 927, "(1)" - line 408, ".input.spin", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 408, ".input.spin", state 928, "else" - line 408, ".input.spin", state 931, "(1)" - line 408, ".input.spin", state 932, "(1)" - line 408, ".input.spin", state 932, "(1)" - line 412, ".input.spin", state 940, "(1)" - line 412, ".input.spin", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 412, ".input.spin", state 941, "else" - line 412, ".input.spin", state 944, "(1)" - line 412, ".input.spin", state 945, "(1)" - line 412, ".input.spin", state 945, "(1)" - line 410, ".input.spin", state 950, "((i<1))" - line 410, ".input.spin", state 950, "((i>=1))" - line 417, ".input.spin", state 957, "(1)" - line 417, ".input.spin", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 417, ".input.spin", state 958, "else" - line 417, ".input.spin", state 961, "(1)" - line 417, ".input.spin", state 962, "(1)" - line 417, ".input.spin", state 962, "(1)" - line 419, ".input.spin", state 965, "(1)" - line 419, ".input.spin", state 965, "(1)" - line 402, ".input.spin", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, ".input.spin", state 1040, "(1)" - line 417, ".input.spin", state 1057, "(1)" - line 402, ".input.spin", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, ".input.spin", state 1130, "(1)" - line 417, ".input.spin", state 1147, "(1)" - line 398, ".input.spin", state 1166, "(1)" - line 402, ".input.spin", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, ".input.spin", state 1222, "(1)" - line 417, ".input.spin", state 1239, "(1)" - line 402, ".input.spin", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, ".input.spin", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, ".input.spin", state 1315, "(1)" - line 417, ".input.spin", state 1332, "(1)" - line 178, ".input.spin", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 182, ".input.spin", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 159, ".input.spin", state 1378, "(1)" - line 163, ".input.spin", state 1386, "(1)" - line 167, ".input.spin", state 1398, "(1)" - line 174, ".input.spin", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 407, ".input.spin", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, ".input.spin", state 1595, "(1)" - line 408, ".input.spin", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 408, ".input.spin", state 1596, "else" - line 408, ".input.spin", state 1599, "(1)" - line 408, ".input.spin", state 1600, "(1)" - line 408, ".input.spin", state 1600, "(1)" - line 412, ".input.spin", state 1608, "(1)" - line 412, ".input.spin", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 412, ".input.spin", state 1609, "else" - line 412, ".input.spin", state 1612, "(1)" - line 412, ".input.spin", state 1613, "(1)" - line 412, ".input.spin", state 1613, "(1)" - line 410, ".input.spin", state 1618, "((i<1))" - line 410, ".input.spin", state 1618, "((i>=1))" - line 417, ".input.spin", state 1625, "(1)" - line 417, ".input.spin", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 417, ".input.spin", state 1626, "else" - line 417, ".input.spin", state 1629, "(1)" - line 417, ".input.spin", state 1630, "(1)" - line 417, ".input.spin", state 1630, "(1)" - line 419, ".input.spin", state 1633, "(1)" - line 419, ".input.spin", state 1633, "(1)" - line 178, ".input.spin", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 182, ".input.spin", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 159, ".input.spin", state 1681, "(1)" - line 163, ".input.spin", state 1689, "(1)" - line 167, ".input.spin", state 1701, "(1)" - line 174, ".input.spin", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nonest/asserts.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/asserts.spin.input.trail deleted file mode 100644 index 287e52a..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/asserts.spin.input.trail +++ /dev/null @@ -1,6 +0,0 @@ --4:-4:-4 -1:0:2673 -2:0:2674 -3:0:2675 -4:0:2676 -5:4:1129 diff --git a/formal-model/urcu/result-standard-execution-nonest/references.txt b/formal-model/urcu/result-standard-execution-nonest/references.txt deleted file mode 100644 index 72c67a2..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/references.txt +++ /dev/null @@ -1,13 +0,0 @@ -http://spinroot.com/spin/Man/ltl.html -http://en.wikipedia.org/wiki/Linear_temporal_logic -http://www.dcs.gla.ac.uk/~muffy/MRS4-2002/lect11.ppt - -http://www.lsv.ens-cachan.fr/~gastin/ltl2ba/index.php -http://spinroot.com/spin/Man/index.html -http://spinroot.com/spin/Man/promela.html - -LTL vs CTL : - -http://spinroot.com/spin/Doc/course/lecture12.pdf p. 9, p. 15, p. 18 -http://www-i2.informatik.rwth-aachen.de/i2/fileadmin/user_upload/documents/Introduction_to_Model_Checking/mc_lec18.pdf - (downloaded) diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu.sh b/formal-model/urcu/result-standard-execution-nonest/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu.spin b/formal-model/urcu/result-standard-execution-nonest/urcu.spin deleted file mode 100644 index 2cfcb70..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu.spin +++ /dev/null @@ -1,705 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free.log b/formal-model/urcu/result-standard-execution-nonest/urcu_free.log deleted file mode 100644 index 00b1f6c..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free.log +++ /dev/null @@ -1,257 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 743) - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 2560, errors: 0 - 954166 states, stored - 10460008 states, matched - 11414174 transitions (= stored+matched) - 41707752 atomic steps -hash conflicts: 2907736 (resolved) - -Stats on memory usage (in Megabytes): - 76.437 equivalent memory usage for states (stored*(State-vector + overhead)) - 58.605 actual memory usage for states (compression: 76.67%) - state-vector as stored = 36 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 524.358 total actual memory usage - -unreached in proctype urcu_reader - line 398, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 61, "(1)" - line 417, "pan.___", state 91, "(1)" - line 398, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 151, "(1)" - line 417, "pan.___", state 181, "(1)" - line 398, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 242, "(1)" - line 417, "pan.___", state 272, "(1)" - line 398, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 360, "(1)" - line 417, "pan.___", state 390, "(1)" - line 539, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 398, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 402, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 59, "(1)" - line 412, "pan.___", state 72, "(1)" - line 417, "pan.___", state 89, "(1)" - line 398, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 402, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 153, "(1)" - line 412, "pan.___", state 166, "(1)" - line 651, "pan.___", state 199, "(1)" - line 174, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 178, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 240, "(1)" - line 163, "pan.___", state 248, "(1)" - line 167, "pan.___", state 260, "(1)" - line 174, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 407, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 927, "(1)" - line 408, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 408, "pan.___", state 928, "else" - line 408, "pan.___", state 931, "(1)" - line 408, "pan.___", state 932, "(1)" - line 408, "pan.___", state 932, "(1)" - line 412, "pan.___", state 940, "(1)" - line 412, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 412, "pan.___", state 941, "else" - line 412, "pan.___", state 944, "(1)" - line 412, "pan.___", state 945, "(1)" - line 412, "pan.___", state 945, "(1)" - line 410, "pan.___", state 950, "((i<1))" - line 410, "pan.___", state 950, "((i>=1))" - line 417, "pan.___", state 957, "(1)" - line 417, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 417, "pan.___", state 958, "else" - line 417, "pan.___", state 961, "(1)" - line 417, "pan.___", state 962, "(1)" - line 417, "pan.___", state 962, "(1)" - line 419, "pan.___", state 965, "(1)" - line 419, "pan.___", state 965, "(1)" - line 402, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 1040, "(1)" - line 417, "pan.___", state 1057, "(1)" - line 402, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 1130, "(1)" - line 417, "pan.___", state 1147, "(1)" - line 398, "pan.___", state 1166, "(1)" - line 402, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 1222, "(1)" - line 417, "pan.___", state 1239, "(1)" - line 402, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 407, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 412, "pan.___", state 1315, "(1)" - line 417, "pan.___", state 1332, "(1)" - line 178, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 182, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 1378, "(1)" - line 163, "pan.___", state 1386, "(1)" - line 167, "pan.___", state 1398, "(1)" - line 174, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 407, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1595, "(1)" - line 408, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 408, "pan.___", state 1596, "else" - line 408, "pan.___", state 1599, "(1)" - line 408, "pan.___", state 1600, "(1)" - line 408, "pan.___", state 1600, "(1)" - line 412, "pan.___", state 1608, "(1)" - line 412, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 412, "pan.___", state 1609, "else" - line 412, "pan.___", state 1612, "(1)" - line 412, "pan.___", state 1613, "(1)" - line 412, "pan.___", state 1613, "(1)" - line 410, "pan.___", state 1618, "((i<1))" - line 410, "pan.___", state 1618, "((i>=1))" - line 417, "pan.___", state 1625, "(1)" - line 417, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 417, "pan.___", state 1626, "else" - line 417, "pan.___", state 1629, "(1)" - line 417, "pan.___", state 1630, "(1)" - line 417, "pan.___", state 1630, "(1)" - line 419, "pan.___", state 1633, "(1)" - line 419, "pan.___", state 1633, "(1)" - line 178, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 182, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 159, "pan.___", state 1681, "(1)" - line 163, "pan.___", state 1689, "(1)" - line 167, "pan.___", state 1701, "(1)" - line 174, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< !read_free_race) diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free.spin.input b/formal-model/urcu/result-standard-execution-nonest/urcu_free.spin.input deleted file mode 100644 index e17e80e..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free.spin.input +++ /dev/null @@ -1,722 +0,0 @@ - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_free.spin.input.trail deleted file mode 100644 index 837f3d9..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free.spin.input.trail +++ /dev/null @@ -1,15043 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4365 -2:4:4317 -3:4:4320 -4:4:4320 -5:4:4320 -6:4:4323 -7:4:4331 -8:4:4331 -9:4:4331 -10:4:4334 -11:4:4340 -12:4:4344 -13:4:4344 -14:4:4344 -15:4:4347 -16:4:4340 -17:4:4344 -18:4:4344 -19:4:4344 -20:4:4347 -21:4:4355 -22:4:4359 -23:4:4360 -24:0:4365 -25:4:4362 -26:0:4365 -27:3:2331 -28:0:4365 -29:3:2337 -30:0:4365 -31:3:2338 -32:0:4365 -33:3:2339 -34:3:2343 -35:3:2344 -36:3:2352 -37:3:2353 -38:3:2357 -39:3:2358 -40:3:2352 -41:3:2353 -42:3:2357 -43:3:2358 -44:3:2366 -45:3:2371 -46:3:2375 -47:3:2376 -48:3:2383 -49:3:2384 -50:3:2395 -51:3:2396 -52:3:2397 -53:3:2395 -54:3:2396 -55:3:2397 -56:3:2408 -57:3:2413 -58:3:2414 -59:0:4365 -60:3:2426 -61:0:4365 -62:3:2427 -63:0:4365 -64:2:1162 -65:0:4365 -66:3:2428 -67:0:4365 -68:2:1168 -69:0:4365 -70:2:1169 -71:0:4365 -72:3:2427 -73:0:4365 -74:2:1170 -75:0:4365 -76:3:2428 -77:0:4365 -78:3:2429 -79:0:4365 -80:3:2435 -81:3:2436 -82:0:4365 -83:3:2440 -84:3:2444 -85:3:2445 -86:3:2453 -87:3:2454 -88:3:2458 -89:3:2459 -90:3:2453 -91:3:2454 -92:3:2458 -93:3:2459 -94:3:2467 -95:3:2472 -96:3:2473 -97:3:2484 -98:3:2485 -99:3:2496 -100:3:2497 -101:3:2498 -102:3:2496 -103:3:2497 -104:3:2498 -105:3:2509 -106:3:2514 -107:3:2515 -108:0:4365 -109:3:2527 -110:0:4365 -111:3:2528 -112:0:4365 -113:2:1173 -114:0:4365 -115:3:2529 -116:0:4365 -117:2:1179 -118:0:4365 -119:2:1180 -120:0:4365 -121:3:2528 -122:0:4365 -123:2:1181 -124:2:1185 -125:2:1186 -126:2:1194 -127:2:1195 -128:2:1199 -129:2:1200 -130:2:1194 -131:2:1195 -132:2:1199 -133:2:1200 -134:2:1208 -135:2:1213 -136:2:1217 -137:2:1218 -138:2:1225 -139:2:1226 -140:2:1237 -141:2:1238 -142:2:1239 -143:2:1237 -144:2:1238 -145:2:1239 -146:2:1250 -147:2:1255 -148:2:1256 -149:0:4365 -150:3:2529 -151:0:4365 -152:2:1268 -153:0:4365 -154:3:2528 -155:0:4365 -156:2:1270 -157:0:4365 -158:3:2529 -159:0:4365 -160:2:1271 -161:2:1275 -162:2:1276 -163:2:1284 -164:2:1285 -165:2:1289 -166:2:1290 -167:2:1284 -168:2:1285 -169:2:1289 -170:2:1290 -171:2:1298 -172:2:1303 -173:2:1307 -174:2:1308 -175:2:1315 -176:2:1316 -177:2:1327 -178:2:1328 -179:2:1329 -180:2:1327 -181:2:1328 -182:2:1329 -183:2:1340 -184:2:1345 -185:2:1346 -186:0:4365 -187:2:1358 -188:0:4365 -189:2:1360 -190:0:4365 -191:3:2528 -192:0:4365 -193:2:1361 -194:0:4365 -195:3:2529 -196:0:4365 -197:2:1362 -198:2:1366 -199:2:1367 -200:2:1375 -201:2:1376 -202:2:1380 -203:2:1381 -204:2:1375 -205:2:1376 -206:2:1380 -207:2:1381 -208:2:1389 -209:2:1394 -210:2:1398 -211:2:1399 -212:2:1406 -213:2:1407 -214:2:1418 -215:2:1419 -216:2:1420 -217:2:1418 -218:2:1419 -219:2:1420 -220:2:1431 -221:2:1436 -222:2:1437 -223:0:4365 -224:2:1449 -225:0:4365 -226:3:2528 -227:0:4365 -228:2:1451 -229:0:4365 -230:3:2529 -231:0:4365 -232:2:1652 -233:0:4365 -234:2:1653 -235:0:4365 -236:2:1657 -237:0:4365 -238:2:1180 -239:0:4365 -240:3:2528 -241:0:4365 -242:2:1181 -243:2:1185 -244:2:1186 -245:2:1194 -246:2:1195 -247:2:1199 -248:2:1200 -249:2:1194 -250:2:1195 -251:2:1196 -252:2:1208 -253:2:1213 -254:2:1217 -255:2:1218 -256:2:1225 -257:2:1226 -258:2:1237 -259:2:1238 -260:2:1239 -261:2:1237 -262:2:1238 -263:2:1239 -264:2:1250 -265:2:1255 -266:2:1256 -267:0:4365 -268:3:2529 -269:0:4365 -270:2:1268 -271:0:4365 -272:3:2528 -273:0:4365 -274:2:1270 -275:0:4365 -276:3:2529 -277:0:4365 -278:2:1271 -279:2:1275 -280:2:1276 -281:2:1284 -282:2:1285 -283:2:1289 -284:2:1290 -285:2:1284 -286:2:1285 -287:2:1289 -288:2:1290 -289:2:1298 -290:2:1303 -291:2:1307 -292:2:1308 -293:2:1315 -294:2:1316 -295:2:1327 -296:2:1328 -297:2:1329 -298:2:1327 -299:2:1328 -300:2:1329 -301:2:1340 -302:2:1345 -303:2:1346 -304:0:4365 -305:2:1358 -306:0:4365 -307:2:1454 -308:0:4365 -309:3:2528 -310:0:4365 -311:2:1455 -312:0:4365 -313:3:2529 -314:0:4365 -315:2:1652 -316:0:4365 -317:2:1653 -318:0:4365 -319:2:1657 -320:0:4365 -321:2:1660 -322:0:4365 -323:3:2528 -324:0:4365 -325:2:1665 -326:2:1669 -327:2:1670 -328:2:1678 -329:2:1679 -330:2:1683 -331:2:1684 -332:2:1678 -333:2:1679 -334:2:1680 -335:2:1692 -336:2:1697 -337:2:1701 -338:2:1702 -339:2:1709 -340:2:1710 -341:2:1721 -342:2:1722 -343:2:1723 -344:2:1721 -345:2:1722 -346:2:1723 -347:2:1734 -348:2:1739 -349:2:1740 -350:0:4365 -351:3:2529 -352:0:4365 -353:2:1752 -354:0:4365 -355:3:2528 -356:0:4365 -357:2:1754 -358:0:4365 -359:3:2529 -360:0:4365 -361:2:1755 -362:2:1759 -363:2:1760 -364:2:1768 -365:2:1769 -366:2:1773 -367:2:1774 -368:2:1768 -369:2:1769 -370:2:1773 -371:2:1774 -372:2:1782 -373:2:1787 -374:2:1791 -375:2:1792 -376:2:1799 -377:2:1800 -378:2:1811 -379:2:1812 -380:2:1813 -381:2:1811 -382:2:1812 -383:2:1813 -384:2:1824 -385:2:1829 -386:2:1830 -387:0:4365 -388:2:1842 -389:0:4365 -390:3:2528 -391:0:4365 -392:2:1844 -393:0:4365 -394:3:2529 -395:0:4365 -396:2:1845 -397:2:1849 -398:2:1850 -399:2:1858 -400:2:1859 -401:2:1863 -402:2:1864 -403:2:1858 -404:2:1859 -405:2:1863 -406:2:1864 -407:2:1872 -408:2:1877 -409:2:1881 -410:2:1882 -411:2:1889 -412:2:1890 -413:2:1901 -414:2:1902 -415:2:1903 -416:2:1901 -417:2:1902 -418:2:1903 -419:2:1914 -420:2:1919 -421:2:1920 -422:0:4365 -423:2:1932 -424:0:4365 -425:3:2528 -426:0:4365 -427:2:1934 -428:0:4365 -429:3:2529 -430:0:4365 -431:2:1935 -432:0:4365 -433:2:1936 -434:0:4365 -435:2:2129 -436:0:4365 -437:2:2130 -438:0:4365 -439:2:2134 -440:0:4365 -441:3:2528 -442:0:4365 -443:2:2136 -444:0:4365 -445:3:2529 -446:0:4365 -447:2:2137 -448:2:2141 -449:2:2142 -450:2:2150 -451:2:2151 -452:2:2155 -453:2:2156 -454:2:2150 -455:2:2151 -456:2:2155 -457:2:2156 -458:2:2164 -459:2:2169 -460:2:2173 -461:2:2174 -462:2:2181 -463:2:2182 -464:2:2193 -465:2:2194 -466:2:2195 -467:2:2193 -468:2:2194 -469:2:2195 -470:2:2206 -471:2:2211 -472:2:2212 -473:0:4365 -474:2:2224 -475:0:4365 -476:3:2528 -477:0:4365 -478:2:2226 -479:0:4365 -480:3:2529 -481:0:4365 -482:2:1936 -483:0:4365 -484:2:2129 -485:0:4365 -486:2:2130 -487:0:4365 -488:2:2134 -489:0:4365 -490:3:2528 -491:0:4365 -492:2:2136 -493:0:4365 -494:3:2529 -495:0:4365 -496:2:2137 -497:2:2141 -498:2:2142 -499:2:2150 -500:2:2151 -501:2:2155 -502:2:2156 -503:2:2150 -504:2:2151 -505:2:2152 -506:2:2164 -507:2:2169 -508:2:2173 -509:2:2174 -510:2:2181 -511:2:2182 -512:2:2193 -513:2:2194 -514:2:2195 -515:2:2193 -516:2:2194 -517:2:2195 -518:2:2206 -519:2:2211 -520:2:2212 -521:0:4365 -522:2:2224 -523:0:4365 -524:3:2528 -525:0:4365 -526:2:2226 -527:0:4365 -528:3:2529 -529:0:4365 -530:2:2230 -531:0:4365 -532:3:2528 -533:0:4365 -534:2:2235 -535:2:2239 -536:2:2240 -537:2:2248 -538:2:2249 -539:2:2253 -540:2:2254 -541:2:2248 -542:2:2249 -543:2:2250 -544:2:2262 -545:2:2267 -546:2:2271 -547:2:2272 -548:2:2279 -549:2:2280 -550:2:2291 -551:2:2292 -552:2:2293 -553:2:2291 -554:2:2292 -555:2:2293 -556:2:2304 -557:2:2309 -558:2:2310 -559:0:4365 -560:3:2529 -561:0:4365 -562:2:2322 -563:0:4365 -564:2:1169 -565:0:4365 -566:3:2528 -567:0:4365 -568:2:1170 -569:0:4365 -570:3:2529 -571:0:4365 -572:3:2530 -573:0:4365 -574:3:2536 -575:0:4365 -576:3:2537 -577:0:4365 -578:3:2547 -579:0:4365 -580:3:2548 -581:0:4365 -582:3:2552 -583:3:2553 -584:3:2557 -585:3:2561 -586:3:2562 -587:3:2557 -588:3:2561 -589:3:2562 -590:3:2566 -591:3:2574 -592:3:2575 -593:3:2580 -594:3:2587 -595:3:2588 -596:3:2587 -597:3:2588 -598:3:2595 -599:3:2600 -600:0:4365 -601:3:2611 -602:0:4365 -603:3:2615 -604:3:2616 -605:3:2620 -606:3:2624 -607:3:2625 -608:3:2620 -609:3:2624 -610:3:2625 -611:3:2629 -612:3:2637 -613:3:2638 -614:3:2643 -615:3:2650 -616:3:2651 -617:3:2650 -618:3:2651 -619:3:2658 -620:3:2663 -621:0:4365 -622:3:2611 -623:0:4365 -624:3:2615 -625:3:2616 -626:3:2620 -627:3:2624 -628:3:2625 -629:3:2620 -630:3:2624 -631:3:2625 -632:3:2629 -633:3:2637 -634:3:2638 -635:3:2643 -636:3:2650 -637:3:2651 -638:3:2650 -639:3:2651 -640:3:2658 -641:3:2663 -642:0:4365 -643:3:2674 -644:0:4365 -645:3:2682 -646:3:2683 -647:3:2687 -648:3:2691 -649:3:2692 -650:3:2687 -651:3:2691 -652:3:2692 -653:3:2696 -654:3:2704 -655:3:2705 -656:3:2710 -657:3:2717 -658:3:2718 -659:3:2717 -660:3:2718 -661:3:2725 -662:3:2730 -663:0:4365 -664:3:2745 -665:0:4365 -666:3:2746 -667:0:4365 -668:2:1173 -669:0:4365 -670:3:2747 -671:0:4365 -672:2:1179 -673:0:4365 -674:2:1180 -675:0:4365 -676:3:2746 -677:0:4365 -678:2:1181 -679:2:1185 -680:2:1186 -681:2:1194 -682:2:1195 -683:2:1199 -684:2:1200 -685:2:1194 -686:2:1195 -687:2:1199 -688:2:1200 -689:2:1208 -690:2:1213 -691:2:1217 -692:2:1218 -693:2:1225 -694:2:1226 -695:2:1237 -696:2:1238 -697:2:1239 -698:2:1237 -699:2:1238 -700:2:1239 -701:2:1250 -702:2:1255 -703:2:1256 -704:0:4365 -705:3:2747 -706:0:4365 -707:2:1268 -708:0:4365 -709:3:2746 -710:0:4365 -711:2:1270 -712:0:4365 -713:3:2747 -714:0:4365 -715:2:1271 -716:2:1275 -717:2:1276 -718:2:1284 -719:2:1285 -720:2:1289 -721:2:1290 -722:2:1284 -723:2:1285 -724:2:1289 -725:2:1290 -726:2:1298 -727:2:1303 -728:2:1307 -729:2:1308 -730:2:1315 -731:2:1316 -732:2:1327 -733:2:1328 -734:2:1329 -735:2:1327 -736:2:1328 -737:2:1329 -738:2:1340 -739:2:1345 -740:2:1346 -741:0:4365 -742:2:1358 -743:0:4365 -744:2:1360 -745:0:4365 -746:3:2746 -747:0:4365 -748:2:1361 -749:0:4365 -750:3:2747 -751:0:4365 -752:2:1362 -753:2:1366 -754:2:1367 -755:2:1375 -756:2:1376 -757:2:1380 -758:2:1381 -759:2:1375 -760:2:1376 -761:2:1380 -762:2:1381 -763:2:1389 -764:2:1394 -765:2:1398 -766:2:1399 -767:2:1406 -768:2:1407 -769:2:1418 -770:2:1419 -771:2:1420 -772:2:1418 -773:2:1419 -774:2:1420 -775:2:1431 -776:2:1436 -777:2:1437 -778:0:4365 -779:2:1449 -780:0:4365 -781:3:2746 -782:0:4365 -783:2:1451 -784:0:4365 -785:3:2747 -786:0:4365 -787:2:1652 -788:0:4365 -789:2:1653 -790:0:4365 -791:2:1657 -792:0:4365 -793:2:1180 -794:0:4365 -795:3:2746 -796:0:4365 -797:2:1181 -798:2:1185 -799:2:1186 -800:2:1194 -801:2:1195 -802:2:1199 -803:2:1200 -804:2:1194 -805:2:1195 -806:2:1196 -807:2:1208 -808:2:1213 -809:2:1217 -810:2:1218 -811:2:1225 -812:2:1226 -813:2:1237 -814:2:1238 -815:2:1239 -816:2:1237 -817:2:1238 -818:2:1239 -819:2:1250 -820:2:1255 -821:2:1256 -822:0:4365 -823:3:2747 -824:0:4365 -825:2:1268 -826:0:4365 -827:3:2746 -828:0:4365 -829:2:1270 -830:0:4365 -831:3:2747 -832:0:4365 -833:2:1271 -834:2:1275 -835:2:1276 -836:2:1284 -837:2:1285 -838:2:1289 -839:2:1290 -840:2:1284 -841:2:1285 -842:2:1289 -843:2:1290 -844:2:1298 -845:2:1303 -846:2:1307 -847:2:1308 -848:2:1315 -849:2:1316 -850:2:1327 -851:2:1328 -852:2:1329 -853:2:1327 -854:2:1328 -855:2:1329 -856:2:1340 -857:2:1345 -858:2:1346 -859:0:4365 -860:2:1358 -861:0:4365 -862:2:1454 -863:0:4365 -864:3:2746 -865:0:4365 -866:2:1455 -867:0:4365 -868:3:2747 -869:0:4365 -870:2:1652 -871:0:4365 -872:2:1653 -873:0:4365 -874:2:1657 -875:0:4365 -876:2:1660 -877:0:4365 -878:3:2746 -879:0:4365 -880:2:1665 -881:2:1669 -882:2:1670 -883:2:1678 -884:2:1679 -885:2:1683 -886:2:1684 -887:2:1678 -888:2:1679 -889:2:1680 -890:2:1692 -891:2:1697 -892:2:1701 -893:2:1702 -894:2:1709 -895:2:1710 -896:2:1721 -897:2:1722 -898:2:1723 -899:2:1721 -900:2:1722 -901:2:1723 -902:2:1734 -903:2:1739 -904:2:1740 -905:0:4365 -906:3:2747 -907:0:4365 -908:2:1752 -909:0:4365 -910:3:2746 -911:0:4365 -912:2:1754 -913:0:4365 -914:3:2747 -915:0:4365 -916:2:1755 -917:2:1759 -918:2:1760 -919:2:1768 -920:2:1769 -921:2:1773 -922:2:1774 -923:2:1768 -924:2:1769 -925:2:1773 -926:2:1774 -927:2:1782 -928:2:1787 -929:2:1791 -930:2:1792 -931:2:1799 -932:2:1800 -933:2:1811 -934:2:1812 -935:2:1813 -936:2:1811 -937:2:1812 -938:2:1813 -939:2:1824 -940:2:1829 -941:2:1830 -942:0:4365 -943:2:1842 -944:0:4365 -945:3:2746 -946:0:4365 -947:2:1844 -948:0:4365 -949:3:2747 -950:0:4365 -951:2:1845 -952:2:1849 -953:2:1850 -954:2:1858 -955:2:1859 -956:2:1863 -957:2:1864 -958:2:1858 -959:2:1859 -960:2:1863 -961:2:1864 -962:2:1872 -963:2:1877 -964:2:1881 -965:2:1882 -966:2:1889 -967:2:1890 -968:2:1901 -969:2:1902 -970:2:1903 -971:2:1901 -972:2:1902 -973:2:1903 -974:2:1914 -975:2:1919 -976:2:1920 -977:0:4365 -978:2:1932 -979:0:4365 -980:3:2746 -981:0:4365 -982:2:1934 -983:0:4365 -984:3:2747 -985:0:4365 -986:2:1935 -987:0:4365 -988:2:1936 -989:0:4365 -990:2:2129 -991:0:4365 -992:2:2130 -993:0:4365 -994:2:2134 -995:0:4365 -996:3:2746 -997:0:4365 -998:2:2136 -999:0:4365 -1000:3:2747 -1001:0:4365 -1002:2:2137 -1003:2:2141 -1004:2:2142 -1005:2:2150 -1006:2:2151 -1007:2:2155 -1008:2:2156 -1009:2:2150 -1010:2:2151 -1011:2:2155 -1012:2:2156 -1013:2:2164 -1014:2:2169 -1015:2:2173 -1016:2:2174 -1017:2:2181 -1018:2:2182 -1019:2:2193 -1020:2:2194 -1021:2:2195 -1022:2:2193 -1023:2:2194 -1024:2:2195 -1025:2:2206 -1026:2:2211 -1027:2:2212 -1028:0:4365 -1029:2:2224 -1030:0:4365 -1031:3:2746 -1032:0:4365 -1033:2:2226 -1034:0:4365 -1035:3:2747 -1036:0:4365 -1037:2:1936 -1038:0:4365 -1039:2:2129 -1040:0:4365 -1041:2:2130 -1042:0:4365 -1043:2:2134 -1044:0:4365 -1045:3:2746 -1046:0:4365 -1047:2:2136 -1048:0:4365 -1049:3:2747 -1050:0:4365 -1051:2:2137 -1052:2:2141 -1053:2:2142 -1054:2:2150 -1055:2:2151 -1056:2:2155 -1057:2:2156 -1058:2:2150 -1059:2:2151 -1060:2:2152 -1061:2:2164 -1062:2:2169 -1063:2:2173 -1064:2:2174 -1065:2:2181 -1066:2:2182 -1067:2:2193 -1068:2:2194 -1069:2:2195 -1070:2:2193 -1071:2:2194 -1072:2:2195 -1073:2:2206 -1074:2:2211 -1075:2:2212 -1076:0:4365 -1077:2:2224 -1078:0:4365 -1079:3:2746 -1080:0:4365 -1081:2:2226 -1082:0:4365 -1083:3:2747 -1084:0:4365 -1085:2:2230 -1086:0:4365 -1087:3:2746 -1088:0:4365 -1089:2:2235 -1090:2:2239 -1091:2:2240 -1092:2:2248 -1093:2:2249 -1094:2:2253 -1095:2:2254 -1096:2:2248 -1097:2:2249 -1098:2:2250 -1099:2:2262 -1100:2:2267 -1101:2:2271 -1102:2:2272 -1103:2:2279 -1104:2:2280 -1105:2:2291 -1106:2:2292 -1107:2:2293 -1108:2:2291 -1109:2:2292 -1110:2:2293 -1111:2:2304 -1112:2:2309 -1113:2:2310 -1114:0:4365 -1115:3:2747 -1116:0:4365 -1117:2:2322 -1118:0:4365 -1119:2:1169 -1120:0:4365 -1121:3:2746 -1122:0:4365 -1123:2:1170 -1124:0:4365 -1125:3:2747 -1126:0:4365 -1127:3:2748 -1128:0:4365 -1129:3:2754 -1130:0:4365 -1131:3:2755 -1132:3:2759 -1133:3:2760 -1134:3:2768 -1135:3:2769 -1136:3:2773 -1137:3:2774 -1138:3:2768 -1139:3:2769 -1140:3:2773 -1141:3:2774 -1142:3:2782 -1143:3:2787 -1144:3:2791 -1145:3:2792 -1146:3:2799 -1147:3:2800 -1148:3:2811 -1149:3:2812 -1150:3:2813 -1151:3:2811 -1152:3:2812 -1153:3:2813 -1154:3:2824 -1155:3:2829 -1156:3:2830 -1157:0:4365 -1158:3:2842 -1159:0:4365 -1160:3:2843 -1161:0:4365 -1162:2:1173 -1163:0:4365 -1164:3:2844 -1165:0:4365 -1166:2:1179 -1167:0:4365 -1168:2:1180 -1169:0:4365 -1170:3:2843 -1171:0:4365 -1172:2:1181 -1173:2:1185 -1174:2:1186 -1175:2:1194 -1176:2:1195 -1177:2:1199 -1178:2:1200 -1179:2:1194 -1180:2:1195 -1181:2:1199 -1182:2:1200 -1183:2:1208 -1184:2:1213 -1185:2:1217 -1186:2:1218 -1187:2:1225 -1188:2:1226 -1189:2:1237 -1190:2:1238 -1191:2:1239 -1192:2:1237 -1193:2:1238 -1194:2:1239 -1195:2:1250 -1196:2:1255 -1197:2:1256 -1198:0:4365 -1199:3:2844 -1200:0:4365 -1201:2:1268 -1202:0:4365 -1203:3:2843 -1204:0:4365 -1205:2:1270 -1206:0:4365 -1207:3:2844 -1208:0:4365 -1209:2:1271 -1210:2:1275 -1211:2:1276 -1212:2:1284 -1213:2:1285 -1214:2:1289 -1215:2:1290 -1216:2:1284 -1217:2:1285 -1218:2:1289 -1219:2:1290 -1220:2:1298 -1221:2:1303 -1222:2:1307 -1223:2:1308 -1224:2:1315 -1225:2:1316 -1226:2:1327 -1227:2:1328 -1228:2:1329 -1229:2:1327 -1230:2:1328 -1231:2:1329 -1232:2:1340 -1233:2:1345 -1234:2:1346 -1235:0:4365 -1236:2:1358 -1237:0:4365 -1238:2:1360 -1239:0:4365 -1240:3:2843 -1241:0:4365 -1242:2:1361 -1243:0:4365 -1244:3:2844 -1245:0:4365 -1246:2:1362 -1247:2:1366 -1248:2:1367 -1249:2:1375 -1250:2:1376 -1251:2:1380 -1252:2:1381 -1253:2:1375 -1254:2:1376 -1255:2:1380 -1256:2:1381 -1257:2:1389 -1258:2:1394 -1259:2:1398 -1260:2:1399 -1261:2:1406 -1262:2:1407 -1263:2:1418 -1264:2:1419 -1265:2:1420 -1266:2:1418 -1267:2:1419 -1268:2:1420 -1269:2:1431 -1270:2:1436 -1271:2:1437 -1272:0:4365 -1273:2:1449 -1274:0:4365 -1275:3:2843 -1276:0:4365 -1277:2:1451 -1278:0:4365 -1279:3:2844 -1280:0:4365 -1281:2:1652 -1282:0:4365 -1283:2:1653 -1284:0:4365 -1285:2:1657 -1286:0:4365 -1287:2:1180 -1288:0:4365 -1289:3:2843 -1290:0:4365 -1291:2:1181 -1292:2:1185 -1293:2:1186 -1294:2:1194 -1295:2:1195 -1296:2:1199 -1297:2:1200 -1298:2:1194 -1299:2:1195 -1300:2:1196 -1301:2:1208 -1302:2:1213 -1303:2:1217 -1304:2:1218 -1305:2:1225 -1306:2:1226 -1307:2:1237 -1308:2:1238 -1309:2:1239 -1310:2:1237 -1311:2:1238 -1312:2:1239 -1313:2:1250 -1314:2:1255 -1315:2:1256 -1316:0:4365 -1317:3:2844 -1318:0:4365 -1319:2:1268 -1320:0:4365 -1321:3:2843 -1322:0:4365 -1323:2:1270 -1324:0:4365 -1325:3:2844 -1326:0:4365 -1327:2:1271 -1328:2:1275 -1329:2:1276 -1330:2:1284 -1331:2:1285 -1332:2:1289 -1333:2:1290 -1334:2:1284 -1335:2:1285 -1336:2:1289 -1337:2:1290 -1338:2:1298 -1339:2:1303 -1340:2:1307 -1341:2:1308 -1342:2:1315 -1343:2:1316 -1344:2:1327 -1345:2:1328 -1346:2:1329 -1347:2:1327 -1348:2:1328 -1349:2:1329 -1350:2:1340 -1351:2:1345 -1352:2:1346 -1353:0:4365 -1354:2:1358 -1355:0:4365 -1356:2:1454 -1357:0:4365 -1358:3:2843 -1359:0:4365 -1360:2:1455 -1361:0:4365 -1362:3:2844 -1363:0:4365 -1364:2:1652 -1365:0:4365 -1366:2:1653 -1367:0:4365 -1368:2:1657 -1369:0:4365 -1370:2:1660 -1371:0:4365 -1372:3:2843 -1373:0:4365 -1374:2:1665 -1375:2:1669 -1376:2:1670 -1377:2:1678 -1378:2:1679 -1379:2:1683 -1380:2:1684 -1381:2:1678 -1382:2:1679 -1383:2:1680 -1384:2:1692 -1385:2:1697 -1386:2:1701 -1387:2:1702 -1388:2:1709 -1389:2:1710 -1390:2:1721 -1391:2:1722 -1392:2:1723 -1393:2:1721 -1394:2:1722 -1395:2:1723 -1396:2:1734 -1397:2:1739 -1398:2:1740 -1399:0:4365 -1400:3:2844 -1401:0:4365 -1402:2:1752 -1403:0:4365 -1404:3:2843 -1405:0:4365 -1406:2:1754 -1407:0:4365 -1408:3:2844 -1409:0:4365 -1410:2:1755 -1411:2:1759 -1412:2:1760 -1413:2:1768 -1414:2:1769 -1415:2:1773 -1416:2:1774 -1417:2:1768 -1418:2:1769 -1419:2:1773 -1420:2:1774 -1421:2:1782 -1422:2:1787 -1423:2:1791 -1424:2:1792 -1425:2:1799 -1426:2:1800 -1427:2:1811 -1428:2:1812 -1429:2:1813 -1430:2:1811 -1431:2:1812 -1432:2:1813 -1433:2:1824 -1434:2:1829 -1435:2:1830 -1436:0:4365 -1437:2:1842 -1438:0:4365 -1439:3:2843 -1440:0:4365 -1441:2:1844 -1442:0:4365 -1443:3:2844 -1444:0:4365 -1445:2:1845 -1446:2:1849 -1447:2:1850 -1448:2:1858 -1449:2:1859 -1450:2:1863 -1451:2:1864 -1452:2:1858 -1453:2:1859 -1454:2:1863 -1455:2:1864 -1456:2:1872 -1457:2:1877 -1458:2:1881 -1459:2:1882 -1460:2:1889 -1461:2:1890 -1462:2:1901 -1463:2:1902 -1464:2:1903 -1465:2:1901 -1466:2:1902 -1467:2:1903 -1468:2:1914 -1469:2:1919 -1470:2:1920 -1471:0:4365 -1472:2:1932 -1473:0:4365 -1474:3:2843 -1475:0:4365 -1476:2:1934 -1477:0:4365 -1478:3:2844 -1479:0:4365 -1480:2:1935 -1481:0:4365 -1482:2:1936 -1483:0:4365 -1484:2:2129 -1485:0:4365 -1486:2:2130 -1487:0:4365 -1488:2:2134 -1489:0:4365 -1490:3:2843 -1491:0:4365 -1492:2:2136 -1493:0:4365 -1494:3:2844 -1495:0:4365 -1496:2:2137 -1497:2:2141 -1498:2:2142 -1499:2:2150 -1500:2:2151 -1501:2:2155 -1502:2:2156 -1503:2:2150 -1504:2:2151 -1505:2:2155 -1506:2:2156 -1507:2:2164 -1508:2:2169 -1509:2:2173 -1510:2:2174 -1511:2:2181 -1512:2:2182 -1513:2:2193 -1514:2:2194 -1515:2:2195 -1516:2:2193 -1517:2:2194 -1518:2:2195 -1519:2:2206 -1520:2:2211 -1521:2:2212 -1522:0:4365 -1523:2:2224 -1524:0:4365 -1525:3:2843 -1526:0:4365 -1527:2:2226 -1528:0:4365 -1529:3:2844 -1530:0:4365 -1531:2:1936 -1532:0:4365 -1533:2:2129 -1534:0:4365 -1535:2:2130 -1536:0:4365 -1537:2:2134 -1538:0:4365 -1539:3:2843 -1540:0:4365 -1541:2:2136 -1542:0:4365 -1543:3:2844 -1544:0:4365 -1545:2:2137 -1546:2:2141 -1547:2:2142 -1548:2:2150 -1549:2:2151 -1550:2:2155 -1551:2:2156 -1552:2:2150 -1553:2:2151 -1554:2:2152 -1555:2:2164 -1556:2:2169 -1557:2:2173 -1558:2:2174 -1559:2:2181 -1560:2:2182 -1561:2:2193 -1562:2:2194 -1563:2:2195 -1564:2:2193 -1565:2:2194 -1566:2:2195 -1567:2:2206 -1568:2:2211 -1569:2:2212 -1570:0:4365 -1571:2:2224 -1572:0:4365 -1573:3:2843 -1574:0:4365 -1575:2:2226 -1576:0:4365 -1577:3:2844 -1578:0:4365 -1579:2:2230 -1580:0:4365 -1581:3:2843 -1582:0:4365 -1583:2:2235 -1584:2:2239 -1585:2:2240 -1586:2:2248 -1587:2:2249 -1588:2:2253 -1589:2:2254 -1590:2:2248 -1591:2:2249 -1592:2:2250 -1593:2:2262 -1594:2:2267 -1595:2:2271 -1596:2:2272 -1597:2:2279 -1598:2:2280 -1599:2:2291 -1600:2:2292 -1601:2:2293 -1602:2:2291 -1603:2:2292 -1604:2:2293 -1605:2:2304 -1606:2:2309 -1607:2:2310 -1608:0:4365 -1609:3:2844 -1610:0:4365 -1611:2:2322 -1612:0:4365 -1613:2:1169 -1614:0:4365 -1615:3:2843 -1616:0:4365 -1617:2:1170 -1618:0:4365 -1619:3:2844 -1620:0:4365 -1621:3:2845 -1622:0:4365 -1623:3:2851 -1624:0:4365 -1625:3:2854 -1626:3:2855 -1627:3:2867 -1628:3:2868 -1629:3:2872 -1630:3:2873 -1631:3:2867 -1632:3:2868 -1633:3:2872 -1634:3:2873 -1635:3:2881 -1636:3:2886 -1637:3:2890 -1638:3:2891 -1639:3:2898 -1640:3:2899 -1641:3:2910 -1642:3:2911 -1643:3:2912 -1644:3:2910 -1645:3:2911 -1646:3:2912 -1647:3:2923 -1648:3:2928 -1649:3:2929 -1650:0:4365 -1651:3:2941 -1652:0:4365 -1653:3:2942 -1654:0:4365 -1655:2:1173 -1656:0:4365 -1657:3:2943 -1658:0:4365 -1659:2:1179 -1660:0:4365 -1661:2:1180 -1662:0:4365 -1663:3:2942 -1664:0:4365 -1665:2:1181 -1666:2:1185 -1667:2:1186 -1668:2:1194 -1669:2:1195 -1670:2:1199 -1671:2:1200 -1672:2:1194 -1673:2:1195 -1674:2:1199 -1675:2:1200 -1676:2:1208 -1677:2:1213 -1678:2:1217 -1679:2:1218 -1680:2:1225 -1681:2:1226 -1682:2:1237 -1683:2:1238 -1684:2:1239 -1685:2:1237 -1686:2:1238 -1687:2:1239 -1688:2:1250 -1689:2:1255 -1690:2:1256 -1691:0:4365 -1692:3:2943 -1693:0:4365 -1694:2:1268 -1695:0:4365 -1696:3:2942 -1697:0:4365 -1698:2:1270 -1699:0:4365 -1700:3:2943 -1701:0:4365 -1702:2:1271 -1703:2:1275 -1704:2:1276 -1705:2:1284 -1706:2:1285 -1707:2:1289 -1708:2:1290 -1709:2:1284 -1710:2:1285 -1711:2:1289 -1712:2:1290 -1713:2:1298 -1714:2:1303 -1715:2:1307 -1716:2:1308 -1717:2:1315 -1718:2:1316 -1719:2:1327 -1720:2:1328 -1721:2:1329 -1722:2:1327 -1723:2:1328 -1724:2:1329 -1725:2:1340 -1726:2:1345 -1727:2:1346 -1728:0:4365 -1729:2:1358 -1730:0:4365 -1731:2:1360 -1732:0:4365 -1733:3:2942 -1734:0:4365 -1735:2:1361 -1736:0:4365 -1737:3:2943 -1738:0:4365 -1739:2:1362 -1740:2:1366 -1741:2:1367 -1742:2:1375 -1743:2:1376 -1744:2:1380 -1745:2:1381 -1746:2:1375 -1747:2:1376 -1748:2:1380 -1749:2:1381 -1750:2:1389 -1751:2:1394 -1752:2:1398 -1753:2:1399 -1754:2:1406 -1755:2:1407 -1756:2:1418 -1757:2:1419 -1758:2:1420 -1759:2:1418 -1760:2:1419 -1761:2:1420 -1762:2:1431 -1763:2:1436 -1764:2:1437 -1765:0:4365 -1766:2:1449 -1767:0:4365 -1768:3:2942 -1769:0:4365 -1770:2:1451 -1771:0:4365 -1772:3:2943 -1773:0:4365 -1774:2:1652 -1775:0:4365 -1776:2:1653 -1777:0:4365 -1778:2:1657 -1779:0:4365 -1780:2:1180 -1781:0:4365 -1782:3:2942 -1783:0:4365 -1784:2:1181 -1785:2:1185 -1786:2:1186 -1787:2:1194 -1788:2:1195 -1789:2:1199 -1790:2:1200 -1791:2:1194 -1792:2:1195 -1793:2:1196 -1794:2:1208 -1795:2:1213 -1796:2:1217 -1797:2:1218 -1798:2:1225 -1799:2:1226 -1800:2:1237 -1801:2:1238 -1802:2:1239 -1803:2:1237 -1804:2:1238 -1805:2:1239 -1806:2:1250 -1807:2:1255 -1808:2:1256 -1809:0:4365 -1810:3:2943 -1811:0:4365 -1812:2:1268 -1813:0:4365 -1814:3:2942 -1815:0:4365 -1816:2:1270 -1817:0:4365 -1818:3:2943 -1819:0:4365 -1820:2:1271 -1821:2:1275 -1822:2:1276 -1823:2:1284 -1824:2:1285 -1825:2:1289 -1826:2:1290 -1827:2:1284 -1828:2:1285 -1829:2:1289 -1830:2:1290 -1831:2:1298 -1832:2:1303 -1833:2:1307 -1834:2:1308 -1835:2:1315 -1836:2:1316 -1837:2:1327 -1838:2:1328 -1839:2:1329 -1840:2:1327 -1841:2:1328 -1842:2:1329 -1843:2:1340 -1844:2:1345 -1845:2:1346 -1846:0:4365 -1847:2:1358 -1848:0:4365 -1849:2:1454 -1850:0:4365 -1851:3:2942 -1852:0:4365 -1853:2:1455 -1854:0:4365 -1855:3:2943 -1856:0:4365 -1857:2:1652 -1858:0:4365 -1859:2:1653 -1860:0:4365 -1861:2:1657 -1862:0:4365 -1863:2:1660 -1864:0:4365 -1865:3:2942 -1866:0:4365 -1867:2:1665 -1868:2:1669 -1869:2:1670 -1870:2:1678 -1871:2:1679 -1872:2:1683 -1873:2:1684 -1874:2:1678 -1875:2:1679 -1876:2:1680 -1877:2:1692 -1878:2:1697 -1879:2:1701 -1880:2:1702 -1881:2:1709 -1882:2:1710 -1883:2:1721 -1884:2:1722 -1885:2:1723 -1886:2:1721 -1887:2:1722 -1888:2:1723 -1889:2:1734 -1890:2:1739 -1891:2:1740 -1892:0:4365 -1893:3:2943 -1894:0:4365 -1895:2:1752 -1896:0:4365 -1897:3:2942 -1898:0:4365 -1899:2:1754 -1900:0:4365 -1901:3:2943 -1902:0:4365 -1903:2:1755 -1904:2:1759 -1905:2:1760 -1906:2:1768 -1907:2:1769 -1908:2:1773 -1909:2:1774 -1910:2:1768 -1911:2:1769 -1912:2:1773 -1913:2:1774 -1914:2:1782 -1915:2:1787 -1916:2:1791 -1917:2:1792 -1918:2:1799 -1919:2:1800 -1920:2:1811 -1921:2:1812 -1922:2:1813 -1923:2:1811 -1924:2:1812 -1925:2:1813 -1926:2:1824 -1927:2:1829 -1928:2:1830 -1929:0:4365 -1930:2:1842 -1931:0:4365 -1932:3:2942 -1933:0:4365 -1934:2:1844 -1935:0:4365 -1936:3:2943 -1937:0:4365 -1938:2:1845 -1939:2:1849 -1940:2:1850 -1941:2:1858 -1942:2:1859 -1943:2:1863 -1944:2:1864 -1945:2:1858 -1946:2:1859 -1947:2:1863 -1948:2:1864 -1949:2:1872 -1950:2:1877 -1951:2:1881 -1952:2:1882 -1953:2:1889 -1954:2:1890 -1955:2:1901 -1956:2:1902 -1957:2:1903 -1958:2:1901 -1959:2:1902 -1960:2:1903 -1961:2:1914 -1962:2:1919 -1963:2:1920 -1964:0:4365 -1965:2:1932 -1966:0:4365 -1967:3:2942 -1968:0:4365 -1969:2:1934 -1970:0:4365 -1971:3:2943 -1972:0:4365 -1973:2:1935 -1974:0:4365 -1975:2:1936 -1976:0:4365 -1977:2:2129 -1978:0:4365 -1979:2:2130 -1980:0:4365 -1981:2:2134 -1982:0:4365 -1983:3:2942 -1984:0:4365 -1985:2:2136 -1986:0:4365 -1987:3:2943 -1988:0:4365 -1989:2:2137 -1990:2:2141 -1991:2:2142 -1992:2:2150 -1993:2:2151 -1994:2:2155 -1995:2:2156 -1996:2:2150 -1997:2:2151 -1998:2:2155 -1999:2:2156 -2000:2:2164 -2001:2:2169 -2002:2:2173 -2003:2:2174 -2004:2:2181 -2005:2:2182 -2006:2:2193 -2007:2:2194 -2008:2:2195 -2009:2:2193 -2010:2:2194 -2011:2:2195 -2012:2:2206 -2013:2:2211 -2014:2:2212 -2015:0:4365 -2016:2:2224 -2017:0:4365 -2018:3:2942 -2019:0:4365 -2020:2:2226 -2021:0:4365 -2022:3:2943 -2023:0:4365 -2024:2:1936 -2025:0:4365 -2026:2:2129 -2027:0:4365 -2028:2:2130 -2029:0:4365 -2030:2:2134 -2031:0:4365 -2032:3:2942 -2033:0:4365 -2034:2:2136 -2035:0:4365 -2036:3:2943 -2037:0:4365 -2038:2:2137 -2039:2:2141 -2040:2:2142 -2041:2:2150 -2042:2:2151 -2043:2:2155 -2044:2:2156 -2045:2:2150 -2046:2:2151 -2047:2:2152 -2048:2:2164 -2049:2:2169 -2050:2:2173 -2051:2:2174 -2052:2:2181 -2053:2:2182 -2054:2:2193 -2055:2:2194 -2056:2:2195 -2057:2:2193 -2058:2:2194 -2059:2:2195 -2060:2:2206 -2061:2:2211 -2062:2:2212 -2063:0:4365 -2064:2:2224 -2065:0:4365 -2066:3:2942 -2067:0:4365 -2068:2:2226 -2069:0:4365 -2070:3:2943 -2071:0:4365 -2072:2:2230 -2073:0:4365 -2074:3:2942 -2075:0:4365 -2076:2:2235 -2077:2:2239 -2078:2:2240 -2079:2:2248 -2080:2:2249 -2081:2:2253 -2082:2:2254 -2083:2:2248 -2084:2:2249 -2085:2:2250 -2086:2:2262 -2087:2:2267 -2088:2:2271 -2089:2:2272 -2090:2:2279 -2091:2:2280 -2092:2:2291 -2093:2:2292 -2094:2:2293 -2095:2:2291 -2096:2:2292 -2097:2:2293 -2098:2:2304 -2099:2:2309 -2100:2:2310 -2101:0:4365 -2102:3:2943 -2103:0:4365 -2104:2:2322 -2105:0:4365 -2106:2:1169 -2107:0:4365 -2108:3:2942 -2109:0:4365 -2110:2:1170 -2111:0:4365 -2112:3:2943 -2113:0:4365 -2114:3:2944 -2115:0:4365 -2116:3:2950 -2117:0:4365 -2118:3:2951 -2119:0:4365 -2120:3:2952 -2121:0:4365 -2122:3:2953 -2123:0:4365 -2124:3:2954 -2125:3:2958 -2126:3:2959 -2127:3:2967 -2128:3:2968 -2129:3:2972 -2130:3:2973 -2131:3:2967 -2132:3:2968 -2133:3:2972 -2134:3:2973 -2135:3:2981 -2136:3:2986 -2137:3:2990 -2138:3:2991 -2139:3:2998 -2140:3:2999 -2141:3:3010 -2142:3:3011 -2143:3:3012 -2144:3:3010 -2145:3:3011 -2146:3:3012 -2147:3:3023 -2148:3:3028 -2149:3:3029 -2150:0:4365 -2151:3:3041 -2152:0:4365 -2153:3:3042 -2154:0:4365 -2155:2:1173 -2156:0:4365 -2157:3:3043 -2158:0:4365 -2159:2:1179 -2160:0:4365 -2161:2:1180 -2162:0:4365 -2163:3:3042 -2164:0:4365 -2165:2:1181 -2166:2:1185 -2167:2:1186 -2168:2:1194 -2169:2:1195 -2170:2:1199 -2171:2:1200 -2172:2:1194 -2173:2:1195 -2174:2:1199 -2175:2:1200 -2176:2:1208 -2177:2:1213 -2178:2:1217 -2179:2:1218 -2180:2:1225 -2181:2:1226 -2182:2:1237 -2183:2:1238 -2184:2:1239 -2185:2:1237 -2186:2:1238 -2187:2:1239 -2188:2:1250 -2189:2:1255 -2190:2:1256 -2191:0:4365 -2192:3:3043 -2193:0:4365 -2194:2:1268 -2195:0:4365 -2196:3:3042 -2197:0:4365 -2198:2:1270 -2199:0:4365 -2200:3:3043 -2201:0:4365 -2202:2:1271 -2203:2:1275 -2204:2:1276 -2205:2:1284 -2206:2:1285 -2207:2:1289 -2208:2:1290 -2209:2:1284 -2210:2:1285 -2211:2:1289 -2212:2:1290 -2213:2:1298 -2214:2:1303 -2215:2:1307 -2216:2:1308 -2217:2:1315 -2218:2:1316 -2219:2:1327 -2220:2:1328 -2221:2:1329 -2222:2:1327 -2223:2:1328 -2224:2:1329 -2225:2:1340 -2226:2:1345 -2227:2:1346 -2228:0:4365 -2229:2:1358 -2230:0:4365 -2231:2:1360 -2232:0:4365 -2233:3:3042 -2234:0:4365 -2235:2:1361 -2236:0:4365 -2237:3:3043 -2238:0:4365 -2239:2:1362 -2240:2:1366 -2241:2:1367 -2242:2:1375 -2243:2:1376 -2244:2:1380 -2245:2:1381 -2246:2:1375 -2247:2:1376 -2248:2:1380 -2249:2:1381 -2250:2:1389 -2251:2:1394 -2252:2:1398 -2253:2:1399 -2254:2:1406 -2255:2:1407 -2256:2:1418 -2257:2:1419 -2258:2:1420 -2259:2:1418 -2260:2:1419 -2261:2:1420 -2262:2:1431 -2263:2:1436 -2264:2:1437 -2265:0:4365 -2266:2:1449 -2267:0:4365 -2268:3:3042 -2269:0:4365 -2270:2:1451 -2271:0:4365 -2272:3:3043 -2273:0:4365 -2274:2:1652 -2275:0:4365 -2276:2:1653 -2277:0:4365 -2278:2:1657 -2279:0:4365 -2280:2:1180 -2281:0:4365 -2282:3:3042 -2283:0:4365 -2284:2:1181 -2285:2:1185 -2286:2:1186 -2287:2:1194 -2288:2:1195 -2289:2:1199 -2290:2:1200 -2291:2:1194 -2292:2:1195 -2293:2:1196 -2294:2:1208 -2295:2:1213 -2296:2:1217 -2297:2:1218 -2298:2:1225 -2299:2:1226 -2300:2:1237 -2301:2:1238 -2302:2:1239 -2303:2:1237 -2304:2:1238 -2305:2:1239 -2306:2:1250 -2307:2:1255 -2308:2:1256 -2309:0:4365 -2310:3:3043 -2311:0:4365 -2312:2:1268 -2313:0:4365 -2314:3:3042 -2315:0:4365 -2316:2:1270 -2317:0:4365 -2318:3:3043 -2319:0:4365 -2320:2:1271 -2321:2:1275 -2322:2:1276 -2323:2:1284 -2324:2:1285 -2325:2:1289 -2326:2:1290 -2327:2:1284 -2328:2:1285 -2329:2:1289 -2330:2:1290 -2331:2:1298 -2332:2:1303 -2333:2:1307 -2334:2:1308 -2335:2:1315 -2336:2:1316 -2337:2:1327 -2338:2:1328 -2339:2:1329 -2340:2:1327 -2341:2:1328 -2342:2:1329 -2343:2:1340 -2344:2:1345 -2345:2:1346 -2346:0:4365 -2347:2:1358 -2348:0:4365 -2349:2:1454 -2350:0:4365 -2351:3:3042 -2352:0:4365 -2353:2:1455 -2354:0:4365 -2355:3:3043 -2356:0:4365 -2357:2:1652 -2358:0:4365 -2359:2:1653 -2360:0:4365 -2361:2:1657 -2362:0:4365 -2363:2:1660 -2364:0:4365 -2365:3:3042 -2366:0:4365 -2367:2:1665 -2368:2:1669 -2369:2:1670 -2370:2:1678 -2371:2:1679 -2372:2:1683 -2373:2:1684 -2374:2:1678 -2375:2:1679 -2376:2:1680 -2377:2:1692 -2378:2:1697 -2379:2:1701 -2380:2:1702 -2381:2:1709 -2382:2:1710 -2383:2:1721 -2384:2:1722 -2385:2:1723 -2386:2:1721 -2387:2:1722 -2388:2:1723 -2389:2:1734 -2390:2:1739 -2391:2:1740 -2392:0:4365 -2393:3:3043 -2394:0:4365 -2395:2:1752 -2396:0:4365 -2397:3:3042 -2398:0:4365 -2399:2:1754 -2400:0:4365 -2401:3:3043 -2402:0:4365 -2403:2:1755 -2404:2:1759 -2405:2:1760 -2406:2:1768 -2407:2:1769 -2408:2:1773 -2409:2:1774 -2410:2:1768 -2411:2:1769 -2412:2:1773 -2413:2:1774 -2414:2:1782 -2415:2:1787 -2416:2:1791 -2417:2:1792 -2418:2:1799 -2419:2:1800 -2420:2:1811 -2421:2:1812 -2422:2:1813 -2423:2:1811 -2424:2:1812 -2425:2:1813 -2426:2:1824 -2427:2:1829 -2428:2:1830 -2429:0:4365 -2430:2:1842 -2431:0:4365 -2432:3:3042 -2433:0:4365 -2434:2:1844 -2435:0:4365 -2436:3:3043 -2437:0:4365 -2438:2:1845 -2439:2:1849 -2440:2:1850 -2441:2:1858 -2442:2:1859 -2443:2:1863 -2444:2:1864 -2445:2:1858 -2446:2:1859 -2447:2:1863 -2448:2:1864 -2449:2:1872 -2450:2:1877 -2451:2:1881 -2452:2:1882 -2453:2:1889 -2454:2:1890 -2455:2:1901 -2456:2:1902 -2457:2:1903 -2458:2:1901 -2459:2:1902 -2460:2:1903 -2461:2:1914 -2462:2:1919 -2463:2:1920 -2464:0:4365 -2465:2:1932 -2466:0:4365 -2467:3:3042 -2468:0:4365 -2469:2:1934 -2470:0:4365 -2471:3:3043 -2472:0:4365 -2473:2:1935 -2474:0:4365 -2475:2:1936 -2476:0:4365 -2477:2:2129 -2478:0:4365 -2479:2:2130 -2480:0:4365 -2481:2:2134 -2482:0:4365 -2483:3:3042 -2484:0:4365 -2485:2:2136 -2486:0:4365 -2487:3:3043 -2488:0:4365 -2489:2:2137 -2490:2:2141 -2491:2:2142 -2492:2:2150 -2493:2:2151 -2494:2:2155 -2495:2:2156 -2496:2:2150 -2497:2:2151 -2498:2:2155 -2499:2:2156 -2500:2:2164 -2501:2:2169 -2502:2:2173 -2503:2:2174 -2504:2:2181 -2505:2:2182 -2506:2:2193 -2507:2:2194 -2508:2:2195 -2509:2:2193 -2510:2:2194 -2511:2:2195 -2512:2:2206 -2513:2:2211 -2514:2:2212 -2515:0:4365 -2516:2:2224 -2517:0:4365 -2518:3:3042 -2519:0:4365 -2520:2:2226 -2521:0:4365 -2522:3:3043 -2523:0:4365 -2524:2:1936 -2525:0:4365 -2526:2:2129 -2527:0:4365 -2528:2:2130 -2529:0:4365 -2530:2:2134 -2531:0:4365 -2532:3:3042 -2533:0:4365 -2534:2:2136 -2535:0:4365 -2536:3:3043 -2537:0:4365 -2538:2:2137 -2539:2:2141 -2540:2:2142 -2541:2:2150 -2542:2:2151 -2543:2:2155 -2544:2:2156 -2545:2:2150 -2546:2:2151 -2547:2:2152 -2548:2:2164 -2549:2:2169 -2550:2:2173 -2551:2:2174 -2552:2:2181 -2553:2:2182 -2554:2:2193 -2555:2:2194 -2556:2:2195 -2557:2:2193 -2558:2:2194 -2559:2:2195 -2560:2:2206 -2561:2:2211 -2562:2:2212 -2563:0:4365 -2564:2:2224 -2565:0:4365 -2566:3:3042 -2567:0:4365 -2568:2:2226 -2569:0:4365 -2570:3:3043 -2571:0:4365 -2572:2:2230 -2573:0:4365 -2574:3:3042 -2575:0:4365 -2576:2:2235 -2577:2:2239 -2578:2:2240 -2579:2:2248 -2580:2:2249 -2581:2:2253 -2582:2:2254 -2583:2:2248 -2584:2:2249 -2585:2:2250 -2586:2:2262 -2587:2:2267 -2588:2:2271 -2589:2:2272 -2590:2:2279 -2591:2:2280 -2592:2:2291 -2593:2:2292 -2594:2:2293 -2595:2:2291 -2596:2:2292 -2597:2:2293 -2598:2:2304 -2599:2:2309 -2600:2:2310 -2601:0:4365 -2602:3:3043 -2603:0:4365 -2604:2:2322 -2605:0:4365 -2606:2:1169 -2607:0:4365 -2608:3:3042 -2609:0:4365 -2610:2:1170 -2611:0:4365 -2612:3:3043 -2613:0:4365 -2614:3:3044 -2615:0:4365 -2616:3:3257 -2617:0:4365 -2618:3:3265 -2619:0:4365 -2620:3:3266 -2621:3:3270 -2622:3:3271 -2623:3:3279 -2624:3:3280 -2625:3:3284 -2626:3:3285 -2627:3:3279 -2628:3:3280 -2629:3:3284 -2630:3:3285 -2631:3:3293 -2632:3:3298 -2633:3:3302 -2634:3:3303 -2635:3:3310 -2636:3:3311 -2637:3:3322 -2638:3:3323 -2639:3:3324 -2640:3:3322 -2641:3:3323 -2642:3:3324 -2643:3:3335 -2644:3:3340 -2645:3:3341 -2646:0:4365 -2647:3:3353 -2648:0:4365 -2649:3:3354 -2650:0:4365 -2651:2:1173 -2652:0:4365 -2653:3:3355 -2654:0:4365 -2655:2:1179 -2656:0:4365 -2657:2:1180 -2658:0:4365 -2659:3:3354 -2660:0:4365 -2661:2:1181 -2662:2:1185 -2663:2:1186 -2664:2:1194 -2665:2:1195 -2666:2:1199 -2667:2:1200 -2668:2:1194 -2669:2:1195 -2670:2:1199 -2671:2:1200 -2672:2:1208 -2673:2:1213 -2674:2:1217 -2675:2:1218 -2676:2:1225 -2677:2:1226 -2678:2:1237 -2679:2:1238 -2680:2:1239 -2681:2:1237 -2682:2:1238 -2683:2:1239 -2684:2:1250 -2685:2:1255 -2686:2:1256 -2687:0:4365 -2688:3:3355 -2689:0:4365 -2690:2:1268 -2691:0:4365 -2692:3:3354 -2693:0:4365 -2694:2:1270 -2695:0:4365 -2696:3:3355 -2697:0:4365 -2698:2:1271 -2699:2:1275 -2700:2:1276 -2701:2:1284 -2702:2:1285 -2703:2:1289 -2704:2:1290 -2705:2:1284 -2706:2:1285 -2707:2:1289 -2708:2:1290 -2709:2:1298 -2710:2:1303 -2711:2:1307 -2712:2:1308 -2713:2:1315 -2714:2:1316 -2715:2:1327 -2716:2:1328 -2717:2:1329 -2718:2:1327 -2719:2:1328 -2720:2:1329 -2721:2:1340 -2722:2:1345 -2723:2:1346 -2724:0:4365 -2725:2:1358 -2726:0:4365 -2727:2:1360 -2728:0:4365 -2729:3:3354 -2730:0:4365 -2731:2:1361 -2732:0:4365 -2733:3:3355 -2734:0:4365 -2735:2:1362 -2736:2:1366 -2737:2:1367 -2738:2:1375 -2739:2:1376 -2740:2:1380 -2741:2:1381 -2742:2:1375 -2743:2:1376 -2744:2:1380 -2745:2:1381 -2746:2:1389 -2747:2:1394 -2748:2:1398 -2749:2:1399 -2750:2:1406 -2751:2:1407 -2752:2:1418 -2753:2:1419 -2754:2:1420 -2755:2:1418 -2756:2:1419 -2757:2:1420 -2758:2:1431 -2759:2:1436 -2760:2:1437 -2761:0:4365 -2762:2:1449 -2763:0:4365 -2764:3:3354 -2765:0:4365 -2766:2:1451 -2767:0:4365 -2768:3:3355 -2769:0:4365 -2770:2:1652 -2771:0:4365 -2772:2:1653 -2773:0:4365 -2774:2:1657 -2775:0:4365 -2776:2:1180 -2777:0:4365 -2778:3:3354 -2779:0:4365 -2780:2:1181 -2781:2:1185 -2782:2:1186 -2783:2:1194 -2784:2:1195 -2785:2:1199 -2786:2:1200 -2787:2:1194 -2788:2:1195 -2789:2:1196 -2790:2:1208 -2791:2:1213 -2792:2:1217 -2793:2:1218 -2794:2:1225 -2795:2:1226 -2796:2:1237 -2797:2:1238 -2798:2:1239 -2799:2:1237 -2800:2:1238 -2801:2:1239 -2802:2:1250 -2803:2:1255 -2804:2:1256 -2805:0:4365 -2806:3:3355 -2807:0:4365 -2808:2:1268 -2809:0:4365 -2810:3:3354 -2811:0:4365 -2812:2:1270 -2813:0:4365 -2814:3:3355 -2815:0:4365 -2816:2:1271 -2817:2:1275 -2818:2:1276 -2819:2:1284 -2820:2:1285 -2821:2:1289 -2822:2:1290 -2823:2:1284 -2824:2:1285 -2825:2:1289 -2826:2:1290 -2827:2:1298 -2828:2:1303 -2829:2:1307 -2830:2:1308 -2831:2:1315 -2832:2:1316 -2833:2:1327 -2834:2:1328 -2835:2:1329 -2836:2:1327 -2837:2:1328 -2838:2:1329 -2839:2:1340 -2840:2:1345 -2841:2:1346 -2842:0:4365 -2843:2:1358 -2844:0:4365 -2845:2:1454 -2846:0:4365 -2847:3:3354 -2848:0:4365 -2849:2:1455 -2850:0:4365 -2851:3:3355 -2852:0:4365 -2853:2:1652 -2854:0:4365 -2855:2:1653 -2856:0:4365 -2857:2:1657 -2858:0:4365 -2859:2:1660 -2860:0:4365 -2861:3:3354 -2862:0:4365 -2863:2:1665 -2864:2:1669 -2865:2:1670 -2866:2:1678 -2867:2:1679 -2868:2:1683 -2869:2:1684 -2870:2:1678 -2871:2:1679 -2872:2:1680 -2873:2:1692 -2874:2:1697 -2875:2:1701 -2876:2:1702 -2877:2:1709 -2878:2:1710 -2879:2:1721 -2880:2:1722 -2881:2:1723 -2882:2:1721 -2883:2:1722 -2884:2:1723 -2885:2:1734 -2886:2:1739 -2887:2:1740 -2888:0:4365 -2889:3:3355 -2890:0:4365 -2891:2:1752 -2892:0:4365 -2893:3:3354 -2894:0:4365 -2895:2:1754 -2896:0:4365 -2897:3:3355 -2898:0:4365 -2899:2:1755 -2900:2:1759 -2901:2:1760 -2902:2:1768 -2903:2:1769 -2904:2:1773 -2905:2:1774 -2906:2:1768 -2907:2:1769 -2908:2:1773 -2909:2:1774 -2910:2:1782 -2911:2:1787 -2912:2:1791 -2913:2:1792 -2914:2:1799 -2915:2:1800 -2916:2:1811 -2917:2:1812 -2918:2:1813 -2919:2:1811 -2920:2:1812 -2921:2:1813 -2922:2:1824 -2923:2:1829 -2924:2:1830 -2925:0:4365 -2926:2:1842 -2927:0:4365 -2928:3:3354 -2929:0:4365 -2930:2:1844 -2931:0:4365 -2932:3:3355 -2933:0:4365 -2934:2:1845 -2935:2:1849 -2936:2:1850 -2937:2:1858 -2938:2:1859 -2939:2:1863 -2940:2:1864 -2941:2:1858 -2942:2:1859 -2943:2:1863 -2944:2:1864 -2945:2:1872 -2946:2:1877 -2947:2:1881 -2948:2:1882 -2949:2:1889 -2950:2:1890 -2951:2:1901 -2952:2:1902 -2953:2:1903 -2954:2:1901 -2955:2:1902 -2956:2:1903 -2957:2:1914 -2958:2:1919 -2959:2:1920 -2960:0:4365 -2961:2:1932 -2962:0:4365 -2963:3:3354 -2964:0:4365 -2965:2:1934 -2966:0:4365 -2967:3:3355 -2968:0:4365 -2969:2:1935 -2970:0:4365 -2971:2:1936 -2972:0:4365 -2973:2:2129 -2974:0:4365 -2975:2:2130 -2976:0:4365 -2977:2:2134 -2978:0:4365 -2979:3:3354 -2980:0:4365 -2981:2:2136 -2982:0:4365 -2983:3:3355 -2984:0:4365 -2985:2:2137 -2986:2:2141 -2987:2:2142 -2988:2:2150 -2989:2:2151 -2990:2:2155 -2991:2:2156 -2992:2:2150 -2993:2:2151 -2994:2:2155 -2995:2:2156 -2996:2:2164 -2997:2:2169 -2998:2:2173 -2999:2:2174 -3000:2:2181 -3001:2:2182 -3002:2:2193 -3003:2:2194 -3004:2:2195 -3005:2:2193 -3006:2:2194 -3007:2:2195 -3008:2:2206 -3009:2:2211 -3010:2:2212 -3011:0:4365 -3012:2:2224 -3013:0:4365 -3014:3:3354 -3015:0:4365 -3016:2:2226 -3017:0:4365 -3018:3:3355 -3019:0:4365 -3020:2:1936 -3021:0:4365 -3022:2:2129 -3023:0:4365 -3024:2:2130 -3025:0:4365 -3026:2:2134 -3027:0:4365 -3028:3:3354 -3029:0:4365 -3030:2:2136 -3031:0:4365 -3032:3:3355 -3033:0:4365 -3034:2:2137 -3035:2:2141 -3036:2:2142 -3037:2:2150 -3038:2:2151 -3039:2:2155 -3040:2:2156 -3041:2:2150 -3042:2:2151 -3043:2:2152 -3044:2:2164 -3045:2:2169 -3046:2:2173 -3047:2:2174 -3048:2:2181 -3049:2:2182 -3050:2:2193 -3051:2:2194 -3052:2:2195 -3053:2:2193 -3054:2:2194 -3055:2:2195 -3056:2:2206 -3057:2:2211 -3058:2:2212 -3059:0:4365 -3060:2:2224 -3061:0:4365 -3062:3:3354 -3063:0:4365 -3064:2:2226 -3065:0:4365 -3066:3:3355 -3067:0:4365 -3068:2:2230 -3069:0:4365 -3070:3:3354 -3071:0:4365 -3072:2:2235 -3073:2:2239 -3074:2:2240 -3075:2:2248 -3076:2:2249 -3077:2:2253 -3078:2:2254 -3079:2:2248 -3080:2:2249 -3081:2:2250 -3082:2:2262 -3083:2:2267 -3084:2:2271 -3085:2:2272 -3086:2:2279 -3087:2:2280 -3088:2:2291 -3089:2:2292 -3090:2:2293 -3091:2:2291 -3092:2:2292 -3093:2:2293 -3094:2:2304 -3095:2:2309 -3096:2:2310 -3097:0:4365 -3098:3:3355 -3099:0:4365 -3100:2:2322 -3101:0:4365 -3102:2:1169 -3103:0:4365 -3104:3:3354 -3105:0:4365 -3106:2:1170 -3107:0:4365 -3108:3:3355 -3109:0:4365 -3110:3:3356 -3111:0:4365 -3112:3:3366 -3113:0:4365 -3114:3:2951 -3115:0:4365 -3116:3:2952 -3117:0:4365 -3118:3:2953 -3119:0:4365 -3120:3:2954 -3121:3:2958 -3122:3:2959 -3123:3:2967 -3124:3:2968 -3125:3:2972 -3126:3:2973 -3127:3:2967 -3128:3:2968 -3129:3:2972 -3130:3:2973 -3131:3:2981 -3132:3:2986 -3133:3:2990 -3134:3:2991 -3135:3:2998 -3136:3:2999 -3137:3:3010 -3138:3:3011 -3139:3:3012 -3140:3:3010 -3141:3:3011 -3142:3:3012 -3143:3:3023 -3144:3:3028 -3145:3:3029 -3146:0:4365 -3147:3:3041 -3148:0:4365 -3149:3:3042 -3150:0:4365 -3151:2:1173 -3152:0:4365 -3153:3:3043 -3154:0:4365 -3155:2:1179 -3156:0:4365 -3157:2:1180 -3158:0:4365 -3159:3:3042 -3160:0:4365 -3161:2:1181 -3162:2:1185 -3163:2:1186 -3164:2:1194 -3165:2:1195 -3166:2:1199 -3167:2:1200 -3168:2:1194 -3169:2:1195 -3170:2:1199 -3171:2:1200 -3172:2:1208 -3173:2:1213 -3174:2:1217 -3175:2:1218 -3176:2:1225 -3177:2:1226 -3178:2:1237 -3179:2:1238 -3180:2:1239 -3181:2:1237 -3182:2:1238 -3183:2:1239 -3184:2:1250 -3185:2:1255 -3186:2:1256 -3187:0:4365 -3188:3:3043 -3189:0:4365 -3190:2:1268 -3191:0:4365 -3192:3:3042 -3193:0:4365 -3194:2:1270 -3195:0:4365 -3196:3:3043 -3197:0:4365 -3198:2:1271 -3199:2:1275 -3200:2:1276 -3201:2:1284 -3202:2:1285 -3203:2:1289 -3204:2:1290 -3205:2:1284 -3206:2:1285 -3207:2:1289 -3208:2:1290 -3209:2:1298 -3210:2:1303 -3211:2:1307 -3212:2:1308 -3213:2:1315 -3214:2:1316 -3215:2:1327 -3216:2:1328 -3217:2:1329 -3218:2:1327 -3219:2:1328 -3220:2:1329 -3221:2:1340 -3222:2:1345 -3223:2:1346 -3224:0:4365 -3225:2:1358 -3226:0:4365 -3227:2:1360 -3228:0:4365 -3229:3:3042 -3230:0:4365 -3231:2:1361 -3232:0:4365 -3233:3:3043 -3234:0:4365 -3235:2:1362 -3236:2:1366 -3237:2:1367 -3238:2:1375 -3239:2:1376 -3240:2:1380 -3241:2:1381 -3242:2:1375 -3243:2:1376 -3244:2:1380 -3245:2:1381 -3246:2:1389 -3247:2:1394 -3248:2:1398 -3249:2:1399 -3250:2:1406 -3251:2:1407 -3252:2:1418 -3253:2:1419 -3254:2:1420 -3255:2:1418 -3256:2:1419 -3257:2:1420 -3258:2:1431 -3259:2:1436 -3260:2:1437 -3261:0:4365 -3262:2:1449 -3263:0:4365 -3264:3:3042 -3265:0:4365 -3266:2:1451 -3267:0:4365 -3268:3:3043 -3269:0:4365 -3270:2:1652 -3271:0:4365 -3272:2:1653 -3273:0:4365 -3274:2:1657 -3275:0:4365 -3276:2:1180 -3277:0:4365 -3278:3:3042 -3279:0:4365 -3280:2:1181 -3281:2:1185 -3282:2:1186 -3283:2:1194 -3284:2:1195 -3285:2:1199 -3286:2:1200 -3287:2:1194 -3288:2:1195 -3289:2:1196 -3290:2:1208 -3291:2:1213 -3292:2:1217 -3293:2:1218 -3294:2:1225 -3295:2:1226 -3296:2:1237 -3297:2:1238 -3298:2:1239 -3299:2:1237 -3300:2:1238 -3301:2:1239 -3302:2:1250 -3303:2:1255 -3304:2:1256 -3305:0:4365 -3306:3:3043 -3307:0:4365 -3308:2:1268 -3309:0:4365 -3310:3:3042 -3311:0:4365 -3312:2:1270 -3313:0:4365 -3314:3:3043 -3315:0:4365 -3316:2:1271 -3317:2:1275 -3318:2:1276 -3319:2:1284 -3320:2:1285 -3321:2:1289 -3322:2:1290 -3323:2:1284 -3324:2:1285 -3325:2:1289 -3326:2:1290 -3327:2:1298 -3328:2:1303 -3329:2:1307 -3330:2:1308 -3331:2:1315 -3332:2:1316 -3333:2:1327 -3334:2:1328 -3335:2:1329 -3336:2:1327 -3337:2:1328 -3338:2:1329 -3339:2:1340 -3340:2:1345 -3341:2:1346 -3342:0:4365 -3343:2:1358 -3344:0:4365 -3345:2:1454 -3346:0:4365 -3347:3:3042 -3348:0:4365 -3349:2:1455 -3350:0:4365 -3351:3:3043 -3352:0:4365 -3353:2:1652 -3354:0:4365 -3355:2:1653 -3356:0:4365 -3357:2:1657 -3358:0:4365 -3359:2:1660 -3360:0:4365 -3361:3:3042 -3362:0:4365 -3363:2:1665 -3364:2:1669 -3365:2:1670 -3366:2:1678 -3367:2:1679 -3368:2:1683 -3369:2:1684 -3370:2:1678 -3371:2:1679 -3372:2:1680 -3373:2:1692 -3374:2:1697 -3375:2:1701 -3376:2:1702 -3377:2:1709 -3378:2:1710 -3379:2:1721 -3380:2:1722 -3381:2:1723 -3382:2:1721 -3383:2:1722 -3384:2:1723 -3385:2:1734 -3386:2:1739 -3387:2:1740 -3388:0:4365 -3389:3:3043 -3390:0:4365 -3391:2:1752 -3392:0:4365 -3393:3:3042 -3394:0:4365 -3395:2:1754 -3396:0:4365 -3397:3:3043 -3398:0:4365 -3399:2:1755 -3400:2:1759 -3401:2:1760 -3402:2:1768 -3403:2:1769 -3404:2:1773 -3405:2:1774 -3406:2:1768 -3407:2:1769 -3408:2:1773 -3409:2:1774 -3410:2:1782 -3411:2:1787 -3412:2:1791 -3413:2:1792 -3414:2:1799 -3415:2:1800 -3416:2:1811 -3417:2:1812 -3418:2:1813 -3419:2:1811 -3420:2:1812 -3421:2:1813 -3422:2:1824 -3423:2:1829 -3424:2:1830 -3425:0:4365 -3426:2:1842 -3427:0:4365 -3428:3:3042 -3429:0:4365 -3430:2:1844 -3431:0:4365 -3432:3:3043 -3433:0:4365 -3434:2:1845 -3435:2:1849 -3436:2:1850 -3437:2:1858 -3438:2:1859 -3439:2:1863 -3440:2:1864 -3441:2:1858 -3442:2:1859 -3443:2:1863 -3444:2:1864 -3445:2:1872 -3446:2:1877 -3447:2:1881 -3448:2:1882 -3449:2:1889 -3450:2:1890 -3451:2:1901 -3452:2:1902 -3453:2:1903 -3454:2:1901 -3455:2:1902 -3456:2:1903 -3457:2:1914 -3458:2:1919 -3459:2:1920 -3460:0:4365 -3461:2:1932 -3462:0:4365 -3463:3:3042 -3464:0:4365 -3465:2:1934 -3466:0:4365 -3467:3:3043 -3468:0:4365 -3469:2:1935 -3470:0:4365 -3471:2:1936 -3472:0:4365 -3473:2:2129 -3474:0:4365 -3475:2:2130 -3476:0:4365 -3477:2:2134 -3478:0:4365 -3479:3:3042 -3480:0:4365 -3481:2:2136 -3482:0:4365 -3483:3:3043 -3484:0:4365 -3485:2:2137 -3486:2:2141 -3487:2:2142 -3488:2:2150 -3489:2:2151 -3490:2:2155 -3491:2:2156 -3492:2:2150 -3493:2:2151 -3494:2:2155 -3495:2:2156 -3496:2:2164 -3497:2:2169 -3498:2:2173 -3499:2:2174 -3500:2:2181 -3501:2:2182 -3502:2:2193 -3503:2:2194 -3504:2:2195 -3505:2:2193 -3506:2:2194 -3507:2:2195 -3508:2:2206 -3509:2:2211 -3510:2:2212 -3511:0:4365 -3512:2:2224 -3513:0:4365 -3514:3:3042 -3515:0:4365 -3516:2:2226 -3517:0:4365 -3518:3:3043 -3519:0:4365 -3520:2:1936 -3521:0:4365 -3522:2:2129 -3523:0:4365 -3524:2:2130 -3525:0:4365 -3526:2:2134 -3527:0:4365 -3528:3:3042 -3529:0:4365 -3530:2:2136 -3531:0:4365 -3532:3:3043 -3533:0:4365 -3534:2:2137 -3535:2:2141 -3536:2:2142 -3537:2:2150 -3538:2:2151 -3539:2:2155 -3540:2:2156 -3541:2:2150 -3542:2:2151 -3543:2:2152 -3544:2:2164 -3545:2:2169 -3546:2:2173 -3547:2:2174 -3548:2:2181 -3549:2:2182 -3550:2:2193 -3551:2:2194 -3552:2:2195 -3553:2:2193 -3554:2:2194 -3555:2:2195 -3556:2:2206 -3557:2:2211 -3558:2:2212 -3559:0:4365 -3560:2:2224 -3561:0:4365 -3562:3:3042 -3563:0:4365 -3564:2:2226 -3565:0:4365 -3566:3:3043 -3567:0:4365 -3568:2:2230 -3569:0:4365 -3570:3:3042 -3571:0:4365 -3572:2:2235 -3573:2:2239 -3574:2:2240 -3575:2:2248 -3576:2:2249 -3577:2:2253 -3578:2:2254 -3579:2:2248 -3580:2:2249 -3581:2:2250 -3582:2:2262 -3583:2:2267 -3584:2:2271 -3585:2:2272 -3586:2:2279 -3587:2:2280 -3588:2:2291 -3589:2:2292 -3590:2:2293 -3591:2:2291 -3592:2:2292 -3593:2:2293 -3594:2:2304 -3595:2:2309 -3596:2:2310 -3597:0:4365 -3598:3:3043 -3599:0:4365 -3600:2:2322 -3601:0:4365 -3602:2:1169 -3603:0:4365 -3604:3:3042 -3605:0:4365 -3606:2:1170 -3607:0:4365 -3608:3:3043 -3609:0:4365 -3610:3:3044 -3611:0:4365 -3612:3:3257 -3613:0:4365 -3614:3:3362 -3615:0:4365 -3616:3:3363 -3617:0:4365 -3618:3:3367 -3619:0:4365 -3620:3:3373 -3621:3:3377 -3622:3:3378 -3623:3:3386 -3624:3:3387 -3625:3:3391 -3626:3:3392 -3627:3:3386 -3628:3:3387 -3629:3:3391 -3630:3:3392 -3631:3:3400 -3632:3:3405 -3633:3:3409 -3634:3:3410 -3635:3:3417 -3636:3:3418 -3637:3:3429 -3638:3:3430 -3639:3:3431 -3640:3:3429 -3641:3:3430 -3642:3:3431 -3643:3:3442 -3644:3:3447 -3645:3:3448 -3646:0:4365 -3647:3:3460 -3648:0:4365 -3649:3:3461 -3650:0:4365 -3651:2:1173 -3652:0:4365 -3653:3:3462 -3654:0:4365 -3655:2:1179 -3656:0:4365 -3657:2:1180 -3658:0:4365 -3659:3:3461 -3660:0:4365 -3661:2:1181 -3662:2:1185 -3663:2:1186 -3664:2:1194 -3665:2:1195 -3666:2:1199 -3667:2:1200 -3668:2:1194 -3669:2:1195 -3670:2:1199 -3671:2:1200 -3672:2:1208 -3673:2:1213 -3674:2:1217 -3675:2:1218 -3676:2:1225 -3677:2:1226 -3678:2:1237 -3679:2:1238 -3680:2:1239 -3681:2:1237 -3682:2:1238 -3683:2:1239 -3684:2:1250 -3685:2:1255 -3686:2:1256 -3687:0:4365 -3688:3:3462 -3689:0:4365 -3690:2:1268 -3691:0:4365 -3692:3:3461 -3693:0:4365 -3694:2:1270 -3695:0:4365 -3696:3:3462 -3697:0:4365 -3698:2:1271 -3699:2:1275 -3700:2:1276 -3701:2:1284 -3702:2:1285 -3703:2:1289 -3704:2:1290 -3705:2:1284 -3706:2:1285 -3707:2:1289 -3708:2:1290 -3709:2:1298 -3710:2:1303 -3711:2:1307 -3712:2:1308 -3713:2:1315 -3714:2:1316 -3715:2:1327 -3716:2:1328 -3717:2:1329 -3718:2:1327 -3719:2:1328 -3720:2:1329 -3721:2:1340 -3722:2:1345 -3723:2:1346 -3724:0:4365 -3725:2:1358 -3726:0:4365 -3727:2:1360 -3728:0:4365 -3729:3:3461 -3730:0:4365 -3731:2:1361 -3732:0:4365 -3733:3:3462 -3734:0:4365 -3735:2:1362 -3736:2:1366 -3737:2:1367 -3738:2:1375 -3739:2:1376 -3740:2:1380 -3741:2:1381 -3742:2:1375 -3743:2:1376 -3744:2:1380 -3745:2:1381 -3746:2:1389 -3747:2:1394 -3748:2:1398 -3749:2:1399 -3750:2:1406 -3751:2:1407 -3752:2:1418 -3753:2:1419 -3754:2:1420 -3755:2:1418 -3756:2:1419 -3757:2:1420 -3758:2:1431 -3759:2:1436 -3760:2:1437 -3761:0:4365 -3762:2:1449 -3763:0:4365 -3764:3:3461 -3765:0:4365 -3766:2:1451 -3767:0:4365 -3768:3:3462 -3769:0:4365 -3770:2:1652 -3771:0:4365 -3772:2:1653 -3773:0:4365 -3774:2:1657 -3775:0:4365 -3776:2:1180 -3777:0:4365 -3778:3:3461 -3779:0:4365 -3780:2:1181 -3781:2:1185 -3782:2:1186 -3783:2:1194 -3784:2:1195 -3785:2:1199 -3786:2:1200 -3787:2:1194 -3788:2:1195 -3789:2:1196 -3790:2:1208 -3791:2:1213 -3792:2:1217 -3793:2:1218 -3794:2:1225 -3795:2:1226 -3796:2:1237 -3797:2:1238 -3798:2:1239 -3799:2:1237 -3800:2:1238 -3801:2:1239 -3802:2:1250 -3803:2:1255 -3804:2:1256 -3805:0:4365 -3806:3:3462 -3807:0:4365 -3808:2:1268 -3809:0:4365 -3810:3:3461 -3811:0:4365 -3812:2:1270 -3813:0:4365 -3814:3:3462 -3815:0:4365 -3816:2:1271 -3817:2:1275 -3818:2:1276 -3819:2:1284 -3820:2:1285 -3821:2:1289 -3822:2:1290 -3823:2:1284 -3824:2:1285 -3825:2:1289 -3826:2:1290 -3827:2:1298 -3828:2:1303 -3829:2:1307 -3830:2:1308 -3831:2:1315 -3832:2:1316 -3833:2:1327 -3834:2:1328 -3835:2:1329 -3836:2:1327 -3837:2:1328 -3838:2:1329 -3839:2:1340 -3840:2:1345 -3841:2:1346 -3842:0:4365 -3843:2:1358 -3844:0:4365 -3845:2:1454 -3846:0:4365 -3847:3:3461 -3848:0:4365 -3849:2:1455 -3850:0:4365 -3851:3:3462 -3852:0:4365 -3853:2:1652 -3854:0:4365 -3855:2:1653 -3856:0:4365 -3857:2:1657 -3858:0:4365 -3859:2:1660 -3860:0:4365 -3861:3:3461 -3862:0:4365 -3863:2:1665 -3864:2:1669 -3865:2:1670 -3866:2:1678 -3867:2:1679 -3868:2:1683 -3869:2:1684 -3870:2:1678 -3871:2:1679 -3872:2:1680 -3873:2:1692 -3874:2:1697 -3875:2:1701 -3876:2:1702 -3877:2:1709 -3878:2:1710 -3879:2:1721 -3880:2:1722 -3881:2:1723 -3882:2:1721 -3883:2:1722 -3884:2:1723 -3885:2:1734 -3886:2:1739 -3887:2:1740 -3888:0:4365 -3889:3:3462 -3890:0:4365 -3891:2:1752 -3892:0:4365 -3893:3:3461 -3894:0:4365 -3895:2:1754 -3896:0:4365 -3897:3:3462 -3898:0:4365 -3899:2:1755 -3900:2:1759 -3901:2:1760 -3902:2:1768 -3903:2:1769 -3904:2:1773 -3905:2:1774 -3906:2:1768 -3907:2:1769 -3908:2:1773 -3909:2:1774 -3910:2:1782 -3911:2:1787 -3912:2:1791 -3913:2:1792 -3914:2:1799 -3915:2:1800 -3916:2:1811 -3917:2:1812 -3918:2:1813 -3919:2:1811 -3920:2:1812 -3921:2:1813 -3922:2:1824 -3923:2:1829 -3924:2:1830 -3925:0:4365 -3926:2:1842 -3927:0:4365 -3928:3:3461 -3929:0:4365 -3930:2:1844 -3931:0:4365 -3932:3:3462 -3933:0:4365 -3934:2:1845 -3935:2:1849 -3936:2:1850 -3937:2:1858 -3938:2:1859 -3939:2:1863 -3940:2:1864 -3941:2:1858 -3942:2:1859 -3943:2:1863 -3944:2:1864 -3945:2:1872 -3946:2:1877 -3947:2:1881 -3948:2:1882 -3949:2:1889 -3950:2:1890 -3951:2:1901 -3952:2:1902 -3953:2:1903 -3954:2:1901 -3955:2:1902 -3956:2:1903 -3957:2:1914 -3958:2:1919 -3959:2:1920 -3960:0:4365 -3961:2:1932 -3962:0:4365 -3963:3:3461 -3964:0:4365 -3965:2:1934 -3966:0:4365 -3967:3:3462 -3968:0:4365 -3969:2:1935 -3970:0:4365 -3971:2:1936 -3972:0:4365 -3973:2:2129 -3974:0:4365 -3975:2:2130 -3976:0:4365 -3977:2:2134 -3978:0:4365 -3979:3:3461 -3980:0:4365 -3981:2:2136 -3982:0:4365 -3983:3:3462 -3984:0:4365 -3985:2:2137 -3986:2:2141 -3987:2:2142 -3988:2:2150 -3989:2:2151 -3990:2:2155 -3991:2:2156 -3992:2:2150 -3993:2:2151 -3994:2:2155 -3995:2:2156 -3996:2:2164 -3997:2:2169 -3998:2:2173 -3999:2:2174 -4000:2:2181 -4001:2:2182 -4002:2:2193 -4003:2:2194 -4004:2:2195 -4005:2:2193 -4006:2:2194 -4007:2:2195 -4008:2:2206 -4009:2:2211 -4010:2:2212 -4011:0:4365 -4012:2:2224 -4013:0:4365 -4014:3:3461 -4015:0:4365 -4016:2:2226 -4017:0:4365 -4018:3:3462 -4019:0:4365 -4020:2:1936 -4021:0:4365 -4022:2:2129 -4023:0:4365 -4024:2:2130 -4025:0:4365 -4026:2:2134 -4027:0:4365 -4028:3:3461 -4029:0:4365 -4030:2:2136 -4031:0:4365 -4032:3:3462 -4033:0:4365 -4034:2:2137 -4035:2:2141 -4036:2:2142 -4037:2:2150 -4038:2:2151 -4039:2:2155 -4040:2:2156 -4041:2:2150 -4042:2:2151 -4043:2:2152 -4044:2:2164 -4045:2:2169 -4046:2:2173 -4047:2:2174 -4048:2:2181 -4049:2:2182 -4050:2:2193 -4051:2:2194 -4052:2:2195 -4053:2:2193 -4054:2:2194 -4055:2:2195 -4056:2:2206 -4057:2:2211 -4058:2:2212 -4059:0:4365 -4060:2:2224 -4061:0:4365 -4062:3:3461 -4063:0:4365 -4064:2:2226 -4065:0:4365 -4066:3:3462 -4067:0:4365 -4068:2:2230 -4069:0:4365 -4070:3:3461 -4071:0:4365 -4072:2:2235 -4073:2:2239 -4074:2:2240 -4075:2:2248 -4076:2:2249 -4077:2:2253 -4078:2:2254 -4079:2:2248 -4080:2:2249 -4081:2:2250 -4082:2:2262 -4083:2:2267 -4084:2:2271 -4085:2:2272 -4086:2:2279 -4087:2:2280 -4088:2:2291 -4089:2:2292 -4090:2:2293 -4091:2:2291 -4092:2:2292 -4093:2:2293 -4094:2:2304 -4095:2:2309 -4096:2:2310 -4097:0:4365 -4098:3:3462 -4099:0:4365 -4100:2:2322 -4101:0:4365 -4102:2:1169 -4103:0:4365 -4104:3:3461 -4105:0:4365 -4106:2:1170 -4107:0:4365 -4108:3:3462 -4109:0:4365 -4110:3:3463 -4111:0:4365 -4112:3:3469 -4113:0:4365 -4114:3:3470 -4115:3:3474 -4116:3:3475 -4117:3:3483 -4118:3:3484 -4119:3:3488 -4120:3:3489 -4121:3:3483 -4122:3:3484 -4123:3:3488 -4124:3:3489 -4125:3:3497 -4126:3:3502 -4127:3:3506 -4128:3:3507 -4129:3:3514 -4130:3:3515 -4131:3:3526 -4132:3:3527 -4133:3:3528 -4134:3:3526 -4135:3:3527 -4136:3:3528 -4137:3:3539 -4138:3:3544 -4139:3:3545 -4140:0:4365 -4141:3:3557 -4142:0:4365 -4143:3:3558 -4144:0:4365 -4145:2:1173 -4146:0:4365 -4147:3:3559 -4148:0:4365 -4149:2:1179 -4150:0:4365 -4151:2:1180 -4152:0:4365 -4153:3:3558 -4154:0:4365 -4155:2:1181 -4156:2:1185 -4157:2:1186 -4158:2:1194 -4159:2:1195 -4160:2:1199 -4161:2:1200 -4162:2:1194 -4163:2:1195 -4164:2:1199 -4165:2:1200 -4166:2:1208 -4167:2:1213 -4168:2:1217 -4169:2:1218 -4170:2:1225 -4171:2:1226 -4172:2:1237 -4173:2:1238 -4174:2:1239 -4175:2:1237 -4176:2:1238 -4177:2:1239 -4178:2:1250 -4179:2:1255 -4180:2:1256 -4181:0:4365 -4182:3:3559 -4183:0:4365 -4184:2:1268 -4185:0:4365 -4186:3:3558 -4187:0:4365 -4188:2:1270 -4189:0:4365 -4190:3:3559 -4191:0:4365 -4192:2:1271 -4193:2:1275 -4194:2:1276 -4195:2:1284 -4196:2:1285 -4197:2:1289 -4198:2:1290 -4199:2:1284 -4200:2:1285 -4201:2:1289 -4202:2:1290 -4203:2:1298 -4204:2:1303 -4205:2:1307 -4206:2:1308 -4207:2:1315 -4208:2:1316 -4209:2:1327 -4210:2:1328 -4211:2:1329 -4212:2:1327 -4213:2:1328 -4214:2:1329 -4215:2:1340 -4216:2:1345 -4217:2:1346 -4218:0:4365 -4219:2:1358 -4220:0:4365 -4221:2:1360 -4222:0:4365 -4223:3:3558 -4224:0:4365 -4225:2:1361 -4226:0:4365 -4227:3:3559 -4228:0:4365 -4229:2:1362 -4230:2:1366 -4231:2:1367 -4232:2:1375 -4233:2:1376 -4234:2:1380 -4235:2:1381 -4236:2:1375 -4237:2:1376 -4238:2:1380 -4239:2:1381 -4240:2:1389 -4241:2:1394 -4242:2:1398 -4243:2:1399 -4244:2:1406 -4245:2:1407 -4246:2:1418 -4247:2:1419 -4248:2:1420 -4249:2:1418 -4250:2:1419 -4251:2:1420 -4252:2:1431 -4253:2:1436 -4254:2:1437 -4255:0:4365 -4256:2:1449 -4257:0:4365 -4258:3:3558 -4259:0:4365 -4260:2:1451 -4261:0:4365 -4262:3:3559 -4263:0:4365 -4264:2:1652 -4265:0:4365 -4266:2:1653 -4267:0:4365 -4268:2:1657 -4269:0:4365 -4270:2:1180 -4271:0:4365 -4272:3:3558 -4273:0:4365 -4274:2:1181 -4275:2:1185 -4276:2:1186 -4277:2:1194 -4278:2:1195 -4279:2:1199 -4280:2:1200 -4281:2:1194 -4282:2:1195 -4283:2:1196 -4284:2:1208 -4285:2:1213 -4286:2:1217 -4287:2:1218 -4288:2:1225 -4289:2:1226 -4290:2:1237 -4291:2:1238 -4292:2:1239 -4293:2:1237 -4294:2:1238 -4295:2:1239 -4296:2:1250 -4297:2:1255 -4298:2:1256 -4299:0:4365 -4300:3:3559 -4301:0:4365 -4302:2:1268 -4303:0:4365 -4304:3:3558 -4305:0:4365 -4306:2:1270 -4307:0:4365 -4308:3:3559 -4309:0:4365 -4310:2:1271 -4311:2:1275 -4312:2:1276 -4313:2:1284 -4314:2:1285 -4315:2:1289 -4316:2:1290 -4317:2:1284 -4318:2:1285 -4319:2:1289 -4320:2:1290 -4321:2:1298 -4322:2:1303 -4323:2:1307 -4324:2:1308 -4325:2:1315 -4326:2:1316 -4327:2:1327 -4328:2:1328 -4329:2:1329 -4330:2:1327 -4331:2:1328 -4332:2:1329 -4333:2:1340 -4334:2:1345 -4335:2:1346 -4336:0:4365 -4337:2:1358 -4338:0:4365 -4339:2:1454 -4340:0:4365 -4341:3:3558 -4342:0:4365 -4343:2:1455 -4344:0:4365 -4345:3:3559 -4346:0:4365 -4347:2:1652 -4348:0:4365 -4349:2:1653 -4350:0:4365 -4351:2:1657 -4352:0:4365 -4353:2:1660 -4354:0:4365 -4355:3:3558 -4356:0:4365 -4357:2:1665 -4358:2:1669 -4359:2:1670 -4360:2:1678 -4361:2:1679 -4362:2:1683 -4363:2:1684 -4364:2:1678 -4365:2:1679 -4366:2:1680 -4367:2:1692 -4368:2:1697 -4369:2:1701 -4370:2:1702 -4371:2:1709 -4372:2:1710 -4373:2:1721 -4374:2:1722 -4375:2:1723 -4376:2:1721 -4377:2:1722 -4378:2:1723 -4379:2:1734 -4380:2:1739 -4381:2:1740 -4382:0:4365 -4383:3:3559 -4384:0:4365 -4385:2:1752 -4386:0:4365 -4387:3:3558 -4388:0:4365 -4389:2:1754 -4390:0:4365 -4391:3:3559 -4392:0:4365 -4393:2:1755 -4394:2:1759 -4395:2:1760 -4396:2:1768 -4397:2:1769 -4398:2:1773 -4399:2:1774 -4400:2:1768 -4401:2:1769 -4402:2:1773 -4403:2:1774 -4404:2:1782 -4405:2:1787 -4406:2:1791 -4407:2:1792 -4408:2:1799 -4409:2:1800 -4410:2:1811 -4411:2:1812 -4412:2:1813 -4413:2:1811 -4414:2:1812 -4415:2:1813 -4416:2:1824 -4417:2:1829 -4418:2:1830 -4419:0:4365 -4420:2:1842 -4421:0:4365 -4422:3:3558 -4423:0:4365 -4424:2:1844 -4425:0:4365 -4426:3:3559 -4427:0:4365 -4428:2:1845 -4429:2:1849 -4430:2:1850 -4431:2:1858 -4432:2:1859 -4433:2:1863 -4434:2:1864 -4435:2:1858 -4436:2:1859 -4437:2:1863 -4438:2:1864 -4439:2:1872 -4440:2:1877 -4441:2:1881 -4442:2:1882 -4443:2:1889 -4444:2:1890 -4445:2:1901 -4446:2:1902 -4447:2:1903 -4448:2:1901 -4449:2:1902 -4450:2:1903 -4451:2:1914 -4452:2:1919 -4453:2:1920 -4454:0:4365 -4455:2:1932 -4456:0:4365 -4457:3:3558 -4458:0:4365 -4459:2:1934 -4460:0:4365 -4461:3:3559 -4462:0:4365 -4463:2:1935 -4464:0:4365 -4465:2:1936 -4466:0:4365 -4467:2:2129 -4468:0:4365 -4469:2:2130 -4470:0:4365 -4471:2:2134 -4472:0:4365 -4473:3:3558 -4474:0:4365 -4475:2:2136 -4476:0:4365 -4477:3:3559 -4478:0:4365 -4479:2:2137 -4480:2:2141 -4481:2:2142 -4482:2:2150 -4483:2:2151 -4484:2:2155 -4485:2:2156 -4486:2:2150 -4487:2:2151 -4488:2:2155 -4489:2:2156 -4490:2:2164 -4491:2:2169 -4492:2:2173 -4493:2:2174 -4494:2:2181 -4495:2:2182 -4496:2:2193 -4497:2:2194 -4498:2:2195 -4499:2:2193 -4500:2:2194 -4501:2:2195 -4502:2:2206 -4503:2:2211 -4504:2:2212 -4505:0:4365 -4506:2:2224 -4507:0:4365 -4508:3:3558 -4509:0:4365 -4510:2:2226 -4511:0:4365 -4512:3:3559 -4513:0:4365 -4514:2:1936 -4515:0:4365 -4516:2:2129 -4517:0:4365 -4518:2:2130 -4519:0:4365 -4520:2:2134 -4521:0:4365 -4522:3:3558 -4523:0:4365 -4524:2:2136 -4525:0:4365 -4526:3:3559 -4527:0:4365 -4528:2:2137 -4529:2:2141 -4530:2:2142 -4531:2:2150 -4532:2:2151 -4533:2:2155 -4534:2:2156 -4535:2:2150 -4536:2:2151 -4537:2:2152 -4538:2:2164 -4539:2:2169 -4540:2:2173 -4541:2:2174 -4542:2:2181 -4543:2:2182 -4544:2:2193 -4545:2:2194 -4546:2:2195 -4547:2:2193 -4548:2:2194 -4549:2:2195 -4550:2:2206 -4551:2:2211 -4552:2:2212 -4553:0:4365 -4554:2:2224 -4555:0:4365 -4556:3:3558 -4557:0:4365 -4558:2:2226 -4559:0:4365 -4560:3:3559 -4561:0:4365 -4562:2:2230 -4563:0:4365 -4564:3:3558 -4565:0:4365 -4566:2:2235 -4567:2:2239 -4568:2:2240 -4569:2:2248 -4570:2:2249 -4571:2:2253 -4572:2:2254 -4573:2:2248 -4574:2:2249 -4575:2:2250 -4576:2:2262 -4577:2:2267 -4578:2:2271 -4579:2:2272 -4580:2:2279 -4581:2:2280 -4582:2:2291 -4583:2:2292 -4584:2:2293 -4585:2:2291 -4586:2:2292 -4587:2:2293 -4588:2:2304 -4589:2:2309 -4590:2:2310 -4591:0:4365 -4592:3:3559 -4593:0:4365 -4594:2:2322 -4595:0:4365 -4596:2:1169 -4597:0:4365 -4598:3:3558 -4599:0:4365 -4600:2:1170 -4601:0:4365 -4602:3:3559 -4603:0:4365 -4604:3:3560 -4605:0:4365 -4606:3:3566 -4607:0:4365 -4608:3:3569 -4609:3:3570 -4610:3:3582 -4611:3:3583 -4612:3:3587 -4613:3:3588 -4614:3:3582 -4615:3:3583 -4616:3:3587 -4617:3:3588 -4618:3:3596 -4619:3:3601 -4620:3:3605 -4621:3:3606 -4622:3:3613 -4623:3:3614 -4624:3:3625 -4625:3:3626 -4626:3:3627 -4627:3:3625 -4628:3:3626 -4629:3:3627 -4630:3:3638 -4631:3:3643 -4632:3:3644 -4633:0:4365 -4634:3:3656 -4635:0:4365 -4636:3:3657 -4637:0:4365 -4638:2:1173 -4639:0:4365 -4640:3:3658 -4641:0:4365 -4642:2:1179 -4643:0:4365 -4644:2:1180 -4645:0:4365 -4646:3:3657 -4647:0:4365 -4648:2:1181 -4649:2:1185 -4650:2:1186 -4651:2:1194 -4652:2:1195 -4653:2:1199 -4654:2:1200 -4655:2:1194 -4656:2:1195 -4657:2:1199 -4658:2:1200 -4659:2:1208 -4660:2:1213 -4661:2:1217 -4662:2:1218 -4663:2:1225 -4664:2:1226 -4665:2:1237 -4666:2:1238 -4667:2:1239 -4668:2:1237 -4669:2:1238 -4670:2:1239 -4671:2:1250 -4672:2:1255 -4673:2:1256 -4674:0:4365 -4675:3:3658 -4676:0:4365 -4677:2:1268 -4678:0:4365 -4679:3:3657 -4680:0:4365 -4681:2:1270 -4682:0:4365 -4683:3:3658 -4684:0:4365 -4685:2:1271 -4686:2:1275 -4687:2:1276 -4688:2:1284 -4689:2:1285 -4690:2:1289 -4691:2:1290 -4692:2:1284 -4693:2:1285 -4694:2:1289 -4695:2:1290 -4696:2:1298 -4697:2:1303 -4698:2:1307 -4699:2:1308 -4700:2:1315 -4701:2:1316 -4702:2:1327 -4703:2:1328 -4704:2:1329 -4705:2:1327 -4706:2:1328 -4707:2:1329 -4708:2:1340 -4709:2:1345 -4710:2:1346 -4711:0:4365 -4712:2:1358 -4713:0:4365 -4714:2:1360 -4715:0:4365 -4716:3:3657 -4717:0:4365 -4718:2:1361 -4719:0:4365 -4720:3:3658 -4721:0:4365 -4722:2:1362 -4723:2:1366 -4724:2:1367 -4725:2:1375 -4726:2:1376 -4727:2:1380 -4728:2:1381 -4729:2:1375 -4730:2:1376 -4731:2:1380 -4732:2:1381 -4733:2:1389 -4734:2:1394 -4735:2:1398 -4736:2:1399 -4737:2:1406 -4738:2:1407 -4739:2:1418 -4740:2:1419 -4741:2:1420 -4742:2:1418 -4743:2:1419 -4744:2:1420 -4745:2:1431 -4746:2:1436 -4747:2:1437 -4748:0:4365 -4749:2:1449 -4750:0:4365 -4751:3:3657 -4752:0:4365 -4753:2:1451 -4754:0:4365 -4755:3:3658 -4756:0:4365 -4757:2:1652 -4758:0:4365 -4759:2:1653 -4760:0:4365 -4761:2:1657 -4762:0:4365 -4763:2:1180 -4764:0:4365 -4765:3:3657 -4766:0:4365 -4767:2:1181 -4768:2:1185 -4769:2:1186 -4770:2:1194 -4771:2:1195 -4772:2:1199 -4773:2:1200 -4774:2:1194 -4775:2:1195 -4776:2:1196 -4777:2:1208 -4778:2:1213 -4779:2:1217 -4780:2:1218 -4781:2:1225 -4782:2:1226 -4783:2:1237 -4784:2:1238 -4785:2:1239 -4786:2:1237 -4787:2:1238 -4788:2:1239 -4789:2:1250 -4790:2:1255 -4791:2:1256 -4792:0:4365 -4793:3:3658 -4794:0:4365 -4795:2:1268 -4796:0:4365 -4797:3:3657 -4798:0:4365 -4799:2:1270 -4800:0:4365 -4801:3:3658 -4802:0:4365 -4803:2:1271 -4804:2:1275 -4805:2:1276 -4806:2:1284 -4807:2:1285 -4808:2:1289 -4809:2:1290 -4810:2:1284 -4811:2:1285 -4812:2:1289 -4813:2:1290 -4814:2:1298 -4815:2:1303 -4816:2:1307 -4817:2:1308 -4818:2:1315 -4819:2:1316 -4820:2:1327 -4821:2:1328 -4822:2:1329 -4823:2:1327 -4824:2:1328 -4825:2:1329 -4826:2:1340 -4827:2:1345 -4828:2:1346 -4829:0:4365 -4830:2:1358 -4831:0:4365 -4832:2:1454 -4833:0:4365 -4834:3:3657 -4835:0:4365 -4836:2:1455 -4837:0:4365 -4838:3:3658 -4839:0:4365 -4840:2:1652 -4841:0:4365 -4842:2:1653 -4843:0:4365 -4844:2:1657 -4845:0:4365 -4846:2:1660 -4847:0:4365 -4848:3:3657 -4849:0:4365 -4850:2:1665 -4851:2:1669 -4852:2:1670 -4853:2:1678 -4854:2:1679 -4855:2:1683 -4856:2:1684 -4857:2:1678 -4858:2:1679 -4859:2:1680 -4860:2:1692 -4861:2:1697 -4862:2:1701 -4863:2:1702 -4864:2:1709 -4865:2:1710 -4866:2:1721 -4867:2:1722 -4868:2:1723 -4869:2:1721 -4870:2:1722 -4871:2:1723 -4872:2:1734 -4873:2:1739 -4874:2:1740 -4875:0:4365 -4876:3:3658 -4877:0:4365 -4878:2:1752 -4879:0:4365 -4880:3:3657 -4881:0:4365 -4882:2:1754 -4883:0:4365 -4884:3:3658 -4885:0:4365 -4886:2:1755 -4887:2:1759 -4888:2:1760 -4889:2:1768 -4890:2:1769 -4891:2:1773 -4892:2:1774 -4893:2:1768 -4894:2:1769 -4895:2:1773 -4896:2:1774 -4897:2:1782 -4898:2:1787 -4899:2:1791 -4900:2:1792 -4901:2:1799 -4902:2:1800 -4903:2:1811 -4904:2:1812 -4905:2:1813 -4906:2:1811 -4907:2:1812 -4908:2:1813 -4909:2:1824 -4910:2:1829 -4911:2:1830 -4912:0:4365 -4913:2:1842 -4914:0:4365 -4915:3:3657 -4916:0:4365 -4917:2:1844 -4918:0:4365 -4919:3:3658 -4920:0:4365 -4921:2:1845 -4922:2:1849 -4923:2:1850 -4924:2:1858 -4925:2:1859 -4926:2:1863 -4927:2:1864 -4928:2:1858 -4929:2:1859 -4930:2:1863 -4931:2:1864 -4932:2:1872 -4933:2:1877 -4934:2:1881 -4935:2:1882 -4936:2:1889 -4937:2:1890 -4938:2:1901 -4939:2:1902 -4940:2:1903 -4941:2:1901 -4942:2:1902 -4943:2:1903 -4944:2:1914 -4945:2:1919 -4946:2:1920 -4947:0:4365 -4948:2:1932 -4949:0:4365 -4950:3:3657 -4951:0:4365 -4952:2:1934 -4953:0:4365 -4954:3:3658 -4955:0:4365 -4956:2:1935 -4957:0:4365 -4958:2:1936 -4959:0:4365 -4960:2:2129 -4961:0:4365 -4962:2:2130 -4963:0:4365 -4964:2:2134 -4965:0:4365 -4966:3:3657 -4967:0:4365 -4968:2:2136 -4969:0:4365 -4970:3:3658 -4971:0:4365 -4972:2:2137 -4973:2:2141 -4974:2:2142 -4975:2:2150 -4976:2:2151 -4977:2:2155 -4978:2:2156 -4979:2:2150 -4980:2:2151 -4981:2:2155 -4982:2:2156 -4983:2:2164 -4984:2:2169 -4985:2:2173 -4986:2:2174 -4987:2:2181 -4988:2:2182 -4989:2:2193 -4990:2:2194 -4991:2:2195 -4992:2:2193 -4993:2:2194 -4994:2:2195 -4995:2:2206 -4996:2:2211 -4997:2:2212 -4998:0:4365 -4999:2:2224 -5000:0:4365 -5001:3:3657 -5002:0:4365 -5003:2:2226 -5004:0:4365 -5005:3:3658 -5006:0:4365 -5007:2:1936 -5008:0:4365 -5009:2:2129 -5010:0:4365 -5011:2:2130 -5012:0:4365 -5013:2:2134 -5014:0:4365 -5015:3:3657 -5016:0:4365 -5017:2:2136 -5018:0:4365 -5019:3:3658 -5020:0:4365 -5021:2:2137 -5022:2:2141 -5023:2:2142 -5024:2:2150 -5025:2:2151 -5026:2:2155 -5027:2:2156 -5028:2:2150 -5029:2:2151 -5030:2:2152 -5031:2:2164 -5032:2:2169 -5033:2:2173 -5034:2:2174 -5035:2:2181 -5036:2:2182 -5037:2:2193 -5038:2:2194 -5039:2:2195 -5040:2:2193 -5041:2:2194 -5042:2:2195 -5043:2:2206 -5044:2:2211 -5045:2:2212 -5046:0:4365 -5047:2:2224 -5048:0:4365 -5049:3:3657 -5050:0:4365 -5051:2:2226 -5052:0:4365 -5053:3:3658 -5054:0:4365 -5055:2:2230 -5056:0:4365 -5057:3:3657 -5058:0:4365 -5059:2:2235 -5060:2:2239 -5061:2:2240 -5062:2:2248 -5063:2:2249 -5064:2:2253 -5065:2:2254 -5066:2:2248 -5067:2:2249 -5068:2:2250 -5069:2:2262 -5070:2:2267 -5071:2:2271 -5072:2:2272 -5073:2:2279 -5074:2:2280 -5075:2:2291 -5076:2:2292 -5077:2:2293 -5078:2:2291 -5079:2:2292 -5080:2:2293 -5081:2:2304 -5082:2:2309 -5083:2:2310 -5084:0:4365 -5085:3:3658 -5086:0:4365 -5087:2:2322 -5088:0:4365 -5089:2:1169 -5090:0:4365 -5091:3:3657 -5092:0:4365 -5093:2:1170 -5094:0:4365 -5095:3:3658 -5096:0:4365 -5097:3:3659 -5098:0:4365 -5099:3:3665 -5100:0:4365 -5101:3:3666 -5102:0:4365 -5103:3:3667 -5104:0:4365 -5105:3:3668 -5106:0:4365 -5107:3:3669 -5108:3:3673 -5109:3:3674 -5110:3:3682 -5111:3:3683 -5112:3:3687 -5113:3:3688 -5114:3:3682 -5115:3:3683 -5116:3:3687 -5117:3:3688 -5118:3:3696 -5119:3:3701 -5120:3:3705 -5121:3:3706 -5122:3:3713 -5123:3:3714 -5124:3:3725 -5125:3:3726 -5126:3:3727 -5127:3:3725 -5128:3:3726 -5129:3:3727 -5130:3:3738 -5131:3:3743 -5132:3:3744 -5133:0:4365 -5134:3:3756 -5135:0:4365 -5136:3:3757 -5137:0:4365 -5138:2:1173 -5139:0:4365 -5140:3:3758 -5141:0:4365 -5142:2:1179 -5143:0:4365 -5144:2:1180 -5145:0:4365 -5146:3:3757 -5147:0:4365 -5148:2:1181 -5149:2:1185 -5150:2:1186 -5151:2:1194 -5152:2:1195 -5153:2:1199 -5154:2:1200 -5155:2:1194 -5156:2:1195 -5157:2:1199 -5158:2:1200 -5159:2:1208 -5160:2:1213 -5161:2:1217 -5162:2:1218 -5163:2:1225 -5164:2:1226 -5165:2:1237 -5166:2:1238 -5167:2:1239 -5168:2:1237 -5169:2:1238 -5170:2:1239 -5171:2:1250 -5172:2:1255 -5173:2:1256 -5174:0:4365 -5175:3:3758 -5176:0:4365 -5177:2:1268 -5178:0:4365 -5179:3:3757 -5180:0:4365 -5181:2:1270 -5182:0:4365 -5183:3:3758 -5184:0:4365 -5185:2:1271 -5186:2:1275 -5187:2:1276 -5188:2:1284 -5189:2:1285 -5190:2:1289 -5191:2:1290 -5192:2:1284 -5193:2:1285 -5194:2:1289 -5195:2:1290 -5196:2:1298 -5197:2:1303 -5198:2:1307 -5199:2:1308 -5200:2:1315 -5201:2:1316 -5202:2:1327 -5203:2:1328 -5204:2:1329 -5205:2:1327 -5206:2:1328 -5207:2:1329 -5208:2:1340 -5209:2:1345 -5210:2:1346 -5211:0:4365 -5212:2:1358 -5213:0:4365 -5214:2:1360 -5215:0:4365 -5216:3:3757 -5217:0:4365 -5218:2:1361 -5219:0:4365 -5220:3:3758 -5221:0:4365 -5222:2:1362 -5223:2:1366 -5224:2:1367 -5225:2:1375 -5226:2:1376 -5227:2:1380 -5228:2:1381 -5229:2:1375 -5230:2:1376 -5231:2:1380 -5232:2:1381 -5233:2:1389 -5234:2:1394 -5235:2:1398 -5236:2:1399 -5237:2:1406 -5238:2:1407 -5239:2:1418 -5240:2:1419 -5241:2:1420 -5242:2:1418 -5243:2:1419 -5244:2:1420 -5245:2:1431 -5246:2:1436 -5247:2:1437 -5248:0:4365 -5249:2:1449 -5250:0:4365 -5251:3:3757 -5252:0:4365 -5253:2:1451 -5254:0:4365 -5255:3:3758 -5256:0:4365 -5257:2:1652 -5258:0:4365 -5259:2:1653 -5260:0:4365 -5261:2:1657 -5262:0:4365 -5263:2:1180 -5264:0:4365 -5265:3:3757 -5266:0:4365 -5267:2:1181 -5268:2:1185 -5269:2:1186 -5270:2:1194 -5271:2:1195 -5272:2:1199 -5273:2:1200 -5274:2:1194 -5275:2:1195 -5276:2:1196 -5277:2:1208 -5278:2:1213 -5279:2:1217 -5280:2:1218 -5281:2:1225 -5282:2:1226 -5283:2:1237 -5284:2:1238 -5285:2:1239 -5286:2:1237 -5287:2:1238 -5288:2:1239 -5289:2:1250 -5290:2:1255 -5291:2:1256 -5292:0:4365 -5293:3:3758 -5294:0:4365 -5295:2:1268 -5296:0:4365 -5297:3:3757 -5298:0:4365 -5299:2:1270 -5300:0:4365 -5301:3:3758 -5302:0:4365 -5303:2:1271 -5304:2:1275 -5305:2:1276 -5306:2:1284 -5307:2:1285 -5308:2:1289 -5309:2:1290 -5310:2:1284 -5311:2:1285 -5312:2:1289 -5313:2:1290 -5314:2:1298 -5315:2:1303 -5316:2:1307 -5317:2:1308 -5318:2:1315 -5319:2:1316 -5320:2:1327 -5321:2:1328 -5322:2:1329 -5323:2:1327 -5324:2:1328 -5325:2:1329 -5326:2:1340 -5327:2:1345 -5328:2:1346 -5329:0:4365 -5330:2:1358 -5331:0:4365 -5332:2:1454 -5333:0:4365 -5334:3:3757 -5335:0:4365 -5336:2:1455 -5337:0:4365 -5338:3:3758 -5339:0:4365 -5340:2:1652 -5341:0:4365 -5342:2:1653 -5343:0:4365 -5344:2:1657 -5345:0:4365 -5346:2:1660 -5347:0:4365 -5348:3:3757 -5349:0:4365 -5350:2:1665 -5351:2:1669 -5352:2:1670 -5353:2:1678 -5354:2:1679 -5355:2:1683 -5356:2:1684 -5357:2:1678 -5358:2:1679 -5359:2:1680 -5360:2:1692 -5361:2:1697 -5362:2:1701 -5363:2:1702 -5364:2:1709 -5365:2:1710 -5366:2:1721 -5367:2:1722 -5368:2:1723 -5369:2:1721 -5370:2:1722 -5371:2:1723 -5372:2:1734 -5373:2:1739 -5374:2:1740 -5375:0:4365 -5376:3:3758 -5377:0:4365 -5378:2:1752 -5379:0:4365 -5380:3:3757 -5381:0:4365 -5382:2:1754 -5383:0:4365 -5384:3:3758 -5385:0:4365 -5386:2:1755 -5387:2:1759 -5388:2:1760 -5389:2:1768 -5390:2:1769 -5391:2:1773 -5392:2:1774 -5393:2:1768 -5394:2:1769 -5395:2:1773 -5396:2:1774 -5397:2:1782 -5398:2:1787 -5399:2:1791 -5400:2:1792 -5401:2:1799 -5402:2:1800 -5403:2:1811 -5404:2:1812 -5405:2:1813 -5406:2:1811 -5407:2:1812 -5408:2:1813 -5409:2:1824 -5410:2:1829 -5411:2:1830 -5412:0:4365 -5413:2:1842 -5414:0:4365 -5415:3:3757 -5416:0:4365 -5417:2:1844 -5418:0:4365 -5419:3:3758 -5420:0:4365 -5421:2:1845 -5422:2:1849 -5423:2:1850 -5424:2:1858 -5425:2:1859 -5426:2:1863 -5427:2:1864 -5428:2:1858 -5429:2:1859 -5430:2:1863 -5431:2:1864 -5432:2:1872 -5433:2:1877 -5434:2:1881 -5435:2:1882 -5436:2:1889 -5437:2:1890 -5438:2:1901 -5439:2:1902 -5440:2:1903 -5441:2:1901 -5442:2:1902 -5443:2:1903 -5444:2:1914 -5445:2:1919 -5446:2:1920 -5447:0:4365 -5448:2:1932 -5449:0:4365 -5450:3:3757 -5451:0:4365 -5452:2:1934 -5453:0:4365 -5454:3:3758 -5455:0:4365 -5456:2:1935 -5457:0:4365 -5458:2:1936 -5459:0:4365 -5460:2:2129 -5461:0:4365 -5462:2:2130 -5463:0:4365 -5464:2:2134 -5465:0:4365 -5466:3:3757 -5467:0:4365 -5468:2:2136 -5469:0:4365 -5470:3:3758 -5471:0:4365 -5472:2:2137 -5473:2:2141 -5474:2:2142 -5475:2:2150 -5476:2:2151 -5477:2:2155 -5478:2:2156 -5479:2:2150 -5480:2:2151 -5481:2:2155 -5482:2:2156 -5483:2:2164 -5484:2:2169 -5485:2:2173 -5486:2:2174 -5487:2:2181 -5488:2:2182 -5489:2:2193 -5490:2:2194 -5491:2:2195 -5492:2:2193 -5493:2:2194 -5494:2:2195 -5495:2:2206 -5496:2:2211 -5497:2:2212 -5498:0:4365 -5499:2:2224 -5500:0:4365 -5501:3:3757 -5502:0:4365 -5503:2:2226 -5504:0:4365 -5505:3:3758 -5506:0:4365 -5507:2:1936 -5508:0:4365 -5509:2:2129 -5510:0:4365 -5511:2:2130 -5512:0:4365 -5513:2:2134 -5514:0:4365 -5515:3:3757 -5516:0:4365 -5517:2:2136 -5518:0:4365 -5519:3:3758 -5520:0:4365 -5521:2:2137 -5522:2:2141 -5523:2:2142 -5524:2:2150 -5525:2:2151 -5526:2:2155 -5527:2:2156 -5528:2:2150 -5529:2:2151 -5530:2:2152 -5531:2:2164 -5532:2:2169 -5533:2:2173 -5534:2:2174 -5535:2:2181 -5536:2:2182 -5537:2:2193 -5538:2:2194 -5539:2:2195 -5540:2:2193 -5541:2:2194 -5542:2:2195 -5543:2:2206 -5544:2:2211 -5545:2:2212 -5546:0:4365 -5547:2:2224 -5548:0:4365 -5549:3:3757 -5550:0:4365 -5551:2:2226 -5552:0:4365 -5553:3:3758 -5554:0:4365 -5555:2:2230 -5556:0:4365 -5557:3:3757 -5558:0:4365 -5559:2:2235 -5560:2:2239 -5561:2:2240 -5562:2:2248 -5563:2:2249 -5564:2:2253 -5565:2:2254 -5566:2:2248 -5567:2:2249 -5568:2:2250 -5569:2:2262 -5570:2:2267 -5571:2:2271 -5572:2:2272 -5573:2:2279 -5574:2:2280 -5575:2:2291 -5576:2:2292 -5577:2:2293 -5578:2:2291 -5579:2:2292 -5580:2:2293 -5581:2:2304 -5582:2:2309 -5583:2:2310 -5584:0:4365 -5585:3:3758 -5586:0:4365 -5587:2:2322 -5588:0:4365 -5589:2:1169 -5590:0:4365 -5591:3:3757 -5592:0:4365 -5593:2:1170 -5594:0:4365 -5595:3:3758 -5596:0:4365 -5597:3:3759 -5598:0:4365 -5599:3:3972 -5600:0:4365 -5601:3:3980 -5602:0:4365 -5603:3:3981 -5604:3:3985 -5605:3:3986 -5606:3:3994 -5607:3:3995 -5608:3:3999 -5609:3:4000 -5610:3:3994 -5611:3:3995 -5612:3:3999 -5613:3:4000 -5614:3:4008 -5615:3:4013 -5616:3:4017 -5617:3:4018 -5618:3:4025 -5619:3:4026 -5620:3:4037 -5621:3:4038 -5622:3:4039 -5623:3:4037 -5624:3:4038 -5625:3:4039 -5626:3:4050 -5627:3:4055 -5628:3:4056 -5629:0:4365 -5630:3:4068 -5631:0:4365 -5632:3:4069 -5633:0:4365 -5634:2:1173 -5635:0:4365 -5636:3:4070 -5637:0:4365 -5638:2:1179 -5639:0:4365 -5640:2:1180 -5641:0:4365 -5642:3:4069 -5643:0:4365 -5644:2:1181 -5645:2:1185 -5646:2:1186 -5647:2:1194 -5648:2:1195 -5649:2:1199 -5650:2:1200 -5651:2:1194 -5652:2:1195 -5653:2:1199 -5654:2:1200 -5655:2:1208 -5656:2:1213 -5657:2:1217 -5658:2:1218 -5659:2:1225 -5660:2:1226 -5661:2:1237 -5662:2:1238 -5663:2:1239 -5664:2:1237 -5665:2:1238 -5666:2:1239 -5667:2:1250 -5668:2:1255 -5669:2:1256 -5670:0:4365 -5671:3:4070 -5672:0:4365 -5673:2:1268 -5674:0:4365 -5675:3:4069 -5676:0:4365 -5677:2:1270 -5678:0:4365 -5679:3:4070 -5680:0:4365 -5681:2:1271 -5682:2:1275 -5683:2:1276 -5684:2:1284 -5685:2:1285 -5686:2:1289 -5687:2:1290 -5688:2:1284 -5689:2:1285 -5690:2:1289 -5691:2:1290 -5692:2:1298 -5693:2:1303 -5694:2:1307 -5695:2:1308 -5696:2:1315 -5697:2:1316 -5698:2:1327 -5699:2:1328 -5700:2:1329 -5701:2:1327 -5702:2:1328 -5703:2:1329 -5704:2:1340 -5705:2:1345 -5706:2:1346 -5707:0:4365 -5708:2:1358 -5709:0:4365 -5710:2:1360 -5711:0:4365 -5712:3:4069 -5713:0:4365 -5714:2:1361 -5715:0:4365 -5716:3:4070 -5717:0:4365 -5718:2:1362 -5719:2:1366 -5720:2:1367 -5721:2:1375 -5722:2:1376 -5723:2:1380 -5724:2:1381 -5725:2:1375 -5726:2:1376 -5727:2:1380 -5728:2:1381 -5729:2:1389 -5730:2:1394 -5731:2:1398 -5732:2:1399 -5733:2:1406 -5734:2:1407 -5735:2:1418 -5736:2:1419 -5737:2:1420 -5738:2:1418 -5739:2:1419 -5740:2:1420 -5741:2:1431 -5742:2:1436 -5743:2:1437 -5744:0:4365 -5745:2:1449 -5746:0:4365 -5747:3:4069 -5748:0:4365 -5749:2:1451 -5750:0:4365 -5751:3:4070 -5752:0:4365 -5753:2:1652 -5754:0:4365 -5755:2:1653 -5756:0:4365 -5757:2:1657 -5758:0:4365 -5759:2:1180 -5760:0:4365 -5761:3:4069 -5762:0:4365 -5763:2:1181 -5764:2:1185 -5765:2:1186 -5766:2:1194 -5767:2:1195 -5768:2:1199 -5769:2:1200 -5770:2:1194 -5771:2:1195 -5772:2:1196 -5773:2:1208 -5774:2:1213 -5775:2:1217 -5776:2:1218 -5777:2:1225 -5778:2:1226 -5779:2:1237 -5780:2:1238 -5781:2:1239 -5782:2:1237 -5783:2:1238 -5784:2:1239 -5785:2:1250 -5786:2:1255 -5787:2:1256 -5788:0:4365 -5789:3:4070 -5790:0:4365 -5791:2:1268 -5792:0:4365 -5793:3:4069 -5794:0:4365 -5795:2:1270 -5796:0:4365 -5797:3:4070 -5798:0:4365 -5799:2:1271 -5800:2:1275 -5801:2:1276 -5802:2:1284 -5803:2:1285 -5804:2:1289 -5805:2:1290 -5806:2:1284 -5807:2:1285 -5808:2:1289 -5809:2:1290 -5810:2:1298 -5811:2:1303 -5812:2:1307 -5813:2:1308 -5814:2:1315 -5815:2:1316 -5816:2:1327 -5817:2:1328 -5818:2:1329 -5819:2:1327 -5820:2:1328 -5821:2:1329 -5822:2:1340 -5823:2:1345 -5824:2:1346 -5825:0:4365 -5826:2:1358 -5827:0:4365 -5828:2:1454 -5829:0:4365 -5830:3:4069 -5831:0:4365 -5832:2:1455 -5833:0:4365 -5834:3:4070 -5835:0:4365 -5836:2:1652 -5837:0:4365 -5838:2:1653 -5839:0:4365 -5840:2:1657 -5841:0:4365 -5842:2:1660 -5843:0:4365 -5844:3:4069 -5845:0:4365 -5846:2:1665 -5847:2:1669 -5848:2:1670 -5849:2:1678 -5850:2:1679 -5851:2:1683 -5852:2:1684 -5853:2:1678 -5854:2:1679 -5855:2:1680 -5856:2:1692 -5857:2:1697 -5858:2:1701 -5859:2:1702 -5860:2:1709 -5861:2:1710 -5862:2:1721 -5863:2:1722 -5864:2:1723 -5865:2:1721 -5866:2:1722 -5867:2:1723 -5868:2:1734 -5869:2:1739 -5870:2:1740 -5871:0:4365 -5872:3:4070 -5873:0:4365 -5874:2:1752 -5875:0:4365 -5876:3:4069 -5877:0:4365 -5878:2:1754 -5879:0:4365 -5880:3:4070 -5881:0:4365 -5882:2:1755 -5883:2:1759 -5884:2:1760 -5885:2:1768 -5886:2:1769 -5887:2:1773 -5888:2:1774 -5889:2:1768 -5890:2:1769 -5891:2:1773 -5892:2:1774 -5893:2:1782 -5894:2:1787 -5895:2:1791 -5896:2:1792 -5897:2:1799 -5898:2:1800 -5899:2:1811 -5900:2:1812 -5901:2:1813 -5902:2:1811 -5903:2:1812 -5904:2:1813 -5905:2:1824 -5906:2:1829 -5907:2:1830 -5908:0:4365 -5909:2:1842 -5910:0:4365 -5911:3:4069 -5912:0:4365 -5913:2:1844 -5914:0:4365 -5915:3:4070 -5916:0:4365 -5917:2:1845 -5918:2:1849 -5919:2:1850 -5920:2:1858 -5921:2:1859 -5922:2:1863 -5923:2:1864 -5924:2:1858 -5925:2:1859 -5926:2:1863 -5927:2:1864 -5928:2:1872 -5929:2:1877 -5930:2:1881 -5931:2:1882 -5932:2:1889 -5933:2:1890 -5934:2:1901 -5935:2:1902 -5936:2:1903 -5937:2:1901 -5938:2:1902 -5939:2:1903 -5940:2:1914 -5941:2:1919 -5942:2:1920 -5943:0:4365 -5944:2:1932 -5945:0:4365 -5946:3:4069 -5947:0:4365 -5948:2:1934 -5949:0:4365 -5950:3:4070 -5951:0:4365 -5952:2:1935 -5953:0:4365 -5954:2:1936 -5955:0:4365 -5956:2:2129 -5957:0:4365 -5958:2:2130 -5959:0:4365 -5960:2:2134 -5961:0:4365 -5962:3:4069 -5963:0:4365 -5964:2:2136 -5965:0:4365 -5966:3:4070 -5967:0:4365 -5968:2:2137 -5969:2:2141 -5970:2:2142 -5971:2:2150 -5972:2:2151 -5973:2:2155 -5974:2:2156 -5975:2:2150 -5976:2:2151 -5977:2:2155 -5978:2:2156 -5979:2:2164 -5980:2:2169 -5981:2:2173 -5982:2:2174 -5983:2:2181 -5984:2:2182 -5985:2:2193 -5986:2:2194 -5987:2:2195 -5988:2:2193 -5989:2:2194 -5990:2:2195 -5991:2:2206 -5992:2:2211 -5993:2:2212 -5994:0:4365 -5995:2:2224 -5996:0:4365 -5997:3:4069 -5998:0:4365 -5999:2:2226 -6000:0:4365 -6001:3:4070 -6002:0:4365 -6003:2:1936 -6004:0:4365 -6005:2:2129 -6006:0:4365 -6007:2:2130 -6008:0:4365 -6009:2:2134 -6010:0:4365 -6011:3:4069 -6012:0:4365 -6013:2:2136 -6014:0:4365 -6015:3:4070 -6016:0:4365 -6017:2:2137 -6018:2:2141 -6019:2:2142 -6020:2:2150 -6021:2:2151 -6022:2:2155 -6023:2:2156 -6024:2:2150 -6025:2:2151 -6026:2:2152 -6027:2:2164 -6028:2:2169 -6029:2:2173 -6030:2:2174 -6031:2:2181 -6032:2:2182 -6033:2:2193 -6034:2:2194 -6035:2:2195 -6036:2:2193 -6037:2:2194 -6038:2:2195 -6039:2:2206 -6040:2:2211 -6041:2:2212 -6042:0:4365 -6043:2:2224 -6044:0:4365 -6045:3:4069 -6046:0:4365 -6047:2:2226 -6048:0:4365 -6049:3:4070 -6050:0:4365 -6051:2:2230 -6052:0:4365 -6053:3:4069 -6054:0:4365 -6055:2:2235 -6056:2:2239 -6057:2:2240 -6058:2:2248 -6059:2:2249 -6060:2:2253 -6061:2:2254 -6062:2:2248 -6063:2:2249 -6064:2:2250 -6065:2:2262 -6066:2:2267 -6067:2:2271 -6068:2:2272 -6069:2:2279 -6070:2:2280 -6071:2:2291 -6072:2:2292 -6073:2:2293 -6074:2:2291 -6075:2:2292 -6076:2:2293 -6077:2:2304 -6078:2:2309 -6079:2:2310 -6080:0:4365 -6081:3:4070 -6082:0:4365 -6083:2:2322 -6084:0:4365 -6085:2:1169 -6086:0:4365 -6087:3:4069 -6088:0:4365 -6089:2:1170 -6090:0:4365 -6091:3:4070 -6092:0:4365 -6093:3:4071 -6094:0:4365 -6095:3:4081 -6096:0:4365 -6097:3:3666 -6098:0:4365 -6099:3:3667 -6100:0:4365 -6101:3:3668 -6102:0:4365 -6103:3:3669 -6104:3:3673 -6105:3:3674 -6106:3:3682 -6107:3:3683 -6108:3:3687 -6109:3:3688 -6110:3:3682 -6111:3:3683 -6112:3:3687 -6113:3:3688 -6114:3:3696 -6115:3:3701 -6116:3:3705 -6117:3:3706 -6118:3:3713 -6119:3:3714 -6120:3:3725 -6121:3:3726 -6122:3:3727 -6123:3:3725 -6124:3:3726 -6125:3:3727 -6126:3:3738 -6127:3:3743 -6128:3:3744 -6129:0:4365 -6130:3:3756 -6131:0:4365 -6132:3:3757 -6133:0:4365 -6134:2:1173 -6135:0:4365 -6136:3:3758 -6137:0:4365 -6138:2:1179 -6139:0:4365 -6140:2:1180 -6141:0:4365 -6142:3:3757 -6143:0:4365 -6144:2:1181 -6145:2:1185 -6146:2:1186 -6147:2:1194 -6148:2:1195 -6149:2:1199 -6150:2:1200 -6151:2:1194 -6152:2:1195 -6153:2:1199 -6154:2:1200 -6155:2:1208 -6156:2:1213 -6157:2:1217 -6158:2:1218 -6159:2:1225 -6160:2:1226 -6161:2:1237 -6162:2:1238 -6163:2:1239 -6164:2:1237 -6165:2:1238 -6166:2:1239 -6167:2:1250 -6168:2:1255 -6169:2:1256 -6170:0:4365 -6171:3:3758 -6172:0:4365 -6173:2:1268 -6174:0:4365 -6175:3:3757 -6176:0:4365 -6177:2:1270 -6178:0:4365 -6179:3:3758 -6180:0:4365 -6181:2:1271 -6182:2:1275 -6183:2:1276 -6184:2:1284 -6185:2:1285 -6186:2:1289 -6187:2:1290 -6188:2:1284 -6189:2:1285 -6190:2:1289 -6191:2:1290 -6192:2:1298 -6193:2:1303 -6194:2:1307 -6195:2:1308 -6196:2:1315 -6197:2:1316 -6198:2:1327 -6199:2:1328 -6200:2:1329 -6201:2:1327 -6202:2:1328 -6203:2:1329 -6204:2:1340 -6205:2:1345 -6206:2:1346 -6207:0:4365 -6208:2:1358 -6209:0:4365 -6210:2:1360 -6211:0:4365 -6212:3:3757 -6213:0:4365 -6214:2:1361 -6215:0:4365 -6216:3:3758 -6217:0:4365 -6218:2:1362 -6219:2:1366 -6220:2:1367 -6221:2:1375 -6222:2:1376 -6223:2:1380 -6224:2:1381 -6225:2:1375 -6226:2:1376 -6227:2:1380 -6228:2:1381 -6229:2:1389 -6230:2:1394 -6231:2:1398 -6232:2:1399 -6233:2:1406 -6234:2:1407 -6235:2:1418 -6236:2:1419 -6237:2:1420 -6238:2:1418 -6239:2:1419 -6240:2:1420 -6241:2:1431 -6242:2:1436 -6243:2:1437 -6244:0:4365 -6245:2:1449 -6246:0:4365 -6247:3:3757 -6248:0:4365 -6249:2:1451 -6250:0:4365 -6251:3:3758 -6252:0:4365 -6253:2:1652 -6254:0:4365 -6255:2:1653 -6256:0:4365 -6257:2:1657 -6258:0:4365 -6259:2:1180 -6260:0:4365 -6261:3:3757 -6262:0:4365 -6263:2:1181 -6264:2:1185 -6265:2:1186 -6266:2:1194 -6267:2:1195 -6268:2:1199 -6269:2:1200 -6270:2:1194 -6271:2:1195 -6272:2:1196 -6273:2:1208 -6274:2:1213 -6275:2:1217 -6276:2:1218 -6277:2:1225 -6278:2:1226 -6279:2:1237 -6280:2:1238 -6281:2:1239 -6282:2:1237 -6283:2:1238 -6284:2:1239 -6285:2:1250 -6286:2:1255 -6287:2:1256 -6288:0:4365 -6289:3:3758 -6290:0:4365 -6291:2:1268 -6292:0:4365 -6293:3:3757 -6294:0:4365 -6295:2:1270 -6296:0:4365 -6297:3:3758 -6298:0:4365 -6299:2:1271 -6300:2:1275 -6301:2:1276 -6302:2:1284 -6303:2:1285 -6304:2:1289 -6305:2:1290 -6306:2:1284 -6307:2:1285 -6308:2:1289 -6309:2:1290 -6310:2:1298 -6311:2:1303 -6312:2:1307 -6313:2:1308 -6314:2:1315 -6315:2:1316 -6316:2:1327 -6317:2:1328 -6318:2:1329 -6319:2:1327 -6320:2:1328 -6321:2:1329 -6322:2:1340 -6323:2:1345 -6324:2:1346 -6325:0:4365 -6326:2:1358 -6327:0:4365 -6328:2:1454 -6329:0:4365 -6330:3:3757 -6331:0:4365 -6332:2:1455 -6333:0:4365 -6334:3:3758 -6335:0:4365 -6336:2:1652 -6337:0:4365 -6338:2:1653 -6339:0:4365 -6340:2:1657 -6341:0:4365 -6342:2:1660 -6343:0:4365 -6344:3:3757 -6345:0:4365 -6346:2:1665 -6347:2:1669 -6348:2:1670 -6349:2:1678 -6350:2:1679 -6351:2:1683 -6352:2:1684 -6353:2:1678 -6354:2:1679 -6355:2:1680 -6356:2:1692 -6357:2:1697 -6358:2:1701 -6359:2:1702 -6360:2:1709 -6361:2:1710 -6362:2:1721 -6363:2:1722 -6364:2:1723 -6365:2:1721 -6366:2:1722 -6367:2:1723 -6368:2:1734 -6369:2:1739 -6370:2:1740 -6371:0:4365 -6372:3:3758 -6373:0:4365 -6374:2:1752 -6375:0:4365 -6376:3:3757 -6377:0:4365 -6378:2:1754 -6379:0:4365 -6380:3:3758 -6381:0:4365 -6382:2:1755 -6383:2:1759 -6384:2:1760 -6385:2:1768 -6386:2:1769 -6387:2:1773 -6388:2:1774 -6389:2:1768 -6390:2:1769 -6391:2:1773 -6392:2:1774 -6393:2:1782 -6394:2:1787 -6395:2:1791 -6396:2:1792 -6397:2:1799 -6398:2:1800 -6399:2:1811 -6400:2:1812 -6401:2:1813 -6402:2:1811 -6403:2:1812 -6404:2:1813 -6405:2:1824 -6406:2:1829 -6407:2:1830 -6408:0:4365 -6409:2:1842 -6410:0:4365 -6411:3:3757 -6412:0:4365 -6413:2:1844 -6414:0:4365 -6415:3:3758 -6416:0:4365 -6417:2:1845 -6418:2:1849 -6419:2:1850 -6420:2:1858 -6421:2:1859 -6422:2:1863 -6423:2:1864 -6424:2:1858 -6425:2:1859 -6426:2:1863 -6427:2:1864 -6428:2:1872 -6429:2:1877 -6430:2:1881 -6431:2:1882 -6432:2:1889 -6433:2:1890 -6434:2:1901 -6435:2:1902 -6436:2:1903 -6437:2:1901 -6438:2:1902 -6439:2:1903 -6440:2:1914 -6441:2:1919 -6442:2:1920 -6443:0:4365 -6444:2:1932 -6445:0:4365 -6446:3:3757 -6447:0:4365 -6448:2:1934 -6449:0:4365 -6450:3:3758 -6451:0:4365 -6452:2:1935 -6453:0:4365 -6454:2:1936 -6455:0:4365 -6456:2:2129 -6457:0:4365 -6458:2:2130 -6459:0:4365 -6460:2:2134 -6461:0:4365 -6462:3:3757 -6463:0:4365 -6464:2:2136 -6465:0:4365 -6466:3:3758 -6467:0:4365 -6468:2:2137 -6469:2:2141 -6470:2:2142 -6471:2:2150 -6472:2:2151 -6473:2:2155 -6474:2:2156 -6475:2:2150 -6476:2:2151 -6477:2:2155 -6478:2:2156 -6479:2:2164 -6480:2:2169 -6481:2:2173 -6482:2:2174 -6483:2:2181 -6484:2:2182 -6485:2:2193 -6486:2:2194 -6487:2:2195 -6488:2:2193 -6489:2:2194 -6490:2:2195 -6491:2:2206 -6492:2:2211 -6493:2:2212 -6494:0:4365 -6495:2:2224 -6496:0:4365 -6497:3:3757 -6498:0:4365 -6499:2:2226 -6500:0:4365 -6501:3:3758 -6502:0:4365 -6503:2:1936 -6504:0:4365 -6505:2:2129 -6506:0:4365 -6507:2:2130 -6508:0:4365 -6509:2:2134 -6510:0:4365 -6511:3:3757 -6512:0:4365 -6513:2:2136 -6514:0:4365 -6515:3:3758 -6516:0:4365 -6517:2:2137 -6518:2:2141 -6519:2:2142 -6520:2:2150 -6521:2:2151 -6522:2:2155 -6523:2:2156 -6524:2:2150 -6525:2:2151 -6526:2:2152 -6527:2:2164 -6528:2:2169 -6529:2:2173 -6530:2:2174 -6531:2:2181 -6532:2:2182 -6533:2:2193 -6534:2:2194 -6535:2:2195 -6536:2:2193 -6537:2:2194 -6538:2:2195 -6539:2:2206 -6540:2:2211 -6541:2:2212 -6542:0:4365 -6543:2:2224 -6544:0:4365 -6545:3:3757 -6546:0:4365 -6547:2:2226 -6548:0:4365 -6549:3:3758 -6550:0:4365 -6551:2:2230 -6552:0:4365 -6553:3:3757 -6554:0:4365 -6555:2:2235 -6556:2:2239 -6557:2:2240 -6558:2:2248 -6559:2:2249 -6560:2:2253 -6561:2:2254 -6562:2:2248 -6563:2:2249 -6564:2:2250 -6565:2:2262 -6566:2:2267 -6567:2:2271 -6568:2:2272 -6569:2:2279 -6570:2:2280 -6571:2:2291 -6572:2:2292 -6573:2:2293 -6574:2:2291 -6575:2:2292 -6576:2:2293 -6577:2:2304 -6578:2:2309 -6579:2:2310 -6580:0:4365 -6581:3:3758 -6582:0:4365 -6583:2:2322 -6584:0:4365 -6585:2:1169 -6586:0:4365 -6587:3:3757 -6588:0:4365 -6589:2:1170 -6590:0:4365 -6591:3:3758 -6592:0:4365 -6593:3:3759 -6594:0:4365 -6595:3:3972 -6596:0:4365 -6597:3:4077 -6598:0:4365 -6599:3:4078 -6600:0:4365 -6601:3:4082 -6602:0:4365 -6603:3:4088 -6604:0:4365 -6605:3:4092 -6606:3:4093 -6607:3:4097 -6608:3:4101 -6609:3:4102 -6610:3:4097 -6611:3:4101 -6612:3:4102 -6613:3:4106 -6614:3:4114 -6615:3:4115 -6616:3:4120 -6617:3:4127 -6618:3:4128 -6619:3:4127 -6620:3:4128 -6621:3:4135 -6622:3:4140 -6623:0:4365 -6624:3:4151 -6625:0:4365 -6626:3:4155 -6627:3:4156 -6628:3:4160 -6629:3:4164 -6630:3:4165 -6631:3:4160 -6632:3:4164 -6633:3:4165 -6634:3:4169 -6635:3:4177 -6636:3:4178 -6637:3:4183 -6638:3:4190 -6639:3:4191 -6640:3:4190 -6641:3:4191 -6642:3:4198 -6643:3:4203 -6644:0:4365 -6645:3:4151 -6646:0:4365 -6647:3:4155 -6648:3:4156 -6649:3:4160 -6650:3:4164 -6651:3:4165 -6652:3:4160 -6653:3:4164 -6654:3:4165 -6655:3:4169 -6656:3:4177 -6657:3:4178 -6658:3:4183 -6659:3:4190 -6660:3:4191 -6661:3:4190 -6662:3:4191 -6663:3:4198 -6664:3:4203 -6665:0:4365 -6666:3:4214 -6667:0:4365 -6668:3:4222 -6669:3:4223 -6670:3:4227 -6671:3:4231 -6672:3:4232 -6673:3:4227 -6674:3:4231 -6675:3:4232 -6676:3:4236 -6677:3:4244 -6678:3:4245 -6679:3:4250 -6680:3:4257 -6681:3:4258 -6682:3:4257 -6683:3:4258 -6684:3:4265 -6685:3:4270 -6686:0:4365 -6687:3:4285 -6688:0:4365 -6689:3:4286 -6690:0:4365 -6691:2:1173 -6692:0:4365 -6693:3:4287 -6694:0:4365 -6695:2:1179 -6696:0:4365 -6697:2:1180 -6698:0:4365 -6699:3:4286 -6700:0:4365 -6701:2:1181 -6702:2:1185 -6703:2:1186 -6704:2:1194 -6705:2:1195 -6706:2:1199 -6707:2:1200 -6708:2:1194 -6709:2:1195 -6710:2:1199 -6711:2:1200 -6712:2:1208 -6713:2:1213 -6714:2:1217 -6715:2:1218 -6716:2:1225 -6717:2:1226 -6718:2:1237 -6719:2:1238 -6720:2:1239 -6721:2:1237 -6722:2:1238 -6723:2:1239 -6724:2:1250 -6725:2:1255 -6726:2:1256 -6727:0:4365 -6728:3:4287 -6729:0:4365 -6730:2:1268 -6731:0:4365 -6732:3:4286 -6733:0:4365 -6734:2:1270 -6735:0:4365 -6736:3:4287 -6737:0:4365 -6738:2:1271 -6739:2:1275 -6740:2:1276 -6741:2:1284 -6742:2:1285 -6743:2:1289 -6744:2:1290 -6745:2:1284 -6746:2:1285 -6747:2:1289 -6748:2:1290 -6749:2:1298 -6750:2:1303 -6751:2:1307 -6752:2:1308 -6753:2:1315 -6754:2:1316 -6755:2:1327 -6756:2:1328 -6757:2:1329 -6758:2:1327 -6759:2:1328 -6760:2:1329 -6761:2:1340 -6762:2:1345 -6763:2:1346 -6764:0:4365 -6765:2:1358 -6766:0:4365 -6767:2:1360 -6768:0:4365 -6769:3:4286 -6770:0:4365 -6771:2:1361 -6772:0:4365 -6773:3:4287 -6774:0:4365 -6775:2:1362 -6776:2:1366 -6777:2:1367 -6778:2:1375 -6779:2:1376 -6780:2:1380 -6781:2:1381 -6782:2:1375 -6783:2:1376 -6784:2:1380 -6785:2:1381 -6786:2:1389 -6787:2:1394 -6788:2:1398 -6789:2:1399 -6790:2:1406 -6791:2:1407 -6792:2:1418 -6793:2:1419 -6794:2:1420 -6795:2:1418 -6796:2:1419 -6797:2:1420 -6798:2:1431 -6799:2:1436 -6800:2:1437 -6801:0:4365 -6802:2:1449 -6803:0:4365 -6804:3:4286 -6805:0:4365 -6806:2:1451 -6807:0:4365 -6808:3:4287 -6809:0:4365 -6810:2:1652 -6811:0:4365 -6812:2:1653 -6813:0:4365 -6814:2:1657 -6815:0:4365 -6816:2:1180 -6817:0:4365 -6818:3:4286 -6819:0:4365 -6820:2:1181 -6821:2:1185 -6822:2:1186 -6823:2:1194 -6824:2:1195 -6825:2:1199 -6826:2:1200 -6827:2:1194 -6828:2:1195 -6829:2:1196 -6830:2:1208 -6831:2:1213 -6832:2:1217 -6833:2:1218 -6834:2:1225 -6835:2:1226 -6836:2:1237 -6837:2:1238 -6838:2:1239 -6839:2:1237 -6840:2:1238 -6841:2:1239 -6842:2:1250 -6843:2:1255 -6844:2:1256 -6845:0:4365 -6846:3:4287 -6847:0:4365 -6848:2:1268 -6849:0:4365 -6850:3:4286 -6851:0:4365 -6852:2:1270 -6853:0:4365 -6854:3:4287 -6855:0:4365 -6856:2:1271 -6857:2:1275 -6858:2:1276 -6859:2:1284 -6860:2:1285 -6861:2:1289 -6862:2:1290 -6863:2:1284 -6864:2:1285 -6865:2:1289 -6866:2:1290 -6867:2:1298 -6868:2:1303 -6869:2:1307 -6870:2:1308 -6871:2:1315 -6872:2:1316 -6873:2:1327 -6874:2:1328 -6875:2:1329 -6876:2:1327 -6877:2:1328 -6878:2:1329 -6879:2:1340 -6880:2:1345 -6881:2:1346 -6882:0:4365 -6883:2:1358 -6884:0:4365 -6885:2:1454 -6886:0:4365 -6887:3:4286 -6888:0:4365 -6889:2:1455 -6890:0:4365 -6891:3:4287 -6892:0:4365 -6893:2:1652 -6894:0:4365 -6895:2:1653 -6896:0:4365 -6897:2:1657 -6898:0:4365 -6899:2:1660 -6900:0:4365 -6901:3:4286 -6902:0:4365 -6903:2:1665 -6904:2:1669 -6905:2:1670 -6906:2:1678 -6907:2:1679 -6908:2:1683 -6909:2:1684 -6910:2:1678 -6911:2:1679 -6912:2:1680 -6913:2:1692 -6914:2:1697 -6915:2:1701 -6916:2:1702 -6917:2:1709 -6918:2:1710 -6919:2:1721 -6920:2:1722 -6921:2:1723 -6922:2:1721 -6923:2:1722 -6924:2:1723 -6925:2:1734 -6926:2:1739 -6927:2:1740 -6928:0:4365 -6929:3:4287 -6930:0:4365 -6931:2:1752 -6932:0:4365 -6933:3:4286 -6934:0:4365 -6935:2:1754 -6936:0:4365 -6937:3:4287 -6938:0:4365 -6939:2:1755 -6940:2:1759 -6941:2:1760 -6942:2:1768 -6943:2:1769 -6944:2:1773 -6945:2:1774 -6946:2:1768 -6947:2:1769 -6948:2:1773 -6949:2:1774 -6950:2:1782 -6951:2:1787 -6952:2:1791 -6953:2:1792 -6954:2:1799 -6955:2:1800 -6956:2:1811 -6957:2:1812 -6958:2:1813 -6959:2:1811 -6960:2:1812 -6961:2:1813 -6962:2:1824 -6963:2:1829 -6964:2:1830 -6965:0:4365 -6966:2:1842 -6967:0:4365 -6968:3:4286 -6969:0:4365 -6970:2:1844 -6971:0:4365 -6972:3:4287 -6973:0:4365 -6974:2:1845 -6975:2:1849 -6976:2:1850 -6977:2:1858 -6978:2:1859 -6979:2:1863 -6980:2:1864 -6981:2:1858 -6982:2:1859 -6983:2:1863 -6984:2:1864 -6985:2:1872 -6986:2:1877 -6987:2:1881 -6988:2:1882 -6989:2:1889 -6990:2:1890 -6991:2:1901 -6992:2:1902 -6993:2:1903 -6994:2:1901 -6995:2:1902 -6996:2:1903 -6997:2:1914 -6998:2:1919 -6999:2:1920 -7000:0:4365 -7001:2:1932 -7002:0:4365 -7003:3:4286 -7004:0:4365 -7005:2:1934 -7006:0:4365 -7007:3:4287 -7008:0:4365 -7009:2:1935 -7010:0:4365 -7011:2:1936 -7012:0:4365 -7013:2:2129 -7014:0:4365 -7015:2:2130 -7016:0:4365 -7017:2:2134 -7018:0:4365 -7019:3:4286 -7020:0:4365 -7021:2:2136 -7022:0:4365 -7023:3:4287 -7024:0:4365 -7025:2:2137 -7026:2:2141 -7027:2:2142 -7028:2:2150 -7029:2:2151 -7030:2:2155 -7031:2:2156 -7032:2:2150 -7033:2:2151 -7034:2:2155 -7035:2:2156 -7036:2:2164 -7037:2:2169 -7038:2:2173 -7039:2:2174 -7040:2:2181 -7041:2:2182 -7042:2:2193 -7043:2:2194 -7044:2:2195 -7045:2:2193 -7046:2:2194 -7047:2:2195 -7048:2:2206 -7049:2:2211 -7050:2:2212 -7051:0:4365 -7052:2:2224 -7053:0:4365 -7054:3:4286 -7055:0:4365 -7056:2:2226 -7057:0:4365 -7058:3:4287 -7059:0:4365 -7060:2:1936 -7061:0:4365 -7062:2:2129 -7063:0:4365 -7064:2:2130 -7065:0:4365 -7066:2:2134 -7067:0:4365 -7068:3:4286 -7069:0:4365 -7070:2:2136 -7071:0:4365 -7072:3:4287 -7073:0:4365 -7074:2:2137 -7075:2:2141 -7076:2:2142 -7077:2:2150 -7078:2:2151 -7079:2:2155 -7080:2:2156 -7081:2:2150 -7082:2:2151 -7083:2:2152 -7084:2:2164 -7085:2:2169 -7086:2:2173 -7087:2:2174 -7088:2:2181 -7089:2:2182 -7090:2:2193 -7091:2:2194 -7092:2:2195 -7093:2:2193 -7094:2:2194 -7095:2:2195 -7096:2:2206 -7097:2:2211 -7098:2:2212 -7099:0:4365 -7100:2:2224 -7101:0:4365 -7102:3:4286 -7103:0:4365 -7104:2:2226 -7105:0:4365 -7106:3:4287 -7107:0:4365 -7108:2:2230 -7109:0:4365 -7110:3:4286 -7111:0:4365 -7112:2:2235 -7113:2:2239 -7114:2:2240 -7115:2:2248 -7116:2:2249 -7117:2:2253 -7118:2:2254 -7119:2:2248 -7120:2:2249 -7121:2:2250 -7122:2:2262 -7123:2:2267 -7124:2:2271 -7125:2:2272 -7126:2:2279 -7127:2:2280 -7128:2:2291 -7129:2:2292 -7130:2:2293 -7131:2:2291 -7132:2:2292 -7133:2:2293 -7134:2:2304 -7135:2:2309 -7136:2:2310 -7137:0:4365 -7138:3:4287 -7139:0:4365 -7140:2:2322 -7141:0:4365 -7142:2:1169 -7143:0:4365 -7144:3:4286 -7145:0:4365 -7146:2:1170 -7147:0:4365 -7148:3:4287 -7149:0:4365 -7150:3:4288 -7151:0:4365 -7152:3:4294 -7153:0:4365 -7154:3:4295 -7155:0:4365 -7156:3:2338 -7157:0:4365 -7158:3:2339 -7159:3:2343 -7160:3:2344 -7161:3:2352 -7162:3:2353 -7163:3:2357 -7164:3:2358 -7165:3:2352 -7166:3:2353 -7167:3:2357 -7168:3:2358 -7169:3:2366 -7170:3:2371 -7171:3:2375 -7172:3:2376 -7173:3:2383 -7174:3:2384 -7175:3:2395 -7176:3:2396 -7177:3:2397 -7178:3:2395 -7179:3:2396 -7180:3:2397 -7181:3:2408 -7182:3:2413 -7183:3:2414 -7184:0:4365 -7185:3:2426 -7186:0:4365 -7187:3:2427 -7188:0:4365 -7189:2:1173 -7190:0:4365 -7191:3:2428 -7192:0:4365 -7193:2:1179 -7194:0:4365 -7195:2:1180 -7196:0:4365 -7197:3:2427 -7198:0:4365 -7199:2:1181 -7200:2:1185 -7201:2:1186 -7202:2:1194 -7203:2:1195 -7204:2:1199 -7205:2:1200 -7206:2:1194 -7207:2:1195 -7208:2:1199 -7209:2:1200 -7210:2:1208 -7211:2:1213 -7212:2:1217 -7213:2:1218 -7214:2:1225 -7215:2:1226 -7216:2:1237 -7217:2:1238 -7218:2:1239 -7219:2:1237 -7220:2:1238 -7221:2:1239 -7222:2:1250 -7223:2:1255 -7224:2:1256 -7225:0:4365 -7226:3:2428 -7227:0:4365 -7228:2:1268 -7229:0:4365 -7230:3:2427 -7231:0:4365 -7232:2:1270 -7233:0:4365 -7234:3:2428 -7235:0:4365 -7236:2:1271 -7237:2:1275 -7238:2:1276 -7239:2:1284 -7240:2:1285 -7241:2:1289 -7242:2:1290 -7243:2:1284 -7244:2:1285 -7245:2:1289 -7246:2:1290 -7247:2:1298 -7248:2:1303 -7249:2:1307 -7250:2:1308 -7251:2:1315 -7252:2:1316 -7253:2:1327 -7254:2:1328 -7255:2:1329 -7256:2:1327 -7257:2:1328 -7258:2:1329 -7259:2:1340 -7260:2:1345 -7261:2:1346 -7262:0:4365 -7263:2:1358 -7264:0:4365 -7265:2:1360 -7266:0:4365 -7267:3:2427 -7268:0:4365 -7269:2:1361 -7270:0:4365 -7271:3:2428 -7272:0:4365 -7273:2:1362 -7274:2:1366 -7275:2:1367 -7276:2:1375 -7277:2:1376 -7278:2:1380 -7279:2:1381 -7280:2:1375 -7281:2:1376 -7282:2:1380 -7283:2:1381 -7284:2:1389 -7285:2:1394 -7286:2:1398 -7287:2:1399 -7288:2:1406 -7289:2:1407 -7290:2:1418 -7291:2:1419 -7292:2:1420 -7293:2:1418 -7294:2:1419 -7295:2:1420 -7296:2:1431 -7297:2:1436 -7298:2:1437 -7299:0:4365 -7300:2:1449 -7301:0:4365 -7302:3:2427 -7303:0:4365 -7304:2:1451 -7305:0:4365 -7306:3:2428 -7307:0:4365 -7308:2:1652 -7309:0:4365 -7310:2:1653 -7311:0:4365 -7312:2:1657 -7313:0:4365 -7314:2:1180 -7315:0:4365 -7316:3:2427 -7317:0:4365 -7318:2:1181 -7319:2:1185 -7320:2:1186 -7321:2:1194 -7322:2:1195 -7323:2:1199 -7324:2:1200 -7325:2:1194 -7326:2:1195 -7327:2:1196 -7328:2:1208 -7329:2:1213 -7330:2:1217 -7331:2:1218 -7332:2:1225 -7333:2:1226 -7334:2:1237 -7335:2:1238 -7336:2:1239 -7337:2:1237 -7338:2:1238 -7339:2:1239 -7340:2:1250 -7341:2:1255 -7342:2:1256 -7343:0:4365 -7344:3:2428 -7345:0:4365 -7346:2:1268 -7347:0:4365 -7348:3:2427 -7349:0:4365 -7350:2:1270 -7351:0:4365 -7352:3:2428 -7353:0:4365 -7354:2:1271 -7355:2:1275 -7356:2:1276 -7357:2:1284 -7358:2:1285 -7359:2:1289 -7360:2:1290 -7361:2:1284 -7362:2:1285 -7363:2:1289 -7364:2:1290 -7365:2:1298 -7366:2:1303 -7367:2:1307 -7368:2:1308 -7369:2:1315 -7370:2:1316 -7371:2:1327 -7372:2:1328 -7373:2:1329 -7374:2:1327 -7375:2:1328 -7376:2:1329 -7377:2:1340 -7378:2:1345 -7379:2:1346 -7380:0:4365 -7381:2:1358 -7382:0:4365 -7383:2:1454 -7384:0:4365 -7385:3:2427 -7386:0:4365 -7387:2:1455 -7388:0:4365 -7389:3:2428 -7390:0:4365 -7391:2:1652 -7392:0:4365 -7393:2:1653 -7394:0:4365 -7395:2:1657 -7396:0:4365 -7397:2:1660 -7398:0:4365 -7399:3:2427 -7400:0:4365 -7401:2:1665 -7402:2:1669 -7403:2:1670 -7404:2:1678 -7405:2:1679 -7406:2:1683 -7407:2:1684 -7408:2:1678 -7409:2:1679 -7410:2:1680 -7411:2:1692 -7412:2:1697 -7413:2:1701 -7414:2:1702 -7415:2:1709 -7416:2:1710 -7417:2:1721 -7418:2:1722 -7419:2:1723 -7420:2:1721 -7421:2:1722 -7422:2:1723 -7423:2:1734 -7424:2:1739 -7425:2:1740 -7426:0:4365 -7427:3:2428 -7428:0:4365 -7429:2:1752 -7430:0:4365 -7431:3:2427 -7432:0:4365 -7433:2:1754 -7434:0:4365 -7435:3:2428 -7436:0:4365 -7437:2:1755 -7438:2:1759 -7439:2:1760 -7440:2:1768 -7441:2:1769 -7442:2:1773 -7443:2:1774 -7444:2:1768 -7445:2:1769 -7446:2:1773 -7447:2:1774 -7448:2:1782 -7449:2:1787 -7450:2:1791 -7451:2:1792 -7452:2:1799 -7453:2:1800 -7454:2:1811 -7455:2:1812 -7456:2:1813 -7457:2:1811 -7458:2:1812 -7459:2:1813 -7460:2:1824 -7461:2:1829 -7462:2:1830 -7463:0:4365 -7464:2:1842 -7465:0:4365 -7466:3:2427 -7467:0:4365 -7468:2:1844 -7469:0:4365 -7470:3:2428 -7471:0:4365 -7472:2:1845 -7473:2:1849 -7474:2:1850 -7475:2:1858 -7476:2:1859 -7477:2:1863 -7478:2:1864 -7479:2:1858 -7480:2:1859 -7481:2:1863 -7482:2:1864 -7483:2:1872 -7484:2:1877 -7485:2:1881 -7486:2:1882 -7487:2:1889 -7488:2:1890 -7489:2:1901 -7490:2:1902 -7491:2:1903 -7492:2:1901 -7493:2:1902 -7494:2:1903 -7495:2:1914 -7496:2:1919 -7497:2:1920 -7498:0:4365 -7499:2:1932 -7500:0:4365 -7501:3:2427 -7502:0:4365 -7503:2:1934 -7504:0:4365 -7505:3:2428 -7506:0:4365 -7507:2:1935 -7508:0:4365 -7509:2:1936 -7510:0:4365 -7511:2:2129 -7512:0:4365 -7513:2:2130 -7514:0:4365 -7515:2:2134 -7516:0:4365 -7517:3:2427 -7518:0:4365 -7519:2:2136 -7520:0:4365 -7521:3:2428 -7522:0:4365 -7523:2:2137 -7524:2:2141 -7525:2:2142 -7526:2:2150 -7527:2:2151 -7528:2:2155 -7529:2:2156 -7530:2:2150 -7531:2:2151 -7532:2:2155 -7533:2:2156 -7534:2:2164 -7535:2:2169 -7536:2:2173 -7537:2:2174 -7538:2:2181 -7539:2:2182 -7540:2:2193 -7541:2:2194 -7542:2:2195 -7543:2:2193 -7544:2:2194 -7545:2:2195 -7546:2:2206 -7547:2:2211 -7548:2:2212 -7549:0:4365 -7550:2:2224 -7551:0:4365 -7552:3:2427 -7553:0:4365 -7554:2:2226 -7555:0:4365 -7556:3:2428 -7557:0:4365 -7558:2:1936 -7559:0:4365 -7560:2:2129 -7561:0:4365 -7562:2:2130 -7563:0:4365 -7564:2:2134 -7565:0:4365 -7566:3:2427 -7567:0:4365 -7568:2:2136 -7569:0:4365 -7570:3:2428 -7571:0:4365 -7572:2:2137 -7573:2:2141 -7574:2:2142 -7575:2:2150 -7576:2:2151 -7577:2:2155 -7578:2:2156 -7579:2:2150 -7580:2:2151 -7581:2:2152 -7582:2:2164 -7583:2:2169 -7584:2:2173 -7585:2:2174 -7586:2:2181 -7587:2:2182 -7588:2:2193 -7589:2:2194 -7590:2:2195 -7591:2:2193 -7592:2:2194 -7593:2:2195 -7594:2:2206 -7595:2:2211 -7596:2:2212 -7597:0:4365 -7598:2:2224 -7599:0:4365 -7600:3:2427 -7601:0:4365 -7602:2:2226 -7603:0:4365 -7604:3:2428 -7605:0:4365 -7606:2:2230 -7607:0:4365 -7608:3:2427 -7609:0:4365 -7610:2:2235 -7611:2:2239 -7612:2:2240 -7613:2:2248 -7614:2:2249 -7615:2:2253 -7616:2:2254 -7617:2:2248 -7618:2:2249 -7619:2:2250 -7620:2:2262 -7621:2:2267 -7622:2:2271 -7623:2:2272 -7624:2:2279 -7625:2:2280 -7626:2:2291 -7627:2:2292 -7628:2:2293 -7629:2:2291 -7630:2:2292 -7631:2:2293 -7632:2:2304 -7633:2:2309 -7634:2:2310 -7635:0:4365 -7636:3:2428 -7637:0:4365 -7638:2:2322 -7639:0:4365 -7640:2:1169 -7641:0:4365 -7642:3:2427 -7643:0:4365 -7644:2:1170 -7645:0:4365 -7646:3:2428 -7647:0:4365 -7648:3:2429 -7649:0:4365 -7650:3:2435 -7651:3:2436 -7652:0:4365 -7653:3:2440 -7654:3:2444 -7655:3:2445 -7656:3:2453 -7657:3:2454 -7658:3:2458 -7659:3:2459 -7660:3:2453 -7661:3:2454 -7662:3:2458 -7663:3:2459 -7664:3:2467 -7665:3:2472 -7666:3:2473 -7667:3:2484 -7668:3:2485 -7669:3:2496 -7670:3:2497 -7671:3:2498 -7672:3:2496 -7673:3:2497 -7674:3:2498 -7675:3:2509 -7676:3:2514 -7677:3:2515 -7678:0:4365 -7679:3:2527 -7680:0:4365 -7681:3:2528 -7682:0:4365 -7683:2:1173 -7684:0:4365 -7685:3:2529 -7686:0:4365 -7687:2:1179 -7688:0:4365 -7689:2:1180 -7690:0:4365 -7691:3:2528 -7692:0:4365 -7693:2:1181 -7694:2:1185 -7695:2:1186 -7696:2:1194 -7697:2:1195 -7698:2:1199 -7699:2:1200 -7700:2:1194 -7701:2:1195 -7702:2:1199 -7703:2:1200 -7704:2:1208 -7705:2:1213 -7706:2:1217 -7707:2:1218 -7708:2:1225 -7709:2:1226 -7710:2:1237 -7711:2:1238 -7712:2:1239 -7713:2:1237 -7714:2:1238 -7715:2:1239 -7716:2:1250 -7717:2:1255 -7718:2:1256 -7719:0:4365 -7720:3:2529 -7721:0:4365 -7722:2:1268 -7723:0:4365 -7724:3:2528 -7725:0:4365 -7726:2:1270 -7727:0:4365 -7728:3:2529 -7729:0:4365 -7730:2:1271 -7731:2:1275 -7732:2:1276 -7733:2:1284 -7734:2:1285 -7735:2:1289 -7736:2:1290 -7737:2:1284 -7738:2:1285 -7739:2:1289 -7740:2:1290 -7741:2:1298 -7742:2:1303 -7743:2:1307 -7744:2:1308 -7745:2:1315 -7746:2:1316 -7747:2:1327 -7748:2:1328 -7749:2:1329 -7750:2:1327 -7751:2:1328 -7752:2:1329 -7753:2:1340 -7754:2:1345 -7755:2:1346 -7756:0:4365 -7757:2:1358 -7758:0:4365 -7759:2:1360 -7760:0:4365 -7761:3:2528 -7762:0:4365 -7763:2:1361 -7764:0:4365 -7765:3:2529 -7766:0:4365 -7767:2:1362 -7768:2:1366 -7769:2:1367 -7770:2:1375 -7771:2:1376 -7772:2:1380 -7773:2:1381 -7774:2:1375 -7775:2:1376 -7776:2:1380 -7777:2:1381 -7778:2:1389 -7779:2:1394 -7780:2:1398 -7781:2:1399 -7782:2:1406 -7783:2:1407 -7784:2:1418 -7785:2:1419 -7786:2:1420 -7787:2:1418 -7788:2:1419 -7789:2:1420 -7790:2:1431 -7791:2:1436 -7792:2:1437 -7793:0:4365 -7794:2:1449 -7795:0:4365 -7796:3:2528 -7797:0:4365 -7798:2:1451 -7799:0:4365 -7800:3:2529 -7801:0:4365 -7802:2:1652 -7803:0:4365 -7804:2:1653 -7805:0:4365 -7806:2:1657 -7807:0:4365 -7808:2:1180 -7809:0:4365 -7810:3:2528 -7811:0:4365 -7812:2:1181 -7813:2:1185 -7814:2:1186 -7815:2:1194 -7816:2:1195 -7817:2:1199 -7818:2:1200 -7819:2:1194 -7820:2:1195 -7821:2:1196 -7822:2:1208 -7823:2:1213 -7824:2:1217 -7825:2:1218 -7826:2:1225 -7827:2:1226 -7828:2:1237 -7829:2:1238 -7830:2:1239 -7831:2:1237 -7832:2:1238 -7833:2:1239 -7834:2:1250 -7835:2:1255 -7836:2:1256 -7837:0:4365 -7838:3:2529 -7839:0:4365 -7840:2:1268 -7841:0:4365 -7842:3:2528 -7843:0:4365 -7844:2:1270 -7845:0:4365 -7846:3:2529 -7847:0:4365 -7848:2:1271 -7849:2:1275 -7850:2:1276 -7851:2:1284 -7852:2:1285 -7853:2:1289 -7854:2:1290 -7855:2:1284 -7856:2:1285 -7857:2:1289 -7858:2:1290 -7859:2:1298 -7860:2:1303 -7861:2:1307 -7862:2:1308 -7863:2:1315 -7864:2:1316 -7865:2:1327 -7866:2:1328 -7867:2:1329 -7868:2:1327 -7869:2:1328 -7870:2:1329 -7871:2:1340 -7872:2:1345 -7873:2:1346 -7874:0:4365 -7875:2:1358 -7876:0:4365 -7877:2:1454 -7878:0:4365 -7879:3:2528 -7880:0:4365 -7881:2:1455 -7882:0:4365 -7883:3:2529 -7884:0:4365 -7885:2:1652 -7886:0:4365 -7887:2:1653 -7888:0:4365 -7889:2:1657 -7890:0:4365 -7891:2:1660 -7892:0:4365 -7893:3:2528 -7894:0:4365 -7895:2:1665 -7896:2:1669 -7897:2:1670 -7898:2:1678 -7899:2:1679 -7900:2:1683 -7901:2:1684 -7902:2:1678 -7903:2:1679 -7904:2:1680 -7905:2:1692 -7906:2:1697 -7907:2:1701 -7908:2:1702 -7909:2:1709 -7910:2:1710 -7911:2:1721 -7912:2:1722 -7913:2:1723 -7914:2:1721 -7915:2:1722 -7916:2:1723 -7917:2:1734 -7918:2:1739 -7919:2:1740 -7920:0:4365 -7921:3:2529 -7922:0:4365 -7923:2:1752 -7924:0:4365 -7925:3:2528 -7926:0:4365 -7927:2:1754 -7928:0:4365 -7929:3:2529 -7930:0:4365 -7931:2:1755 -7932:2:1759 -7933:2:1760 -7934:2:1768 -7935:2:1769 -7936:2:1773 -7937:2:1774 -7938:2:1768 -7939:2:1769 -7940:2:1773 -7941:2:1774 -7942:2:1782 -7943:2:1787 -7944:2:1791 -7945:2:1792 -7946:2:1799 -7947:2:1800 -7948:2:1811 -7949:2:1812 -7950:2:1813 -7951:2:1811 -7952:2:1812 -7953:2:1813 -7954:2:1824 -7955:2:1829 -7956:2:1830 -7957:0:4365 -7958:2:1842 -7959:0:4365 -7960:3:2528 -7961:0:4365 -7962:2:1844 -7963:0:4365 -7964:3:2529 -7965:0:4365 -7966:2:1845 -7967:2:1849 -7968:2:1850 -7969:2:1858 -7970:2:1859 -7971:2:1863 -7972:2:1864 -7973:2:1858 -7974:2:1859 -7975:2:1863 -7976:2:1864 -7977:2:1872 -7978:2:1877 -7979:2:1881 -7980:2:1882 -7981:2:1889 -7982:2:1890 -7983:2:1901 -7984:2:1902 -7985:2:1903 -7986:2:1901 -7987:2:1902 -7988:2:1903 -7989:2:1914 -7990:2:1919 -7991:2:1920 -7992:0:4365 -7993:2:1932 -7994:0:4365 -7995:3:2528 -7996:0:4365 -7997:2:1934 -7998:0:4365 -7999:3:2529 -8000:0:4365 -8001:2:1935 -8002:0:4365 -8003:2:1936 -8004:0:4365 -8005:2:2129 -8006:0:4365 -8007:2:2130 -8008:0:4365 -8009:2:2134 -8010:0:4365 -8011:3:2528 -8012:0:4365 -8013:2:2136 -8014:0:4365 -8015:3:2529 -8016:0:4365 -8017:2:2137 -8018:2:2141 -8019:2:2142 -8020:2:2150 -8021:2:2151 -8022:2:2155 -8023:2:2156 -8024:2:2150 -8025:2:2151 -8026:2:2155 -8027:2:2156 -8028:2:2164 -8029:2:2169 -8030:2:2173 -8031:2:2174 -8032:2:2181 -8033:2:2182 -8034:2:2193 -8035:2:2194 -8036:2:2195 -8037:2:2193 -8038:2:2194 -8039:2:2195 -8040:2:2206 -8041:2:2211 -8042:2:2212 -8043:0:4365 -8044:2:2224 -8045:0:4365 -8046:3:2528 -8047:0:4365 -8048:2:2226 -8049:0:4365 -8050:3:2529 -8051:0:4365 -8052:2:1936 -8053:0:4365 -8054:2:2129 -8055:0:4365 -8056:2:2130 -8057:0:4365 -8058:2:2134 -8059:0:4365 -8060:3:2528 -8061:0:4365 -8062:2:2136 -8063:0:4365 -8064:3:2529 -8065:0:4365 -8066:2:2137 -8067:2:2141 -8068:2:2142 -8069:2:2150 -8070:2:2151 -8071:2:2155 -8072:2:2156 -8073:2:2150 -8074:2:2151 -8075:2:2152 -8076:2:2164 -8077:2:2169 -8078:2:2173 -8079:2:2174 -8080:2:2181 -8081:2:2182 -8082:2:2193 -8083:2:2194 -8084:2:2195 -8085:2:2193 -8086:2:2194 -8087:2:2195 -8088:2:2206 -8089:2:2211 -8090:2:2212 -8091:0:4365 -8092:2:2224 -8093:0:4365 -8094:3:2528 -8095:0:4365 -8096:2:2226 -8097:0:4365 -8098:3:2529 -8099:0:4365 -8100:2:2230 -8101:0:4365 -8102:3:2528 -8103:0:4365 -8104:2:2235 -8105:2:2239 -8106:2:2240 -8107:2:2248 -8108:2:2249 -8109:2:2253 -8110:2:2254 -8111:2:2248 -8112:2:2249 -8113:2:2250 -8114:2:2262 -8115:2:2267 -8116:2:2271 -8117:2:2272 -8118:2:2279 -8119:2:2280 -8120:2:2291 -8121:2:2292 -8122:2:2293 -8123:2:2291 -8124:2:2292 -8125:2:2293 -8126:2:2304 -8127:2:2309 -8128:2:2310 -8129:0:4365 -8130:3:2529 -8131:0:4365 -8132:2:2322 -8133:0:4365 -8134:2:1169 -8135:0:4365 -8136:3:2528 -8137:0:4365 -8138:2:1170 -8139:0:4365 -8140:3:2529 -8141:0:4365 -8142:3:2530 -8143:0:4365 -8144:3:2536 -8145:0:4365 -8146:3:2537 -8147:0:4365 -8148:3:2547 -8149:0:4365 -8150:3:2548 -8151:0:4365 -8152:3:2552 -8153:3:2553 -8154:3:2557 -8155:3:2561 -8156:3:2562 -8157:3:2557 -8158:3:2561 -8159:3:2562 -8160:3:2566 -8161:3:2574 -8162:3:2575 -8163:3:2580 -8164:3:2587 -8165:3:2588 -8166:3:2587 -8167:3:2588 -8168:3:2595 -8169:3:2600 -8170:0:4365 -8171:3:2611 -8172:0:4365 -8173:3:2615 -8174:3:2616 -8175:3:2620 -8176:3:2624 -8177:3:2625 -8178:3:2620 -8179:3:2624 -8180:3:2625 -8181:3:2629 -8182:3:2637 -8183:3:2638 -8184:3:2643 -8185:3:2650 -8186:3:2651 -8187:3:2650 -8188:3:2651 -8189:3:2658 -8190:3:2663 -8191:0:4365 -8192:3:2611 -8193:0:4365 -8194:3:2615 -8195:3:2616 -8196:3:2620 -8197:3:2624 -8198:3:2625 -8199:3:2620 -8200:3:2624 -8201:3:2625 -8202:3:2629 -8203:3:2637 -8204:3:2638 -8205:3:2643 -8206:3:2650 -8207:3:2651 -8208:3:2650 -8209:3:2651 -8210:3:2658 -8211:3:2663 -8212:0:4365 -8213:3:2674 -8214:0:4365 -8215:3:2682 -8216:3:2683 -8217:3:2687 -8218:3:2691 -8219:3:2692 -8220:3:2687 -8221:3:2691 -8222:3:2692 -8223:3:2696 -8224:3:2704 -8225:3:2705 -8226:3:2710 -8227:3:2717 -8228:3:2718 -8229:3:2717 -8230:3:2718 -8231:3:2725 -8232:3:2730 -8233:0:4365 -8234:3:2745 -8235:0:4365 -8236:3:2746 -8237:0:4365 -8238:2:1173 -8239:0:4365 -8240:3:2747 -8241:0:4365 -8242:2:1179 -8243:0:4365 -8244:2:1180 -8245:0:4365 -8246:3:2746 -8247:0:4365 -8248:2:1181 -8249:2:1185 -8250:2:1186 -8251:2:1194 -8252:2:1195 -8253:2:1199 -8254:2:1200 -8255:2:1194 -8256:2:1195 -8257:2:1199 -8258:2:1200 -8259:2:1208 -8260:2:1213 -8261:2:1217 -8262:2:1218 -8263:2:1225 -8264:2:1226 -8265:2:1237 -8266:2:1238 -8267:2:1239 -8268:2:1237 -8269:2:1238 -8270:2:1239 -8271:2:1250 -8272:2:1255 -8273:2:1256 -8274:0:4365 -8275:3:2747 -8276:0:4365 -8277:2:1268 -8278:0:4365 -8279:3:2746 -8280:0:4365 -8281:2:1270 -8282:0:4365 -8283:3:2747 -8284:0:4365 -8285:2:1271 -8286:2:1275 -8287:2:1276 -8288:2:1284 -8289:2:1285 -8290:2:1289 -8291:2:1290 -8292:2:1284 -8293:2:1285 -8294:2:1289 -8295:2:1290 -8296:2:1298 -8297:2:1303 -8298:2:1307 -8299:2:1308 -8300:2:1315 -8301:2:1316 -8302:2:1327 -8303:2:1328 -8304:2:1329 -8305:2:1327 -8306:2:1328 -8307:2:1329 -8308:2:1340 -8309:2:1345 -8310:2:1346 -8311:0:4365 -8312:2:1358 -8313:0:4365 -8314:2:1360 -8315:0:4365 -8316:3:2746 -8317:0:4365 -8318:2:1361 -8319:0:4365 -8320:3:2747 -8321:0:4365 -8322:2:1362 -8323:2:1366 -8324:2:1367 -8325:2:1375 -8326:2:1376 -8327:2:1380 -8328:2:1381 -8329:2:1375 -8330:2:1376 -8331:2:1380 -8332:2:1381 -8333:2:1389 -8334:2:1394 -8335:2:1398 -8336:2:1399 -8337:2:1406 -8338:2:1407 -8339:2:1418 -8340:2:1419 -8341:2:1420 -8342:2:1418 -8343:2:1419 -8344:2:1420 -8345:2:1431 -8346:2:1436 -8347:2:1437 -8348:0:4365 -8349:2:1449 -8350:0:4365 -8351:3:2746 -8352:0:4365 -8353:2:1451 -8354:0:4365 -8355:3:2747 -8356:0:4365 -8357:2:1652 -8358:0:4365 -8359:2:1653 -8360:0:4365 -8361:2:1657 -8362:0:4365 -8363:2:1180 -8364:0:4365 -8365:3:2746 -8366:0:4365 -8367:2:1181 -8368:2:1185 -8369:2:1186 -8370:2:1194 -8371:2:1195 -8372:2:1199 -8373:2:1200 -8374:2:1194 -8375:2:1195 -8376:2:1196 -8377:2:1208 -8378:2:1213 -8379:2:1217 -8380:2:1218 -8381:2:1225 -8382:2:1226 -8383:2:1237 -8384:2:1238 -8385:2:1239 -8386:2:1237 -8387:2:1238 -8388:2:1239 -8389:2:1250 -8390:2:1255 -8391:2:1256 -8392:0:4365 -8393:3:2747 -8394:0:4365 -8395:2:1268 -8396:0:4365 -8397:3:2746 -8398:0:4365 -8399:2:1270 -8400:0:4365 -8401:3:2747 -8402:0:4365 -8403:2:1271 -8404:2:1275 -8405:2:1276 -8406:2:1284 -8407:2:1285 -8408:2:1289 -8409:2:1290 -8410:2:1284 -8411:2:1285 -8412:2:1289 -8413:2:1290 -8414:2:1298 -8415:2:1303 -8416:2:1307 -8417:2:1308 -8418:2:1315 -8419:2:1316 -8420:2:1327 -8421:2:1328 -8422:2:1329 -8423:2:1327 -8424:2:1328 -8425:2:1329 -8426:2:1340 -8427:2:1345 -8428:2:1346 -8429:0:4365 -8430:2:1358 -8431:0:4365 -8432:2:1454 -8433:0:4365 -8434:3:2746 -8435:0:4365 -8436:2:1455 -8437:0:4365 -8438:3:2747 -8439:0:4365 -8440:2:1652 -8441:0:4365 -8442:2:1653 -8443:0:4365 -8444:2:1657 -8445:0:4365 -8446:2:1660 -8447:0:4365 -8448:3:2746 -8449:0:4365 -8450:2:1665 -8451:2:1669 -8452:2:1670 -8453:2:1678 -8454:2:1679 -8455:2:1683 -8456:2:1684 -8457:2:1678 -8458:2:1679 -8459:2:1680 -8460:2:1692 -8461:2:1697 -8462:2:1701 -8463:2:1702 -8464:2:1709 -8465:2:1710 -8466:2:1721 -8467:2:1722 -8468:2:1723 -8469:2:1721 -8470:2:1722 -8471:2:1723 -8472:2:1734 -8473:2:1739 -8474:2:1740 -8475:0:4365 -8476:3:2747 -8477:0:4365 -8478:2:1752 -8479:0:4365 -8480:3:2746 -8481:0:4365 -8482:2:1754 -8483:0:4365 -8484:3:2747 -8485:0:4365 -8486:2:1755 -8487:2:1759 -8488:2:1760 -8489:2:1768 -8490:2:1769 -8491:2:1773 -8492:2:1774 -8493:2:1768 -8494:2:1769 -8495:2:1773 -8496:2:1774 -8497:2:1782 -8498:2:1787 -8499:2:1791 -8500:2:1792 -8501:2:1799 -8502:2:1800 -8503:2:1811 -8504:2:1812 -8505:2:1813 -8506:2:1811 -8507:2:1812 -8508:2:1813 -8509:2:1824 -8510:2:1829 -8511:2:1830 -8512:0:4365 -8513:2:1842 -8514:0:4365 -8515:3:2746 -8516:0:4365 -8517:2:1844 -8518:0:4365 -8519:3:2747 -8520:0:4365 -8521:2:1845 -8522:2:1849 -8523:2:1850 -8524:2:1858 -8525:2:1859 -8526:2:1863 -8527:2:1864 -8528:2:1858 -8529:2:1859 -8530:2:1863 -8531:2:1864 -8532:2:1872 -8533:2:1877 -8534:2:1881 -8535:2:1882 -8536:2:1889 -8537:2:1890 -8538:2:1901 -8539:2:1902 -8540:2:1903 -8541:2:1901 -8542:2:1902 -8543:2:1903 -8544:2:1914 -8545:2:1919 -8546:2:1920 -8547:0:4365 -8548:2:1932 -8549:0:4365 -8550:3:2746 -8551:0:4365 -8552:2:1934 -8553:0:4365 -8554:3:2747 -8555:0:4365 -8556:2:1935 -8557:0:4365 -8558:2:1936 -8559:0:4365 -8560:2:2129 -8561:0:4365 -8562:2:2130 -8563:0:4365 -8564:2:2134 -8565:0:4365 -8566:3:2746 -8567:0:4365 -8568:2:2136 -8569:0:4365 -8570:3:2747 -8571:0:4365 -8572:2:2137 -8573:2:2141 -8574:2:2142 -8575:2:2150 -8576:2:2151 -8577:2:2155 -8578:2:2156 -8579:2:2150 -8580:2:2151 -8581:2:2155 -8582:2:2156 -8583:2:2164 -8584:2:2169 -8585:2:2173 -8586:2:2174 -8587:2:2181 -8588:2:2182 -8589:2:2193 -8590:2:2194 -8591:2:2195 -8592:2:2193 -8593:2:2194 -8594:2:2195 -8595:2:2206 -8596:2:2211 -8597:2:2212 -8598:0:4365 -8599:2:2224 -8600:0:4365 -8601:3:2746 -8602:0:4365 -8603:2:2226 -8604:0:4365 -8605:3:2747 -8606:0:4365 -8607:2:1936 -8608:0:4365 -8609:2:2129 -8610:0:4365 -8611:2:2130 -8612:0:4365 -8613:2:2134 -8614:0:4365 -8615:3:2746 -8616:0:4365 -8617:2:2136 -8618:0:4365 -8619:3:2747 -8620:0:4365 -8621:2:2137 -8622:2:2141 -8623:2:2142 -8624:2:2150 -8625:2:2151 -8626:2:2155 -8627:2:2156 -8628:2:2150 -8629:2:2151 -8630:2:2152 -8631:2:2164 -8632:2:2169 -8633:2:2173 -8634:2:2174 -8635:2:2181 -8636:2:2182 -8637:2:2193 -8638:2:2194 -8639:2:2195 -8640:2:2193 -8641:2:2194 -8642:2:2195 -8643:2:2206 -8644:2:2211 -8645:2:2212 -8646:0:4365 -8647:2:2224 -8648:0:4365 -8649:3:2746 -8650:0:4365 -8651:2:2226 -8652:0:4365 -8653:3:2747 -8654:0:4365 -8655:2:2230 -8656:0:4365 -8657:3:2746 -8658:0:4365 -8659:2:2235 -8660:2:2239 -8661:2:2240 -8662:2:2248 -8663:2:2249 -8664:2:2253 -8665:2:2254 -8666:2:2248 -8667:2:2249 -8668:2:2250 -8669:2:2262 -8670:2:2267 -8671:2:2271 -8672:2:2272 -8673:2:2279 -8674:2:2280 -8675:2:2291 -8676:2:2292 -8677:2:2293 -8678:2:2291 -8679:2:2292 -8680:2:2293 -8681:2:2304 -8682:2:2309 -8683:2:2310 -8684:0:4365 -8685:3:2747 -8686:0:4365 -8687:2:2322 -8688:0:4365 -8689:2:1169 -8690:0:4365 -8691:3:2746 -8692:0:4365 -8693:2:1170 -8694:0:4365 -8695:3:2747 -8696:0:4365 -8697:3:2748 -8698:0:4365 -8699:3:2754 -8700:0:4365 -8701:3:2755 -8702:3:2759 -8703:3:2760 -8704:3:2768 -8705:3:2769 -8706:3:2773 -8707:3:2774 -8708:3:2768 -8709:3:2769 -8710:3:2773 -8711:3:2774 -8712:3:2782 -8713:3:2787 -8714:3:2791 -8715:3:2792 -8716:3:2799 -8717:3:2800 -8718:3:2811 -8719:3:2812 -8720:3:2813 -8721:3:2811 -8722:3:2812 -8723:3:2813 -8724:3:2824 -8725:3:2829 -8726:3:2830 -8727:0:4365 -8728:3:2842 -8729:0:4365 -8730:3:2843 -8731:0:4365 -8732:2:1173 -8733:0:4365 -8734:3:2844 -8735:0:4365 -8736:2:1179 -8737:0:4365 -8738:2:1180 -8739:0:4365 -8740:3:2843 -8741:0:4365 -8742:2:1181 -8743:2:1185 -8744:2:1186 -8745:2:1194 -8746:2:1195 -8747:2:1199 -8748:2:1200 -8749:2:1194 -8750:2:1195 -8751:2:1199 -8752:2:1200 -8753:2:1208 -8754:2:1213 -8755:2:1217 -8756:2:1218 -8757:2:1225 -8758:2:1226 -8759:2:1237 -8760:2:1238 -8761:2:1239 -8762:2:1237 -8763:2:1238 -8764:2:1239 -8765:2:1250 -8766:2:1255 -8767:2:1256 -8768:0:4365 -8769:3:2844 -8770:0:4365 -8771:2:1268 -8772:0:4365 -8773:3:2843 -8774:0:4365 -8775:2:1270 -8776:0:4365 -8777:3:2844 -8778:0:4365 -8779:2:1271 -8780:2:1275 -8781:2:1276 -8782:2:1284 -8783:2:1285 -8784:2:1289 -8785:2:1290 -8786:2:1284 -8787:2:1285 -8788:2:1289 -8789:2:1290 -8790:2:1298 -8791:2:1303 -8792:2:1307 -8793:2:1308 -8794:2:1315 -8795:2:1316 -8796:2:1327 -8797:2:1328 -8798:2:1329 -8799:2:1327 -8800:2:1328 -8801:2:1329 -8802:2:1340 -8803:2:1345 -8804:2:1346 -8805:0:4365 -8806:2:1358 -8807:0:4365 -8808:2:1360 -8809:0:4365 -8810:3:2843 -8811:0:4365 -8812:2:1361 -8813:0:4365 -8814:3:2844 -8815:0:4365 -8816:2:1362 -8817:2:1366 -8818:2:1367 -8819:2:1375 -8820:2:1376 -8821:2:1380 -8822:2:1381 -8823:2:1375 -8824:2:1376 -8825:2:1380 -8826:2:1381 -8827:2:1389 -8828:2:1394 -8829:2:1398 -8830:2:1399 -8831:2:1406 -8832:2:1407 -8833:2:1418 -8834:2:1419 -8835:2:1420 -8836:2:1418 -8837:2:1419 -8838:2:1420 -8839:2:1431 -8840:2:1436 -8841:2:1437 -8842:0:4365 -8843:2:1449 -8844:0:4365 -8845:3:2843 -8846:0:4365 -8847:2:1451 -8848:0:4365 -8849:3:2844 -8850:0:4365 -8851:2:1652 -8852:0:4365 -8853:2:1653 -8854:0:4365 -8855:2:1657 -8856:0:4365 -8857:2:1180 -8858:0:4365 -8859:3:2843 -8860:0:4365 -8861:2:1181 -8862:2:1185 -8863:2:1186 -8864:2:1194 -8865:2:1195 -8866:2:1199 -8867:2:1200 -8868:2:1194 -8869:2:1195 -8870:2:1196 -8871:2:1208 -8872:2:1213 -8873:2:1217 -8874:2:1218 -8875:2:1225 -8876:2:1226 -8877:2:1237 -8878:2:1238 -8879:2:1239 -8880:2:1237 -8881:2:1238 -8882:2:1239 -8883:2:1250 -8884:2:1255 -8885:2:1256 -8886:0:4365 -8887:3:2844 -8888:0:4365 -8889:2:1268 -8890:0:4365 -8891:3:2843 -8892:0:4365 -8893:2:1270 -8894:0:4365 -8895:3:2844 -8896:0:4365 -8897:2:1271 -8898:2:1275 -8899:2:1276 -8900:2:1284 -8901:2:1285 -8902:2:1289 -8903:2:1290 -8904:2:1284 -8905:2:1285 -8906:2:1289 -8907:2:1290 -8908:2:1298 -8909:2:1303 -8910:2:1307 -8911:2:1308 -8912:2:1315 -8913:2:1316 -8914:2:1327 -8915:2:1328 -8916:2:1329 -8917:2:1327 -8918:2:1328 -8919:2:1329 -8920:2:1340 -8921:2:1345 -8922:2:1346 -8923:0:4365 -8924:2:1358 -8925:0:4365 -8926:2:1454 -8927:0:4365 -8928:3:2843 -8929:0:4365 -8930:2:1455 -8931:0:4365 -8932:3:2844 -8933:0:4365 -8934:2:1652 -8935:0:4365 -8936:2:1653 -8937:0:4365 -8938:2:1657 -8939:0:4365 -8940:2:1660 -8941:0:4365 -8942:3:2843 -8943:0:4365 -8944:2:1665 -8945:2:1669 -8946:2:1670 -8947:2:1678 -8948:2:1679 -8949:2:1683 -8950:2:1684 -8951:2:1678 -8952:2:1679 -8953:2:1680 -8954:2:1692 -8955:2:1697 -8956:2:1701 -8957:2:1702 -8958:2:1709 -8959:2:1710 -8960:2:1721 -8961:2:1722 -8962:2:1723 -8963:2:1721 -8964:2:1722 -8965:2:1723 -8966:2:1734 -8967:2:1739 -8968:2:1740 -8969:0:4365 -8970:3:2844 -8971:0:4365 -8972:2:1752 -8973:0:4365 -8974:3:2843 -8975:0:4365 -8976:2:1754 -8977:0:4365 -8978:3:2844 -8979:0:4365 -8980:2:1755 -8981:2:1759 -8982:2:1760 -8983:2:1768 -8984:2:1769 -8985:2:1773 -8986:2:1774 -8987:2:1768 -8988:2:1769 -8989:2:1773 -8990:2:1774 -8991:2:1782 -8992:2:1787 -8993:2:1791 -8994:2:1792 -8995:2:1799 -8996:2:1800 -8997:2:1811 -8998:2:1812 -8999:2:1813 -9000:2:1811 -9001:2:1812 -9002:2:1813 -9003:2:1824 -9004:2:1829 -9005:2:1830 -9006:0:4365 -9007:2:1842 -9008:0:4365 -9009:3:2843 -9010:0:4365 -9011:2:1844 -9012:0:4365 -9013:3:2844 -9014:0:4365 -9015:2:1845 -9016:2:1849 -9017:2:1850 -9018:2:1858 -9019:2:1859 -9020:2:1863 -9021:2:1864 -9022:2:1858 -9023:2:1859 -9024:2:1863 -9025:2:1864 -9026:2:1872 -9027:2:1877 -9028:2:1881 -9029:2:1882 -9030:2:1889 -9031:2:1890 -9032:2:1901 -9033:2:1902 -9034:2:1903 -9035:2:1901 -9036:2:1902 -9037:2:1903 -9038:2:1914 -9039:2:1919 -9040:2:1920 -9041:0:4365 -9042:2:1932 -9043:0:4365 -9044:3:2843 -9045:0:4365 -9046:2:1934 -9047:0:4365 -9048:3:2844 -9049:0:4365 -9050:2:1935 -9051:0:4365 -9052:2:1936 -9053:0:4365 -9054:2:2129 -9055:0:4365 -9056:2:2130 -9057:0:4365 -9058:2:2134 -9059:0:4365 -9060:3:2843 -9061:0:4365 -9062:2:2136 -9063:0:4365 -9064:3:2844 -9065:0:4365 -9066:2:2137 -9067:2:2141 -9068:2:2142 -9069:2:2150 -9070:2:2151 -9071:2:2155 -9072:2:2156 -9073:2:2150 -9074:2:2151 -9075:2:2155 -9076:2:2156 -9077:2:2164 -9078:2:2169 -9079:2:2173 -9080:2:2174 -9081:2:2181 -9082:2:2182 -9083:2:2193 -9084:2:2194 -9085:2:2195 -9086:2:2193 -9087:2:2194 -9088:2:2195 -9089:2:2206 -9090:2:2211 -9091:2:2212 -9092:0:4365 -9093:2:2224 -9094:0:4365 -9095:3:2843 -9096:0:4365 -9097:2:2226 -9098:0:4365 -9099:3:2844 -9100:0:4365 -9101:2:1936 -9102:0:4365 -9103:2:2129 -9104:0:4365 -9105:2:2130 -9106:0:4365 -9107:2:2134 -9108:0:4365 -9109:3:2843 -9110:0:4365 -9111:2:2136 -9112:0:4365 -9113:3:2844 -9114:0:4365 -9115:2:2137 -9116:2:2141 -9117:2:2142 -9118:2:2150 -9119:2:2151 -9120:2:2155 -9121:2:2156 -9122:2:2150 -9123:2:2151 -9124:2:2152 -9125:2:2164 -9126:2:2169 -9127:2:2173 -9128:2:2174 -9129:2:2181 -9130:2:2182 -9131:2:2193 -9132:2:2194 -9133:2:2195 -9134:2:2193 -9135:2:2194 -9136:2:2195 -9137:2:2206 -9138:2:2211 -9139:2:2212 -9140:0:4365 -9141:2:2224 -9142:0:4365 -9143:3:2843 -9144:0:4365 -9145:2:2226 -9146:0:4365 -9147:3:2844 -9148:0:4365 -9149:2:2230 -9150:0:4365 -9151:3:2843 -9152:0:4365 -9153:2:2235 -9154:2:2239 -9155:2:2240 -9156:2:2248 -9157:2:2249 -9158:2:2253 -9159:2:2254 -9160:2:2248 -9161:2:2249 -9162:2:2250 -9163:2:2262 -9164:2:2267 -9165:2:2271 -9166:2:2272 -9167:2:2279 -9168:2:2280 -9169:2:2291 -9170:2:2292 -9171:2:2293 -9172:2:2291 -9173:2:2292 -9174:2:2293 -9175:2:2304 -9176:2:2309 -9177:2:2310 -9178:0:4365 -9179:3:2844 -9180:0:4365 -9181:2:2322 -9182:0:4365 -9183:2:1169 -9184:0:4365 -9185:3:2843 -9186:0:4365 -9187:2:1170 -9188:0:4365 -9189:3:2844 -9190:0:4365 -9191:3:2845 -9192:0:4365 -9193:3:2851 -9194:0:4365 -9195:3:2854 -9196:3:2855 -9197:3:2867 -9198:3:2868 -9199:3:2872 -9200:3:2873 -9201:3:2867 -9202:3:2868 -9203:3:2872 -9204:3:2873 -9205:3:2881 -9206:3:2886 -9207:3:2890 -9208:3:2891 -9209:3:2898 -9210:3:2899 -9211:3:2910 -9212:3:2911 -9213:3:2912 -9214:3:2910 -9215:3:2911 -9216:3:2912 -9217:3:2923 -9218:3:2928 -9219:3:2929 -9220:0:4365 -9221:3:2941 -9222:0:4365 -9223:3:2942 -9224:0:4365 -9225:2:1173 -9226:0:4365 -9227:3:2943 -9228:0:4365 -9229:2:1179 -9230:0:4365 -9231:2:1180 -9232:0:4365 -9233:3:2942 -9234:0:4365 -9235:2:1181 -9236:2:1185 -9237:2:1186 -9238:2:1194 -9239:2:1195 -9240:2:1199 -9241:2:1200 -9242:2:1194 -9243:2:1195 -9244:2:1199 -9245:2:1200 -9246:2:1208 -9247:2:1213 -9248:2:1217 -9249:2:1218 -9250:2:1225 -9251:2:1226 -9252:2:1237 -9253:2:1238 -9254:2:1239 -9255:2:1237 -9256:2:1238 -9257:2:1239 -9258:2:1250 -9259:2:1255 -9260:2:1256 -9261:0:4365 -9262:3:2943 -9263:0:4365 -9264:2:1268 -9265:0:4365 -9266:3:2942 -9267:0:4365 -9268:2:1270 -9269:0:4365 -9270:3:2943 -9271:0:4365 -9272:2:1271 -9273:2:1275 -9274:2:1276 -9275:2:1284 -9276:2:1285 -9277:2:1289 -9278:2:1290 -9279:2:1284 -9280:2:1285 -9281:2:1289 -9282:2:1290 -9283:2:1298 -9284:2:1303 -9285:2:1307 -9286:2:1308 -9287:2:1315 -9288:2:1316 -9289:2:1327 -9290:2:1328 -9291:2:1329 -9292:2:1327 -9293:2:1328 -9294:2:1329 -9295:2:1340 -9296:2:1345 -9297:2:1346 -9298:0:4365 -9299:2:1358 -9300:0:4365 -9301:2:1360 -9302:0:4365 -9303:3:2942 -9304:0:4365 -9305:2:1361 -9306:0:4365 -9307:3:2943 -9308:0:4365 -9309:2:1362 -9310:2:1366 -9311:2:1367 -9312:2:1375 -9313:2:1376 -9314:2:1380 -9315:2:1381 -9316:2:1375 -9317:2:1376 -9318:2:1380 -9319:2:1381 -9320:2:1389 -9321:2:1394 -9322:2:1398 -9323:2:1399 -9324:2:1406 -9325:2:1407 -9326:2:1418 -9327:2:1419 -9328:2:1420 -9329:2:1418 -9330:2:1419 -9331:2:1420 -9332:2:1431 -9333:2:1436 -9334:2:1437 -9335:0:4365 -9336:2:1449 -9337:0:4365 -9338:3:2942 -9339:0:4365 -9340:2:1451 -9341:0:4365 -9342:3:2943 -9343:0:4365 -9344:2:1652 -9345:0:4365 -9346:2:1653 -9347:0:4365 -9348:2:1657 -9349:0:4365 -9350:2:1180 -9351:0:4365 -9352:3:2942 -9353:0:4365 -9354:2:1181 -9355:2:1185 -9356:2:1186 -9357:2:1194 -9358:2:1195 -9359:2:1199 -9360:2:1200 -9361:2:1194 -9362:2:1195 -9363:2:1196 -9364:2:1208 -9365:2:1213 -9366:2:1217 -9367:2:1218 -9368:2:1225 -9369:2:1226 -9370:2:1237 -9371:2:1238 -9372:2:1239 -9373:2:1237 -9374:2:1238 -9375:2:1239 -9376:2:1250 -9377:2:1255 -9378:2:1256 -9379:0:4365 -9380:3:2943 -9381:0:4365 -9382:2:1268 -9383:0:4365 -9384:3:2942 -9385:0:4365 -9386:2:1270 -9387:0:4365 -9388:3:2943 -9389:0:4365 -9390:2:1271 -9391:2:1275 -9392:2:1276 -9393:2:1284 -9394:2:1285 -9395:2:1289 -9396:2:1290 -9397:2:1284 -9398:2:1285 -9399:2:1289 -9400:2:1290 -9401:2:1298 -9402:2:1303 -9403:2:1307 -9404:2:1308 -9405:2:1315 -9406:2:1316 -9407:2:1327 -9408:2:1328 -9409:2:1329 -9410:2:1327 -9411:2:1328 -9412:2:1329 -9413:2:1340 -9414:2:1345 -9415:2:1346 -9416:0:4365 -9417:2:1358 -9418:0:4365 -9419:2:1454 -9420:0:4365 -9421:3:2942 -9422:0:4365 -9423:2:1455 -9424:0:4365 -9425:3:2943 -9426:0:4365 -9427:2:1652 -9428:0:4365 -9429:2:1653 -9430:0:4365 -9431:2:1657 -9432:0:4365 -9433:2:1660 -9434:0:4365 -9435:3:2942 -9436:0:4365 -9437:2:1665 -9438:2:1669 -9439:2:1670 -9440:2:1678 -9441:2:1679 -9442:2:1683 -9443:2:1684 -9444:2:1678 -9445:2:1679 -9446:2:1680 -9447:2:1692 -9448:2:1697 -9449:2:1701 -9450:2:1702 -9451:2:1709 -9452:2:1710 -9453:2:1721 -9454:2:1722 -9455:2:1723 -9456:2:1721 -9457:2:1722 -9458:2:1723 -9459:2:1734 -9460:2:1739 -9461:2:1740 -9462:0:4365 -9463:3:2943 -9464:0:4365 -9465:2:1752 -9466:0:4365 -9467:3:2942 -9468:0:4365 -9469:2:1754 -9470:0:4365 -9471:3:2943 -9472:0:4365 -9473:2:1755 -9474:2:1759 -9475:2:1760 -9476:2:1768 -9477:2:1769 -9478:2:1773 -9479:2:1774 -9480:2:1768 -9481:2:1769 -9482:2:1773 -9483:2:1774 -9484:2:1782 -9485:2:1787 -9486:2:1791 -9487:2:1792 -9488:2:1799 -9489:2:1800 -9490:2:1811 -9491:2:1812 -9492:2:1813 -9493:2:1811 -9494:2:1812 -9495:2:1813 -9496:2:1824 -9497:2:1829 -9498:2:1830 -9499:0:4365 -9500:2:1842 -9501:0:4365 -9502:3:2942 -9503:0:4365 -9504:2:1844 -9505:0:4365 -9506:3:2943 -9507:0:4365 -9508:2:1845 -9509:2:1849 -9510:2:1850 -9511:2:1858 -9512:2:1859 -9513:2:1863 -9514:2:1864 -9515:2:1858 -9516:2:1859 -9517:2:1863 -9518:2:1864 -9519:2:1872 -9520:2:1877 -9521:2:1881 -9522:2:1882 -9523:2:1889 -9524:2:1890 -9525:2:1901 -9526:2:1902 -9527:2:1903 -9528:2:1901 -9529:2:1902 -9530:2:1903 -9531:2:1914 -9532:2:1919 -9533:2:1920 -9534:0:4365 -9535:2:1932 -9536:0:4365 -9537:3:2942 -9538:0:4365 -9539:2:1934 -9540:0:4365 -9541:3:2943 -9542:0:4365 -9543:2:1935 -9544:0:4365 -9545:2:1936 -9546:0:4365 -9547:2:2129 -9548:0:4365 -9549:2:2130 -9550:0:4365 -9551:2:2134 -9552:0:4365 -9553:3:2942 -9554:0:4365 -9555:2:2136 -9556:0:4365 -9557:3:2943 -9558:0:4365 -9559:2:2137 -9560:2:2141 -9561:2:2142 -9562:2:2150 -9563:2:2151 -9564:2:2155 -9565:2:2156 -9566:2:2150 -9567:2:2151 -9568:2:2155 -9569:2:2156 -9570:2:2164 -9571:2:2169 -9572:2:2173 -9573:2:2174 -9574:2:2181 -9575:2:2182 -9576:2:2193 -9577:2:2194 -9578:2:2195 -9579:2:2193 -9580:2:2194 -9581:2:2195 -9582:2:2206 -9583:2:2211 -9584:2:2212 -9585:0:4365 -9586:2:2224 -9587:0:4365 -9588:3:2942 -9589:0:4365 -9590:2:2226 -9591:0:4365 -9592:3:2943 -9593:0:4365 -9594:2:1936 -9595:0:4365 -9596:2:2129 -9597:0:4365 -9598:2:2130 -9599:0:4365 -9600:2:2134 -9601:0:4365 -9602:3:2942 -9603:0:4365 -9604:2:2136 -9605:0:4365 -9606:3:2943 -9607:0:4365 -9608:2:2137 -9609:2:2141 -9610:2:2142 -9611:2:2150 -9612:2:2151 -9613:2:2155 -9614:2:2156 -9615:2:2150 -9616:2:2151 -9617:2:2152 -9618:2:2164 -9619:2:2169 -9620:2:2173 -9621:2:2174 -9622:2:2181 -9623:2:2182 -9624:2:2193 -9625:2:2194 -9626:2:2195 -9627:2:2193 -9628:2:2194 -9629:2:2195 -9630:2:2206 -9631:2:2211 -9632:2:2212 -9633:0:4365 -9634:2:2224 -9635:0:4365 -9636:3:2942 -9637:0:4365 -9638:2:2226 -9639:0:4365 -9640:3:2943 -9641:0:4365 -9642:2:2230 -9643:0:4365 -9644:3:2942 -9645:0:4365 -9646:2:2235 -9647:2:2239 -9648:2:2240 -9649:2:2248 -9650:2:2249 -9651:2:2253 -9652:2:2254 -9653:2:2248 -9654:2:2249 -9655:2:2250 -9656:2:2262 -9657:2:2267 -9658:2:2271 -9659:2:2272 -9660:2:2279 -9661:2:2280 -9662:2:2291 -9663:2:2292 -9664:2:2293 -9665:2:2291 -9666:2:2292 -9667:2:2293 -9668:2:2304 -9669:2:2309 -9670:2:2310 -9671:0:4365 -9672:3:2943 -9673:0:4365 -9674:2:2322 -9675:0:4365 -9676:2:1169 -9677:0:4365 -9678:3:2942 -9679:0:4365 -9680:2:1170 -9681:0:4365 -9682:3:2943 -9683:0:4365 -9684:3:2944 -9685:0:4365 -9686:3:2950 -9687:0:4365 -9688:3:2951 -9689:0:4365 -9690:3:2952 -9691:0:4365 -9692:3:2953 -9693:0:4365 -9694:3:2954 -9695:3:2958 -9696:3:2959 -9697:3:2967 -9698:3:2968 -9699:3:2972 -9700:3:2973 -9701:3:2967 -9702:3:2968 -9703:3:2972 -9704:3:2973 -9705:3:2981 -9706:3:2986 -9707:3:2990 -9708:3:2991 -9709:3:2998 -9710:3:2999 -9711:3:3010 -9712:3:3011 -9713:3:3012 -9714:3:3010 -9715:3:3011 -9716:3:3012 -9717:3:3023 -9718:3:3028 -9719:3:3029 -9720:0:4365 -9721:3:3041 -9722:0:4365 -9723:3:3042 -9724:0:4365 -9725:2:1173 -9726:0:4365 -9727:3:3043 -9728:0:4365 -9729:2:1179 -9730:0:4365 -9731:2:1180 -9732:0:4365 -9733:3:3042 -9734:0:4365 -9735:2:1181 -9736:2:1185 -9737:2:1186 -9738:2:1194 -9739:2:1195 -9740:2:1199 -9741:2:1200 -9742:2:1194 -9743:2:1195 -9744:2:1199 -9745:2:1200 -9746:2:1208 -9747:2:1213 -9748:2:1217 -9749:2:1218 -9750:2:1225 -9751:2:1226 -9752:2:1237 -9753:2:1238 -9754:2:1239 -9755:2:1237 -9756:2:1238 -9757:2:1239 -9758:2:1250 -9759:2:1255 -9760:2:1256 -9761:0:4365 -9762:3:3043 -9763:0:4365 -9764:2:1268 -9765:0:4365 -9766:3:3042 -9767:0:4365 -9768:2:1270 -9769:0:4365 -9770:3:3043 -9771:0:4365 -9772:2:1271 -9773:2:1275 -9774:2:1276 -9775:2:1284 -9776:2:1285 -9777:2:1289 -9778:2:1290 -9779:2:1284 -9780:2:1285 -9781:2:1289 -9782:2:1290 -9783:2:1298 -9784:2:1303 -9785:2:1307 -9786:2:1308 -9787:2:1315 -9788:2:1316 -9789:2:1327 -9790:2:1328 -9791:2:1329 -9792:2:1327 -9793:2:1328 -9794:2:1329 -9795:2:1340 -9796:2:1345 -9797:2:1346 -9798:0:4365 -9799:2:1358 -9800:0:4365 -9801:2:1360 -9802:0:4365 -9803:3:3042 -9804:0:4365 -9805:2:1361 -9806:0:4365 -9807:3:3043 -9808:0:4365 -9809:2:1362 -9810:2:1366 -9811:2:1367 -9812:2:1375 -9813:2:1376 -9814:2:1380 -9815:2:1381 -9816:2:1375 -9817:2:1376 -9818:2:1380 -9819:2:1381 -9820:2:1389 -9821:2:1394 -9822:2:1398 -9823:2:1399 -9824:2:1406 -9825:2:1407 -9826:2:1418 -9827:2:1419 -9828:2:1420 -9829:2:1418 -9830:2:1419 -9831:2:1420 -9832:2:1431 -9833:2:1436 -9834:2:1437 -9835:0:4365 -9836:2:1449 -9837:0:4365 -9838:3:3042 -9839:0:4365 -9840:2:1451 -9841:0:4365 -9842:3:3043 -9843:0:4365 -9844:2:1652 -9845:0:4365 -9846:2:1653 -9847:0:4365 -9848:2:1657 -9849:0:4365 -9850:2:1180 -9851:0:4365 -9852:3:3042 -9853:0:4365 -9854:2:1181 -9855:2:1185 -9856:2:1186 -9857:2:1194 -9858:2:1195 -9859:2:1199 -9860:2:1200 -9861:2:1194 -9862:2:1195 -9863:2:1196 -9864:2:1208 -9865:2:1213 -9866:2:1217 -9867:2:1218 -9868:2:1225 -9869:2:1226 -9870:2:1237 -9871:2:1238 -9872:2:1239 -9873:2:1237 -9874:2:1238 -9875:2:1239 -9876:2:1250 -9877:2:1255 -9878:2:1256 -9879:0:4365 -9880:3:3043 -9881:0:4365 -9882:2:1268 -9883:0:4365 -9884:3:3042 -9885:0:4365 -9886:2:1270 -9887:0:4365 -9888:3:3043 -9889:0:4365 -9890:2:1271 -9891:2:1275 -9892:2:1276 -9893:2:1284 -9894:2:1285 -9895:2:1289 -9896:2:1290 -9897:2:1284 -9898:2:1285 -9899:2:1289 -9900:2:1290 -9901:2:1298 -9902:2:1303 -9903:2:1307 -9904:2:1308 -9905:2:1315 -9906:2:1316 -9907:2:1327 -9908:2:1328 -9909:2:1329 -9910:2:1327 -9911:2:1328 -9912:2:1329 -9913:2:1340 -9914:2:1345 -9915:2:1346 -9916:0:4365 -9917:2:1358 -9918:0:4365 -9919:2:1454 -9920:0:4365 -9921:3:3042 -9922:0:4365 -9923:2:1455 -9924:0:4365 -9925:3:3043 -9926:0:4365 -9927:2:1652 -9928:0:4365 -9929:2:1653 -9930:0:4365 -9931:2:1657 -9932:0:4365 -9933:2:1660 -9934:0:4365 -9935:3:3042 -9936:0:4365 -9937:2:1665 -9938:2:1669 -9939:2:1670 -9940:2:1678 -9941:2:1679 -9942:2:1683 -9943:2:1684 -9944:2:1678 -9945:2:1679 -9946:2:1680 -9947:2:1692 -9948:2:1697 -9949:2:1701 -9950:2:1702 -9951:2:1709 -9952:2:1710 -9953:2:1721 -9954:2:1722 -9955:2:1723 -9956:2:1721 -9957:2:1722 -9958:2:1723 -9959:2:1734 -9960:2:1739 -9961:2:1740 -9962:0:4365 -9963:3:3043 -9964:0:4365 -9965:2:1752 -9966:0:4365 -9967:3:3042 -9968:0:4365 -9969:2:1754 -9970:0:4365 -9971:3:3043 -9972:0:4365 -9973:2:1755 -9974:2:1759 -9975:2:1760 -9976:2:1768 -9977:2:1769 -9978:2:1773 -9979:2:1774 -9980:2:1768 -9981:2:1769 -9982:2:1773 -9983:2:1774 -9984:2:1782 -9985:2:1787 -9986:2:1791 -9987:2:1792 -9988:2:1799 -9989:2:1800 -9990:2:1811 -9991:2:1812 -9992:2:1813 -9993:2:1811 -9994:2:1812 -9995:2:1813 -9996:2:1824 -9997:2:1829 -9998:2:1830 -9999:0:4365 -10000:2:1842 -10001:0:4365 -10002:3:3042 -10003:0:4365 -10004:2:1844 -10005:0:4365 -10006:3:3043 -10007:0:4365 -10008:2:1845 -10009:2:1849 -10010:2:1850 -10011:2:1858 -10012:2:1859 -10013:2:1863 -10014:2:1864 -10015:2:1858 -10016:2:1859 -10017:2:1863 -10018:2:1864 -10019:2:1872 -10020:2:1877 -10021:2:1881 -10022:2:1882 -10023:2:1889 -10024:2:1890 -10025:2:1901 -10026:2:1902 -10027:2:1903 -10028:2:1901 -10029:2:1902 -10030:2:1903 -10031:2:1914 -10032:2:1919 -10033:2:1920 -10034:0:4365 -10035:2:1932 -10036:0:4365 -10037:3:3042 -10038:0:4365 -10039:2:1934 -10040:0:4365 -10041:3:3043 -10042:0:4365 -10043:2:1935 -10044:0:4365 -10045:2:1936 -10046:0:4365 -10047:2:2129 -10048:0:4365 -10049:2:2130 -10050:0:4365 -10051:2:2134 -10052:0:4365 -10053:3:3042 -10054:0:4365 -10055:2:2136 -10056:0:4365 -10057:3:3043 -10058:0:4365 -10059:2:2137 -10060:2:2141 -10061:2:2142 -10062:2:2150 -10063:2:2151 -10064:2:2155 -10065:2:2156 -10066:2:2150 -10067:2:2151 -10068:2:2155 -10069:2:2156 -10070:2:2164 -10071:2:2169 -10072:2:2173 -10073:2:2174 -10074:2:2181 -10075:2:2182 -10076:2:2193 -10077:2:2194 -10078:2:2195 -10079:2:2193 -10080:2:2194 -10081:2:2195 -10082:2:2206 -10083:2:2211 -10084:2:2212 -10085:0:4365 -10086:2:2224 -10087:0:4365 -10088:3:3042 -10089:0:4365 -10090:2:2226 -10091:0:4365 -10092:3:3043 -10093:0:4365 -10094:2:1936 -10095:0:4365 -10096:2:2129 -10097:0:4365 -10098:2:2130 -10099:0:4365 -10100:2:2134 -10101:0:4365 -10102:3:3042 -10103:0:4365 -10104:2:2136 -10105:0:4365 -10106:3:3043 -10107:0:4365 -10108:2:2137 -10109:2:2141 -10110:2:2142 -10111:2:2150 -10112:2:2151 -10113:2:2155 -10114:2:2156 -10115:2:2150 -10116:2:2151 -10117:2:2152 -10118:2:2164 -10119:2:2169 -10120:2:2173 -10121:2:2174 -10122:2:2181 -10123:2:2182 -10124:2:2193 -10125:2:2194 -10126:2:2195 -10127:2:2193 -10128:2:2194 -10129:2:2195 -10130:2:2206 -10131:2:2211 -10132:2:2212 -10133:0:4365 -10134:2:2224 -10135:0:4365 -10136:3:3042 -10137:0:4365 -10138:2:2226 -10139:0:4365 -10140:3:3043 -10141:0:4365 -10142:2:2230 -10143:0:4365 -10144:3:3042 -10145:0:4365 -10146:2:2235 -10147:2:2239 -10148:2:2240 -10149:2:2248 -10150:2:2249 -10151:2:2253 -10152:2:2254 -10153:2:2248 -10154:2:2249 -10155:2:2250 -10156:2:2262 -10157:2:2267 -10158:2:2271 -10159:2:2272 -10160:2:2279 -10161:2:2280 -10162:2:2291 -10163:2:2292 -10164:2:2293 -10165:2:2291 -10166:2:2292 -10167:2:2293 -10168:2:2304 -10169:2:2309 -10170:2:2310 -10171:0:4365 -10172:3:3043 -10173:0:4365 -10174:2:2322 -10175:0:4365 -10176:2:1169 -10177:0:4365 -10178:3:3042 -10179:0:4365 -10180:2:1170 -10181:0:4365 -10182:3:3043 -10183:0:4365 -10184:3:3044 -10185:0:4365 -10186:3:3257 -10187:0:4365 -10188:3:3265 -10189:0:4365 -10190:3:3266 -10191:3:3270 -10192:3:3271 -10193:3:3279 -10194:3:3280 -10195:3:3284 -10196:3:3285 -10197:3:3279 -10198:3:3280 -10199:3:3284 -10200:3:3285 -10201:3:3293 -10202:3:3298 -10203:3:3302 -10204:3:3303 -10205:3:3310 -10206:3:3311 -10207:3:3322 -10208:3:3323 -10209:3:3324 -10210:3:3322 -10211:3:3323 -10212:3:3324 -10213:3:3335 -10214:3:3340 -10215:3:3341 -10216:0:4365 -10217:3:3353 -10218:0:4365 -10219:3:3354 -10220:0:4365 -10221:2:1173 -10222:0:4365 -10223:3:3355 -10224:0:4365 -10225:2:1179 -10226:0:4365 -10227:2:1180 -10228:0:4365 -10229:3:3354 -10230:0:4365 -10231:2:1181 -10232:2:1185 -10233:2:1186 -10234:2:1194 -10235:2:1195 -10236:2:1199 -10237:2:1200 -10238:2:1194 -10239:2:1195 -10240:2:1199 -10241:2:1200 -10242:2:1208 -10243:2:1213 -10244:2:1217 -10245:2:1218 -10246:2:1225 -10247:2:1226 -10248:2:1237 -10249:2:1238 -10250:2:1239 -10251:2:1237 -10252:2:1238 -10253:2:1239 -10254:2:1250 -10255:2:1255 -10256:2:1256 -10257:0:4365 -10258:3:3355 -10259:0:4365 -10260:2:1268 -10261:0:4365 -10262:3:3354 -10263:0:4365 -10264:2:1270 -10265:0:4365 -10266:3:3355 -10267:0:4365 -10268:2:1271 -10269:2:1275 -10270:2:1276 -10271:2:1284 -10272:2:1285 -10273:2:1289 -10274:2:1290 -10275:2:1284 -10276:2:1285 -10277:2:1289 -10278:2:1290 -10279:2:1298 -10280:2:1303 -10281:2:1307 -10282:2:1308 -10283:2:1315 -10284:2:1316 -10285:2:1327 -10286:2:1328 -10287:2:1329 -10288:2:1327 -10289:2:1328 -10290:2:1329 -10291:2:1340 -10292:2:1345 -10293:2:1346 -10294:0:4365 -10295:2:1358 -10296:0:4365 -10297:2:1360 -10298:0:4365 -10299:3:3354 -10300:0:4365 -10301:2:1361 -10302:0:4365 -10303:3:3355 -10304:0:4365 -10305:2:1362 -10306:2:1366 -10307:2:1367 -10308:2:1375 -10309:2:1376 -10310:2:1380 -10311:2:1381 -10312:2:1375 -10313:2:1376 -10314:2:1380 -10315:2:1381 -10316:2:1389 -10317:2:1394 -10318:2:1398 -10319:2:1399 -10320:2:1406 -10321:2:1407 -10322:2:1418 -10323:2:1419 -10324:2:1420 -10325:2:1418 -10326:2:1419 -10327:2:1420 -10328:2:1431 -10329:2:1436 -10330:2:1437 -10331:0:4365 -10332:2:1449 -10333:0:4365 -10334:3:3354 -10335:0:4365 -10336:2:1451 -10337:0:4365 -10338:3:3355 -10339:0:4365 -10340:2:1652 -10341:0:4365 -10342:2:1653 -10343:0:4365 -10344:2:1657 -10345:0:4365 -10346:2:1180 -10347:0:4365 -10348:3:3354 -10349:0:4365 -10350:2:1181 -10351:2:1185 -10352:2:1186 -10353:2:1194 -10354:2:1195 -10355:2:1199 -10356:2:1200 -10357:2:1194 -10358:2:1195 -10359:2:1196 -10360:2:1208 -10361:2:1213 -10362:2:1217 -10363:2:1218 -10364:2:1225 -10365:2:1226 -10366:2:1237 -10367:2:1238 -10368:2:1239 -10369:2:1237 -10370:2:1238 -10371:2:1239 -10372:2:1250 -10373:2:1255 -10374:2:1256 -10375:0:4365 -10376:3:3355 -10377:0:4365 -10378:2:1268 -10379:0:4365 -10380:3:3354 -10381:0:4365 -10382:2:1270 -10383:0:4365 -10384:3:3355 -10385:0:4365 -10386:2:1271 -10387:2:1275 -10388:2:1276 -10389:2:1284 -10390:2:1285 -10391:2:1289 -10392:2:1290 -10393:2:1284 -10394:2:1285 -10395:2:1289 -10396:2:1290 -10397:2:1298 -10398:2:1303 -10399:2:1307 -10400:2:1308 -10401:2:1315 -10402:2:1316 -10403:2:1327 -10404:2:1328 -10405:2:1329 -10406:2:1327 -10407:2:1328 -10408:2:1329 -10409:2:1340 -10410:2:1345 -10411:2:1346 -10412:0:4365 -10413:2:1358 -10414:0:4365 -10415:2:1454 -10416:0:4365 -10417:3:3354 -10418:0:4365 -10419:2:1455 -10420:0:4365 -10421:3:3355 -10422:0:4365 -10423:2:1652 -10424:0:4365 -10425:2:1653 -10426:0:4365 -10427:2:1657 -10428:0:4365 -10429:2:1660 -10430:0:4365 -10431:3:3354 -10432:0:4365 -10433:2:1665 -10434:2:1669 -10435:2:1670 -10436:2:1678 -10437:2:1679 -10438:2:1683 -10439:2:1684 -10440:2:1678 -10441:2:1679 -10442:2:1680 -10443:2:1692 -10444:2:1697 -10445:2:1701 -10446:2:1702 -10447:2:1709 -10448:2:1710 -10449:2:1721 -10450:2:1722 -10451:2:1723 -10452:2:1721 -10453:2:1722 -10454:2:1723 -10455:2:1734 -10456:2:1739 -10457:2:1740 -10458:0:4365 -10459:3:3355 -10460:0:4365 -10461:2:1752 -10462:0:4365 -10463:3:3354 -10464:0:4365 -10465:2:1754 -10466:0:4365 -10467:3:3355 -10468:0:4365 -10469:2:1755 -10470:2:1759 -10471:2:1760 -10472:2:1768 -10473:2:1769 -10474:2:1773 -10475:2:1774 -10476:2:1768 -10477:2:1769 -10478:2:1773 -10479:2:1774 -10480:2:1782 -10481:2:1787 -10482:2:1791 -10483:2:1792 -10484:2:1799 -10485:2:1800 -10486:2:1811 -10487:2:1812 -10488:2:1813 -10489:2:1811 -10490:2:1812 -10491:2:1813 -10492:2:1824 -10493:2:1829 -10494:2:1830 -10495:0:4365 -10496:2:1842 -10497:0:4365 -10498:3:3354 -10499:0:4365 -10500:2:1844 -10501:0:4365 -10502:3:3355 -10503:0:4365 -10504:2:1845 -10505:2:1849 -10506:2:1850 -10507:2:1858 -10508:2:1859 -10509:2:1863 -10510:2:1864 -10511:2:1858 -10512:2:1859 -10513:2:1863 -10514:2:1864 -10515:2:1872 -10516:2:1877 -10517:2:1881 -10518:2:1882 -10519:2:1889 -10520:2:1890 -10521:2:1901 -10522:2:1902 -10523:2:1903 -10524:2:1901 -10525:2:1902 -10526:2:1903 -10527:2:1914 -10528:2:1919 -10529:2:1920 -10530:0:4365 -10531:2:1932 -10532:0:4365 -10533:3:3354 -10534:0:4365 -10535:2:1934 -10536:0:4365 -10537:3:3355 -10538:0:4365 -10539:2:1935 -10540:0:4365 -10541:2:1936 -10542:0:4365 -10543:2:2129 -10544:0:4365 -10545:2:2130 -10546:0:4365 -10547:2:2134 -10548:0:4365 -10549:3:3354 -10550:0:4365 -10551:2:2136 -10552:0:4365 -10553:3:3355 -10554:0:4365 -10555:2:2137 -10556:2:2141 -10557:2:2142 -10558:2:2150 -10559:2:2151 -10560:2:2155 -10561:2:2156 -10562:2:2150 -10563:2:2151 -10564:2:2155 -10565:2:2156 -10566:2:2164 -10567:2:2169 -10568:2:2173 -10569:2:2174 -10570:2:2181 -10571:2:2182 -10572:2:2193 -10573:2:2194 -10574:2:2195 -10575:2:2193 -10576:2:2194 -10577:2:2195 -10578:2:2206 -10579:2:2211 -10580:2:2212 -10581:0:4365 -10582:2:2224 -10583:0:4365 -10584:3:3354 -10585:0:4365 -10586:2:2226 -10587:0:4365 -10588:3:3355 -10589:0:4365 -10590:2:1936 -10591:0:4365 -10592:2:2129 -10593:0:4365 -10594:2:2130 -10595:0:4365 -10596:2:2134 -10597:0:4365 -10598:3:3354 -10599:0:4365 -10600:2:2136 -10601:0:4365 -10602:3:3355 -10603:0:4365 -10604:2:2137 -10605:2:2141 -10606:2:2142 -10607:2:2150 -10608:2:2151 -10609:2:2155 -10610:2:2156 -10611:2:2150 -10612:2:2151 -10613:2:2152 -10614:2:2164 -10615:2:2169 -10616:2:2173 -10617:2:2174 -10618:2:2181 -10619:2:2182 -10620:2:2193 -10621:2:2194 -10622:2:2195 -10623:2:2193 -10624:2:2194 -10625:2:2195 -10626:2:2206 -10627:2:2211 -10628:2:2212 -10629:0:4365 -10630:2:2224 -10631:0:4365 -10632:3:3354 -10633:0:4365 -10634:2:2226 -10635:0:4365 -10636:3:3355 -10637:0:4365 -10638:2:2230 -10639:0:4365 -10640:3:3354 -10641:0:4365 -10642:2:2235 -10643:2:2239 -10644:2:2240 -10645:2:2248 -10646:2:2249 -10647:2:2253 -10648:2:2254 -10649:2:2248 -10650:2:2249 -10651:2:2250 -10652:2:2262 -10653:2:2267 -10654:2:2271 -10655:2:2272 -10656:2:2279 -10657:2:2280 -10658:2:2291 -10659:2:2292 -10660:2:2293 -10661:2:2291 -10662:2:2292 -10663:2:2293 -10664:2:2304 -10665:2:2309 -10666:2:2310 -10667:0:4365 -10668:3:3355 -10669:0:4365 -10670:2:2322 -10671:0:4365 -10672:2:1169 -10673:0:4365 -10674:3:3354 -10675:0:4365 -10676:2:1170 -10677:0:4365 -10678:3:3355 -10679:0:4365 -10680:3:3356 -10681:0:4365 -10682:3:3366 -10683:0:4365 -10684:3:2951 -10685:0:4365 -10686:3:2952 -10687:0:4365 -10688:3:2953 -10689:0:4365 -10690:3:2954 -10691:3:2958 -10692:3:2959 -10693:3:2967 -10694:3:2968 -10695:3:2972 -10696:3:2973 -10697:3:2967 -10698:3:2968 -10699:3:2972 -10700:3:2973 -10701:3:2981 -10702:3:2986 -10703:3:2990 -10704:3:2991 -10705:3:2998 -10706:3:2999 -10707:3:3010 -10708:3:3011 -10709:3:3012 -10710:3:3010 -10711:3:3011 -10712:3:3012 -10713:3:3023 -10714:3:3028 -10715:3:3029 -10716:0:4365 -10717:3:3041 -10718:0:4365 -10719:3:3042 -10720:0:4365 -10721:2:1173 -10722:0:4365 -10723:3:3043 -10724:0:4365 -10725:2:1179 -10726:0:4365 -10727:2:1180 -10728:0:4365 -10729:3:3042 -10730:0:4365 -10731:2:1181 -10732:2:1185 -10733:2:1186 -10734:2:1194 -10735:2:1195 -10736:2:1199 -10737:2:1200 -10738:2:1194 -10739:2:1195 -10740:2:1199 -10741:2:1200 -10742:2:1208 -10743:2:1213 -10744:2:1217 -10745:2:1218 -10746:2:1225 -10747:2:1226 -10748:2:1237 -10749:2:1238 -10750:2:1239 -10751:2:1237 -10752:2:1238 -10753:2:1239 -10754:2:1250 -10755:2:1255 -10756:2:1256 -10757:0:4365 -10758:3:3043 -10759:0:4365 -10760:2:1268 -10761:0:4365 -10762:3:3042 -10763:0:4365 -10764:2:1270 -10765:0:4365 -10766:3:3043 -10767:0:4365 -10768:2:1271 -10769:2:1275 -10770:2:1276 -10771:2:1284 -10772:2:1285 -10773:2:1289 -10774:2:1290 -10775:2:1284 -10776:2:1285 -10777:2:1289 -10778:2:1290 -10779:2:1298 -10780:2:1303 -10781:2:1307 -10782:2:1308 -10783:2:1315 -10784:2:1316 -10785:2:1327 -10786:2:1328 -10787:2:1329 -10788:2:1327 -10789:2:1328 -10790:2:1329 -10791:2:1340 -10792:2:1345 -10793:2:1346 -10794:0:4365 -10795:2:1358 -10796:0:4365 -10797:2:1360 -10798:0:4365 -10799:3:3042 -10800:0:4365 -10801:2:1361 -10802:0:4365 -10803:3:3043 -10804:0:4365 -10805:2:1362 -10806:2:1366 -10807:2:1367 -10808:2:1375 -10809:2:1376 -10810:2:1380 -10811:2:1381 -10812:2:1375 -10813:2:1376 -10814:2:1380 -10815:2:1381 -10816:2:1389 -10817:2:1394 -10818:2:1398 -10819:2:1399 -10820:2:1406 -10821:2:1407 -10822:2:1418 -10823:2:1419 -10824:2:1420 -10825:2:1418 -10826:2:1419 -10827:2:1420 -10828:2:1431 -10829:2:1436 -10830:2:1437 -10831:0:4365 -10832:2:1449 -10833:0:4365 -10834:3:3042 -10835:0:4365 -10836:2:1451 -10837:0:4365 -10838:3:3043 -10839:0:4365 -10840:2:1652 -10841:0:4365 -10842:2:1653 -10843:0:4365 -10844:2:1657 -10845:0:4365 -10846:2:1180 -10847:0:4365 -10848:3:3042 -10849:0:4365 -10850:2:1181 -10851:2:1185 -10852:2:1186 -10853:2:1194 -10854:2:1195 -10855:2:1199 -10856:2:1200 -10857:2:1194 -10858:2:1195 -10859:2:1196 -10860:2:1208 -10861:2:1213 -10862:2:1217 -10863:2:1218 -10864:2:1225 -10865:2:1226 -10866:2:1237 -10867:2:1238 -10868:2:1239 -10869:2:1237 -10870:2:1238 -10871:2:1239 -10872:2:1250 -10873:2:1255 -10874:2:1256 -10875:0:4365 -10876:3:3043 -10877:0:4365 -10878:2:1268 -10879:0:4365 -10880:3:3042 -10881:0:4365 -10882:2:1270 -10883:0:4365 -10884:3:3043 -10885:0:4365 -10886:2:1271 -10887:2:1275 -10888:2:1276 -10889:2:1284 -10890:2:1285 -10891:2:1289 -10892:2:1290 -10893:2:1284 -10894:2:1285 -10895:2:1289 -10896:2:1290 -10897:2:1298 -10898:2:1303 -10899:2:1307 -10900:2:1308 -10901:2:1315 -10902:2:1316 -10903:2:1327 -10904:2:1328 -10905:2:1329 -10906:2:1327 -10907:2:1328 -10908:2:1329 -10909:2:1340 -10910:2:1345 -10911:2:1346 -10912:0:4365 -10913:2:1358 -10914:0:4365 -10915:2:1454 -10916:0:4365 -10917:3:3042 -10918:0:4365 -10919:2:1455 -10920:0:4365 -10921:3:3043 -10922:0:4365 -10923:2:1652 -10924:0:4365 -10925:2:1653 -10926:0:4365 -10927:2:1657 -10928:0:4365 -10929:2:1660 -10930:0:4365 -10931:3:3042 -10932:0:4365 -10933:2:1665 -10934:2:1669 -10935:2:1670 -10936:2:1678 -10937:2:1679 -10938:2:1683 -10939:2:1684 -10940:2:1678 -10941:2:1679 -10942:2:1680 -10943:2:1692 -10944:2:1697 -10945:2:1701 -10946:2:1702 -10947:2:1709 -10948:2:1710 -10949:2:1721 -10950:2:1722 -10951:2:1723 -10952:2:1721 -10953:2:1722 -10954:2:1723 -10955:2:1734 -10956:2:1739 -10957:2:1740 -10958:0:4365 -10959:3:3043 -10960:0:4365 -10961:2:1752 -10962:0:4365 -10963:3:3042 -10964:0:4365 -10965:2:1754 -10966:0:4365 -10967:3:3043 -10968:0:4365 -10969:2:1755 -10970:2:1759 -10971:2:1760 -10972:2:1768 -10973:2:1769 -10974:2:1773 -10975:2:1774 -10976:2:1768 -10977:2:1769 -10978:2:1773 -10979:2:1774 -10980:2:1782 -10981:2:1787 -10982:2:1791 -10983:2:1792 -10984:2:1799 -10985:2:1800 -10986:2:1811 -10987:2:1812 -10988:2:1813 -10989:2:1811 -10990:2:1812 -10991:2:1813 -10992:2:1824 -10993:2:1829 -10994:2:1830 -10995:0:4365 -10996:2:1842 -10997:0:4365 -10998:3:3042 -10999:0:4365 -11000:2:1844 -11001:0:4365 -11002:3:3043 -11003:0:4365 -11004:2:1845 -11005:2:1849 -11006:2:1850 -11007:2:1858 -11008:2:1859 -11009:2:1863 -11010:2:1864 -11011:2:1858 -11012:2:1859 -11013:2:1863 -11014:2:1864 -11015:2:1872 -11016:2:1877 -11017:2:1881 -11018:2:1882 -11019:2:1889 -11020:2:1890 -11021:2:1901 -11022:2:1902 -11023:2:1903 -11024:2:1901 -11025:2:1902 -11026:2:1903 -11027:2:1914 -11028:2:1919 -11029:2:1920 -11030:0:4365 -11031:2:1932 -11032:0:4365 -11033:3:3042 -11034:0:4365 -11035:2:1934 -11036:0:4365 -11037:3:3043 -11038:0:4365 -11039:2:1935 -11040:0:4365 -11041:2:1936 -11042:0:4365 -11043:2:2129 -11044:0:4365 -11045:2:2130 -11046:0:4365 -11047:2:2134 -11048:0:4365 -11049:3:3042 -11050:0:4365 -11051:2:2136 -11052:0:4365 -11053:3:3043 -11054:0:4365 -11055:2:2137 -11056:2:2141 -11057:2:2142 -11058:2:2150 -11059:2:2151 -11060:2:2155 -11061:2:2156 -11062:2:2150 -11063:2:2151 -11064:2:2155 -11065:2:2156 -11066:2:2164 -11067:2:2169 -11068:2:2173 -11069:2:2174 -11070:2:2181 -11071:2:2182 -11072:2:2193 -11073:2:2194 -11074:2:2195 -11075:2:2193 -11076:2:2194 -11077:2:2195 -11078:2:2206 -11079:2:2211 -11080:2:2212 -11081:0:4365 -11082:2:2224 -11083:0:4365 -11084:3:3042 -11085:0:4365 -11086:2:2226 -11087:0:4365 -11088:3:3043 -11089:0:4365 -11090:2:1936 -11091:0:4365 -11092:2:2129 -11093:0:4365 -11094:2:2130 -11095:0:4365 -11096:2:2134 -11097:0:4365 -11098:3:3042 -11099:0:4365 -11100:2:2136 -11101:0:4365 -11102:3:3043 -11103:0:4365 -11104:2:2137 -11105:2:2141 -11106:2:2142 -11107:2:2150 -11108:2:2151 -11109:2:2155 -11110:2:2156 -11111:2:2150 -11112:2:2151 -11113:2:2152 -11114:2:2164 -11115:2:2169 -11116:2:2173 -11117:2:2174 -11118:2:2181 -11119:2:2182 -11120:2:2193 -11121:2:2194 -11122:2:2195 -11123:2:2193 -11124:2:2194 -11125:2:2195 -11126:2:2206 -11127:2:2211 -11128:2:2212 -11129:0:4365 -11130:2:2224 -11131:0:4365 -11132:3:3042 -11133:0:4365 -11134:2:2226 -11135:0:4365 -11136:3:3043 -11137:0:4365 -11138:2:2230 -11139:0:4365 -11140:3:3042 -11141:0:4365 -11142:2:2235 -11143:2:2239 -11144:2:2240 -11145:2:2248 -11146:2:2249 -11147:2:2253 -11148:2:2254 -11149:2:2248 -11150:2:2249 -11151:2:2250 -11152:2:2262 -11153:2:2267 -11154:2:2271 -11155:2:2272 -11156:2:2279 -11157:2:2280 -11158:2:2291 -11159:2:2292 -11160:2:2293 -11161:2:2291 -11162:2:2292 -11163:2:2293 -11164:2:2304 -11165:2:2309 -11166:2:2310 -11167:0:4365 -11168:3:3043 -11169:0:4365 -11170:2:2322 -11171:0:4365 -11172:2:1169 -11173:0:4365 -11174:3:3042 -11175:0:4365 -11176:2:1170 -11177:0:4365 -11178:3:3043 -11179:0:4365 -11180:3:3044 -11181:0:4365 -11182:3:3257 -11183:0:4365 -11184:3:3362 -11185:0:4365 -11186:3:3363 -11187:0:4365 -11188:3:3367 -11189:0:4365 -11190:3:3373 -11191:3:3377 -11192:3:3378 -11193:3:3386 -11194:3:3387 -11195:3:3391 -11196:3:3392 -11197:3:3386 -11198:3:3387 -11199:3:3391 -11200:3:3392 -11201:3:3400 -11202:3:3405 -11203:3:3409 -11204:3:3410 -11205:3:3417 -11206:3:3418 -11207:3:3429 -11208:3:3430 -11209:3:3431 -11210:3:3429 -11211:3:3430 -11212:3:3431 -11213:3:3442 -11214:3:3447 -11215:3:3448 -11216:0:4365 -11217:3:3460 -11218:0:4365 -11219:3:3461 -11220:0:4365 -11221:2:1173 -11222:0:4365 -11223:3:3462 -11224:0:4365 -11225:2:1179 -11226:0:4365 -11227:2:1180 -11228:0:4365 -11229:3:3461 -11230:0:4365 -11231:2:1181 -11232:2:1185 -11233:2:1186 -11234:2:1194 -11235:2:1195 -11236:2:1199 -11237:2:1200 -11238:2:1194 -11239:2:1195 -11240:2:1199 -11241:2:1200 -11242:2:1208 -11243:2:1213 -11244:2:1217 -11245:2:1218 -11246:2:1225 -11247:2:1226 -11248:2:1237 -11249:2:1238 -11250:2:1239 -11251:2:1237 -11252:2:1238 -11253:2:1239 -11254:2:1250 -11255:2:1255 -11256:2:1256 -11257:0:4365 -11258:3:3462 -11259:0:4365 -11260:2:1268 -11261:0:4365 -11262:3:3461 -11263:0:4365 -11264:2:1270 -11265:0:4365 -11266:3:3462 -11267:0:4365 -11268:2:1271 -11269:2:1275 -11270:2:1276 -11271:2:1284 -11272:2:1285 -11273:2:1289 -11274:2:1290 -11275:2:1284 -11276:2:1285 -11277:2:1289 -11278:2:1290 -11279:2:1298 -11280:2:1303 -11281:2:1307 -11282:2:1308 -11283:2:1315 -11284:2:1316 -11285:2:1327 -11286:2:1328 -11287:2:1329 -11288:2:1327 -11289:2:1328 -11290:2:1329 -11291:2:1340 -11292:2:1345 -11293:2:1346 -11294:0:4365 -11295:2:1358 -11296:0:4365 -11297:2:1360 -11298:0:4365 -11299:3:3461 -11300:0:4365 -11301:2:1361 -11302:0:4365 -11303:3:3462 -11304:0:4365 -11305:2:1362 -11306:2:1366 -11307:2:1367 -11308:2:1375 -11309:2:1376 -11310:2:1380 -11311:2:1381 -11312:2:1375 -11313:2:1376 -11314:2:1380 -11315:2:1381 -11316:2:1389 -11317:2:1394 -11318:2:1398 -11319:2:1399 -11320:2:1406 -11321:2:1407 -11322:2:1418 -11323:2:1419 -11324:2:1420 -11325:2:1418 -11326:2:1419 -11327:2:1420 -11328:2:1431 -11329:2:1436 -11330:2:1437 -11331:0:4365 -11332:2:1449 -11333:0:4365 -11334:3:3461 -11335:0:4365 -11336:2:1451 -11337:0:4365 -11338:3:3462 -11339:0:4365 -11340:2:1652 -11341:0:4365 -11342:2:1653 -11343:0:4365 -11344:2:1657 -11345:0:4365 -11346:2:1180 -11347:0:4365 -11348:3:3461 -11349:0:4365 -11350:2:1181 -11351:2:1185 -11352:2:1186 -11353:2:1194 -11354:2:1195 -11355:2:1199 -11356:2:1200 -11357:2:1194 -11358:2:1195 -11359:2:1196 -11360:2:1208 -11361:2:1213 -11362:2:1217 -11363:2:1218 -11364:2:1225 -11365:2:1226 -11366:2:1237 -11367:2:1238 -11368:2:1239 -11369:2:1237 -11370:2:1238 -11371:2:1239 -11372:2:1250 -11373:2:1255 -11374:2:1256 -11375:0:4365 -11376:3:3462 -11377:0:4365 -11378:2:1268 -11379:0:4365 -11380:3:3461 -11381:0:4365 -11382:2:1270 -11383:0:4365 -11384:3:3462 -11385:0:4365 -11386:2:1271 -11387:2:1275 -11388:2:1276 -11389:2:1284 -11390:2:1285 -11391:2:1289 -11392:2:1290 -11393:2:1284 -11394:2:1285 -11395:2:1289 -11396:2:1290 -11397:2:1298 -11398:2:1303 -11399:2:1307 -11400:2:1308 -11401:2:1315 -11402:2:1316 -11403:2:1327 -11404:2:1328 -11405:2:1329 -11406:2:1327 -11407:2:1328 -11408:2:1329 -11409:2:1340 -11410:2:1345 -11411:2:1346 -11412:0:4365 -11413:2:1358 -11414:0:4365 -11415:2:1454 -11416:0:4365 -11417:3:3461 -11418:0:4365 -11419:2:1455 -11420:0:4365 -11421:3:3462 -11422:0:4365 -11423:2:1652 -11424:0:4365 -11425:2:1653 -11426:0:4365 -11427:2:1657 -11428:0:4365 -11429:2:1660 -11430:0:4365 -11431:3:3461 -11432:0:4365 -11433:2:1665 -11434:2:1669 -11435:2:1670 -11436:2:1678 -11437:2:1679 -11438:2:1683 -11439:2:1684 -11440:2:1678 -11441:2:1679 -11442:2:1680 -11443:2:1692 -11444:2:1697 -11445:2:1701 -11446:2:1702 -11447:2:1709 -11448:2:1710 -11449:2:1721 -11450:2:1722 -11451:2:1723 -11452:2:1721 -11453:2:1722 -11454:2:1723 -11455:2:1734 -11456:2:1739 -11457:2:1740 -11458:0:4365 -11459:3:3462 -11460:0:4365 -11461:2:1752 -11462:0:4365 -11463:3:3461 -11464:0:4365 -11465:2:1754 -11466:0:4365 -11467:3:3462 -11468:0:4365 -11469:2:1755 -11470:2:1759 -11471:2:1760 -11472:2:1768 -11473:2:1769 -11474:2:1773 -11475:2:1774 -11476:2:1768 -11477:2:1769 -11478:2:1773 -11479:2:1774 -11480:2:1782 -11481:2:1787 -11482:2:1791 -11483:2:1792 -11484:2:1799 -11485:2:1800 -11486:2:1811 -11487:2:1812 -11488:2:1813 -11489:2:1811 -11490:2:1812 -11491:2:1813 -11492:2:1824 -11493:2:1829 -11494:2:1830 -11495:0:4365 -11496:2:1842 -11497:0:4365 -11498:3:3461 -11499:0:4365 -11500:2:1844 -11501:0:4365 -11502:3:3462 -11503:0:4365 -11504:2:1845 -11505:2:1849 -11506:2:1850 -11507:2:1858 -11508:2:1859 -11509:2:1863 -11510:2:1864 -11511:2:1858 -11512:2:1859 -11513:2:1863 -11514:2:1864 -11515:2:1872 -11516:2:1877 -11517:2:1881 -11518:2:1882 -11519:2:1889 -11520:2:1890 -11521:2:1901 -11522:2:1902 -11523:2:1903 -11524:2:1901 -11525:2:1902 -11526:2:1903 -11527:2:1914 -11528:2:1919 -11529:2:1920 -11530:0:4365 -11531:2:1932 -11532:0:4365 -11533:3:3461 -11534:0:4365 -11535:2:1934 -11536:0:4365 -11537:3:3462 -11538:0:4365 -11539:2:1935 -11540:0:4365 -11541:2:1936 -11542:0:4365 -11543:2:2129 -11544:0:4365 -11545:2:2130 -11546:0:4365 -11547:2:2134 -11548:0:4365 -11549:3:3461 -11550:0:4365 -11551:2:2136 -11552:0:4365 -11553:3:3462 -11554:0:4365 -11555:2:2137 -11556:2:2141 -11557:2:2142 -11558:2:2150 -11559:2:2151 -11560:2:2155 -11561:2:2156 -11562:2:2150 -11563:2:2151 -11564:2:2155 -11565:2:2156 -11566:2:2164 -11567:2:2169 -11568:2:2173 -11569:2:2174 -11570:2:2181 -11571:2:2182 -11572:2:2193 -11573:2:2194 -11574:2:2195 -11575:2:2193 -11576:2:2194 -11577:2:2195 -11578:2:2206 -11579:2:2211 -11580:2:2212 -11581:0:4365 -11582:2:2224 -11583:0:4365 -11584:3:3461 -11585:0:4365 -11586:2:2226 -11587:0:4365 -11588:3:3462 -11589:0:4365 -11590:2:1936 -11591:0:4365 -11592:2:2129 -11593:0:4365 -11594:2:2130 -11595:0:4365 -11596:2:2134 -11597:0:4365 -11598:3:3461 -11599:0:4365 -11600:2:2136 -11601:0:4365 -11602:3:3462 -11603:0:4365 -11604:2:2137 -11605:2:2141 -11606:2:2142 -11607:2:2150 -11608:2:2151 -11609:2:2155 -11610:2:2156 -11611:2:2150 -11612:2:2151 -11613:2:2152 -11614:2:2164 -11615:2:2169 -11616:2:2173 -11617:2:2174 -11618:2:2181 -11619:2:2182 -11620:2:2193 -11621:2:2194 -11622:2:2195 -11623:2:2193 -11624:2:2194 -11625:2:2195 -11626:2:2206 -11627:2:2211 -11628:2:2212 -11629:0:4365 -11630:2:2224 -11631:0:4365 -11632:3:3461 -11633:0:4365 -11634:2:2226 -11635:0:4365 -11636:3:3462 -11637:0:4365 -11638:2:2230 -11639:0:4365 -11640:3:3461 -11641:0:4365 -11642:2:2235 -11643:2:2239 -11644:2:2240 -11645:2:2248 -11646:2:2249 -11647:2:2253 -11648:2:2254 -11649:2:2248 -11650:2:2249 -11651:2:2250 -11652:2:2262 -11653:2:2267 -11654:2:2271 -11655:2:2272 -11656:2:2279 -11657:2:2280 -11658:2:2291 -11659:2:2292 -11660:2:2293 -11661:2:2291 -11662:2:2292 -11663:2:2293 -11664:2:2304 -11665:2:2309 -11666:2:2310 -11667:0:4365 -11668:3:3462 -11669:0:4365 -11670:2:2322 -11671:0:4365 -11672:2:1169 -11673:0:4365 -11674:3:3461 -11675:0:4365 -11676:2:1170 -11677:0:4365 -11678:3:3462 -11679:0:4365 -11680:3:3463 -11681:0:4365 -11682:3:3469 -11683:0:4365 -11684:3:3470 -11685:3:3474 -11686:3:3475 -11687:3:3483 -11688:3:3484 -11689:3:3488 -11690:3:3489 -11691:3:3483 -11692:3:3484 -11693:3:3488 -11694:3:3489 -11695:3:3497 -11696:3:3502 -11697:3:3506 -11698:3:3507 -11699:3:3514 -11700:3:3515 -11701:3:3526 -11702:3:3527 -11703:3:3528 -11704:3:3526 -11705:3:3527 -11706:3:3528 -11707:3:3539 -11708:3:3544 -11709:3:3545 -11710:0:4365 -11711:3:3557 -11712:0:4365 -11713:3:3558 -11714:0:4365 -11715:2:1173 -11716:0:4365 -11717:3:3559 -11718:0:4365 -11719:2:1179 -11720:0:4365 -11721:2:1180 -11722:0:4365 -11723:3:3558 -11724:0:4365 -11725:2:1181 -11726:2:1185 -11727:2:1186 -11728:2:1194 -11729:2:1195 -11730:2:1199 -11731:2:1200 -11732:2:1194 -11733:2:1195 -11734:2:1199 -11735:2:1200 -11736:2:1208 -11737:2:1213 -11738:2:1217 -11739:2:1218 -11740:2:1225 -11741:2:1226 -11742:2:1237 -11743:2:1238 -11744:2:1239 -11745:2:1237 -11746:2:1238 -11747:2:1239 -11748:2:1250 -11749:2:1255 -11750:2:1256 -11751:0:4365 -11752:3:3559 -11753:0:4365 -11754:2:1268 -11755:0:4365 -11756:3:3558 -11757:0:4365 -11758:2:1270 -11759:0:4365 -11760:3:3559 -11761:0:4365 -11762:2:1271 -11763:2:1275 -11764:2:1276 -11765:2:1284 -11766:2:1285 -11767:2:1289 -11768:2:1290 -11769:2:1284 -11770:2:1285 -11771:2:1289 -11772:2:1290 -11773:2:1298 -11774:2:1303 -11775:2:1307 -11776:2:1308 -11777:2:1315 -11778:2:1316 -11779:2:1327 -11780:2:1328 -11781:2:1329 -11782:2:1327 -11783:2:1328 -11784:2:1329 -11785:2:1340 -11786:2:1345 -11787:2:1346 -11788:0:4365 -11789:2:1358 -11790:0:4365 -11791:2:1360 -11792:0:4365 -11793:3:3558 -11794:0:4365 -11795:2:1361 -11796:0:4365 -11797:3:3559 -11798:0:4365 -11799:2:1362 -11800:2:1366 -11801:2:1367 -11802:2:1375 -11803:2:1376 -11804:2:1380 -11805:2:1381 -11806:2:1375 -11807:2:1376 -11808:2:1380 -11809:2:1381 -11810:2:1389 -11811:2:1394 -11812:2:1398 -11813:2:1399 -11814:2:1406 -11815:2:1407 -11816:2:1418 -11817:2:1419 -11818:2:1420 -11819:2:1418 -11820:2:1419 -11821:2:1420 -11822:2:1431 -11823:2:1436 -11824:2:1437 -11825:0:4365 -11826:2:1449 -11827:0:4365 -11828:3:3558 -11829:0:4365 -11830:2:1451 -11831:0:4365 -11832:3:3559 -11833:0:4365 -11834:2:1652 -11835:0:4365 -11836:2:1653 -11837:0:4365 -11838:2:1657 -11839:0:4365 -11840:2:1180 -11841:0:4365 -11842:3:3558 -11843:0:4365 -11844:2:1181 -11845:2:1185 -11846:2:1186 -11847:2:1194 -11848:2:1195 -11849:2:1199 -11850:2:1200 -11851:2:1194 -11852:2:1195 -11853:2:1196 -11854:2:1208 -11855:2:1213 -11856:2:1217 -11857:2:1218 -11858:2:1225 -11859:2:1226 -11860:2:1237 -11861:2:1238 -11862:2:1239 -11863:2:1237 -11864:2:1238 -11865:2:1239 -11866:2:1250 -11867:2:1255 -11868:2:1256 -11869:0:4365 -11870:3:3559 -11871:0:4365 -11872:2:1268 -11873:0:4365 -11874:3:3558 -11875:0:4365 -11876:2:1270 -11877:0:4365 -11878:3:3559 -11879:0:4365 -11880:2:1271 -11881:2:1275 -11882:2:1276 -11883:2:1284 -11884:2:1285 -11885:2:1289 -11886:2:1290 -11887:2:1284 -11888:2:1285 -11889:2:1289 -11890:2:1290 -11891:2:1298 -11892:2:1303 -11893:2:1307 -11894:2:1308 -11895:2:1315 -11896:2:1316 -11897:2:1327 -11898:2:1328 -11899:2:1329 -11900:2:1327 -11901:2:1328 -11902:2:1329 -11903:2:1340 -11904:2:1345 -11905:2:1346 -11906:0:4365 -11907:2:1358 -11908:0:4365 -11909:2:1454 -11910:0:4365 -11911:3:3558 -11912:0:4365 -11913:2:1455 -11914:0:4365 -11915:3:3559 -11916:0:4365 -11917:2:1652 -11918:0:4365 -11919:2:1653 -11920:0:4365 -11921:2:1657 -11922:0:4365 -11923:2:1660 -11924:0:4365 -11925:3:3558 -11926:0:4365 -11927:2:1665 -11928:2:1669 -11929:2:1670 -11930:2:1678 -11931:2:1679 -11932:2:1683 -11933:2:1684 -11934:2:1678 -11935:2:1679 -11936:2:1680 -11937:2:1692 -11938:2:1697 -11939:2:1701 -11940:2:1702 -11941:2:1709 -11942:2:1710 -11943:2:1721 -11944:2:1722 -11945:2:1723 -11946:2:1721 -11947:2:1722 -11948:2:1723 -11949:2:1734 -11950:2:1739 -11951:2:1740 -11952:0:4365 -11953:3:3559 -11954:0:4365 -11955:2:1752 -11956:0:4365 -11957:3:3558 -11958:0:4365 -11959:2:1754 -11960:0:4365 -11961:3:3559 -11962:0:4365 -11963:2:1755 -11964:2:1759 -11965:2:1760 -11966:2:1768 -11967:2:1769 -11968:2:1773 -11969:2:1774 -11970:2:1768 -11971:2:1769 -11972:2:1773 -11973:2:1774 -11974:2:1782 -11975:2:1787 -11976:2:1791 -11977:2:1792 -11978:2:1799 -11979:2:1800 -11980:2:1811 -11981:2:1812 -11982:2:1813 -11983:2:1811 -11984:2:1812 -11985:2:1813 -11986:2:1824 -11987:2:1829 -11988:2:1830 -11989:0:4365 -11990:2:1842 -11991:0:4365 -11992:3:3558 -11993:0:4365 -11994:2:1844 -11995:0:4365 -11996:3:3559 -11997:0:4365 -11998:2:1845 -11999:2:1849 -12000:2:1850 -12001:2:1858 -12002:2:1859 -12003:2:1863 -12004:2:1864 -12005:2:1858 -12006:2:1859 -12007:2:1863 -12008:2:1864 -12009:2:1872 -12010:2:1877 -12011:2:1881 -12012:2:1882 -12013:2:1889 -12014:2:1890 -12015:2:1901 -12016:2:1902 -12017:2:1903 -12018:2:1901 -12019:2:1902 -12020:2:1903 -12021:2:1914 -12022:2:1919 -12023:2:1920 -12024:0:4365 -12025:2:1932 -12026:0:4365 -12027:3:3558 -12028:0:4365 -12029:2:1934 -12030:0:4365 -12031:3:3559 -12032:0:4365 -12033:2:1935 -12034:0:4365 -12035:2:1936 -12036:0:4365 -12037:2:2129 -12038:0:4365 -12039:2:2130 -12040:0:4365 -12041:2:2134 -12042:0:4365 -12043:3:3558 -12044:0:4365 -12045:2:2136 -12046:0:4365 -12047:3:3559 -12048:0:4365 -12049:2:2137 -12050:2:2141 -12051:2:2142 -12052:2:2150 -12053:2:2151 -12054:2:2155 -12055:2:2156 -12056:2:2150 -12057:2:2151 -12058:2:2155 -12059:2:2156 -12060:2:2164 -12061:2:2169 -12062:2:2173 -12063:2:2174 -12064:2:2181 -12065:2:2182 -12066:2:2193 -12067:2:2194 -12068:2:2195 -12069:2:2193 -12070:2:2194 -12071:2:2195 -12072:2:2206 -12073:2:2211 -12074:2:2212 -12075:0:4365 -12076:2:2224 -12077:0:4365 -12078:3:3558 -12079:0:4365 -12080:2:2226 -12081:0:4365 -12082:3:3559 -12083:0:4365 -12084:2:1936 -12085:0:4365 -12086:2:2129 -12087:0:4365 -12088:2:2130 -12089:0:4365 -12090:2:2134 -12091:0:4365 -12092:3:3558 -12093:0:4365 -12094:2:2136 -12095:0:4365 -12096:3:3559 -12097:0:4365 -12098:2:2137 -12099:2:2141 -12100:2:2142 -12101:2:2150 -12102:2:2151 -12103:2:2155 -12104:2:2156 -12105:2:2150 -12106:2:2151 -12107:2:2152 -12108:2:2164 -12109:2:2169 -12110:2:2173 -12111:2:2174 -12112:2:2181 -12113:2:2182 -12114:2:2193 -12115:2:2194 -12116:2:2195 -12117:2:2193 -12118:2:2194 -12119:2:2195 -12120:2:2206 -12121:2:2211 -12122:2:2212 -12123:0:4365 -12124:2:2224 -12125:0:4365 -12126:3:3558 -12127:0:4365 -12128:2:2226 -12129:0:4365 -12130:3:3559 -12131:0:4365 -12132:2:2230 -12133:0:4365 -12134:3:3558 -12135:0:4365 -12136:2:2235 -12137:2:2239 -12138:2:2240 -12139:2:2248 -12140:2:2249 -12141:2:2253 -12142:2:2254 -12143:2:2248 -12144:2:2249 -12145:2:2250 -12146:2:2262 -12147:2:2267 -12148:2:2271 -12149:2:2272 -12150:2:2279 -12151:2:2280 -12152:2:2291 -12153:2:2292 -12154:2:2293 -12155:2:2291 -12156:2:2292 -12157:2:2293 -12158:2:2304 -12159:2:2309 -12160:2:2310 -12161:0:4365 -12162:3:3559 -12163:0:4365 -12164:2:2322 -12165:0:4365 -12166:2:1169 -12167:0:4365 -12168:3:3558 -12169:0:4365 -12170:2:1170 -12171:0:4365 -12172:3:3559 -12173:0:4365 -12174:3:3560 -12175:0:4365 -12176:3:3566 -12177:0:4365 -12178:3:3569 -12179:3:3570 -12180:3:3582 -12181:3:3583 -12182:3:3587 -12183:3:3588 -12184:3:3582 -12185:3:3583 -12186:3:3587 -12187:3:3588 -12188:3:3596 -12189:3:3601 -12190:3:3605 -12191:3:3606 -12192:3:3613 -12193:3:3614 -12194:3:3625 -12195:3:3626 -12196:3:3627 -12197:3:3625 -12198:3:3626 -12199:3:3627 -12200:3:3638 -12201:3:3643 -12202:3:3644 -12203:0:4365 -12204:3:3656 -12205:0:4365 -12206:3:3657 -12207:0:4365 -12208:2:1173 -12209:0:4365 -12210:3:3658 -12211:0:4365 -12212:2:1179 -12213:0:4365 -12214:2:1180 -12215:0:4365 -12216:3:3657 -12217:0:4365 -12218:2:1181 -12219:2:1185 -12220:2:1186 -12221:2:1194 -12222:2:1195 -12223:2:1199 -12224:2:1200 -12225:2:1194 -12226:2:1195 -12227:2:1199 -12228:2:1200 -12229:2:1208 -12230:2:1213 -12231:2:1217 -12232:2:1218 -12233:2:1225 -12234:2:1226 -12235:2:1237 -12236:2:1238 -12237:2:1239 -12238:2:1237 -12239:2:1238 -12240:2:1239 -12241:2:1250 -12242:2:1255 -12243:2:1256 -12244:0:4365 -12245:3:3658 -12246:0:4365 -12247:2:1268 -12248:0:4365 -12249:3:3657 -12250:0:4365 -12251:2:1270 -12252:0:4365 -12253:3:3658 -12254:0:4365 -12255:2:1271 -12256:2:1275 -12257:2:1276 -12258:2:1284 -12259:2:1285 -12260:2:1289 -12261:2:1290 -12262:2:1284 -12263:2:1285 -12264:2:1289 -12265:2:1290 -12266:2:1298 -12267:2:1303 -12268:2:1307 -12269:2:1308 -12270:2:1315 -12271:2:1316 -12272:2:1327 -12273:2:1328 -12274:2:1329 -12275:2:1327 -12276:2:1328 -12277:2:1329 -12278:2:1340 -12279:2:1345 -12280:2:1346 -12281:0:4365 -12282:2:1358 -12283:0:4365 -12284:2:1360 -12285:0:4365 -12286:3:3657 -12287:0:4365 -12288:2:1361 -12289:0:4365 -12290:3:3658 -12291:0:4365 -12292:2:1362 -12293:2:1366 -12294:2:1367 -12295:2:1375 -12296:2:1376 -12297:2:1380 -12298:2:1381 -12299:2:1375 -12300:2:1376 -12301:2:1380 -12302:2:1381 -12303:2:1389 -12304:2:1394 -12305:2:1398 -12306:2:1399 -12307:2:1406 -12308:2:1407 -12309:2:1418 -12310:2:1419 -12311:2:1420 -12312:2:1418 -12313:2:1419 -12314:2:1420 -12315:2:1431 -12316:2:1436 -12317:2:1437 -12318:0:4365 -12319:2:1449 -12320:0:4365 -12321:3:3657 -12322:0:4365 -12323:2:1451 -12324:0:4365 -12325:3:3658 -12326:0:4365 -12327:2:1652 -12328:0:4365 -12329:2:1653 -12330:0:4365 -12331:2:1657 -12332:0:4365 -12333:2:1180 -12334:0:4365 -12335:3:3657 -12336:0:4365 -12337:2:1181 -12338:2:1185 -12339:2:1186 -12340:2:1194 -12341:2:1195 -12342:2:1199 -12343:2:1200 -12344:2:1194 -12345:2:1195 -12346:2:1196 -12347:2:1208 -12348:2:1213 -12349:2:1217 -12350:2:1218 -12351:2:1225 -12352:2:1226 -12353:2:1237 -12354:2:1238 -12355:2:1239 -12356:2:1237 -12357:2:1238 -12358:2:1239 -12359:2:1250 -12360:2:1255 -12361:2:1256 -12362:0:4365 -12363:3:3658 -12364:0:4365 -12365:2:1268 -12366:0:4365 -12367:3:3657 -12368:0:4365 -12369:2:1270 -12370:0:4365 -12371:3:3658 -12372:0:4365 -12373:2:1271 -12374:2:1275 -12375:2:1276 -12376:2:1284 -12377:2:1285 -12378:2:1289 -12379:2:1290 -12380:2:1284 -12381:2:1285 -12382:2:1289 -12383:2:1290 -12384:2:1298 -12385:2:1303 -12386:2:1307 -12387:2:1308 -12388:2:1315 -12389:2:1316 -12390:2:1327 -12391:2:1328 -12392:2:1329 -12393:2:1327 -12394:2:1328 -12395:2:1329 -12396:2:1340 -12397:2:1345 -12398:2:1346 -12399:0:4365 -12400:2:1358 -12401:0:4365 -12402:2:1454 -12403:0:4365 -12404:3:3657 -12405:0:4365 -12406:2:1455 -12407:0:4365 -12408:3:3658 -12409:0:4365 -12410:2:1652 -12411:0:4365 -12412:2:1653 -12413:0:4365 -12414:2:1657 -12415:0:4365 -12416:2:1660 -12417:0:4365 -12418:3:3657 -12419:0:4365 -12420:2:1665 -12421:2:1669 -12422:2:1670 -12423:2:1678 -12424:2:1679 -12425:2:1683 -12426:2:1684 -12427:2:1678 -12428:2:1679 -12429:2:1680 -12430:2:1692 -12431:2:1697 -12432:2:1701 -12433:2:1702 -12434:2:1709 -12435:2:1710 -12436:2:1721 -12437:2:1722 -12438:2:1723 -12439:2:1721 -12440:2:1722 -12441:2:1723 -12442:2:1734 -12443:2:1739 -12444:2:1740 -12445:0:4365 -12446:3:3658 -12447:0:4365 -12448:2:1752 -12449:0:4365 -12450:3:3657 -12451:0:4365 -12452:2:1754 -12453:0:4365 -12454:3:3658 -12455:0:4365 -12456:2:1755 -12457:2:1759 -12458:2:1760 -12459:2:1768 -12460:2:1769 -12461:2:1773 -12462:2:1774 -12463:2:1768 -12464:2:1769 -12465:2:1773 -12466:2:1774 -12467:2:1782 -12468:2:1787 -12469:2:1791 -12470:2:1792 -12471:2:1799 -12472:2:1800 -12473:2:1811 -12474:2:1812 -12475:2:1813 -12476:2:1811 -12477:2:1812 -12478:2:1813 -12479:2:1824 -12480:2:1829 -12481:2:1830 -12482:0:4365 -12483:2:1842 -12484:0:4365 -12485:3:3657 -12486:0:4365 -12487:2:1844 -12488:0:4365 -12489:3:3658 -12490:0:4365 -12491:2:1845 -12492:2:1849 -12493:2:1850 -12494:2:1858 -12495:2:1859 -12496:2:1863 -12497:2:1864 -12498:2:1858 -12499:2:1859 -12500:2:1863 -12501:2:1864 -12502:2:1872 -12503:2:1877 -12504:2:1881 -12505:2:1882 -12506:2:1889 -12507:2:1890 -12508:2:1901 -12509:2:1902 -12510:2:1903 -12511:2:1901 -12512:2:1902 -12513:2:1903 -12514:2:1914 -12515:2:1919 -12516:2:1920 -12517:0:4365 -12518:2:1932 -12519:0:4365 -12520:3:3657 -12521:0:4365 -12522:2:1934 -12523:0:4365 -12524:3:3658 -12525:0:4365 -12526:2:1935 -12527:0:4365 -12528:2:1936 -12529:0:4365 -12530:2:2129 -12531:0:4365 -12532:2:2130 -12533:0:4365 -12534:2:2134 -12535:0:4365 -12536:3:3657 -12537:0:4365 -12538:2:2136 -12539:0:4365 -12540:3:3658 -12541:0:4365 -12542:2:2137 -12543:2:2141 -12544:2:2142 -12545:2:2150 -12546:2:2151 -12547:2:2155 -12548:2:2156 -12549:2:2150 -12550:2:2151 -12551:2:2155 -12552:2:2156 -12553:2:2164 -12554:2:2169 -12555:2:2173 -12556:2:2174 -12557:2:2181 -12558:2:2182 -12559:2:2193 -12560:2:2194 -12561:2:2195 -12562:2:2193 -12563:2:2194 -12564:2:2195 -12565:2:2206 -12566:2:2211 -12567:2:2212 -12568:0:4365 -12569:2:2224 -12570:0:4365 -12571:3:3657 -12572:0:4365 -12573:2:2226 -12574:0:4365 -12575:3:3658 -12576:0:4365 -12577:2:1936 -12578:0:4365 -12579:2:2129 -12580:0:4365 -12581:2:2130 -12582:0:4365 -12583:2:2134 -12584:0:4365 -12585:3:3657 -12586:0:4365 -12587:2:2136 -12588:0:4365 -12589:3:3658 -12590:0:4365 -12591:2:2137 -12592:2:2141 -12593:2:2142 -12594:2:2150 -12595:2:2151 -12596:2:2155 -12597:2:2156 -12598:2:2150 -12599:2:2151 -12600:2:2152 -12601:2:2164 -12602:2:2169 -12603:2:2173 -12604:2:2174 -12605:2:2181 -12606:2:2182 -12607:2:2193 -12608:2:2194 -12609:2:2195 -12610:2:2193 -12611:2:2194 -12612:2:2195 -12613:2:2206 -12614:2:2211 -12615:2:2212 -12616:0:4365 -12617:2:2224 -12618:0:4365 -12619:3:3657 -12620:0:4365 -12621:2:2226 -12622:0:4365 -12623:3:3658 -12624:0:4365 -12625:2:2230 -12626:0:4365 -12627:3:3657 -12628:0:4365 -12629:2:2235 -12630:2:2239 -12631:2:2240 -12632:2:2248 -12633:2:2249 -12634:2:2253 -12635:2:2254 -12636:2:2248 -12637:2:2249 -12638:2:2250 -12639:2:2262 -12640:2:2267 -12641:2:2271 -12642:2:2272 -12643:2:2279 -12644:2:2280 -12645:2:2291 -12646:2:2292 -12647:2:2293 -12648:2:2291 -12649:2:2292 -12650:2:2293 -12651:2:2304 -12652:2:2309 -12653:2:2310 -12654:0:4365 -12655:3:3658 -12656:0:4365 -12657:2:2322 -12658:0:4365 -12659:2:1169 -12660:0:4365 -12661:3:3657 -12662:0:4365 -12663:2:1170 -12664:0:4365 -12665:3:3658 -12666:0:4365 -12667:3:3659 -12668:0:4365 -12669:3:3665 -12670:0:4365 -12671:3:3666 -12672:0:4365 -12673:3:3667 -12674:0:4365 -12675:3:3668 -12676:0:4365 -12677:3:3669 -12678:3:3673 -12679:3:3674 -12680:3:3682 -12681:3:3683 -12682:3:3687 -12683:3:3688 -12684:3:3682 -12685:3:3683 -12686:3:3687 -12687:3:3688 -12688:3:3696 -12689:3:3701 -12690:3:3705 -12691:3:3706 -12692:3:3713 -12693:3:3714 -12694:3:3725 -12695:3:3726 -12696:3:3727 -12697:3:3725 -12698:3:3726 -12699:3:3727 -12700:3:3738 -12701:3:3743 -12702:3:3744 -12703:0:4365 -12704:3:3756 -12705:0:4365 -12706:3:3757 -12707:0:4365 -12708:2:1173 -12709:0:4365 -12710:3:3758 -12711:0:4365 -12712:2:1179 -12713:0:4365 -12714:2:1180 -12715:0:4365 -12716:3:3757 -12717:0:4365 -12718:2:1181 -12719:2:1185 -12720:2:1186 -12721:2:1194 -12722:2:1195 -12723:2:1199 -12724:2:1200 -12725:2:1194 -12726:2:1195 -12727:2:1199 -12728:2:1200 -12729:2:1208 -12730:2:1213 -12731:2:1217 -12732:2:1218 -12733:2:1225 -12734:2:1226 -12735:2:1237 -12736:2:1238 -12737:2:1239 -12738:2:1237 -12739:2:1238 -12740:2:1239 -12741:2:1250 -12742:2:1255 -12743:2:1256 -12744:0:4365 -12745:3:3758 -12746:0:4365 -12747:2:1268 -12748:0:4365 -12749:3:3757 -12750:0:4365 -12751:2:1270 -12752:0:4365 -12753:3:3758 -12754:0:4365 -12755:2:1271 -12756:2:1275 -12757:2:1276 -12758:2:1284 -12759:2:1285 -12760:2:1289 -12761:2:1290 -12762:2:1284 -12763:2:1285 -12764:2:1289 -12765:2:1290 -12766:2:1298 -12767:2:1303 -12768:2:1307 -12769:2:1308 -12770:2:1315 -12771:2:1316 -12772:2:1327 -12773:2:1328 -12774:2:1329 -12775:2:1327 -12776:2:1328 -12777:2:1329 -12778:2:1340 -12779:2:1345 -12780:2:1346 -12781:0:4365 -12782:2:1358 -12783:0:4365 -12784:2:1360 -12785:0:4365 -12786:3:3757 -12787:0:4365 -12788:2:1361 -12789:0:4365 -12790:3:3758 -12791:0:4365 -12792:2:1362 -12793:2:1366 -12794:2:1367 -12795:2:1375 -12796:2:1376 -12797:2:1380 -12798:2:1381 -12799:2:1375 -12800:2:1376 -12801:2:1380 -12802:2:1381 -12803:2:1389 -12804:2:1394 -12805:2:1398 -12806:2:1399 -12807:2:1406 -12808:2:1407 -12809:2:1418 -12810:2:1419 -12811:2:1420 -12812:2:1418 -12813:2:1419 -12814:2:1420 -12815:2:1431 -12816:2:1436 -12817:2:1437 -12818:0:4365 -12819:2:1449 -12820:0:4365 -12821:3:3757 -12822:0:4365 -12823:2:1451 -12824:0:4365 -12825:3:3758 -12826:0:4365 -12827:2:1652 -12828:0:4365 -12829:2:1653 -12830:0:4365 -12831:2:1657 -12832:0:4365 -12833:2:1180 -12834:0:4365 -12835:3:3757 -12836:0:4365 -12837:2:1181 -12838:2:1185 -12839:2:1186 -12840:2:1194 -12841:2:1195 -12842:2:1199 -12843:2:1200 -12844:2:1194 -12845:2:1195 -12846:2:1196 -12847:2:1208 -12848:2:1213 -12849:2:1217 -12850:2:1218 -12851:2:1225 -12852:2:1226 -12853:2:1237 -12854:2:1238 -12855:2:1239 -12856:2:1237 -12857:2:1238 -12858:2:1239 -12859:2:1250 -12860:2:1255 -12861:2:1256 -12862:0:4365 -12863:3:3758 -12864:0:4365 -12865:2:1268 -12866:0:4365 -12867:3:3757 -12868:0:4365 -12869:2:1270 -12870:0:4365 -12871:3:3758 -12872:0:4365 -12873:2:1271 -12874:2:1275 -12875:2:1276 -12876:2:1284 -12877:2:1285 -12878:2:1289 -12879:2:1290 -12880:2:1284 -12881:2:1285 -12882:2:1289 -12883:2:1290 -12884:2:1298 -12885:2:1303 -12886:2:1307 -12887:2:1308 -12888:2:1315 -12889:2:1316 -12890:2:1327 -12891:2:1328 -12892:2:1329 -12893:2:1327 -12894:2:1328 -12895:2:1329 -12896:2:1340 -12897:2:1345 -12898:2:1346 -12899:0:4365 -12900:2:1358 -12901:0:4365 -12902:2:1454 -12903:0:4365 -12904:3:3757 -12905:0:4365 -12906:2:1455 -12907:0:4365 -12908:3:3758 -12909:0:4365 -12910:2:1652 -12911:0:4365 -12912:2:1653 -12913:0:4365 -12914:2:1657 -12915:0:4365 -12916:2:1660 -12917:0:4365 -12918:3:3757 -12919:0:4365 -12920:2:1665 -12921:2:1669 -12922:2:1670 -12923:2:1678 -12924:2:1679 -12925:2:1683 -12926:2:1684 -12927:2:1678 -12928:2:1679 -12929:2:1680 -12930:2:1692 -12931:2:1697 -12932:2:1701 -12933:2:1702 -12934:2:1709 -12935:2:1710 -12936:2:1721 -12937:2:1722 -12938:2:1723 -12939:2:1721 -12940:2:1722 -12941:2:1723 -12942:2:1734 -12943:2:1739 -12944:2:1740 -12945:0:4365 -12946:3:3758 -12947:0:4365 -12948:2:1752 -12949:0:4365 -12950:3:3757 -12951:0:4365 -12952:2:1754 -12953:0:4365 -12954:3:3758 -12955:0:4365 -12956:2:1755 -12957:2:1759 -12958:2:1760 -12959:2:1768 -12960:2:1769 -12961:2:1773 -12962:2:1774 -12963:2:1768 -12964:2:1769 -12965:2:1773 -12966:2:1774 -12967:2:1782 -12968:2:1787 -12969:2:1791 -12970:2:1792 -12971:2:1799 -12972:2:1800 -12973:2:1811 -12974:2:1812 -12975:2:1813 -12976:2:1811 -12977:2:1812 -12978:2:1813 -12979:2:1824 -12980:2:1829 -12981:2:1830 -12982:0:4365 -12983:2:1842 -12984:0:4365 -12985:3:3757 -12986:0:4365 -12987:2:1844 -12988:0:4365 -12989:3:3758 -12990:0:4365 -12991:2:1845 -12992:2:1849 -12993:2:1850 -12994:2:1858 -12995:2:1859 -12996:2:1863 -12997:2:1864 -12998:2:1858 -12999:2:1859 -13000:2:1863 -13001:2:1864 -13002:2:1872 -13003:2:1877 -13004:2:1881 -13005:2:1882 -13006:2:1889 -13007:2:1890 -13008:2:1901 -13009:2:1902 -13010:2:1903 -13011:2:1901 -13012:2:1902 -13013:2:1903 -13014:2:1914 -13015:2:1919 -13016:2:1920 -13017:0:4365 -13018:2:1932 -13019:0:4365 -13020:3:3757 -13021:0:4365 -13022:2:1934 -13023:0:4365 -13024:3:3758 -13025:0:4365 -13026:2:1935 -13027:0:4365 -13028:2:1936 -13029:0:4365 -13030:2:2129 -13031:0:4365 -13032:2:2130 -13033:0:4365 -13034:2:2134 -13035:0:4365 -13036:3:3757 -13037:0:4365 -13038:2:2136 -13039:0:4365 -13040:3:3758 -13041:0:4365 -13042:2:2137 -13043:2:2141 -13044:2:2142 -13045:2:2150 -13046:2:2151 -13047:2:2155 -13048:2:2156 -13049:2:2150 -13050:2:2151 -13051:2:2155 -13052:2:2156 -13053:2:2164 -13054:2:2169 -13055:2:2173 -13056:2:2174 -13057:2:2181 -13058:2:2182 -13059:2:2193 -13060:2:2194 -13061:2:2195 -13062:2:2193 -13063:2:2194 -13064:2:2195 -13065:2:2206 -13066:2:2211 -13067:2:2212 -13068:0:4365 -13069:2:2224 -13070:0:4365 -13071:3:3757 -13072:0:4365 -13073:2:2226 -13074:0:4365 -13075:3:3758 -13076:0:4365 -13077:2:1936 -13078:0:4365 -13079:2:2129 -13080:0:4365 -13081:2:2130 -13082:0:4365 -13083:2:2134 -13084:0:4365 -13085:3:3757 -13086:0:4365 -13087:2:2136 -13088:0:4365 -13089:3:3758 -13090:0:4365 -13091:2:2137 -13092:2:2141 -13093:2:2142 -13094:2:2150 -13095:2:2151 -13096:2:2155 -13097:2:2156 -13098:2:2150 -13099:2:2151 -13100:2:2152 -13101:2:2164 -13102:2:2169 -13103:2:2173 -13104:2:2174 -13105:2:2181 -13106:2:2182 -13107:2:2193 -13108:2:2194 -13109:2:2195 -13110:2:2193 -13111:2:2194 -13112:2:2195 -13113:2:2206 -13114:2:2211 -13115:2:2212 -13116:0:4365 -13117:2:2224 -13118:0:4365 -13119:3:3757 -13120:0:4365 -13121:2:2226 -13122:0:4365 -13123:3:3758 -13124:0:4365 -13125:2:2230 -13126:0:4365 -13127:3:3757 -13128:0:4365 -13129:2:2235 -13130:2:2239 -13131:2:2240 -13132:2:2248 -13133:2:2249 -13134:2:2253 -13135:2:2254 -13136:2:2248 -13137:2:2249 -13138:2:2250 -13139:2:2262 -13140:2:2267 -13141:2:2271 -13142:2:2272 -13143:2:2279 -13144:2:2280 -13145:2:2291 -13146:2:2292 -13147:2:2293 -13148:2:2291 -13149:2:2292 -13150:2:2293 -13151:2:2304 -13152:2:2309 -13153:2:2310 -13154:0:4365 -13155:3:3758 -13156:0:4365 -13157:2:2322 -13158:0:4365 -13159:2:1169 -13160:0:4365 -13161:3:3757 -13162:0:4365 -13163:2:1170 -13164:0:4365 -13165:3:3758 -13166:0:4365 -13167:3:3759 -13168:0:4365 -13169:3:3972 -13170:0:4365 -13171:3:3980 -13172:0:4365 -13173:3:3981 -13174:3:3985 -13175:3:3986 -13176:3:3994 -13177:3:3995 -13178:3:3999 -13179:3:4000 -13180:3:3994 -13181:3:3995 -13182:3:3999 -13183:3:4000 -13184:3:4008 -13185:3:4013 -13186:3:4017 -13187:3:4018 -13188:3:4025 -13189:3:4026 -13190:3:4037 -13191:3:4038 -13192:3:4039 -13193:3:4037 -13194:3:4038 -13195:3:4039 -13196:3:4050 -13197:3:4055 -13198:3:4056 -13199:0:4365 -13200:3:4068 -13201:0:4365 -13202:3:4069 -13203:0:4365 -13204:2:1173 -13205:0:4365 -13206:3:4070 -13207:0:4365 -13208:2:1179 -13209:0:4365 -13210:2:1180 -13211:0:4365 -13212:3:4069 -13213:0:4365 -13214:2:1181 -13215:2:1185 -13216:2:1186 -13217:2:1194 -13218:2:1195 -13219:2:1199 -13220:2:1200 -13221:2:1194 -13222:2:1195 -13223:2:1199 -13224:2:1200 -13225:2:1208 -13226:2:1213 -13227:2:1217 -13228:2:1218 -13229:2:1225 -13230:2:1226 -13231:2:1237 -13232:2:1238 -13233:2:1239 -13234:2:1237 -13235:2:1238 -13236:2:1239 -13237:2:1250 -13238:2:1255 -13239:2:1256 -13240:0:4365 -13241:3:4070 -13242:0:4365 -13243:2:1268 -13244:0:4365 -13245:3:4069 -13246:0:4365 -13247:2:1270 -13248:0:4365 -13249:3:4070 -13250:0:4365 -13251:2:1271 -13252:2:1275 -13253:2:1276 -13254:2:1284 -13255:2:1285 -13256:2:1289 -13257:2:1290 -13258:2:1284 -13259:2:1285 -13260:2:1289 -13261:2:1290 -13262:2:1298 -13263:2:1303 -13264:2:1307 -13265:2:1308 -13266:2:1315 -13267:2:1316 -13268:2:1327 -13269:2:1328 -13270:2:1329 -13271:2:1327 -13272:2:1328 -13273:2:1329 -13274:2:1340 -13275:2:1345 -13276:2:1346 -13277:0:4365 -13278:2:1358 -13279:0:4365 -13280:2:1360 -13281:0:4365 -13282:3:4069 -13283:0:4365 -13284:2:1361 -13285:0:4365 -13286:3:4070 -13287:0:4365 -13288:2:1362 -13289:2:1366 -13290:2:1367 -13291:2:1375 -13292:2:1376 -13293:2:1380 -13294:2:1381 -13295:2:1375 -13296:2:1376 -13297:2:1380 -13298:2:1381 -13299:2:1389 -13300:2:1394 -13301:2:1398 -13302:2:1399 -13303:2:1406 -13304:2:1407 -13305:2:1418 -13306:2:1419 -13307:2:1420 -13308:2:1418 -13309:2:1419 -13310:2:1420 -13311:2:1431 -13312:2:1436 -13313:2:1437 -13314:0:4365 -13315:2:1449 -13316:0:4365 -13317:3:4069 -13318:0:4365 -13319:2:1451 -13320:0:4365 -13321:3:4070 -13322:0:4365 -13323:2:1652 -13324:0:4365 -13325:2:1653 -13326:0:4365 -13327:2:1657 -13328:0:4365 -13329:2:1180 -13330:0:4365 -13331:3:4069 -13332:0:4365 -13333:2:1181 -13334:2:1185 -13335:2:1186 -13336:2:1194 -13337:2:1195 -13338:2:1199 -13339:2:1200 -13340:2:1194 -13341:2:1195 -13342:2:1196 -13343:2:1208 -13344:2:1213 -13345:2:1217 -13346:2:1218 -13347:2:1225 -13348:2:1226 -13349:2:1237 -13350:2:1238 -13351:2:1239 -13352:2:1237 -13353:2:1238 -13354:2:1239 -13355:2:1250 -13356:2:1255 -13357:2:1256 -13358:0:4365 -13359:3:4070 -13360:0:4365 -13361:2:1268 -13362:0:4365 -13363:3:4069 -13364:0:4365 -13365:2:1270 -13366:0:4365 -13367:3:4070 -13368:0:4365 -13369:2:1271 -13370:2:1275 -13371:2:1276 -13372:2:1284 -13373:2:1285 -13374:2:1289 -13375:2:1290 -13376:2:1284 -13377:2:1285 -13378:2:1289 -13379:2:1290 -13380:2:1298 -13381:2:1303 -13382:2:1307 -13383:2:1308 -13384:2:1315 -13385:2:1316 -13386:2:1327 -13387:2:1328 -13388:2:1329 -13389:2:1327 -13390:2:1328 -13391:2:1329 -13392:2:1340 -13393:2:1345 -13394:2:1346 -13395:0:4365 -13396:2:1358 -13397:0:4365 -13398:2:1454 -13399:0:4365 -13400:3:4069 -13401:0:4365 -13402:2:1455 -13403:0:4365 -13404:3:4070 -13405:0:4365 -13406:2:1652 -13407:0:4365 -13408:2:1653 -13409:0:4365 -13410:2:1657 -13411:0:4365 -13412:2:1660 -13413:0:4365 -13414:3:4069 -13415:0:4365 -13416:2:1665 -13417:2:1669 -13418:2:1670 -13419:2:1678 -13420:2:1679 -13421:2:1683 -13422:2:1684 -13423:2:1678 -13424:2:1679 -13425:2:1680 -13426:2:1692 -13427:2:1697 -13428:2:1701 -13429:2:1702 -13430:2:1709 -13431:2:1710 -13432:2:1721 -13433:2:1722 -13434:2:1723 -13435:2:1721 -13436:2:1722 -13437:2:1723 -13438:2:1734 -13439:2:1739 -13440:2:1740 -13441:0:4365 -13442:3:4070 -13443:0:4365 -13444:2:1752 -13445:0:4365 -13446:3:4069 -13447:0:4365 -13448:2:1754 -13449:0:4365 -13450:3:4070 -13451:0:4365 -13452:2:1755 -13453:2:1759 -13454:2:1760 -13455:2:1768 -13456:2:1769 -13457:2:1773 -13458:2:1774 -13459:2:1768 -13460:2:1769 -13461:2:1773 -13462:2:1774 -13463:2:1782 -13464:2:1787 -13465:2:1791 -13466:2:1792 -13467:2:1799 -13468:2:1800 -13469:2:1811 -13470:2:1812 -13471:2:1813 -13472:2:1811 -13473:2:1812 -13474:2:1813 -13475:2:1824 -13476:2:1829 -13477:2:1830 -13478:0:4365 -13479:2:1842 -13480:0:4365 -13481:3:4069 -13482:0:4365 -13483:2:1844 -13484:0:4365 -13485:3:4070 -13486:0:4365 -13487:2:1845 -13488:2:1849 -13489:2:1850 -13490:2:1858 -13491:2:1859 -13492:2:1863 -13493:2:1864 -13494:2:1858 -13495:2:1859 -13496:2:1863 -13497:2:1864 -13498:2:1872 -13499:2:1877 -13500:2:1881 -13501:2:1882 -13502:2:1889 -13503:2:1890 -13504:2:1901 -13505:2:1902 -13506:2:1903 -13507:2:1901 -13508:2:1902 -13509:2:1903 -13510:2:1914 -13511:2:1919 -13512:2:1920 -13513:0:4365 -13514:2:1932 -13515:0:4365 -13516:3:4069 -13517:0:4365 -13518:2:1934 -13519:0:4365 -13520:3:4070 -13521:0:4365 -13522:2:1935 -13523:0:4365 -13524:2:1936 -13525:0:4365 -13526:2:2129 -13527:0:4365 -13528:2:2130 -13529:0:4365 -13530:2:2134 -13531:0:4365 -13532:3:4069 -13533:0:4365 -13534:2:2136 -13535:0:4365 -13536:3:4070 -13537:0:4365 -13538:2:2137 -13539:2:2141 -13540:2:2142 -13541:2:2150 -13542:2:2151 -13543:2:2155 -13544:2:2156 -13545:2:2150 -13546:2:2151 -13547:2:2155 -13548:2:2156 -13549:2:2164 -13550:2:2169 -13551:2:2173 -13552:2:2174 -13553:2:2181 -13554:2:2182 -13555:2:2193 -13556:2:2194 -13557:2:2195 -13558:2:2193 -13559:2:2194 -13560:2:2195 -13561:2:2206 -13562:2:2211 -13563:2:2212 -13564:0:4365 -13565:2:2224 -13566:0:4365 -13567:3:4069 -13568:0:4365 -13569:2:2226 -13570:0:4365 -13571:3:4070 -13572:0:4365 -13573:2:1936 -13574:0:4365 -13575:2:2129 -13576:0:4365 -13577:2:2130 -13578:0:4365 -13579:2:2134 -13580:0:4365 -13581:3:4069 -13582:0:4365 -13583:2:2136 -13584:0:4365 -13585:3:4070 -13586:0:4365 -13587:2:2137 -13588:2:2141 -13589:2:2142 -13590:2:2150 -13591:2:2151 -13592:2:2155 -13593:2:2156 -13594:2:2150 -13595:2:2151 -13596:2:2152 -13597:2:2164 -13598:2:2169 -13599:2:2173 -13600:2:2174 -13601:2:2181 -13602:2:2182 -13603:2:2193 -13604:2:2194 -13605:2:2195 -13606:2:2193 -13607:2:2194 -13608:2:2195 -13609:2:2206 -13610:2:2211 -13611:2:2212 -13612:0:4365 -13613:2:2224 -13614:0:4365 -13615:3:4069 -13616:0:4365 -13617:2:2226 -13618:0:4365 -13619:3:4070 -13620:0:4365 -13621:2:2230 -13622:0:4365 -13623:3:4069 -13624:0:4365 -13625:2:2235 -13626:2:2239 -13627:2:2240 -13628:2:2248 -13629:2:2249 -13630:2:2253 -13631:2:2254 -13632:2:2248 -13633:2:2249 -13634:2:2250 -13635:2:2262 -13636:2:2267 -13637:2:2271 -13638:2:2272 -13639:2:2279 -13640:2:2280 -13641:2:2291 -13642:2:2292 -13643:2:2293 -13644:2:2291 -13645:2:2292 -13646:2:2293 -13647:2:2304 -13648:2:2309 -13649:2:2310 -13650:0:4365 -13651:3:4070 -13652:0:4365 -13653:2:2322 -13654:0:4365 -13655:2:1169 -13656:0:4365 -13657:3:4069 -13658:0:4365 -13659:2:1170 -13660:0:4365 -13661:3:4070 -13662:0:4365 -13663:3:4071 -13664:0:4365 -13665:3:4081 -13666:0:4365 -13667:3:3666 -13668:0:4365 -13669:3:3667 -13670:0:4365 -13671:3:3668 -13672:0:4365 -13673:3:3669 -13674:3:3673 -13675:3:3674 -13676:3:3682 -13677:3:3683 -13678:3:3687 -13679:3:3688 -13680:3:3682 -13681:3:3683 -13682:3:3687 -13683:3:3688 -13684:3:3696 -13685:3:3701 -13686:3:3705 -13687:3:3706 -13688:3:3713 -13689:3:3714 -13690:3:3725 -13691:3:3726 -13692:3:3727 -13693:3:3725 -13694:3:3726 -13695:3:3727 -13696:3:3738 -13697:3:3743 -13698:3:3744 -13699:0:4365 -13700:3:3756 -13701:0:4365 -13702:3:3757 -13703:0:4365 -13704:2:1173 -13705:0:4365 -13706:3:3758 -13707:0:4365 -13708:2:1179 -13709:0:4365 -13710:2:1180 -13711:0:4365 -13712:3:3757 -13713:0:4365 -13714:2:1181 -13715:2:1185 -13716:2:1186 -13717:2:1194 -13718:2:1195 -13719:2:1199 -13720:2:1200 -13721:2:1194 -13722:2:1195 -13723:2:1199 -13724:2:1200 -13725:2:1208 -13726:2:1213 -13727:2:1217 -13728:2:1218 -13729:2:1225 -13730:2:1226 -13731:2:1237 -13732:2:1238 -13733:2:1239 -13734:2:1237 -13735:2:1238 -13736:2:1239 -13737:2:1250 -13738:2:1255 -13739:2:1256 -13740:0:4365 -13741:3:3758 -13742:0:4365 -13743:2:1268 -13744:0:4365 -13745:3:3757 -13746:0:4365 -13747:2:1270 -13748:0:4365 -13749:3:3758 -13750:0:4365 -13751:2:1271 -13752:2:1275 -13753:2:1276 -13754:2:1284 -13755:2:1285 -13756:2:1289 -13757:2:1290 -13758:2:1284 -13759:2:1285 -13760:2:1289 -13761:2:1290 -13762:2:1298 -13763:2:1303 -13764:2:1307 -13765:2:1308 -13766:2:1315 -13767:2:1316 -13768:2:1327 -13769:2:1328 -13770:2:1329 -13771:2:1327 -13772:2:1328 -13773:2:1329 -13774:2:1340 -13775:2:1345 -13776:2:1346 -13777:0:4365 -13778:2:1358 -13779:0:4365 -13780:2:1360 -13781:0:4365 -13782:3:3757 -13783:0:4365 -13784:2:1361 -13785:0:4365 -13786:3:3758 -13787:0:4365 -13788:2:1362 -13789:2:1366 -13790:2:1367 -13791:2:1375 -13792:2:1376 -13793:2:1380 -13794:2:1381 -13795:2:1375 -13796:2:1376 -13797:2:1380 -13798:2:1381 -13799:2:1389 -13800:2:1394 -13801:2:1398 -13802:2:1399 -13803:2:1406 -13804:2:1407 -13805:2:1418 -13806:2:1419 -13807:2:1420 -13808:2:1418 -13809:2:1419 -13810:2:1420 -13811:2:1431 -13812:2:1436 -13813:2:1437 -13814:0:4365 -13815:2:1449 -13816:0:4365 -13817:3:3757 -13818:0:4365 -13819:2:1451 -13820:0:4365 -13821:3:3758 -13822:0:4365 -13823:2:1652 -13824:0:4365 -13825:2:1653 -13826:0:4365 -13827:2:1657 -13828:0:4365 -13829:2:1180 -13830:0:4365 -13831:3:3757 -13832:0:4365 -13833:2:1181 -13834:2:1185 -13835:2:1186 -13836:2:1194 -13837:2:1195 -13838:2:1199 -13839:2:1200 -13840:2:1194 -13841:2:1195 -13842:2:1196 -13843:2:1208 -13844:2:1213 -13845:2:1217 -13846:2:1218 -13847:2:1225 -13848:2:1226 -13849:2:1237 -13850:2:1238 -13851:2:1239 -13852:2:1237 -13853:2:1238 -13854:2:1239 -13855:2:1250 -13856:2:1255 -13857:2:1256 -13858:0:4365 -13859:3:3758 -13860:0:4365 -13861:2:1268 -13862:0:4365 -13863:3:3757 -13864:0:4365 -13865:2:1270 -13866:0:4365 -13867:3:3758 -13868:0:4365 -13869:2:1271 -13870:2:1275 -13871:2:1276 -13872:2:1284 -13873:2:1285 -13874:2:1289 -13875:2:1290 -13876:2:1284 -13877:2:1285 -13878:2:1289 -13879:2:1290 -13880:2:1298 -13881:2:1303 -13882:2:1307 -13883:2:1308 -13884:2:1315 -13885:2:1316 -13886:2:1327 -13887:2:1328 -13888:2:1329 -13889:2:1327 -13890:2:1328 -13891:2:1329 -13892:2:1340 -13893:2:1345 -13894:2:1346 -13895:0:4365 -13896:2:1358 -13897:0:4365 -13898:2:1454 -13899:0:4365 -13900:3:3757 -13901:0:4365 -13902:2:1455 -13903:0:4365 -13904:3:3758 -13905:0:4365 -13906:2:1652 -13907:0:4365 -13908:2:1653 -13909:0:4365 -13910:2:1657 -13911:0:4365 -13912:2:1660 -13913:0:4365 -13914:3:3757 -13915:0:4365 -13916:2:1665 -13917:2:1669 -13918:2:1670 -13919:2:1678 -13920:2:1679 -13921:2:1683 -13922:2:1684 -13923:2:1678 -13924:2:1679 -13925:2:1680 -13926:2:1692 -13927:2:1697 -13928:2:1701 -13929:2:1702 -13930:2:1709 -13931:2:1710 -13932:2:1721 -13933:2:1722 -13934:2:1723 -13935:2:1721 -13936:2:1722 -13937:2:1723 -13938:2:1734 -13939:2:1739 -13940:2:1740 -13941:0:4365 -13942:3:3758 -13943:0:4365 -13944:2:1752 -13945:0:4365 -13946:3:3757 -13947:0:4365 -13948:2:1754 -13949:0:4365 -13950:3:3758 -13951:0:4365 -13952:2:1755 -13953:2:1759 -13954:2:1760 -13955:2:1768 -13956:2:1769 -13957:2:1773 -13958:2:1774 -13959:2:1768 -13960:2:1769 -13961:2:1773 -13962:2:1774 -13963:2:1782 -13964:2:1787 -13965:2:1791 -13966:2:1792 -13967:2:1799 -13968:2:1800 -13969:2:1811 -13970:2:1812 -13971:2:1813 -13972:2:1811 -13973:2:1812 -13974:2:1813 -13975:2:1824 -13976:2:1829 -13977:2:1830 -13978:0:4365 -13979:2:1842 -13980:0:4365 -13981:3:3757 -13982:0:4365 -13983:2:1844 -13984:0:4365 -13985:3:3758 -13986:0:4365 -13987:2:1845 -13988:2:1849 -13989:2:1850 -13990:2:1858 -13991:2:1859 -13992:2:1863 -13993:2:1864 -13994:2:1858 -13995:2:1859 -13996:2:1863 -13997:2:1864 -13998:2:1872 -13999:2:1877 -14000:2:1881 -14001:2:1882 -14002:2:1889 -14003:2:1890 -14004:2:1901 -14005:2:1902 -14006:2:1903 -14007:2:1901 -14008:2:1902 -14009:2:1903 -14010:2:1914 -14011:2:1919 -14012:2:1920 -14013:0:4365 -14014:2:1932 -14015:0:4365 -14016:3:3757 -14017:0:4365 -14018:2:1934 -14019:0:4365 -14020:3:3758 -14021:0:4365 -14022:2:1935 -14023:0:4365 -14024:2:1936 -14025:0:4365 -14026:2:2129 -14027:0:4365 -14028:2:2130 -14029:0:4365 -14030:2:2134 -14031:0:4365 -14032:3:3757 -14033:0:4365 -14034:2:2136 -14035:0:4365 -14036:3:3758 -14037:0:4365 -14038:2:2137 -14039:2:2141 -14040:2:2142 -14041:2:2150 -14042:2:2151 -14043:2:2155 -14044:2:2156 -14045:2:2150 -14046:2:2151 -14047:2:2155 -14048:2:2156 -14049:2:2164 -14050:2:2169 -14051:2:2173 -14052:2:2174 -14053:2:2181 -14054:2:2182 -14055:2:2193 -14056:2:2194 -14057:2:2195 -14058:2:2193 -14059:2:2194 -14060:2:2195 -14061:2:2206 -14062:2:2211 -14063:2:2212 -14064:0:4365 -14065:2:2224 -14066:0:4365 -14067:3:3757 -14068:0:4365 -14069:2:2226 -14070:0:4365 -14071:3:3758 -14072:0:4365 -14073:2:1936 -14074:0:4365 -14075:2:2129 -14076:0:4365 -14077:2:2130 -14078:0:4365 -14079:2:2134 -14080:0:4365 -14081:3:3757 -14082:0:4365 -14083:2:2136 -14084:0:4365 -14085:3:3758 -14086:0:4365 -14087:2:2137 -14088:2:2141 -14089:2:2142 -14090:2:2150 -14091:2:2151 -14092:2:2155 -14093:2:2156 -14094:2:2150 -14095:2:2151 -14096:2:2152 -14097:2:2164 -14098:2:2169 -14099:2:2173 -14100:2:2174 -14101:2:2181 -14102:2:2182 -14103:2:2193 -14104:2:2194 -14105:2:2195 -14106:2:2193 -14107:2:2194 -14108:2:2195 -14109:2:2206 -14110:2:2211 -14111:2:2212 -14112:0:4365 -14113:2:2224 -14114:0:4365 -14115:3:3757 -14116:0:4365 -14117:2:2226 -14118:0:4365 -14119:3:3758 -14120:0:4365 -14121:2:2230 -14122:0:4365 -14123:3:3757 -14124:0:4365 -14125:2:2235 -14126:2:2239 -14127:2:2240 -14128:2:2248 -14129:2:2249 -14130:2:2253 -14131:2:2254 -14132:2:2248 -14133:2:2249 -14134:2:2250 -14135:2:2262 -14136:2:2267 -14137:2:2271 -14138:2:2272 -14139:2:2279 -14140:2:2280 -14141:2:2291 -14142:2:2292 -14143:2:2293 -14144:2:2291 -14145:2:2292 -14146:2:2293 -14147:2:2304 -14148:2:2309 -14149:2:2310 -14150:0:4365 -14151:3:3758 -14152:0:4365 -14153:2:2322 -14154:0:4365 -14155:2:1169 -14156:0:4365 -14157:3:3757 -14158:0:4365 -14159:2:1170 -14160:0:4365 -14161:3:3758 -14162:0:4365 -14163:3:3759 -14164:0:4365 -14165:3:3972 -14166:0:4365 -14167:3:4077 -14168:0:4365 -14169:3:4078 -14170:0:4365 -14171:3:4082 -14172:0:4365 -14173:3:4088 -14174:0:4365 -14175:3:4092 -14176:3:4093 -14177:3:4097 -14178:3:4101 -14179:3:4102 -14180:3:4097 -14181:3:4101 -14182:3:4102 -14183:3:4106 -14184:3:4114 -14185:3:4115 -14186:3:4120 -14187:3:4127 -14188:3:4128 -14189:3:4127 -14190:3:4128 -14191:3:4135 -14192:3:4140 -14193:0:4365 -14194:3:4151 -14195:0:4365 -14196:3:4155 -14197:3:4156 -14198:3:4160 -14199:3:4164 -14200:3:4165 -14201:3:4160 -14202:3:4164 -14203:3:4165 -14204:3:4169 -14205:3:4177 -14206:3:4178 -14207:3:4183 -14208:3:4190 -14209:3:4191 -14210:3:4190 -14211:3:4191 -14212:3:4198 -14213:3:4203 -14214:0:4365 -14215:3:4151 -14216:0:4365 -14217:3:4155 -14218:3:4156 -14219:3:4160 -14220:3:4164 -14221:3:4165 -14222:3:4160 -14223:3:4164 -14224:3:4165 -14225:3:4169 -14226:3:4177 -14227:3:4178 -14228:3:4183 -14229:3:4190 -14230:3:4191 -14231:3:4190 -14232:3:4191 -14233:3:4198 -14234:3:4203 -14235:0:4365 -14236:3:4214 -14237:0:4365 -14238:3:4222 -14239:3:4223 -14240:3:4227 -14241:3:4231 -14242:3:4232 -14243:3:4227 -14244:3:4231 -14245:3:4232 -14246:3:4236 -14247:3:4244 -14248:3:4245 -14249:3:4250 -14250:3:4257 -14251:3:4258 -14252:3:4257 -14253:3:4258 -14254:3:4265 -14255:3:4270 -14256:0:4365 -14257:3:4285 -14258:0:4365 -14259:3:4286 -14260:0:4365 -14261:2:1173 -14262:0:4365 -14263:3:4287 -14264:0:4365 -14265:2:1179 -14266:0:4365 -14267:2:1180 -14268:0:4365 -14269:3:4286 -14270:0:4365 -14271:2:1181 -14272:2:1185 -14273:2:1186 -14274:2:1194 -14275:2:1195 -14276:2:1199 -14277:2:1200 -14278:2:1194 -14279:2:1195 -14280:2:1199 -14281:2:1200 -14282:2:1208 -14283:2:1213 -14284:2:1217 -14285:2:1218 -14286:2:1225 -14287:2:1226 -14288:2:1237 -14289:2:1238 -14290:2:1239 -14291:2:1237 -14292:2:1238 -14293:2:1239 -14294:2:1250 -14295:2:1255 -14296:2:1256 -14297:0:4365 -14298:3:4287 -14299:0:4365 -14300:2:1268 -14301:0:4365 -14302:3:4286 -14303:0:4365 -14304:2:1270 -14305:0:4365 -14306:3:4287 -14307:0:4365 -14308:2:1271 -14309:2:1275 -14310:2:1276 -14311:2:1284 -14312:2:1285 -14313:2:1289 -14314:2:1290 -14315:2:1284 -14316:2:1285 -14317:2:1289 -14318:2:1290 -14319:2:1298 -14320:2:1303 -14321:2:1307 -14322:2:1308 -14323:2:1315 -14324:2:1316 -14325:2:1327 -14326:2:1328 -14327:2:1329 -14328:2:1327 -14329:2:1328 -14330:2:1329 -14331:2:1340 -14332:2:1345 -14333:2:1346 -14334:0:4365 -14335:2:1358 -14336:0:4365 -14337:2:1360 -14338:0:4365 -14339:3:4286 -14340:0:4365 -14341:2:1361 -14342:0:4365 -14343:3:4287 -14344:0:4365 -14345:2:1362 -14346:2:1366 -14347:2:1367 -14348:2:1375 -14349:2:1376 -14350:2:1380 -14351:2:1381 -14352:2:1375 -14353:2:1376 -14354:2:1380 -14355:2:1381 -14356:2:1389 -14357:2:1394 -14358:2:1398 -14359:2:1399 -14360:2:1406 -14361:2:1407 -14362:2:1418 -14363:2:1419 -14364:2:1420 -14365:2:1418 -14366:2:1419 -14367:2:1420 -14368:2:1431 -14369:2:1436 -14370:2:1437 -14371:0:4365 -14372:2:1449 -14373:0:4365 -14374:3:4286 -14375:0:4365 -14376:2:1451 -14377:0:4365 -14378:3:4287 -14379:0:4365 -14380:2:1652 -14381:0:4365 -14382:2:1653 -14383:0:4365 -14384:2:1657 -14385:0:4365 -14386:2:1180 -14387:0:4365 -14388:3:4286 -14389:0:4365 -14390:2:1181 -14391:2:1185 -14392:2:1186 -14393:2:1194 -14394:2:1195 -14395:2:1199 -14396:2:1200 -14397:2:1194 -14398:2:1195 -14399:2:1196 -14400:2:1208 -14401:2:1213 -14402:2:1217 -14403:2:1218 -14404:2:1225 -14405:2:1226 -14406:2:1237 -14407:2:1238 -14408:2:1239 -14409:2:1237 -14410:2:1238 -14411:2:1239 -14412:2:1250 -14413:2:1255 -14414:2:1256 -14415:0:4365 -14416:3:4287 -14417:0:4365 -14418:2:1268 -14419:0:4365 -14420:3:4286 -14421:0:4365 -14422:2:1270 -14423:0:4365 -14424:3:4287 -14425:0:4365 -14426:2:1271 -14427:2:1275 -14428:2:1276 -14429:2:1284 -14430:2:1285 -14431:2:1289 -14432:2:1290 -14433:2:1284 -14434:2:1285 -14435:2:1289 -14436:2:1290 -14437:2:1298 -14438:2:1303 -14439:2:1307 -14440:2:1308 -14441:2:1315 -14442:2:1316 -14443:2:1327 -14444:2:1328 -14445:2:1329 -14446:2:1327 -14447:2:1328 -14448:2:1329 -14449:2:1340 -14450:2:1345 -14451:2:1346 -14452:0:4365 -14453:2:1358 -14454:0:4365 -14455:2:1454 -14456:0:4365 -14457:3:4286 -14458:0:4365 -14459:2:1455 -14460:0:4365 -14461:3:4287 -14462:0:4365 -14463:2:1652 -14464:0:4365 -14465:2:1653 -14466:0:4365 -14467:2:1657 -14468:0:4365 -14469:2:1660 -14470:0:4365 -14471:3:4286 -14472:0:4365 -14473:2:1665 -14474:2:1669 -14475:2:1670 -14476:2:1678 -14477:2:1679 -14478:2:1683 -14479:2:1684 -14480:2:1678 -14481:2:1679 -14482:2:1680 -14483:2:1692 -14484:2:1697 -14485:2:1701 -14486:2:1702 -14487:2:1709 -14488:2:1710 -14489:2:1721 -14490:2:1722 -14491:2:1723 -14492:2:1721 -14493:2:1722 -14494:2:1723 -14495:2:1734 -14496:2:1739 -14497:2:1740 -14498:0:4365 -14499:3:4287 -14500:0:4365 -14501:2:1752 -14502:0:4365 -14503:3:4286 -14504:0:4365 -14505:2:1754 -14506:0:4365 -14507:3:4287 -14508:0:4365 -14509:2:1755 -14510:2:1759 -14511:2:1760 -14512:2:1768 -14513:2:1769 -14514:2:1773 -14515:2:1774 -14516:2:1768 -14517:2:1769 -14518:2:1773 -14519:2:1774 -14520:2:1782 -14521:2:1787 -14522:2:1791 -14523:2:1792 -14524:2:1799 -14525:2:1800 -14526:2:1811 -14527:2:1812 -14528:2:1813 -14529:2:1811 -14530:2:1812 -14531:2:1813 -14532:2:1824 -14533:2:1829 -14534:2:1830 -14535:0:4365 -14536:2:1842 -14537:0:4365 -14538:3:4286 -14539:0:4365 -14540:2:1844 -14541:0:4365 -14542:3:4287 -14543:0:4365 -14544:2:1845 -14545:2:1849 -14546:2:1850 -14547:2:1858 -14548:2:1859 -14549:2:1863 -14550:2:1864 -14551:2:1858 -14552:2:1859 -14553:2:1863 -14554:2:1864 -14555:2:1872 -14556:2:1877 -14557:2:1881 -14558:2:1882 -14559:2:1889 -14560:2:1890 -14561:2:1901 -14562:2:1902 -14563:2:1903 -14564:2:1901 -14565:2:1902 -14566:2:1903 -14567:2:1914 -14568:2:1919 -14569:2:1920 -14570:0:4365 -14571:2:1932 -14572:0:4365 -14573:3:4286 -14574:0:4365 -14575:2:1934 -14576:0:4365 -14577:3:4287 -14578:0:4365 -14579:2:1935 -14580:0:4365 -14581:2:1936 -14582:0:4365 -14583:2:2129 -14584:0:4365 -14585:2:2130 -14586:0:4365 -14587:2:2134 -14588:0:4365 -14589:3:4286 -14590:0:4365 -14591:2:2136 -14592:0:4365 -14593:3:4287 -14594:0:4365 -14595:2:2137 -14596:2:2141 -14597:2:2142 -14598:2:2150 -14599:2:2151 -14600:2:2155 -14601:2:2156 -14602:2:2150 -14603:2:2151 -14604:2:2155 -14605:2:2156 -14606:2:2164 -14607:2:2169 -14608:2:2173 -14609:2:2174 -14610:2:2181 -14611:2:2182 -14612:2:2193 -14613:2:2194 -14614:2:2195 -14615:2:2193 -14616:2:2194 -14617:2:2195 -14618:2:2206 -14619:2:2211 -14620:2:2212 -14621:0:4365 -14622:2:2224 -14623:0:4365 -14624:3:4286 -14625:0:4365 -14626:2:2226 -14627:0:4365 -14628:3:4287 -14629:0:4365 -14630:2:1936 -14631:0:4365 -14632:2:2129 -14633:0:4365 -14634:2:2130 -14635:0:4365 -14636:2:2134 -14637:0:4365 -14638:3:4286 -14639:0:4365 -14640:2:2136 -14641:0:4365 -14642:3:4287 -14643:0:4365 -14644:2:2137 -14645:2:2141 -14646:2:2142 -14647:2:2150 -14648:2:2151 -14649:2:2155 -14650:2:2156 -14651:2:2150 -14652:2:2151 -14653:2:2152 -14654:2:2164 -14655:2:2169 -14656:2:2173 -14657:2:2174 -14658:2:2181 -14659:2:2182 -14660:2:2193 -14661:2:2194 -14662:2:2195 -14663:2:2193 -14664:2:2194 -14665:2:2195 -14666:2:2206 -14667:2:2211 -14668:2:2212 -14669:0:4365 -14670:2:2224 -14671:0:4365 -14672:3:4286 -14673:0:4365 -14674:2:2226 -14675:0:4365 -14676:3:4287 -14677:0:4365 -14678:2:2230 -14679:0:4365 -14680:3:4286 -14681:0:4365 -14682:2:2235 -14683:2:2239 -14684:2:2240 -14685:2:2248 -14686:2:2249 -14687:2:2253 -14688:2:2254 -14689:2:2248 -14690:2:2249 -14691:2:2250 -14692:2:2262 -14693:2:2267 -14694:2:2271 -14695:2:2272 -14696:2:2279 -14697:2:2280 -14698:2:2291 -14699:2:2292 -14700:2:2293 -14701:2:2291 -14702:2:2292 -14703:2:2293 -14704:2:2304 -14705:2:2309 -14706:2:2310 -14707:0:4365 -14708:3:4287 -14709:0:4365 -14710:2:2322 -14711:0:4365 -14712:2:1169 -14713:0:4365 -14714:3:4286 -14715:0:4365 -14716:2:1170 -14717:0:4365 -14718:3:4287 -14719:0:4365 -14720:3:4288 -14721:0:4365 -14722:3:4294 -14723:0:4365 -14724:3:4295 -14725:0:4365 -14726:3:2338 -14727:0:4365 -14728:3:2339 -14729:3:2343 -14730:3:2344 -14731:3:2352 -14732:3:2353 -14733:3:2357 -14734:3:2358 -14735:3:2352 -14736:3:2353 -14737:3:2357 -14738:3:2358 -14739:3:2366 -14740:3:2371 -14741:3:2375 -14742:3:2376 -14743:3:2383 -14744:3:2384 -14745:3:2395 -14746:3:2396 -14747:3:2397 -14748:3:2395 -14749:3:2396 -14750:3:2397 -14751:3:2408 -14752:3:2413 -14753:3:2414 -14754:0:4365 -14755:3:2426 -14756:0:4365 -14757:3:2427 -14758:0:4365 -14759:2:1173 -14760:0:4365 -14761:3:2428 -14762:0:4365 -14763:2:1179 -14764:0:4365 -14765:2:1180 -14766:0:4365 -14767:3:2427 -14768:0:4365 -14769:2:1181 -14770:2:1185 -14771:2:1186 -14772:2:1194 -14773:2:1195 -14774:2:1199 -14775:2:1200 -14776:2:1194 -14777:2:1195 -14778:2:1199 -14779:2:1200 -14780:2:1208 -14781:2:1213 -14782:2:1217 -14783:2:1218 -14784:2:1225 -14785:2:1226 -14786:2:1237 -14787:2:1238 -14788:2:1239 -14789:2:1237 -14790:2:1238 -14791:2:1239 -14792:2:1250 -14793:2:1255 -14794:2:1256 -14795:0:4365 -14796:3:2428 -14797:0:4365 -14798:2:1268 -14799:0:4365 -14800:3:2427 -14801:0:4365 -14802:2:1270 -14803:0:4365 -14804:3:2428 -14805:0:4365 -14806:2:1271 -14807:2:1275 -14808:2:1276 -14809:2:1284 -14810:2:1285 -14811:2:1289 -14812:2:1290 -14813:2:1284 -14814:2:1285 -14815:2:1289 -14816:2:1290 -14817:2:1298 -14818:2:1303 -14819:2:1307 -14820:2:1308 -14821:2:1315 -14822:2:1316 -14823:2:1327 -14824:2:1328 -14825:2:1329 -14826:2:1327 -14827:2:1328 -14828:2:1329 -14829:2:1340 -14830:2:1345 -14831:2:1346 -14832:0:4365 -14833:2:1358 -14834:0:4365 -14835:2:1360 -14836:0:4365 -14837:3:2427 -14838:0:4365 -14839:2:1361 -14840:0:4365 -14841:3:2428 -14842:0:4365 -14843:2:1362 -14844:2:1366 -14845:2:1367 -14846:2:1375 -14847:2:1376 -14848:2:1380 -14849:2:1381 -14850:2:1375 -14851:2:1376 -14852:2:1380 -14853:2:1381 -14854:2:1389 -14855:2:1394 -14856:2:1398 -14857:2:1399 -14858:2:1406 -14859:2:1407 -14860:2:1418 -14861:2:1419 -14862:2:1420 -14863:2:1418 -14864:2:1419 -14865:2:1420 -14866:2:1431 -14867:2:1436 -14868:2:1437 -14869:0:4365 -14870:2:1449 -14871:0:4365 -14872:3:2427 -14873:0:4365 -14874:2:1451 -14875:0:4365 -14876:3:2428 -14877:0:4365 -14878:2:1652 -14879:0:4365 -14880:2:1653 -14881:0:4365 -14882:2:1657 -14883:0:4365 -14884:2:1180 -14885:0:4365 -14886:3:2427 -14887:0:4365 -14888:2:1181 -14889:2:1185 -14890:2:1186 -14891:2:1194 -14892:2:1195 -14893:2:1199 -14894:2:1200 -14895:2:1194 -14896:2:1195 -14897:2:1196 -14898:2:1208 -14899:2:1213 -14900:2:1217 -14901:2:1218 -14902:2:1225 -14903:2:1226 -14904:2:1237 -14905:2:1238 -14906:2:1239 -14907:2:1237 -14908:2:1238 -14909:2:1239 -14910:2:1250 -14911:2:1255 -14912:2:1256 -14913:0:4365 -14914:3:2428 -14915:0:4365 -14916:2:1268 -14917:0:4365 -14918:3:2427 -14919:0:4365 -14920:2:1270 -14921:0:4365 -14922:3:2428 -14923:0:4365 -14924:2:1271 -14925:2:1275 -14926:2:1276 -14927:2:1284 -14928:2:1285 -14929:2:1289 -14930:2:1290 -14931:2:1284 -14932:2:1285 -14933:2:1289 -14934:2:1290 -14935:2:1298 -14936:2:1303 -14937:2:1307 -14938:2:1308 -14939:2:1315 -14940:2:1316 -14941:2:1327 -14942:2:1328 -14943:2:1329 -14944:2:1327 -14945:2:1328 -14946:2:1329 -14947:2:1340 -14948:2:1345 -14949:2:1346 -14950:0:4365 -14951:2:1358 -14952:0:4365 -14953:2:1454 -14954:0:4365 -14955:3:2427 -14956:0:4365 -14957:2:1455 -14958:0:4365 -14959:3:2428 -14960:0:4365 -14961:2:1652 -14962:0:4365 -14963:2:1653 -14964:0:4365 -14965:2:1657 -14966:0:4365 -14967:2:1660 -14968:0:4365 -14969:3:2427 -14970:0:4365 -14971:2:1665 -14972:2:1669 -14973:2:1670 -14974:2:1678 -14975:2:1679 -14976:2:1683 -14977:2:1684 -14978:2:1678 -14979:2:1679 -14980:2:1680 -14981:2:1692 -14982:2:1697 -14983:2:1701 -14984:2:1702 -14985:2:1709 -14986:2:1710 -14987:2:1721 -14988:2:1722 -14989:2:1723 -14990:2:1721 -14991:2:1722 -14992:2:1723 -14993:2:1734 -14994:2:1739 -14995:2:1740 -14996:0:4365 -14997:3:2428 -14998:0:4365 -14999:2:1752 -15000:0:4365 -15001:3:2427 -15002:0:4365 -15003:2:1754 -15004:0:4365 -15005:3:2428 -15006:0:4365 -15007:2:1755 -15008:2:1759 -15009:2:1760 -15010:2:1768 -15011:2:1769 -15012:2:1773 -15013:2:1774 -15014:2:1768 -15015:2:1769 -15016:2:1773 -15017:2:1774 -15018:2:1782 -15019:2:1787 -15020:2:1791 -15021:2:1792 -15022:2:1799 -15023:2:1800 -15024:2:1811 -15025:2:1812 -15026:2:1813 -15027:2:1811 -15028:2:1812 -15029:2:1813 -15030:2:1824 -15031:2:1829 -15032:2:1830 -15033:0:4365 -15034:2:1842 -15035:0:4365 -15036:3:2427 -15037:0:4365 -15038:2:1844 -15039:0:4363 -15040:3:2428 -15041:0:4369 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.define b/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.define deleted file mode 100644 index 0fb59bd..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_NEST_LEVEL 2 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.log b/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.log deleted file mode 100644 index d503334..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.log +++ /dev/null @@ -1,20 +0,0 @@ -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_nested.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 742) -Depth= 3880 States= 1e+06 Transitions= 1.18e+07 Memory= 527.190 t= 9.48 R= 1e+05 -Depth= 3880 States= 2e+06 Transitions= 2.39e+07 Memory= 588.225 t= 19.6 R= 1e+05 -Depth= 3880 States= 3e+06 Transitions= 3.61e+07 Memory= 649.260 t= 30.3 R= 1e+05 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.spin.input b/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.spin.input deleted file mode 100644 index c94928c..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.spin.input +++ /dev/null @@ -1,696 +0,0 @@ -#define READER_NEST_LEVEL 1 - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -#define TEST_SIGNAL -#define TEST_SIGNAL_ON_READ - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE -#define get_pid() ((_pid < 1) -> 0 : 1) -#elif defined(TEST_SIGNAL_ON_READ) -#define get_pid() ((_pid < 2) -> 0 : 1) -#else -#define get_pid() (_pid) -#endif - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb(i, j) -{ - if - :: get_pid() >= NR_READERS -> - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); - :: else -> skip; - fi; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -#define get_readerid() (get_pid()) -#define get_writerid() (get_readerid() + NR_READERS) - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - dispatch_sighand_read_exec(); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - dispatch_sighand_read_exec(); - data_access[get_readerid()] = 1; - ooo_mem(i); - dispatch_sighand_read_exec(); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - if - :: get_readerid() == 0 -> -progress_reader: - skip; - fi; -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - ooo_mem(i); - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - ooo_mem(i); - data_access[get_readerid()] = 1; - ooo_mem(i); - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS - /* Only test progress of one random reader. They are all the - * same. */ - if - :: get_readerid() == 0 -> -progress_reader: - skip; - fi; -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.spin.input.trail deleted file mode 100644 index 6f29ad2..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_nested.spin.input.trail +++ /dev/null @@ -1,11161 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4365 -2:4:4317 -3:4:4320 -4:4:4320 -5:4:4320 -6:4:4323 -7:4:4331 -8:4:4331 -9:4:4331 -10:4:4334 -11:4:4340 -12:4:4344 -13:4:4344 -14:4:4344 -15:4:4347 -16:4:4340 -17:4:4344 -18:4:4344 -19:4:4344 -20:4:4347 -21:4:4355 -22:4:4359 -23:4:4360 -24:0:4365 -25:4:4362 -26:0:4365 -27:3:2331 -28:0:4365 -29:3:2337 -30:0:4365 -31:3:2338 -32:0:4365 -33:3:2339 -34:3:2343 -35:3:2344 -36:3:2352 -37:3:2353 -38:3:2357 -39:3:2358 -40:3:2352 -41:3:2353 -42:3:2357 -43:3:2358 -44:3:2366 -45:3:2371 -46:3:2375 -47:3:2376 -48:3:2383 -49:3:2384 -50:3:2395 -51:3:2396 -52:3:2397 -53:3:2395 -54:3:2396 -55:3:2397 -56:3:2408 -57:3:2413 -58:3:2414 -59:0:4365 -60:3:2426 -61:0:4365 -62:3:2427 -63:0:4365 -64:2:1162 -65:0:4365 -66:3:2428 -67:0:4365 -68:2:1168 -69:0:4365 -70:2:1169 -71:0:4365 -72:3:2427 -73:0:4365 -74:2:1170 -75:0:4365 -76:3:2428 -77:0:4365 -78:3:2429 -79:0:4365 -80:3:2435 -81:3:2436 -82:0:4365 -83:3:2440 -84:3:2444 -85:3:2445 -86:3:2453 -87:3:2454 -88:3:2458 -89:3:2459 -90:3:2453 -91:3:2454 -92:3:2458 -93:3:2459 -94:3:2467 -95:3:2472 -96:3:2473 -97:3:2484 -98:3:2485 -99:3:2496 -100:3:2497 -101:3:2498 -102:3:2496 -103:3:2497 -104:3:2498 -105:3:2509 -106:3:2514 -107:3:2515 -108:0:4365 -109:3:2527 -110:0:4365 -111:3:2528 -112:0:4365 -113:2:1173 -114:0:4365 -115:3:2529 -116:0:4365 -117:2:1179 -118:0:4365 -119:2:1180 -120:0:4365 -121:3:2528 -122:0:4365 -123:2:1181 -124:2:1185 -125:2:1186 -126:2:1194 -127:2:1195 -128:2:1199 -129:2:1200 -130:2:1194 -131:2:1195 -132:2:1199 -133:2:1200 -134:2:1208 -135:2:1213 -136:2:1217 -137:2:1218 -138:2:1225 -139:2:1226 -140:2:1237 -141:2:1238 -142:2:1239 -143:2:1237 -144:2:1238 -145:2:1239 -146:2:1250 -147:2:1255 -148:2:1256 -149:0:4365 -150:3:2529 -151:0:4365 -152:2:1268 -153:0:4365 -154:3:2528 -155:0:4365 -156:2:1270 -157:0:4365 -158:3:2529 -159:0:4365 -160:2:1271 -161:2:1275 -162:2:1276 -163:2:1284 -164:2:1285 -165:2:1289 -166:2:1290 -167:2:1284 -168:2:1285 -169:2:1289 -170:2:1290 -171:2:1298 -172:2:1303 -173:2:1307 -174:2:1308 -175:2:1315 -176:2:1316 -177:2:1327 -178:2:1328 -179:2:1329 -180:2:1327 -181:2:1328 -182:2:1329 -183:2:1340 -184:2:1345 -185:2:1346 -186:0:4365 -187:2:1358 -188:0:4365 -189:2:1360 -190:0:4365 -191:3:2528 -192:0:4365 -193:2:1361 -194:0:4365 -195:3:2529 -196:0:4365 -197:2:1362 -198:2:1366 -199:2:1367 -200:2:1375 -201:2:1376 -202:2:1380 -203:2:1381 -204:2:1375 -205:2:1376 -206:2:1380 -207:2:1381 -208:2:1389 -209:2:1394 -210:2:1398 -211:2:1399 -212:2:1406 -213:2:1407 -214:2:1418 -215:2:1419 -216:2:1420 -217:2:1418 -218:2:1419 -219:2:1420 -220:2:1431 -221:2:1436 -222:2:1437 -223:0:4365 -224:2:1449 -225:0:4365 -226:3:2528 -227:0:4365 -228:2:1451 -229:0:4365 -230:3:2529 -231:0:4365 -232:2:1652 -233:0:4365 -234:2:1653 -235:0:4365 -236:2:1657 -237:0:4365 -238:2:1660 -239:0:4365 -240:3:2528 -241:0:4365 -242:2:1665 -243:2:1669 -244:2:1670 -245:2:1678 -246:2:1679 -247:2:1683 -248:2:1684 -249:2:1678 -250:2:1679 -251:2:1680 -252:2:1692 -253:2:1697 -254:2:1701 -255:2:1702 -256:2:1709 -257:2:1710 -258:2:1721 -259:2:1722 -260:2:1723 -261:2:1721 -262:2:1722 -263:2:1723 -264:2:1734 -265:2:1739 -266:2:1740 -267:0:4365 -268:3:2529 -269:0:4365 -270:2:1752 -271:0:4365 -272:3:2528 -273:0:4365 -274:2:1754 -275:0:4365 -276:3:2529 -277:0:4365 -278:2:1755 -279:2:1759 -280:2:1760 -281:2:1768 -282:2:1769 -283:2:1773 -284:2:1774 -285:2:1768 -286:2:1769 -287:2:1773 -288:2:1774 -289:2:1782 -290:2:1787 -291:2:1791 -292:2:1792 -293:2:1799 -294:2:1800 -295:2:1811 -296:2:1812 -297:2:1813 -298:2:1811 -299:2:1812 -300:2:1813 -301:2:1824 -302:2:1829 -303:2:1830 -304:0:4365 -305:2:1842 -306:0:4365 -307:3:2528 -308:0:4365 -309:2:1844 -310:0:4365 -311:3:2529 -312:0:4365 -313:2:1845 -314:2:1849 -315:2:1850 -316:2:1858 -317:2:1859 -318:2:1863 -319:2:1864 -320:2:1858 -321:2:1859 -322:2:1863 -323:2:1864 -324:2:1872 -325:2:1877 -326:2:1881 -327:2:1882 -328:2:1889 -329:2:1890 -330:2:1901 -331:2:1902 -332:2:1903 -333:2:1901 -334:2:1902 -335:2:1903 -336:2:1914 -337:2:1919 -338:2:1920 -339:0:4365 -340:2:1932 -341:0:4365 -342:3:2528 -343:0:4365 -344:2:1934 -345:0:4365 -346:3:2529 -347:0:4365 -348:2:1935 -349:0:4365 -350:2:1936 -351:0:4365 -352:2:2129 -353:0:4365 -354:2:2130 -355:0:4365 -356:2:2134 -357:0:4365 -358:3:2528 -359:0:4365 -360:2:2136 -361:0:4365 -362:3:2529 -363:0:4365 -364:2:2137 -365:2:2141 -366:2:2142 -367:2:2150 -368:2:2151 -369:2:2155 -370:2:2156 -371:2:2150 -372:2:2151 -373:2:2155 -374:2:2156 -375:2:2164 -376:2:2169 -377:2:2173 -378:2:2174 -379:2:2181 -380:2:2182 -381:2:2193 -382:2:2194 -383:2:2195 -384:2:2193 -385:2:2194 -386:2:2195 -387:2:2206 -388:2:2211 -389:2:2212 -390:0:4365 -391:2:2224 -392:0:4365 -393:3:2528 -394:0:4365 -395:2:2226 -396:0:4365 -397:3:2529 -398:0:4365 -399:2:2230 -400:0:4365 -401:3:2528 -402:0:4365 -403:2:2235 -404:2:2239 -405:2:2240 -406:2:2248 -407:2:2249 -408:2:2253 -409:2:2254 -410:2:2248 -411:2:2249 -412:2:2250 -413:2:2262 -414:2:2267 -415:2:2271 -416:2:2272 -417:2:2279 -418:2:2280 -419:2:2291 -420:2:2292 -421:2:2293 -422:2:2291 -423:2:2292 -424:2:2293 -425:2:2304 -426:2:2309 -427:2:2310 -428:0:4365 -429:3:2529 -430:0:4365 -431:2:2322 -432:0:4365 -433:2:1169 -434:0:4365 -435:3:2528 -436:0:4365 -437:2:1170 -438:0:4365 -439:3:2529 -440:0:4365 -441:3:2530 -442:0:4365 -443:3:2536 -444:0:4365 -445:3:2537 -446:0:4365 -447:3:2547 -448:0:4365 -449:3:2548 -450:0:4365 -451:3:2552 -452:3:2553 -453:3:2557 -454:3:2561 -455:3:2562 -456:3:2557 -457:3:2561 -458:3:2562 -459:3:2566 -460:3:2574 -461:3:2575 -462:3:2580 -463:3:2587 -464:3:2588 -465:3:2587 -466:3:2588 -467:3:2595 -468:3:2600 -469:0:4365 -470:3:2611 -471:0:4365 -472:3:2615 -473:3:2616 -474:3:2620 -475:3:2624 -476:3:2625 -477:3:2620 -478:3:2624 -479:3:2625 -480:3:2629 -481:3:2637 -482:3:2638 -483:3:2643 -484:3:2650 -485:3:2651 -486:3:2650 -487:3:2651 -488:3:2658 -489:3:2663 -490:0:4365 -491:3:2611 -492:0:4365 -493:3:2615 -494:3:2616 -495:3:2620 -496:3:2624 -497:3:2625 -498:3:2620 -499:3:2624 -500:3:2625 -501:3:2629 -502:3:2637 -503:3:2638 -504:3:2643 -505:3:2650 -506:3:2651 -507:3:2650 -508:3:2651 -509:3:2658 -510:3:2663 -511:0:4365 -512:3:2674 -513:0:4365 -514:3:2682 -515:3:2683 -516:3:2687 -517:3:2691 -518:3:2692 -519:3:2687 -520:3:2691 -521:3:2692 -522:3:2696 -523:3:2704 -524:3:2705 -525:3:2710 -526:3:2717 -527:3:2718 -528:3:2717 -529:3:2718 -530:3:2725 -531:3:2730 -532:0:4365 -533:3:2745 -534:0:4365 -535:3:2746 -536:0:4365 -537:2:1173 -538:0:4365 -539:3:2747 -540:0:4365 -541:2:1179 -542:0:4365 -543:2:1180 -544:0:4365 -545:3:2746 -546:0:4365 -547:2:1181 -548:2:1185 -549:2:1186 -550:2:1194 -551:2:1195 -552:2:1199 -553:2:1200 -554:2:1194 -555:2:1195 -556:2:1199 -557:2:1200 -558:2:1208 -559:2:1213 -560:2:1217 -561:2:1218 -562:2:1225 -563:2:1226 -564:2:1237 -565:2:1238 -566:2:1239 -567:2:1237 -568:2:1238 -569:2:1239 -570:2:1250 -571:2:1255 -572:2:1256 -573:0:4365 -574:3:2747 -575:0:4365 -576:2:1268 -577:0:4365 -578:3:2746 -579:0:4365 -580:2:1270 -581:0:4365 -582:3:2747 -583:0:4365 -584:2:1271 -585:2:1275 -586:2:1276 -587:2:1284 -588:2:1285 -589:2:1289 -590:2:1290 -591:2:1284 -592:2:1285 -593:2:1289 -594:2:1290 -595:2:1298 -596:2:1303 -597:2:1307 -598:2:1308 -599:2:1315 -600:2:1316 -601:2:1327 -602:2:1328 -603:2:1329 -604:2:1327 -605:2:1328 -606:2:1329 -607:2:1340 -608:2:1345 -609:2:1346 -610:0:4365 -611:2:1358 -612:0:4365 -613:2:1360 -614:0:4365 -615:3:2746 -616:0:4365 -617:2:1361 -618:0:4365 -619:3:2747 -620:0:4365 -621:2:1362 -622:2:1366 -623:2:1367 -624:2:1375 -625:2:1376 -626:2:1380 -627:2:1381 -628:2:1375 -629:2:1376 -630:2:1380 -631:2:1381 -632:2:1389 -633:2:1394 -634:2:1398 -635:2:1399 -636:2:1406 -637:2:1407 -638:2:1418 -639:2:1419 -640:2:1420 -641:2:1418 -642:2:1419 -643:2:1420 -644:2:1431 -645:2:1436 -646:2:1437 -647:0:4365 -648:2:1449 -649:0:4365 -650:3:2746 -651:0:4365 -652:2:1451 -653:0:4365 -654:3:2747 -655:0:4365 -656:2:1652 -657:0:4365 -658:2:1653 -659:0:4365 -660:2:1657 -661:0:4365 -662:2:1660 -663:0:4365 -664:3:2746 -665:0:4365 -666:2:1665 -667:2:1669 -668:2:1670 -669:2:1678 -670:2:1679 -671:2:1683 -672:2:1684 -673:2:1678 -674:2:1679 -675:2:1680 -676:2:1692 -677:2:1697 -678:2:1701 -679:2:1702 -680:2:1709 -681:2:1710 -682:2:1721 -683:2:1722 -684:2:1723 -685:2:1721 -686:2:1722 -687:2:1723 -688:2:1734 -689:2:1739 -690:2:1740 -691:0:4365 -692:3:2747 -693:0:4365 -694:2:1752 -695:0:4365 -696:3:2746 -697:0:4365 -698:2:1754 -699:0:4365 -700:3:2747 -701:0:4365 -702:2:1755 -703:2:1759 -704:2:1760 -705:2:1768 -706:2:1769 -707:2:1773 -708:2:1774 -709:2:1768 -710:2:1769 -711:2:1773 -712:2:1774 -713:2:1782 -714:2:1787 -715:2:1791 -716:2:1792 -717:2:1799 -718:2:1800 -719:2:1811 -720:2:1812 -721:2:1813 -722:2:1811 -723:2:1812 -724:2:1813 -725:2:1824 -726:2:1829 -727:2:1830 -728:0:4365 -729:2:1842 -730:0:4365 -731:3:2746 -732:0:4365 -733:2:1844 -734:0:4365 -735:3:2747 -736:0:4365 -737:2:1845 -738:2:1849 -739:2:1850 -740:2:1858 -741:2:1859 -742:2:1863 -743:2:1864 -744:2:1858 -745:2:1859 -746:2:1863 -747:2:1864 -748:2:1872 -749:2:1877 -750:2:1881 -751:2:1882 -752:2:1889 -753:2:1890 -754:2:1901 -755:2:1902 -756:2:1903 -757:2:1901 -758:2:1902 -759:2:1903 -760:2:1914 -761:2:1919 -762:2:1920 -763:0:4365 -764:2:1932 -765:0:4365 -766:3:2746 -767:0:4365 -768:2:1934 -769:0:4365 -770:3:2747 -771:0:4365 -772:2:1935 -773:0:4365 -774:2:1936 -775:0:4365 -776:2:2129 -777:0:4365 -778:2:2130 -779:0:4365 -780:2:2134 -781:0:4365 -782:3:2746 -783:0:4365 -784:2:2136 -785:0:4365 -786:3:2747 -787:0:4365 -788:2:2137 -789:2:2141 -790:2:2142 -791:2:2150 -792:2:2151 -793:2:2155 -794:2:2156 -795:2:2150 -796:2:2151 -797:2:2155 -798:2:2156 -799:2:2164 -800:2:2169 -801:2:2173 -802:2:2174 -803:2:2181 -804:2:2182 -805:2:2193 -806:2:2194 -807:2:2195 -808:2:2193 -809:2:2194 -810:2:2195 -811:2:2206 -812:2:2211 -813:2:2212 -814:0:4365 -815:2:2224 -816:0:4365 -817:3:2746 -818:0:4365 -819:2:2226 -820:0:4365 -821:3:2747 -822:0:4365 -823:2:2230 -824:0:4365 -825:3:2746 -826:0:4365 -827:2:2235 -828:2:2239 -829:2:2240 -830:2:2248 -831:2:2249 -832:2:2253 -833:2:2254 -834:2:2248 -835:2:2249 -836:2:2250 -837:2:2262 -838:2:2267 -839:2:2271 -840:2:2272 -841:2:2279 -842:2:2280 -843:2:2291 -844:2:2292 -845:2:2293 -846:2:2291 -847:2:2292 -848:2:2293 -849:2:2304 -850:2:2309 -851:2:2310 -852:0:4365 -853:3:2747 -854:0:4365 -855:2:2322 -856:0:4365 -857:2:1169 -858:0:4365 -859:3:2746 -860:0:4365 -861:2:1170 -862:0:4365 -863:3:2747 -864:0:4365 -865:3:2748 -866:0:4365 -867:3:2754 -868:0:4365 -869:3:2755 -870:3:2759 -871:3:2760 -872:3:2768 -873:3:2769 -874:3:2773 -875:3:2774 -876:3:2768 -877:3:2769 -878:3:2773 -879:3:2774 -880:3:2782 -881:3:2787 -882:3:2791 -883:3:2792 -884:3:2799 -885:3:2800 -886:3:2811 -887:3:2812 -888:3:2813 -889:3:2811 -890:3:2812 -891:3:2813 -892:3:2824 -893:3:2829 -894:3:2830 -895:0:4365 -896:3:2842 -897:0:4365 -898:3:2843 -899:0:4365 -900:2:1173 -901:0:4365 -902:3:2844 -903:0:4365 -904:2:1179 -905:0:4365 -906:2:1180 -907:0:4365 -908:3:2843 -909:0:4365 -910:2:1181 -911:2:1185 -912:2:1186 -913:2:1194 -914:2:1195 -915:2:1199 -916:2:1200 -917:2:1194 -918:2:1195 -919:2:1199 -920:2:1200 -921:2:1208 -922:2:1213 -923:2:1217 -924:2:1218 -925:2:1225 -926:2:1226 -927:2:1237 -928:2:1238 -929:2:1239 -930:2:1237 -931:2:1238 -932:2:1239 -933:2:1250 -934:2:1255 -935:2:1256 -936:0:4365 -937:3:2844 -938:0:4365 -939:2:1268 -940:0:4365 -941:3:2843 -942:0:4365 -943:2:1270 -944:0:4365 -945:3:2844 -946:0:4365 -947:2:1271 -948:2:1275 -949:2:1276 -950:2:1284 -951:2:1285 -952:2:1289 -953:2:1290 -954:2:1284 -955:2:1285 -956:2:1289 -957:2:1290 -958:2:1298 -959:2:1303 -960:2:1307 -961:2:1308 -962:2:1315 -963:2:1316 -964:2:1327 -965:2:1328 -966:2:1329 -967:2:1327 -968:2:1328 -969:2:1329 -970:2:1340 -971:2:1345 -972:2:1346 -973:0:4365 -974:2:1358 -975:0:4365 -976:2:1360 -977:0:4365 -978:3:2843 -979:0:4365 -980:2:1361 -981:0:4365 -982:3:2844 -983:0:4365 -984:2:1362 -985:2:1366 -986:2:1367 -987:2:1375 -988:2:1376 -989:2:1380 -990:2:1381 -991:2:1375 -992:2:1376 -993:2:1380 -994:2:1381 -995:2:1389 -996:2:1394 -997:2:1398 -998:2:1399 -999:2:1406 -1000:2:1407 -1001:2:1418 -1002:2:1419 -1003:2:1420 -1004:2:1418 -1005:2:1419 -1006:2:1420 -1007:2:1431 -1008:2:1436 -1009:2:1437 -1010:0:4365 -1011:2:1449 -1012:0:4365 -1013:3:2843 -1014:0:4365 -1015:2:1451 -1016:0:4365 -1017:3:2844 -1018:0:4365 -1019:2:1652 -1020:0:4365 -1021:2:1653 -1022:0:4365 -1023:2:1657 -1024:0:4365 -1025:2:1660 -1026:0:4365 -1027:3:2843 -1028:0:4365 -1029:2:1665 -1030:2:1669 -1031:2:1670 -1032:2:1678 -1033:2:1679 -1034:2:1683 -1035:2:1684 -1036:2:1678 -1037:2:1679 -1038:2:1680 -1039:2:1692 -1040:2:1697 -1041:2:1701 -1042:2:1702 -1043:2:1709 -1044:2:1710 -1045:2:1721 -1046:2:1722 -1047:2:1723 -1048:2:1721 -1049:2:1722 -1050:2:1723 -1051:2:1734 -1052:2:1739 -1053:2:1740 -1054:0:4365 -1055:3:2844 -1056:0:4365 -1057:2:1752 -1058:0:4365 -1059:3:2843 -1060:0:4365 -1061:2:1754 -1062:0:4365 -1063:3:2844 -1064:0:4365 -1065:2:1755 -1066:2:1759 -1067:2:1760 -1068:2:1768 -1069:2:1769 -1070:2:1773 -1071:2:1774 -1072:2:1768 -1073:2:1769 -1074:2:1773 -1075:2:1774 -1076:2:1782 -1077:2:1787 -1078:2:1791 -1079:2:1792 -1080:2:1799 -1081:2:1800 -1082:2:1811 -1083:2:1812 -1084:2:1813 -1085:2:1811 -1086:2:1812 -1087:2:1813 -1088:2:1824 -1089:2:1829 -1090:2:1830 -1091:0:4365 -1092:2:1842 -1093:0:4365 -1094:3:2843 -1095:0:4365 -1096:2:1844 -1097:0:4365 -1098:3:2844 -1099:0:4365 -1100:2:1845 -1101:2:1849 -1102:2:1850 -1103:2:1858 -1104:2:1859 -1105:2:1863 -1106:2:1864 -1107:2:1858 -1108:2:1859 -1109:2:1863 -1110:2:1864 -1111:2:1872 -1112:2:1877 -1113:2:1881 -1114:2:1882 -1115:2:1889 -1116:2:1890 -1117:2:1901 -1118:2:1902 -1119:2:1903 -1120:2:1901 -1121:2:1902 -1122:2:1903 -1123:2:1914 -1124:2:1919 -1125:2:1920 -1126:0:4365 -1127:2:1932 -1128:0:4365 -1129:3:2843 -1130:0:4365 -1131:2:1934 -1132:0:4365 -1133:3:2844 -1134:0:4365 -1135:2:1935 -1136:0:4365 -1137:2:1936 -1138:0:4365 -1139:2:2129 -1140:0:4365 -1141:2:2130 -1142:0:4365 -1143:2:2134 -1144:0:4365 -1145:3:2843 -1146:0:4365 -1147:2:2136 -1148:0:4365 -1149:3:2844 -1150:0:4365 -1151:2:2137 -1152:2:2141 -1153:2:2142 -1154:2:2150 -1155:2:2151 -1156:2:2155 -1157:2:2156 -1158:2:2150 -1159:2:2151 -1160:2:2155 -1161:2:2156 -1162:2:2164 -1163:2:2169 -1164:2:2173 -1165:2:2174 -1166:2:2181 -1167:2:2182 -1168:2:2193 -1169:2:2194 -1170:2:2195 -1171:2:2193 -1172:2:2194 -1173:2:2195 -1174:2:2206 -1175:2:2211 -1176:2:2212 -1177:0:4365 -1178:2:2224 -1179:0:4365 -1180:3:2843 -1181:0:4365 -1182:2:2226 -1183:0:4365 -1184:3:2844 -1185:0:4365 -1186:2:2230 -1187:0:4365 -1188:3:2843 -1189:0:4365 -1190:2:2235 -1191:2:2239 -1192:2:2240 -1193:2:2248 -1194:2:2249 -1195:2:2253 -1196:2:2254 -1197:2:2248 -1198:2:2249 -1199:2:2250 -1200:2:2262 -1201:2:2267 -1202:2:2271 -1203:2:2272 -1204:2:2279 -1205:2:2280 -1206:2:2291 -1207:2:2292 -1208:2:2293 -1209:2:2291 -1210:2:2292 -1211:2:2293 -1212:2:2304 -1213:2:2309 -1214:2:2310 -1215:0:4365 -1216:3:2844 -1217:0:4365 -1218:2:2322 -1219:0:4365 -1220:2:1169 -1221:0:4365 -1222:3:2843 -1223:0:4365 -1224:2:1170 -1225:0:4365 -1226:3:2844 -1227:0:4365 -1228:3:2845 -1229:0:4365 -1230:3:2851 -1231:0:4365 -1232:3:2854 -1233:3:2855 -1234:3:2867 -1235:3:2868 -1236:3:2872 -1237:3:2873 -1238:3:2867 -1239:3:2868 -1240:3:2872 -1241:3:2873 -1242:3:2881 -1243:3:2886 -1244:3:2890 -1245:3:2891 -1246:3:2898 -1247:3:2899 -1248:3:2910 -1249:3:2911 -1250:3:2912 -1251:3:2910 -1252:3:2911 -1253:3:2912 -1254:3:2923 -1255:3:2928 -1256:3:2929 -1257:0:4365 -1258:3:2941 -1259:0:4365 -1260:3:2942 -1261:0:4365 -1262:2:1173 -1263:0:4365 -1264:3:2943 -1265:0:4365 -1266:2:1179 -1267:0:4365 -1268:2:1180 -1269:0:4365 -1270:3:2942 -1271:0:4365 -1272:2:1181 -1273:2:1185 -1274:2:1186 -1275:2:1194 -1276:2:1195 -1277:2:1199 -1278:2:1200 -1279:2:1194 -1280:2:1195 -1281:2:1199 -1282:2:1200 -1283:2:1208 -1284:2:1213 -1285:2:1217 -1286:2:1218 -1287:2:1225 -1288:2:1226 -1289:2:1237 -1290:2:1238 -1291:2:1239 -1292:2:1237 -1293:2:1238 -1294:2:1239 -1295:2:1250 -1296:2:1255 -1297:2:1256 -1298:0:4365 -1299:3:2943 -1300:0:4365 -1301:2:1268 -1302:0:4365 -1303:3:2942 -1304:0:4365 -1305:2:1270 -1306:0:4365 -1307:3:2943 -1308:0:4365 -1309:2:1271 -1310:2:1275 -1311:2:1276 -1312:2:1284 -1313:2:1285 -1314:2:1289 -1315:2:1290 -1316:2:1284 -1317:2:1285 -1318:2:1289 -1319:2:1290 -1320:2:1298 -1321:2:1303 -1322:2:1307 -1323:2:1308 -1324:2:1315 -1325:2:1316 -1326:2:1327 -1327:2:1328 -1328:2:1329 -1329:2:1327 -1330:2:1328 -1331:2:1329 -1332:2:1340 -1333:2:1345 -1334:2:1346 -1335:0:4365 -1336:2:1358 -1337:0:4365 -1338:2:1360 -1339:0:4365 -1340:3:2942 -1341:0:4365 -1342:2:1361 -1343:0:4365 -1344:3:2943 -1345:0:4365 -1346:2:1362 -1347:2:1366 -1348:2:1367 -1349:2:1375 -1350:2:1376 -1351:2:1380 -1352:2:1381 -1353:2:1375 -1354:2:1376 -1355:2:1380 -1356:2:1381 -1357:2:1389 -1358:2:1394 -1359:2:1398 -1360:2:1399 -1361:2:1406 -1362:2:1407 -1363:2:1418 -1364:2:1419 -1365:2:1420 -1366:2:1418 -1367:2:1419 -1368:2:1420 -1369:2:1431 -1370:2:1436 -1371:2:1437 -1372:0:4365 -1373:2:1449 -1374:0:4365 -1375:3:2942 -1376:0:4365 -1377:2:1451 -1378:0:4365 -1379:3:2943 -1380:0:4365 -1381:2:1652 -1382:0:4365 -1383:2:1653 -1384:0:4365 -1385:2:1657 -1386:0:4365 -1387:2:1660 -1388:0:4365 -1389:3:2942 -1390:0:4365 -1391:2:1665 -1392:2:1669 -1393:2:1670 -1394:2:1678 -1395:2:1679 -1396:2:1683 -1397:2:1684 -1398:2:1678 -1399:2:1679 -1400:2:1680 -1401:2:1692 -1402:2:1697 -1403:2:1701 -1404:2:1702 -1405:2:1709 -1406:2:1710 -1407:2:1721 -1408:2:1722 -1409:2:1723 -1410:2:1721 -1411:2:1722 -1412:2:1723 -1413:2:1734 -1414:2:1739 -1415:2:1740 -1416:0:4365 -1417:3:2943 -1418:0:4365 -1419:2:1752 -1420:0:4365 -1421:3:2942 -1422:0:4365 -1423:2:1754 -1424:0:4365 -1425:3:2943 -1426:0:4365 -1427:2:1755 -1428:2:1759 -1429:2:1760 -1430:2:1768 -1431:2:1769 -1432:2:1773 -1433:2:1774 -1434:2:1768 -1435:2:1769 -1436:2:1773 -1437:2:1774 -1438:2:1782 -1439:2:1787 -1440:2:1791 -1441:2:1792 -1442:2:1799 -1443:2:1800 -1444:2:1811 -1445:2:1812 -1446:2:1813 -1447:2:1811 -1448:2:1812 -1449:2:1813 -1450:2:1824 -1451:2:1829 -1452:2:1830 -1453:0:4365 -1454:2:1842 -1455:0:4365 -1456:3:2942 -1457:0:4365 -1458:2:1844 -1459:0:4365 -1460:3:2943 -1461:0:4365 -1462:2:1845 -1463:2:1849 -1464:2:1850 -1465:2:1858 -1466:2:1859 -1467:2:1863 -1468:2:1864 -1469:2:1858 -1470:2:1859 -1471:2:1863 -1472:2:1864 -1473:2:1872 -1474:2:1877 -1475:2:1881 -1476:2:1882 -1477:2:1889 -1478:2:1890 -1479:2:1901 -1480:2:1902 -1481:2:1903 -1482:2:1901 -1483:2:1902 -1484:2:1903 -1485:2:1914 -1486:2:1919 -1487:2:1920 -1488:0:4365 -1489:2:1932 -1490:0:4365 -1491:3:2942 -1492:0:4365 -1493:2:1934 -1494:0:4365 -1495:3:2943 -1496:0:4365 -1497:2:1935 -1498:0:4365 -1499:2:1936 -1500:0:4365 -1501:2:2129 -1502:0:4365 -1503:2:2130 -1504:0:4365 -1505:2:2134 -1506:0:4365 -1507:3:2942 -1508:0:4365 -1509:2:2136 -1510:0:4365 -1511:3:2943 -1512:0:4365 -1513:2:2137 -1514:2:2141 -1515:2:2142 -1516:2:2150 -1517:2:2151 -1518:2:2155 -1519:2:2156 -1520:2:2150 -1521:2:2151 -1522:2:2155 -1523:2:2156 -1524:2:2164 -1525:2:2169 -1526:2:2173 -1527:2:2174 -1528:2:2181 -1529:2:2182 -1530:2:2193 -1531:2:2194 -1532:2:2195 -1533:2:2193 -1534:2:2194 -1535:2:2195 -1536:2:2206 -1537:2:2211 -1538:2:2212 -1539:0:4365 -1540:2:2224 -1541:0:4365 -1542:3:2942 -1543:0:4365 -1544:2:2226 -1545:0:4365 -1546:3:2943 -1547:0:4365 -1548:2:2230 -1549:0:4365 -1550:3:2942 -1551:0:4365 -1552:2:2235 -1553:2:2239 -1554:2:2240 -1555:2:2248 -1556:2:2249 -1557:2:2253 -1558:2:2254 -1559:2:2248 -1560:2:2249 -1561:2:2250 -1562:2:2262 -1563:2:2267 -1564:2:2271 -1565:2:2272 -1566:2:2279 -1567:2:2280 -1568:2:2291 -1569:2:2292 -1570:2:2293 -1571:2:2291 -1572:2:2292 -1573:2:2293 -1574:2:2304 -1575:2:2309 -1576:2:2310 -1577:0:4365 -1578:3:2943 -1579:0:4365 -1580:2:2322 -1581:0:4365 -1582:2:1169 -1583:0:4365 -1584:3:2942 -1585:0:4365 -1586:2:1170 -1587:0:4365 -1588:3:2943 -1589:0:4365 -1590:3:2944 -1591:0:4365 -1592:3:2950 -1593:0:4365 -1594:3:2951 -1595:0:4365 -1596:3:2952 -1597:0:4365 -1598:3:2953 -1599:0:4365 -1600:3:2954 -1601:3:2958 -1602:3:2959 -1603:3:2967 -1604:3:2968 -1605:3:2972 -1606:3:2973 -1607:3:2967 -1608:3:2968 -1609:3:2972 -1610:3:2973 -1611:3:2981 -1612:3:2986 -1613:3:2990 -1614:3:2991 -1615:3:2998 -1616:3:2999 -1617:3:3010 -1618:3:3011 -1619:3:3012 -1620:3:3010 -1621:3:3011 -1622:3:3012 -1623:3:3023 -1624:3:3028 -1625:3:3029 -1626:0:4365 -1627:3:3041 -1628:0:4365 -1629:3:3042 -1630:0:4365 -1631:2:1173 -1632:0:4365 -1633:3:3043 -1634:0:4365 -1635:2:1179 -1636:0:4365 -1637:2:1180 -1638:0:4365 -1639:3:3042 -1640:0:4365 -1641:2:1181 -1642:2:1185 -1643:2:1186 -1644:2:1194 -1645:2:1195 -1646:2:1199 -1647:2:1200 -1648:2:1194 -1649:2:1195 -1650:2:1199 -1651:2:1200 -1652:2:1208 -1653:2:1213 -1654:2:1217 -1655:2:1218 -1656:2:1225 -1657:2:1226 -1658:2:1237 -1659:2:1238 -1660:2:1239 -1661:2:1237 -1662:2:1238 -1663:2:1239 -1664:2:1250 -1665:2:1255 -1666:2:1256 -1667:0:4365 -1668:3:3043 -1669:0:4365 -1670:2:1268 -1671:0:4365 -1672:3:3042 -1673:0:4365 -1674:2:1270 -1675:0:4365 -1676:3:3043 -1677:0:4365 -1678:2:1271 -1679:2:1275 -1680:2:1276 -1681:2:1284 -1682:2:1285 -1683:2:1289 -1684:2:1290 -1685:2:1284 -1686:2:1285 -1687:2:1289 -1688:2:1290 -1689:2:1298 -1690:2:1303 -1691:2:1307 -1692:2:1308 -1693:2:1315 -1694:2:1316 -1695:2:1327 -1696:2:1328 -1697:2:1329 -1698:2:1327 -1699:2:1328 -1700:2:1329 -1701:2:1340 -1702:2:1345 -1703:2:1346 -1704:0:4365 -1705:2:1358 -1706:0:4365 -1707:2:1360 -1708:0:4365 -1709:3:3042 -1710:0:4365 -1711:2:1361 -1712:0:4365 -1713:3:3043 -1714:0:4365 -1715:2:1362 -1716:2:1366 -1717:2:1367 -1718:2:1375 -1719:2:1376 -1720:2:1380 -1721:2:1381 -1722:2:1375 -1723:2:1376 -1724:2:1380 -1725:2:1381 -1726:2:1389 -1727:2:1394 -1728:2:1398 -1729:2:1399 -1730:2:1406 -1731:2:1407 -1732:2:1418 -1733:2:1419 -1734:2:1420 -1735:2:1418 -1736:2:1419 -1737:2:1420 -1738:2:1431 -1739:2:1436 -1740:2:1437 -1741:0:4365 -1742:2:1449 -1743:0:4365 -1744:3:3042 -1745:0:4365 -1746:2:1451 -1747:0:4365 -1748:3:3043 -1749:0:4365 -1750:2:1652 -1751:0:4365 -1752:2:1653 -1753:0:4365 -1754:2:1657 -1755:0:4365 -1756:2:1660 -1757:0:4365 -1758:3:3042 -1759:0:4365 -1760:2:1665 -1761:2:1669 -1762:2:1670 -1763:2:1678 -1764:2:1679 -1765:2:1683 -1766:2:1684 -1767:2:1678 -1768:2:1679 -1769:2:1680 -1770:2:1692 -1771:2:1697 -1772:2:1701 -1773:2:1702 -1774:2:1709 -1775:2:1710 -1776:2:1721 -1777:2:1722 -1778:2:1723 -1779:2:1721 -1780:2:1722 -1781:2:1723 -1782:2:1734 -1783:2:1739 -1784:2:1740 -1785:0:4365 -1786:3:3043 -1787:0:4365 -1788:2:1752 -1789:0:4365 -1790:3:3042 -1791:0:4365 -1792:2:1754 -1793:0:4365 -1794:3:3043 -1795:0:4365 -1796:2:1755 -1797:2:1759 -1798:2:1760 -1799:2:1768 -1800:2:1769 -1801:2:1773 -1802:2:1774 -1803:2:1768 -1804:2:1769 -1805:2:1773 -1806:2:1774 -1807:2:1782 -1808:2:1787 -1809:2:1791 -1810:2:1792 -1811:2:1799 -1812:2:1800 -1813:2:1811 -1814:2:1812 -1815:2:1813 -1816:2:1811 -1817:2:1812 -1818:2:1813 -1819:2:1824 -1820:2:1829 -1821:2:1830 -1822:0:4365 -1823:2:1842 -1824:0:4365 -1825:3:3042 -1826:0:4365 -1827:2:1844 -1828:0:4365 -1829:3:3043 -1830:0:4365 -1831:2:1845 -1832:2:1849 -1833:2:1850 -1834:2:1858 -1835:2:1859 -1836:2:1863 -1837:2:1864 -1838:2:1858 -1839:2:1859 -1840:2:1863 -1841:2:1864 -1842:2:1872 -1843:2:1877 -1844:2:1881 -1845:2:1882 -1846:2:1889 -1847:2:1890 -1848:2:1901 -1849:2:1902 -1850:2:1903 -1851:2:1901 -1852:2:1902 -1853:2:1903 -1854:2:1914 -1855:2:1919 -1856:2:1920 -1857:0:4365 -1858:2:1932 -1859:0:4365 -1860:3:3042 -1861:0:4365 -1862:2:1934 -1863:0:4365 -1864:3:3043 -1865:0:4365 -1866:2:1935 -1867:0:4365 -1868:2:1936 -1869:0:4365 -1870:2:2129 -1871:0:4365 -1872:2:2130 -1873:0:4365 -1874:2:2134 -1875:0:4365 -1876:3:3042 -1877:0:4365 -1878:2:2136 -1879:0:4365 -1880:3:3043 -1881:0:4365 -1882:2:2137 -1883:2:2141 -1884:2:2142 -1885:2:2150 -1886:2:2151 -1887:2:2155 -1888:2:2156 -1889:2:2150 -1890:2:2151 -1891:2:2155 -1892:2:2156 -1893:2:2164 -1894:2:2169 -1895:2:2173 -1896:2:2174 -1897:2:2181 -1898:2:2182 -1899:2:2193 -1900:2:2194 -1901:2:2195 -1902:2:2193 -1903:2:2194 -1904:2:2195 -1905:2:2206 -1906:2:2211 -1907:2:2212 -1908:0:4365 -1909:2:2224 -1910:0:4365 -1911:3:3042 -1912:0:4365 -1913:2:2226 -1914:0:4365 -1915:3:3043 -1916:0:4365 -1917:2:2230 -1918:0:4365 -1919:3:3042 -1920:0:4365 -1921:2:2235 -1922:2:2239 -1923:2:2240 -1924:2:2248 -1925:2:2249 -1926:2:2253 -1927:2:2254 -1928:2:2248 -1929:2:2249 -1930:2:2250 -1931:2:2262 -1932:2:2267 -1933:2:2271 -1934:2:2272 -1935:2:2279 -1936:2:2280 -1937:2:2291 -1938:2:2292 -1939:2:2293 -1940:2:2291 -1941:2:2292 -1942:2:2293 -1943:2:2304 -1944:2:2309 -1945:2:2310 -1946:0:4365 -1947:3:3043 -1948:0:4365 -1949:2:2322 -1950:0:4365 -1951:2:1169 -1952:0:4365 -1953:3:3042 -1954:0:4365 -1955:2:1170 -1956:0:4365 -1957:3:3043 -1958:0:4365 -1959:3:3044 -1960:0:4365 -1961:3:3257 -1962:0:4365 -1963:3:3265 -1964:0:4365 -1965:3:3266 -1966:3:3270 -1967:3:3271 -1968:3:3279 -1969:3:3280 -1970:3:3284 -1971:3:3285 -1972:3:3279 -1973:3:3280 -1974:3:3284 -1975:3:3285 -1976:3:3293 -1977:3:3298 -1978:3:3302 -1979:3:3303 -1980:3:3310 -1981:3:3311 -1982:3:3322 -1983:3:3323 -1984:3:3324 -1985:3:3322 -1986:3:3323 -1987:3:3324 -1988:3:3335 -1989:3:3340 -1990:3:3341 -1991:0:4365 -1992:3:3353 -1993:0:4365 -1994:3:3354 -1995:0:4365 -1996:2:1173 -1997:0:4365 -1998:3:3355 -1999:0:4365 -2000:2:1179 -2001:0:4365 -2002:2:1180 -2003:0:4365 -2004:3:3354 -2005:0:4365 -2006:2:1181 -2007:2:1185 -2008:2:1186 -2009:2:1194 -2010:2:1195 -2011:2:1199 -2012:2:1200 -2013:2:1194 -2014:2:1195 -2015:2:1199 -2016:2:1200 -2017:2:1208 -2018:2:1213 -2019:2:1217 -2020:2:1218 -2021:2:1225 -2022:2:1226 -2023:2:1237 -2024:2:1238 -2025:2:1239 -2026:2:1237 -2027:2:1238 -2028:2:1239 -2029:2:1250 -2030:2:1255 -2031:2:1256 -2032:0:4365 -2033:3:3355 -2034:0:4365 -2035:2:1268 -2036:0:4365 -2037:3:3354 -2038:0:4365 -2039:2:1270 -2040:0:4365 -2041:3:3355 -2042:0:4365 -2043:2:1271 -2044:2:1275 -2045:2:1276 -2046:2:1284 -2047:2:1285 -2048:2:1289 -2049:2:1290 -2050:2:1284 -2051:2:1285 -2052:2:1289 -2053:2:1290 -2054:2:1298 -2055:2:1303 -2056:2:1307 -2057:2:1308 -2058:2:1315 -2059:2:1316 -2060:2:1327 -2061:2:1328 -2062:2:1329 -2063:2:1327 -2064:2:1328 -2065:2:1329 -2066:2:1340 -2067:2:1345 -2068:2:1346 -2069:0:4365 -2070:2:1358 -2071:0:4365 -2072:2:1360 -2073:0:4365 -2074:3:3354 -2075:0:4365 -2076:2:1361 -2077:0:4365 -2078:3:3355 -2079:0:4365 -2080:2:1362 -2081:2:1366 -2082:2:1367 -2083:2:1375 -2084:2:1376 -2085:2:1380 -2086:2:1381 -2087:2:1375 -2088:2:1376 -2089:2:1380 -2090:2:1381 -2091:2:1389 -2092:2:1394 -2093:2:1398 -2094:2:1399 -2095:2:1406 -2096:2:1407 -2097:2:1418 -2098:2:1419 -2099:2:1420 -2100:2:1418 -2101:2:1419 -2102:2:1420 -2103:2:1431 -2104:2:1436 -2105:2:1437 -2106:0:4365 -2107:2:1449 -2108:0:4365 -2109:3:3354 -2110:0:4365 -2111:2:1451 -2112:0:4365 -2113:3:3355 -2114:0:4365 -2115:2:1652 -2116:0:4365 -2117:2:1653 -2118:0:4365 -2119:2:1657 -2120:0:4365 -2121:2:1660 -2122:0:4365 -2123:3:3354 -2124:0:4365 -2125:2:1665 -2126:2:1669 -2127:2:1670 -2128:2:1678 -2129:2:1679 -2130:2:1683 -2131:2:1684 -2132:2:1678 -2133:2:1679 -2134:2:1680 -2135:2:1692 -2136:2:1697 -2137:2:1701 -2138:2:1702 -2139:2:1709 -2140:2:1710 -2141:2:1721 -2142:2:1722 -2143:2:1723 -2144:2:1721 -2145:2:1722 -2146:2:1723 -2147:2:1734 -2148:2:1739 -2149:2:1740 -2150:0:4365 -2151:3:3355 -2152:0:4365 -2153:2:1752 -2154:0:4365 -2155:3:3354 -2156:0:4365 -2157:2:1754 -2158:0:4365 -2159:3:3355 -2160:0:4365 -2161:2:1755 -2162:2:1759 -2163:2:1760 -2164:2:1768 -2165:2:1769 -2166:2:1773 -2167:2:1774 -2168:2:1768 -2169:2:1769 -2170:2:1773 -2171:2:1774 -2172:2:1782 -2173:2:1787 -2174:2:1791 -2175:2:1792 -2176:2:1799 -2177:2:1800 -2178:2:1811 -2179:2:1812 -2180:2:1813 -2181:2:1811 -2182:2:1812 -2183:2:1813 -2184:2:1824 -2185:2:1829 -2186:2:1830 -2187:0:4365 -2188:2:1842 -2189:0:4365 -2190:3:3354 -2191:0:4365 -2192:2:1844 -2193:0:4365 -2194:3:3355 -2195:0:4365 -2196:2:1845 -2197:2:1849 -2198:2:1850 -2199:2:1858 -2200:2:1859 -2201:2:1863 -2202:2:1864 -2203:2:1858 -2204:2:1859 -2205:2:1863 -2206:2:1864 -2207:2:1872 -2208:2:1877 -2209:2:1881 -2210:2:1882 -2211:2:1889 -2212:2:1890 -2213:2:1901 -2214:2:1902 -2215:2:1903 -2216:2:1901 -2217:2:1902 -2218:2:1903 -2219:2:1914 -2220:2:1919 -2221:2:1920 -2222:0:4365 -2223:2:1932 -2224:0:4365 -2225:3:3354 -2226:0:4365 -2227:2:1934 -2228:0:4365 -2229:3:3355 -2230:0:4365 -2231:2:1935 -2232:0:4365 -2233:2:1936 -2234:0:4365 -2235:2:2129 -2236:0:4365 -2237:2:2130 -2238:0:4365 -2239:2:2134 -2240:0:4365 -2241:3:3354 -2242:0:4365 -2243:2:2136 -2244:0:4365 -2245:3:3355 -2246:0:4365 -2247:2:2137 -2248:2:2141 -2249:2:2142 -2250:2:2150 -2251:2:2151 -2252:2:2155 -2253:2:2156 -2254:2:2150 -2255:2:2151 -2256:2:2155 -2257:2:2156 -2258:2:2164 -2259:2:2169 -2260:2:2173 -2261:2:2174 -2262:2:2181 -2263:2:2182 -2264:2:2193 -2265:2:2194 -2266:2:2195 -2267:2:2193 -2268:2:2194 -2269:2:2195 -2270:2:2206 -2271:2:2211 -2272:2:2212 -2273:0:4365 -2274:2:2224 -2275:0:4365 -2276:3:3354 -2277:0:4365 -2278:2:2226 -2279:0:4365 -2280:3:3355 -2281:0:4365 -2282:2:2230 -2283:0:4365 -2284:3:3354 -2285:0:4365 -2286:2:2235 -2287:2:2239 -2288:2:2240 -2289:2:2248 -2290:2:2249 -2291:2:2253 -2292:2:2254 -2293:2:2248 -2294:2:2249 -2295:2:2250 -2296:2:2262 -2297:2:2267 -2298:2:2271 -2299:2:2272 -2300:2:2279 -2301:2:2280 -2302:2:2291 -2303:2:2292 -2304:2:2293 -2305:2:2291 -2306:2:2292 -2307:2:2293 -2308:2:2304 -2309:2:2309 -2310:2:2310 -2311:0:4365 -2312:3:3355 -2313:0:4365 -2314:2:2322 -2315:0:4365 -2316:2:1169 -2317:0:4365 -2318:3:3354 -2319:0:4365 -2320:2:1170 -2321:0:4365 -2322:3:3355 -2323:0:4365 -2324:3:3356 -2325:0:4365 -2326:3:3366 -2327:0:4365 -2328:3:2951 -2329:0:4365 -2330:3:2952 -2331:0:4365 -2332:3:2953 -2333:0:4365 -2334:3:2954 -2335:3:2958 -2336:3:2959 -2337:3:2967 -2338:3:2968 -2339:3:2972 -2340:3:2973 -2341:3:2967 -2342:3:2968 -2343:3:2972 -2344:3:2973 -2345:3:2981 -2346:3:2986 -2347:3:2990 -2348:3:2991 -2349:3:2998 -2350:3:2999 -2351:3:3010 -2352:3:3011 -2353:3:3012 -2354:3:3010 -2355:3:3011 -2356:3:3012 -2357:3:3023 -2358:3:3028 -2359:3:3029 -2360:0:4365 -2361:3:3041 -2362:0:4365 -2363:3:3042 -2364:0:4365 -2365:2:1173 -2366:0:4365 -2367:3:3043 -2368:0:4365 -2369:2:1179 -2370:0:4365 -2371:2:1180 -2372:0:4365 -2373:3:3042 -2374:0:4365 -2375:2:1181 -2376:2:1185 -2377:2:1186 -2378:2:1194 -2379:2:1195 -2380:2:1199 -2381:2:1200 -2382:2:1194 -2383:2:1195 -2384:2:1199 -2385:2:1200 -2386:2:1208 -2387:2:1213 -2388:2:1217 -2389:2:1218 -2390:2:1225 -2391:2:1226 -2392:2:1237 -2393:2:1238 -2394:2:1239 -2395:2:1237 -2396:2:1238 -2397:2:1239 -2398:2:1250 -2399:2:1255 -2400:2:1256 -2401:0:4365 -2402:3:3043 -2403:0:4365 -2404:2:1268 -2405:0:4365 -2406:3:3042 -2407:0:4365 -2408:2:1270 -2409:0:4365 -2410:3:3043 -2411:0:4365 -2412:2:1271 -2413:2:1275 -2414:2:1276 -2415:2:1284 -2416:2:1285 -2417:2:1289 -2418:2:1290 -2419:2:1284 -2420:2:1285 -2421:2:1289 -2422:2:1290 -2423:2:1298 -2424:2:1303 -2425:2:1307 -2426:2:1308 -2427:2:1315 -2428:2:1316 -2429:2:1327 -2430:2:1328 -2431:2:1329 -2432:2:1327 -2433:2:1328 -2434:2:1329 -2435:2:1340 -2436:2:1345 -2437:2:1346 -2438:0:4365 -2439:2:1358 -2440:0:4365 -2441:2:1360 -2442:0:4365 -2443:3:3042 -2444:0:4365 -2445:2:1361 -2446:0:4365 -2447:3:3043 -2448:0:4365 -2449:2:1362 -2450:2:1366 -2451:2:1367 -2452:2:1375 -2453:2:1376 -2454:2:1380 -2455:2:1381 -2456:2:1375 -2457:2:1376 -2458:2:1380 -2459:2:1381 -2460:2:1389 -2461:2:1394 -2462:2:1398 -2463:2:1399 -2464:2:1406 -2465:2:1407 -2466:2:1418 -2467:2:1419 -2468:2:1420 -2469:2:1418 -2470:2:1419 -2471:2:1420 -2472:2:1431 -2473:2:1436 -2474:2:1437 -2475:0:4365 -2476:2:1449 -2477:0:4365 -2478:3:3042 -2479:0:4365 -2480:2:1451 -2481:0:4365 -2482:3:3043 -2483:0:4365 -2484:2:1652 -2485:0:4365 -2486:2:1653 -2487:0:4365 -2488:2:1657 -2489:0:4365 -2490:2:1660 -2491:0:4365 -2492:3:3042 -2493:0:4365 -2494:2:1665 -2495:2:1669 -2496:2:1670 -2497:2:1678 -2498:2:1679 -2499:2:1683 -2500:2:1684 -2501:2:1678 -2502:2:1679 -2503:2:1680 -2504:2:1692 -2505:2:1697 -2506:2:1701 -2507:2:1702 -2508:2:1709 -2509:2:1710 -2510:2:1721 -2511:2:1722 -2512:2:1723 -2513:2:1721 -2514:2:1722 -2515:2:1723 -2516:2:1734 -2517:2:1739 -2518:2:1740 -2519:0:4365 -2520:3:3043 -2521:0:4365 -2522:2:1752 -2523:0:4365 -2524:3:3042 -2525:0:4365 -2526:2:1754 -2527:0:4365 -2528:3:3043 -2529:0:4365 -2530:2:1755 -2531:2:1759 -2532:2:1760 -2533:2:1768 -2534:2:1769 -2535:2:1773 -2536:2:1774 -2537:2:1768 -2538:2:1769 -2539:2:1773 -2540:2:1774 -2541:2:1782 -2542:2:1787 -2543:2:1791 -2544:2:1792 -2545:2:1799 -2546:2:1800 -2547:2:1811 -2548:2:1812 -2549:2:1813 -2550:2:1811 -2551:2:1812 -2552:2:1813 -2553:2:1824 -2554:2:1829 -2555:2:1830 -2556:0:4365 -2557:2:1842 -2558:0:4365 -2559:3:3042 -2560:0:4365 -2561:2:1844 -2562:0:4365 -2563:3:3043 -2564:0:4365 -2565:2:1845 -2566:2:1849 -2567:2:1850 -2568:2:1858 -2569:2:1859 -2570:2:1863 -2571:2:1864 -2572:2:1858 -2573:2:1859 -2574:2:1863 -2575:2:1864 -2576:2:1872 -2577:2:1877 -2578:2:1881 -2579:2:1882 -2580:2:1889 -2581:2:1890 -2582:2:1901 -2583:2:1902 -2584:2:1903 -2585:2:1901 -2586:2:1902 -2587:2:1903 -2588:2:1914 -2589:2:1919 -2590:2:1920 -2591:0:4365 -2592:2:1932 -2593:0:4365 -2594:3:3042 -2595:0:4365 -2596:2:1934 -2597:0:4365 -2598:3:3043 -2599:0:4365 -2600:2:1935 -2601:0:4365 -2602:2:1936 -2603:0:4365 -2604:2:2129 -2605:0:4365 -2606:2:2130 -2607:0:4365 -2608:2:2134 -2609:0:4365 -2610:3:3042 -2611:0:4365 -2612:2:2136 -2613:0:4365 -2614:3:3043 -2615:0:4365 -2616:2:2137 -2617:2:2141 -2618:2:2142 -2619:2:2150 -2620:2:2151 -2621:2:2155 -2622:2:2156 -2623:2:2150 -2624:2:2151 -2625:2:2155 -2626:2:2156 -2627:2:2164 -2628:2:2169 -2629:2:2173 -2630:2:2174 -2631:2:2181 -2632:2:2182 -2633:2:2193 -2634:2:2194 -2635:2:2195 -2636:2:2193 -2637:2:2194 -2638:2:2195 -2639:2:2206 -2640:2:2211 -2641:2:2212 -2642:0:4365 -2643:2:2224 -2644:0:4365 -2645:3:3042 -2646:0:4365 -2647:2:2226 -2648:0:4365 -2649:3:3043 -2650:0:4365 -2651:2:2230 -2652:0:4365 -2653:3:3042 -2654:0:4365 -2655:2:2235 -2656:2:2239 -2657:2:2240 -2658:2:2248 -2659:2:2249 -2660:2:2253 -2661:2:2254 -2662:2:2248 -2663:2:2249 -2664:2:2250 -2665:2:2262 -2666:2:2267 -2667:2:2271 -2668:2:2272 -2669:2:2279 -2670:2:2280 -2671:2:2291 -2672:2:2292 -2673:2:2293 -2674:2:2291 -2675:2:2292 -2676:2:2293 -2677:2:2304 -2678:2:2309 -2679:2:2310 -2680:0:4365 -2681:3:3043 -2682:0:4365 -2683:2:2322 -2684:0:4365 -2685:2:1169 -2686:0:4365 -2687:3:3042 -2688:0:4365 -2689:2:1170 -2690:0:4365 -2691:3:3043 -2692:0:4365 -2693:3:3044 -2694:0:4365 -2695:3:3257 -2696:0:4365 -2697:3:3362 -2698:0:4365 -2699:3:3363 -2700:0:4365 -2701:3:3367 -2702:0:4365 -2703:3:3373 -2704:3:3377 -2705:3:3378 -2706:3:3386 -2707:3:3387 -2708:3:3391 -2709:3:3392 -2710:3:3386 -2711:3:3387 -2712:3:3391 -2713:3:3392 -2714:3:3400 -2715:3:3405 -2716:3:3409 -2717:3:3410 -2718:3:3417 -2719:3:3418 -2720:3:3429 -2721:3:3430 -2722:3:3431 -2723:3:3429 -2724:3:3430 -2725:3:3431 -2726:3:3442 -2727:3:3447 -2728:3:3448 -2729:0:4365 -2730:3:3460 -2731:0:4365 -2732:3:3461 -2733:0:4365 -2734:2:1173 -2735:0:4365 -2736:3:3462 -2737:0:4365 -2738:2:1179 -2739:0:4365 -2740:2:1180 -2741:0:4365 -2742:3:3461 -2743:0:4365 -2744:2:1181 -2745:2:1185 -2746:2:1186 -2747:2:1194 -2748:2:1195 -2749:2:1199 -2750:2:1200 -2751:2:1194 -2752:2:1195 -2753:2:1199 -2754:2:1200 -2755:2:1208 -2756:2:1213 -2757:2:1217 -2758:2:1218 -2759:2:1225 -2760:2:1226 -2761:2:1237 -2762:2:1238 -2763:2:1239 -2764:2:1237 -2765:2:1238 -2766:2:1239 -2767:2:1250 -2768:2:1255 -2769:2:1256 -2770:0:4365 -2771:3:3462 -2772:0:4365 -2773:2:1268 -2774:0:4365 -2775:3:3461 -2776:0:4365 -2777:2:1270 -2778:0:4365 -2779:3:3462 -2780:0:4365 -2781:2:1271 -2782:2:1275 -2783:2:1276 -2784:2:1284 -2785:2:1285 -2786:2:1289 -2787:2:1290 -2788:2:1284 -2789:2:1285 -2790:2:1289 -2791:2:1290 -2792:2:1298 -2793:2:1303 -2794:2:1307 -2795:2:1308 -2796:2:1315 -2797:2:1316 -2798:2:1327 -2799:2:1328 -2800:2:1329 -2801:2:1327 -2802:2:1328 -2803:2:1329 -2804:2:1340 -2805:2:1345 -2806:2:1346 -2807:0:4365 -2808:2:1358 -2809:0:4365 -2810:2:1360 -2811:0:4365 -2812:3:3461 -2813:0:4365 -2814:2:1361 -2815:0:4365 -2816:3:3462 -2817:0:4365 -2818:2:1362 -2819:2:1366 -2820:2:1367 -2821:2:1375 -2822:2:1376 -2823:2:1380 -2824:2:1381 -2825:2:1375 -2826:2:1376 -2827:2:1380 -2828:2:1381 -2829:2:1389 -2830:2:1394 -2831:2:1398 -2832:2:1399 -2833:2:1406 -2834:2:1407 -2835:2:1418 -2836:2:1419 -2837:2:1420 -2838:2:1418 -2839:2:1419 -2840:2:1420 -2841:2:1431 -2842:2:1436 -2843:2:1437 -2844:0:4365 -2845:2:1449 -2846:0:4365 -2847:3:3461 -2848:0:4365 -2849:2:1451 -2850:0:4365 -2851:3:3462 -2852:0:4365 -2853:2:1652 -2854:0:4365 -2855:2:1653 -2856:0:4365 -2857:2:1657 -2858:0:4365 -2859:2:1660 -2860:0:4365 -2861:3:3461 -2862:0:4365 -2863:2:1665 -2864:2:1669 -2865:2:1670 -2866:2:1678 -2867:2:1679 -2868:2:1683 -2869:2:1684 -2870:2:1678 -2871:2:1679 -2872:2:1680 -2873:2:1692 -2874:2:1697 -2875:2:1701 -2876:2:1702 -2877:2:1709 -2878:2:1710 -2879:2:1721 -2880:2:1722 -2881:2:1723 -2882:2:1721 -2883:2:1722 -2884:2:1723 -2885:2:1734 -2886:2:1739 -2887:2:1740 -2888:0:4365 -2889:3:3462 -2890:0:4365 -2891:2:1752 -2892:0:4365 -2893:3:3461 -2894:0:4365 -2895:2:1754 -2896:0:4365 -2897:3:3462 -2898:0:4365 -2899:2:1755 -2900:2:1759 -2901:2:1760 -2902:2:1768 -2903:2:1769 -2904:2:1773 -2905:2:1774 -2906:2:1768 -2907:2:1769 -2908:2:1773 -2909:2:1774 -2910:2:1782 -2911:2:1787 -2912:2:1791 -2913:2:1792 -2914:2:1799 -2915:2:1800 -2916:2:1811 -2917:2:1812 -2918:2:1813 -2919:2:1811 -2920:2:1812 -2921:2:1813 -2922:2:1824 -2923:2:1829 -2924:2:1830 -2925:0:4365 -2926:2:1842 -2927:0:4365 -2928:3:3461 -2929:0:4365 -2930:2:1844 -2931:0:4365 -2932:3:3462 -2933:0:4365 -2934:2:1845 -2935:2:1849 -2936:2:1850 -2937:2:1858 -2938:2:1859 -2939:2:1863 -2940:2:1864 -2941:2:1858 -2942:2:1859 -2943:2:1863 -2944:2:1864 -2945:2:1872 -2946:2:1877 -2947:2:1881 -2948:2:1882 -2949:2:1889 -2950:2:1890 -2951:2:1901 -2952:2:1902 -2953:2:1903 -2954:2:1901 -2955:2:1902 -2956:2:1903 -2957:2:1914 -2958:2:1919 -2959:2:1920 -2960:0:4365 -2961:2:1932 -2962:0:4365 -2963:3:3461 -2964:0:4365 -2965:2:1934 -2966:0:4365 -2967:3:3462 -2968:0:4365 -2969:2:1935 -2970:0:4365 -2971:2:1936 -2972:0:4365 -2973:2:2129 -2974:0:4365 -2975:2:2130 -2976:0:4365 -2977:2:2134 -2978:0:4365 -2979:3:3461 -2980:0:4365 -2981:2:2136 -2982:0:4365 -2983:3:3462 -2984:0:4365 -2985:2:2137 -2986:2:2141 -2987:2:2142 -2988:2:2150 -2989:2:2151 -2990:2:2155 -2991:2:2156 -2992:2:2150 -2993:2:2151 -2994:2:2155 -2995:2:2156 -2996:2:2164 -2997:2:2169 -2998:2:2173 -2999:2:2174 -3000:2:2181 -3001:2:2182 -3002:2:2193 -3003:2:2194 -3004:2:2195 -3005:2:2193 -3006:2:2194 -3007:2:2195 -3008:2:2206 -3009:2:2211 -3010:2:2212 -3011:0:4365 -3012:2:2224 -3013:0:4365 -3014:3:3461 -3015:0:4365 -3016:2:2226 -3017:0:4365 -3018:3:3462 -3019:0:4365 -3020:2:2230 -3021:0:4365 -3022:3:3461 -3023:0:4365 -3024:2:2235 -3025:2:2239 -3026:2:2240 -3027:2:2248 -3028:2:2249 -3029:2:2253 -3030:2:2254 -3031:2:2248 -3032:2:2249 -3033:2:2250 -3034:2:2262 -3035:2:2267 -3036:2:2271 -3037:2:2272 -3038:2:2279 -3039:2:2280 -3040:2:2291 -3041:2:2292 -3042:2:2293 -3043:2:2291 -3044:2:2292 -3045:2:2293 -3046:2:2304 -3047:2:2309 -3048:2:2310 -3049:0:4365 -3050:3:3462 -3051:0:4365 -3052:2:2322 -3053:0:4365 -3054:2:1169 -3055:0:4365 -3056:3:3461 -3057:0:4365 -3058:2:1170 -3059:0:4365 -3060:3:3462 -3061:0:4365 -3062:3:3463 -3063:0:4365 -3064:3:3469 -3065:0:4365 -3066:3:3470 -3067:3:3474 -3068:3:3475 -3069:3:3483 -3070:3:3484 -3071:3:3488 -3072:3:3489 -3073:3:3483 -3074:3:3484 -3075:3:3488 -3076:3:3489 -3077:3:3497 -3078:3:3502 -3079:3:3506 -3080:3:3507 -3081:3:3514 -3082:3:3515 -3083:3:3526 -3084:3:3527 -3085:3:3528 -3086:3:3526 -3087:3:3527 -3088:3:3528 -3089:3:3539 -3090:3:3544 -3091:3:3545 -3092:0:4365 -3093:3:3557 -3094:0:4365 -3095:3:3558 -3096:0:4365 -3097:2:1173 -3098:0:4365 -3099:3:3559 -3100:0:4365 -3101:2:1179 -3102:0:4365 -3103:2:1180 -3104:0:4365 -3105:3:3558 -3106:0:4365 -3107:2:1181 -3108:2:1185 -3109:2:1186 -3110:2:1194 -3111:2:1195 -3112:2:1199 -3113:2:1200 -3114:2:1194 -3115:2:1195 -3116:2:1199 -3117:2:1200 -3118:2:1208 -3119:2:1213 -3120:2:1217 -3121:2:1218 -3122:2:1225 -3123:2:1226 -3124:2:1237 -3125:2:1238 -3126:2:1239 -3127:2:1237 -3128:2:1238 -3129:2:1239 -3130:2:1250 -3131:2:1255 -3132:2:1256 -3133:0:4365 -3134:3:3559 -3135:0:4365 -3136:2:1268 -3137:0:4365 -3138:3:3558 -3139:0:4365 -3140:2:1270 -3141:0:4365 -3142:3:3559 -3143:0:4365 -3144:2:1271 -3145:2:1275 -3146:2:1276 -3147:2:1284 -3148:2:1285 -3149:2:1289 -3150:2:1290 -3151:2:1284 -3152:2:1285 -3153:2:1289 -3154:2:1290 -3155:2:1298 -3156:2:1303 -3157:2:1307 -3158:2:1308 -3159:2:1315 -3160:2:1316 -3161:2:1327 -3162:2:1328 -3163:2:1329 -3164:2:1327 -3165:2:1328 -3166:2:1329 -3167:2:1340 -3168:2:1345 -3169:2:1346 -3170:0:4365 -3171:2:1358 -3172:0:4365 -3173:2:1360 -3174:0:4365 -3175:3:3558 -3176:0:4365 -3177:2:1361 -3178:0:4365 -3179:3:3559 -3180:0:4365 -3181:2:1362 -3182:2:1366 -3183:2:1367 -3184:2:1375 -3185:2:1376 -3186:2:1380 -3187:2:1381 -3188:2:1375 -3189:2:1376 -3190:2:1380 -3191:2:1381 -3192:2:1389 -3193:2:1394 -3194:2:1398 -3195:2:1399 -3196:2:1406 -3197:2:1407 -3198:2:1418 -3199:2:1419 -3200:2:1420 -3201:2:1418 -3202:2:1419 -3203:2:1420 -3204:2:1431 -3205:2:1436 -3206:2:1437 -3207:0:4365 -3208:2:1449 -3209:0:4365 -3210:3:3558 -3211:0:4365 -3212:2:1451 -3213:0:4365 -3214:3:3559 -3215:0:4365 -3216:2:1652 -3217:0:4365 -3218:2:1653 -3219:0:4365 -3220:2:1657 -3221:0:4365 -3222:2:1660 -3223:0:4365 -3224:3:3558 -3225:0:4365 -3226:2:1665 -3227:2:1669 -3228:2:1670 -3229:2:1678 -3230:2:1679 -3231:2:1683 -3232:2:1684 -3233:2:1678 -3234:2:1679 -3235:2:1680 -3236:2:1692 -3237:2:1697 -3238:2:1701 -3239:2:1702 -3240:2:1709 -3241:2:1710 -3242:2:1721 -3243:2:1722 -3244:2:1723 -3245:2:1721 -3246:2:1722 -3247:2:1723 -3248:2:1734 -3249:2:1739 -3250:2:1740 -3251:0:4365 -3252:3:3559 -3253:0:4365 -3254:2:1752 -3255:0:4365 -3256:3:3558 -3257:0:4365 -3258:2:1754 -3259:0:4365 -3260:3:3559 -3261:0:4365 -3262:2:1755 -3263:2:1759 -3264:2:1760 -3265:2:1768 -3266:2:1769 -3267:2:1773 -3268:2:1774 -3269:2:1768 -3270:2:1769 -3271:2:1773 -3272:2:1774 -3273:2:1782 -3274:2:1787 -3275:2:1791 -3276:2:1792 -3277:2:1799 -3278:2:1800 -3279:2:1811 -3280:2:1812 -3281:2:1813 -3282:2:1811 -3283:2:1812 -3284:2:1813 -3285:2:1824 -3286:2:1829 -3287:2:1830 -3288:0:4365 -3289:2:1842 -3290:0:4365 -3291:3:3558 -3292:0:4365 -3293:2:1844 -3294:0:4365 -3295:3:3559 -3296:0:4365 -3297:2:1845 -3298:2:1849 -3299:2:1850 -3300:2:1858 -3301:2:1859 -3302:2:1863 -3303:2:1864 -3304:2:1858 -3305:2:1859 -3306:2:1863 -3307:2:1864 -3308:2:1872 -3309:2:1877 -3310:2:1881 -3311:2:1882 -3312:2:1889 -3313:2:1890 -3314:2:1901 -3315:2:1902 -3316:2:1903 -3317:2:1901 -3318:2:1902 -3319:2:1903 -3320:2:1914 -3321:2:1919 -3322:2:1920 -3323:0:4365 -3324:2:1932 -3325:0:4365 -3326:3:3558 -3327:0:4365 -3328:2:1934 -3329:0:4365 -3330:3:3559 -3331:0:4365 -3332:2:1935 -3333:0:4365 -3334:2:1936 -3335:0:4365 -3336:2:2129 -3337:0:4365 -3338:2:2130 -3339:0:4365 -3340:2:2134 -3341:0:4365 -3342:3:3558 -3343:0:4365 -3344:2:2136 -3345:0:4365 -3346:3:3559 -3347:0:4365 -3348:2:2137 -3349:2:2141 -3350:2:2142 -3351:2:2150 -3352:2:2151 -3353:2:2155 -3354:2:2156 -3355:2:2150 -3356:2:2151 -3357:2:2155 -3358:2:2156 -3359:2:2164 -3360:2:2169 -3361:2:2173 -3362:2:2174 -3363:2:2181 -3364:2:2182 -3365:2:2193 -3366:2:2194 -3367:2:2195 -3368:2:2193 -3369:2:2194 -3370:2:2195 -3371:2:2206 -3372:2:2211 -3373:2:2212 -3374:0:4365 -3375:2:2224 -3376:0:4365 -3377:3:3558 -3378:0:4365 -3379:2:2226 -3380:0:4365 -3381:3:3559 -3382:0:4365 -3383:2:2230 -3384:0:4365 -3385:3:3558 -3386:0:4365 -3387:2:2235 -3388:2:2239 -3389:2:2240 -3390:2:2248 -3391:2:2249 -3392:2:2253 -3393:2:2254 -3394:2:2248 -3395:2:2249 -3396:2:2250 -3397:2:2262 -3398:2:2267 -3399:2:2271 -3400:2:2272 -3401:2:2279 -3402:2:2280 -3403:2:2291 -3404:2:2292 -3405:2:2293 -3406:2:2291 -3407:2:2292 -3408:2:2293 -3409:2:2304 -3410:2:2309 -3411:2:2310 -3412:0:4365 -3413:3:3559 -3414:0:4365 -3415:2:2322 -3416:0:4365 -3417:2:1169 -3418:0:4365 -3419:3:3558 -3420:0:4365 -3421:2:1170 -3422:0:4365 -3423:3:3559 -3424:0:4365 -3425:3:3560 -3426:0:4365 -3427:3:3566 -3428:0:4365 -3429:3:3569 -3430:3:3570 -3431:3:3582 -3432:3:3583 -3433:3:3587 -3434:3:3588 -3435:3:3582 -3436:3:3583 -3437:3:3587 -3438:3:3588 -3439:3:3596 -3440:3:3601 -3441:3:3605 -3442:3:3606 -3443:3:3613 -3444:3:3614 -3445:3:3625 -3446:3:3626 -3447:3:3627 -3448:3:3625 -3449:3:3626 -3450:3:3627 -3451:3:3638 -3452:3:3643 -3453:3:3644 -3454:0:4365 -3455:3:3656 -3456:0:4365 -3457:3:3657 -3458:0:4365 -3459:2:1173 -3460:0:4365 -3461:3:3658 -3462:0:4365 -3463:2:1179 -3464:0:4365 -3465:2:1180 -3466:0:4365 -3467:3:3657 -3468:0:4365 -3469:2:1181 -3470:2:1185 -3471:2:1186 -3472:2:1194 -3473:2:1195 -3474:2:1199 -3475:2:1200 -3476:2:1194 -3477:2:1195 -3478:2:1199 -3479:2:1200 -3480:2:1208 -3481:2:1213 -3482:2:1217 -3483:2:1218 -3484:2:1225 -3485:2:1226 -3486:2:1237 -3487:2:1238 -3488:2:1239 -3489:2:1237 -3490:2:1238 -3491:2:1239 -3492:2:1250 -3493:2:1255 -3494:2:1256 -3495:0:4365 -3496:3:3658 -3497:0:4365 -3498:2:1268 -3499:0:4365 -3500:3:3657 -3501:0:4365 -3502:2:1270 -3503:0:4365 -3504:3:3658 -3505:0:4365 -3506:2:1271 -3507:2:1275 -3508:2:1276 -3509:2:1284 -3510:2:1285 -3511:2:1289 -3512:2:1290 -3513:2:1284 -3514:2:1285 -3515:2:1289 -3516:2:1290 -3517:2:1298 -3518:2:1303 -3519:2:1307 -3520:2:1308 -3521:2:1315 -3522:2:1316 -3523:2:1327 -3524:2:1328 -3525:2:1329 -3526:2:1327 -3527:2:1328 -3528:2:1329 -3529:2:1340 -3530:2:1345 -3531:2:1346 -3532:0:4365 -3533:2:1358 -3534:0:4365 -3535:2:1360 -3536:0:4365 -3537:3:3657 -3538:0:4365 -3539:2:1361 -3540:0:4365 -3541:3:3658 -3542:0:4365 -3543:2:1362 -3544:2:1366 -3545:2:1367 -3546:2:1375 -3547:2:1376 -3548:2:1380 -3549:2:1381 -3550:2:1375 -3551:2:1376 -3552:2:1380 -3553:2:1381 -3554:2:1389 -3555:2:1394 -3556:2:1398 -3557:2:1399 -3558:2:1406 -3559:2:1407 -3560:2:1418 -3561:2:1419 -3562:2:1420 -3563:2:1418 -3564:2:1419 -3565:2:1420 -3566:2:1431 -3567:2:1436 -3568:2:1437 -3569:0:4365 -3570:2:1449 -3571:0:4365 -3572:3:3657 -3573:0:4365 -3574:2:1451 -3575:0:4365 -3576:3:3658 -3577:0:4365 -3578:2:1652 -3579:0:4365 -3580:2:1653 -3581:0:4365 -3582:2:1657 -3583:0:4365 -3584:2:1660 -3585:0:4365 -3586:3:3657 -3587:0:4365 -3588:2:1665 -3589:2:1669 -3590:2:1670 -3591:2:1678 -3592:2:1679 -3593:2:1683 -3594:2:1684 -3595:2:1678 -3596:2:1679 -3597:2:1680 -3598:2:1692 -3599:2:1697 -3600:2:1701 -3601:2:1702 -3602:2:1709 -3603:2:1710 -3604:2:1721 -3605:2:1722 -3606:2:1723 -3607:2:1721 -3608:2:1722 -3609:2:1723 -3610:2:1734 -3611:2:1739 -3612:2:1740 -3613:0:4365 -3614:3:3658 -3615:0:4365 -3616:2:1752 -3617:0:4365 -3618:3:3657 -3619:0:4365 -3620:2:1754 -3621:0:4365 -3622:3:3658 -3623:0:4365 -3624:2:1755 -3625:2:1759 -3626:2:1760 -3627:2:1768 -3628:2:1769 -3629:2:1773 -3630:2:1774 -3631:2:1768 -3632:2:1769 -3633:2:1773 -3634:2:1774 -3635:2:1782 -3636:2:1787 -3637:2:1791 -3638:2:1792 -3639:2:1799 -3640:2:1800 -3641:2:1811 -3642:2:1812 -3643:2:1813 -3644:2:1811 -3645:2:1812 -3646:2:1813 -3647:2:1824 -3648:2:1829 -3649:2:1830 -3650:0:4365 -3651:2:1842 -3652:0:4365 -3653:3:3657 -3654:0:4365 -3655:2:1844 -3656:0:4365 -3657:3:3658 -3658:0:4365 -3659:2:1845 -3660:2:1849 -3661:2:1850 -3662:2:1858 -3663:2:1859 -3664:2:1863 -3665:2:1864 -3666:2:1858 -3667:2:1859 -3668:2:1863 -3669:2:1864 -3670:2:1872 -3671:2:1877 -3672:2:1881 -3673:2:1882 -3674:2:1889 -3675:2:1890 -3676:2:1901 -3677:2:1902 -3678:2:1903 -3679:2:1901 -3680:2:1902 -3681:2:1903 -3682:2:1914 -3683:2:1919 -3684:2:1920 -3685:0:4365 -3686:2:1932 -3687:0:4365 -3688:3:3657 -3689:0:4365 -3690:2:1934 -3691:0:4365 -3692:3:3658 -3693:0:4365 -3694:2:1935 -3695:0:4365 -3696:2:1936 -3697:0:4365 -3698:2:2129 -3699:0:4365 -3700:2:2130 -3701:0:4365 -3702:2:2134 -3703:0:4365 -3704:3:3657 -3705:0:4365 -3706:2:2136 -3707:0:4365 -3708:3:3658 -3709:0:4365 -3710:2:2137 -3711:2:2141 -3712:2:2142 -3713:2:2150 -3714:2:2151 -3715:2:2155 -3716:2:2156 -3717:2:2150 -3718:2:2151 -3719:2:2155 -3720:2:2156 -3721:2:2164 -3722:2:2169 -3723:2:2173 -3724:2:2174 -3725:2:2181 -3726:2:2182 -3727:2:2193 -3728:2:2194 -3729:2:2195 -3730:2:2193 -3731:2:2194 -3732:2:2195 -3733:2:2206 -3734:2:2211 -3735:2:2212 -3736:0:4365 -3737:2:2224 -3738:0:4365 -3739:3:3657 -3740:0:4365 -3741:2:2226 -3742:0:4365 -3743:3:3658 -3744:0:4365 -3745:2:2230 -3746:0:4365 -3747:3:3657 -3748:0:4365 -3749:2:2235 -3750:2:2239 -3751:2:2240 -3752:2:2248 -3753:2:2249 -3754:2:2253 -3755:2:2254 -3756:2:2248 -3757:2:2249 -3758:2:2250 -3759:2:2262 -3760:2:2267 -3761:2:2271 -3762:2:2272 -3763:2:2279 -3764:2:2280 -3765:2:2291 -3766:2:2292 -3767:2:2293 -3768:2:2291 -3769:2:2292 -3770:2:2293 -3771:2:2304 -3772:2:2309 -3773:2:2310 -3774:0:4365 -3775:3:3658 -3776:0:4365 -3777:2:2322 -3778:0:4365 -3779:2:1169 -3780:0:4365 -3781:3:3657 -3782:0:4365 -3783:2:1170 -3784:0:4365 -3785:3:3658 -3786:0:4365 -3787:3:3659 -3788:0:4365 -3789:3:3665 -3790:0:4365 -3791:3:3666 -3792:0:4365 -3793:3:3667 -3794:0:4365 -3795:3:3668 -3796:0:4365 -3797:3:3669 -3798:3:3673 -3799:3:3674 -3800:3:3682 -3801:3:3683 -3802:3:3687 -3803:3:3688 -3804:3:3682 -3805:3:3683 -3806:3:3687 -3807:3:3688 -3808:3:3696 -3809:3:3701 -3810:3:3705 -3811:3:3706 -3812:3:3713 -3813:3:3714 -3814:3:3725 -3815:3:3726 -3816:3:3727 -3817:3:3725 -3818:3:3726 -3819:3:3727 -3820:3:3738 -3821:3:3743 -3822:3:3744 -3823:0:4365 -3824:3:3756 -3825:0:4365 -3826:3:3757 -3827:0:4365 -3828:2:1173 -3829:0:4365 -3830:3:3758 -3831:0:4365 -3832:2:1179 -3833:0:4365 -3834:2:1180 -3835:0:4365 -3836:3:3757 -3837:0:4365 -3838:2:1181 -3839:2:1185 -3840:2:1186 -3841:2:1194 -3842:2:1195 -3843:2:1199 -3844:2:1200 -3845:2:1194 -3846:2:1195 -3847:2:1199 -3848:2:1200 -3849:2:1208 -3850:2:1213 -3851:2:1217 -3852:2:1218 -3853:2:1225 -3854:2:1226 -3855:2:1237 -3856:2:1238 -3857:2:1239 -3858:2:1237 -3859:2:1238 -3860:2:1239 -3861:2:1250 -3862:2:1255 -3863:2:1256 -3864:0:4365 -3865:3:3758 -3866:0:4365 -3867:2:1268 -3868:0:4365 -3869:3:3757 -3870:0:4365 -3871:2:1270 -3872:0:4365 -3873:3:3758 -3874:0:4365 -3875:2:1271 -3876:2:1275 -3877:2:1276 -3878:2:1284 -3879:2:1285 -3880:2:1289 -3881:2:1290 -3882:2:1284 -3883:2:1285 -3884:2:1289 -3885:2:1290 -3886:2:1298 -3887:2:1303 -3888:2:1307 -3889:2:1308 -3890:2:1315 -3891:2:1316 -3892:2:1327 -3893:2:1328 -3894:2:1329 -3895:2:1327 -3896:2:1328 -3897:2:1329 -3898:2:1340 -3899:2:1345 -3900:2:1346 -3901:0:4365 -3902:2:1358 -3903:0:4365 -3904:2:1360 -3905:0:4365 -3906:3:3757 -3907:0:4365 -3908:2:1361 -3909:0:4365 -3910:3:3758 -3911:0:4365 -3912:2:1362 -3913:2:1366 -3914:2:1367 -3915:2:1375 -3916:2:1376 -3917:2:1380 -3918:2:1381 -3919:2:1375 -3920:2:1376 -3921:2:1380 -3922:2:1381 -3923:2:1389 -3924:2:1394 -3925:2:1398 -3926:2:1399 -3927:2:1406 -3928:2:1407 -3929:2:1418 -3930:2:1419 -3931:2:1420 -3932:2:1418 -3933:2:1419 -3934:2:1420 -3935:2:1431 -3936:2:1436 -3937:2:1437 -3938:0:4365 -3939:2:1449 -3940:0:4365 -3941:3:3757 -3942:0:4365 -3943:2:1451 -3944:0:4365 -3945:3:3758 -3946:0:4365 -3947:2:1652 -3948:0:4365 -3949:2:1653 -3950:0:4365 -3951:2:1657 -3952:0:4365 -3953:2:1660 -3954:0:4365 -3955:3:3757 -3956:0:4365 -3957:2:1665 -3958:2:1669 -3959:2:1670 -3960:2:1678 -3961:2:1679 -3962:2:1683 -3963:2:1684 -3964:2:1678 -3965:2:1679 -3966:2:1680 -3967:2:1692 -3968:2:1697 -3969:2:1701 -3970:2:1702 -3971:2:1709 -3972:2:1710 -3973:2:1721 -3974:2:1722 -3975:2:1723 -3976:2:1721 -3977:2:1722 -3978:2:1723 -3979:2:1734 -3980:2:1739 -3981:2:1740 -3982:0:4365 -3983:3:3758 -3984:0:4365 -3985:2:1752 -3986:0:4365 -3987:3:3757 -3988:0:4365 -3989:2:1754 -3990:0:4365 -3991:3:3758 -3992:0:4365 -3993:2:1755 -3994:2:1759 -3995:2:1760 -3996:2:1768 -3997:2:1769 -3998:2:1773 -3999:2:1774 -4000:2:1768 -4001:2:1769 -4002:2:1773 -4003:2:1774 -4004:2:1782 -4005:2:1787 -4006:2:1791 -4007:2:1792 -4008:2:1799 -4009:2:1800 -4010:2:1811 -4011:2:1812 -4012:2:1813 -4013:2:1811 -4014:2:1812 -4015:2:1813 -4016:2:1824 -4017:2:1829 -4018:2:1830 -4019:0:4365 -4020:2:1842 -4021:0:4365 -4022:3:3757 -4023:0:4365 -4024:2:1844 -4025:0:4365 -4026:3:3758 -4027:0:4365 -4028:2:1845 -4029:2:1849 -4030:2:1850 -4031:2:1858 -4032:2:1859 -4033:2:1863 -4034:2:1864 -4035:2:1858 -4036:2:1859 -4037:2:1863 -4038:2:1864 -4039:2:1872 -4040:2:1877 -4041:2:1881 -4042:2:1882 -4043:2:1889 -4044:2:1890 -4045:2:1901 -4046:2:1902 -4047:2:1903 -4048:2:1901 -4049:2:1902 -4050:2:1903 -4051:2:1914 -4052:2:1919 -4053:2:1920 -4054:0:4365 -4055:2:1932 -4056:0:4365 -4057:3:3757 -4058:0:4365 -4059:2:1934 -4060:0:4365 -4061:3:3758 -4062:0:4365 -4063:2:1935 -4064:0:4365 -4065:2:1936 -4066:0:4365 -4067:2:2129 -4068:0:4365 -4069:2:2130 -4070:0:4365 -4071:2:2134 -4072:0:4365 -4073:3:3757 -4074:0:4365 -4075:2:2136 -4076:0:4365 -4077:3:3758 -4078:0:4365 -4079:2:2137 -4080:2:2141 -4081:2:2142 -4082:2:2150 -4083:2:2151 -4084:2:2155 -4085:2:2156 -4086:2:2150 -4087:2:2151 -4088:2:2155 -4089:2:2156 -4090:2:2164 -4091:2:2169 -4092:2:2173 -4093:2:2174 -4094:2:2181 -4095:2:2182 -4096:2:2193 -4097:2:2194 -4098:2:2195 -4099:2:2193 -4100:2:2194 -4101:2:2195 -4102:2:2206 -4103:2:2211 -4104:2:2212 -4105:0:4365 -4106:2:2224 -4107:0:4365 -4108:3:3757 -4109:0:4365 -4110:2:2226 -4111:0:4365 -4112:3:3758 -4113:0:4365 -4114:2:2230 -4115:0:4365 -4116:3:3757 -4117:0:4365 -4118:2:2235 -4119:2:2239 -4120:2:2240 -4121:2:2248 -4122:2:2249 -4123:2:2253 -4124:2:2254 -4125:2:2248 -4126:2:2249 -4127:2:2250 -4128:2:2262 -4129:2:2267 -4130:2:2271 -4131:2:2272 -4132:2:2279 -4133:2:2280 -4134:2:2291 -4135:2:2292 -4136:2:2293 -4137:2:2291 -4138:2:2292 -4139:2:2293 -4140:2:2304 -4141:2:2309 -4142:2:2310 -4143:0:4365 -4144:3:3758 -4145:0:4365 -4146:2:2322 -4147:0:4365 -4148:2:1169 -4149:0:4365 -4150:3:3757 -4151:0:4365 -4152:2:1170 -4153:0:4365 -4154:3:3758 -4155:0:4365 -4156:3:3759 -4157:0:4365 -4158:3:3972 -4159:0:4365 -4160:3:3980 -4161:0:4365 -4162:3:3981 -4163:3:3985 -4164:3:3986 -4165:3:3994 -4166:3:3995 -4167:3:3999 -4168:3:4000 -4169:3:3994 -4170:3:3995 -4171:3:3999 -4172:3:4000 -4173:3:4008 -4174:3:4013 -4175:3:4017 -4176:3:4018 -4177:3:4025 -4178:3:4026 -4179:3:4037 -4180:3:4038 -4181:3:4039 -4182:3:4037 -4183:3:4038 -4184:3:4039 -4185:3:4050 -4186:3:4055 -4187:3:4056 -4188:0:4365 -4189:3:4068 -4190:0:4365 -4191:3:4069 -4192:0:4365 -4193:2:1173 -4194:0:4365 -4195:3:4070 -4196:0:4365 -4197:2:1179 -4198:0:4365 -4199:2:1180 -4200:0:4365 -4201:3:4069 -4202:0:4365 -4203:2:1181 -4204:2:1185 -4205:2:1186 -4206:2:1194 -4207:2:1195 -4208:2:1199 -4209:2:1200 -4210:2:1194 -4211:2:1195 -4212:2:1199 -4213:2:1200 -4214:2:1208 -4215:2:1213 -4216:2:1217 -4217:2:1218 -4218:2:1225 -4219:2:1226 -4220:2:1237 -4221:2:1238 -4222:2:1239 -4223:2:1237 -4224:2:1238 -4225:2:1239 -4226:2:1250 -4227:2:1255 -4228:2:1256 -4229:0:4365 -4230:3:4070 -4231:0:4365 -4232:2:1268 -4233:0:4365 -4234:3:4069 -4235:0:4365 -4236:2:1270 -4237:0:4365 -4238:3:4070 -4239:0:4365 -4240:2:1271 -4241:2:1275 -4242:2:1276 -4243:2:1284 -4244:2:1285 -4245:2:1289 -4246:2:1290 -4247:2:1284 -4248:2:1285 -4249:2:1289 -4250:2:1290 -4251:2:1298 -4252:2:1303 -4253:2:1307 -4254:2:1308 -4255:2:1315 -4256:2:1316 -4257:2:1327 -4258:2:1328 -4259:2:1329 -4260:2:1327 -4261:2:1328 -4262:2:1329 -4263:2:1340 -4264:2:1345 -4265:2:1346 -4266:0:4365 -4267:2:1358 -4268:0:4365 -4269:2:1360 -4270:0:4365 -4271:3:4069 -4272:0:4365 -4273:2:1361 -4274:0:4365 -4275:3:4070 -4276:0:4365 -4277:2:1362 -4278:2:1366 -4279:2:1367 -4280:2:1375 -4281:2:1376 -4282:2:1380 -4283:2:1381 -4284:2:1375 -4285:2:1376 -4286:2:1380 -4287:2:1381 -4288:2:1389 -4289:2:1394 -4290:2:1398 -4291:2:1399 -4292:2:1406 -4293:2:1407 -4294:2:1418 -4295:2:1419 -4296:2:1420 -4297:2:1418 -4298:2:1419 -4299:2:1420 -4300:2:1431 -4301:2:1436 -4302:2:1437 -4303:0:4365 -4304:2:1449 -4305:0:4365 -4306:3:4069 -4307:0:4365 -4308:2:1451 -4309:0:4365 -4310:3:4070 -4311:0:4365 -4312:2:1652 -4313:0:4365 -4314:2:1653 -4315:0:4365 -4316:2:1657 -4317:0:4365 -4318:2:1660 -4319:0:4365 -4320:3:4069 -4321:0:4365 -4322:2:1665 -4323:2:1669 -4324:2:1670 -4325:2:1678 -4326:2:1679 -4327:2:1683 -4328:2:1684 -4329:2:1678 -4330:2:1679 -4331:2:1680 -4332:2:1692 -4333:2:1697 -4334:2:1701 -4335:2:1702 -4336:2:1709 -4337:2:1710 -4338:2:1721 -4339:2:1722 -4340:2:1723 -4341:2:1721 -4342:2:1722 -4343:2:1723 -4344:2:1734 -4345:2:1739 -4346:2:1740 -4347:0:4365 -4348:3:4070 -4349:0:4365 -4350:2:1752 -4351:0:4365 -4352:3:4069 -4353:0:4365 -4354:2:1754 -4355:0:4365 -4356:3:4070 -4357:0:4365 -4358:2:1755 -4359:2:1759 -4360:2:1760 -4361:2:1768 -4362:2:1769 -4363:2:1773 -4364:2:1774 -4365:2:1768 -4366:2:1769 -4367:2:1773 -4368:2:1774 -4369:2:1782 -4370:2:1787 -4371:2:1791 -4372:2:1792 -4373:2:1799 -4374:2:1800 -4375:2:1811 -4376:2:1812 -4377:2:1813 -4378:2:1811 -4379:2:1812 -4380:2:1813 -4381:2:1824 -4382:2:1829 -4383:2:1830 -4384:0:4365 -4385:2:1842 -4386:0:4365 -4387:3:4069 -4388:0:4365 -4389:2:1844 -4390:0:4365 -4391:3:4070 -4392:0:4365 -4393:2:1845 -4394:2:1849 -4395:2:1850 -4396:2:1858 -4397:2:1859 -4398:2:1863 -4399:2:1864 -4400:2:1858 -4401:2:1859 -4402:2:1863 -4403:2:1864 -4404:2:1872 -4405:2:1877 -4406:2:1881 -4407:2:1882 -4408:2:1889 -4409:2:1890 -4410:2:1901 -4411:2:1902 -4412:2:1903 -4413:2:1901 -4414:2:1902 -4415:2:1903 -4416:2:1914 -4417:2:1919 -4418:2:1920 -4419:0:4365 -4420:2:1932 -4421:0:4365 -4422:3:4069 -4423:0:4365 -4424:2:1934 -4425:0:4365 -4426:3:4070 -4427:0:4365 -4428:2:1935 -4429:0:4365 -4430:2:1936 -4431:0:4365 -4432:2:2129 -4433:0:4365 -4434:2:2130 -4435:0:4365 -4436:2:2134 -4437:0:4365 -4438:3:4069 -4439:0:4365 -4440:2:2136 -4441:0:4365 -4442:3:4070 -4443:0:4365 -4444:2:2137 -4445:2:2141 -4446:2:2142 -4447:2:2150 -4448:2:2151 -4449:2:2155 -4450:2:2156 -4451:2:2150 -4452:2:2151 -4453:2:2155 -4454:2:2156 -4455:2:2164 -4456:2:2169 -4457:2:2173 -4458:2:2174 -4459:2:2181 -4460:2:2182 -4461:2:2193 -4462:2:2194 -4463:2:2195 -4464:2:2193 -4465:2:2194 -4466:2:2195 -4467:2:2206 -4468:2:2211 -4469:2:2212 -4470:0:4365 -4471:2:2224 -4472:0:4365 -4473:3:4069 -4474:0:4365 -4475:2:2226 -4476:0:4365 -4477:3:4070 -4478:0:4365 -4479:2:2230 -4480:0:4365 -4481:3:4069 -4482:0:4365 -4483:2:2235 -4484:2:2239 -4485:2:2240 -4486:2:2248 -4487:2:2249 -4488:2:2253 -4489:2:2254 -4490:2:2248 -4491:2:2249 -4492:2:2250 -4493:2:2262 -4494:2:2267 -4495:2:2271 -4496:2:2272 -4497:2:2279 -4498:2:2280 -4499:2:2291 -4500:2:2292 -4501:2:2293 -4502:2:2291 -4503:2:2292 -4504:2:2293 -4505:2:2304 -4506:2:2309 -4507:2:2310 -4508:0:4365 -4509:3:4070 -4510:0:4365 -4511:2:2322 -4512:0:4365 -4513:2:1169 -4514:0:4365 -4515:3:4069 -4516:0:4365 -4517:2:1170 -4518:0:4365 -4519:3:4070 -4520:0:4365 -4521:3:4071 -4522:0:4365 -4523:3:4081 -4524:0:4365 -4525:3:3666 -4526:0:4365 -4527:3:3667 -4528:0:4365 -4529:3:3668 -4530:0:4365 -4531:3:3669 -4532:3:3673 -4533:3:3674 -4534:3:3682 -4535:3:3683 -4536:3:3687 -4537:3:3688 -4538:3:3682 -4539:3:3683 -4540:3:3687 -4541:3:3688 -4542:3:3696 -4543:3:3701 -4544:3:3705 -4545:3:3706 -4546:3:3713 -4547:3:3714 -4548:3:3725 -4549:3:3726 -4550:3:3727 -4551:3:3725 -4552:3:3726 -4553:3:3727 -4554:3:3738 -4555:3:3743 -4556:3:3744 -4557:0:4365 -4558:3:3756 -4559:0:4365 -4560:3:3757 -4561:0:4365 -4562:2:1173 -4563:0:4365 -4564:3:3758 -4565:0:4365 -4566:2:1179 -4567:0:4365 -4568:2:1180 -4569:0:4365 -4570:3:3757 -4571:0:4365 -4572:2:1181 -4573:2:1185 -4574:2:1186 -4575:2:1194 -4576:2:1195 -4577:2:1199 -4578:2:1200 -4579:2:1194 -4580:2:1195 -4581:2:1199 -4582:2:1200 -4583:2:1208 -4584:2:1213 -4585:2:1217 -4586:2:1218 -4587:2:1225 -4588:2:1226 -4589:2:1237 -4590:2:1238 -4591:2:1239 -4592:2:1237 -4593:2:1238 -4594:2:1239 -4595:2:1250 -4596:2:1255 -4597:2:1256 -4598:0:4365 -4599:3:3758 -4600:0:4365 -4601:2:1268 -4602:0:4365 -4603:3:3757 -4604:0:4365 -4605:2:1270 -4606:0:4365 -4607:3:3758 -4608:0:4365 -4609:2:1271 -4610:2:1275 -4611:2:1276 -4612:2:1284 -4613:2:1285 -4614:2:1289 -4615:2:1290 -4616:2:1284 -4617:2:1285 -4618:2:1289 -4619:2:1290 -4620:2:1298 -4621:2:1303 -4622:2:1307 -4623:2:1308 -4624:2:1315 -4625:2:1316 -4626:2:1327 -4627:2:1328 -4628:2:1329 -4629:2:1327 -4630:2:1328 -4631:2:1329 -4632:2:1340 -4633:2:1345 -4634:2:1346 -4635:0:4365 -4636:2:1358 -4637:0:4365 -4638:2:1360 -4639:0:4365 -4640:3:3757 -4641:0:4365 -4642:2:1361 -4643:0:4365 -4644:3:3758 -4645:0:4365 -4646:2:1362 -4647:2:1366 -4648:2:1367 -4649:2:1375 -4650:2:1376 -4651:2:1380 -4652:2:1381 -4653:2:1375 -4654:2:1376 -4655:2:1380 -4656:2:1381 -4657:2:1389 -4658:2:1394 -4659:2:1398 -4660:2:1399 -4661:2:1406 -4662:2:1407 -4663:2:1418 -4664:2:1419 -4665:2:1420 -4666:2:1418 -4667:2:1419 -4668:2:1420 -4669:2:1431 -4670:2:1436 -4671:2:1437 -4672:0:4365 -4673:2:1449 -4674:0:4365 -4675:3:3757 -4676:0:4365 -4677:2:1451 -4678:0:4365 -4679:3:3758 -4680:0:4365 -4681:2:1652 -4682:0:4365 -4683:2:1653 -4684:0:4365 -4685:2:1657 -4686:0:4365 -4687:2:1660 -4688:0:4365 -4689:3:3757 -4690:0:4365 -4691:2:1665 -4692:2:1669 -4693:2:1670 -4694:2:1678 -4695:2:1679 -4696:2:1683 -4697:2:1684 -4698:2:1678 -4699:2:1679 -4700:2:1680 -4701:2:1692 -4702:2:1697 -4703:2:1701 -4704:2:1702 -4705:2:1709 -4706:2:1710 -4707:2:1721 -4708:2:1722 -4709:2:1723 -4710:2:1721 -4711:2:1722 -4712:2:1723 -4713:2:1734 -4714:2:1739 -4715:2:1740 -4716:0:4365 -4717:3:3758 -4718:0:4365 -4719:2:1752 -4720:0:4365 -4721:3:3757 -4722:0:4365 -4723:2:1754 -4724:0:4365 -4725:3:3758 -4726:0:4365 -4727:2:1755 -4728:2:1759 -4729:2:1760 -4730:2:1768 -4731:2:1769 -4732:2:1773 -4733:2:1774 -4734:2:1768 -4735:2:1769 -4736:2:1773 -4737:2:1774 -4738:2:1782 -4739:2:1787 -4740:2:1791 -4741:2:1792 -4742:2:1799 -4743:2:1800 -4744:2:1811 -4745:2:1812 -4746:2:1813 -4747:2:1811 -4748:2:1812 -4749:2:1813 -4750:2:1824 -4751:2:1829 -4752:2:1830 -4753:0:4365 -4754:2:1842 -4755:0:4365 -4756:3:3757 -4757:0:4365 -4758:2:1844 -4759:0:4365 -4760:3:3758 -4761:0:4365 -4762:2:1845 -4763:2:1849 -4764:2:1850 -4765:2:1858 -4766:2:1859 -4767:2:1863 -4768:2:1864 -4769:2:1858 -4770:2:1859 -4771:2:1863 -4772:2:1864 -4773:2:1872 -4774:2:1877 -4775:2:1881 -4776:2:1882 -4777:2:1889 -4778:2:1890 -4779:2:1901 -4780:2:1902 -4781:2:1903 -4782:2:1901 -4783:2:1902 -4784:2:1903 -4785:2:1914 -4786:2:1919 -4787:2:1920 -4788:0:4365 -4789:2:1932 -4790:0:4365 -4791:3:3757 -4792:0:4365 -4793:2:1934 -4794:0:4365 -4795:3:3758 -4796:0:4365 -4797:2:1935 -4798:0:4365 -4799:2:1936 -4800:0:4365 -4801:2:2129 -4802:0:4365 -4803:2:2130 -4804:0:4365 -4805:2:2134 -4806:0:4365 -4807:3:3757 -4808:0:4365 -4809:2:2136 -4810:0:4365 -4811:3:3758 -4812:0:4365 -4813:2:2137 -4814:2:2141 -4815:2:2142 -4816:2:2150 -4817:2:2151 -4818:2:2155 -4819:2:2156 -4820:2:2150 -4821:2:2151 -4822:2:2155 -4823:2:2156 -4824:2:2164 -4825:2:2169 -4826:2:2173 -4827:2:2174 -4828:2:2181 -4829:2:2182 -4830:2:2193 -4831:2:2194 -4832:2:2195 -4833:2:2193 -4834:2:2194 -4835:2:2195 -4836:2:2206 -4837:2:2211 -4838:2:2212 -4839:0:4365 -4840:2:2224 -4841:0:4365 -4842:3:3757 -4843:0:4365 -4844:2:2226 -4845:0:4365 -4846:3:3758 -4847:0:4365 -4848:2:2230 -4849:0:4365 -4850:3:3757 -4851:0:4365 -4852:2:2235 -4853:2:2239 -4854:2:2240 -4855:2:2248 -4856:2:2249 -4857:2:2253 -4858:2:2254 -4859:2:2248 -4860:2:2249 -4861:2:2250 -4862:2:2262 -4863:2:2267 -4864:2:2271 -4865:2:2272 -4866:2:2279 -4867:2:2280 -4868:2:2291 -4869:2:2292 -4870:2:2293 -4871:2:2291 -4872:2:2292 -4873:2:2293 -4874:2:2304 -4875:2:2309 -4876:2:2310 -4877:0:4365 -4878:3:3758 -4879:0:4365 -4880:2:2322 -4881:0:4365 -4882:2:1169 -4883:0:4365 -4884:3:3757 -4885:0:4365 -4886:2:1170 -4887:0:4365 -4888:3:3758 -4889:0:4365 -4890:3:3759 -4891:0:4365 -4892:3:3972 -4893:0:4365 -4894:3:4077 -4895:0:4365 -4896:3:4078 -4897:0:4365 -4898:3:4082 -4899:0:4365 -4900:3:4088 -4901:0:4365 -4902:3:4092 -4903:3:4093 -4904:3:4097 -4905:3:4101 -4906:3:4102 -4907:3:4097 -4908:3:4101 -4909:3:4102 -4910:3:4106 -4911:3:4114 -4912:3:4115 -4913:3:4120 -4914:3:4127 -4915:3:4128 -4916:3:4127 -4917:3:4128 -4918:3:4135 -4919:3:4140 -4920:0:4365 -4921:3:4151 -4922:0:4365 -4923:3:4155 -4924:3:4156 -4925:3:4160 -4926:3:4164 -4927:3:4165 -4928:3:4160 -4929:3:4164 -4930:3:4165 -4931:3:4169 -4932:3:4177 -4933:3:4178 -4934:3:4183 -4935:3:4190 -4936:3:4191 -4937:3:4190 -4938:3:4191 -4939:3:4198 -4940:3:4203 -4941:0:4365 -4942:3:4151 -4943:0:4365 -4944:3:4155 -4945:3:4156 -4946:3:4160 -4947:3:4164 -4948:3:4165 -4949:3:4160 -4950:3:4164 -4951:3:4165 -4952:3:4169 -4953:3:4177 -4954:3:4178 -4955:3:4183 -4956:3:4190 -4957:3:4191 -4958:3:4190 -4959:3:4191 -4960:3:4198 -4961:3:4203 -4962:0:4365 -4963:3:4214 -4964:0:4365 -4965:3:4222 -4966:3:4223 -4967:3:4227 -4968:3:4231 -4969:3:4232 -4970:3:4227 -4971:3:4231 -4972:3:4232 -4973:3:4236 -4974:3:4244 -4975:3:4245 -4976:3:4250 -4977:3:4257 -4978:3:4258 -4979:3:4257 -4980:3:4258 -4981:3:4265 -4982:3:4270 -4983:0:4365 -4984:3:4285 -4985:0:4365 -4986:3:4286 -4987:0:4365 -4988:2:1173 -4989:0:4365 -4990:3:4287 -4991:0:4365 -4992:2:1179 -4993:0:4365 -4994:2:1180 -4995:0:4365 -4996:3:4286 -4997:0:4365 -4998:2:1181 -4999:2:1185 -5000:2:1186 -5001:2:1194 -5002:2:1195 -5003:2:1199 -5004:2:1200 -5005:2:1194 -5006:2:1195 -5007:2:1199 -5008:2:1200 -5009:2:1208 -5010:2:1213 -5011:2:1217 -5012:2:1218 -5013:2:1225 -5014:2:1226 -5015:2:1237 -5016:2:1238 -5017:2:1239 -5018:2:1237 -5019:2:1238 -5020:2:1239 -5021:2:1250 -5022:2:1255 -5023:2:1256 -5024:0:4365 -5025:3:4287 -5026:0:4365 -5027:2:1268 -5028:0:4365 -5029:3:4286 -5030:0:4365 -5031:2:1270 -5032:0:4365 -5033:3:4287 -5034:0:4365 -5035:2:1271 -5036:2:1275 -5037:2:1276 -5038:2:1284 -5039:2:1285 -5040:2:1289 -5041:2:1290 -5042:2:1284 -5043:2:1285 -5044:2:1289 -5045:2:1290 -5046:2:1298 -5047:2:1303 -5048:2:1307 -5049:2:1308 -5050:2:1315 -5051:2:1316 -5052:2:1327 -5053:2:1328 -5054:2:1329 -5055:2:1327 -5056:2:1328 -5057:2:1329 -5058:2:1340 -5059:2:1345 -5060:2:1346 -5061:0:4365 -5062:2:1358 -5063:0:4365 -5064:2:1360 -5065:0:4365 -5066:3:4286 -5067:0:4365 -5068:2:1361 -5069:0:4365 -5070:3:4287 -5071:0:4365 -5072:2:1362 -5073:2:1366 -5074:2:1367 -5075:2:1375 -5076:2:1376 -5077:2:1380 -5078:2:1381 -5079:2:1375 -5080:2:1376 -5081:2:1380 -5082:2:1381 -5083:2:1389 -5084:2:1394 -5085:2:1398 -5086:2:1399 -5087:2:1406 -5088:2:1407 -5089:2:1418 -5090:2:1419 -5091:2:1420 -5092:2:1418 -5093:2:1419 -5094:2:1420 -5095:2:1431 -5096:2:1436 -5097:2:1437 -5098:0:4365 -5099:2:1449 -5100:0:4365 -5101:3:4286 -5102:0:4365 -5103:2:1451 -5104:0:4365 -5105:3:4287 -5106:0:4365 -5107:2:1652 -5108:0:4365 -5109:2:1653 -5110:0:4365 -5111:2:1657 -5112:0:4365 -5113:2:1660 -5114:0:4365 -5115:3:4286 -5116:0:4365 -5117:2:1665 -5118:2:1669 -5119:2:1670 -5120:2:1678 -5121:2:1679 -5122:2:1683 -5123:2:1684 -5124:2:1678 -5125:2:1679 -5126:2:1680 -5127:2:1692 -5128:2:1697 -5129:2:1701 -5130:2:1702 -5131:2:1709 -5132:2:1710 -5133:2:1721 -5134:2:1722 -5135:2:1723 -5136:2:1721 -5137:2:1722 -5138:2:1723 -5139:2:1734 -5140:2:1739 -5141:2:1740 -5142:0:4365 -5143:3:4287 -5144:0:4365 -5145:2:1752 -5146:0:4365 -5147:3:4286 -5148:0:4365 -5149:2:1754 -5150:0:4365 -5151:3:4287 -5152:0:4365 -5153:2:1755 -5154:2:1759 -5155:2:1760 -5156:2:1768 -5157:2:1769 -5158:2:1773 -5159:2:1774 -5160:2:1768 -5161:2:1769 -5162:2:1773 -5163:2:1774 -5164:2:1782 -5165:2:1787 -5166:2:1791 -5167:2:1792 -5168:2:1799 -5169:2:1800 -5170:2:1811 -5171:2:1812 -5172:2:1813 -5173:2:1811 -5174:2:1812 -5175:2:1813 -5176:2:1824 -5177:2:1829 -5178:2:1830 -5179:0:4365 -5180:2:1842 -5181:0:4365 -5182:3:4286 -5183:0:4365 -5184:2:1844 -5185:0:4365 -5186:3:4287 -5187:0:4365 -5188:2:1845 -5189:2:1849 -5190:2:1850 -5191:2:1858 -5192:2:1859 -5193:2:1863 -5194:2:1864 -5195:2:1858 -5196:2:1859 -5197:2:1863 -5198:2:1864 -5199:2:1872 -5200:2:1877 -5201:2:1881 -5202:2:1882 -5203:2:1889 -5204:2:1890 -5205:2:1901 -5206:2:1902 -5207:2:1903 -5208:2:1901 -5209:2:1902 -5210:2:1903 -5211:2:1914 -5212:2:1919 -5213:2:1920 -5214:0:4365 -5215:2:1932 -5216:0:4365 -5217:3:4286 -5218:0:4365 -5219:2:1934 -5220:0:4365 -5221:3:4287 -5222:0:4365 -5223:2:1935 -5224:0:4365 -5225:2:1936 -5226:0:4365 -5227:2:2129 -5228:0:4365 -5229:2:2130 -5230:0:4365 -5231:2:2134 -5232:0:4365 -5233:3:4286 -5234:0:4365 -5235:2:2136 -5236:0:4365 -5237:3:4287 -5238:0:4365 -5239:2:2137 -5240:2:2141 -5241:2:2142 -5242:2:2150 -5243:2:2151 -5244:2:2155 -5245:2:2156 -5246:2:2150 -5247:2:2151 -5248:2:2155 -5249:2:2156 -5250:2:2164 -5251:2:2169 -5252:2:2173 -5253:2:2174 -5254:2:2181 -5255:2:2182 -5256:2:2193 -5257:2:2194 -5258:2:2195 -5259:2:2193 -5260:2:2194 -5261:2:2195 -5262:2:2206 -5263:2:2211 -5264:2:2212 -5265:0:4365 -5266:2:2224 -5267:0:4365 -5268:3:4286 -5269:0:4365 -5270:2:2226 -5271:0:4365 -5272:3:4287 -5273:0:4365 -5274:2:2230 -5275:0:4365 -5276:3:4286 -5277:0:4365 -5278:2:2235 -5279:2:2239 -5280:2:2240 -5281:2:2248 -5282:2:2249 -5283:2:2253 -5284:2:2254 -5285:2:2248 -5286:2:2249 -5287:2:2250 -5288:2:2262 -5289:2:2267 -5290:2:2271 -5291:2:2272 -5292:2:2279 -5293:2:2280 -5294:2:2291 -5295:2:2292 -5296:2:2293 -5297:2:2291 -5298:2:2292 -5299:2:2293 -5300:2:2304 -5301:2:2309 -5302:2:2310 -5303:0:4365 -5304:3:4287 -5305:0:4365 -5306:2:2322 -5307:0:4365 -5308:2:1169 -5309:0:4365 -5310:3:4286 -5311:0:4365 -5312:2:1170 -5313:0:4365 -5314:3:4287 -5315:0:4365 -5316:3:4288 -5317:0:4365 -5318:3:4294 -5319:0:4365 -5320:3:4295 -5321:0:4365 -5322:3:2338 -5323:0:4365 -5324:3:2339 -5325:3:2343 -5326:3:2344 -5327:3:2352 -5328:3:2353 -5329:3:2357 -5330:3:2358 -5331:3:2352 -5332:3:2353 -5333:3:2357 -5334:3:2358 -5335:3:2366 -5336:3:2371 -5337:3:2375 -5338:3:2376 -5339:3:2383 -5340:3:2384 -5341:3:2395 -5342:3:2396 -5343:3:2397 -5344:3:2395 -5345:3:2396 -5346:3:2397 -5347:3:2408 -5348:3:2413 -5349:3:2414 -5350:0:4365 -5351:3:2426 -5352:0:4365 -5353:3:2427 -5354:0:4365 -5355:2:1173 -5356:0:4365 -5357:3:2428 -5358:0:4365 -5359:2:1179 -5360:0:4365 -5361:2:1180 -5362:0:4365 -5363:3:2427 -5364:0:4365 -5365:2:1181 -5366:2:1185 -5367:2:1186 -5368:2:1194 -5369:2:1195 -5370:2:1199 -5371:2:1200 -5372:2:1194 -5373:2:1195 -5374:2:1199 -5375:2:1200 -5376:2:1208 -5377:2:1213 -5378:2:1217 -5379:2:1218 -5380:2:1225 -5381:2:1226 -5382:2:1237 -5383:2:1238 -5384:2:1239 -5385:2:1237 -5386:2:1238 -5387:2:1239 -5388:2:1250 -5389:2:1255 -5390:2:1256 -5391:0:4365 -5392:3:2428 -5393:0:4365 -5394:2:1268 -5395:0:4365 -5396:3:2427 -5397:0:4365 -5398:2:1270 -5399:0:4365 -5400:3:2428 -5401:0:4365 -5402:2:1271 -5403:2:1275 -5404:2:1276 -5405:2:1284 -5406:2:1285 -5407:2:1289 -5408:2:1290 -5409:2:1284 -5410:2:1285 -5411:2:1289 -5412:2:1290 -5413:2:1298 -5414:2:1303 -5415:2:1307 -5416:2:1308 -5417:2:1315 -5418:2:1316 -5419:2:1327 -5420:2:1328 -5421:2:1329 -5422:2:1327 -5423:2:1328 -5424:2:1329 -5425:2:1340 -5426:2:1345 -5427:2:1346 -5428:0:4365 -5429:2:1358 -5430:0:4365 -5431:2:1360 -5432:0:4365 -5433:3:2427 -5434:0:4365 -5435:2:1361 -5436:0:4365 -5437:3:2428 -5438:0:4365 -5439:2:1362 -5440:2:1366 -5441:2:1367 -5442:2:1375 -5443:2:1376 -5444:2:1380 -5445:2:1381 -5446:2:1375 -5447:2:1376 -5448:2:1380 -5449:2:1381 -5450:2:1389 -5451:2:1394 -5452:2:1398 -5453:2:1399 -5454:2:1406 -5455:2:1407 -5456:2:1418 -5457:2:1419 -5458:2:1420 -5459:2:1418 -5460:2:1419 -5461:2:1420 -5462:2:1431 -5463:2:1436 -5464:2:1437 -5465:0:4365 -5466:2:1449 -5467:0:4365 -5468:3:2427 -5469:0:4365 -5470:2:1451 -5471:0:4365 -5472:3:2428 -5473:0:4365 -5474:2:1652 -5475:0:4365 -5476:2:1653 -5477:0:4365 -5478:2:1657 -5479:0:4365 -5480:2:1660 -5481:0:4365 -5482:3:2427 -5483:0:4365 -5484:2:1665 -5485:2:1669 -5486:2:1670 -5487:2:1678 -5488:2:1679 -5489:2:1683 -5490:2:1684 -5491:2:1678 -5492:2:1679 -5493:2:1680 -5494:2:1692 -5495:2:1697 -5496:2:1701 -5497:2:1702 -5498:2:1709 -5499:2:1710 -5500:2:1721 -5501:2:1722 -5502:2:1723 -5503:2:1721 -5504:2:1722 -5505:2:1723 -5506:2:1734 -5507:2:1739 -5508:2:1740 -5509:0:4365 -5510:3:2428 -5511:0:4365 -5512:2:1752 -5513:0:4365 -5514:3:2427 -5515:0:4365 -5516:2:1754 -5517:0:4365 -5518:3:2428 -5519:0:4365 -5520:2:1755 -5521:2:1759 -5522:2:1760 -5523:2:1768 -5524:2:1769 -5525:2:1773 -5526:2:1774 -5527:2:1768 -5528:2:1769 -5529:2:1773 -5530:2:1774 -5531:2:1782 -5532:2:1787 -5533:2:1791 -5534:2:1792 -5535:2:1799 -5536:2:1800 -5537:2:1811 -5538:2:1812 -5539:2:1813 -5540:2:1811 -5541:2:1812 -5542:2:1813 -5543:2:1824 -5544:2:1829 -5545:2:1830 -5546:0:4365 -5547:2:1842 -5548:0:4365 -5549:3:2427 -5550:0:4365 -5551:2:1844 -5552:0:4365 -5553:3:2428 -5554:0:4365 -5555:2:1845 -5556:2:1849 -5557:2:1850 -5558:2:1858 -5559:2:1859 -5560:2:1863 -5561:2:1864 -5562:2:1858 -5563:2:1859 -5564:2:1863 -5565:2:1864 -5566:2:1872 -5567:2:1877 -5568:2:1881 -5569:2:1882 -5570:2:1889 -5571:2:1890 -5572:2:1901 -5573:2:1902 -5574:2:1903 -5575:2:1901 -5576:2:1902 -5577:2:1903 -5578:2:1914 -5579:2:1919 -5580:2:1920 -5581:0:4365 -5582:2:1932 -5583:0:4365 -5584:3:2427 -5585:0:4365 -5586:2:1934 -5587:0:4365 -5588:3:2428 -5589:0:4365 -5590:2:1935 -5591:0:4365 -5592:2:1936 -5593:0:4365 -5594:2:2129 -5595:0:4365 -5596:2:2130 -5597:0:4365 -5598:2:2134 -5599:0:4365 -5600:3:2427 -5601:0:4365 -5602:2:2136 -5603:0:4365 -5604:3:2428 -5605:0:4365 -5606:2:2137 -5607:2:2141 -5608:2:2142 -5609:2:2150 -5610:2:2151 -5611:2:2155 -5612:2:2156 -5613:2:2150 -5614:2:2151 -5615:2:2155 -5616:2:2156 -5617:2:2164 -5618:2:2169 -5619:2:2173 -5620:2:2174 -5621:2:2181 -5622:2:2182 -5623:2:2193 -5624:2:2194 -5625:2:2195 -5626:2:2193 -5627:2:2194 -5628:2:2195 -5629:2:2206 -5630:2:2211 -5631:2:2212 -5632:0:4365 -5633:2:2224 -5634:0:4365 -5635:3:2427 -5636:0:4365 -5637:2:2226 -5638:0:4365 -5639:3:2428 -5640:0:4365 -5641:2:2230 -5642:0:4365 -5643:3:2427 -5644:0:4365 -5645:2:2235 -5646:2:2239 -5647:2:2240 -5648:2:2248 -5649:2:2249 -5650:2:2253 -5651:2:2254 -5652:2:2248 -5653:2:2249 -5654:2:2250 -5655:2:2262 -5656:2:2267 -5657:2:2271 -5658:2:2272 -5659:2:2279 -5660:2:2280 -5661:2:2291 -5662:2:2292 -5663:2:2293 -5664:2:2291 -5665:2:2292 -5666:2:2293 -5667:2:2304 -5668:2:2309 -5669:2:2310 -5670:0:4365 -5671:3:2428 -5672:0:4365 -5673:2:2322 -5674:0:4365 -5675:2:1169 -5676:0:4365 -5677:3:2427 -5678:0:4365 -5679:2:1170 -5680:0:4365 -5681:3:2428 -5682:0:4365 -5683:3:2429 -5684:0:4365 -5685:3:2435 -5686:3:2436 -5687:0:4365 -5688:3:2440 -5689:3:2444 -5690:3:2445 -5691:3:2453 -5692:3:2454 -5693:3:2458 -5694:3:2459 -5695:3:2453 -5696:3:2454 -5697:3:2458 -5698:3:2459 -5699:3:2467 -5700:3:2472 -5701:3:2473 -5702:3:2484 -5703:3:2485 -5704:3:2496 -5705:3:2497 -5706:3:2498 -5707:3:2496 -5708:3:2497 -5709:3:2498 -5710:3:2509 -5711:3:2514 -5712:3:2515 -5713:0:4365 -5714:3:2527 -5715:0:4365 -5716:3:2528 -5717:0:4365 -5718:2:1173 -5719:0:4365 -5720:3:2529 -5721:0:4365 -5722:2:1179 -5723:0:4365 -5724:2:1180 -5725:0:4365 -5726:3:2528 -5727:0:4365 -5728:2:1181 -5729:2:1185 -5730:2:1186 -5731:2:1194 -5732:2:1195 -5733:2:1199 -5734:2:1200 -5735:2:1194 -5736:2:1195 -5737:2:1199 -5738:2:1200 -5739:2:1208 -5740:2:1213 -5741:2:1217 -5742:2:1218 -5743:2:1225 -5744:2:1226 -5745:2:1237 -5746:2:1238 -5747:2:1239 -5748:2:1237 -5749:2:1238 -5750:2:1239 -5751:2:1250 -5752:2:1255 -5753:2:1256 -5754:0:4365 -5755:3:2529 -5756:0:4365 -5757:2:1268 -5758:0:4365 -5759:3:2528 -5760:0:4365 -5761:2:1270 -5762:0:4365 -5763:3:2529 -5764:0:4365 -5765:2:1271 -5766:2:1275 -5767:2:1276 -5768:2:1284 -5769:2:1285 -5770:2:1289 -5771:2:1290 -5772:2:1284 -5773:2:1285 -5774:2:1289 -5775:2:1290 -5776:2:1298 -5777:2:1303 -5778:2:1307 -5779:2:1308 -5780:2:1315 -5781:2:1316 -5782:2:1327 -5783:2:1328 -5784:2:1329 -5785:2:1327 -5786:2:1328 -5787:2:1329 -5788:2:1340 -5789:2:1345 -5790:2:1346 -5791:0:4365 -5792:2:1358 -5793:0:4365 -5794:2:1360 -5795:0:4365 -5796:3:2528 -5797:0:4365 -5798:2:1361 -5799:0:4365 -5800:3:2529 -5801:0:4365 -5802:2:1362 -5803:2:1366 -5804:2:1367 -5805:2:1375 -5806:2:1376 -5807:2:1380 -5808:2:1381 -5809:2:1375 -5810:2:1376 -5811:2:1380 -5812:2:1381 -5813:2:1389 -5814:2:1394 -5815:2:1398 -5816:2:1399 -5817:2:1406 -5818:2:1407 -5819:2:1418 -5820:2:1419 -5821:2:1420 -5822:2:1418 -5823:2:1419 -5824:2:1420 -5825:2:1431 -5826:2:1436 -5827:2:1437 -5828:0:4365 -5829:2:1449 -5830:0:4365 -5831:3:2528 -5832:0:4365 -5833:2:1451 -5834:0:4365 -5835:3:2529 -5836:0:4365 -5837:2:1652 -5838:0:4365 -5839:2:1653 -5840:0:4365 -5841:2:1657 -5842:0:4365 -5843:2:1660 -5844:0:4365 -5845:3:2528 -5846:0:4365 -5847:2:1665 -5848:2:1669 -5849:2:1670 -5850:2:1678 -5851:2:1679 -5852:2:1683 -5853:2:1684 -5854:2:1678 -5855:2:1679 -5856:2:1680 -5857:2:1692 -5858:2:1697 -5859:2:1701 -5860:2:1702 -5861:2:1709 -5862:2:1710 -5863:2:1721 -5864:2:1722 -5865:2:1723 -5866:2:1721 -5867:2:1722 -5868:2:1723 -5869:2:1734 -5870:2:1739 -5871:2:1740 -5872:0:4365 -5873:3:2529 -5874:0:4365 -5875:2:1752 -5876:0:4365 -5877:3:2528 -5878:0:4365 -5879:2:1754 -5880:0:4365 -5881:3:2529 -5882:0:4365 -5883:2:1755 -5884:2:1759 -5885:2:1760 -5886:2:1768 -5887:2:1769 -5888:2:1773 -5889:2:1774 -5890:2:1768 -5891:2:1769 -5892:2:1773 -5893:2:1774 -5894:2:1782 -5895:2:1787 -5896:2:1791 -5897:2:1792 -5898:2:1799 -5899:2:1800 -5900:2:1811 -5901:2:1812 -5902:2:1813 -5903:2:1811 -5904:2:1812 -5905:2:1813 -5906:2:1824 -5907:2:1829 -5908:2:1830 -5909:0:4365 -5910:2:1842 -5911:0:4365 -5912:3:2528 -5913:0:4365 -5914:2:1844 -5915:0:4365 -5916:3:2529 -5917:0:4365 -5918:2:1845 -5919:2:1849 -5920:2:1850 -5921:2:1858 -5922:2:1859 -5923:2:1863 -5924:2:1864 -5925:2:1858 -5926:2:1859 -5927:2:1863 -5928:2:1864 -5929:2:1872 -5930:2:1877 -5931:2:1881 -5932:2:1882 -5933:2:1889 -5934:2:1890 -5935:2:1901 -5936:2:1902 -5937:2:1903 -5938:2:1901 -5939:2:1902 -5940:2:1903 -5941:2:1914 -5942:2:1919 -5943:2:1920 -5944:0:4365 -5945:2:1932 -5946:0:4365 -5947:3:2528 -5948:0:4365 -5949:2:1934 -5950:0:4365 -5951:3:2529 -5952:0:4365 -5953:2:1935 -5954:0:4365 -5955:2:1936 -5956:0:4365 -5957:2:2129 -5958:0:4365 -5959:2:2130 -5960:0:4365 -5961:2:2134 -5962:0:4365 -5963:3:2528 -5964:0:4365 -5965:2:2136 -5966:0:4365 -5967:3:2529 -5968:0:4365 -5969:2:2137 -5970:2:2141 -5971:2:2142 -5972:2:2150 -5973:2:2151 -5974:2:2155 -5975:2:2156 -5976:2:2150 -5977:2:2151 -5978:2:2155 -5979:2:2156 -5980:2:2164 -5981:2:2169 -5982:2:2173 -5983:2:2174 -5984:2:2181 -5985:2:2182 -5986:2:2193 -5987:2:2194 -5988:2:2195 -5989:2:2193 -5990:2:2194 -5991:2:2195 -5992:2:2206 -5993:2:2211 -5994:2:2212 -5995:0:4365 -5996:2:2224 -5997:0:4365 -5998:3:2528 -5999:0:4365 -6000:2:2226 -6001:0:4365 -6002:3:2529 -6003:0:4365 -6004:2:2230 -6005:0:4365 -6006:3:2528 -6007:0:4365 -6008:2:2235 -6009:2:2239 -6010:2:2240 -6011:2:2248 -6012:2:2249 -6013:2:2253 -6014:2:2254 -6015:2:2248 -6016:2:2249 -6017:2:2250 -6018:2:2262 -6019:2:2267 -6020:2:2271 -6021:2:2272 -6022:2:2279 -6023:2:2280 -6024:2:2291 -6025:2:2292 -6026:2:2293 -6027:2:2291 -6028:2:2292 -6029:2:2293 -6030:2:2304 -6031:2:2309 -6032:2:2310 -6033:0:4365 -6034:3:2529 -6035:0:4365 -6036:2:2322 -6037:0:4365 -6038:2:1169 -6039:0:4365 -6040:3:2528 -6041:0:4365 -6042:2:1170 -6043:0:4365 -6044:3:2529 -6045:0:4365 -6046:3:2530 -6047:0:4365 -6048:3:2536 -6049:0:4365 -6050:3:2537 -6051:0:4365 -6052:3:2547 -6053:0:4365 -6054:3:2548 -6055:0:4365 -6056:3:2552 -6057:3:2553 -6058:3:2557 -6059:3:2561 -6060:3:2562 -6061:3:2557 -6062:3:2561 -6063:3:2562 -6064:3:2566 -6065:3:2574 -6066:3:2575 -6067:3:2580 -6068:3:2587 -6069:3:2588 -6070:3:2587 -6071:3:2588 -6072:3:2595 -6073:3:2600 -6074:0:4365 -6075:3:2611 -6076:0:4365 -6077:3:2615 -6078:3:2616 -6079:3:2620 -6080:3:2624 -6081:3:2625 -6082:3:2620 -6083:3:2624 -6084:3:2625 -6085:3:2629 -6086:3:2637 -6087:3:2638 -6088:3:2643 -6089:3:2650 -6090:3:2651 -6091:3:2650 -6092:3:2651 -6093:3:2658 -6094:3:2663 -6095:0:4365 -6096:3:2611 -6097:0:4365 -6098:3:2615 -6099:3:2616 -6100:3:2620 -6101:3:2624 -6102:3:2625 -6103:3:2620 -6104:3:2624 -6105:3:2625 -6106:3:2629 -6107:3:2637 -6108:3:2638 -6109:3:2643 -6110:3:2650 -6111:3:2651 -6112:3:2650 -6113:3:2651 -6114:3:2658 -6115:3:2663 -6116:0:4365 -6117:3:2674 -6118:0:4365 -6119:3:2682 -6120:3:2683 -6121:3:2687 -6122:3:2691 -6123:3:2692 -6124:3:2687 -6125:3:2691 -6126:3:2692 -6127:3:2696 -6128:3:2704 -6129:3:2705 -6130:3:2710 -6131:3:2717 -6132:3:2718 -6133:3:2717 -6134:3:2718 -6135:3:2725 -6136:3:2730 -6137:0:4365 -6138:3:2745 -6139:0:4365 -6140:3:2746 -6141:0:4365 -6142:2:1173 -6143:0:4365 -6144:3:2747 -6145:0:4365 -6146:2:1179 -6147:0:4365 -6148:2:1180 -6149:0:4365 -6150:3:2746 -6151:0:4365 -6152:2:1181 -6153:2:1185 -6154:2:1186 -6155:2:1194 -6156:2:1195 -6157:2:1199 -6158:2:1200 -6159:2:1194 -6160:2:1195 -6161:2:1199 -6162:2:1200 -6163:2:1208 -6164:2:1213 -6165:2:1217 -6166:2:1218 -6167:2:1225 -6168:2:1226 -6169:2:1237 -6170:2:1238 -6171:2:1239 -6172:2:1237 -6173:2:1238 -6174:2:1239 -6175:2:1250 -6176:2:1255 -6177:2:1256 -6178:0:4365 -6179:3:2747 -6180:0:4365 -6181:2:1268 -6182:0:4365 -6183:3:2746 -6184:0:4365 -6185:2:1270 -6186:0:4365 -6187:3:2747 -6188:0:4365 -6189:2:1271 -6190:2:1275 -6191:2:1276 -6192:2:1284 -6193:2:1285 -6194:2:1289 -6195:2:1290 -6196:2:1284 -6197:2:1285 -6198:2:1289 -6199:2:1290 -6200:2:1298 -6201:2:1303 -6202:2:1307 -6203:2:1308 -6204:2:1315 -6205:2:1316 -6206:2:1327 -6207:2:1328 -6208:2:1329 -6209:2:1327 -6210:2:1328 -6211:2:1329 -6212:2:1340 -6213:2:1345 -6214:2:1346 -6215:0:4365 -6216:2:1358 -6217:0:4365 -6218:2:1360 -6219:0:4365 -6220:3:2746 -6221:0:4365 -6222:2:1361 -6223:0:4365 -6224:3:2747 -6225:0:4365 -6226:2:1362 -6227:2:1366 -6228:2:1367 -6229:2:1375 -6230:2:1376 -6231:2:1380 -6232:2:1381 -6233:2:1375 -6234:2:1376 -6235:2:1380 -6236:2:1381 -6237:2:1389 -6238:2:1394 -6239:2:1398 -6240:2:1399 -6241:2:1406 -6242:2:1407 -6243:2:1418 -6244:2:1419 -6245:2:1420 -6246:2:1418 -6247:2:1419 -6248:2:1420 -6249:2:1431 -6250:2:1436 -6251:2:1437 -6252:0:4365 -6253:2:1449 -6254:0:4365 -6255:3:2746 -6256:0:4365 -6257:2:1451 -6258:0:4365 -6259:3:2747 -6260:0:4365 -6261:2:1652 -6262:0:4365 -6263:2:1653 -6264:0:4365 -6265:2:1657 -6266:0:4365 -6267:2:1660 -6268:0:4365 -6269:3:2746 -6270:0:4365 -6271:2:1665 -6272:2:1669 -6273:2:1670 -6274:2:1678 -6275:2:1679 -6276:2:1683 -6277:2:1684 -6278:2:1678 -6279:2:1679 -6280:2:1680 -6281:2:1692 -6282:2:1697 -6283:2:1701 -6284:2:1702 -6285:2:1709 -6286:2:1710 -6287:2:1721 -6288:2:1722 -6289:2:1723 -6290:2:1721 -6291:2:1722 -6292:2:1723 -6293:2:1734 -6294:2:1739 -6295:2:1740 -6296:0:4365 -6297:3:2747 -6298:0:4365 -6299:2:1752 -6300:0:4365 -6301:3:2746 -6302:0:4365 -6303:2:1754 -6304:0:4365 -6305:3:2747 -6306:0:4365 -6307:2:1755 -6308:2:1759 -6309:2:1760 -6310:2:1768 -6311:2:1769 -6312:2:1773 -6313:2:1774 -6314:2:1768 -6315:2:1769 -6316:2:1773 -6317:2:1774 -6318:2:1782 -6319:2:1787 -6320:2:1791 -6321:2:1792 -6322:2:1799 -6323:2:1800 -6324:2:1811 -6325:2:1812 -6326:2:1813 -6327:2:1811 -6328:2:1812 -6329:2:1813 -6330:2:1824 -6331:2:1829 -6332:2:1830 -6333:0:4365 -6334:2:1842 -6335:0:4365 -6336:3:2746 -6337:0:4365 -6338:2:1844 -6339:0:4365 -6340:3:2747 -6341:0:4365 -6342:2:1845 -6343:2:1849 -6344:2:1850 -6345:2:1858 -6346:2:1859 -6347:2:1863 -6348:2:1864 -6349:2:1858 -6350:2:1859 -6351:2:1863 -6352:2:1864 -6353:2:1872 -6354:2:1877 -6355:2:1881 -6356:2:1882 -6357:2:1889 -6358:2:1890 -6359:2:1901 -6360:2:1902 -6361:2:1903 -6362:2:1901 -6363:2:1902 -6364:2:1903 -6365:2:1914 -6366:2:1919 -6367:2:1920 -6368:0:4365 -6369:2:1932 -6370:0:4365 -6371:3:2746 -6372:0:4365 -6373:2:1934 -6374:0:4365 -6375:3:2747 -6376:0:4365 -6377:2:1935 -6378:0:4365 -6379:2:1936 -6380:0:4365 -6381:2:2129 -6382:0:4365 -6383:2:2130 -6384:0:4365 -6385:2:2134 -6386:0:4365 -6387:3:2746 -6388:0:4365 -6389:2:2136 -6390:0:4365 -6391:3:2747 -6392:0:4365 -6393:2:2137 -6394:2:2141 -6395:2:2142 -6396:2:2150 -6397:2:2151 -6398:2:2155 -6399:2:2156 -6400:2:2150 -6401:2:2151 -6402:2:2155 -6403:2:2156 -6404:2:2164 -6405:2:2169 -6406:2:2173 -6407:2:2174 -6408:2:2181 -6409:2:2182 -6410:2:2193 -6411:2:2194 -6412:2:2195 -6413:2:2193 -6414:2:2194 -6415:2:2195 -6416:2:2206 -6417:2:2211 -6418:2:2212 -6419:0:4365 -6420:2:2224 -6421:0:4365 -6422:3:2746 -6423:0:4365 -6424:2:2226 -6425:0:4365 -6426:3:2747 -6427:0:4365 -6428:2:2230 -6429:0:4365 -6430:3:2746 -6431:0:4365 -6432:2:2235 -6433:2:2239 -6434:2:2240 -6435:2:2248 -6436:2:2249 -6437:2:2253 -6438:2:2254 -6439:2:2248 -6440:2:2249 -6441:2:2250 -6442:2:2262 -6443:2:2267 -6444:2:2271 -6445:2:2272 -6446:2:2279 -6447:2:2280 -6448:2:2291 -6449:2:2292 -6450:2:2293 -6451:2:2291 -6452:2:2292 -6453:2:2293 -6454:2:2304 -6455:2:2309 -6456:2:2310 -6457:0:4365 -6458:3:2747 -6459:0:4365 -6460:2:2322 -6461:0:4365 -6462:2:1169 -6463:0:4365 -6464:3:2746 -6465:0:4365 -6466:2:1170 -6467:0:4365 -6468:3:2747 -6469:0:4365 -6470:3:2748 -6471:0:4365 -6472:3:2754 -6473:0:4365 -6474:3:2755 -6475:3:2759 -6476:3:2760 -6477:3:2768 -6478:3:2769 -6479:3:2773 -6480:3:2774 -6481:3:2768 -6482:3:2769 -6483:3:2773 -6484:3:2774 -6485:3:2782 -6486:3:2787 -6487:3:2791 -6488:3:2792 -6489:3:2799 -6490:3:2800 -6491:3:2811 -6492:3:2812 -6493:3:2813 -6494:3:2811 -6495:3:2812 -6496:3:2813 -6497:3:2824 -6498:3:2829 -6499:3:2830 -6500:0:4365 -6501:3:2842 -6502:0:4365 -6503:3:2843 -6504:0:4365 -6505:2:1173 -6506:0:4365 -6507:3:2844 -6508:0:4365 -6509:2:1179 -6510:0:4365 -6511:2:1180 -6512:0:4365 -6513:3:2843 -6514:0:4365 -6515:2:1181 -6516:2:1185 -6517:2:1186 -6518:2:1194 -6519:2:1195 -6520:2:1199 -6521:2:1200 -6522:2:1194 -6523:2:1195 -6524:2:1199 -6525:2:1200 -6526:2:1208 -6527:2:1213 -6528:2:1217 -6529:2:1218 -6530:2:1225 -6531:2:1226 -6532:2:1237 -6533:2:1238 -6534:2:1239 -6535:2:1237 -6536:2:1238 -6537:2:1239 -6538:2:1250 -6539:2:1255 -6540:2:1256 -6541:0:4365 -6542:3:2844 -6543:0:4365 -6544:2:1268 -6545:0:4365 -6546:3:2843 -6547:0:4365 -6548:2:1270 -6549:0:4365 -6550:3:2844 -6551:0:4365 -6552:2:1271 -6553:2:1275 -6554:2:1276 -6555:2:1284 -6556:2:1285 -6557:2:1289 -6558:2:1290 -6559:2:1284 -6560:2:1285 -6561:2:1289 -6562:2:1290 -6563:2:1298 -6564:2:1303 -6565:2:1307 -6566:2:1308 -6567:2:1315 -6568:2:1316 -6569:2:1327 -6570:2:1328 -6571:2:1329 -6572:2:1327 -6573:2:1328 -6574:2:1329 -6575:2:1340 -6576:2:1345 -6577:2:1346 -6578:0:4365 -6579:2:1358 -6580:0:4365 -6581:2:1360 -6582:0:4365 -6583:3:2843 -6584:0:4365 -6585:2:1361 -6586:0:4365 -6587:3:2844 -6588:0:4365 -6589:2:1362 -6590:2:1366 -6591:2:1367 -6592:2:1375 -6593:2:1376 -6594:2:1380 -6595:2:1381 -6596:2:1375 -6597:2:1376 -6598:2:1380 -6599:2:1381 -6600:2:1389 -6601:2:1394 -6602:2:1398 -6603:2:1399 -6604:2:1406 -6605:2:1407 -6606:2:1418 -6607:2:1419 -6608:2:1420 -6609:2:1418 -6610:2:1419 -6611:2:1420 -6612:2:1431 -6613:2:1436 -6614:2:1437 -6615:0:4365 -6616:2:1449 -6617:0:4365 -6618:3:2843 -6619:0:4365 -6620:2:1451 -6621:0:4365 -6622:3:2844 -6623:0:4365 -6624:2:1652 -6625:0:4365 -6626:2:1653 -6627:0:4365 -6628:2:1657 -6629:0:4365 -6630:2:1660 -6631:0:4365 -6632:3:2843 -6633:0:4365 -6634:2:1665 -6635:2:1669 -6636:2:1670 -6637:2:1678 -6638:2:1679 -6639:2:1683 -6640:2:1684 -6641:2:1678 -6642:2:1679 -6643:2:1680 -6644:2:1692 -6645:2:1697 -6646:2:1701 -6647:2:1702 -6648:2:1709 -6649:2:1710 -6650:2:1721 -6651:2:1722 -6652:2:1723 -6653:2:1721 -6654:2:1722 -6655:2:1723 -6656:2:1734 -6657:2:1739 -6658:2:1740 -6659:0:4365 -6660:3:2844 -6661:0:4365 -6662:2:1752 -6663:0:4365 -6664:3:2843 -6665:0:4365 -6666:2:1754 -6667:0:4365 -6668:3:2844 -6669:0:4365 -6670:2:1755 -6671:2:1759 -6672:2:1760 -6673:2:1768 -6674:2:1769 -6675:2:1773 -6676:2:1774 -6677:2:1768 -6678:2:1769 -6679:2:1773 -6680:2:1774 -6681:2:1782 -6682:2:1787 -6683:2:1791 -6684:2:1792 -6685:2:1799 -6686:2:1800 -6687:2:1811 -6688:2:1812 -6689:2:1813 -6690:2:1811 -6691:2:1812 -6692:2:1813 -6693:2:1824 -6694:2:1829 -6695:2:1830 -6696:0:4365 -6697:2:1842 -6698:0:4365 -6699:3:2843 -6700:0:4365 -6701:2:1844 -6702:0:4365 -6703:3:2844 -6704:0:4365 -6705:2:1845 -6706:2:1849 -6707:2:1850 -6708:2:1858 -6709:2:1859 -6710:2:1863 -6711:2:1864 -6712:2:1858 -6713:2:1859 -6714:2:1863 -6715:2:1864 -6716:2:1872 -6717:2:1877 -6718:2:1881 -6719:2:1882 -6720:2:1889 -6721:2:1890 -6722:2:1901 -6723:2:1902 -6724:2:1903 -6725:2:1901 -6726:2:1902 -6727:2:1903 -6728:2:1914 -6729:2:1919 -6730:2:1920 -6731:0:4365 -6732:2:1932 -6733:0:4365 -6734:3:2843 -6735:0:4365 -6736:2:1934 -6737:0:4365 -6738:3:2844 -6739:0:4365 -6740:2:1935 -6741:0:4365 -6742:2:1936 -6743:0:4365 -6744:2:2129 -6745:0:4365 -6746:2:2130 -6747:0:4365 -6748:2:2134 -6749:0:4365 -6750:3:2843 -6751:0:4365 -6752:2:2136 -6753:0:4365 -6754:3:2844 -6755:0:4365 -6756:2:2137 -6757:2:2141 -6758:2:2142 -6759:2:2150 -6760:2:2151 -6761:2:2155 -6762:2:2156 -6763:2:2150 -6764:2:2151 -6765:2:2155 -6766:2:2156 -6767:2:2164 -6768:2:2169 -6769:2:2173 -6770:2:2174 -6771:2:2181 -6772:2:2182 -6773:2:2193 -6774:2:2194 -6775:2:2195 -6776:2:2193 -6777:2:2194 -6778:2:2195 -6779:2:2206 -6780:2:2211 -6781:2:2212 -6782:0:4365 -6783:2:2224 -6784:0:4365 -6785:3:2843 -6786:0:4365 -6787:2:2226 -6788:0:4365 -6789:3:2844 -6790:0:4365 -6791:2:2230 -6792:0:4365 -6793:3:2843 -6794:0:4365 -6795:2:2235 -6796:2:2239 -6797:2:2240 -6798:2:2248 -6799:2:2249 -6800:2:2253 -6801:2:2254 -6802:2:2248 -6803:2:2249 -6804:2:2250 -6805:2:2262 -6806:2:2267 -6807:2:2271 -6808:2:2272 -6809:2:2279 -6810:2:2280 -6811:2:2291 -6812:2:2292 -6813:2:2293 -6814:2:2291 -6815:2:2292 -6816:2:2293 -6817:2:2304 -6818:2:2309 -6819:2:2310 -6820:0:4365 -6821:3:2844 -6822:0:4365 -6823:2:2322 -6824:0:4365 -6825:2:1169 -6826:0:4365 -6827:3:2843 -6828:0:4365 -6829:2:1170 -6830:0:4365 -6831:3:2844 -6832:0:4365 -6833:3:2845 -6834:0:4365 -6835:3:2851 -6836:0:4365 -6837:3:2854 -6838:3:2855 -6839:3:2867 -6840:3:2868 -6841:3:2872 -6842:3:2873 -6843:3:2867 -6844:3:2868 -6845:3:2872 -6846:3:2873 -6847:3:2881 -6848:3:2886 -6849:3:2890 -6850:3:2891 -6851:3:2898 -6852:3:2899 -6853:3:2910 -6854:3:2911 -6855:3:2912 -6856:3:2910 -6857:3:2911 -6858:3:2912 -6859:3:2923 -6860:3:2928 -6861:3:2929 -6862:0:4365 -6863:3:2941 -6864:0:4365 -6865:3:2942 -6866:0:4365 -6867:2:1173 -6868:0:4365 -6869:3:2943 -6870:0:4365 -6871:2:1179 -6872:0:4365 -6873:2:1180 -6874:0:4365 -6875:3:2942 -6876:0:4365 -6877:2:1181 -6878:2:1185 -6879:2:1186 -6880:2:1194 -6881:2:1195 -6882:2:1199 -6883:2:1200 -6884:2:1194 -6885:2:1195 -6886:2:1199 -6887:2:1200 -6888:2:1208 -6889:2:1213 -6890:2:1217 -6891:2:1218 -6892:2:1225 -6893:2:1226 -6894:2:1237 -6895:2:1238 -6896:2:1239 -6897:2:1237 -6898:2:1238 -6899:2:1239 -6900:2:1250 -6901:2:1255 -6902:2:1256 -6903:0:4365 -6904:3:2943 -6905:0:4365 -6906:2:1268 -6907:0:4365 -6908:3:2942 -6909:0:4365 -6910:2:1270 -6911:0:4365 -6912:3:2943 -6913:0:4365 -6914:2:1271 -6915:2:1275 -6916:2:1276 -6917:2:1284 -6918:2:1285 -6919:2:1289 -6920:2:1290 -6921:2:1284 -6922:2:1285 -6923:2:1289 -6924:2:1290 -6925:2:1298 -6926:2:1303 -6927:2:1307 -6928:2:1308 -6929:2:1315 -6930:2:1316 -6931:2:1327 -6932:2:1328 -6933:2:1329 -6934:2:1327 -6935:2:1328 -6936:2:1329 -6937:2:1340 -6938:2:1345 -6939:2:1346 -6940:0:4365 -6941:2:1358 -6942:0:4365 -6943:2:1360 -6944:0:4365 -6945:3:2942 -6946:0:4365 -6947:2:1361 -6948:0:4365 -6949:3:2943 -6950:0:4365 -6951:2:1362 -6952:2:1366 -6953:2:1367 -6954:2:1375 -6955:2:1376 -6956:2:1380 -6957:2:1381 -6958:2:1375 -6959:2:1376 -6960:2:1380 -6961:2:1381 -6962:2:1389 -6963:2:1394 -6964:2:1398 -6965:2:1399 -6966:2:1406 -6967:2:1407 -6968:2:1418 -6969:2:1419 -6970:2:1420 -6971:2:1418 -6972:2:1419 -6973:2:1420 -6974:2:1431 -6975:2:1436 -6976:2:1437 -6977:0:4365 -6978:2:1449 -6979:0:4365 -6980:3:2942 -6981:0:4365 -6982:2:1451 -6983:0:4365 -6984:3:2943 -6985:0:4365 -6986:2:1652 -6987:0:4365 -6988:2:1653 -6989:0:4365 -6990:2:1657 -6991:0:4365 -6992:2:1660 -6993:0:4365 -6994:3:2942 -6995:0:4365 -6996:2:1665 -6997:2:1669 -6998:2:1670 -6999:2:1678 -7000:2:1679 -7001:2:1683 -7002:2:1684 -7003:2:1678 -7004:2:1679 -7005:2:1680 -7006:2:1692 -7007:2:1697 -7008:2:1701 -7009:2:1702 -7010:2:1709 -7011:2:1710 -7012:2:1721 -7013:2:1722 -7014:2:1723 -7015:2:1721 -7016:2:1722 -7017:2:1723 -7018:2:1734 -7019:2:1739 -7020:2:1740 -7021:0:4365 -7022:3:2943 -7023:0:4365 -7024:2:1752 -7025:0:4365 -7026:3:2942 -7027:0:4365 -7028:2:1754 -7029:0:4365 -7030:3:2943 -7031:0:4365 -7032:2:1755 -7033:2:1759 -7034:2:1760 -7035:2:1768 -7036:2:1769 -7037:2:1773 -7038:2:1774 -7039:2:1768 -7040:2:1769 -7041:2:1773 -7042:2:1774 -7043:2:1782 -7044:2:1787 -7045:2:1791 -7046:2:1792 -7047:2:1799 -7048:2:1800 -7049:2:1811 -7050:2:1812 -7051:2:1813 -7052:2:1811 -7053:2:1812 -7054:2:1813 -7055:2:1824 -7056:2:1829 -7057:2:1830 -7058:0:4365 -7059:2:1842 -7060:0:4365 -7061:3:2942 -7062:0:4365 -7063:2:1844 -7064:0:4365 -7065:3:2943 -7066:0:4365 -7067:2:1845 -7068:2:1849 -7069:2:1850 -7070:2:1858 -7071:2:1859 -7072:2:1863 -7073:2:1864 -7074:2:1858 -7075:2:1859 -7076:2:1863 -7077:2:1864 -7078:2:1872 -7079:2:1877 -7080:2:1881 -7081:2:1882 -7082:2:1889 -7083:2:1890 -7084:2:1901 -7085:2:1902 -7086:2:1903 -7087:2:1901 -7088:2:1902 -7089:2:1903 -7090:2:1914 -7091:2:1919 -7092:2:1920 -7093:0:4365 -7094:2:1932 -7095:0:4365 -7096:3:2942 -7097:0:4365 -7098:2:1934 -7099:0:4365 -7100:3:2943 -7101:0:4365 -7102:2:1935 -7103:0:4365 -7104:2:1936 -7105:0:4365 -7106:2:2129 -7107:0:4365 -7108:2:2130 -7109:0:4365 -7110:2:2134 -7111:0:4365 -7112:3:2942 -7113:0:4365 -7114:2:2136 -7115:0:4365 -7116:3:2943 -7117:0:4365 -7118:2:2137 -7119:2:2141 -7120:2:2142 -7121:2:2150 -7122:2:2151 -7123:2:2155 -7124:2:2156 -7125:2:2150 -7126:2:2151 -7127:2:2155 -7128:2:2156 -7129:2:2164 -7130:2:2169 -7131:2:2173 -7132:2:2174 -7133:2:2181 -7134:2:2182 -7135:2:2193 -7136:2:2194 -7137:2:2195 -7138:2:2193 -7139:2:2194 -7140:2:2195 -7141:2:2206 -7142:2:2211 -7143:2:2212 -7144:0:4365 -7145:2:2224 -7146:0:4365 -7147:3:2942 -7148:0:4365 -7149:2:2226 -7150:0:4365 -7151:3:2943 -7152:0:4365 -7153:2:2230 -7154:0:4365 -7155:3:2942 -7156:0:4365 -7157:2:2235 -7158:2:2239 -7159:2:2240 -7160:2:2248 -7161:2:2249 -7162:2:2253 -7163:2:2254 -7164:2:2248 -7165:2:2249 -7166:2:2250 -7167:2:2262 -7168:2:2267 -7169:2:2271 -7170:2:2272 -7171:2:2279 -7172:2:2280 -7173:2:2291 -7174:2:2292 -7175:2:2293 -7176:2:2291 -7177:2:2292 -7178:2:2293 -7179:2:2304 -7180:2:2309 -7181:2:2310 -7182:0:4365 -7183:3:2943 -7184:0:4365 -7185:2:2322 -7186:0:4365 -7187:2:1169 -7188:0:4365 -7189:3:2942 -7190:0:4365 -7191:2:1170 -7192:0:4365 -7193:3:2943 -7194:0:4365 -7195:3:2944 -7196:0:4365 -7197:3:2950 -7198:0:4365 -7199:3:2951 -7200:0:4365 -7201:3:2952 -7202:0:4365 -7203:3:2953 -7204:0:4365 -7205:3:2954 -7206:3:2958 -7207:3:2959 -7208:3:2967 -7209:3:2968 -7210:3:2972 -7211:3:2973 -7212:3:2967 -7213:3:2968 -7214:3:2972 -7215:3:2973 -7216:3:2981 -7217:3:2986 -7218:3:2990 -7219:3:2991 -7220:3:2998 -7221:3:2999 -7222:3:3010 -7223:3:3011 -7224:3:3012 -7225:3:3010 -7226:3:3011 -7227:3:3012 -7228:3:3023 -7229:3:3028 -7230:3:3029 -7231:0:4365 -7232:3:3041 -7233:0:4365 -7234:3:3042 -7235:0:4365 -7236:2:1173 -7237:0:4365 -7238:3:3043 -7239:0:4365 -7240:2:1179 -7241:0:4365 -7242:2:1180 -7243:0:4365 -7244:3:3042 -7245:0:4365 -7246:2:1181 -7247:2:1185 -7248:2:1186 -7249:2:1194 -7250:2:1195 -7251:2:1199 -7252:2:1200 -7253:2:1194 -7254:2:1195 -7255:2:1199 -7256:2:1200 -7257:2:1208 -7258:2:1213 -7259:2:1217 -7260:2:1218 -7261:2:1225 -7262:2:1226 -7263:2:1237 -7264:2:1238 -7265:2:1239 -7266:2:1237 -7267:2:1238 -7268:2:1239 -7269:2:1250 -7270:2:1255 -7271:2:1256 -7272:0:4365 -7273:3:3043 -7274:0:4365 -7275:2:1268 -7276:0:4365 -7277:3:3042 -7278:0:4365 -7279:2:1270 -7280:0:4365 -7281:3:3043 -7282:0:4365 -7283:2:1271 -7284:2:1275 -7285:2:1276 -7286:2:1284 -7287:2:1285 -7288:2:1289 -7289:2:1290 -7290:2:1284 -7291:2:1285 -7292:2:1289 -7293:2:1290 -7294:2:1298 -7295:2:1303 -7296:2:1307 -7297:2:1308 -7298:2:1315 -7299:2:1316 -7300:2:1327 -7301:2:1328 -7302:2:1329 -7303:2:1327 -7304:2:1328 -7305:2:1329 -7306:2:1340 -7307:2:1345 -7308:2:1346 -7309:0:4365 -7310:2:1358 -7311:0:4365 -7312:2:1360 -7313:0:4365 -7314:3:3042 -7315:0:4365 -7316:2:1361 -7317:0:4365 -7318:3:3043 -7319:0:4365 -7320:2:1362 -7321:2:1366 -7322:2:1367 -7323:2:1375 -7324:2:1376 -7325:2:1380 -7326:2:1381 -7327:2:1375 -7328:2:1376 -7329:2:1380 -7330:2:1381 -7331:2:1389 -7332:2:1394 -7333:2:1398 -7334:2:1399 -7335:2:1406 -7336:2:1407 -7337:2:1418 -7338:2:1419 -7339:2:1420 -7340:2:1418 -7341:2:1419 -7342:2:1420 -7343:2:1431 -7344:2:1436 -7345:2:1437 -7346:0:4365 -7347:2:1449 -7348:0:4365 -7349:3:3042 -7350:0:4365 -7351:2:1451 -7352:0:4365 -7353:3:3043 -7354:0:4365 -7355:2:1652 -7356:0:4365 -7357:2:1653 -7358:0:4365 -7359:2:1657 -7360:0:4365 -7361:2:1660 -7362:0:4365 -7363:3:3042 -7364:0:4365 -7365:2:1665 -7366:2:1669 -7367:2:1670 -7368:2:1678 -7369:2:1679 -7370:2:1683 -7371:2:1684 -7372:2:1678 -7373:2:1679 -7374:2:1680 -7375:2:1692 -7376:2:1697 -7377:2:1701 -7378:2:1702 -7379:2:1709 -7380:2:1710 -7381:2:1721 -7382:2:1722 -7383:2:1723 -7384:2:1721 -7385:2:1722 -7386:2:1723 -7387:2:1734 -7388:2:1739 -7389:2:1740 -7390:0:4365 -7391:3:3043 -7392:0:4365 -7393:2:1752 -7394:0:4365 -7395:3:3042 -7396:0:4365 -7397:2:1754 -7398:0:4365 -7399:3:3043 -7400:0:4365 -7401:2:1755 -7402:2:1759 -7403:2:1760 -7404:2:1768 -7405:2:1769 -7406:2:1773 -7407:2:1774 -7408:2:1768 -7409:2:1769 -7410:2:1773 -7411:2:1774 -7412:2:1782 -7413:2:1787 -7414:2:1791 -7415:2:1792 -7416:2:1799 -7417:2:1800 -7418:2:1811 -7419:2:1812 -7420:2:1813 -7421:2:1811 -7422:2:1812 -7423:2:1813 -7424:2:1824 -7425:2:1829 -7426:2:1830 -7427:0:4365 -7428:2:1842 -7429:0:4365 -7430:3:3042 -7431:0:4365 -7432:2:1844 -7433:0:4365 -7434:3:3043 -7435:0:4365 -7436:2:1845 -7437:2:1849 -7438:2:1850 -7439:2:1858 -7440:2:1859 -7441:2:1863 -7442:2:1864 -7443:2:1858 -7444:2:1859 -7445:2:1863 -7446:2:1864 -7447:2:1872 -7448:2:1877 -7449:2:1881 -7450:2:1882 -7451:2:1889 -7452:2:1890 -7453:2:1901 -7454:2:1902 -7455:2:1903 -7456:2:1901 -7457:2:1902 -7458:2:1903 -7459:2:1914 -7460:2:1919 -7461:2:1920 -7462:0:4365 -7463:2:1932 -7464:0:4365 -7465:3:3042 -7466:0:4365 -7467:2:1934 -7468:0:4365 -7469:3:3043 -7470:0:4365 -7471:2:1935 -7472:0:4365 -7473:2:1936 -7474:0:4365 -7475:2:2129 -7476:0:4365 -7477:2:2130 -7478:0:4365 -7479:2:2134 -7480:0:4365 -7481:3:3042 -7482:0:4365 -7483:2:2136 -7484:0:4365 -7485:3:3043 -7486:0:4365 -7487:2:2137 -7488:2:2141 -7489:2:2142 -7490:2:2150 -7491:2:2151 -7492:2:2155 -7493:2:2156 -7494:2:2150 -7495:2:2151 -7496:2:2155 -7497:2:2156 -7498:2:2164 -7499:2:2169 -7500:2:2173 -7501:2:2174 -7502:2:2181 -7503:2:2182 -7504:2:2193 -7505:2:2194 -7506:2:2195 -7507:2:2193 -7508:2:2194 -7509:2:2195 -7510:2:2206 -7511:2:2211 -7512:2:2212 -7513:0:4365 -7514:2:2224 -7515:0:4365 -7516:3:3042 -7517:0:4365 -7518:2:2226 -7519:0:4365 -7520:3:3043 -7521:0:4365 -7522:2:2230 -7523:0:4365 -7524:3:3042 -7525:0:4365 -7526:2:2235 -7527:2:2239 -7528:2:2240 -7529:2:2248 -7530:2:2249 -7531:2:2253 -7532:2:2254 -7533:2:2248 -7534:2:2249 -7535:2:2250 -7536:2:2262 -7537:2:2267 -7538:2:2271 -7539:2:2272 -7540:2:2279 -7541:2:2280 -7542:2:2291 -7543:2:2292 -7544:2:2293 -7545:2:2291 -7546:2:2292 -7547:2:2293 -7548:2:2304 -7549:2:2309 -7550:2:2310 -7551:0:4365 -7552:3:3043 -7553:0:4365 -7554:2:2322 -7555:0:4365 -7556:2:1169 -7557:0:4365 -7558:3:3042 -7559:0:4365 -7560:2:1170 -7561:0:4365 -7562:3:3043 -7563:0:4365 -7564:3:3044 -7565:0:4365 -7566:3:3257 -7567:0:4365 -7568:3:3265 -7569:0:4365 -7570:3:3266 -7571:3:3270 -7572:3:3271 -7573:3:3279 -7574:3:3280 -7575:3:3284 -7576:3:3285 -7577:3:3279 -7578:3:3280 -7579:3:3284 -7580:3:3285 -7581:3:3293 -7582:3:3298 -7583:3:3302 -7584:3:3303 -7585:3:3310 -7586:3:3311 -7587:3:3322 -7588:3:3323 -7589:3:3324 -7590:3:3322 -7591:3:3323 -7592:3:3324 -7593:3:3335 -7594:3:3340 -7595:3:3341 -7596:0:4365 -7597:3:3353 -7598:0:4365 -7599:3:3354 -7600:0:4365 -7601:2:1173 -7602:0:4365 -7603:3:3355 -7604:0:4365 -7605:2:1179 -7606:0:4365 -7607:2:1180 -7608:0:4365 -7609:3:3354 -7610:0:4365 -7611:2:1181 -7612:2:1185 -7613:2:1186 -7614:2:1194 -7615:2:1195 -7616:2:1199 -7617:2:1200 -7618:2:1194 -7619:2:1195 -7620:2:1199 -7621:2:1200 -7622:2:1208 -7623:2:1213 -7624:2:1217 -7625:2:1218 -7626:2:1225 -7627:2:1226 -7628:2:1237 -7629:2:1238 -7630:2:1239 -7631:2:1237 -7632:2:1238 -7633:2:1239 -7634:2:1250 -7635:2:1255 -7636:2:1256 -7637:0:4365 -7638:3:3355 -7639:0:4365 -7640:2:1268 -7641:0:4365 -7642:3:3354 -7643:0:4365 -7644:2:1270 -7645:0:4365 -7646:3:3355 -7647:0:4365 -7648:2:1271 -7649:2:1275 -7650:2:1276 -7651:2:1284 -7652:2:1285 -7653:2:1289 -7654:2:1290 -7655:2:1284 -7656:2:1285 -7657:2:1289 -7658:2:1290 -7659:2:1298 -7660:2:1303 -7661:2:1307 -7662:2:1308 -7663:2:1315 -7664:2:1316 -7665:2:1327 -7666:2:1328 -7667:2:1329 -7668:2:1327 -7669:2:1328 -7670:2:1329 -7671:2:1340 -7672:2:1345 -7673:2:1346 -7674:0:4365 -7675:2:1358 -7676:0:4365 -7677:2:1360 -7678:0:4365 -7679:3:3354 -7680:0:4365 -7681:2:1361 -7682:0:4365 -7683:3:3355 -7684:0:4365 -7685:2:1362 -7686:2:1366 -7687:2:1367 -7688:2:1375 -7689:2:1376 -7690:2:1380 -7691:2:1381 -7692:2:1375 -7693:2:1376 -7694:2:1380 -7695:2:1381 -7696:2:1389 -7697:2:1394 -7698:2:1398 -7699:2:1399 -7700:2:1406 -7701:2:1407 -7702:2:1418 -7703:2:1419 -7704:2:1420 -7705:2:1418 -7706:2:1419 -7707:2:1420 -7708:2:1431 -7709:2:1436 -7710:2:1437 -7711:0:4365 -7712:2:1449 -7713:0:4365 -7714:3:3354 -7715:0:4365 -7716:2:1451 -7717:0:4365 -7718:3:3355 -7719:0:4365 -7720:2:1652 -7721:0:4365 -7722:2:1653 -7723:0:4365 -7724:2:1657 -7725:0:4365 -7726:2:1660 -7727:0:4365 -7728:3:3354 -7729:0:4365 -7730:2:1665 -7731:2:1669 -7732:2:1670 -7733:2:1678 -7734:2:1679 -7735:2:1683 -7736:2:1684 -7737:2:1678 -7738:2:1679 -7739:2:1680 -7740:2:1692 -7741:2:1697 -7742:2:1701 -7743:2:1702 -7744:2:1709 -7745:2:1710 -7746:2:1721 -7747:2:1722 -7748:2:1723 -7749:2:1721 -7750:2:1722 -7751:2:1723 -7752:2:1734 -7753:2:1739 -7754:2:1740 -7755:0:4365 -7756:3:3355 -7757:0:4365 -7758:2:1752 -7759:0:4365 -7760:3:3354 -7761:0:4365 -7762:2:1754 -7763:0:4365 -7764:3:3355 -7765:0:4365 -7766:2:1755 -7767:2:1759 -7768:2:1760 -7769:2:1768 -7770:2:1769 -7771:2:1773 -7772:2:1774 -7773:2:1768 -7774:2:1769 -7775:2:1773 -7776:2:1774 -7777:2:1782 -7778:2:1787 -7779:2:1791 -7780:2:1792 -7781:2:1799 -7782:2:1800 -7783:2:1811 -7784:2:1812 -7785:2:1813 -7786:2:1811 -7787:2:1812 -7788:2:1813 -7789:2:1824 -7790:2:1829 -7791:2:1830 -7792:0:4365 -7793:2:1842 -7794:0:4365 -7795:3:3354 -7796:0:4365 -7797:2:1844 -7798:0:4365 -7799:3:3355 -7800:0:4365 -7801:2:1845 -7802:2:1849 -7803:2:1850 -7804:2:1858 -7805:2:1859 -7806:2:1863 -7807:2:1864 -7808:2:1858 -7809:2:1859 -7810:2:1863 -7811:2:1864 -7812:2:1872 -7813:2:1877 -7814:2:1881 -7815:2:1882 -7816:2:1889 -7817:2:1890 -7818:2:1901 -7819:2:1902 -7820:2:1903 -7821:2:1901 -7822:2:1902 -7823:2:1903 -7824:2:1914 -7825:2:1919 -7826:2:1920 -7827:0:4365 -7828:2:1932 -7829:0:4365 -7830:3:3354 -7831:0:4365 -7832:2:1934 -7833:0:4365 -7834:3:3355 -7835:0:4365 -7836:2:1935 -7837:0:4365 -7838:2:1936 -7839:0:4365 -7840:2:2129 -7841:0:4365 -7842:2:2130 -7843:0:4365 -7844:2:2134 -7845:0:4365 -7846:3:3354 -7847:0:4365 -7848:2:2136 -7849:0:4365 -7850:3:3355 -7851:0:4365 -7852:2:2137 -7853:2:2141 -7854:2:2142 -7855:2:2150 -7856:2:2151 -7857:2:2155 -7858:2:2156 -7859:2:2150 -7860:2:2151 -7861:2:2155 -7862:2:2156 -7863:2:2164 -7864:2:2169 -7865:2:2173 -7866:2:2174 -7867:2:2181 -7868:2:2182 -7869:2:2193 -7870:2:2194 -7871:2:2195 -7872:2:2193 -7873:2:2194 -7874:2:2195 -7875:2:2206 -7876:2:2211 -7877:2:2212 -7878:0:4365 -7879:2:2224 -7880:0:4365 -7881:3:3354 -7882:0:4365 -7883:2:2226 -7884:0:4365 -7885:3:3355 -7886:0:4365 -7887:2:2230 -7888:0:4365 -7889:3:3354 -7890:0:4365 -7891:2:2235 -7892:2:2239 -7893:2:2240 -7894:2:2248 -7895:2:2249 -7896:2:2253 -7897:2:2254 -7898:2:2248 -7899:2:2249 -7900:2:2250 -7901:2:2262 -7902:2:2267 -7903:2:2271 -7904:2:2272 -7905:2:2279 -7906:2:2280 -7907:2:2291 -7908:2:2292 -7909:2:2293 -7910:2:2291 -7911:2:2292 -7912:2:2293 -7913:2:2304 -7914:2:2309 -7915:2:2310 -7916:0:4365 -7917:3:3355 -7918:0:4365 -7919:2:2322 -7920:0:4365 -7921:2:1169 -7922:0:4365 -7923:3:3354 -7924:0:4365 -7925:2:1170 -7926:0:4365 -7927:3:3355 -7928:0:4365 -7929:3:3356 -7930:0:4365 -7931:3:3366 -7932:0:4365 -7933:3:2951 -7934:0:4365 -7935:3:2952 -7936:0:4365 -7937:3:2953 -7938:0:4365 -7939:3:2954 -7940:3:2958 -7941:3:2959 -7942:3:2967 -7943:3:2968 -7944:3:2972 -7945:3:2973 -7946:3:2967 -7947:3:2968 -7948:3:2972 -7949:3:2973 -7950:3:2981 -7951:3:2986 -7952:3:2990 -7953:3:2991 -7954:3:2998 -7955:3:2999 -7956:3:3010 -7957:3:3011 -7958:3:3012 -7959:3:3010 -7960:3:3011 -7961:3:3012 -7962:3:3023 -7963:3:3028 -7964:3:3029 -7965:0:4365 -7966:3:3041 -7967:0:4365 -7968:3:3042 -7969:0:4365 -7970:2:1173 -7971:0:4365 -7972:3:3043 -7973:0:4365 -7974:2:1179 -7975:0:4365 -7976:2:1180 -7977:0:4365 -7978:3:3042 -7979:0:4365 -7980:2:1181 -7981:2:1185 -7982:2:1186 -7983:2:1194 -7984:2:1195 -7985:2:1199 -7986:2:1200 -7987:2:1194 -7988:2:1195 -7989:2:1199 -7990:2:1200 -7991:2:1208 -7992:2:1213 -7993:2:1217 -7994:2:1218 -7995:2:1225 -7996:2:1226 -7997:2:1237 -7998:2:1238 -7999:2:1239 -8000:2:1237 -8001:2:1238 -8002:2:1239 -8003:2:1250 -8004:2:1255 -8005:2:1256 -8006:0:4365 -8007:3:3043 -8008:0:4365 -8009:2:1268 -8010:0:4365 -8011:3:3042 -8012:0:4365 -8013:2:1270 -8014:0:4365 -8015:3:3043 -8016:0:4365 -8017:2:1271 -8018:2:1275 -8019:2:1276 -8020:2:1284 -8021:2:1285 -8022:2:1289 -8023:2:1290 -8024:2:1284 -8025:2:1285 -8026:2:1289 -8027:2:1290 -8028:2:1298 -8029:2:1303 -8030:2:1307 -8031:2:1308 -8032:2:1315 -8033:2:1316 -8034:2:1327 -8035:2:1328 -8036:2:1329 -8037:2:1327 -8038:2:1328 -8039:2:1329 -8040:2:1340 -8041:2:1345 -8042:2:1346 -8043:0:4365 -8044:2:1358 -8045:0:4365 -8046:2:1360 -8047:0:4365 -8048:3:3042 -8049:0:4365 -8050:2:1361 -8051:0:4365 -8052:3:3043 -8053:0:4365 -8054:2:1362 -8055:2:1366 -8056:2:1367 -8057:2:1375 -8058:2:1376 -8059:2:1380 -8060:2:1381 -8061:2:1375 -8062:2:1376 -8063:2:1380 -8064:2:1381 -8065:2:1389 -8066:2:1394 -8067:2:1398 -8068:2:1399 -8069:2:1406 -8070:2:1407 -8071:2:1418 -8072:2:1419 -8073:2:1420 -8074:2:1418 -8075:2:1419 -8076:2:1420 -8077:2:1431 -8078:2:1436 -8079:2:1437 -8080:0:4365 -8081:2:1449 -8082:0:4365 -8083:3:3042 -8084:0:4365 -8085:2:1451 -8086:0:4365 -8087:3:3043 -8088:0:4365 -8089:2:1652 -8090:0:4365 -8091:2:1653 -8092:0:4365 -8093:2:1657 -8094:0:4365 -8095:2:1660 -8096:0:4365 -8097:3:3042 -8098:0:4365 -8099:2:1665 -8100:2:1669 -8101:2:1670 -8102:2:1678 -8103:2:1679 -8104:2:1683 -8105:2:1684 -8106:2:1678 -8107:2:1679 -8108:2:1680 -8109:2:1692 -8110:2:1697 -8111:2:1701 -8112:2:1702 -8113:2:1709 -8114:2:1710 -8115:2:1721 -8116:2:1722 -8117:2:1723 -8118:2:1721 -8119:2:1722 -8120:2:1723 -8121:2:1734 -8122:2:1739 -8123:2:1740 -8124:0:4365 -8125:3:3043 -8126:0:4365 -8127:2:1752 -8128:0:4365 -8129:3:3042 -8130:0:4365 -8131:2:1754 -8132:0:4365 -8133:3:3043 -8134:0:4365 -8135:2:1755 -8136:2:1759 -8137:2:1760 -8138:2:1768 -8139:2:1769 -8140:2:1773 -8141:2:1774 -8142:2:1768 -8143:2:1769 -8144:2:1773 -8145:2:1774 -8146:2:1782 -8147:2:1787 -8148:2:1791 -8149:2:1792 -8150:2:1799 -8151:2:1800 -8152:2:1811 -8153:2:1812 -8154:2:1813 -8155:2:1811 -8156:2:1812 -8157:2:1813 -8158:2:1824 -8159:2:1829 -8160:2:1830 -8161:0:4365 -8162:2:1842 -8163:0:4365 -8164:3:3042 -8165:0:4365 -8166:2:1844 -8167:0:4365 -8168:3:3043 -8169:0:4365 -8170:2:1845 -8171:2:1849 -8172:2:1850 -8173:2:1858 -8174:2:1859 -8175:2:1863 -8176:2:1864 -8177:2:1858 -8178:2:1859 -8179:2:1863 -8180:2:1864 -8181:2:1872 -8182:2:1877 -8183:2:1881 -8184:2:1882 -8185:2:1889 -8186:2:1890 -8187:2:1901 -8188:2:1902 -8189:2:1903 -8190:2:1901 -8191:2:1902 -8192:2:1903 -8193:2:1914 -8194:2:1919 -8195:2:1920 -8196:0:4365 -8197:2:1932 -8198:0:4365 -8199:3:3042 -8200:0:4365 -8201:2:1934 -8202:0:4365 -8203:3:3043 -8204:0:4365 -8205:2:1935 -8206:0:4365 -8207:2:1936 -8208:0:4365 -8209:2:2129 -8210:0:4365 -8211:2:2130 -8212:0:4365 -8213:2:2134 -8214:0:4365 -8215:3:3042 -8216:0:4365 -8217:2:2136 -8218:0:4365 -8219:3:3043 -8220:0:4365 -8221:2:2137 -8222:2:2141 -8223:2:2142 -8224:2:2150 -8225:2:2151 -8226:2:2155 -8227:2:2156 -8228:2:2150 -8229:2:2151 -8230:2:2155 -8231:2:2156 -8232:2:2164 -8233:2:2169 -8234:2:2173 -8235:2:2174 -8236:2:2181 -8237:2:2182 -8238:2:2193 -8239:2:2194 -8240:2:2195 -8241:2:2193 -8242:2:2194 -8243:2:2195 -8244:2:2206 -8245:2:2211 -8246:2:2212 -8247:0:4365 -8248:2:2224 -8249:0:4365 -8250:3:3042 -8251:0:4365 -8252:2:2226 -8253:0:4365 -8254:3:3043 -8255:0:4365 -8256:2:2230 -8257:0:4365 -8258:3:3042 -8259:0:4365 -8260:2:2235 -8261:2:2239 -8262:2:2240 -8263:2:2248 -8264:2:2249 -8265:2:2253 -8266:2:2254 -8267:2:2248 -8268:2:2249 -8269:2:2250 -8270:2:2262 -8271:2:2267 -8272:2:2271 -8273:2:2272 -8274:2:2279 -8275:2:2280 -8276:2:2291 -8277:2:2292 -8278:2:2293 -8279:2:2291 -8280:2:2292 -8281:2:2293 -8282:2:2304 -8283:2:2309 -8284:2:2310 -8285:0:4365 -8286:3:3043 -8287:0:4365 -8288:2:2322 -8289:0:4365 -8290:2:1169 -8291:0:4365 -8292:3:3042 -8293:0:4365 -8294:2:1170 -8295:0:4365 -8296:3:3043 -8297:0:4365 -8298:3:3044 -8299:0:4365 -8300:3:3257 -8301:0:4365 -8302:3:3362 -8303:0:4365 -8304:3:3363 -8305:0:4365 -8306:3:3367 -8307:0:4365 -8308:3:3373 -8309:3:3377 -8310:3:3378 -8311:3:3386 -8312:3:3387 -8313:3:3391 -8314:3:3392 -8315:3:3386 -8316:3:3387 -8317:3:3391 -8318:3:3392 -8319:3:3400 -8320:3:3405 -8321:3:3409 -8322:3:3410 -8323:3:3417 -8324:3:3418 -8325:3:3429 -8326:3:3430 -8327:3:3431 -8328:3:3429 -8329:3:3430 -8330:3:3431 -8331:3:3442 -8332:3:3447 -8333:3:3448 -8334:0:4365 -8335:3:3460 -8336:0:4365 -8337:3:3461 -8338:0:4365 -8339:2:1173 -8340:0:4365 -8341:3:3462 -8342:0:4365 -8343:2:1179 -8344:0:4365 -8345:2:1180 -8346:0:4365 -8347:3:3461 -8348:0:4365 -8349:2:1181 -8350:2:1185 -8351:2:1186 -8352:2:1194 -8353:2:1195 -8354:2:1199 -8355:2:1200 -8356:2:1194 -8357:2:1195 -8358:2:1199 -8359:2:1200 -8360:2:1208 -8361:2:1213 -8362:2:1217 -8363:2:1218 -8364:2:1225 -8365:2:1226 -8366:2:1237 -8367:2:1238 -8368:2:1239 -8369:2:1237 -8370:2:1238 -8371:2:1239 -8372:2:1250 -8373:2:1255 -8374:2:1256 -8375:0:4365 -8376:3:3462 -8377:0:4365 -8378:2:1268 -8379:0:4365 -8380:3:3461 -8381:0:4365 -8382:2:1270 -8383:0:4365 -8384:3:3462 -8385:0:4365 -8386:2:1271 -8387:2:1275 -8388:2:1276 -8389:2:1284 -8390:2:1285 -8391:2:1289 -8392:2:1290 -8393:2:1284 -8394:2:1285 -8395:2:1289 -8396:2:1290 -8397:2:1298 -8398:2:1303 -8399:2:1307 -8400:2:1308 -8401:2:1315 -8402:2:1316 -8403:2:1327 -8404:2:1328 -8405:2:1329 -8406:2:1327 -8407:2:1328 -8408:2:1329 -8409:2:1340 -8410:2:1345 -8411:2:1346 -8412:0:4365 -8413:2:1358 -8414:0:4365 -8415:2:1360 -8416:0:4365 -8417:3:3461 -8418:0:4365 -8419:2:1361 -8420:0:4365 -8421:3:3462 -8422:0:4365 -8423:2:1362 -8424:2:1366 -8425:2:1367 -8426:2:1375 -8427:2:1376 -8428:2:1380 -8429:2:1381 -8430:2:1375 -8431:2:1376 -8432:2:1380 -8433:2:1381 -8434:2:1389 -8435:2:1394 -8436:2:1398 -8437:2:1399 -8438:2:1406 -8439:2:1407 -8440:2:1418 -8441:2:1419 -8442:2:1420 -8443:2:1418 -8444:2:1419 -8445:2:1420 -8446:2:1431 -8447:2:1436 -8448:2:1437 -8449:0:4365 -8450:2:1449 -8451:0:4365 -8452:3:3461 -8453:0:4365 -8454:2:1451 -8455:0:4365 -8456:3:3462 -8457:0:4365 -8458:2:1652 -8459:0:4365 -8460:2:1653 -8461:0:4365 -8462:2:1657 -8463:0:4365 -8464:2:1660 -8465:0:4365 -8466:3:3461 -8467:0:4365 -8468:2:1665 -8469:2:1669 -8470:2:1670 -8471:2:1678 -8472:2:1679 -8473:2:1683 -8474:2:1684 -8475:2:1678 -8476:2:1679 -8477:2:1680 -8478:2:1692 -8479:2:1697 -8480:2:1701 -8481:2:1702 -8482:2:1709 -8483:2:1710 -8484:2:1721 -8485:2:1722 -8486:2:1723 -8487:2:1721 -8488:2:1722 -8489:2:1723 -8490:2:1734 -8491:2:1739 -8492:2:1740 -8493:0:4365 -8494:3:3462 -8495:0:4365 -8496:2:1752 -8497:0:4365 -8498:3:3461 -8499:0:4365 -8500:2:1754 -8501:0:4365 -8502:3:3462 -8503:0:4365 -8504:2:1755 -8505:2:1759 -8506:2:1760 -8507:2:1768 -8508:2:1769 -8509:2:1773 -8510:2:1774 -8511:2:1768 -8512:2:1769 -8513:2:1773 -8514:2:1774 -8515:2:1782 -8516:2:1787 -8517:2:1791 -8518:2:1792 -8519:2:1799 -8520:2:1800 -8521:2:1811 -8522:2:1812 -8523:2:1813 -8524:2:1811 -8525:2:1812 -8526:2:1813 -8527:2:1824 -8528:2:1829 -8529:2:1830 -8530:0:4365 -8531:2:1842 -8532:0:4365 -8533:3:3461 -8534:0:4365 -8535:2:1844 -8536:0:4365 -8537:3:3462 -8538:0:4365 -8539:2:1845 -8540:2:1849 -8541:2:1850 -8542:2:1858 -8543:2:1859 -8544:2:1863 -8545:2:1864 -8546:2:1858 -8547:2:1859 -8548:2:1863 -8549:2:1864 -8550:2:1872 -8551:2:1877 -8552:2:1881 -8553:2:1882 -8554:2:1889 -8555:2:1890 -8556:2:1901 -8557:2:1902 -8558:2:1903 -8559:2:1901 -8560:2:1902 -8561:2:1903 -8562:2:1914 -8563:2:1919 -8564:2:1920 -8565:0:4365 -8566:2:1932 -8567:0:4365 -8568:3:3461 -8569:0:4365 -8570:2:1934 -8571:0:4365 -8572:3:3462 -8573:0:4365 -8574:2:1935 -8575:0:4365 -8576:2:1936 -8577:0:4365 -8578:2:2129 -8579:0:4365 -8580:2:2130 -8581:0:4365 -8582:2:2134 -8583:0:4365 -8584:3:3461 -8585:0:4365 -8586:2:2136 -8587:0:4365 -8588:3:3462 -8589:0:4365 -8590:2:2137 -8591:2:2141 -8592:2:2142 -8593:2:2150 -8594:2:2151 -8595:2:2155 -8596:2:2156 -8597:2:2150 -8598:2:2151 -8599:2:2155 -8600:2:2156 -8601:2:2164 -8602:2:2169 -8603:2:2173 -8604:2:2174 -8605:2:2181 -8606:2:2182 -8607:2:2193 -8608:2:2194 -8609:2:2195 -8610:2:2193 -8611:2:2194 -8612:2:2195 -8613:2:2206 -8614:2:2211 -8615:2:2212 -8616:0:4365 -8617:2:2224 -8618:0:4365 -8619:3:3461 -8620:0:4365 -8621:2:2226 -8622:0:4365 -8623:3:3462 -8624:0:4365 -8625:2:2230 -8626:0:4365 -8627:3:3461 -8628:0:4365 -8629:2:2235 -8630:2:2239 -8631:2:2240 -8632:2:2248 -8633:2:2249 -8634:2:2253 -8635:2:2254 -8636:2:2248 -8637:2:2249 -8638:2:2250 -8639:2:2262 -8640:2:2267 -8641:2:2271 -8642:2:2272 -8643:2:2279 -8644:2:2280 -8645:2:2291 -8646:2:2292 -8647:2:2293 -8648:2:2291 -8649:2:2292 -8650:2:2293 -8651:2:2304 -8652:2:2309 -8653:2:2310 -8654:0:4365 -8655:3:3462 -8656:0:4365 -8657:2:2322 -8658:0:4365 -8659:2:1169 -8660:0:4365 -8661:3:3461 -8662:0:4365 -8663:2:1170 -8664:0:4365 -8665:3:3462 -8666:0:4365 -8667:3:3463 -8668:0:4365 -8669:3:3469 -8670:0:4365 -8671:3:3470 -8672:3:3474 -8673:3:3475 -8674:3:3483 -8675:3:3484 -8676:3:3488 -8677:3:3489 -8678:3:3483 -8679:3:3484 -8680:3:3488 -8681:3:3489 -8682:3:3497 -8683:3:3502 -8684:3:3506 -8685:3:3507 -8686:3:3514 -8687:3:3515 -8688:3:3526 -8689:3:3527 -8690:3:3528 -8691:3:3526 -8692:3:3527 -8693:3:3528 -8694:3:3539 -8695:3:3544 -8696:3:3545 -8697:0:4365 -8698:3:3557 -8699:0:4365 -8700:3:3558 -8701:0:4365 -8702:2:1173 -8703:0:4365 -8704:3:3559 -8705:0:4365 -8706:2:1179 -8707:0:4365 -8708:2:1180 -8709:0:4365 -8710:3:3558 -8711:0:4365 -8712:2:1181 -8713:2:1185 -8714:2:1186 -8715:2:1194 -8716:2:1195 -8717:2:1199 -8718:2:1200 -8719:2:1194 -8720:2:1195 -8721:2:1199 -8722:2:1200 -8723:2:1208 -8724:2:1213 -8725:2:1217 -8726:2:1218 -8727:2:1225 -8728:2:1226 -8729:2:1237 -8730:2:1238 -8731:2:1239 -8732:2:1237 -8733:2:1238 -8734:2:1239 -8735:2:1250 -8736:2:1255 -8737:2:1256 -8738:0:4365 -8739:3:3559 -8740:0:4365 -8741:2:1268 -8742:0:4365 -8743:3:3558 -8744:0:4365 -8745:2:1270 -8746:0:4365 -8747:3:3559 -8748:0:4365 -8749:2:1271 -8750:2:1275 -8751:2:1276 -8752:2:1284 -8753:2:1285 -8754:2:1289 -8755:2:1290 -8756:2:1284 -8757:2:1285 -8758:2:1289 -8759:2:1290 -8760:2:1298 -8761:2:1303 -8762:2:1307 -8763:2:1308 -8764:2:1315 -8765:2:1316 -8766:2:1327 -8767:2:1328 -8768:2:1329 -8769:2:1327 -8770:2:1328 -8771:2:1329 -8772:2:1340 -8773:2:1345 -8774:2:1346 -8775:0:4365 -8776:2:1358 -8777:0:4365 -8778:2:1360 -8779:0:4365 -8780:3:3558 -8781:0:4365 -8782:2:1361 -8783:0:4365 -8784:3:3559 -8785:0:4365 -8786:2:1362 -8787:2:1366 -8788:2:1367 -8789:2:1375 -8790:2:1376 -8791:2:1380 -8792:2:1381 -8793:2:1375 -8794:2:1376 -8795:2:1380 -8796:2:1381 -8797:2:1389 -8798:2:1394 -8799:2:1398 -8800:2:1399 -8801:2:1406 -8802:2:1407 -8803:2:1418 -8804:2:1419 -8805:2:1420 -8806:2:1418 -8807:2:1419 -8808:2:1420 -8809:2:1431 -8810:2:1436 -8811:2:1437 -8812:0:4365 -8813:2:1449 -8814:0:4365 -8815:3:3558 -8816:0:4365 -8817:2:1451 -8818:0:4365 -8819:3:3559 -8820:0:4365 -8821:2:1652 -8822:0:4365 -8823:2:1653 -8824:0:4365 -8825:2:1657 -8826:0:4365 -8827:2:1660 -8828:0:4365 -8829:3:3558 -8830:0:4365 -8831:2:1665 -8832:2:1669 -8833:2:1670 -8834:2:1678 -8835:2:1679 -8836:2:1683 -8837:2:1684 -8838:2:1678 -8839:2:1679 -8840:2:1680 -8841:2:1692 -8842:2:1697 -8843:2:1701 -8844:2:1702 -8845:2:1709 -8846:2:1710 -8847:2:1721 -8848:2:1722 -8849:2:1723 -8850:2:1721 -8851:2:1722 -8852:2:1723 -8853:2:1734 -8854:2:1739 -8855:2:1740 -8856:0:4365 -8857:3:3559 -8858:0:4365 -8859:2:1752 -8860:0:4365 -8861:3:3558 -8862:0:4365 -8863:2:1754 -8864:0:4365 -8865:3:3559 -8866:0:4365 -8867:2:1755 -8868:2:1759 -8869:2:1760 -8870:2:1768 -8871:2:1769 -8872:2:1773 -8873:2:1774 -8874:2:1768 -8875:2:1769 -8876:2:1773 -8877:2:1774 -8878:2:1782 -8879:2:1787 -8880:2:1791 -8881:2:1792 -8882:2:1799 -8883:2:1800 -8884:2:1811 -8885:2:1812 -8886:2:1813 -8887:2:1811 -8888:2:1812 -8889:2:1813 -8890:2:1824 -8891:2:1829 -8892:2:1830 -8893:0:4365 -8894:2:1842 -8895:0:4365 -8896:3:3558 -8897:0:4365 -8898:2:1844 -8899:0:4365 -8900:3:3559 -8901:0:4365 -8902:2:1845 -8903:2:1849 -8904:2:1850 -8905:2:1858 -8906:2:1859 -8907:2:1863 -8908:2:1864 -8909:2:1858 -8910:2:1859 -8911:2:1863 -8912:2:1864 -8913:2:1872 -8914:2:1877 -8915:2:1881 -8916:2:1882 -8917:2:1889 -8918:2:1890 -8919:2:1901 -8920:2:1902 -8921:2:1903 -8922:2:1901 -8923:2:1902 -8924:2:1903 -8925:2:1914 -8926:2:1919 -8927:2:1920 -8928:0:4365 -8929:2:1932 -8930:0:4365 -8931:3:3558 -8932:0:4365 -8933:2:1934 -8934:0:4365 -8935:3:3559 -8936:0:4365 -8937:2:1935 -8938:0:4365 -8939:2:1936 -8940:0:4365 -8941:2:2129 -8942:0:4365 -8943:2:2130 -8944:0:4365 -8945:2:2134 -8946:0:4365 -8947:3:3558 -8948:0:4365 -8949:2:2136 -8950:0:4365 -8951:3:3559 -8952:0:4365 -8953:2:2137 -8954:2:2141 -8955:2:2142 -8956:2:2150 -8957:2:2151 -8958:2:2155 -8959:2:2156 -8960:2:2150 -8961:2:2151 -8962:2:2155 -8963:2:2156 -8964:2:2164 -8965:2:2169 -8966:2:2173 -8967:2:2174 -8968:2:2181 -8969:2:2182 -8970:2:2193 -8971:2:2194 -8972:2:2195 -8973:2:2193 -8974:2:2194 -8975:2:2195 -8976:2:2206 -8977:2:2211 -8978:2:2212 -8979:0:4365 -8980:2:2224 -8981:0:4365 -8982:3:3558 -8983:0:4365 -8984:2:2226 -8985:0:4365 -8986:3:3559 -8987:0:4365 -8988:2:2230 -8989:0:4365 -8990:3:3558 -8991:0:4365 -8992:2:2235 -8993:2:2239 -8994:2:2240 -8995:2:2248 -8996:2:2249 -8997:2:2253 -8998:2:2254 -8999:2:2248 -9000:2:2249 -9001:2:2250 -9002:2:2262 -9003:2:2267 -9004:2:2271 -9005:2:2272 -9006:2:2279 -9007:2:2280 -9008:2:2291 -9009:2:2292 -9010:2:2293 -9011:2:2291 -9012:2:2292 -9013:2:2293 -9014:2:2304 -9015:2:2309 -9016:2:2310 -9017:0:4365 -9018:3:3559 -9019:0:4365 -9020:2:2322 -9021:0:4365 -9022:2:1169 -9023:0:4365 -9024:3:3558 -9025:0:4365 -9026:2:1170 -9027:0:4365 -9028:3:3559 -9029:0:4365 -9030:3:3560 -9031:0:4365 -9032:3:3566 -9033:0:4365 -9034:3:3569 -9035:3:3570 -9036:3:3582 -9037:3:3583 -9038:3:3587 -9039:3:3588 -9040:3:3582 -9041:3:3583 -9042:3:3587 -9043:3:3588 -9044:3:3596 -9045:3:3601 -9046:3:3605 -9047:3:3606 -9048:3:3613 -9049:3:3614 -9050:3:3625 -9051:3:3626 -9052:3:3627 -9053:3:3625 -9054:3:3626 -9055:3:3627 -9056:3:3638 -9057:3:3643 -9058:3:3644 -9059:0:4365 -9060:3:3656 -9061:0:4365 -9062:3:3657 -9063:0:4365 -9064:2:1173 -9065:0:4365 -9066:3:3658 -9067:0:4365 -9068:2:1179 -9069:0:4365 -9070:2:1180 -9071:0:4365 -9072:3:3657 -9073:0:4365 -9074:2:1181 -9075:2:1185 -9076:2:1186 -9077:2:1194 -9078:2:1195 -9079:2:1199 -9080:2:1200 -9081:2:1194 -9082:2:1195 -9083:2:1199 -9084:2:1200 -9085:2:1208 -9086:2:1213 -9087:2:1217 -9088:2:1218 -9089:2:1225 -9090:2:1226 -9091:2:1237 -9092:2:1238 -9093:2:1239 -9094:2:1237 -9095:2:1238 -9096:2:1239 -9097:2:1250 -9098:2:1255 -9099:2:1256 -9100:0:4365 -9101:3:3658 -9102:0:4365 -9103:2:1268 -9104:0:4365 -9105:3:3657 -9106:0:4365 -9107:2:1270 -9108:0:4365 -9109:3:3658 -9110:0:4365 -9111:2:1271 -9112:2:1275 -9113:2:1276 -9114:2:1284 -9115:2:1285 -9116:2:1289 -9117:2:1290 -9118:2:1284 -9119:2:1285 -9120:2:1289 -9121:2:1290 -9122:2:1298 -9123:2:1303 -9124:2:1307 -9125:2:1308 -9126:2:1315 -9127:2:1316 -9128:2:1327 -9129:2:1328 -9130:2:1329 -9131:2:1327 -9132:2:1328 -9133:2:1329 -9134:2:1340 -9135:2:1345 -9136:2:1346 -9137:0:4365 -9138:2:1358 -9139:0:4365 -9140:2:1360 -9141:0:4365 -9142:3:3657 -9143:0:4365 -9144:2:1361 -9145:0:4365 -9146:3:3658 -9147:0:4365 -9148:2:1362 -9149:2:1366 -9150:2:1367 -9151:2:1375 -9152:2:1376 -9153:2:1380 -9154:2:1381 -9155:2:1375 -9156:2:1376 -9157:2:1380 -9158:2:1381 -9159:2:1389 -9160:2:1394 -9161:2:1398 -9162:2:1399 -9163:2:1406 -9164:2:1407 -9165:2:1418 -9166:2:1419 -9167:2:1420 -9168:2:1418 -9169:2:1419 -9170:2:1420 -9171:2:1431 -9172:2:1436 -9173:2:1437 -9174:0:4365 -9175:2:1449 -9176:0:4365 -9177:3:3657 -9178:0:4365 -9179:2:1451 -9180:0:4365 -9181:3:3658 -9182:0:4365 -9183:2:1652 -9184:0:4365 -9185:2:1653 -9186:0:4365 -9187:2:1657 -9188:0:4365 -9189:2:1660 -9190:0:4365 -9191:3:3657 -9192:0:4365 -9193:2:1665 -9194:2:1669 -9195:2:1670 -9196:2:1678 -9197:2:1679 -9198:2:1683 -9199:2:1684 -9200:2:1678 -9201:2:1679 -9202:2:1680 -9203:2:1692 -9204:2:1697 -9205:2:1701 -9206:2:1702 -9207:2:1709 -9208:2:1710 -9209:2:1721 -9210:2:1722 -9211:2:1723 -9212:2:1721 -9213:2:1722 -9214:2:1723 -9215:2:1734 -9216:2:1739 -9217:2:1740 -9218:0:4365 -9219:3:3658 -9220:0:4365 -9221:2:1752 -9222:0:4365 -9223:3:3657 -9224:0:4365 -9225:2:1754 -9226:0:4365 -9227:3:3658 -9228:0:4365 -9229:2:1755 -9230:2:1759 -9231:2:1760 -9232:2:1768 -9233:2:1769 -9234:2:1773 -9235:2:1774 -9236:2:1768 -9237:2:1769 -9238:2:1773 -9239:2:1774 -9240:2:1782 -9241:2:1787 -9242:2:1791 -9243:2:1792 -9244:2:1799 -9245:2:1800 -9246:2:1811 -9247:2:1812 -9248:2:1813 -9249:2:1811 -9250:2:1812 -9251:2:1813 -9252:2:1824 -9253:2:1829 -9254:2:1830 -9255:0:4365 -9256:2:1842 -9257:0:4365 -9258:3:3657 -9259:0:4365 -9260:2:1844 -9261:0:4365 -9262:3:3658 -9263:0:4365 -9264:2:1845 -9265:2:1849 -9266:2:1850 -9267:2:1858 -9268:2:1859 -9269:2:1863 -9270:2:1864 -9271:2:1858 -9272:2:1859 -9273:2:1863 -9274:2:1864 -9275:2:1872 -9276:2:1877 -9277:2:1881 -9278:2:1882 -9279:2:1889 -9280:2:1890 -9281:2:1901 -9282:2:1902 -9283:2:1903 -9284:2:1901 -9285:2:1902 -9286:2:1903 -9287:2:1914 -9288:2:1919 -9289:2:1920 -9290:0:4365 -9291:2:1932 -9292:0:4365 -9293:3:3657 -9294:0:4365 -9295:2:1934 -9296:0:4365 -9297:3:3658 -9298:0:4365 -9299:2:1935 -9300:0:4365 -9301:2:1936 -9302:0:4365 -9303:2:2129 -9304:0:4365 -9305:2:2130 -9306:0:4365 -9307:2:2134 -9308:0:4365 -9309:3:3657 -9310:0:4365 -9311:2:2136 -9312:0:4365 -9313:3:3658 -9314:0:4365 -9315:2:2137 -9316:2:2141 -9317:2:2142 -9318:2:2150 -9319:2:2151 -9320:2:2155 -9321:2:2156 -9322:2:2150 -9323:2:2151 -9324:2:2155 -9325:2:2156 -9326:2:2164 -9327:2:2169 -9328:2:2173 -9329:2:2174 -9330:2:2181 -9331:2:2182 -9332:2:2193 -9333:2:2194 -9334:2:2195 -9335:2:2193 -9336:2:2194 -9337:2:2195 -9338:2:2206 -9339:2:2211 -9340:2:2212 -9341:0:4365 -9342:2:2224 -9343:0:4365 -9344:3:3657 -9345:0:4365 -9346:2:2226 -9347:0:4365 -9348:3:3658 -9349:0:4365 -9350:2:2230 -9351:0:4365 -9352:3:3657 -9353:0:4365 -9354:2:2235 -9355:2:2239 -9356:2:2240 -9357:2:2248 -9358:2:2249 -9359:2:2253 -9360:2:2254 -9361:2:2248 -9362:2:2249 -9363:2:2250 -9364:2:2262 -9365:2:2267 -9366:2:2271 -9367:2:2272 -9368:2:2279 -9369:2:2280 -9370:2:2291 -9371:2:2292 -9372:2:2293 -9373:2:2291 -9374:2:2292 -9375:2:2293 -9376:2:2304 -9377:2:2309 -9378:2:2310 -9379:0:4365 -9380:3:3658 -9381:0:4365 -9382:2:2322 -9383:0:4365 -9384:2:1169 -9385:0:4365 -9386:3:3657 -9387:0:4365 -9388:2:1170 -9389:0:4365 -9390:3:3658 -9391:0:4365 -9392:3:3659 -9393:0:4365 -9394:3:3665 -9395:0:4365 -9396:3:3666 -9397:0:4365 -9398:3:3667 -9399:0:4365 -9400:3:3668 -9401:0:4365 -9402:3:3669 -9403:3:3673 -9404:3:3674 -9405:3:3682 -9406:3:3683 -9407:3:3687 -9408:3:3688 -9409:3:3682 -9410:3:3683 -9411:3:3687 -9412:3:3688 -9413:3:3696 -9414:3:3701 -9415:3:3705 -9416:3:3706 -9417:3:3713 -9418:3:3714 -9419:3:3725 -9420:3:3726 -9421:3:3727 -9422:3:3725 -9423:3:3726 -9424:3:3727 -9425:3:3738 -9426:3:3743 -9427:3:3744 -9428:0:4365 -9429:3:3756 -9430:0:4365 -9431:3:3757 -9432:0:4365 -9433:2:1173 -9434:0:4365 -9435:3:3758 -9436:0:4365 -9437:2:1179 -9438:0:4365 -9439:2:1180 -9440:0:4365 -9441:3:3757 -9442:0:4365 -9443:2:1181 -9444:2:1185 -9445:2:1186 -9446:2:1194 -9447:2:1195 -9448:2:1199 -9449:2:1200 -9450:2:1194 -9451:2:1195 -9452:2:1199 -9453:2:1200 -9454:2:1208 -9455:2:1213 -9456:2:1217 -9457:2:1218 -9458:2:1225 -9459:2:1226 -9460:2:1237 -9461:2:1238 -9462:2:1239 -9463:2:1237 -9464:2:1238 -9465:2:1239 -9466:2:1250 -9467:2:1255 -9468:2:1256 -9469:0:4365 -9470:3:3758 -9471:0:4365 -9472:2:1268 -9473:0:4365 -9474:3:3757 -9475:0:4365 -9476:2:1270 -9477:0:4365 -9478:3:3758 -9479:0:4365 -9480:2:1271 -9481:2:1275 -9482:2:1276 -9483:2:1284 -9484:2:1285 -9485:2:1289 -9486:2:1290 -9487:2:1284 -9488:2:1285 -9489:2:1289 -9490:2:1290 -9491:2:1298 -9492:2:1303 -9493:2:1307 -9494:2:1308 -9495:2:1315 -9496:2:1316 -9497:2:1327 -9498:2:1328 -9499:2:1329 -9500:2:1327 -9501:2:1328 -9502:2:1329 -9503:2:1340 -9504:2:1345 -9505:2:1346 -9506:0:4365 -9507:2:1358 -9508:0:4365 -9509:2:1360 -9510:0:4365 -9511:3:3757 -9512:0:4365 -9513:2:1361 -9514:0:4365 -9515:3:3758 -9516:0:4365 -9517:2:1362 -9518:2:1366 -9519:2:1367 -9520:2:1375 -9521:2:1376 -9522:2:1380 -9523:2:1381 -9524:2:1375 -9525:2:1376 -9526:2:1380 -9527:2:1381 -9528:2:1389 -9529:2:1394 -9530:2:1398 -9531:2:1399 -9532:2:1406 -9533:2:1407 -9534:2:1418 -9535:2:1419 -9536:2:1420 -9537:2:1418 -9538:2:1419 -9539:2:1420 -9540:2:1431 -9541:2:1436 -9542:2:1437 -9543:0:4365 -9544:2:1449 -9545:0:4365 -9546:3:3757 -9547:0:4365 -9548:2:1451 -9549:0:4365 -9550:3:3758 -9551:0:4365 -9552:2:1652 -9553:0:4365 -9554:2:1653 -9555:0:4365 -9556:2:1657 -9557:0:4365 -9558:2:1660 -9559:0:4365 -9560:3:3757 -9561:0:4365 -9562:2:1665 -9563:2:1669 -9564:2:1670 -9565:2:1678 -9566:2:1679 -9567:2:1683 -9568:2:1684 -9569:2:1678 -9570:2:1679 -9571:2:1680 -9572:2:1692 -9573:2:1697 -9574:2:1701 -9575:2:1702 -9576:2:1709 -9577:2:1710 -9578:2:1721 -9579:2:1722 -9580:2:1723 -9581:2:1721 -9582:2:1722 -9583:2:1723 -9584:2:1734 -9585:2:1739 -9586:2:1740 -9587:0:4365 -9588:3:3758 -9589:0:4365 -9590:2:1752 -9591:0:4365 -9592:3:3757 -9593:0:4365 -9594:2:1754 -9595:0:4365 -9596:3:3758 -9597:0:4365 -9598:2:1755 -9599:2:1759 -9600:2:1760 -9601:2:1768 -9602:2:1769 -9603:2:1773 -9604:2:1774 -9605:2:1768 -9606:2:1769 -9607:2:1773 -9608:2:1774 -9609:2:1782 -9610:2:1787 -9611:2:1791 -9612:2:1792 -9613:2:1799 -9614:2:1800 -9615:2:1811 -9616:2:1812 -9617:2:1813 -9618:2:1811 -9619:2:1812 -9620:2:1813 -9621:2:1824 -9622:2:1829 -9623:2:1830 -9624:0:4365 -9625:2:1842 -9626:0:4365 -9627:3:3757 -9628:0:4365 -9629:2:1844 -9630:0:4365 -9631:3:3758 -9632:0:4365 -9633:2:1845 -9634:2:1849 -9635:2:1850 -9636:2:1858 -9637:2:1859 -9638:2:1863 -9639:2:1864 -9640:2:1858 -9641:2:1859 -9642:2:1863 -9643:2:1864 -9644:2:1872 -9645:2:1877 -9646:2:1881 -9647:2:1882 -9648:2:1889 -9649:2:1890 -9650:2:1901 -9651:2:1902 -9652:2:1903 -9653:2:1901 -9654:2:1902 -9655:2:1903 -9656:2:1914 -9657:2:1919 -9658:2:1920 -9659:0:4365 -9660:2:1932 -9661:0:4365 -9662:3:3757 -9663:0:4365 -9664:2:1934 -9665:0:4365 -9666:3:3758 -9667:0:4365 -9668:2:1935 -9669:0:4365 -9670:2:1936 -9671:0:4365 -9672:2:2129 -9673:0:4365 -9674:2:2130 -9675:0:4365 -9676:2:2134 -9677:0:4365 -9678:3:3757 -9679:0:4365 -9680:2:2136 -9681:0:4365 -9682:3:3758 -9683:0:4365 -9684:2:2137 -9685:2:2141 -9686:2:2142 -9687:2:2150 -9688:2:2151 -9689:2:2155 -9690:2:2156 -9691:2:2150 -9692:2:2151 -9693:2:2155 -9694:2:2156 -9695:2:2164 -9696:2:2169 -9697:2:2173 -9698:2:2174 -9699:2:2181 -9700:2:2182 -9701:2:2193 -9702:2:2194 -9703:2:2195 -9704:2:2193 -9705:2:2194 -9706:2:2195 -9707:2:2206 -9708:2:2211 -9709:2:2212 -9710:0:4365 -9711:2:2224 -9712:0:4365 -9713:3:3757 -9714:0:4365 -9715:2:2226 -9716:0:4365 -9717:3:3758 -9718:0:4365 -9719:2:2230 -9720:0:4365 -9721:3:3757 -9722:0:4365 -9723:2:2235 -9724:2:2239 -9725:2:2240 -9726:2:2248 -9727:2:2249 -9728:2:2253 -9729:2:2254 -9730:2:2248 -9731:2:2249 -9732:2:2250 -9733:2:2262 -9734:2:2267 -9735:2:2271 -9736:2:2272 -9737:2:2279 -9738:2:2280 -9739:2:2291 -9740:2:2292 -9741:2:2293 -9742:2:2291 -9743:2:2292 -9744:2:2293 -9745:2:2304 -9746:2:2309 -9747:2:2310 -9748:0:4365 -9749:3:3758 -9750:0:4365 -9751:2:2322 -9752:0:4365 -9753:2:1169 -9754:0:4365 -9755:3:3757 -9756:0:4365 -9757:2:1170 -9758:0:4365 -9759:3:3758 -9760:0:4365 -9761:3:3759 -9762:0:4365 -9763:3:3972 -9764:0:4365 -9765:3:3980 -9766:0:4365 -9767:3:3981 -9768:3:3985 -9769:3:3986 -9770:3:3994 -9771:3:3995 -9772:3:3999 -9773:3:4000 -9774:3:3994 -9775:3:3995 -9776:3:3999 -9777:3:4000 -9778:3:4008 -9779:3:4013 -9780:3:4017 -9781:3:4018 -9782:3:4025 -9783:3:4026 -9784:3:4037 -9785:3:4038 -9786:3:4039 -9787:3:4037 -9788:3:4038 -9789:3:4039 -9790:3:4050 -9791:3:4055 -9792:3:4056 -9793:0:4365 -9794:3:4068 -9795:0:4365 -9796:3:4069 -9797:0:4365 -9798:2:1173 -9799:0:4365 -9800:3:4070 -9801:0:4365 -9802:2:1179 -9803:0:4365 -9804:2:1180 -9805:0:4365 -9806:3:4069 -9807:0:4365 -9808:2:1181 -9809:2:1185 -9810:2:1186 -9811:2:1194 -9812:2:1195 -9813:2:1199 -9814:2:1200 -9815:2:1194 -9816:2:1195 -9817:2:1199 -9818:2:1200 -9819:2:1208 -9820:2:1213 -9821:2:1217 -9822:2:1218 -9823:2:1225 -9824:2:1226 -9825:2:1237 -9826:2:1238 -9827:2:1239 -9828:2:1237 -9829:2:1238 -9830:2:1239 -9831:2:1250 -9832:2:1255 -9833:2:1256 -9834:0:4365 -9835:3:4070 -9836:0:4365 -9837:2:1268 -9838:0:4365 -9839:3:4069 -9840:0:4365 -9841:2:1270 -9842:0:4365 -9843:3:4070 -9844:0:4365 -9845:2:1271 -9846:2:1275 -9847:2:1276 -9848:2:1284 -9849:2:1285 -9850:2:1289 -9851:2:1290 -9852:2:1284 -9853:2:1285 -9854:2:1289 -9855:2:1290 -9856:2:1298 -9857:2:1303 -9858:2:1307 -9859:2:1308 -9860:2:1315 -9861:2:1316 -9862:2:1327 -9863:2:1328 -9864:2:1329 -9865:2:1327 -9866:2:1328 -9867:2:1329 -9868:2:1340 -9869:2:1345 -9870:2:1346 -9871:0:4365 -9872:2:1358 -9873:0:4365 -9874:2:1360 -9875:0:4365 -9876:3:4069 -9877:0:4365 -9878:2:1361 -9879:0:4365 -9880:3:4070 -9881:0:4365 -9882:2:1362 -9883:2:1366 -9884:2:1367 -9885:2:1375 -9886:2:1376 -9887:2:1380 -9888:2:1381 -9889:2:1375 -9890:2:1376 -9891:2:1380 -9892:2:1381 -9893:2:1389 -9894:2:1394 -9895:2:1398 -9896:2:1399 -9897:2:1406 -9898:2:1407 -9899:2:1418 -9900:2:1419 -9901:2:1420 -9902:2:1418 -9903:2:1419 -9904:2:1420 -9905:2:1431 -9906:2:1436 -9907:2:1437 -9908:0:4365 -9909:2:1449 -9910:0:4365 -9911:3:4069 -9912:0:4365 -9913:2:1451 -9914:0:4365 -9915:3:4070 -9916:0:4365 -9917:2:1652 -9918:0:4365 -9919:2:1653 -9920:0:4365 -9921:2:1657 -9922:0:4365 -9923:2:1660 -9924:0:4365 -9925:3:4069 -9926:0:4365 -9927:2:1665 -9928:2:1669 -9929:2:1670 -9930:2:1678 -9931:2:1679 -9932:2:1683 -9933:2:1684 -9934:2:1678 -9935:2:1679 -9936:2:1680 -9937:2:1692 -9938:2:1697 -9939:2:1701 -9940:2:1702 -9941:2:1709 -9942:2:1710 -9943:2:1721 -9944:2:1722 -9945:2:1723 -9946:2:1721 -9947:2:1722 -9948:2:1723 -9949:2:1734 -9950:2:1739 -9951:2:1740 -9952:0:4365 -9953:3:4070 -9954:0:4365 -9955:2:1752 -9956:0:4365 -9957:3:4069 -9958:0:4365 -9959:2:1754 -9960:0:4365 -9961:3:4070 -9962:0:4365 -9963:2:1755 -9964:2:1759 -9965:2:1760 -9966:2:1768 -9967:2:1769 -9968:2:1773 -9969:2:1774 -9970:2:1768 -9971:2:1769 -9972:2:1773 -9973:2:1774 -9974:2:1782 -9975:2:1787 -9976:2:1791 -9977:2:1792 -9978:2:1799 -9979:2:1800 -9980:2:1811 -9981:2:1812 -9982:2:1813 -9983:2:1811 -9984:2:1812 -9985:2:1813 -9986:2:1824 -9987:2:1829 -9988:2:1830 -9989:0:4365 -9990:2:1842 -9991:0:4365 -9992:3:4069 -9993:0:4365 -9994:2:1844 -9995:0:4365 -9996:3:4070 -9997:0:4365 -9998:2:1845 -9999:2:1849 -10000:2:1850 -10001:2:1858 -10002:2:1859 -10003:2:1863 -10004:2:1864 -10005:2:1858 -10006:2:1859 -10007:2:1863 -10008:2:1864 -10009:2:1872 -10010:2:1877 -10011:2:1881 -10012:2:1882 -10013:2:1889 -10014:2:1890 -10015:2:1901 -10016:2:1902 -10017:2:1903 -10018:2:1901 -10019:2:1902 -10020:2:1903 -10021:2:1914 -10022:2:1919 -10023:2:1920 -10024:0:4365 -10025:2:1932 -10026:0:4365 -10027:3:4069 -10028:0:4365 -10029:2:1934 -10030:0:4365 -10031:3:4070 -10032:0:4365 -10033:2:1935 -10034:0:4365 -10035:2:1936 -10036:0:4365 -10037:2:2129 -10038:0:4365 -10039:2:2130 -10040:0:4365 -10041:2:2134 -10042:0:4365 -10043:3:4069 -10044:0:4365 -10045:2:2136 -10046:0:4365 -10047:3:4070 -10048:0:4365 -10049:2:2137 -10050:2:2141 -10051:2:2142 -10052:2:2150 -10053:2:2151 -10054:2:2155 -10055:2:2156 -10056:2:2150 -10057:2:2151 -10058:2:2155 -10059:2:2156 -10060:2:2164 -10061:2:2169 -10062:2:2173 -10063:2:2174 -10064:2:2181 -10065:2:2182 -10066:2:2193 -10067:2:2194 -10068:2:2195 -10069:2:2193 -10070:2:2194 -10071:2:2195 -10072:2:2206 -10073:2:2211 -10074:2:2212 -10075:0:4365 -10076:2:2224 -10077:0:4365 -10078:3:4069 -10079:0:4365 -10080:2:2226 -10081:0:4365 -10082:3:4070 -10083:0:4365 -10084:2:2230 -10085:0:4365 -10086:3:4069 -10087:0:4365 -10088:2:2235 -10089:2:2239 -10090:2:2240 -10091:2:2248 -10092:2:2249 -10093:2:2253 -10094:2:2254 -10095:2:2248 -10096:2:2249 -10097:2:2250 -10098:2:2262 -10099:2:2267 -10100:2:2271 -10101:2:2272 -10102:2:2279 -10103:2:2280 -10104:2:2291 -10105:2:2292 -10106:2:2293 -10107:2:2291 -10108:2:2292 -10109:2:2293 -10110:2:2304 -10111:2:2309 -10112:2:2310 -10113:0:4365 -10114:3:4070 -10115:0:4365 -10116:2:2322 -10117:0:4365 -10118:2:1169 -10119:0:4365 -10120:3:4069 -10121:0:4365 -10122:2:1170 -10123:0:4365 -10124:3:4070 -10125:0:4365 -10126:3:4071 -10127:0:4365 -10128:3:4081 -10129:0:4365 -10130:3:3666 -10131:0:4365 -10132:3:3667 -10133:0:4365 -10134:3:3668 -10135:0:4365 -10136:3:3669 -10137:3:3673 -10138:3:3674 -10139:3:3682 -10140:3:3683 -10141:3:3687 -10142:3:3688 -10143:3:3682 -10144:3:3683 -10145:3:3687 -10146:3:3688 -10147:3:3696 -10148:3:3701 -10149:3:3705 -10150:3:3706 -10151:3:3713 -10152:3:3714 -10153:3:3725 -10154:3:3726 -10155:3:3727 -10156:3:3725 -10157:3:3726 -10158:3:3727 -10159:3:3738 -10160:3:3743 -10161:3:3744 -10162:0:4365 -10163:3:3756 -10164:0:4365 -10165:3:3757 -10166:0:4365 -10167:2:1173 -10168:0:4365 -10169:3:3758 -10170:0:4365 -10171:2:1179 -10172:0:4365 -10173:2:1180 -10174:0:4365 -10175:3:3757 -10176:0:4365 -10177:2:1181 -10178:2:1185 -10179:2:1186 -10180:2:1194 -10181:2:1195 -10182:2:1199 -10183:2:1200 -10184:2:1194 -10185:2:1195 -10186:2:1199 -10187:2:1200 -10188:2:1208 -10189:2:1213 -10190:2:1217 -10191:2:1218 -10192:2:1225 -10193:2:1226 -10194:2:1237 -10195:2:1238 -10196:2:1239 -10197:2:1237 -10198:2:1238 -10199:2:1239 -10200:2:1250 -10201:2:1255 -10202:2:1256 -10203:0:4365 -10204:3:3758 -10205:0:4365 -10206:2:1268 -10207:0:4365 -10208:3:3757 -10209:0:4365 -10210:2:1270 -10211:0:4365 -10212:3:3758 -10213:0:4365 -10214:2:1271 -10215:2:1275 -10216:2:1276 -10217:2:1284 -10218:2:1285 -10219:2:1289 -10220:2:1290 -10221:2:1284 -10222:2:1285 -10223:2:1289 -10224:2:1290 -10225:2:1298 -10226:2:1303 -10227:2:1307 -10228:2:1308 -10229:2:1315 -10230:2:1316 -10231:2:1327 -10232:2:1328 -10233:2:1329 -10234:2:1327 -10235:2:1328 -10236:2:1329 -10237:2:1340 -10238:2:1345 -10239:2:1346 -10240:0:4365 -10241:2:1358 -10242:0:4365 -10243:2:1360 -10244:0:4365 -10245:3:3757 -10246:0:4365 -10247:2:1361 -10248:0:4365 -10249:3:3758 -10250:0:4365 -10251:2:1362 -10252:2:1366 -10253:2:1367 -10254:2:1375 -10255:2:1376 -10256:2:1380 -10257:2:1381 -10258:2:1375 -10259:2:1376 -10260:2:1380 -10261:2:1381 -10262:2:1389 -10263:2:1394 -10264:2:1398 -10265:2:1399 -10266:2:1406 -10267:2:1407 -10268:2:1418 -10269:2:1419 -10270:2:1420 -10271:2:1418 -10272:2:1419 -10273:2:1420 -10274:2:1431 -10275:2:1436 -10276:2:1437 -10277:0:4365 -10278:2:1449 -10279:0:4365 -10280:3:3757 -10281:0:4365 -10282:2:1451 -10283:0:4365 -10284:3:3758 -10285:0:4365 -10286:2:1652 -10287:0:4365 -10288:2:1653 -10289:0:4365 -10290:2:1657 -10291:0:4365 -10292:2:1660 -10293:0:4365 -10294:3:3757 -10295:0:4365 -10296:2:1665 -10297:2:1669 -10298:2:1670 -10299:2:1678 -10300:2:1679 -10301:2:1683 -10302:2:1684 -10303:2:1678 -10304:2:1679 -10305:2:1680 -10306:2:1692 -10307:2:1697 -10308:2:1701 -10309:2:1702 -10310:2:1709 -10311:2:1710 -10312:2:1721 -10313:2:1722 -10314:2:1723 -10315:2:1721 -10316:2:1722 -10317:2:1723 -10318:2:1734 -10319:2:1739 -10320:2:1740 -10321:0:4365 -10322:3:3758 -10323:0:4365 -10324:2:1752 -10325:0:4365 -10326:3:3757 -10327:0:4365 -10328:2:1754 -10329:0:4365 -10330:3:3758 -10331:0:4365 -10332:2:1755 -10333:2:1759 -10334:2:1760 -10335:2:1768 -10336:2:1769 -10337:2:1773 -10338:2:1774 -10339:2:1768 -10340:2:1769 -10341:2:1773 -10342:2:1774 -10343:2:1782 -10344:2:1787 -10345:2:1791 -10346:2:1792 -10347:2:1799 -10348:2:1800 -10349:2:1811 -10350:2:1812 -10351:2:1813 -10352:2:1811 -10353:2:1812 -10354:2:1813 -10355:2:1824 -10356:2:1829 -10357:2:1830 -10358:0:4365 -10359:2:1842 -10360:0:4365 -10361:3:3757 -10362:0:4365 -10363:2:1844 -10364:0:4365 -10365:3:3758 -10366:0:4365 -10367:2:1845 -10368:2:1849 -10369:2:1850 -10370:2:1858 -10371:2:1859 -10372:2:1863 -10373:2:1864 -10374:2:1858 -10375:2:1859 -10376:2:1863 -10377:2:1864 -10378:2:1872 -10379:2:1877 -10380:2:1881 -10381:2:1882 -10382:2:1889 -10383:2:1890 -10384:2:1901 -10385:2:1902 -10386:2:1903 -10387:2:1901 -10388:2:1902 -10389:2:1903 -10390:2:1914 -10391:2:1919 -10392:2:1920 -10393:0:4365 -10394:2:1932 -10395:0:4365 -10396:3:3757 -10397:0:4365 -10398:2:1934 -10399:0:4365 -10400:3:3758 -10401:0:4365 -10402:2:1935 -10403:0:4365 -10404:2:1936 -10405:0:4365 -10406:2:2129 -10407:0:4365 -10408:2:2130 -10409:0:4365 -10410:2:2134 -10411:0:4365 -10412:3:3757 -10413:0:4365 -10414:2:2136 -10415:0:4365 -10416:3:3758 -10417:0:4365 -10418:2:2137 -10419:2:2141 -10420:2:2142 -10421:2:2150 -10422:2:2151 -10423:2:2155 -10424:2:2156 -10425:2:2150 -10426:2:2151 -10427:2:2155 -10428:2:2156 -10429:2:2164 -10430:2:2169 -10431:2:2173 -10432:2:2174 -10433:2:2181 -10434:2:2182 -10435:2:2193 -10436:2:2194 -10437:2:2195 -10438:2:2193 -10439:2:2194 -10440:2:2195 -10441:2:2206 -10442:2:2211 -10443:2:2212 -10444:0:4365 -10445:2:2224 -10446:0:4365 -10447:3:3757 -10448:0:4365 -10449:2:2226 -10450:0:4365 -10451:3:3758 -10452:0:4365 -10453:2:2230 -10454:0:4365 -10455:3:3757 -10456:0:4365 -10457:2:2235 -10458:2:2239 -10459:2:2240 -10460:2:2248 -10461:2:2249 -10462:2:2253 -10463:2:2254 -10464:2:2248 -10465:2:2249 -10466:2:2250 -10467:2:2262 -10468:2:2267 -10469:2:2271 -10470:2:2272 -10471:2:2279 -10472:2:2280 -10473:2:2291 -10474:2:2292 -10475:2:2293 -10476:2:2291 -10477:2:2292 -10478:2:2293 -10479:2:2304 -10480:2:2309 -10481:2:2310 -10482:0:4365 -10483:3:3758 -10484:0:4365 -10485:2:2322 -10486:0:4365 -10487:2:1169 -10488:0:4365 -10489:3:3757 -10490:0:4365 -10491:2:1170 -10492:0:4365 -10493:3:3758 -10494:0:4365 -10495:3:3759 -10496:0:4365 -10497:3:3972 -10498:0:4365 -10499:3:4077 -10500:0:4365 -10501:3:4078 -10502:0:4365 -10503:3:4082 -10504:0:4365 -10505:3:4088 -10506:0:4365 -10507:3:4092 -10508:3:4093 -10509:3:4097 -10510:3:4101 -10511:3:4102 -10512:3:4097 -10513:3:4101 -10514:3:4102 -10515:3:4106 -10516:3:4114 -10517:3:4115 -10518:3:4120 -10519:3:4127 -10520:3:4128 -10521:3:4127 -10522:3:4128 -10523:3:4135 -10524:3:4140 -10525:0:4365 -10526:3:4151 -10527:0:4365 -10528:3:4155 -10529:3:4156 -10530:3:4160 -10531:3:4164 -10532:3:4165 -10533:3:4160 -10534:3:4164 -10535:3:4165 -10536:3:4169 -10537:3:4177 -10538:3:4178 -10539:3:4183 -10540:3:4190 -10541:3:4191 -10542:3:4190 -10543:3:4191 -10544:3:4198 -10545:3:4203 -10546:0:4365 -10547:3:4151 -10548:0:4365 -10549:3:4155 -10550:3:4156 -10551:3:4160 -10552:3:4164 -10553:3:4165 -10554:3:4160 -10555:3:4164 -10556:3:4165 -10557:3:4169 -10558:3:4177 -10559:3:4178 -10560:3:4183 -10561:3:4190 -10562:3:4191 -10563:3:4190 -10564:3:4191 -10565:3:4198 -10566:3:4203 -10567:0:4365 -10568:3:4214 -10569:0:4365 -10570:3:4222 -10571:3:4223 -10572:3:4227 -10573:3:4231 -10574:3:4232 -10575:3:4227 -10576:3:4231 -10577:3:4232 -10578:3:4236 -10579:3:4244 -10580:3:4245 -10581:3:4250 -10582:3:4257 -10583:3:4258 -10584:3:4257 -10585:3:4258 -10586:3:4265 -10587:3:4270 -10588:0:4365 -10589:3:4285 -10590:0:4365 -10591:3:4286 -10592:0:4365 -10593:2:1173 -10594:0:4365 -10595:3:4287 -10596:0:4365 -10597:2:1179 -10598:0:4365 -10599:2:1180 -10600:0:4365 -10601:3:4286 -10602:0:4365 -10603:2:1181 -10604:2:1185 -10605:2:1186 -10606:2:1194 -10607:2:1195 -10608:2:1199 -10609:2:1200 -10610:2:1194 -10611:2:1195 -10612:2:1199 -10613:2:1200 -10614:2:1208 -10615:2:1213 -10616:2:1217 -10617:2:1218 -10618:2:1225 -10619:2:1226 -10620:2:1237 -10621:2:1238 -10622:2:1239 -10623:2:1237 -10624:2:1238 -10625:2:1239 -10626:2:1250 -10627:2:1255 -10628:2:1256 -10629:0:4365 -10630:3:4287 -10631:0:4365 -10632:2:1268 -10633:0:4365 -10634:3:4286 -10635:0:4365 -10636:2:1270 -10637:0:4365 -10638:3:4287 -10639:0:4365 -10640:2:1271 -10641:2:1275 -10642:2:1276 -10643:2:1284 -10644:2:1285 -10645:2:1289 -10646:2:1290 -10647:2:1284 -10648:2:1285 -10649:2:1289 -10650:2:1290 -10651:2:1298 -10652:2:1303 -10653:2:1307 -10654:2:1308 -10655:2:1315 -10656:2:1316 -10657:2:1327 -10658:2:1328 -10659:2:1329 -10660:2:1327 -10661:2:1328 -10662:2:1329 -10663:2:1340 -10664:2:1345 -10665:2:1346 -10666:0:4365 -10667:2:1358 -10668:0:4365 -10669:2:1360 -10670:0:4365 -10671:3:4286 -10672:0:4365 -10673:2:1361 -10674:0:4365 -10675:3:4287 -10676:0:4365 -10677:2:1362 -10678:2:1366 -10679:2:1367 -10680:2:1375 -10681:2:1376 -10682:2:1380 -10683:2:1381 -10684:2:1375 -10685:2:1376 -10686:2:1380 -10687:2:1381 -10688:2:1389 -10689:2:1394 -10690:2:1398 -10691:2:1399 -10692:2:1406 -10693:2:1407 -10694:2:1418 -10695:2:1419 -10696:2:1420 -10697:2:1418 -10698:2:1419 -10699:2:1420 -10700:2:1431 -10701:2:1436 -10702:2:1437 -10703:0:4365 -10704:2:1449 -10705:0:4365 -10706:3:4286 -10707:0:4365 -10708:2:1451 -10709:0:4365 -10710:3:4287 -10711:0:4365 -10712:2:1652 -10713:0:4365 -10714:2:1653 -10715:0:4365 -10716:2:1657 -10717:0:4365 -10718:2:1660 -10719:0:4365 -10720:3:4286 -10721:0:4365 -10722:2:1665 -10723:2:1669 -10724:2:1670 -10725:2:1678 -10726:2:1679 -10727:2:1683 -10728:2:1684 -10729:2:1678 -10730:2:1679 -10731:2:1680 -10732:2:1692 -10733:2:1697 -10734:2:1701 -10735:2:1702 -10736:2:1709 -10737:2:1710 -10738:2:1721 -10739:2:1722 -10740:2:1723 -10741:2:1721 -10742:2:1722 -10743:2:1723 -10744:2:1734 -10745:2:1739 -10746:2:1740 -10747:0:4365 -10748:3:4287 -10749:0:4365 -10750:2:1752 -10751:0:4365 -10752:3:4286 -10753:0:4365 -10754:2:1754 -10755:0:4365 -10756:3:4287 -10757:0:4365 -10758:2:1755 -10759:2:1759 -10760:2:1760 -10761:2:1768 -10762:2:1769 -10763:2:1773 -10764:2:1774 -10765:2:1768 -10766:2:1769 -10767:2:1773 -10768:2:1774 -10769:2:1782 -10770:2:1787 -10771:2:1791 -10772:2:1792 -10773:2:1799 -10774:2:1800 -10775:2:1811 -10776:2:1812 -10777:2:1813 -10778:2:1811 -10779:2:1812 -10780:2:1813 -10781:2:1824 -10782:2:1829 -10783:2:1830 -10784:0:4365 -10785:2:1842 -10786:0:4365 -10787:3:4286 -10788:0:4365 -10789:2:1844 -10790:0:4365 -10791:3:4287 -10792:0:4365 -10793:2:1845 -10794:2:1849 -10795:2:1850 -10796:2:1858 -10797:2:1859 -10798:2:1863 -10799:2:1864 -10800:2:1858 -10801:2:1859 -10802:2:1863 -10803:2:1864 -10804:2:1872 -10805:2:1877 -10806:2:1881 -10807:2:1882 -10808:2:1889 -10809:2:1890 -10810:2:1901 -10811:2:1902 -10812:2:1903 -10813:2:1901 -10814:2:1902 -10815:2:1903 -10816:2:1914 -10817:2:1919 -10818:2:1920 -10819:0:4365 -10820:2:1932 -10821:0:4365 -10822:3:4286 -10823:0:4365 -10824:2:1934 -10825:0:4365 -10826:3:4287 -10827:0:4365 -10828:2:1935 -10829:0:4365 -10830:2:1936 -10831:0:4365 -10832:2:2129 -10833:0:4365 -10834:2:2130 -10835:0:4365 -10836:2:2134 -10837:0:4365 -10838:3:4286 -10839:0:4365 -10840:2:2136 -10841:0:4365 -10842:3:4287 -10843:0:4365 -10844:2:2137 -10845:2:2141 -10846:2:2142 -10847:2:2150 -10848:2:2151 -10849:2:2155 -10850:2:2156 -10851:2:2150 -10852:2:2151 -10853:2:2155 -10854:2:2156 -10855:2:2164 -10856:2:2169 -10857:2:2173 -10858:2:2174 -10859:2:2181 -10860:2:2182 -10861:2:2193 -10862:2:2194 -10863:2:2195 -10864:2:2193 -10865:2:2194 -10866:2:2195 -10867:2:2206 -10868:2:2211 -10869:2:2212 -10870:0:4365 -10871:2:2224 -10872:0:4365 -10873:3:4286 -10874:0:4365 -10875:2:2226 -10876:0:4365 -10877:3:4287 -10878:0:4365 -10879:2:2230 -10880:0:4365 -10881:3:4286 -10882:0:4365 -10883:2:2235 -10884:2:2239 -10885:2:2240 -10886:2:2248 -10887:2:2249 -10888:2:2253 -10889:2:2254 -10890:2:2248 -10891:2:2249 -10892:2:2250 -10893:2:2262 -10894:2:2267 -10895:2:2271 -10896:2:2272 -10897:2:2279 -10898:2:2280 -10899:2:2291 -10900:2:2292 -10901:2:2293 -10902:2:2291 -10903:2:2292 -10904:2:2293 -10905:2:2304 -10906:2:2309 -10907:2:2310 -10908:0:4365 -10909:3:4287 -10910:0:4365 -10911:2:2322 -10912:0:4365 -10913:2:1169 -10914:0:4365 -10915:3:4286 -10916:0:4365 -10917:2:1170 -10918:0:4365 -10919:3:4287 -10920:0:4365 -10921:3:4288 -10922:0:4365 -10923:3:4294 -10924:0:4365 -10925:3:4295 -10926:0:4365 -10927:3:2338 -10928:0:4365 -10929:3:2339 -10930:3:2343 -10931:3:2344 -10932:3:2352 -10933:3:2353 -10934:3:2357 -10935:3:2358 -10936:3:2352 -10937:3:2353 -10938:3:2357 -10939:3:2358 -10940:3:2366 -10941:3:2371 -10942:3:2375 -10943:3:2376 -10944:3:2383 -10945:3:2384 -10946:3:2395 -10947:3:2396 -10948:3:2397 -10949:3:2395 -10950:3:2396 -10951:3:2397 -10952:3:2408 -10953:3:2413 -10954:3:2414 -10955:0:4365 -10956:3:2426 -10957:0:4365 -10958:3:2427 -10959:0:4365 -10960:2:1173 -10961:0:4365 -10962:3:2428 -10963:0:4365 -10964:2:1179 -10965:0:4365 -10966:2:1180 -10967:0:4365 -10968:3:2427 -10969:0:4365 -10970:2:1181 -10971:2:1185 -10972:2:1186 -10973:2:1194 -10974:2:1195 -10975:2:1199 -10976:2:1200 -10977:2:1194 -10978:2:1195 -10979:2:1199 -10980:2:1200 -10981:2:1208 -10982:2:1213 -10983:2:1217 -10984:2:1218 -10985:2:1225 -10986:2:1226 -10987:2:1237 -10988:2:1238 -10989:2:1239 -10990:2:1237 -10991:2:1238 -10992:2:1239 -10993:2:1250 -10994:2:1255 -10995:2:1256 -10996:0:4365 -10997:3:2428 -10998:0:4365 -10999:2:1268 -11000:0:4365 -11001:3:2427 -11002:0:4365 -11003:2:1270 -11004:0:4365 -11005:3:2428 -11006:0:4365 -11007:2:1271 -11008:2:1275 -11009:2:1276 -11010:2:1284 -11011:2:1285 -11012:2:1289 -11013:2:1290 -11014:2:1284 -11015:2:1285 -11016:2:1289 -11017:2:1290 -11018:2:1298 -11019:2:1303 -11020:2:1307 -11021:2:1308 -11022:2:1315 -11023:2:1316 -11024:2:1327 -11025:2:1328 -11026:2:1329 -11027:2:1327 -11028:2:1328 -11029:2:1329 -11030:2:1340 -11031:2:1345 -11032:2:1346 -11033:0:4365 -11034:2:1358 -11035:0:4365 -11036:2:1360 -11037:0:4365 -11038:3:2427 -11039:0:4365 -11040:2:1361 -11041:0:4365 -11042:3:2428 -11043:0:4365 -11044:2:1362 -11045:2:1366 -11046:2:1367 -11047:2:1375 -11048:2:1376 -11049:2:1380 -11050:2:1381 -11051:2:1375 -11052:2:1376 -11053:2:1380 -11054:2:1381 -11055:2:1389 -11056:2:1394 -11057:2:1398 -11058:2:1399 -11059:2:1406 -11060:2:1407 -11061:2:1418 -11062:2:1419 -11063:2:1420 -11064:2:1418 -11065:2:1419 -11066:2:1420 -11067:2:1431 -11068:2:1436 -11069:2:1437 -11070:0:4365 -11071:2:1449 -11072:0:4365 -11073:3:2427 -11074:0:4365 -11075:2:1451 -11076:0:4365 -11077:3:2428 -11078:0:4365 -11079:2:1652 -11080:0:4365 -11081:2:1653 -11082:0:4365 -11083:2:1657 -11084:0:4365 -11085:2:1660 -11086:0:4365 -11087:3:2427 -11088:0:4365 -11089:2:1665 -11090:2:1669 -11091:2:1670 -11092:2:1678 -11093:2:1679 -11094:2:1683 -11095:2:1684 -11096:2:1678 -11097:2:1679 -11098:2:1680 -11099:2:1692 -11100:2:1697 -11101:2:1701 -11102:2:1702 -11103:2:1709 -11104:2:1710 -11105:2:1721 -11106:2:1722 -11107:2:1723 -11108:2:1721 -11109:2:1722 -11110:2:1723 -11111:2:1734 -11112:2:1739 -11113:2:1740 -11114:0:4365 -11115:3:2428 -11116:0:4365 -11117:2:1752 -11118:0:4365 -11119:3:2427 -11120:0:4365 -11121:2:1754 -11122:0:4365 -11123:3:2428 -11124:0:4365 -11125:2:1755 -11126:2:1759 -11127:2:1760 -11128:2:1768 -11129:2:1769 -11130:2:1773 -11131:2:1774 -11132:2:1768 -11133:2:1769 -11134:2:1773 -11135:2:1774 -11136:2:1782 -11137:2:1787 -11138:2:1791 -11139:2:1792 -11140:2:1799 -11141:2:1800 -11142:2:1811 -11143:2:1812 -11144:2:1813 -11145:2:1811 -11146:2:1812 -11147:2:1813 -11148:2:1824 -11149:2:1829 -11150:2:1830 -11151:0:4365 -11152:2:1842 -11153:0:4365 -11154:3:2427 -11155:0:4365 -11156:2:1844 -11157:0:4363 -11158:3:2428 -11159:0:4369 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.define b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.define deleted file mode 100644 index 136ef67..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.define +++ /dev/null @@ -1,2 +0,0 @@ -#define NO_RMB -#define NO_WMB diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.log b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.log deleted file mode 100644 index c420e43..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.log +++ /dev/null @@ -1,266 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_mb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 745) -pan: claim violated! (at depth 2071) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 72 byte, depth reached 5140, errors: 1 - 264561 states, stored - 3902374 states, matched - 4166935 transitions (= stored+matched) - 15172302 atomic steps -hash conflicts: 196282 (resolved) - -Stats on memory usage (in Megabytes): - 25.231 equivalent memory usage for states (stored*(State-vector + overhead)) - 16.681 actual memory usage for states (compression: 66.12%) - state-vector as stored = 38 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 482.365 total actual memory usage - -unreached in proctype urcu_reader - line 400, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 61, "(1)" - line 419, "pan.___", state 91, "(1)" - line 400, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 151, "(1)" - line 419, "pan.___", state 181, "(1)" - line 400, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 242, "(1)" - line 419, "pan.___", state 272, "(1)" - line 400, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 331, "(1)" - line 409, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 360, "(1)" - line 419, "pan.___", state 390, "(1)" - line 541, "pan.___", state 414, "-end-" - (18 of 414 states) -unreached in proctype urcu_writer - line 400, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 20, "(1)" - line 404, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 34, "(1)" - line 404, "pan.___", state 35, "(1)" - line 404, "pan.___", state 35, "(1)" - line 402, "pan.___", state 40, "((i<1))" - line 402, "pan.___", state 40, "((i>=1))" - line 409, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 59, "(1)" - line 410, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 60, "else" - line 410, "pan.___", state 63, "(1)" - line 410, "pan.___", state 64, "(1)" - line 410, "pan.___", state 64, "(1)" - line 414, "pan.___", state 72, "(1)" - line 414, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 73, "else" - line 414, "pan.___", state 76, "(1)" - line 414, "pan.___", state 77, "(1)" - line 414, "pan.___", state 77, "(1)" - line 412, "pan.___", state 82, "((i<1))" - line 412, "pan.___", state 82, "((i>=1))" - line 419, "pan.___", state 89, "(1)" - line 419, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 90, "else" - line 419, "pan.___", state 93, "(1)" - line 419, "pan.___", state 94, "(1)" - line 419, "pan.___", state 94, "(1)" - line 421, "pan.___", state 97, "(1)" - line 421, "pan.___", state 97, "(1)" - line 370, "pan.___", state 99, "(1)" - line 640, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" - line 638, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" - line 400, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 114, "(1)" - line 404, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 128, "(1)" - line 404, "pan.___", state 129, "(1)" - line 404, "pan.___", state 129, "(1)" - line 410, "pan.___", state 153, "(1)" - line 414, "pan.___", state 166, "(1)" - line 421, "pan.___", state 191, "(1)" - line 421, "pan.___", state 191, "(1)" - line 653, "pan.___", state 199, "(1)" - line 400, "pan.___", state 209, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 223, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 254, "(1)" - line 414, "pan.___", state 267, "(1)" - line 400, "pan.___", state 300, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 314, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 345, "(1)" - line 414, "pan.___", state 358, "(1)" - line 400, "pan.___", state 395, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 409, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 440, "(1)" - line 414, "pan.___", state 453, "(1)" - line 400, "pan.___", state 488, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 502, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 533, "(1)" - line 414, "pan.___", state 546, "(1)" - line 400, "pan.___", state 582, "(1)" - line 404, "pan.___", state 594, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 638, "(1)" - line 404, "pan.___", state 687, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 731, "(1)" - line 404, "pan.___", state 777, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 795, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 821, "(1)" - line 419, "pan.___", state 838, "(1)" - line 404, "pan.___", state 868, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 886, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 912, "(1)" - line 419, "pan.___", state 929, "(1)" - line 404, "pan.___", state 963, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 981, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1007, "(1)" - line 419, "pan.___", state 1024, "(1)" - line 400, "pan.___", state 1050, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 1052, "(1)" - line 400, "pan.___", state 1053, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 1053, "else" - line 400, "pan.___", state 1056, "(1)" - line 404, "pan.___", state 1064, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 1066, "(1)" - line 404, "pan.___", state 1067, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 404, "pan.___", state 1067, "else" - line 404, "pan.___", state 1070, "(1)" - line 404, "pan.___", state 1071, "(1)" - line 404, "pan.___", state 1071, "(1)" - line 402, "pan.___", state 1076, "((i<1))" - line 402, "pan.___", state 1076, "((i>=1))" - line 409, "pan.___", state 1082, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 1095, "(1)" - line 410, "pan.___", state 1096, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 1096, "else" - line 410, "pan.___", state 1099, "(1)" - line 410, "pan.___", state 1100, "(1)" - line 410, "pan.___", state 1100, "(1)" - line 414, "pan.___", state 1108, "(1)" - line 414, "pan.___", state 1109, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 1109, "else" - line 414, "pan.___", state 1112, "(1)" - line 414, "pan.___", state 1113, "(1)" - line 414, "pan.___", state 1113, "(1)" - line 412, "pan.___", state 1118, "((i<1))" - line 412, "pan.___", state 1118, "((i>=1))" - line 419, "pan.___", state 1125, "(1)" - line 419, "pan.___", state 1126, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 1126, "else" - line 419, "pan.___", state 1129, "(1)" - line 419, "pan.___", state 1130, "(1)" - line 419, "pan.___", state 1130, "(1)" - line 421, "pan.___", state 1133, "(1)" - line 421, "pan.___", state 1133, "(1)" - line 404, "pan.___", state 1164, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1208, "(1)" - line 404, "pan.___", state 1254, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1298, "(1)" - line 400, "pan.___", state 1334, "(1)" - line 404, "pan.___", state 1346, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1390, "(1)" - line 404, "pan.___", state 1439, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1483, "(1)" - line 404, "pan.___", state 1529, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1547, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1573, "(1)" - line 419, "pan.___", state 1590, "(1)" - line 404, "pan.___", state 1620, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1638, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1664, "(1)" - line 419, "pan.___", state 1681, "(1)" - line 404, "pan.___", state 1715, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1733, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1759, "(1)" - line 419, "pan.___", state 1776, "(1)" - line 400, "pan.___", state 1802, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 1804, "(1)" - line 400, "pan.___", state 1805, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 1805, "else" - line 400, "pan.___", state 1808, "(1)" - line 404, "pan.___", state 1816, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 1818, "(1)" - line 404, "pan.___", state 1819, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 404, "pan.___", state 1819, "else" - line 404, "pan.___", state 1822, "(1)" - line 404, "pan.___", state 1823, "(1)" - line 404, "pan.___", state 1823, "(1)" - line 402, "pan.___", state 1828, "((i<1))" - line 402, "pan.___", state 1828, "((i>=1))" - line 409, "pan.___", state 1834, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 1847, "(1)" - line 410, "pan.___", state 1848, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 1848, "else" - line 410, "pan.___", state 1851, "(1)" - line 410, "pan.___", state 1852, "(1)" - line 410, "pan.___", state 1852, "(1)" - line 414, "pan.___", state 1860, "(1)" - line 414, "pan.___", state 1861, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 1861, "else" - line 414, "pan.___", state 1864, "(1)" - line 414, "pan.___", state 1865, "(1)" - line 414, "pan.___", state 1865, "(1)" - line 412, "pan.___", state 1870, "((i<1))" - line 412, "pan.___", state 1870, "((i>=1))" - line 419, "pan.___", state 1877, "(1)" - line 419, "pan.___", state 1878, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 1878, "else" - line 419, "pan.___", state 1881, "(1)" - line 419, "pan.___", state 1882, "(1)" - line 419, "pan.___", state 1882, "(1)" - line 421, "pan.___", state 1885, "(1)" - line 421, "pan.___", state 1885, "(1)" - line 404, "pan.___", state 1916, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1960, "(1)" - line 404, "pan.___", state 2007, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 2051, "(1)" - line 404, "pan.___", state 2102, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 2146, "(1)" - line 703, "pan.___", state 2192, "-end-" - (144 of 2192 states) -unreached in proctype :init: - line 710, "pan.___", state 9, "((j<2))" - line 710, "pan.___", state 9, "((j>=2))" - line 711, "pan.___", state 20, "((j<2))" - line 711, "pan.___", state 20, "((j>=2))" - line 716, "pan.___", state 33, "((j<2))" - line 716, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 750, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 3.37 seconds -pan: rate 78504.748 states/second -pan: avg transition delay 8.0875e-07 usec -cp .input.spin urcu_free_no_mb.spin.input -cp .input.spin.trail urcu_free_no_mb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.spin.input b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.spin.input deleted file mode 100644 index 3831d86..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.spin.input +++ /dev/null @@ -1,724 +0,0 @@ -#define NO_RMB -#define NO_WMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.spin.input.trail deleted file mode 100644 index 7b2040a..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_mb.spin.input.trail +++ /dev/null @@ -1,2074 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2654 -2:3:2606 -3:3:2609 -4:3:2609 -5:3:2612 -6:3:2620 -7:3:2620 -8:3:2623 -9:3:2629 -10:3:2633 -11:3:2633 -12:3:2636 -13:3:2644 -14:3:2648 -15:3:2649 -16:0:2654 -17:3:2651 -18:0:2654 -19:2:416 -20:0:2654 -21:2:422 -22:0:2654 -23:2:423 -24:0:2654 -25:2:424 -26:2:428 -27:2:429 -28:2:437 -29:2:438 -30:2:442 -31:2:443 -32:2:451 -33:2:456 -34:2:460 -35:2:461 -36:2:468 -37:2:469 -38:2:480 -39:2:481 -40:2:482 -41:2:493 -42:2:498 -43:2:499 -44:0:2654 -45:2:511 -46:0:2654 -47:2:513 -48:2:514 -49:0:2654 -50:2:518 -51:2:522 -52:2:523 -53:2:531 -54:2:532 -55:2:536 -56:2:537 -57:2:545 -58:2:550 -59:2:551 -60:2:562 -61:2:563 -62:2:574 -63:2:575 -64:2:576 -65:2:587 -66:2:592 -67:2:593 -68:0:2654 -69:2:605 -70:0:2654 -71:2:607 -72:0:2654 -73:2:608 -74:0:2654 -75:2:618 -76:0:2654 -77:2:619 -78:2:623 -79:2:624 -80:2:632 -81:2:633 -82:2:637 -83:2:638 -84:2:646 -85:2:651 -86:2:655 -87:2:656 -88:2:663 -89:2:664 -90:2:675 -91:2:676 -92:2:677 -93:2:688 -94:2:693 -95:2:694 -96:0:2654 -97:2:709 -98:0:2654 -99:2:710 -100:2:714 -101:2:715 -102:2:723 -103:2:724 -104:2:728 -105:2:729 -106:2:737 -107:2:742 -108:2:746 -109:2:747 -110:2:754 -111:2:755 -112:2:766 -113:2:767 -114:2:768 -115:2:779 -116:2:784 -117:2:785 -118:0:2654 -119:2:800 -120:0:2654 -121:2:805 -122:2:809 -123:2:810 -124:2:818 -125:2:819 -126:2:823 -127:2:824 -128:2:832 -129:2:837 -130:2:841 -131:2:842 -132:2:849 -133:2:850 -134:2:861 -135:2:862 -136:2:863 -137:2:874 -138:2:879 -139:2:880 -140:0:2654 -141:2:895 -142:0:2654 -143:2:897 -144:0:2654 -145:2:898 -146:2:902 -147:2:903 -148:2:911 -149:2:912 -150:2:916 -151:2:917 -152:2:925 -153:2:930 -154:2:934 -155:2:935 -156:2:942 -157:2:943 -158:2:954 -159:2:955 -160:2:956 -161:2:967 -162:2:972 -163:2:973 -164:0:2654 -165:2:985 -166:0:2654 -167:2:987 -168:0:2654 -169:2:990 -170:2:991 -171:2:1003 -172:2:1004 -173:2:1008 -174:2:1009 -175:2:1017 -176:2:1022 -177:2:1026 -178:2:1027 -179:2:1034 -180:2:1035 -181:2:1046 -182:2:1047 -183:2:1048 -184:2:1059 -185:2:1064 -186:2:1065 -187:0:2654 -188:2:1077 -189:0:2654 -190:2:1079 -191:0:2654 -192:2:1080 -193:0:2654 -194:2:1081 -195:0:2654 -196:2:1082 -197:0:2654 -198:2:1083 -199:2:1087 -200:2:1088 -201:2:1096 -202:2:1097 -203:2:1101 -204:2:1102 -205:2:1110 -206:2:1115 -207:2:1119 -208:2:1120 -209:2:1127 -210:2:1128 -211:2:1139 -212:2:1140 -213:2:1141 -214:2:1152 -215:2:1157 -216:2:1158 -217:0:2654 -218:2:1170 -219:0:2654 -220:2:1451 -221:0:2654 -222:2:1549 -223:0:2654 -224:2:1550 -225:0:2654 -226:2:1554 -227:0:2654 -228:2:1560 -229:2:1564 -230:2:1565 -231:2:1573 -232:2:1574 -233:2:1578 -234:2:1579 -235:2:1587 -236:2:1592 -237:2:1596 -238:2:1597 -239:2:1604 -240:2:1605 -241:2:1616 -242:2:1617 -243:2:1618 -244:2:1629 -245:2:1634 -246:2:1635 -247:0:2654 -248:2:1647 -249:0:2654 -250:2:1649 -251:0:2654 -252:2:1650 -253:2:1654 -254:2:1655 -255:2:1663 -256:2:1664 -257:2:1668 -258:2:1669 -259:2:1677 -260:2:1682 -261:2:1686 -262:2:1687 -263:2:1694 -264:2:1695 -265:2:1706 -266:2:1707 -267:2:1708 -268:2:1719 -269:2:1724 -270:2:1725 -271:0:2654 -272:2:1737 -273:0:2654 -274:2:1739 -275:0:2654 -276:2:1742 -277:2:1743 -278:2:1755 -279:2:1756 -280:2:1760 -281:2:1761 -282:2:1769 -283:2:1774 -284:2:1778 -285:2:1779 -286:2:1786 -287:2:1787 -288:2:1798 -289:2:1799 -290:2:1800 -291:2:1811 -292:2:1816 -293:2:1817 -294:0:2654 -295:2:1829 -296:0:2654 -297:2:1831 -298:0:2654 -299:2:1832 -300:0:2654 -301:2:1833 -302:0:2654 -303:2:1834 -304:0:2654 -305:2:1835 -306:2:1839 -307:2:1840 -308:2:1848 -309:2:1849 -310:2:1853 -311:2:1854 -312:2:1862 -313:2:1867 -314:2:1871 -315:2:1872 -316:2:1879 -317:2:1880 -318:2:1891 -319:2:1892 -320:2:1893 -321:2:1904 -322:2:1909 -323:2:1910 -324:0:2654 -325:2:1922 -326:0:2654 -327:2:2203 -328:0:2654 -329:2:2301 -330:0:2654 -331:2:2302 -332:0:2654 -333:2:2306 -334:0:2654 -335:2:2312 -336:2:2316 -337:2:2317 -338:2:2325 -339:2:2326 -340:2:2330 -341:2:2331 -342:2:2339 -343:2:2344 -344:2:2348 -345:2:2349 -346:2:2356 -347:2:2357 -348:2:2368 -349:2:2369 -350:2:2370 -351:2:2381 -352:2:2386 -353:2:2387 -354:0:2654 -355:2:2402 -356:0:2654 -357:2:2403 -358:2:2407 -359:2:2408 -360:2:2416 -361:2:2417 -362:2:2421 -363:2:2422 -364:2:2430 -365:2:2435 -366:2:2439 -367:2:2440 -368:2:2447 -369:2:2448 -370:2:2459 -371:2:2460 -372:2:2461 -373:2:2472 -374:2:2477 -375:2:2478 -376:0:2654 -377:2:2493 -378:0:2654 -379:2:2498 -380:2:2502 -381:2:2503 -382:2:2511 -383:2:2512 -384:2:2516 -385:2:2517 -386:2:2525 -387:2:2530 -388:2:2534 -389:2:2535 -390:2:2542 -391:2:2543 -392:2:2554 -393:2:2555 -394:2:2556 -395:2:2567 -396:2:2572 -397:2:2573 -398:0:2654 -399:2:2588 -400:0:2654 -401:2:2590 -402:0:2654 -403:2:2591 -404:0:2654 -405:2:423 -406:0:2654 -407:2:424 -408:2:428 -409:2:429 -410:2:437 -411:2:438 -412:2:442 -413:2:443 -414:2:451 -415:2:456 -416:2:460 -417:2:461 -418:2:468 -419:2:469 -420:2:480 -421:2:481 -422:2:482 -423:2:493 -424:2:498 -425:2:499 -426:0:2654 -427:2:511 -428:0:2654 -429:2:513 -430:2:514 -431:0:2654 -432:2:518 -433:2:522 -434:2:523 -435:2:531 -436:2:532 -437:2:536 -438:2:537 -439:2:545 -440:2:550 -441:2:551 -442:2:562 -443:2:563 -444:2:574 -445:2:575 -446:2:576 -447:2:587 -448:2:592 -449:2:593 -450:0:2654 -451:2:605 -452:0:2654 -453:2:607 -454:0:2654 -455:2:608 -456:0:2654 -457:2:618 -458:0:2654 -459:2:619 -460:2:623 -461:2:624 -462:2:632 -463:2:633 -464:2:637 -465:2:638 -466:2:646 -467:2:651 -468:2:655 -469:2:656 -470:2:663 -471:2:664 -472:2:675 -473:2:676 -474:2:677 -475:2:688 -476:2:693 -477:2:694 -478:0:2654 -479:2:709 -480:0:2654 -481:2:710 -482:2:714 -483:2:715 -484:2:723 -485:2:724 -486:2:728 -487:2:729 -488:2:737 -489:2:742 -490:2:746 -491:2:747 -492:2:754 -493:2:755 -494:2:766 -495:2:767 -496:2:768 -497:2:779 -498:2:784 -499:2:785 -500:0:2654 -501:2:800 -502:0:2654 -503:2:805 -504:2:809 -505:2:810 -506:2:818 -507:2:819 -508:2:823 -509:2:824 -510:2:832 -511:2:837 -512:2:841 -513:2:842 -514:2:849 -515:2:850 -516:2:861 -517:2:862 -518:2:863 -519:2:874 -520:2:879 -521:2:880 -522:0:2654 -523:2:895 -524:0:2654 -525:2:897 -526:0:2654 -527:2:898 -528:2:902 -529:2:903 -530:2:911 -531:2:912 -532:2:916 -533:2:917 -534:2:925 -535:2:930 -536:2:934 -537:2:935 -538:2:942 -539:2:943 -540:2:954 -541:2:955 -542:2:956 -543:2:967 -544:2:972 -545:2:973 -546:0:2654 -547:2:985 -548:0:2654 -549:2:987 -550:0:2654 -551:2:990 -552:2:991 -553:2:1003 -554:2:1004 -555:2:1008 -556:2:1009 -557:2:1017 -558:2:1022 -559:2:1026 -560:2:1027 -561:2:1034 -562:2:1035 -563:2:1046 -564:2:1047 -565:2:1048 -566:2:1059 -567:2:1064 -568:2:1065 -569:0:2654 -570:2:1077 -571:0:2654 -572:2:1079 -573:0:2654 -574:2:1080 -575:0:2654 -576:2:1081 -577:0:2654 -578:2:1082 -579:0:2654 -580:2:1083 -581:2:1087 -582:2:1088 -583:2:1096 -584:2:1097 -585:2:1101 -586:2:1102 -587:2:1110 -588:2:1115 -589:2:1119 -590:2:1120 -591:2:1127 -592:2:1128 -593:2:1139 -594:2:1140 -595:2:1141 -596:2:1152 -597:2:1157 -598:2:1158 -599:0:2654 -600:2:1170 -601:0:2654 -602:2:1451 -603:0:2654 -604:2:1549 -605:0:2654 -606:2:1550 -607:0:2654 -608:2:1554 -609:0:2654 -610:2:1560 -611:2:1564 -612:2:1565 -613:2:1573 -614:2:1574 -615:2:1578 -616:2:1579 -617:2:1587 -618:2:1592 -619:2:1596 -620:2:1597 -621:2:1604 -622:2:1605 -623:2:1616 -624:2:1617 -625:2:1618 -626:2:1629 -627:2:1634 -628:2:1635 -629:0:2654 -630:2:1647 -631:0:2654 -632:2:1649 -633:0:2654 -634:2:1650 -635:2:1654 -636:2:1655 -637:2:1663 -638:2:1664 -639:2:1668 -640:2:1669 -641:2:1677 -642:2:1682 -643:2:1686 -644:2:1687 -645:2:1694 -646:2:1695 -647:2:1706 -648:2:1707 -649:2:1708 -650:2:1719 -651:2:1724 -652:2:1725 -653:0:2654 -654:2:1737 -655:0:2654 -656:2:1739 -657:0:2654 -658:2:1742 -659:2:1743 -660:2:1755 -661:2:1756 -662:2:1760 -663:2:1761 -664:2:1769 -665:2:1774 -666:2:1778 -667:2:1779 -668:2:1786 -669:2:1787 -670:2:1798 -671:2:1799 -672:2:1800 -673:2:1811 -674:2:1816 -675:2:1817 -676:0:2654 -677:2:1829 -678:0:2654 -679:2:1831 -680:0:2654 -681:2:1832 -682:0:2654 -683:2:1833 -684:0:2654 -685:2:1834 -686:0:2654 -687:2:1835 -688:2:1839 -689:2:1840 -690:2:1848 -691:2:1849 -692:2:1853 -693:2:1854 -694:2:1862 -695:2:1867 -696:2:1871 -697:2:1872 -698:2:1879 -699:2:1880 -700:2:1891 -701:2:1892 -702:2:1893 -703:2:1904 -704:2:1909 -705:2:1910 -706:0:2654 -707:2:1922 -708:0:2654 -709:2:2203 -710:0:2654 -711:2:2301 -712:0:2654 -713:2:2302 -714:0:2654 -715:2:2306 -716:0:2654 -717:2:2312 -718:2:2316 -719:2:2317 -720:2:2325 -721:2:2326 -722:2:2330 -723:2:2331 -724:2:2339 -725:2:2344 -726:2:2348 -727:2:2349 -728:2:2356 -729:2:2357 -730:2:2368 -731:2:2369 -732:2:2370 -733:2:2381 -734:2:2386 -735:2:2387 -736:0:2654 -737:2:2402 -738:0:2654 -739:2:2403 -740:2:2407 -741:2:2408 -742:2:2416 -743:2:2417 -744:2:2421 -745:2:2422 -746:2:2430 -747:2:2435 -748:2:2439 -749:2:2440 -750:2:2447 -751:2:2448 -752:2:2459 -753:2:2460 -754:2:2461 -755:2:2472 -756:2:2477 -757:2:2478 -758:0:2654 -759:2:2493 -760:0:2654 -761:2:2498 -762:2:2502 -763:2:2503 -764:2:2511 -765:2:2512 -766:2:2516 -767:2:2517 -768:2:2525 -769:2:2530 -770:2:2534 -771:2:2535 -772:2:2542 -773:2:2543 -774:2:2554 -775:2:2555 -776:2:2556 -777:2:2567 -778:2:2572 -779:2:2573 -780:0:2654 -781:2:2588 -782:0:2654 -783:2:2590 -784:0:2654 -785:2:2591 -786:0:2654 -787:2:423 -788:0:2654 -789:2:424 -790:2:428 -791:2:429 -792:2:437 -793:2:438 -794:2:442 -795:2:443 -796:2:451 -797:2:456 -798:2:460 -799:2:461 -800:2:468 -801:2:469 -802:2:480 -803:2:481 -804:2:482 -805:2:493 -806:2:498 -807:2:499 -808:0:2654 -809:2:511 -810:0:2654 -811:2:513 -812:2:514 -813:0:2654 -814:2:518 -815:2:522 -816:2:523 -817:2:531 -818:2:532 -819:2:536 -820:2:537 -821:2:545 -822:2:550 -823:2:551 -824:2:562 -825:2:563 -826:2:574 -827:2:575 -828:2:576 -829:2:587 -830:2:592 -831:2:593 -832:0:2654 -833:2:605 -834:0:2654 -835:2:607 -836:0:2654 -837:2:608 -838:0:2654 -839:2:618 -840:0:2654 -841:2:619 -842:2:623 -843:2:624 -844:2:632 -845:2:633 -846:2:637 -847:2:638 -848:2:646 -849:2:651 -850:2:655 -851:2:656 -852:2:663 -853:2:664 -854:2:675 -855:2:676 -856:2:677 -857:2:688 -858:2:693 -859:2:694 -860:0:2654 -861:2:709 -862:0:2654 -863:2:710 -864:2:714 -865:2:715 -866:2:723 -867:2:724 -868:2:728 -869:2:729 -870:2:737 -871:2:742 -872:2:746 -873:2:747 -874:2:754 -875:2:755 -876:2:766 -877:2:767 -878:2:768 -879:2:779 -880:2:784 -881:2:785 -882:0:2654 -883:2:800 -884:0:2654 -885:2:805 -886:2:809 -887:2:810 -888:2:818 -889:2:819 -890:2:823 -891:2:824 -892:2:832 -893:2:837 -894:2:841 -895:2:842 -896:2:849 -897:2:850 -898:2:861 -899:2:862 -900:2:863 -901:2:874 -902:2:879 -903:2:880 -904:0:2654 -905:2:895 -906:0:2654 -907:2:897 -908:0:2654 -909:2:898 -910:2:902 -911:2:903 -912:2:911 -913:2:912 -914:2:916 -915:2:917 -916:2:925 -917:2:930 -918:2:934 -919:2:935 -920:2:942 -921:2:943 -922:2:954 -923:2:955 -924:2:956 -925:2:967 -926:2:972 -927:2:973 -928:0:2654 -929:2:985 -930:0:2654 -931:2:987 -932:0:2654 -933:2:990 -934:2:991 -935:2:1003 -936:2:1004 -937:2:1008 -938:2:1009 -939:2:1017 -940:2:1022 -941:2:1026 -942:2:1027 -943:2:1034 -944:2:1035 -945:2:1046 -946:2:1047 -947:2:1048 -948:2:1059 -949:2:1064 -950:2:1065 -951:0:2654 -952:2:1077 -953:0:2654 -954:2:1079 -955:0:2654 -956:2:1080 -957:0:2654 -958:2:1081 -959:0:2654 -960:2:1082 -961:0:2654 -962:2:1083 -963:2:1087 -964:2:1088 -965:2:1096 -966:2:1097 -967:2:1101 -968:2:1102 -969:2:1110 -970:2:1115 -971:2:1119 -972:2:1120 -973:2:1127 -974:2:1128 -975:2:1139 -976:2:1140 -977:2:1141 -978:2:1152 -979:2:1157 -980:2:1158 -981:0:2654 -982:2:1170 -983:0:2654 -984:2:1451 -985:0:2654 -986:2:1549 -987:0:2654 -988:2:1550 -989:0:2654 -990:2:1554 -991:0:2654 -992:2:1560 -993:2:1564 -994:2:1565 -995:2:1573 -996:2:1574 -997:2:1578 -998:2:1579 -999:2:1587 -1000:2:1592 -1001:2:1596 -1002:2:1597 -1003:2:1604 -1004:2:1605 -1005:2:1616 -1006:2:1617 -1007:2:1618 -1008:2:1629 -1009:2:1634 -1010:2:1635 -1011:0:2654 -1012:2:1647 -1013:0:2654 -1014:2:1649 -1015:0:2654 -1016:2:1650 -1017:2:1654 -1018:2:1655 -1019:2:1663 -1020:2:1664 -1021:2:1668 -1022:2:1669 -1023:2:1677 -1024:2:1682 -1025:2:1686 -1026:2:1687 -1027:2:1694 -1028:2:1695 -1029:2:1706 -1030:2:1707 -1031:2:1708 -1032:2:1719 -1033:2:1724 -1034:2:1725 -1035:0:2654 -1036:2:1737 -1037:0:2654 -1038:2:1739 -1039:0:2654 -1040:2:1742 -1041:2:1743 -1042:2:1755 -1043:2:1756 -1044:2:1760 -1045:2:1761 -1046:2:1769 -1047:2:1774 -1048:2:1778 -1049:2:1779 -1050:2:1786 -1051:2:1787 -1052:2:1798 -1053:2:1799 -1054:2:1800 -1055:2:1811 -1056:2:1816 -1057:2:1817 -1058:0:2654 -1059:2:1829 -1060:0:2654 -1061:2:1831 -1062:0:2654 -1063:2:1832 -1064:0:2654 -1065:2:1833 -1066:0:2654 -1067:2:1834 -1068:0:2654 -1069:2:1835 -1070:2:1839 -1071:2:1840 -1072:2:1848 -1073:2:1849 -1074:2:1853 -1075:2:1854 -1076:2:1862 -1077:2:1867 -1078:2:1871 -1079:2:1872 -1080:2:1879 -1081:2:1880 -1082:2:1891 -1083:2:1892 -1084:2:1893 -1085:2:1904 -1086:2:1909 -1087:2:1910 -1088:0:2654 -1089:2:1922 -1090:0:2654 -1091:2:2203 -1092:0:2654 -1093:2:2301 -1094:0:2654 -1095:2:2302 -1096:0:2654 -1097:2:2306 -1098:0:2654 -1099:2:2312 -1100:2:2316 -1101:2:2317 -1102:2:2325 -1103:2:2326 -1104:2:2330 -1105:2:2331 -1106:2:2339 -1107:2:2344 -1108:2:2348 -1109:2:2349 -1110:2:2356 -1111:2:2357 -1112:2:2368 -1113:2:2369 -1114:2:2370 -1115:2:2381 -1116:2:2386 -1117:2:2387 -1118:0:2654 -1119:2:2402 -1120:0:2654 -1121:2:2403 -1122:2:2407 -1123:2:2408 -1124:2:2416 -1125:2:2417 -1126:2:2421 -1127:2:2422 -1128:2:2430 -1129:2:2435 -1130:2:2439 -1131:2:2440 -1132:2:2447 -1133:2:2448 -1134:2:2459 -1135:2:2460 -1136:2:2461 -1137:2:2472 -1138:2:2477 -1139:2:2478 -1140:0:2654 -1141:2:2493 -1142:0:2654 -1143:2:2498 -1144:2:2502 -1145:2:2503 -1146:2:2511 -1147:2:2512 -1148:2:2516 -1149:2:2517 -1150:2:2525 -1151:2:2530 -1152:2:2534 -1153:2:2535 -1154:2:2542 -1155:2:2543 -1156:2:2554 -1157:2:2555 -1158:2:2556 -1159:2:2567 -1160:2:2572 -1161:2:2573 -1162:0:2654 -1163:2:2588 -1164:0:2654 -1165:2:2590 -1166:0:2654 -1167:2:2591 -1168:0:2654 -1169:2:423 -1170:0:2654 -1171:2:424 -1172:2:428 -1173:2:429 -1174:2:437 -1175:2:438 -1176:2:442 -1177:2:443 -1178:2:451 -1179:2:456 -1180:2:460 -1181:2:461 -1182:2:468 -1183:2:469 -1184:2:480 -1185:2:481 -1186:2:482 -1187:2:493 -1188:2:498 -1189:2:499 -1190:0:2654 -1191:2:511 -1192:0:2654 -1193:2:513 -1194:2:514 -1195:0:2654 -1196:2:518 -1197:2:522 -1198:2:523 -1199:2:531 -1200:2:532 -1201:2:536 -1202:2:537 -1203:2:545 -1204:2:550 -1205:2:551 -1206:2:562 -1207:2:563 -1208:2:574 -1209:2:575 -1210:2:576 -1211:2:587 -1212:2:592 -1213:2:593 -1214:0:2654 -1215:2:605 -1216:0:2654 -1217:2:607 -1218:0:2654 -1219:2:608 -1220:0:2654 -1221:2:618 -1222:0:2654 -1223:2:619 -1224:2:623 -1225:2:624 -1226:2:632 -1227:2:633 -1228:2:637 -1229:2:638 -1230:2:646 -1231:2:651 -1232:2:655 -1233:2:656 -1234:2:663 -1235:2:664 -1236:2:675 -1237:2:676 -1238:2:677 -1239:2:688 -1240:2:693 -1241:2:694 -1242:0:2654 -1243:2:709 -1244:0:2654 -1245:2:710 -1246:2:714 -1247:2:715 -1248:2:723 -1249:2:724 -1250:2:728 -1251:2:729 -1252:2:737 -1253:2:742 -1254:2:746 -1255:2:747 -1256:2:754 -1257:2:755 -1258:2:766 -1259:2:767 -1260:2:768 -1261:2:779 -1262:2:784 -1263:2:785 -1264:0:2654 -1265:2:800 -1266:0:2654 -1267:2:805 -1268:2:809 -1269:2:810 -1270:2:818 -1271:2:819 -1272:2:823 -1273:2:824 -1274:2:832 -1275:2:837 -1276:2:841 -1277:2:842 -1278:2:849 -1279:2:850 -1280:2:861 -1281:2:862 -1282:2:863 -1283:2:874 -1284:2:879 -1285:2:880 -1286:0:2654 -1287:2:895 -1288:0:2654 -1289:2:897 -1290:0:2654 -1291:2:898 -1292:2:902 -1293:2:903 -1294:2:911 -1295:2:912 -1296:2:916 -1297:2:917 -1298:2:925 -1299:2:930 -1300:2:934 -1301:2:935 -1302:2:942 -1303:2:943 -1304:2:954 -1305:2:955 -1306:2:956 -1307:2:967 -1308:2:972 -1309:2:973 -1310:0:2654 -1311:2:985 -1312:0:2654 -1313:2:987 -1314:0:2654 -1315:2:990 -1316:2:991 -1317:2:1003 -1318:2:1004 -1319:2:1008 -1320:2:1009 -1321:2:1017 -1322:2:1022 -1323:2:1026 -1324:2:1027 -1325:2:1034 -1326:2:1035 -1327:2:1046 -1328:2:1047 -1329:2:1048 -1330:2:1059 -1331:2:1064 -1332:2:1065 -1333:0:2654 -1334:2:1077 -1335:0:2654 -1336:2:1079 -1337:0:2654 -1338:2:1080 -1339:0:2654 -1340:2:1081 -1341:0:2654 -1342:2:1082 -1343:0:2654 -1344:2:1083 -1345:2:1087 -1346:2:1088 -1347:2:1096 -1348:2:1097 -1349:2:1101 -1350:2:1102 -1351:2:1110 -1352:2:1115 -1353:2:1119 -1354:2:1120 -1355:2:1127 -1356:2:1128 -1357:2:1139 -1358:2:1140 -1359:2:1141 -1360:2:1152 -1361:2:1157 -1362:2:1158 -1363:0:2654 -1364:2:1170 -1365:0:2654 -1366:2:1451 -1367:0:2654 -1368:2:1549 -1369:0:2654 -1370:2:1550 -1371:0:2654 -1372:2:1554 -1373:0:2654 -1374:2:1560 -1375:2:1564 -1376:2:1565 -1377:2:1573 -1378:2:1574 -1379:2:1578 -1380:2:1579 -1381:2:1587 -1382:2:1592 -1383:2:1596 -1384:2:1597 -1385:2:1604 -1386:2:1605 -1387:2:1616 -1388:2:1617 -1389:2:1618 -1390:2:1629 -1391:2:1634 -1392:2:1635 -1393:0:2654 -1394:2:1647 -1395:0:2654 -1396:2:1649 -1397:0:2654 -1398:2:1650 -1399:2:1654 -1400:2:1655 -1401:2:1663 -1402:2:1664 -1403:2:1668 -1404:2:1669 -1405:2:1677 -1406:2:1682 -1407:2:1686 -1408:2:1687 -1409:2:1694 -1410:2:1695 -1411:2:1706 -1412:2:1707 -1413:2:1708 -1414:2:1719 -1415:2:1724 -1416:2:1725 -1417:0:2654 -1418:2:1737 -1419:0:2654 -1420:2:1739 -1421:0:2654 -1422:2:1742 -1423:2:1743 -1424:2:1755 -1425:2:1756 -1426:2:1760 -1427:2:1761 -1428:2:1769 -1429:2:1774 -1430:2:1778 -1431:2:1779 -1432:2:1786 -1433:2:1787 -1434:2:1798 -1435:2:1799 -1436:2:1800 -1437:2:1811 -1438:2:1816 -1439:2:1817 -1440:0:2654 -1441:2:1829 -1442:0:2654 -1443:2:1831 -1444:0:2654 -1445:2:1832 -1446:0:2654 -1447:2:1833 -1448:0:2654 -1449:2:1834 -1450:0:2654 -1451:2:1835 -1452:2:1839 -1453:2:1840 -1454:2:1848 -1455:2:1849 -1456:2:1853 -1457:2:1854 -1458:2:1862 -1459:2:1867 -1460:2:1871 -1461:2:1872 -1462:2:1879 -1463:2:1880 -1464:2:1891 -1465:2:1892 -1466:2:1893 -1467:2:1904 -1468:2:1909 -1469:2:1910 -1470:0:2654 -1471:2:1922 -1472:0:2654 -1473:2:2203 -1474:0:2654 -1475:2:2301 -1476:0:2654 -1477:2:2302 -1478:0:2654 -1479:2:2306 -1480:0:2654 -1481:2:2312 -1482:2:2316 -1483:2:2317 -1484:2:2325 -1485:2:2326 -1486:2:2330 -1487:2:2331 -1488:2:2339 -1489:2:2344 -1490:2:2348 -1491:2:2349 -1492:2:2356 -1493:2:2357 -1494:2:2368 -1495:2:2369 -1496:2:2370 -1497:2:2381 -1498:2:2386 -1499:2:2387 -1500:0:2654 -1501:2:2402 -1502:0:2654 -1503:2:2403 -1504:2:2407 -1505:2:2408 -1506:2:2416 -1507:2:2417 -1508:2:2421 -1509:2:2422 -1510:2:2430 -1511:2:2435 -1512:2:2439 -1513:2:2440 -1514:2:2447 -1515:2:2448 -1516:2:2459 -1517:2:2460 -1518:2:2461 -1519:2:2472 -1520:2:2477 -1521:2:2478 -1522:0:2654 -1523:2:2493 -1524:0:2654 -1525:2:2498 -1526:2:2502 -1527:2:2503 -1528:2:2511 -1529:2:2512 -1530:2:2516 -1531:2:2517 -1532:2:2525 -1533:2:2530 -1534:2:2534 -1535:2:2535 -1536:2:2542 -1537:2:2543 -1538:2:2554 -1539:2:2555 -1540:2:2556 -1541:2:2567 -1542:2:2572 -1543:2:2573 -1544:0:2654 -1545:2:2588 -1546:0:2654 -1547:2:2590 -1548:0:2654 -1549:2:2591 -1550:0:2654 -1551:2:423 -1552:0:2654 -1553:2:424 -1554:2:428 -1555:2:429 -1556:2:437 -1557:2:438 -1558:2:442 -1559:2:443 -1560:2:451 -1561:2:456 -1562:2:460 -1563:2:461 -1564:2:468 -1565:2:469 -1566:2:480 -1567:2:481 -1568:2:482 -1569:2:493 -1570:2:498 -1571:2:499 -1572:0:2654 -1573:2:511 -1574:0:2654 -1575:2:513 -1576:2:514 -1577:0:2654 -1578:2:518 -1579:2:522 -1580:2:523 -1581:2:531 -1582:2:532 -1583:2:536 -1584:2:537 -1585:2:545 -1586:2:558 -1587:2:559 -1588:2:562 -1589:2:563 -1590:2:574 -1591:2:575 -1592:2:576 -1593:2:587 -1594:2:592 -1595:2:595 -1596:2:596 -1597:0:2654 -1598:2:605 -1599:0:2654 -1600:2:607 -1601:0:2654 -1602:2:608 -1603:0:2654 -1604:2:618 -1605:0:2654 -1606:2:619 -1607:2:623 -1608:2:624 -1609:2:632 -1610:2:633 -1611:2:637 -1612:2:638 -1613:2:646 -1614:2:659 -1615:2:660 -1616:2:663 -1617:2:664 -1618:2:675 -1619:2:676 -1620:2:677 -1621:2:688 -1622:2:693 -1623:2:696 -1624:2:697 -1625:0:2654 -1626:2:709 -1627:0:2654 -1628:2:710 -1629:2:714 -1630:2:715 -1631:2:723 -1632:2:724 -1633:2:728 -1634:2:729 -1635:2:737 -1636:2:750 -1637:2:751 -1638:2:754 -1639:2:755 -1640:2:766 -1641:2:767 -1642:2:768 -1643:2:779 -1644:2:784 -1645:2:787 -1646:2:788 -1647:0:2654 -1648:2:800 -1649:0:2654 -1650:2:805 -1651:2:809 -1652:2:810 -1653:2:818 -1654:2:819 -1655:2:823 -1656:2:824 -1657:2:832 -1658:2:845 -1659:2:846 -1660:2:849 -1661:2:850 -1662:2:861 -1663:2:862 -1664:2:863 -1665:2:874 -1666:2:879 -1667:2:882 -1668:2:883 -1669:0:2654 -1670:2:895 -1671:0:2654 -1672:2:897 -1673:0:2654 -1674:2:898 -1675:2:902 -1676:2:903 -1677:2:911 -1678:2:912 -1679:2:916 -1680:2:917 -1681:2:925 -1682:2:938 -1683:2:939 -1684:2:942 -1685:2:943 -1686:2:954 -1687:2:955 -1688:2:956 -1689:2:967 -1690:2:972 -1691:2:975 -1692:2:976 -1693:0:2654 -1694:2:985 -1695:0:2654 -1696:2:987 -1697:0:2654 -1698:2:990 -1699:2:991 -1700:2:1003 -1701:2:1004 -1702:2:1008 -1703:2:1009 -1704:2:1017 -1705:2:1030 -1706:2:1031 -1707:2:1034 -1708:2:1035 -1709:2:1046 -1710:2:1047 -1711:2:1048 -1712:2:1059 -1713:2:1064 -1714:2:1067 -1715:2:1068 -1716:0:2654 -1717:2:1077 -1718:0:2654 -1719:2:1079 -1720:0:2654 -1721:2:1080 -1722:0:2654 -1723:2:1081 -1724:0:2654 -1725:2:1082 -1726:0:2654 -1727:2:1083 -1728:2:1087 -1729:2:1088 -1730:2:1096 -1731:2:1097 -1732:2:1101 -1733:2:1102 -1734:2:1110 -1735:2:1123 -1736:2:1124 -1737:2:1127 -1738:2:1128 -1739:2:1139 -1740:2:1140 -1741:2:1141 -1742:2:1152 -1743:2:1157 -1744:2:1160 -1745:2:1161 -1746:0:2654 -1747:2:1170 -1748:0:2654 -1749:2:1451 -1750:0:2654 -1751:2:1549 -1752:0:2654 -1753:2:1550 -1754:0:2654 -1755:2:1554 -1756:0:2654 -1757:2:1560 -1758:2:1564 -1759:2:1565 -1760:2:1573 -1761:2:1574 -1762:2:1578 -1763:2:1579 -1764:2:1587 -1765:2:1600 -1766:2:1601 -1767:2:1604 -1768:2:1605 -1769:2:1616 -1770:2:1617 -1771:2:1618 -1772:2:1629 -1773:2:1634 -1774:2:1637 -1775:2:1638 -1776:0:2654 -1777:2:1647 -1778:0:2654 -1779:2:1649 -1780:0:2654 -1781:2:1650 -1782:2:1654 -1783:2:1655 -1784:2:1663 -1785:2:1664 -1786:2:1668 -1787:2:1669 -1788:2:1677 -1789:2:1690 -1790:2:1691 -1791:2:1694 -1792:2:1695 -1793:2:1706 -1794:2:1707 -1795:2:1708 -1796:2:1719 -1797:2:1724 -1798:2:1727 -1799:2:1728 -1800:0:2654 -1801:2:1737 -1802:0:2654 -1803:2:1739 -1804:0:2654 -1805:2:1742 -1806:2:1743 -1807:2:1755 -1808:2:1756 -1809:2:1760 -1810:2:1761 -1811:2:1769 -1812:2:1782 -1813:2:1783 -1814:2:1786 -1815:2:1787 -1816:2:1798 -1817:2:1799 -1818:2:1800 -1819:2:1811 -1820:2:1816 -1821:2:1819 -1822:2:1820 -1823:0:2654 -1824:2:1829 -1825:0:2654 -1826:2:1831 -1827:0:2654 -1828:2:1832 -1829:0:2654 -1830:2:1833 -1831:0:2654 -1832:2:1834 -1833:0:2654 -1834:2:1835 -1835:2:1839 -1836:2:1840 -1837:2:1848 -1838:2:1849 -1839:2:1853 -1840:2:1854 -1841:2:1862 -1842:2:1875 -1843:2:1876 -1844:2:1879 -1845:2:1880 -1846:2:1891 -1847:2:1892 -1848:2:1893 -1849:2:1904 -1850:2:1909 -1851:2:1912 -1852:2:1913 -1853:0:2654 -1854:2:1922 -1855:0:2654 -1856:2:2203 -1857:0:2654 -1858:2:2301 -1859:0:2654 -1860:2:2302 -1861:0:2654 -1862:2:2306 -1863:0:2654 -1864:2:2312 -1865:2:2316 -1866:2:2317 -1867:2:2325 -1868:2:2326 -1869:2:2330 -1870:2:2331 -1871:2:2339 -1872:2:2352 -1873:2:2353 -1874:2:2356 -1875:2:2357 -1876:2:2368 -1877:2:2369 -1878:2:2370 -1879:2:2381 -1880:2:2386 -1881:2:2389 -1882:2:2390 -1883:0:2654 -1884:2:2402 -1885:0:2654 -1886:2:2403 -1887:2:2407 -1888:2:2408 -1889:2:2416 -1890:2:2417 -1891:2:2421 -1892:2:2422 -1893:2:2430 -1894:2:2443 -1895:2:2444 -1896:2:2447 -1897:2:2448 -1898:2:2459 -1899:2:2460 -1900:2:2461 -1901:2:2472 -1902:2:2477 -1903:2:2480 -1904:2:2481 -1905:0:2654 -1906:2:2493 -1907:0:2654 -1908:2:2498 -1909:2:2502 -1910:2:2503 -1911:2:2511 -1912:2:2512 -1913:2:2516 -1914:2:2517 -1915:2:2525 -1916:2:2538 -1917:2:2539 -1918:2:2542 -1919:2:2543 -1920:2:2554 -1921:2:2555 -1922:2:2556 -1923:2:2567 -1924:2:2572 -1925:2:2575 -1926:2:2576 -1927:0:2654 -1928:2:2588 -1929:0:2654 -1930:2:2590 -1931:0:2654 -1932:2:2591 -1933:0:2654 -1934:2:2594 -1935:0:2654 -1936:2:2599 -1937:0:2654 -1938:1:2 -1939:0:2654 -1940:2:2600 -1941:0:2654 -1942:1:8 -1943:0:2654 -1944:2:2599 -1945:0:2654 -1946:1:9 -1947:0:2654 -1948:2:2600 -1949:0:2654 -1950:1:10 -1951:0:2654 -1952:2:2599 -1953:0:2654 -1954:1:11 -1955:0:2654 -1956:2:2600 -1957:0:2654 -1958:1:12 -1959:1:16 -1960:1:17 -1961:1:25 -1962:1:26 -1963:1:30 -1964:1:31 -1965:1:39 -1966:1:44 -1967:1:48 -1968:1:49 -1969:1:56 -1970:1:57 -1971:1:68 -1972:1:69 -1973:1:70 -1974:1:81 -1975:1:86 -1976:1:87 -1977:0:2654 -1978:2:2599 -1979:0:2654 -1980:1:99 -1981:0:2654 -1982:2:2600 -1983:0:2654 -1984:1:101 -1985:0:2654 -1986:2:2599 -1987:0:2654 -1988:1:102 -1989:1:106 -1990:1:107 -1991:1:115 -1992:1:116 -1993:1:120 -1994:1:121 -1995:1:129 -1996:1:134 -1997:1:138 -1998:1:139 -1999:1:146 -2000:1:147 -2001:1:158 -2002:1:159 -2003:1:160 -2004:1:171 -2005:1:176 -2006:1:177 -2007:0:2654 -2008:2:2600 -2009:0:2654 -2010:1:189 -2011:0:2654 -2012:2:2599 -2013:0:2654 -2014:1:191 -2015:0:2654 -2016:2:2600 -2017:0:2654 -2018:1:192 -2019:0:2654 -2020:2:2599 -2021:0:2654 -2022:1:193 -2023:1:197 -2024:1:198 -2025:1:206 -2026:1:207 -2027:1:211 -2028:1:212 -2029:1:220 -2030:1:225 -2031:1:229 -2032:1:230 -2033:1:237 -2034:1:238 -2035:1:249 -2036:1:250 -2037:1:251 -2038:1:262 -2039:1:267 -2040:1:268 -2041:0:2654 -2042:2:2600 -2043:0:2654 -2044:1:280 -2045:0:2654 -2046:2:2599 -2047:0:2654 -2048:1:282 -2049:0:2654 -2050:2:2600 -2051:0:2654 -2052:1:291 -2053:0:2654 -2054:2:2599 -2055:0:2654 -2056:1:293 -2057:0:2654 -2058:2:2600 -2059:0:2654 -2060:1:296 -2061:0:2654 -2062:2:2599 -2063:0:2654 -2064:1:301 -2065:0:2654 -2066:2:2600 -2067:0:2654 -2068:1:302 -2069:0:2652 -2070:2:2599 -2071:0:2658 -2072:0:2654 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.define b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.log b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.log deleted file mode 100644 index 439c78e..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.log +++ /dev/null @@ -1,265 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_rmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -pan: claim violated! (at depth 1726) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 3264, errors: 1 - 229629 states, stored - 2119227 states, matched - 2348856 transitions (= stored+matched) - 8294746 atomic steps -hash conflicts: 96242 (resolved) - -Stats on memory usage (in Megabytes): - 18.395 equivalent memory usage for states (stored*(State-vector + overhead)) - 14.410 actual memory usage for states (compression: 78.34%) - state-vector as stored = 38 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 480.119 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 151, "(1)" - line 418, "pan.___", state 181, "(1)" - line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 242, "(1)" - line 418, "pan.___", state 272, "(1)" - line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 360, "(1)" - line 418, "pan.___", state 390, "(1)" - line 540, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 20, "(1)" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 34, "(1)" - line 403, "pan.___", state 35, "(1)" - line 403, "pan.___", state 35, "(1)" - line 401, "pan.___", state 40, "((i<1))" - line 401, "pan.___", state 40, "((i>=1))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 59, "(1)" - line 409, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 60, "else" - line 409, "pan.___", state 63, "(1)" - line 409, "pan.___", state 64, "(1)" - line 409, "pan.___", state 64, "(1)" - line 413, "pan.___", state 72, "(1)" - line 413, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 73, "else" - line 413, "pan.___", state 76, "(1)" - line 413, "pan.___", state 77, "(1)" - line 413, "pan.___", state 77, "(1)" - line 411, "pan.___", state 82, "((i<1))" - line 411, "pan.___", state 82, "((i>=1))" - line 418, "pan.___", state 89, "(1)" - line 418, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 90, "else" - line 418, "pan.___", state 93, "(1)" - line 418, "pan.___", state 94, "(1)" - line 418, "pan.___", state 94, "(1)" - line 420, "pan.___", state 97, "(1)" - line 420, "pan.___", state 97, "(1)" - line 369, "pan.___", state 99, "(1)" - line 639, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" - line 637, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 114, "(1)" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 128, "(1)" - line 403, "pan.___", state 129, "(1)" - line 403, "pan.___", state 129, "(1)" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 420, "pan.___", state 191, "(1)" - line 420, "pan.___", state 191, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 175, "pan.___", state 243, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 746, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 759, "(1)" - line 409, "pan.___", state 760, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 760, "else" - line 409, "pan.___", state 763, "(1)" - line 409, "pan.___", state 764, "(1)" - line 409, "pan.___", state 764, "(1)" - line 413, "pan.___", state 772, "(1)" - line 413, "pan.___", state 773, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 773, "else" - line 413, "pan.___", state 776, "(1)" - line 413, "pan.___", state 777, "(1)" - line 413, "pan.___", state 777, "(1)" - line 411, "pan.___", state 782, "((i<1))" - line 411, "pan.___", state 782, "((i>=1))" - line 418, "pan.___", state 789, "(1)" - line 418, "pan.___", state 790, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 790, "else" - line 418, "pan.___", state 793, "(1)" - line 418, "pan.___", state 794, "(1)" - line 418, "pan.___", state 794, "(1)" - line 420, "pan.___", state 797, "(1)" - line 420, "pan.___", state 797, "(1)" - line 403, "pan.___", state 828, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 846, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 872, "(1)" - line 418, "pan.___", state 889, "(1)" - line 403, "pan.___", state 918, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 936, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 962, "(1)" - line 418, "pan.___", state 979, "(1)" - line 399, "pan.___", state 998, "(1)" - line 403, "pan.___", state 1010, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1028, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1054, "(1)" - line 418, "pan.___", state 1071, "(1)" - line 403, "pan.___", state 1103, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1121, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1147, "(1)" - line 418, "pan.___", state 1164, "(1)" - line 179, "pan.___", state 1187, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1200, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 175, "pan.___", state 1213, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 1330, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1343, "(1)" - line 409, "pan.___", state 1344, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 1344, "else" - line 409, "pan.___", state 1347, "(1)" - line 409, "pan.___", state 1348, "(1)" - line 409, "pan.___", state 1348, "(1)" - line 413, "pan.___", state 1356, "(1)" - line 413, "pan.___", state 1357, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 1357, "else" - line 413, "pan.___", state 1360, "(1)" - line 413, "pan.___", state 1361, "(1)" - line 413, "pan.___", state 1361, "(1)" - line 411, "pan.___", state 1366, "((i<1))" - line 411, "pan.___", state 1366, "((i>=1))" - line 418, "pan.___", state 1373, "(1)" - line 418, "pan.___", state 1374, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 1374, "else" - line 418, "pan.___", state 1377, "(1)" - line 418, "pan.___", state 1378, "(1)" - line 418, "pan.___", state 1378, "(1)" - line 420, "pan.___", state 1381, "(1)" - line 420, "pan.___", state 1381, "(1)" - line 179, "pan.___", state 1406, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1419, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 175, "pan.___", state 1432, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=2))" - line 710, "pan.___", state 20, "((j<2))" - line 710, "pan.___", state 20, "((j>=2))" - line 715, "pan.___", state 33, "((j<2))" - line 715, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 749, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 1.88 seconds -pan: rate 122143.09 states/second -pan: avg transition delay 8.0039e-07 usec -cp .input.spin urcu_free_no_rmb.spin.input -cp .input.spin.trail urcu_free_no_rmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.spin.input b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.spin.input deleted file mode 100644 index 6ccb255..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define NO_RMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.spin.input.trail deleted file mode 100644 index 90f91e2..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_rmb.spin.input.trail +++ /dev/null @@ -1,1729 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:1982 -2:3:1934 -3:3:1937 -4:3:1937 -5:3:1940 -6:3:1948 -7:3:1948 -8:3:1951 -9:3:1957 -10:3:1961 -11:3:1961 -12:3:1964 -13:3:1972 -14:3:1976 -15:3:1977 -16:0:1982 -17:3:1979 -18:0:1982 -19:2:416 -20:0:1982 -21:2:422 -22:0:1982 -23:2:423 -24:0:1982 -25:2:424 -26:2:428 -27:2:429 -28:2:437 -29:2:438 -30:2:442 -31:2:443 -32:2:451 -33:2:456 -34:2:460 -35:2:461 -36:2:468 -37:2:469 -38:2:480 -39:2:481 -40:2:482 -41:2:493 -42:2:498 -43:2:499 -44:0:1982 -45:2:511 -46:0:1982 -47:2:513 -48:2:514 -49:0:1982 -50:2:518 -51:2:522 -52:2:523 -53:2:531 -54:2:532 -55:2:536 -56:2:537 -57:2:545 -58:2:550 -59:2:551 -60:2:562 -61:2:563 -62:2:574 -63:2:575 -64:2:576 -65:2:587 -66:2:592 -67:2:593 -68:0:1982 -69:2:605 -70:0:1982 -71:2:607 -72:0:1982 -73:2:608 -74:0:1982 -75:2:618 -76:0:1982 -77:2:622 -78:2:623 -79:2:627 -80:2:631 -81:2:632 -82:2:636 -83:2:644 -84:2:645 -85:0:1982 -86:2:653 -87:0:1982 -88:2:657 -89:2:658 -90:2:662 -91:2:666 -92:2:667 -93:2:671 -94:2:679 -95:2:680 -96:0:1982 -97:2:688 -98:0:1982 -99:2:696 -100:2:697 -101:2:701 -102:2:705 -103:2:706 -104:2:710 -105:2:718 -106:2:719 -107:0:1982 -108:2:727 -109:0:1982 -110:2:729 -111:0:1982 -112:2:730 -113:2:734 -114:2:735 -115:2:743 -116:2:744 -117:2:748 -118:2:749 -119:2:757 -120:2:762 -121:2:766 -122:2:767 -123:2:774 -124:2:775 -125:2:786 -126:2:787 -127:2:788 -128:2:799 -129:2:804 -130:2:805 -131:0:1982 -132:2:817 -133:0:1982 -134:2:819 -135:0:1982 -136:2:822 -137:2:823 -138:2:835 -139:2:836 -140:2:840 -141:2:841 -142:2:849 -143:2:854 -144:2:858 -145:2:859 -146:2:866 -147:2:867 -148:2:878 -149:2:879 -150:2:880 -151:2:891 -152:2:896 -153:2:897 -154:0:1982 -155:2:909 -156:0:1982 -157:2:911 -158:0:1982 -159:2:912 -160:0:1982 -161:2:913 -162:0:1982 -163:2:914 -164:0:1982 -165:2:915 -166:2:919 -167:2:920 -168:2:928 -169:2:929 -170:2:933 -171:2:934 -172:2:942 -173:2:947 -174:2:951 -175:2:952 -176:2:959 -177:2:960 -178:2:971 -179:2:972 -180:2:973 -181:2:984 -182:2:989 -183:2:990 -184:0:1982 -185:2:1002 -186:0:1982 -187:2:1115 -188:0:1982 -189:2:1213 -190:0:1982 -191:2:1214 -192:0:1982 -193:2:1218 -194:0:1982 -195:2:1224 -196:2:1228 -197:2:1229 -198:2:1237 -199:2:1238 -200:2:1242 -201:2:1243 -202:2:1251 -203:2:1256 -204:2:1260 -205:2:1261 -206:2:1268 -207:2:1269 -208:2:1280 -209:2:1281 -210:2:1282 -211:2:1293 -212:2:1298 -213:2:1299 -214:0:1982 -215:2:1311 -216:0:1982 -217:2:1313 -218:0:1982 -219:2:1314 -220:2:1318 -221:2:1319 -222:2:1327 -223:2:1328 -224:2:1332 -225:2:1333 -226:2:1341 -227:2:1346 -228:2:1350 -229:2:1351 -230:2:1358 -231:2:1359 -232:2:1370 -233:2:1371 -234:2:1372 -235:2:1383 -236:2:1388 -237:2:1389 -238:0:1982 -239:2:1401 -240:0:1982 -241:2:1403 -242:0:1982 -243:2:1406 -244:2:1407 -245:2:1419 -246:2:1420 -247:2:1424 -248:2:1425 -249:2:1433 -250:2:1438 -251:2:1442 -252:2:1443 -253:2:1450 -254:2:1451 -255:2:1462 -256:2:1463 -257:2:1464 -258:2:1475 -259:2:1480 -260:2:1481 -261:0:1982 -262:2:1493 -263:0:1982 -264:2:1495 -265:0:1982 -266:2:1496 -267:0:1982 -268:2:1497 -269:0:1982 -270:2:1498 -271:0:1982 -272:2:1499 -273:2:1503 -274:2:1504 -275:2:1512 -276:2:1513 -277:2:1517 -278:2:1518 -279:2:1526 -280:2:1531 -281:2:1535 -282:2:1536 -283:2:1543 -284:2:1544 -285:2:1555 -286:2:1556 -287:2:1557 -288:2:1568 -289:2:1573 -290:2:1574 -291:0:1982 -292:2:1586 -293:0:1982 -294:2:1699 -295:0:1982 -296:2:1797 -297:0:1982 -298:2:1798 -299:0:1982 -300:2:1802 -301:0:1982 -302:2:1811 -303:2:1812 -304:2:1816 -305:2:1820 -306:2:1821 -307:2:1825 -308:2:1833 -309:2:1834 -310:0:1982 -311:2:1842 -312:0:1982 -313:2:1846 -314:2:1847 -315:2:1851 -316:2:1855 -317:2:1856 -318:2:1860 -319:2:1868 -320:2:1869 -321:0:1982 -322:2:1877 -323:0:1982 -324:2:1885 -325:2:1886 -326:2:1890 -327:2:1894 -328:2:1895 -329:2:1899 -330:2:1907 -331:2:1908 -332:0:1982 -333:2:1916 -334:0:1982 -335:2:1918 -336:0:1982 -337:2:1919 -338:0:1982 -339:2:423 -340:0:1982 -341:2:424 -342:2:428 -343:2:429 -344:2:437 -345:2:438 -346:2:442 -347:2:443 -348:2:451 -349:2:456 -350:2:460 -351:2:461 -352:2:468 -353:2:469 -354:2:480 -355:2:481 -356:2:482 -357:2:493 -358:2:498 -359:2:499 -360:0:1982 -361:2:511 -362:0:1982 -363:2:513 -364:2:514 -365:0:1982 -366:2:518 -367:2:522 -368:2:523 -369:2:531 -370:2:532 -371:2:536 -372:2:537 -373:2:545 -374:2:550 -375:2:551 -376:2:562 -377:2:563 -378:2:574 -379:2:575 -380:2:576 -381:2:587 -382:2:592 -383:2:593 -384:0:1982 -385:2:605 -386:0:1982 -387:2:607 -388:0:1982 -389:2:608 -390:0:1982 -391:2:618 -392:0:1982 -393:2:622 -394:2:623 -395:2:627 -396:2:631 -397:2:632 -398:2:636 -399:2:644 -400:2:645 -401:0:1982 -402:2:653 -403:0:1982 -404:2:657 -405:2:658 -406:2:662 -407:2:666 -408:2:667 -409:2:671 -410:2:679 -411:2:680 -412:0:1982 -413:2:688 -414:0:1982 -415:2:696 -416:2:697 -417:2:701 -418:2:705 -419:2:706 -420:2:710 -421:2:718 -422:2:719 -423:0:1982 -424:2:727 -425:0:1982 -426:2:729 -427:0:1982 -428:2:730 -429:2:734 -430:2:735 -431:2:743 -432:2:744 -433:2:748 -434:2:749 -435:2:757 -436:2:762 -437:2:766 -438:2:767 -439:2:774 -440:2:775 -441:2:786 -442:2:787 -443:2:788 -444:2:799 -445:2:804 -446:2:805 -447:0:1982 -448:2:817 -449:0:1982 -450:2:819 -451:0:1982 -452:2:822 -453:2:823 -454:2:835 -455:2:836 -456:2:840 -457:2:841 -458:2:849 -459:2:854 -460:2:858 -461:2:859 -462:2:866 -463:2:867 -464:2:878 -465:2:879 -466:2:880 -467:2:891 -468:2:896 -469:2:897 -470:0:1982 -471:2:909 -472:0:1982 -473:2:911 -474:0:1982 -475:2:912 -476:0:1982 -477:2:913 -478:0:1982 -479:2:914 -480:0:1982 -481:2:915 -482:2:919 -483:2:920 -484:2:928 -485:2:929 -486:2:933 -487:2:934 -488:2:942 -489:2:947 -490:2:951 -491:2:952 -492:2:959 -493:2:960 -494:2:971 -495:2:972 -496:2:973 -497:2:984 -498:2:989 -499:2:990 -500:0:1982 -501:2:1002 -502:0:1982 -503:2:1115 -504:0:1982 -505:2:1213 -506:0:1982 -507:2:1214 -508:0:1982 -509:2:1218 -510:0:1982 -511:2:1224 -512:2:1228 -513:2:1229 -514:2:1237 -515:2:1238 -516:2:1242 -517:2:1243 -518:2:1251 -519:2:1256 -520:2:1260 -521:2:1261 -522:2:1268 -523:2:1269 -524:2:1280 -525:2:1281 -526:2:1282 -527:2:1293 -528:2:1298 -529:2:1299 -530:0:1982 -531:2:1311 -532:0:1982 -533:2:1313 -534:0:1982 -535:2:1314 -536:2:1318 -537:2:1319 -538:2:1327 -539:2:1328 -540:2:1332 -541:2:1333 -542:2:1341 -543:2:1346 -544:2:1350 -545:2:1351 -546:2:1358 -547:2:1359 -548:2:1370 -549:2:1371 -550:2:1372 -551:2:1383 -552:2:1388 -553:2:1389 -554:0:1982 -555:2:1401 -556:0:1982 -557:2:1403 -558:0:1982 -559:2:1406 -560:2:1407 -561:2:1419 -562:2:1420 -563:2:1424 -564:2:1425 -565:2:1433 -566:2:1438 -567:2:1442 -568:2:1443 -569:2:1450 -570:2:1451 -571:2:1462 -572:2:1463 -573:2:1464 -574:2:1475 -575:2:1480 -576:2:1481 -577:0:1982 -578:2:1493 -579:0:1982 -580:2:1495 -581:0:1982 -582:2:1496 -583:0:1982 -584:2:1497 -585:0:1982 -586:2:1498 -587:0:1982 -588:2:1499 -589:2:1503 -590:2:1504 -591:2:1512 -592:2:1513 -593:2:1517 -594:2:1518 -595:2:1526 -596:2:1531 -597:2:1535 -598:2:1536 -599:2:1543 -600:2:1544 -601:2:1555 -602:2:1556 -603:2:1557 -604:2:1568 -605:2:1573 -606:2:1574 -607:0:1982 -608:2:1586 -609:0:1982 -610:2:1699 -611:0:1982 -612:2:1797 -613:0:1982 -614:2:1798 -615:0:1982 -616:2:1802 -617:0:1982 -618:2:1811 -619:2:1812 -620:2:1816 -621:2:1820 -622:2:1821 -623:2:1825 -624:2:1833 -625:2:1834 -626:0:1982 -627:2:1842 -628:0:1982 -629:2:1846 -630:2:1847 -631:2:1851 -632:2:1855 -633:2:1856 -634:2:1860 -635:2:1868 -636:2:1869 -637:0:1982 -638:2:1877 -639:0:1982 -640:2:1885 -641:2:1886 -642:2:1890 -643:2:1894 -644:2:1895 -645:2:1899 -646:2:1907 -647:2:1908 -648:0:1982 -649:2:1916 -650:0:1982 -651:2:1918 -652:0:1982 -653:2:1919 -654:0:1982 -655:2:423 -656:0:1982 -657:2:424 -658:2:428 -659:2:429 -660:2:437 -661:2:438 -662:2:442 -663:2:443 -664:2:451 -665:2:456 -666:2:460 -667:2:461 -668:2:468 -669:2:469 -670:2:480 -671:2:481 -672:2:482 -673:2:493 -674:2:498 -675:2:499 -676:0:1982 -677:2:511 -678:0:1982 -679:2:513 -680:2:514 -681:0:1982 -682:2:518 -683:2:522 -684:2:523 -685:2:531 -686:2:532 -687:2:536 -688:2:537 -689:2:545 -690:2:550 -691:2:551 -692:2:562 -693:2:563 -694:2:574 -695:2:575 -696:2:576 -697:2:587 -698:2:592 -699:2:593 -700:0:1982 -701:2:605 -702:0:1982 -703:2:607 -704:0:1982 -705:2:608 -706:0:1982 -707:2:618 -708:0:1982 -709:2:622 -710:2:623 -711:2:627 -712:2:631 -713:2:632 -714:2:636 -715:2:644 -716:2:645 -717:0:1982 -718:2:653 -719:0:1982 -720:2:657 -721:2:658 -722:2:662 -723:2:666 -724:2:667 -725:2:671 -726:2:679 -727:2:680 -728:0:1982 -729:2:688 -730:0:1982 -731:2:696 -732:2:697 -733:2:701 -734:2:705 -735:2:706 -736:2:710 -737:2:718 -738:2:719 -739:0:1982 -740:2:727 -741:0:1982 -742:2:729 -743:0:1982 -744:2:730 -745:2:734 -746:2:735 -747:2:743 -748:2:744 -749:2:748 -750:2:749 -751:2:757 -752:2:762 -753:2:766 -754:2:767 -755:2:774 -756:2:775 -757:2:786 -758:2:787 -759:2:788 -760:2:799 -761:2:804 -762:2:805 -763:0:1982 -764:2:817 -765:0:1982 -766:2:819 -767:0:1982 -768:2:822 -769:2:823 -770:2:835 -771:2:836 -772:2:840 -773:2:841 -774:2:849 -775:2:854 -776:2:858 -777:2:859 -778:2:866 -779:2:867 -780:2:878 -781:2:879 -782:2:880 -783:2:891 -784:2:896 -785:2:897 -786:0:1982 -787:2:909 -788:0:1982 -789:2:911 -790:0:1982 -791:2:912 -792:0:1982 -793:2:913 -794:0:1982 -795:2:914 -796:0:1982 -797:2:915 -798:2:919 -799:2:920 -800:2:928 -801:2:929 -802:2:933 -803:2:934 -804:2:942 -805:2:947 -806:2:951 -807:2:952 -808:2:959 -809:2:960 -810:2:971 -811:2:972 -812:2:973 -813:2:984 -814:2:989 -815:2:990 -816:0:1982 -817:2:1002 -818:0:1982 -819:2:1115 -820:0:1982 -821:2:1213 -822:0:1982 -823:2:1214 -824:0:1982 -825:2:1218 -826:0:1982 -827:2:1224 -828:2:1228 -829:2:1229 -830:2:1237 -831:2:1238 -832:2:1242 -833:2:1243 -834:2:1251 -835:2:1256 -836:2:1260 -837:2:1261 -838:2:1268 -839:2:1269 -840:2:1280 -841:2:1281 -842:2:1282 -843:2:1293 -844:2:1298 -845:2:1299 -846:0:1982 -847:2:1311 -848:0:1982 -849:2:1313 -850:0:1982 -851:2:1314 -852:2:1318 -853:2:1319 -854:2:1327 -855:2:1328 -856:2:1332 -857:2:1333 -858:2:1341 -859:2:1346 -860:2:1350 -861:2:1351 -862:2:1358 -863:2:1359 -864:2:1370 -865:2:1371 -866:2:1372 -867:2:1383 -868:2:1388 -869:2:1389 -870:0:1982 -871:2:1401 -872:0:1982 -873:2:1403 -874:0:1982 -875:2:1406 -876:2:1407 -877:2:1419 -878:2:1420 -879:2:1424 -880:2:1425 -881:2:1433 -882:2:1438 -883:2:1442 -884:2:1443 -885:2:1450 -886:2:1451 -887:2:1462 -888:2:1463 -889:2:1464 -890:2:1475 -891:2:1480 -892:2:1481 -893:0:1982 -894:2:1493 -895:0:1982 -896:2:1495 -897:0:1982 -898:2:1496 -899:0:1982 -900:2:1497 -901:0:1982 -902:2:1498 -903:0:1982 -904:2:1499 -905:2:1503 -906:2:1504 -907:2:1512 -908:2:1513 -909:2:1517 -910:2:1518 -911:2:1526 -912:2:1531 -913:2:1535 -914:2:1536 -915:2:1543 -916:2:1544 -917:2:1555 -918:2:1556 -919:2:1557 -920:2:1568 -921:2:1573 -922:2:1574 -923:0:1982 -924:2:1586 -925:0:1982 -926:2:1699 -927:0:1982 -928:2:1797 -929:0:1982 -930:2:1798 -931:0:1982 -932:2:1802 -933:0:1982 -934:2:1811 -935:2:1812 -936:2:1816 -937:2:1820 -938:2:1821 -939:2:1825 -940:2:1833 -941:2:1834 -942:0:1982 -943:2:1842 -944:0:1982 -945:2:1846 -946:2:1847 -947:2:1851 -948:2:1855 -949:2:1856 -950:2:1860 -951:2:1868 -952:2:1869 -953:0:1982 -954:2:1877 -955:0:1982 -956:2:1885 -957:2:1886 -958:2:1890 -959:2:1894 -960:2:1895 -961:2:1899 -962:2:1907 -963:2:1908 -964:0:1982 -965:2:1916 -966:0:1982 -967:2:1918 -968:0:1982 -969:2:1919 -970:0:1982 -971:2:423 -972:0:1982 -973:2:424 -974:2:428 -975:2:429 -976:2:437 -977:2:438 -978:2:442 -979:2:443 -980:2:451 -981:2:456 -982:2:460 -983:2:461 -984:2:468 -985:2:469 -986:2:480 -987:2:481 -988:2:482 -989:2:493 -990:2:498 -991:2:499 -992:0:1982 -993:2:511 -994:0:1982 -995:2:513 -996:2:514 -997:0:1982 -998:2:518 -999:2:522 -1000:2:523 -1001:2:531 -1002:2:532 -1003:2:536 -1004:2:537 -1005:2:545 -1006:2:550 -1007:2:551 -1008:2:562 -1009:2:563 -1010:2:574 -1011:2:575 -1012:2:576 -1013:2:587 -1014:2:592 -1015:2:593 -1016:0:1982 -1017:2:605 -1018:0:1982 -1019:2:607 -1020:0:1982 -1021:2:608 -1022:0:1982 -1023:2:618 -1024:0:1982 -1025:2:622 -1026:2:623 -1027:2:627 -1028:2:631 -1029:2:632 -1030:2:636 -1031:2:644 -1032:2:645 -1033:0:1982 -1034:2:653 -1035:0:1982 -1036:2:657 -1037:2:658 -1038:2:662 -1039:2:666 -1040:2:667 -1041:2:671 -1042:2:679 -1043:2:680 -1044:0:1982 -1045:2:688 -1046:0:1982 -1047:2:696 -1048:2:697 -1049:2:701 -1050:2:705 -1051:2:706 -1052:2:710 -1053:2:718 -1054:2:719 -1055:0:1982 -1056:2:727 -1057:0:1982 -1058:2:729 -1059:0:1982 -1060:2:730 -1061:2:734 -1062:2:735 -1063:2:743 -1064:2:744 -1065:2:748 -1066:2:749 -1067:2:757 -1068:2:762 -1069:2:766 -1070:2:767 -1071:2:774 -1072:2:775 -1073:2:786 -1074:2:787 -1075:2:788 -1076:2:799 -1077:2:804 -1078:2:805 -1079:0:1982 -1080:2:817 -1081:0:1982 -1082:2:819 -1083:0:1982 -1084:2:822 -1085:2:823 -1086:2:835 -1087:2:836 -1088:2:840 -1089:2:841 -1090:2:849 -1091:2:854 -1092:2:858 -1093:2:859 -1094:2:866 -1095:2:867 -1096:2:878 -1097:2:879 -1098:2:880 -1099:2:891 -1100:2:896 -1101:2:897 -1102:0:1982 -1103:2:909 -1104:0:1982 -1105:2:911 -1106:0:1982 -1107:2:912 -1108:0:1982 -1109:2:913 -1110:0:1982 -1111:2:914 -1112:0:1982 -1113:2:915 -1114:2:919 -1115:2:920 -1116:2:928 -1117:2:929 -1118:2:933 -1119:2:934 -1120:2:942 -1121:2:947 -1122:2:951 -1123:2:952 -1124:2:959 -1125:2:960 -1126:2:971 -1127:2:972 -1128:2:973 -1129:2:984 -1130:2:989 -1131:2:990 -1132:0:1982 -1133:2:1002 -1134:0:1982 -1135:2:1115 -1136:0:1982 -1137:2:1213 -1138:0:1982 -1139:2:1214 -1140:0:1982 -1141:2:1218 -1142:0:1982 -1143:2:1224 -1144:2:1228 -1145:2:1229 -1146:2:1237 -1147:2:1238 -1148:2:1242 -1149:2:1243 -1150:2:1251 -1151:2:1256 -1152:2:1260 -1153:2:1261 -1154:2:1268 -1155:2:1269 -1156:2:1280 -1157:2:1281 -1158:2:1282 -1159:2:1293 -1160:2:1298 -1161:2:1299 -1162:0:1982 -1163:2:1311 -1164:0:1982 -1165:2:1313 -1166:0:1982 -1167:2:1314 -1168:2:1318 -1169:2:1319 -1170:2:1327 -1171:2:1328 -1172:2:1332 -1173:2:1333 -1174:2:1341 -1175:2:1346 -1176:2:1350 -1177:2:1351 -1178:2:1358 -1179:2:1359 -1180:2:1370 -1181:2:1371 -1182:2:1372 -1183:2:1383 -1184:2:1388 -1185:2:1389 -1186:0:1982 -1187:2:1401 -1188:0:1982 -1189:2:1403 -1190:0:1982 -1191:2:1406 -1192:2:1407 -1193:2:1419 -1194:2:1420 -1195:2:1424 -1196:2:1425 -1197:2:1433 -1198:2:1438 -1199:2:1442 -1200:2:1443 -1201:2:1450 -1202:2:1451 -1203:2:1462 -1204:2:1463 -1205:2:1464 -1206:2:1475 -1207:2:1480 -1208:2:1481 -1209:0:1982 -1210:2:1493 -1211:0:1982 -1212:2:1495 -1213:0:1982 -1214:2:1496 -1215:0:1982 -1216:2:1497 -1217:0:1982 -1218:2:1498 -1219:0:1982 -1220:2:1499 -1221:2:1503 -1222:2:1504 -1223:2:1512 -1224:2:1513 -1225:2:1517 -1226:2:1518 -1227:2:1526 -1228:2:1531 -1229:2:1535 -1230:2:1536 -1231:2:1543 -1232:2:1544 -1233:2:1555 -1234:2:1556 -1235:2:1557 -1236:2:1568 -1237:2:1573 -1238:2:1574 -1239:0:1982 -1240:2:1586 -1241:0:1982 -1242:2:1699 -1243:0:1982 -1244:2:1797 -1245:0:1982 -1246:2:1798 -1247:0:1982 -1248:2:1802 -1249:0:1982 -1250:2:1811 -1251:2:1812 -1252:2:1816 -1253:2:1820 -1254:2:1821 -1255:2:1825 -1256:2:1833 -1257:2:1834 -1258:0:1982 -1259:2:1842 -1260:0:1982 -1261:2:1846 -1262:2:1847 -1263:2:1851 -1264:2:1855 -1265:2:1856 -1266:2:1860 -1267:2:1868 -1268:2:1869 -1269:0:1982 -1270:2:1877 -1271:0:1982 -1272:2:1885 -1273:2:1886 -1274:2:1890 -1275:2:1894 -1276:2:1895 -1277:2:1899 -1278:2:1907 -1279:2:1908 -1280:0:1982 -1281:2:1916 -1282:0:1982 -1283:2:1918 -1284:0:1982 -1285:2:1919 -1286:0:1982 -1287:2:423 -1288:0:1982 -1289:2:424 -1290:2:428 -1291:2:429 -1292:2:437 -1293:2:438 -1294:2:442 -1295:2:443 -1296:2:451 -1297:2:456 -1298:2:460 -1299:2:461 -1300:2:468 -1301:2:469 -1302:2:480 -1303:2:481 -1304:2:482 -1305:2:493 -1306:2:498 -1307:2:499 -1308:0:1982 -1309:2:511 -1310:0:1982 -1311:2:513 -1312:2:514 -1313:0:1982 -1314:2:518 -1315:2:522 -1316:2:523 -1317:2:531 -1318:2:532 -1319:2:536 -1320:2:537 -1321:2:545 -1322:2:558 -1323:2:559 -1324:2:562 -1325:2:563 -1326:2:574 -1327:2:575 -1328:2:576 -1329:2:587 -1330:2:592 -1331:2:595 -1332:2:596 -1333:0:1982 -1334:2:605 -1335:0:1982 -1336:2:607 -1337:0:1982 -1338:2:608 -1339:0:1982 -1340:2:618 -1341:0:1982 -1342:1:2 -1343:0:1982 -1344:1:8 -1345:0:1982 -1346:1:9 -1347:0:1982 -1348:1:10 -1349:0:1982 -1350:1:11 -1351:0:1982 -1352:1:12 -1353:1:16 -1354:1:17 -1355:1:25 -1356:1:26 -1357:1:30 -1358:1:31 -1359:1:39 -1360:1:44 -1361:1:48 -1362:1:49 -1363:1:56 -1364:1:57 -1365:1:68 -1366:1:69 -1367:1:70 -1368:1:81 -1369:1:86 -1370:1:87 -1371:0:1982 -1372:1:99 -1373:0:1982 -1374:2:622 -1375:2:623 -1376:2:627 -1377:2:631 -1378:2:632 -1379:2:636 -1380:2:641 -1381:0:1982 -1382:2:653 -1383:0:1982 -1384:2:657 -1385:2:658 -1386:2:662 -1387:2:666 -1388:2:667 -1389:2:671 -1390:2:679 -1391:2:680 -1392:0:1982 -1393:2:688 -1394:0:1982 -1395:2:696 -1396:2:697 -1397:2:701 -1398:2:705 -1399:2:706 -1400:2:710 -1401:2:718 -1402:2:719 -1403:0:1982 -1404:2:727 -1405:0:1982 -1406:2:729 -1407:0:1982 -1408:2:730 -1409:2:734 -1410:2:735 -1411:2:743 -1412:2:744 -1413:2:748 -1414:2:749 -1415:2:757 -1416:2:762 -1417:2:766 -1418:2:767 -1419:2:774 -1420:2:775 -1421:2:786 -1422:2:787 -1423:2:788 -1424:2:799 -1425:2:804 -1426:2:805 -1427:0:1982 -1428:2:817 -1429:0:1982 -1430:2:819 -1431:0:1982 -1432:2:822 -1433:2:823 -1434:2:835 -1435:2:836 -1436:2:840 -1437:2:841 -1438:2:849 -1439:2:854 -1440:2:858 -1441:2:859 -1442:2:866 -1443:2:867 -1444:2:878 -1445:2:879 -1446:2:880 -1447:2:891 -1448:2:896 -1449:2:897 -1450:0:1982 -1451:2:909 -1452:0:1982 -1453:2:911 -1454:0:1982 -1455:2:912 -1456:0:1982 -1457:2:913 -1458:0:1982 -1459:2:914 -1460:0:1982 -1461:2:915 -1462:2:919 -1463:2:920 -1464:2:928 -1465:2:929 -1466:2:933 -1467:2:934 -1468:2:942 -1469:2:947 -1470:2:951 -1471:2:952 -1472:2:959 -1473:2:960 -1474:2:971 -1475:2:972 -1476:2:973 -1477:2:984 -1478:2:989 -1479:2:990 -1480:0:1982 -1481:2:1002 -1482:0:1982 -1483:2:1115 -1484:0:1982 -1485:2:1213 -1486:0:1982 -1487:2:1214 -1488:0:1982 -1489:2:1218 -1490:0:1982 -1491:2:1224 -1492:2:1228 -1493:2:1229 -1494:2:1237 -1495:2:1238 -1496:2:1242 -1497:2:1243 -1498:2:1251 -1499:2:1256 -1500:2:1260 -1501:2:1261 -1502:2:1268 -1503:2:1269 -1504:2:1280 -1505:2:1281 -1506:2:1282 -1507:2:1293 -1508:2:1298 -1509:2:1299 -1510:0:1982 -1511:2:1311 -1512:0:1982 -1513:2:1313 -1514:0:1982 -1515:2:1314 -1516:2:1318 -1517:2:1319 -1518:2:1327 -1519:2:1328 -1520:2:1332 -1521:2:1333 -1522:2:1341 -1523:2:1346 -1524:2:1350 -1525:2:1351 -1526:2:1358 -1527:2:1359 -1528:2:1370 -1529:2:1371 -1530:2:1372 -1531:2:1383 -1532:2:1388 -1533:2:1389 -1534:0:1982 -1535:2:1401 -1536:0:1982 -1537:2:1403 -1538:0:1982 -1539:2:1406 -1540:2:1407 -1541:2:1419 -1542:2:1420 -1543:2:1424 -1544:2:1425 -1545:2:1433 -1546:2:1438 -1547:2:1442 -1548:2:1443 -1549:2:1450 -1550:2:1451 -1551:2:1462 -1552:2:1463 -1553:2:1464 -1554:2:1475 -1555:2:1480 -1556:2:1481 -1557:0:1982 -1558:2:1493 -1559:0:1982 -1560:2:1495 -1561:0:1982 -1562:2:1496 -1563:0:1982 -1564:2:1497 -1565:0:1982 -1566:2:1498 -1567:0:1982 -1568:2:1499 -1569:2:1503 -1570:2:1504 -1571:2:1512 -1572:2:1513 -1573:2:1517 -1574:2:1518 -1575:2:1526 -1576:2:1531 -1577:2:1535 -1578:2:1536 -1579:2:1543 -1580:2:1544 -1581:2:1555 -1582:2:1556 -1583:2:1557 -1584:2:1568 -1585:2:1573 -1586:2:1574 -1587:0:1982 -1588:2:1586 -1589:0:1982 -1590:2:1699 -1591:0:1982 -1592:2:1797 -1593:0:1982 -1594:2:1798 -1595:0:1982 -1596:2:1802 -1597:0:1982 -1598:2:1811 -1599:2:1812 -1600:2:1816 -1601:2:1820 -1602:2:1821 -1603:2:1825 -1604:2:1833 -1605:2:1834 -1606:0:1982 -1607:2:1842 -1608:0:1982 -1609:2:1846 -1610:2:1847 -1611:2:1851 -1612:2:1855 -1613:2:1856 -1614:2:1860 -1615:2:1868 -1616:2:1869 -1617:0:1982 -1618:2:1877 -1619:0:1982 -1620:2:1885 -1621:2:1886 -1622:2:1890 -1623:2:1894 -1624:2:1895 -1625:2:1899 -1626:2:1907 -1627:2:1908 -1628:0:1982 -1629:2:1916 -1630:0:1982 -1631:2:1918 -1632:0:1982 -1633:2:1919 -1634:0:1982 -1635:2:1922 -1636:0:1982 -1637:2:1927 -1638:0:1982 -1639:1:101 -1640:0:1982 -1641:2:1928 -1642:0:1982 -1643:1:102 -1644:1:106 -1645:1:107 -1646:1:115 -1647:1:116 -1648:1:120 -1649:1:121 -1650:1:129 -1651:1:134 -1652:1:138 -1653:1:139 -1654:1:146 -1655:1:147 -1656:1:158 -1657:1:159 -1658:1:160 -1659:1:171 -1660:1:183 -1661:1:184 -1662:0:1982 -1663:2:1927 -1664:0:1982 -1665:1:189 -1666:0:1982 -1667:2:1928 -1668:0:1982 -1669:1:191 -1670:0:1982 -1671:2:1927 -1672:0:1982 -1673:1:192 -1674:0:1982 -1675:2:1928 -1676:0:1982 -1677:1:193 -1678:1:197 -1679:1:198 -1680:1:206 -1681:1:207 -1682:1:211 -1683:1:212 -1684:1:220 -1685:1:225 -1686:1:229 -1687:1:230 -1688:1:237 -1689:1:238 -1690:1:249 -1691:1:250 -1692:1:251 -1693:1:262 -1694:1:274 -1695:1:275 -1696:0:1982 -1697:2:1927 -1698:0:1982 -1699:1:280 -1700:0:1982 -1701:2:1928 -1702:0:1982 -1703:1:282 -1704:0:1982 -1705:2:1927 -1706:0:1982 -1707:1:291 -1708:0:1982 -1709:2:1928 -1710:0:1982 -1711:1:293 -1712:0:1982 -1713:2:1927 -1714:0:1982 -1715:1:296 -1716:0:1982 -1717:2:1928 -1718:0:1982 -1719:1:301 -1720:0:1982 -1721:2:1927 -1722:0:1982 -1723:1:302 -1724:0:1980 -1725:2:1928 -1726:0:1986 -1727:2:1429 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.define b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.log b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.log deleted file mode 100644 index abf7b83..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.log +++ /dev/null @@ -1,294 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_no_wmb.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -pan: claim violated! (at depth 1614) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 2823, errors: 1 - 81228 states, stored - 752552 states, matched - 833780 transitions (= stored+matched) - 2934533 atomic steps -hash conflicts: 10835 (resolved) - -Stats on memory usage (in Megabytes): - 6.507 equivalent memory usage for states (stored*(State-vector + overhead)) - 5.330 actual memory usage for states (compression: 81.92%) - state-vector as stored = 41 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 471.037 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 151, "(1)" - line 418, "pan.___", state 181, "(1)" - line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 242, "(1)" - line 418, "pan.___", state 272, "(1)" - line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 331, "(1)" - line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 360, "(1)" - line 418, "pan.___", state 390, "(1)" - line 540, "pan.___", state 414, "-end-" - (18 of 414 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 20, "(1)" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 34, "(1)" - line 403, "pan.___", state 35, "(1)" - line 403, "pan.___", state 35, "(1)" - line 401, "pan.___", state 40, "((i<1))" - line 401, "pan.___", state 40, "((i>=1))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 59, "(1)" - line 409, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 60, "else" - line 409, "pan.___", state 63, "(1)" - line 409, "pan.___", state 64, "(1)" - line 409, "pan.___", state 64, "(1)" - line 413, "pan.___", state 72, "(1)" - line 413, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 73, "else" - line 413, "pan.___", state 76, "(1)" - line 413, "pan.___", state 77, "(1)" - line 413, "pan.___", state 77, "(1)" - line 411, "pan.___", state 82, "((i<1))" - line 411, "pan.___", state 82, "((i>=1))" - line 418, "pan.___", state 89, "(1)" - line 418, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 90, "else" - line 418, "pan.___", state 93, "(1)" - line 418, "pan.___", state 94, "(1)" - line 418, "pan.___", state 94, "(1)" - line 420, "pan.___", state 97, "(1)" - line 420, "pan.___", state 97, "(1)" - line 369, "pan.___", state 99, "(1)" - line 639, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" - line 637, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 114, "(1)" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 128, "(1)" - line 403, "pan.___", state 129, "(1)" - line 403, "pan.___", state 129, "(1)" - line 401, "pan.___", state 134, "((i<1))" - line 401, "pan.___", state 134, "((i>=1))" - line 409, "pan.___", state 153, "(1)" - line 409, "pan.___", state 154, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 154, "else" - line 409, "pan.___", state 157, "(1)" - line 409, "pan.___", state 158, "(1)" - line 409, "pan.___", state 158, "(1)" - line 413, "pan.___", state 166, "(1)" - line 413, "pan.___", state 167, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 167, "else" - line 413, "pan.___", state 170, "(1)" - line 413, "pan.___", state 171, "(1)" - line 413, "pan.___", state 171, "(1)" - line 411, "pan.___", state 176, "((i<1))" - line 411, "pan.___", state 176, "((i>=1))" - line 418, "pan.___", state 183, "(1)" - line 418, "pan.___", state 184, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 184, "else" - line 418, "pan.___", state 187, "(1)" - line 418, "pan.___", state 188, "(1)" - line 418, "pan.___", state 188, "(1)" - line 420, "pan.___", state 191, "(1)" - line 420, "pan.___", state 191, "(1)" - line 369, "pan.___", state 193, "(1)" - line 652, "pan.___", state 199, "(1)" - line 646, "pan.___", state 202, "((write_lock==0))" - line 646, "pan.___", state 202, "else" - line 644, "pan.___", state 203, "(1)" - line 160, "pan.___", state 209, "(1)" - line 164, "pan.___", state 217, "(1)" - line 164, "pan.___", state 218, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 164, "pan.___", state 218, "else" - line 162, "pan.___", state 223, "((j<1))" - line 162, "pan.___", state 223, "((j>=1))" - line 168, "pan.___", state 229, "(1)" - line 168, "pan.___", state 230, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 168, "pan.___", state 230, "else" - line 160, "pan.___", state 241, "(1)" - line 168, "pan.___", state 261, "(1)" - line 160, "pan.___", state 277, "(1)" - line 164, "pan.___", state 285, "(1)" - line 168, "pan.___", state 297, "(1)" - line 399, "pan.___", state 311, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 325, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 343, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 356, "(1)" - line 413, "pan.___", state 369, "(1)" - line 418, "pan.___", state 386, "(1)" - line 399, "pan.___", state 405, "(1)" - line 403, "pan.___", state 417, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 435, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 461, "(1)" - line 418, "pan.___", state 478, "(1)" - line 403, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 554, "(1)" - line 418, "pan.___", state 571, "(1)" - line 164, "pan.___", state 594, "(1)" - line 168, "pan.___", state 606, "(1)" - line 160, "pan.___", state 618, "(1)" - line 168, "pan.___", state 638, "(1)" - line 164, "pan.___", state 662, "(1)" - line 168, "pan.___", state 674, "(1)" - line 399, "pan.___", state 696, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 698, "(1)" - line 399, "pan.___", state 699, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 399, "pan.___", state 699, "else" - line 399, "pan.___", state 702, "(1)" - line 403, "pan.___", state 710, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 712, "(1)" - line 403, "pan.___", state 713, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 403, "pan.___", state 713, "else" - line 403, "pan.___", state 716, "(1)" - line 403, "pan.___", state 717, "(1)" - line 403, "pan.___", state 717, "(1)" - line 401, "pan.___", state 722, "((i<1))" - line 401, "pan.___", state 722, "((i>=1))" - line 408, "pan.___", state 728, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 741, "(1)" - line 409, "pan.___", state 742, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 742, "else" - line 409, "pan.___", state 745, "(1)" - line 409, "pan.___", state 746, "(1)" - line 409, "pan.___", state 746, "(1)" - line 413, "pan.___", state 754, "(1)" - line 413, "pan.___", state 755, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 755, "else" - line 413, "pan.___", state 758, "(1)" - line 413, "pan.___", state 759, "(1)" - line 413, "pan.___", state 759, "(1)" - line 411, "pan.___", state 764, "((i<1))" - line 411, "pan.___", state 764, "((i>=1))" - line 418, "pan.___", state 771, "(1)" - line 418, "pan.___", state 772, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 772, "else" - line 418, "pan.___", state 775, "(1)" - line 418, "pan.___", state 776, "(1)" - line 418, "pan.___", state 776, "(1)" - line 420, "pan.___", state 779, "(1)" - line 420, "pan.___", state 779, "(1)" - line 403, "pan.___", state 810, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 828, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 854, "(1)" - line 418, "pan.___", state 871, "(1)" - line 403, "pan.___", state 900, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 918, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 944, "(1)" - line 418, "pan.___", state 961, "(1)" - line 399, "pan.___", state 980, "(1)" - line 403, "pan.___", state 992, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1010, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1036, "(1)" - line 418, "pan.___", state 1053, "(1)" - line 403, "pan.___", state 1085, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1103, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1129, "(1)" - line 418, "pan.___", state 1146, "(1)" - line 164, "pan.___", state 1169, "(1)" - line 168, "pan.___", state 1181, "(1)" - line 160, "pan.___", state 1193, "(1)" - line 168, "pan.___", state 1213, "(1)" - line 164, "pan.___", state 1237, "(1)" - line 168, "pan.___", state 1249, "(1)" - line 399, "pan.___", state 1271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 399, "pan.___", state 1273, "(1)" - line 399, "pan.___", state 1274, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 399, "pan.___", state 1274, "else" - line 399, "pan.___", state 1277, "(1)" - line 403, "pan.___", state 1285, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 1287, "(1)" - line 403, "pan.___", state 1288, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 403, "pan.___", state 1288, "else" - line 403, "pan.___", state 1291, "(1)" - line 403, "pan.___", state 1292, "(1)" - line 403, "pan.___", state 1292, "(1)" - line 401, "pan.___", state 1297, "((i<1))" - line 401, "pan.___", state 1297, "((i>=1))" - line 408, "pan.___", state 1303, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1316, "(1)" - line 409, "pan.___", state 1317, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 1317, "else" - line 409, "pan.___", state 1320, "(1)" - line 409, "pan.___", state 1321, "(1)" - line 409, "pan.___", state 1321, "(1)" - line 413, "pan.___", state 1329, "(1)" - line 413, "pan.___", state 1330, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 1330, "else" - line 413, "pan.___", state 1333, "(1)" - line 413, "pan.___", state 1334, "(1)" - line 413, "pan.___", state 1334, "(1)" - line 411, "pan.___", state 1339, "((i<1))" - line 411, "pan.___", state 1339, "((i>=1))" - line 418, "pan.___", state 1346, "(1)" - line 418, "pan.___", state 1347, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 1347, "else" - line 418, "pan.___", state 1350, "(1)" - line 418, "pan.___", state 1351, "(1)" - line 418, "pan.___", state 1351, "(1)" - line 420, "pan.___", state 1354, "(1)" - line 420, "pan.___", state 1354, "(1)" - line 164, "pan.___", state 1379, "(1)" - line 168, "pan.___", state 1391, "(1)" - line 160, "pan.___", state 1403, "(1)" - line 168, "pan.___", state 1423, "(1)" - line 164, "pan.___", state 1447, "(1)" - line 168, "pan.___", state 1459, "(1)" - line 702, "pan.___", state 1484, "-end-" - (160 of 1484 states) -unreached in proctype :init: - line 709, "pan.___", state 9, "((j<2))" - line 709, "pan.___", state 9, "((j>=2))" - line 710, "pan.___", state 20, "((j<2))" - line 710, "pan.___", state 20, "((j>=2))" - line 715, "pan.___", state 33, "((j<2))" - line 715, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 749, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 0.66 seconds -pan: rate 123072.73 states/second -pan: avg transition delay 7.9158e-07 usec -cp .input.spin urcu_free_no_wmb.spin.input -cp .input.spin.trail urcu_free_no_wmb.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.spin.input b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.spin.input deleted file mode 100644 index df3cc4b..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define NO_WMB - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.spin.input.trail deleted file mode 100644 index fe987f0..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_no_wmb.spin.input.trail +++ /dev/null @@ -1,1617 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:1946 -2:3:1898 -3:3:1901 -4:3:1901 -5:3:1904 -6:3:1912 -7:3:1912 -8:3:1915 -9:3:1921 -10:3:1925 -11:3:1925 -12:3:1928 -13:3:1936 -14:3:1940 -15:3:1941 -16:0:1946 -17:3:1943 -18:0:1946 -19:2:416 -20:0:1946 -21:2:422 -22:0:1946 -23:2:423 -24:0:1946 -25:2:424 -26:2:428 -27:2:429 -28:2:437 -29:2:438 -30:2:442 -31:2:443 -32:2:451 -33:2:456 -34:2:460 -35:2:461 -36:2:468 -37:2:469 -38:2:480 -39:2:481 -40:2:482 -41:2:493 -42:2:498 -43:2:499 -44:0:1946 -45:2:511 -46:0:1946 -47:2:513 -48:2:514 -49:0:1946 -50:2:518 -51:2:522 -52:2:523 -53:2:531 -54:2:532 -55:2:536 -56:2:537 -57:2:545 -58:2:550 -59:2:551 -60:2:562 -61:2:563 -62:2:574 -63:2:575 -64:2:576 -65:2:587 -66:2:592 -67:2:593 -68:0:1946 -69:2:605 -70:0:1946 -71:2:607 -72:0:1946 -73:2:608 -74:0:1946 -75:2:618 -76:0:1946 -77:2:619 -78:2:626 -79:2:627 -80:2:634 -81:2:639 -82:0:1946 -83:2:650 -84:0:1946 -85:2:651 -86:2:658 -87:2:659 -88:2:666 -89:2:671 -90:0:1946 -91:2:682 -92:0:1946 -93:2:687 -94:2:694 -95:2:695 -96:2:702 -97:2:707 -98:0:1946 -99:2:718 -100:0:1946 -101:2:720 -102:0:1946 -103:2:721 -104:2:725 -105:2:726 -106:2:734 -107:2:735 -108:2:739 -109:2:740 -110:2:748 -111:2:753 -112:2:757 -113:2:758 -114:2:765 -115:2:766 -116:2:777 -117:2:778 -118:2:779 -119:2:790 -120:2:795 -121:2:796 -122:0:1946 -123:2:808 -124:0:1946 -125:2:810 -126:0:1946 -127:2:813 -128:2:814 -129:2:826 -130:2:827 -131:2:831 -132:2:832 -133:2:840 -134:2:845 -135:2:849 -136:2:850 -137:2:857 -138:2:858 -139:2:869 -140:2:870 -141:2:871 -142:2:882 -143:2:887 -144:2:888 -145:0:1946 -146:2:900 -147:0:1946 -148:2:902 -149:0:1946 -150:2:903 -151:0:1946 -152:2:904 -153:0:1946 -154:2:905 -155:0:1946 -156:2:906 -157:2:910 -158:2:911 -159:2:919 -160:2:920 -161:2:924 -162:2:925 -163:2:933 -164:2:938 -165:2:942 -166:2:943 -167:2:950 -168:2:951 -169:2:962 -170:2:963 -171:2:964 -172:2:975 -173:2:980 -174:2:981 -175:0:1946 -176:2:993 -177:0:1946 -178:2:1097 -179:0:1946 -180:2:1195 -181:0:1946 -182:2:1196 -183:0:1946 -184:2:1200 -185:0:1946 -186:2:1206 -187:2:1210 -188:2:1211 -189:2:1219 -190:2:1220 -191:2:1224 -192:2:1225 -193:2:1233 -194:2:1238 -195:2:1242 -196:2:1243 -197:2:1250 -198:2:1251 -199:2:1262 -200:2:1263 -201:2:1264 -202:2:1275 -203:2:1280 -204:2:1281 -205:0:1946 -206:2:1293 -207:0:1946 -208:2:1295 -209:0:1946 -210:2:1296 -211:2:1300 -212:2:1301 -213:2:1309 -214:2:1310 -215:2:1314 -216:2:1315 -217:2:1323 -218:2:1328 -219:2:1332 -220:2:1333 -221:2:1340 -222:2:1341 -223:2:1352 -224:2:1353 -225:2:1354 -226:2:1365 -227:2:1370 -228:2:1371 -229:0:1946 -230:2:1383 -231:0:1946 -232:2:1385 -233:0:1946 -234:2:1388 -235:2:1389 -236:2:1401 -237:2:1402 -238:2:1406 -239:2:1407 -240:2:1415 -241:2:1420 -242:2:1424 -243:2:1425 -244:2:1432 -245:2:1433 -246:2:1444 -247:2:1445 -248:2:1446 -249:2:1457 -250:2:1462 -251:2:1463 -252:0:1946 -253:2:1475 -254:0:1946 -255:2:1477 -256:0:1946 -257:2:1478 -258:0:1946 -259:2:1479 -260:0:1946 -261:2:1480 -262:0:1946 -263:2:1481 -264:2:1485 -265:2:1486 -266:2:1494 -267:2:1495 -268:2:1499 -269:2:1500 -270:2:1508 -271:2:1513 -272:2:1517 -273:2:1518 -274:2:1525 -275:2:1526 -276:2:1537 -277:2:1538 -278:2:1539 -279:2:1550 -280:2:1555 -281:2:1556 -282:0:1946 -283:2:1568 -284:0:1946 -285:2:1672 -286:0:1946 -287:2:1770 -288:0:1946 -289:2:1771 -290:0:1946 -291:2:1775 -292:0:1946 -293:2:1781 -294:2:1788 -295:2:1789 -296:2:1796 -297:2:1801 -298:0:1946 -299:2:1812 -300:0:1946 -301:2:1813 -302:2:1820 -303:2:1821 -304:2:1828 -305:2:1833 -306:0:1946 -307:2:1844 -308:0:1946 -309:2:1849 -310:2:1856 -311:2:1857 -312:2:1864 -313:2:1869 -314:0:1946 -315:2:1880 -316:0:1946 -317:2:1882 -318:0:1946 -319:2:1883 -320:0:1946 -321:2:423 -322:0:1946 -323:2:424 -324:2:428 -325:2:429 -326:2:437 -327:2:438 -328:2:442 -329:2:443 -330:2:451 -331:2:456 -332:2:460 -333:2:461 -334:2:468 -335:2:469 -336:2:480 -337:2:481 -338:2:482 -339:2:493 -340:2:498 -341:2:499 -342:0:1946 -343:2:511 -344:0:1946 -345:2:513 -346:2:514 -347:0:1946 -348:2:518 -349:2:522 -350:2:523 -351:2:531 -352:2:532 -353:2:536 -354:2:537 -355:2:545 -356:2:550 -357:2:551 -358:2:562 -359:2:563 -360:2:574 -361:2:575 -362:2:576 -363:2:587 -364:2:592 -365:2:593 -366:0:1946 -367:2:605 -368:0:1946 -369:2:607 -370:0:1946 -371:2:608 -372:0:1946 -373:2:618 -374:0:1946 -375:2:619 -376:2:626 -377:2:627 -378:2:634 -379:2:639 -380:0:1946 -381:2:650 -382:0:1946 -383:2:651 -384:2:658 -385:2:659 -386:2:666 -387:2:671 -388:0:1946 -389:2:682 -390:0:1946 -391:2:687 -392:2:694 -393:2:695 -394:2:702 -395:2:707 -396:0:1946 -397:2:718 -398:0:1946 -399:2:720 -400:0:1946 -401:2:721 -402:2:725 -403:2:726 -404:2:734 -405:2:735 -406:2:739 -407:2:740 -408:2:748 -409:2:753 -410:2:757 -411:2:758 -412:2:765 -413:2:766 -414:2:777 -415:2:778 -416:2:779 -417:2:790 -418:2:795 -419:2:796 -420:0:1946 -421:2:808 -422:0:1946 -423:2:810 -424:0:1946 -425:2:813 -426:2:814 -427:2:826 -428:2:827 -429:2:831 -430:2:832 -431:2:840 -432:2:845 -433:2:849 -434:2:850 -435:2:857 -436:2:858 -437:2:869 -438:2:870 -439:2:871 -440:2:882 -441:2:887 -442:2:888 -443:0:1946 -444:2:900 -445:0:1946 -446:2:902 -447:0:1946 -448:2:903 -449:0:1946 -450:2:904 -451:0:1946 -452:2:905 -453:0:1946 -454:2:906 -455:2:910 -456:2:911 -457:2:919 -458:2:920 -459:2:924 -460:2:925 -461:2:933 -462:2:938 -463:2:942 -464:2:943 -465:2:950 -466:2:951 -467:2:962 -468:2:963 -469:2:964 -470:2:975 -471:2:980 -472:2:981 -473:0:1946 -474:2:993 -475:0:1946 -476:2:1097 -477:0:1946 -478:2:1195 -479:0:1946 -480:2:1196 -481:0:1946 -482:2:1200 -483:0:1946 -484:2:1206 -485:2:1210 -486:2:1211 -487:2:1219 -488:2:1220 -489:2:1224 -490:2:1225 -491:2:1233 -492:2:1238 -493:2:1242 -494:2:1243 -495:2:1250 -496:2:1251 -497:2:1262 -498:2:1263 -499:2:1264 -500:2:1275 -501:2:1280 -502:2:1281 -503:0:1946 -504:2:1293 -505:0:1946 -506:2:1295 -507:0:1946 -508:2:1296 -509:2:1300 -510:2:1301 -511:2:1309 -512:2:1310 -513:2:1314 -514:2:1315 -515:2:1323 -516:2:1328 -517:2:1332 -518:2:1333 -519:2:1340 -520:2:1341 -521:2:1352 -522:2:1353 -523:2:1354 -524:2:1365 -525:2:1370 -526:2:1371 -527:0:1946 -528:2:1383 -529:0:1946 -530:2:1385 -531:0:1946 -532:2:1388 -533:2:1389 -534:2:1401 -535:2:1402 -536:2:1406 -537:2:1407 -538:2:1415 -539:2:1420 -540:2:1424 -541:2:1425 -542:2:1432 -543:2:1433 -544:2:1444 -545:2:1445 -546:2:1446 -547:2:1457 -548:2:1462 -549:2:1463 -550:0:1946 -551:2:1475 -552:0:1946 -553:2:1477 -554:0:1946 -555:2:1478 -556:0:1946 -557:2:1479 -558:0:1946 -559:2:1480 -560:0:1946 -561:2:1481 -562:2:1485 -563:2:1486 -564:2:1494 -565:2:1495 -566:2:1499 -567:2:1500 -568:2:1508 -569:2:1513 -570:2:1517 -571:2:1518 -572:2:1525 -573:2:1526 -574:2:1537 -575:2:1538 -576:2:1539 -577:2:1550 -578:2:1555 -579:2:1556 -580:0:1946 -581:2:1568 -582:0:1946 -583:2:1672 -584:0:1946 -585:2:1770 -586:0:1946 -587:2:1771 -588:0:1946 -589:2:1775 -590:0:1946 -591:2:1781 -592:2:1788 -593:2:1789 -594:2:1796 -595:2:1801 -596:0:1946 -597:2:1812 -598:0:1946 -599:2:1813 -600:2:1820 -601:2:1821 -602:2:1828 -603:2:1833 -604:0:1946 -605:2:1844 -606:0:1946 -607:2:1849 -608:2:1856 -609:2:1857 -610:2:1864 -611:2:1869 -612:0:1946 -613:2:1880 -614:0:1946 -615:2:1882 -616:0:1946 -617:2:1883 -618:0:1946 -619:2:423 -620:0:1946 -621:2:424 -622:2:428 -623:2:429 -624:2:437 -625:2:438 -626:2:442 -627:2:443 -628:2:451 -629:2:456 -630:2:460 -631:2:461 -632:2:468 -633:2:469 -634:2:480 -635:2:481 -636:2:482 -637:2:493 -638:2:498 -639:2:499 -640:0:1946 -641:2:511 -642:0:1946 -643:2:513 -644:2:514 -645:0:1946 -646:2:518 -647:2:522 -648:2:523 -649:2:531 -650:2:532 -651:2:536 -652:2:537 -653:2:545 -654:2:550 -655:2:551 -656:2:562 -657:2:563 -658:2:574 -659:2:575 -660:2:576 -661:2:587 -662:2:592 -663:2:593 -664:0:1946 -665:2:605 -666:0:1946 -667:2:607 -668:0:1946 -669:2:608 -670:0:1946 -671:2:618 -672:0:1946 -673:2:619 -674:2:626 -675:2:627 -676:2:634 -677:2:639 -678:0:1946 -679:2:650 -680:0:1946 -681:2:651 -682:2:658 -683:2:659 -684:2:666 -685:2:671 -686:0:1946 -687:2:682 -688:0:1946 -689:2:687 -690:2:694 -691:2:695 -692:2:702 -693:2:707 -694:0:1946 -695:2:718 -696:0:1946 -697:2:720 -698:0:1946 -699:2:721 -700:2:725 -701:2:726 -702:2:734 -703:2:735 -704:2:739 -705:2:740 -706:2:748 -707:2:753 -708:2:757 -709:2:758 -710:2:765 -711:2:766 -712:2:777 -713:2:778 -714:2:779 -715:2:790 -716:2:795 -717:2:796 -718:0:1946 -719:2:808 -720:0:1946 -721:2:810 -722:0:1946 -723:2:813 -724:2:814 -725:2:826 -726:2:827 -727:2:831 -728:2:832 -729:2:840 -730:2:845 -731:2:849 -732:2:850 -733:2:857 -734:2:858 -735:2:869 -736:2:870 -737:2:871 -738:2:882 -739:2:887 -740:2:888 -741:0:1946 -742:2:900 -743:0:1946 -744:2:902 -745:0:1946 -746:2:903 -747:0:1946 -748:2:904 -749:0:1946 -750:2:905 -751:0:1946 -752:2:906 -753:2:910 -754:2:911 -755:2:919 -756:2:920 -757:2:924 -758:2:925 -759:2:933 -760:2:938 -761:2:942 -762:2:943 -763:2:950 -764:2:951 -765:2:962 -766:2:963 -767:2:964 -768:2:975 -769:2:980 -770:2:981 -771:0:1946 -772:2:993 -773:0:1946 -774:2:1097 -775:0:1946 -776:2:1195 -777:0:1946 -778:2:1196 -779:0:1946 -780:2:1200 -781:0:1946 -782:2:1206 -783:2:1210 -784:2:1211 -785:2:1219 -786:2:1220 -787:2:1224 -788:2:1225 -789:2:1233 -790:2:1238 -791:2:1242 -792:2:1243 -793:2:1250 -794:2:1251 -795:2:1262 -796:2:1263 -797:2:1264 -798:2:1275 -799:2:1280 -800:2:1281 -801:0:1946 -802:2:1293 -803:0:1946 -804:2:1295 -805:0:1946 -806:2:1296 -807:2:1300 -808:2:1301 -809:2:1309 -810:2:1310 -811:2:1314 -812:2:1315 -813:2:1323 -814:2:1328 -815:2:1332 -816:2:1333 -817:2:1340 -818:2:1341 -819:2:1352 -820:2:1353 -821:2:1354 -822:2:1365 -823:2:1370 -824:2:1371 -825:0:1946 -826:2:1383 -827:0:1946 -828:2:1385 -829:0:1946 -830:2:1388 -831:2:1389 -832:2:1401 -833:2:1402 -834:2:1406 -835:2:1407 -836:2:1415 -837:2:1420 -838:2:1424 -839:2:1425 -840:2:1432 -841:2:1433 -842:2:1444 -843:2:1445 -844:2:1446 -845:2:1457 -846:2:1462 -847:2:1463 -848:0:1946 -849:2:1475 -850:0:1946 -851:2:1477 -852:0:1946 -853:2:1478 -854:0:1946 -855:2:1479 -856:0:1946 -857:2:1480 -858:0:1946 -859:2:1481 -860:2:1485 -861:2:1486 -862:2:1494 -863:2:1495 -864:2:1499 -865:2:1500 -866:2:1508 -867:2:1513 -868:2:1517 -869:2:1518 -870:2:1525 -871:2:1526 -872:2:1537 -873:2:1538 -874:2:1539 -875:2:1550 -876:2:1555 -877:2:1556 -878:0:1946 -879:2:1568 -880:0:1946 -881:2:1672 -882:0:1946 -883:2:1770 -884:0:1946 -885:2:1771 -886:0:1946 -887:2:1775 -888:0:1946 -889:2:1781 -890:2:1788 -891:2:1789 -892:2:1796 -893:2:1801 -894:0:1946 -895:2:1812 -896:0:1946 -897:2:1813 -898:2:1820 -899:2:1821 -900:2:1828 -901:2:1833 -902:0:1946 -903:2:1844 -904:0:1946 -905:2:1849 -906:2:1856 -907:2:1857 -908:2:1864 -909:2:1869 -910:0:1946 -911:2:1880 -912:0:1946 -913:2:1882 -914:0:1946 -915:2:1883 -916:0:1946 -917:2:423 -918:0:1946 -919:2:424 -920:2:428 -921:2:429 -922:2:437 -923:2:438 -924:2:442 -925:2:443 -926:2:451 -927:2:456 -928:2:460 -929:2:461 -930:2:468 -931:2:469 -932:2:480 -933:2:481 -934:2:482 -935:2:493 -936:2:498 -937:2:499 -938:0:1946 -939:2:511 -940:0:1946 -941:2:513 -942:2:514 -943:0:1946 -944:2:518 -945:2:522 -946:2:523 -947:2:531 -948:2:532 -949:2:536 -950:2:537 -951:2:545 -952:2:550 -953:2:551 -954:2:562 -955:2:563 -956:2:574 -957:2:575 -958:2:576 -959:2:587 -960:2:592 -961:2:593 -962:0:1946 -963:2:605 -964:0:1946 -965:2:607 -966:0:1946 -967:2:608 -968:0:1946 -969:2:618 -970:0:1946 -971:2:619 -972:2:626 -973:2:627 -974:2:634 -975:2:639 -976:0:1946 -977:2:650 -978:0:1946 -979:2:651 -980:2:658 -981:2:659 -982:2:666 -983:2:671 -984:0:1946 -985:2:682 -986:0:1946 -987:2:687 -988:2:694 -989:2:695 -990:2:702 -991:2:707 -992:0:1946 -993:2:718 -994:0:1946 -995:2:720 -996:0:1946 -997:2:721 -998:2:725 -999:2:726 -1000:2:734 -1001:2:735 -1002:2:739 -1003:2:740 -1004:2:748 -1005:2:753 -1006:2:757 -1007:2:758 -1008:2:765 -1009:2:766 -1010:2:777 -1011:2:778 -1012:2:779 -1013:2:790 -1014:2:795 -1015:2:796 -1016:0:1946 -1017:2:808 -1018:0:1946 -1019:2:810 -1020:0:1946 -1021:2:813 -1022:2:814 -1023:2:826 -1024:2:827 -1025:2:831 -1026:2:832 -1027:2:840 -1028:2:845 -1029:2:849 -1030:2:850 -1031:2:857 -1032:2:858 -1033:2:869 -1034:2:870 -1035:2:871 -1036:2:882 -1037:2:887 -1038:2:888 -1039:0:1946 -1040:2:900 -1041:0:1946 -1042:2:902 -1043:0:1946 -1044:2:903 -1045:0:1946 -1046:2:904 -1047:0:1946 -1048:2:905 -1049:0:1946 -1050:2:906 -1051:2:910 -1052:2:911 -1053:2:919 -1054:2:920 -1055:2:924 -1056:2:925 -1057:2:933 -1058:2:938 -1059:2:942 -1060:2:943 -1061:2:950 -1062:2:951 -1063:2:962 -1064:2:963 -1065:2:964 -1066:2:975 -1067:2:980 -1068:2:981 -1069:0:1946 -1070:2:993 -1071:0:1946 -1072:2:1097 -1073:0:1946 -1074:2:1195 -1075:0:1946 -1076:2:1196 -1077:0:1946 -1078:2:1200 -1079:0:1946 -1080:2:1206 -1081:2:1210 -1082:2:1211 -1083:2:1219 -1084:2:1220 -1085:2:1224 -1086:2:1225 -1087:2:1233 -1088:2:1238 -1089:2:1242 -1090:2:1243 -1091:2:1250 -1092:2:1251 -1093:2:1262 -1094:2:1263 -1095:2:1264 -1096:2:1275 -1097:2:1280 -1098:2:1281 -1099:0:1946 -1100:2:1293 -1101:0:1946 -1102:2:1295 -1103:0:1946 -1104:2:1296 -1105:2:1300 -1106:2:1301 -1107:2:1309 -1108:2:1310 -1109:2:1314 -1110:2:1315 -1111:2:1323 -1112:2:1328 -1113:2:1332 -1114:2:1333 -1115:2:1340 -1116:2:1341 -1117:2:1352 -1118:2:1353 -1119:2:1354 -1120:2:1365 -1121:2:1370 -1122:2:1371 -1123:0:1946 -1124:2:1383 -1125:0:1946 -1126:2:1385 -1127:0:1946 -1128:2:1388 -1129:2:1389 -1130:2:1401 -1131:2:1402 -1132:2:1406 -1133:2:1407 -1134:2:1415 -1135:2:1420 -1136:2:1424 -1137:2:1425 -1138:2:1432 -1139:2:1433 -1140:2:1444 -1141:2:1445 -1142:2:1446 -1143:2:1457 -1144:2:1462 -1145:2:1463 -1146:0:1946 -1147:2:1475 -1148:0:1946 -1149:2:1477 -1150:0:1946 -1151:2:1478 -1152:0:1946 -1153:2:1479 -1154:0:1946 -1155:2:1480 -1156:0:1946 -1157:2:1481 -1158:2:1485 -1159:2:1486 -1160:2:1494 -1161:2:1495 -1162:2:1499 -1163:2:1500 -1164:2:1508 -1165:2:1513 -1166:2:1517 -1167:2:1518 -1168:2:1525 -1169:2:1526 -1170:2:1537 -1171:2:1538 -1172:2:1539 -1173:2:1550 -1174:2:1555 -1175:2:1556 -1176:0:1946 -1177:2:1568 -1178:0:1946 -1179:2:1672 -1180:0:1946 -1181:2:1770 -1182:0:1946 -1183:2:1771 -1184:0:1946 -1185:2:1775 -1186:0:1946 -1187:2:1781 -1188:2:1788 -1189:2:1789 -1190:2:1796 -1191:2:1801 -1192:0:1946 -1193:2:1812 -1194:0:1946 -1195:2:1813 -1196:2:1820 -1197:2:1821 -1198:2:1828 -1199:2:1833 -1200:0:1946 -1201:2:1844 -1202:0:1946 -1203:2:1849 -1204:2:1856 -1205:2:1857 -1206:2:1864 -1207:2:1869 -1208:0:1946 -1209:2:1880 -1210:0:1946 -1211:2:1882 -1212:0:1946 -1213:2:1883 -1214:0:1946 -1215:2:423 -1216:0:1946 -1217:2:424 -1218:2:428 -1219:2:429 -1220:2:437 -1221:2:438 -1222:2:442 -1223:2:443 -1224:2:451 -1225:2:456 -1226:2:460 -1227:2:461 -1228:2:468 -1229:2:469 -1230:2:480 -1231:2:481 -1232:2:482 -1233:2:493 -1234:2:498 -1235:2:499 -1236:0:1946 -1237:2:511 -1238:0:1946 -1239:2:513 -1240:2:514 -1241:0:1946 -1242:2:518 -1243:2:522 -1244:2:523 -1245:2:531 -1246:2:532 -1247:2:536 -1248:2:537 -1249:2:545 -1250:2:550 -1251:2:551 -1252:2:562 -1253:2:563 -1254:2:574 -1255:2:575 -1256:2:576 -1257:2:587 -1258:2:592 -1259:2:593 -1260:0:1946 -1261:2:605 -1262:0:1946 -1263:2:607 -1264:0:1946 -1265:2:608 -1266:0:1946 -1267:2:618 -1268:0:1946 -1269:2:619 -1270:2:626 -1271:2:627 -1272:2:634 -1273:2:639 -1274:0:1946 -1275:2:650 -1276:0:1946 -1277:1:2 -1278:0:1946 -1279:1:8 -1280:0:1946 -1281:1:9 -1282:0:1946 -1283:1:10 -1284:0:1946 -1285:1:11 -1286:0:1946 -1287:1:12 -1288:1:16 -1289:1:17 -1290:1:25 -1291:1:26 -1292:1:30 -1293:1:31 -1294:1:39 -1295:1:44 -1296:1:48 -1297:1:49 -1298:1:56 -1299:1:57 -1300:1:68 -1301:1:69 -1302:1:70 -1303:1:81 -1304:1:93 -1305:1:94 -1306:0:1946 -1307:1:99 -1308:0:1946 -1309:1:101 -1310:0:1946 -1311:1:102 -1312:1:106 -1313:1:107 -1314:1:115 -1315:1:116 -1316:1:120 -1317:1:121 -1318:1:129 -1319:1:134 -1320:1:138 -1321:1:139 -1322:1:146 -1323:1:147 -1324:1:158 -1325:1:159 -1326:1:160 -1327:1:171 -1328:1:183 -1329:1:184 -1330:0:1946 -1331:1:189 -1332:0:1946 -1333:1:191 -1334:0:1946 -1335:1:192 -1336:0:1946 -1337:1:193 -1338:1:197 -1339:1:198 -1340:1:206 -1341:1:207 -1342:1:211 -1343:1:212 -1344:1:220 -1345:1:225 -1346:1:229 -1347:1:230 -1348:1:237 -1349:1:238 -1350:1:249 -1351:1:250 -1352:1:251 -1353:1:262 -1354:1:274 -1355:1:275 -1356:0:1946 -1357:1:280 -1358:0:1946 -1359:1:282 -1360:0:1946 -1361:1:291 -1362:0:1946 -1363:1:293 -1364:0:1946 -1365:1:296 -1366:0:1946 -1367:1:301 -1368:0:1946 -1369:2:651 -1370:2:658 -1371:2:661 -1372:2:662 -1373:2:666 -1374:2:671 -1375:0:1946 -1376:2:682 -1377:0:1946 -1378:2:687 -1379:2:694 -1380:2:695 -1381:2:702 -1382:2:707 -1383:0:1946 -1384:2:718 -1385:0:1946 -1386:2:720 -1387:0:1946 -1388:2:721 -1389:2:725 -1390:2:726 -1391:2:734 -1392:2:735 -1393:2:739 -1394:2:740 -1395:2:748 -1396:2:753 -1397:2:757 -1398:2:758 -1399:2:765 -1400:2:766 -1401:2:777 -1402:2:778 -1403:2:779 -1404:2:790 -1405:2:795 -1406:2:796 -1407:0:1946 -1408:2:808 -1409:0:1946 -1410:2:810 -1411:0:1946 -1412:2:813 -1413:2:814 -1414:2:826 -1415:2:827 -1416:2:831 -1417:2:832 -1418:2:840 -1419:2:845 -1420:2:849 -1421:2:850 -1422:2:857 -1423:2:858 -1424:2:869 -1425:2:870 -1426:2:871 -1427:2:882 -1428:2:887 -1429:2:888 -1430:0:1946 -1431:2:900 -1432:0:1946 -1433:2:902 -1434:0:1946 -1435:2:903 -1436:0:1946 -1437:2:904 -1438:0:1946 -1439:2:905 -1440:0:1946 -1441:2:906 -1442:2:910 -1443:2:911 -1444:2:919 -1445:2:920 -1446:2:924 -1447:2:925 -1448:2:933 -1449:2:938 -1450:2:942 -1451:2:943 -1452:2:950 -1453:2:951 -1454:2:962 -1455:2:963 -1456:2:964 -1457:2:975 -1458:2:980 -1459:2:981 -1460:0:1946 -1461:2:993 -1462:0:1946 -1463:2:1097 -1464:0:1946 -1465:2:1195 -1466:0:1946 -1467:2:1196 -1468:0:1946 -1469:2:1200 -1470:0:1946 -1471:2:1206 -1472:2:1210 -1473:2:1211 -1474:2:1219 -1475:2:1220 -1476:2:1224 -1477:2:1225 -1478:2:1233 -1479:2:1238 -1480:2:1242 -1481:2:1243 -1482:2:1250 -1483:2:1251 -1484:2:1262 -1485:2:1263 -1486:2:1264 -1487:2:1275 -1488:2:1280 -1489:2:1281 -1490:0:1946 -1491:2:1293 -1492:0:1946 -1493:2:1295 -1494:0:1946 -1495:2:1296 -1496:2:1300 -1497:2:1301 -1498:2:1309 -1499:2:1310 -1500:2:1314 -1501:2:1315 -1502:2:1323 -1503:2:1328 -1504:2:1332 -1505:2:1333 -1506:2:1340 -1507:2:1341 -1508:2:1352 -1509:2:1353 -1510:2:1354 -1511:2:1365 -1512:2:1370 -1513:2:1371 -1514:0:1946 -1515:2:1383 -1516:0:1946 -1517:2:1385 -1518:0:1946 -1519:2:1388 -1520:2:1389 -1521:2:1401 -1522:2:1402 -1523:2:1406 -1524:2:1407 -1525:2:1415 -1526:2:1420 -1527:2:1424 -1528:2:1425 -1529:2:1432 -1530:2:1433 -1531:2:1444 -1532:2:1445 -1533:2:1446 -1534:2:1457 -1535:2:1462 -1536:2:1463 -1537:0:1946 -1538:2:1475 -1539:0:1946 -1540:2:1477 -1541:0:1946 -1542:2:1478 -1543:0:1946 -1544:2:1479 -1545:0:1946 -1546:2:1480 -1547:0:1946 -1548:2:1481 -1549:2:1485 -1550:2:1486 -1551:2:1494 -1552:2:1495 -1553:2:1499 -1554:2:1500 -1555:2:1508 -1556:2:1513 -1557:2:1517 -1558:2:1518 -1559:2:1525 -1560:2:1526 -1561:2:1537 -1562:2:1538 -1563:2:1539 -1564:2:1550 -1565:2:1555 -1566:2:1556 -1567:0:1946 -1568:2:1568 -1569:0:1946 -1570:2:1672 -1571:0:1946 -1572:2:1770 -1573:0:1946 -1574:2:1771 -1575:0:1946 -1576:2:1775 -1577:0:1946 -1578:2:1781 -1579:2:1788 -1580:2:1789 -1581:2:1796 -1582:2:1801 -1583:0:1946 -1584:2:1812 -1585:0:1946 -1586:2:1813 -1587:2:1820 -1588:2:1823 -1589:2:1824 -1590:2:1828 -1591:2:1833 -1592:0:1946 -1593:2:1844 -1594:0:1946 -1595:2:1849 -1596:2:1856 -1597:2:1857 -1598:2:1864 -1599:2:1869 -1600:0:1946 -1601:2:1880 -1602:0:1946 -1603:2:1882 -1604:0:1946 -1605:2:1883 -1606:0:1946 -1607:2:1886 -1608:0:1946 -1609:2:1891 -1610:0:1946 -1611:1:302 -1612:0:1944 -1613:2:1892 -1614:0:1950 -1615:1:244 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.define b/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.log b/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.log deleted file mode 100644 index 16843a5..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.log +++ /dev/null @@ -1,197 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define >> pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_free.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_free_single_flip.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -pan: claim violated! (at depth 1316) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness disabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 2045, errors: 1 - 52434 states, stored - 479392 states, matched - 531826 transitions (= stored+matched) - 1926196 atomic steps -hash conflicts: 6594 (resolved) - -Stats on memory usage (in Megabytes): - 4.200 equivalent memory usage for states (stored*(State-vector + overhead)) - 3.608 actual memory usage for states (compression: 85.89%) - state-vector as stored = 44 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 469.279 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 151, "(1)" - line 418, "pan.___", state 181, "(1)" - line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 242, "(1)" - line 418, "pan.___", state 272, "(1)" - line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 360, "(1)" - line 418, "pan.___", state 390, "(1)" - line 540, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 59, "(1)" - line 413, "pan.___", state 72, "(1)" - line 418, "pan.___", state 89, "(1)" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 240, "(1)" - line 164, "pan.___", state 248, "(1)" - line 168, "pan.___", state 260, "(1)" - line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 927, "(1)" - line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 928, "else" - line 409, "pan.___", state 931, "(1)" - line 409, "pan.___", state 932, "(1)" - line 409, "pan.___", state 932, "(1)" - line 413, "pan.___", state 940, "(1)" - line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 941, "else" - line 413, "pan.___", state 944, "(1)" - line 413, "pan.___", state 945, "(1)" - line 413, "pan.___", state 945, "(1)" - line 411, "pan.___", state 950, "((i<1))" - line 411, "pan.___", state 950, "((i>=1))" - line 418, "pan.___", state 957, "(1)" - line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 958, "else" - line 418, "pan.___", state 961, "(1)" - line 418, "pan.___", state 962, "(1)" - line 418, "pan.___", state 962, "(1)" - line 420, "pan.___", state 965, "(1)" - line 420, "pan.___", state 965, "(1)" - line 179, "pan.___", state 990, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1003, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 1013, "(1)" - line 164, "pan.___", state 1021, "(1)" - line 168, "pan.___", state 1033, "(1)" - line 175, "pan.___", state 1044, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=2))" - line 710, "pan.___", state 20, "((j<2))" - line 710, "pan.___", state 20, "((j>=2))" - line 715, "pan.___", state 33, "((j<2))" - line 715, "pan.___", state 33, "((j>=2))" - (3 of 46 states) -unreached in proctype :never: - line 749, "pan.___", state 8, "-end-" - (1 of 8 states) - -pan: elapsed time 0.43 seconds -pan: rate 121939.53 states/second -pan: avg transition delay 8.0854e-07 usec -cp .input.spin urcu_free_single_flip.spin.input -cp .input.spin.trail urcu_free_single_flip.spin.input.trail -make[1]: Leaving directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.spin.input b/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.spin.input deleted file mode 100644 index bb95a2d..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.spin.input +++ /dev/null @@ -1,723 +0,0 @@ -#define SINGLE_FLIP - -#define read_free_race (read_generation[0] == last_free_gen) -#define read_free (free_done && data_access[0]) - -//#define TEST_SIGNAL -//#define TEST_SIGNAL_ON_READ -//#define TEST_SIGNAL_ON_WRITE - -#define RCU_GP_CTR_BIT (1 << 7) -#define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) - -#ifndef READER_NEST_LEVEL -#define READER_NEST_LEVEL 1 -//#define READER_NEST_LEVEL 2 -#endif - -#define REMOTE_BARRIERS -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.spin.input.trail deleted file mode 100644 index a3f64a1..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_free_single_flip.spin.input.trail +++ /dev/null @@ -1,1319 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:1650 -2:3:1602 -3:3:1605 -4:3:1605 -5:3:1608 -6:3:1616 -7:3:1616 -8:3:1619 -9:3:1625 -10:3:1629 -11:3:1629 -12:3:1632 -13:3:1640 -14:3:1644 -15:3:1645 -16:0:1650 -17:3:1647 -18:0:1650 -19:2:416 -20:0:1650 -21:2:422 -22:0:1650 -23:2:423 -24:0:1650 -25:2:424 -26:2:428 -27:2:429 -28:2:437 -29:2:438 -30:2:442 -31:2:443 -32:2:451 -33:2:456 -34:2:460 -35:2:461 -36:2:468 -37:2:469 -38:2:480 -39:2:481 -40:2:482 -41:2:493 -42:2:498 -43:2:499 -44:0:1650 -45:2:511 -46:0:1650 -47:2:513 -48:2:514 -49:0:1650 -50:2:518 -51:2:522 -52:2:523 -53:2:531 -54:2:532 -55:2:536 -56:2:537 -57:2:545 -58:2:550 -59:2:551 -60:2:562 -61:2:563 -62:2:574 -63:2:575 -64:2:576 -65:2:587 -66:2:592 -67:2:593 -68:0:1650 -69:2:605 -70:0:1650 -71:2:607 -72:0:1650 -73:2:608 -74:0:1650 -75:2:618 -76:0:1650 -77:2:622 -78:2:623 -79:2:627 -80:2:631 -81:2:632 -82:2:636 -83:2:644 -84:2:645 -85:2:650 -86:2:657 -87:2:658 -88:2:665 -89:2:670 -90:0:1650 -91:2:681 -92:0:1650 -93:2:685 -94:2:686 -95:2:690 -96:2:694 -97:2:695 -98:2:699 -99:2:707 -100:2:708 -101:2:713 -102:2:720 -103:2:721 -104:2:728 -105:2:733 -106:0:1650 -107:2:744 -108:0:1650 -109:2:752 -110:2:753 -111:2:757 -112:2:761 -113:2:762 -114:2:766 -115:2:774 -116:2:775 -117:2:780 -118:2:787 -119:2:788 -120:2:795 -121:2:800 -122:0:1650 -123:2:811 -124:0:1650 -125:2:813 -126:0:1650 -127:2:814 -128:2:818 -129:2:819 -130:2:827 -131:2:828 -132:2:832 -133:2:833 -134:2:841 -135:2:846 -136:2:850 -137:2:851 -138:2:858 -139:2:859 -140:2:870 -141:2:871 -142:2:872 -143:2:883 -144:2:888 -145:2:889 -146:0:1650 -147:2:901 -148:0:1650 -149:2:903 -150:0:1650 -151:2:906 -152:2:907 -153:2:919 -154:2:920 -155:2:924 -156:2:925 -157:2:933 -158:2:938 -159:2:942 -160:2:943 -161:2:950 -162:2:951 -163:2:962 -164:2:963 -165:2:964 -166:2:975 -167:2:980 -168:2:981 -169:0:1650 -170:2:993 -171:0:1650 -172:2:995 -173:0:1650 -174:2:996 -175:0:1650 -176:2:997 -177:0:1650 -178:2:998 -179:0:1650 -180:2:999 -181:2:1003 -182:2:1004 -183:2:1012 -184:2:1013 -185:2:1017 -186:2:1018 -187:2:1026 -188:2:1031 -189:2:1035 -190:2:1036 -191:2:1043 -192:2:1044 -193:2:1055 -194:2:1056 -195:2:1057 -196:2:1068 -197:2:1073 -198:2:1074 -199:0:1650 -200:2:1086 -201:0:1650 -202:2:1283 -203:0:1650 -204:2:1381 -205:0:1650 -206:2:1382 -207:0:1650 -208:2:1386 -209:0:1650 -210:2:1395 -211:2:1396 -212:2:1400 -213:2:1404 -214:2:1405 -215:2:1409 -216:2:1417 -217:2:1418 -218:2:1423 -219:2:1430 -220:2:1431 -221:2:1438 -222:2:1443 -223:0:1650 -224:2:1454 -225:0:1650 -226:2:1458 -227:2:1459 -228:2:1463 -229:2:1467 -230:2:1468 -231:2:1472 -232:2:1480 -233:2:1481 -234:2:1486 -235:2:1493 -236:2:1494 -237:2:1501 -238:2:1506 -239:0:1650 -240:2:1517 -241:0:1650 -242:2:1525 -243:2:1526 -244:2:1530 -245:2:1534 -246:2:1535 -247:2:1539 -248:2:1547 -249:2:1548 -250:2:1553 -251:2:1560 -252:2:1561 -253:2:1568 -254:2:1573 -255:0:1650 -256:2:1584 -257:0:1650 -258:2:1586 -259:0:1650 -260:2:1587 -261:0:1650 -262:2:423 -263:0:1650 -264:2:424 -265:2:428 -266:2:429 -267:2:437 -268:2:438 -269:2:442 -270:2:443 -271:2:451 -272:2:456 -273:2:460 -274:2:461 -275:2:468 -276:2:469 -277:2:480 -278:2:481 -279:2:482 -280:2:493 -281:2:498 -282:2:499 -283:0:1650 -284:2:511 -285:0:1650 -286:2:513 -287:2:514 -288:0:1650 -289:2:518 -290:2:522 -291:2:523 -292:2:531 -293:2:532 -294:2:536 -295:2:537 -296:2:545 -297:2:550 -298:2:551 -299:2:562 -300:2:563 -301:2:574 -302:2:575 -303:2:576 -304:2:587 -305:2:592 -306:2:593 -307:0:1650 -308:2:605 -309:0:1650 -310:2:607 -311:0:1650 -312:2:608 -313:0:1650 -314:2:618 -315:0:1650 -316:2:622 -317:2:623 -318:2:627 -319:2:631 -320:2:632 -321:2:636 -322:2:644 -323:2:645 -324:2:650 -325:2:657 -326:2:658 -327:2:665 -328:2:670 -329:0:1650 -330:2:681 -331:0:1650 -332:2:685 -333:2:686 -334:2:690 -335:2:694 -336:2:695 -337:2:699 -338:2:707 -339:2:708 -340:2:713 -341:2:720 -342:2:721 -343:2:728 -344:2:733 -345:0:1650 -346:2:744 -347:0:1650 -348:2:752 -349:2:753 -350:2:757 -351:2:761 -352:2:762 -353:2:766 -354:2:774 -355:2:775 -356:2:780 -357:2:787 -358:2:788 -359:2:795 -360:2:800 -361:0:1650 -362:2:811 -363:0:1650 -364:2:813 -365:0:1650 -366:2:814 -367:2:818 -368:2:819 -369:2:827 -370:2:828 -371:2:832 -372:2:833 -373:2:841 -374:2:846 -375:2:850 -376:2:851 -377:2:858 -378:2:859 -379:2:870 -380:2:871 -381:2:872 -382:2:883 -383:2:888 -384:2:889 -385:0:1650 -386:2:901 -387:0:1650 -388:2:903 -389:0:1650 -390:2:906 -391:2:907 -392:2:919 -393:2:920 -394:2:924 -395:2:925 -396:2:933 -397:2:938 -398:2:942 -399:2:943 -400:2:950 -401:2:951 -402:2:962 -403:2:963 -404:2:964 -405:2:975 -406:2:980 -407:2:981 -408:0:1650 -409:2:993 -410:0:1650 -411:2:995 -412:0:1650 -413:2:996 -414:0:1650 -415:2:997 -416:0:1650 -417:2:998 -418:0:1650 -419:2:999 -420:2:1003 -421:2:1004 -422:2:1012 -423:2:1013 -424:2:1017 -425:2:1018 -426:2:1026 -427:2:1031 -428:2:1035 -429:2:1036 -430:2:1043 -431:2:1044 -432:2:1055 -433:2:1056 -434:2:1057 -435:2:1068 -436:2:1073 -437:2:1074 -438:0:1650 -439:2:1086 -440:0:1650 -441:2:1283 -442:0:1650 -443:2:1381 -444:0:1650 -445:2:1382 -446:0:1650 -447:2:1386 -448:0:1650 -449:2:1395 -450:2:1396 -451:2:1400 -452:2:1404 -453:2:1405 -454:2:1409 -455:2:1417 -456:2:1418 -457:2:1423 -458:2:1430 -459:2:1431 -460:2:1438 -461:2:1443 -462:0:1650 -463:2:1454 -464:0:1650 -465:2:1458 -466:2:1459 -467:2:1463 -468:2:1467 -469:2:1468 -470:2:1472 -471:2:1480 -472:2:1481 -473:2:1486 -474:2:1493 -475:2:1494 -476:2:1501 -477:2:1506 -478:0:1650 -479:2:1517 -480:0:1650 -481:2:1525 -482:2:1526 -483:2:1530 -484:2:1534 -485:2:1535 -486:2:1539 -487:2:1547 -488:2:1548 -489:2:1553 -490:2:1560 -491:2:1561 -492:2:1568 -493:2:1573 -494:0:1650 -495:2:1584 -496:0:1650 -497:2:1586 -498:0:1650 -499:2:1587 -500:0:1650 -501:2:423 -502:0:1650 -503:2:424 -504:2:428 -505:2:429 -506:2:437 -507:2:438 -508:2:442 -509:2:443 -510:2:451 -511:2:456 -512:2:460 -513:2:461 -514:2:468 -515:2:469 -516:2:480 -517:2:481 -518:2:482 -519:2:493 -520:2:498 -521:2:499 -522:0:1650 -523:2:511 -524:0:1650 -525:2:513 -526:2:514 -527:0:1650 -528:2:518 -529:2:522 -530:2:523 -531:2:531 -532:2:532 -533:2:536 -534:2:537 -535:2:545 -536:2:550 -537:2:551 -538:2:562 -539:2:563 -540:2:574 -541:2:575 -542:2:576 -543:2:587 -544:2:592 -545:2:593 -546:0:1650 -547:2:605 -548:0:1650 -549:2:607 -550:0:1650 -551:2:608 -552:0:1650 -553:2:618 -554:0:1650 -555:2:622 -556:2:623 -557:2:627 -558:2:631 -559:2:632 -560:2:636 -561:2:644 -562:2:645 -563:2:650 -564:2:657 -565:2:658 -566:2:665 -567:2:670 -568:0:1650 -569:2:681 -570:0:1650 -571:2:685 -572:2:686 -573:2:690 -574:2:694 -575:2:695 -576:2:699 -577:2:707 -578:2:708 -579:2:713 -580:2:720 -581:2:721 -582:2:728 -583:2:733 -584:0:1650 -585:2:744 -586:0:1650 -587:2:752 -588:2:753 -589:2:757 -590:2:761 -591:2:762 -592:2:766 -593:2:774 -594:2:775 -595:2:780 -596:2:787 -597:2:788 -598:2:795 -599:2:800 -600:0:1650 -601:2:811 -602:0:1650 -603:2:813 -604:0:1650 -605:2:814 -606:2:818 -607:2:819 -608:2:827 -609:2:828 -610:2:832 -611:2:833 -612:2:841 -613:2:846 -614:2:850 -615:2:851 -616:2:858 -617:2:859 -618:2:870 -619:2:871 -620:2:872 -621:2:883 -622:2:888 -623:2:889 -624:0:1650 -625:2:901 -626:0:1650 -627:2:903 -628:0:1650 -629:2:906 -630:2:907 -631:2:919 -632:2:920 -633:2:924 -634:2:925 -635:2:933 -636:2:938 -637:2:942 -638:2:943 -639:2:950 -640:2:951 -641:2:962 -642:2:963 -643:2:964 -644:2:975 -645:2:980 -646:2:981 -647:0:1650 -648:2:993 -649:0:1650 -650:2:995 -651:0:1650 -652:2:996 -653:0:1650 -654:2:997 -655:0:1650 -656:2:998 -657:0:1650 -658:2:999 -659:2:1003 -660:2:1004 -661:2:1012 -662:2:1013 -663:2:1017 -664:2:1018 -665:2:1026 -666:2:1031 -667:2:1035 -668:2:1036 -669:2:1043 -670:2:1044 -671:2:1055 -672:2:1056 -673:2:1057 -674:2:1068 -675:2:1073 -676:2:1074 -677:0:1650 -678:2:1086 -679:0:1650 -680:2:1283 -681:0:1650 -682:2:1381 -683:0:1650 -684:2:1382 -685:0:1650 -686:2:1386 -687:0:1650 -688:2:1395 -689:2:1396 -690:2:1400 -691:2:1404 -692:2:1405 -693:2:1409 -694:2:1417 -695:2:1418 -696:2:1423 -697:2:1430 -698:2:1431 -699:2:1438 -700:2:1443 -701:0:1650 -702:2:1454 -703:0:1650 -704:2:1458 -705:2:1459 -706:2:1463 -707:2:1467 -708:2:1468 -709:2:1472 -710:2:1480 -711:2:1481 -712:2:1486 -713:2:1493 -714:2:1494 -715:2:1501 -716:2:1506 -717:0:1650 -718:2:1517 -719:0:1650 -720:2:1525 -721:2:1526 -722:2:1530 -723:2:1534 -724:2:1535 -725:2:1539 -726:2:1547 -727:2:1548 -728:2:1553 -729:2:1560 -730:2:1561 -731:2:1568 -732:2:1573 -733:0:1650 -734:2:1584 -735:0:1650 -736:2:1586 -737:0:1650 -738:2:1587 -739:0:1650 -740:2:423 -741:0:1650 -742:2:424 -743:2:428 -744:2:429 -745:2:437 -746:2:438 -747:2:442 -748:2:443 -749:2:451 -750:2:456 -751:2:460 -752:2:461 -753:2:468 -754:2:469 -755:2:480 -756:2:481 -757:2:482 -758:2:493 -759:2:498 -760:2:499 -761:0:1650 -762:2:511 -763:0:1650 -764:2:513 -765:2:514 -766:0:1650 -767:2:518 -768:2:522 -769:2:523 -770:2:531 -771:2:532 -772:2:536 -773:2:537 -774:2:545 -775:2:550 -776:2:551 -777:2:562 -778:2:563 -779:2:574 -780:2:575 -781:2:576 -782:2:587 -783:2:592 -784:2:593 -785:0:1650 -786:2:605 -787:0:1650 -788:2:607 -789:0:1650 -790:2:608 -791:0:1650 -792:2:618 -793:0:1650 -794:2:622 -795:2:623 -796:2:627 -797:2:631 -798:2:632 -799:2:636 -800:2:644 -801:2:645 -802:2:650 -803:2:657 -804:2:658 -805:2:665 -806:2:670 -807:0:1650 -808:2:681 -809:0:1650 -810:2:685 -811:2:686 -812:2:690 -813:2:694 -814:2:695 -815:2:699 -816:2:707 -817:2:708 -818:2:713 -819:2:720 -820:2:721 -821:2:728 -822:2:733 -823:0:1650 -824:2:744 -825:0:1650 -826:2:752 -827:2:753 -828:2:757 -829:2:761 -830:2:762 -831:2:766 -832:2:774 -833:2:775 -834:2:780 -835:2:787 -836:2:788 -837:2:795 -838:2:800 -839:0:1650 -840:2:811 -841:0:1650 -842:2:813 -843:0:1650 -844:2:814 -845:2:818 -846:2:819 -847:2:827 -848:2:828 -849:2:832 -850:2:833 -851:2:841 -852:2:846 -853:2:850 -854:2:851 -855:2:858 -856:2:859 -857:2:870 -858:2:871 -859:2:872 -860:2:883 -861:2:888 -862:2:889 -863:0:1650 -864:2:901 -865:0:1650 -866:2:903 -867:0:1650 -868:2:906 -869:2:907 -870:2:919 -871:2:920 -872:2:924 -873:2:925 -874:2:933 -875:2:938 -876:2:942 -877:2:943 -878:2:950 -879:2:951 -880:2:962 -881:2:963 -882:2:964 -883:2:975 -884:2:980 -885:2:981 -886:0:1650 -887:2:993 -888:0:1650 -889:2:995 -890:0:1650 -891:2:996 -892:0:1650 -893:2:997 -894:0:1650 -895:2:998 -896:0:1650 -897:2:999 -898:2:1003 -899:2:1004 -900:2:1012 -901:2:1013 -902:2:1017 -903:2:1018 -904:2:1026 -905:2:1031 -906:2:1035 -907:2:1036 -908:2:1043 -909:2:1044 -910:2:1055 -911:2:1056 -912:2:1057 -913:2:1068 -914:2:1073 -915:2:1074 -916:0:1650 -917:2:1086 -918:0:1650 -919:2:1283 -920:0:1650 -921:2:1381 -922:0:1650 -923:2:1382 -924:0:1650 -925:2:1386 -926:0:1650 -927:2:1395 -928:2:1396 -929:2:1400 -930:2:1404 -931:2:1405 -932:2:1409 -933:2:1417 -934:2:1418 -935:2:1423 -936:2:1430 -937:2:1431 -938:2:1438 -939:2:1443 -940:0:1650 -941:2:1454 -942:0:1650 -943:1:2 -944:0:1650 -945:1:8 -946:0:1650 -947:1:9 -948:0:1650 -949:1:10 -950:0:1650 -951:1:11 -952:0:1650 -953:1:12 -954:1:16 -955:1:17 -956:1:25 -957:1:26 -958:1:30 -959:1:31 -960:1:39 -961:1:44 -962:1:48 -963:1:49 -964:1:63 -965:1:64 -966:1:68 -967:1:69 -968:1:70 -969:1:81 -970:1:86 -971:1:87 -972:0:1650 -973:1:99 -974:0:1650 -975:1:101 -976:0:1650 -977:1:102 -978:1:106 -979:1:107 -980:1:115 -981:1:116 -982:1:120 -983:1:121 -984:1:129 -985:1:134 -986:1:138 -987:1:139 -988:1:153 -989:1:154 -990:1:158 -991:1:159 -992:1:160 -993:1:171 -994:1:176 -995:1:177 -996:0:1650 -997:1:189 -998:0:1650 -999:1:191 -1000:0:1650 -1001:1:192 -1002:0:1650 -1003:2:1458 -1004:2:1459 -1005:2:1463 -1006:2:1467 -1007:2:1468 -1008:2:1472 -1009:2:1480 -1010:2:1481 -1011:2:1486 -1012:2:1493 -1013:2:1494 -1014:2:1501 -1015:2:1506 -1016:0:1650 -1017:2:1517 -1018:0:1650 -1019:2:1525 -1020:2:1526 -1021:2:1530 -1022:2:1534 -1023:2:1535 -1024:2:1539 -1025:2:1547 -1026:2:1548 -1027:2:1553 -1028:2:1560 -1029:2:1561 -1030:2:1568 -1031:2:1573 -1032:0:1650 -1033:2:1584 -1034:0:1650 -1035:2:1586 -1036:0:1650 -1037:2:1587 -1038:0:1650 -1039:2:423 -1040:0:1650 -1041:2:424 -1042:2:428 -1043:2:429 -1044:2:437 -1045:2:438 -1046:2:442 -1047:2:443 -1048:2:451 -1049:2:456 -1050:2:460 -1051:2:461 -1052:2:468 -1053:2:469 -1054:2:480 -1055:2:481 -1056:2:482 -1057:2:493 -1058:2:498 -1059:2:499 -1060:0:1650 -1061:2:511 -1062:0:1650 -1063:2:513 -1064:2:514 -1065:0:1650 -1066:2:518 -1067:2:522 -1068:2:523 -1069:2:531 -1070:2:532 -1071:2:536 -1072:2:537 -1073:2:545 -1074:2:550 -1075:2:551 -1076:2:562 -1077:2:563 -1078:2:574 -1079:2:575 -1080:2:576 -1081:2:587 -1082:2:592 -1083:2:593 -1084:0:1650 -1085:2:605 -1086:0:1650 -1087:2:607 -1088:0:1650 -1089:2:608 -1090:0:1650 -1091:2:618 -1092:0:1650 -1093:2:622 -1094:2:623 -1095:2:627 -1096:2:631 -1097:2:632 -1098:2:636 -1099:2:644 -1100:2:645 -1101:2:650 -1102:2:657 -1103:2:658 -1104:2:665 -1105:2:670 -1106:0:1650 -1107:2:681 -1108:0:1650 -1109:1:193 -1110:1:197 -1111:1:198 -1112:1:206 -1113:1:207 -1114:1:211 -1115:1:212 -1116:1:220 -1117:1:225 -1118:1:229 -1119:1:230 -1120:1:237 -1121:1:238 -1122:1:249 -1123:1:250 -1124:1:251 -1125:1:262 -1126:1:274 -1127:1:275 -1128:0:1650 -1129:1:280 -1130:0:1650 -1131:1:282 -1132:0:1650 -1133:1:291 -1134:0:1650 -1135:1:293 -1136:0:1650 -1137:1:296 -1138:0:1650 -1139:1:301 -1140:0:1650 -1141:2:685 -1142:2:686 -1143:2:690 -1144:2:691 -1145:2:699 -1146:2:707 -1147:2:708 -1148:2:713 -1149:2:720 -1150:2:721 -1151:2:728 -1152:2:733 -1153:0:1650 -1154:2:744 -1155:0:1650 -1156:2:752 -1157:2:753 -1158:2:757 -1159:2:761 -1160:2:762 -1161:2:766 -1162:2:774 -1163:2:775 -1164:2:780 -1165:2:787 -1166:2:788 -1167:2:795 -1168:2:800 -1169:0:1650 -1170:2:811 -1171:0:1650 -1172:2:813 -1173:0:1650 -1174:2:814 -1175:2:818 -1176:2:819 -1177:2:827 -1178:2:828 -1179:2:832 -1180:2:833 -1181:2:841 -1182:2:846 -1183:2:850 -1184:2:851 -1185:2:858 -1186:2:859 -1187:2:870 -1188:2:871 -1189:2:872 -1190:2:883 -1191:2:888 -1192:2:889 -1193:0:1650 -1194:2:901 -1195:0:1650 -1196:2:903 -1197:0:1650 -1198:2:906 -1199:2:907 -1200:2:919 -1201:2:920 -1202:2:924 -1203:2:925 -1204:2:933 -1205:2:938 -1206:2:942 -1207:2:943 -1208:2:950 -1209:2:951 -1210:2:962 -1211:2:963 -1212:2:964 -1213:2:975 -1214:2:980 -1215:2:981 -1216:0:1650 -1217:2:993 -1218:0:1650 -1219:2:995 -1220:0:1650 -1221:2:996 -1222:0:1650 -1223:2:997 -1224:0:1650 -1225:2:998 -1226:0:1650 -1227:2:999 -1228:2:1003 -1229:2:1004 -1230:2:1012 -1231:2:1013 -1232:2:1017 -1233:2:1018 -1234:2:1026 -1235:2:1031 -1236:2:1035 -1237:2:1036 -1238:2:1043 -1239:2:1044 -1240:2:1055 -1241:2:1056 -1242:2:1057 -1243:2:1068 -1244:2:1073 -1245:2:1074 -1246:0:1650 -1247:2:1086 -1248:0:1650 -1249:2:1283 -1250:0:1650 -1251:2:1381 -1252:0:1650 -1253:2:1382 -1254:0:1650 -1255:2:1386 -1256:0:1650 -1257:2:1395 -1258:2:1396 -1259:2:1400 -1260:2:1404 -1261:2:1405 -1262:2:1409 -1263:2:1417 -1264:2:1418 -1265:2:1423 -1266:2:1430 -1267:2:1431 -1268:2:1438 -1269:2:1443 -1270:0:1650 -1271:2:1454 -1272:0:1650 -1273:2:1458 -1274:2:1459 -1275:2:1463 -1276:2:1467 -1277:2:1468 -1278:2:1472 -1279:2:1480 -1280:2:1481 -1281:2:1486 -1282:2:1493 -1283:2:1494 -1284:2:1501 -1285:2:1506 -1286:0:1650 -1287:2:1517 -1288:0:1650 -1289:2:1525 -1290:2:1526 -1291:2:1530 -1292:2:1534 -1293:2:1535 -1294:2:1539 -1295:2:1547 -1296:2:1548 -1297:2:1553 -1298:2:1560 -1299:2:1561 -1300:2:1568 -1301:2:1573 -1302:0:1650 -1303:2:1584 -1304:0:1650 -1305:2:1586 -1306:0:1650 -1307:2:1587 -1308:0:1650 -1309:2:1590 -1310:0:1650 -1311:2:1595 -1312:0:1650 -1313:1:302 -1314:0:1648 -1315:2:1596 -1316:0:1654 -1317:1:34 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress.ltl b/formal-model/urcu/result-standard-execution-nonest/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.define b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.log b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.log deleted file mode 100644 index 8835ef4..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.log +++ /dev/null @@ -1,264 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_reader.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -depth 15: Claim reached state 9 (line 749) -depth 1767: Claim reached state 9 (line 748) -Depth= 2582 States= 1e+06 Transitions= 1.91e+07 Memory= 498.674 t= 16.1 R= 6e+04 -Depth= 2582 States= 2e+06 Transitions= 3.89e+07 Memory= 531.096 t= 33 R= 6e+04 -Depth= 2582 States= 3e+06 Transitions= 5.89e+07 Memory= 563.518 t= 50.5 R= 6e+04 -pan: resizing hashtable to -w22.. done - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 2582, errors: 0 - 1743405 states, stored (3.27749e+06 visited) - 60942540 states, matched - 64220033 transitions (= visited+matched) -2.3877948e+08 atomic steps -hash conflicts: 25318829 (resolved) - -Stats on memory usage (in Megabytes): - 139.662 equivalent memory usage for states (stored*(State-vector + overhead)) - 113.924 actual memory usage for states (compression: 81.57%) - state-vector as stored = 41 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 603.623 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 151, "(1)" - line 418, "pan.___", state 181, "(1)" - line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 242, "(1)" - line 418, "pan.___", state 272, "(1)" - line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 360, "(1)" - line 418, "pan.___", state 390, "(1)" - line 540, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 59, "(1)" - line 413, "pan.___", state 72, "(1)" - line 418, "pan.___", state 89, "(1)" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 240, "(1)" - line 164, "pan.___", state 248, "(1)" - line 168, "pan.___", state 260, "(1)" - line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 927, "(1)" - line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 928, "else" - line 409, "pan.___", state 931, "(1)" - line 409, "pan.___", state 932, "(1)" - line 409, "pan.___", state 932, "(1)" - line 413, "pan.___", state 940, "(1)" - line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 941, "else" - line 413, "pan.___", state 944, "(1)" - line 413, "pan.___", state 945, "(1)" - line 413, "pan.___", state 945, "(1)" - line 411, "pan.___", state 950, "((i<1))" - line 411, "pan.___", state 950, "((i>=1))" - line 418, "pan.___", state 957, "(1)" - line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 958, "else" - line 418, "pan.___", state 961, "(1)" - line 418, "pan.___", state 962, "(1)" - line 418, "pan.___", state 962, "(1)" - line 420, "pan.___", state 965, "(1)" - line 420, "pan.___", state 965, "(1)" - line 403, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1040, "(1)" - line 418, "pan.___", state 1057, "(1)" - line 403, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1130, "(1)" - line 418, "pan.___", state 1147, "(1)" - line 399, "pan.___", state 1166, "(1)" - line 403, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1222, "(1)" - line 418, "pan.___", state 1239, "(1)" - line 403, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1315, "(1)" - line 418, "pan.___", state 1332, "(1)" - line 179, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 1378, "(1)" - line 164, "pan.___", state 1386, "(1)" - line 168, "pan.___", state 1398, "(1)" - line 175, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1595, "(1)" - line 409, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 1596, "else" - line 409, "pan.___", state 1599, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 413, "pan.___", state 1608, "(1)" - line 413, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 1609, "else" - line 413, "pan.___", state 1612, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 411, "pan.___", state 1618, "((i<1))" - line 411, "pan.___", state 1618, "((i>=1))" - line 418, "pan.___", state 1625, "(1)" - line 418, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 1626, "else" - line 418, "pan.___", state 1629, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 179, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 1681, "(1)" - line 164, "pan.___", state 1689, "(1)" - line 168, "pan.___", state 1701, "(1)" - line 175, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.spin.input.trail deleted file mode 100644 index 7c42af1..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_reader.spin.input.trail +++ /dev/null @@ -1,1270 +0,0 @@ --2:4:-2 --4:-4:-4 -1:0:4401 -2:4:4353 -3:4:4356 -4:4:4356 -5:4:4359 -6:4:4367 -7:4:4367 -8:4:4370 -9:4:4376 -10:4:4380 -11:4:4380 -12:4:4383 -13:4:4391 -14:4:4395 -15:4:4396 -16:0:4401 -17:4:4398 -18:0:4401 -19:3:2479 -20:0:4401 -21:3:2485 -22:0:4401 -23:3:2486 -24:0:4401 -25:3:2487 -26:3:2491 -27:3:2492 -28:3:2500 -29:3:2501 -30:3:2505 -31:3:2506 -32:3:2514 -33:3:2519 -34:3:2523 -35:3:2524 -36:3:2531 -37:3:2532 -38:3:2543 -39:3:2544 -40:3:2545 -41:3:2556 -42:3:2561 -43:3:2562 -44:0:4401 -45:3:2574 -46:0:4401 -47:3:2576 -48:3:2577 -49:0:4401 -50:3:2581 -51:3:2585 -52:3:2586 -53:3:2594 -54:3:2595 -55:3:2599 -56:3:2600 -57:3:2608 -58:3:2613 -59:3:2614 -60:3:2625 -61:3:2626 -62:3:2637 -63:3:2638 -64:3:2639 -65:3:2650 -66:3:2655 -67:3:2656 -68:0:4401 -69:3:2668 -70:0:4401 -71:3:2670 -72:0:4401 -73:3:2671 -74:0:4401 -75:3:2681 -76:0:4401 -77:3:2682 -78:0:4401 -79:3:2686 -80:3:2687 -81:3:2691 -82:3:2695 -83:3:2696 -84:3:2700 -85:3:2708 -86:3:2709 -87:3:2714 -88:3:2721 -89:3:2722 -90:3:2729 -91:3:2734 -92:0:4401 -93:3:2745 -94:0:4401 -95:3:2749 -96:3:2750 -97:3:2754 -98:3:2758 -99:3:2759 -100:3:2763 -101:3:2771 -102:3:2772 -103:3:2777 -104:3:2784 -105:3:2785 -106:3:2792 -107:3:2797 -108:0:4401 -109:3:2808 -110:0:4401 -111:3:2816 -112:3:2817 -113:3:2821 -114:3:2825 -115:3:2826 -116:3:2830 -117:3:2838 -118:3:2839 -119:3:2844 -120:3:2851 -121:3:2852 -122:3:2859 -123:3:2864 -124:0:4401 -125:3:2879 -126:0:4401 -127:3:2881 -128:0:4401 -129:3:2882 -130:3:2886 -131:3:2887 -132:3:2895 -133:3:2896 -134:3:2900 -135:3:2901 -136:3:2909 -137:3:2914 -138:3:2918 -139:3:2919 -140:3:2926 -141:3:2927 -142:3:2938 -143:3:2939 -144:3:2940 -145:3:2951 -146:3:2956 -147:3:2957 -148:0:4401 -149:3:2969 -150:0:4401 -151:3:2971 -152:0:4401 -153:3:2974 -154:3:2975 -155:3:2987 -156:3:2988 -157:3:2992 -158:3:2993 -159:3:3001 -160:3:3006 -161:3:3010 -162:3:3011 -163:3:3018 -164:3:3019 -165:3:3030 -166:3:3031 -167:3:3032 -168:3:3043 -169:3:3048 -170:3:3049 -171:0:4401 -172:3:3061 -173:0:4401 -174:3:3063 -175:0:4401 -176:3:3064 -177:0:4401 -178:3:3065 -179:0:4401 -180:3:3066 -181:0:4401 -182:3:3067 -183:3:3071 -184:3:3072 -185:3:3080 -186:3:3081 -187:3:3085 -188:3:3086 -189:3:3094 -190:3:3099 -191:3:3103 -192:3:3104 -193:3:3111 -194:3:3112 -195:3:3123 -196:3:3124 -197:3:3125 -198:3:3136 -199:3:3141 -200:3:3142 -201:0:4401 -202:3:3154 -203:0:4401 -204:3:3356 -205:0:4401 -206:3:3454 -207:0:4401 -208:3:3455 -209:0:4401 -210:3:3459 -211:0:4401 -212:3:3465 -213:3:3469 -214:3:3470 -215:3:3478 -216:3:3479 -217:3:3483 -218:3:3484 -219:3:3492 -220:3:3497 -221:3:3501 -222:3:3502 -223:3:3509 -224:3:3510 -225:3:3521 -226:3:3522 -227:3:3523 -228:3:3534 -229:3:3539 -230:3:3540 -231:0:4401 -232:3:3552 -233:0:4401 -234:3:3554 -235:0:4401 -236:3:3555 -237:3:3559 -238:3:3560 -239:3:3568 -240:3:3569 -241:3:3573 -242:3:3574 -243:3:3582 -244:3:3587 -245:3:3591 -246:3:3592 -247:3:3599 -248:3:3600 -249:3:3611 -250:3:3612 -251:3:3613 -252:3:3624 -253:3:3629 -254:3:3630 -255:0:4401 -256:3:3642 -257:0:4401 -258:3:3644 -259:0:4401 -260:3:3647 -261:3:3648 -262:3:3660 -263:3:3661 -264:3:3665 -265:3:3666 -266:3:3674 -267:3:3679 -268:3:3683 -269:3:3684 -270:3:3691 -271:3:3692 -272:3:3703 -273:3:3704 -274:3:3705 -275:3:3716 -276:3:3721 -277:3:3722 -278:0:4401 -279:3:3734 -280:0:4401 -281:3:3736 -282:0:4401 -283:3:3737 -284:0:4401 -285:3:3738 -286:0:4401 -287:3:3739 -288:0:4401 -289:3:3740 -290:3:3744 -291:3:3745 -292:3:3753 -293:3:3754 -294:3:3758 -295:3:3759 -296:3:3767 -297:3:3772 -298:3:3776 -299:3:3777 -300:3:3784 -301:3:3785 -302:3:3796 -303:3:3797 -304:3:3798 -305:3:3809 -306:3:3814 -307:3:3815 -308:0:4401 -309:3:3827 -310:0:4401 -311:3:4029 -312:0:4401 -313:3:4127 -314:0:4401 -315:3:4128 -316:0:4401 -317:3:4132 -318:0:4401 -319:3:4138 -320:0:4401 -321:3:4142 -322:3:4143 -323:3:4147 -324:3:4151 -325:3:4152 -326:3:4156 -327:3:4164 -328:3:4165 -329:3:4170 -330:3:4177 -331:3:4178 -332:3:4185 -333:3:4190 -334:0:4401 -335:3:4201 -336:0:4401 -337:3:4205 -338:3:4206 -339:3:4210 -340:3:4214 -341:3:4215 -342:3:4219 -343:3:4227 -344:3:4228 -345:3:4233 -346:3:4240 -347:3:4241 -348:3:4248 -349:3:4253 -350:0:4401 -351:3:4264 -352:0:4401 -353:3:4272 -354:3:4273 -355:3:4277 -356:3:4281 -357:3:4282 -358:3:4286 -359:3:4294 -360:3:4295 -361:3:4300 -362:3:4307 -363:3:4308 -364:3:4315 -365:3:4320 -366:0:4401 -367:3:4335 -368:0:4401 -369:3:4337 -370:0:4401 -371:3:4338 -372:0:4401 -373:3:2486 -374:0:4401 -375:3:2487 -376:3:2491 -377:3:2492 -378:3:2500 -379:3:2501 -380:3:2505 -381:3:2506 -382:3:2514 -383:3:2519 -384:3:2523 -385:3:2524 -386:3:2531 -387:3:2532 -388:3:2543 -389:3:2544 -390:3:2545 -391:3:2556 -392:3:2561 -393:3:2562 -394:0:4401 -395:3:2574 -396:0:4401 -397:3:2576 -398:3:2577 -399:0:4401 -400:3:2581 -401:3:2585 -402:3:2586 -403:3:2594 -404:3:2595 -405:3:2599 -406:3:2600 -407:3:2608 -408:3:2613 -409:3:2614 -410:3:2625 -411:3:2626 -412:3:2637 -413:3:2638 -414:3:2639 -415:3:2650 -416:3:2655 -417:3:2656 -418:0:4401 -419:3:2668 -420:0:4401 -421:3:2670 -422:0:4401 -423:3:2671 -424:0:4401 -425:3:2681 -426:0:4401 -427:3:2682 -428:0:4401 -429:3:2686 -430:3:2687 -431:3:2691 -432:3:2695 -433:3:2696 -434:3:2700 -435:3:2708 -436:3:2709 -437:3:2714 -438:3:2721 -439:3:2722 -440:3:2729 -441:3:2734 -442:0:4401 -443:3:2745 -444:0:4401 -445:3:2749 -446:3:2750 -447:3:2754 -448:3:2758 -449:3:2759 -450:3:2763 -451:3:2771 -452:3:2772 -453:3:2777 -454:3:2784 -455:3:2785 -456:3:2792 -457:3:2797 -458:0:4401 -459:3:2808 -460:0:4401 -461:3:2816 -462:3:2817 -463:3:2821 -464:3:2825 -465:3:2826 -466:3:2830 -467:3:2838 -468:3:2839 -469:3:2844 -470:3:2851 -471:3:2852 -472:3:2859 -473:3:2864 -474:0:4401 -475:3:2879 -476:0:4401 -477:3:2881 -478:0:4401 -479:3:2882 -480:3:2886 -481:3:2887 -482:3:2895 -483:3:2896 -484:3:2900 -485:3:2901 -486:3:2909 -487:3:2914 -488:3:2918 -489:3:2919 -490:3:2926 -491:3:2927 -492:3:2938 -493:3:2939 -494:3:2940 -495:3:2951 -496:3:2956 -497:3:2957 -498:0:4401 -499:3:2969 -500:0:4401 -501:3:2971 -502:0:4401 -503:3:2974 -504:3:2975 -505:3:2987 -506:3:2988 -507:3:2992 -508:3:2993 -509:3:3001 -510:3:3006 -511:3:3010 -512:3:3011 -513:3:3018 -514:3:3019 -515:3:3030 -516:3:3031 -517:3:3032 -518:3:3043 -519:3:3048 -520:3:3049 -521:0:4401 -522:3:3061 -523:0:4401 -524:3:3063 -525:0:4401 -526:3:3064 -527:0:4401 -528:3:3065 -529:0:4401 -530:3:3066 -531:0:4401 -532:3:3067 -533:3:3071 -534:3:3072 -535:3:3080 -536:3:3081 -537:3:3085 -538:3:3086 -539:3:3094 -540:3:3099 -541:3:3103 -542:3:3104 -543:3:3111 -544:3:3112 -545:3:3123 -546:3:3124 -547:3:3125 -548:3:3136 -549:3:3141 -550:3:3142 -551:0:4401 -552:3:3154 -553:0:4401 -554:3:3356 -555:0:4401 -556:3:3454 -557:0:4401 -558:3:3455 -559:0:4401 -560:3:3459 -561:0:4401 -562:3:3465 -563:3:3469 -564:3:3470 -565:3:3478 -566:3:3479 -567:3:3483 -568:3:3484 -569:3:3492 -570:3:3497 -571:3:3501 -572:3:3502 -573:3:3509 -574:3:3510 -575:3:3521 -576:3:3522 -577:3:3523 -578:3:3534 -579:3:3539 -580:3:3540 -581:0:4401 -582:3:3552 -583:0:4401 -584:3:3554 -585:0:4401 -586:3:3555 -587:3:3559 -588:3:3560 -589:3:3568 -590:3:3569 -591:3:3573 -592:3:3574 -593:3:3582 -594:3:3587 -595:3:3591 -596:3:3592 -597:3:3599 -598:3:3600 -599:3:3611 -600:3:3612 -601:3:3613 -602:3:3624 -603:3:3629 -604:3:3630 -605:0:4401 -606:3:3642 -607:0:4401 -608:3:3644 -609:0:4401 -610:3:3647 -611:3:3648 -612:3:3660 -613:3:3661 -614:3:3665 -615:3:3666 -616:3:3674 -617:3:3679 -618:3:3683 -619:3:3684 -620:3:3691 -621:3:3692 -622:3:3703 -623:3:3704 -624:3:3705 -625:3:3716 -626:3:3721 -627:3:3722 -628:0:4401 -629:3:3734 -630:0:4401 -631:3:3736 -632:0:4401 -633:3:3737 -634:0:4401 -635:3:3738 -636:0:4401 -637:3:3739 -638:0:4401 -639:3:3740 -640:3:3744 -641:3:3745 -642:3:3753 -643:3:3754 -644:3:3758 -645:3:3759 -646:3:3767 -647:3:3772 -648:3:3776 -649:3:3777 -650:3:3784 -651:3:3785 -652:3:3796 -653:3:3797 -654:3:3798 -655:3:3809 -656:3:3814 -657:3:3815 -658:0:4401 -659:3:3827 -660:0:4401 -661:3:4029 -662:0:4401 -663:3:4127 -664:0:4401 -665:3:4128 -666:0:4401 -667:3:4132 -668:0:4401 -669:3:4138 -670:0:4401 -671:3:4142 -672:3:4143 -673:3:4147 -674:3:4151 -675:3:4152 -676:3:4156 -677:3:4164 -678:3:4165 -679:3:4170 -680:3:4177 -681:3:4178 -682:3:4185 -683:3:4190 -684:0:4401 -685:3:4201 -686:0:4401 -687:3:4205 -688:3:4206 -689:3:4210 -690:3:4214 -691:3:4215 -692:3:4219 -693:3:4227 -694:3:4228 -695:3:4233 -696:3:4240 -697:3:4241 -698:3:4248 -699:3:4253 -700:0:4401 -701:3:4264 -702:0:4401 -703:3:4272 -704:3:4273 -705:3:4277 -706:3:4281 -707:3:4282 -708:3:4286 -709:3:4294 -710:3:4295 -711:3:4300 -712:3:4307 -713:3:4308 -714:3:4315 -715:3:4320 -716:0:4401 -717:3:4335 -718:0:4401 -719:3:4337 -720:0:4401 -721:3:4338 -722:0:4401 -723:3:2486 -724:0:4401 -725:3:2487 -726:3:2491 -727:3:2492 -728:3:2500 -729:3:2501 -730:3:2505 -731:3:2506 -732:3:2514 -733:3:2519 -734:3:2523 -735:3:2524 -736:3:2531 -737:3:2532 -738:3:2543 -739:3:2544 -740:3:2545 -741:3:2556 -742:3:2561 -743:3:2562 -744:0:4401 -745:3:2574 -746:0:4401 -747:3:2576 -748:3:2577 -749:0:4401 -750:3:2581 -751:3:2585 -752:3:2586 -753:3:2594 -754:3:2595 -755:3:2599 -756:3:2600 -757:3:2608 -758:3:2613 -759:3:2614 -760:3:2625 -761:3:2626 -762:3:2637 -763:3:2638 -764:3:2639 -765:3:2650 -766:3:2655 -767:3:2656 -768:0:4401 -769:3:2668 -770:0:4401 -771:3:2670 -772:0:4401 -773:3:2671 -774:0:4401 -775:3:2681 -776:0:4401 -777:3:2682 -778:0:4401 -779:3:2686 -780:3:2687 -781:3:2691 -782:3:2695 -783:3:2696 -784:3:2700 -785:3:2708 -786:3:2709 -787:3:2714 -788:3:2721 -789:3:2722 -790:3:2729 -791:3:2734 -792:0:4401 -793:3:2745 -794:0:4401 -795:3:2749 -796:3:2750 -797:3:2754 -798:3:2758 -799:3:2759 -800:3:2763 -801:3:2771 -802:3:2772 -803:3:2777 -804:3:2784 -805:3:2785 -806:3:2792 -807:3:2797 -808:0:4401 -809:3:2808 -810:0:4401 -811:3:2816 -812:3:2817 -813:3:2821 -814:3:2825 -815:3:2826 -816:3:2830 -817:3:2838 -818:3:2839 -819:3:2844 -820:3:2851 -821:3:2852 -822:3:2859 -823:3:2864 -824:0:4401 -825:3:2879 -826:0:4401 -827:3:2881 -828:0:4401 -829:3:2882 -830:3:2886 -831:3:2887 -832:3:2895 -833:3:2896 -834:3:2900 -835:3:2901 -836:3:2909 -837:3:2914 -838:3:2918 -839:3:2919 -840:3:2926 -841:3:2927 -842:3:2938 -843:3:2939 -844:3:2940 -845:3:2951 -846:3:2956 -847:3:2957 -848:0:4401 -849:3:2969 -850:0:4401 -851:3:2971 -852:0:4401 -853:3:2974 -854:3:2975 -855:3:2987 -856:3:2988 -857:3:2992 -858:3:2993 -859:3:3001 -860:3:3006 -861:3:3010 -862:3:3011 -863:3:3018 -864:3:3019 -865:3:3030 -866:3:3031 -867:3:3032 -868:3:3043 -869:3:3048 -870:3:3049 -871:0:4401 -872:3:3061 -873:0:4401 -874:3:3063 -875:0:4401 -876:3:3064 -877:0:4401 -878:3:3065 -879:0:4401 -880:3:3066 -881:0:4401 -882:3:3067 -883:3:3071 -884:3:3072 -885:3:3080 -886:3:3081 -887:3:3085 -888:3:3086 -889:3:3094 -890:3:3099 -891:3:3103 -892:3:3104 -893:3:3111 -894:3:3112 -895:3:3123 -896:3:3124 -897:3:3125 -898:3:3136 -899:3:3141 -900:3:3142 -901:0:4401 -902:3:3154 -903:0:4401 -904:3:3356 -905:0:4401 -906:3:3454 -907:0:4401 -908:3:3455 -909:0:4401 -910:3:3459 -911:0:4401 -912:3:3465 -913:3:3469 -914:3:3470 -915:3:3478 -916:3:3479 -917:3:3483 -918:3:3484 -919:3:3492 -920:3:3497 -921:3:3501 -922:3:3502 -923:3:3509 -924:3:3510 -925:3:3521 -926:3:3522 -927:3:3523 -928:3:3534 -929:3:3539 -930:3:3540 -931:0:4401 -932:3:3552 -933:0:4401 -934:3:3554 -935:0:4401 -936:3:3555 -937:3:3559 -938:3:3560 -939:3:3568 -940:3:3569 -941:3:3573 -942:3:3574 -943:3:3582 -944:3:3587 -945:3:3591 -946:3:3592 -947:3:3599 -948:3:3600 -949:3:3611 -950:3:3612 -951:3:3613 -952:3:3624 -953:3:3629 -954:3:3630 -955:0:4401 -956:3:3642 -957:0:4401 -958:3:3644 -959:0:4401 -960:3:3647 -961:3:3648 -962:3:3660 -963:3:3661 -964:3:3665 -965:3:3666 -966:3:3674 -967:3:3679 -968:3:3683 -969:3:3684 -970:3:3691 -971:3:3692 -972:3:3703 -973:3:3704 -974:3:3705 -975:3:3716 -976:3:3721 -977:3:3722 -978:0:4401 -979:3:3734 -980:0:4401 -981:3:3736 -982:0:4401 -983:3:3737 -984:0:4401 -985:3:3738 -986:0:4401 -987:3:3739 -988:0:4401 -989:3:3740 -990:3:3744 -991:3:3745 -992:3:3753 -993:3:3754 -994:3:3758 -995:3:3759 -996:3:3767 -997:3:3772 -998:3:3776 -999:3:3777 -1000:3:3784 -1001:3:3785 -1002:3:3796 -1003:3:3797 -1004:3:3798 -1005:3:3809 -1006:3:3814 -1007:3:3815 -1008:0:4401 -1009:3:3827 -1010:0:4401 -1011:3:4029 -1012:0:4401 -1013:3:4127 -1014:0:4401 -1015:3:4128 -1016:0:4401 -1017:3:4132 -1018:0:4401 -1019:3:4138 -1020:0:4401 -1021:3:4142 -1022:3:4143 -1023:3:4147 -1024:3:4151 -1025:3:4152 -1026:3:4156 -1027:3:4164 -1028:3:4165 -1029:3:4170 -1030:3:4177 -1031:3:4178 -1032:3:4185 -1033:3:4190 -1034:0:4401 -1035:3:4201 -1036:0:4401 -1037:3:4205 -1038:3:4206 -1039:3:4210 -1040:3:4214 -1041:3:4215 -1042:3:4219 -1043:3:4227 -1044:3:4228 -1045:3:4233 -1046:3:4240 -1047:3:4241 -1048:3:4248 -1049:3:4253 -1050:0:4401 -1051:3:4264 -1052:0:4401 -1053:3:4272 -1054:3:4273 -1055:3:4277 -1056:3:4281 -1057:3:4282 -1058:3:4286 -1059:3:4294 -1060:3:4295 -1061:3:4300 -1062:3:4307 -1063:3:4308 -1064:3:4315 -1065:3:4320 -1066:0:4401 -1067:3:4335 -1068:0:4401 -1069:3:4337 -1070:0:4401 -1071:3:4338 -1072:0:4401 -1073:3:4341 -1074:0:4401 -1075:3:4346 -1076:0:4401 -1077:2:1236 -1078:0:4401 -1079:3:4347 -1080:0:4401 -1081:2:1242 -1082:0:4401 -1083:3:4346 -1084:0:4401 -1085:2:1243 -1086:0:4401 -1087:3:4347 -1088:0:4401 -1089:2:1244 -1090:0:4401 -1091:3:4346 -1092:0:4401 -1093:2:1245 -1094:0:4401 -1095:3:4347 -1096:0:4401 -1097:1:2 -1098:0:4401 -1099:3:4346 -1100:0:4401 -1101:2:1246 -1102:0:4401 -1103:3:4347 -1104:0:4401 -1105:1:8 -1106:0:4401 -1107:3:4346 -1108:0:4401 -1109:2:1245 -1110:0:4401 -1111:3:4347 -1112:0:4401 -1113:1:9 -1114:0:4401 -1115:3:4346 -1116:0:4401 -1117:2:1246 -1118:0:4401 -1119:3:4347 -1120:0:4401 -1121:1:10 -1122:0:4401 -1123:3:4346 -1124:0:4401 -1125:2:1245 -1126:0:4401 -1127:3:4347 -1128:0:4401 -1129:1:11 -1130:0:4401 -1131:3:4346 -1132:0:4401 -1133:2:1246 -1134:0:4401 -1135:3:4347 -1136:0:4401 -1137:1:14 -1138:0:4401 -1139:3:4346 -1140:0:4401 -1141:2:1245 -1142:0:4401 -1143:3:4347 -1144:0:4401 -1145:1:15 -1146:0:4401 -1147:3:4346 -1148:0:4401 -1149:2:1246 -1150:0:4401 -1151:3:4347 -1152:0:4401 -1153:1:16 -1154:1:20 -1155:1:21 -1156:1:29 -1157:1:30 -1158:1:34 -1159:1:35 -1160:1:43 -1161:1:48 -1162:1:52 -1163:1:53 -1164:1:60 -1165:1:61 -1166:1:72 -1167:1:73 -1168:1:74 -1169:1:85 -1170:1:90 -1171:1:91 -1172:0:4401 -1173:3:4346 -1174:0:4401 -1175:2:1245 -1176:0:4401 -1177:3:4347 -1178:0:4401 -1179:1:103 -1180:0:4401 -1181:3:4346 -1182:0:4401 -1183:2:1246 -1184:0:4401 -1185:3:4347 -1186:0:4401 -1187:2:1247 -1188:0:4401 -1189:3:4346 -1190:0:4401 -1191:2:1253 -1192:0:4401 -1193:3:4347 -1194:0:4401 -1195:2:1254 -1196:0:4399 -1197:3:4346 -1198:0:4405 -1199:3:4347 -1200:0:4405 -1201:2:1257 -1202:0:4405 -1203:3:4346 -1204:0:4405 -1205:2:1258 -1206:0:4405 -1207:3:4347 -1208:0:4405 -1209:2:1259 -1210:2:1263 -1211:2:1264 -1212:2:1272 -1213:2:1273 -1214:2:1277 -1215:2:1278 -1216:2:1286 -1217:2:1291 -1218:2:1295 -1219:2:1296 -1220:2:1303 -1221:2:1304 -1222:2:1315 -1223:2:1316 -1224:2:1317 -1225:2:1328 -1226:2:1333 -1227:2:1334 -1228:0:4405 -1229:3:4346 -1230:0:4405 -1231:2:1346 -1232:0:4405 -1233:3:4347 -1234:0:4405 -1235:2:1347 -1236:0:4405 -1237:3:4346 -1238:0:4405 -1239:1:104 --1:-1:-1 -1240:0:4405 -1241:3:4347 -1242:0:4405 -1243:3:4346 -1244:0:4405 -1245:2:1348 -1246:0:4405 -1247:3:4347 -1248:0:4405 -1249:2:1347 -1250:0:4405 -1251:3:4346 -1252:0:4405 -1253:1:105 -1254:0:4405 -1255:3:4347 -1256:0:4405 -1257:3:4346 -1258:0:4405 -1259:2:1348 -1260:0:4405 -1261:3:4347 -1262:0:4405 -1263:2:1347 -1264:0:4405 -1265:3:4346 -1266:0:4405 -1267:1:104 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.define b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.log b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.log deleted file mode 100644 index be944b5..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.log +++ /dev/null @@ -1,264 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 744) -depth 15: Claim reached state 9 (line 749) -depth 205: Claim reached state 9 (line 748) -Depth= 2535 States= 1e+06 Transitions= 1.7e+07 Memory= 489.885 t= 14.4 R= 7e+04 -Depth= 2535 States= 2e+06 Transitions= 3.76e+07 Memory= 523.186 t= 32 R= 6e+04 -Depth= 2535 States= 3e+06 Transitions= 5.78e+07 Memory= 555.901 t= 49.6 R= 6e+04 -pan: resizing hashtable to -w22.. done - -(Spin Version 5.1.7 -- 23 December 2008) - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 2535, errors: 0 - 1687360 states, stored (3.30264e+06 visited) - 60975458 states, matched - 64278093 transitions (= visited+matched) -2.3918285e+08 atomic steps -hash conflicts: 20728375 (resolved) - -Stats on memory usage (in Megabytes): - 135.172 equivalent memory usage for states (stored*(State-vector + overhead)) - 110.532 actual memory usage for states (compression: 81.77%) - state-vector as stored = 41 byte + 28 byte overhead - 32.000 memory used for hash table (-w22) - 457.764 memory used for DFS stack (-m10000000) - 600.205 total actual memory usage - -unreached in proctype urcu_reader - line 399, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 61, "(1)" - line 418, "pan.___", state 91, "(1)" - line 399, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 151, "(1)" - line 418, "pan.___", state 181, "(1)" - line 399, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 242, "(1)" - line 418, "pan.___", state 272, "(1)" - line 399, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 360, "(1)" - line 418, "pan.___", state 390, "(1)" - line 540, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 399, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 59, "(1)" - line 413, "pan.___", state 72, "(1)" - line 418, "pan.___", state 89, "(1)" - line 399, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 403, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 153, "(1)" - line 413, "pan.___", state 166, "(1)" - line 652, "pan.___", state 199, "(1)" - line 175, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 179, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 240, "(1)" - line 164, "pan.___", state 248, "(1)" - line 168, "pan.___", state 260, "(1)" - line 175, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 914, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 927, "(1)" - line 409, "pan.___", state 928, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 928, "else" - line 409, "pan.___", state 931, "(1)" - line 409, "pan.___", state 932, "(1)" - line 409, "pan.___", state 932, "(1)" - line 413, "pan.___", state 940, "(1)" - line 413, "pan.___", state 941, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 941, "else" - line 413, "pan.___", state 944, "(1)" - line 413, "pan.___", state 945, "(1)" - line 413, "pan.___", state 945, "(1)" - line 411, "pan.___", state 950, "((i<1))" - line 411, "pan.___", state 950, "((i>=1))" - line 418, "pan.___", state 957, "(1)" - line 418, "pan.___", state 958, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 958, "else" - line 418, "pan.___", state 961, "(1)" - line 418, "pan.___", state 962, "(1)" - line 418, "pan.___", state 962, "(1)" - line 420, "pan.___", state 965, "(1)" - line 420, "pan.___", state 965, "(1)" - line 403, "pan.___", state 996, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1014, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1040, "(1)" - line 418, "pan.___", state 1057, "(1)" - line 403, "pan.___", state 1086, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1104, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1130, "(1)" - line 418, "pan.___", state 1147, "(1)" - line 399, "pan.___", state 1166, "(1)" - line 403, "pan.___", state 1178, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1196, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1222, "(1)" - line 418, "pan.___", state 1239, "(1)" - line 403, "pan.___", state 1271, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 408, "pan.___", state 1289, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 413, "pan.___", state 1315, "(1)" - line 418, "pan.___", state 1332, "(1)" - line 179, "pan.___", state 1355, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1368, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 1378, "(1)" - line 164, "pan.___", state 1386, "(1)" - line 168, "pan.___", state 1398, "(1)" - line 175, "pan.___", state 1409, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 408, "pan.___", state 1582, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1595, "(1)" - line 409, "pan.___", state 1596, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 409, "pan.___", state 1596, "else" - line 409, "pan.___", state 1599, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 409, "pan.___", state 1600, "(1)" - line 413, "pan.___", state 1608, "(1)" - line 413, "pan.___", state 1609, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 413, "pan.___", state 1609, "else" - line 413, "pan.___", state 1612, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 413, "pan.___", state 1613, "(1)" - line 411, "pan.___", state 1618, "((i<1))" - line 411, "pan.___", state 1618, "((i>=1))" - line 418, "pan.___", state 1625, "(1)" - line 418, "pan.___", state 1626, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 418, "pan.___", state 1626, "else" - line 418, "pan.___", state 1629, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 418, "pan.___", state 1630, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 420, "pan.___", state 1633, "(1)" - line 179, "pan.___", state 1658, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 183, "pan.___", state 1671, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 160, "pan.___", state 1681, "(1)" - line 164, "pan.___", state 1689, "(1)" - line 168, "pan.___", state 1701, "(1)" - line 175, "pan.___", state 1712, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.spin.input.trail deleted file mode 100644 index e65d663..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer.spin.input.trail +++ /dev/null @@ -1,9 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2679 -2:1:2673 -3:1:2674 -4:1:2675 -5:1:2676 -6:0:2685 -7:5:1129 diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.define b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.log b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.log deleted file mode 100644 index 80c9c6d..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.log +++ /dev/null @@ -1,514 +0,0 @@ -make[1]: Entering directory `/home/compudj/doc/userspace-rcu/formal-model/urcu' -rm -f pan* trail.out .input.spin* *.spin.trail .input.define -touch .input.define -cat .input.define > pan.ltl -cat DEFINES >> pan.ltl -spin -f "!(`cat urcu_progress.ltl | grep -v ^//`)" >> pan.ltl -cp urcu_progress_writer_error.define .input.define -cat .input.define > .input.spin -cat DEFINES >> .input.spin -cat urcu.spin >> .input.spin -rm -f .input.spin.trail -spin -a -X -N pan.ltl .input.spin -Exit-Status 0 -gcc -O2 -w -DHASH64 -o pan pan.c -./pan -a -f -v -c1 -X -m10000000 -w20 -warning: for p.o. reduction to be valid the never claim must be stutter-invariant -(never claims generated from LTL formulae are stutter-invariant) -depth 0: Claim reached state 5 (line 745) -depth 15: Claim reached state 9 (line 750) -depth 205: Claim reached state 9 (line 749) -pan: acceptance cycle (at depth 1651) -pan: wrote .input.spin.trail - -(Spin Version 5.1.7 -- 23 December 2008) -Warning: Search not completed - + Partial Order Reduction - -Full statespace search for: - never claim + - assertion violations + (if within scope of claim) - acceptance cycles + (fairness enabled) - invalid end states - (disabled by never claim) - -State-vector 56 byte, depth reached 3006, errors: 1 - 19244 states, stored (53713 visited) - 704248 states, matched - 757961 transitions (= visited+matched) - 2831420 atomic steps -hash conflicts: 5063 (resolved) - -Stats on memory usage (in Megabytes): - 1.542 equivalent memory usage for states (stored*(State-vector + overhead)) - 1.605 actual memory usage for states (unsuccessful compression: 104.14%) - state-vector as stored = 59 byte + 28 byte overhead - 8.000 memory used for hash table (-w20) - 457.764 memory used for DFS stack (-m10000000) - 467.326 total actual memory usage - -unreached in proctype urcu_reader - line 400, "pan.___", state 16, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 48, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 61, "(1)" - line 419, "pan.___", state 91, "(1)" - line 400, "pan.___", state 106, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 138, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 151, "(1)" - line 419, "pan.___", state 181, "(1)" - line 400, "pan.___", state 197, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 229, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 242, "(1)" - line 419, "pan.___", state 272, "(1)" - line 400, "pan.___", state 315, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 347, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 360, "(1)" - line 419, "pan.___", state 390, "(1)" - line 541, "pan.___", state 414, "-end-" - (17 of 414 states) -unreached in proctype urcu_writer - line 400, "pan.___", state 14, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 20, "(1)" - line 404, "pan.___", state 28, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 34, "(1)" - line 404, "pan.___", state 35, "(1)" - line 404, "pan.___", state 35, "(1)" - line 402, "pan.___", state 40, "((i<1))" - line 402, "pan.___", state 40, "((i>=1))" - line 409, "pan.___", state 46, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 59, "(1)" - line 410, "pan.___", state 60, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 60, "else" - line 410, "pan.___", state 63, "(1)" - line 410, "pan.___", state 64, "(1)" - line 410, "pan.___", state 64, "(1)" - line 414, "pan.___", state 72, "(1)" - line 414, "pan.___", state 73, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 73, "else" - line 414, "pan.___", state 76, "(1)" - line 414, "pan.___", state 77, "(1)" - line 414, "pan.___", state 77, "(1)" - line 412, "pan.___", state 82, "((i<1))" - line 412, "pan.___", state 82, "((i>=1))" - line 419, "pan.___", state 89, "(1)" - line 419, "pan.___", state 90, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 90, "else" - line 419, "pan.___", state 93, "(1)" - line 419, "pan.___", state 94, "(1)" - line 419, "pan.___", state 94, "(1)" - line 370, "pan.___", state 99, "(1)" - line 640, "pan.___", state 103, "cached_generation_ptr.val[_pid] = (old_gen+1)" - line 638, "pan.___", state 104, "old_gen = cached_generation_ptr.val[_pid]" - line 400, "pan.___", state 108, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 114, "(1)" - line 404, "pan.___", state 122, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 128, "(1)" - line 404, "pan.___", state 129, "(1)" - line 404, "pan.___", state 129, "(1)" - line 402, "pan.___", state 134, "((i<1))" - line 402, "pan.___", state 134, "((i>=1))" - line 410, "pan.___", state 153, "(1)" - line 410, "pan.___", state 154, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 154, "else" - line 410, "pan.___", state 157, "(1)" - line 410, "pan.___", state 158, "(1)" - line 410, "pan.___", state 158, "(1)" - line 414, "pan.___", state 166, "(1)" - line 414, "pan.___", state 167, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 167, "else" - line 414, "pan.___", state 170, "(1)" - line 414, "pan.___", state 171, "(1)" - line 414, "pan.___", state 171, "(1)" - line 412, "pan.___", state 176, "((i<1))" - line 412, "pan.___", state 176, "((i>=1))" - line 419, "pan.___", state 183, "(1)" - line 419, "pan.___", state 184, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 184, "else" - line 419, "pan.___", state 187, "(1)" - line 419, "pan.___", state 188, "(1)" - line 419, "pan.___", state 188, "(1)" - line 421, "pan.___", state 191, "(1)" - line 421, "pan.___", state 191, "(1)" - line 370, "pan.___", state 193, "(1)" - line 653, "pan.___", state 199, "(1)" - line 647, "pan.___", state 202, "((write_lock==0))" - line 647, "pan.___", state 202, "else" - line 645, "pan.___", state 203, "(1)" - line 176, "pan.___", state 208, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 180, "pan.___", state 217, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 178, "pan.___", state 225, "((j<1))" - line 178, "pan.___", state 225, "((j>=1))" - line 184, "pan.___", state 230, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 161, "pan.___", state 240, "(1)" - line 165, "pan.___", state 248, "(1)" - line 165, "pan.___", state 249, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 165, "pan.___", state 249, "else" - line 163, "pan.___", state 254, "((j<1))" - line 163, "pan.___", state 254, "((j>=1))" - line 169, "pan.___", state 260, "(1)" - line 169, "pan.___", state 261, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 169, "pan.___", state 261, "else" - line 171, "pan.___", state 264, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 171, "pan.___", state 264, "else" - line 176, "pan.___", state 271, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<=1))" - line 184, "pan.___", state 293, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<=1))" - line 169, "pan.___", state 323, "(1)" - line 169, "pan.___", state 324, "(!((cache_dirty_generation_ptr.bitfield&(1<=1))" - line 176, "pan.___", state 338, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 180, "pan.___", state 347, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 178, "pan.___", state 355, "((j<1))" - line 178, "pan.___", state 355, "((j>=1))" - line 184, "pan.___", state 360, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 161, "pan.___", state 370, "(1)" - line 165, "pan.___", state 378, "(1)" - line 165, "pan.___", state 379, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 165, "pan.___", state 379, "else" - line 163, "pan.___", state 384, "((j<1))" - line 163, "pan.___", state 384, "((j>=1))" - line 169, "pan.___", state 390, "(1)" - line 169, "pan.___", state 391, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 169, "pan.___", state 391, "else" - line 171, "pan.___", state 394, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 171, "pan.___", state 394, "else" - line 400, "pan.___", state 404, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 410, "(1)" - line 404, "pan.___", state 418, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 424, "(1)" - line 404, "pan.___", state 425, "(1)" - line 404, "pan.___", state 425, "(1)" - line 402, "pan.___", state 430, "((i<1))" - line 402, "pan.___", state 430, "((i>=1))" - line 409, "pan.___", state 436, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 449, "(1)" - line 410, "pan.___", state 450, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 450, "else" - line 410, "pan.___", state 453, "(1)" - line 410, "pan.___", state 454, "(1)" - line 410, "pan.___", state 454, "(1)" - line 414, "pan.___", state 462, "(1)" - line 414, "pan.___", state 463, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 463, "else" - line 414, "pan.___", state 466, "(1)" - line 414, "pan.___", state 467, "(1)" - line 414, "pan.___", state 467, "(1)" - line 412, "pan.___", state 472, "((i<1))" - line 412, "pan.___", state 472, "((i>=1))" - line 419, "pan.___", state 479, "(1)" - line 419, "pan.___", state 480, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 480, "else" - line 419, "pan.___", state 483, "(1)" - line 419, "pan.___", state 484, "(1)" - line 419, "pan.___", state 484, "(1)" - line 421, "pan.___", state 487, "(1)" - line 421, "pan.___", state 487, "(1)" - line 370, "pan.___", state 489, "(1)" - line 662, "pan.___", state 492, "cached_urcu_gp_ctr.val[_pid] = (tmp^(1<<7))" - line 400, "pan.___", state 498, "(1)" - line 400, "pan.___", state 499, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 499, "else" - line 400, "pan.___", state 502, "(1)" - line 404, "pan.___", state 510, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 516, "(1)" - line 404, "pan.___", state 517, "(1)" - line 404, "pan.___", state 517, "(1)" - line 402, "pan.___", state 522, "((i<1))" - line 402, "pan.___", state 522, "((i>=1))" - line 409, "pan.___", state 528, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 541, "(1)" - line 410, "pan.___", state 542, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 542, "else" - line 410, "pan.___", state 545, "(1)" - line 410, "pan.___", state 546, "(1)" - line 410, "pan.___", state 546, "(1)" - line 414, "pan.___", state 554, "(1)" - line 414, "pan.___", state 555, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 555, "else" - line 414, "pan.___", state 558, "(1)" - line 414, "pan.___", state 559, "(1)" - line 414, "pan.___", state 559, "(1)" - line 412, "pan.___", state 564, "((i<1))" - line 412, "pan.___", state 564, "((i>=1))" - line 419, "pan.___", state 571, "(1)" - line 419, "pan.___", state 572, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 572, "else" - line 419, "pan.___", state 575, "(1)" - line 419, "pan.___", state 576, "(1)" - line 419, "pan.___", state 576, "(1)" - line 421, "pan.___", state 579, "(1)" - line 421, "pan.___", state 579, "(1)" - line 370, "pan.___", state 581, "(1)" - line 400, "pan.___", state 589, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 595, "(1)" - line 404, "pan.___", state 603, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 609, "(1)" - line 404, "pan.___", state 610, "(1)" - line 404, "pan.___", state 610, "(1)" - line 402, "pan.___", state 615, "((i<1))" - line 402, "pan.___", state 615, "((i>=1))" - line 409, "pan.___", state 621, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 634, "(1)" - line 410, "pan.___", state 635, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 635, "else" - line 410, "pan.___", state 638, "(1)" - line 410, "pan.___", state 639, "(1)" - line 410, "pan.___", state 639, "(1)" - line 414, "pan.___", state 647, "(1)" - line 414, "pan.___", state 648, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 648, "else" - line 414, "pan.___", state 651, "(1)" - line 414, "pan.___", state 652, "(1)" - line 414, "pan.___", state 652, "(1)" - line 412, "pan.___", state 657, "((i<1))" - line 412, "pan.___", state 657, "((i>=1))" - line 419, "pan.___", state 664, "(1)" - line 419, "pan.___", state 665, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 665, "else" - line 419, "pan.___", state 668, "(1)" - line 419, "pan.___", state 669, "(1)" - line 419, "pan.___", state 669, "(1)" - line 421, "pan.___", state 672, "(1)" - line 421, "pan.___", state 672, "(1)" - line 370, "pan.___", state 674, "(1)" - line 400, "pan.___", state 679, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 681, "(1)" - line 400, "pan.___", state 682, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 682, "else" - line 400, "pan.___", state 685, "(1)" - line 404, "pan.___", state 693, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 695, "(1)" - line 404, "pan.___", state 696, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 404, "pan.___", state 696, "else" - line 404, "pan.___", state 699, "(1)" - line 404, "pan.___", state 700, "(1)" - line 404, "pan.___", state 700, "(1)" - line 402, "pan.___", state 705, "((i<1))" - line 402, "pan.___", state 705, "((i>=1))" - line 409, "pan.___", state 711, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 724, "(1)" - line 410, "pan.___", state 725, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 725, "else" - line 410, "pan.___", state 728, "(1)" - line 410, "pan.___", state 729, "(1)" - line 410, "pan.___", state 729, "(1)" - line 414, "pan.___", state 737, "(1)" - line 414, "pan.___", state 738, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 738, "else" - line 414, "pan.___", state 741, "(1)" - line 414, "pan.___", state 742, "(1)" - line 414, "pan.___", state 742, "(1)" - line 412, "pan.___", state 747, "((i<1))" - line 412, "pan.___", state 747, "((i>=1))" - line 419, "pan.___", state 754, "(1)" - line 419, "pan.___", state 755, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 755, "else" - line 419, "pan.___", state 758, "(1)" - line 419, "pan.___", state 759, "(1)" - line 419, "pan.___", state 759, "(1)" - line 421, "pan.___", state 762, "(1)" - line 421, "pan.___", state 762, "(1)" - line 370, "pan.___", state 764, "(1)" - line 430, "pan.___", state 767, "(((tmp2&((1<<7)-1))&&((tmp2^cached_urcu_gp_ctr.val[_pid])&(1<<7))))" - line 430, "pan.___", state 767, "else" - line 400, "pan.___", state 777, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 779, "(1)" - line 400, "pan.___", state 780, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 780, "else" - line 400, "pan.___", state 783, "(1)" - line 404, "pan.___", state 791, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 793, "(1)" - line 404, "pan.___", state 794, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 404, "pan.___", state 794, "else" - line 404, "pan.___", state 797, "(1)" - line 404, "pan.___", state 798, "(1)" - line 404, "pan.___", state 798, "(1)" - line 402, "pan.___", state 803, "((i<1))" - line 402, "pan.___", state 803, "((i>=1))" - line 409, "pan.___", state 809, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 822, "(1)" - line 410, "pan.___", state 823, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 823, "else" - line 410, "pan.___", state 826, "(1)" - line 410, "pan.___", state 827, "(1)" - line 410, "pan.___", state 827, "(1)" - line 414, "pan.___", state 835, "(1)" - line 414, "pan.___", state 836, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 836, "else" - line 414, "pan.___", state 839, "(1)" - line 414, "pan.___", state 840, "(1)" - line 414, "pan.___", state 840, "(1)" - line 412, "pan.___", state 845, "((i<1))" - line 412, "pan.___", state 845, "((i>=1))" - line 419, "pan.___", state 852, "(1)" - line 419, "pan.___", state 853, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 853, "else" - line 419, "pan.___", state 856, "(1)" - line 419, "pan.___", state 857, "(1)" - line 419, "pan.___", state 857, "(1)" - line 421, "pan.___", state 860, "(1)" - line 421, "pan.___", state 860, "(1)" - line 370, "pan.___", state 862, "(1)" - line 449, "pan.___", state 870, "((tmp<1))" - line 449, "pan.___", state 870, "((tmp>=1))" - line 462, "pan.___", state 873, "tmp = 0" - line 400, "pan.___", state 877, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 883, "(1)" - line 404, "pan.___", state 891, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 897, "(1)" - line 404, "pan.___", state 898, "(1)" - line 404, "pan.___", state 898, "(1)" - line 402, "pan.___", state 903, "((i<1))" - line 402, "pan.___", state 903, "((i>=1))" - line 409, "pan.___", state 909, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 922, "(1)" - line 410, "pan.___", state 923, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 923, "else" - line 410, "pan.___", state 926, "(1)" - line 410, "pan.___", state 927, "(1)" - line 410, "pan.___", state 927, "(1)" - line 414, "pan.___", state 935, "(1)" - line 414, "pan.___", state 936, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 936, "else" - line 414, "pan.___", state 939, "(1)" - line 414, "pan.___", state 940, "(1)" - line 414, "pan.___", state 940, "(1)" - line 412, "pan.___", state 945, "((i<1))" - line 412, "pan.___", state 945, "((i>=1))" - line 419, "pan.___", state 952, "(1)" - line 419, "pan.___", state 953, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 953, "else" - line 419, "pan.___", state 956, "(1)" - line 419, "pan.___", state 957, "(1)" - line 419, "pan.___", state 957, "(1)" - line 421, "pan.___", state 960, "(1)" - line 421, "pan.___", state 960, "(1)" - line 370, "pan.___", state 962, "(1)" - line 671, "pan.___", state 963, "tmp = cached_urcu_gp_ctr.val[_pid]" - line 400, "pan.___", state 967, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 973, "(1)" - line 404, "pan.___", state 981, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 987, "(1)" - line 404, "pan.___", state 988, "(1)" - line 404, "pan.___", state 988, "(1)" - line 402, "pan.___", state 993, "((i<1))" - line 402, "pan.___", state 993, "((i>=1))" - line 409, "pan.___", state 999, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 1012, "(1)" - line 410, "pan.___", state 1013, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 1013, "else" - line 410, "pan.___", state 1016, "(1)" - line 410, "pan.___", state 1017, "(1)" - line 410, "pan.___", state 1017, "(1)" - line 414, "pan.___", state 1025, "(1)" - line 414, "pan.___", state 1026, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 1026, "else" - line 414, "pan.___", state 1029, "(1)" - line 414, "pan.___", state 1030, "(1)" - line 414, "pan.___", state 1030, "(1)" - line 412, "pan.___", state 1035, "((i<1))" - line 412, "pan.___", state 1035, "((i>=1))" - line 419, "pan.___", state 1042, "(1)" - line 419, "pan.___", state 1043, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 1043, "else" - line 419, "pan.___", state 1046, "(1)" - line 419, "pan.___", state 1047, "(1)" - line 419, "pan.___", state 1047, "(1)" - line 421, "pan.___", state 1050, "(1)" - line 421, "pan.___", state 1050, "(1)" - line 370, "pan.___", state 1052, "(1)" - line 400, "pan.___", state 1061, "(1)" - line 404, "pan.___", state 1073, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1091, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1117, "(1)" - line 419, "pan.___", state 1134, "(1)" - line 404, "pan.___", state 1166, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1184, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 414, "pan.___", state 1210, "(1)" - line 419, "pan.___", state 1227, "(1)" - line 400, "pan.___", state 1242, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 1256, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 409, "pan.___", state 1274, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 1287, "(1)" - line 414, "pan.___", state 1300, "(1)" - line 419, "pan.___", state 1317, "(1)" - line 400, "pan.___", state 1340, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1<<_pid)))" - line 400, "pan.___", state 1342, "(1)" - line 400, "pan.___", state 1343, "((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid)))" - line 400, "pan.___", state 1343, "else" - line 400, "pan.___", state 1346, "(1)" - line 404, "pan.___", state 1354, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 404, "pan.___", state 1356, "(1)" - line 404, "pan.___", state 1357, "((cache_dirty_urcu_active_readers.bitfield&(1<<_pid)))" - line 404, "pan.___", state 1357, "else" - line 404, "pan.___", state 1360, "(1)" - line 404, "pan.___", state 1361, "(1)" - line 404, "pan.___", state 1361, "(1)" - line 402, "pan.___", state 1366, "((i<1))" - line 402, "pan.___", state 1366, "((i>=1))" - line 409, "pan.___", state 1372, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 410, "pan.___", state 1385, "(1)" - line 410, "pan.___", state 1386, "(!((cache_dirty_urcu_gp_ctr.bitfield&(1<<_pid))))" - line 410, "pan.___", state 1386, "else" - line 410, "pan.___", state 1389, "(1)" - line 410, "pan.___", state 1390, "(1)" - line 410, "pan.___", state 1390, "(1)" - line 414, "pan.___", state 1398, "(1)" - line 414, "pan.___", state 1399, "(!((cache_dirty_urcu_active_readers.bitfield&(1<<_pid))))" - line 414, "pan.___", state 1399, "else" - line 414, "pan.___", state 1402, "(1)" - line 414, "pan.___", state 1403, "(1)" - line 414, "pan.___", state 1403, "(1)" - line 412, "pan.___", state 1408, "((i<1))" - line 412, "pan.___", state 1408, "((i>=1))" - line 419, "pan.___", state 1415, "(1)" - line 419, "pan.___", state 1416, "(!((cache_dirty_generation_ptr.bitfield&(1<<_pid))))" - line 419, "pan.___", state 1416, "else" - line 419, "pan.___", state 1419, "(1)" - line 419, "pan.___", state 1420, "(1)" - line 419, "pan.___", state 1420, "(1)" - line 421, "pan.___", state 1423, "(1)" - line 421, "pan.___", state 1423, "(1)" - line 180, "pan.___", state 1448, "cache_dirty_urcu_active_readers.bitfield = (cache_dirty_urcu_active_readers.bitfield&~((1<<_pid)))" - line 184, "pan.___", state 1461, "cache_dirty_generation_ptr.bitfield = (cache_dirty_generation_ptr.bitfield&~((1<<_pid)))" - line 161, "pan.___", state 1471, "(1)" - line 165, "pan.___", state 1479, "(1)" - line 169, "pan.___", state 1491, "(1)" - line 176, "pan.___", state 1502, "cache_dirty_urcu_gp_ctr.bitfield = (cache_dirty_urcu_gp_ctr.bitfield&~((1< 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.spin.input.trail b/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.spin.input.trail deleted file mode 100644 index e1188eb..0000000 --- a/formal-model/urcu/result-standard-execution-nonest/urcu_progress_writer_error.spin.input.trail +++ /dev/null @@ -1,3010 +0,0 @@ --2:3:-2 --4:-4:-4 -1:0:2108 -2:3:2060 -3:3:2063 -4:3:2063 -5:3:2066 -6:3:2074 -7:3:2074 -8:3:2077 -9:3:2083 -10:3:2087 -11:3:2087 -12:3:2090 -13:3:2098 -14:3:2102 -15:3:2103 -16:0:2108 -17:3:2105 -18:0:2108 -19:2:416 -20:0:2108 -21:2:422 -22:0:2108 -23:2:423 -24:0:2108 -25:2:424 -26:2:428 -27:2:429 -28:2:437 -29:2:438 -30:2:442 -31:2:443 -32:2:451 -33:2:456 -34:2:460 -35:2:461 -36:2:468 -37:2:469 -38:2:480 -39:2:481 -40:2:482 -41:2:493 -42:2:498 -43:2:499 -44:0:2106 -45:2:511 -46:0:2112 -47:2:513 -48:2:514 -49:0:2112 -50:2:518 -51:2:522 -52:2:523 -53:2:531 -54:2:532 -55:2:536 -56:2:537 -57:2:545 -58:2:550 -59:2:551 -60:2:562 -61:2:563 -62:2:574 -63:2:575 -64:2:576 -65:2:587 -66:2:592 -67:2:593 -68:0:2112 -69:2:605 -70:0:2112 -71:2:607 -72:0:2112 -73:2:608 -74:0:2112 -75:2:618 -76:0:2112 -77:2:622 -78:2:623 -79:2:627 -80:2:631 -81:2:632 -82:2:636 -83:2:644 -84:2:645 -85:2:650 -86:2:657 -87:2:658 -88:2:665 -89:2:670 -90:0:2112 -91:2:681 -92:0:2112 -93:2:685 -94:2:686 -95:2:690 -96:2:694 -97:2:695 -98:2:699 -99:2:707 -100:2:708 -101:2:713 -102:2:720 -103:2:721 -104:2:728 -105:2:733 -106:0:2112 -107:2:744 -108:0:2112 -109:2:752 -110:2:753 -111:2:757 -112:2:761 -113:2:762 -114:2:766 -115:2:774 -116:2:775 -117:2:780 -118:2:787 -119:2:788 -120:2:795 -121:2:800 -122:0:2112 -123:2:811 -124:0:2112 -125:2:813 -126:0:2112 -127:2:814 -128:2:818 -129:2:819 -130:2:827 -131:2:828 -132:2:832 -133:2:833 -134:2:841 -135:2:846 -136:2:850 -137:2:851 -138:2:858 -139:2:859 -140:2:870 -141:2:871 -142:2:872 -143:2:883 -144:2:888 -145:2:889 -146:0:2112 -147:2:901 -148:0:2112 -149:2:903 -150:0:2112 -151:2:906 -152:2:907 -153:2:919 -154:2:920 -155:2:924 -156:2:925 -157:2:933 -158:2:938 -159:2:942 -160:2:943 -161:2:950 -162:2:951 -163:2:962 -164:2:963 -165:2:964 -166:2:975 -167:2:980 -168:2:981 -169:0:2112 -170:2:993 -171:0:2112 -172:2:995 -173:0:2112 -174:2:996 -175:0:2112 -176:2:997 -177:0:2112 -178:2:998 -179:0:2112 -180:2:999 -181:2:1003 -182:2:1004 -183:2:1012 -184:2:1013 -185:2:1017 -186:2:1018 -187:2:1026 -188:2:1031 -189:2:1035 -190:2:1036 -191:2:1043 -192:2:1044 -193:2:1055 -194:2:1056 -195:2:1057 -196:2:1068 -197:2:1073 -198:2:1074 -199:0:2112 -200:2:1086 -201:0:2112 -202:2:1178 -203:0:2112 -204:2:1276 -205:0:2112 -206:2:1277 -207:0:2112 -208:2:1281 -209:0:2112 -210:2:1287 -211:2:1291 -212:2:1292 -213:2:1300 -214:2:1301 -215:2:1305 -216:2:1306 -217:2:1314 -218:2:1319 -219:2:1323 -220:2:1324 -221:2:1331 -222:2:1332 -223:2:1343 -224:2:1344 -225:2:1345 -226:2:1356 -227:2:1361 -228:2:1362 -229:0:2112 -230:2:1374 -231:0:2112 -232:2:1376 -233:0:2112 -234:2:1377 -235:2:1381 -236:2:1382 -237:2:1390 -238:2:1391 -239:2:1395 -240:2:1396 -241:2:1404 -242:2:1409 -243:2:1413 -244:2:1414 -245:2:1421 -246:2:1422 -247:2:1433 -248:2:1434 -249:2:1435 -250:2:1446 -251:2:1451 -252:2:1452 -253:0:2112 -254:2:1464 -255:0:2112 -256:2:1466 -257:0:2112 -258:1:2 -259:0:2112 -260:1:8 -261:0:2112 -262:1:9 -263:0:2112 -264:1:10 -265:0:2112 -266:1:11 -267:0:2112 -268:1:12 -269:1:16 -270:1:17 -271:1:25 -272:1:26 -273:1:30 -274:1:31 -275:1:39 -276:1:44 -277:1:48 -278:1:49 -279:1:56 -280:1:57 -281:1:68 -282:1:69 -283:1:70 -284:1:81 -285:1:86 -286:1:87 -287:0:2112 -288:1:99 -289:0:2112 -290:1:101 -291:0:2112 -292:1:102 -293:1:106 -294:1:107 -295:1:115 -296:1:116 -297:1:120 -298:1:121 -299:1:129 -300:1:134 -301:1:138 -302:1:139 -303:1:146 -304:1:147 -305:1:158 -306:1:159 -307:1:160 -308:1:171 -309:1:176 -310:1:177 -311:0:2112 -312:1:189 -313:0:2112 -314:1:191 -315:0:2112 -316:1:192 -317:0:2112 -318:1:193 -319:1:197 -320:1:198 -321:1:206 -322:1:207 -323:1:211 -324:1:212 -325:1:220 -326:1:225 -327:1:229 -328:1:230 -329:1:237 -330:1:238 -331:1:249 -332:1:250 -333:1:251 -334:1:262 -335:1:267 -336:1:268 -337:0:2112 -338:1:280 -339:0:2112 -340:1:282 -341:0:2112 -342:1:291 -343:0:2112 -344:1:293 -345:0:2112 -346:1:296 -347:0:2112 -348:1:301 -349:0:2112 -350:1:302 -351:0:2112 -352:1:303 -353:0:2112 -354:1:304 -355:0:2112 -356:1:305 -357:0:2112 -358:1:306 -359:0:2112 -360:1:308 -361:0:2112 -362:1:310 -363:0:2112 -364:1:311 -365:1:315 -366:1:316 -367:1:324 -368:1:325 -369:1:326 -370:1:338 -371:1:343 -372:1:347 -373:1:348 -374:1:355 -375:1:356 -376:1:367 -377:1:368 -378:1:369 -379:1:380 -380:1:385 -381:1:386 -382:0:2112 -383:1:398 -384:0:2112 -385:2:1469 -386:2:1470 -387:2:1482 -388:2:1483 -389:2:1487 -390:2:1488 -391:2:1496 -392:2:1501 -393:2:1505 -394:2:1506 -395:2:1513 -396:2:1514 -397:2:1525 -398:2:1526 -399:2:1527 -400:2:1538 -401:2:1543 -402:2:1544 -403:0:2112 -404:2:1556 -405:0:2112 -406:2:1558 -407:0:2112 -408:2:1559 -409:0:2112 -410:2:1560 -411:0:2112 -412:2:1561 -413:0:2112 -414:2:1562 -415:2:1566 -416:2:1567 -417:2:1575 -418:2:1576 -419:2:1580 -420:2:1581 -421:2:1589 -422:2:1594 -423:2:1598 -424:2:1599 -425:2:1606 -426:2:1607 -427:2:1618 -428:2:1619 -429:2:1620 -430:2:1631 -431:2:1636 -432:2:1637 -433:0:2112 -434:2:1649 -435:0:2112 -436:2:1651 -437:0:2112 -438:2:1652 -439:2:1656 -440:2:1657 -441:2:1665 -442:2:1666 -443:2:1670 -444:2:1671 -445:2:1679 -446:2:1684 -447:2:1688 -448:2:1689 -449:2:1696 -450:2:1697 -451:2:1708 -452:2:1709 -453:2:1710 -454:2:1721 -455:2:1726 -456:2:1727 -457:0:2112 -458:2:1739 -459:0:2112 -460:1:400 -461:0:2112 -462:2:1560 -463:0:2112 -464:1:404 -465:0:2112 -466:1:9 -467:0:2112 -468:1:10 -469:0:2112 -470:1:11 -471:0:2112 -472:2:1561 -473:0:2112 -474:2:1562 -475:2:1566 -476:2:1567 -477:2:1575 -478:2:1576 -479:2:1580 -480:2:1581 -481:2:1589 -482:2:1594 -483:2:1598 -484:2:1599 -485:2:1606 -486:2:1607 -487:2:1618 -488:2:1619 -489:2:1620 -490:2:1631 -491:2:1636 -492:2:1637 -493:0:2112 -494:2:1649 -495:0:2112 -496:2:1651 -497:0:2112 -498:2:1652 -499:2:1656 -500:2:1657 -501:2:1665 -502:2:1666 -503:2:1670 -504:2:1671 -505:2:1679 -506:2:1684 -507:2:1688 -508:2:1689 -509:2:1696 -510:2:1697 -511:2:1708 -512:2:1709 -513:2:1710 -514:2:1721 -515:2:1726 -516:2:1727 -517:0:2112 -518:2:1739 -519:0:2112 -520:2:1560 -521:0:2112 -522:1:12 -523:1:16 -524:1:17 -525:1:25 -526:1:26 -527:1:27 -528:1:39 -529:1:44 -530:1:48 -531:1:49 -532:1:56 -533:1:57 -534:1:68 -535:1:69 -536:1:70 -537:1:81 -538:1:86 -539:1:87 -540:0:2112 -541:1:99 -542:0:2112 -543:2:1561 -544:0:2112 -545:2:1562 -546:2:1566 -547:2:1567 -548:2:1575 -549:2:1576 -550:2:1580 -551:2:1581 -552:2:1589 -553:2:1594 -554:2:1598 -555:2:1599 -556:2:1606 -557:2:1607 -558:2:1618 -559:2:1626 -560:2:1627 -561:2:1631 -562:2:1636 -563:2:1637 -564:0:2112 -565:2:1649 -566:0:2112 -567:2:1651 -568:0:2112 -569:2:1652 -570:2:1656 -571:2:1657 -572:2:1665 -573:2:1666 -574:2:1670 -575:2:1671 -576:2:1679 -577:2:1684 -578:2:1688 -579:2:1689 -580:2:1696 -581:2:1697 -582:2:1708 -583:2:1716 -584:2:1717 -585:2:1721 -586:2:1726 -587:2:1727 -588:0:2112 -589:2:1739 -590:0:2112 -591:2:1560 -592:0:2112 -593:1:101 -594:0:2112 -595:2:1561 -596:0:2112 -597:2:1562 -598:2:1566 -599:2:1567 -600:2:1575 -601:2:1576 -602:2:1580 -603:2:1581 -604:2:1589 -605:2:1594 -606:2:1598 -607:2:1599 -608:2:1606 -609:2:1607 -610:2:1618 -611:2:1626 -612:2:1627 -613:2:1631 -614:2:1636 -615:2:1637 -616:0:2112 -617:2:1649 -618:0:2112 -619:2:1651 -620:0:2112 -621:2:1652 -622:2:1656 -623:2:1657 -624:2:1665 -625:2:1666 -626:2:1670 -627:2:1671 -628:2:1679 -629:2:1684 -630:2:1688 -631:2:1689 -632:2:1696 -633:2:1697 -634:2:1708 -635:2:1716 -636:2:1717 -637:2:1721 -638:2:1726 -639:2:1727 -640:0:2112 -641:2:1739 -642:0:2112 -643:2:1560 -644:0:2112 -645:1:102 -646:1:106 -647:1:107 -648:1:115 -649:1:116 -650:1:120 -651:1:121 -652:1:129 -653:1:134 -654:1:138 -655:1:139 -656:1:146 -657:1:147 -658:1:158 -659:1:159 -660:1:160 -661:1:171 -662:1:176 -663:1:177 -664:0:2112 -665:1:189 -666:0:2112 -667:1:191 -668:0:2112 -669:2:1561 -670:0:2112 -671:2:1562 -672:2:1566 -673:2:1567 -674:2:1575 -675:2:1576 -676:2:1580 -677:2:1581 -678:2:1589 -679:2:1594 -680:2:1598 -681:2:1599 -682:2:1606 -683:2:1607 -684:2:1618 -685:2:1626 -686:2:1627 -687:2:1631 -688:2:1636 -689:2:1637 -690:0:2112 -691:2:1649 -692:0:2112 -693:2:1651 -694:0:2112 -695:2:1652 -696:2:1656 -697:2:1657 -698:2:1665 -699:2:1666 -700:2:1670 -701:2:1671 -702:2:1679 -703:2:1684 -704:2:1688 -705:2:1689 -706:2:1696 -707:2:1697 -708:2:1708 -709:2:1716 -710:2:1717 -711:2:1721 -712:2:1726 -713:2:1727 -714:0:2112 -715:2:1739 -716:0:2112 -717:2:1560 -718:0:2112 -719:1:192 -720:0:2112 -721:2:1561 -722:0:2112 -723:2:1562 -724:2:1566 -725:2:1567 -726:2:1575 -727:2:1576 -728:2:1580 -729:2:1581 -730:2:1589 -731:2:1594 -732:2:1598 -733:2:1599 -734:2:1606 -735:2:1607 -736:2:1618 -737:2:1626 -738:2:1627 -739:2:1631 -740:2:1636 -741:2:1637 -742:0:2112 -743:2:1649 -744:0:2112 -745:2:1651 -746:0:2112 -747:2:1652 -748:2:1656 -749:2:1657 -750:2:1665 -751:2:1666 -752:2:1670 -753:2:1671 -754:2:1679 -755:2:1684 -756:2:1688 -757:2:1689 -758:2:1696 -759:2:1697 -760:2:1708 -761:2:1716 -762:2:1717 -763:2:1721 -764:2:1726 -765:2:1727 -766:0:2112 -767:2:1739 -768:0:2112 -769:2:1560 -770:0:2112 -771:1:193 -772:1:197 -773:1:198 -774:1:206 -775:1:207 -776:1:211 -777:1:212 -778:1:220 -779:1:225 -780:1:229 -781:1:230 -782:1:237 -783:1:238 -784:1:249 -785:1:250 -786:1:251 -787:1:262 -788:1:267 -789:1:268 -790:0:2112 -791:1:280 -792:0:2112 -793:2:1561 -794:0:2112 -795:2:1562 -796:2:1566 -797:2:1567 -798:2:1575 -799:2:1576 -800:2:1580 -801:2:1581 -802:2:1589 -803:2:1594 -804:2:1598 -805:2:1599 -806:2:1606 -807:2:1607 -808:2:1618 -809:2:1626 -810:2:1627 -811:2:1631 -812:2:1636 -813:2:1637 -814:0:2112 -815:2:1649 -816:0:2112 -817:2:1651 -818:0:2112 -819:2:1652 -820:2:1656 -821:2:1657 -822:2:1665 -823:2:1666 -824:2:1670 -825:2:1671 -826:2:1679 -827:2:1684 -828:2:1688 -829:2:1689 -830:2:1696 -831:2:1697 -832:2:1708 -833:2:1716 -834:2:1717 -835:2:1721 -836:2:1726 -837:2:1727 -838:0:2112 -839:2:1739 -840:0:2112 -841:2:1560 -842:0:2112 -843:1:282 -844:0:2112 -845:1:291 -846:0:2112 -847:1:293 -848:0:2112 -849:1:296 -850:0:2112 -851:2:1561 -852:0:2112 -853:2:1562 -854:2:1566 -855:2:1567 -856:2:1575 -857:2:1576 -858:2:1580 -859:2:1581 -860:2:1589 -861:2:1594 -862:2:1598 -863:2:1599 -864:2:1606 -865:2:1607 -866:2:1618 -867:2:1626 -868:2:1627 -869:2:1631 -870:2:1636 -871:2:1637 -872:0:2112 -873:2:1649 -874:0:2112 -875:2:1651 -876:0:2112 -877:2:1652 -878:2:1656 -879:2:1657 -880:2:1665 -881:2:1666 -882:2:1670 -883:2:1671 -884:2:1679 -885:2:1684 -886:2:1688 -887:2:1689 -888:2:1696 -889:2:1697 -890:2:1708 -891:2:1716 -892:2:1717 -893:2:1721 -894:2:1726 -895:2:1727 -896:0:2112 -897:2:1739 -898:0:2112 -899:2:1560 -900:0:2112 -901:1:301 -902:0:2112 -903:2:1561 -904:0:2112 -905:2:1562 -906:2:1566 -907:2:1567 -908:2:1575 -909:2:1576 -910:2:1580 -911:2:1581 -912:2:1589 -913:2:1594 -914:2:1598 -915:2:1599 -916:2:1606 -917:2:1607 -918:2:1618 -919:2:1626 -920:2:1627 -921:2:1631 -922:2:1636 -923:2:1637 -924:0:2112 -925:2:1649 -926:0:2112 -927:2:1651 -928:0:2112 -929:2:1652 -930:2:1656 -931:2:1657 -932:2:1665 -933:2:1666 -934:2:1670 -935:2:1671 -936:2:1679 -937:2:1684 -938:2:1688 -939:2:1689 -940:2:1696 -941:2:1697 -942:2:1708 -943:2:1716 -944:2:1717 -945:2:1721 -946:2:1726 -947:2:1727 -948:0:2112 -949:2:1739 -950:0:2112 -951:2:1560 -952:0:2112 -953:1:302 -954:0:2112 -955:2:1561 -956:0:2112 -957:2:1562 -958:2:1566 -959:2:1567 -960:2:1575 -961:2:1576 -962:2:1580 -963:2:1581 -964:2:1589 -965:2:1594 -966:2:1598 -967:2:1599 -968:2:1606 -969:2:1607 -970:2:1618 -971:2:1626 -972:2:1627 -973:2:1631 -974:2:1636 -975:2:1637 -976:0:2112 -977:2:1649 -978:0:2112 -979:2:1651 -980:0:2112 -981:2:1652 -982:2:1656 -983:2:1657 -984:2:1665 -985:2:1666 -986:2:1670 -987:2:1671 -988:2:1679 -989:2:1684 -990:2:1688 -991:2:1689 -992:2:1696 -993:2:1697 -994:2:1708 -995:2:1716 -996:2:1717 -997:2:1721 -998:2:1726 -999:2:1727 -1000:0:2112 -1001:2:1739 -1002:0:2112 -1003:2:1560 -1004:0:2112 -1005:1:303 -1006:0:2112 -1007:1:304 -1008:0:2112 -1009:1:305 -1010:0:2112 -1011:1:306 -1012:0:2112 -1013:1:308 -1014:0:2112 -1015:2:1561 -1016:0:2112 -1017:2:1562 -1018:2:1566 -1019:2:1567 -1020:2:1575 -1021:2:1576 -1022:2:1580 -1023:2:1581 -1024:2:1589 -1025:2:1594 -1026:2:1598 -1027:2:1599 -1028:2:1606 -1029:2:1607 -1030:2:1618 -1031:2:1626 -1032:2:1627 -1033:2:1631 -1034:2:1636 -1035:2:1637 -1036:0:2112 -1037:2:1649 -1038:0:2112 -1039:2:1651 -1040:0:2112 -1041:2:1652 -1042:2:1656 -1043:2:1657 -1044:2:1665 -1045:2:1666 -1046:2:1670 -1047:2:1671 -1048:2:1679 -1049:2:1684 -1050:2:1688 -1051:2:1689 -1052:2:1696 -1053:2:1697 -1054:2:1708 -1055:2:1716 -1056:2:1717 -1057:2:1721 -1058:2:1726 -1059:2:1727 -1060:0:2112 -1061:2:1739 -1062:0:2112 -1063:2:1560 -1064:0:2112 -1065:1:310 -1066:0:2112 -1067:2:1561 -1068:0:2112 -1069:2:1562 -1070:2:1566 -1071:2:1567 -1072:2:1575 -1073:2:1576 -1074:2:1580 -1075:2:1581 -1076:2:1589 -1077:2:1594 -1078:2:1598 -1079:2:1599 -1080:2:1606 -1081:2:1607 -1082:2:1618 -1083:2:1626 -1084:2:1627 -1085:2:1631 -1086:2:1636 -1087:2:1637 -1088:0:2112 -1089:2:1649 -1090:0:2112 -1091:2:1651 -1092:0:2112 -1093:2:1652 -1094:2:1656 -1095:2:1657 -1096:2:1665 -1097:2:1666 -1098:2:1670 -1099:2:1671 -1100:2:1679 -1101:2:1684 -1102:2:1688 -1103:2:1689 -1104:2:1696 -1105:2:1697 -1106:2:1708 -1107:2:1716 -1108:2:1717 -1109:2:1721 -1110:2:1726 -1111:2:1727 -1112:0:2112 -1113:2:1739 -1114:0:2112 -1115:2:1560 -1116:0:2112 -1117:1:311 -1118:1:315 -1119:1:316 -1120:1:324 -1121:1:325 -1122:1:326 -1123:1:338 -1124:1:343 -1125:1:347 -1126:1:348 -1127:1:355 -1128:1:356 -1129:1:367 -1130:1:368 -1131:1:369 -1132:1:380 -1133:1:385 -1134:1:386 -1135:0:2112 -1136:1:398 -1137:0:2112 -1138:2:1561 -1139:0:2112 -1140:2:1562 -1141:2:1566 -1142:2:1567 -1143:2:1575 -1144:2:1576 -1145:2:1580 -1146:2:1581 -1147:2:1589 -1148:2:1594 -1149:2:1598 -1150:2:1599 -1151:2:1606 -1152:2:1607 -1153:2:1618 -1154:2:1626 -1155:2:1627 -1156:2:1631 -1157:2:1636 -1158:2:1637 -1159:0:2112 -1160:2:1649 -1161:0:2112 -1162:2:1651 -1163:0:2112 -1164:2:1652 -1165:2:1656 -1166:2:1657 -1167:2:1665 -1168:2:1666 -1169:2:1670 -1170:2:1671 -1171:2:1679 -1172:2:1684 -1173:2:1688 -1174:2:1689 -1175:2:1696 -1176:2:1697 -1177:2:1708 -1178:2:1716 -1179:2:1717 -1180:2:1721 -1181:2:1726 -1182:2:1727 -1183:0:2112 -1184:2:1739 -1185:0:2112 -1186:2:1560 -1187:0:2112 -1188:1:400 -1189:0:2112 -1190:1:404 -1191:0:2112 -1192:1:9 -1193:0:2112 -1194:1:10 -1195:0:2112 -1196:1:11 -1197:0:2112 -1198:2:1561 -1199:0:2112 -1200:2:1562 -1201:2:1566 -1202:2:1567 -1203:2:1575 -1204:2:1576 -1205:2:1580 -1206:2:1581 -1207:2:1589 -1208:2:1594 -1209:2:1598 -1210:2:1599 -1211:2:1606 -1212:2:1607 -1213:2:1618 -1214:2:1626 -1215:2:1627 -1216:2:1631 -1217:2:1636 -1218:2:1637 -1219:0:2112 -1220:2:1649 -1221:0:2112 -1222:2:1651 -1223:0:2112 -1224:2:1652 -1225:2:1656 -1226:2:1657 -1227:2:1665 -1228:2:1666 -1229:2:1670 -1230:2:1671 -1231:2:1679 -1232:2:1684 -1233:2:1688 -1234:2:1689 -1235:2:1696 -1236:2:1697 -1237:2:1708 -1238:2:1716 -1239:2:1717 -1240:2:1721 -1241:2:1726 -1242:2:1727 -1243:0:2112 -1244:2:1739 -1245:0:2112 -1246:2:1560 -1247:0:2112 -1248:1:12 -1249:1:16 -1250:1:17 -1251:1:25 -1252:1:26 -1253:1:27 -1254:1:39 -1255:1:44 -1256:1:48 -1257:1:49 -1258:1:56 -1259:1:57 -1260:1:68 -1261:1:69 -1262:1:70 -1263:1:81 -1264:1:86 -1265:1:87 -1266:0:2112 -1267:1:99 -1268:0:2112 -1269:2:1561 -1270:0:2112 -1271:2:1562 -1272:2:1566 -1273:2:1567 -1274:2:1575 -1275:2:1576 -1276:2:1580 -1277:2:1581 -1278:2:1589 -1279:2:1594 -1280:2:1598 -1281:2:1599 -1282:2:1606 -1283:2:1607 -1284:2:1618 -1285:2:1626 -1286:2:1627 -1287:2:1631 -1288:2:1636 -1289:2:1637 -1290:0:2112 -1291:2:1649 -1292:0:2112 -1293:2:1651 -1294:0:2112 -1295:2:1652 -1296:2:1656 -1297:2:1657 -1298:2:1665 -1299:2:1666 -1300:2:1670 -1301:2:1671 -1302:2:1679 -1303:2:1684 -1304:2:1688 -1305:2:1689 -1306:2:1696 -1307:2:1697 -1308:2:1708 -1309:2:1716 -1310:2:1717 -1311:2:1721 -1312:2:1726 -1313:2:1727 -1314:0:2112 -1315:2:1739 -1316:0:2112 -1317:2:1560 -1318:0:2112 -1319:1:101 -1320:0:2112 -1321:2:1561 -1322:0:2112 -1323:2:1562 -1324:2:1566 -1325:2:1567 -1326:2:1575 -1327:2:1576 -1328:2:1580 -1329:2:1581 -1330:2:1589 -1331:2:1594 -1332:2:1598 -1333:2:1599 -1334:2:1606 -1335:2:1607 -1336:2:1618 -1337:2:1626 -1338:2:1627 -1339:2:1631 -1340:2:1636 -1341:2:1637 -1342:0:2112 -1343:2:1649 -1344:0:2112 -1345:2:1651 -1346:0:2112 -1347:2:1652 -1348:2:1656 -1349:2:1657 -1350:2:1665 -1351:2:1666 -1352:2:1670 -1353:2:1671 -1354:2:1679 -1355:2:1684 -1356:2:1688 -1357:2:1689 -1358:2:1696 -1359:2:1697 -1360:2:1708 -1361:2:1716 -1362:2:1717 -1363:2:1721 -1364:2:1726 -1365:2:1727 -1366:0:2112 -1367:2:1739 -1368:0:2112 -1369:2:1560 -1370:0:2112 -1371:1:102 -1372:1:106 -1373:1:107 -1374:1:115 -1375:1:116 -1376:1:120 -1377:1:121 -1378:1:129 -1379:1:134 -1380:1:138 -1381:1:139 -1382:1:146 -1383:1:147 -1384:1:158 -1385:1:159 -1386:1:160 -1387:1:171 -1388:1:176 -1389:1:177 -1390:0:2112 -1391:1:189 -1392:0:2112 -1393:1:191 -1394:0:2112 -1395:2:1561 -1396:0:2112 -1397:2:1562 -1398:2:1566 -1399:2:1567 -1400:2:1575 -1401:2:1576 -1402:2:1580 -1403:2:1581 -1404:2:1589 -1405:2:1594 -1406:2:1598 -1407:2:1599 -1408:2:1606 -1409:2:1607 -1410:2:1618 -1411:2:1626 -1412:2:1627 -1413:2:1631 -1414:2:1636 -1415:2:1637 -1416:0:2112 -1417:2:1649 -1418:0:2112 -1419:2:1651 -1420:0:2112 -1421:2:1652 -1422:2:1656 -1423:2:1657 -1424:2:1665 -1425:2:1666 -1426:2:1670 -1427:2:1671 -1428:2:1679 -1429:2:1684 -1430:2:1688 -1431:2:1689 -1432:2:1696 -1433:2:1697 -1434:2:1708 -1435:2:1716 -1436:2:1717 -1437:2:1721 -1438:2:1726 -1439:2:1727 -1440:0:2112 -1441:2:1739 -1442:0:2112 -1443:2:1560 -1444:0:2112 -1445:1:192 -1446:0:2112 -1447:2:1561 -1448:0:2112 -1449:2:1562 -1450:2:1566 -1451:2:1567 -1452:2:1575 -1453:2:1576 -1454:2:1580 -1455:2:1581 -1456:2:1589 -1457:2:1594 -1458:2:1598 -1459:2:1599 -1460:2:1606 -1461:2:1607 -1462:2:1618 -1463:2:1626 -1464:2:1627 -1465:2:1631 -1466:2:1636 -1467:2:1637 -1468:0:2112 -1469:2:1649 -1470:0:2112 -1471:2:1651 -1472:0:2112 -1473:2:1652 -1474:2:1656 -1475:2:1657 -1476:2:1665 -1477:2:1666 -1478:2:1670 -1479:2:1671 -1480:2:1679 -1481:2:1684 -1482:2:1688 -1483:2:1689 -1484:2:1696 -1485:2:1697 -1486:2:1708 -1487:2:1716 -1488:2:1717 -1489:2:1721 -1490:2:1726 -1491:2:1727 -1492:0:2112 -1493:2:1739 -1494:0:2112 -1495:2:1560 -1496:0:2112 -1497:1:193 -1498:1:197 -1499:1:198 -1500:1:206 -1501:1:207 -1502:1:211 -1503:1:212 -1504:1:220 -1505:1:225 -1506:1:229 -1507:1:230 -1508:1:237 -1509:1:238 -1510:1:249 -1511:1:250 -1512:1:251 -1513:1:262 -1514:1:267 -1515:1:268 -1516:0:2112 -1517:1:280 -1518:0:2112 -1519:2:1561 -1520:0:2112 -1521:2:1562 -1522:2:1566 -1523:2:1567 -1524:2:1575 -1525:2:1576 -1526:2:1580 -1527:2:1581 -1528:2:1589 -1529:2:1594 -1530:2:1598 -1531:2:1599 -1532:2:1606 -1533:2:1607 -1534:2:1618 -1535:2:1626 -1536:2:1627 -1537:2:1631 -1538:2:1636 -1539:2:1637 -1540:0:2112 -1541:2:1649 -1542:0:2112 -1543:2:1651 -1544:0:2112 -1545:2:1652 -1546:2:1656 -1547:2:1657 -1548:2:1665 -1549:2:1666 -1550:2:1670 -1551:2:1671 -1552:2:1679 -1553:2:1684 -1554:2:1688 -1555:2:1689 -1556:2:1696 -1557:2:1697 -1558:2:1708 -1559:2:1716 -1560:2:1717 -1561:2:1721 -1562:2:1726 -1563:2:1727 -1564:0:2112 -1565:2:1739 -1566:0:2112 -1567:2:1560 -1568:0:2112 -1569:1:282 -1570:0:2112 -1571:1:291 -1572:0:2112 -1573:1:293 -1574:0:2112 -1575:1:296 -1576:0:2112 -1577:2:1561 -1578:0:2112 -1579:2:1562 -1580:2:1566 -1581:2:1567 -1582:2:1575 -1583:2:1576 -1584:2:1580 -1585:2:1581 -1586:2:1589 -1587:2:1594 -1588:2:1598 -1589:2:1599 -1590:2:1606 -1591:2:1607 -1592:2:1618 -1593:2:1626 -1594:2:1627 -1595:2:1631 -1596:2:1636 -1597:2:1637 -1598:0:2112 -1599:2:1649 -1600:0:2112 -1601:2:1651 -1602:0:2112 -1603:2:1652 -1604:2:1656 -1605:2:1657 -1606:2:1665 -1607:2:1666 -1608:2:1670 -1609:2:1671 -1610:2:1679 -1611:2:1684 -1612:2:1688 -1613:2:1689 -1614:2:1696 -1615:2:1697 -1616:2:1708 -1617:2:1716 -1618:2:1717 -1619:2:1721 -1620:2:1726 -1621:2:1727 -1622:0:2112 -1623:2:1739 -1624:0:2112 -1625:2:1560 -1626:0:2112 -1627:1:301 -1628:0:2112 -1629:2:1561 -1630:0:2112 -1631:2:1562 -1632:2:1566 -1633:2:1567 -1634:2:1575 -1635:2:1576 -1636:2:1580 -1637:2:1581 -1638:2:1589 -1639:2:1594 -1640:2:1598 -1641:2:1599 -1642:2:1606 -1643:2:1607 -1644:2:1618 -1645:2:1626 -1646:2:1627 -1647:2:1631 -1648:2:1636 -1649:2:1637 -1650:0:2112 -1651:2:1649 --1:-1:-1 -1652:0:2112 -1653:2:1651 -1654:0:2112 -1655:2:1652 -1656:2:1656 -1657:2:1657 -1658:2:1665 -1659:2:1666 -1660:2:1670 -1661:2:1671 -1662:2:1679 -1663:2:1684 -1664:2:1688 -1665:2:1689 -1666:2:1696 -1667:2:1697 -1668:2:1708 -1669:2:1716 -1670:2:1717 -1671:2:1721 -1672:2:1726 -1673:2:1727 -1674:0:2112 -1675:2:1739 -1676:0:2112 -1677:2:1560 -1678:0:2112 -1679:1:302 -1680:0:2112 -1681:2:1561 -1682:0:2112 -1683:2:1562 -1684:2:1566 -1685:2:1567 -1686:2:1575 -1687:2:1576 -1688:2:1580 -1689:2:1581 -1690:2:1589 -1691:2:1594 -1692:2:1598 -1693:2:1599 -1694:2:1606 -1695:2:1607 -1696:2:1618 -1697:2:1626 -1698:2:1627 -1699:2:1631 -1700:2:1636 -1701:2:1637 -1702:0:2112 -1703:2:1649 -1704:0:2112 -1705:2:1651 -1706:0:2112 -1707:2:1652 -1708:2:1656 -1709:2:1657 -1710:2:1665 -1711:2:1666 -1712:2:1670 -1713:2:1671 -1714:2:1679 -1715:2:1684 -1716:2:1688 -1717:2:1689 -1718:2:1696 -1719:2:1697 -1720:2:1708 -1721:2:1716 -1722:2:1717 -1723:2:1721 -1724:2:1726 -1725:2:1727 -1726:0:2112 -1727:2:1739 -1728:0:2112 -1729:2:1560 -1730:0:2112 -1731:1:303 -1732:0:2112 -1733:1:304 -1734:0:2112 -1735:1:305 -1736:0:2112 -1737:1:306 -1738:0:2112 -1739:1:308 -1740:0:2112 -1741:2:1561 -1742:0:2112 -1743:2:1562 -1744:2:1566 -1745:2:1567 -1746:2:1575 -1747:2:1576 -1748:2:1580 -1749:2:1581 -1750:2:1589 -1751:2:1594 -1752:2:1598 -1753:2:1599 -1754:2:1606 -1755:2:1607 -1756:2:1618 -1757:2:1626 -1758:2:1627 -1759:2:1631 -1760:2:1636 -1761:2:1637 -1762:0:2112 -1763:2:1649 -1764:0:2112 -1765:2:1651 -1766:0:2112 -1767:2:1652 -1768:2:1656 -1769:2:1657 -1770:2:1665 -1771:2:1666 -1772:2:1670 -1773:2:1671 -1774:2:1679 -1775:2:1684 -1776:2:1688 -1777:2:1689 -1778:2:1696 -1779:2:1697 -1780:2:1708 -1781:2:1716 -1782:2:1717 -1783:2:1721 -1784:2:1726 -1785:2:1727 -1786:0:2112 -1787:2:1739 -1788:0:2112 -1789:2:1560 -1790:0:2112 -1791:1:310 -1792:0:2112 -1793:2:1561 -1794:0:2112 -1795:2:1562 -1796:2:1566 -1797:2:1567 -1798:2:1575 -1799:2:1576 -1800:2:1580 -1801:2:1581 -1802:2:1589 -1803:2:1594 -1804:2:1598 -1805:2:1599 -1806:2:1606 -1807:2:1607 -1808:2:1618 -1809:2:1626 -1810:2:1627 -1811:2:1631 -1812:2:1636 -1813:2:1637 -1814:0:2112 -1815:2:1649 -1816:0:2112 -1817:2:1651 -1818:0:2112 -1819:2:1652 -1820:2:1656 -1821:2:1657 -1822:2:1665 -1823:2:1666 -1824:2:1670 -1825:2:1671 -1826:2:1679 -1827:2:1684 -1828:2:1688 -1829:2:1689 -1830:2:1696 -1831:2:1697 -1832:2:1708 -1833:2:1716 -1834:2:1717 -1835:2:1721 -1836:2:1726 -1837:2:1727 -1838:0:2112 -1839:2:1739 -1840:0:2112 -1841:2:1560 -1842:0:2112 -1843:1:311 -1844:1:315 -1845:1:316 -1846:1:324 -1847:1:333 -1848:1:334 -1849:1:338 -1850:1:343 -1851:1:347 -1852:1:348 -1853:1:355 -1854:1:356 -1855:1:367 -1856:1:368 -1857:1:371 -1858:1:372 -1859:1:380 -1860:1:385 -1861:1:386 -1862:0:2112 -1863:1:398 -1864:0:2112 -1865:2:1561 -1866:0:2112 -1867:2:1562 -1868:2:1566 -1869:2:1567 -1870:2:1575 -1871:2:1576 -1872:2:1580 -1873:2:1581 -1874:2:1589 -1875:2:1594 -1876:2:1598 -1877:2:1599 -1878:2:1606 -1879:2:1607 -1880:2:1618 -1881:2:1626 -1882:2:1627 -1883:2:1631 -1884:2:1636 -1885:2:1637 -1886:0:2112 -1887:2:1649 -1888:0:2112 -1889:2:1651 -1890:0:2112 -1891:2:1652 -1892:2:1656 -1893:2:1657 -1894:2:1665 -1895:2:1666 -1896:2:1670 -1897:2:1671 -1898:2:1679 -1899:2:1684 -1900:2:1688 -1901:2:1689 -1902:2:1696 -1903:2:1697 -1904:2:1708 -1905:2:1716 -1906:2:1717 -1907:2:1721 -1908:2:1726 -1909:2:1727 -1910:0:2112 -1911:2:1739 -1912:0:2112 -1913:2:1560 -1914:0:2112 -1915:1:400 -1916:0:2112 -1917:1:404 -1918:0:2112 -1919:1:9 -1920:0:2112 -1921:1:10 -1922:0:2112 -1923:1:11 -1924:0:2112 -1925:2:1561 -1926:0:2112 -1927:2:1562 -1928:2:1566 -1929:2:1567 -1930:2:1575 -1931:2:1576 -1932:2:1580 -1933:2:1581 -1934:2:1589 -1935:2:1594 -1936:2:1598 -1937:2:1599 -1938:2:1606 -1939:2:1607 -1940:2:1618 -1941:2:1626 -1942:2:1627 -1943:2:1631 -1944:2:1636 -1945:2:1637 -1946:0:2112 -1947:2:1649 -1948:0:2112 -1949:2:1651 -1950:0:2112 -1951:2:1652 -1952:2:1656 -1953:2:1657 -1954:2:1665 -1955:2:1666 -1956:2:1670 -1957:2:1671 -1958:2:1679 -1959:2:1684 -1960:2:1688 -1961:2:1689 -1962:2:1696 -1963:2:1697 -1964:2:1708 -1965:2:1716 -1966:2:1717 -1967:2:1721 -1968:2:1726 -1969:2:1727 -1970:0:2112 -1971:2:1739 -1972:0:2112 -1973:2:1560 -1974:0:2112 -1975:1:12 -1976:1:16 -1977:1:17 -1978:1:25 -1979:1:34 -1980:1:35 -1981:1:39 -1982:1:44 -1983:1:48 -1984:1:49 -1985:1:56 -1986:1:57 -1987:1:68 -1988:1:69 -1989:1:72 -1990:1:73 -1991:1:81 -1992:1:86 -1993:1:87 -1994:0:2112 -1995:1:99 -1996:0:2112 -1997:2:1561 -1998:0:2112 -1999:2:1562 -2000:2:1566 -2001:2:1567 -2002:2:1575 -2003:2:1576 -2004:2:1580 -2005:2:1581 -2006:2:1589 -2007:2:1594 -2008:2:1598 -2009:2:1599 -2010:2:1606 -2011:2:1607 -2012:2:1618 -2013:2:1626 -2014:2:1627 -2015:2:1631 -2016:2:1636 -2017:2:1637 -2018:0:2112 -2019:2:1649 -2020:0:2112 -2021:2:1651 -2022:0:2112 -2023:2:1652 -2024:2:1656 -2025:2:1657 -2026:2:1665 -2027:2:1666 -2028:2:1670 -2029:2:1671 -2030:2:1679 -2031:2:1684 -2032:2:1688 -2033:2:1689 -2034:2:1696 -2035:2:1697 -2036:2:1708 -2037:2:1716 -2038:2:1717 -2039:2:1721 -2040:2:1726 -2041:2:1727 -2042:0:2112 -2043:2:1739 -2044:0:2112 -2045:2:1560 -2046:0:2112 -2047:1:101 -2048:0:2112 -2049:2:1561 -2050:0:2112 -2051:2:1562 -2052:2:1566 -2053:2:1567 -2054:2:1575 -2055:2:1576 -2056:2:1580 -2057:2:1581 -2058:2:1589 -2059:2:1594 -2060:2:1598 -2061:2:1599 -2062:2:1606 -2063:2:1607 -2064:2:1618 -2065:2:1626 -2066:2:1627 -2067:2:1631 -2068:2:1636 -2069:2:1637 -2070:0:2112 -2071:2:1649 -2072:0:2112 -2073:2:1651 -2074:0:2112 -2075:2:1652 -2076:2:1656 -2077:2:1657 -2078:2:1665 -2079:2:1666 -2080:2:1670 -2081:2:1671 -2082:2:1679 -2083:2:1684 -2084:2:1688 -2085:2:1689 -2086:2:1696 -2087:2:1697 -2088:2:1708 -2089:2:1716 -2090:2:1717 -2091:2:1721 -2092:2:1726 -2093:2:1727 -2094:0:2112 -2095:2:1739 -2096:0:2112 -2097:2:1560 -2098:0:2112 -2099:1:102 -2100:1:106 -2101:1:107 -2102:1:115 -2103:1:124 -2104:1:125 -2105:1:129 -2106:1:134 -2107:1:138 -2108:1:139 -2109:1:146 -2110:1:147 -2111:1:158 -2112:1:159 -2113:1:162 -2114:1:163 -2115:1:171 -2116:1:176 -2117:1:177 -2118:0:2112 -2119:1:189 -2120:0:2112 -2121:1:191 -2122:0:2112 -2123:2:1561 -2124:0:2112 -2125:2:1562 -2126:2:1566 -2127:2:1567 -2128:2:1575 -2129:2:1576 -2130:2:1580 -2131:2:1581 -2132:2:1589 -2133:2:1594 -2134:2:1598 -2135:2:1599 -2136:2:1606 -2137:2:1607 -2138:2:1618 -2139:2:1626 -2140:2:1627 -2141:2:1631 -2142:2:1636 -2143:2:1637 -2144:0:2112 -2145:2:1649 -2146:0:2112 -2147:2:1651 -2148:0:2112 -2149:2:1652 -2150:2:1656 -2151:2:1657 -2152:2:1665 -2153:2:1666 -2154:2:1670 -2155:2:1671 -2156:2:1679 -2157:2:1684 -2158:2:1688 -2159:2:1689 -2160:2:1696 -2161:2:1697 -2162:2:1708 -2163:2:1716 -2164:2:1717 -2165:2:1721 -2166:2:1726 -2167:2:1727 -2168:0:2112 -2169:2:1739 -2170:0:2112 -2171:2:1560 -2172:0:2112 -2173:1:192 -2174:0:2112 -2175:2:1561 -2176:0:2112 -2177:2:1562 -2178:2:1566 -2179:2:1567 -2180:2:1575 -2181:2:1576 -2182:2:1580 -2183:2:1581 -2184:2:1589 -2185:2:1594 -2186:2:1598 -2187:2:1599 -2188:2:1606 -2189:2:1607 -2190:2:1618 -2191:2:1626 -2192:2:1627 -2193:2:1631 -2194:2:1636 -2195:2:1637 -2196:0:2112 -2197:2:1649 -2198:0:2112 -2199:2:1651 -2200:0:2112 -2201:2:1652 -2202:2:1656 -2203:2:1657 -2204:2:1665 -2205:2:1666 -2206:2:1670 -2207:2:1671 -2208:2:1679 -2209:2:1684 -2210:2:1688 -2211:2:1689 -2212:2:1696 -2213:2:1697 -2214:2:1708 -2215:2:1716 -2216:2:1717 -2217:2:1721 -2218:2:1726 -2219:2:1727 -2220:0:2112 -2221:2:1739 -2222:0:2112 -2223:2:1560 -2224:0:2112 -2225:1:193 -2226:1:197 -2227:1:198 -2228:1:206 -2229:1:215 -2230:1:216 -2231:1:220 -2232:1:225 -2233:1:229 -2234:1:230 -2235:1:237 -2236:1:238 -2237:1:249 -2238:1:250 -2239:1:253 -2240:1:254 -2241:1:262 -2242:1:267 -2243:1:268 -2244:0:2112 -2245:1:280 -2246:0:2112 -2247:2:1561 -2248:0:2112 -2249:2:1562 -2250:2:1566 -2251:2:1567 -2252:2:1575 -2253:2:1576 -2254:2:1580 -2255:2:1581 -2256:2:1589 -2257:2:1594 -2258:2:1598 -2259:2:1599 -2260:2:1606 -2261:2:1607 -2262:2:1618 -2263:2:1626 -2264:2:1627 -2265:2:1631 -2266:2:1636 -2267:2:1637 -2268:0:2112 -2269:2:1649 -2270:0:2112 -2271:2:1651 -2272:0:2112 -2273:1:282 -2274:0:2112 -2275:1:291 -2276:0:2112 -2277:1:293 -2278:0:2112 -2279:1:296 -2280:0:2112 -2281:1:301 -2282:0:2112 -2283:1:302 -2284:0:2112 -2285:1:303 -2286:0:2112 -2287:1:304 -2288:0:2112 -2289:1:305 -2290:0:2112 -2291:1:306 -2292:0:2112 -2293:1:308 -2294:0:2112 -2295:1:310 -2296:0:2112 -2297:1:311 -2298:1:315 -2299:1:316 -2300:1:324 -2301:1:325 -2302:1:326 -2303:1:338 -2304:1:343 -2305:1:347 -2306:1:348 -2307:1:355 -2308:1:356 -2309:1:367 -2310:1:368 -2311:1:369 -2312:1:380 -2313:1:385 -2314:1:386 -2315:0:2112 -2316:1:398 -2317:0:2112 -2318:1:400 -2319:0:2112 -2320:1:404 -2321:0:2112 -2322:1:9 -2323:0:2112 -2324:1:10 -2325:0:2112 -2326:1:11 -2327:0:2112 -2328:1:12 -2329:1:16 -2330:1:17 -2331:1:25 -2332:1:26 -2333:1:27 -2334:1:39 -2335:1:44 -2336:1:48 -2337:1:49 -2338:1:56 -2339:1:57 -2340:1:68 -2341:1:69 -2342:1:70 -2343:1:81 -2344:1:86 -2345:1:87 -2346:0:2112 -2347:1:99 -2348:0:2112 -2349:1:101 -2350:0:2112 -2351:1:102 -2352:1:106 -2353:1:107 -2354:1:115 -2355:1:116 -2356:1:120 -2357:1:121 -2358:1:129 -2359:1:134 -2360:1:138 -2361:1:139 -2362:1:146 -2363:1:147 -2364:1:158 -2365:1:159 -2366:1:160 -2367:1:171 -2368:1:176 -2369:1:177 -2370:0:2112 -2371:1:189 -2372:0:2112 -2373:1:191 -2374:0:2112 -2375:1:192 -2376:0:2112 -2377:1:193 -2378:1:197 -2379:1:198 -2380:1:206 -2381:1:207 -2382:1:211 -2383:1:212 -2384:1:220 -2385:1:225 -2386:1:229 -2387:1:230 -2388:1:237 -2389:1:238 -2390:1:249 -2391:1:250 -2392:1:251 -2393:1:262 -2394:1:267 -2395:1:268 -2396:0:2112 -2397:1:280 -2398:0:2112 -2399:1:282 -2400:0:2112 -2401:2:1652 -2402:2:1656 -2403:2:1657 -2404:2:1665 -2405:2:1666 -2406:2:1670 -2407:2:1671 -2408:2:1679 -2409:2:1684 -2410:2:1688 -2411:2:1689 -2412:2:1696 -2413:2:1697 -2414:2:1708 -2415:2:1716 -2416:2:1717 -2417:2:1721 -2418:2:1726 -2419:2:1727 -2420:0:2112 -2421:2:1739 -2422:0:2112 -2423:2:1560 -2424:0:2112 -2425:1:291 -2426:0:2112 -2427:2:1561 -2428:0:2112 -2429:1:293 -2430:0:2112 -2431:1:296 -2432:0:2112 -2433:1:301 -2434:0:2112 -2435:1:302 -2436:0:2112 -2437:1:303 -2438:0:2112 -2439:1:304 -2440:0:2112 -2441:1:305 -2442:0:2112 -2443:1:306 -2444:0:2112 -2445:1:308 -2446:0:2112 -2447:1:310 -2448:0:2112 -2449:1:311 -2450:1:315 -2451:1:316 -2452:1:324 -2453:1:325 -2454:1:326 -2455:1:338 -2456:1:343 -2457:1:347 -2458:1:348 -2459:1:355 -2460:1:356 -2461:1:367 -2462:1:368 -2463:1:369 -2464:1:380 -2465:1:385 -2466:1:386 -2467:0:2112 -2468:1:398 -2469:0:2112 -2470:1:400 -2471:0:2112 -2472:1:404 -2473:0:2112 -2474:1:9 -2475:0:2112 -2476:1:10 -2477:0:2112 -2478:1:11 -2479:0:2112 -2480:1:12 -2481:1:16 -2482:1:17 -2483:1:25 -2484:1:26 -2485:1:27 -2486:1:39 -2487:1:44 -2488:1:48 -2489:1:49 -2490:1:56 -2491:1:57 -2492:1:68 -2493:1:69 -2494:1:70 -2495:1:81 -2496:1:86 -2497:1:87 -2498:0:2112 -2499:1:99 -2500:0:2112 -2501:1:101 -2502:0:2112 -2503:1:102 -2504:1:106 -2505:1:107 -2506:1:115 -2507:1:116 -2508:1:120 -2509:1:121 -2510:1:129 -2511:1:134 -2512:1:138 -2513:1:139 -2514:1:146 -2515:1:147 -2516:1:158 -2517:1:159 -2518:1:160 -2519:1:171 -2520:1:176 -2521:1:177 -2522:0:2112 -2523:1:189 -2524:0:2112 -2525:1:191 -2526:0:2112 -2527:1:192 -2528:0:2112 -2529:1:193 -2530:1:197 -2531:1:198 -2532:1:206 -2533:1:207 -2534:1:211 -2535:1:212 -2536:1:220 -2537:1:225 -2538:1:229 -2539:1:230 -2540:1:237 -2541:1:238 -2542:1:249 -2543:1:250 -2544:1:251 -2545:1:262 -2546:1:267 -2547:1:268 -2548:0:2112 -2549:1:280 -2550:0:2112 -2551:1:282 -2552:0:2112 -2553:1:291 -2554:0:2112 -2555:1:293 -2556:0:2112 -2557:2:1562 -2558:2:1566 -2559:2:1567 -2560:2:1575 -2561:2:1576 -2562:2:1580 -2563:2:1581 -2564:2:1589 -2565:2:1594 -2566:2:1598 -2567:2:1599 -2568:2:1606 -2569:2:1607 -2570:2:1618 -2571:2:1626 -2572:2:1627 -2573:2:1631 -2574:2:1636 -2575:2:1637 -2576:0:2112 -2577:2:1649 -2578:0:2112 -2579:1:296 -2580:0:2112 -2581:1:301 -2582:0:2112 -2583:1:302 -2584:0:2112 -2585:1:303 -2586:0:2112 -2587:1:304 -2588:0:2112 -2589:1:305 -2590:0:2112 -2591:1:306 -2592:0:2112 -2593:1:308 -2594:0:2112 -2595:1:310 -2596:0:2112 -2597:1:311 -2598:1:315 -2599:1:316 -2600:1:324 -2601:1:325 -2602:1:326 -2603:1:338 -2604:1:343 -2605:1:347 -2606:1:348 -2607:1:355 -2608:1:356 -2609:1:367 -2610:1:368 -2611:1:369 -2612:1:380 -2613:1:385 -2614:1:386 -2615:0:2112 -2616:1:398 -2617:0:2112 -2618:1:400 -2619:0:2112 -2620:1:404 -2621:0:2112 -2622:1:9 -2623:0:2112 -2624:1:10 -2625:0:2112 -2626:1:11 -2627:0:2112 -2628:1:12 -2629:1:16 -2630:1:17 -2631:1:25 -2632:1:34 -2633:1:35 -2634:1:39 -2635:1:44 -2636:1:48 -2637:1:49 -2638:1:56 -2639:1:57 -2640:1:68 -2641:1:69 -2642:1:72 -2643:1:73 -2644:1:81 -2645:1:86 -2646:1:87 -2647:0:2112 -2648:1:99 -2649:0:2112 -2650:2:1651 -2651:0:2112 -2652:2:1652 -2653:2:1656 -2654:2:1657 -2655:2:1665 -2656:2:1666 -2657:2:1670 -2658:2:1671 -2659:2:1679 -2660:2:1684 -2661:2:1688 -2662:2:1689 -2663:2:1696 -2664:2:1697 -2665:2:1708 -2666:2:1716 -2667:2:1717 -2668:2:1721 -2669:2:1726 -2670:2:1727 -2671:0:2112 -2672:2:1739 -2673:0:2112 -2674:2:1560 -2675:0:2112 -2676:2:1561 -2677:0:2112 -2678:2:1562 -2679:2:1566 -2680:2:1567 -2681:2:1575 -2682:2:1576 -2683:2:1580 -2684:2:1581 -2685:2:1589 -2686:2:1594 -2687:2:1598 -2688:2:1599 -2689:2:1606 -2690:2:1607 -2691:2:1618 -2692:2:1626 -2693:2:1627 -2694:2:1631 -2695:2:1636 -2696:2:1637 -2697:0:2112 -2698:2:1649 -2699:0:2112 -2700:1:101 -2701:0:2112 -2702:2:1651 -2703:0:2112 -2704:2:1652 -2705:2:1656 -2706:2:1657 -2707:2:1665 -2708:2:1666 -2709:2:1670 -2710:2:1671 -2711:2:1679 -2712:2:1684 -2713:2:1688 -2714:2:1689 -2715:2:1696 -2716:2:1697 -2717:2:1708 -2718:2:1716 -2719:2:1717 -2720:2:1721 -2721:2:1726 -2722:2:1727 -2723:0:2112 -2724:2:1739 -2725:0:2112 -2726:2:1560 -2727:0:2112 -2728:2:1561 -2729:0:2112 -2730:2:1562 -2731:2:1566 -2732:2:1567 -2733:2:1575 -2734:2:1576 -2735:2:1580 -2736:2:1581 -2737:2:1589 -2738:2:1594 -2739:2:1598 -2740:2:1599 -2741:2:1606 -2742:2:1607 -2743:2:1618 -2744:2:1626 -2745:2:1627 -2746:2:1631 -2747:2:1636 -2748:2:1637 -2749:0:2112 -2750:2:1649 -2751:0:2112 -2752:1:102 -2753:1:106 -2754:1:107 -2755:1:115 -2756:1:116 -2757:1:117 -2758:1:129 -2759:1:134 -2760:1:138 -2761:1:139 -2762:1:146 -2763:1:147 -2764:1:158 -2765:1:159 -2766:1:160 -2767:1:171 -2768:1:176 -2769:1:177 -2770:0:2112 -2771:1:189 -2772:0:2112 -2773:1:191 -2774:0:2112 -2775:2:1651 -2776:0:2112 -2777:2:1652 -2778:2:1656 -2779:2:1657 -2780:2:1665 -2781:2:1666 -2782:2:1670 -2783:2:1671 -2784:2:1679 -2785:2:1684 -2786:2:1688 -2787:2:1689 -2788:2:1696 -2789:2:1697 -2790:2:1708 -2791:2:1716 -2792:2:1717 -2793:2:1721 -2794:2:1726 -2795:2:1727 -2796:0:2112 -2797:2:1739 -2798:0:2112 -2799:2:1560 -2800:0:2112 -2801:2:1561 -2802:0:2112 -2803:2:1562 -2804:2:1566 -2805:2:1567 -2806:2:1575 -2807:2:1576 -2808:2:1580 -2809:2:1581 -2810:2:1589 -2811:2:1594 -2812:2:1598 -2813:2:1599 -2814:2:1606 -2815:2:1607 -2816:2:1618 -2817:2:1626 -2818:2:1627 -2819:2:1631 -2820:2:1636 -2821:2:1637 -2822:0:2112 -2823:2:1649 -2824:0:2112 -2825:1:192 -2826:0:2112 -2827:2:1651 -2828:0:2112 -2829:2:1652 -2830:2:1656 -2831:2:1657 -2832:2:1665 -2833:2:1666 -2834:2:1670 -2835:2:1671 -2836:2:1679 -2837:2:1684 -2838:2:1688 -2839:2:1689 -2840:2:1696 -2841:2:1697 -2842:2:1708 -2843:2:1716 -2844:2:1717 -2845:2:1721 -2846:2:1726 -2847:2:1727 -2848:0:2112 -2849:2:1739 -2850:0:2112 -2851:2:1560 -2852:0:2112 -2853:2:1561 -2854:0:2112 -2855:2:1562 -2856:2:1566 -2857:2:1567 -2858:2:1575 -2859:2:1576 -2860:2:1580 -2861:2:1581 -2862:2:1589 -2863:2:1594 -2864:2:1598 -2865:2:1599 -2866:2:1606 -2867:2:1607 -2868:2:1618 -2869:2:1626 -2870:2:1627 -2871:2:1631 -2872:2:1636 -2873:2:1637 -2874:0:2112 -2875:2:1649 -2876:0:2112 -2877:1:193 -2878:1:197 -2879:1:198 -2880:1:206 -2881:1:207 -2882:1:211 -2883:1:212 -2884:1:220 -2885:1:225 -2886:1:229 -2887:1:230 -2888:1:237 -2889:1:238 -2890:1:249 -2891:1:250 -2892:1:251 -2893:1:262 -2894:1:267 -2895:1:268 -2896:0:2112 -2897:1:280 -2898:0:2112 -2899:2:1651 -2900:0:2112 -2901:2:1652 -2902:2:1656 -2903:2:1657 -2904:2:1665 -2905:2:1666 -2906:2:1670 -2907:2:1671 -2908:2:1679 -2909:2:1684 -2910:2:1688 -2911:2:1689 -2912:2:1696 -2913:2:1697 -2914:2:1708 -2915:2:1716 -2916:2:1717 -2917:2:1721 -2918:2:1726 -2919:2:1727 -2920:0:2112 -2921:2:1739 -2922:0:2112 -2923:2:1560 -2924:0:2112 -2925:2:1561 -2926:0:2112 -2927:2:1562 -2928:2:1566 -2929:2:1567 -2930:2:1575 -2931:2:1576 -2932:2:1580 -2933:2:1581 -2934:2:1589 -2935:2:1594 -2936:2:1598 -2937:2:1599 -2938:2:1606 -2939:2:1607 -2940:2:1618 -2941:2:1626 -2942:2:1627 -2943:2:1631 -2944:2:1636 -2945:2:1637 -2946:0:2112 -2947:2:1649 -2948:0:2112 -2949:1:282 -2950:0:2112 -2951:1:291 -2952:0:2112 -2953:1:293 -2954:0:2112 -2955:1:296 -2956:0:2112 -2957:2:1651 -2958:0:2112 -2959:2:1652 -2960:2:1656 -2961:2:1657 -2962:2:1665 -2963:2:1666 -2964:2:1670 -2965:2:1671 -2966:2:1679 -2967:2:1684 -2968:2:1688 -2969:2:1689 -2970:2:1696 -2971:2:1697 -2972:2:1708 -2973:2:1716 -2974:2:1717 -2975:2:1721 -2976:2:1726 -2977:2:1727 -2978:0:2112 -2979:2:1739 -2980:0:2112 -2981:2:1560 -2982:0:2112 -2983:2:1561 -2984:0:2112 -2985:2:1562 -2986:2:1566 -2987:2:1567 -2988:2:1575 -2989:2:1576 -2990:2:1580 -2991:2:1581 -2992:2:1589 -2993:2:1594 -2994:2:1598 -2995:2:1599 -2996:2:1606 -2997:2:1607 -2998:2:1618 -2999:2:1626 -3000:2:1627 -3001:2:1631 -3002:2:1636 -3003:2:1637 -3004:0:2112 -3005:2:1649 -3006:0:2112 -3007:1:301 diff --git a/formal-model/urcu/urcu.sh b/formal-model/urcu/urcu.sh deleted file mode 100644 index 65ff517..0000000 --- a/formal-model/urcu/urcu.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -# -# Compiles and runs the urcu.spin Promela model. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Copyright (C) IBM Corporation, 2009 -# Mathieu Desnoyers, 2009 -# -# Authors: Paul E. McKenney -# Mathieu Desnoyers - -# Basic execution, without LTL clauses. See Makefile. - -spin -a urcu.spin -cc -DSAFETY -o pan pan.c -./pan -v -c1 -X -m10000000 -w21 diff --git a/formal-model/urcu/urcu.spin b/formal-model/urcu/urcu.spin deleted file mode 100644 index 2cfcb70..0000000 --- a/formal-model/urcu/urcu.spin +++ /dev/null @@ -1,705 +0,0 @@ -/* - * mem.spin: Promela code to validate memory barriers with OOO memory. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright (c) 2009 Mathieu Desnoyers - */ - -/* Promela validation variables. */ - -/* specific defines "included" here */ -/* DEFINES file "included" here */ - -/* All signal readers have same PID and uses same reader variable */ -#ifdef TEST_SIGNAL_ON_WRITE - -#define NR_READERS 1 /* the writer is also a signal reader */ -#define NR_WRITERS 1 - -#define NR_PROCS 1 - -#define get_pid() (0) - -#elif defined(TEST_SIGNAL_ON_READ) - -#define get_pid() ((_pid < 2) -> 0 : 1) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#else - -#define get_pid() (_pid) - -#define NR_READERS 1 -#define NR_WRITERS 1 - -#define NR_PROCS 2 - -#endif - -#define get_readerid() (get_pid()) - -/* - * Each process have its own data in cache. Caches are randomly updated. - * smp_wmb and smp_rmb forces cache updates (write and read), smp_mb forces - * both. - */ - -typedef per_proc_byte { - byte val[NR_PROCS]; -}; - -/* Bitfield has a maximum of 8 procs */ -typedef per_proc_bit { - byte bitfield; -}; - -#define DECLARE_CACHED_VAR(type, x) \ - type mem_##x; \ - per_proc_##type cached_##x; \ - per_proc_bit cache_dirty_##x; - -#define INIT_CACHED_VAR(x, v, j) \ - mem_##x = v; \ - cache_dirty_##x.bitfield = 0; \ - j = 0; \ - do \ - :: j < NR_PROCS -> \ - cached_##x.val[j] = v; \ - j++ \ - :: j >= NR_PROCS -> break \ - od; - -#define IS_CACHE_DIRTY(x, id) (cache_dirty_##x.bitfield & (1 << id)) - -#define READ_CACHED_VAR(x) (cached_##x.val[get_pid()]) - -#define WRITE_CACHED_VAR(x, v) \ - atomic { \ - cached_##x.val[get_pid()] = v; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield | (1 << get_pid()); \ - } - -#define CACHE_WRITE_TO_MEM(x, id) \ - if \ - :: IS_CACHE_DIRTY(x, id) -> \ - mem_##x = cached_##x.val[id]; \ - cache_dirty_##x.bitfield = \ - cache_dirty_##x.bitfield & (~(1 << id)); \ - :: else -> \ - skip \ - fi; - -#define CACHE_READ_FROM_MEM(x, id) \ - if \ - :: !IS_CACHE_DIRTY(x, id) -> \ - cached_##x.val[id] = mem_##x;\ - :: else -> \ - skip \ - fi; - -/* - * May update other caches if cache is dirty, or not. - */ -#define RANDOM_CACHE_WRITE_TO_MEM(x, id)\ - if \ - :: 1 -> CACHE_WRITE_TO_MEM(x, id); \ - :: 1 -> skip \ - fi; - -#define RANDOM_CACHE_READ_FROM_MEM(x, id)\ - if \ - :: 1 -> CACHE_READ_FROM_MEM(x, id); \ - :: 1 -> skip \ - fi; - -/* - * Remote barriers tests the scheme where a signal (or IPI) is sent to all - * reader threads to promote their compiler barrier to a smp_mb(). - */ -#ifdef REMOTE_BARRIERS - -inline smp_rmb_pid(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, i); - } -} - -inline smp_wmb_pid(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, i); - j = 0; - do - :: j < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[j], i); - j++ - :: j >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, i); - } -} - -inline smp_mb_pid(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb_pid(i, j); -#endif -#ifndef NO_RMB - smp_rmb_pid(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(j); -#endif -#endif - } -} - -/* - * Readers do a simple barrier(), writers are doing a smp_mb() _and_ sending a - * signal or IPI to have all readers execute a smp_mb. - * We are not modeling the whole rendez-vous between readers and writers here, - * we just let the writer update each reader's caches remotely. - */ -inline smp_mb_writer(i, j) -{ - smp_mb_pid(get_pid(), j); - i = 0; - do - :: i < NR_READERS -> - smp_mb_pid(i, j); - i++; - :: i >= NR_READERS -> break - od; - smp_mb_pid(get_pid(), j); -} - -inline smp_mb_reader(i, j) -{ - skip; -} - -#else - -inline smp_rmb(i, j) -{ - atomic { - CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_READ_FROM_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline smp_wmb(i, j) -{ - atomic { - CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - CACHE_WRITE_TO_MEM(urcu_active_readers[i], get_pid()); - i++ - :: i >= NR_READERS -> break - od; - CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - } -} - -inline smp_mb(i, j) -{ - atomic { -#ifndef NO_WMB - smp_wmb(i, j); -#endif -#ifndef NO_RMB - smp_rmb(i, j); -#endif -#ifdef NO_WMB -#ifdef NO_RMB - ooo_mem(i); -#endif -#endif - } -} - -inline smp_mb_writer(i, j) -{ - smp_mb(i, j); -} - -inline smp_mb_reader(i, j) -{ - smp_mb(i, j); -} - -#endif - -/* Keep in sync manually with smp_rmb, wmp_wmb, ooo_mem and init() */ -DECLARE_CACHED_VAR(byte, urcu_gp_ctr); -/* Note ! currently only two readers */ -DECLARE_CACHED_VAR(byte, urcu_active_readers[NR_READERS]); -/* pointer generation */ -DECLARE_CACHED_VAR(byte, generation_ptr); - -byte last_free_gen = 0; -bit free_done = 0; -byte read_generation[NR_READERS]; -bit data_access[NR_READERS]; - -bit write_lock = 0; - -bit init_done = 0; - -bit sighand_exec = 0; - -inline wait_init_done() -{ - do - :: init_done == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TEST_SIGNAL - -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> break; - od; -} - -#ifdef TOO_BIG_STATE_SPACE -inline wait_for_sighand_exec() -{ - sighand_exec = 0; - do - :: sighand_exec == 0 -> skip; - :: else -> - if - :: 1 -> break; - :: 1 -> sighand_exec = 0; - skip; - fi; - od; -} -#endif - -#else - -inline wait_for_sighand_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_WRITE -/* Block on signal handler execution */ -inline dispatch_sighand_write_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_write_exec() -{ - skip; -} - -#endif - -#ifdef TEST_SIGNAL_ON_READ -/* Block on signal handler execution */ -inline dispatch_sighand_read_exec() -{ - sighand_exec = 1; - do - :: sighand_exec == 1 -> - skip; - :: else -> - break; - od; -} - -#else - -inline dispatch_sighand_read_exec() -{ - skip; -} - -#endif - - -inline ooo_mem(i) -{ - atomic { - RANDOM_CACHE_WRITE_TO_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_WRITE_TO_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_WRITE_TO_MEM(generation_ptr, get_pid()); - RANDOM_CACHE_READ_FROM_MEM(urcu_gp_ctr, get_pid()); - i = 0; - do - :: i < NR_READERS -> - RANDOM_CACHE_READ_FROM_MEM(urcu_active_readers[i], - get_pid()); - i++ - :: i >= NR_READERS -> break - od; - RANDOM_CACHE_READ_FROM_MEM(generation_ptr, get_pid()); - } -} - -inline wait_for_reader(tmp, tmp2, i, j) -{ - do - :: 1 -> - tmp2 = READ_CACHED_VAR(urcu_active_readers[tmp]); - ooo_mem(i); - dispatch_sighand_write_exec(); - if - :: (tmp2 & RCU_GP_CTR_NEST_MASK) - && ((tmp2 ^ READ_CACHED_VAR(urcu_gp_ctr)) - & RCU_GP_CTR_BIT) -> -#ifndef GEN_ERROR_WRITER_PROGRESS - smp_mb_writer(i, j); -#else - ooo_mem(i); -#endif - dispatch_sighand_write_exec(); - :: else -> - break; - fi; - od; -} - -inline wait_for_quiescent_state(tmp, tmp2, i, j) -{ - tmp = 0; - do - :: tmp < NR_READERS -> - wait_for_reader(tmp, tmp2, i, j); - if - :: (NR_READERS > 1) && (tmp < NR_READERS - 1) - -> ooo_mem(i); - dispatch_sighand_write_exec(); - :: else - -> skip; - fi; - tmp++ - :: tmp >= NR_READERS -> break - od; -} - -/* Model the RCU read-side critical section. */ - -#ifndef TEST_SIGNAL_ON_WRITE - -inline urcu_one_read(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - dispatch_sighand_read_exec(); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - dispatch_sighand_read_exec(); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - dispatch_sighand_read_exec(); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //dispatch_sighand_read_exec(); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read(i, j, nest_i, tmp, tmp2); - od; -} - -#endif //!TEST_SIGNAL_ON_WRITE - -#ifdef TEST_SIGNAL -/* signal handler reader */ - -inline urcu_one_read_sig(i, j, nest_i, tmp, tmp2) -{ - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - ooo_mem(i); - tmp = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - if - :: (!(tmp & RCU_GP_CTR_NEST_MASK)) - -> - tmp2 = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp2); - :: else -> - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], - tmp + 1); - fi; - smp_mb_reader(i, j); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - - read_generation[get_readerid()] = READ_CACHED_VAR(generation_ptr); - data_access[get_readerid()] = 1; - data_access[get_readerid()] = 0; - - nest_i = 0; - do - :: nest_i < READER_NEST_LEVEL -> - smp_mb_reader(i, j); - tmp2 = READ_CACHED_VAR(urcu_active_readers[get_readerid()]); - ooo_mem(i); - WRITE_CACHED_VAR(urcu_active_readers[get_readerid()], tmp2 - 1); - nest_i++; - :: nest_i >= READER_NEST_LEVEL -> break; - od; - //ooo_mem(i); - //smp_mc(i); /* added */ -} - -active proctype urcu_reader_sig() -{ - byte i, j, nest_i; - byte tmp, tmp2; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - -end_reader: - do - :: 1 -> - wait_for_sighand_exec(); - /* - * We do not test reader's progress here, because we are mainly - * interested in writer's progress. The reader never blocks - * anyway. We have to test for reader/writer's progress - * separately, otherwise we could think the writer is doing - * progress when it's blocked by an always progressing reader. - */ -#ifdef READER_PROGRESS -progress_reader: -#endif - urcu_one_read_sig(i, j, nest_i, tmp, tmp2); - od; -} - -#endif - -/* Model the RCU update process. */ - -active proctype urcu_writer() -{ - byte i, j; - byte tmp, tmp2; - byte old_gen; - - wait_init_done(); - - assert(get_pid() < NR_PROCS); - - do - :: (READ_CACHED_VAR(generation_ptr) < 5) -> -#ifdef WRITER_PROGRESS -progress_writer1: -#endif - ooo_mem(i); - dispatch_sighand_write_exec(); - atomic { - old_gen = READ_CACHED_VAR(generation_ptr); - WRITE_CACHED_VAR(generation_ptr, old_gen + 1); - } - ooo_mem(i); - dispatch_sighand_write_exec(); - - do - :: 1 -> - atomic { - if - :: write_lock == 0 -> - write_lock = 1; - break; - :: else -> - skip; - fi; - } - od; - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - ooo_mem(i); - dispatch_sighand_write_exec(); - //smp_mc(i); - wait_for_quiescent_state(tmp, tmp2, i, j); - //smp_mc(i); -#ifndef SINGLE_FLIP - ooo_mem(i); - dispatch_sighand_write_exec(); - tmp = READ_CACHED_VAR(urcu_gp_ctr); - ooo_mem(i); - dispatch_sighand_write_exec(); - WRITE_CACHED_VAR(urcu_gp_ctr, tmp ^ RCU_GP_CTR_BIT); - //smp_mc(i); - ooo_mem(i); - dispatch_sighand_write_exec(); - wait_for_quiescent_state(tmp, tmp2, i, j); -#endif - smp_mb_writer(i, j); - dispatch_sighand_write_exec(); - write_lock = 0; - /* free-up step, e.g., kfree(). */ - atomic { - last_free_gen = old_gen; - free_done = 1; - } - :: else -> break; - od; - /* - * Given the reader loops infinitely, let the writer also busy-loop - * with progress here so, with weak fairness, we can test the - * writer's progress. - */ -end_writer: - do - :: 1 -> -#ifdef WRITER_PROGRESS -progress_writer2: -#endif - dispatch_sighand_write_exec(); - od; -} - -/* Leave after the readers and writers so the pid count is ok. */ -init { - byte i, j; - - atomic { - INIT_CACHED_VAR(urcu_gp_ctr, 1, j); - INIT_CACHED_VAR(generation_ptr, 0, j); - - i = 0; - do - :: i < NR_READERS -> - INIT_CACHED_VAR(urcu_active_readers[i], 0, j); - read_generation[i] = 1; - data_access[i] = 0; - i++; - :: i >= NR_READERS -> break - od; - init_done = 1; - } -} diff --git a/formal-model/urcu/urcu_free.ltl b/formal-model/urcu/urcu_free.ltl deleted file mode 100644 index 1954414..0000000 --- a/formal-model/urcu/urcu_free.ltl +++ /dev/null @@ -1 +0,0 @@ -[] (read_free -> !read_free_race) diff --git a/formal-model/urcu/urcu_free_no_mb.define b/formal-model/urcu/urcu_free_no_mb.define deleted file mode 100644 index 136ef67..0000000 --- a/formal-model/urcu/urcu_free_no_mb.define +++ /dev/null @@ -1,2 +0,0 @@ -#define NO_RMB -#define NO_WMB diff --git a/formal-model/urcu/urcu_free_no_rmb.define b/formal-model/urcu/urcu_free_no_rmb.define deleted file mode 100644 index 73e61a4..0000000 --- a/formal-model/urcu/urcu_free_no_rmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_RMB diff --git a/formal-model/urcu/urcu_free_no_wmb.define b/formal-model/urcu/urcu_free_no_wmb.define deleted file mode 100644 index 710f29d..0000000 --- a/formal-model/urcu/urcu_free_no_wmb.define +++ /dev/null @@ -1 +0,0 @@ -#define NO_WMB diff --git a/formal-model/urcu/urcu_free_single_flip.define b/formal-model/urcu/urcu_free_single_flip.define deleted file mode 100644 index 5e642ef..0000000 --- a/formal-model/urcu/urcu_free_single_flip.define +++ /dev/null @@ -1 +0,0 @@ -#define SINGLE_FLIP diff --git a/formal-model/urcu/urcu_progress.ltl b/formal-model/urcu/urcu_progress.ltl deleted file mode 100644 index 8718641..0000000 --- a/formal-model/urcu/urcu_progress.ltl +++ /dev/null @@ -1 +0,0 @@ -([] <> !np_) diff --git a/formal-model/urcu/urcu_progress_reader.define b/formal-model/urcu/urcu_progress_reader.define deleted file mode 100644 index ff3f783..0000000 --- a/formal-model/urcu/urcu_progress_reader.define +++ /dev/null @@ -1 +0,0 @@ -#define READER_PROGRESS diff --git a/formal-model/urcu/urcu_progress_writer.define b/formal-model/urcu/urcu_progress_writer.define deleted file mode 100644 index 1e4417f..0000000 --- a/formal-model/urcu/urcu_progress_writer.define +++ /dev/null @@ -1 +0,0 @@ -#define WRITER_PROGRESS diff --git a/formal-model/urcu/urcu_progress_writer_error.define b/formal-model/urcu/urcu_progress_writer_error.define deleted file mode 100644 index 8d304f5..0000000 --- a/formal-model/urcu/urcu_progress_writer_error.define +++ /dev/null @@ -1,2 +0,0 @@ -#define WRITER_PROGRESS -#define GEN_ERROR_WRITER_PROGRESS